From 7e39b5e92503a5d0bbdbd2aac04c7bb3663702a7 Mon Sep 17 00:00:00 2001
From: kutscher <kutscher@irmb.tu-bs.de>
Date: Thu, 3 Dec 2020 16:14:51 +0100
Subject: [PATCH] add new implementation of Bingham model / fix rheometer setup

---
 apps/cpu/Applications.cmake                   |   1 +
 apps/cpu/CouetteFlow/CMakeLists.txt           |  10 +
 apps/cpu/CouetteFlow/cf1.cfg                  |  32 +
 apps/cpu/CouetteFlow/cflow.cpp                | 307 ++++++
 apps/cpu/HerschelBulkleyModel/hbf1.cfg        |   6 +-
 apps/cpu/HerschelBulkleyModel/hbflow.cpp      |  10 +-
 apps/cpu/rheometer/rheometer.cfg              |  23 +-
 apps/cpu/rheometer/rheometer.cpp              |  87 +-
 src/cpu/VirtualFluids.h                       |   5 +-
 .../CalculateTorqueCoProcessor.cpp            | 255 +++++
 .../CoProcessors/CalculateTorqueCoProcessor.h |  54 ++
 .../WriteThixotropyQuantitiesCoProcessor.cpp  |  11 +-
 src/cpu/VirtualFluidsCore/LBM/D3Q27System.h   |   2 +
 src/cpu/VirtualFluidsCore/LBM/Thixotropy.h    |  36 +-
 .../LBM/ThixotropyModelLBMKernel2.cpp         | 899 ++++++++++++++++++
 .../LBM/ThixotropyModelLBMKernel2.h           |  51 +
 16 files changed, 1736 insertions(+), 53 deletions(-)
 create mode 100644 apps/cpu/CouetteFlow/CMakeLists.txt
 create mode 100644 apps/cpu/CouetteFlow/cf1.cfg
 create mode 100644 apps/cpu/CouetteFlow/cflow.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.cpp
 create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.h

diff --git a/apps/cpu/Applications.cmake b/apps/cpu/Applications.cmake
index d09703197..fb5b9cdf5 100644
--- a/apps/cpu/Applications.cmake
+++ b/apps/cpu/Applications.cmake
@@ -67,4 +67,5 @@ add_subdirectory(${APPS_ROOT_CPU}/LaminarTubeFlow)
 add_subdirectory(${APPS_ROOT_CPU}/HerschelBulkleySphere)
 add_subdirectory(${APPS_ROOT_CPU}/HerschelBulkleyModel)
 add_subdirectory(${APPS_ROOT_CPU}/rheometer)
+add_subdirectory(${APPS_ROOT_CPU}/CouetteFlow)
 
