From d688c76da91a315c6a32df1e820d28a732c187b1 Mon Sep 17 00:00:00 2001
From: Timon Habenicht <t.habenicht@tu-bs.de>
Date: Wed, 21 Nov 2018 11:04:43 +0100
Subject: [PATCH] adds Kernel CumulantF32018

---
 .../CumulantF32018/CumulantF32018CompSP27.cu  |  60 ++
 .../CumulantF32018/CumulantF32018CompSP27.h   |  22 +
 .../CumulantF32018CompSP27_Device.cu          | 945 ++++++++++++++++++
 .../CumulantF32018CompSP27_Device.cuh         |  19 +
 .../CumulantF32018/package.include            |   0
 5 files changed, 1046 insertions(+)
 create mode 100644 src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27.cu
 create mode 100644 src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27.h
 create mode 100644 src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27_Device.cu
 create mode 100644 src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27_Device.cuh
 create mode 100644 src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/package.include

diff --git a/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27.cu b/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27.cu
new file mode 100644
index 000000000..545d752f3
--- /dev/null
+++ b/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27.cu
@@ -0,0 +1,60 @@
+#include "CumulantF32018CompSP27.h"
+
+#include "CumulantF32018CompSP27_Device.cuh"
+
+#include "Parameter\Parameter.h"
+
+std::shared_ptr<Kernel> CumulantF32018CompSP27::getNewInstance(std::shared_ptr<Parameter> para, int level)
+{
+	return std::shared_ptr<Kernel>(new CumulantF32018CompSP27(para, level));
+}
+
+void CumulantF32018CompSP27::run()
+{
+	int numberOfThreads = para->getParD(level)->numberofthreads;
+	int size_Mat = para->getParD(level)->size_Mat_SP;
+
+	int Grid = (size_Mat / numberOfThreads) + 1;
+	int Grid1, Grid2;
+	if (Grid>512)
+	{
+		Grid1 = 512;
+		Grid2 = (Grid / Grid1) + 1;
+	}
+	else
+	{
+		Grid1 = 1;
+		Grid2 = Grid;
+	}
+	dim3 grid(Grid1, Grid2);
+	dim3 threads(numberOfThreads, 1, 1);
+
+	LB_Kernel_Cumulant_D3Q27F3_2018 << < grid, threads >> >(	para->getParD(level)->omega,
+																para->getParD(level)->geoSP,
+																para->getParD(level)->neighborX_SP,
+																para->getParD(level)->neighborY_SP,
+																para->getParD(level)->neighborZ_SP,
+																para->getParD(level)->d0SP.f[0],
+																para->getParD(level)->g6.g[0],
+																para->getParD(level)->size_Mat_SP,
+																level,
+																para->getForcesDev(),
+																para->getParD(level)->evenOrOdd);
+	getLastCudaError("LB_Kernel_Cumulant_D3Q27F3 execution failed");
+}
+
+bool CumulantF32018CompSP27::checkParameter()
+{
+	if (para->getUseWale())
+		return false;
+	else if (para->getDiffOn())
+		return false;
+	else
+		return true;
+}
+
+CumulantF32018CompSP27::CumulantF32018CompSP27(std::shared_ptr<Parameter> para, int level)
+{
+	this->para = para;
+	this->level = level;
+}
\ No newline at end of file
diff --git a/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27.h b/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27.h
new file mode 100644
index 000000000..5712559cf
--- /dev/null
+++ b/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27.h
@@ -0,0 +1,22 @@
+#ifndef CUMULANT_F32018_COMP_SP27_H
+#define CUMULANT_F32018_COMP_SP27_H
+
+#include "Kernel\Kernel.h"
+
+#include <memory>
+
+class CumulantF32018CompSP27 : public Kernel
+{
+public:
+	static std::shared_ptr< Kernel> getNewInstance(std::shared_ptr< Parameter> para, int level);
+	void run();
+	bool checkParameter();
+
+private:
+	CumulantF32018CompSP27(std::shared_ptr< Parameter> para, int level);
+	std::shared_ptr< Parameter> para;
+	int level;
+
+};
+
+#endif 
\ No newline at end of file
diff --git a/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27_Device.cu b/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27_Device.cu
new file mode 100644
index 000000000..6f5b42daa
--- /dev/null
+++ b/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27_Device.cu
@@ -0,0 +1,945 @@
+#include "CumulantF32018CompSP27_Device.cuh"
+
+#include "LBM/D3Q27.h"
+#include "math.h"
+#include "GPU/constant.h"
+
+extern "C" __global__ void LB_Kernel_Cumulant_D3Q27F3_2018(real omega,
+	unsigned int* bcMatD,
+	unsigned int* neighborX,
+	unsigned int* neighborY,
+	unsigned int* neighborZ,
+	real* DDStart,
+	real* G6,
+	int size_Mat,
+	int level,
+	real* forces,
+	bool EvenOrOdd)
+{
+	////////////////////////////////////////////////////////////////////////////////
+	const unsigned  x = threadIdx.x;  // Globaler x-Index 
+	const unsigned  y = blockIdx.x;   // Globaler y-Index 
+	const unsigned  z = blockIdx.y;   // Globaler z-Index 
+
+	const unsigned nx = blockDim.x;
+	const unsigned ny = gridDim.x;
+
+	const unsigned k = nx*(ny*z + y) + x;
+	//////////////////////////////////////////////////////////////////////////
+
+	if (k < size_Mat)
+	{
+		////////////////////////////////////////////////////////////////////////////////
+		unsigned int BC;
+		BC = bcMatD[k];
+
+		if ((BC != GEO_SOLID) && (BC != GEO_VOID))
+		{
+			Distributions27 D;
+			if (EvenOrOdd == true)
+			{
+				D.f[dirE] = &DDStart[dirE   *size_Mat];
+				D.f[dirW] = &DDStart[dirW   *size_Mat];
+				D.f[dirN] = &DDStart[dirN   *size_Mat];
+				D.f[dirS] = &DDStart[dirS   *size_Mat];
+				D.f[dirT] = &DDStart[dirT   *size_Mat];
+				D.f[dirB] = &DDStart[dirB   *size_Mat];
+				D.f[dirNE] = &DDStart[dirNE  *size_Mat];
+				D.f[dirSW] = &DDStart[dirSW  *size_Mat];
+				D.f[dirSE] = &DDStart[dirSE  *size_Mat];
+				D.f[dirNW] = &DDStart[dirNW  *size_Mat];
+				D.f[dirTE] = &DDStart[dirTE  *size_Mat];
+				D.f[dirBW] = &DDStart[dirBW  *size_Mat];
+				D.f[dirBE] = &DDStart[dirBE  *size_Mat];
+				D.f[dirTW] = &DDStart[dirTW  *size_Mat];
+				D.f[dirTN] = &DDStart[dirTN  *size_Mat];
+				D.f[dirBS] = &DDStart[dirBS  *size_Mat];
+				D.f[dirBN] = &DDStart[dirBN  *size_Mat];
+				D.f[dirTS] = &DDStart[dirTS  *size_Mat];
+				D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
+				D.f[dirTNE] = &DDStart[dirTNE *size_Mat];
+				D.f[dirTSW] = &DDStart[dirTSW *size_Mat];
+				D.f[dirTSE] = &DDStart[dirTSE *size_Mat];
+				D.f[dirTNW] = &DDStart[dirTNW *size_Mat];
+				D.f[dirBNE] = &DDStart[dirBNE *size_Mat];
+				D.f[dirBSW] = &DDStart[dirBSW *size_Mat];
+				D.f[dirBSE] = &DDStart[dirBSE *size_Mat];
+				D.f[dirBNW] = &DDStart[dirBNW *size_Mat];
+			}
+			else
+			{
+				D.f[dirW] = &DDStart[dirE   *size_Mat];
+				D.f[dirE] = &DDStart[dirW   *size_Mat];
+				D.f[dirS] = &DDStart[dirN   *size_Mat];
+				D.f[dirN] = &DDStart[dirS   *size_Mat];
+				D.f[dirB] = &DDStart[dirT   *size_Mat];
+				D.f[dirT] = &DDStart[dirB   *size_Mat];
+				D.f[dirSW] = &DDStart[dirNE  *size_Mat];
+				D.f[dirNE] = &DDStart[dirSW  *size_Mat];
+				D.f[dirNW] = &DDStart[dirSE  *size_Mat];
+				D.f[dirSE] = &DDStart[dirNW  *size_Mat];
+				D.f[dirBW] = &DDStart[dirTE  *size_Mat];
+				D.f[dirTE] = &DDStart[dirBW  *size_Mat];
+				D.f[dirTW] = &DDStart[dirBE  *size_Mat];
+				D.f[dirBE] = &DDStart[dirTW  *size_Mat];
+				D.f[dirBS] = &DDStart[dirTN  *size_Mat];
+				D.f[dirTN] = &DDStart[dirBS  *size_Mat];
+				D.f[dirTS] = &DDStart[dirBN  *size_Mat];
+				D.f[dirBN] = &DDStart[dirTS  *size_Mat];
+				D.f[dirZERO] = &DDStart[dirZERO*size_Mat];
+				D.f[dirBSW] = &DDStart[dirTNE *size_Mat];
+				D.f[dirBNE] = &DDStart[dirTSW *size_Mat];
+				D.f[dirBNW] = &DDStart[dirTSE *size_Mat];
+				D.f[dirBSE] = &DDStart[dirTNW *size_Mat];
+				D.f[dirTSW] = &DDStart[dirBNE *size_Mat];
+				D.f[dirTNE] = &DDStart[dirBSW *size_Mat];
+				D.f[dirTNW] = &DDStart[dirBSE *size_Mat];
+				D.f[dirTSE] = &DDStart[dirBNW *size_Mat];
+			}
+
+			Distributions6 G;
+			if (EvenOrOdd == true)
+			{
+				G.g[dirE] = &G6[dirE   *size_Mat];
+				G.g[dirW] = &G6[dirW   *size_Mat];
+				G.g[dirN] = &G6[dirN   *size_Mat];
+				G.g[dirS] = &G6[dirS   *size_Mat];
+				G.g[dirT] = &G6[dirT   *size_Mat];
+				G.g[dirB] = &G6[dirB   *size_Mat];
+			}
+			else
+			{
+				G.g[dirW] = &G6[dirE   *size_Mat];
+				G.g[dirE] = &G6[dirW   *size_Mat];
+				G.g[dirS] = &G6[dirN   *size_Mat];
+				G.g[dirN] = &G6[dirS   *size_Mat];
+				G.g[dirB] = &G6[dirT   *size_Mat];
+				G.g[dirT] = &G6[dirB   *size_Mat];
+			}
+
+			////////////////////////////////////////////////////////////////////////////////
+			//index
+			//unsigned int kzero= k;
+			//unsigned int ke   = k;
+			unsigned int kw = neighborX[k];
+			//unsigned int kn   = k;
+			unsigned int ks = neighborY[k];
+			//unsigned int kt   = k;
+			unsigned int kb = neighborZ[k];
+			unsigned int ksw = neighborY[kw];
+			//unsigned int kne  = k;
+			//unsigned int kse  = ks;
+			//unsigned int knw  = kw;
+			unsigned int kbw = neighborZ[kw];
+			//unsigned int kte  = k;
+			//unsigned int kbe  = kb;
+			//unsigned int ktw  = kw;
+			unsigned int kbs = neighborZ[ks];
+			//unsigned int ktn  = k;
+			//unsigned int kbn  = kb;
+			//unsigned int kts  = ks;
+			//unsigned int ktse = ks;
+			//unsigned int kbnw = kbw;
+			//unsigned int ktnw = kw;
+			//unsigned int kbse = kbs;
+			//unsigned int ktsw = ksw;
+			//unsigned int kbne = kb;
+			//unsigned int ktne = k;
+			unsigned int kbsw = neighborZ[ksw];
+			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+			real mgcbb = (G.g[dirE])[k];
+			real mgabb = (G.g[dirW])[kw];
+			real mgbcb = (G.g[dirN])[k];
+			real mgbab = (G.g[dirS])[ks];
+			real mgbbc = (G.g[dirT])[k];
+			real mgbba = (G.g[dirB])[kb];
+			real dxuxdxux = c1o2 * (-mgcbb + mgabb);
+			real dyuydyuy = c1o2 * (-mgbcb + mgbab);
+			real dzuzdzuz = c1o2 * (-mgbbc + mgbba);
+			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+			real mfcbb = (D.f[dirE])[k];
+			real mfabb = (D.f[dirW])[kw];
+			real mfbcb = (D.f[dirN])[k];
+			real mfbab = (D.f[dirS])[ks];
+			real mfbbc = (D.f[dirT])[k];
+			real mfbba = (D.f[dirB])[kb];
+			real mfccb = (D.f[dirNE])[k];
+			real mfaab = (D.f[dirSW])[ksw];
+			real mfcab = (D.f[dirSE])[ks];
+			real mfacb = (D.f[dirNW])[kw];
+			real mfcbc = (D.f[dirTE])[k];
+			real mfaba = (D.f[dirBW])[kbw];
+			real mfcba = (D.f[dirBE])[kb];
+			real mfabc = (D.f[dirTW])[kw];
+			real mfbcc = (D.f[dirTN])[k];
+			real mfbaa = (D.f[dirBS])[kbs];
+			real mfbca = (D.f[dirBN])[kb];
+			real mfbac = (D.f[dirTS])[ks];
+			real mfbbb = (D.f[dirZERO])[k];
+			real mfccc = (D.f[dirTNE])[k];
+			real mfaac = (D.f[dirTSW])[ksw];
+			real mfcac = (D.f[dirTSE])[ks];
+			real mfacc = (D.f[dirTNW])[kw];
+			real mfcca = (D.f[dirBNE])[kb];
+			real mfaaa = (D.f[dirBSW])[kbsw];
+			real mfcaa = (D.f[dirBSE])[kbs];
+			real mfaca = (D.f[dirBNW])[kbw];
+			////////////////////////////////////////////////////////////////////////////////////
+			real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) +
+				(((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) +
+				((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb;
+
+			real rho = one + drho;
+			////////////////////////////////////////////////////////////////////////////////////
+			real vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) +
+				(((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) +
+				(mfcbb - mfabb)) / rho;
+			real vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) +
+				(((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) +
+				(mfbcb - mfbab)) / rho;
+			real vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) +
+				(((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) +
+				(mfbbc - mfbba)) / rho;
+			////////////////////////////////////////////////////////////////////////////////////
+			//the force be with you
+			real fx = forces[0] / (pow(two, level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; //
+			real fy = forces[1] / (pow(two, level)); //zero;
+			real fz = forces[2] / (pow(two, level)); //zero;
+			vvx += fx;
+			vvy += fy;
+			vvz += fz;
+			////////////////////////////////////////////////////////////////////////////////////
+			real oMdrho = one; // comp special
+			real m0, m1, m2;
+			real vx2;
+			real vy2;
+			real vz2;
+			vx2 = vvx*vvx;
+			vy2 = vvy*vvy;
+			vz2 = vvz*vvz;
+			////////////////////////////////////////////////////////////////////////////////////
+			real wadjust;
+			real qudricLimitP = 0.01f;// * 0.0001f;
+			real qudricLimitM = 0.01f;// * 0.0001f;
+			real qudricLimitD = 0.01f;// * 0.001f;
+										 ////////////////////////////////////////////////////////////////////////////////////
+										 //Hin
+										 ////////////////////////////////////////////////////////////////////////////////////
+										 // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36  Konditionieren
+										 ////////////////////////////////////////////////////////////////////////////////////
+										 // Z - Dir
+			m2 = mfaaa + mfaac;
+			m1 = mfaac - mfaaa;
+			m0 = m2 + mfaab;
+			mfaaa = m0;
+			m0 += c1o36 * oMdrho;
+			mfaab = m1 - m0 * vvz;
+			mfaac = m2 - two*	m1 * vvz + vz2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfaba + mfabc;
+			m1 = mfabc - mfaba;
+			m0 = m2 + mfabb;
+			mfaba = m0;
+			m0 += c1o9 * oMdrho;
+			mfabb = m1 - m0 * vvz;
+			mfabc = m2 - two*	m1 * vvz + vz2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfaca + mfacc;
+			m1 = mfacc - mfaca;
+			m0 = m2 + mfacb;
+			mfaca = m0;
+			m0 += c1o36 * oMdrho;
+			mfacb = m1 - m0 * vvz;
+			mfacc = m2 - two*	m1 * vvz + vz2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfbaa + mfbac;
+			m1 = mfbac - mfbaa;
+			m0 = m2 + mfbab;
+			mfbaa = m0;
+			m0 += c1o9 * oMdrho;
+			mfbab = m1 - m0 * vvz;
+			mfbac = m2 - two*	m1 * vvz + vz2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfbba + mfbbc;
+			m1 = mfbbc - mfbba;
+			m0 = m2 + mfbbb;
+			mfbba = m0;
+			m0 += c4o9 * oMdrho;
+			mfbbb = m1 - m0 * vvz;
+			mfbbc = m2 - two*	m1 * vvz + vz2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfbca + mfbcc;
+			m1 = mfbcc - mfbca;
+			m0 = m2 + mfbcb;
+			mfbca = m0;
+			m0 += c1o9 * oMdrho;
+			mfbcb = m1 - m0 * vvz;
+			mfbcc = m2 - two*	m1 * vvz + vz2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfcaa + mfcac;
+			m1 = mfcac - mfcaa;
+			m0 = m2 + mfcab;
+			mfcaa = m0;
+			m0 += c1o36 * oMdrho;
+			mfcab = m1 - m0 * vvz;
+			mfcac = m2 - two*	m1 * vvz + vz2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfcba + mfcbc;
+			m1 = mfcbc - mfcba;
+			m0 = m2 + mfcbb;
+			mfcba = m0;
+			m0 += c1o9 * oMdrho;
+			mfcbb = m1 - m0 * vvz;
+			mfcbc = m2 - two*	m1 * vvz + vz2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfcca + mfccc;
+			m1 = mfccc - mfcca;
+			m0 = m2 + mfccb;
+			mfcca = m0;
+			m0 += c1o36 * oMdrho;
+			mfccb = m1 - m0 * vvz;
+			mfccc = m2 - two*	m1 * vvz + vz2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			// mit  1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren
+			////////////////////////////////////////////////////////////////////////////////////
+			// Y - Dir
+			m2 = mfaaa + mfaca;
+			m1 = mfaca - mfaaa;
+			m0 = m2 + mfaba;
+			mfaaa = m0;
+			m0 += c1o6 * oMdrho;
+			mfaba = m1 - m0 * vvy;
+			mfaca = m2 - two*	m1 * vvy + vy2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfaab + mfacb;
+			m1 = mfacb - mfaab;
+			m0 = m2 + mfabb;
+			mfaab = m0;
+			mfabb = m1 - m0 * vvy;
+			mfacb = m2 - two*	m1 * vvy + vy2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfaac + mfacc;
+			m1 = mfacc - mfaac;
+			m0 = m2 + mfabc;
+			mfaac = m0;
+			m0 += c1o18 * oMdrho;
+			mfabc = m1 - m0 * vvy;
+			mfacc = m2 - two*	m1 * vvy + vy2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfbaa + mfbca;
+			m1 = mfbca - mfbaa;
+			m0 = m2 + mfbba;
+			mfbaa = m0;
+			m0 += c2o3 * oMdrho;
+			mfbba = m1 - m0 * vvy;
+			mfbca = m2 - two*	m1 * vvy + vy2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfbab + mfbcb;
+			m1 = mfbcb - mfbab;
+			m0 = m2 + mfbbb;
+			mfbab = m0;
+			mfbbb = m1 - m0 * vvy;
+			mfbcb = m2 - two*	m1 * vvy + vy2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfbac + mfbcc;
+			m1 = mfbcc - mfbac;
+			m0 = m2 + mfbbc;
+			mfbac = m0;
+			m0 += c2o9 * oMdrho;
+			mfbbc = m1 - m0 * vvy;
+			mfbcc = m2 - two*	m1 * vvy + vy2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfcaa + mfcca;
+			m1 = mfcca - mfcaa;
+			m0 = m2 + mfcba;
+			mfcaa = m0;
+			m0 += c1o6 * oMdrho;
+			mfcba = m1 - m0 * vvy;
+			mfcca = m2 - two*	m1 * vvy + vy2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfcab + mfccb;
+			m1 = mfccb - mfcab;
+			m0 = m2 + mfcbb;
+			mfcab = m0;
+			mfcbb = m1 - m0 * vvy;
+			mfccb = m2 - two*	m1 * vvy + vy2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfcac + mfccc;
+			m1 = mfccc - mfcac;
+			m0 = m2 + mfcbc;
+			mfcac = m0;
+			m0 += c1o18 * oMdrho;
+			mfcbc = m1 - m0 * vvy;
+			mfccc = m2 - two*	m1 * vvy + vy2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			// mit     1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9		Konditionieren
+			////////////////////////////////////////////////////////////////////////////////////
+			// X - Dir
+			m2 = mfaaa + mfcaa;
+			m1 = mfcaa - mfaaa;
+			m0 = m2 + mfbaa;
+			mfaaa = m0;
+			m0 += one* oMdrho;
+			mfbaa = m1 - m0 * vvx;
+			mfcaa = m2 - two*	m1 * vvx + vx2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfaba + mfcba;
+			m1 = mfcba - mfaba;
+			m0 = m2 + mfbba;
+			mfaba = m0;
+			mfbba = m1 - m0 * vvx;
+			mfcba = m2 - two*	m1 * vvx + vx2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfaca + mfcca;
+			m1 = mfcca - mfaca;
+			m0 = m2 + mfbca;
+			mfaca = m0;
+			m0 += c1o3 * oMdrho;
+			mfbca = m1 - m0 * vvx;
+			mfcca = m2 - two*	m1 * vvx + vx2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfaab + mfcab;
+			m1 = mfcab - mfaab;
+			m0 = m2 + mfbab;
+			mfaab = m0;
+			mfbab = m1 - m0 * vvx;
+			mfcab = m2 - two*	m1 * vvx + vx2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfabb + mfcbb;
+			m1 = mfcbb - mfabb;
+			m0 = m2 + mfbbb;
+			mfabb = m0;
+			mfbbb = m1 - m0 * vvx;
+			mfcbb = m2 - two*	m1 * vvx + vx2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfacb + mfccb;
+			m1 = mfccb - mfacb;
+			m0 = m2 + mfbcb;
+			mfacb = m0;
+			mfbcb = m1 - m0 * vvx;
+			mfccb = m2 - two*	m1 * vvx + vx2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfaac + mfcac;
+			m1 = mfcac - mfaac;
+			m0 = m2 + mfbac;
+			mfaac = m0;
+			m0 += c1o3 * oMdrho;
+			mfbac = m1 - m0 * vvx;
+			mfcac = m2 - two*	m1 * vvx + vx2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfabc + mfcbc;
+			m1 = mfcbc - mfabc;
+			m0 = m2 + mfbbc;
+			mfabc = m0;
+			mfbbc = m1 - m0 * vvx;
+			mfcbc = m2 - two*	m1 * vvx + vx2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			m2 = mfacc + mfccc;
+			m1 = mfccc - mfacc;
+			m0 = m2 + mfbcc;
+			mfacc = m0;
+			m0 += c1o9 * oMdrho;
+			mfbcc = m1 - m0 * vvx;
+			mfccc = m2 - two*	m1 * vvx + vx2 * m0;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+
+			////////////////////////////////////////////////////////////////////////////////////
+			// Cumulants
+			////////////////////////////////////////////////////////////////////////////////////
+			real OxxPyyPzz = one;	//set the bulk viscosity one is high / two is very low and zero is (too) high ... (also called omega 2)
+
+										////////////////////////////////////////////////////////////
+										//3.
+										//////////////////////////////
+			real OxyyPxzz = eight*(-two + omega)*(one + two*omega) / (-eight - fourteen*omega + seven*omega*omega);//one;
+			real OxyyMxzz = eight*(-two + omega)*(-seven + four*omega) / (fiftysix - fifty*omega + nine*omega*omega);//one;
+			real Oxyz = twentyfour*(-two + omega)*(-two - seven*omega + three*omega*omega) / (fourtyeight + c152*omega - c130*omega*omega + twentynine*omega*omega*omega);//one;
+																																											 ////////////////////////////////////////////////////////////
+																																											 //4.
+																																											 //////////////////////////////
+			real O4 = one;
+			//////////////////////////////
+			//real O4        = omega;//TRT
+			////////////////////////////////////////////////////////////
+			//5.
+			//////////////////////////////
+			real O5 = one;
+			////////////////////////////////////////////////////////////
+			//6.
+			//////////////////////////////
+			real O6 = one;
+			////////////////////////////////////////////////////////////
+
+
+			//central moments to cumulants
+			//4.
+			real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + two * mfbba * mfbab) / rho;
+			real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + two * mfbba * mfabb) / rho;
+			real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + two * mfbab * mfabb) / rho;
+
+			real CUMcca = mfcca - (((mfcaa * mfaca + two * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho));
+			real CUMcac = mfcac - (((mfcaa * mfaac + two * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho));
+			real CUMacc = mfacc - (((mfaac * mfaca + two * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho));
+
+			//5.
+			real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + four * mfabb * mfbbb + two * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
+			real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + four * mfbab * mfbbb + two * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
+			real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + four * mfbba * mfbbb + two * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
+
+			//6.
+
+			real CUMccc = mfccc + ((-four *  mfbbb * mfbbb
+				- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+				- four * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+				- two * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
+				+ (four * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+					+ two * (mfcaa * mfaca * mfaac)
+					+ sixteen *  mfbba * mfbab * mfabb) / (rho * rho)
+				- c1o3 * (mfacc + mfcac + mfcca) / rho
+				- c1o9 * (mfcaa + mfaca + mfaac) / rho
+				+ (two * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+					+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3
+				+ c1o27*((drho * drho - drho) / (rho*rho)));
+
+			//2.
+			// linear combinations
+			real mxxPyyPzz = mfcaa + mfaca + mfaac;
+			real mxxMyy = mfcaa - mfaca;
+			real mxxMzz = mfcaa - mfaac;
+
+			////////////////////////////////////////////////////////////////////////////
+			real Dxy = -three*omega*mfbba;
+			real Dxz = -three*omega*mfbab;
+			real Dyz = -three*omega*mfabb;
+
+			//3.
+			// linear combinations
+
+			real mxxyPyzz = mfcba + mfabc;
+			real mxxyMyzz = mfcba - mfabc;
+
+			real mxxzPyyz = mfcab + mfacb;
+			real mxxzMyyz = mfcab - mfacb;
+
+			real mxyyPxzz = mfbca + mfbac;
+			real mxyyMxzz = mfbca - mfbac;
+
+			///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+			//incl. correction		(hat noch nicht so gut funktioniert...Optimierungsbedarf??)
+
+			real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 *  OxxPyyPzz * (mfaaa - mxxPyyPzz);
+			real dyuy = dxux + omega * c3o2 * mxxMyy;
+			real dzuz = dxux + omega * c3o2 * mxxMzz;
+
+			mgabb = vvx*dxux;
+			mgbab = vvy*dyuy;
+			mgbba = vvz*dzuz;
+
+			mgcbb = vvx*dxux;
+			mgbcb = vvy*dyuy;
+			mgbbc = vvz*dzuz;
+
+			//relax
+			mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - three * (one - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz)
+				+ (six - three * (omega + OxxPyyPzz) + omega * OxxPyyPzz) / (three * omega) *
+				(dxuxdxux + dyuydyuy + dzuzdzuz);
+			mxxMyy += omega * (-mxxMyy) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy)
+				+ omega * (two*(one / omega - c1o2) * (one / omega - c1o2) - c1o6) * (dxuxdxux - dyuydyuy);
+			mxxMzz += omega * (-mxxMzz) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz)
+				+ omega * (two*(one / omega - c1o2) * (one / omega - c1o2) - c1o6) *(dxuxdxux - dzuzdzuz);
+
+			///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+			////no correction
+			//mxxPyyPzz += OxxPyyPzz*(mfaaa-mxxPyyPzz);//-magicBulk*OxxPyyPzz;
+			//mxxMyy    += -(-omega) * (-mxxMyy);
+			//mxxMzz    += -(-omega) * (-mxxMzz);
+			/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+			mfabb += omega * (-mfabb);
+			mfbab += omega * (-mfbab);
+			mfbba += omega * (-mfbba);
+			//////////////////////////////////////////////////////////////////////////
+
+			// linear combinations back
+			mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz);
+			mfaca = c1o3 * (-two*  mxxMyy + mxxMzz + mxxPyyPzz);
+			mfaac = c1o3 * (mxxMyy - two* mxxMzz + mxxPyyPzz);
+
+
+			//relax
+			//////////////////////////////////////////////////////////////////////////
+			//das ist der limiter
+			wadjust = Oxyz + (one - Oxyz)*abs(mfbbb) / (abs(mfbbb) + qudricLimitD);
+			mfbbb += wadjust * (-mfbbb);
+			wadjust = OxyyPxzz + (one - OxyyPxzz)*abs(mxxyPyzz) / (abs(mxxyPyzz) + qudricLimitP);
+			mxxyPyzz += wadjust * (-mxxyPyzz);
+			wadjust = OxyyMxzz + (one - OxyyMxzz)*abs(mxxyMyzz) / (abs(mxxyMyzz) + qudricLimitM);
+			mxxyMyzz += wadjust * (-mxxyMyzz);
+			wadjust = OxyyPxzz + (one - OxyyPxzz)*abs(mxxzPyyz) / (abs(mxxzPyyz) + qudricLimitP);
+			mxxzPyyz += wadjust * (-mxxzPyyz);
+			wadjust = OxyyMxzz + (one - OxyyMxzz)*abs(mxxzMyyz) / (abs(mxxzMyyz) + qudricLimitM);
+			mxxzMyyz += wadjust * (-mxxzMyyz);
+			wadjust = OxyyPxzz + (one - OxyyPxzz)*abs(mxyyPxzz) / (abs(mxyyPxzz) + qudricLimitP);
+			mxyyPxzz += wadjust * (-mxyyPxzz);
+			wadjust = OxyyMxzz + (one - OxyyMxzz)*abs(mxyyMxzz) / (abs(mxyyMxzz) + qudricLimitM);
+			mxyyMxzz += wadjust * (-mxyyMxzz);
+			//////////////////////////////////////////////////////////////////////////
+			//ohne limiter
+			//mfbbb     += OxyyMxzz * (-mfbbb);
+			//mxxyPyzz  += OxyyPxzz * (-mxxyPyzz);
+			//mxxyMyzz  += OxyyMxzz * (-mxxyMyzz);
+			//mxxzPyyz  += OxyyPxzz * (-mxxzPyyz);
+			//mxxzMyyz  += OxyyMxzz * (-mxxzMyyz);
+			//mxyyPxzz  += OxyyPxzz * (-mxyyPxzz);
+			//mxyyMxzz  += OxyyMxzz * (-mxyyMxzz);
+			//////////////////////////////////////////////////////////////////////////
+
+			// linear combinations back
+			mfcba = (mxxyMyzz + mxxyPyzz) * c1o2;
+			mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2;
+			mfcab = (mxxzMyyz + mxxzPyyz) * c1o2;
+			mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2;
+			mfbca = (mxyyMxzz + mxyyPxzz) * c1o2;
+			mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2;
+
+			//4.
+			//////////////////////////////////////////////////////////////////////////
+			//mit limiter
+			//	wadjust    = O4+(one-O4)*abs(CUMacc)/(abs(CUMacc)+qudricLimit);
+			//CUMacc    += wadjust * (-CUMacc);
+			//	wadjust    = O4+(one-O4)*abs(CUMcac)/(abs(CUMcac)+qudricLimit);
+			//CUMcac    += wadjust * (-CUMcac); 
+			//	wadjust    = O4+(one-O4)*abs(CUMcca)/(abs(CUMcca)+qudricLimit);
+			//CUMcca    += wadjust * (-CUMcca); 
+
+			//	wadjust    = O4+(one-O4)*abs(CUMbbc)/(abs(CUMbbc)+qudricLimit);
+			//CUMbbc    += wadjust * (-CUMbbc); 
+			//	wadjust    = O4+(one-O4)*abs(CUMbcb)/(abs(CUMbcb)+qudricLimit);
+			//CUMbcb    += wadjust * (-CUMbcb); 
+			//	wadjust    = O4+(one-O4)*abs(CUMcbb)/(abs(CUMcbb)+qudricLimit);
+			//CUMcbb    += wadjust * (-CUMcbb); 
+			//////////////////////////////////////////////////////////////////////////
+			//ohne limiter
+			//CUMacc += O4 * (-CUMacc);
+			//CUMcac += O4 * (-CUMcac);
+			//CUMcca += O4 * (-CUMcca);
+			//CUMbbc += O4 * (-CUMbbc);
+			//CUMbcb += O4 * (-CUMbcb);
+			//CUMcbb += O4 * (-CUMcbb);
+			CUMacc = -O4*(one / omega - c1o2)*(dyuy + dzuz)*c2o3 *(four + two*omega - three*omega*omega) / (two - seven*omega + five*omega*omega) + (one - O4) * (CUMacc);
+			CUMcac = -O4*(one / omega - c1o2)*(dxux + dzuz)*c2o3 *(four + two*omega - three*omega*omega) / (two - seven*omega + five*omega*omega) + (one - O4) * (CUMcac);
+			CUMcca = -O4*(one / omega - c1o2)*(dyuy + dxux)*c2o3 *(four + two*omega - three*omega*omega) / (two - seven*omega + five*omega*omega) + (one - O4) * (CUMcca);
+			CUMbbc = -O4*(one / omega - c1o2)*Dxy*c1o3 *(four + twentyeight*omega - fourteen*omega*omega) / (six - twentyone*omega + fiveteen*omega*omega) + (one - O4) * (CUMbbc);
+			CUMbcb = -O4*(one / omega - c1o2)*Dxz*c1o3 *(four + twentyeight*omega - fourteen*omega*omega) / (six - twentyone*omega + fiveteen*omega*omega) + (one - O4) * (CUMbcb);
+			CUMcbb = -O4*(one / omega - c1o2)*Dyz*c1o3 *(four + twentyeight*omega - fourteen*omega*omega) / (six - twentyone*omega + fiveteen*omega*omega) + (one - O4) * (CUMcbb);
+			//////////////////////////////////////////////////////////////////////////
+
+
+			//5.
+			CUMbcc += O5 * (-CUMbcc);
+			CUMcbc += O5 * (-CUMcbc);
+			CUMccb += O5 * (-CUMccb);
+
+			//6.
+			CUMccc += O6 * (-CUMccc);
+
+
+
+			//back cumulants to central moments
+			//4.
+			mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + two * mfbba * mfbab) / rho;
+			mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + two * mfbba * mfabb) / rho;
+			mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + two * mfbab * mfabb) / rho;
+
+			mfcca = CUMcca + (((mfcaa * mfaca + two * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho));
+			mfcac = CUMcac + (((mfcaa * mfaac + two * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho));
+			mfacc = CUMacc + (((mfaac * mfaca + two * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho));
+
+			//5.
+			mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + four * mfabb * mfbbb + two * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho;
+			mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + four * mfbab * mfbbb + two * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho;
+			mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + four * mfbba * mfbbb + two * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho;
+
+			//6.
+
+			mfccc = CUMccc - ((-four *  mfbbb * mfbbb
+				- (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca)
+				- four * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc)
+				- two * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho
+				+ (four * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac)
+					+ two * (mfcaa * mfaca * mfaac)
+					+ sixteen *  mfbba * mfbab * mfabb) / (rho * rho)
+				- c1o3 * (mfacc + mfcac + mfcca) / rho
+				- c1o9 * (mfcaa + mfaca + mfaac) / rho
+				+ (two * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba)
+					+ (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3
+				+ c1o27*((drho * drho - drho) / (rho*rho)));
+			////////////////////////////////////////////////////////////////////////////////////
+
+			////////////////////////////////////////////////////////////////////////////////////
+			//the force be with you
+			mfbaa = -mfbaa;
+			mfaba = -mfaba;
+			mfaab = -mfaab;
+			////////////////////////////////////////////////////////////////////////////////////
+
+
+			////////////////////////////////////////////////////////////////////////////////////
+			//back
+			////////////////////////////////////////////////////////////////////////////////////
+			//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9   Konditionieren
+			////////////////////////////////////////////////////////////////////////////////////
+			// Z - Dir
+			m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + one* oMdrho) * (vz2 - vvz) * c1o2;
+			m1 = -mfaac - two* mfaab *  vvz + mfaaa                * (one - vz2) - one* oMdrho * vz2;
+			m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + one* oMdrho) * (vz2 + vvz) * c1o2;
+			mfaaa = m0;
+			mfaab = m1;
+			mfaac = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2;
+			m1 = -mfabc - two* mfabb *  vvz + mfaba * (one - vz2);
+			m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2;
+			mfaba = m0;
+			mfabb = m1;
+			mfabc = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+			m1 = -mfacc - two* mfacb *  vvz + mfaca                  * (one - vz2) - c1o3 * oMdrho * vz2;
+			m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+			mfaca = m0;
+			mfacb = m1;
+			mfacc = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2;
+			m1 = -mfbac - two* mfbab *  vvz + mfbaa * (one - vz2);
+			m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2;
+			mfbaa = m0;
+			mfbab = m1;
+			mfbac = m2;
+			/////////b//////////////////////////////////////////////////////////////////////////
+			m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2;
+			m1 = -mfbbc - two* mfbbb *  vvz + mfbba * (one - vz2);
+			m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2;
+			mfbba = m0;
+			mfbbb = m1;
+			mfbbc = m2;
+			/////////b//////////////////////////////////////////////////////////////////////////
+			m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2;
+			m1 = -mfbcc - two* mfbcb *  vvz + mfbca * (one - vz2);
+			m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2;
+			mfbca = m0;
+			mfbcb = m1;
+			mfbcc = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2;
+			m1 = -mfcac - two* mfcab *  vvz + mfcaa                  * (one - vz2) - c1o3 * oMdrho * vz2;
+			m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2;
+			mfcaa = m0;
+			mfcab = m1;
+			mfcac = m2;
+			/////////c//////////////////////////////////////////////////////////////////////////
+			m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2;
+			m1 = -mfcbc - two* mfcbb *  vvz + mfcba * (one - vz2);
+			m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2;
+			mfcba = m0;
+			mfcbb = m1;
+			mfcbc = m2;
+			/////////c//////////////////////////////////////////////////////////////////////////
+			m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2;
+			m1 = -mfccc - two* mfccb *  vvz + mfcca                  * (one - vz2) - c1o9 * oMdrho * vz2;
+			m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2;
+			mfcca = m0;
+			mfccb = m1;
+			mfccc = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			//mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18   Konditionieren
+			////////////////////////////////////////////////////////////////////////////////////
+			// Y - Dir
+			m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+			m1 = -mfaca - two* mfaba *  vvy + mfaaa                  * (one - vy2) - c1o6 * oMdrho * vy2;
+			m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+			mfaaa = m0;
+			mfaba = m1;
+			mfaca = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2;
+			m1 = -mfacb - two* mfabb *  vvy + mfaab                  * (one - vy2) - c2o3 * oMdrho * vy2;
+			m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2;
+			mfaab = m0;
+			mfabb = m1;
+			mfacb = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2;
+			m1 = -mfacc - two* mfabc *  vvy + mfaac                  * (one - vy2) - c1o6 * oMdrho * vy2;
+			m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2;
+			mfaac = m0;
+			mfabc = m1;
+			mfacc = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2;
+			m1 = -mfbca - two* mfbba *  vvy + mfbaa * (one - vy2);
+			m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2;
+			mfbaa = m0;
+			mfbba = m1;
+			mfbca = m2;
+			/////////b//////////////////////////////////////////////////////////////////////////
+			m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2;
+			m1 = -mfbcb - two* mfbbb *  vvy + mfbab * (one - vy2);
+			m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2;
+			mfbab = m0;
+			mfbbb = m1;
+			mfbcb = m2;
+			/////////b//////////////////////////////////////////////////////////////////////////
+			m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2;
+			m1 = -mfbcc - two* mfbbc *  vvy + mfbac * (one - vy2);
+			m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2;
+			mfbac = m0;
+			mfbbc = m1;
+			mfbcc = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+			m1 = -mfcca - two* mfcba *  vvy + mfcaa                   * (one - vy2) - c1o18 * oMdrho * vy2;
+			m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+			mfcaa = m0;
+			mfcba = m1;
+			mfcca = m2;
+			/////////c//////////////////////////////////////////////////////////////////////////
+			m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2;
+			m1 = -mfccb - two* mfcbb *  vvy + mfcab                  * (one - vy2) - c2o9 * oMdrho * vy2;
+			m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2;
+			mfcab = m0;
+			mfcbb = m1;
+			mfccb = m2;
+			/////////c//////////////////////////////////////////////////////////////////////////
+			m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2;
+			m1 = -mfccc - two* mfcbc *  vvy + mfcac                   * (one - vy2) - c1o18 * oMdrho * vy2;
+			m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2;
+			mfcac = m0;
+			mfcbc = m1;
+			mfccc = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			//mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren
+			////////////////////////////////////////////////////////////////////////////////////
+			// X - Dir
+			m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			m1 = -mfcaa - two* mfbaa *  vvx + mfaaa                   * (one - vx2) - c1o36 * oMdrho * vx2;
+			m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			mfaaa = m0;
+			mfbaa = m1;
+			mfcaa = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			m1 = -mfcba - two* mfbba *  vvx + mfaba                  * (one - vx2) - c1o9 * oMdrho * vx2;
+			m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			mfaba = m0;
+			mfbba = m1;
+			mfcba = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			m1 = -mfcca - two* mfbca *  vvx + mfaca                   * (one - vx2) - c1o36 * oMdrho * vx2;
+			m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			mfaca = m0;
+			mfbca = m1;
+			mfcca = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			m1 = -mfcab - two* mfbab *  vvx + mfaab                  * (one - vx2) - c1o9 * oMdrho * vx2;
+			m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			mfaab = m0;
+			mfbab = m1;
+			mfcab = m2;
+			///////////b////////////////////////////////////////////////////////////////////////
+			m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			m1 = -mfcbb - two* mfbbb *  vvx + mfabb                  * (one - vx2) - c4o9 * oMdrho * vx2;
+			m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			mfabb = m0;
+			mfbbb = m1;
+			mfcbb = m2;
+			///////////b////////////////////////////////////////////////////////////////////////
+			m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			m1 = -mfccb - two* mfbcb *  vvx + mfacb                  * (one - vx2) - c1o9 * oMdrho * vx2;
+			m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			mfacb = m0;
+			mfbcb = m1;
+			mfccb = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+			////////////////////////////////////////////////////////////////////////////////////
+			m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			m1 = -mfcac - two* mfbac *  vvx + mfaac                   * (one - vx2) - c1o36 * oMdrho * vx2;
+			m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			mfaac = m0;
+			mfbac = m1;
+			mfcac = m2;
+			///////////c////////////////////////////////////////////////////////////////////////
+			m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2;
+			m1 = -mfcbc - two* mfbbc *  vvx + mfabc                  * (one - vx2) - c1o9 * oMdrho * vx2;
+			m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2;
+			mfabc = m0;
+			mfbbc = m1;
+			mfcbc = m2;
+			///////////c////////////////////////////////////////////////////////////////////////
+			m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2;
+			m1 = -mfccc - two* mfbcc *  vvx + mfacc                   * (one - vx2) - c1o36 * oMdrho * vx2;
+			m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2;
+			mfacc = m0;
+			mfbcc = m1;
+			mfccc = m2;
+			////////////////////////////////////////////////////////////////////////////////////
+
+			////////////////////////////////////////////////////////////////////////////////////
+			(D.f[dirE])[k] = mfabb;
+			(D.f[dirW])[kw] = mfcbb;
+			(D.f[dirN])[k] = mfbab;
+			(D.f[dirS])[ks] = mfbcb;
+			(D.f[dirT])[k] = mfbba;
+			(D.f[dirB])[kb] = mfbbc;
+			(D.f[dirNE])[k] = mfaab;
+			(D.f[dirSW])[ksw] = mfccb;
+			(D.f[dirSE])[ks] = mfacb;
+			(D.f[dirNW])[kw] = mfcab;
+			(D.f[dirTE])[k] = mfaba;
+			(D.f[dirBW])[kbw] = mfcbc;
+			(D.f[dirBE])[kb] = mfabc;
+			(D.f[dirTW])[kw] = mfcba;
+			(D.f[dirTN])[k] = mfbaa;
+			(D.f[dirBS])[kbs] = mfbcc;
+			(D.f[dirBN])[kb] = mfbac;
+			(D.f[dirTS])[ks] = mfbca;
+			(D.f[dirZERO])[k] = mfbbb;
+			(D.f[dirTNE])[k] = mfaaa;
+			(D.f[dirTSE])[ks] = mfaca;
+			(D.f[dirBNE])[kb] = mfaac;
+			(D.f[dirBSE])[kbs] = mfacc;
+			(D.f[dirTNW])[kw] = mfcaa;
+			(D.f[dirTSW])[ksw] = mfcca;
+			(D.f[dirBNW])[kbw] = mfcac;
+			(D.f[dirBSW])[kbsw] = mfccc;
+			////////////////////////////////////////////////////////////////////////////////////
+
+			(G.g[dirE])[k] = mgabb;
+			(G.g[dirW])[kw] = mgcbb;
+			(G.g[dirN])[k] = mgbab;
+			(G.g[dirS])[ks] = mgbcb;
+			(G.g[dirT])[k] = mgbba;
+			(G.g[dirB])[kb] = mgbbc;
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27_Device.cuh b/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27_Device.cuh
new file mode 100644
index 000000000..9475084ba
--- /dev/null
+++ b/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/CumulantF32018CompSP27_Device.cuh
@@ -0,0 +1,19 @@
+#ifndef LB_Kernel_Cumulant_D3Q27F3_2018_H
+#define LB_Kernel_Cumulant_D3Q27F3_2018_H
+
+#include <DataTypes.h>
+#include <curand.h>
+
+extern "C" __global__ void LB_Kernel_Cumulant_D3Q27F3_2018(	real omega,
+															unsigned int* bcMatD,
+															unsigned int* neighborX,
+															unsigned int* neighborY,
+															unsigned int* neighborZ,
+															real* DDStart,
+															real* F3,
+															int size_Mat,
+															int level,
+															real* forces,
+															bool EvenOrOdd);
+
+#endif 
\ No newline at end of file
diff --git a/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/package.include b/src/VirtualFluids_GPU/Kernel/Advection/Compressible/CumulantF32018/package.include
new file mode 100644
index 000000000..e69de29bb
-- 
GitLab