From b94a8814bd2bc5b60cf754aa90613aa64348d0f3 Mon Sep 17 00:00:00 2001
From: kutscher <kutscher@irmb.tu-bs.de>
Date: Thu, 27 Aug 2020 14:05:54 +0200
Subject: [PATCH] add Thixotropy branch

---
 apps/cpu/Applications.cmake                   |    3 +-
 apps/cpu/HerschelBulkleySphere/CMakeLists.txt |   27 +
 apps/cpu/HerschelBulkleySphere/hbsphere.cfg   |   24 +
 apps/cpu/HerschelBulkleySphere/hbsphere.cpp   |  331 +++
 src/cpu/VirtualFluids.h                       |   29 +-
 .../BoundaryConditions/BCAlgorithm.cpp        |    5 +
 .../BoundaryConditions/BCAlgorithm.h          |   64 +-
 .../BinghamModelNoSlipBCAlgorithm.h           |   27 +
 .../BoundaryConditions/BoundaryConditions.h   |   52 +-
 .../DensityAndThixotropyBCAlgorithm.cpp       |   89 +
 .../DensityAndThixotropyBCAlgorithm.h         |   25 +
 .../HerschelBulkleyModelNoSlipBCAlgorithm.h   |   27 +
 .../NoSlipAndThixotropyBCAlgorithm.cpp        |   70 +
 .../NoSlipAndThixotropyBCAlgorithm.h          |   22 +
 ...lectingOutflowAndThixotropyBCAlgorithm.cpp |  339 +++
 ...eflectingOutflowAndThixotropyBCAlgorithm.h |   25 +
 .../SimpleVelocityBCAlgorithm.cpp             |   83 +
 .../SimpleVelocityBCAlgorithm.h               |   54 +
 .../ThixotropyNoSlipBCAlgorithm.cpp           |   41 +
 .../ThixotropyNoSlipBCAlgorithm.h             |   20 +
 .../VelocityAndThixotropyBCAlgorithm.cpp      |  105 +
 .../VelocityAndThixotropyBCAlgorithm.h        |   24 +
 ...ityWithDensityAndThixotropyBCAlgorithm.cpp |  100 +
 ...ocityWithDensityAndThixotropyBCAlgorithm.h |   31 +
 .../VelocityWithDensityBCAlgorithm.cpp        |   41 +-
 .../VelocityWithDensityBCAlgorithm.h          |    4 +-
 .../WriteMacroscopicQuantitiesCoProcessor.cpp |  232 +-
 .../WriteThixotropyQuantitiesCoProcessor.cpp  |  237 ++
 .../WriteThixotropyQuantitiesCoProcessor.h    |   42 +
 .../ThixotropyFullDirectConnector.cpp         |  291 +++
 .../ThixotropyFullDirectConnector.h           |  222 ++
 .../ThixotropyFullVectorConnector.cpp         |  483 ++++
 .../ThixotropyFullVectorConnector.h           |  189 ++
 src/cpu/VirtualFluidsCore/Data/DataSet3D.h    |  189 +-
 .../VirtualFluidsCore/LBM/BasicLBMKernel.cpp  |   61 +
 .../VirtualFluidsCore/LBM/BasicLBMKernel.h    |   25 +
 .../LBM/BinghamModelLBMKernel.h               |   38 +
 .../LBM/CompressibleCumulantLBMKernel.cpp     |    3 +-
 .../LBM/CumulantLBMKernel.cpp                 | 1972 +++++++++++++++++
 .../VirtualFluidsCore/LBM/CumulantLBMKernel.h |   55 +
 src/cpu/VirtualFluidsCore/LBM/D3Q27System.h   | 1898 +++++++++-------
 .../LBM/HerschelBulkleyModelLBMKernel.h       |   38 +
 src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp  |   43 +
 src/cpu/VirtualFluidsCore/LBM/Thixotropy.h    |  103 +
 .../LBM/ThixotropyExpLBMKernel.cpp            | 1874 ++++++++++++++++
 .../LBM/ThixotropyExpLBMKernel.h              |   72 +
 .../LBM/ThixotropyLBMKernel.cpp               | 1868 ++++++++++++++++
 .../LBM/ThixotropyLBMKernel.h                 |   72 +
 .../LBM/ThixotropyModelLBMKernel.cpp          |  895 ++++++++
 .../LBM/ThixotropyModelLBMKernel.h            |   51 +
 .../BoundaryConditionsBlockVisitor.cpp        |   71 +-
 .../InitDistributionsBlockVisitor.cpp         |  361 ++-
 .../Visitors/InitThixotropyBlockVisitor.cpp   |  435 ++++
 .../Visitors/InitThixotropyBlockVisitor.h     |   93 +
 .../Visitors/SetConnectorsBlockVisitor.cpp    |  896 ++++----
 55 files changed, 12789 insertions(+), 1682 deletions(-)
 create mode 100644 apps/cpu/HerschelBulkleySphere/CMakeLists.txt
 create mode 100644 apps/cpu/HerschelBulkleySphere/hbsphere.cfg
 create mode 100644 apps/cpu/HerschelBulkleySphere/hbsphere.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.h
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/HerschelBulkleyModelNoSlipBCAlgorithm.h
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.h
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.h
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.h
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.h
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.h
 create mode 100644 src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h
 create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.h
 create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.h
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.h
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/BinghamModelLBMKernel.h
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/HerschelBulkleyModelLBMKernel.h
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/Thixotropy.h
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.h
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.h
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.h
 create mode 100644 src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.h

diff --git a/apps/cpu/Applications.cmake b/apps/cpu/Applications.cmake
index 920e01efb..0b92f834e 100644
--- a/apps/cpu/Applications.cmake
+++ b/apps/cpu/Applications.cmake
@@ -64,4 +64,5 @@
 #add_subdirectory(Applications/bChannelVA)
 #add_subdirectory(Applications/OrganPipe)
 #add_subdirectory(Applications/LidDrivenCavity)
-add_subdirectory(${APPS_ROOT_CPU}/poiseuille_example)
+add_subdirectory(${APPS_ROOT_CPU}/HerschelBulkleySphere)
+
diff --git a/apps/cpu/HerschelBulkleySphere/CMakeLists.txt b/apps/cpu/HerschelBulkleySphere/CMakeLists.txt
new file mode 100644
index 000000000..162bf5604
--- /dev/null
+++ b/apps/cpu/HerschelBulkleySphere/CMakeLists.txt
@@ -0,0 +1,27 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+
+########################################################
+## C++ PROJECT                                       ###
+########################################################
+PROJECT(HerschelBulkleySphere)
+
+INCLUDE(${APPS_ROOT_CPU}/IncludsList.cmake) 
+
+################################################################
+##   LOCAL FILES                                             ###
+################################################################
+# FILE(GLOB SPECIFIC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.h
+                         # ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp
+                         # ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp  )
+ 
+# SET(ALL_SOURCES ${ALL_SOURCES} ${SPECIFIC_FILES})
+# SOURCE_GROUP(src FILES ${SPECIFIC_FILES})
+  
+# SET(CAB_ADDITIONAL_LINK_LIBRARIES VirtualFluids)
+
+################################################################
+##   CREATE PROJECT                                          ###
+################################################################
+# CREATE_CAB_PROJECT(hbsphere BINARY)
+
+vf_add_library(BUILDTYPE binary DEPENDS VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES hbsphere.cpp )
\ No newline at end of file
diff --git a/apps/cpu/HerschelBulkleySphere/hbsphere.cfg b/apps/cpu/HerschelBulkleySphere/hbsphere.cfg
new file mode 100644
index 000000000..1f636ec21
--- /dev/null
+++ b/apps/cpu/HerschelBulkleySphere/hbsphere.cfg
@@ -0,0 +1,24 @@
+outputPath = /work/koskuche/Herschel-BulkleySphere
+
+numOfThreads = 1
+availMem = 8e9
+logToFile = false
+
+blocknx = 10 10 10
+boundingBox = 600 600 600 #30*20=600**3=216000000
+deltax = 1
+radius = 15
+
+velocity = 1e-3
+n = 0.3
+Re = 1
+Bn = 0.01
+
+newStart = true
+restartStep = 100000
+
+cpStart = 10000
+cpStep = 10000
+
+outTime = 10000
+endTime = 1000000
\ No newline at end of file
diff --git a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
new file mode 100644
index 000000000..deb44fc21
--- /dev/null
+++ b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp
@@ -0,0 +1,331 @@
+#include <iostream>
+#include <string>
+
+#include <VirtualFluids.h>
+
+using namespace std;
+
+
+void bflow(string configname)
+{
+   try
+   {
+      ConfigurationFile   config;
+      config.load(configname);
+
+      string          outputPath = config.getValue<string>("outputPath");
+      int             numOfThreads = config.getValue<int>("numOfThreads");
+      vector<int>     blocknx = config.getVector<int>("blocknx");
+      vector<double>  boundingBox = config.getVector<double>("boundingBox");
+      //double          nuLB = config.getValue<double>("nuLB");
+      double          endTime = config.getValue<double>("endTime");
+      double          outTime = config.getValue<double>("outTime");
+      double          availMem = config.getValue<double>("availMem");
+      //int             refineLevel = config.getValue<int>("refineLevel");
+      bool            logToFile = config.getValue<bool>("logToFile");
+      double          restartStep = config.getValue<double>("restartStep");
+      double          deltax = config.getValue<double>("deltax");
+      double          radius = config.getValue<double>("radius");
+      double          cpStep = config.getValue<double>("cpStep");
+      double          cpStart = config.getValue<double>("cpStart");
+      bool            newStart = config.getValue<bool>("newStart");
+      double          velocity = config.getValue<double>("velocity");
+      double          n = config.getValue<double>("n");
+      double          Re = config.getValue<double>("Re");
+      double          Bn = config.getValue<double>("Bn");
+
+      SPtr<Communicator> comm = MPICommunicator::getInstance();
+      int myid = comm->getProcessID();
+
+      if (logToFile)
+      {
+#if defined(__unix__)
+         if (myid == 0)
+         {
+            const char* str = outputPath.c_str();
+            mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
+         }
+#endif 
+
+         if (myid == 0)
+         {
+            stringstream logFilename;
+            logFilename << outputPath + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt";
+            UbLog::output_policy::setStream(logFilename.str());
+         }
+      }
+
+      LBMReal rhoLB = 0.0;
+
+      SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter());
+
+      //bounding box
+
+      //double g_minX1 = 0;
+      //double g_minX2 = 0;
+      //double g_minX3 = 0;
+
+      //double g_maxX1 = boundingBox[0];
+      //double g_maxX2 = boundingBox[1];
+      //double g_maxX3 = boundingBox[2];
+
+      double g_minX1 = -boundingBox[0]/2.0;
+      double g_minX2 = -boundingBox[1] / 2.0;
+      double g_minX3 = -boundingBox[2]/2.0;
+
+      double g_maxX1 = boundingBox[0]/2.0;
+      double g_maxX2 = boundingBox[1]/2.0;
+      double g_maxX3 = boundingBox[2]/2.0;
+
+      double blockLength = 3.0 * deltax;
+
+      double d = 2.0 * radius;
+      double U = velocity;
+      double Gamma = U / d;
+
+      double k = (U * d) / (Re * std::pow(Gamma, n - 1));
+
+      double tau0 = Bn * k * std::pow(Gamma, n);
+
+      SPtr<Thixotropy> thix = Thixotropy::getInstance();
+      thix->setPowerIndex(n);
+      thix->setViscosityParameter(k);
+      thix->setYieldStress(tau0);
+
+      SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
+      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new HerschelBulkleyModelNoSlipBCAlgorithm()));
+      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new BinghamModelNoSlipBCAlgorithm()));
+
+      mu::Parser fct;
+      fct.SetExpr("U");
+      fct.DefineConst("U", velocity);
+      SPtr<BCAdapter> velocityBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST));
+      velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm()));
+
+      SPtr<BCAdapter> densityBCAdapter(new DensityBCAdapter());
+      densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm()));
+
+      //BS visitor
+      BoundaryConditionsBlockVisitor bcVisitor;
+      bcVisitor.addBC(noSlipBCAdapter);
+      bcVisitor.addBC(velocityBCAdapter);
+      bcVisitor.addBC(densityBCAdapter);
+
+      SPtr<BCProcessor> bcProc;
+      bcProc = SPtr<BCProcessor>(new BCProcessor());
+
+      SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel());
+      //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel());
+      kernel->setBCProcessor(bcProc);
+
+      SPtr<Grid3D> grid(new Grid3D(comm));
+      grid->setPeriodicX1(false);
+      grid->setPeriodicX2(false);
+      grid->setPeriodicX3(false);
+      grid->setDeltaX(deltax);
+      grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]);
+
+      SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3));
+      if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance());
+
+      //sphere
+      SPtr<GbObject3D> sphere(new GbSphere3D(0, 0, 0, radius));
+      GbSystem3D::writeGeoObject(sphere.get(), outputPath + "/geo/sphere", WbWriterVtkXmlBinary::getInstance());
+      SPtr<D3Q27Interactor> sphereInt(new D3Q27Interactor(sphere, grid, noSlipBCAdapter, Interactor3D::SOLID));
+
+      //////////////////////////////////////////////////////////////////////////
+      //restart
+      SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart));
+      SPtr<MPIIOMigrationBECoProcessor> restartCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, outputPath, comm));
+      restartCoProcessor->setLBMKernel(kernel);
+      restartCoProcessor->setBCProcessor(bcProc);
+      //////////////////////////////////////////////////////////////////////////
+
+      if (myid == 0)
+      {
+         UBLOG(logINFO, "Parameters:");
+         //UBLOG(logINFO, "forcing = " << forcing);
+         UBLOG(logINFO, "rho = " << rhoLB);
+         UBLOG(logINFO, "U = " << U);
+         UBLOG(logINFO, "Re = " << Re);
+         UBLOG(logINFO, "Bn = " << Bn);
+         UBLOG(logINFO, "k = " << k);
+         UBLOG(logINFO, "n = " << n);
+         UBLOG(logINFO, "tau0 = " << tau0);
+         UBLOG(logINFO, "deltax = " << deltax);
+         //UBLOG(logINFO, "number of levels = " << refineLevel + 1);
+         UBLOG(logINFO, "number of threads = " << numOfThreads);
+         UBLOG(logINFO, "number of processes = " << comm->getNumberOfProcesses());
+         UBLOG(logINFO, "Preprozess - start");
+      }
+
+      if (newStart)
+      {
+         GenBlocksGridVisitor genBlocks(gridCube);
+         grid->accept(genBlocks);
+
+         //walls
+         GbCuboid3DPtr wallZmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_minX3));
+         if (myid == 0) GbSystem3D::writeGeoObject(wallZmin.get(), outputPath + "/geo/wallZmin", WbWriterVtkXmlASCII::getInstance());
+
+         GbCuboid3DPtr wallZmax(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_maxX3, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength));
+         if (myid == 0) GbSystem3D::writeGeoObject(wallZmax.get(), outputPath + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance());
+
+         GbCuboid3DPtr wallYmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_minX2, g_maxX3 + blockLength));
+         if (myid == 0) GbSystem3D::writeGeoObject(wallYmin.get(), outputPath + "/geo/wallYmin", WbWriterVtkXmlASCII::getInstance());
+
+         GbCuboid3DPtr wallYmax(new GbCuboid3D(g_minX1 - blockLength, g_maxX2, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength));
+         if (myid == 0) GbSystem3D::writeGeoObject(wallYmax.get(), outputPath + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance());
+
+         GbCuboid3DPtr wallXmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_minX1, g_maxX2 + blockLength, g_maxX3 + blockLength));
+         if (myid == 0) GbSystem3D::writeGeoObject(wallXmin.get(), outputPath + "/geo/wallXmin", WbWriterVtkXmlASCII::getInstance());
+
+         GbCuboid3DPtr wallXmax(new GbCuboid3D(g_maxX1, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength));
+         if (myid == 0) GbSystem3D::writeGeoObject(wallXmax.get(), outputPath + "/geo/wallXmax", WbWriterVtkXmlASCII::getInstance());
+
+         //wall interactors
+         SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+
+         SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+
+         SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, velocityBCAdapter, Interactor3D::SOLID));
+         SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, densityBCAdapter, Interactor3D::SOLID));
+
+         ////////////////////////////////////////////
+         //METIS
+         SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY));
+         ////////////////////////////////////////////
+         /////delete solid blocks
+         if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start");
+         InteractorsHelper intHelper(grid, metisVisitor);
+         intHelper.addInteractor(wallZminInt);
+         intHelper.addInteractor(wallZmaxInt);
+         intHelper.addInteractor(wallYminInt);
+         intHelper.addInteractor(wallYmaxInt);
+         intHelper.addInteractor(wallXminInt);
+         intHelper.addInteractor(wallXmaxInt);
+         intHelper.addInteractor(sphereInt);
+         intHelper.selectBlocks();
+         if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
+         //////////////////////////////////////
+
+         SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm));
+         ppblocks->process(0);
+
+         unsigned long nob = grid->getNumberOfBlocks();
+         int gl = 3;
+         unsigned long nodb = (blocknx[0]) * (blocknx[1]) * (blocknx[2]);
+         unsigned long nod = nob * (blocknx[0]) * (blocknx[1]) * (blocknx[2]);
+         unsigned long nodg = nob * (blocknx[0] + gl) * (blocknx[1] + gl) * (blocknx[1] + gl);
+         double needMemAll = double(nodg * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4));
+         double needMem = needMemAll / double(comm->getNumberOfProcesses());
+
+         if (myid == 0)
+         {
+            UBLOG(logINFO, "Number of blocks = " << nob);
+            UBLOG(logINFO, "Number of nodes  = " << nod);
+            int minInitLevel = grid->getCoarsestInitializedLevel();
+            int maxInitLevel = grid->getFinestInitializedLevel();
+            for (int level = minInitLevel; level <= maxInitLevel; level++)
+            {
+               int nobl = grid->getNumberOfBlocks(level);
+               UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl);
+               UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * nodb);
+            }
+            UBLOG(logINFO, "Necessary memory  = " << needMemAll << " bytes");
+            UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes");
+            UBLOG(logINFO, "Available memory per process = " << availMem << " bytes");
+         }
+
+         SetKernelBlockVisitor kernelVisitor(kernel, k, availMem, needMem);
+         grid->accept(kernelVisitor);
+
+         //BC
+         intHelper.setBC();
+
+         //initialization of distributions
+         InitDistributionsBlockVisitor initVisitor;
+         grid->accept(initVisitor);
+
+
+         if (myid == 0) UBLOG(logINFO, "Preprozess - end");
+      }
+      else
+      {
+         restartCoProcessor->restart((int)restartStep);
+         grid->setTimeStep(restartStep);
+      }
+      
+      omp_set_num_threads(numOfThreads);
+
+      //set connectors
+      InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor());
+      SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, k, iProcessor);
+      grid->accept(setConnsVisitor);
+
+      grid->accept(bcVisitor);
+
+      SPtr<UbScheduler> geoSch(new UbScheduler(1));
+      WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm);
+      ppgeo.process(0);
+
+      SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100));
+      SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm));
+
+      //write data for visualization of macroscopic quantities
+      SPtr<UbScheduler> visSch(new UbScheduler(outTime));
+      //SPtr<UbScheduler> visSch(new UbScheduler(10,1));
+      SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlASCII::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+      writeMQCoProcessor->process(0);
+
+      double area = 4*UbMath::PI*radius*radius;
+      SPtr<UbScheduler> forceSch(new UbScheduler(1000));
+      SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, outputPath + "/forces/forces.txt", comm, velocity, area);
+      fp->addInteractor(sphereInt);
+
+      SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
+      SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
+      calculator->addCoProcessor(npr);
+      calculator->addCoProcessor(fp);
+      calculator->addCoProcessor(writeMQCoProcessor);
+      calculator->addCoProcessor(restartCoProcessor);
+
+      if (myid == 0) UBLOG(logINFO, "Simulation-start");
+      calculator->calculate();
+      if (myid == 0) UBLOG(logINFO, "Simulation-end");
+   }
+   catch (std::exception& e)
+   {
+      cerr << e.what() << endl << flush;
+   }
+   catch (std::string& s)
+   {
+      cerr << s << endl;
+   }
+   catch (...)
+   {
+      cerr << "unknown exception" << endl;
+   }
+
+}
+
+//////////////////////////////////////////////////////////////////////////
+int main(int argc, char* argv[])
+{
+   if (argv != NULL)
+   {
+      if (argv[1] != NULL)
+      {
+         //pflowForcing(string(argv[1]));
+         bflow(string(argv[1]));
+      }
+      else
+      {
+         cout << "Configuration file is missing!" << endl;
+      }
+   }
+
+   return 0;
+}
diff --git a/src/cpu/VirtualFluids.h b/src/cpu/VirtualFluids.h
index 576687d69..31671c3ed 100644
--- a/src/cpu/VirtualFluids.h
+++ b/src/cpu/VirtualFluids.h
@@ -121,6 +121,15 @@
 #include <BoundaryConditions/VelocityBCAdapter.h>
 #include <BoundaryConditions/VelocityBCAlgorithm.h>
 #include <BoundaryConditions/VelocityWithDensityBCAlgorithm.h>
+#include <BoundaryConditions/DensityAndThixotropyBCAlgorithm.h>
+#include <BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.h>
+#include <BoundaryConditions/VelocityAndThixotropyBCAlgorithm.h>
+#include <BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.h>
+#include <BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.h>
+#include <BoundaryConditions/SimpleVelocityBCAlgorithm.h>
+#include <BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h>
+#include <BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h>
+#include <BoundaryConditions/HerschelBulkleyModelNoSlipBCAlgorithm.h>
 
 #include <Connectors/Block3DConnector.h>
 #include <Connectors/Block3DConnectorFactory.h>
@@ -182,8 +191,7 @@
 #include <CoProcessors/MPIIOMigrationCoProcessor.h>
 #include <CoProcessors/MPIIORestartCoProcessor.h>
 #include <CoProcessors/MicrophoneArrayCoProcessor.h>
-#include <CoProcessors/PressureCoefficientCoProcessor.h>
-#include <CoProcessors/TimeAveragedValuesCoProcessor.h>
+#include <WriteThixotropyQuantitiesCoProcessor.h>
 
 #include <IntegrateValuesHelper.h>
 //#include <LBM/D3Q27CompactInterpolationProcessor.h>
@@ -206,7 +214,14 @@
 #include <LBM/LBMKernelETD3Q27BGK.h>
 #include <LBM/LBMSystem.h>
 #include <LBM/LBMUnitConverter.h>
-#include <LBM/VoidLBMKernel.h>
+//#include <LBM/BGKLBMKernel.h>
+#include <LBM/ThixotropyLBMKernel.h>
+#include <LBM/ThixotropyExpLBMKernel.h>
+#include <LBM/CumulantLBMKernel.h>
+#include <LBM/ThixotropyModelLBMKernel.h>
+#include <LBM/BinghamModelLBMKernel.h>
+#include <LBM/HerschelBulkleyModelLBMKernel.h>
+
 
 #include <geometry3d/CoordinateTransformation3D.h>
 #include <geometry3d/GbCuboid3D.h>
@@ -287,6 +302,14 @@
 #include <Visitors/SetSpongeLayerBlockVisitor.h>
 #include <Visitors/SetUndefinedNodesBlockVisitor.h>
 #include <Visitors/ViscosityBlockVisitor.h>
+#include <Visitors/BoundaryConditionsBlockVisitor.h>
+#include <Visitors/BoundaryConditionsBlockVisitor.h>
+#include <Visitors/ChangeBoundaryDensityBlockVisitor.h>
+#include <InitDistributionsFromFileBlockVisitor.h>
+#include <InitDistributionsWithInterpolationGridVisitor.h>
+#include <InitThixotropyBlockVisitor.h>
+#include <CheckRatioBlockVisitor.h>
+#include <SpongeLayerBlockVisitor.h>
 #include <ZoltanPartitioningGridVisitor.h>
 
 #include <RefineAroundGbObjectHelper.h>
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp
index 61b427e32..8737b8c04 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp
@@ -36,7 +36,12 @@
 #include "BCArray3D.h"
 #include "BoundaryConditions.h"
 #include "EsoTwist3D.h"
+#include "BCArray3D.h"
+
 
+BCAlgorithm::BCAlgorithm() : compressible(false), thixotropy(false)
+{
+}
 //////////////////////////////////////////////////////////////////////////
 void BCAlgorithm::setNodeIndex(int x1, int x2, int x3)
 {
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h
index 7cef8205c..abc4a7072 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h
@@ -47,36 +47,48 @@ class BoundaryConditions;
 class BCAlgorithm
 {
 public:
-    static const char VelocityBCAlgorithm             = 0;
-    static const char EqDensityBCAlgorithm            = 1;
-    static const char NonEqDensityBCAlgorithm         = 2;
-    static const char NoSlipBCAlgorithm               = 3;
-    static const char SlipBCAlgorithm                 = 4;
-    static const char HighViscosityNoSlipBCAlgorithm  = 5;
-    static const char ThinWallNoSlipBCAlgorithm       = 6;
-    static const char VelocityWithDensityBCAlgorithm  = 7;
-    static const char NonReflectingOutflowBCAlgorithm = 8;
+   static const char VelocityBCAlgorithm = 0;
+   static const char EqDensityBCAlgorithm = 1;
+   static const char NonEqDensityBCAlgorithm = 2;
+   static const char NoSlipBCAlgorithm = 3;
+   static const char SlipBCAlgorithm = 4;
+   static const char HighViscosityNoSlipBCAlgorithm = 5;
+   static const char ThinWallNoSlipBCAlgorithm = 6;
+   static const char VelocityWithDensityBCAlgorithm = 7;
+   static const char NonReflectingOutflowBCAlgorithm = 8;
+   static const char VelocityAndThixotropyBCAlgorithm = 9;
+   static const char DensityAndThixotropyBCAlgorithm = 10;
+   static const char NoSlipAndThixotropyBCAlgorithm = 11;
+   static const char NonReflectingOutflowAndThixotropyBCAlgorithm = 12;
+   static const char VelocityWithDensityAndThixotropyBCAlgorithm = 13;
+   static const char BinghamModelNoSlipBCAlgorithm = 14;
+   static const char HerschelBulkleyModelNoSlipBCAlgorithm = 15;
+   static const char SimpleVelocityBCAlgorithm = 16;
+   
 
-public:
-    BCAlgorithm()          = default;
-    virtual ~BCAlgorithm() = default;
 
-    virtual void addDistributions(SPtr<DistributionArray3D> distributions) = 0;
-    void setNodeIndex(int x1, int x2, int x3);
-    void setBcPointer(SPtr<BoundaryConditions> bcPtr);
-    void setCompressible(bool c);
-    void setCollFactor(LBMReal cf);
-    char getType();
-    bool isPreCollision();
-    virtual SPtr<BCAlgorithm> clone() = 0;
-    SPtr<BCArray3D> getBcArray();
-    void setBcArray(SPtr<BCArray3D> bcarray);
-    virtual void applyBC() = 0;
+public:
+   BCAlgorithm();
+   virtual ~BCAlgorithm() {}
+   
+   virtual void addDistributions(SPtr<DistributionArray3D> distributions) = 0;
+   void setNodeIndex(int x1, int x2, int x3);
+   void setBcPointer(SPtr<BoundaryConditions> bcPtr);
+   void setCompressible(bool c);
+   void setCollFactor(LBMReal cf);
+   char getType();
+   bool isPreCollision();
+   virtual SPtr<BCAlgorithm> clone() = 0;
+   SPtr<BCArray3D> getBcArray();
+   void setBcArray(SPtr<BCArray3D> bcarray);
+   virtual void applyBC() = 0;
+   bool getThixotropy(){ return thixotropy;};
 
 protected:
-    bool compressible{ false };
-    char type;
-    bool preCollision;
+   bool compressible;
+   char type;
+   bool preCollision;
+   bool thixotropy;
 
     SPtr<BoundaryConditions> bcPtr;
     SPtr<DistributionArray3D> distributions;
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h
new file mode 100644
index 000000000..a42938413
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h
@@ -0,0 +1,27 @@
+#ifndef BinghamModelNoSlipBCAlgorithm_h__
+#define BinghamModelNoSlipBCAlgorithm_h__
+
+#include "ThixotropyNoSlipBCAlgorithm.h"
+#include "Thixotropy.h"
+
+class BinghamModelNoSlipBCAlgorithm : public ThixotropyNoSlipBCAlgorithm
+{
+public:
+   BinghamModelNoSlipBCAlgorithm()
+   {
+      BCAlgorithm::type = BCAlgorithm::BinghamModelNoSlipBCAlgorithm;
+      BCAlgorithm::preCollision = true;
+   }
+   ~BinghamModelNoSlipBCAlgorithm() {}
+   SPtr<BCAlgorithm> clone() override
+   {
+      SPtr<BCAlgorithm> bc(new BinghamModelNoSlipBCAlgorithm());
+      return bc;
+   }
+protected:
+   LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const override 
+   { 
+      return Thixotropy::getBinghamCollFactor(omegaInf, shearRate, drho);
+   }
+};
+#endif // BinghamModelNoSlipBCAlgorithm_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
index 886d1ee2d..a2c495bc1 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h
@@ -47,7 +47,32 @@
 class BoundaryConditions
 {
 public:
-    BoundaryConditions()
+   BoundaryConditions() 
+      : noslipBoundaryFlags(0)		
+      , slipBoundaryFlags(0)		
+      , velocityBoundaryFlags(0)		
+      , densityBoundaryFlags(0)		
+      , wallModelBoundaryFlags(0)
+      , bcVelocityX1(0.0f)
+      , bcVelocityX2(0.0f)
+      , bcVelocityX3(0.0f)
+      , bcDensity(0.0f)
+      //, bcThixotropy(0.0f)
+      , bcLodiDensity(0.0f)
+      , bcLodiVelocityX1(0.0f)
+      , bcLodiVelocityX2(0.0f)
+      , bcLodiVelocityX3(0.0f)
+      , bcLodiLentgh(0.0f)
+      , nx1(0.0f)
+      , nx2(0.0f)
+      , nx3(0.0f)
+      , algorithmType(-1)
+   {
+      //wenn folgendes nicht geht, dann hat man weiter unten bei der bit-geschichte ein ernstes problem!!!
+      UB_STATIC_ASSERT( sizeof(long long) >= 8);
+      //UB_STATIC_ASSERT( sizeof(double) >= 16);
+      //UB_STATIC_ASSERT( sizeof(long long) == 32);
+      UB_STATIC_ASSERT( (sizeof(long long)*8) >= (D3Q27System::FENDDIR+1)*BoundaryConditions::optionDigits );
 
     {
         UB_STATIC_ASSERT(sizeof(long long) >= 8);
@@ -276,17 +301,20 @@ public:
     void setBoundaryDensity(LBMReal density) { this->bcDensity = density; }
     LBMReal getBoundaryDensity() { return this->bcDensity; }
 
-    // Lodi extension
-    void setDensityLodiDensity(const LBMReal &bcLodiDensity) { this->bcLodiDensity = bcLodiDensity; }
-    void setDensityLodiVelocityX1(const LBMReal &bcLodiVelocityX1) { this->bcLodiVelocityX1 = bcLodiVelocityX1; }
-    void setDensityLodiVelocityX2(const LBMReal &bcLodiVelocityX2) { this->bcLodiVelocityX2 = bcLodiVelocityX2; }
-    void setDensityLodiVelocityX3(const LBMReal &bcLodiVelocityX3) { this->bcLodiVelocityX3 = bcLodiVelocityX3; }
-    void setDensityLodiLength(const LBMReal &bcLodiLentgh) { this->bcLodiLentgh = bcLodiLentgh; }
-    LBMReal getDensityLodiDensity() const { return this->bcLodiDensity; }
-    LBMReal getDensityLodiVelocityX1() const { return this->bcLodiVelocityX1; }
-    LBMReal getDensityLodiVelocityX2() const { return this->bcLodiVelocityX2; }
-    LBMReal getDensityLodiVelocityX3() const { return this->bcLodiVelocityX3; }
-    LBMReal getDensityLodiLength() const { return this->bcLodiLentgh; }
+   //void  setBoundaryThixotropy(float thixotropy) { this->bcDensity = thixotropy; }
+   //float getBoundaryThixotropy() { return this->bcThixotropy; }
+
+   ////Lodi extension
+   void  setDensityLodiDensity(const float& bcLodiDensity)       { this->bcLodiDensity    = bcLodiDensity;    } 
+   void  setDensityLodiVelocityX1(const float& bcLodiVelocityX1) { this->bcLodiVelocityX1 = bcLodiVelocityX1; } 
+   void  setDensityLodiVelocityX2(const float& bcLodiVelocityX2) { this->bcLodiVelocityX2 = bcLodiVelocityX2; } 
+   void  setDensityLodiVelocityX3(const float& bcLodiVelocityX3) { this->bcLodiVelocityX3 = bcLodiVelocityX3; } 
+   void  setDensityLodiLength(const float& bcLodiLentgh)         { this->bcLodiLentgh     = bcLodiLentgh;     } 
+   float getDensityLodiDensity() const                           { return this->bcLodiDensity;    } 
+   float getDensityLodiVelocityX1() const                        { return this->bcLodiVelocityX1; }
+   float getDensityLodiVelocityX2() const                        { return this->bcLodiVelocityX2; }
+   float getDensityLodiVelocityX3() const                        { return this->bcLodiVelocityX3; }
+   float getDensityLodiLength() const                            { return this->bcLodiLentgh;     }
 
     LBMReal &densityLodiDensity() { return this->bcLodiDensity; }
     LBMReal &densityLodiVelocityX1() { return this->bcLodiVelocityX1; }
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.cpp
new file mode 100644
index 000000000..45b467596
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.cpp
@@ -0,0 +1,89 @@
+#include "DensityAndThixotropyBCAlgorithm.h"
+#include "DistributionArray3D.h"
+#include "BoundaryConditions.h"
+
+DensityAndThixotropyBCAlgorithm::DensityAndThixotropyBCAlgorithm()
+{
+	BCAlgorithm::type = BCAlgorithm::DensityAndThixotropyBCAlgorithm;
+	BCAlgorithm::preCollision = false;
+	BCAlgorithm::thixotropy = true;
+	lambdaBC = 0.0;
+}
+//////////////////////////////////////////////////////////////////////////
+DensityAndThixotropyBCAlgorithm::~DensityAndThixotropyBCAlgorithm()
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<BCAlgorithm> DensityAndThixotropyBCAlgorithm::clone()
+{
+	SPtr<BCAlgorithm> bc(new DensityAndThixotropyBCAlgorithm());
+	dynamicPointerCast<DensityAndThixotropyBCAlgorithm>(bc)->setLambdaBC(lambdaBC);
+	return bc;
+}
+//////////////////////////////////////////////////////////////////////////
+void DensityAndThixotropyBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+{
+	this->distributions = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+//void DensityAndThixotropyBCAlgorithm::addDistributionsF(DistributionArray3DPtr distributions)
+//{
+//	this->distributionsf = distributions;
+//}
+//////////////////////////////////////////////////////////////////////////
+void DensityAndThixotropyBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions)
+{
+	this->distributionsH = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+void DensityAndThixotropyBCAlgorithm::applyBC()
+{
+   using namespace D3Q27System;
+
+	LBMReal f[D3Q27System::ENDF + 1];
+	LBMReal feq[D3Q27System::ENDF + 1];
+	LBMReal h[D3Q27System::ENDF + 1];
+	LBMReal heq[D3Q27System::ENDF + 1];
+	distributions->getDistributionInv(f, x1, x2, x3);
+	distributionsH->getDistributionInv(h, x1, x2, x3);
+	
+	LBMReal rho, vx1, vx2, vx3;
+	
+	calcMacrosFct(f, rho, vx1, vx2, vx3);
+	calcFeqFct(feq, rho, vx1, vx2, vx3);
+
+	LBMReal lambda = D3Q27System::getDensity(h);
+	D3Q27System::calcCompFeq(heq, lambda, vx1, vx2, vx3);
+
+
+	int nx1 = x1;
+	int nx2 = x2;
+	int nx3 = x3;
+	int direction = -1;
+
+	//flag points in direction of fluid
+	if (bcPtr->hasDensityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; direction = D3Q27System::E; }
+	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::W)) { nx1 += 1; direction = D3Q27System::W; }
+	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; direction = D3Q27System::N; }
+	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::S)) { nx2 += 1; direction = D3Q27System::S; }
+	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; direction = D3Q27System::T; }
+	else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::B)) { nx3 += 1; direction = D3Q27System::B; }
+	else	 UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary..."));
+
+	LBMReal rhoBC = bcPtr->getBoundaryDensity();
+
+	for (int fdir = D3Q27System::STARTF; fdir <= D3Q27System::ENDF; fdir++)
+	{
+		if (bcPtr->hasDensityBoundaryFlag(fdir))
+		{
+			LBMReal ftemp = calcFeqsForDirFct(fdir, rho, vx1, vx2, vx3);
+			ftemp = calcFeqsForDirFct(fdir, rhoBC, vx1, vx2, vx3) + f[fdir] - ftemp;
+			distributions->setDistributionForDirection(ftemp, nx1, nx2, nx3, fdir);
+
+			LBMReal htemp = D3Q27System::getCompFeqForDirection(fdir, lambda, vx1, vx2, vx3);
+			htemp = D3Q27System::getCompFeqForDirection(fdir,lambdaBC, vx1, vx2, vx3) + h[fdir] - htemp;
+			distributionsH->setDistributionForDirection(htemp, nx1, nx2, nx3, fdir);
+		}
+	}
+}
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.h
new file mode 100644
index 000000000..069b6f1c6
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.h
@@ -0,0 +1,25 @@
+#ifndef DensityAndThixotropyBCAlgorithm_h__
+#define DensityAndThixotropyBCAlgorithm_h__
+
+#include "BCAlgorithm.h"
+
+
+class DensityAndThixotropyBCAlgorithm : public BCAlgorithm
+{
+public:
+	DensityAndThixotropyBCAlgorithm();
+	virtual ~DensityAndThixotropyBCAlgorithm();
+	SPtr<BCAlgorithm> clone();
+	void addDistributions(SPtr<DistributionArray3D> distributions);
+	//void addDistributionsF(SPtr<DistributionArray3D> distributions);
+	void addDistributionsH(SPtr<DistributionArray3D> distributions);
+	void applyBC();
+	void setLambdaBC(LBMReal lambda) { this->lambdaBC = lambda; }
+	LBMReal getLambdaBC() { return this->lambdaBC; }
+protected:
+	SPtr<DistributionArray3D> distributionsH;
+private:
+	LBMReal lambdaBC;
+};
+#endif // DensityAndThixotropyBCAlgorithm_h__
+
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/HerschelBulkleyModelNoSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/HerschelBulkleyModelNoSlipBCAlgorithm.h
new file mode 100644
index 000000000..46bfbd193
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/HerschelBulkleyModelNoSlipBCAlgorithm.h
@@ -0,0 +1,27 @@
+#ifndef HerschelBulkleyModelNoSlipBCAlgorithm_h__
+#define HerschelBulkleyModelNoSlipBCAlgorithm_h__
+
+#include "ThixotropyNoSlipBCAlgorithm.h"
+#include "Thixotropy.h"
+
+class HerschelBulkleyModelNoSlipBCAlgorithm : public ThixotropyNoSlipBCAlgorithm
+{
+public:
+   HerschelBulkleyModelNoSlipBCAlgorithm() 
+   {
+      BCAlgorithm::type = BCAlgorithm::HerschelBulkleyModelNoSlipBCAlgorithm;
+      BCAlgorithm::preCollision = true;
+   }
+   ~HerschelBulkleyModelNoSlipBCAlgorithm() {}
+   SPtr<BCAlgorithm> clone() override
+   {
+      SPtr<BCAlgorithm> bc(new HerschelBulkleyModelNoSlipBCAlgorithm());
+      return bc;
+   }
+protected:
+   LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const override
+   {
+      return Thixotropy::getHerschelBulkleyCollFactor(omegaInf, shearRate, drho);
+   }
+};
+#endif // HerschelBulkleyModelNoSlipBCAlgorithm_h__
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.cpp
new file mode 100644
index 000000000..cfed98d78
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.cpp
@@ -0,0 +1,70 @@
+#include "NoSlipAndThixotropyBCAlgorithm.h"
+#include "DistributionArray3D.h"
+#include "BoundaryConditions.h"
+
+NoSlipAndThixotropyBCAlgorithm::NoSlipAndThixotropyBCAlgorithm()
+{
+	BCAlgorithm::type = BCAlgorithm::NoSlipAndThixotropyBCAlgorithm;
+	BCAlgorithm::preCollision = false;
+	BCAlgorithm::thixotropy = true;
+	
+}
+//////////////////////////////////////////////////////////////////////////
+NoSlipAndThixotropyBCAlgorithm::~NoSlipAndThixotropyBCAlgorithm()
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<BCAlgorithm> NoSlipAndThixotropyBCAlgorithm::clone()
+{
+	SPtr<BCAlgorithm> bc(new NoSlipAndThixotropyBCAlgorithm());
+	return bc;
+}
+//////////////////////////////////////////////////////////////////////////
+void NoSlipAndThixotropyBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+{
+	this->distributions = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+//void NoSlipAndThixotropyBCAlgorithm::addDistributionsF(SPtr<DistributionArray3D> distributions)
+//{
+//	this->distributionsf = distributions;
+//}
+//////////////////////////////////////////////////////////////////////////
+void NoSlipAndThixotropyBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions)
+{
+	this->distributionsH = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+void NoSlipAndThixotropyBCAlgorithm::applyBC()
+{
+	LBMReal f[D3Q27System::ENDF + 1];
+	LBMReal feq[D3Q27System::ENDF + 1];
+	LBMReal h[D3Q27System::ENDF + 1];
+	LBMReal heq[D3Q27System::ENDF + 1];
+	distributions->getDistributionInv(f, x1, x2, x3);
+	distributionsH->getDistributionInv(h, x1, x2, x3);
+	LBMReal rho, vx1, vx2, vx3;//, concentration, fl1, fl2, fl3, m100;
+	calcMacrosFct(f, rho, vx1, vx2, vx3);
+	calcFeqFct(feq, rho, vx1, vx2, vx3);
+
+	//calcDiffusionMacrosFctPost(h, concentration, fl1, fl2, fl3, m100, collFactor);
+	LBMReal lambda = D3Q27System::getDensity(h);
+	D3Q27System::calcCompFeq(heq, lambda, 0., 0., 0.);
+
+	for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++)
+	{
+		if (bcPtr->hasNoSlipBoundaryFlag(fdir))
+		{
+			//quadratic bounce back
+			const int invDir = D3Q27System::INVDIR[fdir];
+			LBMReal q = bcPtr->getQ(invDir);
+			LBMReal fReturnf = ((1.0 - q) / (1.0 + q))*((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir]) + ((q / (1.0 + q))*(f[invDir] + f[fdir]));
+			LBMReal fReturnh = ((1.0 - q) / (1.0 + q))*((h[invDir] - heq[invDir]) / (1.0 - collFactor) + heq[invDir]) + ((q / (1.0 + q))*(h[invDir] + h[fdir]));
+
+			distributions->setDistributionForDirection(fReturnf, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+			distributionsH->setDistributionForDirection(fReturnh, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+
+		}
+	}
+}
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.h
new file mode 100644
index 000000000..a7225e393
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.h
@@ -0,0 +1,22 @@
+#ifndef NoSlipAndThixotropyBCAlgorithm_h__
+#define NoSlipAndThixotropyBCAlgorithm_h__
+
+#include "BCAlgorithm.h"
+
+class NoSlipAndThixotropyBCAlgorithm : public BCAlgorithm
+{
+public:
+	NoSlipAndThixotropyBCAlgorithm();
+	virtual ~NoSlipAndThixotropyBCAlgorithm();
+	SPtr<BCAlgorithm> clone();
+	void addDistributions(SPtr<DistributionArray3D> distributions);
+	//void addDistributionsF(DistributionArray3DPtr distributions);
+	void addDistributionsH(SPtr<DistributionArray3D> distributions);
+	void applyBC();
+protected:
+	SPtr<DistributionArray3D> distributionsH;
+private:
+
+};
+#endif // NoSlipAndThixotropyBCAlgorithm_h__
+
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.cpp
new file mode 100644
index 000000000..006f45619
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.cpp
@@ -0,0 +1,339 @@
+#include "NonReflectingOutflowAndThixotropyBCAlgorithm.h"
+#include "DistributionArray3D.h"
+#include "BoundaryConditions.h"
+
+NonReflectingOutflowAndThixotropyBCAlgorithm::NonReflectingOutflowAndThixotropyBCAlgorithm()
+{
+	BCAlgorithm::type = BCAlgorithm::NonReflectingOutflowAndThixotropyBCAlgorithm;
+	BCAlgorithm::preCollision = true;
+	BCAlgorithm::thixotropy = true;
+}
+//////////////////////////////////////////////////////////////////////////
+NonReflectingOutflowAndThixotropyBCAlgorithm::~NonReflectingOutflowAndThixotropyBCAlgorithm()
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<BCAlgorithm> NonReflectingOutflowAndThixotropyBCAlgorithm::clone()
+{
+	SPtr<BCAlgorithm> bc(new NonReflectingOutflowAndThixotropyBCAlgorithm());
+	return bc;
+}
+//////////////////////////////////////////////////////////////////////////
+void NonReflectingOutflowAndThixotropyBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+{
+	this->distributions = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+//void NonReflectingOutflowAndThixotropyBCAlgorithm::addDistributionsF(DistributionArray3DPtr distributions)
+//{
+//	this->distributionsf = distributions;
+//}
+//////////////////////////////////////////////////////////////////////////
+void NonReflectingOutflowAndThixotropyBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions)
+{
+	this->distributionsH = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+void NonReflectingOutflowAndThixotropyBCAlgorithm::applyBC()
+{
+   using namespace D3Q27System;
+   LBMReal f[ENDF + 1];
+   LBMReal ftemp[ENDF + 1];
+
+   int nx1 = x1;
+   int nx2 = x2;
+   int nx3 = x3;
+   int direction = -1;
+
+   //flag points in direction of fluid
+   if (bcPtr->hasDensityBoundaryFlag(E)) { nx1 += 1; direction = E; }
+   else if (bcPtr->hasDensityBoundaryFlag(W)) { nx1 -= 1; direction = W; }
+   else if (bcPtr->hasDensityBoundaryFlag(N)) { nx2 += 1; direction = N; }
+   else if (bcPtr->hasDensityBoundaryFlag(S)) { nx2 -= 1; direction = S; }
+   else if (bcPtr->hasDensityBoundaryFlag(T)) { nx3 += 1; direction = T; }
+   else if (bcPtr->hasDensityBoundaryFlag(B)) { nx3 -= 1; direction = B; }
+   else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary..."));
+
+   distributions->getDistribution(f, x1, x2, x3);
+   distributions->getDistribution(ftemp, nx1, nx2, nx3);
+
+   LBMReal rho, vx1, vx2, vx3;
+   calcMacrosFct(f, rho, vx1, vx2, vx3);
+
+   switch (direction)
+   {
+   case E:
+      f[E] = ftemp[E] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[E];
+      f[NE] = ftemp[NE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[NE];
+      f[SE] = ftemp[SE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[SE];
+      f[TE] = ftemp[TE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[TE];
+      f[BE] = ftemp[BE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[BE];
+      f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[TNE];
+      f[TSE] = ftemp[TSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[TSE];
+      f[BNE] = ftemp[BNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[BNE];
+      f[BSE] = ftemp[BSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[BSE];
+
+      distributions->setDistributionInvForDirection(f[E], x1 + DX1[W], x2 + DX2[W], x3 + DX3[W], W);
+      distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW);
+      distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW);
+      distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW);
+      distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW);
+      distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
+      distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
+      distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
+      distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
+      break;
+   case W:
+      f[W] = ftemp[W] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[W];
+      f[NW] = ftemp[NW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[NW];
+      f[SW] = ftemp[SW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[SW];
+      f[TW] = ftemp[TW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[TW];
+      f[BW] = ftemp[BW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[BW];
+      f[TNW] = ftemp[TNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[TNW];
+      f[TSW] = ftemp[TSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[TSW];
+      f[BNW] = ftemp[BNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[BNW];
+      f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[BSW];
+
+      distributions->setDistributionInvForDirection(f[W], x1 + DX1[E], x2 + DX2[E], x3 + DX3[E], E);
+      distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE);
+      distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE);
+      distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE);
+      distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE);
+      distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
+      distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
+      distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
+      distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      break;
+   case N:
+      f[N] = ftemp[N] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[N];
+      f[NE] = ftemp[NE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[NE];
+      f[NW] = ftemp[NW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[NW];
+      f[TN] = ftemp[TN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[TN];
+      f[BN] = ftemp[BN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[BN];
+      f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[TNE];
+      f[TNW] = ftemp[TNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[TNW];
+      f[BNE] = ftemp[BNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[BNE];
+      f[BNW] = ftemp[BNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[BNW];
+
+      distributions->setDistributionInvForDirection(f[N], x1 + DX1[S], x2 + DX2[S], x3 + DX3[S], S);
+      distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW);
+      distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE);
+      distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS);
+      distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS);
+      distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
+      distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
+      distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
+      distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
+      break;
+   case S:
+      f[S] = ftemp[S] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[S];
+      f[SE] = ftemp[SE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[SE];
+      f[SW] = ftemp[SW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[SW];
+      f[TS] = ftemp[TS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[TS];
+      f[BS] = ftemp[BS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[BS];
+      f[TSE] = ftemp[TSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[TSE];
+      f[TSW] = ftemp[TSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[TSW];
+      f[BSE] = ftemp[BSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[BSE];
+      f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[BSW];
+
+      distributions->setDistributionInvForDirection(f[S], x1 + DX1[N], x2 + DX2[N], x3 + DX3[N], N);
+      distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW);
+      distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE);
+      distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN);
+      distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN);
+      distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
+      distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
+      distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
+      distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      break;
+   case T:
+      f[T] = ftemp[T] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[T];
+      f[TE] = ftemp[TE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TE];
+      f[TW] = ftemp[TW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TW];
+      f[TN] = ftemp[TN] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TN];
+      f[TS] = ftemp[TS] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TS];
+      f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TNE];
+      f[TNW] = ftemp[TNW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TNW];
+      f[TSE] = ftemp[TSE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TSE];
+      f[TSW] = ftemp[TSW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TSW];
+
+      distributions->setDistributionInvForDirection(f[T], x1 + DX1[B], x2 + DX2[B], x3 + DX3[B], B);
+      distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW);
+      distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE);
+      distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS);
+      distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN);
+      distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
+      distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
+      distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
+      distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
+      break;
+   case B:
+      f[B] = ftemp[B] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[B];
+      f[BE] = ftemp[BE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BE];
+      f[BW] = ftemp[BW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BW];
+      f[BN] = ftemp[BN] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BN];
+      f[BS] = ftemp[BS] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BS];
+      f[BNE] = ftemp[BNE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BNE];
+      f[BNW] = ftemp[BNW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BNW];
+      f[BSE] = ftemp[BSE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BSE];
+      f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BSW];
+
+      distributions->setDistributionInvForDirection(f[B], x1 + DX1[T], x2 + DX2[T], x3 + DX3[T], T);
+      distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW);
+      distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE);
+      distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS);
+      distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN);
+      distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
+      distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
+      distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
+      distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      break;
+   default:
+      UB_THROW(UbException(UB_EXARGS, "It isn't implemented non reflecting density boundary for this direction!"));
+   }
+   LBMReal h[D3Q27System::ENDF + 1];
+   LBMReal htemp[ENDF + 1];
+
+   distributionsH->getDistribution(h, x1, x2, x3);
+   distributionsH->getDistribution(htemp, nx1, nx2, nx3);
+
+   vx1 = 0.0;
+   vx2 = 0.0;
+   vx3 = 0.0;
+
+   //LBMReal rho, vx1, vx2, vx3;
+   //calcMacrosFct(f, rho, vx1, vx2, vx3);
+
+   switch (direction)
+   {
+   case E:
+      h[E]  = htemp[E] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[E];
+      h[NE] = htemp[NE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[NE];
+      h[SE] = htemp[SE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[SE];
+      h[TE] = htemp[TE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[TE];
+      h[BE] = htemp[BE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[BE];
+      h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[TNE];
+      h[TSE] = htemp[TSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[TSE];
+      h[BNE] = htemp[BNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[BNE];
+      h[BSE] = htemp[BSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[BSE];
+
+      distributionsH->setDistributionInvForDirection(h[E], x1 + DX1[W], x2 + DX2[W], x3 + DX3[W], W);
+      distributionsH->setDistributionInvForDirection(h[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW);
+      distributionsH->setDistributionInvForDirection(h[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW);
+      distributionsH->setDistributionInvForDirection(h[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW);
+      distributionsH->setDistributionInvForDirection(h[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW);
+      distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
+      distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
+      distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
+      distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
+      break;
+   case W:
+      h[W] = htemp[W] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[W];
+      h[NW] = htemp[NW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[NW];
+      h[SW] = htemp[SW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[SW];
+      h[TW] = htemp[TW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[TW];
+      h[BW] = htemp[BW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[BW];
+      h[TNW] = htemp[TNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[TNW];
+      h[TSW] = htemp[TSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[TSW];
+      h[BNW] = htemp[BNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[BNW];
+      h[BSW] = htemp[BSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[BSW];
+
+      distributionsH->setDistributionInvForDirection(h[W], x1 + DX1[E], x2 + DX2[E], x3 + DX3[E], E);
+      distributionsH->setDistributionInvForDirection(h[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE);
+      distributionsH->setDistributionInvForDirection(h[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE);
+      distributionsH->setDistributionInvForDirection(h[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE);
+      distributionsH->setDistributionInvForDirection(h[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE);
+      distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
+      distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
+      distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
+      distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      break;
+   case N:
+      h[N] = htemp[N] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[N];
+      h[NE] = htemp[NE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[NE];
+      h[NW] = htemp[NW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[NW];
+      h[TN] = htemp[TN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[TN];
+      h[BN] = htemp[BN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[BN];
+      h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[TNE];
+      h[TNW] = htemp[TNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[TNW];
+      h[BNE] = htemp[BNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[BNE];
+      h[BNW] = htemp[BNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[BNW];
+
+      distributionsH->setDistributionInvForDirection(h[N], x1 + DX1[S], x2 + DX2[S], x3 + DX3[S], S);
+      distributionsH->setDistributionInvForDirection(h[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW);
+      distributionsH->setDistributionInvForDirection(h[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE);
+      distributionsH->setDistributionInvForDirection(h[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS);
+      distributionsH->setDistributionInvForDirection(h[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS);
+      distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
+      distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
+      distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
+      distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
+      break;
+   case S:
+      h[S] = htemp[S] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[S];
+      h[SE] = htemp[SE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[SE];
+      h[SW] = htemp[SW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[SW];
+      h[TS] = htemp[TS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[TS];
+      h[BS] = htemp[BS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[BS];
+      h[TSE] = htemp[TSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[TSE];
+      h[TSW] = htemp[TSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[TSW];
+      h[BSE] = htemp[BSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[BSE];
+      h[BSW] = htemp[BSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[BSW];
+
+      distributionsH->setDistributionInvForDirection(h[S], x1 + DX1[N], x2 + DX2[N], x3 + DX3[N], N);
+      distributionsH->setDistributionInvForDirection(h[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW);
+      distributionsH->setDistributionInvForDirection(h[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE);
+      distributionsH->setDistributionInvForDirection(h[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN);
+      distributionsH->setDistributionInvForDirection(h[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN);
+      distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
+      distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
+      distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
+      distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      break;
+   case T:
+      h[T] = htemp[T] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[T];
+      h[TE] = htemp[TE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TE];
+      h[TW] = htemp[TW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TW];
+      h[TN] = htemp[TN] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TN];
+      h[TS] = htemp[TS] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TS];
+      h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TNE];
+      h[TNW] = htemp[TNW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TNW];
+      h[TSE] = htemp[TSE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TSE];
+      h[TSW] = htemp[TSW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TSW];
+
+      distributionsH->setDistributionInvForDirection(h[T], x1 + DX1[B], x2 + DX2[B], x3 + DX3[B], B);
+      distributionsH->setDistributionInvForDirection(h[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW);
+      distributionsH->setDistributionInvForDirection(h[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE);
+      distributionsH->setDistributionInvForDirection(h[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS);
+      distributionsH->setDistributionInvForDirection(h[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN);
+      distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW);
+      distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE);
+      distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW);
+      distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE);
+      break;
+   case B:
+      h[B] = htemp[B] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[B];
+      h[BE] = htemp[BE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BE];
+      h[BW] = htemp[BW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BW];
+      h[BN] = htemp[BN] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BN];
+      h[BS] = htemp[BS] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BS];
+      h[BNE] = htemp[BNE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BNE];
+      h[BNW] = htemp[BNW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BNW];
+      h[BSE] = htemp[BSE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BSE];
+      h[BSW] = htemp[BSW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BSW];
+
+      distributionsH->setDistributionInvForDirection(h[B], x1 + DX1[T], x2 + DX2[T], x3 + DX3[T], T);
+      distributionsH->setDistributionInvForDirection(h[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW);
+      distributionsH->setDistributionInvForDirection(h[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE);
+      distributionsH->setDistributionInvForDirection(h[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS);
+      distributionsH->setDistributionInvForDirection(h[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN);
+      distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW);
+      distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE);
+      distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW);
+      distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE);
+      break;
+   default:
+      UB_THROW(UbException(UB_EXARGS, "It isn't implemented non reflecting density boundary for this direction!"));
+   }
+}
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.h
new file mode 100644
index 000000000..8c096a5e5
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.h
@@ -0,0 +1,25 @@
+#ifndef NonReflectingOutflowAndThixotropyBCAlgorithm_h__
+#define NonReflectingOutflowAndThixotropyBCAlgorithm_h__
+
+#include "BCAlgorithm.h"
+
+
+class NonReflectingOutflowAndThixotropyBCAlgorithm : public BCAlgorithm
+{
+public:
+	NonReflectingOutflowAndThixotropyBCAlgorithm();
+	virtual ~NonReflectingOutflowAndThixotropyBCAlgorithm();
+	SPtr<BCAlgorithm> clone();
+	void addDistributions(SPtr<DistributionArray3D> distributions);
+	//void addDistributionsF(SPtr<DistributionArray3D> distributions);
+	void addDistributionsH(SPtr<DistributionArray3D> distributions);
+	void applyBC();
+	//void setLambdaBC(LBMReal lambda) { this->lambdaBC = lambda; }
+	//LBMReal getLambdaBC() { return this->lambdaBC; }
+protected:
+	SPtr<DistributionArray3D> distributionsH;
+private:
+	//LBMReal lambdaBC;
+};
+#endif // NonReflectingOutflowAndThixotropyBCAlgorithm_h__
+
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp
new file mode 100644
index 000000000..a86ee50d5
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp
@@ -0,0 +1,83 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __         
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |        
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |        
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |        
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____    
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|   
+//      \    \  |    |   ________________________________________________________________    
+//       \    \ |    |  |  ______________________________________________________________|   
+//        \    \|    |  |  |         __          __     __     __     ______      _______    
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)   
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______    
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  \   
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/   
+//
+//  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 SimpleVelocityBCAlgorithm.cpp
+//! \ingroup BoundarConditions
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#include "SimpleVelocityBCAlgorithm.h"
+#include "DistributionArray3D.h"
+#include "BoundaryConditions.h"
+
+SimpleVelocityBCAlgorithm::SimpleVelocityBCAlgorithm()
+{
+   BCAlgorithm::type = BCAlgorithm::SimpleVelocityBCAlgorithm;
+   BCAlgorithm::preCollision = false;
+}
+//////////////////////////////////////////////////////////////////////////
+SimpleVelocityBCAlgorithm::~SimpleVelocityBCAlgorithm()
+{
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<BCAlgorithm> SimpleVelocityBCAlgorithm::clone()
+{
+   SPtr<BCAlgorithm> bc(new SimpleVelocityBCAlgorithm());
+   return bc;
+}
+//////////////////////////////////////////////////////////////////////////
+void SimpleVelocityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+{
+   this->distributions = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+void SimpleVelocityBCAlgorithm::applyBC()
+{
+   LBMReal f[D3Q27System::ENDF+1];
+   LBMReal feq[D3Q27System::ENDF+1];
+   distributions->getDistributionInv(f, x1, x2, x3);
+   LBMReal rho, vx1, vx2, vx3, drho;
+   calcMacrosFct(f, drho, vx1, vx2, vx3);
+   calcFeqFct(feq, drho, vx1, vx2, vx3);
+
+   rho = 1.0+drho*compressibleFactor;
+
+   for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++)
+   {
+      if (bcPtr->hasVelocityBoundaryFlag(fdir))
+      {
+         const int invDir = D3Q27System::INVDIR[fdir];
+         LBMReal q = bcPtr->getQ(invDir);
+         LBMReal velocity = bcPtr->getBoundaryVelocity(invDir);
+         LBMReal fReturn = f[invDir] - velocity;
+         distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
+      }
+   }
+
+}
+
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.h
new file mode 100644
index 000000000..714276760
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.h
@@ -0,0 +1,54 @@
+//=======================================================================================
+// ____          ____    __    ______     __________   __      __       __        __         
+// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |        
+//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |        
+//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |        
+//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____    
+//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|   
+//      \    \  |    |   ________________________________________________________________    
+//       \    \ |    |  |  ______________________________________________________________|   
+//        \    \|    |  |  |         __          __     __     __     ______      _______    
+//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)   
+//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______    
+//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |   
+//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/   
+//
+//  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 SimpleVelocityBCAlgorithm.h
+//! \ingroup BoundarConditions
+//! \author Konstantin Kutscher
+//=======================================================================================
+
+#ifndef SimpleVelocityBCAlgorithm_H
+#define SimpleVelocityBCAlgorithm_H
+
+#include "BCAlgorithm.h"
+#include <PointerDefinitions.h>
+
+class DistributionArray3D;
+
+//! \brief A class implements velocyty boundary condition
+class SimpleVelocityBCAlgorithm : public BCAlgorithm
+{
+public:
+   SimpleVelocityBCAlgorithm();
+   ~SimpleVelocityBCAlgorithm();
+   SPtr<BCAlgorithm> clone();
+   void addDistributions(SPtr<DistributionArray3D> distributions);
+   void applyBC() override;
+};
+
+#endif 
+
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp
new file mode 100644
index 000000000..083b8703e
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp
@@ -0,0 +1,41 @@
+#include "ThixotropyNoSlipBCAlgorithm.h"
+#include "DistributionArray3D.h"
+#include "BoundaryConditions.h"
+
+ThixotropyNoSlipBCAlgorithm::ThixotropyNoSlipBCAlgorithm()
+{
+}
+//////////////////////////////////////////////////////////////////////////
+ThixotropyNoSlipBCAlgorithm::~ThixotropyNoSlipBCAlgorithm()
+{
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyNoSlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+{
+   this->distributions = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyNoSlipBCAlgorithm::applyBC()
+{
+   LBMReal f[D3Q27System::ENDF + 1];
+   LBMReal feq[D3Q27System::ENDF + 1];
+   distributions->getDistribution(f, x1, x2, x3);
+   LBMReal rho, vx1, vx2, vx3;
+   calcMacrosFct(f, rho, vx1, vx2, vx3);
+   calcFeqFct(feq, rho, vx1, vx2, vx3);
+
+   for (int fDir = D3Q27System::FSTARTDIR; fDir <= D3Q27System::FENDDIR; fDir++)
+   {
+      if (bcPtr->hasNoSlipBoundaryFlag(fDir))
+      {
+         LBMReal shearRate = D3Q27System::getShearRate(f, collFactor);
+         LBMReal collFactorF = getThyxotropyCollFactor(collFactor, shearRate, rho);
+
+         //quadratic bounce back
+         const int invDir = D3Q27System::INVDIR[fDir];
+         LBMReal q = bcPtr->getQ(invDir);
+         LBMReal fReturn =(f[invDir] + q * f[fDir] + q * collFactorF * (feq[invDir] - f[invDir] + feq[fDir] - f[fDir])) / (1.0 + q);
+         distributions->setDistributionInvForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], invDir);
+      }
+   }
+}
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h
new file mode 100644
index 000000000..284cbbf2f
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h
@@ -0,0 +1,20 @@
+#ifndef ThixotropyNoSlipBCAlgorithm_h__
+#define ThixotropyNoSlipBCAlgorithm_h__
+
+#include "BCAlgorithm.h"
+#include <PointerDefinitions.h>
+
+class DistributionArray3D;
+
+class ThixotropyNoSlipBCAlgorithm : public BCAlgorithm
+{
+public:
+   ThixotropyNoSlipBCAlgorithm();
+   ~ThixotropyNoSlipBCAlgorithm();
+   virtual SPtr<BCAlgorithm> clone() override { UB_THROW(UbException("LBMReal clone() - belongs in the derived class")); }
+   void addDistributions(SPtr<DistributionArray3D> distributions);
+   void applyBC() override;
+protected:
+   virtual LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const = 0; // { UB_THROW(UbException("LBMReal getThyxotropyCollFactor() - belongs in the derived class")); }
+};
+#endif // ThixotropyNoSlipBCAlgorithm_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.cpp
new file mode 100644
index 000000000..575521827
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.cpp
@@ -0,0 +1,105 @@
+#include "VelocityAndThixotropyBCAlgorithm.h"
+#include "DistributionArray3D.h"
+#include "BoundaryConditions.h"
+
+VelocityAndThixotropyBCAlgorithm::VelocityAndThixotropyBCAlgorithm()
+{
+	BCAlgorithm::type = BCAlgorithm::VelocityAndThixotropyBCAlgorithm;
+	BCAlgorithm::preCollision = false;
+	BCAlgorithm::thixotropy = true;
+	lambdaBC = 0.0;
+}
+//////////////////////////////////////////////////////////////////////////
+VelocityAndThixotropyBCAlgorithm::~VelocityAndThixotropyBCAlgorithm()
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<BCAlgorithm> VelocityAndThixotropyBCAlgorithm::clone()
+{
+	SPtr<BCAlgorithm> bc(new VelocityAndThixotropyBCAlgorithm());
+	dynamicPointerCast<VelocityAndThixotropyBCAlgorithm>(bc)->setLambdaBC(lambdaBC);
+	return bc;
+}
+//////////////////////////////////////////////////////////////////////////
+void VelocityAndThixotropyBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+{
+	this->distributions = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+//void VelocityAndThixotropyBCAlgorithm::addDistributionsF(DistributionArray3DPtr distributions)
+//{
+//	this->distributionsf = distributions;
+//}
+//////////////////////////////////////////////////////////////////////////
+void VelocityAndThixotropyBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions)
+{
+	this->distributionsH = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+void VelocityAndThixotropyBCAlgorithm::applyBC()
+{
+	LBMReal f[D3Q27System::ENDF + 1];
+	LBMReal feq[D3Q27System::ENDF + 1];
+	LBMReal h[D3Q27System::ENDF + 1];
+
+	distributions->getDistributionInv(f, x1, x2, x3);
+	distributionsH->getDistributionInv(h, x1, x2, x3);
+	
+	LBMReal rho, vx1, vx2, vx3, drho;
+	calcMacrosFct(f, drho, vx1, vx2, vx3);
+	calcFeqFct(feq, drho, vx1, vx2, vx3);
+
+	rho = 1.0 + drho * compressibleFactor;
+
+	//calcDiffusionMacrosFctPost(h, concentration, fl1, fl2, fl3, m100, collFactor);
+	LBMReal lambda = D3Q27System::getDensity(h);
+
+	int nx1 = x1;
+	int nx2 = x2;
+	int nx3 = x3;
+	int direction = -1;
+
+	//flag points in direction of fluid
+	if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; direction = D3Q27System::E; }
+	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; direction = D3Q27System::W; }
+	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; direction = D3Q27System::N; }
+	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; direction = D3Q27System::S; }
+	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; direction = D3Q27System::T; }
+	else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; direction = D3Q27System::B; }
+	else	 UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary..."));
+
+	//lambdaBC = bcPtr->getBoundaryThixotropy();
+
+	//LBMReal rhoBC = bcPtr->getBoundaryDensity();
+
+	//for (int fdir = D3Q27System::STARTF; fdir <= D3Q27System::ENDF; fdir++)
+	//{
+	//	if (bcPtr->hasDensityBoundaryFlag(fdir))
+	//	{
+	//		LBMReal ftemp = calcFeqsForDirFct(fdir, rho, vx1, vx2, vx3);
+	//		ftemp = calcFeqsForDirFct(fdir, rhoBC, vx1, vx2, vx3) + f[fdir] - ftemp;
+	//		distributions->setDistributionForDirection(ftemp, nx1, nx2, nx3, fdir);
+
+	//		LBMReal htemp = D3Q27System::getCompFeqForDirection(fdir, lambda, vx1, vx2, vx3);
+	//		htemp = D3Q27System::getCompFeqForDirection(fdir,lambdaBC, vx1, vx2, vx3) + h[fdir] - htemp;
+	//		distributionsH->setDistributionForDirection(htemp, nx1, nx2, nx3, fdir);
+	//	}
+	//}
+
+	for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++)
+	{
+		if (bcPtr->hasVelocityBoundaryFlag(fdir))
+		{
+			const int invDir = D3Q27System::INVDIR[fdir];
+			LBMReal q = bcPtr->getQ(invDir);// m+m q=0 stabiler
+			LBMReal velocity = bcPtr->getBoundaryVelocity(invDir);
+			LBMReal fReturn = ((1.0 - q) / (1.0 + q)) * ((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir]) + ((q * (f[invDir] + f[fdir]) - velocity * rho) / (1.0 + q));
+			distributions->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
+
+			LBMReal htemp = D3Q27System::getCompFeqForDirection(fdir, lambda, vx1, vx2, vx3);
+			htemp = D3Q27System::getCompFeqForDirection(fdir, lambdaBC, vx1, vx2, vx3) + h[fdir] - htemp;
+			distributionsH->setDistributionForDirection(htemp, nx1, nx2, nx3, fdir);
+		}
+	}
+}
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.h
new file mode 100644
index 000000000..0ab2e83c9
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.h
@@ -0,0 +1,24 @@
+#ifndef VelocityAndThixotropyBCAlgorithm_h__
+#define VelocityAndThixotropyBCAlgorithm_h__
+
+#include "BCAlgorithm.h"
+
+
+class VelocityAndThixotropyBCAlgorithm : public BCAlgorithm
+{
+public:
+	VelocityAndThixotropyBCAlgorithm();
+	virtual ~VelocityAndThixotropyBCAlgorithm();
+	SPtr<BCAlgorithm> clone();
+	void addDistributions(SPtr<DistributionArray3D> distributions);
+	void addDistributionsH(SPtr<DistributionArray3D> distributions);
+	void applyBC();
+	void setLambdaBC(LBMReal lambda) { this->lambdaBC = lambda; }
+	LBMReal getLambdaBC() { return this->lambdaBC; }
+protected:
+	SPtr<DistributionArray3D> distributionsH;
+private:
+	LBMReal lambdaBC;
+};
+#endif // VelocityAndThixotropyBCAlgorithm_h__
+
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.cpp
new file mode 100644
index 000000000..d08d112d4
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.cpp
@@ -0,0 +1,100 @@
+#include "VelocityWithDensityAndThixotropyBCAlgorithm.h"
+#include "DistributionArray3D.h"
+#include "BCArray3D.h"
+
+VelocityWithDensityAndThixotropyBCAlgorithm::VelocityWithDensityAndThixotropyBCAlgorithm()
+{
+   BCAlgorithm::type = BCAlgorithm::VelocityWithDensityAndThixotropyBCAlgorithm;
+   BCAlgorithm::preCollision = false;
+}
+//////////////////////////////////////////////////////////////////////////
+VelocityWithDensityAndThixotropyBCAlgorithm::~VelocityWithDensityAndThixotropyBCAlgorithm()
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<BCAlgorithm> VelocityWithDensityAndThixotropyBCAlgorithm::clone()
+{
+   SPtr<BCAlgorithm> bc(new VelocityWithDensityAndThixotropyBCAlgorithm());
+   dynamicPointerCast<VelocityWithDensityAndThixotropyBCAlgorithm>(bc)->setLambdaBC(lambdaBC);
+   return bc;
+}
+//////////////////////////////////////////////////////////////////////////
+void VelocityWithDensityAndThixotropyBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions)
+{
+   this->distributions = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+void VelocityWithDensityAndThixotropyBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions)
+{
+   this->distributionsH = distributions;
+}
+//////////////////////////////////////////////////////////////////////////
+void VelocityWithDensityAndThixotropyBCAlgorithm::applyBC()
+{
+   //velocity bc for non reflecting pressure bc
+   LBMReal f[D3Q27System::ENDF+1];
+   distributions->getDistributionInv(f, x1, x2, x3);
+   
+   LBMReal h[D3Q27System::ENDF + 1];
+   distributionsH->getDistributionInv(h, x1, x2, x3);
+
+   LBMReal rho, vx1, vx2, vx3, drho;
+   calcMacrosFct(f, drho, vx1, vx2, vx3);
+   
+   rho = 1.0+drho*compressibleFactor;
+  
+   ///////////////////////////////////////////////////////////////////
+   // Thixotropy
+   LBMReal lambda = D3Q27System::getDensity(h);
+
+   int nx1 = x1;
+   int nx2 = x2;
+   int nx3 = x3;
+   int direction = -1;
+
+   //flag points in direction of fluid
+   if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; direction = D3Q27System::E; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; direction = D3Q27System::W; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; direction = D3Q27System::N; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; direction = D3Q27System::S; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; direction = D3Q27System::T; }
+   else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; direction = D3Q27System::B; }
+   else	 UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary..."));
+
+   for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++)
+   {
+      int nX1 = x1 + D3Q27System::DX1[fdir];
+      int nX2 = x2 + D3Q27System::DX2[fdir];
+      int nX3 = x3 + D3Q27System::DX3[fdir];
+
+      int minX1 = 0;
+      int minX2 = 0;
+      int minX3 = 0;
+
+      int maxX1 = (int)bcArray->getNX1();
+      int maxX2 = (int)bcArray->getNX2();
+      int maxX3 = (int)bcArray->getNX3();
+
+      if (minX1 <= nX1 && maxX1 > nX1 && minX2 <= nX2 && maxX2 > nX2 && minX3 <= nX3 && maxX3 > nX3)
+      {
+         if (bcArray->isSolid(nX1,nX2,nX3))
+         {
+            const int invDir = D3Q27System::INVDIR[fdir];
+            LBMReal q =1.0;// bcPtr->getQ(invDir);// m+m q=0 stabiler
+            LBMReal velocity = bcPtr->getBoundaryVelocity(fdir);
+
+            LBMReal fReturn = (f[fdir] + f[invDir] - velocity*rho) / 2.0 - drho*D3Q27System::WEIGTH[invDir];
+            distributions->setDistributionForDirection(fReturn, nX1, nX2, nX3, invDir);
+         }
+      }
+      
+      if (bcPtr->hasVelocityBoundaryFlag(fdir))
+      {
+         const int invDir = D3Q27System::INVDIR[fdir];
+         LBMReal htemp = D3Q27System::getCompFeqForDirection(fdir, lambda, vx1, vx2, vx3);
+         htemp = D3Q27System::getCompFeqForDirection(fdir, lambdaBC, vx1, vx2, vx3) + h[fdir] - htemp;
+         distributionsH->setDistributionForDirection(htemp, nx1, nx2, nx3, fdir);
+      }
+   }
+}
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.h
new file mode 100644
index 000000000..b8cd10143
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.h
@@ -0,0 +1,31 @@
+//!  \file VelocityWithDensityAndThixotropyBCAlgorithm.h
+//!  \brief Class implements velocity bc for non reflecting pressure bc.
+//!  \author Konstantin Kutscher
+
+#ifndef VelocityWithDensityAndThixotropyBCAlgorithm_h__
+#define VelocityWithDensityAndThixotropyBCAlgorithm_h__
+
+#include "BCAlgorithm.h"
+#include <PointerDefinitions.h>
+
+class DistributionArray3D;
+
+//!  \brief Class implements Dirichlet boundary condition for velocity. Set density in system. It is used together with non reflecting outflow.  
+
+class VelocityWithDensityAndThixotropyBCAlgorithm : public BCAlgorithm
+{
+public:
+   VelocityWithDensityAndThixotropyBCAlgorithm();
+   ~VelocityWithDensityAndThixotropyBCAlgorithm();
+   SPtr<BCAlgorithm> clone();
+   void addDistributions(SPtr<DistributionArray3D> distributions);
+   void addDistributionsH(SPtr<DistributionArray3D> distributions);
+   void applyBC();
+   void setLambdaBC(LBMReal lambda) { this->lambdaBC = lambda; }
+   LBMReal getLambdaBC() { return this->lambdaBC; }
+protected:
+   SPtr<DistributionArray3D> distributionsH;
+private:
+   LBMReal lambdaBC;
+};
+#endif // VelocityWithDensityAndThixotropyBCAlgorithm_h__
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp
index 98ead1e2d..ecafaa158 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp
@@ -23,34 +23,21 @@ void VelocityWithDensityBCAlgorithm::addDistributions(SPtr<DistributionArray3D>
 //////////////////////////////////////////////////////////////////////////
 void VelocityWithDensityBCAlgorithm::applyBC()
 {
-    // velocity bc for non reflecting pressure bc
-    LBMReal f[D3Q27System::ENDF + 1];
-    LBMReal feq[D3Q27System::ENDF + 1];
-    distributions->getDistributionInv(f, x1, x2, x3);
-    LBMReal rho, vx1, vx2, vx3, drho;
-    calcMacrosFct(f, drho, vx1, vx2, vx3);
-    calcFeqFct(feq, drho, vx1, vx2, vx3);
+   //velocity bc for non reflecting pressure bc
+   LBMReal f[D3Q27System::ENDF+1];
+   LBMReal feq[D3Q27System::ENDF+1];
+   distributions->getDistributionInv(f, x1, x2, x3);
+   LBMReal rho, vx1, vx2, vx3, drho;
+   calcMacrosFct(f, drho, vx1, vx2, vx3);
+   //calcFeqFct(feq, drho, vx1, vx2, vx3);
+   
+   rho = 1.0+drho*compressibleFactor;
 
-    rho = 1.0 + drho * compressibleFactor;
-
-    for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) {
-        // if (bcPtr->hasVelocityBoundaryFlag(fdir))
-        //{
-        //   const int invDir = D3Q27System::INVDIR[fdir];
-        //   LBMReal q = bcPtr->getQ(invDir);// m+m q=0 stabiler
-        //   LBMReal velocity = bcPtr->getBoundaryVelocity(invDir);
-        //   //normal velocity bc: LBMReal fReturn =
-        //   ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity*rho)/(1.0+q));
-        //   //LBMReal fReturn = ((1.0 - q) / (1.0 + q))*((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir])
-        //   + ((q*(f[invDir] + f[fdir]) - velocity) / (1.0 + q))-drho*D3Q27System::WEIGTH[invDir];
-        //   //LBMReal fReturn = ((1.0 - q) / (1.0 + q))*((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir])
-        //   + ((q*(f[invDir] + f[fdir]) - velocity*rho) / (1.0 + q))-drho*D3Q27System::WEIGTH[invDir]; LBMReal fReturn
-        //   = ((1.0 - q) / (1.0 + q))*((f[invDir] - feq[invDir]*collFactor) / (1.0 - collFactor)) + ((q*(f[invDir] +
-        //   f[fdir]) - velocity*rho) / (1.0 + q))-drho*D3Q27System::WEIGTH[invDir];
-        //
-        //   distributions->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 +
-        //   D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir);
-        //}
+   for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++)
+   {
+      int nX1 = x1 + D3Q27System::DX1[fdir];
+      int nX2 = x2 + D3Q27System::DX2[fdir];
+      int nX3 = x3 + D3Q27System::DX3[fdir];
 
         int nX1 = x1 + D3Q27System::DX1[fdir];
         int nX2 = x2 + D3Q27System::DX2[fdir];
diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h
index c590bd4a9..a8c0a4706 100644
--- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h
+++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h
@@ -1,4 +1,4 @@
-//!  \file NonReflectingVelocityBCAlgorithm.h
+//!  \file VelocityWithDensityBCAlgorithm.h
 //!  \brief Class implements velocity bc for non reflecting pressure bc.
 //!  \author Konstantin Kutscher
 
@@ -22,4 +22,4 @@ public:
     void addDistributions(SPtr<DistributionArray3D> distributions) override;
     void applyBC() override;
 };
-#endif // NonReflectingVelocityBCAlgorithm_h__
+#endif // VelocityWithDensityBCAlgorithm_h__
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp
index a4558c64b..1d71e4bbf 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp
@@ -145,120 +145,126 @@ void WriteMacroscopicQuantitiesCoProcessor::clearData()
 //////////////////////////////////////////////////////////////////////////
 void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
 {
-    double level = (double) block->getLevel();
-    //   double blockID = (double)block->getGlobalID();
-
-    // Diese Daten werden geschrieben:
-    datanames.resize(0);
-    datanames.emplace_back("Rho");
-    datanames.emplace_back("Vx");
-    datanames.emplace_back("Vy");
-    datanames.emplace_back("Vz");
-    // datanames.emplace_back("Press");
-    datanames.emplace_back("Level");
-    // datanames.emplace_back("BlockID");
-
-    data.resize(datanames.size());
-
-    SPtr<ILBMKernel> kernel = block->getKernel();
-    SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
-    SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
-    LBMReal f[D3Q27System::ENDF + 1];
-    LBMReal vx1, vx2, vx3, rho;
-
-    if (block->getKernel()->getCompressible())
-    {
-        calcMacros = &D3Q27System::calcCompMacroscopicValues;
-    } else
-    {
-        calcMacros = &D3Q27System::calcIncompMacroscopicValues;
-    }
-
-    int minX1 = 0;
-    int minX2 = 0;
-    int minX3 = 0;
-
-    int maxX1 = (int) (distributions->getNX1());
-    int maxX2 = (int) (distributions->getNX2());
-    int maxX3 = (int) (distributions->getNX3());
-
-    // int minX1 = 1;
-    // int minX2 = 1;
-    // int minX3 = 1;
-
-    // int maxX1 = (int)(distributions->getNX1());
-    // int maxX2 = (int)(distributions->getNX2());
-    // int maxX3 = (int)(distributions->getNX3());
-
-    // nummern vergeben und node vector erstellen + daten sammeln
-    CbArray3D<int> nodeNumbers((int) maxX1, (int) maxX2, (int) maxX3, -1);
-    maxX1 -= 2;
-    maxX2 -= 2;
-    maxX3 -= 2;
-
-    // D3Q27BoundaryConditionPtr bcPtr;
-    int nr = (int) nodes.size();
-
-    for (int ix3 = minX3; ix3 <= maxX3; ix3++)
-    {
-        for (int ix2 = minX2; ix2 <= maxX2; ix2++)
-        {
-            for (int ix1 = minX1; ix1 <= maxX1; ix1++)
+   double level = (double)block->getLevel();
+   double blockID = (double)block->getGlobalID();
+
+   //Diese Daten werden geschrieben:
+   datanames.resize(0);
+   datanames.push_back("Rho");
+   datanames.push_back("Vx");
+   datanames.push_back("Vy");
+   datanames.push_back("Vz");
+   //datanames.push_back("Press");
+   //datanames.push_back("Level");
+   //datanames.push_back("BlockID");
+   //datanames.push_back("gamma");
+   //datanames.push_back("collFactor");
+     
+
+   data.resize(datanames.size());
+
+   SPtr<ILBMKernel> kernel = block->getKernel();
+   SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();          
+   SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();     
+   LBMReal f[D3Q27System::ENDF+1];
+   LBMReal vx1,vx2,vx3,rho;
+
+   //knotennummerierung faengt immer bei 0 an!
+   unsigned int SWB,SEB,NEB,NWB,SWT,SET,NET,NWT;
+
+   if(block->getKernel()->getCompressible())
+   {
+      calcMacros = &D3Q27System::calcCompMacroscopicValues;
+   }
+   else
+   {
+      calcMacros = &D3Q27System::calcIncompMacroscopicValues;
+   }
+
+   int minX1 = 0;
+   int minX2 = 0;
+   int minX3 = 0;
+
+   int maxX1 = (int)(distributions->getNX1());
+   int maxX2 = (int)(distributions->getNX2());
+   int maxX3 = (int)(distributions->getNX3());
+
+   //int minX1 = 1;
+   //int minX2 = 1;
+   //int minX3 = 1;
+
+   //int maxX1 = (int)(distributions->getNX1());
+   //int maxX2 = (int)(distributions->getNX2());
+   //int maxX3 = (int)(distributions->getNX3());
+
+   //nummern vergeben und node vector erstellen + daten sammeln
+   CbArray3D<int> nodeNumbers((int)maxX1, (int)maxX2, (int)maxX3,-1);
+   maxX1 -= 2;
+   maxX2 -= 2;
+   maxX3 -= 2;
+
+   //D3Q27BoundaryConditionPtr bcPtr;
+   int nr = (int)nodes.size();
+ 
+   for(int ix3=minX3; ix3<=maxX3; ix3++)
+   {
+      for(int ix2=minX2; ix2<=maxX2; ix2++)
+      {
+         for(int ix1=minX1; ix1<=maxX1; ix1++)
+         {
+            if(!bcArray->isUndefined(ix1,ix2,ix3) && !bcArray->isSolid(ix1,ix2,ix3))
             {
-                if (!bcArray->isUndefined(ix1, ix2, ix3) && !bcArray->isSolid(ix1, ix2, ix3))
-                {
-                    int index = 0;
-                    nodeNumbers(ix1, ix2, ix3) = nr++;
-                    Vector3D worldCoordinates = grid->getNodeCoordinates(block, ix1, ix2, ix3);
-                    nodes.emplace_back(float(worldCoordinates[0]), float(worldCoordinates[1]),
-                                       float(worldCoordinates[2]));
-
-                    distributions->getDistribution(f, ix1, ix2, ix3);
-                    calcMacros(f, rho, vx1, vx2, vx3);
-                    // double press = D3Q27System::calcPress(f,rho,vx1,vx2,vx3);
-
-                    if (UbMath::isNaN(rho) || UbMath::isInfinity(rho))
-                        UB_THROW(UbException(
-                                UB_EXARGS, "rho is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" +
-                                           block->toString() + ", node=" + UbSystem::toString(ix1) + "," +
-                                           UbSystem::toString(ix2) + "," + UbSystem::toString(ix3)));
-                    // rho=999.0;
-                    // if (UbMath::isNaN(press) || UbMath::isInfinity(press))
-                    //   UB_THROW( UbException(UB_EXARGS,"press is not a number (nan or -1.#IND) or infinity number
-                    //   -1.#INF in block="+block->toString()+
-                    //   ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
-                    // press=999.0;
-                    if (UbMath::isNaN(vx1) || UbMath::isInfinity(vx1))
-                        UB_THROW(UbException(
-                                UB_EXARGS, "vx1 is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" +
-                                           block->toString() + ", node=" + UbSystem::toString(ix1) + "," +
-                                           UbSystem::toString(ix2) + "," + UbSystem::toString(ix3)));
-                    // vx1=999.0;
-                    if (UbMath::isNaN(vx2) || UbMath::isInfinity(vx2))
-                        UB_THROW(UbException(
-                                UB_EXARGS, "vx2 is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" +
-                                           block->toString() + ", node=" + UbSystem::toString(ix1) + "," +
-                                           UbSystem::toString(ix2) + "," + UbSystem::toString(ix3)));
-                    // vx2=999.0;
-                    if (UbMath::isNaN(vx3) || UbMath::isInfinity(vx3))
-                        UB_THROW(UbException(
-                                UB_EXARGS, "vx3 is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" +
-                                           block->toString() + ", node=" + UbSystem::toString(ix1) + "," +
-                                           UbSystem::toString(ix2) + "," + UbSystem::toString(ix3)));
-
-                    data[index++].push_back(rho);
-                    data[index++].push_back(vx1);
-                    data[index++].push_back(vx2);
-                    data[index++].push_back(vx3);
-
-                    // data[index++].push_back(rho * conv->getFactorDensityLbToW2() );
-                    // data[index++].push_back(vx1 * conv->getFactorVelocityLbToW2());
-                    // data[index++].push_back(vx2 * conv->getFactorVelocityLbToW2());
-                    // data[index++].push_back(vx3 * conv->getFactorVelocityLbToW2());
-                    // data[index++].push_back(press * conv->getFactorPressureLbToW2());
-                    data[index++].push_back(level);
-                    // data[index++].push_back(blockID);
-                }
+               int index = 0;
+               nodeNumbers(ix1,ix2,ix3) = nr++;
+               Vector3D worldCoordinates = grid->getNodeCoordinates(block, ix1, ix2, ix3);
+               nodes.push_back( UbTupleFloat3(float(worldCoordinates[0]),
+                                              float(worldCoordinates[1]),
+                                              float(worldCoordinates[2]) ));
+
+               distributions->getDistribution(f, ix1, ix2, ix3);
+               calcMacros(f,rho,vx1,vx2,vx3);
+               double press = D3Q27System::getPressure(f); //D3Q27System::calcPress(f,rho,vx1,vx2,vx3);
+
+               if (UbMath::isNaN(rho) || UbMath::isInfinity(rho)) 
+                  UB_THROW( UbException(UB_EXARGS,"rho is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+
+                   ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
+                     //rho=999.0;
+               if (UbMath::isNaN(press) || UbMath::isInfinity(press)) 
+                  UB_THROW( UbException(UB_EXARGS,"press is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+
+                  ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
+                 //press=999.0;
+               if (UbMath::isNaN(vx1) || UbMath::isInfinity(vx1)) 
+                  UB_THROW( UbException(UB_EXARGS,"vx1 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+
+                  ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
+                     //vx1=999.0;
+               if (UbMath::isNaN(vx2) || UbMath::isInfinity(vx2)) 
+                  UB_THROW( UbException(UB_EXARGS,"vx2 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+
+                  ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
+                     //vx2=999.0;
+               if (UbMath::isNaN(vx3) || UbMath::isInfinity(vx3)) 
+                  UB_THROW( UbException(UB_EXARGS,"vx3 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+
+                  ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3)));
+                     //vx3 = 999.0;
+
+               data[index++].push_back(rho);
+               data[index++].push_back(vx1);
+               data[index++].push_back(vx2);
+               data[index++].push_back(vx3);
+
+               //shearRate = D3Q27System::getShearRate(f, collFactor);
+
+               //LBMReal collFactorF = BinghamModelLBMKernel::getBinghamCollFactor(collFactor, yieldStress, shearRate, rho);
+
+               //data[index++].push_back(shearRate);
+               //data[index++].push_back(collFactorF);
+               
+               //data[index++].push_back((rho+1.0) * conv->getFactorDensityLbToW() );
+               //data[index++].push_back(vx1 * conv->getFactorVelocityLbToW());
+               //data[index++].push_back(vx2 * conv->getFactorVelocityLbToW());
+               //data[index++].push_back(vx3 * conv->getFactorVelocityLbToW());
+               //data[index++].push_back((press * conv->getFactorPressureLbToW()) / ((rho+1.0) * conv->getFactorDensityLbToW()));
+               //data[index++].push_back(level);
+               //data[index++].push_back(blockID);
             }
         }
     }
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp
new file mode 100644
index 000000000..f1dca3474
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp
@@ -0,0 +1,237 @@
+#include "WriteThixotropyQuantitiesCoProcessor.h"
+#include "LBMKernel.h"
+#include "BCProcessor.h"
+#include "UbScheduler.h"
+#include "DataSet3D.h"
+#include "D3Q27System.h"
+#include "BCArray3D.h"
+#include <vector>
+#include <string>
+#include <algorithm> 
+#include <numeric>
+#include "basics/writer/WbWriterVtkXmlASCII.h"
+#include "ThixotropyExpLBMKernel.h"
+
+using namespace std;
+
+WriteThixotropyQuantitiesCoProcessor::WriteThixotropyQuantitiesCoProcessor()
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+WriteThixotropyQuantitiesCoProcessor::WriteThixotropyQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, SPtr<Communicator> comm) : CoProcessor(grid, s), path(path), writer(writer),	conv(conv),	comm(comm)
+{
+	gridRank = comm->getProcessID();
+	minInitLevel = this->grid->getCoarsestInitializedLevel();
+	maxInitLevel = this->grid->getFinestInitializedLevel();
+
+	blockVector.resize(maxInitLevel + 1);
+
+	for (int level = minInitLevel; level <= maxInitLevel; level++)
+	{
+		grid->getBlocks(level, gridRank, true, blockVector[level]);
+	}
+}
+//////////////////////////////////////////////////////////////////////////
+void WriteThixotropyQuantitiesCoProcessor::init()
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+void WriteThixotropyQuantitiesCoProcessor::process(double step)
+{
+	if (scheduler->isDue(step))
+		collectData(step);
+
+	UBLOG(logDEBUG3, "WriteThixotropyQuantitiesCoProcessor::update:" << step);
+}
+//////////////////////////////////////////////////////////////////////////
+void WriteThixotropyQuantitiesCoProcessor::collectData(double step)
+{
+	int istep = static_cast<int>(step);
+	//ConcentrationSum = 0;
+	for (int level = minInitLevel; level <= maxInitLevel; level++)
+	{
+		for(SPtr<Block3D> block : blockVector[level])
+		{
+			if (block)
+			{
+				addDataMQ(block);
+			}
+		}
+	}
+	//cout <<"at step = "<< step << ", the sum of Concentration in the domain = "<<ConcentrationSum << endl;
+	string pfilePath, partPath, subfolder, cfilePath;
+
+	subfolder = "thyxotropy" + UbSystem::toString(istep);
+	pfilePath = path + "/thyxotropy/" + subfolder;
+	cfilePath = path + "/thyxotropy/thyxotropy_collection";
+	partPath = pfilePath + "/thyxotropy" + UbSystem::toString(gridRank) + "_" + UbSystem::toString(istep);
+
+
+	string partName = writer->writeOctsWithNodeData(partPath, nodes, cells, datanames, data);
+
+	size_t found = partName.find_last_of("/");
+	string piece = partName.substr(found + 1);
+	piece = subfolder + "/" + piece;
+
+	vector<string> cellDataNames;
+	vector<string> pieces = comm->gather(piece);
+	if (comm->getProcessID() == comm->getRoot())
+	{
+		string pname = WbWriterVtkXmlASCII::getInstance()->writeParallelFile(pfilePath, pieces, datanames, cellDataNames);
+		found = pname.find_last_of("/");
+		piece = pname.substr(found + 1);
+
+		vector<string> filenames;
+		filenames.push_back(piece);
+		if (step == CoProcessor::scheduler->getMinBegin())
+		{
+			WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false);
+		}
+		else
+		{
+			WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false);
+		}
+		UBLOG(logINFO, "WriteThixotropyQuantitiesCoProcessor step: " << istep);
+	}
+
+	clearData();
+}
+//////////////////////////////////////////////////////////////////////////
+void WriteThixotropyQuantitiesCoProcessor::clearData()
+{
+	nodes.clear();
+	cells.clear();
+	datanames.clear();
+	data.clear();
+}
+//////////////////////////////////////////////////////////////////////////
+void WriteThixotropyQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
+{
+	UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
+	UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
+	UbTupleDouble3 nodeOffset = grid->getNodeOffset(block);
+	double         dx = grid->getDeltaX(block);
+
+	double level = (double)block->getLevel();
+	double blockID = (double)block->getGlobalID();
+
+	//Diese Daten werden geschrieben:
+	datanames.resize(0);
+	datanames.push_back("lambda");
+	//datanames.push_back("ShearRate");
+	//datanames.push_back("collFactor");
+	//datanames.push_back("Fluxx");
+	//datanames.push_back("Fluxy");
+	//datanames.push_back("Fluxz");
+	//datanames.push_back("delC");
+	//datanames.push_back("diff");
+	//datanames.push_back("AccumulatedConcentration");
+	//datanames.push_back("m100");
+	//datanames.push_back("Level");
+	//datanames.push_back("BlockID");
+
+
+
+	data.resize(datanames.size());
+
+   SPtr<ILBMKernel> kernel = block->getKernel();
+   SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();          
+   SPtr<DistributionArray3D> distributionsF = kernel->getDataSet()->getFdistributions(); 
+	SPtr<DistributionArray3D> distributionsH = kernel->getDataSet()->getHdistributions();
+	//LBMReal collFactorF = staticPointerCast<ThixotropyExpLBMKernel>(kernel)->getCollisionFactorF();
+	LBMReal collFactor = kernel->getCollisionFactor();
+	LBMReal f[D3Q27System::ENDF + 1];
+	LBMReal h[D3Q27System::ENDF + 1];
+	LBMReal lambda, gammaDot;
+	
+	//knotennummerierung faengt immer bei 0 an!
+	unsigned int SWB, SEB, NEB, NWB, SWT, SET, NET, NWT;
+
+	int minX1 = 0;
+	int minX2 = 0;
+	int minX3 = 0;
+
+	int maxX1 = (int)(distributionsH->getNX1());
+	int maxX2 = (int)(distributionsH->getNX2());
+	int maxX3 = (int)(distributionsH->getNX3());
+
+	//int minX1 = 1;
+	//int minX2 = 1;
+	//int minX3 = 1;
+
+	//int maxX1 = (int)(distributions->getNX1());
+	//int maxX2 = (int)(distributions->getNX2());
+	//int maxX3 = (int)(distributions->getNX3());
+
+	//nummern vergeben und node vector erstellen + daten sammeln
+	CbArray3D<int> nodeNumbers((int)maxX1, (int)maxX2, (int)maxX3, -1);
+	maxX1 -= 2;
+	maxX2 -= 2;
+	maxX3 -= 2;
+	//D3Q27BoundaryConditionPtr bcPtr;
+	int nr = (int)nodes.size();
+
+	for (size_t ix3 = minX3; ix3 <= maxX3; ix3++)
+	{
+		for (size_t ix2 = minX2; ix2 <= maxX2; ix2++)
+		{
+			for (size_t ix1 = minX1; ix1 <= maxX1; ix1++)
+			{
+				if (!bcArray->isUndefined(ix1, ix2, ix3) && !bcArray->isSolid(ix1, ix2, ix3))
+				{
+					int index = 0;
+					nodeNumbers(ix1, ix2, ix3) = nr++;
+					nodes.push_back(makeUbTuple(float(val<1>(org) - val<1>(nodeOffset) + ix1*dx),
+						float(val<2>(org) - val<2>(nodeOffset) + ix2*dx),
+						float(val<3>(org) - val<3>(nodeOffset) + ix3*dx)));
+
+					distributionsH->getDistribution(h, ix1, ix2, ix3);
+
+					lambda = D3Q27System::getDensity(h);
+
+					if (UbMath::isNaN(lambda) || UbMath::isInfinity(lambda) )
+						UB_THROW(UbException(UB_EXARGS, "lambda is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" + block->toString() +
+							", node=" + UbSystem::toString(ix1) + "," + UbSystem::toString(ix2) + "," + UbSystem::toString(ix3)));
+
+					distributionsF->getDistribution(f, ix1, ix2, ix3);
+					LBMReal rho = D3Q27System::getDensity(f);
+					
+					//gammaDot = BinghamModel::getShearRate(f, collFactor);
+
+					//LBMReal collFactorF = collFactor - 1e-6 / (gammaDot + one * 1e-9);
+					//collFactorF = (collFactorF < 0.5) ? 0.5 : collFactorF;
+
+					data[index++].push_back(lambda);
+					//data[index++].push_back(gammaDot);
+					//data[index++].push_back(collFactorF);
+				}
+			}
+		}
+	}
+	maxX1 -= 1;
+	maxX2 -= 1;
+	maxX3 -= 1;
+	//cell vector erstellen
+	for (int ix3 = minX3; ix3 <= maxX3; ix3++)
+	{
+		for (int ix2 = minX2; ix2 <= maxX2; ix2++)
+		{
+			for (int ix1 = minX1; ix1 <= maxX1; ix1++)
+			{
+				if ((SWB = nodeNumbers(ix1, ix2, ix3)) >= 0
+					&& (SEB = nodeNumbers(ix1 + 1, ix2, ix3)) >= 0
+					&& (NEB = nodeNumbers(ix1 + 1, ix2 + 1, ix3)) >= 0
+					&& (NWB = nodeNumbers(ix1, ix2 + 1, ix3)) >= 0
+					&& (SWT = nodeNumbers(ix1, ix2, ix3 + 1)) >= 0
+					&& (SET = nodeNumbers(ix1 + 1, ix2, ix3 + 1)) >= 0
+					&& (NET = nodeNumbers(ix1 + 1, ix2 + 1, ix3 + 1)) >= 0
+					&& (NWT = nodeNumbers(ix1, ix2 + 1, ix3 + 1)) >= 0)
+				{
+					cells.push_back(makeUbTuple(SWB, SEB, NEB, NWB, SWT, SET, NET, NWT));
+				}
+			}
+		}
+	}
+}
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h
new file mode 100644
index 000000000..58430fd9e
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h
@@ -0,0 +1,42 @@
+#ifndef WriteThixotropyQuantitiesCoProcessor_H
+#define WriteThixotropyQuantitiesCoProcessor_H
+
+#include "CoProcessor.h"
+#include "Grid3D.h"
+#include "Block3D.h"
+#include "LBMUnitConverter.h"
+#include "Communicator.h"
+#include "WbWriter.h"
+
+class WriteThixotropyQuantitiesCoProcessor : public  CoProcessor
+{
+public:
+	WriteThixotropyQuantitiesCoProcessor();
+	WriteThixotropyQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, SPtr<Communicator> comm);
+	~WriteThixotropyQuantitiesCoProcessor() {}
+
+   void process(double step) override;
+
+protected:
+   void collectData(double step);
+   void addDataMQ(SPtr<Block3D> block);
+   void clearData();
+
+private:
+   void init();
+   std::vector<UbTupleFloat3> nodes;
+   std::vector<UbTupleUInt8> cells;
+   std::vector<std::string> datanames;
+   std::vector<std::vector<double> > data; 
+   std::string path;
+   WbWriter* writer;
+   SPtr<LBMUnitConverter> conv;
+   bool bcInformation;
+   std::vector<std::vector<SPtr<Block3D> > > blockVector;
+   int minInitLevel;
+   int maxInitLevel;
+   int gridRank;
+   SPtr<Communicator> comm;
+	double ConcentrationSum;
+};
+#endif
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.cpp
new file mode 100644
index 000000000..3fb819ab7
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.cpp
@@ -0,0 +1,291 @@
+#include "ThixotropyFullDirectConnector.h"
+#include "LBMKernel.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "DataSet3D.h"
+#include "EsoTwist3D.h"
+
+
+using namespace std;
+
+ThixotropyFullDirectConnector::ThixotropyFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir)
+	: LocalBlock3DConnector(from, to, sendDir)
+
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyFullDirectConnector::init()
+{
+	maxX1 = (int)this->from.lock()->getKernel()->getDataSet()->getFdistributions()->getNX1() - 1;
+	maxX2 = (int)this->from.lock()->getKernel()->getDataSet()->getFdistributions()->getNX2() - 1;
+	maxX3 = (int)this->from.lock()->getKernel()->getDataSet()->getFdistributions()->getNX3() - 1;
+
+	fFrom =dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getFdistributions());
+	fTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getFdistributions());
+	hFrom = dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getHdistributions());
+	hTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getHdistributions());
+
+	//celltypematrixFrom = from.lock()->getKernel()->getBCProcessor()->getCellsTypeArray();
+	//fillVolumeMatrixFrom = from.lock()->getKernel()->getBCProcessor()->getFillVolumeArray();
+	//normalMatrixFrom = from.lock()->getKernel()->getBCProcessor()->getNormalArray();
+	//changeInConcMatrixFrom = from.lock()->getKernel()->getBCProcessor()->getChangeInConcentrationArray();
+	//deltaVolumeMatrixFrom = from.lock()->getKernel()->getBCProcessor()->getChangeInVolumeArray();
+
+	//celltypematrixTo = to.lock()->getKernel()->getBCProcessor()->getCellsTypeArray();
+	//fillVolumeMatrixTo = to.lock()->getKernel()->getBCProcessor()->getFillVolumeArray();
+	//normalMatrixTo = to.lock()->getKernel()->getBCProcessor()->getNormalArray();
+	//changeInConcMatrixTo = to.lock()->getKernel()->getBCProcessor()->getChangeInConcentrationArray();
+	//deltaVolumeMatrixTo = to.lock()->getKernel()->getBCProcessor()->getChangeInVolumeArray();
+
+	//bcArrayFrom = from.lock()->getKernel()->getBCProcessor()->getBCArray();
+	//bcArrayTo = to.lock()->getKernel()->getBCProcessor()->getBCArray();
+
+	//bcArrayReactiveFrom = from.lock()->getKernel()->getBCProcessor()->getBCArrayReactive();
+	//bcArrayReactiveTo = to.lock()->getKernel()->getBCProcessor()->getBCArrayReactive();
+
+	// 	maxX1 = (int)this->from.lock()->getKernel()->getBCProcessor()->getCellsTypeArray()->getNX1()/* - 1*/;
+	// 	maxX2 = (int)this->from.lock()->getKernel()->getBCProcessor()->getCellsTypeArray()->getNX2()/* - 1*/;
+	// 	maxX3 = (int)this->from.lock()->getKernel()->getBCProcessor()->getCellsTypeArray()->getNX3()/* - 1*/;
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyFullDirectConnector::sendVectors()
+{
+	localDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getLocalDistributions();
+	nonLocalDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getNonLocalDistributions();
+	zeroDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getZeroDistributions();
+
+	localDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getLocalDistributions();
+	nonLocalDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getNonLocalDistributions();
+	zeroDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getZeroDistributions();
+
+	localDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getLocalDistributions();
+	nonLocalDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getNonLocalDistributions();
+	zeroDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getZeroDistributions();
+
+	localDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getLocalDistributions();
+	nonLocalDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getNonLocalDistributions();
+	zeroDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getZeroDistributions();
+
+	bool con = /*(from.lock()->getGlobalID()==11) &&*/ (to.lock()->getGlobalID() == 1);
+
+	//EAST
+	if (sendDir == D3Q27System::E)
+	{
+		for (int x3 = 1; x3 < maxX3; x3++)
+		{
+			for (int x2 = 1; x2 < maxX2; x2++)
+			{
+				exchangeData(maxX1 - 1, x2, x3, 0, x2, x3);
+				//exchangeDataforCells(maxX1 - 1, x2, x3, 0, x2, x3);
+			}
+		}
+	}
+	//WEST
+	else if (sendDir == D3Q27System::W)
+	{
+		for (int x3 = 1; x3 < maxX3; x3++)
+		{
+			for (int x2 = 1; x2 < maxX2; x2++)
+			{
+				exchangeData(1, x2, x3, maxX1, x2, x3);
+				//exchangeDataforCells(1, x2, x3, maxX1, x2, x3);
+			}
+		}
+	}
+	//NORTH
+	else if (sendDir == D3Q27System::N)
+	{
+		for (int x3 = 1; x3 < maxX3; x3++)
+		{
+			for (int x1 = 1; x1 < maxX1; x1++)
+			{
+				exchangeData(x1, maxX2 - 1, x3, x1, 0, x3);
+				//exchangeDataforCells(x1, maxX2 - 1, x3, x1, 0, x3);
+			}
+		}
+	}
+	//SOUTH
+	else if (sendDir == D3Q27System::S)
+	{
+		for (int x3 = 1; x3 < maxX3; x3++)
+		{
+			for (int x1 = 1; x1 < maxX1; x1++)
+			{
+				exchangeData(x1, 1, x3, x1, maxX2, x3);
+				//exchangeDataforCells(x1, 1, x3, x1, maxX2, x3);
+			}
+		}
+	}
+
+	//TOP
+	else if (sendDir == D3Q27System::T)
+	{
+		for (int x2 = 1; x2 < maxX2; x2++)
+		{
+			for (int x1 = 1; x1 < maxX1; x1++)
+			{
+				exchangeData(x1, x2, maxX3 - 1, x1, x2, 0);
+				//exchangeDataforCells(x1, x2, maxX3 - 1, x1, x2, 0);
+			}
+		}
+	}
+	//BOTTOM
+	else if (sendDir == D3Q27System::B)
+	{
+		for (int x2 = 1; x2 < maxX2; x2++)
+		{
+			for (int x1 = 1; x1 < maxX1; x1++)
+			{
+				exchangeData(x1, x2, 1, x1, x2, maxX3);
+				//exchangeDataforCells(x1, x2, 1, x1, x2, maxX3);
+			}
+		}
+	}
+	//NORTHEAST
+	else if (sendDir == D3Q27System::NE)
+	{
+		for (int x3 = 1; x3 < maxX3; x3++)
+		{
+			exchangeData(maxX1 - 1, maxX2 - 1, x3, 0, 0, x3);
+			//exchangeDataforCells(maxX1 - 1, maxX2 - 1, x3, 0, 0, x3);
+
+		}
+	}
+	//NORTHWEST
+	else if (sendDir == D3Q27System::NW)
+	{
+		for (int x3 = 1; x3 < maxX3; x3++)
+		{
+			exchangeData(1, maxX2 - 1, x3, maxX1, 0, x3);
+			//exchangeDataforCells(1, maxX2 - 1, x3, maxX1, 0, x3);
+		}
+	}
+	//SOUTHWEST
+	else if (sendDir == D3Q27System::SW)
+	{
+		for (int x3 = 1; x3 < maxX3; x3++)
+		{
+			exchangeData(1, 1, x3, maxX1, maxX2, x3);
+			//exchangeDataforCells(1, 1, x3, maxX1, maxX2, x3);
+
+		}
+	}
+	//SOUTHEAST
+	else if (sendDir == D3Q27System::SE)
+	{
+		for (int x3 = 1; x3 < maxX3; x3++)
+		{
+			exchangeData(maxX1 - 1, 1, x3, 0, maxX2, x3);
+			//exchangeDataforCells(maxX1 - 1, 1, x3, 0, maxX2, x3);
+
+		}
+	}
+	else if (sendDir == D3Q27System::TE)
+		for (int x2 = 1; x2 < maxX2; x2++)
+		{
+			exchangeData(maxX1 - 1, x2, maxX3 - 1, 0, x2, 0);
+			//exchangeDataforCells(maxX1 - 1, x2, maxX3 - 1, 0, x2, 0);
+
+		}
+	else if (sendDir == D3Q27System::BW)
+		for (int x2 = 1; x2 < maxX2; x2++)
+		{
+			exchangeData(1, x2, 1, maxX1, x2, maxX3);
+			//exchangeDataforCells(1, x2, 1, maxX1, x2, maxX3);
+
+		}
+	else if (sendDir == D3Q27System::BE)
+		for (int x2 = 1; x2 < maxX2; x2++)
+		{
+			exchangeData(maxX1 - 1, x2, 1, 0, x2, maxX3);
+			//exchangeDataforCells(maxX1 - 1, x2, 1, 0, x2, maxX3);
+
+		}
+	else if (sendDir == D3Q27System::TW)
+		for (int x2 = 1; x2 < maxX2; x2++)
+		{
+			exchangeData(1, x2, maxX3 - 1, maxX1, x2, 0);
+			//exchangeDataforCells(1, x2, maxX3 - 1, maxX1, x2, 0);
+
+		}
+	else if (sendDir == D3Q27System::TN)
+		for (int x1 = 1; x1 < maxX1; x1++)
+		{
+			exchangeData(x1, maxX2 - 1, maxX3 - 1, x1, 0, 0);
+			//exchangeDataforCells(x1, maxX2 - 1, maxX3 - 1, x1, 0, 0);
+
+		}
+	else if (sendDir == D3Q27System::BS)
+		for (int x1 = 1; x1 < maxX1; x1++)
+		{
+			exchangeData(x1, 1, 1, x1, maxX2, maxX3);
+			//exchangeDataforCells(x1, 1, 1, x1, maxX2, maxX3);
+
+		}
+	else if (sendDir == D3Q27System::BN)
+		for (int x1 = 1; x1 < maxX1; x1++)
+		{
+			exchangeData(x1, maxX2 - 1, 1, x1, 0, maxX3);
+			//exchangeDataforCells(x1, maxX2 - 1, 1, x1, 0, maxX3);
+
+		}
+
+	else if (sendDir == D3Q27System::TS)
+		for (int x1 = 1; x1 < maxX1; x1++)
+		{
+			exchangeData(x1, 1, maxX3 - 1, x1, maxX2, 0);
+			//exchangeDataforCells(x1, 1, maxX3 - 1, x1, maxX2, 0);
+
+		}
+
+	else if (sendDir == D3Q27System::TSW)
+	{
+		exchangeData(1, 1, maxX3 - 1, maxX1, maxX2, 0);
+		//exchangeDataforCells(1, 1, maxX3 - 1, maxX1, maxX2, 0);
+
+	}
+	else if (sendDir == D3Q27System::TSE)
+	{
+		exchangeData(maxX1 - 1, 1, maxX3 - 1, 0, maxX2, 0);
+		//exchangeDataforCells(maxX1 - 1, 1, maxX3 - 1, 0, maxX2, 0);
+
+	}
+	else if (sendDir == D3Q27System::TNW)
+	{
+		exchangeData(1, maxX2 - 1, maxX3 - 1, maxX1, 0, 0);
+		//exchangeDataforCells(1, maxX2 - 1, maxX3 - 1, maxX1, 0, 0);
+
+	}
+	else if (sendDir == D3Q27System::TNE)
+	{
+		exchangeData(maxX1 - 1, maxX2 - 1, maxX3 - 1, 0, 0, 0);
+		//exchangeDataforCells(maxX1 - 1, maxX2 - 1, maxX3 - 1, 0, 0, 0);
+
+	}
+	else if (sendDir == D3Q27System::BSW)
+	{
+		exchangeData(1, 1, 1, maxX1, maxX2, maxX3);
+		//exchangeDataforCells(1, 1, 1, maxX1, maxX2, maxX3);
+
+	}
+	else if (sendDir == D3Q27System::BSE)
+	{
+		exchangeData(maxX1 - 1, 1, 1, 0, maxX2, maxX3);
+		//exchangeDataforCells(maxX1 - 1, 1, 1, 0, maxX2, maxX3);
+
+	}
+	else if (sendDir == D3Q27System::BNW)
+	{
+		exchangeData(1, maxX2 - 1, 1, maxX1, 0, maxX3);
+		//exchangeDataforCells(1, maxX2 - 1, 1, maxX1, 0, maxX3);
+
+	}
+	else if (sendDir == D3Q27System::BNE)
+	{
+		exchangeData(maxX1 - 1, maxX2 - 1, 1, 0, 0, maxX3);
+		//exchangeDataforCells(maxX1 - 1, maxX2 - 1, 1, 0, 0, maxX3);
+
+	}
+	else UB_THROW(UbException(UB_EXARGS, "unknown dir"));
+}
+
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.h b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.h
new file mode 100644
index 000000000..1fecd5d0a
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.h
@@ -0,0 +1,222 @@
+/**
+* @file ThixotropyFullDirectConnector.h
+* @brief Connector send and receive full distribution in shared memory
+*
+* @author Hussein Alihussein
+* @date 28.11.2018
+*/
+#ifndef ThixotropyFullDirectConnector_H
+#define ThixotropyFullDirectConnector_H
+
+#include "LocalBlock3DConnector.h"
+#include "Block3D.h"
+#include "D3Q27System.h"
+#include "basics/container/CbArray3D.h"
+#include "basics/container/CbArray4D.h"
+#include "BCArray3D.h"
+
+class EsoTwist3D;
+
+//! \brief   Exchange data between blocks. 
+//! \details Connector send and receive full distributions between two blocks in shared memory.
+//! \author  Hussein Alihussein
+
+class ThixotropyFullDirectConnector : public LocalBlock3DConnector
+{
+public:
+	ThixotropyFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir);
+	void init();
+	void sendVectors();
+	//void sendCellVectors();
+
+protected:
+	inline void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To);
+	//inline void exchangeDataforCells(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To);
+	//void ExchangeDatabcArray(SPtr<BCArray3D> bcArrayFrom, SPtr<BCArray3D> bcArrayTo, int x1From, int x2From, int x3From, int x1To, int x2To, int x3To);
+	//void ExchangeDatabcArrayReactive(BCArray3DReactivePtr bcArrayFrom, BCArray3DReactivePtr bcArrayTo, int x1From, int x2From, int x3From, int x1To, int x2To, int x3To);
+private:
+	int maxX1;
+	int maxX2;
+	int maxX3;
+
+	//CbArray3D<int>::CbArray3DPtr celltypematrixFrom;
+	//CbArray3D<double>::CbArray3DPtr fillVolumeMatrixFrom;
+	//CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr normalMatrixFrom;
+	//CbArray3D<double>::CbArray3DPtr changeInConcMatrixFrom;
+	//CbArray3D<double>::CbArray3DPtr deltaVolumeMatrixFrom;
+
+	//CbArray3D<int>::CbArray3DPtr celltypematrixTo;
+	//CbArray3D<double>::CbArray3DPtr fillVolumeMatrixTo;
+	//CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr normalMatrixTo;
+	//CbArray3D<double>::CbArray3DPtr changeInConcMatrixTo;
+	//CbArray3D<double>::CbArray3DPtr deltaVolumeMatrixTo;
+
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromf;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromf;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsFromf;
+
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsTof;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsTof;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsTof;
+
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromh;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromh;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsFromh;
+
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsToh;
+	CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsToh;
+	CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsToh;
+
+	SPtr<EsoTwist3D>  fFrom, hFrom;
+	SPtr<EsoTwist3D>  fTo, hTo;
+
+	//BCArray3DPtr bcArrayFrom;
+	//BCArray3DPtr bcArrayTo;
+
+	//BCArray3DReactivePtr bcArrayReactiveFrom;
+	//BCArray3DReactivePtr bcArrayReactiveTo;
+};
+
+
+//////////////////////////////////////////////////////////////////////////
+inline void ThixotropyFullDirectConnector::exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To)
+{
+
+
+	(*this->localDistributionsTof)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_E, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_N, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_T, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NE, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TE, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TN, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TS, x1From, x2From + 1, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNE, x1From, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From);
+	(*this->localDistributionsTof)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From);
+
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_W, x1From + 1, x2From, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_S, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_B, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SE, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BE, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BN, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsTof)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1);
+
+	(*this->zeroDistributionsTof)(x1To, x2To, x3To) = (*this->zeroDistributionsFromf)(x1From, x2From, x3From);
+
+
+	(*this->localDistributionsToh)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_E, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_N, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_T, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NE, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TE, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TN, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TS, x1From, x2From + 1, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNE, x1From, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From);
+	(*this->localDistributionsToh)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From);
+
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_W, x1From + 1, x2From, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_S, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_B, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SE, x1From, x2From + 1, x3From);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BE, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BN, x1From, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1);
+	(*this->nonLocalDistributionsToh)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1);
+
+	(*this->zeroDistributionsToh)(x1To, x2To, x3To) = (*this->zeroDistributionsFromh)(x1From, x2From, x3From);
+}
+//////////////////////////////////////////////////////////////////////////
+//inline void ThixotropyFullDirectConnector::exchangeDataforCells(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To)
+//{
+//	//(*this->celltypematrixTo)( x1To, x2To, x3To) = (*this->celltypematrixFrom)( x1From, x2From, x3From);
+//
+//	(*this->celltypematrixTo)(x1To, x2To, x3To) = (*this->celltypematrixFrom)(x1From, x2From, x3From);
+//	(*this->fillVolumeMatrixTo)(x1To, x2To, x3To) = (*this->fillVolumeMatrixFrom)(x1From, x2From, x3From);
+//	(*this->changeInConcMatrixTo)(x1To, x2To, x3To) = (*this->changeInConcMatrixFrom)(x1From, x2From, x3From);
+//	(*this->deltaVolumeMatrixTo)(x1To, x2To, x3To) = (*this->deltaVolumeMatrixFrom)(x1From, x2From, x3From);
+//
+//	(*this->normalMatrixTo)(0, x1To, x2To, x3To) = (*this->normalMatrixFrom)(0, x1From, x2From, x3From);
+//	(*this->normalMatrixTo)(1, x1To, x2To, x3To) = (*this->normalMatrixFrom)(1, x1From, x2From, x3From);
+//	(*this->normalMatrixTo)(2, x1To, x2To, x3To) = (*this->normalMatrixFrom)(2, x1From, x2From, x3From);
+//	//bcArrayTo->bcindexmatrix(x1To, x2To, x3To) = bcArrayFrom->bcindexmatrix(x1From, x2From, x3From);
+//	ExchangeDatabcArray(bcArrayFrom, bcArrayTo, x1From, x2From, x3From, x1To, x2To, x3To);
+//	ExchangeDatabcArrayReactive(bcArrayReactiveFrom, bcArrayReactiveTo, x1From, x2From, x3From, x1To, x2To, x3To);
+//}
+////////////////////////////////////////////////////////////////////////////
+//inline void ThixotropyFullDirectConnector::ExchangeDatabcArray(BCArray3DPtr bcArrayFrom, BCArray3DPtr bcArrayTo, int x1From, int x2From, int x3From, int x1To, int x2To, int x3To)
+//{
+//	if (bcArrayFrom->isFluid(x1From, x2From, x3From))
+//	{
+//		if (bcArrayFrom->hasBC(x1From, x2From, x3From))
+//		{
+//			BoundaryConditionsPtr bc = bcArrayFrom->getBC(x1From, x2From, x3From);
+//
+//			bcArrayTo->setBC(x1To, x2To, x3To, bc);
+//
+//		}
+//		else if (bcArrayFrom->isFluidWithoutBC(x1From, x2From, x3From))
+//		{
+//			bcArrayTo->setFluid(x1To, x2To, x3To);
+//		}
+//	}
+//	else if (bcArrayFrom->isSolid(x1From, x2From, x3From))
+//	{
+//		bcArrayTo->setSolid(x1To, x2To, x3To);
+//	}
+//	else
+//	{
+//		bcArrayTo->setUndefined(x1To, x2To, x3To);
+//	}
+//
+//}
+////////////////////////////////////////////////////////////////////////////
+//inline void ThixotropyFullDirectConnector::ExchangeDatabcArrayReactive(BCArray3DReactivePtr bcArrayFrom, BCArray3DReactivePtr bcArrayTo, int x1From, int x2From, int x3From, int x1To, int x2To, int x3To)
+//{
+//	if (bcArrayFrom->isFluid(x1From, x2From, x3From))
+//	{
+//		if (bcArrayFrom->hasBC(x1From, x2From, x3From))
+//		{
+//			BoundaryConditionsPtr bc = bcArrayFrom->getBC(x1From, x2From, x3From);
+//
+//			bcArrayTo->setBC(x1To, x2To, x3To, bc);
+//
+//		}
+//		else if (bcArrayFrom->isFluidWithoutBC(x1From, x2From, x3From))
+//		{
+//			bcArrayTo->setFluid(x1To, x2To, x3To);
+//		}
+//	}
+//	else if (bcArrayFrom->isSolid(x1From, x2From, x3From))
+//	{
+//		bcArrayTo->setSolid(x1To, x2To, x3To);
+//	}
+//	else if (bcArrayFrom->isReactiveSolid(x1From, x2From, x3From))
+//	{
+//		bcArrayTo->setReactiveSolidType1(x1To, x2To, x3To);
+//	}
+//	else
+//	{
+//		bcArrayTo->setUndefined(x1To, x2To, x3To);
+//	}
+//
+//}
+#endif
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.cpp
new file mode 100644
index 000000000..89950b25e
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.cpp
@@ -0,0 +1,483 @@
+#include "ThixotropyFullVectorConnector.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include "LBMKernel.h"
+#include "Block3D.h"
+#include "LBMKernel.h"
+#include "EsoTwist3D.h"
+#include "DataSet3D.h"
+
+//////////////////////////////////////////////////////////////////////////
+ThixotropyFullVectorConnector::ThixotropyFullVectorConnector(SPtr<Block3D> block
+   , VectorTransmitterPtr sender
+   , VectorTransmitterPtr receiver
+   , int sendDir)
+   : RemoteBlock3DConnector(block, sender, receiver, sendDir)
+{
+   if (!block || !sender || !receiver)
+      UB_THROW(UbException(UB_EXARGS, "sender or receiver == NULL!!"));
+
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyFullVectorConnector::init()
+{
+   maxX1 = (int)block.lock()->getKernel()->getDataSet()->getFdistributions()->getNX1() - 1;
+   maxX2 = (int)block.lock()->getKernel()->getDataSet()->getFdistributions()->getNX2() - 1;
+   maxX3 = (int)block.lock()->getKernel()->getDataSet()->getFdistributions()->getNX3() - 1;
+
+   fDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getFdistributions());
+   hDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getHdistributions());
+
+   int anz = 2*27;
+   switch (sendDir)
+   {
+   case D3Q27System::ZERO: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break;
+   case D3Q27System::E:
+   case D3Q27System::W: sender->getData().resize(maxX2*maxX3*anz, 0.0);   break;
+   case D3Q27System::N:
+   case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz, 0.0);   break;
+   case D3Q27System::T:
+   case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz, 0.0);   break;
+
+   case D3Q27System::NE:
+   case D3Q27System::SW:
+   case D3Q27System::SE:
+   case D3Q27System::NW:  sender->getData().resize(maxX3*anz, 0.0);   break;
+
+   case D3Q27System::TE:
+   case D3Q27System::BW:
+   case D3Q27System::BE:
+   case D3Q27System::TW:  sender->getData().resize(maxX2*anz, 0.0);   break;
+
+   case D3Q27System::TN:
+   case D3Q27System::BS:
+   case D3Q27System::BN:
+   case D3Q27System::TS:  sender->getData().resize(maxX1*anz, 0.0);   break;
+
+   case D3Q27System::TNE:
+   case D3Q27System::BSW:
+   case D3Q27System::BNE:
+   case D3Q27System::TSW:
+   case D3Q27System::TSE:
+   case D3Q27System::BNW:
+   case D3Q27System::BSE:
+   case D3Q27System::TNW:  sender->getData().resize(anz, 0.0);   break;
+
+   default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir"));
+   }
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyFullVectorConnector::fillSendVectors()
+{
+   localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getLocalDistributions();
+   nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getNonLocalDistributions();
+   zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getZeroDistributions();
+
+   localHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getLocalDistributions();
+   nonLocalHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getNonLocalDistributions();
+   zeroHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getZeroDistributions();
+   
+   
+   
+   vector_type& sdata = sender->getData();
+
+   int index = 0;
+   //EAST
+   if (sendDir == D3Q27System::E)
+   {
+      for (int x3 = 1; x3 < maxX3; x3++)
+      {
+         for (int x2 = 1; x2 < maxX2; x2++)
+         {
+            fillData(sdata, index, maxX1 - 1, x2, x3);
+         }
+      }
+   }
+   //WEST
+   else if (sendDir == D3Q27System::W)
+   {
+      for (int x3 = 1; x3 < maxX3; x3++)
+      {
+         for (int x2 = 1; x2 < maxX2; x2++)
+         {
+            fillData(sdata, index, 1, x2, x3);
+         }
+      }
+   }
+   //NORTH
+   else if (sendDir == D3Q27System::N)
+   {
+      for (int x3 = 1; x3 < maxX3; x3++)
+      {
+         for (int x1 = 1; x1 < maxX1; x1++)
+         {
+            fillData(sdata, index, x1, maxX2 - 1, x3);
+         }
+      }
+   }
+   //SOUTH
+   else if (sendDir == D3Q27System::S)
+   {
+      for (int x3 = 1; x3 < maxX3; x3++)
+      {
+         for (int x1 = 1; x1 < maxX1; x1++)
+         {
+            fillData(sdata, index, x1, 1, x3);
+         }
+      }
+   }
+   //TOP
+   else if (sendDir == D3Q27System::T)
+   {
+      for (int x2 = 1; x2 < maxX2; x2++)
+      {
+         for (int x1 = 1; x1 < maxX1; x1++)
+         {
+            fillData(sdata, index, x1, x2, maxX3 - 1);
+         }
+      }
+   }
+   //BOTTOM
+   else if (sendDir == D3Q27System::B)
+   {
+      for (int x2 = 1; x2 < maxX2; x2++)
+      {
+         for (int x1 = 1; x1 < maxX1; x1++)
+         {
+            fillData(sdata, index, x1, x2, 1);
+         }
+      }
+   }
+   //NE NW SW SE
+   else if (sendDir == D3Q27System::NE || sendDir == D3Q27System::NW || sendDir == D3Q27System::SW || sendDir == D3Q27System::SE)
+   {
+      int x1 = 0;
+      int x2 = 0;
+      switch (sendDir)
+      {
+      case D3Q27System::NE:
+         x1 = maxX1 - 1;
+         x2 = maxX2 - 1;
+         break;
+      case D3Q27System::NW:
+         x1 = 1;
+         x2 = maxX2 - 1;
+         break;
+      case D3Q27System::SW:
+         x1 = 1;
+         x2 = 1;
+         break;
+      case D3Q27System::SE:
+         x1 = maxX1 - 1;
+         x2 = 1;
+         break;
+      }
+      for (int x3 = 1; x3 < maxX3; x3++)
+      {
+         fillData(sdata, index, x1, x2, x3);
+      }
+   }
+   //TE TW BW BE
+   else if (sendDir == D3Q27System::TE || sendDir == D3Q27System::TW || sendDir == D3Q27System::BW || sendDir == D3Q27System::BE)
+   {
+      int x1 = 0;
+      int x3 = 0;
+      switch (sendDir)
+      {
+      case D3Q27System::TE:
+         x1 = maxX1 - 1;
+         x3 = maxX3 - 1;
+         break;
+      case D3Q27System::TW:
+         x1 = 1;
+         x3 = maxX3 - 1;
+         break;
+      case D3Q27System::BW:
+         x1 = 1;
+         x3 = 1;
+         break;
+      case D3Q27System::BE:
+         x1 = maxX1 - 1;
+         x3 = 1;
+         break;
+      }
+      for (int x2 = 1; x2 < maxX2; x2++)
+      {
+         fillData(sdata, index, x1, x2, x3);
+      }
+   }
+   //TN BN BS TS
+   else if (sendDir == D3Q27System::TN || sendDir == D3Q27System::BN || sendDir == D3Q27System::BS || sendDir == D3Q27System::TS)
+   {
+      int x2 = 0;
+      int x3 = 0;
+      switch (sendDir)
+      {
+      case D3Q27System::TN:
+         x3 = maxX3 - 1;
+         x2 = maxX2 - 1;
+         break;
+      case D3Q27System::BN:
+         x3 = 1;
+         x2 = maxX2 - 1;
+         break;
+      case D3Q27System::BS:
+         x3 = 1;
+         x2 = 1;
+         break;
+      case D3Q27System::TS:
+         x3 = maxX3 - 1;
+         x2 = 1;
+         break;
+      }
+      for (int x1 = 1; x1 < maxX1; x1++)
+      {
+         fillData(sdata, index, x1, x2, x3);
+      }
+   }
+   //TNE TNW TSW TSE BNE BNW BSW BSE
+   else if (sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSW || sendDir == D3Q27System::TSE
+      || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW || sendDir == D3Q27System::BSW || sendDir == D3Q27System::BSE)
+   {
+      int x1 = 0;
+      int x2 = 0;
+      int x3 = 0;
+      switch (sendDir)
+      {
+      case D3Q27System::TNE:   x1 = maxX1 - 1; x2 = maxX2 - 1; x3 = maxX3 - 1; break;
+      case D3Q27System::TNW:   x1 = 1;       x2 = maxX2 - 1; x3 = maxX3 - 1; break;
+      case D3Q27System::TSW:   x1 = 1;       x2 = 1;       x3 = maxX3 - 1; break;
+      case D3Q27System::TSE:   x1 = maxX1 - 1; x2 = 1;       x3 = maxX3 - 1; break;
+      case D3Q27System::BNE:   x1 = maxX1 - 1; x2 = maxX2 - 1; x3 = 1;       break;
+      case D3Q27System::BNW:   x1 = 1;       x2 = maxX2 - 1; x3 = 1;       break;
+      case D3Q27System::BSW:   x1 = 1;       x2 = 1;       x3 = 1;       break;
+      case D3Q27System::BSE:   x1 = maxX1 - 1; x2 = 1;       x3 = 1;       break;
+      }
+      fillData(sdata, index, x1, x2, x3);
+   }
+   else UB_THROW(UbException(UB_EXARGS, "unknown dir"));
+}
+////////////////////////////////////////////////////////////////////////
+void ThixotropyFullVectorConnector::distributeReceiveVectors()
+{
+   /*e.g. connector sendet nach EAST --> empfaengt daten aus WEST ;-)*/
+
+   localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getLocalDistributions();
+   nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getNonLocalDistributions();
+   zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getZeroDistributions();
+
+   localHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getLocalDistributions();
+   nonLocalHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getNonLocalDistributions();
+   zeroHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getZeroDistributions();
+
+   vector_type& rdata = receiver->getData();
+
+   int index = 0;
+
+   if (sendDir == D3Q27System::W)
+   {
+      for (int x3 = 1; x3 < maxX3; x3++)
+      {
+         for (int x2 = 1; x2 < maxX2; x2++)
+         {
+            distributeData(rdata, index, 0, x2, x3);
+         }
+      }
+   }
+   else if (sendDir == D3Q27System::E)
+   {
+      for (int x3 = 1; x3 < maxX3; x3++)
+      {
+         for (int x2 = 1; x2 < maxX2; x2++)
+         {
+            distributeData(rdata, index, maxX1, x2, x3);
+         }
+      }
+   }
+   else if (sendDir == D3Q27System::S)
+   {
+      for (int x3 = 1; x3 < maxX3; x3++)
+      {
+         for (int x1 = 1; x1 < maxX1; x1++)
+         {
+            distributeData(rdata, index, x1, 0, x3);
+         }
+      }
+   }
+   else if (sendDir == D3Q27System::N)
+   {
+      for (int x3 = 1; x3 < maxX3; x3++)
+      {
+         for (int x1 = 1; x1 < maxX1; x1++)
+         {
+            distributeData(rdata, index, x1, maxX2, x3);
+         }
+      }
+   }
+   else if (sendDir == D3Q27System::B)
+   {
+      for (int x2 = 1; x2 < maxX2; x2++)
+      {
+         for (int x1 = 1; x1 < maxX1; x1++)
+         {
+            distributeData(rdata, index, x1, x2, 0);
+         }
+      }
+   }
+   else if (sendDir == D3Q27System::T)
+   {
+      for (int x2 = 1; x2 < maxX2; x2++)
+      {
+         for (int x1 = 1; x1 < maxX1; x1++)
+         {
+            distributeData(rdata, index, x1, x2, maxX3);
+         }
+      }
+   }
+   //NE NW SW SE
+   else if (sendDir == D3Q27System::NE || sendDir == D3Q27System::NW || sendDir == D3Q27System::SW || sendDir == D3Q27System::SE)
+   {
+      int x1 = 0;
+      int x2 = 0;
+      switch (sendDir)  //wenn sendir NE dann kommen werte von SW
+      {
+      case D3Q27System::NE:
+         x1 = maxX1;
+         x2 = maxX2;
+         break;
+      case D3Q27System::NW:
+         x1 = 0;
+         x2 = maxX2;
+         break;
+      case D3Q27System::SW:
+         x1 = 0;
+         x2 = 0;
+         break;
+      case D3Q27System::SE:
+         x1 = maxX1;
+         x2 = 0;
+         break;
+      }
+      for (int x3 = 1; x3 < maxX3; x3++)
+      {
+         distributeData(rdata, index, x1, x2, x3);
+      }
+
+   }
+   //TE TW BW BE
+   else if (sendDir == D3Q27System::TE || sendDir == D3Q27System::TW || sendDir == D3Q27System::BW || sendDir == D3Q27System::BE)
+
+   {
+      int x1 = 0;
+      int x3 = 0;
+      switch (sendDir)  //wenn sendir NE dann kommen werte von SW
+      {
+      case D3Q27System::TE:
+         x1 = maxX1;
+         x3 = maxX3;
+         break;
+      case D3Q27System::TW:
+         x1 = 0;
+         x3 = maxX3;
+         break;
+      case D3Q27System::BW:
+         x1 = 0;
+         x3 = 0;
+         break;
+      case D3Q27System::BE:
+         x1 = maxX1;
+         x3 = 0;
+         break;
+      }
+      for (int x2 = 1; x2 < maxX2; x2++)
+      {
+         distributeData(rdata, index, x1, x2, x3);
+      }
+   }
+   //TN BN BS TS
+   else if (sendDir == D3Q27System::TN || sendDir == D3Q27System::BN || sendDir == D3Q27System::BS || sendDir == D3Q27System::TS)
+   {
+      int x2 = 0;
+      int x3 = 0;
+      switch (sendDir)
+      {
+      case D3Q27System::TN:
+         x3 = maxX3;
+         x2 = maxX2;
+         break;
+      case D3Q27System::BN:
+         x3 = 0;
+         x2 = maxX2;
+         break;
+      case D3Q27System::BS:
+         x3 = 0;
+         x2 = 0;
+         break;
+      case D3Q27System::TS:
+         x3 = maxX3;
+         x2 = 0;
+         break;
+
+      }
+      for (int x1 = 1; x1 < maxX1; x1++)
+      {
+         distributeData(rdata, index, x1, x2, x3);
+      }
+   }
+   //TNE TNW TSW TSE BNE BNW BSW BSE
+   else if (sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSW || sendDir == D3Q27System::TSE
+      || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW || sendDir == D3Q27System::BSW || sendDir == D3Q27System::BSE)
+   {
+      int x1 = 0;
+      int x2 = 0;
+      int x3 = 0;
+
+      switch (sendDir)
+      {
+      case D3Q27System::TNE:
+         x1 = maxX1;
+         x2 = maxX2;
+         x3 = maxX3;
+         break;
+      case D3Q27System::TNW:
+         x1 = 0;
+         x2 = maxX2;
+         x3 = maxX3;
+         break;
+      case D3Q27System::TSW:
+         x1 = 0;
+         x2 = 0;
+         x3 = maxX3;
+         break;
+      case D3Q27System::TSE:
+         x1 = maxX1;
+         x2 = 0;
+         x3 = maxX3;
+         break;
+      case D3Q27System::BNE:
+         x1 = maxX1;
+         x2 = maxX2;
+         x3 = 0;
+         break;
+      case D3Q27System::BNW:
+         x1 = 0;
+         x2 = maxX2;
+         x3 = 0;
+         break;
+      case D3Q27System::BSW:
+         x1 = 0;
+         x2 = 0;
+         x3 = 0;
+         break;
+      case D3Q27System::BSE:
+         x1 = maxX1;
+         x2 = 0;
+         x3 = 0;
+         break;
+      }
+      distributeData(rdata, index, x1, x2, x3);
+   }
+   else UB_THROW(UbException(UB_EXARGS, "unknown dir"));
+}
+//////////////////////////////////////////////////////////////////////////
+
+
diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.h
new file mode 100644
index 000000000..0b2bd66b9
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.h
@@ -0,0 +1,189 @@
+#ifndef ThixotropyFullVectorConnector_H
+#define ThixotropyFullVectorConnector_H
+
+#include <vector>
+
+#include "RemoteBlock3DConnector.h"
+#include "D3Q27System.h"
+//#include "Block3D.h"
+//#include "LBMKernel.h"
+//#include "EsoTwist3D.h"
+#include "basics/container/CbArray3D.h"
+#include "basics/container/CbArray4D.h"
+
+class EsoTwist3D;
+class Block3D;
+
+//daten werden in einen vector (dieser befindet sich im transmitter) kopiert
+//der vector wird via transmitter uebertragen
+//transmitter kann ein lokal, MPI, RCG, CTL oder was auch immer fuer ein
+//transmitter sein, der von Transmitter abgeleitet ist ;-)
+class ThixotropyFullVectorConnector : public RemoteBlock3DConnector
+{
+public:
+   ThixotropyFullVectorConnector(SPtr<Block3D> block
+      , VectorTransmitterPtr sender
+      , VectorTransmitterPtr receiver
+      , int sendDir);
+
+   void init();
+
+   void fillSendVectors();
+   void distributeReceiveVectors();
+
+protected:
+   inline void fillData(vector_type& sdata, int& index, int x1, int x2, int x3);
+   inline void distributeData(vector_type& rdata, int& index, int x1, int x2, int x3);
+private:
+   int maxX1;
+   int maxX2;
+   int maxX3;
+
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions;
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions;
+   CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributions;
+
+   SPtr<EsoTwist3D>  fDis;
+
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localHdistributions;
+   CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalHdistributions;
+   CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroHdistributions;
+
+
+   SPtr<EsoTwist3D>  hDis;
+
+};
+
+//////////////////////////////////////////////////////////////////////////
+inline void ThixotropyFullVectorConnector::fillData(vector_type& sdata, int& index, int x1, int x2, int x3)
+{
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+
+   sdata[index++] = (*this->zeroDistributions)(x1, x2, x3);
+
+
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3);
+
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1);
+   sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1);
+
+   sdata[index++] = (*this->zeroHdistributions)(x1, x2, x3);
+
+}
+//////////////////////////////////////////////////////////////////////////
+inline void ThixotropyFullVectorConnector::distributeData(vector_type& rdata, int& index, int x1, int x2, int x3)
+{
+   (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++];
+
+   (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++];
+
+   (*this->zeroDistributions)(x1, x2, x3) = rdata[index++];
+
+   
+   (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++];
+
+   (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++];
+   (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++];
+
+   (*this->zeroHdistributions)(x1, x2, x3) = rdata[index++];
+}
+
+
+#endif //D3Q27VECTORCONNECTOR_H
+
diff --git a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h
index c0171588b..d0ed4c60f 100644
--- a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h
+++ b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h
@@ -1,124 +1,151 @@
-//=======================================================================================
-// ____          ____    __    ______     __________   __      __       __        __
-// \    \       |    |  |  |  |   _   \  |___    ___| |  |    |  |     /  \      |  |
-//  \    \      |    |  |  |  |  |_)   |     |  |     |  |    |  |    /    \     |  |
-//   \    \     |    |  |  |  |   _   /      |  |     |  |    |  |   /  /\  \    |  |
-//    \    \    |    |  |  |  |  | \  \      |  |     |   \__/   |  /  ____  \   |  |____
-//     \    \   |    |  |__|  |__|  \__\     |__|      \________/  /__/    \__\  |_______|
-//      \    \  |    |   ________________________________________________________________
-//       \    \ |    |  |  ______________________________________________________________|
-//        \    \|    |  |  |         __          __     __     __     ______      _______
-//         \         |  |  |_____   |  |        |  |   |  |   |  |   |   _  \    /  _____)
-//          \        |  |   _____|  |  |        |  |   |  |   |  |   |  | \  \   \_______
-//           \       |  |  |        |  |_____   |   \_/   |   |  |   |  |_/  /    _____  |
-//            \ _____|  |__|        |________|   \_______/    |__|   |______/    (_______/
-//
-//  This file is part of VirtualFluids. VirtualFluids is free software: you can
-//  redistribute it and/or modify it under the terms of the GNU General Public
-//  License as published by the Free Software Foundation, either version 3 of
-//  the License, or (at your option) any later version.
-//
-//  VirtualFluids is distributed in the hope that it will be useful, but WITHOUT
-//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-//  for more details.
-//
-//  You should have received a copy of the GNU General Public License along
-//  with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
-//
-//! \file DataSet3D.h
-//! \ingroup Data
-//! \author Konstantin Kutscher
-//=======================================================================================
-
 #ifndef DataSet3D_h
 #define DataSet3D_h
 
 #include <PointerDefinitions.h>
 
-#include "DistributionArray3D.h"
-#include "basics/container/CbArray3D.h"
 #include "basics/container/CbArray4D.h"
+#include "basics/container/CbArray3D.h"
+#include "DistributionArray3D.h"
 
-using AverageValuesArray3D     = CbArray4D<LBMReal, IndexerX4X3X2X1>;
-using ShearStressValuesArray3D = CbArray4D<LBMReal, IndexerX4X3X2X1>;
-using RelaxationFactorArray3D  = CbArray3D<LBMReal, IndexerX3X2X1>;
+typedef CbArray4D<LBMReal,IndexerX4X3X2X1> AverageValuesArray3D;
+typedef CbArray4D<LBMReal,IndexerX4X3X2X1> ShearStressValuesArray3D;
+typedef CbArray3D<LBMReal, IndexerX3X2X1> RelaxationFactorArray3D;
 
-//! A class provides an interface for data structures in the kernel.
 class DataSet3D
 {
 public:
-    SPtr<DistributionArray3D> getFdistributions() const;
-    void setFdistributions(SPtr<DistributionArray3D> distributions);
+   SPtr<DistributionArray3D> getFdistributions() const;
+   void setFdistributions(SPtr<DistributionArray3D> distributions);
 
-    SPtr<AverageValuesArray3D> getAverageDensity() const;
-    void setAverageDensity(SPtr<AverageValuesArray3D> values);
+   SPtr<DistributionArray3D> getHdistributions() const;
+   void setHdistributions(SPtr<DistributionArray3D> distributions);
 
-    SPtr<AverageValuesArray3D> getAverageVelocity() const;
-    void setAverageVelocity(SPtr<AverageValuesArray3D> values);
+   SPtr<AverageValuesArray3D> getAverageDensity() const;
+   void setAverageDensity(SPtr<AverageValuesArray3D> values);
 
-    SPtr<AverageValuesArray3D> getAverageFluctuations() const;
-    void setAverageFluctuations(SPtr<AverageValuesArray3D> values);
+   SPtr<AverageValuesArray3D> getAverageVelocity() const;
+   void setAverageVelocity(SPtr<AverageValuesArray3D> values);
 
-    SPtr<AverageValuesArray3D> getAverageTriplecorrelations() const;
-    void setAverageTriplecorrelations(SPtr<AverageValuesArray3D> values);
+   SPtr<AverageValuesArray3D> getAverageFluctuations() const;
+   void setAverageFluctuations(SPtr<AverageValuesArray3D> values);
 
-    SPtr<AverageValuesArray3D> getAverageValues() const;
-    void setAverageValues(SPtr<AverageValuesArray3D> values);
-
-    SPtr<ShearStressValuesArray3D> getShearStressValues() const;
-    void setShearStressValues(SPtr<ShearStressValuesArray3D> values);
-
-    SPtr<RelaxationFactorArray3D> getRelaxationFactor() const;
-    void setRelaxationFactor(SPtr<RelaxationFactorArray3D> values);
+   SPtr<AverageValuesArray3D> getAverageTriplecorrelations() const;
+   void setAverageTriplecorrelations(SPtr<AverageValuesArray3D> values);
+   
+   SPtr<AverageValuesArray3D> getAverageValues() const;
+   void setAverageValues(SPtr<AverageValuesArray3D> values);
+   
+   SPtr<ShearStressValuesArray3D> getShearStressValues() const;
+   void setShearStressValues(SPtr<ShearStressValuesArray3D> values);
 
+   SPtr<RelaxationFactorArray3D> getRelaxationFactor() const;
+   void setRelaxationFactor(SPtr<RelaxationFactorArray3D> values);
 protected:
 private:
-    SPtr<DistributionArray3D> fdistributions;
-    SPtr<AverageValuesArray3D> averageValues;
+   SPtr<DistributionArray3D> fdistributions;
+
+   SPtr<DistributionArray3D> hdistributions;
+
+   SPtr<AverageValuesArray3D> averageValues;
+
+   SPtr<AverageValuesArray3D> averageDensity;
+   SPtr<AverageValuesArray3D> averageVelocity;
+   SPtr<AverageValuesArray3D> averageFluktuations;
+   SPtr<AverageValuesArray3D> averageTriplecorrelations;
 
-    SPtr<AverageValuesArray3D> averageDensity;
-    SPtr<AverageValuesArray3D> averageVelocity;
-    SPtr<AverageValuesArray3D> averageFluktuations;
-    SPtr<AverageValuesArray3D> averageTriplecorrelations;
+   SPtr<ShearStressValuesArray3D> shearStressValues;
 
-    SPtr<ShearStressValuesArray3D> shearStressValues;
+   SPtr<RelaxationFactorArray3D> relaxationFactor;
 
-    SPtr<RelaxationFactorArray3D> relaxationFactor;
 };
 
-inline SPtr<DistributionArray3D> DataSet3D::getFdistributions() const { return fdistributions; }
+inline SPtr<DistributionArray3D> DataSet3D::getFdistributions() const
+{ 
+   return fdistributions; 
+}
+
+inline void DataSet3D::setFdistributions(SPtr<DistributionArray3D> distributions)
+{ 
+   fdistributions = distributions; 
+}
+
+inline SPtr<DistributionArray3D> DataSet3D::getHdistributions() const
+{
+	return hdistributions;
+}
 
-inline void DataSet3D::setFdistributions(SPtr<DistributionArray3D> distributions) { fdistributions = distributions; }
+inline void DataSet3D::setHdistributions(SPtr<DistributionArray3D> distributions)
+{
+	hdistributions = distributions;
+}
 
-inline SPtr<AverageValuesArray3D> DataSet3D::getAverageValues() const { return averageValues; }
+inline SPtr<AverageValuesArray3D> DataSet3D::getAverageValues() const
+{ 
+   return averageValues; 
+}
 
-inline void DataSet3D::setAverageValues(SPtr<AverageValuesArray3D> values) { averageValues = values; }
+inline void DataSet3D::setAverageValues(SPtr<AverageValuesArray3D> values)
+{ 
+   averageValues = values; 
+}
 
-inline SPtr<AverageValuesArray3D> DataSet3D::getAverageDensity() const { return averageDensity; }
+inline SPtr<AverageValuesArray3D> DataSet3D::getAverageDensity() const
+{
+   return averageDensity;
+}
 
-inline void DataSet3D::setAverageDensity(SPtr<AverageValuesArray3D> values) { averageDensity = values; }
+inline void DataSet3D::setAverageDensity(SPtr<AverageValuesArray3D> values)
+{
+   averageDensity = values;
+}
 
-inline SPtr<AverageValuesArray3D> DataSet3D::getAverageVelocity() const { return averageVelocity; }
+inline SPtr<AverageValuesArray3D> DataSet3D::getAverageVelocity() const
+{
+   return averageVelocity;
+}
 
-inline void DataSet3D::setAverageVelocity(SPtr<AverageValuesArray3D> values) { averageVelocity = values; }
+inline void DataSet3D::setAverageVelocity(SPtr<AverageValuesArray3D> values)
+{
+   averageVelocity = values;
+}
 
-inline SPtr<AverageValuesArray3D> DataSet3D::getAverageFluctuations() const { return averageFluktuations; }
+inline SPtr<AverageValuesArray3D> DataSet3D::getAverageFluctuations() const
+{
+   return averageFluktuations;
+}
 
-inline void DataSet3D::setAverageFluctuations(SPtr<AverageValuesArray3D> values) { averageFluktuations = values; }
+inline void DataSet3D::setAverageFluctuations(SPtr<AverageValuesArray3D> values)
+{
+   averageFluktuations = values;
+}
 
-inline SPtr<AverageValuesArray3D> DataSet3D::getAverageTriplecorrelations() const { return averageTriplecorrelations; }
+inline SPtr<AverageValuesArray3D> DataSet3D::getAverageTriplecorrelations() const
+{
+   return averageTriplecorrelations;
+}
 
 inline void DataSet3D::setAverageTriplecorrelations(SPtr<AverageValuesArray3D> values)
 {
-    averageTriplecorrelations = values;
+   averageTriplecorrelations = values;
 }
 
-inline SPtr<ShearStressValuesArray3D> DataSet3D::getShearStressValues() const { return shearStressValues; }
+inline SPtr<ShearStressValuesArray3D> DataSet3D::getShearStressValues() const
+{ 
+   return shearStressValues; 
+}
 
-inline void DataSet3D::setShearStressValues(SPtr<ShearStressValuesArray3D> values) { shearStressValues = values; }
+inline void DataSet3D::setShearStressValues(SPtr<ShearStressValuesArray3D> values)
+{ 
+   shearStressValues = values; 
+}
 
-inline SPtr<RelaxationFactorArray3D> DataSet3D::getRelaxationFactor() const { return relaxationFactor; }
+inline SPtr<RelaxationFactorArray3D> DataSet3D::getRelaxationFactor() const
+{
+   return relaxationFactor;
+}
 
-inline void DataSet3D::setRelaxationFactor(SPtr<RelaxationFactorArray3D> values) { relaxationFactor = values; }
+inline void DataSet3D::setRelaxationFactor(SPtr<RelaxationFactorArray3D> values)
+{
+   relaxationFactor = values;
+}
 #endif
diff --git a/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp
new file mode 100644
index 000000000..553c49961
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp
@@ -0,0 +1,61 @@
+#include "BasicLBMKernel.h"
+#include "D3Q27System.h"
+#include "BCArray3D.h"
+#include "BCProcessor.h"
+
+BasicLBMKernel::BasicLBMKernel()
+{
+
+}
+
+BasicLBMKernel::~BasicLBMKernel(void)
+{
+}
+
+void BasicLBMKernel::calculate(int step)
+{
+   using namespace D3Q27System;
+   using namespace std;
+
+   //timer.resetAndStart();
+
+
+   /////////////////////////////////////
+
+   //localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+   //nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+   //zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
+
+   initData();
+
+   SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray();
+
+   const int bcArrayMaxX1 = (int)bcArray->getNX1();
+   const int bcArrayMaxX2 = (int)bcArray->getNX2();
+   const int bcArrayMaxX3 = (int)bcArray->getNX3();
+
+   minX1 = ghostLayerWidth;
+   minX2 = ghostLayerWidth;
+   minX3 = ghostLayerWidth;
+   maxX1 = bcArrayMaxX1 - ghostLayerWidth;
+   maxX2 = bcArrayMaxX2 - ghostLayerWidth;
+   maxX3 = bcArrayMaxX3 - ghostLayerWidth;
+
+   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;
+
+               nodeCollision(step, x1, x2, x3);
+            }
+         }
+      }
+   }
+}
diff --git a/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.h
new file mode 100644
index 000000000..4a6b4632f
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.h
@@ -0,0 +1,25 @@
+#ifndef BasicLBMKernell_h__
+#define BasicLBMKernel_h__
+
+#include "LBMKernel.h"
+
+
+class BasicLBMKernel : public LBMKernel
+{
+public:
+	BasicLBMKernel();
+	virtual ~BasicLBMKernel(void);
+	virtual void calculate(int step);
+	virtual SPtr<LBMKernel> clone() = 0;
+protected:
+	virtual void initData(){}
+	virtual void nodeCollision(int step, int x1, int x2, int x3) {}
+	int minX1;
+	int minX2;
+	int minX3;
+	int maxX1;
+	int maxX2;
+	int maxX3;
+};
+
+#endif // BasicLBMKernel_h__
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/LBM/BinghamModelLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/BinghamModelLBMKernel.h
new file mode 100644
index 000000000..8a3f1e58f
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/BinghamModelLBMKernel.h
@@ -0,0 +1,38 @@
+#ifndef BinghamModelLBMKernel_H
+#define BinghamModelLBMKernel_H
+
+#include "ThixotropyModelLBMKernel.h"
+#include "Thixotropy.h"
+
+//! \brief    Cumulant LBM kernel + Bingham plastic model 
+//! \author K. Kutscher, M. Geier
+class BinghamModelLBMKernel : public ThixotropyModelLBMKernel
+{
+public:
+	BinghamModelLBMKernel() {};
+	~BinghamModelLBMKernel() {};
+	SPtr<LBMKernel> clone() override
+	{
+		SPtr<LBMKernel> kernel(new BinghamModelLBMKernel());
+		kernel->setNX(nx);
+		kernel->setCollisionFactor(collFactor);
+		dynamicPointerCast<BinghamModelLBMKernel>(kernel)->initDataSet();
+		kernel->setBCProcessor(bcProcessor->clone(kernel));
+		kernel->setWithForcing(withForcing);
+		kernel->setForcingX1(muForcingX1);
+		kernel->setForcingX2(muForcingX2);
+		kernel->setForcingX3(muForcingX3);
+		kernel->setIndex(ix1, ix2, ix3);
+		kernel->setDeltaT(deltaT);
+
+		return kernel;
+	}
+protected:	
+	LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const override
+	{
+		return Thixotropy::getBinghamCollFactor(omegaInf, shearRate, drho);
+	}
+};
+
+
+#endif
diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp
index b01159e58..5542d2c98 100644
--- a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp
+++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp
@@ -13,9 +13,8 @@ using namespace UbMath;
 CompressibleCumulantLBMKernel::CompressibleCumulantLBMKernel()
 {
    this->compressible = true;
-   this->parameter = NORMAL;
+   this->parameter = CompressibleCumulantLBMKernel::NORMAL;
    this->OxyyMxzz = 1.0;
-   this->compressible = true;
    this->bulkOmegaToOmega = false;
    this->OxxPyyPzz = 1.0;
 }
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp
new file mode 100644
index 000000000..57e26c7e0
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp
@@ -0,0 +1,1972 @@
+#include "CumulantLBMKernel.h"
+#include "D3Q27System.h"
+#include "InterpolationProcessor.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include <math.h>
+#include "DataSet3D.h"
+#include "Block3D.h"
+
+#define PROOF_CORRECTNESS
+
+//////////////////////////////////////////////////////////////////////////
+CumulantLBMKernel::CumulantLBMKernel()
+{
+   this->compressible = true;
+   this->parameter = CumulantLBMKernel::NORMAL;
+   this->OxyyMxzz = 1.0;
+   this->bulkOmegaToOmega = false;
+   this->OxxPyyPzz = 1.0;
+}
+//////////////////////////////////////////////////////////////////////////
+CumulantLBMKernel::~CumulantLBMKernel(void)
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+void CumulantLBMKernel::initDataSet()
+{
+   SPtr<DistributionArray3D> d(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9));
+   dataSet->setFdistributions(d);
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<LBMKernel> CumulantLBMKernel::clone()
+{
+   SPtr<LBMKernel> kernel(new CumulantLBMKernel());
+   kernel->setNX(nx);
+   dynamicPointerCast<CumulantLBMKernel>(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());
+
+   switch (parameter)
+   {
+   case NORMAL:
+      dynamicPointerCast<CumulantLBMKernel>(kernel)->OxyyMxzz = 1.0;
+      break;
+   case MAGIC:
+      dynamicPointerCast<CumulantLBMKernel>(kernel)->OxyyMxzz = 2.0 + (-collFactor);
+      break;
+   }
+
+   if (bulkOmegaToOmega)
+   {
+      dynamicPointerCast<CumulantLBMKernel>(kernel)->OxxPyyPzz = collFactor;
+   }
+   else
+   {
+      dynamicPointerCast<CumulantLBMKernel>(kernel)->OxxPyyPzz = one;
+   }
+   return kernel;
+}
+//////////////////////////////////////////////////////////////////////////
+//void CumulantLBMKernel::calculate(int step)
+//{
+//   using namespace D3Q27System;
+//   using namespace std;
+//
+//   //timer.resetAndStart();
+//
+//   //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);
+//
+//      LBMReal forcingX1 = 0;
+//      LBMReal forcingX2 = 0;
+//      LBMReal forcingX3 = 0;
+//   }
+//   /////////////////////////////////////
+//
+//   localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+//   nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+//   zeroDistributions = dynamicPointerCast<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;
+//
+//
+//   //#pragma omp parallel num_threads(8)
+//   {
+//      //   int i = omp_get_thread_num();
+//      //   printf_s("Hello from thread %d\n", i);
+//      //}
+//   //#pragma omp for 
+//      for (int x3 = minX3; x3 < maxX3; x3++)
+//      {
+//         for (int x2 = minX2; x2 < maxX2; x2++)
+//         {
+//            for (int x1 = minX1; x1 < maxX1; x1++)
+//            {
+//               if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3))
+//               {
+//                  int x1p = x1 + 1;
+//                  int x2p = x2 + 1;
+//                  int x3p = x3 + 1;
+//                  //////////////////////////////////////////////////////////////////////////
+//                  //read distribution
+//                  ////////////////////////////////////////////////////////////////////////////
+//                  //////////////////////////////////////////////////////////////////////////
+//
+//                  //E   N  T
+//                  //c   c  c
+//                  //////////
+//                  //W   S  B
+//                  //a   a  a
+//
+//                  //Rest ist b
+//
+//                  //mfxyz
+//                  //a - negative
+//                  //b - null
+//                  //c - positive
+//
+//                  // a b c
+//                  //-1 0 1
+//
+//                  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->zeroDistributions)(x1, x2, x3);
+//
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  LBMReal drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+//                     (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+//                     ((mfabb + mfcbb) + (mfbab + mfbcb)) + (mfbba + mfbbc)) + mfbbb;
+//
+//                  LBMReal rho = one + drho;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+//                     (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+//                     (mfcbb - mfabb)) / rho;
+//                  LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+//                     (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+//                     (mfbcb - mfbab)) / rho;
+//                  LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+//                     (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+//                     (mfbbc - mfbba)) / rho;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//
+//                  //forcing 
+//                  ///////////////////////////////////////////////////////////////////////////////////////////
+//                  if (withForcing)
+//                  {
+//                     muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1);
+//                     muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2);
+//                     muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3);
+//
+//                     forcingX1 = muForcingX1.Eval();
+//                     forcingX2 = muForcingX2.Eval();
+//                     forcingX3 = muForcingX3.Eval();
+//
+//                     vvx += forcingX1 * deltaT * 0.5; // X
+//                     vvy += forcingX2 * deltaT * 0.5; // Y
+//                     vvz += forcingX3 * deltaT * 0.5; // Z
+//                  }
+//                  ///////////////////////////////////////////////////////////////////////////////////////////               
+//            ////////////////////////////////////////////////////////////////////////////////////
+//                  LBMReal oMdrho = one; // comp special
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  LBMReal m0, m1, m2;
+//                  LBMReal vx2;
+//                  LBMReal vy2;
+//                  LBMReal vz2;
+//                  vx2 = vvx * vvx;
+//                  vy2 = vvy * vvy;
+//                  vz2 = vvz * vvz;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  //LBMReal wadjust;
+//                  //LBMReal qudricLimitP = 0.01f;// * 0.0001f;
+//                  //LBMReal qudricLimitM = 0.01f;// * 0.0001f;
+//                  //LBMReal qudricLimitD = 0.01f;// * 0.001f;
+//                  //LBMReal s9 = minusomega;
+//                  //test
+//                  //s9 = 0.;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  //Hin
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  // Z - Dir
+//                  m2 = mfaaa + mfaac;
+//                  m1 = mfaac - mfaaa;
+//                  m0 = m2 + mfaab;
+//                  mfaaa = m0;
+//                  m0 += c1o36 * oMdrho;
+//                  mfaab = m1 - m0 * vvz;
+//                  mfaac = m2 - two * m1 * vvz + vz2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfaba + mfabc;
+//                  m1 = mfabc - mfaba;
+//                  m0 = m2 + mfabb;
+//                  mfaba = m0;
+//                  m0 += c1o9 * oMdrho;
+//                  mfabb = m1 - m0 * vvz;
+//                  mfabc = m2 - two * m1 * vvz + vz2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfaca + mfacc;
+//                  m1 = mfacc - mfaca;
+//                  m0 = m2 + mfacb;
+//                  mfaca = m0;
+//                  m0 += c1o36 * oMdrho;
+//                  mfacb = m1 - m0 * vvz;
+//                  mfacc = m2 - two * m1 * vvz + vz2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfbaa + mfbac;
+//                  m1 = mfbac - mfbaa;
+//                  m0 = m2 + mfbab;
+//                  mfbaa = m0;
+//                  m0 += c1o9 * oMdrho;
+//                  mfbab = m1 - m0 * vvz;
+//                  mfbac = m2 - two * m1 * vvz + vz2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfbba + mfbbc;
+//                  m1 = mfbbc - mfbba;
+//                  m0 = m2 + mfbbb;
+//                  mfbba = m0;
+//                  m0 += c4o9 * oMdrho;
+//                  mfbbb = m1 - m0 * vvz;
+//                  mfbbc = m2 - two * m1 * vvz + vz2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfbca + mfbcc;
+//                  m1 = mfbcc - mfbca;
+//                  m0 = m2 + mfbcb;
+//                  mfbca = m0;
+//                  m0 += c1o9 * oMdrho;
+//                  mfbcb = m1 - m0 * vvz;
+//                  mfbcc = m2 - two * m1 * vvz + vz2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfcaa + mfcac;
+//                  m1 = mfcac - mfcaa;
+//                  m0 = m2 + mfcab;
+//                  mfcaa = m0;
+//                  m0 += c1o36 * oMdrho;
+//                  mfcab = m1 - m0 * vvz;
+//                  mfcac = m2 - two * m1 * vvz + vz2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfcba + mfcbc;
+//                  m1 = mfcbc - mfcba;
+//                  m0 = m2 + mfcbb;
+//                  mfcba = m0;
+//                  m0 += c1o9 * oMdrho;
+//                  mfcbb = m1 - m0 * vvz;
+//                  mfcbc = m2 - two * m1 * vvz + vz2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfcca + mfccc;
+//                  m1 = mfccc - mfcca;
+//                  m0 = m2 + mfccb;
+//                  mfcca = m0;
+//                  m0 += c1o36 * oMdrho;
+//                  mfccb = m1 - m0 * vvz;
+//                  mfccc = m2 - two * m1 * vvz + vz2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  // mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  // Y - Dir
+//                  m2 = mfaaa + mfaca;
+//                  m1 = mfaca - mfaaa;
+//                  m0 = m2 + mfaba;
+//                  mfaaa = m0;
+//                  m0 += c1o6 * oMdrho;
+//                  mfaba = m1 - m0 * vvy;
+//                  mfaca = m2 - two * m1 * vvy + vy2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfaab + mfacb;
+//                  m1 = mfacb - mfaab;
+//                  m0 = m2 + mfabb;
+//                  mfaab = m0;
+//                  mfabb = m1 - m0 * vvy;
+//                  mfacb = m2 - two * m1 * vvy + vy2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfaac + mfacc;
+//                  m1 = mfacc - mfaac;
+//                  m0 = m2 + mfabc;
+//                  mfaac = m0;
+//                  m0 += c1o18 * oMdrho;
+//                  mfabc = m1 - m0 * vvy;
+//                  mfacc = m2 - two * m1 * vvy + vy2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfbaa + mfbca;
+//                  m1 = mfbca - mfbaa;
+//                  m0 = m2 + mfbba;
+//                  mfbaa = m0;
+//                  m0 += c2o3 * oMdrho;
+//                  mfbba = m1 - m0 * vvy;
+//                  mfbca = m2 - two * m1 * vvy + vy2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfbab + mfbcb;
+//                  m1 = mfbcb - mfbab;
+//                  m0 = m2 + mfbbb;
+//                  mfbab = m0;
+//                  mfbbb = m1 - m0 * vvy;
+//                  mfbcb = m2 - two * m1 * vvy + vy2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfbac + mfbcc;
+//                  m1 = mfbcc - mfbac;
+//                  m0 = m2 + mfbbc;
+//                  mfbac = m0;
+//                  m0 += c2o9 * oMdrho;
+//                  mfbbc = m1 - m0 * vvy;
+//                  mfbcc = m2 - two * m1 * vvy + vy2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfcaa + mfcca;
+//                  m1 = mfcca - mfcaa;
+//                  m0 = m2 + mfcba;
+//                  mfcaa = m0;
+//                  m0 += c1o6 * oMdrho;
+//                  mfcba = m1 - m0 * vvy;
+//                  mfcca = m2 - two * m1 * vvy + vy2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfcab + mfccb;
+//                  m1 = mfccb - mfcab;
+//                  m0 = m2 + mfcbb;
+//                  mfcab = m0;
+//                  mfcbb = m1 - m0 * vvy;
+//                  mfccb = m2 - two * m1 * vvy + vy2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfcac + mfccc;
+//                  m1 = mfccc - mfcac;
+//                  m0 = m2 + mfcbc;
+//                  mfcac = m0;
+//                  m0 += c1o18 * oMdrho;
+//                  mfcbc = m1 - m0 * vvy;
+//                  mfccc = m2 - two * m1 * vvy + vy2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  // mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9		Konditionieren
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  // X - Dir
+//                  m2 = mfaaa + mfcaa;
+//                  m1 = mfcaa - mfaaa;
+//                  m0 = m2 + mfbaa;
+//                  mfaaa = m0;
+//                  m0 += one * oMdrho;
+//                  mfbaa = m1 - m0 * vvx;
+//                  mfcaa = m2 - two * m1 * vvx + vx2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfaba + mfcba;
+//                  m1 = mfcba - mfaba;
+//                  m0 = m2 + mfbba;
+//                  mfaba = m0;
+//                  mfbba = m1 - m0 * vvx;
+//                  mfcba = m2 - two * m1 * vvx + vx2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfaca + mfcca;
+//                  m1 = mfcca - mfaca;
+//                  m0 = m2 + mfbca;
+//                  mfaca = m0;
+//                  m0 += c1o3 * oMdrho;
+//                  mfbca = m1 - m0 * vvx;
+//                  mfcca = m2 - two * m1 * vvx + vx2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfaab + mfcab;
+//                  m1 = mfcab - mfaab;
+//                  m0 = m2 + mfbab;
+//                  mfaab = m0;
+//                  mfbab = m1 - m0 * vvx;
+//                  mfcab = m2 - two * m1 * vvx + vx2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfabb + mfcbb;
+//                  m1 = mfcbb - mfabb;
+//                  m0 = m2 + mfbbb;
+//                  mfabb = m0;
+//                  mfbbb = m1 - m0 * vvx;
+//                  mfcbb = m2 - two * m1 * vvx + vx2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfacb + mfccb;
+//                  m1 = mfccb - mfacb;
+//                  m0 = m2 + mfbcb;
+//                  mfacb = m0;
+//                  mfbcb = m1 - m0 * vvx;
+//                  mfccb = m2 - two * m1 * vvx + vx2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfaac + mfcac;
+//                  m1 = mfcac - mfaac;
+//                  m0 = m2 + mfbac;
+//                  mfaac = m0;
+//                  m0 += c1o3 * oMdrho;
+//                  mfbac = m1 - m0 * vvx;
+//                  mfcac = m2 - two * m1 * vvx + vx2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfabc + mfcbc;
+//                  m1 = mfcbc - mfabc;
+//                  m0 = m2 + mfbbc;
+//                  mfabc = m0;
+//                  mfbbc = m1 - m0 * vvx;
+//                  mfcbc = m2 - two * m1 * vvx + vx2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m2 = mfacc + mfccc;
+//                  m1 = mfccc - mfacc;
+//                  m0 = m2 + mfbcc;
+//                  mfacc = m0;
+//                  m0 += c1o9 * oMdrho;
+//                  mfbcc = m1 - m0 * vvx;
+//                  mfccc = m2 - two * m1 * vvx + vx2 * m0;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//
+//
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  // Cumulants
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//
+//                  //LBMReal OxxPyyPzz = one; // bulk viscosity
+//
+//                  ////////////////////////////////////////////////////////////
+//                  //3.
+//                  //////////////////////////////
+//                  LBMReal OxyyPxzz = one;//three  * (two - omega) / (three  - omega);//
+//                  //LBMReal OxyyMxzz = one;//six    * (two - omega) / (six    - omega);//
+//                  LBMReal Oxyz = one;//twelve * (two - omega) / (twelve + omega);//
+//                  //////////////////////////////
+//                  //LBMReal OxyyPxzz  = two-omega;//
+//                  //LBMReal OxyyMxzz  = two-omega;//
+//                  //////////////////////////////
+//                  //LBMReal OxyyPxzz  = (eight * (omega - two)) / (omega - eight);//Ginzburg
+//                  //LBMReal OxyyMxzz  = (eight * (omega - two)) / (omega - eight);//Ginzburg
+//                  //////////////////////////////
+//                  //LBMReal OxyyPxzz  = omega;//BGK
+//                  //LBMReal OxyyMxzz  = omega;//BGK
+//                  //////////////////////////////
+//                  //LBMReal OxyyPxzz  = (one + omega) / two;//1P5
+//                  //LBMReal OxyyMxzz  = (one + omega) / two;//1P5
+//                  //////////////////////////////
+//                  //LBMReal OxyyPxzz  = (three - omega) / two;//0P5
+//                  //LBMReal OxyyMxzz  = (three - omega) / two;//0P5
+//                  //////////////////////////////
+//                  //LBMReal OxyyPxzz  = (one + (eight * (omega - two)) / (omega - eight)) / two;//one + Ginzburg / two ... Car
+//                  //LBMReal OxyyMxzz  = (one + (eight * (omega - two)) / (omega - eight)) / two;//one + Ginzburg / two ... Car
+//                  ////////////////////////////////////////////////////////////
+//                  //4.
+//                  //////////////////////////////
+//                  LBMReal O4 = one;
+//                  //////////////////////////////
+//                  //LBMReal O4        = omega;//TRT
+//                  ////////////////////////////////////////////////////////////
+//                  //5.
+//                  //////////////////////////////
+//                  LBMReal O5 = one;
+//                  ////////////////////////////////////////////////////////////
+//                  //6.
+//                  //////////////////////////////
+//                  LBMReal O6 = one;
+//                  ////////////////////////////////////////////////////////////
+//
+//
+//                  //central moments to cumulants
+//                  //4.
+//                  LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + two * mfbba * mfbab) / rho;	//ab 15.05.2015 verwendet
+//                  LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + two * mfbba * mfabb) / rho; //ab 15.05.2015 verwendet
+//                  LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + two * mfbab * mfabb) / rho; //ab 15.05.2015 verwendet
+//
+//                  LBMReal CUMcca = mfcca - (((mfcaa * mfaca + two * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9 * (drho / rho));
+//                  LBMReal CUMcac = mfcac - (((mfcaa * mfaac + two * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9 * (drho / rho));
+//                  LBMReal CUMacc = mfacc - (((mfaac * mfaca + two * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9 * (drho / rho));
+//
+//                  //5.
+//                  LBMReal CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + four * mfabb * mfbbb + two * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
+//                  LBMReal CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + four * mfbab * mfbbb + two * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
+//                  LBMReal CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + four * mfbba * mfbbb + two * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
+//
+//                  //6.
+//
+//                  LBMReal CUMccc = mfccc + ((-four * mfbbb * mfbbb
+//                     - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+//                     - four * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+//                     - two * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
+//                     + (four * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+//                        + two * (mfcaa * mfaca * mfaac)
+//                        + sixteen * mfbba * mfbab * mfabb) / (rho * rho)
+//                     - c1o3 * (mfacc + mfcac + mfcca) / rho
+//                     - c1o9 * (mfcaa + mfaca + mfaac) / rho
+//                     + (two * (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)));
+//                  //+ c1o27*(one -three/rho +two/(rho*rho)));
+//
+//
+//
+//
+//      //2.
+//      // linear combinations
+//                  LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+//                  LBMReal mxxMyy = mfcaa - mfaca;
+//                  LBMReal mxxMzz = mfcaa - mfaac;
+//
+//                  //////////////////////////////////////////////////////////////////////////
+//         // 			LBMReal magicBulk=(CUMacc+CUMcac+CUMcca)*(one/OxxPyyPzz-c1o2)*c3o2*8.;
+//
+//                  //////////////////////////////////////////////////////////////////////////
+//                  //limiter-Scheise Teil 1
+//                  //LBMReal oxxyy,oxxzz,oxy,oxz,oyz;
+//                  //LBMReal smag=0.001;
+//                  //oxxyy    = omega+(one-omega)*fabs(mxxMyy)/(fabs(mxxMyy)+smag);
+//                  //oxxzz    = omega+(one-omega)*fabs(mxxMzz)/(fabs(mxxMzz)+smag);
+//                  //oxy      = omega+(one-omega)*fabs(mfbba)/(fabs(mfbba)+smag);
+//                  //oxz      = omega+(one-omega)*fabs(mfbab)/(fabs(mfbab)+smag);
+//                  //oyz      = omega+(one-omega)*fabs(mfabb)/(fabs(mfabb)+smag);
+//
+//                  ////////////////////////////////////////////////////////////////////////////
+//                  ////Teil 1b
+//                  //LBMReal constante = 1000.0;
+//                  //LBMReal nuEddi = constante * fabs(mxxPyyPzz);
+//                  //LBMReal omegaLimit = one / (one / omega + three * nuEddi);
+//
+//                  //{
+//                  //	LBMReal dxux = c1o2 * (-omegaLimit) *(mxxMyy + mxxMzz) +  OxxPyyPzz * (mfaaa - mxxPyyPzz);
+//                  //	LBMReal dyuy = dxux + omegaLimit * c3o2 * mxxMyy;
+//                  //	LBMReal dzuz = dxux + omegaLimit * c3o2 * mxxMzz;
+//
+//                     ////relax
+//                     //mxxPyyPzz += OxxPyyPzz*(mfaaa  - mxxPyyPzz)- three * (one - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+//                     //mxxMyy    += omegaLimit * (-mxxMyy) - three * (one + c1o2 * (-omegaLimit)) * (vx2 * dxux + vy2 * dyuy);
+//                     //mxxMzz    += omegaLimit * (-mxxMzz) - three * (one + c1o2 * (-omegaLimit)) * (vx2 * dxux + vz2 * dzuz);
+//
+//                  //}
+//                  //mfabb     += omegaLimit * (-mfabb);
+//                  //mfbab     += omegaLimit * (-mfbab);
+//                  //mfbba     += omegaLimit * (-mfbba);
+//                  ////////////////////////////////////////////////////////////////////////////
+//
+//                  ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//                  //incl. correction		(hat noch nicht so gut funktioniert...Optimierungsbedarf??)
+//                  {
+//                     LBMReal dxux = c1o2 * (-omega) * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz);
+//                     LBMReal dyuy = dxux + omega * c3o2 * mxxMyy;
+//                     LBMReal dzuz = dxux + omega * c3o2 * mxxMzz;
+//
+//                     //relax
+//                     mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - three * (one - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz;
+//                     mxxMyy += omega * (-mxxMyy) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy);
+//                     mxxMzz += omega * (-mxxMzz) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz);
+//
+//                     //////////////////////////////////////////////////////////////////////////
+//                     //limiter-Scheise Teil 2
+//                     //mxxMyy    += oxxyy * (-mxxMyy) - three * (one + c1o2 * (-omega)) * (vx2 * dxux + vy2 * dyuy);
+//                     //mxxMzz    += oxxzz * (-mxxMzz) - three * (one + 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);
+//
+//                  //////////////////////////////////////////////////////////////////////////
+//                  //limiter-Scheise Teil 3
+//                  //mfabb     += oyz * (-mfabb);
+//                  //mfbab     += oxz * (-mfbab);
+//                  //mfbba     += oxy * (-mfbba);
+//                  //////////////////////////////////////////////////////////////////////////
+//
+//                  // linear combinations back
+//                  mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+//                  mfaca = c1o3 * (-two * mxxMyy + mxxMzz + mxxPyyPzz);
+//                  mfaac = c1o3 * (mxxMyy - two * mxxMzz + mxxPyyPzz);
+//
+//                  //3.
+//                  // linear combinations
+//
+//                  LBMReal mxxyPyzz = mfcba + mfabc;
+//                  LBMReal mxxyMyzz = mfcba - mfabc;
+//
+//                  LBMReal mxxzPyyz = mfcab + mfacb;
+//                  LBMReal mxxzMyyz = mfcab - mfacb;
+//
+//                  LBMReal mxyyPxzz = mfbca + mfbac;
+//                  LBMReal mxyyMxzz = mfbca - mfbac;
+//
+//                  //relax
+//                  //////////////////////////////////////////////////////////////////////////
+//                  //das ist der limiter
+//                  //wadjust = Oxyz+(one-Oxyz)*fabs(mfbbb)/(fabs(mfbbb)+qudricLimitD);
+//                  //mfbbb += wadjust * (-mfbbb);
+//                  //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxxyPyzz)/(fabs(mxxyPyzz)+qudricLimitP);
+//                  //mxxyPyzz += wadjust * (-mxxyPyzz);
+//                  //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxxyMyzz)/(fabs(mxxyMyzz)+qudricLimitM);
+//                  //mxxyMyzz += wadjust * (-mxxyMyzz);
+//                  //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxxzPyyz)/(fabs(mxxzPyyz)+qudricLimitP);
+//                  //mxxzPyyz += wadjust * (-mxxzPyyz);
+//                  //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxxzMyyz)/(fabs(mxxzMyyz)+qudricLimitM);
+//                  //mxxzMyyz += wadjust * (-mxxzMyyz);
+//                  //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxyyPxzz)/(fabs(mxyyPxzz)+qudricLimitP);
+//                  //mxyyPxzz += wadjust * (-mxyyPxzz);
+//                  //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxyyMxzz)/(fabs(mxyyMxzz)+qudricLimitM);
+//                  //mxyyMxzz += wadjust * (-mxyyMxzz);
+//                  //////////////////////////////////////////////////////////////////////////
+//                  //ohne limiter
+//                  mfbbb += OxyyMxzz * (-mfbbb);
+//                  mxxyPyzz += OxyyPxzz * (-mxxyPyzz);
+//                  mxxyMyzz += OxyyMxzz * (-mxxyMyzz);
+//                  mxxzPyyz += OxyyPxzz * (-mxxzPyyz);
+//                  mxxzMyyz += OxyyMxzz * (-mxxzMyyz);
+//                  mxyyPxzz += OxyyPxzz * (-mxyyPxzz);
+//                  mxyyMxzz += OxyyMxzz * (-mxyyMxzz);
+//                  //////////////////////////////////////////////////////////////////////////
+//
+//                  //// linear combinations back
+//                  mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+//                  mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+//                  mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+//                  mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+//                  mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+//                  mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+//
+//                  //4.
+//                  //////////////////////////////////////////////////////////////////////////
+//                  //mit limiter
+//               //	wadjust    = O4+(one-O4)*fabs(CUMacc)/(fabs(CUMacc)+qudricLimit);
+//                  //CUMacc    += wadjust * (-CUMacc);
+//               //	wadjust    = O4+(one-O4)*fabs(CUMcac)/(fabs(CUMcac)+qudricLimit);
+//                  //CUMcac    += wadjust * (-CUMcac); 
+//               //	wadjust    = O4+(one-O4)*fabs(CUMcca)/(fabs(CUMcca)+qudricLimit);
+//                  //CUMcca    += wadjust * (-CUMcca); 
+//
+//               //	wadjust    = O4+(one-O4)*fabs(CUMbbc)/(fabs(CUMbbc)+qudricLimit);
+//                  //CUMbbc    += wadjust * (-CUMbbc); 
+//               //	wadjust    = O4+(one-O4)*fabs(CUMbcb)/(fabs(CUMbcb)+qudricLimit);
+//                  //CUMbcb    += wadjust * (-CUMbcb); 
+//               //	wadjust    = O4+(one-O4)*fabs(CUMcbb)/(fabs(CUMcbb)+qudricLimit);
+//                  //CUMcbb    += wadjust * (-CUMcbb); 
+//                  //////////////////////////////////////////////////////////////////////////
+//                  //ohne limiter
+//                  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 + two * mfbba * mfbab) / rho;
+//                  mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + two * mfbba * mfabb) / rho;
+//                  mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + two * mfbab * mfabb) / rho;
+//
+//                  mfcca = CUMcca + (((mfcaa * mfaca + two * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9 * (drho / rho));//(one/rho-one));
+//                  mfcac = CUMcac + (((mfcaa * mfaac + two * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9 * (drho / rho));//(one/rho-one));
+//                  mfacc = CUMacc + (((mfaac * mfaca + two * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9 * (drho / rho));//(one/rho-one));
+//
+//                  //5.
+//                  mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + four * mfabb * mfbbb + two * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
+//                  mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + four * mfbab * mfbbb + two * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
+//                  mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + four * mfbba * mfbbb + two * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
+//
+//                  //6.
+//
+//                  mfccc = CUMccc - ((-four * mfbbb * mfbbb
+//                     - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+//                     - four * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+//                     - two * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
+//                     + (four * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+//                        + two * (mfcaa * mfaca * mfaac)
+//                        + sixteen * mfbba * mfbab * mfabb) / (rho * rho)
+//                     - c1o3 * (mfacc + mfcac + mfcca) / rho
+//                     - c1o9 * (mfcaa + mfaca + mfaac) / rho
+//                     + (two * (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)));
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  //forcing
+//                  mfbaa = -mfbaa;
+//                  mfaba = -mfaba;
+//                  mfaab = -mfaab;
+//                  //////////////////////////////////////////////////////////////////////////////////////
+//
+//            ////////////////////////////////////////////////////////////////////////////////////
+//            //back
+//            ////////////////////////////////////////////////////////////////////////////////////
+//            //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+//            ////////////////////////////////////////////////////////////////////////////////////
+//            // Z - Dir
+//                  m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + one * oMdrho) * (vz2 - vvz) * c1o2;
+//                  m1 = -mfaac - two * mfaab * vvz + mfaaa * (one - vz2) - one * oMdrho * vz2;
+//                  m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + one * oMdrho) * (vz2 + vvz) * c1o2;
+//                  mfaaa = m0;
+//                  mfaab = m1;
+//                  mfaac = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+//                  m1 = -mfabc - two * mfabb * vvz + mfaba * (one - vz2);
+//                  m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+//                  mfaba = m0;
+//                  mfabb = m1;
+//                  mfabc = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+//                  m1 = -mfacc - two * mfacb * vvz + mfaca * (one - vz2) - c1o3 * oMdrho * vz2;
+//                  m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+//                  mfaca = m0;
+//                  mfacb = m1;
+//                  mfacc = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+//                  m1 = -mfbac - two * mfbab * vvz + mfbaa * (one - vz2);
+//                  m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+//                  mfbaa = m0;
+//                  mfbab = m1;
+//                  mfbac = m2;
+//                  /////////b//////////////////////////////////////////////////////////////////////////
+//                  m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+//                  m1 = -mfbbc - two * mfbbb * vvz + mfbba * (one - vz2);
+//                  m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+//                  mfbba = m0;
+//                  mfbbb = m1;
+//                  mfbbc = m2;
+//                  /////////b//////////////////////////////////////////////////////////////////////////
+//                  m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+//                  m1 = -mfbcc - two * mfbcb * vvz + mfbca * (one - vz2);
+//                  m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+//                  mfbca = m0;
+//                  mfbcb = m1;
+//                  mfbcc = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+//                  m1 = -mfcac - two * mfcab * vvz + mfcaa * (one - vz2) - c1o3 * oMdrho * vz2;
+//                  m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+//                  mfcaa = m0;
+//                  mfcab = m1;
+//                  mfcac = m2;
+//                  /////////c//////////////////////////////////////////////////////////////////////////
+//                  m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+//                  m1 = -mfcbc - two * mfcbb * vvz + mfcba * (one - vz2);
+//                  m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+//                  mfcba = m0;
+//                  mfcbb = m1;
+//                  mfcbc = m2;
+//                  /////////c//////////////////////////////////////////////////////////////////////////
+//                  m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+//                  m1 = -mfccc - two * mfccb * vvz + mfcca * (one - vz2) - c1o9 * oMdrho * vz2;
+//                  m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+//                  mfcca = m0;
+//                  mfccb = m1;
+//                  mfccc = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  // Y - Dir
+//                  m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+//                  m1 = -mfaca - two * mfaba * vvy + mfaaa * (one - vy2) - c1o6 * oMdrho * vy2;
+//                  m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+//                  mfaaa = m0;
+//                  mfaba = m1;
+//                  mfaca = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+//                  m1 = -mfacb - two * mfabb * vvy + mfaab * (one - vy2) - c2o3 * oMdrho * vy2;
+//                  m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+//                  mfaab = m0;
+//                  mfabb = m1;
+//                  mfacb = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+//                  m1 = -mfacc - two * mfabc * vvy + mfaac * (one - vy2) - c1o6 * oMdrho * vy2;
+//                  m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+//                  mfaac = m0;
+//                  mfabc = m1;
+//                  mfacc = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+//                  m1 = -mfbca - two * mfbba * vvy + mfbaa * (one - vy2);
+//                  m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+//                  mfbaa = m0;
+//                  mfbba = m1;
+//                  mfbca = m2;
+//                  /////////b//////////////////////////////////////////////////////////////////////////
+//                  m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+//                  m1 = -mfbcb - two * mfbbb * vvy + mfbab * (one - vy2);
+//                  m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+//                  mfbab = m0;
+//                  mfbbb = m1;
+//                  mfbcb = m2;
+//                  /////////b//////////////////////////////////////////////////////////////////////////
+//                  m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+//                  m1 = -mfbcc - two * mfbbc * vvy + mfbac * (one - vy2);
+//                  m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+//                  mfbac = m0;
+//                  mfbbc = m1;
+//                  mfbcc = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+//                  m1 = -mfcca - two * mfcba * vvy + mfcaa * (one - vy2) - c1o18 * oMdrho * vy2;
+//                  m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+//                  mfcaa = m0;
+//                  mfcba = m1;
+//                  mfcca = m2;
+//                  /////////c//////////////////////////////////////////////////////////////////////////
+//                  m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+//                  m1 = -mfccb - two * mfcbb * vvy + mfcab * (one - vy2) - c2o9 * oMdrho * vy2;
+//                  m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+//                  mfcab = m0;
+//                  mfcbb = m1;
+//                  mfccb = m2;
+//                  /////////c//////////////////////////////////////////////////////////////////////////
+//                  m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+//                  m1 = -mfccc - two * mfcbc * vvy + mfcac * (one - vy2) - c1o18 * oMdrho * vy2;
+//                  m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+//                  mfcac = m0;
+//                  mfcbc = m1;
+//                  mfccc = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  // X - Dir
+//                  m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+//                  m1 = -mfcaa - two * mfbaa * vvx + mfaaa * (one - vx2) - c1o36 * oMdrho * vx2;
+//                  m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+//                  mfaaa = m0;
+//                  mfbaa = m1;
+//                  mfcaa = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+//                  m1 = -mfcba - two * mfbba * vvx + mfaba * (one - vx2) - c1o9 * oMdrho * vx2;
+//                  m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+//                  mfaba = m0;
+//                  mfbba = m1;
+//                  mfcba = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+//                  m1 = -mfcca - two * mfbca * vvx + mfaca * (one - vx2) - c1o36 * oMdrho * vx2;
+//                  m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+//                  mfaca = m0;
+//                  mfbca = m1;
+//                  mfcca = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+//                  m1 = -mfcab - two * mfbab * vvx + mfaab * (one - vx2) - c1o9 * oMdrho * vx2;
+//                  m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+//                  mfaab = m0;
+//                  mfbab = m1;
+//                  mfcab = m2;
+//                  ///////////b////////////////////////////////////////////////////////////////////////
+//                  m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+//                  m1 = -mfcbb - two * mfbbb * vvx + mfabb * (one - vx2) - c4o9 * oMdrho * vx2;
+//                  m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+//                  mfabb = m0;
+//                  mfbbb = m1;
+//                  mfcbb = m2;
+//                  ///////////b////////////////////////////////////////////////////////////////////////
+//                  m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+//                  m1 = -mfccb - two * mfbcb * vvx + mfacb * (one - vx2) - c1o9 * oMdrho * vx2;
+//                  m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+//                  mfacb = m0;
+//                  mfbcb = m1;
+//                  mfccb = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//                  m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+//                  m1 = -mfcac - two * mfbac * vvx + mfaac * (one - vx2) - c1o36 * oMdrho * vx2;
+//                  m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+//                  mfaac = m0;
+//                  mfbac = m1;
+//                  mfcac = m2;
+//                  ///////////c////////////////////////////////////////////////////////////////////////
+//                  m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+//                  m1 = -mfcbc - two * mfbbc * vvx + mfabc * (one - vx2) - c1o9 * oMdrho * vx2;
+//                  m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+//                  mfabc = m0;
+//                  mfbbc = m1;
+//                  mfcbc = m2;
+//                  ///////////c////////////////////////////////////////////////////////////////////////
+//                  m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+//                  m1 = -mfccc - two * mfbcc * vvx + mfacc * (one - vx2) - c1o36 * oMdrho * vx2;
+//                  m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+//                  mfacc = m0;
+//                  mfbcc = m1;
+//                  mfccc = m2;
+//                  ////////////////////////////////////////////////////////////////////////////////////
+//
+//                  //////////////////////////////////////////////////////////////////////////
+//                  //proof correctness
+//                  //////////////////////////////////////////////////////////////////////////
+//#ifdef  PROOF_CORRECTNESS
+//                  LBMReal 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 = fabs(rho - rho_post);
+//                  LBMReal dif = drho - drho_post;
+//#ifdef SINGLEPRECISION
+//                  if (dif > 10.0E-7 || dif < -10.0E-7)
+//#else
+//                  if (dif > 10.0E-15 || dif < -10.0E-15)
+//#endif
+//                  {
+//                     UB_THROW(UbException(UB_EXARGS, "rho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(drho_post)
+//                        + " dif=" + UbSystem::toString(dif)
+//                        + " rho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)
+//                        + " in " + block.lock()->toString() + " step = " + UbSystem::toString(step)));
+//                  }
+//#endif
+//                  //////////////////////////////////////////////////////////////////////////
+//                  //write distribution
+//                  //////////////////////////////////////////////////////////////////////////
+//                  (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = mfabb;
+//                  (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = mfbab;
+//                  (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = mfbba;
+//                  (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = mfaab;
+//                  (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab;
+//                  (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = mfaba;
+//                  (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba;
+//                  (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa;
+//                  (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca;
+//                  (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa;
+//                  (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa;
+//                  (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca;
+//                  (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+//
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac;
+//                  (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac;
+//
+//                  (*this->zeroDistributions)(x1, x2, x3) = mfbbb;
+//                  //////////////////////////////////////////////////////////////////////////
+//
+//               }
+//            }
+//         }
+//      }
+//
+//   }
+//
+//   //timer.stop();
+//}
+//////////////////////////////////////////////////////////////////////////
+double CumulantLBMKernel::getCalculationTime()
+{
+   //return timer.getDuration();
+   return timer.getTotalTime();
+}
+//////////////////////////////////////////////////////////////////////////
+void CumulantLBMKernel::setBulkOmegaToOmega(bool value)
+{
+   bulkOmegaToOmega = value;
+}
+//////////////////////////////////////////////////////////////////////////
+void CumulantLBMKernel::setRelaxationParameter(Parameter p)
+{
+   parameter = p;
+}
+
+void CumulantLBMKernel::initData()
+{
+   //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);
+
+      LBMReal forcingX1 = 0;
+      LBMReal forcingX2 = 0;
+      LBMReal forcingX3 = 0;
+   }
+   localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+   nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+   zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
+   omega = collFactor;
+}
+
+void CumulantLBMKernel::nodeCollision(int step, int x1, int x2, int x3)
+{
+   int x1p = x1 + 1;
+   int x2p = x2 + 1;
+   int x3p = x3 + 1;
+   //////////////////////////////////////////////////////////////////////////
+   //read distribution
+   ////////////////////////////////////////////////////////////////////////////
+   //////////////////////////////////////////////////////////////////////////
+
+   //E   N  T
+   //c   c  c
+   //////////
+   //W   S  B
+   //a   a  a
+
+   //Rest ist b
+
+   //mfxyz
+   //a - negative
+   //b - null
+   //c - positive
+
+   // a b c
+   //-1 0 1
+
+   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->zeroDistributions)(x1, x2, x3);
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   LBMReal drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+      (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+      ((mfabb + mfcbb) + (mfbab + mfbcb)) + (mfbba + mfbbc)) + mfbbb;
+
+   LBMReal rho = one + drho;
+   ////////////////////////////////////////////////////////////////////////////////////
+   LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+      (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+      (mfcbb - mfabb)) / rho;
+   LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+      (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+      (mfbcb - mfbab)) / rho;
+   LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+      (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+      (mfbbc - mfbba)) / rho;
+   ////////////////////////////////////////////////////////////////////////////////////
+
+   //forcing 
+   ///////////////////////////////////////////////////////////////////////////////////////////
+   if (withForcing)
+   {
+      muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1);
+      muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2);
+      muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3);
+
+      forcingX1 = muForcingX1.Eval();
+      forcingX2 = muForcingX2.Eval();
+      forcingX3 = muForcingX3.Eval();
+
+      vvx += forcingX1 * deltaT * 0.5; // X
+      vvy += forcingX2 * deltaT * 0.5; // Y
+      vvz += forcingX3 * deltaT * 0.5; // Z
+   }
+   ///////////////////////////////////////////////////////////////////////////////////////////               
+////////////////////////////////////////////////////////////////////////////////////
+   LBMReal oMdrho = one; // comp special
+   ////////////////////////////////////////////////////////////////////////////////////
+   LBMReal m0, m1, m2;
+   LBMReal vx2;
+   LBMReal vy2;
+   LBMReal vz2;
+   vx2 = vvx * vvx;
+   vy2 = vvy * vvy;
+   vz2 = vvz * vvz;
+   ////////////////////////////////////////////////////////////////////////////////////
+   //LBMReal wadjust;
+   //LBMReal qudricLimitP = 0.01f;// * 0.0001f;
+   //LBMReal qudricLimitM = 0.01f;// * 0.0001f;
+   //LBMReal qudricLimitD = 0.01f;// * 0.001f;
+   //LBMReal s9 = minusomega;
+   //test
+   //s9 = 0.;
+   ////////////////////////////////////////////////////////////////////////////////////
+   //Hin
+   ////////////////////////////////////////////////////////////////////////////////////
+   // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Z - Dir
+   m2 = mfaaa + mfaac;
+   m1 = mfaac - mfaaa;
+   m0 = m2 + mfaab;
+   mfaaa = m0;
+   m0 += c1o36 * oMdrho;
+   mfaab = m1 - m0 * vvz;
+   mfaac = m2 - two * m1 * vvz + vz2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfaba + mfabc;
+   m1 = mfabc - mfaba;
+   m0 = m2 + mfabb;
+   mfaba = m0;
+   m0 += c1o9 * oMdrho;
+   mfabb = m1 - m0 * vvz;
+   mfabc = m2 - two * m1 * vvz + vz2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfaca + mfacc;
+   m1 = mfacc - mfaca;
+   m0 = m2 + mfacb;
+   mfaca = m0;
+   m0 += c1o36 * oMdrho;
+   mfacb = m1 - m0 * vvz;
+   mfacc = m2 - two * m1 * vvz + vz2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfbaa + mfbac;
+   m1 = mfbac - mfbaa;
+   m0 = m2 + mfbab;
+   mfbaa = m0;
+   m0 += c1o9 * oMdrho;
+   mfbab = m1 - m0 * vvz;
+   mfbac = m2 - two * m1 * vvz + vz2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfbba + mfbbc;
+   m1 = mfbbc - mfbba;
+   m0 = m2 + mfbbb;
+   mfbba = m0;
+   m0 += c4o9 * oMdrho;
+   mfbbb = m1 - m0 * vvz;
+   mfbbc = m2 - two * m1 * vvz + vz2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfbca + mfbcc;
+   m1 = mfbcc - mfbca;
+   m0 = m2 + mfbcb;
+   mfbca = m0;
+   m0 += c1o9 * oMdrho;
+   mfbcb = m1 - m0 * vvz;
+   mfbcc = m2 - two * m1 * vvz + vz2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfcaa + mfcac;
+   m1 = mfcac - mfcaa;
+   m0 = m2 + mfcab;
+   mfcaa = m0;
+   m0 += c1o36 * oMdrho;
+   mfcab = m1 - m0 * vvz;
+   mfcac = m2 - two * m1 * vvz + vz2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfcba + mfcbc;
+   m1 = mfcbc - mfcba;
+   m0 = m2 + mfcbb;
+   mfcba = m0;
+   m0 += c1o9 * oMdrho;
+   mfcbb = m1 - m0 * vvz;
+   mfcbc = m2 - two * m1 * vvz + vz2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfcca + mfccc;
+   m1 = mfccc - mfcca;
+   m0 = m2 + mfccb;
+   mfcca = m0;
+   m0 += c1o36 * oMdrho;
+   mfccb = m1 - m0 * vvz;
+   mfccc = m2 - two * m1 * vvz + vz2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   // mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Y - Dir
+   m2 = mfaaa + mfaca;
+   m1 = mfaca - mfaaa;
+   m0 = m2 + mfaba;
+   mfaaa = m0;
+   m0 += c1o6 * oMdrho;
+   mfaba = m1 - m0 * vvy;
+   mfaca = m2 - two * m1 * vvy + vy2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfaab + mfacb;
+   m1 = mfacb - mfaab;
+   m0 = m2 + mfabb;
+   mfaab = m0;
+   mfabb = m1 - m0 * vvy;
+   mfacb = m2 - two * m1 * vvy + vy2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfaac + mfacc;
+   m1 = mfacc - mfaac;
+   m0 = m2 + mfabc;
+   mfaac = m0;
+   m0 += c1o18 * oMdrho;
+   mfabc = m1 - m0 * vvy;
+   mfacc = m2 - two * m1 * vvy + vy2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfbaa + mfbca;
+   m1 = mfbca - mfbaa;
+   m0 = m2 + mfbba;
+   mfbaa = m0;
+   m0 += c2o3 * oMdrho;
+   mfbba = m1 - m0 * vvy;
+   mfbca = m2 - two * m1 * vvy + vy2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfbab + mfbcb;
+   m1 = mfbcb - mfbab;
+   m0 = m2 + mfbbb;
+   mfbab = m0;
+   mfbbb = m1 - m0 * vvy;
+   mfbcb = m2 - two * m1 * vvy + vy2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfbac + mfbcc;
+   m1 = mfbcc - mfbac;
+   m0 = m2 + mfbbc;
+   mfbac = m0;
+   m0 += c2o9 * oMdrho;
+   mfbbc = m1 - m0 * vvy;
+   mfbcc = m2 - two * m1 * vvy + vy2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfcaa + mfcca;
+   m1 = mfcca - mfcaa;
+   m0 = m2 + mfcba;
+   mfcaa = m0;
+   m0 += c1o6 * oMdrho;
+   mfcba = m1 - m0 * vvy;
+   mfcca = m2 - two * m1 * vvy + vy2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfcab + mfccb;
+   m1 = mfccb - mfcab;
+   m0 = m2 + mfcbb;
+   mfcab = m0;
+   mfcbb = m1 - m0 * vvy;
+   mfccb = m2 - two * m1 * vvy + vy2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfcac + mfccc;
+   m1 = mfccc - mfcac;
+   m0 = m2 + mfcbc;
+   mfcac = m0;
+   m0 += c1o18 * oMdrho;
+   mfcbc = m1 - m0 * vvy;
+   mfccc = m2 - two * m1 * vvy + vy2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   // mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9		Konditionieren
+   ////////////////////////////////////////////////////////////////////////////////////
+   // X - Dir
+   m2 = mfaaa + mfcaa;
+   m1 = mfcaa - mfaaa;
+   m0 = m2 + mfbaa;
+   mfaaa = m0;
+   m0 += one * oMdrho;
+   mfbaa = m1 - m0 * vvx;
+   mfcaa = m2 - two * m1 * vvx + vx2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfaba + mfcba;
+   m1 = mfcba - mfaba;
+   m0 = m2 + mfbba;
+   mfaba = m0;
+   mfbba = m1 - m0 * vvx;
+   mfcba = m2 - two * m1 * vvx + vx2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfaca + mfcca;
+   m1 = mfcca - mfaca;
+   m0 = m2 + mfbca;
+   mfaca = m0;
+   m0 += c1o3 * oMdrho;
+   mfbca = m1 - m0 * vvx;
+   mfcca = m2 - two * m1 * vvx + vx2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfaab + mfcab;
+   m1 = mfcab - mfaab;
+   m0 = m2 + mfbab;
+   mfaab = m0;
+   mfbab = m1 - m0 * vvx;
+   mfcab = m2 - two * m1 * vvx + vx2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfabb + mfcbb;
+   m1 = mfcbb - mfabb;
+   m0 = m2 + mfbbb;
+   mfabb = m0;
+   mfbbb = m1 - m0 * vvx;
+   mfcbb = m2 - two * m1 * vvx + vx2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfacb + mfccb;
+   m1 = mfccb - mfacb;
+   m0 = m2 + mfbcb;
+   mfacb = m0;
+   mfbcb = m1 - m0 * vvx;
+   mfccb = m2 - two * m1 * vvx + vx2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfaac + mfcac;
+   m1 = mfcac - mfaac;
+   m0 = m2 + mfbac;
+   mfaac = m0;
+   m0 += c1o3 * oMdrho;
+   mfbac = m1 - m0 * vvx;
+   mfcac = m2 - two * m1 * vvx + vx2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfabc + mfcbc;
+   m1 = mfcbc - mfabc;
+   m0 = m2 + mfbbc;
+   mfabc = m0;
+   mfbbc = m1 - m0 * vvx;
+   mfcbc = m2 - two * m1 * vvx + vx2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m2 = mfacc + mfccc;
+   m1 = mfccc - mfacc;
+   m0 = m2 + mfbcc;
+   mfacc = m0;
+   m0 += c1o9 * oMdrho;
+   mfbcc = m1 - m0 * vvx;
+   mfccc = m2 - two * m1 * vvx + vx2 * m0;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+
+
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Cumulants
+   ////////////////////////////////////////////////////////////////////////////////////
+
+   //LBMReal OxxPyyPzz = one; // bulk viscosity
+
+   ////////////////////////////////////////////////////////////
+   //3.
+   //////////////////////////////
+   LBMReal OxyyPxzz = one;//three  * (two - omega) / (three  - omega);//
+   //LBMReal OxyyMxzz = one;//six    * (two - omega) / (six    - omega);//
+   LBMReal Oxyz = one;//twelve * (two - omega) / (twelve + omega);//
+   //////////////////////////////
+   //LBMReal OxyyPxzz  = two-omega;//
+   //LBMReal OxyyMxzz  = two-omega;//
+   //////////////////////////////
+   //LBMReal OxyyPxzz  = (eight * (omega - two)) / (omega - eight);//Ginzburg
+   //LBMReal OxyyMxzz  = (eight * (omega - two)) / (omega - eight);//Ginzburg
+   //////////////////////////////
+   //LBMReal OxyyPxzz  = omega;//BGK
+   //LBMReal OxyyMxzz  = omega;//BGK
+   //////////////////////////////
+   //LBMReal OxyyPxzz  = (one + omega) / two;//1P5
+   //LBMReal OxyyMxzz  = (one + omega) / two;//1P5
+   //////////////////////////////
+   //LBMReal OxyyPxzz  = (three - omega) / two;//0P5
+   //LBMReal OxyyMxzz  = (three - omega) / two;//0P5
+   //////////////////////////////
+   //LBMReal OxyyPxzz  = (one + (eight * (omega - two)) / (omega - eight)) / two;//one + Ginzburg / two ... Car
+   //LBMReal OxyyMxzz  = (one + (eight * (omega - two)) / (omega - eight)) / two;//one + Ginzburg / two ... Car
+   ////////////////////////////////////////////////////////////
+   //4.
+   //////////////////////////////
+   LBMReal O4 = one;
+   //////////////////////////////
+   //LBMReal O4        = omega;//TRT
+   ////////////////////////////////////////////////////////////
+   //5.
+   //////////////////////////////
+   LBMReal O5 = one;
+   ////////////////////////////////////////////////////////////
+   //6.
+   //////////////////////////////
+   LBMReal O6 = one;
+   ////////////////////////////////////////////////////////////
+
+
+   //central moments to cumulants
+   //4.
+   LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + two * mfbba * mfbab) / rho;	//ab 15.05.2015 verwendet
+   LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + two * mfbba * mfabb) / rho; //ab 15.05.2015 verwendet
+   LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + two * mfbab * mfabb) / rho; //ab 15.05.2015 verwendet
+
+   LBMReal CUMcca = mfcca - (((mfcaa * mfaca + two * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9 * (drho / rho));
+   LBMReal CUMcac = mfcac - (((mfcaa * mfaac + two * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9 * (drho / rho));
+   LBMReal CUMacc = mfacc - (((mfaac * mfaca + two * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9 * (drho / rho));
+
+   //5.
+   LBMReal CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + four * mfabb * mfbbb + two * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
+   LBMReal CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + four * mfbab * mfbbb + two * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
+   LBMReal CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + four * mfbba * mfbbb + two * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
+
+   //6.
+
+   LBMReal CUMccc = mfccc + ((-four * mfbbb * mfbbb
+      - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+      - four * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+      - two * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
+      + (four * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+         + two * (mfcaa * mfaca * mfaac)
+         + sixteen * mfbba * mfbab * mfabb) / (rho * rho)
+      - c1o3 * (mfacc + mfcac + mfcca) / rho
+      - c1o9 * (mfcaa + mfaca + mfaac) / rho
+      + (two * (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)));
+   //+ c1o27*(one -three/rho +two/(rho*rho)));
+
+
+
+
+//2.
+// linear combinations
+   LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+   LBMReal mxxMyy = mfcaa - mfaca;
+   LBMReal mxxMzz = mfcaa - mfaac;
+
+   //////////////////////////////////////////////////////////////////////////
+// 			LBMReal magicBulk=(CUMacc+CUMcac+CUMcca)*(one/OxxPyyPzz-c1o2)*c3o2*8.;
+
+         //////////////////////////////////////////////////////////////////////////
+         //limiter-Scheise Teil 1
+         //LBMReal oxxyy,oxxzz,oxy,oxz,oyz;
+         //LBMReal smag=0.001;
+         //oxxyy    = omega+(one-omega)*fabs(mxxMyy)/(fabs(mxxMyy)+smag);
+         //oxxzz    = omega+(one-omega)*fabs(mxxMzz)/(fabs(mxxMzz)+smag);
+         //oxy      = omega+(one-omega)*fabs(mfbba)/(fabs(mfbba)+smag);
+         //oxz      = omega+(one-omega)*fabs(mfbab)/(fabs(mfbab)+smag);
+         //oyz      = omega+(one-omega)*fabs(mfabb)/(fabs(mfabb)+smag);
+
+         ////////////////////////////////////////////////////////////////////////////
+         ////Teil 1b
+         //LBMReal constante = 1000.0;
+         //LBMReal nuEddi = constante * fabs(mxxPyyPzz);
+         //LBMReal omegaLimit = one / (one / omega + three * nuEddi);
+
+         //{
+         //	LBMReal dxux = c1o2 * (-omegaLimit) *(mxxMyy + mxxMzz) +  OxxPyyPzz * (mfaaa - mxxPyyPzz);
+         //	LBMReal dyuy = dxux + omegaLimit * c3o2 * mxxMyy;
+         //	LBMReal dzuz = dxux + omegaLimit * c3o2 * mxxMzz;
+
+            ////relax
+            //mxxPyyPzz += OxxPyyPzz*(mfaaa  - mxxPyyPzz)- three * (one - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+            //mxxMyy    += omegaLimit * (-mxxMyy) - three * (one + c1o2 * (-omegaLimit)) * (vx2 * dxux + vy2 * dyuy);
+            //mxxMzz    += omegaLimit * (-mxxMzz) - three * (one + c1o2 * (-omegaLimit)) * (vx2 * dxux + vz2 * dzuz);
+
+         //}
+         //mfabb     += omegaLimit * (-mfabb);
+         //mfbab     += omegaLimit * (-mfbab);
+         //mfbba     += omegaLimit * (-mfbba);
+         ////////////////////////////////////////////////////////////////////////////
+
+         ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+         //incl. correction		(hat noch nicht so gut funktioniert...Optimierungsbedarf??)
+   {
+      LBMReal dxux = c1o2 * (-omega) * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz);
+      LBMReal dyuy = dxux + omega * c3o2 * mxxMyy;
+      LBMReal dzuz = dxux + omega * c3o2 * mxxMzz;
+
+      //relax
+      mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - three * (one - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz;
+      mxxMyy += omega * (-mxxMyy) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy);
+      mxxMzz += omega * (-mxxMzz) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz);
+
+      //////////////////////////////////////////////////////////////////////////
+      //limiter-Scheise Teil 2
+      //mxxMyy    += oxxyy * (-mxxMyy) - three * (one + c1o2 * (-omega)) * (vx2 * dxux + vy2 * dyuy);
+      //mxxMzz    += oxxzz * (-mxxMzz) - three * (one + 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);
+
+   //////////////////////////////////////////////////////////////////////////
+   //limiter-Scheise Teil 3
+   //mfabb     += oyz * (-mfabb);
+   //mfbab     += oxz * (-mfbab);
+   //mfbba     += oxy * (-mfbba);
+   //////////////////////////////////////////////////////////////////////////
+
+   // linear combinations back
+   mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+   mfaca = c1o3 * (-two * mxxMyy + mxxMzz + mxxPyyPzz);
+   mfaac = c1o3 * (mxxMyy - two * mxxMzz + mxxPyyPzz);
+
+   //3.
+   // linear combinations
+
+   LBMReal mxxyPyzz = mfcba + mfabc;
+   LBMReal mxxyMyzz = mfcba - mfabc;
+
+   LBMReal mxxzPyyz = mfcab + mfacb;
+   LBMReal mxxzMyyz = mfcab - mfacb;
+
+   LBMReal mxyyPxzz = mfbca + mfbac;
+   LBMReal mxyyMxzz = mfbca - mfbac;
+
+   //relax
+   //////////////////////////////////////////////////////////////////////////
+   //das ist der limiter
+   //wadjust = Oxyz+(one-Oxyz)*fabs(mfbbb)/(fabs(mfbbb)+qudricLimitD);
+   //mfbbb += wadjust * (-mfbbb);
+   //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxxyPyzz)/(fabs(mxxyPyzz)+qudricLimitP);
+   //mxxyPyzz += wadjust * (-mxxyPyzz);
+   //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxxyMyzz)/(fabs(mxxyMyzz)+qudricLimitM);
+   //mxxyMyzz += wadjust * (-mxxyMyzz);
+   //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxxzPyyz)/(fabs(mxxzPyyz)+qudricLimitP);
+   //mxxzPyyz += wadjust * (-mxxzPyyz);
+   //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxxzMyyz)/(fabs(mxxzMyyz)+qudricLimitM);
+   //mxxzMyyz += wadjust * (-mxxzMyyz);
+   //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxyyPxzz)/(fabs(mxyyPxzz)+qudricLimitP);
+   //mxyyPxzz += wadjust * (-mxyyPxzz);
+   //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxyyMxzz)/(fabs(mxyyMxzz)+qudricLimitM);
+   //mxyyMxzz += wadjust * (-mxyyMxzz);
+   //////////////////////////////////////////////////////////////////////////
+   //ohne limiter
+   mfbbb += OxyyMxzz * (-mfbbb);
+   mxxyPyzz += OxyyPxzz * (-mxxyPyzz);
+   mxxyMyzz += OxyyMxzz * (-mxxyMyzz);
+   mxxzPyyz += OxyyPxzz * (-mxxzPyyz);
+   mxxzMyyz += OxyyMxzz * (-mxxzMyyz);
+   mxyyPxzz += OxyyPxzz * (-mxyyPxzz);
+   mxyyMxzz += OxyyMxzz * (-mxyyMxzz);
+   //////////////////////////////////////////////////////////////////////////
+
+   //// linear combinations back
+   mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+   mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+   mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+   mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+   mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+   mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+
+   //4.
+   //////////////////////////////////////////////////////////////////////////
+   //mit limiter
+//	wadjust    = O4+(one-O4)*fabs(CUMacc)/(fabs(CUMacc)+qudricLimit);
+   //CUMacc    += wadjust * (-CUMacc);
+//	wadjust    = O4+(one-O4)*fabs(CUMcac)/(fabs(CUMcac)+qudricLimit);
+   //CUMcac    += wadjust * (-CUMcac); 
+//	wadjust    = O4+(one-O4)*fabs(CUMcca)/(fabs(CUMcca)+qudricLimit);
+   //CUMcca    += wadjust * (-CUMcca); 
+
+//	wadjust    = O4+(one-O4)*fabs(CUMbbc)/(fabs(CUMbbc)+qudricLimit);
+   //CUMbbc    += wadjust * (-CUMbbc); 
+//	wadjust    = O4+(one-O4)*fabs(CUMbcb)/(fabs(CUMbcb)+qudricLimit);
+   //CUMbcb    += wadjust * (-CUMbcb); 
+//	wadjust    = O4+(one-O4)*fabs(CUMcbb)/(fabs(CUMcbb)+qudricLimit);
+   //CUMcbb    += wadjust * (-CUMcbb); 
+   //////////////////////////////////////////////////////////////////////////
+   //ohne limiter
+   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 + two * mfbba * mfbab) / rho;
+   mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + two * mfbba * mfabb) / rho;
+   mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + two * mfbab * mfabb) / rho;
+
+   mfcca = CUMcca + (((mfcaa * mfaca + two * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9 * (drho / rho));//(one/rho-one));
+   mfcac = CUMcac + (((mfcaa * mfaac + two * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9 * (drho / rho));//(one/rho-one));
+   mfacc = CUMacc + (((mfaac * mfaca + two * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9 * (drho / rho));//(one/rho-one));
+
+   //5.
+   mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + four * mfabb * mfbbb + two * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
+   mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + four * mfbab * mfbbb + two * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
+   mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + four * mfbba * mfbbb + two * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
+
+   //6.
+
+   mfccc = CUMccc - ((-four * mfbbb * mfbbb
+      - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+      - four * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+      - two * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
+      + (four * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+         + two * (mfcaa * mfaca * mfaac)
+         + sixteen * mfbba * mfbab * mfabb) / (rho * rho)
+      - c1o3 * (mfacc + mfcac + mfcca) / rho
+      - c1o9 * (mfcaa + mfaca + mfaac) / rho
+      + (two * (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)));
+   ////////////////////////////////////////////////////////////////////////////////////
+   //forcing
+   mfbaa = -mfbaa;
+   mfaba = -mfaba;
+   mfaab = -mfaab;
+   //////////////////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////////////////
+//back
+////////////////////////////////////////////////////////////////////////////////////
+//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+////////////////////////////////////////////////////////////////////////////////////
+// Z - Dir
+   m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + one * oMdrho) * (vz2 - vvz) * c1o2;
+   m1 = -mfaac - two * mfaab * vvz + mfaaa * (one - vz2) - one * oMdrho * vz2;
+   m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + one * oMdrho) * (vz2 + vvz) * c1o2;
+   mfaaa = m0;
+   mfaab = m1;
+   mfaac = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+   m1 = -mfabc - two * mfabb * vvz + mfaba * (one - vz2);
+   m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+   mfaba = m0;
+   mfabb = m1;
+   mfabc = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+   m1 = -mfacc - two * mfacb * vvz + mfaca * (one - vz2) - c1o3 * oMdrho * vz2;
+   m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+   mfaca = m0;
+   mfacb = m1;
+   mfacc = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+   m1 = -mfbac - two * mfbab * vvz + mfbaa * (one - vz2);
+   m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+   mfbaa = m0;
+   mfbab = m1;
+   mfbac = m2;
+   /////////b//////////////////////////////////////////////////////////////////////////
+   m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+   m1 = -mfbbc - two * mfbbb * vvz + mfbba * (one - vz2);
+   m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+   mfbba = m0;
+   mfbbb = m1;
+   mfbbc = m2;
+   /////////b//////////////////////////////////////////////////////////////////////////
+   m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+   m1 = -mfbcc - two * mfbcb * vvz + mfbca * (one - vz2);
+   m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+   mfbca = m0;
+   mfbcb = m1;
+   mfbcc = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+   m1 = -mfcac - two * mfcab * vvz + mfcaa * (one - vz2) - c1o3 * oMdrho * vz2;
+   m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+   mfcaa = m0;
+   mfcab = m1;
+   mfcac = m2;
+   /////////c//////////////////////////////////////////////////////////////////////////
+   m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+   m1 = -mfcbc - two * mfcbb * vvz + mfcba * (one - vz2);
+   m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+   mfcba = m0;
+   mfcbb = m1;
+   mfcbc = m2;
+   /////////c//////////////////////////////////////////////////////////////////////////
+   m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+   m1 = -mfccc - two * mfccb * vvz + mfcca * (one - vz2) - c1o9 * oMdrho * vz2;
+   m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+   mfcca = m0;
+   mfccb = m1;
+   mfccc = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+   ////////////////////////////////////////////////////////////////////////////////////
+   // Y - Dir
+   m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+   m1 = -mfaca - two * mfaba * vvy + mfaaa * (one - vy2) - c1o6 * oMdrho * vy2;
+   m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+   mfaaa = m0;
+   mfaba = m1;
+   mfaca = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+   m1 = -mfacb - two * mfabb * vvy + mfaab * (one - vy2) - c2o3 * oMdrho * vy2;
+   m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+   mfaab = m0;
+   mfabb = m1;
+   mfacb = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+   m1 = -mfacc - two * mfabc * vvy + mfaac * (one - vy2) - c1o6 * oMdrho * vy2;
+   m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+   mfaac = m0;
+   mfabc = m1;
+   mfacc = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+   m1 = -mfbca - two * mfbba * vvy + mfbaa * (one - vy2);
+   m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+   mfbaa = m0;
+   mfbba = m1;
+   mfbca = m2;
+   /////////b//////////////////////////////////////////////////////////////////////////
+   m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+   m1 = -mfbcb - two * mfbbb * vvy + mfbab * (one - vy2);
+   m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+   mfbab = m0;
+   mfbbb = m1;
+   mfbcb = m2;
+   /////////b//////////////////////////////////////////////////////////////////////////
+   m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+   m1 = -mfbcc - two * mfbbc * vvy + mfbac * (one - vy2);
+   m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+   mfbac = m0;
+   mfbbc = m1;
+   mfbcc = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+   m1 = -mfcca - two * mfcba * vvy + mfcaa * (one - vy2) - c1o18 * oMdrho * vy2;
+   m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+   mfcaa = m0;
+   mfcba = m1;
+   mfcca = m2;
+   /////////c//////////////////////////////////////////////////////////////////////////
+   m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+   m1 = -mfccb - two * mfcbb * vvy + mfcab * (one - vy2) - c2o9 * oMdrho * vy2;
+   m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+   mfcab = m0;
+   mfcbb = m1;
+   mfccb = m2;
+   /////////c//////////////////////////////////////////////////////////////////////////
+   m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+   m1 = -mfccc - two * mfcbc * vvy + mfcac * (one - vy2) - c1o18 * oMdrho * vy2;
+   m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+   mfcac = m0;
+   mfcbc = m1;
+   mfccc = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+   ////////////////////////////////////////////////////////////////////////////////////
+   // X - Dir
+   m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+   m1 = -mfcaa - two * mfbaa * vvx + mfaaa * (one - vx2) - c1o36 * oMdrho * vx2;
+   m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+   mfaaa = m0;
+   mfbaa = m1;
+   mfcaa = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+   m1 = -mfcba - two * mfbba * vvx + mfaba * (one - vx2) - c1o9 * oMdrho * vx2;
+   m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+   mfaba = m0;
+   mfbba = m1;
+   mfcba = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+   m1 = -mfcca - two * mfbca * vvx + mfaca * (one - vx2) - c1o36 * oMdrho * vx2;
+   m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+   mfaca = m0;
+   mfbca = m1;
+   mfcca = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+   m1 = -mfcab - two * mfbab * vvx + mfaab * (one - vx2) - c1o9 * oMdrho * vx2;
+   m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+   mfaab = m0;
+   mfbab = m1;
+   mfcab = m2;
+   ///////////b////////////////////////////////////////////////////////////////////////
+   m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+   m1 = -mfcbb - two * mfbbb * vvx + mfabb * (one - vx2) - c4o9 * oMdrho * vx2;
+   m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+   mfabb = m0;
+   mfbbb = m1;
+   mfcbb = m2;
+   ///////////b////////////////////////////////////////////////////////////////////////
+   m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+   m1 = -mfccb - two * mfbcb * vvx + mfacb * (one - vx2) - c1o9 * oMdrho * vx2;
+   m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+   mfacb = m0;
+   mfbcb = m1;
+   mfccb = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+   ////////////////////////////////////////////////////////////////////////////////////
+   m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+   m1 = -mfcac - two * mfbac * vvx + mfaac * (one - vx2) - c1o36 * oMdrho * vx2;
+   m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+   mfaac = m0;
+   mfbac = m1;
+   mfcac = m2;
+   ///////////c////////////////////////////////////////////////////////////////////////
+   m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+   m1 = -mfcbc - two * mfbbc * vvx + mfabc * (one - vx2) - c1o9 * oMdrho * vx2;
+   m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+   mfabc = m0;
+   mfbbc = m1;
+   mfcbc = m2;
+   ///////////c////////////////////////////////////////////////////////////////////////
+   m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+   m1 = -mfccc - two * mfbcc * vvx + mfacc * (one - vx2) - c1o36 * oMdrho * vx2;
+   m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+   mfacc = m0;
+   mfbcc = m1;
+   mfccc = m2;
+   ////////////////////////////////////////////////////////////////////////////////////
+
+   //////////////////////////////////////////////////////////////////////////
+   //proof correctness
+   //////////////////////////////////////////////////////////////////////////
+#ifdef  PROOF_CORRECTNESS
+   LBMReal 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 = fabs(rho - rho_post);
+   LBMReal dif = drho - drho_post;
+#ifdef SINGLEPRECISION
+   if (dif > 10.0E-7 || dif < -10.0E-7)
+#else
+   if (dif > 10.0E-15 || dif < -10.0E-15)
+#endif
+   {
+      UB_THROW(UbException(UB_EXARGS, "rho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(drho_post)
+         + " dif=" + UbSystem::toString(dif)
+         + " rho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)
+         + " in " + block.lock()->toString() + " step = " + UbSystem::toString(step)));
+   }
+#endif
+   //////////////////////////////////////////////////////////////////////////
+   //write distribution
+   //////////////////////////////////////////////////////////////////////////
+   (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = mfabb;
+   (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = mfbab;
+   (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = mfbba;
+   (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = mfaab;
+   (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab;
+   (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = mfaba;
+   (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba;
+   (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa;
+   (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca;
+   (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa;
+   (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa;
+   (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca;
+   (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+   (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb;
+   (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb;
+   (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc;
+   (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb;
+   (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb;
+   (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc;
+   (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc;
+   (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc;
+   (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac;
+   (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+   (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc;
+   (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac;
+   (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac;
+
+   (*this->zeroDistributions)(x1, x2, x3) = mfbbb;
+   //////////////////////////////////////////////////////////////////////////
+}
diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h
new file mode 100644
index 000000000..b75b13031
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h
@@ -0,0 +1,55 @@
+#ifndef CumulantLBMKernel_h__
+#define CumulantLBMKernel_h__
+
+#include "BasicLBMKernel.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 CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model
+//! \author  K. Kutscher, M. Geier
+class CumulantLBMKernel : public BasicLBMKernel
+{
+public:
+   //! This option set relaxation parameter: NORMAL  
+   enum Parameter { NORMAL, MAGIC };
+public:
+   CumulantLBMKernel();
+   virtual ~CumulantLBMKernel(void);
+   //virtual void calculate(int step);
+   SPtr<LBMKernel> clone();
+   double getCalculationTime();
+   void setBulkOmegaToOmega(bool value);
+   void setRelaxationParameter(Parameter p);
+protected:
+   void initData() override;
+   void nodeCollision(int step, int x1, int x2, int x3) override;
+   void initDataSet();
+   LBMReal f[D3Q27System::ENDF + 1];
+
+   UbTimer timer;
+
+   LBMReal OxyyMxzz;
+   Parameter parameter;
+
+   CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions;
+   CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions;
+   CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributions;
+
+   mu::value_type muX1, muX2, muX3;
+   mu::value_type muDeltaT;
+   mu::value_type muNu;
+   LBMReal forcingX1;
+   LBMReal forcingX2;
+   LBMReal forcingX3;
+
+   // bulk viscosity
+   bool bulkOmegaToOmega;
+   LBMReal OxxPyyPzz;
+
+   LBMReal omega;
+};
+#endif // CumulantLBMKernel_h__
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
index 1376e0da6..d94a7f37d 100644
--- a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
+++ b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
@@ -35,784 +35,1146 @@
 #define D3Q27SYSTEM_H
 
 #include <cmath>
-#include <iostream>
 #include <string>
+#include <iostream>
+
+#ifdef RCF_USE_SF_SERIALIZATION
+   #include <SF/Serializer.hpp>
 
+   #if CAB_RCF <= 903
+      #include <SF/SerializeEnum.hpp>   
+   #endif
+#endif //RCF_USE_SF_SERIALIZATION
+
+#include <basics/utilities/UbException.h>
+#include <basics/utilities/UbTuple.h>
+#include <basics/utilities/UbMath.h>
+#include <basics/utilities/UbSystem.h>
+//#include "Patch3DSystem.h"
 #include "LBMSystem.h"
-#include "UbException.h"
-#include "UbMath.h"
-
-//! \brief namespace for global system-functions
-namespace D3Q27System
-{
-//////////////////////////////////////////////////////////////////////////
-// DIRECTION STUFF
-static const int FSTARTDIR = 0;
-static const int FENDDIR   = 25; // D3Q27
-
-static const int STARTF = 0;
-static const int ENDF   = 26; // D3Q27
-
-static const int STARTDIR = 0;
-static const int ENDDIR   = 26;
-
-extern const int DX1[ENDDIR + 1];
-extern const int DX2[ENDDIR + 1];
-extern const int DX3[ENDDIR + 1];
-extern const double WEIGTH[ENDDIR + 1];
-
-extern const double cNorm[3][ENDDIR];
-
-// static const int ZERO /*f0 */ = 0;
-// static const int E    /*f1 */ = 1;
-// static const int W    /*f2 */ = 2;
-// static const int N    /*f3 */ = 3;
-// static const int S    /*f4 */ = 4;
-// static const int T    /*f5 */ = 5;
-// static const int B    /*f6 */ = 6;
-// static const int NE   /*f7 */ = 7;
-// static const int SW   /*f8 */ = 8;
-// static const int SE   /*f9 */ = 9;
-// static const int NW   /*f10*/ = 10;
-// static const int TE   /*f11*/ = 11;
-// static const int BW   /*f12*/ = 12;
-// static const int BE   /*f13*/ = 13;
-// static const int TW   /*f14*/ = 14;
-// static const int TN   /*f15*/ = 15;
-// static const int BS   /*f16*/ = 16;
-// static const int BN   /*f17*/ = 17;
-// static const int TS   /*f18*/ = 18;
-// static const int TNE          = 19;
-// static const int TNW          = 20;
-// static const int TSE          = 21;
-// static const int TSW          = 22;
-// static const int BNE          = 23;
-// static const int BNW          = 24;
-// static const int BSE          = 25;
-// static const int BSW          = 26;
-
-static const int E /*f1 */    = 0;
-static const int W /*f2 */    = 1;
-static const int N /*f3 */    = 2;
-static const int S /*f4 */    = 3;
-static const int T /*f5 */    = 4;
-static const int B /*f6 */    = 5;
-static const int NE /*f7 */   = 6;
-static const int SW /*f8 */   = 7;
-static const int SE /*f9 */   = 8;
-static const int NW /*f10*/   = 9;
-static const int TE /*f11*/   = 10;
-static const int BW /*f12*/   = 11;
-static const int BE /*f13*/   = 12;
-static const int TW /*f14*/   = 13;
-static const int TN /*f15*/   = 14;
-static const int BS /*f16*/   = 15;
-static const int BN /*f17*/   = 16;
-static const int TS /*f18*/   = 17;
-static const int TNE          = 18;
-static const int TNW          = 19;
-static const int TSE          = 20;
-static const int TSW          = 21;
-static const int BNE          = 22;
-static const int BNW          = 23;
-static const int BSE          = 24;
-static const int BSW          = 25;
-static const int ZERO /*f0 */ = 26;
-
-static const int INV_E   = W;
-static const int INV_W   = E;
-static const int INV_N   = S;
-static const int INV_S   = N;
-static const int INV_T   = B;
-static const int INV_B   = T;
-static const int INV_NE  = SW;
-static const int INV_SW  = NE;
-static const int INV_SE  = NW;
-static const int INV_NW  = SE;
-static const int INV_TE  = BW;
-static const int INV_BW  = TE;
-static const int INV_BE  = TW;
-static const int INV_TW  = BE;
-static const int INV_TN  = BS;
-static const int INV_BS  = TN;
-static const int INV_BN  = TS;
-static const int INV_TS  = BN;
-static const int INV_TNE = BSW;
-static const int INV_TNW = BSE;
-static const int INV_TSE = BNW;
-static const int INV_TSW = BNE;
-static const int INV_BNE = TSW;
-static const int INV_BNW = TSE;
-static const int INV_BSE = TNW;
-static const int INV_BSW = TNE;
-
-extern const int INVDIR[ENDDIR + 1];
-
-static const int ET_E   = 0;
-static const int ET_W   = 0;
-static const int ET_N   = 1;
-static const int ET_S   = 1;
-static const int ET_T   = 2;
-static const int ET_B   = 2;
-static const int ET_NE  = 3;
-static const int ET_SW  = 3;
-static const int ET_SE  = 4;
-static const int ET_NW  = 4;
-static const int ET_TE  = 5;
-static const int ET_BW  = 5;
-static const int ET_BE  = 6;
-static const int ET_TW  = 6;
-static const int ET_TN  = 7;
-static const int ET_BS  = 7;
-static const int ET_BN  = 8;
-static const int ET_TS  = 8;
-static const int ET_TNE = 9;
-static const int ET_BSW = 9;
-static const int ET_TNW = 10;
-static const int ET_BSE = 10;
-static const int ET_TSE = 11;
-static const int ET_BNW = 11;
-static const int ET_TSW = 12;
-static const int ET_BNE = 12;
-
-static const int M_RHO     = 0;
-static const int M_EN      = 1;
-static const int M_EPS     = 2;
-static const int M_JX1     = 3;
-static const int M_QX1     = 4;
-static const int M_JX2     = 5;
-static const int M_QX2     = 6;
-static const int M_JX3     = 7;
-static const int M_QX3     = 8;
-static const int M_3PX1X1  = 9;
-static const int M_3PIX1X1 = 10;
-static const int M_PWW     = 11;
-static const int M_PIWW    = 12;
-static const int M_PX1X2   = 13;
-static const int M_PX2X3   = 14;
-static const int M_PX1X3   = 15;
-static const int M_MX1     = 16;
-static const int M_MX2     = 17;
-static const int M_MX3     = 18;
-
-static const int STARTM = 0;
-static const int ENDM   = 18; // D3Q27
-
-//////////////////////////////////////////////////////////////////////////
-// 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[ZERO];
-}
-/*=====================================================================*/
-// ATTENTION: does not apply to all models -> use certificate instead of static! to do
-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]));
-}
-/*=====================================================================*/
-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]));
-}
-/*=====================================================================*/
-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]));
-}
-/*=====================================================================*/
-static void calcDensity(const LBMReal *const &f /*[27]*/, LBMReal &rho)
-{
-    rho = ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) +
-          (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) +
-           ((f[BN] + f[TS]) + (f[TN] + f[BS]))) +
-          ((f[E] + f[W]) + (f[N] + f[S]) + (f[T] + f[B])) + f[ZERO];
-}
-/*=====================================================================*/
-static void calcIncompVelocityX1(const LBMReal *const &f /*[27]*/, LBMReal &vx1)
-{
-    vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
-           (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W]));
-}
-/*=====================================================================*/
-static void calcIncompVelocityX2(const LBMReal *const &f /*[27]*/, LBMReal &vx2)
-{
-    vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
-           (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S]));
-}
-/*=====================================================================*/
-static void calcIncompVelocityX3(const LBMReal *const &f /*[27]*/, LBMReal &vx3)
-{
-    vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
-           (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B]));
-}
-/*=====================================================================*/
-static LBMReal getCompVelocityX1(const LBMReal *const &f /*[27]*/)
-{
-    return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
-            (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])) /
-           getDensity(f);
-}
-/*=====================================================================*/
-static LBMReal getCompVelocityX2(const LBMReal *const &f /*[27]*/)
-{
-    return ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
-            (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])) /
-           getDensity(f);
-}
-/*=====================================================================*/
-static LBMReal getCompVelocityX3(const LBMReal *const &f /*[27]*/)
-{
-    return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
-            (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])) /
-           getDensity(f);
-}
-/*=====================================================================*/
-static void calcCompVelocityX1(const LBMReal *const &f /*[27]*/, LBMReal &vx1)
-{
-    vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
-           (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])) /
-          getDensity(f);
-}
-/*=====================================================================*/
-static void calcCompVelocityX2(const LBMReal *const &f /*[27]*/, LBMReal &vx2)
-{
-    vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
-           (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])) /
-          getDensity(f);
-}
-/*=====================================================================*/
-static void calcCompVelocityX3(const LBMReal *const &f /*[27]*/, LBMReal &vx3)
-{
-    vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
-           (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])) /
-          getDensity(f);
-}
-/*=====================================================================*/
-static void calcIncompMacroscopicValues(const LBMReal *const &f /*[27]*/, LBMReal &rho, LBMReal &vx1, LBMReal &vx2,
-                                        LBMReal &vx3)
-{
-    D3Q27System::calcDensity(f, rho);
-    D3Q27System::calcIncompVelocityX1(f, vx1);
-    D3Q27System::calcIncompVelocityX2(f, vx2);
-    D3Q27System::calcIncompVelocityX3(f, vx3);
-}
-
-/*=====================================================================*/
-static void calcCompMacroscopicValues(const LBMReal *const &f /*[27]*/, LBMReal &drho, LBMReal &vx1, LBMReal &vx2,
-                                      LBMReal &vx3)
-{
-    D3Q27System::calcDensity(f, drho);
-    D3Q27System::calcIncompVelocityX1(f, vx1);
-    D3Q27System::calcIncompVelocityX2(f, vx2);
-    D3Q27System::calcIncompVelocityX3(f, vx3);
-    LBMReal rho = drho + UbMath::c1;
-    vx1 /= rho;
-    vx2 /= rho;
-    vx3 /= rho;
-}
-//////////////////////////////////////////////////////////////////////////
-static LBMReal getCompFeqForDirection(const int &direction, const LBMReal &drho, const LBMReal &vx1, const LBMReal &vx2,
-                                      const LBMReal &vx3)
-{
-    using namespace UbMath;
-    LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
-
-    ////-----
-    LBMReal rho = drho + c1;
-    switch (direction) {
-        case ZERO:
-            return REAL_CAST(c8o27 * (drho + rho * (-cu_sq)));
-        case E:
-            return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq)));
-        case W:
-            return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq)));
-        case N:
-            return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq)));
-        case S:
-            return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq)));
-        case T:
-            return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq)));
-        case B:
-            return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq)));
-        case NE:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)));
-        case SW:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)));
-        case SE:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)));
-        case NW:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)));
-        case TE:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)));
-        case BW:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)));
-        case BE:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)));
-        case TW:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)));
-        case TN:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)));
-        case BS:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)));
-        case BN:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)));
-        case TS:
-            return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)));
-        case TNE:
-            return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) +
-                                                     c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)));
-        case BSW:
-            return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) +
-                                                     c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)));
-        case BNE:
-            return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) +
-                                                     c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)));
-        case TSW:
-            return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) +
-                                                     c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)));
-        case TSE:
-            return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) +
-                                                     c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)));
-        case BNW:
-            return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) +
-                                                     c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)));
-        case BSE:
-            return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) +
-                                                     c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)));
-        case TNW:
-            return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) +
-                                                     c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)));
-        default:
-            throw UbException(UB_EXARGS, "unknown dir");
-    }
-}
-//////////////////////////////////////////////////////////////////////////
-static void calcCompFeq(LBMReal *const &feq /*[27]*/, const LBMReal &drho, const LBMReal &vx1, const LBMReal &vx2,
-                        const LBMReal &vx3)
-{
-    using namespace UbMath;
-
-    LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
-    LBMReal rho   = drho + c1;
-
-    feq[ZERO] = c8o27 * (drho + rho * (-cu_sq));
-    feq[E]    = c2o27 * (drho + rho * (3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq));
-    feq[W]    = c2o27 * (drho + rho * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq));
-    feq[N]    = c2o27 * (drho + rho * (3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq));
-    feq[S]    = c2o27 * (drho + rho * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq));
-    feq[T]    = c2o27 * (drho + rho * (3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq));
-    feq[B]    = c2o27 * (drho + rho * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq));
-    feq[NE]   = c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq));
-    feq[SW]   = c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq));
-    feq[SE]   = c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq));
-    feq[NW]   = c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq));
-    feq[TE]   = c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq));
-    feq[BW]   = c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq));
-    feq[BE]   = c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq));
-    feq[TW]   = c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq));
-    feq[TN]   = c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq));
-    feq[BS]   = c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq));
-    feq[BN]   = c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq));
-    feq[TS]   = c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq));
-    feq[TNE] = c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq));
-    feq[BSW] =
-        c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq));
-    feq[BNE] = c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq));
-    feq[TSW] =
-        c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq));
-    feq[TSE] = c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq));
-    feq[BNW] =
-        c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq));
-    feq[BSE] = c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq));
-    feq[TNW] =
-        c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq));
-}
-//////////////////////////////////////////////////////////////////////////
-static LBMReal getIncompFeqForDirection(const int &direction, const LBMReal &drho, const LBMReal &vx1,
-                                        const LBMReal &vx2, const LBMReal &vx3)
-{
-    using namespace UbMath;
-
-    LBMReal cu_sq = 1.5f * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
-
-    switch (direction) {
-        case ZERO:
-            return REAL_CAST(c8o27 * (drho - cu_sq));
-        case E:
-            return REAL_CAST(c2o27 * (drho + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq));
-        case W:
-            return REAL_CAST(c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq));
-        case N:
-            return REAL_CAST(c2o27 * (drho + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq));
-        case S:
-            return REAL_CAST(c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq));
-        case T:
-            return REAL_CAST(c2o27 * (drho + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq));
-        case B:
-            return REAL_CAST(c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq));
-        case NE:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq));
-        case SW:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq));
-        case SE:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq));
-        case NW:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq));
-        case TE:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq));
-        case BW:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq));
-        case BE:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq));
-        case TW:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq));
-        case TN:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq));
-        case BS:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq));
-        case BN:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq));
-        case TS:
-            return REAL_CAST(c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq));
-        case TNE:
-            return REAL_CAST(c1o216 *
-                             (drho + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq));
-        case BSW:
-            return REAL_CAST(
-                c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq));
-        case BNE:
-            return REAL_CAST(c1o216 *
-                             (drho + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq));
-        case TSW:
-            return REAL_CAST(
-                c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq));
-        case TSE:
-            return REAL_CAST(c1o216 *
-                             (drho + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq));
-        case BNW:
-            return REAL_CAST(
-                c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq));
-        case BSE:
-            return REAL_CAST(c1o216 *
-                             (drho + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq));
-        case TNW:
-            return REAL_CAST(
-                c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq));
-        default:
-            throw UbException(UB_EXARGS, "unknown dir");
-    }
-}
-//////////////////////////////////////////////////////////////////////////
-static void calcIncompFeq(LBMReal *const &feq /*[27]*/, const LBMReal &drho, const LBMReal &vx1, const LBMReal &vx2,
-                          const LBMReal &vx3)
-{
-    using namespace UbMath;
-
-    LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
-
-    feq[ZERO] = c8o27 * (drho - cu_sq);
-    feq[E]    = c2o27 * (drho + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq);
-    feq[W]    = c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq);
-    feq[N]    = c2o27 * (drho + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq);
-    feq[S]    = c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq);
-    feq[T]    = c2o27 * (drho + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq);
-    feq[B]    = c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq);
-    feq[NE]   = c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq);
-    feq[SW]   = c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq);
-    feq[SE]   = c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq);
-    feq[NW]   = c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq);
-    feq[TE]   = c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq);
-    feq[BW]   = c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq);
-    feq[BE]   = c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq);
-    feq[TW]   = c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq);
-    feq[TN]   = c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq);
-    feq[BS]   = c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq);
-    feq[BN]   = c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq);
-    feq[TS]   = c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq);
-    feq[TNE]  = c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq);
-    feq[BSW]  = c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq);
-    feq[BNE]  = c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq);
-    feq[TSW]  = c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq);
-    feq[TSE]  = c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq);
-    feq[BNW]  = c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq);
-    feq[BSE]  = c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq);
-    feq[TNW]  = c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq);
-}
-//////////////////////////////////////////////////////////////////////////
-static inline float getBoundaryVelocityForDirection(const int &direction, const float &bcVelocityX1,
-                                                    const float &bcVelocityX2, const float &bcVelocityX3)
-{
-    using namespace UbMath;
-
-    switch (direction) {
-        case E:
-            return (float)(UbMath::c4o9 * (+bcVelocityX1));
-        case W:
-            return (float)(UbMath::c4o9 * (-bcVelocityX1));
-        case N:
-            return (float)(UbMath::c4o9 * (+bcVelocityX2));
-        case S:
-            return (float)(UbMath::c4o9 * (-bcVelocityX2));
-        case T:
-            return (float)(UbMath::c4o9 * (+bcVelocityX3));
-        case B:
-            return (float)(UbMath::c4o9 * (-bcVelocityX3));
-        case NE:
-            return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX2));
-        case SW:
-            return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX2));
-        case SE:
-            return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX2));
-        case NW:
-            return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX2));
-        case TE:
-            return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX3));
-        case BW:
-            return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX3));
-        case BE:
-            return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX3));
-        case TW:
-            return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX3));
-        case TN:
-            return (float)(UbMath::c1o9 * (+bcVelocityX2 + bcVelocityX3));
-        case BS:
-            return (float)(UbMath::c1o9 * (-bcVelocityX2 - bcVelocityX3));
-        case BN:
-            return (float)(UbMath::c1o9 * (+bcVelocityX2 - bcVelocityX3));
-        case TS:
-            return (float)(UbMath::c1o9 * (-bcVelocityX2 + bcVelocityX3));
-        case TNE:
-            return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 + bcVelocityX3));
-        case BSW:
-            return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 - bcVelocityX3));
-        case BNE:
-            return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 - bcVelocityX3));
-        case TSW:
-            return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 + bcVelocityX3));
-        case TSE:
-            return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 + bcVelocityX3));
-        case BNW:
-            return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 - bcVelocityX3));
-        case BSE:
-            return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 - bcVelocityX3));
-        case TNW:
-            return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 + bcVelocityX3));
-        default:
-            throw UbException(UB_EXARGS, "unknown direction");
-    }
-}
-/*=====================================================================*/
-static const int &getInvertDirection(const int &direction)
-{
+	
+/*=========================================================================*/
+/*  D3Q27System                                                            */
+/*                                                                         */
+/**
+class for global system-functions
+<BR><BR>
+@author <A HREF="mailto:kucher@irmb.tu-bs.de">K. Kucher</A>
+@version 1.0 - 22.10.09
+*/ 
+
+/*
+usage: ...
+*/
+
+
+#ifndef SWIG
+   using namespace UbMath;
+#endif
+
+   namespace D3Q27System
+   {
+      //enum COLLISIONMODEL { UNDEFINED, INCOMPLBGKMODEL,   COMPLBGKMODEL,   COMPLBGKWTMODEL,   INCOMPLBGKLESMODEL, INCOMPLBGKNONNEWTONIANMODEL    
+      //                               , INCOMPGLBEJTMODEL, COMPGLBEJTMODEL, COMPGLBEJTWTMODEL, INCOMPGLBEJTLESMODEL, INCOMPGLBEJTWALEMODEL  
+      //                               , CASCADEDMODEL};
+      //
+      // #if defined(RCF_USE_SF_SERIALIZATION) && (CAB_RCF <= 903)
+      //    SF_SERIALIZE_ENUM(COLLISIONMODEL) //muss im namespace stehen, sonst funzt es nicht!
+      // #endif
+
+      ///*=====================================================================*/
+      //std::string toString(const COLLISIONMODEL& model);
+      ///*=====================================================================*/
+      //COLLISIONMODEL getCollModelByString(const std::string& str);
+      ///*=====================================================================*/
+
+      ///*=====================================================================*/
+      //static bool isCompModel(const COLLISIONMODEL& model) 
+      //{
+      //   switch(model)
+      //   {
+      //   case COMPLBGKMODEL               : return true; 
+      //   case COMPLBGKWTMODEL             : return true; 
+      //   case COMPGLBEJTWTMODEL           : return true;
+      //   case COMPGLBEJTMODEL             : return true;
+      //   case CASCADEDMODEL               : return true;
+      //   
+      //   case INCOMPLBGKMODEL             : return false;
+      //   case INCOMPGLBEJTMODEL           : return false;
+      //   case INCOMPLBGKLESMODEL          : return false;
+      //   case INCOMPGLBEJTLESMODEL        : return false;
+      //   case INCOMPGLBEJTWALEMODEL       : return false;
+      //   case INCOMPLBGKNONNEWTONIANMODEL : return false;
+
+      //   default: throw UbException(UB_EXARGS,"unknown model");
+      //   }
+      //}
+      ///*=====================================================================*/
+      //static bool isGLBEModel(const COLLISIONMODEL& model) 
+      //{
+      //   switch(model)
+      //   {
+      //   case COMPGLBEJTWTMODEL           : return true;
+      //   case COMPGLBEJTMODEL             : return true;
+      //   case INCOMPGLBEJTMODEL           : return true;
+      //   case INCOMPGLBEJTLESMODEL        : return true;
+      //   case INCOMPGLBEJTWALEMODEL       : return false;
+
+      //   case COMPLBGKMODEL               : return false; 
+      //   case COMPLBGKWTMODEL             : return false; 
+      //   case INCOMPLBGKMODEL             : return false;
+      //   case INCOMPLBGKLESMODEL          : return false;
+      //   case INCOMPLBGKNONNEWTONIANMODEL : return false;
+
+      //   default: throw UbException(UB_EXARGS,"unknown model");
+      //   }
+      //}
+      //static bool isLESModel(const COLLISIONMODEL& model) 
+      //{
+      //   switch(model)
+      //   {
+      //   case INCOMPGLBEJTLESMODEL        : return true;
+      //   case INCOMPLBGKLESMODEL          : return true;
+      //   case INCOMPGLBEJTWALEMODEL       : return true;
+      //   
+      //   case COMPGLBEJTWTMODEL           : return false;
+      //   case COMPGLBEJTMODEL             : return false;
+      //   case INCOMPGLBEJTMODEL           : return false;
+      //   case COMPLBGKMODEL               : return false; 
+      //   case COMPLBGKWTMODEL             : return false; 
+      //   case INCOMPLBGKMODEL             : return false;
+      //   case INCOMPLBGKNONNEWTONIANMODEL : return false;
+
+      //   default: throw UbException(UB_EXARGS,"unknown model");
+      //   }
+      //}
+
+      //////////////////////////////////////////////////////////////////////////
+      //////////////////////////////////////////////////////////////////////////
+      //DIRECTION STUFF
+      static const int FSTARTDIR = 0;
+      static const int FENDDIR = 25;   //D3Q27
+
+      //static const int FSTARTDIR = 1;
+      //static const int FENDDIR   = 26;   //D3Q27
+
+      static const int STARTF = 0;
+      static const int ENDF = 26;   //D3Q27
+
+      //extern const int EX1[ENDF+1];
+      //extern const int EX2[ENDF+1];
+      //extern const int EX3[ENDF+1];
+
+      static const int STARTDIR = 0;
+      static const int ENDDIR = 26; //alle geometrischen richtungen
+
+      extern const int DX1[ENDDIR + 1];
+      extern const int DX2[ENDDIR + 1];
+      extern const int DX3[ENDDIR + 1];
+      extern const double WEIGTH[ENDDIR + 1];
+
+      extern const double cNorm[3][ENDDIR];
+
+      //static const int ZERO /*f0 */ = 0;
+      //static const int E    /*f1 */ = 1;
+      //static const int W    /*f2 */ = 2;
+      //static const int N    /*f3 */ = 3;
+      //static const int S    /*f4 */ = 4;
+      //static const int T    /*f5 */ = 5;
+      //static const int B    /*f6 */ = 6;
+      //static const int NE   /*f7 */ = 7;
+      //static const int SW   /*f8 */ = 8;
+      //static const int SE   /*f9 */ = 9;
+      //static const int NW   /*f10*/ = 10;
+      //static const int TE   /*f11*/ = 11;
+      //static const int BW   /*f12*/ = 12;
+      //static const int BE   /*f13*/ = 13;
+      //static const int TW   /*f14*/ = 14;
+      //static const int TN   /*f15*/ = 15;
+      //static const int BS   /*f16*/ = 16;
+      //static const int BN   /*f17*/ = 17;
+      //static const int TS   /*f18*/ = 18;
+      //static const int TNE          = 19;
+      //static const int TNW          = 20;
+      //static const int TSE          = 21;
+      //static const int TSW          = 22;
+      //static const int BNE          = 23;
+      //static const int BNW          = 24;
+      //static const int BSE          = 25;
+      //static const int BSW          = 26;
+
+      static const int E    /*f1 */ = 0;
+      static const int W    /*f2 */ = 1;
+      static const int N    /*f3 */ = 2;
+      static const int S    /*f4 */ = 3;
+      static const int T    /*f5 */ = 4;
+      static const int B    /*f6 */ = 5;
+      static const int NE   /*f7 */ = 6;
+      static const int SW   /*f8 */ = 7;
+      static const int SE   /*f9 */ = 8;
+      static const int NW   /*f10*/ = 9;
+      static const int TE   /*f11*/ = 10;
+      static const int BW   /*f12*/ = 11;
+      static const int BE   /*f13*/ = 12;
+      static const int TW   /*f14*/ = 13;
+      static const int TN   /*f15*/ = 14;
+      static const int BS   /*f16*/ = 15;
+      static const int BN   /*f17*/ = 16;
+      static const int TS   /*f18*/ = 17;
+      static const int TNE = 18;
+      static const int TNW = 19;
+      static const int TSE = 20;
+      static const int TSW = 21;
+      static const int BNE = 22;
+      static const int BNW = 23;
+      static const int BSE = 24;
+      static const int BSW = 25;
+      static const int ZERO /*f0 */ = 26;
+
+      static const int INV_E = W;
+      static const int INV_W = E;
+      static const int INV_N = S;
+      static const int INV_S = N;
+      static const int INV_T = B;
+      static const int INV_B = T;
+      static const int INV_NE = SW;
+      static const int INV_SW = NE;
+      static const int INV_SE = NW;
+      static const int INV_NW = SE;
+      static const int INV_TE = BW;
+      static const int INV_BW = TE;
+      static const int INV_BE = TW;
+      static const int INV_TW = BE;
+      static const int INV_TN = BS;
+      static const int INV_BS = TN;
+      static const int INV_BN = TS;
+      static const int INV_TS = BN;
+      static const int INV_TNE = BSW;
+      static const int INV_TNW = BSE;
+      static const int INV_TSE = BNW;
+      static const int INV_TSW = BNE;
+      static const int INV_BNE = TSW;
+      static const int INV_BNW = TSE;
+      static const int INV_BSE = TNW;
+      static const int INV_BSW = TNE;
+
+      extern const int INVDIR[ENDDIR + 1];
+
+      static const int ET_E = 0;
+      static const int ET_W = 0;
+      static const int ET_N = 1;
+      static const int ET_S = 1;
+      static const int ET_T = 2;
+      static const int ET_B = 2;
+      static const int ET_NE = 3;
+      static const int ET_SW = 3;
+      static const int ET_SE = 4;
+      static const int ET_NW = 4;
+      static const int ET_TE = 5;
+      static const int ET_BW = 5;
+      static const int ET_BE = 6;
+      static const int ET_TW = 6;
+      static const int ET_TN = 7;
+      static const int ET_BS = 7;
+      static const int ET_BN = 8;
+      static const int ET_TS = 8;
+      static const int ET_TNE = 9;
+      static const int ET_BSW = 9;
+      static const int ET_TNW = 10;
+      static const int ET_BSE = 10;
+      static const int ET_TSE = 11;
+      static const int ET_BNW = 11;
+      static const int ET_TSW = 12;
+      static const int ET_BNE = 12;
+
+      static const int M_RHO = 0;
+      static const int M_EN = 1;
+      static const int M_EPS = 2;
+      static const int M_JX1 = 3;
+      static const int M_QX1 = 4;
+      static const int M_JX2 = 5;
+      static const int M_QX2 = 6;
+      static const int M_JX3 = 7;
+      static const int M_QX3 = 8;
+      static const int M_3PX1X1 = 9;
+      static const int M_3PIX1X1 = 10;
+      static const int M_PWW = 11;
+      static const int M_PIWW = 12;
+      static const int M_PX1X2 = 13;
+      static const int M_PX2X3 = 14;
+      static const int M_PX1X3 = 15;
+      static const int M_MX1 = 16;
+      static const int M_MX2 = 17;
+      static const int M_MX3 = 18;
+
+      static const int STARTM = 0;
+      static const int ENDM = 18;   //D3Q27
+
+
+
+      //////////////////////////////////////////////////////////////////////////
+      //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[ZERO];
+      }
+      /*=====================================================================*/
+      //ACHTUNG: gilt nicht fuer alle modelle -> praedikat verwenden anstelle static! toDo
+      static LBMReal getPressure(const LBMReal* const& f/*[27]*/)
+      {
+         return  REAL_CAST(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]));
+      }
+      /*=====================================================================*/
+      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]));
+      }
+      /*=====================================================================*/
+      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]));
+      }
+      /*=====================================================================*/
+      static void calcDensity(const LBMReal* const& f/*[27]*/, LBMReal& rho)
+      {
+         rho = ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE]))
+            + (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW]))
+               + ((f[BN] + f[TS]) + (f[TN] + f[BS]))) + ((f[E] + f[W]) + (f[N] + f[S])
+                  + (f[T] + f[B])) + f[ZERO];
+
+      }
+      /*=====================================================================*/
+      static void calcIncompVelocityX1(const LBMReal* const& f/*[27]*/, LBMReal& vx1)
+      {
+         vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
+            (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) +
+            (f[E] - f[W]));
+      }
+      /*=====================================================================*/
+      static void calcIncompVelocityX2(const LBMReal* const& f/*[27]*/, LBMReal& vx2)
+      {
+         vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
+            (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) +
+            (f[N] - f[S]));
+      }
+      /*=====================================================================*/
+      static void calcIncompVelocityX3(const LBMReal* const& f/*[27]*/, LBMReal& vx3)
+      {
+         vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
+            (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) +
+            (f[T] - f[B]));
+      }
+      /*=====================================================================*/
+      static LBMReal getCompVelocityX1(const LBMReal* const& f/*[27]*/)
+      {
+         return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
+            (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) +
+            (f[E] - f[W])) / getDensity(f);
+      }
+      /*=====================================================================*/
+      static LBMReal getCompVelocityX2(const LBMReal* const& f/*[27]*/)
+      {
+         return ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
+            (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) +
+            (f[N] - f[S])) / getDensity(f);
+      }
+      /*=====================================================================*/
+      static LBMReal getCompVelocityX3(const LBMReal* const& f/*[27]*/)
+      {
+         return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
+            (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) +
+            (f[T] - f[B])) / getDensity(f);
+      }
+      /*=====================================================================*/
+      static void calcCompVelocityX1(const LBMReal* const& f/*[27]*/, LBMReal& vx1)
+      {
+         vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) +
+            (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) +
+            (f[E] - f[W])) / getDensity(f);
+      }
+      /*=====================================================================*/
+      static void calcCompVelocityX2(const LBMReal* const& f/*[27]*/, LBMReal& vx2)
+      {
+         vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) +
+            (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) +
+            (f[N] - f[S])) / getDensity(f);
+      }
+      /*=====================================================================*/
+      static void calcCompVelocityX3(const LBMReal* const& f/*[27]*/, LBMReal& vx3)
+      {
+         vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) +
+            (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) +
+            (f[T] - f[B])) / getDensity(f);
+      }
+      /*=====================================================================*/
+      static void calcIncompMacroscopicValues(const LBMReal* const& f/*[27]*/, LBMReal& rho, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3)
+      {
+         D3Q27System::calcDensity(f, rho);
+         D3Q27System::calcIncompVelocityX1(f, vx1);
+         D3Q27System::calcIncompVelocityX2(f, vx2);
+         D3Q27System::calcIncompVelocityX3(f, vx3);
+      }
+
+      /*=====================================================================*/
+      static void calcCompMacroscopicValues(const LBMReal* const& f/*[27]*/, LBMReal& drho, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3)
+      {
+         D3Q27System::calcDensity(f, drho);
+         D3Q27System::calcIncompVelocityX1(f, vx1);
+         D3Q27System::calcIncompVelocityX2(f, vx2);
+         D3Q27System::calcIncompVelocityX3(f, vx3);
+         LBMReal rho = drho + one;
+         vx1 /= rho;
+         vx2 /= rho;
+         vx3 /= rho;
+      }
+      //////////////////////////////////////////////////////////////////////////
+      static LBMReal getCompFeqForDirection(const int& direction, const LBMReal& drho, const LBMReal& vx1, const LBMReal& vx2, const LBMReal& vx3)
+      {
+         LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
+
+         //switch(direction)    
+         //{
+         //   case ZERO : return REAL_CAST( c8o27*rho*(1.0-cu_sq));
+         //   case E : return REAL_CAST(  c2o27*rho*(1.0+3.0*( vx1   )+c9o2*( vx1   )*( vx1   )-cu_sq));
+         //   case W : return REAL_CAST(  c2o27*rho*(1.0+3.0*(-vx1   )+c9o2*(-vx1   )*(-vx1   )-cu_sq));
+         //   case N : return REAL_CAST(  c2o27*rho*(1.0+3.0*(    vx2)+c9o2*(    vx2)*(    vx2)-cu_sq));
+         //   case S : return REAL_CAST(  c2o27*rho*(1.0+3.0*(   -vx2)+c9o2*(   -vx2)*(   -vx2)-cu_sq));
+         //   case T : return REAL_CAST(  c2o27*rho*(1.0+3.0*( vx3   )+c9o2*(    vx3)*(    vx3)-cu_sq));
+         //   case B : return REAL_CAST(  c2o27*rho*(1.0+3.0*(   -vx3)+c9o2*(   -vx3)*(   -vx3)-cu_sq));
+         //   case NE : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx1+vx2)+c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq));
+         //   case SW : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq));
+         //   case SE : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx1-vx2)+c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq));
+         //   case NW : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq));
+         //   case TE : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx1+vx3)+c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq));
+         //   case BW : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq));
+         //   case BE : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx1-vx3)+c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq));
+         //   case TW : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq));
+         //   case TN : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq));
+         //   case BS : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq));
+         //   case BN : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq));
+         //   case TS : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq));
+         //   case TNE : return REAL_CAST(c1o216*rho*(1.0+3.0*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq));
+         //   case BSW : return REAL_CAST(c1o216*rho*(1.0+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq));
+         //   case BNE : return REAL_CAST(c1o216*rho*(1.0+3.0*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq));
+         //   case TSW : return REAL_CAST(c1o216*rho*(1.0+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq));
+         //   case TSE : return REAL_CAST(c1o216*rho*(1.0+3.0*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq));
+         //   case BNW : return REAL_CAST(c1o216*rho*(1.0+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq));
+         //   case BSE : return REAL_CAST(c1o216*rho*(1.0+3.0*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq));
+         //   case TNW : return REAL_CAST(c1o216*rho*(1.0+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq));
+         //   default: throw UbException(UB_EXARGS,"unknown dir");
+         //}
+
+
+         ////-----
+         LBMReal rho = drho + one;
+         switch (direction)
+         {
+         case ZERO: return REAL_CAST(c8o27 * (drho + rho * (-cu_sq)));
+         case E: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx1)+c9o2 * (vx1) * (vx1)-cu_sq)));
+         case W: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq)));
+         case N: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx2)+c9o2 * (vx2) * (vx2)-cu_sq)));
+         case S: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq)));
+         case T: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx3)+c9o2 * (vx3) * (vx3)-cu_sq)));
+         case B: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq)));
+         case NE: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)));
+         case SW: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)));
+         case SE: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)));
+         case NW: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)));
+         case TE: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)));
+         case BW: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)));
+         case BE: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)));
+         case TW: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)));
+         case TN: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)));
+         case BS: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)));
+         case BN: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)));
+         case TS: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)));
+         case TNE: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)));
+         case BSW: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)));
+         case BNE: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)));
+         case TSW: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)));
+         case TSE: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)));
+         case BNW: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)));
+         case BSE: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)));
+         case TNW: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)));
+         default: throw UbException(UB_EXARGS, "unknown dir");
+         }
+
+      }
+      //////////////////////////////////////////////////////////////////////////
+      static void calcCompFeq(LBMReal* const& feq/*[27]*/, const LBMReal& drho, const LBMReal& vx1, const LBMReal& vx2, const LBMReal& vx3)
+      {
+         //LBMReal cu_sq=1.5*(vx1*vx1+vx2*vx2+vx3*vx3);
+
+         //feq[ZERO] =  c8o27*rho*(1.0-cu_sq);
+         //feq[E] =   c2o27*rho*(1.0+3.0*( vx1   )+c9o2*( vx1   )*( vx1   )-cu_sq);
+         //feq[W] =   c2o27*rho*(1.0+3.0*(-vx1   )+c9o2*(-vx1   )*(-vx1   )-cu_sq);
+         //feq[N] =   c2o27*rho*(1.0+3.0*(    vx2)+c9o2*(    vx2)*(    vx2)-cu_sq);
+         //feq[S] =   c2o27*rho*(1.0+3.0*(   -vx2)+c9o2*(   -vx2)*(   -vx2)-cu_sq);
+         //feq[T] =   c2o27*rho*(1.0+3.0*( vx3   )+c9o2*(    vx3)*(    vx3)-cu_sq);
+         //feq[B] =   c2o27*rho*(1.0+3.0*(   -vx3)+c9o2*(   -vx3)*(   -vx3)-cu_sq);
+         //feq[NE] =  c1o54*rho*(1.0+3.0*( vx1+vx2)+c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq);
+         //feq[SW] =  c1o54*rho*(1.0+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq);
+         //feq[SE] =  c1o54*rho*(1.0+3.0*( vx1-vx2)+c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq);
+         //feq[NW] =  c1o54*rho*(1.0+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq);
+         //feq[TE] =  c1o54*rho*(1.0+3.0*( vx1+vx3)+c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq);
+         //feq[BW] =  c1o54*rho*(1.0+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq);
+         //feq[BE] =  c1o54*rho*(1.0+3.0*( vx1-vx3)+c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq);
+         //feq[TW] =  c1o54*rho*(1.0+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq);
+         //feq[TN] =  c1o54*rho*(1.0+3.0*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq);
+         //feq[BS] =  c1o54*rho*(1.0+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq);
+         //feq[BN] =  c1o54*rho*(1.0+3.0*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq);
+         //feq[TS] =  c1o54*rho*(1.0+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq);
+         //feq[TNE] = c1o216*rho*(1.0+3.0*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq);
+         //feq[BSW] = c1o216*rho*(1.0+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq);
+         //feq[BNE] = c1o216*rho*(1.0+3.0*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq);
+         //feq[TSW] = c1o216*rho*(1.0+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq);
+         //feq[TSE] = c1o216*rho*(1.0+3.0*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq);
+         //feq[BNW] = c1o216*rho*(1.0+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq);
+         //feq[BSE] = c1o216*rho*(1.0+3.0*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq);
+         //feq[TNW] = c1o216*rho*(1.0+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq);
+
+         //////////////////////////////////////////////////////////////////////////
+
+         LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
+         LBMReal rho = drho + one;
+
+         feq[ZERO] = c8o27 * (drho + rho * (-cu_sq));
+         feq[E] = c2o27 * (drho + rho * (3.0 * (vx1)+c9o2 * (vx1) * (vx1)-cu_sq));
+         feq[W] = c2o27 * (drho + rho * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq));
+         feq[N] = c2o27 * (drho + rho * (3.0 * (vx2)+c9o2 * (vx2) * (vx2)-cu_sq));
+         feq[S] = c2o27 * (drho + rho * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq));
+         feq[T] = c2o27 * (drho + rho * (3.0 * (vx3)+c9o2 * (vx3) * (vx3)-cu_sq));
+         feq[B] = c2o27 * (drho + rho * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq));
+         feq[NE] = c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq));
+         feq[SW] = c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq));
+         feq[SE] = c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq));
+         feq[NW] = c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq));
+         feq[TE] = c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq));
+         feq[BW] = c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq));
+         feq[BE] = c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq));
+         feq[TW] = c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq));
+         feq[TN] = c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq));
+         feq[BS] = c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq));
+         feq[BN] = c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq));
+         feq[TS] = c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq));
+         feq[TNE] = c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq));
+         feq[BSW] = c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq));
+         feq[BNE] = c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq));
+         feq[TSW] = c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq));
+         feq[TSE] = c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq));
+         feq[BNW] = c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq));
+         feq[BSE] = c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq));
+         feq[TNW] = c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq));
+      }
+      //////////////////////////////////////////////////////////////////////////
+      static LBMReal getIncompFeqForDirection(const int& direction, const LBMReal& drho, const LBMReal& vx1, const LBMReal& vx2, const LBMReal& vx3)
+      {
+         LBMReal cu_sq = 1.5f * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
+
+         switch (direction)
+         {
+         case ZERO: return REAL_CAST(c8o27 * (drho - cu_sq));
+         case E: return REAL_CAST(c2o27 * (drho + 3.0 * (vx1)+c9o2 * (vx1) * (vx1)-cu_sq));
+         case W: return REAL_CAST(c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq));
+         case N: return REAL_CAST(c2o27 * (drho + 3.0 * (vx2)+c9o2 * (vx2) * (vx2)-cu_sq));
+         case S: return REAL_CAST(c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq));
+         case T: return REAL_CAST(c2o27 * (drho + 3.0 * (vx3)+c9o2 * (vx3) * (vx3)-cu_sq));
+         case B: return REAL_CAST(c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq));
+         case NE: return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq));
+         case SW: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq));
+         case SE: return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq));
+         case NW: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq));
+         case TE: return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq));
+         case BW: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq));
+         case BE: return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq));
+         case TW: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq));
+         case TN: return REAL_CAST(c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq));
+         case BS: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq));
+         case BN: return REAL_CAST(c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq));
+         case TS: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq));
+         case TNE: return REAL_CAST(c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq));
+         case BSW: return REAL_CAST(c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq));
+         case BNE: return REAL_CAST(c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq));
+         case TSW: return REAL_CAST(c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq));
+         case TSE: return REAL_CAST(c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq));
+         case BNW: return REAL_CAST(c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq));
+         case BSE: return REAL_CAST(c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq));
+         case TNW: return REAL_CAST(c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq));
+         default: throw UbException(UB_EXARGS, "unknown dir");
+         }
+      }
+      //////////////////////////////////////////////////////////////////////////
+      static void calcIncompFeq(LBMReal* const& feq/*[27]*/, const LBMReal& drho, const LBMReal& vx1, const LBMReal& vx2, const LBMReal& vx3)
+      {
+         LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3);
+
+         feq[ZERO] = c8o27 * (drho - cu_sq);
+         feq[E] = c2o27 * (drho + 3.0 * (vx1)+c9o2 * (vx1) * (vx1)-cu_sq);
+         feq[W] = c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq);
+         feq[N] = c2o27 * (drho + 3.0 * (vx2)+c9o2 * (vx2) * (vx2)-cu_sq);
+         feq[S] = c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq);
+         feq[T] = c2o27 * (drho + 3.0 * (vx3)+c9o2 * (vx3) * (vx3)-cu_sq);
+         feq[B] = c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq);
+         feq[NE] = c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq);
+         feq[SW] = c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq);
+         feq[SE] = c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq);
+         feq[NW] = c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq);
+         feq[TE] = c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq);
+         feq[BW] = c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq);
+         feq[BE] = c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq);
+         feq[TW] = c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq);
+         feq[TN] = c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq);
+         feq[BS] = c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq);
+         feq[BN] = c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq);
+         feq[TS] = c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq);
+         feq[TNE] = c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq);
+         feq[BSW] = c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq);
+         feq[BNE] = c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq);
+         feq[TSW] = c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq);
+         feq[TSE] = c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq);
+         feq[BNW] = c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq);
+         feq[BSE] = c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq);
+         feq[TNW] = c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq);
+      }
+      //////////////////////////////////////////////////////////////////////////
+      static inline float getBoundaryVelocityForDirection(const int& direction, const float& bcVelocityX1, const float& bcVelocityX2, const float& bcVelocityX3)
+      {
+         switch (direction)
+         {
+         case E:   return (float)(UbMath::c4o9 * (+bcVelocityX1));
+         case W:   return (float)(UbMath::c4o9 * (-bcVelocityX1));
+         case N:   return (float)(UbMath::c4o9 * (+bcVelocityX2));
+         case S:   return (float)(UbMath::c4o9 * (-bcVelocityX2));
+         case T:   return (float)(UbMath::c4o9 * (+bcVelocityX3));
+         case B:   return (float)(UbMath::c4o9 * (-bcVelocityX3));
+         case NE:  return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX2));
+         case SW:  return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX2));
+         case SE:  return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX2));
+         case NW:  return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX2));
+         case TE:  return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX3));
+         case BW:  return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX3));
+         case BE:  return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX3));
+         case TW:  return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX3));
+         case TN:  return (float)(UbMath::c1o9 * (+bcVelocityX2 + bcVelocityX3));
+         case BS:  return (float)(UbMath::c1o9 * (-bcVelocityX2 - bcVelocityX3));
+         case BN:  return (float)(UbMath::c1o9 * (+bcVelocityX2 - bcVelocityX3));
+         case TS:  return (float)(UbMath::c1o9 * (-bcVelocityX2 + bcVelocityX3));
+         case TNE: return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 + bcVelocityX3));
+         case BSW: return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 - bcVelocityX3));
+         case BNE: return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 - bcVelocityX3));
+         case TSW: return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 + bcVelocityX3));
+         case TSE: return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 + bcVelocityX3));
+         case BNW: return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 - bcVelocityX3));
+         case BSE: return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 - bcVelocityX3));
+         case TNW: return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 + bcVelocityX3));
+         default: throw UbException(UB_EXARGS, "unknown direction");
+         }
+      }
+      /*=====================================================================*/
+      static const int& getInvertDirection(const int& direction)
+      {
 #ifdef _DEBUG
-    if (direction < STARTDIR || direction > ENDDIR)
-        throw UbException(UB_EXARGS, "unknown direction");
+         if (direction<STARTDIR || direction>ENDDIR)
+            throw UbException(UB_EXARGS, "unknown direction");
 #endif
-    return INVDIR[direction];
-}
-/*=====================================================================*/
-static void getLBMDirections(std::vector<int> &dirs, bool onlyLBdirs = false)
-{
-    std::vector<int> D3Q27Dirs;
-    if (onlyLBdirs) /*FSTARTDIR->FENDDIR*/
-    {
-        dirs.resize(FENDDIR + 1);
-        for (int dir = FSTARTDIR; dir <= FENDDIR; ++dir)
-            dirs[dir] = dir;
-    } else /*STARTDIR->ENDDIR*/
-    {
-        dirs.resize(ENDDIR + 1);
-        for (int dir = STARTDIR; dir <= ENDDIR; ++dir)
-            dirs[dir] = dir;
-    }
-}
-//////////////////////////////////////////////////////////////////////////
-static std::vector<int> getEX(const int &exn)
-{
-    std::vector<int> ex;
-    ex.resize(ENDDIR + 1);
-    switch (exn) {
-        case 1:
+         return INVDIR[direction];
+      }
+      /*=====================================================================*/
+      static void getLBMDirections(std::vector<int>& dirs, bool onlyLBdirs = false)
+      {
+         std::vector<int> D3Q27Dirs;
+         if (onlyLBdirs) /*FSTARTDIR->FENDDIR*/
+         {
+            dirs.resize(FENDDIR + 1);
+            for (int dir = FSTARTDIR; dir <= FENDDIR; ++dir)
+               dirs[dir] = dir;
+         }
+         else /*STARTDIR->ENDDIR*/
+         {
+            dirs.resize(ENDDIR + 1);
+            for (int dir = STARTDIR; dir <= ENDDIR; ++dir)
+               dirs[dir] = dir;
+         }
+      }
+      //////////////////////////////////////////////////////////////////////////
+      static std::vector<int> getEX(const int& exn)
+      {
+         std::vector<int> ex;
+         ex.resize(ENDDIR + 1);
+         switch (exn)
+         {
+         case 1:
             for (int dir = STARTDIR; dir < ENDDIR; ++dir)
-                ex[dir] = DX1[dir];
+               ex[dir] = DX1[dir];
             break;
-        case 2:
+         case 2:
             for (int dir = STARTDIR; dir < ENDDIR; ++dir)
-                ex[dir] = DX2[dir];
+               ex[dir] = DX2[dir];
             break;
-        case 3:
+         case 3:
             for (int dir = STARTDIR; dir < ENDDIR; ++dir)
-                ex[dir] = DX3[dir];
+               ex[dir] = DX3[dir];
             break;
-    }
-    return ex;
-}
-//////////////////////////////////////////////////////////////////////////
-static inline void calcDistanceToNeighbors(std::vector<double> &distNeigh, const double &deltaX1)
-{
-    // distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1);
-    double sqrt3 = UbMath::sqrt3;
-    double sqrt2 = UbMath::sqrt2;
-    distNeigh[E] = distNeigh[W] = distNeigh[N] = deltaX1;
-    distNeigh[S] = distNeigh[T] = distNeigh[B] = deltaX1;
-    distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = sqrt2 * deltaX1;
-    distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = sqrt2 * deltaX1;
-    distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = sqrt2 * deltaX1;
-    distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = sqrt3 * deltaX1;
-    distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = sqrt3 * deltaX1;
-}
-//////////////////////////////////////////////////////////////////////////
-static inline void calcDistanceToNeighbors(std::vector<double> &distNeigh, const double &deltaX1, const double &deltaX2,
-                                           const double &deltaX3)
-{
-    // distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1);
-    distNeigh[E] = distNeigh[W] = deltaX1;
-    distNeigh[N] = distNeigh[S] = deltaX2;
-    distNeigh[T] = distNeigh[B] = deltaX3;
-    distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2);
-    distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = sqrt(deltaX1 * deltaX1 + deltaX3 * deltaX3);
-    distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = sqrt(deltaX2 * deltaX2 + deltaX3 * deltaX3);
-    distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] =
-        sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3);
-    distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] =
-        sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3);
-}
-//////////////////////////////////////////////////////////////////////////
-static inline void initRayVectors(double *const &rayX1, double *const &rayX2, double *const &rayX3)
-{
-    using namespace UbMath;
-
-    int fdir;
-    double c1oS2 = UbMath::one_over_sqrt2;
-    double c1oS3 = UbMath::one_over_sqrt3;
-    fdir         = E;
-    rayX1[fdir]  = 1.0;
-    rayX2[fdir]  = 0.0;
-    rayX3[fdir]  = 0.0;
-    fdir         = W;
-    rayX1[fdir]  = -1.0;
-    rayX2[fdir]  = 0.0;
-    rayX3[fdir]  = 0.0;
-    fdir         = N;
-    rayX1[fdir]  = 0.0;
-    rayX2[fdir]  = 1.0;
-    rayX3[fdir]  = 0.0;
-    fdir         = S;
-    rayX1[fdir]  = 0.0;
-    rayX2[fdir]  = -1.0;
-    rayX3[fdir]  = 0.0;
-    fdir         = T;
-    rayX1[fdir]  = 0.0;
-    rayX2[fdir]  = 0.0;
-    rayX3[fdir]  = 1.0;
-    fdir         = B;
-    rayX1[fdir]  = 0.0;
-    rayX2[fdir]  = 0.0;
-    rayX3[fdir]  = -1.0;
-    fdir         = NE;
-    rayX1[fdir]  = c1oS2;
-    rayX2[fdir]  = c1oS2;
-    rayX3[fdir]  = 0.0;
-    fdir         = SW;
-    rayX1[fdir]  = -c1oS2;
-    rayX2[fdir]  = -c1oS2;
-    rayX3[fdir]  = 0.0;
-    fdir         = SE;
-    rayX1[fdir]  = c1oS2;
-    rayX2[fdir]  = -c1oS2;
-    rayX3[fdir]  = 0.0;
-    fdir         = NW;
-    rayX1[fdir]  = -c1oS2;
-    rayX2[fdir]  = c1oS2;
-    rayX3[fdir]  = 0.0;
-    fdir         = TE;
-    rayX1[fdir]  = c1oS2;
-    rayX2[fdir]  = 0.0;
-    rayX3[fdir]  = c1oS2;
-    fdir         = BW;
-    rayX1[fdir]  = -c1oS2;
-    rayX2[fdir]  = 0.0;
-    rayX3[fdir]  = -c1oS2;
-    fdir         = BE;
-    rayX1[fdir]  = c1oS2;
-    rayX2[fdir]  = 0.0;
-    rayX3[fdir]  = -c1oS2;
-    fdir         = TW;
-    rayX1[fdir]  = -c1oS2;
-    rayX2[fdir]  = 0.0;
-    rayX3[fdir]  = c1oS2;
-    fdir         = TN;
-    rayX1[fdir]  = 0.0;
-    rayX2[fdir]  = c1oS2;
-    rayX3[fdir]  = c1oS2;
-    fdir         = BS;
-    rayX1[fdir]  = 0.0;
-    rayX2[fdir]  = -c1oS2;
-    rayX3[fdir]  = -c1oS2;
-    fdir         = BN;
-    rayX1[fdir]  = 0.0;
-    rayX2[fdir]  = c1oS2;
-    rayX3[fdir]  = -c1oS2;
-    fdir         = TS;
-    rayX1[fdir]  = 0.0;
-    rayX2[fdir]  = -c1oS2;
-    rayX3[fdir]  = c1oS2;
-    fdir         = TNE;
-    rayX1[fdir]  = c1oS3;
-    rayX2[fdir]  = c1oS3;
-    rayX3[fdir]  = c1oS3;
-    fdir         = TNW;
-    rayX1[fdir]  = -c1oS3;
-    rayX2[fdir]  = c1oS3;
-    rayX3[fdir]  = c1oS3;
-    fdir         = TSE;
-    rayX1[fdir]  = c1oS3;
-    rayX2[fdir]  = -c1oS3;
-    rayX3[fdir]  = c1oS3;
-    fdir         = TSW;
-    rayX1[fdir]  = -c1oS3;
-    rayX2[fdir]  = -c1oS3;
-    rayX3[fdir]  = c1oS3;
-    fdir         = BNE;
-    rayX1[fdir]  = c1oS3;
-    rayX2[fdir]  = c1oS3;
-    rayX3[fdir]  = -c1oS3;
-    fdir         = BNW;
-    rayX1[fdir]  = -c1oS3;
-    rayX2[fdir]  = c1oS3;
-    rayX3[fdir]  = -c1oS3;
-    fdir         = BSE;
-    rayX1[fdir]  = c1oS3;
-    rayX2[fdir]  = -c1oS3;
-    rayX3[fdir]  = -c1oS3;
-    fdir         = BSW;
-    rayX1[fdir]  = -c1oS3;
-    rayX2[fdir]  = -c1oS3;
-    rayX3[fdir]  = -c1oS3;
-}
-//////////////////////////////////////////////////////////////////////////
-static inline LBMReal calcPress(const LBMReal *const f, LBMReal rho, LBMReal vx1, LBMReal vx2, LBMReal vx3)
-{
-    using namespace UbMath;
-    LBMReal OxxPyyPzz = c1;
-    return ((f[E] + f[W] + f[N] + f[S] + f[T] + f[B] +
-             c2 * (f[NE] + f[SW] + f[SE] + f[NW] + f[TE] + f[BW] + f[BE] + f[TW] + f[TN] + f[BS] + f[BN] + f[TS]) +
-             c3 * (f[TNE] + f[TSW] + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW]) -
-             (vx1 * vx1 + vx2 * vx2 + vx3 * vx3)) *
-                (c1 - c1o2 * OxxPyyPzz) +
-            OxxPyyPzz * c1o2 * (rho)) *
-           c1o3;
-}
-} // namespace D3Q27System
+         }
+         return ex;
+      }
+      //////////////////////////////////////////////////////////////////////////
+      static inline void calcDistanceToNeighbors(std::vector<double>& distNeigh, const double& deltaX1)
+      {
+         //distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1);
+         double sqrt3 = UbMath::sqrt3;
+         double sqrt2 = UbMath::sqrt2;
+         distNeigh[E] = distNeigh[W] = distNeigh[N] = deltaX1;
+         distNeigh[S] = distNeigh[T] = distNeigh[B] = deltaX1;
+         distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = sqrt2 * deltaX1;
+         distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = sqrt2 * deltaX1;
+         distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = sqrt2 * deltaX1;
+         distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = sqrt3 * deltaX1;
+         distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = sqrt3 * deltaX1;
+      }
+      //////////////////////////////////////////////////////////////////////////
+      static inline void calcDistanceToNeighbors(std::vector<double>& distNeigh, const double& deltaX1, const double& deltaX2, const double& deltaX3)
+      {
+         //distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1);
+         double sqrt3 = UbMath::sqrt3;
+         double sqrt2 = UbMath::sqrt2;
+         distNeigh[E] = distNeigh[W] = deltaX1;
+         distNeigh[N] = distNeigh[S] = deltaX2;
+         distNeigh[T] = distNeigh[B] = deltaX3;
+         distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2);
+         distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = sqrt(deltaX1 * deltaX1 + deltaX3 * deltaX3);
+         distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = sqrt(deltaX2 * deltaX2 + deltaX3 * deltaX3);
+         distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3);
+         distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3);
+      }
+      //////////////////////////////////////////////////////////////////////////
+      static inline void initRayVectors(double* const& rayX1, double* const& rayX2, double* const& rayX3)
+      {
+         int fdir;
+         double c1oS2 = UbMath::one_over_sqrt2;
+         double c1oS3 = UbMath::one_over_sqrt3;
+         fdir = E;  rayX1[fdir] = 1.0;   rayX2[fdir] = 0.0;   rayX3[fdir] = 0.0;
+         fdir = W;  rayX1[fdir] = -1.0;   rayX2[fdir] = 0.0;   rayX3[fdir] = 0.0;
+         fdir = N;  rayX1[fdir] = 0.0;   rayX2[fdir] = 1.0;   rayX3[fdir] = 0.0;
+         fdir = S;  rayX1[fdir] = 0.0;   rayX2[fdir] = -1.0;   rayX3[fdir] = 0.0;
+         fdir = T;  rayX1[fdir] = 0.0;   rayX2[fdir] = 0.0;   rayX3[fdir] = 1.0;
+         fdir = B;  rayX1[fdir] = 0.0;   rayX2[fdir] = 0.0;   rayX3[fdir] = -1.0;
+         fdir = NE; rayX1[fdir] = c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] = 0.0;
+         fdir = SW; rayX1[fdir] = -c1oS2; rayX2[fdir] = -c1oS2; rayX3[fdir] = 0.0;
+         fdir = SE; rayX1[fdir] = c1oS2; rayX2[fdir] = -c1oS2; rayX3[fdir] = 0.0;
+         fdir = NW; rayX1[fdir] = -c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] = 0.0;
+         fdir = TE; rayX1[fdir] = c1oS2; rayX2[fdir] = 0.0;    rayX3[fdir] = c1oS2;
+         fdir = BW; rayX1[fdir] = -c1oS2; rayX2[fdir] = 0.0;    rayX3[fdir] = -c1oS2;
+         fdir = BE; rayX1[fdir] = c1oS2; rayX2[fdir] = 0.0;    rayX3[fdir] = -c1oS2;
+         fdir = TW; rayX1[fdir] = -c1oS2; rayX2[fdir] = 0.0;    rayX3[fdir] = c1oS2;
+         fdir = TN; rayX1[fdir] = 0.0;   rayX2[fdir] = c1oS2;  rayX3[fdir] = c1oS2;
+         fdir = BS; rayX1[fdir] = 0.0;   rayX2[fdir] = -c1oS2;  rayX3[fdir] = -c1oS2;
+         fdir = BN; rayX1[fdir] = 0.0;   rayX2[fdir] = c1oS2;  rayX3[fdir] = -c1oS2;
+         fdir = TS; rayX1[fdir] = 0.0;   rayX2[fdir] = -c1oS2;  rayX3[fdir] = c1oS2;
+         fdir = TNE; rayX1[fdir] = c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = c1oS3;
+         fdir = TNW; rayX1[fdir] = -c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = c1oS3;
+         fdir = TSE; rayX1[fdir] = c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = c1oS3;
+         fdir = TSW; rayX1[fdir] = -c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = c1oS3;
+         fdir = BNE; rayX1[fdir] = c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = -c1oS3;
+         fdir = BNW; rayX1[fdir] = -c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = -c1oS3;
+         fdir = BSE; rayX1[fdir] = c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = -c1oS3;
+         fdir = BSW; rayX1[fdir] = -c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = -c1oS3;
+      }
+      //////////////////////////////////////////////////////////////////////////
+      static inline LBMReal calcPress(const LBMReal* const f, LBMReal rho, LBMReal vx1, LBMReal vx2, LBMReal vx3)
+      {
+         LBMReal op = 1.0;
+         return ((f[E] + f[W] + f[N] + f[S] + f[T] + f[B] + 2. * (f[NE] + f[SW] + f[SE] + f[NW] + f[TE] + f[BW] + f[BE] + f[TW] + f[TN] + f[BS] + f[BN] + f[TS]) +
+            3. * (f[TNE] + f[TSW] + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW]) - (vx1 * vx1 + vx2 * vx2 + vx3 * vx3)) * (1 - 0.5 * op) + op * 0.5 * (rho)) * c1o3;
+
+      }
+      //////////////////////////////////////////////////////////////////////////
+      static inline LBMReal getShearRate(const LBMReal* const f, LBMReal collFactorF)
+      {
+         LBMReal mfcbb = f[E];
+         LBMReal mfbcb = f[N];
+         LBMReal mfbbc = f[T];
+         LBMReal mfccb = f[NE];
+         LBMReal mfacb = f[NW];
+         LBMReal mfcbc = f[TE];
+         LBMReal mfabc = f[TW];
+         LBMReal mfbcc = f[TN];
+         LBMReal mfbac = f[TS];
+         LBMReal mfccc = f[TNE];
+         LBMReal mfacc = f[TNW];
+         LBMReal mfcac = f[TSE];
+         LBMReal mfaac = f[TSW];
+
+         LBMReal mfabb = f[W];
+         LBMReal mfbab = f[S];
+         LBMReal mfbba = f[B];
+         LBMReal mfaab = f[SW];
+         LBMReal mfcab = f[SE];
+         LBMReal mfaba = f[BW];
+         LBMReal mfcba = f[BE];
+         LBMReal mfbaa = f[BS];
+         LBMReal mfbca = f[BN];
+         LBMReal mfaaa = f[BSW];
+         LBMReal mfcaa = f[BSE];
+         LBMReal mfaca = f[BNW];
+         LBMReal mfcca = f[BNE];
+
+         LBMReal mfbbb = f[ZERO];
+
+         LBMReal m0, m1, m2;
+
+         LBMReal rho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+            + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+            + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
 
+         LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+            (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+            (mfcbb - mfabb));
+         LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+            (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+            (mfbcb - mfbab));
+         LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+            (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+            (mfbbc - mfbba));
+
+         //LBMReal OxxPyyPzz = 1.;
+
+         LBMReal oMdrho;
+
+         oMdrho = mfccc + mfaaa;
+         m0 = mfaca + mfcac;
+         m1 = mfacc + mfcaa;
+         m2 = mfaac + mfcca;
+         oMdrho += m0;
+         m1 += m2;
+         oMdrho += m1;
+         m0 = mfbac + mfbca;
+         m1 = mfbaa + mfbcc;
+         m0 += m1;
+         m1 = mfabc + mfcba;
+         m2 = mfaba + mfcbc;
+         m1 += m2;
+         m0 += m1;
+         m1 = mfacb + mfcab;
+         m2 = mfaab + mfccb;
+         m1 += m2;
+         m0 += m1;
+         oMdrho += m0;
+         m0 = mfabb + mfcbb;
+         m1 = mfbab + mfbcb;
+         m2 = mfbba + mfbbc;
+         m0 += m1 + m2;
+         m0 += mfbbb; //hat gefehlt
+         oMdrho = 1. - (oMdrho + m0);
+
+         LBMReal vx2;
+         LBMReal vy2;
+         LBMReal vz2;
+         vx2 = vvx * vvx;
+         vy2 = vvy * vvy;
+         vz2 = vvz * vvz;
+         ////////////////////////////////////////////////////////////////////////////////////
+         LBMReal qudricLimit = 0.01;
+         ////////////////////////////////////////////////////////////////////////////////////
+         //Hin
+         ////////////////////////////////////////////////////////////////////////////////////
+         // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+         ////////////////////////////////////////////////////////////////////////////////////
+         // Z - Dir
+         m2 = mfaaa + mfaac;
+         m1 = mfaac - mfaaa;
+         m0 = m2 + mfaab;
+         mfaaa = m0;
+         m0 += c1o36 * oMdrho;
+         mfaab = m1 - m0 * vvz;
+         mfaac = m2 - 2. * m1 * vvz + vz2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfaba + mfabc;
+         m1 = mfabc - mfaba;
+         m0 = m2 + mfabb;
+         mfaba = m0;
+         m0 += c1o9 * oMdrho;
+         mfabb = m1 - m0 * vvz;
+         mfabc = m2 - 2. * m1 * vvz + vz2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfaca + mfacc;
+         m1 = mfacc - mfaca;
+         m0 = m2 + mfacb;
+         mfaca = m0;
+         m0 += c1o36 * oMdrho;
+         mfacb = m1 - m0 * vvz;
+         mfacc = m2 - 2. * m1 * vvz + vz2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfbaa + mfbac;
+         m1 = mfbac - mfbaa;
+         m0 = m2 + mfbab;
+         mfbaa = m0;
+         m0 += c1o9 * oMdrho;
+         mfbab = m1 - m0 * vvz;
+         mfbac = m2 - 2. * m1 * vvz + vz2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfbba + mfbbc;
+         m1 = mfbbc - mfbba;
+         m0 = m2 + mfbbb;
+         mfbba = m0;
+         m0 += c4o9 * oMdrho;
+         mfbbb = m1 - m0 * vvz;
+         mfbbc = m2 - 2. * m1 * vvz + vz2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfbca + mfbcc;
+         m1 = mfbcc - mfbca;
+         m0 = m2 + mfbcb;
+         mfbca = m0;
+         m0 += c1o9 * oMdrho;
+         mfbcb = m1 - m0 * vvz;
+         mfbcc = m2 - 2. * m1 * vvz + vz2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfcaa + mfcac;
+         m1 = mfcac - mfcaa;
+         m0 = m2 + mfcab;
+         mfcaa = m0;
+         m0 += c1o36 * oMdrho;
+         mfcab = m1 - m0 * vvz;
+         mfcac = m2 - 2. * m1 * vvz + vz2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfcba + mfcbc;
+         m1 = mfcbc - mfcba;
+         m0 = m2 + mfcbb;
+         mfcba = m0;
+         m0 += c1o9 * oMdrho;
+         mfcbb = m1 - m0 * vvz;
+         mfcbc = m2 - 2. * m1 * vvz + vz2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfcca + mfccc;
+         m1 = mfccc - mfcca;
+         m0 = m2 + mfccb;
+         mfcca = m0;
+         m0 += c1o36 * oMdrho;
+         mfccb = m1 - m0 * vvz;
+         mfccc = m2 - 2. * m1 * vvz + vz2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         ////////////////////////////////////////////////////////////////////////////////////
+         // mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+         ////////////////////////////////////////////////////////////////////////////////////
+         // Y - Dir
+         m2 = mfaaa + mfaca;
+         m1 = mfaca - mfaaa;
+         m0 = m2 + mfaba;
+         mfaaa = m0;
+         m0 += c1o6 * oMdrho;
+         mfaba = m1 - m0 * vvy;
+         mfaca = m2 - 2. * m1 * vvy + vy2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfaab + mfacb;
+         m1 = mfacb - mfaab;
+         m0 = m2 + mfabb;
+         mfaab = m0;
+         mfabb = m1 - m0 * vvy;
+         mfacb = m2 - 2. * m1 * vvy + vy2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfaac + mfacc;
+         m1 = mfacc - mfaac;
+         m0 = m2 + mfabc;
+         mfaac = m0;
+         m0 += c1o18 * oMdrho;
+         mfabc = m1 - m0 * vvy;
+         mfacc = m2 - 2. * m1 * vvy + vy2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfbaa + mfbca;
+         m1 = mfbca - mfbaa;
+         m0 = m2 + mfbba;
+         mfbaa = m0;
+         m0 += c2o3 * oMdrho;
+         mfbba = m1 - m0 * vvy;
+         mfbca = m2 - 2. * m1 * vvy + vy2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfbab + mfbcb;
+         m1 = mfbcb - mfbab;
+         m0 = m2 + mfbbb;
+         mfbab = m0;
+         mfbbb = m1 - m0 * vvy;
+         mfbcb = m2 - 2. * m1 * vvy + vy2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfbac + mfbcc;
+         m1 = mfbcc - mfbac;
+         m0 = m2 + mfbbc;
+         mfbac = m0;
+         m0 += c2o9 * oMdrho;
+         mfbbc = m1 - m0 * vvy;
+         mfbcc = m2 - 2. * m1 * vvy + vy2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfcaa + mfcca;
+         m1 = mfcca - mfcaa;
+         m0 = m2 + mfcba;
+         mfcaa = m0;
+         m0 += c1o6 * oMdrho;
+         mfcba = m1 - m0 * vvy;
+         mfcca = m2 - 2. * m1 * vvy + vy2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfcab + mfccb;
+         m1 = mfccb - mfcab;
+         m0 = m2 + mfcbb;
+         mfcab = m0;
+         mfcbb = m1 - m0 * vvy;
+         mfccb = m2 - 2. * m1 * vvy + vy2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfcac + mfccc;
+         m1 = mfccc - mfcac;
+         m0 = m2 + mfcbc;
+         mfcac = m0;
+         m0 += c1o18 * oMdrho;
+         mfcbc = m1 - m0 * vvy;
+         mfccc = m2 - 2. * m1 * vvy + vy2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         ////////////////////////////////////////////////////////////////////////////////////
+         // mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+         ////////////////////////////////////////////////////////////////////////////////////
+         // X - Dir
+         m2 = mfaaa + mfcaa;
+         m1 = mfcaa - mfaaa;
+         m0 = m2 + mfbaa;
+         mfaaa = m0;
+         m0 += 1. * oMdrho;
+         mfbaa = m1 - m0 * vvx;
+         mfcaa = m2 - 2. * m1 * vvx + vx2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfaba + mfcba;
+         m1 = mfcba - mfaba;
+         m0 = m2 + mfbba;
+         mfaba = m0;
+         mfbba = m1 - m0 * vvx;
+         mfcba = m2 - 2. * m1 * vvx + vx2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfaca + mfcca;
+         m1 = mfcca - mfaca;
+         m0 = m2 + mfbca;
+         mfaca = m0;
+         m0 += c1o3 * oMdrho;
+         mfbca = m1 - m0 * vvx;
+         mfcca = m2 - 2. * m1 * vvx + vx2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfaab + mfcab;
+         m1 = mfcab - mfaab;
+         m0 = m2 + mfbab;
+         mfaab = m0;
+         mfbab = m1 - m0 * vvx;
+         mfcab = m2 - 2. * m1 * vvx + vx2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfabb + mfcbb;
+         m1 = mfcbb - mfabb;
+         m0 = m2 + mfbbb;
+         mfabb = m0;
+         mfbbb = m1 - m0 * vvx;
+         mfcbb = m2 - 2. * m1 * vvx + vx2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfacb + mfccb;
+         m1 = mfccb - mfacb;
+         m0 = m2 + mfbcb;
+         mfacb = m0;
+         mfbcb = m1 - m0 * vvx;
+         mfccb = m2 - 2. * m1 * vvx + vx2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfaac + mfcac;
+         m1 = mfcac - mfaac;
+         m0 = m2 + mfbac;
+         mfaac = m0;
+         m0 += c1o3 * oMdrho;
+         mfbac = m1 - m0 * vvx;
+         mfcac = m2 - 2. * m1 * vvx + vx2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfabc + mfcbc;
+         m1 = mfcbc - mfabc;
+         m0 = m2 + mfbbc;
+         mfabc = m0;
+         mfbbc = m1 - m0 * vvx;
+         mfcbc = m2 - 2. * m1 * vvx + vx2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         m2 = mfacc + mfccc;
+         m1 = mfccc - mfacc;
+         m0 = m2 + mfbcc;
+         mfacc = m0;
+         m0 += c1o9 * oMdrho;
+         mfbcc = m1 - m0 * vvx;
+         mfccc = m2 - 2. * m1 * vvx + vx2 * m0;
+         ////////////////////////////////////////////////////////////////////////////////////
+         // Cumulants
+         ////////////////////////////////////////////////////////////////////////////////////
+         LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity
+         LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
+                          //LBMReal OxyyMxzz  = 1.;//2+s9;//
+         LBMReal O4 = 1.;
+         LBMReal O5 = 1.;
+         LBMReal O6 = 1.;
+
+         //Cum 4.
+         //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+         //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+         //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+         LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+         LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+         LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+         LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+         LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+         LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+
+         //Cum 5.
+         LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+         LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+         LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+
+         //Cum 6.
+         LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb
+            - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+            - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+            - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+            + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+               + 2. * (mfcaa * mfaca * mfaac)
+               + 16. * mfbba * mfbab * mfabb)
+            - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+            - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+            + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+               + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho;
+
+
+         LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+         LBMReal mxxMyy = mfcaa - mfaca;
+         LBMReal mxxMzz = mfcaa - mfaac;
+
+         LBMReal dxux = -c1o2 * collFactorF * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz);
+         LBMReal dyuy = dxux + collFactorF * c3o2 * mxxMyy;
+         LBMReal dzuz = dxux + collFactorF * c3o2 * mxxMzz;
+
+         LBMReal Dxy = -three * collFactorF * mfbba;
+         LBMReal Dxz = -three * collFactorF * mfbab;
+         LBMReal Dyz = -three * collFactorF * mfabb;
+
+         return sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one);
+      }
+   }
 #endif
+
+
+
diff --git a/src/cpu/VirtualFluidsCore/LBM/HerschelBulkleyModelLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/HerschelBulkleyModelLBMKernel.h
new file mode 100644
index 000000000..c5cff32aa
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/HerschelBulkleyModelLBMKernel.h
@@ -0,0 +1,38 @@
+#ifndef HerschelBulkleyModelLBMKernel_H
+#define HerschelBulkleyModelLBMKernel_H
+
+#include "ThixotropyModelLBMKernel.h"
+#include "Thixotropy.h"
+
+//! \brief    Cumulant LBM kernel + Herschel-Bulkley plastic model 
+//! \author K. Kutscher, M. Geier
+class HerschelBulkleyModelLBMKernel : public ThixotropyModelLBMKernel
+{
+public:
+	HerschelBulkleyModelLBMKernel() {};
+	~HerschelBulkleyModelLBMKernel() {};
+	SPtr<LBMKernel> clone() override
+	{
+		SPtr<LBMKernel> kernel(new HerschelBulkleyModelLBMKernel());
+		kernel->setNX(nx);
+		kernel->setCollisionFactor(collFactor);
+		dynamicPointerCast<HerschelBulkleyModelLBMKernel>(kernel)->initDataSet();
+		kernel->setBCProcessor(bcProcessor->clone(kernel));
+		kernel->setWithForcing(withForcing);
+		kernel->setForcingX1(muForcingX1);
+		kernel->setForcingX2(muForcingX2);
+		kernel->setForcingX3(muForcingX3);
+		kernel->setIndex(ix1, ix2, ix3);
+		kernel->setDeltaT(deltaT);
+
+		return kernel;
+	}
+protected:
+	LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const override
+	{
+		return Thixotropy::getHerschelBulkleyCollFactor(omegaInf, shearRate, drho);
+	}
+};
+
+
+#endif
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp
new file mode 100644
index 000000000..e957b83e3
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp
@@ -0,0 +1,43 @@
+#include "Thixotropy.h"
+
+SPtr<Thixotropy> Thixotropy::instance = SPtr<Thixotropy>();
+LBMReal Thixotropy::tau0 = 0;
+LBMReal Thixotropy::k = 0;
+LBMReal Thixotropy::n = 1;
+
+//////////////////////////////////////////////////////////////////////////
+SPtr<Thixotropy> Thixotropy::getInstance()
+{
+   if (!instance)
+      instance = SPtr<Thixotropy>(new Thixotropy());
+   return instance;
+}
+
+void Thixotropy::setYieldStress(LBMReal yieldStress)
+{
+	tau0 = yieldStress;
+}
+LBMReal Thixotropy::getYieldStress()
+{
+	return tau0;
+}
+void Thixotropy::setViscosityParameter(LBMReal kParameter)
+{
+	k = kParameter;
+}
+LBMReal Thixotropy::getViscosityParameter()
+{
+	return k;
+}
+void Thixotropy::setPowerIndex(LBMReal index)
+{
+	n = index;
+}
+LBMReal Thixotropy::getPowerIndex()
+{
+	return n;
+}
+
+Thixotropy::Thixotropy()
+{
+}
\ No newline at end of file
diff --git a/src/cpu/VirtualFluidsCore/LBM/Thixotropy.h b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.h
new file mode 100644
index 000000000..bb38862b0
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.h
@@ -0,0 +1,103 @@
+#ifndef Thixotropy_H
+#define Thixotropy_H
+
+#include <PointerDefinitions.h>
+#include <LBMSystem.h>
+#include <UbMath.h>
+
+//namespace Thixotropy
+//{
+//	//////////////////////////////////////////////////////////////////////////
+//	inline LBMReal getBinghamCollFactor(LBMReal omegaInf, LBMReal yieldSterss, LBMReal shearRate, LBMReal drho)
+//	{
+//		LBMReal cs2 = one_over_sqrt3 * one_over_sqrt3;
+//		LBMReal rho = one + drho;
+//		LBMReal omega = omegaInf * (one - (omegaInf * yieldSterss) / (shearRate * cs2 * rho + UbMath::Epsilon<LBMReal>::val()));
+//		return omega;
+//	}
+//	//////////////////////////////////////////////////////////////////////////
+//	inline LBMReal getHerschelBulkleyCollFactor(LBMReal omegaInf, LBMReal yieldSterss, LBMReal shearRate, LBMReal drho, LBMReal k, LBMReal n)
+//	{
+//		LBMReal cs2 = one_over_sqrt3 * one_over_sqrt3;
+//		LBMReal rho = one + drho;
+//		LBMReal gammaDot = shearRate;
+//		LBMReal tau0 = yieldSterss;
+//		LBMReal omega = omegaInf;
+//		LBMReal epsilon = 1;
+//
+//		while (epsilon > 1e-10)
+//		{
+//			LBMReal omegaOld = omega;
+//			LBMReal gammaDotPowN = std::pow(gammaDot, n);
+//			LBMReal omegaByOmegaInfPowN = std::pow(omega / omegaInf, n);
+//			LBMReal numerator = (2.0 * gammaDotPowN * k * omegaByOmegaInfPowN * omegaInf + cs2 * gammaDot * (omega - 2.0) * rho + 2.0 * omegaInf * tau0);
+//			LBMReal denominator = (2.0 * k * n * gammaDotPowN * omegaByOmegaInfPowN * omegaInf + cs2 * gammaDot * rho * omega) + UbMath::Epsilon<LBMReal>::val();
+//			omega = omega - omega * numerator / denominator;
+//			omega = (omega < zeroReal) ? c1o2 * omegaOld : omega;
+//			epsilon = std::abs(omega - omegaOld);
+//		}
+//
+//		return omega;
+//	}
+//}
+
+class Thixotropy
+{
+public:
+	Thixotropy(Thixotropy const&) = delete;
+	Thixotropy& operator=(Thixotropy const&) = delete;
+	static SPtr<Thixotropy> getInstance();
+	void setYieldStress(LBMReal tau0);
+	LBMReal getYieldStress();
+	
+	void setViscosityParameter(LBMReal k);
+	LBMReal getViscosityParameter();
+
+	void setPowerIndex(LBMReal n);
+	LBMReal getPowerIndex();
+
+	static LBMReal getBinghamCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho);
+	static LBMReal getHerschelBulkleyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho);
+private:
+	Thixotropy();
+	
+	static SPtr<Thixotropy> instance;
+
+	static LBMReal tau0;
+	static LBMReal k;
+	static LBMReal n;
+};
+
+//////////////////////////////////////////////////////////////////////////
+inline LBMReal Thixotropy::getBinghamCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho)
+{
+	LBMReal cs2 = UbMath::one_over_sqrt3 * UbMath::one_over_sqrt3;
+	LBMReal rho = UbMath::one + drho;
+	LBMReal omega = omegaInf * (UbMath::one - (omegaInf * tau0) / (shearRate * cs2 * rho + UbMath::Epsilon<LBMReal>::val()));
+	return omega;
+}
+//////////////////////////////////////////////////////////////////////////
+inline LBMReal Thixotropy::getHerschelBulkleyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho)
+{
+	LBMReal cs2 = UbMath::one_over_sqrt3 * UbMath::one_over_sqrt3;
+	LBMReal rho = UbMath::one + drho;
+	LBMReal gammaDot = shearRate;
+	LBMReal omega = omegaInf;
+	LBMReal epsilon = 1;
+
+	while (epsilon > 1e-10)
+	{
+		LBMReal omegaOld = omega;
+		LBMReal gammaDotPowN = std::pow(gammaDot, n);
+		LBMReal omegaByOmegaInfPowN = std::pow(omega / omegaInf, n);
+		LBMReal numerator = (2.0 * gammaDotPowN * k * omegaByOmegaInfPowN * omegaInf + cs2 * gammaDot * (omega - 2.0) * rho + 2.0 * omegaInf * tau0);
+		LBMReal denominator = (2.0 * k * n * gammaDotPowN * omegaByOmegaInfPowN * omegaInf + cs2 * gammaDot * rho * omega) + UbMath::Epsilon<LBMReal>::val();
+		omega = omega - omega * numerator / denominator;
+		omega = (omega < UbMath::zeroReal) ? UbMath::c1o2 * omegaOld : omega;
+		epsilon = std::abs(omega - omegaOld);
+	}
+
+	return omega;
+}
+
+#endif
diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp
new file mode 100644
index 000000000..adbca6c6c
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp
@@ -0,0 +1,1874 @@
+#include "ThixotropyExpLBMKernel.h"
+#include "D3Q27System.h"
+#include "InterpolationProcessor.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include <math.h>
+#include "DataSet3D.h"
+#include "LBMKernel.h"
+
+#define PROOF_CORRECTNESS
+
+//////////////////////////////////////////////////////////////////////////
+ThixotropyExpLBMKernel::ThixotropyExpLBMKernel()
+{
+   this->parameter = ThixotropyExpLBMKernel::NORMAL;
+	this->compressible = false;
+	//this->TwoDistributions = true;
+}
+//////////////////////////////////////////////////////////////////////////
+ThixotropyExpLBMKernel::~ThixotropyExpLBMKernel(void)
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyExpLBMKernel::initDataSet()
+{
+	//DistributionArray3DPtr d(new D3Q27EsoTwist3DSplittedVector(nx1+ghostLayerWitdh*2, nx2+ghostLayerWitdh*2, nx3+ghostLayerWitdh*2, -999.0));
+	SPtr<DistributionArray3D> df(new D3Q27EsoTwist3DSplittedVector(nx[0]+2, nx[1]+2, nx[2]+2, -999.0));
+	SPtr<DistributionArray3D> dh(new D3Q27EsoTwist3DSplittedVector(nx[0]+2, nx[1]+2, nx[2]+2, -999.0));
+	dataSet->setFdistributions(df);
+	dataSet->setHdistributions(dh);
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<LBMKernel> ThixotropyExpLBMKernel::clone()
+{
+	SPtr<LBMKernel> kernel(new ThixotropyExpLBMKernel());
+	kernel->setNX(nx);
+	kernel->setCollisionFactor(collFactor);
+	collFactorF = collFactor;
+	collFactorH = collFactor;
+	dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->initDataSet();
+	dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->setCollisionFactorF(this->collFactorF);
+	dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->setCollisionFactorH(this->collFactorH);
+	dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->setAlpha(this->alpha);
+	dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->setTheta(this->theta);
+	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);
+
+	switch (parameter)
+	{
+	case NORMAL:
+		dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->OxyyMxzz = 1.0;
+		break;
+	case MAGIC:
+		dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->OxyyMxzz = 2.0 + (-collFactorF);
+		break;
+	}
+	return kernel;
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyExpLBMKernel::calculate(int step)
+{
+	using namespace D3Q27System;
+
+	//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);
+
+		LBMReal forcingX1 = 0;
+		LBMReal forcingX2 = 0;
+		LBMReal forcingX3 = 0;
+	}
+	/////////////////////////////////////
+
+	localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+	nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+	zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
+
+	localDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions();
+	nonLocalDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
+	zeroDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->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;
+
+
+	//#pragma omp parallel num_threads(8)
+	{
+		//   int i = omp_get_thread_num();
+		//   printf_s("Hello from thread %d\n", i);
+		//}
+		//#pragma omp for 
+		for (int x3 = minX3; x3 < maxX3; x3++)
+		{
+			for (int x2 = minX2; x2 < maxX2; x2++)
+			{
+				for (int x1 = minX1; x1 < maxX1; x1++)
+				{
+					if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3))
+					{
+						int x1p = x1 + 1;
+						int x2p = x2 + 1;
+						int x3p = x3 + 1;
+						//////////////////////////////////////////////////////////////////////////
+						//read distribution
+						// Cumulant (NSE part) 
+						////////////////////////////////////////////////////////////////////////////
+						//////////////////////////////////////////////////////////////////////////
+
+						LBMReal mfcbb = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
+						LBMReal mfbcb = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
+						LBMReal mfbbc = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
+						LBMReal mfccb = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
+						LBMReal mfacb = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
+						LBMReal mfcbc = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
+						LBMReal mfabc = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
+						LBMReal mfbcc = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
+						LBMReal mfbac = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
+						LBMReal mfccc = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
+						LBMReal mfacc = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
+						LBMReal mfcac = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
+						LBMReal mfaac = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
+								  
+						LBMReal mfabb = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
+						LBMReal mfbab = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
+						LBMReal mfbba = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
+						LBMReal mfaab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
+						LBMReal mfcab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
+						LBMReal mfaba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
+						LBMReal mfcba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
+						LBMReal mfbaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
+						LBMReal mfbca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
+						LBMReal mfaaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						LBMReal mfcaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						LBMReal mfaca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						LBMReal mfcca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
+								  
+						LBMReal mfbbb = (*this->zeroDistributionsH)(x1, x2, x3);
+
+						LBMReal lambda = (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;
+
+						//E   N  T
+						//c   c  c
+						//////////
+						//W   S  B
+						//a   a  a
+
+						//Rest ist b
+
+						//mfxyz
+						//a - negative
+						//b - null
+						//c - positive
+
+						// a b c
+						//-1 0 1
+
+						mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+						mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+						mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+						mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+						mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+						mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+						mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+						mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+						mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+						mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+						mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+						mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+						mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+						mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+						mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+						mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+						mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+						mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+						mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+						mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+						mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+						mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+						mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+						mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+						LBMReal m0, m1, m2;
+
+						LBMReal rho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+							+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+							+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+
+						LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+							(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+							(mfcbb - mfabb));
+						LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+							(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+							(mfbcb - mfbab));
+						LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+							(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+							(mfbbc - mfbba));
+						
+
+						LBMReal eta0 = (1/collFactor-c1o2)*c1o3;
+						LBMReal eta = (1 + lambda)* eta0;
+						//collFactorF = one/(3*eta/(rho+one)+c1o2);
+						collFactorF = collFactor;
+
+						//forcing 
+						///////////////////////////////////////////////////////////////////////////////////////////
+						if (withForcing)
+						{
+							muX1 = static_cast<double>(x1 - 1 + ix1*maxX1);
+							muX2 = static_cast<double>(x2 - 1 + ix2*maxX2);
+							muX3 = static_cast<double>(x3 - 1 + ix3*maxX3);
+
+							forcingX1 = muForcingX1.Eval();
+							forcingX2 = muForcingX2.Eval();
+							forcingX3 = muForcingX3.Eval();
+
+							vvx += forcingX1*deltaT*0.5; // X
+							vvy += forcingX2*deltaT*0.5; // Y
+							vvz += forcingX3*deltaT*0.5; // Z
+						}
+						///////////////////////////////////////////////////////////////////////////////////////////               
+						LBMReal oMdrho;
+
+						oMdrho = mfccc + mfaaa;
+						m0 = mfaca + mfcac;
+						m1 = mfacc + mfcaa;
+						m2 = mfaac + mfcca;
+						oMdrho += m0;
+						m1 += m2;
+						oMdrho += m1;
+						m0 = mfbac + mfbca;
+						m1 = mfbaa + mfbcc;
+						m0 += m1;
+						m1 = mfabc + mfcba;
+						m2 = mfaba + mfcbc;
+						m1 += m2;
+						m0 += m1;
+						m1 = mfacb + mfcab;
+						m2 = mfaab + mfccb;
+						m1 += m2;
+						m0 += m1;
+						oMdrho += m0;
+						m0 = mfabb + mfcbb;
+						m1 = mfbab + mfbcb;
+						m2 = mfbba + mfbbc;
+						m0 += m1 + m2;
+						m0 += mfbbb; //hat gefehlt
+						oMdrho = 1. - (oMdrho + m0);
+
+						LBMReal vx2;
+						LBMReal vy2;
+						LBMReal vz2;
+						vx2 = vvx*vvx;
+						vy2 = vvy*vvy;
+						vz2 = vvz*vvz;
+						////////////////////////////////////////////////////////////////////////////////////
+						LBMReal wadjust;
+						LBMReal qudricLimit = 0.01;
+						////////////////////////////////////////////////////////////////////////////////////
+						//Hin
+						////////////////////////////////////////////////////////////////////////////////////
+						// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						m2 = mfaaa + mfaac;
+						m1 = mfaac - mfaaa;
+						m0 = m2 + mfaab;
+						mfaaa = m0;
+						m0 += c1o36 * oMdrho;
+						mfaab = m1 - m0 * vvz;
+						mfaac = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaba + mfabc;
+						m1 = mfabc - mfaba;
+						m0 = m2 + mfabb;
+						mfaba = m0;
+						m0 += c1o9 * oMdrho;
+						mfabb = m1 - m0 * vvz;
+						mfabc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaca + mfacc;
+						m1 = mfacc - mfaca;
+						m0 = m2 + mfacb;
+						mfaca = m0;
+						m0 += c1o36 * oMdrho;
+						mfacb = m1 - m0 * vvz;
+						mfacc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbaa + mfbac;
+						m1 = mfbac - mfbaa;
+						m0 = m2 + mfbab;
+						mfbaa = m0;
+						m0 += c1o9 * oMdrho;
+						mfbab = m1 - m0 * vvz;
+						mfbac = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbba + mfbbc;
+						m1 = mfbbc - mfbba;
+						m0 = m2 + mfbbb;
+						mfbba = m0;
+						m0 += c4o9 * oMdrho;
+						mfbbb = m1 - m0 * vvz;
+						mfbbc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbca + mfbcc;
+						m1 = mfbcc - mfbca;
+						m0 = m2 + mfbcb;
+						mfbca = m0;
+						m0 += c1o9 * oMdrho;
+						mfbcb = m1 - m0 * vvz;
+						mfbcc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcaa + mfcac;
+						m1 = mfcac - mfcaa;
+						m0 = m2 + mfcab;
+						mfcaa = m0;
+						m0 += c1o36 * oMdrho;
+						mfcab = m1 - m0 * vvz;
+						mfcac = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcba + mfcbc;
+						m1 = mfcbc - mfcba;
+						m0 = m2 + mfcbb;
+						mfcba = m0;
+						m0 += c1o9 * oMdrho;
+						mfcbb = m1 - m0 * vvz;
+						mfcbc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcca + mfccc;
+						m1 = mfccc - mfcca;
+						m0 = m2 + mfccb;
+						mfcca = m0;
+						m0 += c1o36 * oMdrho;
+						mfccb = m1 - m0 * vvz;
+						mfccc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						m2 = mfaaa + mfaca;
+						m1 = mfaca - mfaaa;
+						m0 = m2 + mfaba;
+						mfaaa = m0;
+						m0 += c1o6 * oMdrho;
+						mfaba = m1 - m0 * vvy;
+						mfaca = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaab + mfacb;
+						m1 = mfacb - mfaab;
+						m0 = m2 + mfabb;
+						mfaab = m0;
+						mfabb = m1 - m0 * vvy;
+						mfacb = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaac + mfacc;
+						m1 = mfacc - mfaac;
+						m0 = m2 + mfabc;
+						mfaac = m0;
+						m0 += c1o18 * oMdrho;
+						mfabc = m1 - m0 * vvy;
+						mfacc = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbaa + mfbca;
+						m1 = mfbca - mfbaa;
+						m0 = m2 + mfbba;
+						mfbaa = m0;
+						m0 += c2o3 * oMdrho;
+						mfbba = m1 - m0 * vvy;
+						mfbca = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbab + mfbcb;
+						m1 = mfbcb - mfbab;
+						m0 = m2 + mfbbb;
+						mfbab = m0;
+						mfbbb = m1 - m0 * vvy;
+						mfbcb = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbac + mfbcc;
+						m1 = mfbcc - mfbac;
+						m0 = m2 + mfbbc;
+						mfbac = m0;
+						m0 += c2o9 * oMdrho;
+						mfbbc = m1 - m0 * vvy;
+						mfbcc = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcaa + mfcca;
+						m1 = mfcca - mfcaa;
+						m0 = m2 + mfcba;
+						mfcaa = m0;
+						m0 += c1o6 * oMdrho;
+						mfcba = m1 - m0 * vvy;
+						mfcca = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcab + mfccb;
+						m1 = mfccb - mfcab;
+						m0 = m2 + mfcbb;
+						mfcab = m0;
+						mfcbb = m1 - m0 * vvy;
+						mfccb = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcac + mfccc;
+						m1 = mfccc - mfcac;
+						m0 = m2 + mfcbc;
+						mfcac = m0;
+						m0 += c1o18 * oMdrho;
+						mfcbc = m1 - m0 * vvy;
+						mfccc = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						m2 = mfaaa + mfcaa;
+						m1 = mfcaa - mfaaa;
+						m0 = m2 + mfbaa;
+						mfaaa = m0;
+						m0 += 1. * oMdrho;
+						mfbaa = m1 - m0 * vvx;
+						mfcaa = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaba + mfcba;
+						m1 = mfcba - mfaba;
+						m0 = m2 + mfbba;
+						mfaba = m0;
+						mfbba = m1 - m0 * vvx;
+						mfcba = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaca + mfcca;
+						m1 = mfcca - mfaca;
+						m0 = m2 + mfbca;
+						mfaca = m0;
+						m0 += c1o3 * oMdrho;
+						mfbca = m1 - m0 * vvx;
+						mfcca = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaab + mfcab;
+						m1 = mfcab - mfaab;
+						m0 = m2 + mfbab;
+						mfaab = m0;
+						mfbab = m1 - m0 * vvx;
+						mfcab = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfabb + mfcbb;
+						m1 = mfcbb - mfabb;
+						m0 = m2 + mfbbb;
+						mfabb = m0;
+						mfbbb = m1 - m0 * vvx;
+						mfcbb = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfacb + mfccb;
+						m1 = mfccb - mfacb;
+						m0 = m2 + mfbcb;
+						mfacb = m0;
+						mfbcb = m1 - m0 * vvx;
+						mfccb = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaac + mfcac;
+						m1 = mfcac - mfaac;
+						m0 = m2 + mfbac;
+						mfaac = m0;
+						m0 += c1o3 * oMdrho;
+						mfbac = m1 - m0 * vvx;
+						mfcac = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfabc + mfcbc;
+						m1 = mfcbc - mfabc;
+						m0 = m2 + mfbbc;
+						mfabc = m0;
+						mfbbc = m1 - m0 * vvx;
+						mfcbc = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfacc + mfccc;
+						m1 = mfccc - mfacc;
+						m0 = m2 + mfbcc;
+						mfacc = m0;
+						m0 += c1o9 * oMdrho;
+						mfbcc = m1 - m0 * vvx;
+						mfccc = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						// Cumulants
+						////////////////////////////////////////////////////////////////////////////////////
+						LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity
+						LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
+											  //LBMReal OxyyMxzz  = 1.;//2+s9;//
+						LBMReal O4 = 1.;
+						LBMReal O5 = 1.;
+						LBMReal O6 = 1.;
+
+						//Cum 4.
+						//LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+						//LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+						//LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+						LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+						LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+						LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+						LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho);
+						LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho - 1)*oMdrho);
+						LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho);
+
+						//Cum 5.
+						LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+						LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+						LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+
+						//Cum 6.
+						LBMReal CUMccc = mfccc + ((-4. *  mfbbb * mfbbb
+							- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+							- 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+							- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+							+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+								+ 2. * (mfcaa * mfaca * mfaac)
+								+ 16. *  mfbba * mfbab * mfabb)
+							- c1o3* (mfacc + mfcac + mfcca) * oMdrho - c1o9*oMdrho*oMdrho
+							- c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1. - 2.* oMdrho) - c1o27* oMdrho * oMdrho*(-2.* oMdrho)
+							+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+								+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) + c1o27*oMdrho;
+
+						//2.
+						// linear combinations
+						LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+						LBMReal mxxMyy = mfcaa - mfaca;
+						LBMReal mxxMzz = mfcaa - mfaac;
+
+						LBMReal dxux = -c1o2 * collFactorF *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz*(mfaaa - mxxPyyPzz);
+						LBMReal dyuy = dxux + collFactorF * c3o2 * mxxMyy;
+						LBMReal dzuz = dxux + collFactorF * c3o2 * mxxMzz;
+
+						LBMReal Dxy =-three*collFactorF*mfbba;
+                  LBMReal Dxz =-three*collFactorF*mfbab;
+                  LBMReal Dyz =-three*collFactorF*mfabb;
+
+						LBMReal gammaDot = sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one);
+						//collFactorF = BinghamModel::getBinghamCollFactor(collFactorF, gammaDot, rho);
+
+						//relax
+						mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+						mxxMyy += collFactorF * (-mxxMyy) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vy2 * dyuy);
+						mxxMzz += collFactorF * (-mxxMzz) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vz2 * dzuz);
+
+						mfabb += collFactorF * (-mfabb);
+						mfbab += collFactorF * (-mfbab);
+						mfbba += collFactorF * (-mfbba);
+
+						// linear combinations back
+						mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+						mfaca = c1o3 * (-2. *  mxxMyy + mxxMzz + mxxPyyPzz);
+						mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+
+						//3.
+						// linear combinations
+						LBMReal mxxyPyzz = mfcba + mfabc;
+						LBMReal mxxyMyzz = mfcba - mfabc;
+
+						LBMReal mxxzPyyz = mfcab + mfacb;
+						LBMReal mxxzMyyz = mfcab - mfacb;
+
+						LBMReal mxyyPxzz = mfbca + mfbac;
+						LBMReal mxyyMxzz = mfbca - mfbac;
+
+						//relax
+						wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
+						mfbbb += wadjust * (-mfbbb);
+						wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
+						mxxyPyzz += wadjust * (-mxxyPyzz);
+						wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
+						mxxyMyzz += wadjust * (-mxxyMyzz);
+						wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
+						mxxzPyyz += wadjust * (-mxxzPyyz);
+						wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
+						mxxzMyyz += wadjust * (-mxxzMyyz);
+						wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
+						mxyyPxzz += wadjust * (-mxyyPxzz);
+						wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
+						mxyyMxzz += wadjust * (-mxyyMxzz);
+
+						// linear combinations back
+						mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+						mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+						mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+						mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+						mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+						mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+
+						//4.
+						CUMacc += O4 * (-CUMacc);
+						CUMcac += O4 * (-CUMcac);
+						CUMcca += O4 * (-CUMcca);
+
+						CUMbbc += O4 * (-CUMbbc);
+						CUMbcb += O4 * (-CUMbcb);
+						CUMcbb += O4 * (-CUMcbb);
+
+						//5.
+						CUMbcc += O5 * (-CUMbcc);
+						CUMcbc += O5 * (-CUMcbc);
+						CUMccb += O5 * (-CUMccb);
+
+						//6.
+						CUMccc += O6 * (-CUMccc);
+
+						//back cumulants to central moments
+						//4.
+						//mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+						//mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+						//mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+						mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+						mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+						mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+						mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho;
+						mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho - 1)*oMdrho;
+						mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho;
+
+						//5.
+						mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
+						mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
+						mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
+
+						//6.
+						mfccc = CUMccc - ((-4. *  mfbbb * mfbbb
+							- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+							- 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
+							- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+							+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+								+ 2. * (mfcaa * mfaca * mfaac)
+								+ 16. *  mfbba * mfbab * mfabb)
+							- c1o3* (mfacc + mfcac + mfcca) * oMdrho - c1o9*oMdrho*oMdrho
+							- c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1. - 2.* oMdrho) - c1o27* oMdrho * oMdrho*(-2.* oMdrho)
+							+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+								+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) - c1o27*oMdrho;
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//forcing
+						mfbaa = -mfbaa;
+						mfaba = -mfaba;
+						mfaab = -mfaab;
+						//////////////////////////////////////////////////////////////////////////////////////
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//back
+						////////////////////////////////////////////////////////////////////////////////////
+						//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfaac - 2. * mfaab *  vvz + mfaaa                * (1. - vz2) - 1. * oMdrho * vz2;
+						m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2;
+						mfaaa = m0;
+						mfaab = m1;
+						mfaac = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+						m1 = -mfabc - 2. * mfabb *  vvz + mfaba * (1. - vz2);
+						m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+						mfaba = m0;
+						mfabb = m1;
+						mfabc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfacc - 2. * mfacb *  vvz + mfaca                  * (1. - vz2) - c1o3 * oMdrho * vz2;
+						m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+						mfaca = m0;
+						mfacb = m1;
+						mfacc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+						m1 = -mfbac - 2. * mfbab *  vvz + mfbaa * (1. - vz2);
+						m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+						mfbaa = m0;
+						mfbab = m1;
+						mfbac = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+						m1 = -mfbbc - 2. * mfbbb *  vvz + mfbba * (1. - vz2);
+						m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+						mfbba = m0;
+						mfbbb = m1;
+						mfbbc = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+						m1 = -mfbcc - 2. * mfbcb *  vvz + mfbca * (1. - vz2);
+						m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+						mfbca = m0;
+						mfbcb = m1;
+						mfbcc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfcac - 2. * mfcab *  vvz + mfcaa                  * (1. - vz2) - c1o3 * oMdrho * vz2;
+						m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+						mfcaa = m0;
+						mfcab = m1;
+						mfcac = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+						m1 = -mfcbc - 2. * mfcbb *  vvz + mfcba * (1. - vz2);
+						m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+						mfcba = m0;
+						mfcbb = m1;
+						mfcbc = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfccc - 2. * mfccb *  vvz + mfcca                  * (1. - vz2) - c1o9 * oMdrho * vz2;
+						m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+						mfcca = m0;
+						mfccb = m1;
+						mfccc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						//mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfaca - 2. * mfaba *  vvy + mfaaa                  * (1. - vy2) - c1o6 * oMdrho * vy2;
+						m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfaaa = m0;
+						mfaba = m1;
+						mfaca = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfacb - 2. * mfabb *  vvy + mfaab                  * (1. - vy2) - c2o3 * oMdrho * vy2;
+						m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfaab = m0;
+						mfabb = m1;
+						mfacb = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfacc - 2. * mfabc *  vvy + mfaac                  * (1. - vy2) - c1o6 * oMdrho * vy2;
+						m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfaac = m0;
+						mfabc = m1;
+						mfacc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+						m1 = -mfbca - 2. * mfbba *  vvy + mfbaa * (1. - vy2);
+						m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+						mfbaa = m0;
+						mfbba = m1;
+						mfbca = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+						m1 = -mfbcb - 2. * mfbbb *  vvy + mfbab * (1. - vy2);
+						m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+						mfbab = m0;
+						mfbbb = m1;
+						mfbcb = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+						m1 = -mfbcc - 2. * mfbbc *  vvy + mfbac * (1. - vy2);
+						m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+						mfbac = m0;
+						mfbbc = m1;
+						mfbcc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfcca - 2. * mfcba *  vvy + mfcaa                   * (1. - vy2) - c1o18 * oMdrho * vy2;
+						m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfcaa = m0;
+						mfcba = m1;
+						mfcca = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfccb - 2. * mfcbb *  vvy + mfcab                  * (1. - vy2) - c2o9 * oMdrho * vy2;
+						m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfcab = m0;
+						mfcbb = m1;
+						mfccb = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfccc - 2. * mfcbc *  vvy + mfcac                   * (1. - vy2) - c1o18 * oMdrho * vy2;
+						m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfcac = m0;
+						mfcbc = m1;
+						mfccc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						//mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcaa - 2. * mfbaa *  vvx + mfaaa                   * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaaa = m0;
+						mfbaa = m1;
+						mfcaa = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcba - 2. * mfbba *  vvx + mfaba                  * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaba = m0;
+						mfbba = m1;
+						mfcba = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcca - 2. * mfbca *  vvx + mfaca                   * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaca = m0;
+						mfbca = m1;
+						mfcca = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcab - 2. * mfbab *  vvx + mfaab                  * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaab = m0;
+						mfbab = m1;
+						mfcab = m2;
+						///////////b////////////////////////////////////////////////////////////////////////
+						m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcbb - 2. * mfbbb *  vvx + mfabb                  * (1. - vx2) - c4o9 * oMdrho * vx2;
+						m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfabb = m0;
+						mfbbb = m1;
+						mfcbb = m2;
+						///////////b////////////////////////////////////////////////////////////////////////
+						m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfccb - 2. * mfbcb *  vvx + mfacb                  * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfacb = m0;
+						mfbcb = m1;
+						mfccb = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcac - 2. * mfbac *  vvx + mfaac                   * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaac = m0;
+						mfbac = m1;
+						mfcac = m2;
+						///////////c////////////////////////////////////////////////////////////////////////
+						m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcbc - 2. * mfbbc *  vvx + mfabc                  * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfabc = m0;
+						mfbbc = m1;
+						mfcbc = m2;
+						///////////c////////////////////////////////////////////////////////////////////////
+						m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfccc - 2. * mfbcc *  vvx + mfacc                   * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfacc = m0;
+						mfbcc = m1;
+						mfccc = m2;
+
+						//////////////////////////////////////////////////////////////////////////
+						//proof correctness
+						//////////////////////////////////////////////////////////////////////////
+#ifdef  PROOF_CORRECTNESS
+						LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+							+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+							+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+						//LBMReal dif = fabs(rho - rho_post);
+						LBMReal dif = rho - rho_post;
+#ifdef SINGLEPRECISION
+						if (dif > 10.0E-7 || dif < -10.0E-7)
+#else
+						if (dif > 10.0E-15 || dif < -10.0E-15)
+#endif					
+						{
+							UB_THROW(UbException(UB_EXARGS, "rho=" + UbSystem::toString(rho) + ", rho_post=" + UbSystem::toString(rho_post)
+								+ " dif=" + UbSystem::toString(dif)
+								+ " rho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+							//UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): rho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+							//exit(EXIT_FAILURE);
+						}
+#endif
+						//////////////////////////////////////////////////////////////////////////
+						//write distribution
+						//////////////////////////////////////////////////////////////////////////
+						(*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb;
+						(*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab;
+						(*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba;
+						(*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab;
+						(*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab;
+						(*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba;
+						(*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba;
+						(*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa;
+						(*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca;
+						(*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa;
+						(*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa;
+						(*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca;
+						(*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac;
+
+						(*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+						LBMReal ux, uy, uz;
+
+						ux = vvx;						
+						uy = vvy;
+						uz = vvz;
+							
+							
+
+				
+						////////////////////////////////////////////////////////////////////////////
+						// Central Factorized Moment (advection diffusion part) 
+						//////////////////////////////////////////////////////////////////////////
+						//////////////////////////////////////////////////////////////////////////
+						//read distribution
+
+						mfcbb = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
+						mfbcb = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
+						mfbbc = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
+						mfccb = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
+						mfacb = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
+						mfcbc = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
+						mfabc = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
+						mfbcc = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
+						mfbac = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
+						mfccc = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
+						mfacc = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
+						mfcac = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
+						mfaac = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+						mfabb = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
+						mfbab = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
+						mfbba = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
+						mfaab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
+						mfcab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
+						mfaba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
+						mfcba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
+						mfbaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
+						mfbca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
+						mfaaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						mfcaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						mfaca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						mfcca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+						mfbbb = (*this->zeroDistributionsH)(x1, x2, x3);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						LBMReal drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+							(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+							((mfabb + mfcbb) + (mfbab + mfbcb)) + (mfbba + mfbbc)) + mfbbb;
+					
+						//flocculation
+						//LBMReal lambda = drho;
+
+						//LBMReal theta = 60 * 1.28172e+06;
+						//LBMReal alpha = 0.005;// *10.0;
+
+						//LBMReal gammaDot = sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one);
+
+						//collFactorF = collFactorF - 1e-4 / (gammaDot + one * 1e-9);
+
+						//collFactorF = (collFactorF < 0.5) ? 0.5 : collFactorF;
+
+						LBMReal dlambda = one / theta - alpha * lambda * gammaDot;
+
+
+						//////////////////////////////////////////////////////////////////////////
+						//collision Factorized Central moment Kernel Geier 2015
+						//////////////////////////////////////////////////////////////////////////               
+						LBMReal Mom000 = mfaaa + mfaab + mfaac + mfaba + mfabb + mfabc + mfaca +
+							mfacb + mfacc + mfbaa + mfbab + mfbac + mfbba + mfbbb + mfbbc + mfbca +
+							mfbcb + mfbcc + mfcaa + mfcab + mfcac + mfcba + mfcbb + mfcbc + mfcca + mfccb + mfccc;
+						
+						Mom000 += dlambda*c1o2;  //1
+
+																												   //(100)//
+						LBMReal Mom100 = mfaaa*(-1 - ux) + mfaab*(-1 - ux) + mfaac*(-1 - ux) + mfaba*(-1 - ux) + mfabb*(-1 - ux) + mfabc*(-1 - ux) + mfaca*(-1 - ux) +
+							mfacb*(-1 - ux) + mfacc*(-1 - ux) + mfcaa*(1 - ux) + mfcab*(1 - ux) + mfcac*(1 - ux) + mfcba*(1 - ux) + mfcbb*(1 - ux) +
+							mfcbc*(1 - ux) + mfcca*(1 - ux) + mfccb*(1 - ux) + mfccc*(1 - ux) - mfbaa*ux - mfbab*ux - mfbac*ux - mfbba*ux - mfbbb*ux -
+							mfbbc*ux - mfbca*ux - mfbcb*ux - mfbcc*ux;
+
+						LBMReal Mom010 = mfaaa*(-1 - uy) + mfaab*(-1 - uy) + mfaac*(-1 - uy) + mfbaa*(-1 - uy) + mfbab*(-1 - uy) + mfbac*(-1 - uy) + mfcaa*(-1 - uy) +
+							mfcab*(-1 - uy) + mfcac*(-1 - uy) + mfaca*(1 - uy) + mfacb*(1 - uy) + mfacc*(1 - uy) + mfbca*(1 - uy) + mfbcb*(1 - uy) +
+							mfbcc*(1 - uy) + mfcca*(1 - uy) + mfccb*(1 - uy) + mfccc*(1 - uy) - mfaba*uy - mfabb*uy - mfabc*uy - mfbba*uy - mfbbb*uy -
+							mfbbc*uy - mfcba*uy - mfcbb*uy - mfcbc*uy;
+
+						LBMReal Mom001 = mfaaa*(-1 - uz) + mfaba*(-1 - uz) + mfaca*(-1 - uz) + mfbaa*(-1 - uz) + mfbba*(-1 - uz) + mfbca*(-1 - uz) + mfcaa*(-1 - uz) +
+							mfcba*(-1 - uz) + mfcca*(-1 - uz) + mfaac*(1 - uz) + mfabc*(1 - uz) + mfacc*(1 - uz) + mfbac*(1 - uz) + mfbbc*(1 - uz) +
+							mfbcc*(1 - uz) + mfcac*(1 - uz) + mfcbc*(1 - uz) + mfccc*(1 - uz) - mfaab*uz - mfabb*uz - mfacb*uz - mfbab*uz - mfbbb*uz -
+							mfbcb*uz - mfcab*uz - mfcbb*uz - mfccb*uz;
+						////
+
+						//(110)//
+						LBMReal Mom110 = mfaaa*(-1 - ux)*(-1 - uy) + mfaab*(-1 - ux)*(-1 - uy) + mfaac*(-1 - ux)*(-1 - uy) + mfcaa*(1 - ux)*(-1 - uy) +
+							mfcab*(1 - ux)*(-1 - uy) + mfcac*(1 - ux)*(-1 - uy) - mfbaa*ux*(-1 - uy) - mfbab*ux*(-1 - uy) - mfbac*ux*(-1 - uy) +
+							mfaca*(-1 - ux)*(1 - uy) + mfacb*(-1 - ux)*(1 - uy) + mfacc*(-1 - ux)*(1 - uy) + mfcca*(1 - ux)*(1 - uy) + mfccb*(1 - ux)*(1 - uy) +
+							mfccc*(1 - ux)*(1 - uy) - mfbca*ux*(1 - uy) - mfbcb*ux*(1 - uy) - mfbcc*ux*(1 - uy) - mfaba*(-1 - ux)*uy - mfabb*(-1 - ux)*uy -
+							mfabc*(-1 - ux)*uy - mfcba*(1 - ux)*uy - mfcbb*(1 - ux)*uy - mfcbc*(1 - ux)*uy + mfbba*ux*uy + mfbbb*ux*uy + mfbbc*ux*uy;
+
+						LBMReal Mom101 = mfaaa*(-1 - ux)*(-1 - uz) + mfaba*(-1 - ux)*(-1 - uz) + mfaca*(-1 - ux)*(-1 - uz) + mfcaa*(1 - ux)*(-1 - uz) +
+							mfcba*(1 - ux)*(-1 - uz) + mfcca*(1 - ux)*(-1 - uz) - mfbaa*ux*(-1 - uz) - mfbba*ux*(-1 - uz) - mfbca*ux*(-1 - uz) +
+							mfaac*(-1 - ux)*(1 - uz) + mfabc*(-1 - ux)*(1 - uz) + mfacc*(-1 - ux)*(1 - uz) + mfcac*(1 - ux)*(1 - uz) + mfcbc*(1 - ux)*(1 - uz) +
+							mfccc*(1 - ux)*(1 - uz) - mfbac*ux*(1 - uz) - mfbbc*ux*(1 - uz) - mfbcc*ux*(1 - uz) - mfaab*(-1 - ux)*uz - mfabb*(-1 - ux)*uz -
+							mfacb*(-1 - ux)*uz - mfcab*(1 - ux)*uz - mfcbb*(1 - ux)*uz - mfccb*(1 - ux)*uz + mfbab*ux*uz + mfbbb*ux*uz + mfbcb*ux*uz;
+
+						LBMReal Mom011 = mfaaa*(-1 - uy)*(-1 - uz) + mfbaa*(-1 - uy)*(-1 - uz) + mfcaa*(-1 - uy)*(-1 - uz) + mfaca*(1 - uy)*(-1 - uz) +
+							mfbca*(1 - uy)*(-1 - uz) + mfcca*(1 - uy)*(-1 - uz) - mfaba*uy*(-1 - uz) - mfbba*uy*(-1 - uz) - mfcba*uy*(-1 - uz) +
+							mfaac*(-1 - uy)*(1 - uz) + mfbac*(-1 - uy)*(1 - uz) + mfcac*(-1 - uy)*(1 - uz) + mfacc*(1 - uy)*(1 - uz) + mfbcc*(1 - uy)*(1 - uz) +
+							mfccc*(1 - uy)*(1 - uz) - mfabc*uy*(1 - uz) - mfbbc*uy*(1 - uz) - mfcbc*uy*(1 - uz) - mfaab*(-1 - uy)*uz - mfbab*(-1 - uy)*uz -
+							mfcab*(-1 - uy)*uz - mfacb*(1 - uy)*uz - mfbcb*(1 - uy)*uz - mfccb*(1 - uy)*uz + mfabb*uy*uz + mfbbb*uy*uz + mfcbb*uy*uz;
+						////
+
+						LBMReal Mom111 = mfaaa*(-1 - ux)*(-1 - uy)*(-1 - uz) + mfcaa*(1 - ux)*(-1 - uy)*(-1 - uz) - mfbaa*ux*(-1 - uy)*(-1 - uz) +
+							mfaca*(-1 - ux)*(1 - uy)*(-1 - uz) + mfcca*(1 - ux)*(1 - uy)*(-1 - uz) - mfbca*ux*(1 - uy)*(-1 - uz) -
+							mfaba*(-1 - ux)*uy*(-1 - uz) - mfcba*(1 - ux)*uy*(-1 - uz) + mfbba*ux*uy*(-1 - uz) + mfaac*(-1 - ux)*(-1 - uy)*(1 - uz) +
+							mfcac*(1 - ux)*(-1 - uy)*(1 - uz) - mfbac*ux*(-1 - uy)*(1 - uz) + mfacc*(-1 - ux)*(1 - uy)*(1 - uz) +
+							mfccc*(1 - ux)*(1 - uy)*(1 - uz) - mfbcc*ux*(1 - uy)*(1 - uz) - mfabc*(-1 - ux)*uy*(1 - uz) - mfcbc*(1 - ux)*uy*(1 - uz) +
+							mfbbc*ux*uy*(1 - uz) - mfaab*(-1 - ux)*(-1 - uy)*uz - mfcab*(1 - ux)*(-1 - uy)*uz + mfbab*ux*(-1 - uy)*uz -
+							mfacb*(-1 - ux)*(1 - uy)*uz - mfccb*(1 - ux)*(1 - uy)*uz + mfbcb*ux*(1 - uy)*uz + mfabb*(-1 - ux)*uy*uz + mfcbb*(1 - ux)*uy*uz -
+							mfbbb*ux*uy*uz;
+
+						//(200)//
+						LBMReal Mom200 = ((mfcaa + mfcab + mfcac + mfcba + mfcbb + mfcbc + mfcca + mfccb +
+							mfccc)*pow(-1 + ux, 2) +
+							(mfbaa + mfbab + mfbac + mfbba + mfbbb + mfbbc + mfbca +
+								mfbcb + mfbcc)*pow(ux, 2) +
+								(mfaaa + mfaab + mfaac + mfaba + mfabb + mfabc + mfaca +
+									mfacb + mfacc)*pow(1 + ux, 2)) - Mom000 / 3;
+
+						LBMReal Mom020 = ((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) +
+							(mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) +
+							(mfcca + mfccb + mfccc)*pow(-1 + uy, 2) +
+							(mfaba + mfabb + mfabc)*pow(uy, 2) +
+							(mfbba + mfbbb + mfbbc)*pow(uy, 2) +
+							(mfcba + mfcbb + mfcbc)*pow(uy, 2) +
+							(mfaaa + mfaab + mfaac)*pow(1 + uy, 2) +
+							(mfbaa + mfbab + mfbac)*pow(1 + uy, 2) +
+							(mfcaa + mfcab + mfcac)*pow(1 + uy, 2)) - Mom000 / 3;
+
+						LBMReal Mom002 = (mfaba + mfabc + mfaca + mfacc + mfbba + mfbbc + mfbca + mfbcc +
+							mfcba + mfcbc + mfcca + mfccc + mfaac*pow(-1 + uz, 2) +
+							mfbac*pow(-1 + uz, 2) + mfcac*pow(-1 + uz, 2) +
+							2 * mfaba*uz - 2 * mfabc*uz + 2 * mfaca*uz - 2 * mfacc*uz +
+							2 * mfbba*uz - 2 * mfbbc*uz + 2 * mfbca*uz - 2 * mfbcc*uz +
+							2 * mfcba*uz - 2 * mfcbc*uz + 2 * mfcca*uz - 2 * mfccc*uz +
+							mfaab*pow(uz, 2) + mfaba*pow(uz, 2) + mfabb*pow(uz, 2) +
+							mfabc*pow(uz, 2) + mfaca*pow(uz, 2) + mfacb*pow(uz, 2) +
+							mfacc*pow(uz, 2) + mfbab*pow(uz, 2) + mfbba*pow(uz, 2) +
+							mfbbb*pow(uz, 2) + mfbbc*pow(uz, 2) + mfbca*pow(uz, 2) +
+							mfbcb*pow(uz, 2) + mfbcc*pow(uz, 2) + mfcab*pow(uz, 2) +
+							mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) + mfcbc*pow(uz, 2) +
+							mfcca*pow(uz, 2) + mfccb*pow(uz, 2) + mfccc*pow(uz, 2) +
+							mfaaa*pow(1 + uz, 2) + mfbaa*pow(1 + uz, 2) +
+							mfcaa*pow(1 + uz, 2)) - Mom000 / 3;
+						////
+
+						//(210)//
+						LBMReal Mom210 = (pow(1 + ux, 2)*(-((mfaca + mfacb + mfacc)*(-1 + uy)) -
+							(mfaba + mfabb + mfabc)*uy -
+							(mfaaa + mfaab + mfaac)*(1 + uy)) +
+							pow(ux, 2)*(-((mfbca + mfbcb + mfbcc)*(-1 + uy)) -
+							(mfbba + mfbbb + mfbbc)*uy -
+								(mfbaa + mfbab + mfbac)*(1 + uy)) +
+							pow(-1 + ux, 2)*(-((mfcca + mfccb + mfccc)*(-1 + uy)) -
+							(mfcba + mfcbb + mfcbc)*uy -
+								(mfcaa + mfcab + mfcac)*(1 + uy))) - Mom010 / 3;
+
+						LBMReal Mom201 = (-(pow(1 + ux, 2)*(mfaba - mfabc + mfaca - mfacc +
+							mfaac*(-1 + uz) + mfaab*uz + mfaba*uz + mfabb*uz +
+							mfabc*uz + mfaca*uz + mfacb*uz + mfacc*uz +
+							mfaaa*(1 + uz))) -
+							pow(ux, 2)*(mfbba - mfbbc + mfbca - mfbcc +
+								mfbac*(-1 + uz) + mfbab*uz + mfbba*uz + mfbbb*uz +
+								mfbbc*uz + mfbca*uz + mfbcb*uz + mfbcc*uz + mfbaa*(1 + uz))
+							- pow(-1 + ux, 2)*(mfcba - mfcbc + mfcca - mfccc +
+								mfcac*(-1 + uz) + mfcab*uz + mfcba*uz + mfcbb*uz +
+								mfcbc*uz + mfcca*uz + mfccb*uz + mfccc*uz + mfcaa*(1 + uz))) - Mom001 / 3;
+
+						LBMReal Mom120 = ((-1 - ux)*((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) +
+							(mfaba + mfabb + mfabc)*pow(uy, 2) +
+							(mfaaa + mfaab + mfaac)*pow(1 + uy, 2)) -
+							ux*((mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) +
+							(mfbba + mfbbb + mfbbc)*pow(uy, 2) +
+								(mfbaa + mfbab + mfbac)*pow(1 + uy, 2)) +
+								(1 - ux)*((mfcca + mfccb + mfccc)*pow(-1 + uy, 2) +
+							(mfcba + mfcbb + mfcbc)*pow(uy, 2) +
+									(mfcaa + mfcab + mfcac)*pow(1 + uy, 2))) - Mom100 / 3;
+
+
+						LBMReal Mom102 = (-((1 + ux)*(mfaba + mfabc + mfaca + mfacc +
+							mfaac*pow(-1 + uz, 2) + 2 * mfaba*uz - 2 * mfabc*uz +
+							2 * mfaca*uz - 2 * mfacc*uz + mfaab*pow(uz, 2) +
+							mfaba*pow(uz, 2) + mfabb*pow(uz, 2) +
+							mfabc*pow(uz, 2) + mfaca*pow(uz, 2) +
+							mfacb*pow(uz, 2) + mfacc*pow(uz, 2) +
+							mfaaa*pow(1 + uz, 2))) -
+							ux*(mfbba + mfbbc + mfbca + mfbcc + mfbac*pow(-1 + uz, 2) +
+								2 * mfbba*uz - 2 * mfbbc*uz + 2 * mfbca*uz - 2 * mfbcc*uz +
+								mfbab*pow(uz, 2) + mfbba*pow(uz, 2) +
+								mfbbb*pow(uz, 2) + mfbbc*pow(uz, 2) +
+								mfbca*pow(uz, 2) + mfbcb*pow(uz, 2) +
+								mfbcc*pow(uz, 2) + mfbaa*pow(1 + uz, 2)) -
+								(-1 + ux)*(mfcba + mfcbc + mfcca + mfccc +
+									mfcac*pow(-1 + uz, 2) + 2 * mfcba*uz - 2 * mfcbc*uz +
+									2 * mfcca*uz - 2 * mfccc*uz + mfcab*pow(uz, 2) +
+									mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) +
+									mfcbc*pow(uz, 2) + mfcca*pow(uz, 2) +
+									mfccb*pow(uz, 2) + mfccc*pow(uz, 2) +
+									mfcaa*pow(1 + uz, 2))) - Mom100 / 3;
+
+						LBMReal Mom021 = (-(pow(1 + uy, 2)*(mfaac*(-1 + uz) + mfaab*uz +
+							mfaaa*(1 + uz))) -
+							pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz + mfaba*(1 + uz)) -
+							pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz +
+								mfaca*(1 + uz)) - pow(1 + uy, 2)*
+								(mfbac*(-1 + uz) + mfbab*uz + mfbaa*(1 + uz)) -
+							pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz + mfbba*(1 + uz)) -
+							pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz +
+								mfbca*(1 + uz)) - pow(1 + uy, 2)*
+								(mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz)) -
+							pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz + mfcba*(1 + uz)) -
+							pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz + mfcca*(1 + uz))) - Mom001 / 3;
+
+						LBMReal Mom012 = (-((1 + uy)*(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) +
+							mfaaa*pow(1 + uz, 2))) -
+							uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) -
+								(-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) +
+									mfaca*pow(1 + uz, 2)) -
+									(1 + uy)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) +
+										mfbaa*pow(1 + uz, 2)) -
+							uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+								mfbba*pow(1 + uz, 2)) -
+								(-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) +
+									mfbca*pow(1 + uz, 2)) -
+									(1 + uy)*(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) +
+										mfcaa*pow(1 + uz, 2)) -
+							uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+								mfcba*pow(1 + uz, 2)) -
+								(-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) +
+									mfcca*pow(1 + uz, 2))) - Mom010 / 3;
+						////
+
+
+						//(220)//
+						LBMReal Mom220 = (pow(1 + ux, 2)*((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) +
+							(mfaba + mfabb + mfabc)*pow(uy, 2) +
+							(mfaaa + mfaab + mfaac)*pow(1 + uy, 2)) +
+							pow(ux, 2)*((mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) +
+							(mfbba + mfbbb + mfbbc)*pow(uy, 2) +
+								(mfbaa + mfbab + mfbac)*pow(1 + uy, 2)) +
+							pow(-1 + ux, 2)*((mfcca + mfccb + mfccc)*pow(-1 + uy, 2) +
+							(mfcba + mfcbb + mfcbc)*pow(uy, 2) +
+								(mfcaa + mfcab + mfcac)*pow(1 + uy, 2))) - Mom000 / 9;
+
+						LBMReal Mom202 = (pow(1 + ux, 2)*(mfaba + mfabc + mfaca + mfacc +
+							mfaac*pow(-1 + uz, 2) + 2 * mfaba*uz - 2 * mfabc*uz +
+							2 * mfaca*uz - 2 * mfacc*uz + mfaab*pow(uz, 2) +
+							mfaba*pow(uz, 2) + mfabb*pow(uz, 2) +
+							mfabc*pow(uz, 2) + mfaca*pow(uz, 2) +
+							mfacb*pow(uz, 2) + mfacc*pow(uz, 2) +
+							mfaaa*pow(1 + uz, 2)) +
+							pow(ux, 2)*(mfbba + mfbbc + mfbca + mfbcc +
+								mfbac*pow(-1 + uz, 2) + 2 * mfbba*uz - 2 * mfbbc*uz +
+								2 * mfbca*uz - 2 * mfbcc*uz + mfbab*pow(uz, 2) +
+								mfbba*pow(uz, 2) + mfbbb*pow(uz, 2) +
+								mfbbc*pow(uz, 2) + mfbca*pow(uz, 2) +
+								mfbcb*pow(uz, 2) + mfbcc*pow(uz, 2) +
+								mfbaa*pow(1 + uz, 2)) +
+							pow(-1 + ux, 2)*(mfcba + mfcbc + mfcca + mfccc +
+								mfcac*pow(-1 + uz, 2) + 2 * mfcba*uz - 2 * mfcbc*uz +
+								2 * mfcca*uz - 2 * mfccc*uz + mfcab*pow(uz, 2) +
+								mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) +
+								mfcbc*pow(uz, 2) + mfcca*pow(uz, 2) +
+								mfccb*pow(uz, 2) + mfccc*pow(uz, 2) +
+								mfcaa*pow(1 + uz, 2))) - Mom000 / 9;
+
+						LBMReal Mom022 = (pow(1 + uy, 2)*(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) +
+							mfaaa*pow(1 + uz, 2)) +
+							pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) +
+							pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) +
+								mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2)) +
+							pow(1 + uy, 2)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) +
+								mfbaa*pow(1 + uz, 2)) +
+							pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+								mfbba*pow(1 + uz, 2)) +
+							pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) +
+								mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2)) +
+							pow(1 + uy, 2)*(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) +
+								mfcaa*pow(1 + uz, 2)) +
+							pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+								mfcba*pow(1 + uz, 2)) +
+							pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) +
+								mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2))) - Mom000 / 9;
+						////
+
+						//(221)//
+						LBMReal Mom221 = (pow(1 + ux, 2)*(-(pow(1 + uy, 2)*
+							(mfaac*(-1 + uz) + mfaab*uz + mfaaa*(1 + uz))) -
+							pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz +
+								mfaba*(1 + uz)) -
+							pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz +
+								mfaca*(1 + uz))) +
+							pow(ux, 2)*(-(pow(1 + uy, 2)*
+							(mfbac*(-1 + uz) + mfbab*uz + mfbaa*(1 + uz))) -
+								pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz +
+									mfbba*(1 + uz)) -
+								pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz +
+									mfbca*(1 + uz))) +
+							pow(-1 + ux, 2)*(-(pow(1 + uy, 2)*
+							(mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz))) -
+								pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz +
+									mfcba*(1 + uz)) -
+								pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz +
+									mfcca*(1 + uz)))) - Mom001 / 9;
+
+						LBMReal Mom212 = (pow(1 + ux, 2)*(-((1 + uy)*
+							(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) +
+								mfaaa*pow(1 + uz, 2))) -
+							uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) -
+								(-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) +
+									mfaca*pow(1 + uz, 2))) +
+							pow(ux, 2)*(-((1 + uy)*
+							(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) +
+								mfbaa*pow(1 + uz, 2))) -
+								uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+									mfbba*pow(1 + uz, 2)) -
+									(-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) +
+										mfbca*pow(1 + uz, 2))) +
+							pow(-1 + ux, 2)*(-((1 + uy)*
+							(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) +
+								mfcaa*pow(1 + uz, 2))) -
+								uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+									mfcba*pow(1 + uz, 2)) -
+									(-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) +
+										mfcca*pow(1 + uz, 2)))) - Mom010 / 9;
+
+						LBMReal Mom122 = ((-1 - ux)*(pow(1 + uy, 2)*
+							(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) +
+								mfaaa*pow(1 + uz, 2)) +
+							pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) +
+							pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) +
+								mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2))) -
+							ux*(pow(1 + uy, 2)*(mfbac*pow(-1 + uz, 2) +
+								mfbab*pow(uz, 2) + mfbaa*pow(1 + uz, 2)) +
+								pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+									mfbba*pow(1 + uz, 2)) +
+								pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) +
+									mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2))) +
+									(1 - ux)*(pow(1 + uy, 2)*
+							(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) +
+								mfcaa*pow(1 + uz, 2)) +
+										pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+											mfcba*pow(1 + uz, 2)) +
+										pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) +
+											mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2)))) - Mom100 / 9;
+						////
+
+						//(211)//
+						LBMReal Mom211 = (pow(1 + ux, 2)*((1 + uy)*(mfaac*(-1 + uz) + mfaab*uz +
+							mfaaa*(1 + uz)) +
+							uy*(mfabc*(-1 + uz) + mfabb*uz + mfaba*(1 + uz)) +
+							(-1 + uy)*(mfacc*(-1 + uz) + mfacb*uz + mfaca*(1 + uz))) +
+							pow(ux, 2)*((1 + uy)*(mfbac*(-1 + uz) + mfbab*uz +
+								mfbaa*(1 + uz)) +
+								uy*(mfbbc*(-1 + uz) + mfbbb*uz + mfbba*(1 + uz)) +
+								(-1 + uy)*(mfbcc*(-1 + uz) + mfbcb*uz + mfbca*(1 + uz))) +
+							pow(-1 + ux, 2)*((1 + uy)*
+							(mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz)) +
+								uy*(mfcbc*(-1 + uz) + mfcbb*uz + mfcba*(1 + uz)) +
+								(-1 + uy)*(mfccc*(-1 + uz) + mfccb*uz + mfcca*(1 + uz)))) - Mom011 / 3;
+
+						LBMReal Mom121 = ((-1 - ux)*(-(pow(1 + uy, 2)*
+							(mfaac*(-1 + uz) + mfaab*uz + mfaaa*(1 + uz))) -
+							pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz +
+								mfaba*(1 + uz)) -
+							pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz +
+								mfaca*(1 + uz))) -
+							ux*(-(pow(1 + uy, 2)*(mfbac*(-1 + uz) + mfbab*uz +
+								mfbaa*(1 + uz))) -
+								pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz +
+									mfbba*(1 + uz)) -
+								pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz +
+									mfbca*(1 + uz))) +
+									(1 - ux)*(-(pow(1 + uy, 2)*
+							(mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz))) -
+										pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz +
+											mfcba*(1 + uz)) -
+										pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz +
+											mfcca*(1 + uz)))) - Mom101 / 3;
+
+						LBMReal Mom112 = ((-1 - ux)*(-((1 + uy)*(mfaac*pow(-1 + uz, 2) +
+							mfaab*pow(uz, 2) + mfaaa*pow(1 + uz, 2))) -
+							uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) -
+								(-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) +
+									mfaca*pow(1 + uz, 2))) -
+							ux*(-((1 + uy)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) +
+								mfbaa*pow(1 + uz, 2))) -
+								uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+									mfbba*pow(1 + uz, 2)) -
+									(-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) +
+										mfbca*pow(1 + uz, 2))) +
+										(1 - ux)*(-((1 + uy)*(mfcac*pow(-1 + uz, 2) +
+											mfcab*pow(uz, 2) + mfcaa*pow(1 + uz, 2))) -
+											uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+												mfcba*pow(1 + uz, 2)) -
+												(-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) +
+													mfcca*pow(1 + uz, 2)))) - Mom110 / 3;
+						////
+
+						//(222)//
+						LBMReal Mom222 = (pow(1 + ux, 2)*(pow(1 + uy, 2)*
+							(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) +
+								mfaaa*pow(1 + uz, 2)) +
+							pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) +
+							pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) +
+								mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2))) +
+							pow(ux, 2)*(pow(1 + uy, 2)*
+							(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) +
+								mfbaa*pow(1 + uz, 2)) +
+								pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+									mfbba*pow(1 + uz, 2)) +
+								pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) +
+									mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2))) +
+							pow(-1 + ux, 2)*(pow(1 + uy, 2)*
+							(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) +
+								mfcaa*pow(1 + uz, 2)) +
+								pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+									mfcba*pow(1 + uz, 2)) +
+								pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) +
+									mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2)))) - Mom000 / 27;
+						////
+
+
+
+
+
+						LBMReal Meq000 = drho+dlambda*c1o2;
+
+
+						// relaxation Central Moment MRT
+
+						Mom000 = Meq000;
+
+						Mom000 += dlambda*c1o2;
+
+						Mom100 = (1 - collFactorH) * Mom100;
+						Mom010 = (1 - collFactorH) * Mom010;
+						Mom001 = (1 - collFactorH) * Mom001;
+
+						Mom110 = 0;
+						Mom101 = 0;
+						Mom011 = 0;
+
+						Mom111 = 0;
+
+						//(200)//
+						Mom200 = Mom000 / 3;
+						Mom020 = Mom000 / 3;
+						Mom002 = Mom000 / 3;
+						////
+
+						//(210)//
+						Mom210 = Mom010 / 3;
+						Mom201 = Mom001 / 3;
+						Mom120 = Mom100 / 3;
+
+
+						Mom102 = Mom100 / 3;
+						Mom021 = Mom001 / 3;
+						Mom012 = Mom010 / 3;
+						////
+
+
+						//(220)//
+						Mom220 = Mom000 / 9;
+						Mom202 = Mom000 / 9;
+						Mom022 = Mom000 / 9;
+						////
+
+						//(221)//
+						Mom221 = Mom001 / 9;
+						Mom212 = Mom010 / 9;
+						Mom122 = Mom100 / 9;
+						////
+
+						//(211)//
+						Mom211 = Mom011 / 3;
+						Mom121 = Mom101 / 3;
+						Mom112 = Mom110 / 3;
+						////
+
+						//(222)//
+						Mom222 = Mom000 / 27;
+						////
+						
+
+
+						//Back transformation to distributions
+
+						mfcbb = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) +
+							2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy +
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*
+							(-1 + pow(uy, 2)) -
+							2 * (-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) -
+								2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*
+								uy - (Mom101 + Mom201 + 2 * Mom101*ux +
+									Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*uz +
+									(-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) -
+										2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*
+										uy - (Mom100 + Mom200 + 2 * Mom100*ux +
+											Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))*
+											(1 - pow(uz, 2))) / 2.;
+						mfbcb = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) +
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy*
+							(1 + uy) + (Mom212 + 2 * Mom112*ux +
+								Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) -
+							2 * (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy*
+								(1 + uy) - (Mom211 + 2 * Mom111*ux +
+									Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*uz +
+									(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy*
+										(1 + uy) - (Mom210 + 2 * Mom110*ux +
+											Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))*
+											(1 - pow(uz, 2))) / 2.;
+						mfbbc = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) +
+							2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy +
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*
+							(-1 + pow(uy, 2)) +
+							(Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) +
+								2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*
+								uy + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*
+								(-1 + pow(uy, 2)))*uz*(1 + uz) +
+								(Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) +
+									2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*
+									uy + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*
+									(-1 + pow(uy, 2)))*(1 + 2 * uz)) / 2.;
+						mfccb = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) -
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy*
+							(1 + uy) - (Mom112 + Mom212 + 2 * Mom112*ux +
+								Mom012*ux*(1 + ux))*(1 + 2 * uy) -
+							2 * (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy*
+								(1 + uy) + (Mom111 + Mom211 + 2 * Mom111*ux +
+									Mom011*ux*(1 + ux))*(1 + 2 * uy))*uz +
+									(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy*
+										(1 + uy) + (Mom110 + Mom210 + 2 * Mom110*ux +
+											Mom010*ux*(1 + ux))*(1 + 2 * uy))*(1 - pow(uz, 2))) / 4.;
+						mfacb = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux -
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy*
+							(1 + uy) - (Mom212 + Mom012*(-1 + ux)*ux +
+								Mom112*(-1 + 2 * ux))*(1 + 2 * uy) -
+							2 * (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy*
+								(1 + uy) + (Mom211 + Mom011*(-1 + ux)*ux +
+									Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*uz +
+									(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy*
+										(1 + uy) + (Mom210 + Mom010*(-1 + ux)*ux +
+											Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*(1 - pow(uz, 2))) / 4.;
+						mfcbc = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) -
+							2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy -
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*
+							(-1 + pow(uy, 2)) +
+							(-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) -
+								2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*
+								uy - (Mom100 + Mom200 + 2 * Mom100*ux +
+									Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))*uz*(1 + uz) +
+									(-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) -
+										2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*
+										uy - (Mom101 + Mom201 + 2 * Mom101*ux +
+											Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*(1 + 2 * uz)) / 4.;
+						mfabc = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux -
+							2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy -
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*
+							(-1 + pow(uy, 2)) +
+							(Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux -
+								2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*
+								uy - (Mom200 + Mom000*(-1 + ux)*ux +
+									Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*uz*(1 + uz) +
+									(Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux -
+										2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*
+										uy - (Mom201 + Mom001*(-1 + ux)*ux +
+											Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(1 + 2 * uz)) / 4.;
+						mfbcc = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) -
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy*
+							(1 + uy) - (Mom212 + 2 * Mom112*ux +
+								Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) +
+								(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy*
+									(1 + uy) - (Mom210 + 2 * Mom110*ux +
+										Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))*uz*(1 + uz) +
+										(Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy*
+											(1 + uy) - (Mom211 + 2 * Mom111*ux +
+												Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(1 + 2 * uz)) / 4.;
+						mfbac = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) -
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*
+							(-1 + uy)*uy - (Mom212 + 2 * Mom112*ux +
+								Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) +
+								(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*
+									(-1 + uy)*uy - (Mom210 + 2 * Mom110*ux +
+										Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*uz*(1 + uz) +
+										(Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*
+											(-1 + uy)*uy - (Mom211 + 2 * Mom111*ux +
+												Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(1 + 2 * uz)) / 4.;
+						mfccc = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) +
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy*
+							(1 + uy) + (Mom112 + Mom212 + 2 * Mom112*ux +
+								Mom012*ux*(1 + ux))*(1 + 2 * uy) +
+								(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy*
+									(1 + uy) + (Mom110 + Mom210 + 2 * Mom110*ux +
+										Mom010*ux*(1 + ux))*(1 + 2 * uy))*uz*(1 + uz) +
+										(Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy*
+											(1 + uy) + (Mom111 + Mom211 + 2 * Mom111*ux +
+												Mom011*ux*(1 + ux))*(1 + 2 * uy))*(1 + 2 * uz)) / 8.;
+						mfacc = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) +
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy*
+							(1 + uy) + (Mom212 + Mom012*(-1 + ux)*ux +
+								Mom112*(-1 + 2 * ux))*(1 + 2 * uy) +
+								(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy*
+									(1 + uy) + (Mom210 + Mom010*(-1 + ux)*ux +
+										Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*uz*(1 + uz) +
+										(Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy*
+											(1 + uy) + (Mom211 + Mom011*(-1 + ux)*ux +
+												Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*(1 + 2 * uz)) / 8.;
+						mfcac = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) +
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*
+							(-1 + uy)*uy + (Mom112 + Mom212 + 2 * Mom112*ux +
+								Mom012*ux*(1 + ux))*(-1 + 2 * uy) +
+								(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*
+									(-1 + uy)*uy + (Mom110 + Mom210 + 2 * Mom110*ux +
+										Mom010*ux*(1 + ux))*(-1 + 2 * uy))*uz*(1 + uz) +
+										(Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*
+											(-1 + uy)*uy + (Mom111 + Mom211 + 2 * Mom111*ux +
+												Mom011*ux*(1 + ux))*(-1 + 2 * uy))*(1 + 2 * uz)) / 8.;
+						mfaac = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) +
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*
+							(-1 + uy)*uy + (Mom212 + Mom012*(-1 + ux)*ux +
+								Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) +
+								(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*
+									(-1 + uy)*uy + (Mom210 + Mom010*(-1 + ux)*ux +
+										Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*uz*(1 + uz) +
+										(Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*
+											(-1 + uy)*uy + (Mom211 + Mom011*(-1 + ux)*ux +
+												Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*(1 + 2 * uz)) / 8.;
+
+						mfabb = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) +
+							2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy +
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*
+							(-1 + pow(uy, 2)) -
+							2 * (Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux -
+								2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*
+								uy - (Mom201 + Mom001*(-1 + ux)*ux +
+									Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*uz +
+									(Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux -
+										2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*
+										uy - (Mom200 + Mom000*(-1 + ux)*ux +
+											Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*
+											(1 - pow(uz, 2))) / 2.;
+						mfbab = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) +
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*
+							(-1 + uy)*uy + (Mom212 + 2 * Mom112*ux +
+								Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) -
+							2 * (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*
+								(-1 + uy)*uy - (Mom211 + 2 * Mom111*ux +
+									Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*uz +
+									(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*
+										(-1 + uy)*uy - (Mom210 + 2 * Mom110*ux +
+											Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*
+											(1 - pow(uz, 2))) / 2.;
+						mfbba = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) +
+							2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy +
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*
+							(-1 + pow(uy, 2)) +
+							(Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) +
+								2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*
+								uy + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*
+								(-1 + pow(uy, 2)))*(-1 + uz)*uz +
+								(Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) +
+									2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*
+									uy + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*
+									(-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 2.;
+						mfaab = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux -
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*
+							(-1 + uy)*uy - (Mom212 + Mom012*(-1 + ux)*ux +
+								Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) -
+							2 * (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*
+								(-1 + uy)*uy + (Mom211 + Mom011*(-1 + ux)*ux +
+									Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*uz +
+									(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*
+										(-1 + uy)*uy + (Mom210 + Mom010*(-1 + ux)*ux +
+											Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*(1 - pow(uz, 2))) / 4.;
+						mfcab = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) -
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*
+							(-1 + uy)*uy - (Mom112 + Mom212 + 2 * Mom112*ux +
+								Mom012*ux*(1 + ux))*(-1 + 2 * uy) -
+							2 * (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*
+								(-1 + uy)*uy + (Mom111 + Mom211 + 2 * Mom111*ux +
+									Mom011*ux*(1 + ux))*(-1 + 2 * uy))*uz +
+									(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*
+										(-1 + uy)*uy + (Mom110 + Mom210 + 2 * Mom110*ux +
+											Mom010*ux*(1 + ux))*(-1 + 2 * uy))*(1 - pow(uz, 2))) / 4.;
+						mfaba = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux - 2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy -
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*(-1 + pow(uy, 2)) +
+							(Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux - 2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*uy -
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(-1 + uz)*uz +
+								(Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux - 2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*uy -
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 4.;
+						mfcba = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) - 2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy -
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*(-1 + pow(uy, 2)) +
+							(-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) - 2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*uy -
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))*(-1 + uz)*uz +
+								(-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) - 2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*uy -
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 4.;
+						mfbaa = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*(-1 + uy)*uy -
+							(Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) +
+							(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*(-1 + uy)*uy -
+								(Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*(-1 + uy)*uy -
+									(Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 4.;
+						mfbca = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy*(1 + uy) -
+							(Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) +
+							(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy*(1 + uy) -
+								(Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy*(1 + uy) -
+									(Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(-1 + 2 * uz)) / 4.;
+						mfaaa = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*(-1 + uy)*uy +
+							(Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) +
+							(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*(-1 + uy)*uy +
+								(Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*(-1 + uy)*uy +
+									(Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 8.;
+						mfcaa = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) +
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*(-1 + uy)*uy +
+							(Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*(-1 + 2 * uy) +
+							(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*(-1 + uy)*uy +
+								(Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*(-1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*(-1 + uy)*uy +
+									(Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 8.;
+						mfaca = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy*(1 + uy) +
+							(Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*(1 + 2 * uy) +
+							(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy*(1 + uy) +
+								(Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy*(1 + uy) +
+									(Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*(-1 + 2 * uz)) / 8.;
+						mfcca = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy*(1 + uy) +
+							(Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*(1 + 2 * uy) +
+							(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy*(1 + uy) +
+								(Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*(1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy*(1 + uy) +
+									(Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*(1 + 2 * uy))*(-1 + 2 * uz)) / 8.;
+
+						mfbbb = Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - 2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy -
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)) -
+							2 * (Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) + 2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*uy +
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)))*uz +
+								(Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) + 2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*uy +
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)))*(1 - pow(uz, 2));
+
+						////////////////////////////////////////////////////////////////////////////////////
+
+						//////////////////////////////////////////////////////////////////////////
+						//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;
+						//UBLOG(logINFO, "lambda ="<<drho_post);
+//						//LBMReal dif = fabs(rho - rho_post);
+//						dif = drho - drho_post;
+//#ifdef SINGLEPRECISION
+//						if (dif > 10.0E-7 || dif < -10.0E-7)
+//#else
+//						if (dif > 10.0E-15 || dif < -10.0E-15)
+//#endif
+//						{
+//							UB_THROW(UbException(UB_EXARGS, "Flocculation=" + UbSystem::toString(drho) + ", flocculation post=" + UbSystem::toString(drho_post)
+//								+ " dif=" + UbSystem::toString(dif)
+//								+ " Flocculation is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+//							//UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): rho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+//							//exit(EXIT_FAILURE);
+//						}
+//#endif
+						//////////////////////////////////////////////////////////////////////////
+						//write distribution
+						//////////////////////////////////////////////////////////////////////////
+						(*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3) = mfabb;
+						(*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3) = mfbab;
+						(*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3) = mfbba;
+						(*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3) = mfaab;
+						(*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab;
+						(*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3) = mfaba;
+						(*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba;
+						(*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa;
+						(*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca;
+						(*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa;
+						(*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa;
+						(*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca;
+						(*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac;
+
+						(*this->zeroDistributionsH)(x1, x2, x3) = mfbbb;
+						//////////////////////////////////////////////////////////////////////////
+
+
+					}
+				}
+			}
+		}
+
+	}
+}
+//////////////////////////////////////////////////////////////////////////
+double ThixotropyExpLBMKernel::getCalculationTime()
+{
+	//return timer.getDuration();
+	return timer.getTotalTime();
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyExpLBMKernel::setCollisionFactorF(double collFactor)
+{
+	setCollisionFactor(collFactor);
+	this->collFactorF = collFactor;
+
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyExpLBMKernel::setCollisionFactorH(double collFactor)
+{
+	this->collFactorH = collFactor;
+}
+//////////////////////////////////////////////////////////////////////////
+double ThixotropyExpLBMKernel::getCollisionFactorF() const
+{
+	return this->collFactorF;
+}
+//////////////////////////////////////////////////////////////////////////
+double ThixotropyExpLBMKernel::getCollisionFactorH() const
+{
+	return this->collFactorH;
+}
+void ThixotropyExpLBMKernel::setAlpha(double alpha)
+{
+	this->alpha = alpha;
+}
+double ThixotropyExpLBMKernel::getAlpha() const
+{
+	return this->alpha;
+}
+void ThixotropyExpLBMKernel::setTheta(double theta)
+{
+	this->theta = theta;
+}
+double ThixotropyExpLBMKernel::getTheta() const
+{
+	return this->theta;
+}
+void ThixotropyExpLBMKernel::swapDistributions()
+{
+	LBMKernel::swapDistributions();
+	dataSet->getHdistributions()->swap();
+}
+//////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.h
new file mode 100644
index 000000000..3104808ad
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.h
@@ -0,0 +1,72 @@
+#ifndef ThixotropyExpLBMKernel_H
+#define ThixotropyExpLBMKernel_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"
+
+class ThixotropyExpLBMKernel;
+
+//! \brief    Cumulant + Fact. Central LBM kernel. 
+//! \author Hussein
+class ThixotropyExpLBMKernel : public LBMKernel
+{
+public:
+	//! This option set relaxation parameter: NORMAL  
+	enum Parameter { NORMAL, MAGIC };
+public:
+	ThixotropyExpLBMKernel();
+	virtual ~ThixotropyExpLBMKernel(void);
+	virtual void calculate(int step);
+	virtual SPtr<LBMKernel> clone();
+	double getCalculationTime();
+ 
+	void setCollisionFactorF(double collFactor);
+   void setCollisionFactorH(double collFactor);
+   double getCollisionFactorF() const;
+   double getCollisionFactorH() const;
+
+	void setAlpha(double alpha);
+	double getAlpha() const;
+
+	void setTheta(double theta);
+	double getTheta() const;
+
+	void swapDistributions();
+
+protected:
+	virtual void initDataSet();
+	LBMReal f[D3Q27System::ENDF + 1];
+
+	UbTimer timer;
+
+	LBMReal OxyyMxzz;
+	Parameter parameter;
+
+	CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF;
+	CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF;
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsF;
+
+	CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH;
+	CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH;
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsH;
+
+	mu::value_type muX1, muX2, muX3;
+	mu::value_type muDeltaT;
+	mu::value_type muNu;
+	LBMReal forcingX1;
+	LBMReal forcingX2;
+	LBMReal forcingX3;
+
+	LBMReal collFactorF;
+   LBMReal collFactorH;
+
+	LBMReal theta;
+	LBMReal alpha;
+};
+
+#endif
+
diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp
new file mode 100644
index 000000000..949e7777d
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp
@@ -0,0 +1,1868 @@
+#include "ThixotropyLBMKernel.h"
+#include "D3Q27System.h"
+#include "InterpolationProcessor.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include <math.h>
+#include "DataSet3D.h"
+#include "LBMKernel.h"
+
+#define PROOF_CORRECTNESS
+
+//////////////////////////////////////////////////////////////////////////
+ThixotropyLBMKernel::ThixotropyLBMKernel()
+{
+   this->parameter = ThixotropyLBMKernel::NORMAL;
+	this->compressible = false;
+	//this->TwoDistributions = true;
+}
+//////////////////////////////////////////////////////////////////////////
+ThixotropyLBMKernel::~ThixotropyLBMKernel(void)
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyLBMKernel::initDataSet()
+{
+	//DistributionArray3DPtr d(new D3Q27EsoTwist3DSplittedVector(nx1+ghostLayerWitdh*2, nx2+ghostLayerWitdh*2, nx3+ghostLayerWitdh*2, -999.0));
+	SPtr<DistributionArray3D> df(new D3Q27EsoTwist3DSplittedVector(nx[0]+2, nx[1]+2, nx[2]+2, -999.0));
+	SPtr<DistributionArray3D> dh(new D3Q27EsoTwist3DSplittedVector(nx[0]+2, nx[1]+2, nx[2]+2, -999.0));
+	dataSet->setFdistributions(df);
+	dataSet->setHdistributions(dh);
+}
+//////////////////////////////////////////////////////////////////////////
+SPtr<LBMKernel> ThixotropyLBMKernel::clone()
+{
+	SPtr<LBMKernel> kernel(new ThixotropyLBMKernel());
+	kernel->setNX(nx);
+	kernel->setCollisionFactor(collFactor);
+	collFactorF = collFactor;
+	collFactorH = collFactor;
+	dynamicPointerCast<ThixotropyLBMKernel>(kernel)->initDataSet();
+	dynamicPointerCast<ThixotropyLBMKernel>(kernel)->setCollisionFactorF(this->collFactorF);
+	dynamicPointerCast<ThixotropyLBMKernel>(kernel)->setCollisionFactorH(this->collFactorH);
+	dynamicPointerCast<ThixotropyLBMKernel>(kernel)->setAlpha(this->alpha);
+	dynamicPointerCast<ThixotropyLBMKernel>(kernel)->setTheta(this->theta);
+	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);
+
+	switch (parameter)
+	{
+	case NORMAL:
+		dynamicPointerCast<ThixotropyLBMKernel>(kernel)->OxyyMxzz = 1.0;
+		break;
+	case MAGIC:
+		dynamicPointerCast<ThixotropyLBMKernel>(kernel)->OxyyMxzz = 2.0 + (-collFactorF);
+		break;
+	}
+	return kernel;
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyLBMKernel::calculate(int step)
+{
+	using namespace D3Q27System;
+
+	//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 / collFactorF - 1.0 / 2.0);
+
+		muForcingX1.DefineVar("nu", &muNu);
+		muForcingX2.DefineVar("nu", &muNu);
+		muForcingX3.DefineVar("nu", &muNu);
+
+		LBMReal forcingX1 = 0;
+		LBMReal forcingX2 = 0;
+		LBMReal forcingX3 = 0;
+	}
+	/////////////////////////////////////
+
+	localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+	nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+	zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions();
+
+	localDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions();
+	nonLocalDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions();
+	zeroDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->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;
+
+
+	//#pragma omp parallel num_threads(8)
+	{
+		//   int i = omp_get_thread_num();
+		//   printf_s("Hello from thread %d\n", i);
+		//}
+		//#pragma omp for 
+		for (int x3 = minX3; x3 < maxX3; x3++)
+		{
+			for (int x2 = minX2; x2 < maxX2; x2++)
+			{
+				for (int x1 = minX1; x1 < maxX1; x1++)
+				{
+					if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3))
+					{
+						int x1p = x1 + 1;
+						int x2p = x2 + 1;
+						int x3p = x3 + 1;
+						//////////////////////////////////////////////////////////////////////////
+						//read distribution
+						// Cumulant (NSE part) 
+						////////////////////////////////////////////////////////////////////////////
+						//////////////////////////////////////////////////////////////////////////
+
+						LBMReal mfcbb = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
+						LBMReal mfbcb = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
+						LBMReal mfbbc = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
+						LBMReal mfccb = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
+						LBMReal mfacb = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
+						LBMReal mfcbc = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
+						LBMReal mfabc = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
+						LBMReal mfbcc = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
+						LBMReal mfbac = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
+						LBMReal mfccc = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
+						LBMReal mfacc = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
+						LBMReal mfcac = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
+						LBMReal mfaac = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
+								  
+						LBMReal mfabb = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
+						LBMReal mfbab = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
+						LBMReal mfbba = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
+						LBMReal mfaab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
+						LBMReal mfcab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
+						LBMReal mfaba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
+						LBMReal mfcba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
+						LBMReal mfbaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
+						LBMReal mfbca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
+						LBMReal mfaaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						LBMReal mfcaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						LBMReal mfaca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						LBMReal mfcca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
+								  
+						LBMReal mfbbb = (*this->zeroDistributionsH)(x1, x2, x3);
+
+						LBMReal lambda = (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;
+
+						//E   N  T
+						//c   c  c
+						//////////
+						//W   S  B
+						//a   a  a
+
+						//Rest ist b
+
+						//mfxyz
+						//a - negative
+						//b - null
+						//c - positive
+
+						// a b c
+						//-1 0 1
+
+						mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+						mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+						mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+						mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+						mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+						mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+						mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+						mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+						mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+						mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+						mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+						mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+						mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+						mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+						mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+						mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+						mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+						mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+						mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+						mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+						mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+						mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+						mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+						mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+						LBMReal m0, m1, m2;
+
+						LBMReal rho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+							+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+							+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+
+						LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+							(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+							(mfcbb - mfabb));
+						LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+							(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+							(mfbcb - mfbab));
+						LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+							(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+							(mfbbc - mfbba));
+						
+
+						LBMReal eta0 = (1/collFactor-c1o2)*c1o3;
+						LBMReal eta = (1 + lambda)* eta0;
+						collFactorF = one/(3*eta/(rho+one)+c1o2);
+						//collFactorF = collFactor;
+
+						//forcing 
+						///////////////////////////////////////////////////////////////////////////////////////////
+						if (withForcing)
+						{
+							muX1 = static_cast<double>(x1 - 1 + ix1*maxX1);
+							muX2 = static_cast<double>(x2 - 1 + ix2*maxX2);
+							muX3 = static_cast<double>(x3 - 1 + ix3*maxX3);
+
+							forcingX1 = muForcingX1.Eval();
+							forcingX2 = muForcingX2.Eval();
+							forcingX3 = muForcingX3.Eval();
+
+							vvx += forcingX1*deltaT*0.5; // X
+							vvy += forcingX2*deltaT*0.5; // Y
+							vvz += forcingX3*deltaT*0.5; // Z
+						}
+						///////////////////////////////////////////////////////////////////////////////////////////               
+						LBMReal oMdrho;
+
+						oMdrho = mfccc + mfaaa;
+						m0 = mfaca + mfcac;
+						m1 = mfacc + mfcaa;
+						m2 = mfaac + mfcca;
+						oMdrho += m0;
+						m1 += m2;
+						oMdrho += m1;
+						m0 = mfbac + mfbca;
+						m1 = mfbaa + mfbcc;
+						m0 += m1;
+						m1 = mfabc + mfcba;
+						m2 = mfaba + mfcbc;
+						m1 += m2;
+						m0 += m1;
+						m1 = mfacb + mfcab;
+						m2 = mfaab + mfccb;
+						m1 += m2;
+						m0 += m1;
+						oMdrho += m0;
+						m0 = mfabb + mfcbb;
+						m1 = mfbab + mfbcb;
+						m2 = mfbba + mfbbc;
+						m0 += m1 + m2;
+						m0 += mfbbb; //hat gefehlt
+						oMdrho = 1. - (oMdrho + m0);
+
+						LBMReal vx2;
+						LBMReal vy2;
+						LBMReal vz2;
+						vx2 = vvx*vvx;
+						vy2 = vvy*vvy;
+						vz2 = vvz*vvz;
+						////////////////////////////////////////////////////////////////////////////////////
+						LBMReal wadjust;
+						LBMReal qudricLimit = 0.01;
+						////////////////////////////////////////////////////////////////////////////////////
+						//Hin
+						////////////////////////////////////////////////////////////////////////////////////
+						// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						m2 = mfaaa + mfaac;
+						m1 = mfaac - mfaaa;
+						m0 = m2 + mfaab;
+						mfaaa = m0;
+						m0 += c1o36 * oMdrho;
+						mfaab = m1 - m0 * vvz;
+						mfaac = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaba + mfabc;
+						m1 = mfabc - mfaba;
+						m0 = m2 + mfabb;
+						mfaba = m0;
+						m0 += c1o9 * oMdrho;
+						mfabb = m1 - m0 * vvz;
+						mfabc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaca + mfacc;
+						m1 = mfacc - mfaca;
+						m0 = m2 + mfacb;
+						mfaca = m0;
+						m0 += c1o36 * oMdrho;
+						mfacb = m1 - m0 * vvz;
+						mfacc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbaa + mfbac;
+						m1 = mfbac - mfbaa;
+						m0 = m2 + mfbab;
+						mfbaa = m0;
+						m0 += c1o9 * oMdrho;
+						mfbab = m1 - m0 * vvz;
+						mfbac = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbba + mfbbc;
+						m1 = mfbbc - mfbba;
+						m0 = m2 + mfbbb;
+						mfbba = m0;
+						m0 += c4o9 * oMdrho;
+						mfbbb = m1 - m0 * vvz;
+						mfbbc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbca + mfbcc;
+						m1 = mfbcc - mfbca;
+						m0 = m2 + mfbcb;
+						mfbca = m0;
+						m0 += c1o9 * oMdrho;
+						mfbcb = m1 - m0 * vvz;
+						mfbcc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcaa + mfcac;
+						m1 = mfcac - mfcaa;
+						m0 = m2 + mfcab;
+						mfcaa = m0;
+						m0 += c1o36 * oMdrho;
+						mfcab = m1 - m0 * vvz;
+						mfcac = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcba + mfcbc;
+						m1 = mfcbc - mfcba;
+						m0 = m2 + mfcbb;
+						mfcba = m0;
+						m0 += c1o9 * oMdrho;
+						mfcbb = m1 - m0 * vvz;
+						mfcbc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcca + mfccc;
+						m1 = mfccc - mfcca;
+						m0 = m2 + mfccb;
+						mfcca = m0;
+						m0 += c1o36 * oMdrho;
+						mfccb = m1 - m0 * vvz;
+						mfccc = m2 - 2. *   m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						m2 = mfaaa + mfaca;
+						m1 = mfaca - mfaaa;
+						m0 = m2 + mfaba;
+						mfaaa = m0;
+						m0 += c1o6 * oMdrho;
+						mfaba = m1 - m0 * vvy;
+						mfaca = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaab + mfacb;
+						m1 = mfacb - mfaab;
+						m0 = m2 + mfabb;
+						mfaab = m0;
+						mfabb = m1 - m0 * vvy;
+						mfacb = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaac + mfacc;
+						m1 = mfacc - mfaac;
+						m0 = m2 + mfabc;
+						mfaac = m0;
+						m0 += c1o18 * oMdrho;
+						mfabc = m1 - m0 * vvy;
+						mfacc = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbaa + mfbca;
+						m1 = mfbca - mfbaa;
+						m0 = m2 + mfbba;
+						mfbaa = m0;
+						m0 += c2o3 * oMdrho;
+						mfbba = m1 - m0 * vvy;
+						mfbca = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbab + mfbcb;
+						m1 = mfbcb - mfbab;
+						m0 = m2 + mfbbb;
+						mfbab = m0;
+						mfbbb = m1 - m0 * vvy;
+						mfbcb = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbac + mfbcc;
+						m1 = mfbcc - mfbac;
+						m0 = m2 + mfbbc;
+						mfbac = m0;
+						m0 += c2o9 * oMdrho;
+						mfbbc = m1 - m0 * vvy;
+						mfbcc = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcaa + mfcca;
+						m1 = mfcca - mfcaa;
+						m0 = m2 + mfcba;
+						mfcaa = m0;
+						m0 += c1o6 * oMdrho;
+						mfcba = m1 - m0 * vvy;
+						mfcca = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcab + mfccb;
+						m1 = mfccb - mfcab;
+						m0 = m2 + mfcbb;
+						mfcab = m0;
+						mfcbb = m1 - m0 * vvy;
+						mfccb = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcac + mfccc;
+						m1 = mfccc - mfcac;
+						m0 = m2 + mfcbc;
+						mfcac = m0;
+						m0 += c1o18 * oMdrho;
+						mfcbc = m1 - m0 * vvy;
+						mfccc = m2 - 2. *   m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						m2 = mfaaa + mfcaa;
+						m1 = mfcaa - mfaaa;
+						m0 = m2 + mfbaa;
+						mfaaa = m0;
+						m0 += 1. * oMdrho;
+						mfbaa = m1 - m0 * vvx;
+						mfcaa = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaba + mfcba;
+						m1 = mfcba - mfaba;
+						m0 = m2 + mfbba;
+						mfaba = m0;
+						mfbba = m1 - m0 * vvx;
+						mfcba = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaca + mfcca;
+						m1 = mfcca - mfaca;
+						m0 = m2 + mfbca;
+						mfaca = m0;
+						m0 += c1o3 * oMdrho;
+						mfbca = m1 - m0 * vvx;
+						mfcca = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaab + mfcab;
+						m1 = mfcab - mfaab;
+						m0 = m2 + mfbab;
+						mfaab = m0;
+						mfbab = m1 - m0 * vvx;
+						mfcab = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfabb + mfcbb;
+						m1 = mfcbb - mfabb;
+						m0 = m2 + mfbbb;
+						mfabb = m0;
+						mfbbb = m1 - m0 * vvx;
+						mfcbb = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfacb + mfccb;
+						m1 = mfccb - mfacb;
+						m0 = m2 + mfbcb;
+						mfacb = m0;
+						mfbcb = m1 - m0 * vvx;
+						mfccb = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaac + mfcac;
+						m1 = mfcac - mfaac;
+						m0 = m2 + mfbac;
+						mfaac = m0;
+						m0 += c1o3 * oMdrho;
+						mfbac = m1 - m0 * vvx;
+						mfcac = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfabc + mfcbc;
+						m1 = mfcbc - mfabc;
+						m0 = m2 + mfbbc;
+						mfabc = m0;
+						mfbbc = m1 - m0 * vvx;
+						mfcbc = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfacc + mfccc;
+						m1 = mfccc - mfacc;
+						m0 = m2 + mfbcc;
+						mfacc = m0;
+						m0 += c1o9 * oMdrho;
+						mfbcc = m1 - m0 * vvx;
+						mfccc = m2 - 2. *   m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						// Cumulants
+						////////////////////////////////////////////////////////////////////////////////////
+						LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity
+						LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
+											  //LBMReal OxyyMxzz  = 1.;//2+s9;//
+						LBMReal O4 = 1.;
+						LBMReal O5 = 1.;
+						LBMReal O6 = 1.;
+
+						//Cum 4.
+						//LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+						//LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+						//LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+						LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+						LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+						LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+						LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho);
+						LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho - 1)*oMdrho);
+						LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho);
+
+						//Cum 5.
+						LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+						LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+						LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+
+						//Cum 6.
+						LBMReal CUMccc = mfccc + ((-4. *  mfbbb * mfbbb
+							- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+							- 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+							- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+							+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+								+ 2. * (mfcaa * mfaca * mfaac)
+								+ 16. *  mfbba * mfbab * mfabb)
+							- c1o3* (mfacc + mfcac + mfcca) * oMdrho - c1o9*oMdrho*oMdrho
+							- c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1. - 2.* oMdrho) - c1o27* oMdrho * oMdrho*(-2.* oMdrho)
+							+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+								+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) + c1o27*oMdrho;
+
+						//2.
+						// linear combinations
+						LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+						LBMReal mxxMyy = mfcaa - mfaca;
+						LBMReal mxxMzz = mfcaa - mfaac;
+
+						LBMReal dxux = -c1o2 * collFactorF *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz*(mfaaa - mxxPyyPzz);
+						LBMReal dyuy = dxux + collFactorF * c3o2 * mxxMyy;
+						LBMReal dzuz = dxux + collFactorF * c3o2 * mxxMzz;
+
+						LBMReal Dxy =-three*collFactorF*mfbba;
+                  LBMReal Dxz =-three*collFactorF*mfbab;
+                  LBMReal Dyz =-three*collFactorF*mfabb;
+
+						//relax
+						mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+						mxxMyy += collFactorF * (-mxxMyy) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vy2 * dyuy);
+						mxxMzz += collFactorF * (-mxxMzz) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vz2 * dzuz);
+
+						mfabb += collFactorF * (-mfabb);
+						mfbab += collFactorF * (-mfbab);
+						mfbba += collFactorF * (-mfbba);
+
+						// linear combinations back
+						mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+						mfaca = c1o3 * (-2. *  mxxMyy + mxxMzz + mxxPyyPzz);
+						mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+
+						//3.
+						// linear combinations
+						LBMReal mxxyPyzz = mfcba + mfabc;
+						LBMReal mxxyMyzz = mfcba - mfabc;
+
+						LBMReal mxxzPyyz = mfcab + mfacb;
+						LBMReal mxxzMyyz = mfcab - mfacb;
+
+						LBMReal mxyyPxzz = mfbca + mfbac;
+						LBMReal mxyyMxzz = mfbca - mfbac;
+
+						//relax
+						wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
+						mfbbb += wadjust * (-mfbbb);
+						wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
+						mxxyPyzz += wadjust * (-mxxyPyzz);
+						wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
+						mxxyMyzz += wadjust * (-mxxyMyzz);
+						wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
+						mxxzPyyz += wadjust * (-mxxzPyyz);
+						wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
+						mxxzMyyz += wadjust * (-mxxzMyyz);
+						wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
+						mxyyPxzz += wadjust * (-mxyyPxzz);
+						wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
+						mxyyMxzz += wadjust * (-mxyyMxzz);
+
+						// linear combinations back
+						mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+						mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+						mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+						mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+						mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+						mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+
+						//4.
+						CUMacc += O4 * (-CUMacc);
+						CUMcac += O4 * (-CUMcac);
+						CUMcca += O4 * (-CUMcca);
+
+						CUMbbc += O4 * (-CUMbbc);
+						CUMbcb += O4 * (-CUMbcb);
+						CUMcbb += O4 * (-CUMcbb);
+
+						//5.
+						CUMbcc += O5 * (-CUMbcc);
+						CUMcbc += O5 * (-CUMcbc);
+						CUMccb += O5 * (-CUMccb);
+
+						//6.
+						CUMccc += O6 * (-CUMccc);
+
+						//back cumulants to central moments
+						//4.
+						//mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+						//mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+						//mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+						mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+						mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+						mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+						mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho;
+						mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho - 1)*oMdrho;
+						mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho;
+
+						//5.
+						mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
+						mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
+						mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
+
+						//6.
+						mfccc = CUMccc - ((-4. *  mfbbb * mfbbb
+							- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+							- 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
+							- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+							+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+								+ 2. * (mfcaa * mfaca * mfaac)
+								+ 16. *  mfbba * mfbab * mfabb)
+							- c1o3* (mfacc + mfcac + mfcca) * oMdrho - c1o9*oMdrho*oMdrho
+							- c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1. - 2.* oMdrho) - c1o27* oMdrho * oMdrho*(-2.* oMdrho)
+							+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+								+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) - c1o27*oMdrho;
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//forcing
+						mfbaa = -mfbaa;
+						mfaba = -mfaba;
+						mfaab = -mfaab;
+						//////////////////////////////////////////////////////////////////////////////////////
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//back
+						////////////////////////////////////////////////////////////////////////////////////
+						//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfaac - 2. * mfaab *  vvz + mfaaa                * (1. - vz2) - 1. * oMdrho * vz2;
+						m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2;
+						mfaaa = m0;
+						mfaab = m1;
+						mfaac = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+						m1 = -mfabc - 2. * mfabb *  vvz + mfaba * (1. - vz2);
+						m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+						mfaba = m0;
+						mfabb = m1;
+						mfabc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfacc - 2. * mfacb *  vvz + mfaca                  * (1. - vz2) - c1o3 * oMdrho * vz2;
+						m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+						mfaca = m0;
+						mfacb = m1;
+						mfacc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+						m1 = -mfbac - 2. * mfbab *  vvz + mfbaa * (1. - vz2);
+						m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+						mfbaa = m0;
+						mfbab = m1;
+						mfbac = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+						m1 = -mfbbc - 2. * mfbbb *  vvz + mfbba * (1. - vz2);
+						m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+						mfbba = m0;
+						mfbbb = m1;
+						mfbbc = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+						m1 = -mfbcc - 2. * mfbcb *  vvz + mfbca * (1. - vz2);
+						m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+						mfbca = m0;
+						mfbcb = m1;
+						mfbcc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfcac - 2. * mfcab *  vvz + mfcaa                  * (1. - vz2) - c1o3 * oMdrho * vz2;
+						m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+						mfcaa = m0;
+						mfcab = m1;
+						mfcac = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+						m1 = -mfcbc - 2. * mfcbb *  vvz + mfcba * (1. - vz2);
+						m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+						mfcba = m0;
+						mfcbb = m1;
+						mfcbc = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfccc - 2. * mfccb *  vvz + mfcca                  * (1. - vz2) - c1o9 * oMdrho * vz2;
+						m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+						mfcca = m0;
+						mfccb = m1;
+						mfccc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						//mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfaca - 2. * mfaba *  vvy + mfaaa                  * (1. - vy2) - c1o6 * oMdrho * vy2;
+						m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfaaa = m0;
+						mfaba = m1;
+						mfaca = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfacb - 2. * mfabb *  vvy + mfaab                  * (1. - vy2) - c2o3 * oMdrho * vy2;
+						m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfaab = m0;
+						mfabb = m1;
+						mfacb = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfacc - 2. * mfabc *  vvy + mfaac                  * (1. - vy2) - c1o6 * oMdrho * vy2;
+						m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfaac = m0;
+						mfabc = m1;
+						mfacc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+						m1 = -mfbca - 2. * mfbba *  vvy + mfbaa * (1. - vy2);
+						m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+						mfbaa = m0;
+						mfbba = m1;
+						mfbca = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+						m1 = -mfbcb - 2. * mfbbb *  vvy + mfbab * (1. - vy2);
+						m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+						mfbab = m0;
+						mfbbb = m1;
+						mfbcb = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+						m1 = -mfbcc - 2. * mfbbc *  vvy + mfbac * (1. - vy2);
+						m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+						mfbac = m0;
+						mfbbc = m1;
+						mfbcc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfcca - 2. * mfcba *  vvy + mfcaa                   * (1. - vy2) - c1o18 * oMdrho * vy2;
+						m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfcaa = m0;
+						mfcba = m1;
+						mfcca = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfccb - 2. * mfcbb *  vvy + mfcab                  * (1. - vy2) - c2o9 * oMdrho * vy2;
+						m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfcab = m0;
+						mfcbb = m1;
+						mfccb = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfccc - 2. * mfcbc *  vvy + mfcac                   * (1. - vy2) - c1o18 * oMdrho * vy2;
+						m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfcac = m0;
+						mfcbc = m1;
+						mfccc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						//mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcaa - 2. * mfbaa *  vvx + mfaaa                   * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaaa = m0;
+						mfbaa = m1;
+						mfcaa = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcba - 2. * mfbba *  vvx + mfaba                  * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaba = m0;
+						mfbba = m1;
+						mfcba = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcca - 2. * mfbca *  vvx + mfaca                   * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaca = m0;
+						mfbca = m1;
+						mfcca = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcab - 2. * mfbab *  vvx + mfaab                  * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaab = m0;
+						mfbab = m1;
+						mfcab = m2;
+						///////////b////////////////////////////////////////////////////////////////////////
+						m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcbb - 2. * mfbbb *  vvx + mfabb                  * (1. - vx2) - c4o9 * oMdrho * vx2;
+						m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfabb = m0;
+						mfbbb = m1;
+						mfcbb = m2;
+						///////////b////////////////////////////////////////////////////////////////////////
+						m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfccb - 2. * mfbcb *  vvx + mfacb                  * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfacb = m0;
+						mfbcb = m1;
+						mfccb = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcac - 2. * mfbac *  vvx + mfaac                   * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaac = m0;
+						mfbac = m1;
+						mfcac = m2;
+						///////////c////////////////////////////////////////////////////////////////////////
+						m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcbc - 2. * mfbbc *  vvx + mfabc                  * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfabc = m0;
+						mfbbc = m1;
+						mfcbc = m2;
+						///////////c////////////////////////////////////////////////////////////////////////
+						m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfccc - 2. * mfbcc *  vvx + mfacc                   * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfacc = m0;
+						mfbcc = m1;
+						mfccc = m2;
+
+						//////////////////////////////////////////////////////////////////////////
+						//proof correctness
+						//////////////////////////////////////////////////////////////////////////
+#ifdef  PROOF_CORRECTNESS
+						LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+							+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+							+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+						//LBMReal dif = fabs(rho - rho_post);
+						LBMReal dif = rho - rho_post;
+#ifdef SINGLEPRECISION
+						if (dif > 10.0E-7 || dif < -10.0E-7)
+#else
+						if (dif > 10.0E-15 || dif < -10.0E-15)
+#endif					
+						{
+							UB_THROW(UbException(UB_EXARGS, "rho=" + UbSystem::toString(rho) + ", rho_post=" + UbSystem::toString(rho_post)
+								+ " dif=" + UbSystem::toString(dif)
+								+ " rho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+							//UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): rho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+							//exit(EXIT_FAILURE);
+						}
+#endif
+						//////////////////////////////////////////////////////////////////////////
+						//write distribution
+						//////////////////////////////////////////////////////////////////////////
+						(*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb;
+						(*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab;
+						(*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba;
+						(*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab;
+						(*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab;
+						(*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba;
+						(*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba;
+						(*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa;
+						(*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca;
+						(*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa;
+						(*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa;
+						(*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca;
+						(*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac;
+
+						(*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+						LBMReal ux, uy, uz;
+
+						ux = vvx;						
+						uy = vvy;
+						uz = vvz;
+							
+							
+
+				
+						////////////////////////////////////////////////////////////////////////////
+						// Central Factorized Moment (advection diffusion part) 
+						//////////////////////////////////////////////////////////////////////////
+						//////////////////////////////////////////////////////////////////////////
+						//read distribution
+
+						mfcbb = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3);
+						mfbcb = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3);
+						mfbbc = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3);
+						mfccb = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3);
+						mfacb = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3);
+						mfcbc = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3);
+						mfabc = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3);
+						mfbcc = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3);
+						mfbac = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3);
+						mfccc = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3);
+						mfacc = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3);
+						mfcac = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3);
+						mfaac = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+						mfabb = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3);
+						mfbab = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3);
+						mfbba = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p);
+						mfaab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3);
+						mfcab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3);
+						mfaba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p);
+						mfcba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p);
+						mfbaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p);
+						mfbca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p);
+						mfaaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						mfcaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						mfaca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						mfcca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+						mfbbb = (*this->zeroDistributionsH)(x1, x2, x3);
+
+						////////////////////////////////////////////////////////////////////////////////////
+						LBMReal drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+							(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+							((mfabb + mfcbb) + (mfbab + mfbcb)) + (mfbba + mfbbc)) + mfbbb;
+					
+						//flocculation
+						//LBMReal lambda = drho;
+
+						//LBMReal theta = 60 * 1.28172e+06;
+						//LBMReal alpha = 0.005;// *10.0;
+
+						LBMReal gammaDot = sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one);
+
+						LBMReal dlambda = one / theta - alpha * lambda * gammaDot;
+
+						//LBMReal dlambda = one / (T*pow(lambda,m)) - alpha * lambda * gammaDot;
+
+						//////////////////////////////////////////////////////////////////////////
+						//collision Factorized Central moment Kernel Geier 2015
+						//////////////////////////////////////////////////////////////////////////               
+						LBMReal Mom000 = mfaaa + mfaab + mfaac + mfaba + mfabb + mfabc + mfaca +
+							mfacb + mfacc + mfbaa + mfbab + mfbac + mfbba + mfbbb + mfbbc + mfbca +
+							mfbcb + mfbcc + mfcaa + mfcab + mfcac + mfcba + mfcbb + mfcbc + mfcca + mfccb + mfccc;
+						
+						Mom000 += dlambda*c1o2;  //1
+
+																												   //(100)//
+						LBMReal Mom100 = mfaaa*(-1 - ux) + mfaab*(-1 - ux) + mfaac*(-1 - ux) + mfaba*(-1 - ux) + mfabb*(-1 - ux) + mfabc*(-1 - ux) + mfaca*(-1 - ux) +
+							mfacb*(-1 - ux) + mfacc*(-1 - ux) + mfcaa*(1 - ux) + mfcab*(1 - ux) + mfcac*(1 - ux) + mfcba*(1 - ux) + mfcbb*(1 - ux) +
+							mfcbc*(1 - ux) + mfcca*(1 - ux) + mfccb*(1 - ux) + mfccc*(1 - ux) - mfbaa*ux - mfbab*ux - mfbac*ux - mfbba*ux - mfbbb*ux -
+							mfbbc*ux - mfbca*ux - mfbcb*ux - mfbcc*ux;
+
+						LBMReal Mom010 = mfaaa*(-1 - uy) + mfaab*(-1 - uy) + mfaac*(-1 - uy) + mfbaa*(-1 - uy) + mfbab*(-1 - uy) + mfbac*(-1 - uy) + mfcaa*(-1 - uy) +
+							mfcab*(-1 - uy) + mfcac*(-1 - uy) + mfaca*(1 - uy) + mfacb*(1 - uy) + mfacc*(1 - uy) + mfbca*(1 - uy) + mfbcb*(1 - uy) +
+							mfbcc*(1 - uy) + mfcca*(1 - uy) + mfccb*(1 - uy) + mfccc*(1 - uy) - mfaba*uy - mfabb*uy - mfabc*uy - mfbba*uy - mfbbb*uy -
+							mfbbc*uy - mfcba*uy - mfcbb*uy - mfcbc*uy;
+
+						LBMReal Mom001 = mfaaa*(-1 - uz) + mfaba*(-1 - uz) + mfaca*(-1 - uz) + mfbaa*(-1 - uz) + mfbba*(-1 - uz) + mfbca*(-1 - uz) + mfcaa*(-1 - uz) +
+							mfcba*(-1 - uz) + mfcca*(-1 - uz) + mfaac*(1 - uz) + mfabc*(1 - uz) + mfacc*(1 - uz) + mfbac*(1 - uz) + mfbbc*(1 - uz) +
+							mfbcc*(1 - uz) + mfcac*(1 - uz) + mfcbc*(1 - uz) + mfccc*(1 - uz) - mfaab*uz - mfabb*uz - mfacb*uz - mfbab*uz - mfbbb*uz -
+							mfbcb*uz - mfcab*uz - mfcbb*uz - mfccb*uz;
+						////
+
+						//(110)//
+						LBMReal Mom110 = mfaaa*(-1 - ux)*(-1 - uy) + mfaab*(-1 - ux)*(-1 - uy) + mfaac*(-1 - ux)*(-1 - uy) + mfcaa*(1 - ux)*(-1 - uy) +
+							mfcab*(1 - ux)*(-1 - uy) + mfcac*(1 - ux)*(-1 - uy) - mfbaa*ux*(-1 - uy) - mfbab*ux*(-1 - uy) - mfbac*ux*(-1 - uy) +
+							mfaca*(-1 - ux)*(1 - uy) + mfacb*(-1 - ux)*(1 - uy) + mfacc*(-1 - ux)*(1 - uy) + mfcca*(1 - ux)*(1 - uy) + mfccb*(1 - ux)*(1 - uy) +
+							mfccc*(1 - ux)*(1 - uy) - mfbca*ux*(1 - uy) - mfbcb*ux*(1 - uy) - mfbcc*ux*(1 - uy) - mfaba*(-1 - ux)*uy - mfabb*(-1 - ux)*uy -
+							mfabc*(-1 - ux)*uy - mfcba*(1 - ux)*uy - mfcbb*(1 - ux)*uy - mfcbc*(1 - ux)*uy + mfbba*ux*uy + mfbbb*ux*uy + mfbbc*ux*uy;
+
+						LBMReal Mom101 = mfaaa*(-1 - ux)*(-1 - uz) + mfaba*(-1 - ux)*(-1 - uz) + mfaca*(-1 - ux)*(-1 - uz) + mfcaa*(1 - ux)*(-1 - uz) +
+							mfcba*(1 - ux)*(-1 - uz) + mfcca*(1 - ux)*(-1 - uz) - mfbaa*ux*(-1 - uz) - mfbba*ux*(-1 - uz) - mfbca*ux*(-1 - uz) +
+							mfaac*(-1 - ux)*(1 - uz) + mfabc*(-1 - ux)*(1 - uz) + mfacc*(-1 - ux)*(1 - uz) + mfcac*(1 - ux)*(1 - uz) + mfcbc*(1 - ux)*(1 - uz) +
+							mfccc*(1 - ux)*(1 - uz) - mfbac*ux*(1 - uz) - mfbbc*ux*(1 - uz) - mfbcc*ux*(1 - uz) - mfaab*(-1 - ux)*uz - mfabb*(-1 - ux)*uz -
+							mfacb*(-1 - ux)*uz - mfcab*(1 - ux)*uz - mfcbb*(1 - ux)*uz - mfccb*(1 - ux)*uz + mfbab*ux*uz + mfbbb*ux*uz + mfbcb*ux*uz;
+
+						LBMReal Mom011 = mfaaa*(-1 - uy)*(-1 - uz) + mfbaa*(-1 - uy)*(-1 - uz) + mfcaa*(-1 - uy)*(-1 - uz) + mfaca*(1 - uy)*(-1 - uz) +
+							mfbca*(1 - uy)*(-1 - uz) + mfcca*(1 - uy)*(-1 - uz) - mfaba*uy*(-1 - uz) - mfbba*uy*(-1 - uz) - mfcba*uy*(-1 - uz) +
+							mfaac*(-1 - uy)*(1 - uz) + mfbac*(-1 - uy)*(1 - uz) + mfcac*(-1 - uy)*(1 - uz) + mfacc*(1 - uy)*(1 - uz) + mfbcc*(1 - uy)*(1 - uz) +
+							mfccc*(1 - uy)*(1 - uz) - mfabc*uy*(1 - uz) - mfbbc*uy*(1 - uz) - mfcbc*uy*(1 - uz) - mfaab*(-1 - uy)*uz - mfbab*(-1 - uy)*uz -
+							mfcab*(-1 - uy)*uz - mfacb*(1 - uy)*uz - mfbcb*(1 - uy)*uz - mfccb*(1 - uy)*uz + mfabb*uy*uz + mfbbb*uy*uz + mfcbb*uy*uz;
+						////
+
+						LBMReal Mom111 = mfaaa*(-1 - ux)*(-1 - uy)*(-1 - uz) + mfcaa*(1 - ux)*(-1 - uy)*(-1 - uz) - mfbaa*ux*(-1 - uy)*(-1 - uz) +
+							mfaca*(-1 - ux)*(1 - uy)*(-1 - uz) + mfcca*(1 - ux)*(1 - uy)*(-1 - uz) - mfbca*ux*(1 - uy)*(-1 - uz) -
+							mfaba*(-1 - ux)*uy*(-1 - uz) - mfcba*(1 - ux)*uy*(-1 - uz) + mfbba*ux*uy*(-1 - uz) + mfaac*(-1 - ux)*(-1 - uy)*(1 - uz) +
+							mfcac*(1 - ux)*(-1 - uy)*(1 - uz) - mfbac*ux*(-1 - uy)*(1 - uz) + mfacc*(-1 - ux)*(1 - uy)*(1 - uz) +
+							mfccc*(1 - ux)*(1 - uy)*(1 - uz) - mfbcc*ux*(1 - uy)*(1 - uz) - mfabc*(-1 - ux)*uy*(1 - uz) - mfcbc*(1 - ux)*uy*(1 - uz) +
+							mfbbc*ux*uy*(1 - uz) - mfaab*(-1 - ux)*(-1 - uy)*uz - mfcab*(1 - ux)*(-1 - uy)*uz + mfbab*ux*(-1 - uy)*uz -
+							mfacb*(-1 - ux)*(1 - uy)*uz - mfccb*(1 - ux)*(1 - uy)*uz + mfbcb*ux*(1 - uy)*uz + mfabb*(-1 - ux)*uy*uz + mfcbb*(1 - ux)*uy*uz -
+							mfbbb*ux*uy*uz;
+
+						//(200)//
+						LBMReal Mom200 = ((mfcaa + mfcab + mfcac + mfcba + mfcbb + mfcbc + mfcca + mfccb +
+							mfccc)*pow(-1 + ux, 2) +
+							(mfbaa + mfbab + mfbac + mfbba + mfbbb + mfbbc + mfbca +
+								mfbcb + mfbcc)*pow(ux, 2) +
+								(mfaaa + mfaab + mfaac + mfaba + mfabb + mfabc + mfaca +
+									mfacb + mfacc)*pow(1 + ux, 2)) - Mom000 / 3;
+
+						LBMReal Mom020 = ((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) +
+							(mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) +
+							(mfcca + mfccb + mfccc)*pow(-1 + uy, 2) +
+							(mfaba + mfabb + mfabc)*pow(uy, 2) +
+							(mfbba + mfbbb + mfbbc)*pow(uy, 2) +
+							(mfcba + mfcbb + mfcbc)*pow(uy, 2) +
+							(mfaaa + mfaab + mfaac)*pow(1 + uy, 2) +
+							(mfbaa + mfbab + mfbac)*pow(1 + uy, 2) +
+							(mfcaa + mfcab + mfcac)*pow(1 + uy, 2)) - Mom000 / 3;
+
+						LBMReal Mom002 = (mfaba + mfabc + mfaca + mfacc + mfbba + mfbbc + mfbca + mfbcc +
+							mfcba + mfcbc + mfcca + mfccc + mfaac*pow(-1 + uz, 2) +
+							mfbac*pow(-1 + uz, 2) + mfcac*pow(-1 + uz, 2) +
+							2 * mfaba*uz - 2 * mfabc*uz + 2 * mfaca*uz - 2 * mfacc*uz +
+							2 * mfbba*uz - 2 * mfbbc*uz + 2 * mfbca*uz - 2 * mfbcc*uz +
+							2 * mfcba*uz - 2 * mfcbc*uz + 2 * mfcca*uz - 2 * mfccc*uz +
+							mfaab*pow(uz, 2) + mfaba*pow(uz, 2) + mfabb*pow(uz, 2) +
+							mfabc*pow(uz, 2) + mfaca*pow(uz, 2) + mfacb*pow(uz, 2) +
+							mfacc*pow(uz, 2) + mfbab*pow(uz, 2) + mfbba*pow(uz, 2) +
+							mfbbb*pow(uz, 2) + mfbbc*pow(uz, 2) + mfbca*pow(uz, 2) +
+							mfbcb*pow(uz, 2) + mfbcc*pow(uz, 2) + mfcab*pow(uz, 2) +
+							mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) + mfcbc*pow(uz, 2) +
+							mfcca*pow(uz, 2) + mfccb*pow(uz, 2) + mfccc*pow(uz, 2) +
+							mfaaa*pow(1 + uz, 2) + mfbaa*pow(1 + uz, 2) +
+							mfcaa*pow(1 + uz, 2)) - Mom000 / 3;
+						////
+
+						//(210)//
+						LBMReal Mom210 = (pow(1 + ux, 2)*(-((mfaca + mfacb + mfacc)*(-1 + uy)) -
+							(mfaba + mfabb + mfabc)*uy -
+							(mfaaa + mfaab + mfaac)*(1 + uy)) +
+							pow(ux, 2)*(-((mfbca + mfbcb + mfbcc)*(-1 + uy)) -
+							(mfbba + mfbbb + mfbbc)*uy -
+								(mfbaa + mfbab + mfbac)*(1 + uy)) +
+							pow(-1 + ux, 2)*(-((mfcca + mfccb + mfccc)*(-1 + uy)) -
+							(mfcba + mfcbb + mfcbc)*uy -
+								(mfcaa + mfcab + mfcac)*(1 + uy))) - Mom010 / 3;
+
+						LBMReal Mom201 = (-(pow(1 + ux, 2)*(mfaba - mfabc + mfaca - mfacc +
+							mfaac*(-1 + uz) + mfaab*uz + mfaba*uz + mfabb*uz +
+							mfabc*uz + mfaca*uz + mfacb*uz + mfacc*uz +
+							mfaaa*(1 + uz))) -
+							pow(ux, 2)*(mfbba - mfbbc + mfbca - mfbcc +
+								mfbac*(-1 + uz) + mfbab*uz + mfbba*uz + mfbbb*uz +
+								mfbbc*uz + mfbca*uz + mfbcb*uz + mfbcc*uz + mfbaa*(1 + uz))
+							- pow(-1 + ux, 2)*(mfcba - mfcbc + mfcca - mfccc +
+								mfcac*(-1 + uz) + mfcab*uz + mfcba*uz + mfcbb*uz +
+								mfcbc*uz + mfcca*uz + mfccb*uz + mfccc*uz + mfcaa*(1 + uz))) - Mom001 / 3;
+
+						LBMReal Mom120 = ((-1 - ux)*((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) +
+							(mfaba + mfabb + mfabc)*pow(uy, 2) +
+							(mfaaa + mfaab + mfaac)*pow(1 + uy, 2)) -
+							ux*((mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) +
+							(mfbba + mfbbb + mfbbc)*pow(uy, 2) +
+								(mfbaa + mfbab + mfbac)*pow(1 + uy, 2)) +
+								(1 - ux)*((mfcca + mfccb + mfccc)*pow(-1 + uy, 2) +
+							(mfcba + mfcbb + mfcbc)*pow(uy, 2) +
+									(mfcaa + mfcab + mfcac)*pow(1 + uy, 2))) - Mom100 / 3;
+
+
+						LBMReal Mom102 = (-((1 + ux)*(mfaba + mfabc + mfaca + mfacc +
+							mfaac*pow(-1 + uz, 2) + 2 * mfaba*uz - 2 * mfabc*uz +
+							2 * mfaca*uz - 2 * mfacc*uz + mfaab*pow(uz, 2) +
+							mfaba*pow(uz, 2) + mfabb*pow(uz, 2) +
+							mfabc*pow(uz, 2) + mfaca*pow(uz, 2) +
+							mfacb*pow(uz, 2) + mfacc*pow(uz, 2) +
+							mfaaa*pow(1 + uz, 2))) -
+							ux*(mfbba + mfbbc + mfbca + mfbcc + mfbac*pow(-1 + uz, 2) +
+								2 * mfbba*uz - 2 * mfbbc*uz + 2 * mfbca*uz - 2 * mfbcc*uz +
+								mfbab*pow(uz, 2) + mfbba*pow(uz, 2) +
+								mfbbb*pow(uz, 2) + mfbbc*pow(uz, 2) +
+								mfbca*pow(uz, 2) + mfbcb*pow(uz, 2) +
+								mfbcc*pow(uz, 2) + mfbaa*pow(1 + uz, 2)) -
+								(-1 + ux)*(mfcba + mfcbc + mfcca + mfccc +
+									mfcac*pow(-1 + uz, 2) + 2 * mfcba*uz - 2 * mfcbc*uz +
+									2 * mfcca*uz - 2 * mfccc*uz + mfcab*pow(uz, 2) +
+									mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) +
+									mfcbc*pow(uz, 2) + mfcca*pow(uz, 2) +
+									mfccb*pow(uz, 2) + mfccc*pow(uz, 2) +
+									mfcaa*pow(1 + uz, 2))) - Mom100 / 3;
+
+						LBMReal Mom021 = (-(pow(1 + uy, 2)*(mfaac*(-1 + uz) + mfaab*uz +
+							mfaaa*(1 + uz))) -
+							pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz + mfaba*(1 + uz)) -
+							pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz +
+								mfaca*(1 + uz)) - pow(1 + uy, 2)*
+								(mfbac*(-1 + uz) + mfbab*uz + mfbaa*(1 + uz)) -
+							pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz + mfbba*(1 + uz)) -
+							pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz +
+								mfbca*(1 + uz)) - pow(1 + uy, 2)*
+								(mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz)) -
+							pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz + mfcba*(1 + uz)) -
+							pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz + mfcca*(1 + uz))) - Mom001 / 3;
+
+						LBMReal Mom012 = (-((1 + uy)*(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) +
+							mfaaa*pow(1 + uz, 2))) -
+							uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) -
+								(-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) +
+									mfaca*pow(1 + uz, 2)) -
+									(1 + uy)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) +
+										mfbaa*pow(1 + uz, 2)) -
+							uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+								mfbba*pow(1 + uz, 2)) -
+								(-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) +
+									mfbca*pow(1 + uz, 2)) -
+									(1 + uy)*(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) +
+										mfcaa*pow(1 + uz, 2)) -
+							uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+								mfcba*pow(1 + uz, 2)) -
+								(-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) +
+									mfcca*pow(1 + uz, 2))) - Mom010 / 3;
+						////
+
+
+						//(220)//
+						LBMReal Mom220 = (pow(1 + ux, 2)*((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) +
+							(mfaba + mfabb + mfabc)*pow(uy, 2) +
+							(mfaaa + mfaab + mfaac)*pow(1 + uy, 2)) +
+							pow(ux, 2)*((mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) +
+							(mfbba + mfbbb + mfbbc)*pow(uy, 2) +
+								(mfbaa + mfbab + mfbac)*pow(1 + uy, 2)) +
+							pow(-1 + ux, 2)*((mfcca + mfccb + mfccc)*pow(-1 + uy, 2) +
+							(mfcba + mfcbb + mfcbc)*pow(uy, 2) +
+								(mfcaa + mfcab + mfcac)*pow(1 + uy, 2))) - Mom000 / 9;
+
+						LBMReal Mom202 = (pow(1 + ux, 2)*(mfaba + mfabc + mfaca + mfacc +
+							mfaac*pow(-1 + uz, 2) + 2 * mfaba*uz - 2 * mfabc*uz +
+							2 * mfaca*uz - 2 * mfacc*uz + mfaab*pow(uz, 2) +
+							mfaba*pow(uz, 2) + mfabb*pow(uz, 2) +
+							mfabc*pow(uz, 2) + mfaca*pow(uz, 2) +
+							mfacb*pow(uz, 2) + mfacc*pow(uz, 2) +
+							mfaaa*pow(1 + uz, 2)) +
+							pow(ux, 2)*(mfbba + mfbbc + mfbca + mfbcc +
+								mfbac*pow(-1 + uz, 2) + 2 * mfbba*uz - 2 * mfbbc*uz +
+								2 * mfbca*uz - 2 * mfbcc*uz + mfbab*pow(uz, 2) +
+								mfbba*pow(uz, 2) + mfbbb*pow(uz, 2) +
+								mfbbc*pow(uz, 2) + mfbca*pow(uz, 2) +
+								mfbcb*pow(uz, 2) + mfbcc*pow(uz, 2) +
+								mfbaa*pow(1 + uz, 2)) +
+							pow(-1 + ux, 2)*(mfcba + mfcbc + mfcca + mfccc +
+								mfcac*pow(-1 + uz, 2) + 2 * mfcba*uz - 2 * mfcbc*uz +
+								2 * mfcca*uz - 2 * mfccc*uz + mfcab*pow(uz, 2) +
+								mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) +
+								mfcbc*pow(uz, 2) + mfcca*pow(uz, 2) +
+								mfccb*pow(uz, 2) + mfccc*pow(uz, 2) +
+								mfcaa*pow(1 + uz, 2))) - Mom000 / 9;
+
+						LBMReal Mom022 = (pow(1 + uy, 2)*(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) +
+							mfaaa*pow(1 + uz, 2)) +
+							pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) +
+							pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) +
+								mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2)) +
+							pow(1 + uy, 2)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) +
+								mfbaa*pow(1 + uz, 2)) +
+							pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+								mfbba*pow(1 + uz, 2)) +
+							pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) +
+								mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2)) +
+							pow(1 + uy, 2)*(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) +
+								mfcaa*pow(1 + uz, 2)) +
+							pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+								mfcba*pow(1 + uz, 2)) +
+							pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) +
+								mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2))) - Mom000 / 9;
+						////
+
+						//(221)//
+						LBMReal Mom221 = (pow(1 + ux, 2)*(-(pow(1 + uy, 2)*
+							(mfaac*(-1 + uz) + mfaab*uz + mfaaa*(1 + uz))) -
+							pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz +
+								mfaba*(1 + uz)) -
+							pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz +
+								mfaca*(1 + uz))) +
+							pow(ux, 2)*(-(pow(1 + uy, 2)*
+							(mfbac*(-1 + uz) + mfbab*uz + mfbaa*(1 + uz))) -
+								pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz +
+									mfbba*(1 + uz)) -
+								pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz +
+									mfbca*(1 + uz))) +
+							pow(-1 + ux, 2)*(-(pow(1 + uy, 2)*
+							(mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz))) -
+								pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz +
+									mfcba*(1 + uz)) -
+								pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz +
+									mfcca*(1 + uz)))) - Mom001 / 9;
+
+						LBMReal Mom212 = (pow(1 + ux, 2)*(-((1 + uy)*
+							(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) +
+								mfaaa*pow(1 + uz, 2))) -
+							uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) -
+								(-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) +
+									mfaca*pow(1 + uz, 2))) +
+							pow(ux, 2)*(-((1 + uy)*
+							(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) +
+								mfbaa*pow(1 + uz, 2))) -
+								uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+									mfbba*pow(1 + uz, 2)) -
+									(-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) +
+										mfbca*pow(1 + uz, 2))) +
+							pow(-1 + ux, 2)*(-((1 + uy)*
+							(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) +
+								mfcaa*pow(1 + uz, 2))) -
+								uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+									mfcba*pow(1 + uz, 2)) -
+									(-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) +
+										mfcca*pow(1 + uz, 2)))) - Mom010 / 9;
+
+						LBMReal Mom122 = ((-1 - ux)*(pow(1 + uy, 2)*
+							(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) +
+								mfaaa*pow(1 + uz, 2)) +
+							pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) +
+							pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) +
+								mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2))) -
+							ux*(pow(1 + uy, 2)*(mfbac*pow(-1 + uz, 2) +
+								mfbab*pow(uz, 2) + mfbaa*pow(1 + uz, 2)) +
+								pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+									mfbba*pow(1 + uz, 2)) +
+								pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) +
+									mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2))) +
+									(1 - ux)*(pow(1 + uy, 2)*
+							(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) +
+								mfcaa*pow(1 + uz, 2)) +
+										pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+											mfcba*pow(1 + uz, 2)) +
+										pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) +
+											mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2)))) - Mom100 / 9;
+						////
+
+						//(211)//
+						LBMReal Mom211 = (pow(1 + ux, 2)*((1 + uy)*(mfaac*(-1 + uz) + mfaab*uz +
+							mfaaa*(1 + uz)) +
+							uy*(mfabc*(-1 + uz) + mfabb*uz + mfaba*(1 + uz)) +
+							(-1 + uy)*(mfacc*(-1 + uz) + mfacb*uz + mfaca*(1 + uz))) +
+							pow(ux, 2)*((1 + uy)*(mfbac*(-1 + uz) + mfbab*uz +
+								mfbaa*(1 + uz)) +
+								uy*(mfbbc*(-1 + uz) + mfbbb*uz + mfbba*(1 + uz)) +
+								(-1 + uy)*(mfbcc*(-1 + uz) + mfbcb*uz + mfbca*(1 + uz))) +
+							pow(-1 + ux, 2)*((1 + uy)*
+							(mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz)) +
+								uy*(mfcbc*(-1 + uz) + mfcbb*uz + mfcba*(1 + uz)) +
+								(-1 + uy)*(mfccc*(-1 + uz) + mfccb*uz + mfcca*(1 + uz)))) - Mom011 / 3;
+
+						LBMReal Mom121 = ((-1 - ux)*(-(pow(1 + uy, 2)*
+							(mfaac*(-1 + uz) + mfaab*uz + mfaaa*(1 + uz))) -
+							pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz +
+								mfaba*(1 + uz)) -
+							pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz +
+								mfaca*(1 + uz))) -
+							ux*(-(pow(1 + uy, 2)*(mfbac*(-1 + uz) + mfbab*uz +
+								mfbaa*(1 + uz))) -
+								pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz +
+									mfbba*(1 + uz)) -
+								pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz +
+									mfbca*(1 + uz))) +
+									(1 - ux)*(-(pow(1 + uy, 2)*
+							(mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz))) -
+										pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz +
+											mfcba*(1 + uz)) -
+										pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz +
+											mfcca*(1 + uz)))) - Mom101 / 3;
+
+						LBMReal Mom112 = ((-1 - ux)*(-((1 + uy)*(mfaac*pow(-1 + uz, 2) +
+							mfaab*pow(uz, 2) + mfaaa*pow(1 + uz, 2))) -
+							uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) -
+								(-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) +
+									mfaca*pow(1 + uz, 2))) -
+							ux*(-((1 + uy)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) +
+								mfbaa*pow(1 + uz, 2))) -
+								uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+									mfbba*pow(1 + uz, 2)) -
+									(-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) +
+										mfbca*pow(1 + uz, 2))) +
+										(1 - ux)*(-((1 + uy)*(mfcac*pow(-1 + uz, 2) +
+											mfcab*pow(uz, 2) + mfcaa*pow(1 + uz, 2))) -
+											uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+												mfcba*pow(1 + uz, 2)) -
+												(-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) +
+													mfcca*pow(1 + uz, 2)))) - Mom110 / 3;
+						////
+
+						//(222)//
+						LBMReal Mom222 = (pow(1 + ux, 2)*(pow(1 + uy, 2)*
+							(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) +
+								mfaaa*pow(1 + uz, 2)) +
+							pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) +
+								mfaba*pow(1 + uz, 2)) +
+							pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) +
+								mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2))) +
+							pow(ux, 2)*(pow(1 + uy, 2)*
+							(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) +
+								mfbaa*pow(1 + uz, 2)) +
+								pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) +
+									mfbba*pow(1 + uz, 2)) +
+								pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) +
+									mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2))) +
+							pow(-1 + ux, 2)*(pow(1 + uy, 2)*
+							(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) +
+								mfcaa*pow(1 + uz, 2)) +
+								pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) +
+									mfcba*pow(1 + uz, 2)) +
+								pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) +
+									mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2)))) - Mom000 / 27;
+						////
+
+
+
+
+
+						LBMReal Meq000 = drho+dlambda*c1o2;
+
+
+						// relaxation Central Moment MRT
+
+						Mom000 = Meq000;
+
+						Mom000 += dlambda*c1o2;
+
+						Mom100 = (1 - collFactorH) * Mom100;
+						Mom010 = (1 - collFactorH) * Mom010;
+						Mom001 = (1 - collFactorH) * Mom001;
+
+						Mom110 = 0;
+						Mom101 = 0;
+						Mom011 = 0;
+
+						Mom111 = 0;
+
+						//(200)//
+						Mom200 = Mom000 / 3;
+						Mom020 = Mom000 / 3;
+						Mom002 = Mom000 / 3;
+						////
+
+						//(210)//
+						Mom210 = Mom010 / 3;
+						Mom201 = Mom001 / 3;
+						Mom120 = Mom100 / 3;
+
+
+						Mom102 = Mom100 / 3;
+						Mom021 = Mom001 / 3;
+						Mom012 = Mom010 / 3;
+						////
+
+
+						//(220)//
+						Mom220 = Mom000 / 9;
+						Mom202 = Mom000 / 9;
+						Mom022 = Mom000 / 9;
+						////
+
+						//(221)//
+						Mom221 = Mom001 / 9;
+						Mom212 = Mom010 / 9;
+						Mom122 = Mom100 / 9;
+						////
+
+						//(211)//
+						Mom211 = Mom011 / 3;
+						Mom121 = Mom101 / 3;
+						Mom112 = Mom110 / 3;
+						////
+
+						//(222)//
+						Mom222 = Mom000 / 27;
+						////
+						
+
+
+						//Back transformation to distributions
+
+						mfcbb = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) +
+							2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy +
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*
+							(-1 + pow(uy, 2)) -
+							2 * (-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) -
+								2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*
+								uy - (Mom101 + Mom201 + 2 * Mom101*ux +
+									Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*uz +
+									(-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) -
+										2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*
+										uy - (Mom100 + Mom200 + 2 * Mom100*ux +
+											Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))*
+											(1 - pow(uz, 2))) / 2.;
+						mfbcb = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) +
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy*
+							(1 + uy) + (Mom212 + 2 * Mom112*ux +
+								Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) -
+							2 * (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy*
+								(1 + uy) - (Mom211 + 2 * Mom111*ux +
+									Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*uz +
+									(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy*
+										(1 + uy) - (Mom210 + 2 * Mom110*ux +
+											Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))*
+											(1 - pow(uz, 2))) / 2.;
+						mfbbc = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) +
+							2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy +
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*
+							(-1 + pow(uy, 2)) +
+							(Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) +
+								2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*
+								uy + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*
+								(-1 + pow(uy, 2)))*uz*(1 + uz) +
+								(Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) +
+									2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*
+									uy + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*
+									(-1 + pow(uy, 2)))*(1 + 2 * uz)) / 2.;
+						mfccb = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) -
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy*
+							(1 + uy) - (Mom112 + Mom212 + 2 * Mom112*ux +
+								Mom012*ux*(1 + ux))*(1 + 2 * uy) -
+							2 * (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy*
+								(1 + uy) + (Mom111 + Mom211 + 2 * Mom111*ux +
+									Mom011*ux*(1 + ux))*(1 + 2 * uy))*uz +
+									(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy*
+										(1 + uy) + (Mom110 + Mom210 + 2 * Mom110*ux +
+											Mom010*ux*(1 + ux))*(1 + 2 * uy))*(1 - pow(uz, 2))) / 4.;
+						mfacb = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux -
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy*
+							(1 + uy) - (Mom212 + Mom012*(-1 + ux)*ux +
+								Mom112*(-1 + 2 * ux))*(1 + 2 * uy) -
+							2 * (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy*
+								(1 + uy) + (Mom211 + Mom011*(-1 + ux)*ux +
+									Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*uz +
+									(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy*
+										(1 + uy) + (Mom210 + Mom010*(-1 + ux)*ux +
+											Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*(1 - pow(uz, 2))) / 4.;
+						mfcbc = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) -
+							2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy -
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*
+							(-1 + pow(uy, 2)) +
+							(-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) -
+								2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*
+								uy - (Mom100 + Mom200 + 2 * Mom100*ux +
+									Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))*uz*(1 + uz) +
+									(-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) -
+										2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*
+										uy - (Mom101 + Mom201 + 2 * Mom101*ux +
+											Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*(1 + 2 * uz)) / 4.;
+						mfabc = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux -
+							2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy -
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*
+							(-1 + pow(uy, 2)) +
+							(Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux -
+								2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*
+								uy - (Mom200 + Mom000*(-1 + ux)*ux +
+									Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*uz*(1 + uz) +
+									(Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux -
+										2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*
+										uy - (Mom201 + Mom001*(-1 + ux)*ux +
+											Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(1 + 2 * uz)) / 4.;
+						mfbcc = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) -
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy*
+							(1 + uy) - (Mom212 + 2 * Mom112*ux +
+								Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) +
+								(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy*
+									(1 + uy) - (Mom210 + 2 * Mom110*ux +
+										Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))*uz*(1 + uz) +
+										(Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy*
+											(1 + uy) - (Mom211 + 2 * Mom111*ux +
+												Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(1 + 2 * uz)) / 4.;
+						mfbac = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) -
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*
+							(-1 + uy)*uy - (Mom212 + 2 * Mom112*ux +
+								Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) +
+								(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*
+									(-1 + uy)*uy - (Mom210 + 2 * Mom110*ux +
+										Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*uz*(1 + uz) +
+										(Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*
+											(-1 + uy)*uy - (Mom211 + 2 * Mom111*ux +
+												Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(1 + 2 * uz)) / 4.;
+						mfccc = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) +
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy*
+							(1 + uy) + (Mom112 + Mom212 + 2 * Mom112*ux +
+								Mom012*ux*(1 + ux))*(1 + 2 * uy) +
+								(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy*
+									(1 + uy) + (Mom110 + Mom210 + 2 * Mom110*ux +
+										Mom010*ux*(1 + ux))*(1 + 2 * uy))*uz*(1 + uz) +
+										(Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy*
+											(1 + uy) + (Mom111 + Mom211 + 2 * Mom111*ux +
+												Mom011*ux*(1 + ux))*(1 + 2 * uy))*(1 + 2 * uz)) / 8.;
+						mfacc = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) +
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy*
+							(1 + uy) + (Mom212 + Mom012*(-1 + ux)*ux +
+								Mom112*(-1 + 2 * ux))*(1 + 2 * uy) +
+								(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy*
+									(1 + uy) + (Mom210 + Mom010*(-1 + ux)*ux +
+										Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*uz*(1 + uz) +
+										(Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy*
+											(1 + uy) + (Mom211 + Mom011*(-1 + ux)*ux +
+												Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*(1 + 2 * uz)) / 8.;
+						mfcac = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) +
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*
+							(-1 + uy)*uy + (Mom112 + Mom212 + 2 * Mom112*ux +
+								Mom012*ux*(1 + ux))*(-1 + 2 * uy) +
+								(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*
+									(-1 + uy)*uy + (Mom110 + Mom210 + 2 * Mom110*ux +
+										Mom010*ux*(1 + ux))*(-1 + 2 * uy))*uz*(1 + uz) +
+										(Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*
+											(-1 + uy)*uy + (Mom111 + Mom211 + 2 * Mom111*ux +
+												Mom011*ux*(1 + ux))*(-1 + 2 * uy))*(1 + 2 * uz)) / 8.;
+						mfaac = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) +
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*
+							(-1 + uy)*uy + (Mom212 + Mom012*(-1 + ux)*ux +
+								Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) +
+								(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*
+									(-1 + uy)*uy + (Mom210 + Mom010*(-1 + ux)*ux +
+										Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*uz*(1 + uz) +
+										(Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*
+											(-1 + uy)*uy + (Mom211 + Mom011*(-1 + ux)*ux +
+												Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*(1 + 2 * uz)) / 8.;
+
+						mfabb = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) +
+							2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy +
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*
+							(-1 + pow(uy, 2)) -
+							2 * (Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux -
+								2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*
+								uy - (Mom201 + Mom001*(-1 + ux)*ux +
+									Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*uz +
+									(Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux -
+										2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*
+										uy - (Mom200 + Mom000*(-1 + ux)*ux +
+											Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*
+											(1 - pow(uz, 2))) / 2.;
+						mfbab = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) +
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*
+							(-1 + uy)*uy + (Mom212 + 2 * Mom112*ux +
+								Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) -
+							2 * (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*
+								(-1 + uy)*uy - (Mom211 + 2 * Mom111*ux +
+									Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*uz +
+									(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*
+										(-1 + uy)*uy - (Mom210 + 2 * Mom110*ux +
+											Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*
+											(1 - pow(uz, 2))) / 2.;
+						mfbba = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) +
+							2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy +
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*
+							(-1 + pow(uy, 2)) +
+							(Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) +
+								2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*
+								uy + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*
+								(-1 + pow(uy, 2)))*(-1 + uz)*uz +
+								(Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) +
+									2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*
+									uy + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*
+									(-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 2.;
+						mfaab = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux -
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*
+							(-1 + uy)*uy - (Mom212 + Mom012*(-1 + ux)*ux +
+								Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) -
+							2 * (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*
+								(-1 + uy)*uy + (Mom211 + Mom011*(-1 + ux)*ux +
+									Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*uz +
+									(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*
+										(-1 + uy)*uy + (Mom210 + Mom010*(-1 + ux)*ux +
+											Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*(1 - pow(uz, 2))) / 4.;
+						mfcab = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) -
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*
+							(-1 + uy)*uy - (Mom112 + Mom212 + 2 * Mom112*ux +
+								Mom012*ux*(1 + ux))*(-1 + 2 * uy) -
+							2 * (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*
+								(-1 + uy)*uy + (Mom111 + Mom211 + 2 * Mom111*ux +
+									Mom011*ux*(1 + ux))*(-1 + 2 * uy))*uz +
+									(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*
+										(-1 + uy)*uy + (Mom110 + Mom210 + 2 * Mom110*ux +
+											Mom010*ux*(1 + ux))*(-1 + 2 * uy))*(1 - pow(uz, 2))) / 4.;
+						mfaba = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux - 2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy -
+							(Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*(-1 + pow(uy, 2)) +
+							(Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux - 2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*uy -
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(-1 + uz)*uz +
+								(Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux - 2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*uy -
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 4.;
+						mfcba = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) - 2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy -
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*(-1 + pow(uy, 2)) +
+							(-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) - 2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*uy -
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))*(-1 + uz)*uz +
+								(-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) - 2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*uy -
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 4.;
+						mfbaa = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*(-1 + uy)*uy -
+							(Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) +
+							(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*(-1 + uy)*uy -
+								(Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*(-1 + uy)*uy -
+									(Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 4.;
+						mfbca = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy*(1 + uy) -
+							(Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) +
+							(Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) -
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy*(1 + uy) -
+								(Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) -
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy*(1 + uy) -
+									(Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(-1 + 2 * uz)) / 4.;
+						mfaaa = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*(-1 + uy)*uy +
+							(Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) +
+							(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*(-1 + uy)*uy +
+								(Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*(-1 + uy)*uy +
+									(Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 8.;
+						mfcaa = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) +
+							(Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*(-1 + uy)*uy +
+							(Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*(-1 + 2 * uy) +
+							(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*(-1 + uy)*uy +
+								(Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*(-1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*(-1 + uy)*uy +
+									(Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 8.;
+						mfaca = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy*(1 + uy) +
+							(Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*(1 + 2 * uy) +
+							(Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) +
+							(Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy*(1 + uy) +
+								(Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) +
+							(Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy*(1 + uy) +
+									(Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*(-1 + 2 * uz)) / 8.;
+						mfcca = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy*(1 + uy) +
+							(Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*(1 + 2 * uy) +
+							(Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) +
+							(Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy*(1 + uy) +
+								(Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*(1 + 2 * uy))*(-1 + uz)*uz +
+								(Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) +
+							(Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy*(1 + uy) +
+									(Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*(1 + 2 * uy))*(-1 + 2 * uz)) / 8.;
+
+						mfbbb = Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - 2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy -
+							(Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)) -
+							2 * (Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) + 2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*uy +
+							(Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)))*uz +
+								(Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) + 2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*uy +
+							(Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)))*(1 - pow(uz, 2));
+
+						////////////////////////////////////////////////////////////////////////////////////
+
+						//////////////////////////////////////////////////////////////////////////
+						//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;
+						//UBLOG(logINFO, "lambda ="<<drho_post);
+//						//LBMReal dif = fabs(rho - rho_post);
+//						dif = drho - drho_post;
+//#ifdef SINGLEPRECISION
+//						if (dif > 10.0E-7 || dif < -10.0E-7)
+//#else
+//						if (dif > 10.0E-15 || dif < -10.0E-15)
+//#endif
+//						{
+//							UB_THROW(UbException(UB_EXARGS, "Flocculation=" + UbSystem::toString(drho) + ", flocculation post=" + UbSystem::toString(drho_post)
+//								+ " dif=" + UbSystem::toString(dif)
+//								+ " Flocculation is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+//							//UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): rho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+//							//exit(EXIT_FAILURE);
+//						}
+//#endif
+						//////////////////////////////////////////////////////////////////////////
+						//write distribution
+						//////////////////////////////////////////////////////////////////////////
+						(*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3) = mfabb;
+						(*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3) = mfbab;
+						(*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3) = mfbba;
+						(*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3) = mfaab;
+						(*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab;
+						(*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3) = mfaba;
+						(*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba;
+						(*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa;
+						(*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca;
+						(*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa;
+						(*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa;
+						(*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca;
+						(*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac;
+						(*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac;
+
+						(*this->zeroDistributionsH)(x1, x2, x3) = mfbbb;
+						//////////////////////////////////////////////////////////////////////////
+
+
+					}
+				}
+			}
+		}
+
+	}
+}
+//////////////////////////////////////////////////////////////////////////
+double ThixotropyLBMKernel::getCalculationTime()
+{
+	//return timer.getDuration();
+	return timer.getTotalTime();
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyLBMKernel::setCollisionFactorF(double collFactor)
+{
+	setCollisionFactor(collFactor);
+	this->collFactorF = collFactor;
+
+}
+//////////////////////////////////////////////////////////////////////////
+void ThixotropyLBMKernel::setCollisionFactorH(double collFactor)
+{
+	this->collFactorH = collFactor;
+}
+//////////////////////////////////////////////////////////////////////////
+double ThixotropyLBMKernel::getCollisionFactorF() const
+{
+	return this->collFactorF;
+}
+//////////////////////////////////////////////////////////////////////////
+double ThixotropyLBMKernel::getCollisionFactorH() const
+{
+	return this->collFactorH;
+}
+void ThixotropyLBMKernel::setAlpha(double alpha)
+{
+	this->alpha = alpha;
+}
+double ThixotropyLBMKernel::getAlpha() const
+{
+	return this->alpha;
+}
+void ThixotropyLBMKernel::setTheta(double theta)
+{
+	this->theta = theta;
+}
+double ThixotropyLBMKernel::getTheta() const
+{
+	return this->theta;
+}
+void ThixotropyLBMKernel::swapDistributions()
+{
+	LBMKernel::swapDistributions();
+	dataSet->getHdistributions()->swap();
+}
+//////////////////////////////////////////////////////////////////////////
diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.h
new file mode 100644
index 000000000..c74af1b1e
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.h
@@ -0,0 +1,72 @@
+#ifndef ThixotropyLBMKernel_H
+#define ThixotropyLBMKernel_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"
+
+class ThixotropyLBMKernel;
+
+//! \brief    Cumulant + Fact. Central LBM kernel. 
+//! \author Hussein
+class ThixotropyLBMKernel : public LBMKernel
+{
+public:
+	//! This option set relaxation parameter: NORMAL  
+	enum Parameter { NORMAL, MAGIC };
+public:
+	ThixotropyLBMKernel();
+	virtual ~ThixotropyLBMKernel(void);
+	virtual void calculate(int step);
+	virtual SPtr<LBMKernel> clone();
+	double getCalculationTime();
+ 
+	void setCollisionFactorF(double collFactor);
+   void setCollisionFactorH(double collFactor);
+   double getCollisionFactorF() const;
+   double getCollisionFactorH() const;
+
+	void setAlpha(double alpha);
+	double getAlpha() const;
+
+	void setTheta(double theta);
+	double getTheta() const;
+
+	void swapDistributions();
+
+protected:
+	virtual void initDataSet();
+	LBMReal f[D3Q27System::ENDF + 1];
+
+	UbTimer timer;
+
+	LBMReal OxyyMxzz;
+	Parameter parameter;
+
+	CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF;
+	CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF;
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsF;
+
+	CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH;
+	CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH;
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsH;
+
+	mu::value_type muX1, muX2, muX3;
+	mu::value_type muDeltaT;
+	mu::value_type muNu;
+	LBMReal forcingX1;
+	LBMReal forcingX2;
+	LBMReal forcingX3;
+
+	LBMReal collFactorF;
+   LBMReal collFactorH;
+
+	LBMReal theta;
+	LBMReal alpha;
+};
+
+#endif
+
diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.cpp
new file mode 100644
index 000000000..8d512f6e3
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.cpp
@@ -0,0 +1,895 @@
+#include "ThixotropyModelLBMKernel.h"
+#include "D3Q27System.h"
+#include "BCArray3D.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include <math.h>
+#include "DataSet3D.h"
+#include "LBMKernel.h"
+
+#define PROOF_CORRECTNESS
+
+ThixotropyModelLBMKernel::ThixotropyModelLBMKernel() : forcingX1(0), forcingX2(0), forcingX3(0)
+{
+   compressible = false;
+	OxyyMxzz = 1.0;
+}
+
+ThixotropyModelLBMKernel::~ThixotropyModelLBMKernel()
+{
+}
+
+void ThixotropyModelLBMKernel::calculate(int step)
+{
+	using namespace D3Q27System;
+
+	//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);
+	}
+	/////////////////////////////////////
+
+	localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions();
+	nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions();
+	zeroDistributionsF = dynamicPointerCast<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;
+
+
+	{
+		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 distribution
+						// Cumulant (NSE part) 
+						////////////////////////////////////////////////////////////////////////////
+						//////////////////////////////////////////////////////////////////////////
+
+						//E   N  T
+						//c   c  c
+						//////////
+						//W   S  B
+						//a   a  a
+
+						//Rest ist b
+
+						//mfxyz
+						//a - negative
+						//b - null
+						//c - positive
+
+						// a b c
+						//-1 0 1
+
+						LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3);
+						LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3);
+						LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3);
+						LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3);
+						LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3);
+						LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3);
+						LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3);
+						LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3);
+						LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3);
+						LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3);
+						LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3);
+						LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3);
+						LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3);
+
+						LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3);
+						LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3);
+						LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p);
+						LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3);
+						LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3);
+						LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p);
+						LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p);
+						LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p);
+						LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p);
+						LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p);
+						LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p);
+						LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p);
+						LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p);
+
+						LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3);
+
+						LBMReal m0, m1, m2;
+
+						LBMReal rho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+							+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+							+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+
+						LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+							(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+							(mfcbb - mfabb));
+						LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+							(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+							(mfbcb - mfbab));
+						LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+							(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+							(mfbbc - mfbba));
+
+						LBMReal collFactorF = collFactor;
+
+						//forcing 
+						///////////////////////////////////////////////////////////////////////////////////////////
+						if (withForcing)
+						{
+							muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1);
+							muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2);
+							muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3);
+
+							forcingX1 = muForcingX1.Eval();
+							forcingX2 = muForcingX2.Eval();
+							forcingX3 = muForcingX3.Eval();
+
+							vvx += forcingX1 * deltaT * 0.5; // X
+							vvy += forcingX2 * deltaT * 0.5; // Y
+							vvz += forcingX3 * deltaT * 0.5; // Z
+						}
+						///////////////////////////////////////////////////////////////////////////////////////////               
+						LBMReal oMdrho;
+
+						oMdrho = mfccc + mfaaa;
+						m0 = mfaca + mfcac;
+						m1 = mfacc + mfcaa;
+						m2 = mfaac + mfcca;
+						oMdrho += m0;
+						m1 += m2;
+						oMdrho += m1;
+						m0 = mfbac + mfbca;
+						m1 = mfbaa + mfbcc;
+						m0 += m1;
+						m1 = mfabc + mfcba;
+						m2 = mfaba + mfcbc;
+						m1 += m2;
+						m0 += m1;
+						m1 = mfacb + mfcab;
+						m2 = mfaab + mfccb;
+						m1 += m2;
+						m0 += m1;
+						oMdrho += m0;
+						m0 = mfabb + mfcbb;
+						m1 = mfbab + mfbcb;
+						m2 = mfbba + mfbbc;
+						m0 += m1 + m2;
+						m0 += mfbbb; //hat gefehlt
+						oMdrho = 1. - (oMdrho + m0);
+
+						LBMReal vx2;
+						LBMReal vy2;
+						LBMReal vz2;
+						vx2 = vvx * vvx;
+						vy2 = vvy * vvy;
+						vz2 = vvz * vvz;
+						////////////////////////////////////////////////////////////////////////////////////
+						LBMReal wadjust;
+						LBMReal qudricLimit = 0.01;
+						////////////////////////////////////////////////////////////////////////////////////
+						//Hin
+						////////////////////////////////////////////////////////////////////////////////////
+						// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						m2 = mfaaa + mfaac;
+						m1 = mfaac - mfaaa;
+						m0 = m2 + mfaab;
+						mfaaa = m0;
+						m0 += c1o36 * oMdrho;
+						mfaab = m1 - m0 * vvz;
+						mfaac = m2 - 2. * m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaba + mfabc;
+						m1 = mfabc - mfaba;
+						m0 = m2 + mfabb;
+						mfaba = m0;
+						m0 += c1o9 * oMdrho;
+						mfabb = m1 - m0 * vvz;
+						mfabc = m2 - 2. * m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaca + mfacc;
+						m1 = mfacc - mfaca;
+						m0 = m2 + mfacb;
+						mfaca = m0;
+						m0 += c1o36 * oMdrho;
+						mfacb = m1 - m0 * vvz;
+						mfacc = m2 - 2. * m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbaa + mfbac;
+						m1 = mfbac - mfbaa;
+						m0 = m2 + mfbab;
+						mfbaa = m0;
+						m0 += c1o9 * oMdrho;
+						mfbab = m1 - m0 * vvz;
+						mfbac = m2 - 2. * m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbba + mfbbc;
+						m1 = mfbbc - mfbba;
+						m0 = m2 + mfbbb;
+						mfbba = m0;
+						m0 += c4o9 * oMdrho;
+						mfbbb = m1 - m0 * vvz;
+						mfbbc = m2 - 2. * m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbca + mfbcc;
+						m1 = mfbcc - mfbca;
+						m0 = m2 + mfbcb;
+						mfbca = m0;
+						m0 += c1o9 * oMdrho;
+						mfbcb = m1 - m0 * vvz;
+						mfbcc = m2 - 2. * m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcaa + mfcac;
+						m1 = mfcac - mfcaa;
+						m0 = m2 + mfcab;
+						mfcaa = m0;
+						m0 += c1o36 * oMdrho;
+						mfcab = m1 - m0 * vvz;
+						mfcac = m2 - 2. * m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcba + mfcbc;
+						m1 = mfcbc - mfcba;
+						m0 = m2 + mfcbb;
+						mfcba = m0;
+						m0 += c1o9 * oMdrho;
+						mfcbb = m1 - m0 * vvz;
+						mfcbc = m2 - 2. * m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcca + mfccc;
+						m1 = mfccc - mfcca;
+						m0 = m2 + mfccb;
+						mfcca = m0;
+						m0 += c1o36 * oMdrho;
+						mfccb = m1 - m0 * vvz;
+						mfccc = m2 - 2. * m1 * vvz + vz2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						m2 = mfaaa + mfaca;
+						m1 = mfaca - mfaaa;
+						m0 = m2 + mfaba;
+						mfaaa = m0;
+						m0 += c1o6 * oMdrho;
+						mfaba = m1 - m0 * vvy;
+						mfaca = m2 - 2. * m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaab + mfacb;
+						m1 = mfacb - mfaab;
+						m0 = m2 + mfabb;
+						mfaab = m0;
+						mfabb = m1 - m0 * vvy;
+						mfacb = m2 - 2. * m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaac + mfacc;
+						m1 = mfacc - mfaac;
+						m0 = m2 + mfabc;
+						mfaac = m0;
+						m0 += c1o18 * oMdrho;
+						mfabc = m1 - m0 * vvy;
+						mfacc = m2 - 2. * m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbaa + mfbca;
+						m1 = mfbca - mfbaa;
+						m0 = m2 + mfbba;
+						mfbaa = m0;
+						m0 += c2o3 * oMdrho;
+						mfbba = m1 - m0 * vvy;
+						mfbca = m2 - 2. * m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbab + mfbcb;
+						m1 = mfbcb - mfbab;
+						m0 = m2 + mfbbb;
+						mfbab = m0;
+						mfbbb = m1 - m0 * vvy;
+						mfbcb = m2 - 2. * m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfbac + mfbcc;
+						m1 = mfbcc - mfbac;
+						m0 = m2 + mfbbc;
+						mfbac = m0;
+						m0 += c2o9 * oMdrho;
+						mfbbc = m1 - m0 * vvy;
+						mfbcc = m2 - 2. * m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcaa + mfcca;
+						m1 = mfcca - mfcaa;
+						m0 = m2 + mfcba;
+						mfcaa = m0;
+						m0 += c1o6 * oMdrho;
+						mfcba = m1 - m0 * vvy;
+						mfcca = m2 - 2. * m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcab + mfccb;
+						m1 = mfccb - mfcab;
+						m0 = m2 + mfcbb;
+						mfcab = m0;
+						mfcbb = m1 - m0 * vvy;
+						mfccb = m2 - 2. * m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfcac + mfccc;
+						m1 = mfccc - mfcac;
+						m0 = m2 + mfcbc;
+						mfcac = m0;
+						m0 += c1o18 * oMdrho;
+						mfcbc = m1 - m0 * vvy;
+						mfccc = m2 - 2. * m1 * vvy + vy2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9            Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						m2 = mfaaa + mfcaa;
+						m1 = mfcaa - mfaaa;
+						m0 = m2 + mfbaa;
+						mfaaa = m0;
+						m0 += 1. * oMdrho;
+						mfbaa = m1 - m0 * vvx;
+						mfcaa = m2 - 2. * m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaba + mfcba;
+						m1 = mfcba - mfaba;
+						m0 = m2 + mfbba;
+						mfaba = m0;
+						mfbba = m1 - m0 * vvx;
+						mfcba = m2 - 2. * m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaca + mfcca;
+						m1 = mfcca - mfaca;
+						m0 = m2 + mfbca;
+						mfaca = m0;
+						m0 += c1o3 * oMdrho;
+						mfbca = m1 - m0 * vvx;
+						mfcca = m2 - 2. * m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaab + mfcab;
+						m1 = mfcab - mfaab;
+						m0 = m2 + mfbab;
+						mfaab = m0;
+						mfbab = m1 - m0 * vvx;
+						mfcab = m2 - 2. * m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfabb + mfcbb;
+						m1 = mfcbb - mfabb;
+						m0 = m2 + mfbbb;
+						mfabb = m0;
+						mfbbb = m1 - m0 * vvx;
+						mfcbb = m2 - 2. * m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfacb + mfccb;
+						m1 = mfccb - mfacb;
+						m0 = m2 + mfbcb;
+						mfacb = m0;
+						mfbcb = m1 - m0 * vvx;
+						mfccb = m2 - 2. * m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfaac + mfcac;
+						m1 = mfcac - mfaac;
+						m0 = m2 + mfbac;
+						mfaac = m0;
+						m0 += c1o3 * oMdrho;
+						mfbac = m1 - m0 * vvx;
+						mfcac = m2 - 2. * m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfabc + mfcbc;
+						m1 = mfcbc - mfabc;
+						m0 = m2 + mfbbc;
+						mfabc = m0;
+						mfbbc = m1 - m0 * vvx;
+						mfcbc = m2 - 2. * m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						m2 = mfacc + mfccc;
+						m1 = mfccc - mfacc;
+						m0 = m2 + mfbcc;
+						mfacc = m0;
+						m0 += c1o9 * oMdrho;
+						mfbcc = m1 - m0 * vvx;
+						mfccc = m2 - 2. * m1 * vvx + vx2 * m0;
+						////////////////////////////////////////////////////////////////////////////////////
+						// Cumulants
+						////////////////////////////////////////////////////////////////////////////////////
+						LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity
+						LBMReal OxyyPxzz = 1.;//-s9;//2+s9;//
+											  //LBMReal OxyyMxzz  = 1.;//2+s9;//
+						LBMReal O4 = 1.;
+						LBMReal O5 = 1.;
+						LBMReal O6 = 1.;
+
+						//Cum 4.
+						//LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+						//LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+						//LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+						LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+						LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+						LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+						LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+						LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+						LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho);
+
+						//Cum 5.
+						LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho;
+						LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho;
+						LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho;
+
+						//Cum 6.
+						LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb
+							- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+							- 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+							- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+							+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+								+ 2. * (mfcaa * mfaca * mfaac)
+								+ 16. * mfbba * mfbab * mfabb)
+							- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+							- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+							+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+								+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho;
+
+						//2.
+						// linear combinations
+						LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac;
+						LBMReal mxxMyy = mfcaa - mfaca;
+						LBMReal mxxMzz = mfcaa - mfaac;
+
+						LBMReal dxux = -c1o2 * collFactorF * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz);
+						LBMReal dyuy = dxux + collFactorF * c3o2 * mxxMyy;
+						LBMReal dzuz = dxux + collFactorF * c3o2 * mxxMzz;
+
+						LBMReal Dxy = -three * collFactorF * mfbba;
+						LBMReal Dxz = -three * collFactorF * mfbab;
+						LBMReal Dyz = -three * collFactorF * mfabb;
+						////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+						//non Newtonian fluid collision factor
+						LBMReal shearRate = sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one);
+						collFactorF = getThyxotropyCollFactor(collFactorF, shearRate, rho);
+						////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+						//relax
+						mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);
+						mxxMyy += collFactorF * (-mxxMyy) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vy2 * dyuy);
+						mxxMzz += collFactorF * (-mxxMzz) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vz2 * dzuz);
+
+						mfabb += collFactorF * (-mfabb);
+						mfbab += collFactorF * (-mfbab);
+						mfbba += collFactorF * (-mfbba);
+
+						// linear combinations back
+						mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+						mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz);
+						mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz);
+
+						//3.
+						// linear combinations
+						LBMReal mxxyPyzz = mfcba + mfabc;
+						LBMReal mxxyMyzz = mfcba - mfabc;
+
+						LBMReal mxxzPyyz = mfcab + mfacb;
+						LBMReal mxxzMyyz = mfcab - mfacb;
+
+						LBMReal mxyyPxzz = mfbca + mfbac;
+						LBMReal mxyyMxzz = mfbca - mfbac;
+
+						//relax
+						wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit);
+						mfbbb += wadjust * (-mfbbb);
+						wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit);
+						mxxyPyzz += wadjust * (-mxxyPyzz);
+						wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit);
+						mxxyMyzz += wadjust * (-mxxyMyzz);
+						wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit);
+						mxxzPyyz += wadjust * (-mxxzPyyz);
+						wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit);
+						mxxzMyyz += wadjust * (-mxxzMyyz);
+						wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit);
+						mxyyPxzz += wadjust * (-mxyyPxzz);
+						wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit);
+						mxyyMxzz += wadjust * (-mxyyMxzz);
+
+						// linear combinations back
+						mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+						mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+						mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+						mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+						mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+						mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+
+						//4.
+						CUMacc += O4 * (-CUMacc);
+						CUMcac += O4 * (-CUMcac);
+						CUMcca += O4 * (-CUMcca);
+
+						CUMbbc += O4 * (-CUMbbc);
+						CUMbcb += O4 * (-CUMbcb);
+						CUMcbb += O4 * (-CUMcbb);
+
+						//5.
+						CUMbcc += O5 * (-CUMbcc);
+						CUMcbc += O5 * (-CUMcbc);
+						CUMccb += O5 * (-CUMccb);
+
+						//6.
+						CUMccc += O6 * (-CUMccc);
+
+						//back cumulants to central moments
+						//4.
+						//mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015
+						//mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015
+						//mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015
+
+						mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab);
+						mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb);
+						mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb);
+
+						mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho;
+						mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho;
+						mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho;
+
+						//5.
+						mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho;
+						mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho;
+						mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho;
+
+						//6.
+						mfccc = CUMccc - ((-4. * mfbbb * mfbbb
+							- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+							- 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc)
+							- 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb))
+							+ (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+								+ 2. * (mfcaa * mfaca * mfaac)
+								+ 16. * mfbba * mfbab * mfabb)
+							- c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho
+							- c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho)
+							+ (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+								+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho;
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//forcing
+						mfbaa = -mfbaa;
+						mfaba = -mfaba;
+						mfaab = -mfaab;
+						//////////////////////////////////////////////////////////////////////////////////////
+
+						////////////////////////////////////////////////////////////////////////////////////
+						//back
+						////////////////////////////////////////////////////////////////////////////////////
+						//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Z - Dir
+						m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2;
+						m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2;
+						mfaaa = m0;
+						mfaab = m1;
+						mfaac = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+						m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2);
+						m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+						mfaba = m0;
+						mfabb = m1;
+						mfabc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2;
+						m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+						mfaca = m0;
+						mfacb = m1;
+						mfacc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+						m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2);
+						m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+						mfbaa = m0;
+						mfbab = m1;
+						mfbac = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+						m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2);
+						m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+						mfbba = m0;
+						mfbbb = m1;
+						mfbbc = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+						m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2);
+						m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+						mfbca = m0;
+						mfbcb = m1;
+						mfbcc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2;
+						m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+						mfcaa = m0;
+						mfcab = m1;
+						mfcac = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+						m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2);
+						m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+						mfcba = m0;
+						mfcbb = m1;
+						mfcbc = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+						m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2;
+						m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+						mfcca = m0;
+						mfccb = m1;
+						mfccc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						//mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// Y - Dir
+						m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2;
+						m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfaaa = m0;
+						mfaba = m1;
+						mfaca = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2;
+						m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfaab = m0;
+						mfabb = m1;
+						mfacb = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2;
+						m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfaac = m0;
+						mfabc = m1;
+						mfacc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+						m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2);
+						m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+						mfbaa = m0;
+						mfbba = m1;
+						mfbca = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+						m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2);
+						m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+						mfbab = m0;
+						mfbbb = m1;
+						mfbcb = m2;
+						/////////b//////////////////////////////////////////////////////////////////////////
+						m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+						m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2);
+						m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+						mfbac = m0;
+						mfbbc = m1;
+						mfbcc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2;
+						m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfcaa = m0;
+						mfcba = m1;
+						mfcca = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2;
+						m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfcab = m0;
+						mfcbb = m1;
+						mfccb = m2;
+						/////////c//////////////////////////////////////////////////////////////////////////
+						m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+						m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2;
+						m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+						mfcac = m0;
+						mfcbc = m1;
+						mfccc = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						//mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+						////////////////////////////////////////////////////////////////////////////////////
+						// X - Dir
+						m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaaa = m0;
+						mfbaa = m1;
+						mfcaa = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaba = m0;
+						mfbba = m1;
+						mfcba = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaca = m0;
+						mfbca = m1;
+						mfcca = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaab = m0;
+						mfbab = m1;
+						mfcab = m2;
+						///////////b////////////////////////////////////////////////////////////////////////
+						m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2;
+						m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfabb = m0;
+						mfbbb = m1;
+						mfcbb = m2;
+						///////////b////////////////////////////////////////////////////////////////////////
+						m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfacb = m0;
+						mfbcb = m1;
+						mfccb = m2;
+						////////////////////////////////////////////////////////////////////////////////////
+						////////////////////////////////////////////////////////////////////////////////////
+						m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfaac = m0;
+						mfbac = m1;
+						mfcac = m2;
+						///////////c////////////////////////////////////////////////////////////////////////
+						m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2;
+						m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfabc = m0;
+						mfbbc = m1;
+						mfcbc = m2;
+						///////////c////////////////////////////////////////////////////////////////////////
+						m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+						m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2;
+						m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+						mfacc = m0;
+						mfbcc = m1;
+						mfccc = m2;
+
+						//////////////////////////////////////////////////////////////////////////
+						//proof correctness
+						//////////////////////////////////////////////////////////////////////////
+#ifdef  PROOF_CORRECTNESS
+						LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca)
+							+ (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc)
+							+ (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb;
+						//LBMReal dif = fabs(rho - rho_post);
+						LBMReal dif = rho - rho_post;
+#ifdef SINGLEPRECISION
+						if (dif > 10.0E-7 || dif < -10.0E-7)
+#else
+						if (dif > 10.0E-15 || dif < -10.0E-15)
+#endif					
+						{
+							UB_THROW(UbException(UB_EXARGS, "rho=" + UbSystem::toString(rho) + ", rho_post=" + UbSystem::toString(rho_post)
+								+ " dif=" + UbSystem::toString(dif)
+								+ " rho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3)));
+							//UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): rho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3));
+							//exit(EXIT_FAILURE);
+						}
+#endif
+						//////////////////////////////////////////////////////////////////////////
+						//write distribution
+						//////////////////////////////////////////////////////////////////////////
+						(*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb;
+						(*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab;
+						(*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba;
+						(*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab;
+						(*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab;
+						(*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba;
+						(*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba;
+						(*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa;
+						(*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca;
+						(*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa;
+						(*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa;
+						(*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca;
+						(*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca;
+
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac;
+						(*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac;
+
+						(*this->zeroDistributionsF)(x1, x2, x3) = mfbbb;
+					}
+				}
+			}
+		}
+
+	}
+}
+
+//SPtr<LBMKernel> ThixotropyModelLBMKernel::clone()
+//{
+//	SPtr<LBMKernel> kernel(new ThixotropyModelLBMKernel());
+//	kernel->setNX(nx);
+//	kernel->setCollisionFactor(collFactor);
+//	collFactorF = collFactor;
+//	dynamicPointerCast<ThixotropyModelLBMKernel>(kernel)->initDataSet();
+//	kernel->setBCProcessor(bcProcessor->clone(kernel));
+//	kernel->setWithForcing(withForcing);
+//	kernel->setForcingX1(muForcingX1);
+//	kernel->setForcingX2(muForcingX2);
+//	kernel->setForcingX3(muForcingX3);
+//	kernel->setIndex(ix1, ix2, ix3);
+//	kernel->setDeltaT(deltaT);
+//
+//	return kernel;
+//}
+
+double ThixotropyModelLBMKernel::getCalculationTime()
+{
+   return timer.getTotalTime();
+}
+
+void ThixotropyModelLBMKernel::swapDistributions()
+{
+   LBMKernel::swapDistributions();
+}
+
+void ThixotropyModelLBMKernel::initDataSet()
+{
+   SPtr<DistributionArray3D> df(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.0));
+   dataSet->setFdistributions(df);
+}
diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.h
new file mode 100644
index 000000000..d3210a084
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.h
@@ -0,0 +1,51 @@
+#ifndef ThixotropyModelLBMKernel_H
+#define ThixotropyModelLBMKernel_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"
+
+class ThixotropyModelLBMKernel;
+
+//! \brief abstract class for Template Method use Cumulant LBM. 
+//! \author K. Kutscher, M. Geier
+class ThixotropyModelLBMKernel : public LBMKernel
+{
+public:
+	ThixotropyModelLBMKernel();
+	virtual ~ThixotropyModelLBMKernel();
+	void calculate(int step);
+	virtual SPtr<LBMKernel> clone() { UB_THROW(UbException("SPtr<LBMKernel> clone() - belongs in the derived class")); };
+	double getCalculationTime();
+
+	void swapDistributions();
+
+protected:
+	void initDataSet();
+
+	virtual LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const { UB_THROW(UbException("LBMReal getThyxotropyCollFactor() - belongs in the derived class")); }
+
+	LBMReal f[D3Q27System::ENDF + 1];
+
+	UbTimer timer;
+
+	LBMReal OxyyMxzz;
+	
+	CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF;
+	CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF;
+	CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr   zeroDistributionsF;
+
+	mu::value_type muX1, muX2, muX3;
+	mu::value_type muDeltaT;
+	mu::value_type muNu;
+	LBMReal forcingX1;
+	LBMReal forcingX2;
+	LBMReal forcingX3;
+
+	bool test;
+};
+
+#endif
diff --git a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
index 49d945ceb..5b61b8565 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp
@@ -39,8 +39,20 @@
 #include "D3Q27EsoTwist3DSplittedVector.h"
 #include "DataSet3D.h"
 #include "Grid3D.h"
-#include "Grid3DSystem.h"
-#include "LBMKernel.h"
+#include "BCAdapter.h"
+#include "Block3D.h"
+#include "BCArray3D.h"
+
+#include "DensityAndThixotropyBCAlgorithm.h"
+#include "VelocityAndThixotropyBCAlgorithm.h"
+#include "NoSlipAndThixotropyBCAlgorithm.h"
+#include "NonReflectingOutflowAndThixotropyBCAlgorithm.h"
+#include "VelocityWithDensityAndThixotropyBCAlgorithm.h"
+
+
+BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() :
+Block3DVisitor(0, Grid3DSystem::MAXLEVEL)
+{
 
 BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) {}
 //////////////////////////////////////////////////////////////////////////
@@ -86,19 +98,48 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc
                             char alg              = bcPtr->getBcAlgorithmType();
                             SPtr<BCAlgorithm> bca = bcMap[alg];
 
-                            if (bca) {
-                                bca = bca->clone();
-                                bca->setNodeIndex(x1, x2, x3);
-                                bca->setBcPointer(bcPtr);
-                                bca->addDistributions(distributions);
-                                bca->setCollFactor(collFactor);
-                                bca->setCompressible(compressible);
-                                bca->setBcArray(bcArray);
-                                bcProcessor->addBC(bca);
-                            }
-                        }
-                    }
-                }
+      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))
+               {
+                  if ((bcPtr = bcArray->getBC(x1, x2, x3)) != NULL)
+                  {
+                     char alg = bcPtr->getBcAlgorithmType();
+                     SPtr<BCAlgorithm> bca = bcMap[alg];
+                     
+                     if (bca)
+                     {
+                        bca = bca->clone();
+                        bca->setNodeIndex(x1, x2, x3);
+                        bca->setBcPointer(bcPtr);
+                        bca->addDistributions(distributions);
+                        //if (bca->getThixotropy())
+                        //{
+                        //   std::static_pointer_cast<DensityAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions());
+                        //   std::static_pointer_cast<DensityAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions());
+                        //}
+                        if(alg == BCAlgorithm::VelocityAndThixotropyBCAlgorithm)
+                           std::static_pointer_cast<VelocityAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions());
+                        if (alg == BCAlgorithm::DensityAndThixotropyBCAlgorithm)
+                           std::static_pointer_cast<DensityAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions());
+                        if (alg == BCAlgorithm::NoSlipAndThixotropyBCAlgorithm)
+                           std::static_pointer_cast<NoSlipAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions());
+                        if (alg == BCAlgorithm::NonReflectingOutflowAndThixotropyBCAlgorithm)
+                           std::static_pointer_cast<NonReflectingOutflowAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions());
+                        if (alg == BCAlgorithm::VelocityWithDensityAndThixotropyBCAlgorithm)
+                           std::static_pointer_cast<VelocityWithDensityAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions());
+
+                        bca->setCollFactor(collFactor);
+                        bca->setCompressible(compressible);
+                        bca->setBcArray(bcArray);
+                        bcProcessor->addBC(bca);
+                     }
+                  }
+               }
             }
         }
     }
diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp
index c424a6376..c17d8f659 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp
@@ -123,195 +123,180 @@ void InitDistributionsBlockVisitor::setRho(LBMReal rho)
 //////////////////////////////////////////////////////////////////////////
 void InitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<Block3D> block)
 {
-    using namespace D3Q27System;
-
-    if (!block)
-        UB_THROW(UbException(UB_EXARGS, "block is not exist"));
-
-    // UbTupleDouble3 blockLengths = grid->getBlockLengths(block);
-    // UbTupleDouble3 nodeOffset   = grid->getNodeOffset(block);
-    double dx = grid->getDeltaX(block);
-
-    // define vars for functions
-    mu::value_type x1, x2, x3;
-    this->muVx1.DefineVar("x1", &x1);
-    this->muVx1.DefineVar("x2", &x2);
-    this->muVx1.DefineVar("x3", &x3);
-    this->muVx2.DefineVar("x1", &x1);
-    this->muVx2.DefineVar("x2", &x2);
-    this->muVx2.DefineVar("x3", &x3);
-    this->muVx3.DefineVar("x1", &x1);
-    this->muVx3.DefineVar("x2", &x2);
-    this->muVx3.DefineVar("x3", &x3);
-    this->muRho.DefineVar("x1", &x1);
-    this->muRho.DefineVar("x2", &x2);
-    this->muRho.DefineVar("x3", &x3);
-
-    using CalcFeqsFct = void (*)(LBMReal *const & /*feq[27]*/, const LBMReal & /*(d)rho*/, const LBMReal & /*vx1*/,
-                                 const LBMReal & /*vx2*/, const LBMReal & /*vx3*/);
-    CalcFeqsFct calcFeqsFct = NULL;
-
-    LBMReal vx1, vx2, vx3, rho;
-
-    int gridRank  = grid->getRank();
-    int blockRank = block->getRank();
-
-    if (blockRank == gridRank && block->isActive()) {
-        SPtr<ILBMKernel> kernel = block->getKernel();
-        if (!kernel)
-            throw UbException(UB_EXARGS, "The LBM kernel isn't exist in block: " + block->toString());
-
-        if (kernel->getCompressible())
-            calcFeqsFct = &D3Q27System::calcCompFeq;
-        else
-            calcFeqsFct = &D3Q27System::calcIncompFeq;
-
-        // UbTupleDouble3 org = grid->getBlockWorldCoordinates(block);
-
-        SPtr<BCArray3D> bcArray                 = kernel->getBCProcessor()->getBCArray();
-        SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();
-
-        LBMReal o = kernel->getCollisionFactor();
-
-        LBMReal f[D3Q27System::ENDF + 1];
-
-        for (size_t ix3 = 0; ix3 < bcArray->getNX3(); ix3++)
-            for (size_t ix2 = 0; ix2 < bcArray->getNX2(); ix2++)
-                for (size_t ix1 = 0; ix1 < bcArray->getNX1(); ix1++) {
-                    Vector3D coords = grid->getNodeCoordinates(block, ix1, ix2, ix3);
-                    x1              = coords[0];
-                    x2              = coords[1];
-                    x3              = coords[2];
-
-                    vx1 = muVx1.Eval();
-                    vx2 = muVx2.Eval();
-                    vx3 = muVx3.Eval();
-                    rho = muRho.Eval();
-
-                    // x-derivative
-                    double deltaX    = dx * 0.5;
-                    x1               = coords[0] + deltaX;
-                    double vx1Plusx1 = muVx1.Eval();
-                    double vx2Plusx1 = muVx2.Eval();
-                    double vx3Plusx1 = muVx3.Eval();
-
-                    x1                = coords[0] - deltaX;
-                    double vx1Minusx1 = muVx1.Eval();
-                    double vx2Minusx1 = muVx2.Eval();
-                    double vx3Minusx1 = muVx3.Eval();
-
-                    // y-derivative
-                    x1               = coords[0];
-                    x2               = coords[1] + deltaX;
-                    double vx1Plusx2 = muVx1.Eval();
-                    double vx2Plusx2 = muVx2.Eval();
-                    double vx3Plusx2 = muVx3.Eval();
-
-                    x2                = coords[1] - deltaX;
-                    double vx1Minusx2 = muVx1.Eval();
-                    double vx2Minusx2 = muVx2.Eval();
-                    double vx3Minusx2 = muVx3.Eval();
-
-                    // z-derivative
-                    x2               = coords[1];
-                    x3               = coords[2] + deltaX;
-                    double vx1Plusx3 = muVx1.Eval();
-                    double vx2Plusx3 = muVx2.Eval();
-                    double vx3Plusx3 = muVx3.Eval();
-
-                    x3                = coords[2] - deltaX;
-                    double vx1Minusx3 = muVx1.Eval();
-                    double vx2Minusx3 = muVx2.Eval();
-                    double vx3Minusx3 = muVx3.Eval();
-
-                    double ax = (vx1Plusx1 - vx1Minusx1) / (2.0 * deltaX) * dx;
-                    double bx = (vx2Plusx1 - vx2Minusx1) / (2.0 * deltaX) * dx;
-                    double cx = (vx3Plusx1 - vx3Minusx1) / (2.0 * deltaX) * dx;
-
-                    double ay = (vx1Plusx2 - vx1Minusx2) / (2.0 * deltaX) * dx;
-                    double by = (vx2Plusx2 - vx2Minusx2) / (2.0 * deltaX) * dx;
-                    double cy = (vx3Plusx2 - vx3Minusx2) / (2.0 * deltaX) * dx;
-
-                    double az      = (vx1Plusx3 - vx1Minusx3) / (2.0 * deltaX) * dx;
-                    double bz      = (vx2Plusx3 - vx2Minusx3) / (2.0 * deltaX) * dx;
-                    double cz      = (vx3Plusx3 - vx3Minusx3) / (2.0 * deltaX) * dx;
-                    double eps_new = 1.0;
-                    LBMReal op     = 1.;
-
-                    LBMReal feq[27];
-
-                    calcFeqsFct(feq, rho, vx1, vx2, vx3);
-
-                    double f_E =
-                        eps_new *
-                        ((5. * ax * o + 5. * by * o + 5. * cz * o - 8. * ax * op + 4. * by * op + 4. * cz * op) /
-                         (54. * o * op));
-                    double f_N = f_E + eps_new * ((2. * (ax - by)) / (9. * o));
-                    double f_T = f_E + eps_new * ((2. * (ax - cz)) / (9. * o));
-                    double f_NE =
-                        eps_new *
-                        (-(5. * cz * o + 3. * (ay + bx) * op - 2. * cz * op + ax * (5. * o + op) + by * (5. * o + op)) /
-                         (54. * o * op));
-                    double f_SE = f_NE + eps_new * ((ay + bx) / (9. * o));
-                    double f_TE =
-                        eps_new *
-                        (-(5. * cz * o + by * (5. * o - 2. * op) + 3. * (az + cx) * op + cz * op + ax * (5. * o + op)) /
-                         (54. * o * op));
-                    double f_BE   = f_TE + eps_new * ((az + cx) / (9. * o));
-                    double f_TN   = eps_new * (-(5. * ax * o + 5. * by * o + 5. * cz * o - 2. * ax * op + by * op +
-                                               3. * bz * op + 3. * cy * op + cz * op) /
-                                             (54. * o * op));
-                    double f_BN   = f_TN + eps_new * ((bz + cy) / (9. * o));
-                    double f_ZERO = eps_new * ((5. * (ax + by + cz)) / (9. * op));
-                    double f_TNE  = eps_new * (-(ay + az + bx + bz + cx + cy) / (72. * o));
-                    double f_TSW  = -eps_new * ((ay + bx) / (36. * o)) - f_TNE;
-                    double f_TSE  = -eps_new * ((az + cx) / (36. * o)) - f_TNE;
-                    double f_TNW  = -eps_new * ((bz + cy) / (36. * o)) - f_TNE;
-
-                    f[E]    = f_E + feq[E];
-                    f[W]    = f_E + feq[W];
-                    f[N]    = f_N + feq[N];
-                    f[S]    = f_N + feq[S];
-                    f[T]    = f_T + feq[T];
-                    f[B]    = f_T + feq[B];
-                    f[NE]   = f_NE + feq[NE];
-                    f[SW]   = f_NE + feq[SW];
-                    f[SE]   = f_SE + feq[SE];
-                    f[NW]   = f_SE + feq[NW];
-                    f[TE]   = f_TE + feq[TE];
-                    f[BW]   = f_TE + feq[BW];
-                    f[BE]   = f_BE + feq[BE];
-                    f[TW]   = f_BE + feq[TW];
-                    f[TN]   = f_TN + feq[TN];
-                    f[BS]   = f_TN + feq[BS];
-                    f[BN]   = f_BN + feq[BN];
-                    f[TS]   = f_BN + feq[TS];
-                    f[TNE]  = f_TNE + feq[TNE];
-                    f[TNW]  = f_TNW + feq[TNW];
-                    f[TSE]  = f_TSE + feq[TSE];
-                    f[TSW]  = f_TSW + feq[TSW];
-                    f[BNE]  = f_TSW + feq[BNE];
-                    f[BNW]  = f_TSE + feq[BNW];
-                    f[BSE]  = f_TNW + feq[BSE];
-                    f[BSW]  = f_TNE + feq[BSW];
-                    f[ZERO] = f_ZERO + feq[ZERO];
-
-                    // calcFeqsFct(f,rho,vx1,vx2,vx3);
-                    // distributions->setDistribution(f, ix1, ix2, ix3);
-                    distributions->setDistributionInv(f, ix1, ix2, ix3);
-
-                    // distributions->swap();
-                    // distributions->setDistribution(f, ix1, ix2, ix3);
-                    // distributions->setDistributionInv(f, ix1, ix2, ix3);
-                    // distributions->swap();
-                }
-    }
+   using namespace D3Q27System;
+
+   if(!block) UB_THROW( UbException(UB_EXARGS,"block is not exist") );
+
+   double dx = grid->getDeltaX(block);
+
+   //define vars for functions
+   mu::value_type x1,x2,x3;
+   this->muVx1.DefineVar("x1",&x1); this->muVx1.DefineVar("x2",&x2); this->muVx1.DefineVar("x3",&x3);
+   this->muVx2.DefineVar("x1",&x1); this->muVx2.DefineVar("x2",&x2); this->muVx2.DefineVar("x3",&x3);
+   this->muVx3.DefineVar("x1",&x1); this->muVx3.DefineVar("x2",&x2); this->muVx3.DefineVar("x3",&x3);
+   this->muRho.DefineVar("x1",&x1); this->muRho.DefineVar("x2",&x2); this->muRho.DefineVar("x3",&x3);
+
+   //Funktionszeiger
+   typedef void (*CalcFeqsFct)(LBMReal* const& /*feq[27]*/,const LBMReal& /*(d)rho*/,const LBMReal& /*vx1*/,const LBMReal& /*vx2*/,const LBMReal& /*vx3*/);
+   CalcFeqsFct   calcFeqsFct   = NULL;
+   
+   LBMReal vx1,vx2,vx3,rho;
+
+   int gridRank = grid->getRank();
+   int blockRank = block->getRank();
+
+   if (blockRank == gridRank && block->isActive())
+   {
+       SPtr<ILBMKernel> kernel = block->getKernel();
+      if (!kernel)
+         throw UbException(UB_EXARGS, "The LBM kernel isn't exist in block: "+block->toString());
+
+      if(kernel->getCompressible()) 
+         calcFeqsFct   = &D3Q27System::calcCompFeq; 
+      else                                                        
+         calcFeqsFct   = &D3Q27System::calcIncompFeq; 
+
+      SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+      SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions();  
+
+      LBMReal o  = kernel->getCollisionFactor();
+
+      LBMReal f[D3Q27System::ENDF+1];
+
+      size_t nx1 = distributions->getNX1();
+      size_t nx2 = distributions->getNX2();
+      size_t nx3 = distributions->getNX3();
+
+      for(int ix3=0; ix3<bcArray->getNX3(); ix3++)
+         for(int ix2=0; ix2<bcArray->getNX2(); ix2++)
+            for(int ix1=0; ix1<bcArray->getNX1(); ix1++)
+            {
+               Vector3D coords = grid->getNodeCoordinates(block, ix1, ix2, ix3);
+               x1 = coords[0];
+               x2 = coords[1];
+               x3 = coords[2];
+
+               vx1 = muVx1.Eval();
+               vx2 = muVx2.Eval();
+               vx3 = muVx3.Eval();
+               rho = muRho.Eval();
+
+               //x-derivative
+               double deltaX=dx*0.5;
+               x1 = coords[0]+deltaX;
+               double vx1Plusx1 = muVx1.Eval();
+               double vx2Plusx1 = muVx2.Eval();
+               double vx3Plusx1 = muVx3.Eval();
+
+               x1 = coords[0]-deltaX;
+               double vx1Minusx1 = muVx1.Eval();
+               double vx2Minusx1 = muVx2.Eval();
+               double vx3Minusx1 = muVx3.Eval();
+
+               //y-derivative
+               x1 = coords[0];
+               x2 = coords[1]+deltaX;
+               double vx1Plusx2 = muVx1.Eval();
+               double vx2Plusx2 = muVx2.Eval();
+               double vx3Plusx2 = muVx3.Eval();
+
+               x2 = coords[1]-deltaX;
+               double vx1Minusx2 = muVx1.Eval();
+               double vx2Minusx2 = muVx2.Eval();
+               double vx3Minusx2 = muVx3.Eval();
+
+               //z-derivative
+               x2 = coords[1];
+               x3 = coords[2]+deltaX;
+               double vx1Plusx3 = muVx1.Eval();
+               double vx2Plusx3 = muVx2.Eval();
+               double vx3Plusx3 = muVx3.Eval();
+
+               x3 = coords[2]-deltaX;
+               double vx1Minusx3 = muVx1.Eval();
+               double vx2Minusx3 = muVx2.Eval();
+               double vx3Minusx3 = muVx3.Eval();
+
+               double ax=(vx1Plusx1-vx1Minusx1)/(2.0*deltaX)*dx;
+               double bx=(vx2Plusx1-vx2Minusx1)/(2.0*deltaX)*dx;
+               double cx=(vx3Plusx1-vx3Minusx1)/(2.0*deltaX)*dx;
+
+               double ay=(vx1Plusx2-vx1Minusx2)/(2.0*deltaX)*dx;
+               double by=(vx2Plusx2-vx2Minusx2)/(2.0*deltaX)*dx;
+               double cy=(vx3Plusx2-vx3Minusx2)/(2.0*deltaX)*dx;
+
+               double az=(vx1Plusx3-vx1Minusx3)/(2.0*deltaX)*dx;
+               double bz=(vx2Plusx3-vx2Minusx3)/(2.0*deltaX)*dx;
+               double cz=(vx3Plusx3-vx3Minusx3)/(2.0*deltaX)*dx;
+               double eps_new=1.0;
+               LBMReal op = 1.;
+
+               LBMReal feq[27];
+
+               calcFeqsFct(feq,rho,vx1,vx2,vx3);
+
+               double f_E    = eps_new *((5.*ax*o + 5.*by*o + 5.*cz*o - 8.*ax*op + 4.*by*op + 4.*cz*op)/(54.*o*op));
+               double f_N    = f_E + eps_new *((2.*(ax - by))/(9.*o));
+               double f_T    = f_E + eps_new *((2.*(ax - cz))/(9.*o));
+               double f_NE   = eps_new *(-(5.*cz*o + 3.*(ay + bx)*op - 2.*cz*op + ax*(5.*o + op) + by*(5.*o + op))/(54.*o*op));
+               double f_SE   = f_NE + eps_new *((  ay + bx )/(9.*o));
+               double f_TE   = eps_new *(-(5.*cz*o + by*(5.*o - 2.*op) + 3.*(az + cx)*op + cz*op + ax*(5.*o + op))/(54.*o*op));
+               double f_BE   = f_TE + eps_new *((  az + cx )/(9.*o));
+               double f_TN   = eps_new *(-(5.*ax*o + 5.*by*o + 5.*cz*o - 2.*ax*op + by*op + 3.*bz*op + 3.*cy*op + cz*op)/(54.*o*op));
+               double f_BN   = f_TN + eps_new *((  bz + cy )/(9.*o));
+               double f_ZERO = eps_new *((5.*(ax + by + cz))/(9.*op));
+               double f_TNE  = eps_new *(-(ay + az + bx + bz + cx + cy)/(72.*o));
+               double f_TSW  = - eps_new *((ay + bx)/(36.*o)) - f_TNE;
+               double f_TSE  = - eps_new *((az + cx)/(36.*o)) - f_TNE;
+               double f_TNW  = - eps_new *((bz + cy)/(36.*o)) - f_TNE;
+
+
+               f[E]    = f_E    + feq[E];
+               f[W]    = f_E    + feq[W];
+               f[N]    = f_N    + feq[N];
+               f[S]    = f_N    + feq[S];
+               f[T]    = f_T    + feq[T];
+               f[B]    = f_T    + feq[B];
+               f[NE]   = f_NE   + feq[NE];
+               f[SW]   = f_NE   + feq[SW];
+               f[SE]   = f_SE   + feq[SE];
+               f[NW]   = f_SE   + feq[NW];
+               f[TE]   = f_TE   + feq[TE];
+               f[BW]   = f_TE   + feq[BW];
+               f[BE]   = f_BE   + feq[BE];
+               f[TW]   = f_BE   + feq[TW];
+               f[TN]   = f_TN   + feq[TN];
+               f[BS]   = f_TN   + feq[BS];
+               f[BN]   = f_BN   + feq[BN];
+               f[TS]   = f_BN   + feq[TS];
+               f[TNE]  = f_TNE  + feq[TNE];
+               f[TNW]  = f_TNW  + feq[TNW];
+               f[TSE]  = f_TSE  + feq[TSE];
+               f[TSW]  = f_TSW  + feq[TSW];
+               f[BNE]  = f_TSW  + feq[BNE];
+               f[BNW]  = f_TSE  + feq[BNW];
+               f[BSE]  = f_TNW  + feq[BSE];
+               f[BSW]  = f_TNE  + feq[BSW];
+               f[ZERO] = f_ZERO + feq[ZERO];
+
+               //calcFeqsFct(f,rho,vx1,vx2,vx3);
+               distributions->setDistribution(f, ix1, ix2, ix3);
+               distributions->setDistributionInv(f, ix1, ix2, ix3);
+
+               //distributions->swap();
+               //distributions->setDistribution(f, ix1, ix2, ix3);
+               //distributions->setDistributionInv(f, ix1, ix2, ix3);
+               //distributions->swap();
+
+            }
+   }
+
+   //variablen der functions loeschen, da die verwiesenen Objecte nach dem verlassen des scopes ungueltig sind!
+   this->muVx1.ClearVar();
+   this->muVx2.ClearVar();
+   this->muVx3.ClearVar();
+   this->muRho.ClearVar();
 
-    // variablen der functions loeschen, da die verwiesenen Objecte nach dem verlassen des scopes ungueltig sind!
-    this->muVx1.ClearVar();
-    this->muVx2.ClearVar();
-    this->muVx3.ClearVar();
-    this->muRho.ClearVar();
 }
 //////////////////////////////////////////////////////////////////////////
 void InitDistributionsBlockVisitor::checkFunction(mu::Parser fct)
diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp
new file mode 100644
index 000000000..70d7874f2
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp
@@ -0,0 +1,435 @@
+#include "InitThixotropyBlockVisitor.h"
+#include "LBMKernel.h"
+#include "BCProcessor.h"
+#include "Grid3DSystem.h"
+#include "DataSet3D.h"
+#include "EsoTwist3D.h"
+#include "Grid3D.h"
+#include "Block3D.h"
+#include "BCArray3D.h"
+
+InitThixotropyBlockVisitor::InitThixotropyBlockVisitor()
+   : Block3DVisitor(0, Grid3DSystem::MAXLEVEL)
+{
+   //this->setVx1(0.0);
+   //this->setVx2(0.0);
+   //this->setVx3(0.0);
+   //this->setRho(0.0);
+   //this->setf1(0.0);
+   //this->setf2(0.0);
+   //this->setf3(0.0);
+   //this->setConcentration(0.0);
+   this->setLambda(0.0);
+}
+//////////////////////////////////////////////////////////////////////////
+//InitThixotropyBlockVisitor::InitThixotropyBlockVisitor(LBMReal lambda /*LBMReal nu, LBMReal D, LBMReal rho, LBMReal vx1, LBMReal vx2, LBMReal vx3, LBMReal c, LBMReal f1, LBMReal f2, LBMReal f3*/)
+//	: Block3DVisitor(0, Grid3DSystem::MAXLEVEL)
+//{
+//	//this->setVx1(vx1);
+//	//this->setVx2(vx2);
+//	//this->setVx3(vx3);
+//	//this->setRho(rho);
+//	//this->setf1(vx1);
+//	//this->setf2(vx2);
+//	//this->setf3(vx3);
+//	//this->setConcentration(rho);
+//	//this->setNu(nu);
+//	//this->setD(D);
+//	this->setLambda(lambda);
+//}
+//////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setVx1(const mu::Parser& parser)
+//{
+//   this->checkFunction(parser);
+//   this->muVx1 = parser;
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setVx2(const mu::Parser& parser)
+//{
+//   this->checkFunction(parser);
+//   this->muVx2 = parser;
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setVx3(const mu::Parser& parser)
+//{
+//   this->checkFunction(parser);
+//   this->muVx3 = parser;
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setRho(const mu::Parser& parser)
+//{
+//	this->checkFunction(parser);
+//	this->muRho = parser;
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setf1(const mu::Parser& parser)
+//{
+//	this->checkFunction(parser);
+//	this->muf1 = parser;
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setf2(const mu::Parser& parser)
+//{
+//	this->checkFunction(parser);
+//	this->muf2 = parser;
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setf3(const mu::Parser& parser)
+//{
+//	this->checkFunction(parser);
+//	this->muf3 = parser;
+//}
+////////////////////////////////////////////////////////////////////////////
+void InitThixotropyBlockVisitor::setLambda(const mu::Parser& parser)
+{
+   this->checkFunction(parser);
+   this->muLambda = parser;
+}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setVx1(const std::string& muParserString)
+//{
+//	this->muVx1.SetExpr(muParserString);
+//	this->checkFunction(muVx1);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setVx2(const std::string& muParserString)
+//{
+//	this->muVx2.SetExpr(muParserString);
+//	this->checkFunction(muVx2);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setVx3(const std::string& muParserString)
+//{
+//	this->muVx3.SetExpr(muParserString);
+//	this->checkFunction(muVx3);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setRho(const std::string& muParserString)
+//{
+//	this->muRho.SetExpr(muParserString);
+//	this->checkFunction(muRho);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setf1(const std::string& muParserString)
+//{
+//	this->muf1.SetExpr(muParserString);
+//	this->checkFunction(muf1);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setf2(const std::string& muParserString)
+//{
+//	this->muf2.SetExpr(muParserString);
+//	this->checkFunction(muf2);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setf3(const std::string& muParserString)
+//{
+//	this->muf3.SetExpr(muParserString);
+//	this->checkFunction(muf3);
+//}
+////////////////////////////////////////////////////////////////////////////
+void InitThixotropyBlockVisitor::setLambda(const std::string& muParserString)
+{
+   this->muLambda.SetExpr(muParserString);
+   this->checkFunction(muLambda);
+}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setVx1(LBMReal vx1)
+//{
+//	this->muVx1.SetExpr(UbSystem::toString(vx1, D3Q27RealLim::digits10));
+//	this->checkFunction(muVx1);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setVx2(LBMReal vx2)
+//{
+//	this->muVx2.SetExpr(UbSystem::toString(vx2, D3Q27RealLim::digits10));
+//	this->checkFunction(muVx2);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setVx3(LBMReal vx3)
+//{
+//	this->muVx3.SetExpr(UbSystem::toString(vx3, D3Q27RealLim::digits10));
+//	this->checkFunction(muVx3);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setRho(LBMReal rho)
+//{
+//	this->muRho.SetExpr(UbSystem::toString(rho, D3Q27RealLim::digits10));
+//	this->checkFunction(muRho);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setf1(LBMReal f1)
+//{
+//	this->muf1.SetExpr(UbSystem::toString(f1, D3Q27RealLim::digits10));
+//	this->checkFunction(muf1);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setf2(LBMReal f2)
+//{
+//	this->muf2.SetExpr(UbSystem::toString(f2, D3Q27RealLim::digits10));
+//	this->checkFunction(muf2);
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setf3(LBMReal f3)
+//{
+//	this->muf3.SetExpr(UbSystem::toString(f3, D3Q27RealLim::digits10));
+//	this->checkFunction(muf3);
+//}
+//////////////////////////////////////////////////////////////////////////
+void InitThixotropyBlockVisitor::setLambda(LBMReal lambda)
+{
+   this->muLambda.SetExpr(UbSystem::toString(lambda, D3Q27RealLim::digits10));
+   this->checkFunction(muLambda);
+}
+//////////////////////////////////////////////////////////////////////////
+void InitThixotropyBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<Block3D> block)
+{
+   using namespace D3Q27System;
+
+   if(!block) UB_THROW( UbException(UB_EXARGS,"block is not exist") );
+
+   double dx = grid->getDeltaX(block);
+
+   //define vars for functions
+   mu::value_type x1,x2,x3;
+   //this->muVx1.DefineVar("x1",&x1); this->muVx1.DefineVar("x2",&x2); this->muVx1.DefineVar("x3",&x3);
+   //this->muVx2.DefineVar("x1",&x1); this->muVx2.DefineVar("x2",&x2); this->muVx2.DefineVar("x3",&x3);
+   //this->muVx3.DefineVar("x1",&x1); this->muVx3.DefineVar("x2",&x2); this->muVx3.DefineVar("x3",&x3);
+   //this->muRho.DefineVar("x1",&x1); this->muRho.DefineVar("x2",&x2); this->muRho.DefineVar("x3",&x3);
+
+   this->muLambda.DefineVar("x1",&x1); this->muLambda.DefineVar("x2",&x2); this->muLambda.DefineVar("x3",&x3);
+
+   //Funktionszeiger
+   typedef void (*CalcFeqsFct)(LBMReal* const& /*feq[27]*/,const LBMReal& /*(d)rho*/,const LBMReal& /*vx1*/,const LBMReal& /*vx2*/,const LBMReal& /*vx3*/);
+   CalcFeqsFct   calcFeqsFct   = NULL;
+   
+   LBMReal vx1,vx2,vx3,rho;
+
+   int gridRank = grid->getRank();
+   int blockRank = block->getRank();
+
+   if (blockRank == gridRank && block->isActive())
+   {
+       SPtr<ILBMKernel> kernel = block->getKernel();
+      if (!kernel)
+         throw UbException(UB_EXARGS, "The LBM kernel isn't exist in block: "+block->toString());
+
+      if(kernel->getCompressible()) 
+         calcFeqsFct   = &D3Q27System::calcCompFeq; 
+      else                                                        
+         calcFeqsFct   = &D3Q27System::calcIncompFeq; 
+
+      SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();
+      SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getHdistributions();  
+
+      LBMReal o  = kernel->getCollisionFactor();
+
+      LBMReal h[D3Q27System::ENDF+1];
+
+      size_t nx1 = distributions->getNX1();
+      size_t nx2 = distributions->getNX2();
+      size_t nx3 = distributions->getNX3();
+
+      for(int ix3=0; ix3<bcArray->getNX3(); ix3++)
+         for(int ix2=0; ix2<bcArray->getNX2(); ix2++)
+            for(int ix1=0; ix1<bcArray->getNX1(); ix1++)
+            {
+               //UbTupleDouble3 coords = grid->getNodeCoordinates(block, ix1, ix2, ix3);
+               //x1 = val<1>(coords);
+               //x2 = val<2>(coords);
+               //x3 = val<3>(coords);
+
+               //vx1 = muVx1.Eval();
+               //vx2 = muVx2.Eval();
+               //vx3 = muVx3.Eval();
+               //rho = muRho.Eval();
+
+               //f1 = muf1.Eval();
+               //f2 = muf2.Eval();
+               //f3 = muf3.Eval();
+               //conc = muConcentration.Eval();
+
+               //initialize(f, x1, x2, x3, vx1, vx2, vx3, rho, coords, dx, o, true);
+               //initialize(h, x1, x2, x3, f1, f2, f3, conc, coords, dx, oDiffusion, false);
+
+
+               //distributionsf->setDistribution(f, ix1, ix2, ix3);
+               //distributionsf->setDistributionInv(f, ix1, ix2, ix3);
+
+               LBMReal lambda = muLambda.Eval();
+               
+               calcFeqsFct(h,lambda,0.0,0.0,0.0);
+               
+               distributions->setDistribution(h, ix1, ix2, ix3);
+               distributions->setDistributionInv(h, ix1, ix2, ix3);
+
+
+            }
+   }
+
+   //variablen der functions loeschen, da die verwiesenen Objecte nach dem verlassen des scopes ungueltig sind!
+   //this->muVx1.ClearVar();
+   //this->muVx2.ClearVar();
+   //this->muVx3.ClearVar();
+   //this->muRho.ClearVar();
+
+   this->muLambda.ClearVar();
+}
+//////////////////////////////////////////////////////////////////////////
+void InitThixotropyBlockVisitor::checkFunction(mu::Parser fct)
+{
+   double x1 = 1.0, x2 = 1.0, x3 = 1.0;
+   fct.DefineVar("x1", &x1);
+   fct.DefineVar("x2", &x2);
+   fct.DefineVar("x3", &x3);
+
+   try
+   {
+      fct.Eval();
+      fct.ClearVar();
+   }
+   catch (mu::ParserError & e)
+   {
+      throw UbException(UB_EXARGS, "function: " + e.GetExpr() + (std::string)"error: " + e.GetMsg()
+         + (std::string)", only x1,x2,x3 are allowed as variables");
+   }
+}
+//////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setNu(LBMReal nu)
+//{
+//	this->nu = nu;
+//}
+////////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::setD(LBMReal D)
+//{
+//	this->D = D;
+//}
+//////////////////////////////////////////////////////////////////////////
+//void InitThixotropyBlockVisitor::initialize(double* f, double x1, double x2, double x3, double vx1, double vx2, double vx3, double rho, UbTupleDouble3 coords, double dx, double o, bool NSE)
+//{
+//   using namespace D3Q27System;
+//   //Funktionszeiger
+//   typedef void(*CalcFeqsFct)(LBMReal* const& /*feq[27]*/, const LBMReal& /*(d)rho*/, const LBMReal& /*vx1*/, const LBMReal& /*vx2*/, const LBMReal& /*vx3*/);
+//   CalcFeqsFct   calcFeqsFct = NULL;
+//
+//
+//   //if (NSE)
+//   //{
+//   //	calcFeqsFct = &D3Q27System::calcIncompFeq;
+//
+//   //}
+//   //else
+//   //{
+//      //calcFeqsFct = &D3Q27System::calcCompFeq;
+//      //muVx1 = muf1;
+//      //muVx2 = muf2;
+//      //muVx3 = muf3;
+//   //}
+//
+//   if (kernel->getCompressible())
+//      calcFeqsFct = &D3Q27System::calcCompFeq;
+//   else
+//      calcFeqsFct = &D3Q27System::calcIncompFeq;
+//
+//   //x-derivative
+//   double deltaX = dx * 0.5;
+//   x1 = val<1>(coords) + deltaX;
+//   double vx1Plusx1 = muVx1.Eval();
+//   double vx2Plusx1 = muVx2.Eval();
+//   double vx3Plusx1 = muVx3.Eval();
+//
+//   x1 = val<1>(coords) - deltaX;
+//   double vx1Minusx1 = muVx1.Eval();
+//   double vx2Minusx1 = muVx2.Eval();
+//   double vx3Minusx1 = muVx3.Eval();
+//
+//   //y-derivative
+//   x1 = val<1>(coords);
+//   x2 = val<2>(coords) + deltaX;
+//   double vx1Plusx2 = muVx1.Eval();
+//   double vx2Plusx2 = muVx2.Eval();
+//   double vx3Plusx2 = muVx3.Eval();
+//
+//   x2 = val<2>(coords) - deltaX;
+//   double vx1Minusx2 = muVx1.Eval();
+//   double vx2Minusx2 = muVx2.Eval();
+//   double vx3Minusx2 = muVx3.Eval();
+//
+//   //z-derivative
+//   x2 = val<2>(coords);
+//   x3 = val<3>(coords) + deltaX;
+//   double vx1Plusx3 = muVx1.Eval();
+//   double vx2Plusx3 = muVx2.Eval();
+//   double vx3Plusx3 = muVx3.Eval();
+//
+//   x3 = val<3>(coords) - deltaX;
+//   double vx1Minusx3 = muVx1.Eval();
+//   double vx2Minusx3 = muVx2.Eval();
+//   double vx3Minusx3 = muVx3.Eval();
+//
+//   double ax = (vx1Plusx1 - vx1Minusx1) / (2.0 * deltaX) * dx;
+//   double bx = (vx2Plusx1 - vx2Minusx1) / (2.0 * deltaX) * dx;
+//   double cx = (vx3Plusx1 - vx3Minusx1) / (2.0 * deltaX) * dx;
+//
+//   double ay = (vx1Plusx2 - vx1Minusx2) / (2.0 * deltaX) * dx;
+//   double by = (vx2Plusx2 - vx2Minusx2) / (2.0 * deltaX) * dx;
+//   double cy = (vx3Plusx2 - vx3Minusx2) / (2.0 * deltaX) * dx;
+//
+//   double az = (vx1Plusx3 - vx1Minusx3) / (2.0 * deltaX) * dx;
+//   double bz = (vx2Plusx3 - vx2Minusx3) / (2.0 * deltaX) * dx;
+//   double cz = (vx3Plusx3 - vx3Minusx3) / (2.0 * deltaX) * dx;
+//   double eps_new = 1.0;
+//   LBMReal op = 1.;
+//
+//   LBMReal feq[27];
+//
+//   calcFeqsFct(feq, rho, vx1, vx2, vx3);
+//
+//   double f_E = eps_new * ((5. * ax * o + 5. * by * o + 5. * cz * o - 8. * ax * op + 4. * by * op + 4. * cz * op) / (54. * o * op));
+//   double f_N = f_E + eps_new * ((2. * (ax - by)) / (9. * o));
+//   double f_T = f_E + eps_new * ((2. * (ax - cz)) / (9. * o));
+//   double f_NE = eps_new * (-(5. * cz * o + 3. * (ay + bx) * op - 2. * cz * op + ax * (5. * o + op) + by * (5. * o + op)) / (54. * o * op));
+//   double f_SE = f_NE + eps_new * ((ay + bx) / (9. * o));
+//   double f_TE = eps_new * (-(5. * cz * o + by * (5. * o - 2. * op) + 3. * (az + cx) * op + cz * op + ax * (5. * o + op)) / (54. * o * op));
+//   double f_BE = f_TE + eps_new * ((az + cx) / (9. * o));
+//   double f_TN = eps_new * (-(5. * ax * o + 5. * by * o + 5. * cz * o - 2. * ax * op + by * op + 3. * bz * op + 3. * cy * op + cz * op) / (54. * o * op));
+//   double f_BN = f_TN + eps_new * ((bz + cy) / (9. * o));
+//   double f_ZERO = eps_new * ((5. * (ax + by + cz)) / (9. * op));
+//   double f_TNE = eps_new * (-(ay + az + bx + bz + cx + cy) / (72. * o));
+//   double f_TSW = -eps_new * ((ay + bx) / (36. * o)) - f_TNE;
+//   double f_TSE = -eps_new * ((az + cx) / (36. * o)) - f_TNE;
+//   double f_TNW = -eps_new * ((bz + cy) / (36. * o)) - f_TNE;
+//
+//
+//   f[E] = f_E + feq[E];
+//   f[W] = f_E + feq[W];
+//   f[N] = f_N + feq[N];
+//   f[S] = f_N + feq[S];
+//   f[T] = f_T + feq[T];
+//   f[B] = f_T + feq[B];
+//   f[NE] = f_NE + feq[NE];
+//   f[SW] = f_NE + feq[SW];
+//   f[SE] = f_SE + feq[SE];
+//   f[NW] = f_SE + feq[NW];
+//   f[TE] = f_TE + feq[TE];
+//   f[BW] = f_TE + feq[BW];
+//   f[BE] = f_BE + feq[BE];
+//   f[TW] = f_BE + feq[TW];
+//   f[TN] = f_TN + feq[TN];
+//   f[BS] = f_TN + feq[BS];
+//   f[BN] = f_BN + feq[BN];
+//   f[TS] = f_BN + feq[TS];
+//   f[TNE] = f_TNE + feq[TNE];
+//   f[TNW] = f_TNW + feq[TNW];
+//   f[TSE] = f_TSE + feq[TSE];
+//   f[TSW] = f_TSW + feq[TSW];
+//   f[BNE] = f_TSW + feq[BNE];
+//   f[BNW] = f_TSE + feq[BNW];
+//   f[BSE] = f_TNW + feq[BSE];
+//   f[BSW] = f_TNE + feq[BSW];
+//   f[ZERO] = f_ZERO + feq[ZERO];
+//
+//
+//
+//
+//}
diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.h
new file mode 100644
index 000000000..f7054340d
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.h
@@ -0,0 +1,93 @@
+#ifndef InitThixotropyBlockVisitor_H
+#define InitThixotropyBlockVisitor_H
+
+#include <PointerDefinitions.h>
+
+#include "Block3DVisitor.h"
+#include "D3Q27System.h"
+
+#include <MuParser/include/muParser.h>
+
+/*================================================================================*/
+/*  D3Q27ETInitThixotropyBlockVisitor                                             */
+/*                                                                                */
+
+
+
+
+class InitThixotropyBlockVisitor : public Block3DVisitor
+{
+public:
+	typedef std::numeric_limits<LBMReal> D3Q27RealLim;
+
+public:
+	InitThixotropyBlockVisitor();
+	//D3Q27ETInitThixotropyBlockVisitor(LBMReal rho, LBMReal vx1=0.0, LBMReal vx2=0.0, LBMReal vx3=0.0);
+	//! Constructor
+	//! \param nu - viscosity
+	//! \param rho - density
+	//! \param vx1 - velocity in x
+	//! \param vx2 - velocity in y
+	//! \param vx3 - velocity in z
+	//InitThixotropyBlockVisitor(LBMReal lambda /*LBMReal nu, LBMReal D, LBMReal rho, LBMReal vx1 = 0.0, LBMReal vx2 = 0.0, LBMReal vx3 = 0.0, LBMReal c=0.0, LBMReal f1 = 0.0, LBMReal f2 = 0.0, LBMReal f3 = 0.0*/);
+	//////////////////////////////////////////////////////////////////////////
+	//automatic vars are: x1,x2, x3
+	//ussage example: setVx1("x1*0.01+x2*0.003")
+	//////////////////////////////////////////////////////////////////////////
+	//void setVx1(const mu::Parser& parser);
+	//void setVx2(const mu::Parser& parser);
+	//void setVx3(const mu::Parser& parser);
+	//void setRho(const mu::Parser& parser);
+
+	//void setVx1(const std::string& muParserString);
+	//void setVx2(const std::string& muParserString);
+	//void setVx3(const std::string& muParserString);
+	//void setRho(const std::string& muParserString);
+	////////////////////////////////////////////////////////////////////////////
+	//void setVx1(LBMReal vx1);
+	//void setVx2(LBMReal vx2);
+	//void setVx3(LBMReal vx3);
+	//void setRho(LBMReal rho);
+	//void setNu(LBMReal nu);
+
+	//////////////////////////////////////////////////////////////////////////
+	//////////////////////////////////////////////////////////////////////////
+	//void setf1(const mu::Parser& parser);
+	//void setf2(const mu::Parser& parser);
+	//void setf3(const mu::Parser& parser);
+	void setLambda(const mu::Parser& parser);
+
+	//void setf1(const std::string& muParserString);
+	//void setf2(const std::string& muParserString);
+	//void setf3(const std::string& muParserString);
+	void setLambda(const std::string& muParserString);
+	//////////////////////////////////////////////////////////////////////////
+	//void setf1(LBMReal f1);
+	//void setf2(LBMReal f2);
+	//void setf3(LBMReal f3);
+	void setLambda(LBMReal lambda);
+	//void setD(LBMReal D);
+
+	//void initialize(double* f, double x1, double x2, double x3, double vx1, double vx2, double vx3, double rho, UbTupleDouble3 coords, double dx, double o, bool NSE);
+
+	void visit(const SPtr<Grid3D> grid, SPtr<Block3D> block);
+
+protected:
+	void checkFunction(mu::Parser fct);
+	typedef void(*CalcFeqsFct)(LBMReal* const& /*feq[27]*/, const LBMReal& /*(d)rho*/, const LBMReal& /*vx1*/, const LBMReal& /*vx2*/, const LBMReal& /*vx3*/);
+
+private:
+	mu::Parser muVx1;
+	mu::Parser muVx2;
+	mu::Parser muVx3;
+	//mu::Parser muRho;
+	//LBMReal nu;
+
+	//mu::Parser muf1;
+	//mu::Parser muf2;
+	//mu::Parser muf3;
+	mu::Parser muLambda;
+	//LBMReal D;
+};
+
+#endif //D3Q27INITDISTRIBUTIONSPATCHVISITOR_H
diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.cpp
index 067b93bba..ddc252155 100644
--- a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.cpp
+++ b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.cpp
@@ -32,484 +32,492 @@
 //=======================================================================================
 
 #include "SetConnectorsBlockVisitor.h"
-#include "D3Q27ETCFOffVectorConnector.h"
-#include "D3Q27ETFCOffVectorConnector.h"
 #include "D3Q27ETFullDirectConnector.h"
 #include "D3Q27ETFullVectorConnector.h"
+#include "D3Q27ETCFOffVectorConnector.h"
+#include "D3Q27ETFCOffVectorConnector.h"
+#include "ThixotropyFullDirectConnector.h"
+#include "ThixotropyFullVectorConnector.h"
 #include "Grid3DSystem.h"
 #include <basics/transmitter/TbTransmitterLocal.h>
 
 #include "Communicator.h"
 #include "InterpolationProcessor.h"
 
-SetConnectorsBlockVisitor::SetConnectorsBlockVisitor(SPtr<Communicator> comm, bool fullConnector, int dirs, LBMReal nue,
-                                                     InterpolationProcessorPtr iProcessor)
-    : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), comm(comm), fullConnector(fullConnector), dirs(dirs), nue(nue),
-      iProcessor(iProcessor)
+SetConnectorsBlockVisitor::SetConnectorsBlockVisitor(SPtr<Communicator> comm, bool fullConnector, int dirs, 
+															   LBMReal nue, InterpolationProcessorPtr iProcessor) :
+Block3DVisitor(0, Grid3DSystem::MAXLEVEL), 
+	comm(comm),
+	fullConnector(fullConnector),
+	dirs(dirs),
+	nue(nue),
+	iProcessor(iProcessor)
 {
 }
 //////////////////////////////////////////////////////////////////////////
-SetConnectorsBlockVisitor::~SetConnectorsBlockVisitor(void) = default;
+SetConnectorsBlockVisitor::~SetConnectorsBlockVisitor(void)
+{
+}
 //////////////////////////////////////////////////////////////////////////
 void SetConnectorsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block)
 {
-    if (!block)
-        return;
+	if(!block) return;
 
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::visit() - start");
-    UBLOG(logDEBUG5, block->toString());
+	UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::visit() - start");
+   UBLOG(logDEBUG5, block->toString());
 
-    gridRank = comm->getProcessID();
-    grid->setRank(gridRank);
+	gridRank = comm->getProcessID();
+	grid->setRank(gridRank);
 
-    setSameLevelConnectors(grid, block);
+	setSameLevelConnectors(grid, block);
 
-    if (grid->getFinestInitializedLevel() > grid->getCoarsestInitializedLevel())
-        setInterpolationConnectors(grid, block);
+	if(grid->getFinestInitializedLevel() > grid->getCoarsestInitializedLevel())
+		setInterpolationConnectors(grid, block);
 
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::visit() - end");
+	UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::visit() - end");
 }
 //////////////////////////////////////////////////////////////////////////
 void SetConnectorsBlockVisitor::setSameLevelConnectors(SPtr<Grid3D> grid, SPtr<Block3D> block)
 {
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setSameLevelConnectors() - start");
-    int blockRank = block->getRank();
-    if (gridRank == blockRank && block->isActive()) {
-        block->clearWeight();
-        std::vector<SPtr<Block3D>> neighbors;
-        int ix1   = block->getX1();
-        int ix2   = block->getX2();
-        int ix3   = block->getX3();
-        int level = block->getLevel();
-        // grid->getAllNeighbors(ix1, ix2, ix3, level, level, neighbors);
-
-        // if (block->getGlobalID()==2512)
-        //{
-        //   int test = 0;
-        //}
-
-        for (int dir = 0; dir < dirs; dir++) {
-            SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level);
-
-            if (neighBlock) {
-                int neighBlockRank = neighBlock->getRank();
-                if (blockRank == neighBlockRank && neighBlock->isActive()) {
-                    SPtr<Block3DConnector> connector;
-                    connector = SPtr<Block3DConnector>(new D3Q27ETFullDirectConnector(block, neighBlock, dir));
-                    block->setConnector(connector);
-                } else if (blockRank != neighBlockRank && neighBlock->isActive()) {
-                    setRemoteConnectors(block, neighBlock, dir, fullConnector);
-
-                    if (dir >= 0 && dir <= 5) {
-                        int weight = block->getWeight(neighBlockRank);
-                        weight++;
-                        block->setWeight(neighBlockRank, weight);
-                    }
-                }
-            }
-        }
-
-        // if (block->getGlobalID()==2794)
-        //{
-        //   UBLOG(logINFO, block->toString());
-        //}
-
-        int weight = block->getNumberOfLocalConnectorsForSurfaces();
-        weight     = 6 - weight;
-        block->addWeightForAll(weight);
-    }
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setSameLevelConnectors() - end");
+   UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setSameLevelConnectors() - start");
+	int blockRank = block->getRank();
+	if (gridRank == blockRank && block->isActive())
+	{
+		block->clearWeight();
+		std::vector<SPtr<Block3D>> neighbors; 
+		int ix1 = block->getX1();
+		int ix2 = block->getX2();
+		int ix3 = block->getX3();
+		int level = block->getLevel();
+		//grid->getAllNeighbors(ix1, ix2, ix3, level, level, neighbors);
+
+      //if (block->getGlobalID()==2512)
+      //{
+      //   int test = 0;
+      //}
+
+		for( int dir = 0; dir < dirs; dir++)
+		{
+			SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level);
+
+			if(neighBlock)
+			{
+				int neighBlockRank = neighBlock->getRank();
+				if(blockRank == neighBlockRank && neighBlock->isActive())
+				{
+					SPtr<Block3DConnector> connector;
+               connector = SPtr<Block3DConnector>(new D3Q27ETFullDirectConnector( block, neighBlock, dir));
+					//connector = SPtr<Block3DConnector>(new ThixotropyFullDirectConnector( block, neighBlock, dir));
+					block->setConnector(connector);
+				}
+				else if(blockRank != neighBlockRank && neighBlock->isActive())
+				{
+					setRemoteConnectors(block, neighBlock, dir, fullConnector);  
+
+					if(dir >=0 && dir<=5)
+					{
+						int weight = block->getWeight(neighBlockRank);
+						weight++;
+						block->setWeight(neighBlockRank, weight);
+					}
+				}
+			}
+		}
+      
+      //if (block->getGlobalID()==2794)
+      //{
+      //   UBLOG(logINFO, block->toString());
+      //}
+		
+      int weight = block->getNumberOfLocalConnectorsForSurfaces();
+		weight = 6 - weight;
+		block->addWeightForAll(weight);
+	}
+   UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setSameLevelConnectors() - end");
 }
 //////////////////////////////////////////////////////////////////////////
-void SetConnectorsBlockVisitor::setRemoteConnectors(SPtr<Block3D> sblock, SPtr<Block3D> tblock, int dir,
-                                                    bool /*fullConnector*/)
+void SetConnectorsBlockVisitor::setRemoteConnectors(SPtr<Block3D> sblock, SPtr<Block3D> tblock, int dir, bool fullConnector)
 {
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setRemoteConnectors() - start");
-    CreateTransmittersHelper helper;
-    CreateTransmittersHelper::TransmitterPtr sender, receiver;
-    helper.createTransmitters(sblock, tblock, dir, CreateTransmittersHelper::NONE, sender, receiver, comm,
-                              CreateTransmittersHelper::MPI);
-
-    SPtr<Block3DConnector> connector;
-    connector = SPtr<Block3DConnector>(new D3Q27ETFullVectorConnector(sblock, sender, receiver, dir));
-    sblock->setConnector(connector);
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setRemoteConnectors() - end");
+   UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setRemoteConnectors() - start");
+	CreateTransmittersHelper helper;
+	CreateTransmittersHelper::TransmitterPtr sender, receiver;
+	helper.createTransmitters(sblock, tblock, dir, CreateTransmittersHelper::NONE, sender, receiver, comm, CreateTransmittersHelper::MPI);
+
+
+	SPtr<Block3DConnector> connector;
+	connector = SPtr<Block3DConnector>(new D3Q27ETFullVectorConnector(sblock, sender, receiver, dir));
+	//connector = SPtr<Block3DConnector>(new ThixotropyFullVectorConnector(sblock, sender, receiver, dir));
+	sblock->setConnector(connector);
+   UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setRemoteConnectors() - end");
 }
 //////////////////////////////////////////////////////////////////////////
 void SetConnectorsBlockVisitor::setInterpolationConnectors(SPtr<Grid3D> grid, SPtr<Block3D> block)
 {
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors() - start");
-    //	int blockRank = block->getRank();
-    //	if (block->getGlobalID()==394)
-    //	{
-    //		int test=0;
-    //	}
-
-    // search for all blocks with different ranks
-    if (block->hasInterpolationFlagCF() && block->isActive()) {
-        int fbx1  = block->getX1() << 1;
-        int fbx2  = block->getX2() << 1;
-        int fbx3  = block->getX3() << 1;
-        int level = block->getLevel() + 1;
-
-        if (block->hasInterpolationFlagCF(D3Q27System::E)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2, fbx3, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3, level);
-            SPtr<Block3D> fblockNW = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level);
-            SPtr<Block3D> fblockNE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::E);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::W)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1, fbx2 + 1, fbx3, level);
-            SPtr<Block3D> fblockNW = grid->getBlock(fbx1, fbx2, fbx3 + 1, level);
-            SPtr<Block3D> fblockNE = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::W);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::N)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 1, fbx3, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3, level);
-            SPtr<Block3D> fblockNW = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level);
-            SPtr<Block3D> fblockNE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::N);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::S)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3, level);
-            SPtr<Block3D> fblockNW = grid->getBlock(fbx1, fbx2, fbx3 + 1, level);
-            SPtr<Block3D> fblockNE = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::S);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::T)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3 + 1, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level);
-            SPtr<Block3D> fblockNW = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level);
-            SPtr<Block3D> fblockNE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::T);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::B)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3, level);
-            SPtr<Block3D> fblockNW = grid->getBlock(fbx1, fbx2 + 1, fbx3, level);
-            SPtr<Block3D> fblockNE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::B);
-        }
-
-        //////NE-NW-SE-SW
-        if (block->hasInterpolationFlagCF(D3Q27System::NE) && !block->hasInterpolationFlagCF(D3Q27System::N) &&
-            !block->hasInterpolationFlagCF(D3Q27System::E)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 0, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NE);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::SW) && !block->hasInterpolationFlagCF(D3Q27System::W) &&
-            !block->hasInterpolationFlagCF(D3Q27System::S)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1, fbx2, fbx3 + 1, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SW);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::SE) && !block->hasInterpolationFlagCF(D3Q27System::E) &&
-            !block->hasInterpolationFlagCF(D3Q27System::S)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 0, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SE);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::NW) && !block->hasInterpolationFlagCF(D3Q27System::N) &&
-            !block->hasInterpolationFlagCF(D3Q27System::W)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 1, fbx3, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NW);
-        }
-
-        /////////TE-BW-BE-TW 1-0
-        if (block->hasInterpolationFlagCF(D3Q27System::TE) && !block->hasInterpolationFlagCF(D3Q27System::E) &&
-            !block->hasInterpolationFlagCF(D3Q27System::T)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2 + 0, fbx3 + 1, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2+0, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TE);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::BW) && !block->hasInterpolationFlagCF(D3Q27System::W) &&
-            !block->hasInterpolationFlagCF(D3Q27System::B)) {
-
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 0, fbx3, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1, fbx2 + 1, fbx3, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2+0, fbx3, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2+1, fbx3, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BW);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::BE) && !block->hasInterpolationFlagCF(D3Q27System::E) &&
-            !block->hasInterpolationFlagCF(D3Q27System::B)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2 + 0, fbx3, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2+0, fbx3, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BE);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::TW) && !block->hasInterpolationFlagCF(D3Q27System::W) &&
-            !block->hasInterpolationFlagCF(D3Q27System::T)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 0, fbx3 + 1, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2+0, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TW);
-        }
-
-        //////TN-BS-BN-TS
-        if (block->hasInterpolationFlagCF(D3Q27System::TN) && !block->hasInterpolationFlagCF(D3Q27System::N) &&
-            !block->hasInterpolationFlagCF(D3Q27System::T)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 0, fbx2 + 1, fbx3 + 1, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+0, fbx2+1, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TN);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::BS) && !block->hasInterpolationFlagCF(D3Q27System::S) &&
-            !block->hasInterpolationFlagCF(D3Q27System::B)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 0, fbx2, fbx3, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+0, fbx2, fbx3, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2, fbx3, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BS);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::BN) && !block->hasInterpolationFlagCF(D3Q27System::N) &&
-            !block->hasInterpolationFlagCF(D3Q27System::B)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 0, fbx2 + 1, fbx3, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+0, fbx2+1, fbx3, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BN);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::TS) && !block->hasInterpolationFlagCF(D3Q27System::S) &&
-            !block->hasInterpolationFlagCF(D3Q27System::T)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 0, fbx2, fbx3 + 1, level);
-            SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+0, fbx2, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TS);
-        }
-
-        //////corners
-        if (block->hasInterpolationFlagCF(D3Q27System::TNE) && !block->hasInterpolationFlagCF(D3Q27System::TE) &&
-            !block->hasInterpolationFlagCF(D3Q27System::TN) && !block->hasInterpolationFlagCF(D3Q27System::NE) &&
-            !block->hasInterpolationFlagCF(D3Q27System::T) && !block->hasInterpolationFlagCF(D3Q27System::N) &&
-            !block->hasInterpolationFlagCF(D3Q27System::E)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level);
-            SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNE);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::TSW) && !block->hasInterpolationFlagCF(D3Q27System::TW) &&
-            !block->hasInterpolationFlagCF(D3Q27System::TS) && !block->hasInterpolationFlagCF(D3Q27System::SW) &&
-            !block->hasInterpolationFlagCF(D3Q27System::T) && !block->hasInterpolationFlagCF(D3Q27System::W) &&
-            !block->hasInterpolationFlagCF(D3Q27System::S)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3 + 1, level);
-            SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1, fbx2, fbx3, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSW);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::TSE) && !block->hasInterpolationFlagCF(D3Q27System::TE) &&
-            !block->hasInterpolationFlagCF(D3Q27System::TS) && !block->hasInterpolationFlagCF(D3Q27System::SE) &&
-            !block->hasInterpolationFlagCF(D3Q27System::T) && !block->hasInterpolationFlagCF(D3Q27System::E) &&
-            !block->hasInterpolationFlagCF(D3Q27System::S)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level);
-            SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1+1, fbx2, fbx3+0, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSE);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::TNW) && !block->hasInterpolationFlagCF(D3Q27System::TW) &&
-            !block->hasInterpolationFlagCF(D3Q27System::TN) && !block->hasInterpolationFlagCF(D3Q27System::NW) &&
-            !block->hasInterpolationFlagCF(D3Q27System::T) && !block->hasInterpolationFlagCF(D3Q27System::N) &&
-            !block->hasInterpolationFlagCF(D3Q27System::W)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level);
-            SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1, fbx2+1, fbx3, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNW);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::BNE) && !block->hasInterpolationFlagCF(D3Q27System::BE) &&
-            !block->hasInterpolationFlagCF(D3Q27System::BN) && !block->hasInterpolationFlagCF(D3Q27System::NE) &&
-            !block->hasInterpolationFlagCF(D3Q27System::B) && !block->hasInterpolationFlagCF(D3Q27System::N) &&
-            !block->hasInterpolationFlagCF(D3Q27System::E)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 0, level);
-            SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNE);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::BSW) && !block->hasInterpolationFlagCF(D3Q27System::BS) &&
-            !block->hasInterpolationFlagCF(D3Q27System::BW) && !block->hasInterpolationFlagCF(D3Q27System::SW) &&
-            !block->hasInterpolationFlagCF(D3Q27System::B) && !block->hasInterpolationFlagCF(D3Q27System::W) &&
-            !block->hasInterpolationFlagCF(D3Q27System::S)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3 + 0, level);
-            SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1, fbx2, fbx3, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSW);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::BSE) && !block->hasInterpolationFlagCF(D3Q27System::BS) &&
-            !block->hasInterpolationFlagCF(D3Q27System::BE) && !block->hasInterpolationFlagCF(D3Q27System::SE) &&
-            !block->hasInterpolationFlagCF(D3Q27System::B) && !block->hasInterpolationFlagCF(D3Q27System::E) &&
-            !block->hasInterpolationFlagCF(D3Q27System::S)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2, fbx3, level);
-            SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1+1, fbx2, fbx3+0, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSE);
-        }
-        if (block->hasInterpolationFlagCF(D3Q27System::BNW) && !block->hasInterpolationFlagCF(D3Q27System::BN) &&
-            !block->hasInterpolationFlagCF(D3Q27System::BW) && !block->hasInterpolationFlagCF(D3Q27System::NW) &&
-            !block->hasInterpolationFlagCF(D3Q27System::B) && !block->hasInterpolationFlagCF(D3Q27System::N) &&
-            !block->hasInterpolationFlagCF(D3Q27System::W)) {
-            SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 0, level);
-            SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1, fbx2+1, fbx3, level);
-            SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
-            SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
-
-            setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNW);
-        }
-    }
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors() - end");
+   UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors() - start");
+	int blockRank = block->getRank();
+	if (block->getGlobalID()==394)
+	{
+		int test=0;
+	}
+
+	//search for all blocks with different ranks
+	if (block->hasInterpolationFlagCF() && block->isActive())
+	{
+		int fbx1 = block->getX1() << 1;
+		int fbx2 = block->getX2() << 1;
+		int fbx3 = block->getX3() << 1;
+		int level = block->getLevel() + 1;
+
+		if( block->hasInterpolationFlagCF(D3Q27System::E))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2,fbx3,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level);
+			SPtr<Block3D> fblockNW = grid->getBlock(fbx1+1,fbx2,fbx3+1,level);
+			SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::E);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::W))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3,level);
+			SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2,fbx3+1,level);
+			SPtr<Block3D> fblockNE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::W);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::N))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+1,fbx3,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level);
+			SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3+1,level);
+			SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::N);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::S))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level);
+			SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2,fbx3+1,level);
+			SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::S);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::T))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3+1,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level);
+			SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3+1,level);
+			SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::T);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::B))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level);
+			SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3,level);
+			SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::B);
+		}
+
+		//////NE-NW-SE-SW
+		if( block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+1,fbx3+0,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NE);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2,fbx3+1,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SW);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2,fbx3+0,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SE);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+1,fbx3,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NW);
+		}
+
+		/////////TE-BW-BE-TW 1-0
+		if( block->hasInterpolationFlagCF(D3Q27System::TE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::T))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+0,fbx3+1,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+0, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TE);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::B))
+		{
+
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+0,fbx3,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+0, fbx3, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BW);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::BE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::B))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+0,fbx3,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+0, fbx3, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BE);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::TW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::T))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+0,fbx3+1,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+0, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TW);
+		}
+
+		//////TN-BS-BN-TS
+		if( block->hasInterpolationFlagCF(D3Q27System::TN)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::T))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2+1,fbx3+1,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2+1, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TN);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::S) && !block->hasInterpolationFlagCF(D3Q27System::B))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2,fbx3,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2, fbx3, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BS);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::B))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2+1,fbx3,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2+1, fbx3, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BN);
+		}
+		if( block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::S) && !block->hasInterpolationFlagCF(D3Q27System::T))
+		{
+			SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2,fbx3+1,level);
+			SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
+
+			setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TS);
+		}
+
+
+
+
+      //////corners
+      if (block->hasInterpolationFlagCF(D3Q27System::TNE)&&!block->hasInterpolationFlagCF(D3Q27System::TE)&&!block->hasInterpolationFlagCF(D3Q27System::TN)&&!block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::T)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E))
+      {
+         SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
+         SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
+
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNE);
+      }
+      if (block->hasInterpolationFlagCF(D3Q27System::TSW)&&!block->hasInterpolationFlagCF(D3Q27System::TW)&&!block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S))
+      {
+         SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3+1, level);
+         SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2, fbx3, level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
+
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSW);
+      }
+      if (block->hasInterpolationFlagCF(D3Q27System::TSE)&&!block->hasInterpolationFlagCF(D3Q27System::TE)&&!block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S))
+      {
+         SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
+         SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2, fbx3+0, level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
+
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSE);
+      }
+      if (block->hasInterpolationFlagCF(D3Q27System::TNW)&&!block->hasInterpolationFlagCF(D3Q27System::TW)&&!block->hasInterpolationFlagCF(D3Q27System::TN)&& !block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W))
+      {
+         SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
+         SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
+
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNW);
+      }
+      if (block->hasInterpolationFlagCF(D3Q27System::BNE)&&!block->hasInterpolationFlagCF(D3Q27System::BE)&&!block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::B)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E))
+      {
+         SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level);
+         SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level);
+
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNE);
+      }
+      if (block->hasInterpolationFlagCF(D3Q27System::BSW)&& !block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S))
+      {
+         SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3+0, level);
+         SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2, fbx3, level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level);
+
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSW);
+      }
+      if (block->hasInterpolationFlagCF(D3Q27System::BSE)&& !block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::BE)&& !block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S))
+      {
+         SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2, fbx3, level);
+         SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2, fbx3+0, level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level);
+
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSE);
+      }
+      if (block->hasInterpolationFlagCF(D3Q27System::BNW)&& !block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W))
+      {
+         SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2+1, fbx3+0, level);
+         SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level);
+         SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
+         SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level);
+
+         setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNW);
+      }
+
+	}
+   UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors() - end");
 }
 //////////////////////////////////////////////////////////////////////////
-void SetConnectorsBlockVisitor::setInterpolationConnectors(SPtr<Block3D> fBlockSW, SPtr<Block3D> fBlockSE,
-                                                           SPtr<Block3D> fBlockNW, SPtr<Block3D> fBlockNE,
-                                                           SPtr<Block3D> cBlock, int dir)
+void SetConnectorsBlockVisitor::setInterpolationConnectors(SPtr<Block3D> fBlockSW, SPtr<Block3D> fBlockSE, SPtr<Block3D> fBlockNW, SPtr<Block3D> fBlockNE, SPtr<Block3D> cBlock, int dir)
 {
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors(...) - start");
-    int fBlockSWRank = -999, fBlockSERank = -999, fBlockNWRank = -999, fBlockNERank = -999;
-    if (fBlockSW)
-        fBlockSWRank = fBlockSW->getRank();
-    if (fBlockNW)
-        fBlockNWRank = fBlockNW->getRank();
-    if (fBlockSE)
-        fBlockSERank = fBlockSE->getRank();
-    if (fBlockNE)
-        fBlockNERank = fBlockNE->getRank();
-    int cBlockRank = cBlock->getRank();
-
-    LBMReal omegaF;
-    if (fBlockSW)
-        omegaF = LBMSystem::calcCollisionFactor(nue, fBlockSW->getLevel());
-    if (fBlockNW)
-        omegaF = LBMSystem::calcCollisionFactor(nue, fBlockNW->getLevel());
-    if (fBlockSE)
-        omegaF = LBMSystem::calcCollisionFactor(nue, fBlockSE->getLevel());
-    if (fBlockNE)
-        omegaF = LBMSystem::calcCollisionFactor(nue, fBlockNE->getLevel());
-    LBMReal omegaC = LBMSystem::calcCollisionFactor(nue, cBlock->getLevel());
-    iProcessor->setOmegas(omegaC, omegaF);
-
-    InterpolationProcessorPtr cIProcessor(iProcessor->clone());
-    InterpolationProcessorPtr fIProcessorSW(iProcessor->clone());
-    InterpolationProcessorPtr fIProcessorSE(iProcessor->clone());
-    InterpolationProcessorPtr fIProcessorNW(iProcessor->clone());
-    InterpolationProcessorPtr fIProcessorNE(iProcessor->clone());
-
-    CreateTransmittersHelper::TransmitterPtr senderCFevenEvenSW, receiverCFevenEvenSW, senderCFevenOddNW,
-        receiverCFevenOddNW, senderCFoddEvenSE, receiverCFoddEvenSE, senderCFoddOddNE, receiverCFoddOddNE,
-        senderFCevenEvenSW, receiverFCevenEvenSW, senderFCevenOddNW, receiverFCevenOddNW, senderFCoddEvenSE,
-        receiverFCoddEvenSE, senderFCoddOddNE, receiverFCoddOddNE;
-
-    if (fBlockSW)
-        createTransmitters(cBlock, fBlockSW, dir, CreateTransmittersHelper::SW, senderCFevenEvenSW,
-                           receiverCFevenEvenSW, senderFCevenEvenSW, receiverFCevenEvenSW);
-    if (fBlockNW)
-        createTransmitters(cBlock, fBlockNW, dir, CreateTransmittersHelper::NW, senderCFevenOddNW, receiverCFevenOddNW,
-                           senderFCevenOddNW, receiverFCevenOddNW);
-    if (fBlockSE)
-        createTransmitters(cBlock, fBlockSE, dir, CreateTransmittersHelper::SE, senderCFoddEvenSE, receiverCFoddEvenSE,
-                           senderFCoddEvenSE, receiverFCoddEvenSE);
-    if (fBlockNE)
-        createTransmitters(cBlock, fBlockNE, dir, CreateTransmittersHelper::NE, senderCFoddOddNE, receiverCFoddOddNE,
-                           senderFCoddOddNE, receiverFCoddOddNE);
-
-    if (cBlockRank == gridRank) {
-        SPtr<Block3DConnector> connector(new D3Q27ETCFOffVectorConnector<TbTransmitter<CbVector<LBMReal>>>(
-            cBlock, senderCFevenEvenSW, receiverCFevenEvenSW, senderCFevenOddNW, receiverCFevenOddNW, senderCFoddEvenSE,
-            receiverCFoddEvenSE, senderCFoddOddNE, receiverCFoddOddNE, dir, cIProcessor));
-        cBlock->setConnector(connector);
-    }
-    if (fBlockSW && fBlockSWRank == gridRank) {
-        SPtr<Block3DConnector> connector(new D3Q27ETFCOffVectorConnector<TbTransmitter<CbVector<LBMReal>>>(
-            fBlockSW, senderFCevenEvenSW, receiverFCevenEvenSW, dir, fIProcessorSW, EvenEvenSW));
-        fBlockSW->setConnector(connector);
-    }
-    if (fBlockNW && fBlockNWRank == gridRank) {
-        SPtr<Block3DConnector> connector(new D3Q27ETFCOffVectorConnector<TbTransmitter<CbVector<LBMReal>>>(
-            fBlockNW, senderFCevenOddNW, receiverFCevenOddNW, dir, fIProcessorNW, EvenOddNW));
-        fBlockNW->setConnector(connector);
-    }
-    if (fBlockSE && fBlockSERank == gridRank) {
-        SPtr<Block3DConnector> connector(new D3Q27ETFCOffVectorConnector<TbTransmitter<CbVector<LBMReal>>>(
-            fBlockSE, senderFCoddEvenSE, receiverFCoddEvenSE, dir, fIProcessorSE, OddEvenSE));
-        fBlockSE->setConnector(connector);
-    }
-    if (fBlockNE && fBlockNERank == gridRank) {
-        SPtr<Block3DConnector> connector(new D3Q27ETFCOffVectorConnector<TbTransmitter<CbVector<LBMReal>>>(
-            fBlockNE, senderFCoddOddNE, receiverFCoddOddNE, dir, fIProcessorNE, OddOddNE));
-        fBlockNE->setConnector(connector);
-    }
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors(...) - end");
+   UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors(...) - start");
+	int fBlockSWRank = -999, fBlockSERank = -999, fBlockNWRank = -999, fBlockNERank = -999;
+	if(fBlockSW) fBlockSWRank = fBlockSW->getRank();
+	if(fBlockNW) fBlockNWRank = fBlockNW->getRank();
+	if(fBlockSE) fBlockSERank = fBlockSE->getRank();
+	if(fBlockNE) fBlockNERank = fBlockNE->getRank();
+	int cBlockRank   = cBlock->getRank();
+
+	LBMReal omegaF;
+	if(fBlockSW) omegaF =LBMSystem::calcCollisionFactor(nue, fBlockSW->getLevel());
+	if(fBlockNW) omegaF =LBMSystem::calcCollisionFactor(nue, fBlockNW->getLevel());
+	if(fBlockSE) omegaF =LBMSystem::calcCollisionFactor(nue, fBlockSE->getLevel());
+	if(fBlockNE) omegaF =LBMSystem::calcCollisionFactor(nue, fBlockNE->getLevel());
+	LBMReal omegaC = LBMSystem::calcCollisionFactor(nue, cBlock->getLevel());
+	iProcessor->setOmegas(omegaC, omegaF);
+
+	InterpolationProcessorPtr cIProcessor(iProcessor->clone());
+	InterpolationProcessorPtr fIProcessorSW(iProcessor->clone());
+	InterpolationProcessorPtr fIProcessorSE(iProcessor->clone());
+	InterpolationProcessorPtr fIProcessorNW(iProcessor->clone());
+	InterpolationProcessorPtr fIProcessorNE(iProcessor->clone());
+
+	CreateTransmittersHelper::TransmitterPtr senderCFevenEvenSW, receiverCFevenEvenSW, 
+		senderCFevenOddNW,  receiverCFevenOddNW, 
+		senderCFoddEvenSE,  receiverCFoddEvenSE, 
+		senderCFoddOddNE,   receiverCFoddOddNE,
+		senderFCevenEvenSW, receiverFCevenEvenSW, 
+		senderFCevenOddNW,  receiverFCevenOddNW, 
+		senderFCoddEvenSE,  receiverFCoddEvenSE, 
+		senderFCoddOddNE,   receiverFCoddOddNE;
+
+	if(fBlockSW) createTransmitters(cBlock, fBlockSW, dir, CreateTransmittersHelper::SW, senderCFevenEvenSW, receiverCFevenEvenSW, senderFCevenEvenSW, receiverFCevenEvenSW);
+	if(fBlockNW) createTransmitters(cBlock, fBlockNW, dir, CreateTransmittersHelper::NW, senderCFevenOddNW, receiverCFevenOddNW, senderFCevenOddNW, receiverFCevenOddNW);
+	if(fBlockSE) createTransmitters(cBlock, fBlockSE, dir, CreateTransmittersHelper::SE, senderCFoddEvenSE, receiverCFoddEvenSE, senderFCoddEvenSE, receiverFCoddEvenSE);
+	if(fBlockNE) createTransmitters(cBlock, fBlockNE, dir, CreateTransmittersHelper::NE, senderCFoddOddNE, receiverCFoddOddNE, senderFCoddOddNE, receiverFCoddOddNE);
+
+	if(cBlockRank == gridRank)
+	{
+      SPtr<Block3DConnector> connector(new D3Q27ETCFOffVectorConnector< TbTransmitter< CbVector< LBMReal > > >(cBlock,
+			senderCFevenEvenSW, receiverCFevenEvenSW, senderCFevenOddNW,  receiverCFevenOddNW, 
+			senderCFoddEvenSE,  receiverCFoddEvenSE,  senderCFoddOddNE,   receiverCFoddOddNE, 
+			dir, cIProcessor) );
+		cBlock->setConnector(connector);
+	}
+	if(fBlockSW && fBlockSWRank == gridRank)
+	{
+		SPtr<Block3DConnector> connector( new D3Q27ETFCOffVectorConnector< TbTransmitter< CbVector< LBMReal > > >(fBlockSW, 
+			senderFCevenEvenSW, receiverFCevenEvenSW, dir, fIProcessorSW, EvenEvenSW) );
+		fBlockSW->setConnector(connector);
+	}
+	if(fBlockNW && fBlockNWRank == gridRank)
+	{
+		SPtr<Block3DConnector> connector( new D3Q27ETFCOffVectorConnector< TbTransmitter< CbVector< LBMReal > > >(fBlockNW, 
+			senderFCevenOddNW, receiverFCevenOddNW, dir, fIProcessorNW, EvenOddNW) );
+		fBlockNW->setConnector(connector);
+	}
+	if(fBlockSE && fBlockSERank == gridRank)
+	{
+		SPtr<Block3DConnector> connector( new D3Q27ETFCOffVectorConnector< TbTransmitter< CbVector< LBMReal > > >(fBlockSE, 
+			senderFCoddEvenSE, receiverFCoddEvenSE, dir, fIProcessorSE, OddEvenSE) );
+		fBlockSE->setConnector(connector);
+	}
+	if(fBlockNE && fBlockNERank == gridRank)
+	{
+		SPtr<Block3DConnector> connector( new D3Q27ETFCOffVectorConnector< TbTransmitter< CbVector< LBMReal > > >(fBlockNE, 
+			senderFCoddOddNE, receiverFCoddOddNE, dir, fIProcessorNE, OddOddNE) );
+		fBlockNE->setConnector(connector);
+	}
+   UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors(...) - end");
 }
 //////////////////////////////////////////////////////////////////////////
-void SetConnectorsBlockVisitor::createTransmitters(SPtr<Block3D> cBlock, SPtr<Block3D> fBlock, int dir,
-                                                   CreateTransmittersHelper::IBlock ib,
-                                                   CreateTransmittersHelper::TransmitterPtr &senderCF,
-                                                   CreateTransmittersHelper::TransmitterPtr &receiverCF,
-                                                   CreateTransmittersHelper::TransmitterPtr &senderFC,
-                                                   CreateTransmittersHelper::TransmitterPtr &receiverFC)
+void SetConnectorsBlockVisitor::createTransmitters(SPtr<Block3D> cBlock, SPtr<Block3D> fBlock, int dir, 
+                                                        CreateTransmittersHelper::IBlock ib, 
+														              CreateTransmittersHelper::TransmitterPtr& senderCF, 
+														              CreateTransmittersHelper::TransmitterPtr& receiverCF, 
+														              CreateTransmittersHelper::TransmitterPtr& senderFC, 
+														              CreateTransmittersHelper::TransmitterPtr& receiverFC)
 {
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::createTransmitters(...) - start");
-    CreateTransmittersHelper helper;
-    //	bool MPIpool = true;
-    //	bool orthogonal = false;
-    int fBlockRank = fBlock->getRank();
-    int cBlockRank = cBlock->getRank();
-    if (fBlockRank == cBlockRank && fBlockRank == gridRank) {
-        senderCF = receiverFC = CreateTransmittersHelper::TransmitterPtr(new TbLocalTransmitter<CbVector<LBMReal>>());
-        senderFC = receiverCF = CreateTransmittersHelper::TransmitterPtr(new TbLocalTransmitter<CbVector<LBMReal>>());
-    } else if (cBlockRank == gridRank) {
-        helper.createTransmitters(cBlock, fBlock, dir, ib, senderCF, receiverCF, comm, CreateTransmittersHelper::MPI);
-    } else if (fBlockRank == gridRank) {
-        helper.createTransmitters(fBlock, cBlock, dir, ib, senderFC, receiverFC, comm, CreateTransmittersHelper::MPI);
-    }
-    UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::createTransmitters(...) - end");
+   UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::createTransmitters(...) - start");
+	CreateTransmittersHelper helper;
+	bool MPIpool = true;
+	bool orthogonal = false;
+	int fBlockRank = fBlock->getRank();
+	int cBlockRank = cBlock->getRank();
+	if(fBlockRank == cBlockRank && fBlockRank == gridRank)
+	{
+		senderCF = receiverFC = CreateTransmittersHelper::TransmitterPtr( new TbLocalTransmitter< CbVector< LBMReal > >());
+		senderFC = receiverCF = CreateTransmittersHelper::TransmitterPtr( new TbLocalTransmitter< CbVector< LBMReal > >());
+	}
+	else if(cBlockRank == gridRank)
+	{
+		helper.createTransmitters(cBlock, fBlock, dir, ib, senderCF, receiverCF, comm, CreateTransmittersHelper::MPI);
+	}
+	else if(fBlockRank == gridRank)
+	{
+		helper.createTransmitters(fBlock, cBlock, dir, ib, senderFC, receiverFC, comm, CreateTransmittersHelper::MPI);
+	}
+   UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::createTransmitters(...) - end");
 }
+
-- 
GitLab