diff --git a/apps/cpu/CouetteFlow/CMakeLists.txt b/apps/cpu/CouetteFlow/CMakeLists.txt
new file mode 100644
index 000000000..45293b4e2
--- /dev/null
+++ b/apps/cpu/CouetteFlow/CMakeLists.txt
@@ -0,0 +1,10 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
+
+########################################################
+## C++ PROJECT                                       ###
+########################################################
+PROJECT(CouetteFlow)
+
+INCLUDE(${APPS_ROOT_CPU}/IncludsList.cmake) 
+
+vf_add_library(BUILDTYPE binary DEPENDS VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES cflow.cpp )
\ No newline at end of file
diff --git a/apps/cpu/CouetteFlow/cf1.cfg b/apps/cpu/CouetteFlow/cf1.cfg
new file mode 100644
index 000000000..0fa997611
--- /dev/null
+++ b/apps/cpu/CouetteFlow/cf1.cfg
@@ -0,0 +1,32 @@
+pathname = d:/temp/BinghamNewTest2
+
+numOfThreads = 4
+availMem = 8e9
+logToFile = false
+
+# blocknx = 2 32 32
+# boundingBox = 0.25 32 32
+# deltax = 0.125 #0.25 #0.5 #1
+
+# nuLB = 0.05
+# forcing = 1e-7 #2e-7 #4e-7 #8e-7
+
+# outTime = 10000
+# endTime =  1920000 #480000 #120000 #30000
+
+blocknx = 2 32 2
+boundingBox = 2 32 2
+deltax = 1
+
+#nuLB = 0.05
+forcing = 8e-7
+#n = 0.8
+#tau0 = 3e-6
+
+velocity = 1e-3
+n = 0.4
+Re = 1
+Bn = 0.01
+
+outTime = 1000
+endTime = 50000000
\ No newline at end of file
diff --git a/apps/cpu/CouetteFlow/cflow.cpp b/apps/cpu/CouetteFlow/cflow.cpp
new file mode 100644
index 000000000..f5a3abca7
--- /dev/null
+++ b/apps/cpu/CouetteFlow/cflow.cpp
@@ -0,0 +1,307 @@
+#include <iostream>
+#include <string>
+
+#include <VirtualFluids.h>
+
+using namespace std;
+
+
+void bflow(string configname)
+{
+   try
+   {
+      ConfigurationFile   config;
+      config.load(configname);
+
+      string          pathname = config.getValue<string>("pathname");
+      int             numOfThreads = config.getValue<int>("numOfThreads");
+      vector<int>     blocknx = config.getVector<int>("blocknx");
+      vector<double>  boundingBox = config.getVector<double>("boundingBox");
+      //double          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          cpStep = config.getValue<double>("cpStep");
+      //double          cpStepStart = config.getValue<double>("cpStepStart");
+      //bool            newStart = config.getValue<bool>("newStart");
+      double          forcing = config.getValue<double>("forcing");
+      //double          n = config.getValue<double>("n");
+      //double          k = config.getValue<double>("k");
+      //double          tau0 = config.getValue<double>("tau0");
+      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 = pathname.c_str();
+            mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
+         }
+#endif 
+
+         if (myid == 0)
+         {
+            stringstream logFilename;
+            logFilename << pathname + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt";
+            UbLog::output_policy::setStream(logFilename.str());
+         }
+      }
+
+      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 = 0.0;
+      double g_minX2 = -boundingBox[1]/2.0;
+      double g_minX3 = -boundingBox[2]/2.0;
+
+      double g_maxX1 = boundingBox[0];
+      double g_maxX2 = boundingBox[1]/2.0;
+      double g_maxX3 = boundingBox[2]/2.0;
+
+      double blockLength = 3.0 * deltax;
+
+      double h = (g_maxX2) / 2.0;
+      double dex = g_maxX1;
+
+      //LBMReal tau0 = 1.2e-7;
+      //LBMReal k = nuLB;
+      //LBMReal n = 0.4;
+
+
+      double d = boundingBox[1];
+      double U = velocity;
+      double Gamma = U / d;
+
+      double k = 0.05; // (U * d) / (Re * std::pow(Gamma, n - 1));
+      double tau0 = 1e-6;// Bn* k* std::pow(Gamma, n);
+
+      double beta = 14;
+      double c = 10; // 1.0 / 6.0;
+      double mu0 = 1e-4;
+
+      SPtr<Thixotropy> thix = Thixotropy::getInstance();
+      //Herschel-Bulkley
+      thix->setPowerIndex(n);
+      thix->setViscosityParameter(k);
+      thix->setYieldStress(tau0);
+      //Powell-Eyring
+      thix->setBeta(beta);
+      thix->setC(c);
+      thix->setMu0(mu0);
+
+      SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
+      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new HerschelBulkleyModelNoSlipBCAlgorithm()));
+      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new PowellEyringModelNoSlipBCAlgorithm()));
+      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new BinghamModelNoSlipBCAlgorithm()));
+
+      //BS visitor
+      BoundaryConditionsBlockVisitor bcVisitor;
+      bcVisitor.addBC(noSlipBCAdapter);
+
+      SPtr<BCProcessor> bcProc;
+      bcProc = SPtr<BCProcessor>(new BCProcessor());
+      //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new PowellEyringModelLBMKernel());
+      //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel());
+      //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyK17LBMKernel());
+      SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel());
+      kernel->setForcingX1(forcing);
+      kernel->setWithForcing(true);
+      kernel->setBCProcessor(bcProc);
+
+
+      SPtr<Grid3D> grid(new Grid3D(comm));
+      grid->setPeriodicX1(true);
+      grid->setPeriodicX2(false);
+      grid->setPeriodicX3(true);
+      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(), pathname + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance());
+
+
+      GenBlocksGridVisitor genBlocks(gridCube);
+      grid->accept(genBlocks);
+
+      if (myid == 0)
+      {
+         UBLOG(logINFO, "Parameters:");
+         UBLOG(logINFO, "forcing = " << forcing);
+         UBLOG(logINFO, "rho = " << rhoLB);
+         //UBLOG(logINFO, "nu = " << nuLB);
+         UBLOG(logINFO, "U = " << U);
+         UBLOG(logINFO, "Re = " << (U * d) / (k * std::pow(Gamma, n - 1)));
+         UBLOG(logINFO, "Bn = " << tau0 / (k * std::pow(Gamma, n)));
+         UBLOG(logINFO, "k = " << k);
+         UBLOG(logINFO, "n = " << n);
+         UBLOG(logINFO, "tau0 = " << tau0);
+         UBLOG(logINFO, "deltax = " << deltax);
+         //UBLOG(logINFO, "number of levels = " << refineLevel + 1);
+         UBLOG(logINFO, "numOfThreads = " << numOfThreads);
+         UBLOG(logINFO, "Preprozess - start");
+      }
+
+      //walls
+      //GbCuboid3DPtr addWallZmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_minX3));
+      //if (myid == 0) GbSystem3D::writeGeoObject(addWallZmin.get(), pathname + "/geo/addWallZmin", WbWriterVtkXmlASCII::getInstance());
+
+      //GbCuboid3DPtr addWallZmax(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_maxX3, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength));
+      //if (myid == 0) GbSystem3D::writeGeoObject(addWallZmax.get(), pathname + "/geo/addWallZmax", WbWriterVtkXmlASCII::getInstance());
+
+      GbCuboid3DPtr addWallYmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_minX2, g_maxX3 + blockLength));
+      if (myid == 0) GbSystem3D::writeGeoObject(addWallYmin.get(), pathname + "/geo/addWallYmin", WbWriterVtkXmlASCII::getInstance());
+
+      GbCuboid3DPtr addWallYmax(new GbCuboid3D(g_minX1 - blockLength, g_maxX2, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength));
+      if (myid == 0) GbSystem3D::writeGeoObject(addWallYmax.get(), pathname + "/geo/addWallYmax", WbWriterVtkXmlASCII::getInstance());
+
+      //wall interactors
+      //SPtr<D3Q27Interactor> addWallZminInt(new D3Q27Interactor(addWallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+      //SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID));
+
+      SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID));
+      SPtr<D3Q27Interactor> addWallYmaxInt(new D3Q27Interactor(addWallYmax, grid, noSlipBCAdapter, 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(addWallZminInt);
+      //intHelper.addInteractor(addWallZmaxInt);
+      intHelper.addInteractor(addWallYminInt);
+      intHelper.addInteractor(addWallYmaxInt);
+      intHelper.selectBlocks();
+      if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end");
+      //////////////////////////////////////
+
+      SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, 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");
+
+
+      //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, pathname, WbWriterVtkXmlBinary::getInstance(), comm);
+      ppgeo.process(1);
+
+      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<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname,
+         WbWriterVtkXmlASCII::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+
+      SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
+
+      SPtr<UbScheduler> stepGhostLayer(new UbScheduler(outTime));
+      SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
+      calculator->addCoProcessor(npr);
+      calculator->addCoProcessor(writeMQCoProcessor);
+      calculator->addCoProcessor(writeThixotropicMQCoProcessor);
+      //calculator->addCoProcessor(migCoProcessor);
+      //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/apps/cpu/HerschelBulkleyModel/hbf1.cfg b/apps/cpu/HerschelBulkleyModel/hbf1.cfg
index 830fe2ae9..2cf4375f0 100644
--- a/apps/cpu/HerschelBulkleyModel/hbf1.cfg
+++ b/apps/cpu/HerschelBulkleyModel/hbf1.cfg
@@ -1,4 +1,4 @@
-pathname = d:/temp/Herschel-BulkleyConvergenceStudy/HerschelBulkley32_n_0.4_Re_1_Bn_0.01_K15
+pathname = d:/temp/BinghamNewOmegaTest
 
 numOfThreads = 4
 availMem = 8e9
@@ -28,5 +28,5 @@ n = 0.4
 Re = 1
 Bn = 0.01
 
-outTime = 100000
-endTime = 50000000
\ No newline at end of file
+outTime = 1000
+endTime = 30000
\ No newline at end of file
diff --git a/apps/cpu/HerschelBulkleyModel/hbflow.cpp b/apps/cpu/HerschelBulkleyModel/hbflow.cpp
index 0e5897fa6..bd4879c96 100644
--- a/apps/cpu/HerschelBulkleyModel/hbflow.cpp
+++ b/apps/cpu/HerschelBulkleyModel/hbflow.cpp
@@ -93,8 +93,8 @@ void bflow(string configname)
       double U = velocity;
       double Gamma = U / d;
 
-      double k = (U * d) / (Re * std::pow(Gamma, n - 1));
-      double tau0 = 0;// 1e-12;// Bn* k* std::pow(Gamma, n);
+      double k = 0.05; // (U * d) / (Re * std::pow(Gamma, n - 1));
+      double tau0 = 3e-6;// Bn* k* std::pow(Gamma, n);
 
       double beta = 14;
       double c = 10; // 1.0 / 6.0;
@@ -111,8 +111,9 @@ void bflow(string configname)
       thix->setMu0(mu0);
 
       SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new HerschelBulkleyModelNoSlipBCAlgorithm()));
+      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new HerschelBulkleyModelNoSlipBCAlgorithm()));
       //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new PowellEyringModelNoSlipBCAlgorithm()));
+      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new BinghamModelNoSlipBCAlgorithm()));
 
       //BS visitor
       BoundaryConditionsBlockVisitor bcVisitor;
@@ -121,8 +122,9 @@ void bflow(string configname)
       SPtr<BCProcessor> bcProc;
       bcProc = SPtr<BCProcessor>(new BCProcessor());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new PowellEyringModelLBMKernel());
-      SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel());
+      //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyK17LBMKernel());
+      SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel());
       kernel->setForcingX1(forcing);
       kernel->setWithForcing(true);
       kernel->setBCProcessor(bcProc);
diff --git a/apps/cpu/rheometer/rheometer.cfg b/apps/cpu/rheometer/rheometer.cfg
index 5f95613e5..530ece5ff 100644
--- a/apps/cpu/rheometer/rheometer.cfg
+++ b/apps/cpu/rheometer/rheometer.cfg
@@ -1,20 +1,29 @@
-outputPath = d:/temp/rheometer
+outputPath = d:/temp/rheometer/rheometerBingham128_8_test_New_Omega
 
 numOfThreads = 4
 availMem = 8e9
 logToFile = false
 
-blocknx = 8 8 2
-boundingBox = 32 32 2
+blocknx = 8 8 1
+boundingBox = 128 128 1
 deltax = 1
 
+#boundingBox = 0.02 0.02 0.00125
+#deltax = 0.000625
+
 refineLevel = 0
 
 radius = 5
 sphereCenter = 25 25 25
 
-velocity = 1e-3
-n = 0.3
+#R0=0.02 #m
+#Ri=0.0075 #m
+
+uLB = 8e-4
+N = 20 #rpm
+
+
+n = 1
 Re = 10
 Bn = 0.01
 
@@ -25,5 +34,5 @@ restartStep = 100000
 cpStart = 100000
 cpStep = 100000
 
-outTime = 1000
-endTime = 100000
\ No newline at end of file
+outTime = 10000
+endTime = 1600000
\ No newline at end of file
diff --git a/apps/cpu/rheometer/rheometer.cpp b/apps/cpu/rheometer/rheometer.cpp
index 69de586fb..2cafcc7d3 100644
--- a/apps/cpu/rheometer/rheometer.cpp
+++ b/apps/cpu/rheometer/rheometer.cpp
@@ -29,10 +29,11 @@ void bflow(string configname)
       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          uLB = config.getValue<double>("uLB");
       double          n = config.getValue<double>("n");
       double          Re = config.getValue<double>("Re");
       double          Bn = config.getValue<double>("Bn");
+      double          N = config.getValue<double>("N");
       vector<double>  sphereCenter = config.getVector<double>("sphereCenter");
 
       SPtr<Communicator> comm = MPICommunicator::getInstance();
@@ -58,7 +59,13 @@ void bflow(string configname)
 
       LBMReal rhoLB = 0.0;
 
-      SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter());
+      //SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter());
+      double uWorld = (N * PI) / 30.0; //0.0037699111843
+      double rhoWorld = 2350.0; //kg/m^3
+      double R0 = boundingBox[0] * 0.5;
+
+      SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter(deltax, uWorld*R0, rhoWorld, 1.0, uLB));
+      UBLOG(logINFO, conv->toString());
 
       //bounding box
 
@@ -81,13 +88,15 @@ void bflow(string configname)
       double blockLength = 3.0 * deltax;
 
       double d = 2.0 * radius;
-      double U = velocity;
+      double U = uLB;
       double Gamma = U / d;
 
-      double k = (U * d) / (Re);
+      double muWorld = 20; //Pa*s
+      double k = 0.0015; // muWorld / rhoWorld * conv->getFactorViscosityWToLb(); //(U * d) / (Re);
 
       //double k = (U * d) / (Re * std::pow(Gamma, n - 1));
-      double tau0 = Bn * k * std::pow(Gamma, n);
+      double yielStressWorld = 20; //Pa
+      double tau0 = 1e-6;// 3e-6;//yielStressWorld * conv->getFactorPressureWToLb(); //Bn * k * std::pow(Gamma, n);
 
       //double k = 0.05; // (U * d) / (Re * std::pow(Gamma, n - 1));
       //double tau0 = 3e-6; //Bn * k * std::pow(Gamma, n);
@@ -103,27 +112,31 @@ void bflow(string configname)
       thix->setOmegaMin(omegaMin);
 
       SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter());
-      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
+      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm()));
       //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new HerschelBulkleyModelNoSlipBCAlgorithm()));
-      //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new BinghamModelNoSlipBCAlgorithm()));
+      noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new BinghamModelNoSlipBCAlgorithm()));
 
       //SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter());
       //slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleSlipBCAlgorithm()));
 
       mu::Parser fctVx;
-      fctVx.SetExpr("omega*(r-x2)");
-      fctVx.DefineConst("omega", velocity);
+      //fctVx.SetExpr("omega*(r-x2)");
+      fctVx.SetExpr("-Omega*(x2-r)");
+      fctVx.DefineConst("Omega", uLB);
+      //fctVx.DefineConst("r", R0);
       fctVx.DefineConst("r", g_maxX1*0.5);
 
       mu::Parser fctVy;
-      fctVy.SetExpr("omega*(x1-k)");
-      fctVy.DefineConst("omega", velocity);
-      fctVy.DefineConst("k", g_maxX1 * 0.5);
+      fctVy.SetExpr("Omega*(x1-r)");
+      fctVy.DefineConst("Omega", uLB);
+      //fctVy.DefineConst("r", R0);
+      fctVy.DefineConst("r", g_maxX2 * 0.5);
 
       mu::Parser fctVz;
       fctVz.SetExpr("0.0");
 
       SPtr<BCAdapter> velocityBCAdapter(new VelocityBCAdapter(true, true, true, fctVx, fctVy, fctVz, 0, BCFunction::INFCONST));
+      //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm()));
       velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm()));
       //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm()));
 
@@ -142,11 +155,11 @@ void bflow(string configname)
       SPtr<BCProcessor> bcProc;
       bcProc = SPtr<BCProcessor>(new BCProcessor());
 
-      SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantLBMKernel());
+      //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CompressibleCumulant4thOrderViscosityLBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyK17LBMKernel());
       //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel());
-      //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel());
+      SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel());
       kernel->setBCProcessor(bcProc);
       //kernel->setForcingX1(forcing);
       //kernel->setWithForcing(true);
@@ -175,6 +188,18 @@ void bflow(string configname)
       //restartCoProcessor->setNu(k);
       //////////////////////////////////////////////////////////////////////////
 
+      ////stator
+      SPtr<GbObject3D> stator(new GbCylinder3D(0.5 * g_maxX1, 0.5 * g_maxX2, g_minX3-2.0*deltax, 0.5 * g_maxX1, 0.5 * g_maxX2, g_maxX3+ 2.0 * deltax, 0.5 * g_maxX1));
+      GbSystem3D::writeGeoObject(stator.get(), outputPath + "/geo/stator", WbWriterVtkXmlBinary::getInstance());
+
+      SPtr<D3Q27Interactor> statorInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(stator, grid, velocityBCAdapter, Interactor3D::INVERSESOLID));
+
+      ////rotor (cylinder)
+      SPtr<GbObject3D> rotor(new GbCylinder3D(0.5 * g_maxX1, 0.5 * g_maxX2, g_minX3- 2.0 * deltax, 0.5 * g_maxX1, 0.5 * g_maxX2, g_maxX3+ 2.0 * deltax, 0.25 * g_maxX1));
+      GbSystem3D::writeGeoObject(rotor.get(), outputPath + "/geo/rotor", WbWriterVtkXmlBinary::getInstance());
+
+      SPtr<D3Q27Interactor> rotorInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(rotor, grid, noSlipBCAdapter, Interactor3D::SOLID));
+
       if (myid == 0)
       {
          UBLOG(logINFO, "Parameters:");
@@ -215,17 +240,6 @@ void bflow(string configname)
             if (myid == 0) UBLOG(logINFO, "Refinement - end");
          }
 
-         ////stator
-         SPtr<GbObject3D> stator(new GbCylinder3D(0.5*g_maxX1, 0.5 * g_maxX2, g_minX3-deltax, 0.5 * g_maxX1, 0.5 * g_maxX2, g_maxX3+deltax, 0.5 * g_maxX1));
-         GbSystem3D::writeGeoObject(stator.get(), outputPath + "/geo/stator", WbWriterVtkXmlBinary::getInstance());
-
-         SPtr<D3Q27Interactor> statorInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(stator, grid, velocityBCAdapter, Interactor3D::INVERSESOLID));
-
-         ////rotor (cylinder)
-         SPtr<GbObject3D> rotor(new GbCylinder3D(0.5 * g_maxX1, 0.5 * g_maxX2, g_minX3 - deltax, 0.5 * g_maxX1, 0.5 * g_maxX2, g_maxX3 + deltax, 0.25 * g_maxX1));
-         GbSystem3D::writeGeoObject(rotor.get(), outputPath + "/geo/rotor", WbWriterVtkXmlBinary::getInstance());
-
-         SPtr<D3Q27Interactor> rotorInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(rotor, grid, velocityBCAdapter, Interactor3D::SOLID));
 
          //walls
          GbCuboid3DPtr wallZmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_minX3));
@@ -326,9 +340,12 @@ void bflow(string configname)
       {
          restartCoProcessor->restart((int)restartStep);
          grid->setTimeStep(restartStep);
-         //SetBcBlocksBlockVisitor v(sphereInt);
-         //grid->accept(v);
-         //sphereInt->initInteractor();
+         SetBcBlocksBlockVisitor v1(rotorInt);
+         grid->accept(v1);
+         rotorInt->initInteractor();
+         SetBcBlocksBlockVisitor v2(statorInt);
+         grid->accept(v2);
+         statorInt->initInteractor();
       }
       
       omp_set_num_threads(numOfThreads);
@@ -354,19 +371,21 @@ void bflow(string configname)
       SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
       //writeMQCoProcessor->process(0);
 
-      //double area = UbMath::PI*radius*radius;
-      //SPtr<UbScheduler> forceSch(new UbScheduler(100));
-      //SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, outputPath + "/forces/forces.txt", comm, velocity, area);
-      //fp->addInteractor(sphereInt);
+      SPtr<UbScheduler> forceSch(new UbScheduler(100));
+      SPtr<CalculateTorqueCoProcessor> fp = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueRotor.txt", comm);
+      fp->addInteractor(rotorInt);
+      SPtr<CalculateTorqueCoProcessor> fp2 = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueStator.txt", comm);
+      fp2->addInteractor(statorInt);
 
       SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm));
 
       SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1));
       SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime));
       calculator->addCoProcessor(npr);
-      //calculator->addCoProcessor(fp);
+      calculator->addCoProcessor(fp);
+      calculator->addCoProcessor(fp2);
       calculator->addCoProcessor(writeMQCoProcessor);
-      //calculator->addCoProcessor(writeThixotropicMQCoProcessor);
+      calculator->addCoProcessor(writeThixotropicMQCoProcessor);
       calculator->addCoProcessor(restartCoProcessor);
 
       if (myid == 0) UBLOG(logINFO, "Simulation-start");
diff --git a/src/cpu/VirtualFluids.h b/src/cpu/VirtualFluids.h
index 77a8a551e..e02a5cdf1 100644
--- a/src/cpu/VirtualFluids.h
+++ b/src/cpu/VirtualFluids.h
@@ -168,7 +168,9 @@
 
 #include <CoProcessors/AdjustForcingCoProcessor.h>
 #include <CoProcessors/CalculateForcesCoProcessor.h>
-#include <CoProcessors/WriteBlocksCoProcessor.h>
+#include <CoProcessors/CalculateTorqueCoProcessor.h>
+#include <CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h>
+#include <CoProcessors/WriteMQFromSelectionCoProcessor.h>
 #include <CoProcessors/WriteBoundaryConditionsCoProcessor.h>
 #include <CoProcessors/WriteMQFromSelectionCoProcessor.h>
 #include <CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h>
@@ -221,6 +223,7 @@
 #include <LBM/ThixotropyExpLBMKernel.h>
 #include <LBM/CumulantLBMKernel.h>
 #include <LBM/ThixotropyModelLBMKernel.h>
+#include <LBM/ThixotropyModelLBMKernel2.h>
 #include <LBM/BinghamModelLBMKernel.h>
 #include <LBM/HerschelBulkleyModelLBMKernel.h>
 #include <LBM/ThixotropyInterpolationProcessor.h>
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp
new file mode 100644
index 000000000..af7533ef5
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp
@@ -0,0 +1,255 @@
+#include "CalculateTorqueCoProcessor.h"
+#include "BCProcessor.h"
+
+#include "Communicator.h"
+#include "D3Q27Interactor.h"
+#include "UbScheduler.h"
+#include "Grid3D.h"
+#include "BoundaryConditions.h"
+#include "DataSet3D.h"
+#include "Block3D.h"
+#include "LBMKernel.h"
+#include "BCArray3D.h"
+#include "EsoTwist3D.h"
+#include "DistributionArray3D.h"
+
+CalculateTorqueCoProcessor::CalculateTorqueCoProcessor( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, SPtr<Communicator> comm) : CoProcessor(grid, s), path(path), comm(comm), forceX1global(0), forceX2global(0), forceX3global(0)
+{
+   if (comm->getProcessID() == comm->getRoot())
+   {
+      std::ofstream ostr;
+      std::string fname = path;
+      ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);
+      if(!ostr)
+      { 
+         ostr.clear();
+         std::string path = UbSystem::getPathFromString(fname);
+         if(path.size()>0){ UbSystem::makeDirectory(path); ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);}
+         if(!ostr) throw UbException(UB_EXARGS,"couldn't open file "+fname);
+      }
+      ostr.width(12);
+      ostr << "step" << "\t";
+      ostr.width(10); 
+      ostr << "Tx" << "\t";
+      ostr.width(18); 
+      ostr << "Ty" << "\t";
+      ostr.width(18);
+      ostr << "Tz" << std::endl;
+      ostr.close();
+   }
+}
+//////////////////////////////////////////////////////////////////////////
+CalculateTorqueCoProcessor::~CalculateTorqueCoProcessor()
+{
+
+}
+//////////////////////////////////////////////////////////////////////////
+void CalculateTorqueCoProcessor::process( double step )
+{
+   if(scheduler->isDue(step) )
+      collectData(step);
+
+   UBLOG(logDEBUG3, "D3Q27ForcesCoProcessor::update:" << step);
+}
+//////////////////////////////////////////////////////////////////////////
+void CalculateTorqueCoProcessor::collectData( double step )
+{
+   calculateForces();
+
+   if (comm->getProcessID() == comm->getRoot())
+   {
+      int istep = static_cast<int>(step);
+      std::ofstream ostr;
+      std::string fname = path;
+      ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);
+      if(!ostr)
+      { 
+         ostr.clear();
+         std::string path = UbSystem::getPathFromString(fname);
+         if(path.size()>0){ UbSystem::makeDirectory(path); ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);}
+         if(!ostr) throw UbException(UB_EXARGS,"couldn't open file "+fname);
+      }
+
+      ostr.width(12); 
+      ostr.setf(std::ios::fixed); 
+      ostr << istep << "\t";
+      write(&ostr, forceX1global, (char*)"\t");
+      write(&ostr, forceX2global, (char*)"\t");
+      write(&ostr, forceX3global, (char*)"\t");
+      ostr << std::endl;
+      ostr.close();
+   }
+}
+//////////////////////////////////////////////////////////////////////////
+void CalculateTorqueCoProcessor::calculateForces()
+{
+   forceX1global = 0.0;
+   forceX2global = 0.0;
+   forceX3global = 0.0;
+   int counter = 0;
+
+   for(SPtr<D3Q27Interactor> interactor : interactors)
+   {
+      double x1Centre = interactor->getGbObject3D()->getX1Centroid();
+      double x2Centre = interactor->getGbObject3D()->getX2Centroid();
+      double x3Centre = interactor->getGbObject3D()->getX3Centroid();
+
+      for(BcNodeIndicesMap::value_type t : interactor->getBcNodeIndicesMap())
+      {
+         double torqueX1 = 0.0;
+         double torqueX2 = 0.0;
+         double torqueX3 = 0.0;
+
+         SPtr<Block3D> block = t.first;
+         std::set< std::vector<int> >& transNodeIndicesSet = t.second;
+
+         SPtr<ILBMKernel> kernel = block->getKernel();
+
+         if (kernel->getCompressible())
+         {
+            calcMacrosFct = &D3Q27System::calcCompMacroscopicValues;
+            compressibleFactor = 1.0;
+         }
+         else
+         {
+            calcMacrosFct = &D3Q27System::calcIncompMacroscopicValues;
+            compressibleFactor = 0.0;
+         }
+
+         SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray();          
+         SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); 
+         distributions->swap();
+
+         int ghostLayerWidth = kernel->getGhostLayerWidth();
+         int minX1 = ghostLayerWidth;
+         int maxX1 = (int)bcArray->getNX1() - 1 - ghostLayerWidth;
+         int minX2 = ghostLayerWidth;
+         int maxX2 = (int)bcArray->getNX2() - 1 - ghostLayerWidth;
+         int minX3 = ghostLayerWidth;
+         int maxX3 = (int)bcArray->getNX3() - 1 - ghostLayerWidth;
+
+         for(std::vector<int> node : transNodeIndicesSet)
+         {
+            int x1 = node[0];
+            int x2 = node[1];
+            int x3 = node[2];
+
+            Vector3D worldCoordinates = grid->getNodeCoordinates(block, x1, x2, x3);
+
+            //without ghost nodes
+            if (x1 < minX1 || x1 > maxX1 || x2 < minX2 || x2 > maxX2 ||x3 < minX3 || x3 > maxX3 ) continue;
+
+            if(bcArray->isFluid(x1,x2,x3)) //es kann sein, dass der node von einem anderen interactor z.B. als solid gemarkt wurde!!!
+            {
+               SPtr<BoundaryConditions> bc = bcArray->getBC(x1,x2,x3);
+               UbTupleDouble3 forceVec = getForces(x1,x2,x3,distributions,bc);
+               torqueX1 += (worldCoordinates[1] - x2Centre) * val<3>(forceVec) - (worldCoordinates[2] - x3Centre) * val<2>(forceVec);
+               torqueX2 += (worldCoordinates[2] - x3Centre) * val<1>(forceVec) - (worldCoordinates[0] - x1Centre) * val<3>(forceVec);
+               torqueX3 += (worldCoordinates[0] - x1Centre) * val<2>(forceVec) - (worldCoordinates[1] - x2Centre) * val<1>(forceVec);
+               //counter++;
+               //UBLOG(logINFO, "x1="<<(worldCoordinates[1] - x2Centre)<<",x2=" << (worldCoordinates[2] - x3Centre)<< ",x3=" << (worldCoordinates[0] - x1Centre) <<" forceX3 = " << forceX3);
+            }
+         }
+         //if we have got discretization with more level
+         // deltaX is LBM deltaX and equal LBM deltaT 
+         double deltaX = LBMSystem::getDeltaT(block->getLevel()); //grid->getDeltaT(block);
+         double deltaXquadrat = deltaX*deltaX;
+         torqueX1 *= deltaXquadrat;
+         torqueX2 *= deltaXquadrat;
+         torqueX3 *= deltaXquadrat;
+
+         distributions->swap();
+
+         forceX1global += torqueX1;
+         forceX2global += torqueX2;
+         forceX3global += torqueX3;
+
+         //UBLOG(logINFO, "forceX3global = " << forceX3global);
+      }
+   }
+   std::vector<double> values;
+   std::vector<double> rvalues;
+   values.push_back(forceX1global);
+   values.push_back(forceX2global);
+   values.push_back(forceX3global);
+
+   rvalues = comm->gather(values);
+   if (comm->getProcessID() == comm->getRoot())
+   {
+      forceX1global = 0.0;
+      forceX2global = 0.0;
+      forceX3global = 0.0;
+      
+      for (int i = 0; i < (int)rvalues.size(); i+=3)
+      {
+         forceX1global += rvalues[i];
+         forceX2global += rvalues[i+1];
+         forceX3global += rvalues[i+2];
+      }
+   }
+}
+//////////////////////////////////////////////////////////////////////////
+UbTupleDouble3 CalculateTorqueCoProcessor::getForces(int x1, int x2, int x3,  SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc)
+{
+   UbTupleDouble3 force(0.0,0.0,0.0);
+
+   LBMReal fs[D3Q27System::ENDF + 1];
+   distributions->getDistributionInv(fs, x1, x2, x3);
+   LBMReal rho = 0.0, vx1 = 0.0, vx2 = 0.0, vx3 = 0.0, drho = 0.0;
+   calcMacrosFct(fs, drho, vx1, vx2, vx3);
+   rho = 1.0 + drho * compressibleFactor;
+   
+   if(bc)
+   {
+      //references to tuple "force"
+      double& forceX1 = val<1>(force);
+      double& forceX2 = val<2>(force);
+      double& forceX3 = val<3>(force);
+      double f,  fnbr;
+
+      for(int fdir=D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++)
+      {
+         if(bc->hasNoSlipBoundaryFlag(fdir) || bc->hasVelocityBoundaryFlag(fdir))
+         {
+            const int invDir = D3Q27System::INVDIR[fdir];
+            f = dynamicPointerCast<EsoTwist3D>(distributions)->getDistributionInvForDirection(x1, x2, x3, invDir);
+            fnbr = dynamicPointerCast<EsoTwist3D>(distributions)->getDistributionInvForDirection(x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir);
+
+            Vector3D boundaryVelocity;
+            boundaryVelocity[0] = bc->getBoundaryVelocityX1();
+            boundaryVelocity[1] = bc->getBoundaryVelocityX2();
+            boundaryVelocity[2] = bc->getBoundaryVelocityX3();
+            double correction[3] = { 0.0, 0.0, 0.0 };
+            if (bc->hasVelocityBoundaryFlag(fdir))
+            {
+               const double forceTerm = f - fnbr;
+               correction[0] = forceTerm * boundaryVelocity[0];
+               correction[1] = forceTerm * boundaryVelocity[1];
+               correction[2] = forceTerm * boundaryVelocity[2];
+            }
+
+            forceX1 += (f + fnbr) * D3Q27System::DX1[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[0];
+            forceX2 += (f + fnbr) * D3Q27System::DX2[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[1];
+            forceX3 += (f + fnbr) * D3Q27System::DX3[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[2];
+         }
+      }
+   }
+   
+   return force;
+}
+//////////////////////////////////////////////////////////////////////////
+void CalculateTorqueCoProcessor::addInteractor( SPtr<D3Q27Interactor> interactor )
+{
+   interactors.push_back(interactor);
+}
+//////////////////////////////////////////////////////////////////////////
+void CalculateTorqueCoProcessor::write(std::ofstream *fileObject, double value, char *separator) 
+{ 
+   (*fileObject).width(12); 
+   (*fileObject).precision(16); 
+   (*fileObject).setf(std::ios::fixed); 
+   (*fileObject) << value; 
+   (*fileObject) << separator; 
+} 
+
+
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h
new file mode 100644
index 000000000..2eda4a063
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h
@@ -0,0 +1,54 @@
+/*
+ *  D3Q27ForcesCoProcessor.h
+ *
+ *  Created on: 29.09.2012
+ *  Author: K. Kucher
+ */
+
+#ifndef CalculateTorqueCoProcessor_H
+#define CalculateTorqueCoProcessor_H
+
+#include <PointerDefinitions.h>
+#include <string>
+#include <vector>
+
+#include "CoProcessor.h"
+#include "UbTuple.h"
+#include "D3Q27System.h"
+
+class ForceCalculator;
+class Communicator;
+class Grid3D;
+class UbScheduler;
+class D3Q27Interactor;
+class DistributionArray3D;
+class BoundaryConditions;
+
+class CalculateTorqueCoProcessor: public CoProcessor 
+{
+public:
+   //! Constructor
+   CalculateTorqueCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, SPtr<Communicator> comm);
+	virtual ~CalculateTorqueCoProcessor();             
+	void process(double step); 
+   void addInteractor(SPtr<D3Q27Interactor> interactor);
+protected:
+	void collectData(double step);
+   void calculateForces();
+   UbTupleDouble3 getForces(int x1, int x2, int x3, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc);
+   void write(std::ofstream *fileObject, double value, char *separator);
+private:
+   std::string path;
+   SPtr<Communicator> comm;
+   std::vector<SPtr<D3Q27Interactor> > interactors;
+   double forceX1global;
+   double forceX2global;
+   double forceX3global;
+
+   typedef void(*CalcMacrosFct)(const LBMReal* const& /*f[27]*/, LBMReal& /*rho*/, LBMReal& /*vx1*/, LBMReal& /*vx2*/, LBMReal& /*vx3*/);
+   CalcMacrosFct    calcMacrosFct;
+   LBMReal compressibleFactor;
+};
+
+
+#endif /* D3Q27ForcesCoProcessor_H */
diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp
index fe5f31788..72e7114e6 100644
--- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp
+++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp
@@ -123,7 +123,7 @@ void WriteThixotropyQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
 	datanames.push_back("viscosity");
 	//datanames.push_back("lambda");
 	//datanames.push_back("ShearRate");
-	//datanames.push_back("collFactor");
+	datanames.push_back("omega");
 	//datanames.push_back("Fluxx");
 	//datanames.push_back("Fluxy");
 	//datanames.push_back("Fluxz");
@@ -200,11 +200,13 @@ void WriteThixotropyQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
 					//distributionsF->getDistribution(f, ix1, ix2, ix3);
 					//LBMReal rho = D3Q27System::getDensity(f);
 					
-					//gammaDot = BinghamModel::getShearRate(f, collFactor);
+					//LBMReal gammaDot = D3Q27System::getShearRate(f, collFactor);
 
 					//LBMReal collFactorF = collFactor - 1e-6 / (gammaDot + one * 1e-9);
 					//collFactorF = (collFactorF < 0.5) ? 0.5 : collFactorF;
 
+					//LBMReal collFactorF = Thixotropy::getBinghamCollFactor(collFactor, gammaDot, rho);
+
 					//data[index++].push_back(lambda);
 					//data[index++].push_back(gammaDot);
 					//data[index++].push_back(collFactorF);
@@ -213,10 +215,13 @@ void WriteThixotropyQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block)
 					LBMReal rho = D3Q27System::getDensity(f);
 					LBMReal shearRate = D3Q27System::getShearRate(f, collFactor);
 					//LBMReal omega = Thixotropy::getHerschelBulkleyCollFactor(collFactor, shearRate, rho);
-					LBMReal omega = Thixotropy::getPowellEyringCollFactor(collFactor, shearRate, rho);
+					//LBMReal omega = Thixotropy::getPowellEyringCollFactor(collFactor, shearRate, rho);
+					LBMReal omega = Thixotropy::getBinghamCollFactor(collFactor, shearRate, rho);
 					LBMReal viscosity = (omega == 0) ? 0 : c1o3 * (c1/omega-c1o2);
 
+					
 					data[index++].push_back(viscosity);
+					data[index++].push_back(omega);
 				}
 			}
 		}
diff --git a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
index d94a7f37d..d240ed8ef 100644
--- a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
+++ b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h
@@ -1171,6 +1171,8 @@ usage: ...
          LBMReal Dxz = -three * collFactorF * mfbab;
          LBMReal Dyz = -three * collFactorF * mfabb;
 
+         
+         //TODO: may be factor 2
          return sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one);
       }
    }
diff --git a/src/cpu/VirtualFluidsCore/LBM/Thixotropy.h b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.h
index b731337e6..50caabbe8 100644
--- a/src/cpu/VirtualFluidsCore/LBM/Thixotropy.h
+++ b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.h
@@ -33,6 +33,7 @@ public:
 	void setMu0(LBMReal mu);
 	LBMReal getMu0() const;
 
+	static LBMReal getBinghamCollFactorOld(LBMReal omegaInf, LBMReal shearRate, LBMReal drho);
 	static LBMReal getBinghamCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho);
 	static LBMReal getHerschelBulkleyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho);
 	static LBMReal getHerschelBulkleyCollFactorBackward(LBMReal shearRate, LBMReal drho);
@@ -56,9 +57,42 @@ inline LBMReal Thixotropy::getBinghamCollFactor(LBMReal omegaInf, LBMReal shearR
 {
 	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()));
+	//LBMReal omega = omegaInf * (UbMath::one - (omegaInf * tau0) / (shearRate * cs2 * rho + UbMath::Epsilon<LBMReal>::val()));
+	
+	//LBMReal omega = cs2 * cs2 * shearRate * shearRate * omegaInf * rho * rho / (cs2 * cs2 * shearRate * shearRate * rho * rho + cs2 * shearRate * omegaInf * rho * tau0+omegaInf*omegaInf*tau0*tau0);
+	
+	LBMReal a = omegaInf * tau0 / (cs2 * shearRate * rho);
+	//10 iterations
+	//LBMReal omega = omegaInf / (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a))))))))));
+	
+	//20 iterations
+	LBMReal omega = omegaInf / (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a))))))))))))))))))));
+	
+	//LBMReal omega = omegaInf*cs2 * shearRate * rho / (cs2 * shearRate * rho + omegaInf * tau0);
+	//LBMReal shearRateNew = shearRate * (omega / omegaInf);
+
+	//for (int i = 0; i < 20; i++)
+	//{
+	//	omega = omegaInf * cs2 * shearRateNew * rho / (cs2 * shearRateNew * rho + omegaInf * tau0);
+	//	shearRateNew = shearRate * (omega / omegaInf);
+	//}
+	//omega = omegaInf * cs2 * shearRateNew * rho / (cs2 * shearRateNew * rho + omegaInf * tau0);
+	
+	//if (omega < 0.2)
+	//	omega = 0.2;
 	return omega;
 }
+
+inline LBMReal Thixotropy::getBinghamCollFactorOld(LBMReal omegaInf, LBMReal shearRate, LBMReal drho)
+{
+	const LBMReal cs2 = UbMath::c1o3; // UbMath::one_over_sqrt3* UbMath::one_over_sqrt3;
+	LBMReal rho = UbMath::one + drho;
+
+	if (rho * cs2 * (UbMath::c1 / omegaInf - UbMath::c1o2) * shearRate < tau0)
+		return 0.0;
+	else
+		return omegaInf;
+}
 //////////////////////////////////////////////////////////////////////////
 inline LBMReal Thixotropy::getHerschelBulkleyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho)
 {
diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.cpp b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.cpp
new file mode 100644
index 000000000..cafded555
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.cpp
@@ -0,0 +1,899 @@
+#include "ThixotropyModelLBMKernel2.h"
+#include "D3Q27System.h"
+#include "BCArray3D.h"
+#include "D3Q27EsoTwist3DSplittedVector.h"
+#include <math.h>
+#include "DataSet3D.h"
+#include "LBMKernel.h"
+
+#define PROOF_CORRECTNESS
+
+ThixotropyModelLBMKernel2::ThixotropyModelLBMKernel2() : forcingX1(0), forcingX2(0), forcingX3(0)
+{
+   compressible = false;
+	OxyyMxzz = 1.0;
+}
+
+ThixotropyModelLBMKernel2::~ThixotropyModelLBMKernel2()
+{
+}
+
+void ThixotropyModelLBMKernel2::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);
+						
+						LBMReal collFactorFyy = getThyxotropyCollFactor(collFactorF, std::sqrt(dxux*dxux + dyuy*dyuy) / (rho + one), rho);
+						mxxMyy += collFactorFyy * (-mxxMyy) - 3. * (1. - c1o2 * collFactorFyy) * (vx2 * dxux - vy2 * dyuy);
+						
+						LBMReal collFactorFzz = getThyxotropyCollFactor(collFactorF, std::sqrt(dxux*dxux + dzuz*dzuz) / (rho + one), rho);
+						mxxMzz += collFactorFzz * (-mxxMzz) - 3. * (1. - c1o2 * collFactorFzz) * (vx2 * dxux - vz2 * dzuz);
+
+						mfabb += getThyxotropyCollFactor(collFactorF, std::abs(Dyz) / (rho + one), rho) * (-mfabb);
+						mfbab += getThyxotropyCollFactor(collFactorF, std::abs(Dxz) / (rho + one), rho) * (-mfbab);
+						mfbba += getThyxotropyCollFactor(collFactorF, std::abs(Dxy) / (rho + one), rho) * (-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> ThixotropyModelLBMKernel2::clone()
+//{
+//	SPtr<LBMKernel> kernel(new ThixotropyModelLBMKernel2());
+//	kernel->setNX(nx);
+//	kernel->setCollisionFactor(collFactor);
+//	collFactorF = collFactor;
+//	dynamicPointerCast<ThixotropyModelLBMKernel2>(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 ThixotropyModelLBMKernel2::getCalculationTime()
+{
+   return timer.getTotalTime();
+}
+
+void ThixotropyModelLBMKernel2::swapDistributions()
+{
+   LBMKernel::swapDistributions();
+}
+
+void ThixotropyModelLBMKernel2::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/ThixotropyModelLBMKernel2.h b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.h
new file mode 100644
index 000000000..17fa47797
--- /dev/null
+++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.h
@@ -0,0 +1,51 @@
+#ifndef ThixotropyModelLBMKernel2_H
+#define ThixotropyModelLBMKernel2_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 ThixotropyModelLBMKernel2;
+
+//! \brief Base class for model of thixotropy based on K16. Use Template Method design pattern for Implementation of different models. 
+//! \author K. Kutscher, M. Geier
+class ThixotropyModelLBMKernel2 : public LBMKernel
+{
+public:
+	ThixotropyModelLBMKernel2();
+	virtual ~ThixotropyModelLBMKernel2();
+	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
-- 
GitLab