From ad15bc532d712551a88cf8ca02098423cf40d3e0 Mon Sep 17 00:00:00 2001 From: peters <peters@irmb.tu-bs.de> Date: Fri, 19 Mar 2021 19:47:55 +0100 Subject: [PATCH] Add Cumulant header to lbm with refactoring in the gpu modules. --- .../VirtualFluids_GPU/GPU/Cumulant27chim.cu | 5055 ++++++++++------- src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h | 30 + src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh | 29 + src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu | 66 + src/gpu/VirtualFluids_GPU/LBM/D3Q27.h | 1 + src/lbm/ChimeraTests.cpp | 42 +- src/lbm/CumulantChimera.h | 435 ++ src/lbm/D3Q27.h | 28 + 8 files changed, 3565 insertions(+), 2121 deletions(-) create mode 100644 src/lbm/CumulantChimera.h diff --git a/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu b/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu index 415a2455e..a8c4b7ce6 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu +++ b/src/gpu/VirtualFluids_GPU/GPU/Cumulant27chim.cu @@ -1,10 +1,35 @@ -// _ ___ __ __________ _ __ ______________ __ -// | | / (_)____/ /___ ______ _/ / ____/ /_ __(_)___/ /____ / ___/ __ / / / / -// | | / / / ___/ __/ / / / __ `/ / /_ / / / / / / __ / ___/ / /___/ /_/ / / / / -// | |/ / / / / /_/ /_/ / /_/ / / __/ / / /_/ / / /_/ (__ ) / /_) / ____/ /__/ / -// |___/_/_/ \__/\__,_/\__,_/_/_/ /_/\__,_/_/\__,_/____/ \____/_/ \_____/ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ // -////////////////////////////////////////////////////////////////////////// +// This file is part of VirtualFluids. VirtualFluids is free software: you can +// redistribute it and/or modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. +// +//! \file Cumulant27chim.cu +//! \ingroup GPU +//! \author Martin Schoenherr +//======================================================================================= /* Device code */ #include "LBM/LB.h" #include "LBM/D3Q27.h" @@ -12,882 +37,1706 @@ #include "math.h" #include <lbm/Chimera.h> +#include <lbm/CumulantChimera.h> + + + +__device__ Distributions27 getDistributions27(real* distributions, unsigned int size_Mat, bool isEvenTimestep) +{ + Distributions27 dist; + if (isEvenTimestep) + { + dist.f[dirE ] = &distributions[dirE *size_Mat]; + dist.f[dirW ] = &distributions[dirW *size_Mat]; + dist.f[dirN ] = &distributions[dirN *size_Mat]; + dist.f[dirS ] = &distributions[dirS *size_Mat]; + dist.f[dirT ] = &distributions[dirT *size_Mat]; + dist.f[dirB ] = &distributions[dirB *size_Mat]; + dist.f[dirNE ] = &distributions[dirNE *size_Mat]; + dist.f[dirSW ] = &distributions[dirSW *size_Mat]; + dist.f[dirSE ] = &distributions[dirSE *size_Mat]; + dist.f[dirNW ] = &distributions[dirNW *size_Mat]; + dist.f[dirTE ] = &distributions[dirTE *size_Mat]; + dist.f[dirBW ] = &distributions[dirBW *size_Mat]; + dist.f[dirBE ] = &distributions[dirBE *size_Mat]; + dist.f[dirTW ] = &distributions[dirTW *size_Mat]; + dist.f[dirTN ] = &distributions[dirTN *size_Mat]; + dist.f[dirBS ] = &distributions[dirBS *size_Mat]; + dist.f[dirBN ] = &distributions[dirBN *size_Mat]; + dist.f[dirTS ] = &distributions[dirTS *size_Mat]; + dist.f[dirREST] = &distributions[dirREST*size_Mat]; + dist.f[dirTNE ] = &distributions[dirTNE *size_Mat]; + dist.f[dirTSW ] = &distributions[dirTSW *size_Mat]; + dist.f[dirTSE ] = &distributions[dirTSE *size_Mat]; + dist.f[dirTNW ] = &distributions[dirTNW *size_Mat]; + dist.f[dirBNE ] = &distributions[dirBNE *size_Mat]; + dist.f[dirBSW ] = &distributions[dirBSW *size_Mat]; + dist.f[dirBSE ] = &distributions[dirBSE *size_Mat]; + dist.f[dirBNW ] = &distributions[dirBNW *size_Mat]; + } + else + { + dist.f[dirW ] = &distributions[dirE *size_Mat]; + dist.f[dirE ] = &distributions[dirW *size_Mat]; + dist.f[dirS ] = &distributions[dirN *size_Mat]; + dist.f[dirN ] = &distributions[dirS *size_Mat]; + dist.f[dirB ] = &distributions[dirT *size_Mat]; + dist.f[dirT ] = &distributions[dirB *size_Mat]; + dist.f[dirSW ] = &distributions[dirNE *size_Mat]; + dist.f[dirNE ] = &distributions[dirSW *size_Mat]; + dist.f[dirNW ] = &distributions[dirSE *size_Mat]; + dist.f[dirSE ] = &distributions[dirNW *size_Mat]; + dist.f[dirBW ] = &distributions[dirTE *size_Mat]; + dist.f[dirTE ] = &distributions[dirBW *size_Mat]; + dist.f[dirTW ] = &distributions[dirBE *size_Mat]; + dist.f[dirBE ] = &distributions[dirTW *size_Mat]; + dist.f[dirBS ] = &distributions[dirTN *size_Mat]; + dist.f[dirTN ] = &distributions[dirBS *size_Mat]; + dist.f[dirTS ] = &distributions[dirBN *size_Mat]; + dist.f[dirBN ] = &distributions[dirTS *size_Mat]; + dist.f[dirREST] = &distributions[dirREST*size_Mat]; + dist.f[dirBSW ] = &distributions[dirTNE *size_Mat]; + dist.f[dirBNE ] = &distributions[dirTSW *size_Mat]; + dist.f[dirBNW ] = &distributions[dirTSE *size_Mat]; + dist.f[dirBSE ] = &distributions[dirTNW *size_Mat]; + dist.f[dirTSW ] = &distributions[dirBNE *size_Mat]; + dist.f[dirTNE ] = &distributions[dirBSW *size_Mat]; + dist.f[dirTNW ] = &distributions[dirBSE *size_Mat]; + dist.f[dirTSE ] = &distributions[dirBNW *size_Mat]; + } + return dist; +} + +struct ABC +{ + __device__ ABC(uint k, + uint kw, + uint ks, + uint kb, + uint ksw, + uint kbw, + uint kbs, + uint kbsw) : + k(k), + kw (kw), + ks (ks), + kb (kb), + ksw (ksw), + kbw (kbw), + kbs (kbs), + kbsw (kbsw) + {} + + __device__ void read(const Distributions27& dist) + { + distribution.f[VF::LBM::DIR::PZZ] = (dist.f[dirE ])[k]; + distribution.f[VF::LBM::DIR::MZZ] = (dist.f[dirW ])[kw]; + distribution.f[VF::LBM::DIR::ZPZ] = (dist.f[dirN ])[k]; + distribution.f[VF::LBM::DIR::ZMZ] = (dist.f[dirS ])[ks]; + distribution.f[VF::LBM::DIR::ZZP] = (dist.f[dirT ])[k]; + distribution.f[VF::LBM::DIR::ZZM] = (dist.f[dirB ])[kb]; + distribution.f[VF::LBM::DIR::PPZ] = (dist.f[dirNE ])[k]; + distribution.f[VF::LBM::DIR::MMZ] = (dist.f[dirSW ])[ksw]; + distribution.f[VF::LBM::DIR::PMZ] = (dist.f[dirSE ])[ks]; + distribution.f[VF::LBM::DIR::MPZ] = (dist.f[dirNW ])[kw]; + distribution.f[VF::LBM::DIR::PZP] = (dist.f[dirTE ])[k]; + distribution.f[VF::LBM::DIR::MZM] = (dist.f[dirBW ])[kbw]; + distribution.f[VF::LBM::DIR::PZM] = (dist.f[dirBE ])[kb]; + distribution.f[VF::LBM::DIR::MZP] = (dist.f[dirTW ])[kw]; + distribution.f[VF::LBM::DIR::ZPP] = (dist.f[dirTN ])[k]; + distribution.f[VF::LBM::DIR::ZMM] = (dist.f[dirBS ])[kbs]; + distribution.f[VF::LBM::DIR::ZPM] = (dist.f[dirBN ])[kb]; + distribution.f[VF::LBM::DIR::ZMP] = (dist.f[dirTS ])[ks]; + distribution.f[VF::LBM::DIR::PPP] = (dist.f[dirTNE ])[k]; + distribution.f[VF::LBM::DIR::MPP] = (dist.f[dirTNW ])[kw]; + distribution.f[VF::LBM::DIR::PMP] = (dist.f[dirTSE ])[ks]; + distribution.f[VF::LBM::DIR::MMP] = (dist.f[dirTSW ])[ksw]; + distribution.f[VF::LBM::DIR::PPM] = (dist.f[dirBNE ])[kb]; + distribution.f[VF::LBM::DIR::MPM] = (dist.f[dirBNE ])[kb]; + distribution.f[VF::LBM::DIR::PMM] = (dist.f[dirBSE ])[kbs]; + distribution.f[VF::LBM::DIR::MMM] = (dist.f[dirBSW ])[kbsw]; + distribution.f[VF::LBM::DIR::ZZZ] = (dist.f[dirREST])[k]; + } + + __device__ void write(Distributions27& dist) + { + (dist.f[dirE ])[k] = distribution.f[VF::LBM::DIR::PZZ]; + (dist.f[dirW ])[kw] = distribution.f[VF::LBM::DIR::MZZ]; + (dist.f[dirN ])[k] = distribution.f[VF::LBM::DIR::ZPZ]; + (dist.f[dirS ])[ks] = distribution.f[VF::LBM::DIR::ZMZ]; + (dist.f[dirT ])[k] = distribution.f[VF::LBM::DIR::ZZP]; + (dist.f[dirB ])[kb] = distribution.f[VF::LBM::DIR::ZZM]; + (dist.f[dirNE ])[k] = distribution.f[VF::LBM::DIR::PPZ]; + (dist.f[dirSW ])[ksw] = distribution.f[VF::LBM::DIR::MMZ]; + (dist.f[dirSE ])[ks] = distribution.f[VF::LBM::DIR::PMZ]; + (dist.f[dirNW ])[kw] = distribution.f[VF::LBM::DIR::MPZ]; + (dist.f[dirTE ])[k] = distribution.f[VF::LBM::DIR::PZP]; + (dist.f[dirBW ])[kbw] = distribution.f[VF::LBM::DIR::MZM]; + (dist.f[dirBE ])[kb] = distribution.f[VF::LBM::DIR::PZM]; + (dist.f[dirTW ])[kw] = distribution.f[VF::LBM::DIR::MZP]; + (dist.f[dirTN ])[k] = distribution.f[VF::LBM::DIR::ZPP]; + (dist.f[dirBS ])[kbs] = distribution.f[VF::LBM::DIR::ZMM]; + (dist.f[dirBN ])[kb] = distribution.f[VF::LBM::DIR::ZPM]; + (dist.f[dirTS ])[ks] = distribution.f[VF::LBM::DIR::ZMP]; + (dist.f[dirTNE ])[k] = distribution.f[VF::LBM::DIR::PPP]; + (dist.f[dirTNW ])[kw] = distribution.f[VF::LBM::DIR::MPP]; + (dist.f[dirTSE ])[ks] = distribution.f[VF::LBM::DIR::PMP]; + (dist.f[dirTSW ])[ksw] = distribution.f[VF::LBM::DIR::MMP]; + (dist.f[dirBNE ])[kb] = distribution.f[VF::LBM::DIR::PPM]; + (dist.f[dirBNE ])[kb] = distribution.f[VF::LBM::DIR::MPM]; + (dist.f[dirBSE ])[kbs] = distribution.f[VF::LBM::DIR::PMM]; + (dist.f[dirBSW ])[kbsw] = distribution.f[VF::LBM::DIR::MMM]; + (dist.f[dirREST])[k] = distribution.f[VF::LBM::DIR::ZZZ]; + } + + VF::LBM::Distribution27 distribution; + + const uint k; + const uint kw; + const uint ks; + const uint kb; + const uint ksw; + const uint kbw; + const uint kbs; + const uint kbsw; +}; + +//////////////////////////////////////////////////////////////////////////////// +extern "C" __global__ void Cumulant_K17_LBM_Device_Kernel( + real omega, + uint* typeOfGridNode, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + real* distributions, + int size_Mat, + int level, + real* forces, + bool isEvenTimestep) +{ + ////////////////////////////////////////////////////////////////////////// + //! Cumulant K17 Kernel is based on \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! and \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.07.004"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.07.004 ]</b></a> + //! + //! The cumulant kernel is executed in the following steps + //! + //////////////////////////////////////////////////////////////////////////////// + //! - Get node index coordinates from thredIdx, blockIdx, blockDim and gridDim. + //! + const unsigned x = threadIdx.x; + const unsigned y = blockIdx.x; + const unsigned z = blockIdx.y; + + const unsigned nx = blockDim.x; + const unsigned ny = gridDim.x; + + const unsigned k = nx*(ny*z + y) + x; + + ////////////////////////////////////////////////////////////////////////// + // run for all indices in size_Mat and fluid nodes + if ((k < size_Mat) && (typeOfGridNode[k] == GEO_FLUID)) + { + ////////////////////////////////////////////////////////////////////////// + //! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm \ref + //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a> + //! + Distributions27 dist = getDistributions27(distributions, size_Mat, isEvenTimestep); + + // //////////////////////////////////////////////////////////////////////////////// + // //! - Set neighbor indices (necessary for indirect addressing) + const uint kw = neighborX[k]; + const uint ks = neighborY[k]; + const uint kb = neighborZ[k]; + const uint ksw = neighborY[kw]; + const uint kbw = neighborZ[kw]; + const uint kbs = neighborZ[ks]; + const uint kbsw = neighborZ[ksw]; + + ABC abc = { + k, + kw , + ks , + kb , + ksw , + kbw , + kbs , + kbsw + }; + + // //////////////////////////////////////////////////////////////////////////////////// + // //! - Set local distributions + // //! + // VF::LBM::Distribution27 distribution_in; + + // distribution_in.f[VF::LBM::DIR::PZZ] = (dist.f[dirE ])[k]; + // distribution_in.f[VF::LBM::DIR::MZZ] = (dist.f[dirW ])[kw]; + // distribution_in.f[VF::LBM::DIR::ZPZ] = (dist.f[dirN ])[k]; + // distribution_in.f[VF::LBM::DIR::ZMZ] = (dist.f[dirS ])[ks]; + // distribution_in.f[VF::LBM::DIR::ZZP] = (dist.f[dirT ])[k]; + // distribution_in.f[VF::LBM::DIR::ZZM] = (dist.f[dirB ])[kb]; + // distribution_in.f[VF::LBM::DIR::PPZ] = (dist.f[dirNE ])[k]; + // distribution_in.f[VF::LBM::DIR::MMZ] = (dist.f[dirSW ])[ksw]; + // distribution_in.f[VF::LBM::DIR::PMZ] = (dist.f[dirSE ])[ks]; + // distribution_in.f[VF::LBM::DIR::MPZ] = (dist.f[dirNW ])[kw]; + // distribution_in.f[VF::LBM::DIR::PZP] = (dist.f[dirTE ])[k]; + // distribution_in.f[VF::LBM::DIR::MZM] = (dist.f[dirBW ])[kbw]; + // distribution_in.f[VF::LBM::DIR::PZM] = (dist.f[dirBE ])[kb]; + // distribution_in.f[VF::LBM::DIR::MZP] = (dist.f[dirTW ])[kw]; + // distribution_in.f[VF::LBM::DIR::ZPP] = (dist.f[dirTN ])[k]; + // distribution_in.f[VF::LBM::DIR::ZMM] = (dist.f[dirBS ])[kbs]; + // distribution_in.f[VF::LBM::DIR::ZPM] = (dist.f[dirBN ])[kb]; + // distribution_in.f[VF::LBM::DIR::ZMP] = (dist.f[dirTS ])[ks]; + // distribution_in.f[VF::LBM::DIR::PPP] = (dist.f[dirTNE ])[k]; + // distribution_in.f[VF::LBM::DIR::MPP] = (dist.f[dirTNW ])[kw]; + // distribution_in.f[VF::LBM::DIR::PMP] = (dist.f[dirTSE ])[ks]; + // distribution_in.f[VF::LBM::DIR::MMP] = (dist.f[dirTSW ])[ksw]; + // distribution_in.f[VF::LBM::DIR::PPM] = (dist.f[dirBNE ])[kb]; + // distribution_in.f[VF::LBM::DIR::MPM] = (dist.f[dirBNE ])[kb]; + // distribution_in.f[VF::LBM::DIR::PMM] = (dist.f[dirBSE ])[kbs]; + // distribution_in.f[VF::LBM::DIR::MMM] = (dist.f[dirBSW ])[kbsw]; + // distribution_in.f[VF::LBM::DIR::ZZZ] = (dist.f[dirREST])[k]; + + abc.read(dist); + + real vx = forces[0] / pow((double)c2o1, (double)level); + real vy = forces[1] / pow((double)c2o1, (double)level); + real vz = forces[2] / pow((double)c2o1, (double)level); + real forces[3] {vx, vy, vz}; + + // VF::LBM::Distribution27 distribution_out = VF::LBM::cumulantChimera(distribution_in, omega, forces); + + abc.distribution = VF::LBM::cumulantChimera(abc.distribution, omega, forces); + + abc.write(dist); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Write distributions: style of reading and writing the distributions from/to + //! stored arrays dependent on timestep is based on the esoteric twist algorithm + //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a> + //! + // (dist.f[dirE ])[k] = distribution_out.f[VF::LBM::DIR::PZZ]; + // (dist.f[dirW ])[kw] = distribution_out.f[VF::LBM::DIR::MZZ]; + // (dist.f[dirN ])[k] = distribution_out.f[VF::LBM::DIR::ZPZ]; + // (dist.f[dirS ])[ks] = distribution_out.f[VF::LBM::DIR::ZMZ]; + // (dist.f[dirT ])[k] = distribution_out.f[VF::LBM::DIR::ZZP]; + // (dist.f[dirB ])[kb] = distribution_out.f[VF::LBM::DIR::ZZM]; + // (dist.f[dirNE ])[k] = distribution_out.f[VF::LBM::DIR::PPZ]; + // (dist.f[dirSW ])[ksw] = distribution_out.f[VF::LBM::DIR::MMZ]; + // (dist.f[dirSE ])[ks] = distribution_out.f[VF::LBM::DIR::PMZ]; + // (dist.f[dirNW ])[kw] = distribution_out.f[VF::LBM::DIR::MPZ]; + // (dist.f[dirTE ])[k] = distribution_out.f[VF::LBM::DIR::PZP]; + // (dist.f[dirBW ])[kbw] = distribution_out.f[VF::LBM::DIR::MZM]; + // (dist.f[dirBE ])[kb] = distribution_out.f[VF::LBM::DIR::PZM]; + // (dist.f[dirTW ])[kw] = distribution_out.f[VF::LBM::DIR::MZP]; + // (dist.f[dirTN ])[k] = distribution_out.f[VF::LBM::DIR::ZPP]; + // (dist.f[dirBS ])[kbs] = distribution_out.f[VF::LBM::DIR::ZMM]; + // (dist.f[dirBN ])[kb] = distribution_out.f[VF::LBM::DIR::ZPM]; + // (dist.f[dirTS ])[ks] = distribution_out.f[VF::LBM::DIR::ZMP]; + // (dist.f[dirTNE ])[k] = distribution_out.f[VF::LBM::DIR::PPP]; + // (dist.f[dirTNW ])[kw] = distribution_out.f[VF::LBM::DIR::MPP]; + // (dist.f[dirTSE ])[ks] = distribution_out.f[VF::LBM::DIR::PMP]; + // (dist.f[dirTSW ])[ksw] = distribution_out.f[VF::LBM::DIR::MMP]; + // (dist.f[dirBNE ])[kb] = distribution_out.f[VF::LBM::DIR::PPM]; + // (dist.f[dirBNE ])[kb] = distribution_out.f[VF::LBM::DIR::MPM]; + // (dist.f[dirBSE ])[kbs] = distribution_out.f[VF::LBM::DIR::PMM]; + // (dist.f[dirBSW ])[kbsw] = distribution_out.f[VF::LBM::DIR::MMM]; + // (dist.f[dirREST])[k] = distribution_out.f[VF::LBM::DIR::ZZZ]; + } +} +//////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////// +extern "C" __global__ void Cumulant_K17_LBM_Device_Kernel_old( + real omega, + uint* typeOfGridNode, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + real* distributions, + int size_Mat, + int level, + real* forces, + bool isEvenTimestep) +{ + ////////////////////////////////////////////////////////////////////////// + //! Cumulant K17 Kernel is based on \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! and \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.07.004"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.07.004 ]</b></a> + //! + //! The cumulant kernel is executed in the following steps + //! + //////////////////////////////////////////////////////////////////////////////// + //! - Get node index coordinates from thredIdx, blockIdx, blockDim and gridDim. + //! + const unsigned x = threadIdx.x; + const unsigned y = blockIdx.x; + const unsigned z = blockIdx.y; + + const unsigned nx = blockDim.x; + const unsigned ny = gridDim.x; + + const unsigned k = nx*(ny*z + y) + x; + + ////////////////////////////////////////////////////////////////////////// + // run for all indices in size_Mat and fluid nodes + if ((k < size_Mat) && (typeOfGridNode[k] == GEO_FLUID)) + { + ////////////////////////////////////////////////////////////////////////// + //! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm \ref + //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a> + //! + Distributions27 dist; + if (isEvenTimestep) + { + dist.f[dirE ] = &distributions[dirE *size_Mat]; + dist.f[dirW ] = &distributions[dirW *size_Mat]; + dist.f[dirN ] = &distributions[dirN *size_Mat]; + dist.f[dirS ] = &distributions[dirS *size_Mat]; + dist.f[dirT ] = &distributions[dirT *size_Mat]; + dist.f[dirB ] = &distributions[dirB *size_Mat]; + dist.f[dirNE ] = &distributions[dirNE *size_Mat]; + dist.f[dirSW ] = &distributions[dirSW *size_Mat]; + dist.f[dirSE ] = &distributions[dirSE *size_Mat]; + dist.f[dirNW ] = &distributions[dirNW *size_Mat]; + dist.f[dirTE ] = &distributions[dirTE *size_Mat]; + dist.f[dirBW ] = &distributions[dirBW *size_Mat]; + dist.f[dirBE ] = &distributions[dirBE *size_Mat]; + dist.f[dirTW ] = &distributions[dirTW *size_Mat]; + dist.f[dirTN ] = &distributions[dirTN *size_Mat]; + dist.f[dirBS ] = &distributions[dirBS *size_Mat]; + dist.f[dirBN ] = &distributions[dirBN *size_Mat]; + dist.f[dirTS ] = &distributions[dirTS *size_Mat]; + dist.f[dirREST] = &distributions[dirREST*size_Mat]; + dist.f[dirTNE ] = &distributions[dirTNE *size_Mat]; + dist.f[dirTSW ] = &distributions[dirTSW *size_Mat]; + dist.f[dirTSE ] = &distributions[dirTSE *size_Mat]; + dist.f[dirTNW ] = &distributions[dirTNW *size_Mat]; + dist.f[dirBNE ] = &distributions[dirBNE *size_Mat]; + dist.f[dirBSW ] = &distributions[dirBSW *size_Mat]; + dist.f[dirBSE ] = &distributions[dirBSE *size_Mat]; + dist.f[dirBNW ] = &distributions[dirBNW *size_Mat]; + } + else + { + dist.f[dirW ] = &distributions[dirE *size_Mat]; + dist.f[dirE ] = &distributions[dirW *size_Mat]; + dist.f[dirS ] = &distributions[dirN *size_Mat]; + dist.f[dirN ] = &distributions[dirS *size_Mat]; + dist.f[dirB ] = &distributions[dirT *size_Mat]; + dist.f[dirT ] = &distributions[dirB *size_Mat]; + dist.f[dirSW ] = &distributions[dirNE *size_Mat]; + dist.f[dirNE ] = &distributions[dirSW *size_Mat]; + dist.f[dirNW ] = &distributions[dirSE *size_Mat]; + dist.f[dirSE ] = &distributions[dirNW *size_Mat]; + dist.f[dirBW ] = &distributions[dirTE *size_Mat]; + dist.f[dirTE ] = &distributions[dirBW *size_Mat]; + dist.f[dirTW ] = &distributions[dirBE *size_Mat]; + dist.f[dirBE ] = &distributions[dirTW *size_Mat]; + dist.f[dirBS ] = &distributions[dirTN *size_Mat]; + dist.f[dirTN ] = &distributions[dirBS *size_Mat]; + dist.f[dirTS ] = &distributions[dirBN *size_Mat]; + dist.f[dirBN ] = &distributions[dirTS *size_Mat]; + dist.f[dirREST] = &distributions[dirREST*size_Mat]; + dist.f[dirBSW ] = &distributions[dirTNE *size_Mat]; + dist.f[dirBNE ] = &distributions[dirTSW *size_Mat]; + dist.f[dirBNW ] = &distributions[dirTSE *size_Mat]; + dist.f[dirBSE ] = &distributions[dirTNW *size_Mat]; + dist.f[dirTSW ] = &distributions[dirBNE *size_Mat]; + dist.f[dirTNE ] = &distributions[dirBSW *size_Mat]; + dist.f[dirTNW ] = &distributions[dirBSE *size_Mat]; + dist.f[dirTSE ] = &distributions[dirBNW *size_Mat]; + } + //////////////////////////////////////////////////////////////////////////////// + //! - Set neighbor indices (necessary for indirect addressing) + uint kw = neighborX[k]; + uint ks = neighborY[k]; + uint kb = neighborZ[k]; + uint ksw = neighborY[kw]; + uint kbw = neighborZ[kw]; + uint kbs = neighborZ[ks]; + uint kbsw = neighborZ[ksw]; + //////////////////////////////////////////////////////////////////////////////////// + //! - Set local distributions + //! + real mfcbb = (dist.f[dirE ])[k]; + real mfabb = (dist.f[dirW ])[kw]; + real mfbcb = (dist.f[dirN ])[k]; + real mfbab = (dist.f[dirS ])[ks]; + real mfbbc = (dist.f[dirT ])[k]; + real mfbba = (dist.f[dirB ])[kb]; + real mfccb = (dist.f[dirNE ])[k]; + real mfaab = (dist.f[dirSW ])[ksw]; + real mfcab = (dist.f[dirSE ])[ks]; + real mfacb = (dist.f[dirNW ])[kw]; + real mfcbc = (dist.f[dirTE ])[k]; + real mfaba = (dist.f[dirBW ])[kbw]; + real mfcba = (dist.f[dirBE ])[kb]; + real mfabc = (dist.f[dirTW ])[kw]; + real mfbcc = (dist.f[dirTN ])[k]; + real mfbaa = (dist.f[dirBS ])[kbs]; + real mfbca = (dist.f[dirBN ])[kb]; + real mfbac = (dist.f[dirTS ])[ks]; + real mfbbb = (dist.f[dirREST])[k]; + real mfccc = (dist.f[dirTNE ])[k]; + real mfaac = (dist.f[dirTSW ])[ksw]; + real mfcac = (dist.f[dirTSE ])[ks]; + real mfacc = (dist.f[dirTNW ])[kw]; + real mfcca = (dist.f[dirBNE ])[kb]; + real mfaaa = (dist.f[dirBSW ])[kbsw]; + real mfcaa = (dist.f[dirBSE ])[kbs]; + real mfaca = (dist.f[dirBNW ])[kbw]; + + //////////////////////////////////////////////////////////////////////////////////// + //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! + real drho = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + real rho = c1o1 + drho; + real OOrho = c1o1 / rho; + real vvx = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)) * OOrho; + real vvy = + ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)) * OOrho; + real vvz = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)) * OOrho; + //////////////////////////////////////////////////////////////////////////////////// + //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! + vvx += forces[0] * c1o2; + vvy += forces[1] * c1o2; + vvz += forces[2] * c1o2; + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + real vx2 = vvx*vvx; + real vy2 = vvy*vvy; + real vz2 = vvz*vvz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Set relaxation limiters for third order cumulants to default value \f$ \lambda=0.001 \f$ according to section 6 in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + real wadjust; + real qudricLimitP = c1o100; + real qudricLimitM = c1o100; + real qudricLimitD = c1o100; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! see also Eq. (6)-(14) in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + VF::LBM::forwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36o1, c1o36); + VF::LBM::forwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9o1, c1o9); + VF::LBM::forwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36o1, c1o36); + VF::LBM::forwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9o1, c1o9); + VF::LBM::forwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9); + VF::LBM::forwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9o1, c1o9); + VF::LBM::forwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36o1, c1o36); + VF::LBM::forwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9o1, c1o9); + VF::LBM::forwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36o1, c1o36); + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + VF::LBM::forwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6o1, c1o6); + VF::LBM::forwardChimera( mfaab, mfabb, mfacb, vvy, vy2); + VF::LBM::forwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18o1, c1o18); + VF::LBM::forwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3); + VF::LBM::forwardChimera( mfbab, mfbbb, mfbcb, vvy, vy2); + VF::LBM::forwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9); + VF::LBM::forwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6o1, c1o6); + VF::LBM::forwardChimera( mfcab, mfcbb, mfccb, vvy, vy2); + VF::LBM::forwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18o1, c1o18); + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + VF::LBM::forwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1); + VF::LBM::forwardChimera( mfaba, mfbba, mfcba, vvx, vx2); + VF::LBM::forwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3o1, c1o3); + VF::LBM::forwardChimera( mfaab, mfbab, mfcab, vvx, vx2); + VF::LBM::forwardChimera( mfabb, mfbbb, mfcbb, vvx, vx2); + VF::LBM::forwardChimera( mfacb, mfbcb, mfccb, vvx, vx2); + VF::LBM::forwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3o1, c1o3); + VF::LBM::forwardChimera( mfabc, mfbbc, mfcbc, vvx, vx2); + VF::LBM::forwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c3o1, c1o9); + //////////////////////////////////////////////////////////////////////////////////// + //! - Setting relaxation rates for non-hydrodynamic cumulants (default values). Variable names and equations according to + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! => [NAME IN PAPER]=[NAME IN CODE]=[DEFAULT VALUE]. + //! - Trace of second order cumulants \f$ C_{200}+C_{020}+C_{002} \f$ used to adjust bulk viscosity:\f$\omega_2=OxxPyyPzz=1.0 \f$. + //! - Third order cumulants \f$ C_{120}+C_{102}, C_{210}+C_{012}, C_{201}+C_{021} \f$: \f$ \omega_3=OxyyPxzz \f$ set according to Eq. (111) with simplifications assuming \f$ \omega_2=1.0\f$. + //! - Third order cumulants \f$ C_{120}-C_{102}, C_{210}-C_{012}, C_{201}-C_{021} \f$: \f$ \omega_4 = OxyyMxzz \f$ set according to Eq. (112) with simplifications assuming \f$ \omega_2 = 1.0\f$. + //! - Third order cumulants \f$ C_{111} \f$: \f$ \omega_5 = Oxyz \f$ set according to Eq. (113) with simplifications assuming \f$ \omega_2 = 1.0\f$ (modify for different bulk viscosity). + //! - Fourth order cumulants \f$ C_{220}, C_{202}, C_{022}, C_{211}, C_{121}, C_{112} \f$: for simplification all set to the same default value \f$ \omega_6=\omega_7=\omega_8=O4=1.0 \f$. + //! - Fifth order cumulants \f$ C_{221}, C_{212}, C_{122}\f$: \f$\omega_9=O5=1.0\f$. + //! - Sixth order cumulant \f$ C_{222}\f$: \f$\omega_{10}=O6=1.0\f$. + //! + //////////////////////////////////////////////////////////// + //2. + real OxxPyyPzz = c1o1; + //////////////////////////////////////////////////////////// + //3. + real OxyyPxzz = c8o1 * (-c2o1 + omega) * ( c1o1 + c2o1*omega) / (-c8o1 - c14o1*omega + c7o1*omega*omega); + real OxyyMxzz = c8o1 * (-c2o1 + omega) * (-c7o1 + c4o1*omega) / (c56o1 - c50o1*omega + c9o1*omega*omega); + real Oxyz = c24o1 * (-c2o1 + omega) * (-c2o1 - c7o1*omega + c3o1*omega*omega) / (c48o1 + c152o1*omega - c130o1*omega*omega + c29o1*omega*omega*omega); + //////////////////////////////////////////////////////////// + //4. + real O4 = c1o1; + //////////////////////////////////////////////////////////// + //5. + real O5 = c1o1; + //////////////////////////////////////////////////////////// + //6. + real O6 = c1o1; + //////////////////////////////////////////////////////////////////////////////////// + //! - A and B: parameters for fourth order convergence of the diffusion term according to Eq. (114) and (115) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! with simplifications assuming \f$ \omega_2 = 1.0 \f$ (modify for different bulk viscosity). + //! + real A = (c4o1 + c2o1*omega - c3o1*omega*omega) / (c2o1 - c7o1*omega + c5o1*omega*omega); + real B = (c4o1 + c28o1*omega - c14o1*omega*omega) / (c6o1 - c21o1*omega + c15o1*omega*omega); + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute cumulants from central moments according to Eq. (20)-(23) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + //////////////////////////////////////////////////////////// + //4. + real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) * OOrho; + real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) * OOrho; + real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) * OOrho; + real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) * OOrho - c1o9*(drho * OOrho)); + real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) * OOrho - c1o9*(drho * OOrho)); + real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) * OOrho - c1o9*(drho * OOrho)); + //////////////////////////////////////////////////////////// + //5. + real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) * OOrho; + real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) * OOrho; + real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) * OOrho; + //////////////////////////////////////////////////////////// + //6. + real CUMccc = mfccc + ((-c4o1 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho + + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2o1 * (mfcaa * mfaca * mfaac) + + c16o1 * mfbba * mfbab * mfabb) * OOrho * OOrho + - c1o3 * (mfacc + mfcac + mfcca) * OOrho + - c1o9 * (mfcaa + mfaca + mfaac) * OOrho + + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 + + c1o27*((drho * drho - drho) * OOrho * OOrho)); + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute linear combinations of second and third order cumulants + //! + //////////////////////////////////////////////////////////// + //2. + real mxxPyyPzz = mfcaa + mfaca + mfaac; + real mxxMyy = mfcaa - mfaca; + real mxxMzz = mfcaa - mfaac; + //////////////////////////////////////////////////////////// + //3. + real mxxyPyzz = mfcba + mfabc; + real mxxyMyzz = mfcba - mfabc; + real mxxzPyyz = mfcab + mfacb; + real mxxzMyyz = mfcab - mfacb; + real mxyyPxzz = mfbca + mfbac; + real mxyyMxzz = mfbca - mfbac; + //////////////////////////////////////////////////////////////////////////////////// + //incl. correction + //////////////////////////////////////////////////////////// + //! - Compute velocity gradients from second order cumulants according to Eq. (27)-(32) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! Further explanations of the correction in viscosity in Appendix H of + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! Note that the division by rho is omitted here as we need rho times the gradients later. + //! + real Dxy = -c3o1*omega*mfbba; + real Dxz = -c3o1*omega*mfbab; + real Dyz = -c3o1*omega*mfabb; + real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + real dyuy = dxux + omega * c3o2 * mxxMyy; + real dzuz = dxux + omega * c3o2 * mxxMzz; + //////////////////////////////////////////////////////////// + //! - Relaxation of second order cumulants with correction terms according to Eq. (33)-(35) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); + //////////////////////////////////////////////////////////////////////////////////// + ////no correction + //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz); + //mxxMyy += -(-omega) * (-mxxMyy); + //mxxMzz += -(-omega) * (-mxxMzz); + ////////////////////////////////////////////////////////////////////////// + mfabb += omega * (-mfabb); + mfbab += omega * (-mfbab); + mfbba += omega * (-mfbba); + //////////////////////////////////////////////////////////////////////////////////// + //relax + ////////////////////////////////////////////////////////////////////////// + // incl. limiter + //! - Relaxation of third order cumulants including limiter according to Eq. (116)-(123) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + wadjust = Oxyz + (c1o1 - Oxyz)*abs(mfbbb) / (abs(mfbbb) + qudricLimitD); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (c1o1 - OxyyPxzz)*abs(mxxyPyzz) / (abs(mxxyPyzz) + qudricLimitP); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (c1o1 - OxyyMxzz)*abs(mxxyMyzz) / (abs(mxxyMyzz) + qudricLimitM); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (c1o1 - OxyyPxzz)*abs(mxxzPyyz) / (abs(mxxzPyyz) + qudricLimitP); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (c1o1 - OxyyMxzz)*abs(mxxzMyyz) / (abs(mxxzMyyz) + qudricLimitM); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (c1o1 - OxyyPxzz)*abs(mxyyPxzz) / (abs(mxyyPxzz) + qudricLimitP); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (c1o1 - OxyyMxzz)*abs(mxyyMxzz) / (abs(mxyyMxzz) + qudricLimitM); + mxyyMxzz += wadjust * (-mxyyMxzz); + ////////////////////////////////////////////////////////////////////////// + // no limiter + //mfbbb += OxyyMxzz * (-mfbbb); + //mxxyPyzz += OxyyPxzz * (-mxxyPyzz); + //mxxyMyzz += OxyyMxzz * (-mxxyMyzz); + //mxxzPyyz += OxyyPxzz * (-mxxzPyyz); + //mxxzMyyz += OxyyMxzz * (-mxxzMyyz); + //mxyyPxzz += OxyyPxzz * (-mxyyPxzz); + //mxyyMxzz += OxyyMxzz * (-mxyyMxzz); + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute inverse linear combinations of second and third order cumulants + //! + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-c2o1* mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz); + mfcba = ( mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = ( mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = ( mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //4. + // no limiter + //! - Relax fourth order cumulants to modified equilibrium for fourth order convergence of diffusion according to Eq. (43)-(48) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + CUMacc = -O4*(c1o1 / omega - c1o2) * (dyuy + dzuz) * c2o3 * A + (c1o1 - O4) * (CUMacc); + CUMcac = -O4*(c1o1 / omega - c1o2) * (dxux + dzuz) * c2o3 * A + (c1o1 - O4) * (CUMcac); + CUMcca = -O4*(c1o1 / omega - c1o2) * (dyuy + dxux) * c2o3 * A + (c1o1 - O4) * (CUMcca); + CUMbbc = -O4*(c1o1 / omega - c1o2) * Dxy * c1o3 * B + (c1o1 - O4) * (CUMbbc); + CUMbcb = -O4*(c1o1 / omega - c1o2) * Dxz * c1o3 * B + (c1o1 - O4) * (CUMbcb); + CUMcbb = -O4*(c1o1 / omega - c1o2) * Dyz * c1o3 * B + (c1o1 - O4) * (CUMcbb); + ////////////////////////////////////////////////////////////////////////// + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + ////////////////////////////////////////////////////////////////////////// + //6. + CUMccc += O6 * (-CUMccc); + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute central moments from post collision cumulants according to Eq. (53)-(56) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + ////////////////////////////////////////////////////////////////////////// + //4. + mfcbb = CUMcbb + c1o3*((c3o1*mfcaa + c1o1) * mfabb + c6o1 * mfbba * mfbab) * OOrho; + mfbcb = CUMbcb + c1o3*((c3o1*mfaca + c1o1) * mfbab + c6o1 * mfbba * mfabb) * OOrho; + mfbbc = CUMbbc + c1o3*((c3o1*mfaac + c1o1) * mfbba + c6o1 * mfbab * mfabb) * OOrho; + mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba)*c9o1 + c3o1 * (mfcaa + mfaca)) * OOrho - (drho * OOrho))*c1o9; + mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab)*c9o1 + c3o1 * (mfcaa + mfaac)) * OOrho - (drho * OOrho))*c1o9; + mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb)*c9o1 + c3o1 * (mfaac + mfaca)) * OOrho - (drho * OOrho))*c1o9; + ////////////////////////////////////////////////////////////////////////// + //5. + mfbcc = CUMbcc + c1o3 *(c3o1*(mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + (mfbca + mfbac)) * OOrho; + mfcbc = CUMcbc + c1o3 *(c3o1*(mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + (mfcba + mfabc)) * OOrho; + mfccb = CUMccb + c1o3 *(c3o1*(mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + (mfacb + mfcab)) * OOrho; + ////////////////////////////////////////////////////////////////////////// + //6. + mfccc = CUMccc - ((-c4o1 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho + + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2o1 * (mfcaa * mfaca * mfaac) + + c16o1 * mfbba * mfbab * mfabb) * OOrho * OOrho + - c1o3 * (mfacc + mfcac + mfcca) * OOrho + - c1o9 * (mfcaa + mfaca + mfaac) * OOrho + + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 + + c1o27*((drho * drho - drho) * OOrho * OOrho)); + //////////////////////////////////////////////////////////////////////////////////// + //! - Add acceleration (body force) to first order cumulants according to Eq. (85)-(87) in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! see also Eq. (88)-(96) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + VF::LBM::backwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1); + VF::LBM::backwardChimera( mfaba, mfbba, mfcba, vvx, vx2); + VF::LBM::backwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3o1, c1o3); + VF::LBM::backwardChimera( mfaab, mfbab, mfcab, vvx, vx2); + VF::LBM::backwardChimera( mfabb, mfbbb, mfcbb, vvx, vx2); + VF::LBM::backwardChimera( mfacb, mfbcb, mfccb, vvx, vx2); + VF::LBM::backwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3o1, c1o3); + VF::LBM::backwardChimera( mfabc, mfbbc, mfcbc, vvx, vx2); + VF::LBM::backwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c9o1, c1o9); + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + VF::LBM::backwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6o1, c1o6); + VF::LBM::backwardChimera( mfaab, mfabb, mfacb, vvy, vy2); + VF::LBM::backwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18o1, c1o18); + VF::LBM::backwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3); + VF::LBM::backwardChimera( mfbab, mfbbb, mfbcb, vvy, vy2); + VF::LBM::backwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9); + VF::LBM::backwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6o1, c1o6); + VF::LBM::backwardChimera( mfcab, mfcbb, mfccb, vvy, vy2); + VF::LBM::backwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18o1, c1o18); + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + VF::LBM::backwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36o1, c1o36); + VF::LBM::backwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9o1, c1o9); + VF::LBM::backwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36o1, c1o36); + VF::LBM::backwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9o1, c1o9); + VF::LBM::backwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9); + VF::LBM::backwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9o1, c1o9); + VF::LBM::backwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36o1, c1o36); + VF::LBM::backwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9o1, c1o9); + VF::LBM::backwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36o1, c1o36); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Write distributions: style of reading and writing the distributions from/to + //! stored arrays dependent on timestep is based on the esoteric twist algorithm + //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a> + //! + (dist.f[dirE ])[k ] = mfabb; + (dist.f[dirW ])[kw ] = mfcbb; + (dist.f[dirN ])[k ] = mfbab; + (dist.f[dirS ])[ks ] = mfbcb; + (dist.f[dirT ])[k ] = mfbba; + (dist.f[dirB ])[kb ] = mfbbc; + (dist.f[dirNE ])[k ] = mfaab; + (dist.f[dirSW ])[ksw ] = mfccb; + (dist.f[dirSE ])[ks ] = mfacb; + (dist.f[dirNW ])[kw ] = mfcab; + (dist.f[dirTE ])[k ] = mfaba; + (dist.f[dirBW ])[kbw ] = mfcbc; + (dist.f[dirBE ])[kb ] = mfabc; + (dist.f[dirTW ])[kw ] = mfcba; + (dist.f[dirTN ])[k ] = mfbaa; + (dist.f[dirBS ])[kbs ] = mfbcc; + (dist.f[dirBN ])[kb ] = mfbac; + (dist.f[dirTS ])[ks ] = mfbca; + (dist.f[dirREST])[k ] = mfbbb; + (dist.f[dirTNE ])[k ] = mfaaa; + (dist.f[dirTSE ])[ks ] = mfaca; + (dist.f[dirBNE ])[kb ] = mfaac; + (dist.f[dirBSE ])[kbs ] = mfacc; + (dist.f[dirTNW ])[kw ] = mfcaa; + (dist.f[dirTSW ])[ksw ] = mfcca; + (dist.f[dirBNW ])[kbw ] = mfcac; + (dist.f[dirBSW ])[kbsw] = mfccc; + } +} +//////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// extern "C" __global__ void Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27( - real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd) + real omega, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd) { - //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index - - const unsigned nx = blockDim.x; - const unsigned ny = gridDim.x; - - const unsigned k = nx*(ny*z + y) + x; - ////////////////////////////////////////////////////////////////////////// - - if (k<size_Mat) - { - //////////////////////////////////////////////////////////////////////////////// - unsigned int BC; - BC = bcMatD[k]; - - if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/) - { - Distributions27 D; - if (EvenOrOdd == true) - { - D.f[dirE] = &DDStart[dirE *size_Mat]; - D.f[dirW] = &DDStart[dirW *size_Mat]; - D.f[dirN] = &DDStart[dirN *size_Mat]; - D.f[dirS] = &DDStart[dirS *size_Mat]; - D.f[dirT] = &DDStart[dirT *size_Mat]; - D.f[dirB] = &DDStart[dirB *size_Mat]; - D.f[dirNE] = &DDStart[dirNE *size_Mat]; - D.f[dirSW] = &DDStart[dirSW *size_Mat]; - D.f[dirSE] = &DDStart[dirSE *size_Mat]; - D.f[dirNW] = &DDStart[dirNW *size_Mat]; - D.f[dirTE] = &DDStart[dirTE *size_Mat]; - D.f[dirBW] = &DDStart[dirBW *size_Mat]; - D.f[dirBE] = &DDStart[dirBE *size_Mat]; - D.f[dirTW] = &DDStart[dirTW *size_Mat]; - D.f[dirTN] = &DDStart[dirTN *size_Mat]; - D.f[dirBS] = &DDStart[dirBS *size_Mat]; - D.f[dirBN] = &DDStart[dirBN *size_Mat]; - D.f[dirTS] = &DDStart[dirTS *size_Mat]; - D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; - D.f[dirTNE] = &DDStart[dirTNE *size_Mat]; - D.f[dirTSW] = &DDStart[dirTSW *size_Mat]; - D.f[dirTSE] = &DDStart[dirTSE *size_Mat]; - D.f[dirTNW] = &DDStart[dirTNW *size_Mat]; - D.f[dirBNE] = &DDStart[dirBNE *size_Mat]; - D.f[dirBSW] = &DDStart[dirBSW *size_Mat]; - D.f[dirBSE] = &DDStart[dirBSE *size_Mat]; - D.f[dirBNW] = &DDStart[dirBNW *size_Mat]; - } - else - { - D.f[dirW] = &DDStart[dirE *size_Mat]; - D.f[dirE] = &DDStart[dirW *size_Mat]; - D.f[dirS] = &DDStart[dirN *size_Mat]; - D.f[dirN] = &DDStart[dirS *size_Mat]; - D.f[dirB] = &DDStart[dirT *size_Mat]; - D.f[dirT] = &DDStart[dirB *size_Mat]; - D.f[dirSW] = &DDStart[dirNE *size_Mat]; - D.f[dirNE] = &DDStart[dirSW *size_Mat]; - D.f[dirNW] = &DDStart[dirSE *size_Mat]; - D.f[dirSE] = &DDStart[dirNW *size_Mat]; - D.f[dirBW] = &DDStart[dirTE *size_Mat]; - D.f[dirTE] = &DDStart[dirBW *size_Mat]; - D.f[dirTW] = &DDStart[dirBE *size_Mat]; - D.f[dirBE] = &DDStart[dirTW *size_Mat]; - D.f[dirBS] = &DDStart[dirTN *size_Mat]; - D.f[dirTN] = &DDStart[dirBS *size_Mat]; - D.f[dirTS] = &DDStart[dirBN *size_Mat]; - D.f[dirBN] = &DDStart[dirTS *size_Mat]; - D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; - D.f[dirBSW] = &DDStart[dirTNE *size_Mat]; - D.f[dirBNE] = &DDStart[dirTSW *size_Mat]; - D.f[dirBNW] = &DDStart[dirTSE *size_Mat]; - D.f[dirBSE] = &DDStart[dirTNW *size_Mat]; - D.f[dirTSW] = &DDStart[dirBNE *size_Mat]; - D.f[dirTNE] = &DDStart[dirBSW *size_Mat]; - D.f[dirTNW] = &DDStart[dirBSE *size_Mat]; - D.f[dirTSE] = &DDStart[dirBNW *size_Mat]; - } - - //////////////////////////////////////////////////////////////////////////////// - //index - //unsigned int kzero= k; - //unsigned int ke = k; - unsigned int kw = neighborX[k]; - //unsigned int kn = k; - unsigned int ks = neighborY[k]; - //unsigned int kt = k; - unsigned int kb = neighborZ[k]; - unsigned int ksw = neighborY[kw]; - //unsigned int kne = k; - //unsigned int kse = ks; - //unsigned int knw = kw; - unsigned int kbw = neighborZ[kw]; - //unsigned int kte = k; - //unsigned int kbe = kb; - //unsigned int ktw = kw; - unsigned int kbs = neighborZ[ks]; - //unsigned int ktn = k; - //unsigned int kbn = kb; - //unsigned int kts = ks; - //unsigned int ktse = ks; - //unsigned int kbnw = kbw; - //unsigned int ktnw = kw; - //unsigned int kbse = kbs; - //unsigned int ktsw = ksw; - //unsigned int kbne = kb; - //unsigned int ktne = k; - unsigned int kbsw = neighborZ[ksw]; - - - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - real mfcbb = (D.f[dirE])[k];//[ke ];// + c2over27 ;(D.f[dirE ])[k ];//ke - real mfabb = (D.f[dirW])[kw];//[kw ];// + c2over27 ;(D.f[dirW ])[kw ]; - real mfbcb = (D.f[dirN])[k];//[kn ];// + c2over27 ;(D.f[dirN ])[k ];//kn - real mfbab = (D.f[dirS])[ks];//[ks ];// + c2over27 ;(D.f[dirS ])[ks ]; - real mfbbc = (D.f[dirT])[k];//[kt ];// + c2over27 ;(D.f[dirT ])[k ];//kt - real mfbba = (D.f[dirB])[kb];//[kb ];// + c2over27 ;(D.f[dirB ])[kb ]; - real mfccb = (D.f[dirNE])[k];//[kne ];// + c1over54 ;(D.f[dirNE ])[k ];//kne - real mfaab = (D.f[dirSW])[ksw];//[ksw ];// + c1over54 ;(D.f[dirSW ])[ksw]; - real mfcab = (D.f[dirSE])[ks];//[kse ];// + c1over54 ;(D.f[dirSE ])[ks ];//kse - real mfacb = (D.f[dirNW])[kw];//[knw ];// + c1over54 ;(D.f[dirNW ])[kw ];//knw - real mfcbc = (D.f[dirTE])[k];//[kte ];// + c1over54 ;(D.f[dirTE ])[k ];//kte - real mfaba = (D.f[dirBW])[kbw];//[kbw ];// + c1over54 ;(D.f[dirBW ])[kbw]; - real mfcba = (D.f[dirBE])[kb];//[kbe ];// + c1over54 ;(D.f[dirBE ])[kb ];//kbe - real mfabc = (D.f[dirTW])[kw];//[ktw ];// + c1over54 ;(D.f[dirTW ])[kw ];//ktw - real mfbcc = (D.f[dirTN])[k];//[ktn ];// + c1over54 ;(D.f[dirTN ])[k ];//ktn - real mfbaa = (D.f[dirBS])[kbs];//[kbs ];// + c1over54 ;(D.f[dirBS ])[kbs]; - real mfbca = (D.f[dirBN])[kb];//[kbn ];// + c1over54 ;(D.f[dirBN ])[kb ];//kbn - real mfbac = (D.f[dirTS])[ks];//[kts ];// + c1over54 ;(D.f[dirTS ])[ks ];//kts - real mfbbb = (D.f[dirZERO])[k];//[kzero];// + c8over27 ;(D.f[dirZERO])[k ];//kzero - real mfccc = (D.f[dirTNE])[k];//[ktne ];// + c1over216;(D.f[dirTNE ])[k ];//ktne - real mfaac = (D.f[dirTSW])[ksw];//[ktsw ];// + c1over216;(D.f[dirTSW ])[ksw];//ktsw - real mfcac = (D.f[dirTSE])[ks];//[ktse ];// + c1over216;(D.f[dirTSE ])[ks ];//ktse - real mfacc = (D.f[dirTNW])[kw];//[ktnw ];// + c1over216;(D.f[dirTNW ])[kw ];//ktnw - real mfcca = (D.f[dirBNE])[kb];//[kbne ];// + c1over216;(D.f[dirBNE ])[kb ];//kbne - real mfaaa = (D.f[dirBSW])[kbsw];//[kbsw ];// + c1over216;(D.f[dirBSW ])[kbsw]; - real mfcaa = (D.f[dirBSE])[kbs];//[kbse ];// + c1over216;(D.f[dirBSE ])[kbs];//kbse - real mfaca = (D.f[dirBNW])[kbw];//[kbnw ];// + c1over216;(D.f[dirBNW ])[kbw];//kbnw - //////////////////////////////////////////////////////////////////////////////////// - real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + - (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + - ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; - - real rho = c1o1 + drho; - //////////////////////////////////////////////////////////////////////////////////// - real vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + - (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + - (mfcbb - mfabb)) / rho; - real vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + - (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + - (mfbcb - mfbab)) / rho; - real vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + - (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + - (mfbbc - mfbba)) / rho; - //////////////////////////////////////////////////////////////////////////////////// - //the force be with you - real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; // - real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero; - real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero; - vvx += fx*c1o2; - vvy += fy*c1o2; - vvz += fz*c1o2; - //////////////////////////////////////////////////////////////////////////////////// - //real omega = omega_in; - //////////////////////////////////////////////////////////////////////////////////// - //fast - //real oMdrho = c1o1; // comp special - //real m0, m1, m2; - real vx2; - real vy2; - real vz2; - vx2 = vvx*vvx; - vy2 = vvy*vvy; - vz2 = vvz*vvz; - //////////////////////////////////////////////////////////////////////////////////// - //real wadjust; - //real qudricLimitP = c1o100;// * 0.0001f; - //real qudricLimitM = c1o100;// * 0.0001f; - //real qudricLimitD = c1o100;// * 0.001f; - //real s9 = minusomega; - //test - //s9 = 0.; - - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - real EQcbb = c0o1; - real EQabb = c0o1; - real EQbcb = c0o1; - real EQbab = c0o1; - real EQbbc = c0o1; - real EQbba = c0o1; - real EQccb = c0o1; - real EQaab = c0o1; - real EQcab = c0o1; - real EQacb = c0o1; - real EQcbc = c0o1; - real EQaba = c0o1; - real EQcba = c0o1; - real EQabc = c0o1; - real EQbcc = c0o1; - real EQbaa = c0o1; - real EQbca = c0o1; - real EQbac = c0o1; - real EQbbb = c0o1; - real EQccc = drho * c1o27; - real EQaac = drho * c1o3; - real EQcac = drho * c1o9; - real EQacc = drho * c1o9; - real EQcca = drho * c1o9; - real EQaaa = drho; - real EQcaa = drho * c1o3; - real EQaca = drho * c1o3; - //////////////////////////////////////////////////////////////////////////////////// - VF::LBM::backwardChimeraWithK(EQaaa, EQaab, EQaac, vvz, vz2, c1o1); - VF::LBM::backwardChimeraWithK(EQaca, EQacb, EQacc, vvz, vz2, c1o3); - /////////////////////////////////////////////////////////// - EQcaa = EQaca; EQcab = EQacb; EQcac = EQacc; - /////////////////////////////////////////////////////////// - VF::LBM::backwardChimeraWithK(EQcca, EQccb, EQccc, vvz, vz2, c1o9); - - VF::LBM::backwardChimeraWithK(EQaaa, EQaba, EQaca, vvy, vy2, c1o6); - VF::LBM::backwardChimeraWithK(EQaab, EQabb, EQacb, vvy, vy2, c2o3); - VF::LBM::backwardChimeraWithK(EQaac, EQabc, EQacc, vvy, vy2, c1o6); - VF::LBM::backwardChimeraWithK(EQcaa, EQcba, EQcca, vvy, vy2, c1o18); - VF::LBM::backwardChimeraWithK(EQcab, EQcbb, EQccb, vvy, vy2, c2o9); - VF::LBM::backwardChimeraWithK(EQcac, EQcbc, EQccc, vvy, vy2, c1o18); - - VF::LBM::backwardChimeraWithK(EQaaa, EQbaa, EQcaa, vvx, vx2, c1o36); - VF::LBM::backwardChimeraWithK(EQaab, EQbab, EQcab, vvx, vx2, c1o9); - VF::LBM::backwardChimeraWithK(EQaac, EQbac, EQcac, vvx, vx2, c1o36); - VF::LBM::backwardChimeraWithK(EQaba, EQbba, EQcba, vvx, vx2, c1o9); - VF::LBM::backwardChimeraWithK(EQabb, EQbbb, EQcbb, vvx, vx2, c4o9); - VF::LBM::backwardChimeraWithK(EQabc, EQbbc, EQcbc, vvx, vx2, c1o9); - VF::LBM::backwardChimeraWithK(EQaca, EQbca, EQcca, vvx, vx2, c1o36); - VF::LBM::backwardChimeraWithK(EQacb, EQbcb, EQccb, vvx, vx2, c1o9); - VF::LBM::backwardChimeraWithK(EQacc, EQbcc, EQccc, vvx, vx2, c1o36); - - //////////////////////////////////////////////////////////////////////////////////// - //Pre-condition - mfcbb -= EQcbb; - mfabb -= EQabb; - mfbcb -= EQbcb; - mfbab -= EQbab; - mfbbc -= EQbbc; - mfbba -= EQbba; - mfccb -= EQccb; - mfaab -= EQaab; - mfcab -= EQcab; - mfacb -= EQacb; - mfcbc -= EQcbc; - mfaba -= EQaba; - mfcba -= EQcba; - mfabc -= EQabc; - mfbcc -= EQbcc; - mfbaa -= EQbaa; - mfbca -= EQbca; - mfbac -= EQbac; - mfbbb -= EQbbb; - mfccc -= EQccc; - mfaac -= EQaac; - mfcac -= EQcac; - mfacc -= EQacc; - mfcca -= EQcca; - mfaaa -= EQaaa; - mfcaa -= EQcaa; - mfaca -= EQaca; - - //////////////////////////////////////////////////////////////////////////////////// - //Hin - //////////////////////////////////////////////////////////////////////////////////// - VF::LBM::forwardChimera(mfaaa, mfaab, mfaac, vvz, vz2); - VF::LBM::forwardChimera(mfaba, mfabb, mfabc, vvz, vz2); - VF::LBM::forwardChimera(mfaca, mfacb, mfacc, vvz, vz2); - VF::LBM::forwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); - VF::LBM::forwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); - VF::LBM::forwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); - VF::LBM::forwardChimera(mfcaa, mfcab, mfcac, vvz, vz2); - VF::LBM::forwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); - VF::LBM::forwardChimera(mfcca, mfccb, mfccc, vvz, vz2); - - VF::LBM::forwardChimera(mfaaa, mfaba, mfaca, vvy, vy2); - VF::LBM::forwardChimera(mfaab, mfabb, mfacb, vvy, vy2); - VF::LBM::forwardChimera(mfaac, mfabc, mfacc, vvy, vy2); - VF::LBM::forwardChimera(mfbaa, mfbba, mfbca, vvy, vy2); - VF::LBM::forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); - VF::LBM::forwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2); - VF::LBM::forwardChimera(mfcaa, mfcba, mfcca, vvy, vy2); - VF::LBM::forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); - VF::LBM::forwardChimera(mfcac, mfcbc, mfccc, vvy, vy2); - - VF::LBM::forwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2); - VF::LBM::forwardChimera(mfaab, mfbab, mfcab, vvx, vx2); - VF::LBM::forwardChimera(mfaac, mfbac, mfcac, vvx, vx2); - VF::LBM::forwardChimera(mfaba, mfbba, mfcba, vvx, vx2); - VF::LBM::forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); - VF::LBM::forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); - VF::LBM::forwardChimera(mfaca, mfbca, mfcca, vvx, vx2); - VF::LBM::forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); - VF::LBM::forwardChimera(mfacc, mfbcc, mfccc, vvx, vx2); - - ////////////////////////////////////////////////////////////////////////////////////// - ////Hin - ////////////////////////////////////////////////////////////////////////////////////// - //// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// Z - Dir - //forwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c4o9); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //// mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// Y - Dir - //forwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfaab, mfabb, mfacb, vvy, vy2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o18); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c2o3); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c2o9); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o6); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //// mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// X - Dir - //forwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, one); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfaba, mfbba, mfcba, vvx, vx2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o3); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfaab, mfbab, mfcab, vvx, vx2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o3); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////////// - // Cumulants - //////////////////////////////////////////////////////////////////////////////////// - real OxxPyyPzz = c1o1; //omega; // one; //set the bulk viscosity one is high / two is very low and zero is (too) high - - //////////////////////////////////////////////////////////// - //3. - ////////////////////////////// - real OxyyPxzz = c1o1; - real OxyyMxzz = c1o1; - //real Oxyz = c1o1; - //////////////////////////////////////////////////////////// - //4. - ////////////////////////////// - real O4 = c1o1; - //////////////////////////////////////////////////////////// - //5. - ////////////////////////////// - real O5 = c1o1; - //////////////////////////////////////////////////////////// - //6. - ////////////////////////////// - real O6 = c1o1; - //////////////////////////////////////////////////////////// - - - //central moments to cumulants - //4. - real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho; - real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho; - real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho; - - real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho)); - real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho)); - real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho)); - - //5. - real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; - real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; - real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; - - //6. - - real CUMccc = mfccc + ((-c4o1 * mfbbb * mfbbb - - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho - + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) - + c2o1 * (mfcaa * mfaca * mfaac) - + c16o1 * mfbba * mfbab * mfabb) / (rho * rho) - - c1o3 * (mfacc + mfcac + mfcca) / rho - - c1o9 * (mfcaa + mfaca + mfaac) / rho - + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) - + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 - + c1o27*((drho * drho - drho) / (rho*rho))); - - - - - //2. - // linear combinations - real mxxPyyPzz = mfcaa + mfaca + mfaac; - real mxxMyy = mfcaa - mfaca; - real mxxMzz = mfcaa - mfaac; - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //incl. correction (hat noch nicht so gut funktioniert...Optimierungsbedarf??) - { - real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); - real dyuy = dxux + omega * c3o2 * mxxMyy; - real dzuz = dxux + omega * c3o2 * mxxMzz; - - //relax - mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz; - mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); - mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); - - } - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ////no correction - //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz; - //mxxMyy += -(-omega) * (-mxxMyy); - //mxxMzz += -(-omega) * (-mxxMzz); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - mfabb += omega * (-mfabb); - mfbab += omega * (-mfbab); - mfbba += omega * (-mfbba); - - ////////////////////////////////////////////////////////////////////////// - - // linear combinations back - mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); - mfaca = c1o3 * (-c2o1* mxxMyy + mxxMzz + mxxPyyPzz); - mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz); - - //3. - // linear combinations - - real mxxyPyzz = mfcba + mfabc; - real mxxyMyzz = mfcba - mfabc; - - real mxxzPyyz = mfcab + mfacb; - real mxxzMyyz = mfcab - mfacb; - - real mxyyPxzz = mfbca + mfbac; - real mxyyMxzz = mfbca - mfbac; - - //relax - ////////////////////////////////////////////////////////////////////////// - mfbbb += OxyyMxzz * (-mfbbb); - mxxyPyzz += OxyyPxzz * (-mxxyPyzz); - mxxyMyzz += OxyyMxzz * (-mxxyMyzz); - mxxzPyyz += OxyyPxzz * (-mxxzPyyz); - mxxzMyyz += OxyyMxzz * (-mxxzMyyz); - mxyyPxzz += OxyyPxzz * (-mxyyPxzz); - mxyyMxzz += OxyyMxzz * (-mxyyMxzz); - ////////////////////////////////////////////////////////////////////////// - - mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; - mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; - mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; - mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; - mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; - mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; - - //4. - ////////////////////////////////////////////////////////////////////////// - CUMacc += O4 * (-CUMacc); - CUMcac += O4 * (-CUMcac); - CUMcca += O4 * (-CUMcca); - - CUMbbc += O4 * (-CUMbbc); - CUMbcb += O4 * (-CUMbcb); - CUMcbb += O4 * (-CUMcbb); - ////////////////////////////////////////////////////////////////////////// - - - //5. - CUMbcc += O5 * (-CUMbcc); - CUMcbc += O5 * (-CUMcbc); - CUMccb += O5 * (-CUMccb); - - //6. - CUMccc += O6 * (-CUMccc); - - - - //back cumulants to central moments - //4. - mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho; - mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho; - mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho; - - mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho)); - mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho)); - mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho)); - - //5. - mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; - mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; - mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; - - //6. - mfccc = CUMccc - ((-c4o1 * mfbbb * mfbbb - - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho - + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) - + c2o1 * (mfcaa * mfaca * mfaac) - + c16o1 * mfbba * mfbab * mfabb) / (rho * rho) - - c1o3 * (mfacc + mfcac + mfcca) / rho - - c1o9 * (mfcaa + mfaca + mfaac) / rho - + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) - + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 - + c1o27*((drho * drho - drho) / (rho*rho))); - - //////////////////////////////////////////////////////////////////////////////////// - //the force be with you - mfbaa = -mfbaa; - mfaba = -mfaba; - mfaab = -mfaab; - //////////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////////// - //back - //////////////////////////////////////////////////////////////////////////////////// - VF::LBM::backwardChimera(mfaaa, mfaab, mfaac, vvz, vz2); - VF::LBM::backwardChimera(mfaba, mfabb, mfabc, vvz, vz2); - VF::LBM::backwardChimera(mfaca, mfacb, mfacc, vvz, vz2); - VF::LBM::backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); - VF::LBM::backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); - VF::LBM::backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); - VF::LBM::backwardChimera(mfcaa, mfcab, mfcac, vvz, vz2); - VF::LBM::backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); - VF::LBM::backwardChimera(mfcca, mfccb, mfccc, vvz, vz2); - - VF::LBM::backwardChimera(mfaaa, mfaba, mfaca, vvy, vy2); - VF::LBM::backwardChimera(mfaab, mfabb, mfacb, vvy, vy2); - VF::LBM::backwardChimera(mfaac, mfabc, mfacc, vvy, vy2); - VF::LBM::backwardChimera(mfbaa, mfbba, mfbca, vvy, vy2); - VF::LBM::backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); - VF::LBM::backwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2); - VF::LBM::backwardChimera(mfcaa, mfcba, mfcca, vvy, vy2); - VF::LBM::backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); - VF::LBM::backwardChimera(mfcac, mfcbc, mfccc, vvy, vy2); - - VF::LBM::backwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2); - VF::LBM::backwardChimera(mfaab, mfbab, mfcab, vvx, vx2); - VF::LBM::backwardChimera(mfaac, mfbac, mfcac, vvx, vx2); - VF::LBM::backwardChimera(mfaba, mfbba, mfcba, vvx, vx2); - VF::LBM::backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); - VF::LBM::backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); - VF::LBM::backwardChimera(mfaca, mfbca, mfcca, vvx, vx2); - VF::LBM::backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); - VF::LBM::backwardChimera(mfacc, mfbcc, mfccc, vvx, vx2); - - //////////////////////////////////////////////////////////////////////////////////// - //mfcbb += EQcbb; - //mfabb += EQabb; - //mfbcb += EQbcb; - //mfbab += EQbab; - //mfbbc += EQbbc; - //mfbba += EQbba; - //mfccb += EQccb; - //mfaab += EQaab; - //mfcab += EQcab; - //mfacb += EQacb; - //mfcbc += EQcbc; - //mfaba += EQaba; - //mfcba += EQcba; - //mfabc += EQabc; - //mfbcc += EQbcc; - //mfbaa += EQbaa; - //mfbca += EQbca; - //mfbac += EQbac; - //mfbbb += EQbbb; - //mfccc += EQccc; - //mfaac += EQaac; - //mfcac += EQcac; - //mfacc += EQacc; - //mfcca += EQcca; - //mfaaa += EQaaa; - //mfcaa += EQcaa; - //mfaca += EQaca; - //////////////////////////////////////////////////////////////////////////////////// - ////Error diffusion - real fTEMP = mfbbb + EQbbb; - real delta0 = mfbbb - (fTEMP - EQbbb); - delta0 *= c1o4; - mfbbb = fTEMP; - - - fTEMP = mfcbb + EQcbb; - real deltacbb = mfcbb - (fTEMP - EQcbb); - mfcbb = fTEMP; - //mfcbb+=EQcbb; - - fTEMP = mfabb + EQabb; - real deltaabb = mfabb - (fTEMP - EQabb); - mfabb = fTEMP; - //mfabb+=EQabb; - - fTEMP = mfbcb + EQbcb; - real deltabcb = mfbcb - (fTEMP - EQbcb); - mfbcb = fTEMP; - //mfbcb+=EQbcb; - - fTEMP = mfbab + EQbab; - real deltabab = mfbab - (fTEMP - EQbab); - mfbab = fTEMP; - //mfbab+=EQbab; - - fTEMP = mfbbc + EQbbc; - real deltabbc = mfbbc - (fTEMP - EQbbc); - mfbbc = fTEMP; - //mfbbc+=EQbbc; - - fTEMP = mfbba + EQbba; - real deltabba = mfbba - (fTEMP - EQbba); - mfbba = fTEMP; - //mfbba+=EQbba; - - EQccb += (delta0 + c1o2*(deltacbb + deltabcb)); - fTEMP = mfccb + EQccb; - real deltaccb = mfccb - (fTEMP - EQccb); - mfccb = fTEMP; - //mfccb+=EQccb+(delta0+c1o2*(deltacbb+deltabcb)); - - EQaab += (delta0 + c1o2*(deltaabb + deltabab)); - fTEMP = mfaab + EQaab; - real deltaaab = mfaab - (fTEMP - EQaab); - mfaab = fTEMP; - //mfaab+=EQaab+(delta0+c1o2*(deltaabb+deltabab)); - - EQcab += (delta0 + c1o2*(deltacbb + deltabab)); - fTEMP = mfcab + EQcab; - real deltacab = mfcab - (fTEMP - EQcab); - mfcab = fTEMP; - //mfcab+=EQcab+(delta0+c1o2*(deltacbb+deltabab)); - - EQacb += (delta0 + c1o2*(deltaabb + deltabcb)); - fTEMP = mfacb + EQacb; - real deltaacb = mfacb - (fTEMP - EQacb); - mfacb = fTEMP; - //mfacb+=EQacb+(delta0+c1o2*(deltaabb+deltabcb)); - - EQcbc += (delta0 + c1o2*(deltacbb + deltabbc)); - fTEMP = mfcbc + EQcbc; - real deltacbc = mfcbc - (fTEMP - EQcbc); - mfcbc = fTEMP; - //mfcbc+=EQcbc+(delta0+c1o2*(deltacbb+deltabbc)); - - EQaba += (delta0 + c1o2*(deltaabb + deltabba)); - fTEMP = mfaba + EQaba; - real deltaaba = mfaba - (fTEMP - EQaba); - mfaba = fTEMP; - //mfaba+=EQaba+(delta0+c1o2*(deltaabb+deltabba)); - - EQcba += (delta0 + c1o2*(deltacbb + deltabba)); - fTEMP = mfcba + EQcba; - real deltacba = mfcba - (fTEMP - EQcba); - mfcba = fTEMP; - //mfcba+=EQcba+(delta0+c1o2*(deltacbb+deltabba)); - - EQabc += (delta0 + c1o2*(deltaabb + deltabbc)); - fTEMP = mfabc + EQabc; - real deltaabc = mfabc - (fTEMP - EQabc); - mfabc = fTEMP; - //mfabc+=EQabc+(delta0+c1o2*(deltaabb+deltabbc)); - - EQbcc += (delta0 + c1o2*(deltabcb + deltabbc)); - fTEMP = mfbcc + EQbcc; - real deltabcc = mfbcc - (fTEMP - EQbcc); - mfbcc = fTEMP; - //mfbcc+=EQbcc+(delta0+c1o2*(deltabcb+deltabbc)); - - EQbaa += (delta0 + c1o2*(deltabab + deltabba)); - fTEMP = mfbaa + EQbaa; - real deltabaa = mfbaa - (fTEMP - EQbaa); - mfbaa = fTEMP; - //mfbaa+=EQbaa+(delta0+c1o2*(deltabab+deltabba)); - - EQbca += (delta0 + c1o2*(deltabcb + deltabba)); - fTEMP = mfbca + EQbca; - real deltabca = mfbca - (fTEMP - EQbca); - mfbca = fTEMP; - //mfbca+=EQbca+(delta0+c1o2*(deltabcb+deltabba)); - - EQbac += (delta0 + c1o2*(deltabab + deltabbc)); - fTEMP = mfbac + EQbac; - real deltabac = mfbac - (fTEMP - EQbac); - mfbac = fTEMP; - //mfbac+=EQbac+(delta0+c1o2*(deltabab+deltabbc)); - - mfccc += EQccc - (delta0 + c1o4*(deltacbb + deltabcb + deltabbc) - c1o2*(deltabcc + deltacbc + deltaccb)); - mfaac += EQaac - (delta0 + c1o4*(deltaabb + deltabab + deltabbc) - c1o2*(deltabac + deltaabc + deltaaab)); - mfcac += EQcac - (delta0 + c1o4*(deltacbb + deltabab + deltabbc) - c1o2*(deltabac + deltacbc + deltacab)); - mfacc += EQacc - (delta0 + c1o4*(deltaabb + deltabcb + deltabbc) - c1o2*(deltabcc + deltaabc + deltaacb)); - mfcca += EQcca - (delta0 + c1o4*(deltacbb + deltabcb + deltabba) - c1o2*(deltabca + deltacba + deltaccb)); - mfaaa += EQaaa - (delta0 + c1o4*(deltaabb + deltabab + deltabba) - c1o2*(deltabaa + deltaaba + deltaaab)); - mfcaa += EQcaa - (delta0 + c1o4*(deltacbb + deltabab + deltabba) - c1o2*(deltabaa + deltacba + deltacab)); - mfaca += EQaca - (delta0 + c1o4*(deltaabb + deltabcb + deltabba) - c1o2*(deltabca + deltaaba + deltaacb)); - - - - ////////////////////////////////////////////////////////////////////////////////////// - ////back - ////////////////////////////////////////////////////////////////////////////////////// - ////mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// Z - Dir - //backwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, one); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfaba, mfabb, mfabc, vvz, vz2); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o3); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); - ///////////b////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); - ///////////b////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o3); - ///////////c////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); - ///////////c////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - ////mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// Y - Dir - //backwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaab, mfabb, mfacb, vvy, vy2, c2o3); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o6); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbaa, mfbba, mfbca, vvz, vz2); - ///////////b////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbab, mfbbb, mfbcb, vvz, vz2); - ///////////b////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbac, mfbbc, mfbcc, vvz, vz2); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o18); - ///////////c////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfcab, mfcbb, mfccb, vvy, vy2, c2o9); - ///////////c////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - ////mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// X - Dir - //backwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaba, mfbba, mfcba, vvx, vx2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaab, mfbab, mfcab, vvx, vx2, c1o9); - /////////////b//////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfabb, mfbbb, mfcbb, vvx, vx2, c4o9); - /////////////b//////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfacb, mfbcb, mfccb, vvx, vx2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o36); - /////////////c//////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfabc, mfbbc, mfcbc, vvx, vx2, c1o9); - /////////////c//////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - - //////////////////////////////////////////////////////////////////////////////////////// - //real drhoPost = - // ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + - // (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + - // ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; - //mfbbb += drho - drhoPost; - //////////////////////////////////////////////////////////////////////////////////// - (D.f[dirE])[k] = mfabb;//(D.f[ dirE ])[ke ] = mfabb;// - c2over27 ; (D.f[ dirE ])[k ] - (D.f[dirW])[kw] = mfcbb;//(D.f[ dirW ])[kw ] = mfcbb;// - c2over27 ; (D.f[ dirW ])[kw ] - (D.f[dirN])[k] = mfbab;//(D.f[ dirN ])[kn ] = mfbab;// - c2over27 ; (D.f[ dirN ])[k ] - (D.f[dirS])[ks] = mfbcb;//(D.f[ dirS ])[ks ] = mfbcb;// - c2over27 ; (D.f[ dirS ])[ks ] - (D.f[dirT])[k] = mfbba;//(D.f[ dirT ])[kt ] = mfbba;// - c2over27 ; (D.f[ dirT ])[k ] - (D.f[dirB])[kb] = mfbbc;//(D.f[ dirB ])[kb ] = mfbbc;// - c2over27 ; (D.f[ dirB ])[kb ] - (D.f[dirNE])[k] = mfaab;//(D.f[ dirNE ])[kne ] = mfaab;// - c1over54 ; (D.f[ dirNE ])[k ] - (D.f[dirSW])[ksw] = mfccb;//(D.f[ dirSW ])[ksw ] = mfccb;// - c1over54 ; (D.f[ dirSW ])[ksw ] - (D.f[dirSE])[ks] = mfacb;//(D.f[ dirSE ])[kse ] = mfacb;// - c1over54 ; (D.f[ dirSE ])[ks ] - (D.f[dirNW])[kw] = mfcab;//(D.f[ dirNW ])[knw ] = mfcab;// - c1over54 ; (D.f[ dirNW ])[kw ] - (D.f[dirTE])[k] = mfaba;//(D.f[ dirTE ])[kte ] = mfaba;// - c1over54 ; (D.f[ dirTE ])[k ] - (D.f[dirBW])[kbw] = mfcbc;//(D.f[ dirBW ])[kbw ] = mfcbc;// - c1over54 ; (D.f[ dirBW ])[kbw ] - (D.f[dirBE])[kb] = mfabc;//(D.f[ dirBE ])[kbe ] = mfabc;// - c1over54 ; (D.f[ dirBE ])[kb ] - (D.f[dirTW])[kw] = mfcba;//(D.f[ dirTW ])[ktw ] = mfcba;// - c1over54 ; (D.f[ dirTW ])[kw ] - (D.f[dirTN])[k] = mfbaa;//(D.f[ dirTN ])[ktn ] = mfbaa;// - c1over54 ; (D.f[ dirTN ])[k ] - (D.f[dirBS])[kbs] = mfbcc;//(D.f[ dirBS ])[kbs ] = mfbcc;// - c1over54 ; (D.f[ dirBS ])[kbs ] - (D.f[dirBN])[kb] = mfbac;//(D.f[ dirBN ])[kbn ] = mfbac;// - c1over54 ; (D.f[ dirBN ])[kb ] - (D.f[dirTS])[ks] = mfbca;//(D.f[ dirTS ])[kts ] = mfbca;// - c1over54 ; (D.f[ dirTS ])[ks ] - (D.f[dirZERO])[k] = mfbbb;//(D.f[ dirZERO])[kzero] = mfbbb;// - c8over27 ; (D.f[ dirZERO])[k ] - (D.f[dirTNE])[k] = mfaaa;//(D.f[ dirTNE ])[ktne ] = mfaaa;// - c1over216; (D.f[ dirTNE ])[k ] - (D.f[dirTSE])[ks] = mfaca;//(D.f[ dirTSE ])[ktse ] = mfaca;// - c1over216; (D.f[ dirTSE ])[ks ] - (D.f[dirBNE])[kb] = mfaac;//(D.f[ dirBNE ])[kbne ] = mfaac;// - c1over216; (D.f[ dirBNE ])[kb ] - (D.f[dirBSE])[kbs] = mfacc;//(D.f[ dirBSE ])[kbse ] = mfacc;// - c1over216; (D.f[ dirBSE ])[kbs ] - (D.f[dirTNW])[kw] = mfcaa;//(D.f[ dirTNW ])[ktnw ] = mfcaa;// - c1over216; (D.f[ dirTNW ])[kw ] - (D.f[dirTSW])[ksw] = mfcca;//(D.f[ dirTSW ])[ktsw ] = mfcca;// - c1over216; (D.f[ dirTSW ])[ksw ] - (D.f[dirBNW])[kbw] = mfcac;//(D.f[ dirBNW ])[kbnw ] = mfcac;// - c1over216; (D.f[ dirBNW ])[kbw ] - (D.f[dirBSW])[kbsw] = mfccc;//(D.f[ dirBSW ])[kbsw ] = mfccc;// - c1over216; (D.f[ dirBSW ])[kbsw] - //////////////////////////////////////////////////////////////////////////////////// - } - } + //////////////////////////////////////////////////////////////////////////////// + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index + + const unsigned nx = blockDim.x; + const unsigned ny = gridDim.x; + + const unsigned k = nx*(ny*z + y) + x; + ////////////////////////////////////////////////////////////////////////// + + if (k<size_Mat) + { + //////////////////////////////////////////////////////////////////////////////// + unsigned int BC; + BC = bcMatD[k]; + + if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/) + { + Distributions27 D; + if (EvenOrOdd == true) + { + D.f[dirE] = &DDStart[dirE *size_Mat]; + D.f[dirW] = &DDStart[dirW *size_Mat]; + D.f[dirN] = &DDStart[dirN *size_Mat]; + D.f[dirS] = &DDStart[dirS *size_Mat]; + D.f[dirT] = &DDStart[dirT *size_Mat]; + D.f[dirB] = &DDStart[dirB *size_Mat]; + D.f[dirNE] = &DDStart[dirNE *size_Mat]; + D.f[dirSW] = &DDStart[dirSW *size_Mat]; + D.f[dirSE] = &DDStart[dirSE *size_Mat]; + D.f[dirNW] = &DDStart[dirNW *size_Mat]; + D.f[dirTE] = &DDStart[dirTE *size_Mat]; + D.f[dirBW] = &DDStart[dirBW *size_Mat]; + D.f[dirBE] = &DDStart[dirBE *size_Mat]; + D.f[dirTW] = &DDStart[dirTW *size_Mat]; + D.f[dirTN] = &DDStart[dirTN *size_Mat]; + D.f[dirBS] = &DDStart[dirBS *size_Mat]; + D.f[dirBN] = &DDStart[dirBN *size_Mat]; + D.f[dirTS] = &DDStart[dirTS *size_Mat]; + D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; + D.f[dirTNE] = &DDStart[dirTNE *size_Mat]; + D.f[dirTSW] = &DDStart[dirTSW *size_Mat]; + D.f[dirTSE] = &DDStart[dirTSE *size_Mat]; + D.f[dirTNW] = &DDStart[dirTNW *size_Mat]; + D.f[dirBNE] = &DDStart[dirBNE *size_Mat]; + D.f[dirBSW] = &DDStart[dirBSW *size_Mat]; + D.f[dirBSE] = &DDStart[dirBSE *size_Mat]; + D.f[dirBNW] = &DDStart[dirBNW *size_Mat]; + } + else + { + D.f[dirW] = &DDStart[dirE *size_Mat]; + D.f[dirE] = &DDStart[dirW *size_Mat]; + D.f[dirS] = &DDStart[dirN *size_Mat]; + D.f[dirN] = &DDStart[dirS *size_Mat]; + D.f[dirB] = &DDStart[dirT *size_Mat]; + D.f[dirT] = &DDStart[dirB *size_Mat]; + D.f[dirSW] = &DDStart[dirNE *size_Mat]; + D.f[dirNE] = &DDStart[dirSW *size_Mat]; + D.f[dirNW] = &DDStart[dirSE *size_Mat]; + D.f[dirSE] = &DDStart[dirNW *size_Mat]; + D.f[dirBW] = &DDStart[dirTE *size_Mat]; + D.f[dirTE] = &DDStart[dirBW *size_Mat]; + D.f[dirTW] = &DDStart[dirBE *size_Mat]; + D.f[dirBE] = &DDStart[dirTW *size_Mat]; + D.f[dirBS] = &DDStart[dirTN *size_Mat]; + D.f[dirTN] = &DDStart[dirBS *size_Mat]; + D.f[dirTS] = &DDStart[dirBN *size_Mat]; + D.f[dirBN] = &DDStart[dirTS *size_Mat]; + D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; + D.f[dirBSW] = &DDStart[dirTNE *size_Mat]; + D.f[dirBNE] = &DDStart[dirTSW *size_Mat]; + D.f[dirBNW] = &DDStart[dirTSE *size_Mat]; + D.f[dirBSE] = &DDStart[dirTNW *size_Mat]; + D.f[dirTSW] = &DDStart[dirBNE *size_Mat]; + D.f[dirTNE] = &DDStart[dirBSW *size_Mat]; + D.f[dirTNW] = &DDStart[dirBSE *size_Mat]; + D.f[dirTSE] = &DDStart[dirBNW *size_Mat]; + } + + //////////////////////////////////////////////////////////////////////////////// + //index + //unsigned int kzero= k; + //unsigned int ke = k; + unsigned int kw = neighborX[k]; + //unsigned int kn = k; + unsigned int ks = neighborY[k]; + //unsigned int kt = k; + unsigned int kb = neighborZ[k]; + unsigned int ksw = neighborY[kw]; + //unsigned int kne = k; + //unsigned int kse = ks; + //unsigned int knw = kw; + unsigned int kbw = neighborZ[kw]; + //unsigned int kte = k; + //unsigned int kbe = kb; + //unsigned int ktw = kw; + unsigned int kbs = neighborZ[ks]; + //unsigned int ktn = k; + //unsigned int kbn = kb; + //unsigned int kts = ks; + //unsigned int ktse = ks; + //unsigned int kbnw = kbw; + //unsigned int ktnw = kw; + //unsigned int kbse = kbs; + //unsigned int ktsw = ksw; + //unsigned int kbne = kb; + //unsigned int ktne = k; + unsigned int kbsw = neighborZ[ksw]; + + + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + real mfcbb = (D.f[dirE])[k];//[ke ];// + c2over27 ;(D.f[dirE ])[k ];//ke + real mfabb = (D.f[dirW])[kw];//[kw ];// + c2over27 ;(D.f[dirW ])[kw ]; + real mfbcb = (D.f[dirN])[k];//[kn ];// + c2over27 ;(D.f[dirN ])[k ];//kn + real mfbab = (D.f[dirS])[ks];//[ks ];// + c2over27 ;(D.f[dirS ])[ks ]; + real mfbbc = (D.f[dirT])[k];//[kt ];// + c2over27 ;(D.f[dirT ])[k ];//kt + real mfbba = (D.f[dirB])[kb];//[kb ];// + c2over27 ;(D.f[dirB ])[kb ]; + real mfccb = (D.f[dirNE])[k];//[kne ];// + c1over54 ;(D.f[dirNE ])[k ];//kne + real mfaab = (D.f[dirSW])[ksw];//[ksw ];// + c1over54 ;(D.f[dirSW ])[ksw]; + real mfcab = (D.f[dirSE])[ks];//[kse ];// + c1over54 ;(D.f[dirSE ])[ks ];//kse + real mfacb = (D.f[dirNW])[kw];//[knw ];// + c1over54 ;(D.f[dirNW ])[kw ];//knw + real mfcbc = (D.f[dirTE])[k];//[kte ];// + c1over54 ;(D.f[dirTE ])[k ];//kte + real mfaba = (D.f[dirBW])[kbw];//[kbw ];// + c1over54 ;(D.f[dirBW ])[kbw]; + real mfcba = (D.f[dirBE])[kb];//[kbe ];// + c1over54 ;(D.f[dirBE ])[kb ];//kbe + real mfabc = (D.f[dirTW])[kw];//[ktw ];// + c1over54 ;(D.f[dirTW ])[kw ];//ktw + real mfbcc = (D.f[dirTN])[k];//[ktn ];// + c1over54 ;(D.f[dirTN ])[k ];//ktn + real mfbaa = (D.f[dirBS])[kbs];//[kbs ];// + c1over54 ;(D.f[dirBS ])[kbs]; + real mfbca = (D.f[dirBN])[kb];//[kbn ];// + c1over54 ;(D.f[dirBN ])[kb ];//kbn + real mfbac = (D.f[dirTS])[ks];//[kts ];// + c1over54 ;(D.f[dirTS ])[ks ];//kts + real mfbbb = (D.f[dirZERO])[k];//[kzero];// + c8over27 ;(D.f[dirZERO])[k ];//kzero + real mfccc = (D.f[dirTNE])[k];//[ktne ];// + c1over216;(D.f[dirTNE ])[k ];//ktne + real mfaac = (D.f[dirTSW])[ksw];//[ktsw ];// + c1over216;(D.f[dirTSW ])[ksw];//ktsw + real mfcac = (D.f[dirTSE])[ks];//[ktse ];// + c1over216;(D.f[dirTSE ])[ks ];//ktse + real mfacc = (D.f[dirTNW])[kw];//[ktnw ];// + c1over216;(D.f[dirTNW ])[kw ];//ktnw + real mfcca = (D.f[dirBNE])[kb];//[kbne ];// + c1over216;(D.f[dirBNE ])[kb ];//kbne + real mfaaa = (D.f[dirBSW])[kbsw];//[kbsw ];// + c1over216;(D.f[dirBSW ])[kbsw]; + real mfcaa = (D.f[dirBSE])[kbs];//[kbse ];// + c1over216;(D.f[dirBSE ])[kbs];//kbse + real mfaca = (D.f[dirBNW])[kbw];//[kbnw ];// + c1over216;(D.f[dirBNW ])[kbw];//kbnw + //////////////////////////////////////////////////////////////////////////////////// + real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + + real rho = c1o1 + drho; + //////////////////////////////////////////////////////////////////////////////////// + real vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)) / rho; + real vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)) / rho; + real vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)) / rho; + //////////////////////////////////////////////////////////////////////////////////// + //the force be with you + real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; // + real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero; + real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero; + vvx += fx*c1o2; + vvy += fy*c1o2; + vvz += fz*c1o2; + //////////////////////////////////////////////////////////////////////////////////// + //real omega = omega_in; + //////////////////////////////////////////////////////////////////////////////////// + //fast + //real oMdrho = c1o1; // comp special + //real m0, m1, m2; + real vx2; + real vy2; + real vz2; + vx2 = vvx*vvx; + vy2 = vvy*vvy; + vz2 = vvz*vvz; + //////////////////////////////////////////////////////////////////////////////////// + //real wadjust; + //real qudricLimitP = c1o100;// * 0.0001f; + //real qudricLimitM = c1o100;// * 0.0001f; + //real qudricLimitD = c1o100;// * 0.001f; + //real s9 = minusomega; + //test + //s9 = 0.; + + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + real EQcbb = c0o1; + real EQabb = c0o1; + real EQbcb = c0o1; + real EQbab = c0o1; + real EQbbc = c0o1; + real EQbba = c0o1; + real EQccb = c0o1; + real EQaab = c0o1; + real EQcab = c0o1; + real EQacb = c0o1; + real EQcbc = c0o1; + real EQaba = c0o1; + real EQcba = c0o1; + real EQabc = c0o1; + real EQbcc = c0o1; + real EQbaa = c0o1; + real EQbca = c0o1; + real EQbac = c0o1; + real EQbbb = c0o1; + real EQccc = drho * c1o27; + real EQaac = drho * c1o3; + real EQcac = drho * c1o9; + real EQacc = drho * c1o9; + real EQcca = drho * c1o9; + real EQaaa = drho; + real EQcaa = drho * c1o3; + real EQaca = drho * c1o3; + //////////////////////////////////////////////////////////////////////////////////// + VF::LBM::backwardChimeraWithK(EQaaa, EQaab, EQaac, vvz, vz2, c1o1); + VF::LBM::backwardChimeraWithK(EQaca, EQacb, EQacc, vvz, vz2, c1o3); + /////////////////////////////////////////////////////////// + EQcaa = EQaca; EQcab = EQacb; EQcac = EQacc; + /////////////////////////////////////////////////////////// + VF::LBM::backwardChimeraWithK(EQcca, EQccb, EQccc, vvz, vz2, c1o9); + + VF::LBM::backwardChimeraWithK(EQaaa, EQaba, EQaca, vvy, vy2, c1o6); + VF::LBM::backwardChimeraWithK(EQaab, EQabb, EQacb, vvy, vy2, c2o3); + VF::LBM::backwardChimeraWithK(EQaac, EQabc, EQacc, vvy, vy2, c1o6); + VF::LBM::backwardChimeraWithK(EQcaa, EQcba, EQcca, vvy, vy2, c1o18); + VF::LBM::backwardChimeraWithK(EQcab, EQcbb, EQccb, vvy, vy2, c2o9); + VF::LBM::backwardChimeraWithK(EQcac, EQcbc, EQccc, vvy, vy2, c1o18); + + VF::LBM::backwardChimeraWithK(EQaaa, EQbaa, EQcaa, vvx, vx2, c1o36); + VF::LBM::backwardChimeraWithK(EQaab, EQbab, EQcab, vvx, vx2, c1o9); + VF::LBM::backwardChimeraWithK(EQaac, EQbac, EQcac, vvx, vx2, c1o36); + VF::LBM::backwardChimeraWithK(EQaba, EQbba, EQcba, vvx, vx2, c1o9); + VF::LBM::backwardChimeraWithK(EQabb, EQbbb, EQcbb, vvx, vx2, c4o9); + VF::LBM::backwardChimeraWithK(EQabc, EQbbc, EQcbc, vvx, vx2, c1o9); + VF::LBM::backwardChimeraWithK(EQaca, EQbca, EQcca, vvx, vx2, c1o36); + VF::LBM::backwardChimeraWithK(EQacb, EQbcb, EQccb, vvx, vx2, c1o9); + VF::LBM::backwardChimeraWithK(EQacc, EQbcc, EQccc, vvx, vx2, c1o36); + + //////////////////////////////////////////////////////////////////////////////////// + //Pre-condition + mfcbb -= EQcbb; + mfabb -= EQabb; + mfbcb -= EQbcb; + mfbab -= EQbab; + mfbbc -= EQbbc; + mfbba -= EQbba; + mfccb -= EQccb; + mfaab -= EQaab; + mfcab -= EQcab; + mfacb -= EQacb; + mfcbc -= EQcbc; + mfaba -= EQaba; + mfcba -= EQcba; + mfabc -= EQabc; + mfbcc -= EQbcc; + mfbaa -= EQbaa; + mfbca -= EQbca; + mfbac -= EQbac; + mfbbb -= EQbbb; + mfccc -= EQccc; + mfaac -= EQaac; + mfcac -= EQcac; + mfacc -= EQacc; + mfcca -= EQcca; + mfaaa -= EQaaa; + mfcaa -= EQcaa; + mfaca -= EQaca; + + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + VF::LBM::forwardChimera(mfaaa, mfaab, mfaac, vvz, vz2); + VF::LBM::forwardChimera(mfaba, mfabb, mfabc, vvz, vz2); + VF::LBM::forwardChimera(mfaca, mfacb, mfacc, vvz, vz2); + VF::LBM::forwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); + VF::LBM::forwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); + VF::LBM::forwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); + VF::LBM::forwardChimera(mfcaa, mfcab, mfcac, vvz, vz2); + VF::LBM::forwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); + VF::LBM::forwardChimera(mfcca, mfccb, mfccc, vvz, vz2); + + VF::LBM::forwardChimera(mfaaa, mfaba, mfaca, vvy, vy2); + VF::LBM::forwardChimera(mfaab, mfabb, mfacb, vvy, vy2); + VF::LBM::forwardChimera(mfaac, mfabc, mfacc, vvy, vy2); + VF::LBM::forwardChimera(mfbaa, mfbba, mfbca, vvy, vy2); + VF::LBM::forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); + VF::LBM::forwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2); + VF::LBM::forwardChimera(mfcaa, mfcba, mfcca, vvy, vy2); + VF::LBM::forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); + VF::LBM::forwardChimera(mfcac, mfcbc, mfccc, vvy, vy2); + + VF::LBM::forwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2); + VF::LBM::forwardChimera(mfaab, mfbab, mfcab, vvx, vx2); + VF::LBM::forwardChimera(mfaac, mfbac, mfcac, vvx, vx2); + VF::LBM::forwardChimera(mfaba, mfbba, mfcba, vvx, vx2); + VF::LBM::forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); + VF::LBM::forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); + VF::LBM::forwardChimera(mfaca, mfbca, mfcca, vvx, vx2); + VF::LBM::forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); + VF::LBM::forwardChimera(mfacc, mfbcc, mfccc, vvx, vx2); + + ////////////////////////////////////////////////////////////////////////////////////// + ////Hin + ////////////////////////////////////////////////////////////////////////////////////// + //// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// Z - Dir + //forwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c4o9); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //// mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// Y - Dir + //forwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfaab, mfabb, mfacb, vvy, vy2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o18); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c2o3); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c2o9); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o6); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //// mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// X - Dir + //forwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, one); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfaba, mfbba, mfcba, vvx, vx2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o3); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfaab, mfbab, mfcab, vvx, vx2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o3); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + real OxxPyyPzz = c1o1; //omega; // one; //set the bulk viscosity one is high / two is very low and zero is (too) high + + //////////////////////////////////////////////////////////// + //3. + ////////////////////////////// + real OxyyPxzz = c1o1; + real OxyyMxzz = c1o1; + //real Oxyz = c1o1; + //////////////////////////////////////////////////////////// + //4. + ////////////////////////////// + real O4 = c1o1; + //////////////////////////////////////////////////////////// + //5. + ////////////////////////////// + real O5 = c1o1; + //////////////////////////////////////////////////////////// + //6. + ////////////////////////////// + real O6 = c1o1; + //////////////////////////////////////////////////////////// + + + //central moments to cumulants + //4. + real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho; + real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho; + real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho; + + real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho)); + real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho)); + real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho)); + + //5. + real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; + real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; + real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; + + //6. + + real CUMccc = mfccc + ((-c4o1 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho + + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2o1 * (mfcaa * mfaca * mfaac) + + c16o1 * mfbba * mfbab * mfabb) / (rho * rho) + - c1o3 * (mfacc + mfcac + mfcca) / rho + - c1o9 * (mfcaa + mfaca + mfaac) / rho + + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 + + c1o27*((drho * drho - drho) / (rho*rho))); + + + + + //2. + // linear combinations + real mxxPyyPzz = mfcaa + mfaca + mfaac; + real mxxMyy = mfcaa - mfaca; + real mxxMzz = mfcaa - mfaac; + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //incl. correction (hat noch nicht so gut funktioniert...Optimierungsbedarf??) + { + real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + real dyuy = dxux + omega * c3o2 * mxxMyy; + real dzuz = dxux + omega * c3o2 * mxxMzz; + + //relax + mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz; + mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); + + } + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////no correction + //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz; + //mxxMyy += -(-omega) * (-mxxMyy); + //mxxMzz += -(-omega) * (-mxxMzz); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + mfabb += omega * (-mfabb); + mfbab += omega * (-mfbab); + mfbba += omega * (-mfbba); + + ////////////////////////////////////////////////////////////////////////// + + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-c2o1* mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + + real mxxyPyzz = mfcba + mfabc; + real mxxyMyzz = mfcba - mfabc; + + real mxxzPyyz = mfcab + mfacb; + real mxxzMyyz = mfcab - mfacb; + + real mxyyPxzz = mfbca + mfbac; + real mxyyMxzz = mfbca - mfbac; + + //relax + ////////////////////////////////////////////////////////////////////////// + mfbbb += OxyyMxzz * (-mfbbb); + mxxyPyzz += OxyyPxzz * (-mxxyPyzz); + mxxyMyzz += OxyyMxzz * (-mxxyMyzz); + mxxzPyyz += OxyyPxzz * (-mxxzPyyz); + mxxzMyyz += OxyyMxzz * (-mxxzMyyz); + mxyyPxzz += OxyyPxzz * (-mxyyPxzz); + mxyyMxzz += OxyyMxzz * (-mxyyMxzz); + ////////////////////////////////////////////////////////////////////////// + + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + ////////////////////////////////////////////////////////////////////////// + CUMacc += O4 * (-CUMacc); + CUMcac += O4 * (-CUMcac); + CUMcca += O4 * (-CUMcca); + + CUMbbc += O4 * (-CUMbbc); + CUMbcb += O4 * (-CUMbcb); + CUMcbb += O4 * (-CUMcbb); + ////////////////////////////////////////////////////////////////////////// + + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + + + //back cumulants to central moments + //4. + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho; + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho; + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho; + + mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho)); + mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho)); + mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho)); + + //5. + mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; + mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; + mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; + + //6. + mfccc = CUMccc - ((-c4o1 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho + + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2o1 * (mfcaa * mfaca * mfaac) + + c16o1 * mfbba * mfbab * mfabb) / (rho * rho) + - c1o3 * (mfacc + mfcac + mfcca) / rho + - c1o9 * (mfcaa + mfaca + mfaac) / rho + + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 + + c1o27*((drho * drho - drho) / (rho*rho))); + + //////////////////////////////////////////////////////////////////////////////////// + //the force be with you + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + //////////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + VF::LBM::backwardChimera(mfaaa, mfaab, mfaac, vvz, vz2); + VF::LBM::backwardChimera(mfaba, mfabb, mfabc, vvz, vz2); + VF::LBM::backwardChimera(mfaca, mfacb, mfacc, vvz, vz2); + VF::LBM::backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); + VF::LBM::backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); + VF::LBM::backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); + VF::LBM::backwardChimera(mfcaa, mfcab, mfcac, vvz, vz2); + VF::LBM::backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); + VF::LBM::backwardChimera(mfcca, mfccb, mfccc, vvz, vz2); + + VF::LBM::backwardChimera(mfaaa, mfaba, mfaca, vvy, vy2); + VF::LBM::backwardChimera(mfaab, mfabb, mfacb, vvy, vy2); + VF::LBM::backwardChimera(mfaac, mfabc, mfacc, vvy, vy2); + VF::LBM::backwardChimera(mfbaa, mfbba, mfbca, vvy, vy2); + VF::LBM::backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); + VF::LBM::backwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2); + VF::LBM::backwardChimera(mfcaa, mfcba, mfcca, vvy, vy2); + VF::LBM::backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); + VF::LBM::backwardChimera(mfcac, mfcbc, mfccc, vvy, vy2); + + VF::LBM::backwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2); + VF::LBM::backwardChimera(mfaab, mfbab, mfcab, vvx, vx2); + VF::LBM::backwardChimera(mfaac, mfbac, mfcac, vvx, vx2); + VF::LBM::backwardChimera(mfaba, mfbba, mfcba, vvx, vx2); + VF::LBM::backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); + VF::LBM::backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); + VF::LBM::backwardChimera(mfaca, mfbca, mfcca, vvx, vx2); + VF::LBM::backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); + VF::LBM::backwardChimera(mfacc, mfbcc, mfccc, vvx, vx2); + + //////////////////////////////////////////////////////////////////////////////////// + //mfcbb += EQcbb; + //mfabb += EQabb; + //mfbcb += EQbcb; + //mfbab += EQbab; + //mfbbc += EQbbc; + //mfbba += EQbba; + //mfccb += EQccb; + //mfaab += EQaab; + //mfcab += EQcab; + //mfacb += EQacb; + //mfcbc += EQcbc; + //mfaba += EQaba; + //mfcba += EQcba; + //mfabc += EQabc; + //mfbcc += EQbcc; + //mfbaa += EQbaa; + //mfbca += EQbca; + //mfbac += EQbac; + //mfbbb += EQbbb; + //mfccc += EQccc; + //mfaac += EQaac; + //mfcac += EQcac; + //mfacc += EQacc; + //mfcca += EQcca; + //mfaaa += EQaaa; + //mfcaa += EQcaa; + //mfaca += EQaca; + //////////////////////////////////////////////////////////////////////////////////// + ////Error diffusion + real fTEMP = mfbbb + EQbbb; + real delta0 = mfbbb - (fTEMP - EQbbb); + delta0 *= c1o4; + mfbbb = fTEMP; + + + fTEMP = mfcbb + EQcbb; + real deltacbb = mfcbb - (fTEMP - EQcbb); + mfcbb = fTEMP; + //mfcbb+=EQcbb; + + fTEMP = mfabb + EQabb; + real deltaabb = mfabb - (fTEMP - EQabb); + mfabb = fTEMP; + //mfabb+=EQabb; + + fTEMP = mfbcb + EQbcb; + real deltabcb = mfbcb - (fTEMP - EQbcb); + mfbcb = fTEMP; + //mfbcb+=EQbcb; + + fTEMP = mfbab + EQbab; + real deltabab = mfbab - (fTEMP - EQbab); + mfbab = fTEMP; + //mfbab+=EQbab; + + fTEMP = mfbbc + EQbbc; + real deltabbc = mfbbc - (fTEMP - EQbbc); + mfbbc = fTEMP; + //mfbbc+=EQbbc; + + fTEMP = mfbba + EQbba; + real deltabba = mfbba - (fTEMP - EQbba); + mfbba = fTEMP; + //mfbba+=EQbba; + + EQccb += (delta0 + c1o2*(deltacbb + deltabcb)); + fTEMP = mfccb + EQccb; + real deltaccb = mfccb - (fTEMP - EQccb); + mfccb = fTEMP; + //mfccb+=EQccb+(delta0+c1o2*(deltacbb+deltabcb)); + + EQaab += (delta0 + c1o2*(deltaabb + deltabab)); + fTEMP = mfaab + EQaab; + real deltaaab = mfaab - (fTEMP - EQaab); + mfaab = fTEMP; + //mfaab+=EQaab+(delta0+c1o2*(deltaabb+deltabab)); + + EQcab += (delta0 + c1o2*(deltacbb + deltabab)); + fTEMP = mfcab + EQcab; + real deltacab = mfcab - (fTEMP - EQcab); + mfcab = fTEMP; + //mfcab+=EQcab+(delta0+c1o2*(deltacbb+deltabab)); + + EQacb += (delta0 + c1o2*(deltaabb + deltabcb)); + fTEMP = mfacb + EQacb; + real deltaacb = mfacb - (fTEMP - EQacb); + mfacb = fTEMP; + //mfacb+=EQacb+(delta0+c1o2*(deltaabb+deltabcb)); + + EQcbc += (delta0 + c1o2*(deltacbb + deltabbc)); + fTEMP = mfcbc + EQcbc; + real deltacbc = mfcbc - (fTEMP - EQcbc); + mfcbc = fTEMP; + //mfcbc+=EQcbc+(delta0+c1o2*(deltacbb+deltabbc)); + + EQaba += (delta0 + c1o2*(deltaabb + deltabba)); + fTEMP = mfaba + EQaba; + real deltaaba = mfaba - (fTEMP - EQaba); + mfaba = fTEMP; + //mfaba+=EQaba+(delta0+c1o2*(deltaabb+deltabba)); + + EQcba += (delta0 + c1o2*(deltacbb + deltabba)); + fTEMP = mfcba + EQcba; + real deltacba = mfcba - (fTEMP - EQcba); + mfcba = fTEMP; + //mfcba+=EQcba+(delta0+c1o2*(deltacbb+deltabba)); + + EQabc += (delta0 + c1o2*(deltaabb + deltabbc)); + fTEMP = mfabc + EQabc; + real deltaabc = mfabc - (fTEMP - EQabc); + mfabc = fTEMP; + //mfabc+=EQabc+(delta0+c1o2*(deltaabb+deltabbc)); + + EQbcc += (delta0 + c1o2*(deltabcb + deltabbc)); + fTEMP = mfbcc + EQbcc; + real deltabcc = mfbcc - (fTEMP - EQbcc); + mfbcc = fTEMP; + //mfbcc+=EQbcc+(delta0+c1o2*(deltabcb+deltabbc)); + + EQbaa += (delta0 + c1o2*(deltabab + deltabba)); + fTEMP = mfbaa + EQbaa; + real deltabaa = mfbaa - (fTEMP - EQbaa); + mfbaa = fTEMP; + //mfbaa+=EQbaa+(delta0+c1o2*(deltabab+deltabba)); + + EQbca += (delta0 + c1o2*(deltabcb + deltabba)); + fTEMP = mfbca + EQbca; + real deltabca = mfbca - (fTEMP - EQbca); + mfbca = fTEMP; + //mfbca+=EQbca+(delta0+c1o2*(deltabcb+deltabba)); + + EQbac += (delta0 + c1o2*(deltabab + deltabbc)); + fTEMP = mfbac + EQbac; + real deltabac = mfbac - (fTEMP - EQbac); + mfbac = fTEMP; + //mfbac+=EQbac+(delta0+c1o2*(deltabab+deltabbc)); + + mfccc += EQccc - (delta0 + c1o4*(deltacbb + deltabcb + deltabbc) - c1o2*(deltabcc + deltacbc + deltaccb)); + mfaac += EQaac - (delta0 + c1o4*(deltaabb + deltabab + deltabbc) - c1o2*(deltabac + deltaabc + deltaaab)); + mfcac += EQcac - (delta0 + c1o4*(deltacbb + deltabab + deltabbc) - c1o2*(deltabac + deltacbc + deltacab)); + mfacc += EQacc - (delta0 + c1o4*(deltaabb + deltabcb + deltabbc) - c1o2*(deltabcc + deltaabc + deltaacb)); + mfcca += EQcca - (delta0 + c1o4*(deltacbb + deltabcb + deltabba) - c1o2*(deltabca + deltacba + deltaccb)); + mfaaa += EQaaa - (delta0 + c1o4*(deltaabb + deltabab + deltabba) - c1o2*(deltabaa + deltaaba + deltaaab)); + mfcaa += EQcaa - (delta0 + c1o4*(deltacbb + deltabab + deltabba) - c1o2*(deltabaa + deltacba + deltacab)); + mfaca += EQaca - (delta0 + c1o4*(deltaabb + deltabcb + deltabba) - c1o2*(deltabca + deltaaba + deltaacb)); + + + + ////////////////////////////////////////////////////////////////////////////////////// + ////back + ////////////////////////////////////////////////////////////////////////////////////// + ////mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// Z - Dir + //backwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, one); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfaba, mfabb, mfabc, vvz, vz2); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o3); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); + ///////////b////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); + ///////////b////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o3); + ///////////c////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); + ///////////c////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + ////mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// Y - Dir + //backwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaab, mfabb, mfacb, vvy, vy2, c2o3); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o6); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbaa, mfbba, mfbca, vvz, vz2); + ///////////b////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbab, mfbbb, mfbcb, vvz, vz2); + ///////////b////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbac, mfbbc, mfbcc, vvz, vz2); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o18); + ///////////c////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfcab, mfcbb, mfccb, vvy, vy2, c2o9); + ///////////c////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + ////mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// X - Dir + //backwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaba, mfbba, mfcba, vvx, vx2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaab, mfbab, mfcab, vvx, vx2, c1o9); + /////////////b//////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfabb, mfbbb, mfcbb, vvx, vx2, c4o9); + /////////////b//////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfacb, mfbcb, mfccb, vvx, vx2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o36); + /////////////c//////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfabc, mfbbc, mfcbc, vvx, vx2, c1o9); + /////////////c//////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////////////// + //real drhoPost = + // ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + // (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + // ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + //mfbbb += drho - drhoPost; + //////////////////////////////////////////////////////////////////////////////////// + (D.f[dirE])[k] = mfabb;//(D.f[ dirE ])[ke ] = mfabb;// - c2over27 ; (D.f[ dirE ])[k ] + (D.f[dirW])[kw] = mfcbb;//(D.f[ dirW ])[kw ] = mfcbb;// - c2over27 ; (D.f[ dirW ])[kw ] + (D.f[dirN])[k] = mfbab;//(D.f[ dirN ])[kn ] = mfbab;// - c2over27 ; (D.f[ dirN ])[k ] + (D.f[dirS])[ks] = mfbcb;//(D.f[ dirS ])[ks ] = mfbcb;// - c2over27 ; (D.f[ dirS ])[ks ] + (D.f[dirT])[k] = mfbba;//(D.f[ dirT ])[kt ] = mfbba;// - c2over27 ; (D.f[ dirT ])[k ] + (D.f[dirB])[kb] = mfbbc;//(D.f[ dirB ])[kb ] = mfbbc;// - c2over27 ; (D.f[ dirB ])[kb ] + (D.f[dirNE])[k] = mfaab;//(D.f[ dirNE ])[kne ] = mfaab;// - c1over54 ; (D.f[ dirNE ])[k ] + (D.f[dirSW])[ksw] = mfccb;//(D.f[ dirSW ])[ksw ] = mfccb;// - c1over54 ; (D.f[ dirSW ])[ksw ] + (D.f[dirSE])[ks] = mfacb;//(D.f[ dirSE ])[kse ] = mfacb;// - c1over54 ; (D.f[ dirSE ])[ks ] + (D.f[dirNW])[kw] = mfcab;//(D.f[ dirNW ])[knw ] = mfcab;// - c1over54 ; (D.f[ dirNW ])[kw ] + (D.f[dirTE])[k] = mfaba;//(D.f[ dirTE ])[kte ] = mfaba;// - c1over54 ; (D.f[ dirTE ])[k ] + (D.f[dirBW])[kbw] = mfcbc;//(D.f[ dirBW ])[kbw ] = mfcbc;// - c1over54 ; (D.f[ dirBW ])[kbw ] + (D.f[dirBE])[kb] = mfabc;//(D.f[ dirBE ])[kbe ] = mfabc;// - c1over54 ; (D.f[ dirBE ])[kb ] + (D.f[dirTW])[kw] = mfcba;//(D.f[ dirTW ])[ktw ] = mfcba;// - c1over54 ; (D.f[ dirTW ])[kw ] + (D.f[dirTN])[k] = mfbaa;//(D.f[ dirTN ])[ktn ] = mfbaa;// - c1over54 ; (D.f[ dirTN ])[k ] + (D.f[dirBS])[kbs] = mfbcc;//(D.f[ dirBS ])[kbs ] = mfbcc;// - c1over54 ; (D.f[ dirBS ])[kbs ] + (D.f[dirBN])[kb] = mfbac;//(D.f[ dirBN ])[kbn ] = mfbac;// - c1over54 ; (D.f[ dirBN ])[kb ] + (D.f[dirTS])[ks] = mfbca;//(D.f[ dirTS ])[kts ] = mfbca;// - c1over54 ; (D.f[ dirTS ])[ks ] + (D.f[dirZERO])[k] = mfbbb;//(D.f[ dirZERO])[kzero] = mfbbb;// - c8over27 ; (D.f[ dirZERO])[k ] + (D.f[dirTNE])[k] = mfaaa;//(D.f[ dirTNE ])[ktne ] = mfaaa;// - c1over216; (D.f[ dirTNE ])[k ] + (D.f[dirTSE])[ks] = mfaca;//(D.f[ dirTSE ])[ktse ] = mfaca;// - c1over216; (D.f[ dirTSE ])[ks ] + (D.f[dirBNE])[kb] = mfaac;//(D.f[ dirBNE ])[kbne ] = mfaac;// - c1over216; (D.f[ dirBNE ])[kb ] + (D.f[dirBSE])[kbs] = mfacc;//(D.f[ dirBSE ])[kbse ] = mfacc;// - c1over216; (D.f[ dirBSE ])[kbs ] + (D.f[dirTNW])[kw] = mfcaa;//(D.f[ dirTNW ])[ktnw ] = mfcaa;// - c1over216; (D.f[ dirTNW ])[kw ] + (D.f[dirTSW])[ksw] = mfcca;//(D.f[ dirTSW ])[ktsw ] = mfcca;// - c1over216; (D.f[ dirTSW ])[ksw ] + (D.f[dirBNW])[kbw] = mfcac;//(D.f[ dirBNW ])[kbnw ] = mfcac;// - c1over216; (D.f[ dirBNW ])[kbw ] + (D.f[dirBSW])[kbsw] = mfccc;//(D.f[ dirBSW ])[kbsw ] = mfccc;// - c1over216; (D.f[ dirBSW ])[kbsw] + //////////////////////////////////////////////////////////////////////////////////// + } + } } //////////////////////////////////////////////////////////////////////////////// @@ -932,758 +1781,758 @@ extern "C" __global__ void Cumulant_One_preconditioned_errorDiffusion_chim_Comp_ //////////////////////////////////////////////////////////////////////////////// extern "C" __global__ void Cumulant_One_preconditioned_chim_Comp_SP_27( - real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd) + real omega, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd) { - //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index - - const unsigned nx = blockDim.x; - const unsigned ny = gridDim.x; - - const unsigned k = nx*(ny*z + y) + x; - ////////////////////////////////////////////////////////////////////////// - - if (k<size_Mat) - { - //////////////////////////////////////////////////////////////////////////////// - unsigned int BC; - BC = bcMatD[k]; - - if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/) - { - Distributions27 D; - if (EvenOrOdd == true) - { - D.f[dirE] = &DDStart[dirE *size_Mat]; - D.f[dirW] = &DDStart[dirW *size_Mat]; - D.f[dirN] = &DDStart[dirN *size_Mat]; - D.f[dirS] = &DDStart[dirS *size_Mat]; - D.f[dirT] = &DDStart[dirT *size_Mat]; - D.f[dirB] = &DDStart[dirB *size_Mat]; - D.f[dirNE] = &DDStart[dirNE *size_Mat]; - D.f[dirSW] = &DDStart[dirSW *size_Mat]; - D.f[dirSE] = &DDStart[dirSE *size_Mat]; - D.f[dirNW] = &DDStart[dirNW *size_Mat]; - D.f[dirTE] = &DDStart[dirTE *size_Mat]; - D.f[dirBW] = &DDStart[dirBW *size_Mat]; - D.f[dirBE] = &DDStart[dirBE *size_Mat]; - D.f[dirTW] = &DDStart[dirTW *size_Mat]; - D.f[dirTN] = &DDStart[dirTN *size_Mat]; - D.f[dirBS] = &DDStart[dirBS *size_Mat]; - D.f[dirBN] = &DDStart[dirBN *size_Mat]; - D.f[dirTS] = &DDStart[dirTS *size_Mat]; - D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; - D.f[dirTNE] = &DDStart[dirTNE *size_Mat]; - D.f[dirTSW] = &DDStart[dirTSW *size_Mat]; - D.f[dirTSE] = &DDStart[dirTSE *size_Mat]; - D.f[dirTNW] = &DDStart[dirTNW *size_Mat]; - D.f[dirBNE] = &DDStart[dirBNE *size_Mat]; - D.f[dirBSW] = &DDStart[dirBSW *size_Mat]; - D.f[dirBSE] = &DDStart[dirBSE *size_Mat]; - D.f[dirBNW] = &DDStart[dirBNW *size_Mat]; - } - else - { - D.f[dirW] = &DDStart[dirE *size_Mat]; - D.f[dirE] = &DDStart[dirW *size_Mat]; - D.f[dirS] = &DDStart[dirN *size_Mat]; - D.f[dirN] = &DDStart[dirS *size_Mat]; - D.f[dirB] = &DDStart[dirT *size_Mat]; - D.f[dirT] = &DDStart[dirB *size_Mat]; - D.f[dirSW] = &DDStart[dirNE *size_Mat]; - D.f[dirNE] = &DDStart[dirSW *size_Mat]; - D.f[dirNW] = &DDStart[dirSE *size_Mat]; - D.f[dirSE] = &DDStart[dirNW *size_Mat]; - D.f[dirBW] = &DDStart[dirTE *size_Mat]; - D.f[dirTE] = &DDStart[dirBW *size_Mat]; - D.f[dirTW] = &DDStart[dirBE *size_Mat]; - D.f[dirBE] = &DDStart[dirTW *size_Mat]; - D.f[dirBS] = &DDStart[dirTN *size_Mat]; - D.f[dirTN] = &DDStart[dirBS *size_Mat]; - D.f[dirTS] = &DDStart[dirBN *size_Mat]; - D.f[dirBN] = &DDStart[dirTS *size_Mat]; - D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; - D.f[dirBSW] = &DDStart[dirTNE *size_Mat]; - D.f[dirBNE] = &DDStart[dirTSW *size_Mat]; - D.f[dirBNW] = &DDStart[dirTSE *size_Mat]; - D.f[dirBSE] = &DDStart[dirTNW *size_Mat]; - D.f[dirTSW] = &DDStart[dirBNE *size_Mat]; - D.f[dirTNE] = &DDStart[dirBSW *size_Mat]; - D.f[dirTNW] = &DDStart[dirBSE *size_Mat]; - D.f[dirTSE] = &DDStart[dirBNW *size_Mat]; - } - - //////////////////////////////////////////////////////////////////////////////// - //index - //unsigned int kzero= k; - //unsigned int ke = k; - unsigned int kw = neighborX[k]; - //unsigned int kn = k; - unsigned int ks = neighborY[k]; - //unsigned int kt = k; - unsigned int kb = neighborZ[k]; - unsigned int ksw = neighborY[kw]; - //unsigned int kne = k; - //unsigned int kse = ks; - //unsigned int knw = kw; - unsigned int kbw = neighborZ[kw]; - //unsigned int kte = k; - //unsigned int kbe = kb; - //unsigned int ktw = kw; - unsigned int kbs = neighborZ[ks]; - //unsigned int ktn = k; - //unsigned int kbn = kb; - //unsigned int kts = ks; - //unsigned int ktse = ks; - //unsigned int kbnw = kbw; - //unsigned int ktnw = kw; - //unsigned int kbse = kbs; - //unsigned int ktsw = ksw; - //unsigned int kbne = kb; - //unsigned int ktne = k; - unsigned int kbsw = neighborZ[ksw]; - - - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - real mfcbb = (D.f[dirE])[k];//[ke ];// + c2over27 ;(D.f[dirE ])[k ];//ke - real mfabb = (D.f[dirW])[kw];//[kw ];// + c2over27 ;(D.f[dirW ])[kw ]; - real mfbcb = (D.f[dirN])[k];//[kn ];// + c2over27 ;(D.f[dirN ])[k ];//kn - real mfbab = (D.f[dirS])[ks];//[ks ];// + c2over27 ;(D.f[dirS ])[ks ]; - real mfbbc = (D.f[dirT])[k];//[kt ];// + c2over27 ;(D.f[dirT ])[k ];//kt - real mfbba = (D.f[dirB])[kb];//[kb ];// + c2over27 ;(D.f[dirB ])[kb ]; - real mfccb = (D.f[dirNE])[k];//[kne ];// + c1over54 ;(D.f[dirNE ])[k ];//kne - real mfaab = (D.f[dirSW])[ksw];//[ksw ];// + c1over54 ;(D.f[dirSW ])[ksw]; - real mfcab = (D.f[dirSE])[ks];//[kse ];// + c1over54 ;(D.f[dirSE ])[ks ];//kse - real mfacb = (D.f[dirNW])[kw];//[knw ];// + c1over54 ;(D.f[dirNW ])[kw ];//knw - real mfcbc = (D.f[dirTE])[k];//[kte ];// + c1over54 ;(D.f[dirTE ])[k ];//kte - real mfaba = (D.f[dirBW])[kbw];//[kbw ];// + c1over54 ;(D.f[dirBW ])[kbw]; - real mfcba = (D.f[dirBE])[kb];//[kbe ];// + c1over54 ;(D.f[dirBE ])[kb ];//kbe - real mfabc = (D.f[dirTW])[kw];//[ktw ];// + c1over54 ;(D.f[dirTW ])[kw ];//ktw - real mfbcc = (D.f[dirTN])[k];//[ktn ];// + c1over54 ;(D.f[dirTN ])[k ];//ktn - real mfbaa = (D.f[dirBS])[kbs];//[kbs ];// + c1over54 ;(D.f[dirBS ])[kbs]; - real mfbca = (D.f[dirBN])[kb];//[kbn ];// + c1over54 ;(D.f[dirBN ])[kb ];//kbn - real mfbac = (D.f[dirTS])[ks];//[kts ];// + c1over54 ;(D.f[dirTS ])[ks ];//kts - real mfbbb = (D.f[dirZERO])[k];//[kzero];// + c8over27 ;(D.f[dirZERO])[k ];//kzero - real mfccc = (D.f[dirTNE])[k];//[ktne ];// + c1over216;(D.f[dirTNE ])[k ];//ktne - real mfaac = (D.f[dirTSW])[ksw];//[ktsw ];// + c1over216;(D.f[dirTSW ])[ksw];//ktsw - real mfcac = (D.f[dirTSE])[ks];//[ktse ];// + c1over216;(D.f[dirTSE ])[ks ];//ktse - real mfacc = (D.f[dirTNW])[kw];//[ktnw ];// + c1over216;(D.f[dirTNW ])[kw ];//ktnw - real mfcca = (D.f[dirBNE])[kb];//[kbne ];// + c1over216;(D.f[dirBNE ])[kb ];//kbne - real mfaaa = (D.f[dirBSW])[kbsw];//[kbsw ];// + c1over216;(D.f[dirBSW ])[kbsw]; - real mfcaa = (D.f[dirBSE])[kbs];//[kbse ];// + c1over216;(D.f[dirBSE ])[kbs];//kbse - real mfaca = (D.f[dirBNW])[kbw];//[kbnw ];// + c1over216;(D.f[dirBNW ])[kbw];//kbnw - //////////////////////////////////////////////////////////////////////////////////// - real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + - (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + - ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; - - real rho = c1o1 + drho; - //////////////////////////////////////////////////////////////////////////////////// - real vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + - (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + - (mfcbb - mfabb)) / rho; - real vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + - (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + - (mfbcb - mfbab)) / rho; - real vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + - (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + - (mfbbc - mfbba)) / rho; - //////////////////////////////////////////////////////////////////////////////////// - //the force be with you - real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; // - real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero; - real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero; - vvx += fx*c1o2; - vvy += fy*c1o2; - vvz += fz*c1o2; - //////////////////////////////////////////////////////////////////////////////////// - //real omega = omega_in; - //////////////////////////////////////////////////////////////////////////////////// - //fast - //real oMdrho = c1o1; // comp special - //real m0, m1, m2; - real vx2; - real vy2; - real vz2; - vx2 = vvx*vvx; - vy2 = vvy*vvy; - vz2 = vvz*vvz; - //////////////////////////////////////////////////////////////////////////////////// - //real wadjust; - //real qudricLimitP = c1o100;// * 0.0001f; - //real qudricLimitM = c1o100;// * 0.0001f; - //real qudricLimitD = c1o100;// * 0.001f; - //real s9 = minusomega; - //test - //s9 = 0.; - - - ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - real EQcbb = c0o1; - real EQabb = c0o1; - real EQbcb = c0o1; - real EQbab = c0o1; - real EQbbc = c0o1; - real EQbba = c0o1; - real EQccb = c0o1; - real EQaab = c0o1; - real EQcab = c0o1; - real EQacb = c0o1; - real EQcbc = c0o1; - real EQaba = c0o1; - real EQcba = c0o1; - real EQabc = c0o1; - real EQbcc = c0o1; - real EQbaa = c0o1; - real EQbca = c0o1; - real EQbac = c0o1; - real EQbbb = c0o1; - real EQccc = drho * c1o27; - real EQaac = drho * c1o3; - real EQcac = drho * c1o9; - real EQacc = drho * c1o9; - real EQcca = drho * c1o9; - real EQaaa = drho; - real EQcaa = drho * c1o3; - real EQaca = drho * c1o3; - //////////////////////////////////////////////////////////////////////////////////// - VF::LBM::backwardChimeraWithK(EQaaa, EQaab, EQaac, vvz, vz2, c1o1); - VF::LBM::backwardChimeraWithK(EQaca, EQacb, EQacc, vvz, vz2, c1o3); - /////////////////////////////////////////////////////////// - EQcaa = EQaca; EQcab = EQacb; EQcac = EQacc; - /////////////////////////////////////////////////////////// - VF::LBM::backwardChimeraWithK(EQcca, EQccb, EQccc, vvz, vz2, c1o9); - - VF::LBM::backwardChimeraWithK(EQaaa, EQaba, EQaca, vvy, vy2, c1o6); - VF::LBM::backwardChimeraWithK(EQaab, EQabb, EQacb, vvy, vy2, c2o3); - VF::LBM::backwardChimeraWithK(EQaac, EQabc, EQacc, vvy, vy2, c1o6); - VF::LBM::backwardChimeraWithK(EQcaa, EQcba, EQcca, vvy, vy2, c1o18); - VF::LBM::backwardChimeraWithK(EQcab, EQcbb, EQccb, vvy, vy2, c2o9); - VF::LBM::backwardChimeraWithK(EQcac, EQcbc, EQccc, vvy, vy2, c1o18); - - VF::LBM::backwardChimeraWithK(EQaaa, EQbaa, EQcaa, vvx, vx2, c1o36); - VF::LBM::backwardChimeraWithK(EQaab, EQbab, EQcab, vvx, vx2, c1o9); - VF::LBM::backwardChimeraWithK(EQaac, EQbac, EQcac, vvx, vx2, c1o36); - VF::LBM::backwardChimeraWithK(EQaba, EQbba, EQcba, vvx, vx2, c1o9); - VF::LBM::backwardChimeraWithK(EQabb, EQbbb, EQcbb, vvx, vx2, c4o9); - VF::LBM::backwardChimeraWithK(EQabc, EQbbc, EQcbc, vvx, vx2, c1o9); - VF::LBM::backwardChimeraWithK(EQaca, EQbca, EQcca, vvx, vx2, c1o36); - VF::LBM::backwardChimeraWithK(EQacb, EQbcb, EQccb, vvx, vx2, c1o9); - VF::LBM::backwardChimeraWithK(EQacc, EQbcc, EQccc, vvx, vx2, c1o36); - - //////////////////////////////////////////////////////////////////////////////////// - //Pre-condition - mfcbb -= EQcbb; - mfabb -= EQabb; - mfbcb -= EQbcb; - mfbab -= EQbab; - mfbbc -= EQbbc; - mfbba -= EQbba; - mfccb -= EQccb; - mfaab -= EQaab; - mfcab -= EQcab; - mfacb -= EQacb; - mfcbc -= EQcbc; - mfaba -= EQaba; - mfcba -= EQcba; - mfabc -= EQabc; - mfbcc -= EQbcc; - mfbaa -= EQbaa; - mfbca -= EQbca; - mfbac -= EQbac; - mfbbb -= EQbbb; - mfccc -= EQccc; - mfaac -= EQaac; - mfcac -= EQcac; - mfacc -= EQacc; - mfcca -= EQcca; - mfaaa -= EQaaa; - mfcaa -= EQcaa; - mfaca -= EQaca; - - //////////////////////////////////////////////////////////////////////////////////// - //Hin - //////////////////////////////////////////////////////////////////////////////////// - VF::LBM::forwardChimera(mfaaa, mfaab, mfaac, vvz, vz2); - VF::LBM::forwardChimera(mfaba, mfabb, mfabc, vvz, vz2); - VF::LBM::forwardChimera(mfaca, mfacb, mfacc, vvz, vz2); - VF::LBM::forwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); - VF::LBM::forwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); - VF::LBM::forwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); - VF::LBM::forwardChimera(mfcaa, mfcab, mfcac, vvz, vz2); - VF::LBM::forwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); - VF::LBM::forwardChimera(mfcca, mfccb, mfccc, vvz, vz2); - - VF::LBM::forwardChimera(mfaaa, mfaba, mfaca, vvy, vy2); - VF::LBM::forwardChimera(mfaab, mfabb, mfacb, vvy, vy2); - VF::LBM::forwardChimera(mfaac, mfabc, mfacc, vvy, vy2); - VF::LBM::forwardChimera(mfbaa, mfbba, mfbca, vvy, vy2); - VF::LBM::forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); - VF::LBM::forwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2); - VF::LBM::forwardChimera(mfcaa, mfcba, mfcca, vvy, vy2); - VF::LBM::forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); - VF::LBM::forwardChimera(mfcac, mfcbc, mfccc, vvy, vy2); - - VF::LBM::forwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2); - VF::LBM::forwardChimera(mfaab, mfbab, mfcab, vvx, vx2); - VF::LBM::forwardChimera(mfaac, mfbac, mfcac, vvx, vx2); - VF::LBM::forwardChimera(mfaba, mfbba, mfcba, vvx, vx2); - VF::LBM::forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); - VF::LBM::forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); - VF::LBM::forwardChimera(mfaca, mfbca, mfcca, vvx, vx2); - VF::LBM::forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); - VF::LBM::forwardChimera(mfacc, mfbcc, mfccc, vvx, vx2); - - ////////////////////////////////////////////////////////////////////////////////////// - ////Hin - ////////////////////////////////////////////////////////////////////////////////////// - //// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// Z - Dir - //forwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c4o9); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //// mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// Y - Dir - //forwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfaab, mfabb, mfacb, vvy, vy2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o18); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c2o3); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c2o9); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o6); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //// mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// X - Dir - //forwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, one); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfaba, mfbba, mfcba, vvx, vx2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o3); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfaab, mfbab, mfcab, vvx, vx2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o3); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); - ////////////////////////////////////////////////////////////////////////////////////// - //forwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////////// - // Cumulants - //////////////////////////////////////////////////////////////////////////////////// - real OxxPyyPzz = c1o1; //omega; // one; //set the bulk viscosity one is high / two is very low and zero is (too) high - - //////////////////////////////////////////////////////////// - //3. - ////////////////////////////// - real OxyyPxzz = c1o1; - real OxyyMxzz = c1o1; - //real Oxyz = c1o1; - //////////////////////////////////////////////////////////// - //4. - ////////////////////////////// - real O4 = c1o1; - //////////////////////////////////////////////////////////// - //5. - ////////////////////////////// - real O5 = c1o1; - //////////////////////////////////////////////////////////// - //6. - ////////////////////////////// - real O6 = c1o1; - //////////////////////////////////////////////////////////// - - - //central moments to cumulants - //4. - real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho; - real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho; - real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho; - - real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho)); - real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho)); - real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho)); - - //5. - real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; - real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; - real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; - - //6. - - real CUMccc = mfccc + ((-c4o1 * mfbbb * mfbbb - - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho - + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) - + c2o1 * (mfcaa * mfaca * mfaac) - + c16o1 * mfbba * mfbab * mfabb) / (rho * rho) - - c1o3 * (mfacc + mfcac + mfcca) / rho - - c1o9 * (mfcaa + mfaca + mfaac) / rho - + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) - + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 - + c1o27*((drho * drho - drho) / (rho*rho))); - - - - - //2. - // linear combinations - real mxxPyyPzz = mfcaa + mfaca + mfaac; - real mxxMyy = mfcaa - mfaca; - real mxxMzz = mfcaa - mfaac; - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //incl. correction (hat noch nicht so gut funktioniert...Optimierungsbedarf??) - { - real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); - real dyuy = dxux + omega * c3o2 * mxxMyy; - real dzuz = dxux + omega * c3o2 * mxxMzz; - - //relax - mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz; - mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); - mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); - - } - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ////no correction - //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz; - //mxxMyy += -(-omega) * (-mxxMyy); - //mxxMzz += -(-omega) * (-mxxMzz); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - mfabb += omega * (-mfabb); - mfbab += omega * (-mfbab); - mfbba += omega * (-mfbba); - - ////////////////////////////////////////////////////////////////////////// - - // linear combinations back - mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); - mfaca = c1o3 * (-c2o1* mxxMyy + mxxMzz + mxxPyyPzz); - mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz); - - //3. - // linear combinations - - real mxxyPyzz = mfcba + mfabc; - real mxxyMyzz = mfcba - mfabc; - - real mxxzPyyz = mfcab + mfacb; - real mxxzMyyz = mfcab - mfacb; - - real mxyyPxzz = mfbca + mfbac; - real mxyyMxzz = mfbca - mfbac; - - //relax - ////////////////////////////////////////////////////////////////////////// - mfbbb += OxyyMxzz * (-mfbbb); - mxxyPyzz += OxyyPxzz * (-mxxyPyzz); - mxxyMyzz += OxyyMxzz * (-mxxyMyzz); - mxxzPyyz += OxyyPxzz * (-mxxzPyyz); - mxxzMyyz += OxyyMxzz * (-mxxzMyyz); - mxyyPxzz += OxyyPxzz * (-mxyyPxzz); - mxyyMxzz += OxyyMxzz * (-mxyyMxzz); - ////////////////////////////////////////////////////////////////////////// - - mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; - mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; - mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; - mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; - mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; - mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; - - //4. - ////////////////////////////////////////////////////////////////////////// - CUMacc += O4 * (-CUMacc); - CUMcac += O4 * (-CUMcac); - CUMcca += O4 * (-CUMcca); - - CUMbbc += O4 * (-CUMbbc); - CUMbcb += O4 * (-CUMbcb); - CUMcbb += O4 * (-CUMcbb); - ////////////////////////////////////////////////////////////////////////// - - - //5. - CUMbcc += O5 * (-CUMbcc); - CUMcbc += O5 * (-CUMcbc); - CUMccb += O5 * (-CUMccb); - - //6. - CUMccc += O6 * (-CUMccc); - - - - //back cumulants to central moments - //4. - mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho; - mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho; - mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho; - - mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho)); - mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho)); - mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho)); - - //5. - mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; - mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; - mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; - - //6. - mfccc = CUMccc - ((-c4o1 * mfbbb * mfbbb - - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho - + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) - + c2o1 * (mfcaa * mfaca * mfaac) - + c16o1 * mfbba * mfbab * mfabb) / (rho * rho) - - c1o3 * (mfacc + mfcac + mfcca) / rho - - c1o9 * (mfcaa + mfaca + mfaac) / rho - + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) - + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 - + c1o27*((drho * drho - drho) / (rho*rho))); - - //////////////////////////////////////////////////////////////////////////////////// - //the force be with you - mfbaa = -mfbaa; - mfaba = -mfaba; - mfaab = -mfaab; - //////////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////////// - //back - //////////////////////////////////////////////////////////////////////////////////// - VF::LBM::backwardChimera(mfaaa, mfaab, mfaac, vvz, vz2); - VF::LBM::backwardChimera(mfaba, mfabb, mfabc, vvz, vz2); - VF::LBM::backwardChimera(mfaca, mfacb, mfacc, vvz, vz2); - VF::LBM::backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); - VF::LBM::backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); - VF::LBM::backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); - VF::LBM::backwardChimera(mfcaa, mfcab, mfcac, vvz, vz2); - VF::LBM::backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); - VF::LBM::backwardChimera(mfcca, mfccb, mfccc, vvz, vz2); - - VF::LBM::backwardChimera(mfaaa, mfaba, mfaca, vvy, vy2); - VF::LBM::backwardChimera(mfaab, mfabb, mfacb, vvy, vy2); - VF::LBM::backwardChimera(mfaac, mfabc, mfacc, vvy, vy2); - VF::LBM::backwardChimera(mfbaa, mfbba, mfbca, vvy, vy2); - VF::LBM::backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); - VF::LBM::backwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2); - VF::LBM::backwardChimera(mfcaa, mfcba, mfcca, vvy, vy2); - VF::LBM::backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); - VF::LBM::backwardChimera(mfcac, mfcbc, mfccc, vvy, vy2); - - VF::LBM::backwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2); - VF::LBM::backwardChimera(mfaab, mfbab, mfcab, vvx, vx2); - VF::LBM::backwardChimera(mfaac, mfbac, mfcac, vvx, vx2); - VF::LBM::backwardChimera(mfaba, mfbba, mfcba, vvx, vx2); - VF::LBM::backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); - VF::LBM::backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); - VF::LBM::backwardChimera(mfaca, mfbca, mfcca, vvx, vx2); - VF::LBM::backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); - VF::LBM::backwardChimera(mfacc, mfbcc, mfccc, vvx, vx2); - - //////////////////////////////////////////////////////////////////////////////////// - mfcbb+=EQcbb; - mfabb+=EQabb; - mfbcb+=EQbcb; - mfbab+=EQbab; - mfbbc+=EQbbc; - mfbba+=EQbba; - mfccb+=EQccb; - mfaab+=EQaab; - mfcab+=EQcab; - mfacb+=EQacb; - mfcbc+=EQcbc; - mfaba+=EQaba; - mfcba+=EQcba; - mfabc+=EQabc; - mfbcc+=EQbcc; - mfbaa+=EQbaa; - mfbca+=EQbca; - mfbac+=EQbac; - mfbbb+=EQbbb; - mfccc+=EQccc; - mfaac+=EQaac; - mfcac+=EQcac; - mfacc+=EQacc; - mfcca+=EQcca; - mfaaa+=EQaaa; - mfcaa+=EQcaa; - mfaca+=EQaca; - - - ////////////////////////////////////////////////////////////////////////////////////// - ////back - ////////////////////////////////////////////////////////////////////////////////////// - ////mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// Z - Dir - //backwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, one); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfaba, mfabb, mfabc, vvz, vz2); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o3); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); - ///////////b////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); - ///////////b////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o3); - ///////////c////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); - ///////////c////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - ////mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// Y - Dir - //backwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaab, mfabb, mfacb, vvy, vy2, c2o3); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o6); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbaa, mfbba, mfbca, vvz, vz2); - ///////////b////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbab, mfbbb, mfbcb, vvz, vz2); - ///////////b////////////////////////////////////////////////////////////////////////// - //backwardChimera(mfbac, mfbbc, mfbcc, vvz, vz2); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o18); - ///////////c////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfcab, mfcbb, mfccb, vvy, vy2, c2o9); - ///////////c////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - ////mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren - ////////////////////////////////////////////////////////////////////////////////////// - //// X - Dir - //backwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaba, mfbba, mfcba, vvx, vx2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaab, mfbab, mfcab, vvx, vx2, c1o9); - /////////////b//////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfabb, mfbbb, mfcbb, vvx, vx2, c4o9); - /////////////b//////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfacb, mfbcb, mfccb, vvx, vx2, c1o9); - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o36); - /////////////c//////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfabc, mfbbc, mfcbc, vvx, vx2, c1o9); - /////////////c//////////////////////////////////////////////////////////////////////// - //backwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o36); - ////////////////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////////////////// - real drhoPost = - ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + - (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + - ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; - mfbbb += drho - drhoPost; - //////////////////////////////////////////////////////////////////////////////////// - (D.f[dirE])[k] = mfabb;//(D.f[ dirE ])[ke ] = mfabb;// - c2over27 ; (D.f[ dirE ])[k ] - (D.f[dirW])[kw] = mfcbb;//(D.f[ dirW ])[kw ] = mfcbb;// - c2over27 ; (D.f[ dirW ])[kw ] - (D.f[dirN])[k] = mfbab;//(D.f[ dirN ])[kn ] = mfbab;// - c2over27 ; (D.f[ dirN ])[k ] - (D.f[dirS])[ks] = mfbcb;//(D.f[ dirS ])[ks ] = mfbcb;// - c2over27 ; (D.f[ dirS ])[ks ] - (D.f[dirT])[k] = mfbba;//(D.f[ dirT ])[kt ] = mfbba;// - c2over27 ; (D.f[ dirT ])[k ] - (D.f[dirB])[kb] = mfbbc;//(D.f[ dirB ])[kb ] = mfbbc;// - c2over27 ; (D.f[ dirB ])[kb ] - (D.f[dirNE])[k] = mfaab;//(D.f[ dirNE ])[kne ] = mfaab;// - c1over54 ; (D.f[ dirNE ])[k ] - (D.f[dirSW])[ksw] = mfccb;//(D.f[ dirSW ])[ksw ] = mfccb;// - c1over54 ; (D.f[ dirSW ])[ksw ] - (D.f[dirSE])[ks] = mfacb;//(D.f[ dirSE ])[kse ] = mfacb;// - c1over54 ; (D.f[ dirSE ])[ks ] - (D.f[dirNW])[kw] = mfcab;//(D.f[ dirNW ])[knw ] = mfcab;// - c1over54 ; (D.f[ dirNW ])[kw ] - (D.f[dirTE])[k] = mfaba;//(D.f[ dirTE ])[kte ] = mfaba;// - c1over54 ; (D.f[ dirTE ])[k ] - (D.f[dirBW])[kbw] = mfcbc;//(D.f[ dirBW ])[kbw ] = mfcbc;// - c1over54 ; (D.f[ dirBW ])[kbw ] - (D.f[dirBE])[kb] = mfabc;//(D.f[ dirBE ])[kbe ] = mfabc;// - c1over54 ; (D.f[ dirBE ])[kb ] - (D.f[dirTW])[kw] = mfcba;//(D.f[ dirTW ])[ktw ] = mfcba;// - c1over54 ; (D.f[ dirTW ])[kw ] - (D.f[dirTN])[k] = mfbaa;//(D.f[ dirTN ])[ktn ] = mfbaa;// - c1over54 ; (D.f[ dirTN ])[k ] - (D.f[dirBS])[kbs] = mfbcc;//(D.f[ dirBS ])[kbs ] = mfbcc;// - c1over54 ; (D.f[ dirBS ])[kbs ] - (D.f[dirBN])[kb] = mfbac;//(D.f[ dirBN ])[kbn ] = mfbac;// - c1over54 ; (D.f[ dirBN ])[kb ] - (D.f[dirTS])[ks] = mfbca;//(D.f[ dirTS ])[kts ] = mfbca;// - c1over54 ; (D.f[ dirTS ])[ks ] - (D.f[dirZERO])[k] = mfbbb;//(D.f[ dirZERO])[kzero] = mfbbb;// - c8over27 ; (D.f[ dirZERO])[k ] - (D.f[dirTNE])[k] = mfaaa;//(D.f[ dirTNE ])[ktne ] = mfaaa;// - c1over216; (D.f[ dirTNE ])[k ] - (D.f[dirTSE])[ks] = mfaca;//(D.f[ dirTSE ])[ktse ] = mfaca;// - c1over216; (D.f[ dirTSE ])[ks ] - (D.f[dirBNE])[kb] = mfaac;//(D.f[ dirBNE ])[kbne ] = mfaac;// - c1over216; (D.f[ dirBNE ])[kb ] - (D.f[dirBSE])[kbs] = mfacc;//(D.f[ dirBSE ])[kbse ] = mfacc;// - c1over216; (D.f[ dirBSE ])[kbs ] - (D.f[dirTNW])[kw] = mfcaa;//(D.f[ dirTNW ])[ktnw ] = mfcaa;// - c1over216; (D.f[ dirTNW ])[kw ] - (D.f[dirTSW])[ksw] = mfcca;//(D.f[ dirTSW ])[ktsw ] = mfcca;// - c1over216; (D.f[ dirTSW ])[ksw ] - (D.f[dirBNW])[kbw] = mfcac;//(D.f[ dirBNW ])[kbnw ] = mfcac;// - c1over216; (D.f[ dirBNW ])[kbw ] - (D.f[dirBSW])[kbsw] = mfccc;//(D.f[ dirBSW ])[kbsw ] = mfccc;// - c1over216; (D.f[ dirBSW ])[kbsw] - //////////////////////////////////////////////////////////////////////////////////// - } - } + //////////////////////////////////////////////////////////////////////////////// + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index + + const unsigned nx = blockDim.x; + const unsigned ny = gridDim.x; + + const unsigned k = nx*(ny*z + y) + x; + ////////////////////////////////////////////////////////////////////////// + + if (k<size_Mat) + { + //////////////////////////////////////////////////////////////////////////////// + unsigned int BC; + BC = bcMatD[k]; + + if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/) + { + Distributions27 D; + if (EvenOrOdd == true) + { + D.f[dirE] = &DDStart[dirE *size_Mat]; + D.f[dirW] = &DDStart[dirW *size_Mat]; + D.f[dirN] = &DDStart[dirN *size_Mat]; + D.f[dirS] = &DDStart[dirS *size_Mat]; + D.f[dirT] = &DDStart[dirT *size_Mat]; + D.f[dirB] = &DDStart[dirB *size_Mat]; + D.f[dirNE] = &DDStart[dirNE *size_Mat]; + D.f[dirSW] = &DDStart[dirSW *size_Mat]; + D.f[dirSE] = &DDStart[dirSE *size_Mat]; + D.f[dirNW] = &DDStart[dirNW *size_Mat]; + D.f[dirTE] = &DDStart[dirTE *size_Mat]; + D.f[dirBW] = &DDStart[dirBW *size_Mat]; + D.f[dirBE] = &DDStart[dirBE *size_Mat]; + D.f[dirTW] = &DDStart[dirTW *size_Mat]; + D.f[dirTN] = &DDStart[dirTN *size_Mat]; + D.f[dirBS] = &DDStart[dirBS *size_Mat]; + D.f[dirBN] = &DDStart[dirBN *size_Mat]; + D.f[dirTS] = &DDStart[dirTS *size_Mat]; + D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; + D.f[dirTNE] = &DDStart[dirTNE *size_Mat]; + D.f[dirTSW] = &DDStart[dirTSW *size_Mat]; + D.f[dirTSE] = &DDStart[dirTSE *size_Mat]; + D.f[dirTNW] = &DDStart[dirTNW *size_Mat]; + D.f[dirBNE] = &DDStart[dirBNE *size_Mat]; + D.f[dirBSW] = &DDStart[dirBSW *size_Mat]; + D.f[dirBSE] = &DDStart[dirBSE *size_Mat]; + D.f[dirBNW] = &DDStart[dirBNW *size_Mat]; + } + else + { + D.f[dirW] = &DDStart[dirE *size_Mat]; + D.f[dirE] = &DDStart[dirW *size_Mat]; + D.f[dirS] = &DDStart[dirN *size_Mat]; + D.f[dirN] = &DDStart[dirS *size_Mat]; + D.f[dirB] = &DDStart[dirT *size_Mat]; + D.f[dirT] = &DDStart[dirB *size_Mat]; + D.f[dirSW] = &DDStart[dirNE *size_Mat]; + D.f[dirNE] = &DDStart[dirSW *size_Mat]; + D.f[dirNW] = &DDStart[dirSE *size_Mat]; + D.f[dirSE] = &DDStart[dirNW *size_Mat]; + D.f[dirBW] = &DDStart[dirTE *size_Mat]; + D.f[dirTE] = &DDStart[dirBW *size_Mat]; + D.f[dirTW] = &DDStart[dirBE *size_Mat]; + D.f[dirBE] = &DDStart[dirTW *size_Mat]; + D.f[dirBS] = &DDStart[dirTN *size_Mat]; + D.f[dirTN] = &DDStart[dirBS *size_Mat]; + D.f[dirTS] = &DDStart[dirBN *size_Mat]; + D.f[dirBN] = &DDStart[dirTS *size_Mat]; + D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; + D.f[dirBSW] = &DDStart[dirTNE *size_Mat]; + D.f[dirBNE] = &DDStart[dirTSW *size_Mat]; + D.f[dirBNW] = &DDStart[dirTSE *size_Mat]; + D.f[dirBSE] = &DDStart[dirTNW *size_Mat]; + D.f[dirTSW] = &DDStart[dirBNE *size_Mat]; + D.f[dirTNE] = &DDStart[dirBSW *size_Mat]; + D.f[dirTNW] = &DDStart[dirBSE *size_Mat]; + D.f[dirTSE] = &DDStart[dirBNW *size_Mat]; + } + + //////////////////////////////////////////////////////////////////////////////// + //index + //unsigned int kzero= k; + //unsigned int ke = k; + unsigned int kw = neighborX[k]; + //unsigned int kn = k; + unsigned int ks = neighborY[k]; + //unsigned int kt = k; + unsigned int kb = neighborZ[k]; + unsigned int ksw = neighborY[kw]; + //unsigned int kne = k; + //unsigned int kse = ks; + //unsigned int knw = kw; + unsigned int kbw = neighborZ[kw]; + //unsigned int kte = k; + //unsigned int kbe = kb; + //unsigned int ktw = kw; + unsigned int kbs = neighborZ[ks]; + //unsigned int ktn = k; + //unsigned int kbn = kb; + //unsigned int kts = ks; + //unsigned int ktse = ks; + //unsigned int kbnw = kbw; + //unsigned int ktnw = kw; + //unsigned int kbse = kbs; + //unsigned int ktsw = ksw; + //unsigned int kbne = kb; + //unsigned int ktne = k; + unsigned int kbsw = neighborZ[ksw]; + + + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + real mfcbb = (D.f[dirE])[k];//[ke ];// + c2over27 ;(D.f[dirE ])[k ];//ke + real mfabb = (D.f[dirW])[kw];//[kw ];// + c2over27 ;(D.f[dirW ])[kw ]; + real mfbcb = (D.f[dirN])[k];//[kn ];// + c2over27 ;(D.f[dirN ])[k ];//kn + real mfbab = (D.f[dirS])[ks];//[ks ];// + c2over27 ;(D.f[dirS ])[ks ]; + real mfbbc = (D.f[dirT])[k];//[kt ];// + c2over27 ;(D.f[dirT ])[k ];//kt + real mfbba = (D.f[dirB])[kb];//[kb ];// + c2over27 ;(D.f[dirB ])[kb ]; + real mfccb = (D.f[dirNE])[k];//[kne ];// + c1over54 ;(D.f[dirNE ])[k ];//kne + real mfaab = (D.f[dirSW])[ksw];//[ksw ];// + c1over54 ;(D.f[dirSW ])[ksw]; + real mfcab = (D.f[dirSE])[ks];//[kse ];// + c1over54 ;(D.f[dirSE ])[ks ];//kse + real mfacb = (D.f[dirNW])[kw];//[knw ];// + c1over54 ;(D.f[dirNW ])[kw ];//knw + real mfcbc = (D.f[dirTE])[k];//[kte ];// + c1over54 ;(D.f[dirTE ])[k ];//kte + real mfaba = (D.f[dirBW])[kbw];//[kbw ];// + c1over54 ;(D.f[dirBW ])[kbw]; + real mfcba = (D.f[dirBE])[kb];//[kbe ];// + c1over54 ;(D.f[dirBE ])[kb ];//kbe + real mfabc = (D.f[dirTW])[kw];//[ktw ];// + c1over54 ;(D.f[dirTW ])[kw ];//ktw + real mfbcc = (D.f[dirTN])[k];//[ktn ];// + c1over54 ;(D.f[dirTN ])[k ];//ktn + real mfbaa = (D.f[dirBS])[kbs];//[kbs ];// + c1over54 ;(D.f[dirBS ])[kbs]; + real mfbca = (D.f[dirBN])[kb];//[kbn ];// + c1over54 ;(D.f[dirBN ])[kb ];//kbn + real mfbac = (D.f[dirTS])[ks];//[kts ];// + c1over54 ;(D.f[dirTS ])[ks ];//kts + real mfbbb = (D.f[dirZERO])[k];//[kzero];// + c8over27 ;(D.f[dirZERO])[k ];//kzero + real mfccc = (D.f[dirTNE])[k];//[ktne ];// + c1over216;(D.f[dirTNE ])[k ];//ktne + real mfaac = (D.f[dirTSW])[ksw];//[ktsw ];// + c1over216;(D.f[dirTSW ])[ksw];//ktsw + real mfcac = (D.f[dirTSE])[ks];//[ktse ];// + c1over216;(D.f[dirTSE ])[ks ];//ktse + real mfacc = (D.f[dirTNW])[kw];//[ktnw ];// + c1over216;(D.f[dirTNW ])[kw ];//ktnw + real mfcca = (D.f[dirBNE])[kb];//[kbne ];// + c1over216;(D.f[dirBNE ])[kb ];//kbne + real mfaaa = (D.f[dirBSW])[kbsw];//[kbsw ];// + c1over216;(D.f[dirBSW ])[kbsw]; + real mfcaa = (D.f[dirBSE])[kbs];//[kbse ];// + c1over216;(D.f[dirBSE ])[kbs];//kbse + real mfaca = (D.f[dirBNW])[kbw];//[kbnw ];// + c1over216;(D.f[dirBNW ])[kbw];//kbnw + //////////////////////////////////////////////////////////////////////////////////// + real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + + real rho = c1o1 + drho; + //////////////////////////////////////////////////////////////////////////////////// + real vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)) / rho; + real vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)) / rho; + real vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)) / rho; + //////////////////////////////////////////////////////////////////////////////////// + //the force be with you + real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; // + real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero; + real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero; + vvx += fx*c1o2; + vvy += fy*c1o2; + vvz += fz*c1o2; + //////////////////////////////////////////////////////////////////////////////////// + //real omega = omega_in; + //////////////////////////////////////////////////////////////////////////////////// + //fast + //real oMdrho = c1o1; // comp special + //real m0, m1, m2; + real vx2; + real vy2; + real vz2; + vx2 = vvx*vvx; + vy2 = vvy*vvy; + vz2 = vvz*vvz; + //////////////////////////////////////////////////////////////////////////////////// + //real wadjust; + //real qudricLimitP = c1o100;// * 0.0001f; + //real qudricLimitM = c1o100;// * 0.0001f; + //real qudricLimitD = c1o100;// * 0.001f; + //real s9 = minusomega; + //test + //s9 = 0.; + + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + real EQcbb = c0o1; + real EQabb = c0o1; + real EQbcb = c0o1; + real EQbab = c0o1; + real EQbbc = c0o1; + real EQbba = c0o1; + real EQccb = c0o1; + real EQaab = c0o1; + real EQcab = c0o1; + real EQacb = c0o1; + real EQcbc = c0o1; + real EQaba = c0o1; + real EQcba = c0o1; + real EQabc = c0o1; + real EQbcc = c0o1; + real EQbaa = c0o1; + real EQbca = c0o1; + real EQbac = c0o1; + real EQbbb = c0o1; + real EQccc = drho * c1o27; + real EQaac = drho * c1o3; + real EQcac = drho * c1o9; + real EQacc = drho * c1o9; + real EQcca = drho * c1o9; + real EQaaa = drho; + real EQcaa = drho * c1o3; + real EQaca = drho * c1o3; + //////////////////////////////////////////////////////////////////////////////////// + VF::LBM::backwardChimeraWithK(EQaaa, EQaab, EQaac, vvz, vz2, c1o1); + VF::LBM::backwardChimeraWithK(EQaca, EQacb, EQacc, vvz, vz2, c1o3); + /////////////////////////////////////////////////////////// + EQcaa = EQaca; EQcab = EQacb; EQcac = EQacc; + /////////////////////////////////////////////////////////// + VF::LBM::backwardChimeraWithK(EQcca, EQccb, EQccc, vvz, vz2, c1o9); + + VF::LBM::backwardChimeraWithK(EQaaa, EQaba, EQaca, vvy, vy2, c1o6); + VF::LBM::backwardChimeraWithK(EQaab, EQabb, EQacb, vvy, vy2, c2o3); + VF::LBM::backwardChimeraWithK(EQaac, EQabc, EQacc, vvy, vy2, c1o6); + VF::LBM::backwardChimeraWithK(EQcaa, EQcba, EQcca, vvy, vy2, c1o18); + VF::LBM::backwardChimeraWithK(EQcab, EQcbb, EQccb, vvy, vy2, c2o9); + VF::LBM::backwardChimeraWithK(EQcac, EQcbc, EQccc, vvy, vy2, c1o18); + + VF::LBM::backwardChimeraWithK(EQaaa, EQbaa, EQcaa, vvx, vx2, c1o36); + VF::LBM::backwardChimeraWithK(EQaab, EQbab, EQcab, vvx, vx2, c1o9); + VF::LBM::backwardChimeraWithK(EQaac, EQbac, EQcac, vvx, vx2, c1o36); + VF::LBM::backwardChimeraWithK(EQaba, EQbba, EQcba, vvx, vx2, c1o9); + VF::LBM::backwardChimeraWithK(EQabb, EQbbb, EQcbb, vvx, vx2, c4o9); + VF::LBM::backwardChimeraWithK(EQabc, EQbbc, EQcbc, vvx, vx2, c1o9); + VF::LBM::backwardChimeraWithK(EQaca, EQbca, EQcca, vvx, vx2, c1o36); + VF::LBM::backwardChimeraWithK(EQacb, EQbcb, EQccb, vvx, vx2, c1o9); + VF::LBM::backwardChimeraWithK(EQacc, EQbcc, EQccc, vvx, vx2, c1o36); + + //////////////////////////////////////////////////////////////////////////////////// + //Pre-condition + mfcbb -= EQcbb; + mfabb -= EQabb; + mfbcb -= EQbcb; + mfbab -= EQbab; + mfbbc -= EQbbc; + mfbba -= EQbba; + mfccb -= EQccb; + mfaab -= EQaab; + mfcab -= EQcab; + mfacb -= EQacb; + mfcbc -= EQcbc; + mfaba -= EQaba; + mfcba -= EQcba; + mfabc -= EQabc; + mfbcc -= EQbcc; + mfbaa -= EQbaa; + mfbca -= EQbca; + mfbac -= EQbac; + mfbbb -= EQbbb; + mfccc -= EQccc; + mfaac -= EQaac; + mfcac -= EQcac; + mfacc -= EQacc; + mfcca -= EQcca; + mfaaa -= EQaaa; + mfcaa -= EQcaa; + mfaca -= EQaca; + + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + VF::LBM::forwardChimera(mfaaa, mfaab, mfaac, vvz, vz2); + VF::LBM::forwardChimera(mfaba, mfabb, mfabc, vvz, vz2); + VF::LBM::forwardChimera(mfaca, mfacb, mfacc, vvz, vz2); + VF::LBM::forwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); + VF::LBM::forwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); + VF::LBM::forwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); + VF::LBM::forwardChimera(mfcaa, mfcab, mfcac, vvz, vz2); + VF::LBM::forwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); + VF::LBM::forwardChimera(mfcca, mfccb, mfccc, vvz, vz2); + + VF::LBM::forwardChimera(mfaaa, mfaba, mfaca, vvy, vy2); + VF::LBM::forwardChimera(mfaab, mfabb, mfacb, vvy, vy2); + VF::LBM::forwardChimera(mfaac, mfabc, mfacc, vvy, vy2); + VF::LBM::forwardChimera(mfbaa, mfbba, mfbca, vvy, vy2); + VF::LBM::forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); + VF::LBM::forwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2); + VF::LBM::forwardChimera(mfcaa, mfcba, mfcca, vvy, vy2); + VF::LBM::forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); + VF::LBM::forwardChimera(mfcac, mfcbc, mfccc, vvy, vy2); + + VF::LBM::forwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2); + VF::LBM::forwardChimera(mfaab, mfbab, mfcab, vvx, vx2); + VF::LBM::forwardChimera(mfaac, mfbac, mfcac, vvx, vx2); + VF::LBM::forwardChimera(mfaba, mfbba, mfcba, vvx, vx2); + VF::LBM::forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); + VF::LBM::forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); + VF::LBM::forwardChimera(mfaca, mfbca, mfcca, vvx, vx2); + VF::LBM::forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); + VF::LBM::forwardChimera(mfacc, mfbcc, mfccc, vvx, vx2); + + ////////////////////////////////////////////////////////////////////////////////////// + ////Hin + ////////////////////////////////////////////////////////////////////////////////////// + //// mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// Z - Dir + //forwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c4o9); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //// mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// Y - Dir + //forwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfaab, mfabb, mfacb, vvy, vy2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o18); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c2o3); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c2o9); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o6); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //// mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// X - Dir + //forwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, one); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfaba, mfbba, mfcba, vvx, vx2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o3); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfaab, mfbab, mfcab, vvx, vx2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o3); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); + ////////////////////////////////////////////////////////////////////////////////////// + //forwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + real OxxPyyPzz = c1o1; //omega; // one; //set the bulk viscosity one is high / two is very low and zero is (too) high + + //////////////////////////////////////////////////////////// + //3. + ////////////////////////////// + real OxyyPxzz = c1o1; + real OxyyMxzz = c1o1; + //real Oxyz = c1o1; + //////////////////////////////////////////////////////////// + //4. + ////////////////////////////// + real O4 = c1o1; + //////////////////////////////////////////////////////////// + //5. + ////////////////////////////// + real O5 = c1o1; + //////////////////////////////////////////////////////////// + //6. + ////////////////////////////// + real O6 = c1o1; + //////////////////////////////////////////////////////////// + + + //central moments to cumulants + //4. + real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho; + real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho; + real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho; + + real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho)); + real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho)); + real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho)); + + //5. + real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; + real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; + real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; + + //6. + + real CUMccc = mfccc + ((-c4o1 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho + + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2o1 * (mfcaa * mfaca * mfaac) + + c16o1 * mfbba * mfbab * mfabb) / (rho * rho) + - c1o3 * (mfacc + mfcac + mfcca) / rho + - c1o9 * (mfcaa + mfaca + mfaac) / rho + + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 + + c1o27*((drho * drho - drho) / (rho*rho))); + + + + + //2. + // linear combinations + real mxxPyyPzz = mfcaa + mfaca + mfaac; + real mxxMyy = mfcaa - mfaca; + real mxxMzz = mfcaa - mfaac; + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //incl. correction (hat noch nicht so gut funktioniert...Optimierungsbedarf??) + { + real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + real dyuy = dxux + omega * c3o2 * mxxMyy; + real dzuz = dxux + omega * c3o2 * mxxMzz; + + //relax + mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz; + mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); + + } + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////no correction + //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz; + //mxxMyy += -(-omega) * (-mxxMyy); + //mxxMzz += -(-omega) * (-mxxMzz); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + mfabb += omega * (-mfabb); + mfbab += omega * (-mfbab); + mfbba += omega * (-mfbba); + + ////////////////////////////////////////////////////////////////////////// + + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-c2o1* mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + + real mxxyPyzz = mfcba + mfabc; + real mxxyMyzz = mfcba - mfabc; + + real mxxzPyyz = mfcab + mfacb; + real mxxzMyyz = mfcab - mfacb; + + real mxyyPxzz = mfbca + mfbac; + real mxyyMxzz = mfbca - mfbac; + + //relax + ////////////////////////////////////////////////////////////////////////// + mfbbb += OxyyMxzz * (-mfbbb); + mxxyPyzz += OxyyPxzz * (-mxxyPyzz); + mxxyMyzz += OxyyMxzz * (-mxxyMyzz); + mxxzPyyz += OxyyPxzz * (-mxxzPyyz); + mxxzMyyz += OxyyMxzz * (-mxxzMyyz); + mxyyPxzz += OxyyPxzz * (-mxyyPxzz); + mxyyMxzz += OxyyMxzz * (-mxyyMxzz); + ////////////////////////////////////////////////////////////////////////// + + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + ////////////////////////////////////////////////////////////////////////// + CUMacc += O4 * (-CUMacc); + CUMcac += O4 * (-CUMcac); + CUMcca += O4 * (-CUMcca); + + CUMbbc += O4 * (-CUMbbc); + CUMbcb += O4 * (-CUMbcb); + CUMcbb += O4 * (-CUMcbb); + ////////////////////////////////////////////////////////////////////////// + + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + + + //back cumulants to central moments + //4. + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) / rho; + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) / rho; + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) / rho; + + mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9*(drho / rho)); + mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9*(drho / rho)); + mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9*(drho / rho)); + + //5. + mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; + mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; + mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; + + //6. + mfccc = CUMccc - ((-c4o1 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho + + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2o1 * (mfcaa * mfaca * mfaac) + + c16o1 * mfbba * mfbab * mfabb) / (rho * rho) + - c1o3 * (mfacc + mfcac + mfcca) / rho + - c1o9 * (mfcaa + mfaca + mfaac) / rho + + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 + + c1o27*((drho * drho - drho) / (rho*rho))); + + //////////////////////////////////////////////////////////////////////////////////// + //the force be with you + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + //////////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + VF::LBM::backwardChimera(mfaaa, mfaab, mfaac, vvz, vz2); + VF::LBM::backwardChimera(mfaba, mfabb, mfabc, vvz, vz2); + VF::LBM::backwardChimera(mfaca, mfacb, mfacc, vvz, vz2); + VF::LBM::backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); + VF::LBM::backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); + VF::LBM::backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); + VF::LBM::backwardChimera(mfcaa, mfcab, mfcac, vvz, vz2); + VF::LBM::backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); + VF::LBM::backwardChimera(mfcca, mfccb, mfccc, vvz, vz2); + + VF::LBM::backwardChimera(mfaaa, mfaba, mfaca, vvy, vy2); + VF::LBM::backwardChimera(mfaab, mfabb, mfacb, vvy, vy2); + VF::LBM::backwardChimera(mfaac, mfabc, mfacc, vvy, vy2); + VF::LBM::backwardChimera(mfbaa, mfbba, mfbca, vvy, vy2); + VF::LBM::backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); + VF::LBM::backwardChimera(mfbac, mfbbc, mfbcc, vvy, vy2); + VF::LBM::backwardChimera(mfcaa, mfcba, mfcca, vvy, vy2); + VF::LBM::backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); + VF::LBM::backwardChimera(mfcac, mfcbc, mfccc, vvy, vy2); + + VF::LBM::backwardChimera(mfaaa, mfbaa, mfcaa, vvx, vx2); + VF::LBM::backwardChimera(mfaab, mfbab, mfcab, vvx, vx2); + VF::LBM::backwardChimera(mfaac, mfbac, mfcac, vvx, vx2); + VF::LBM::backwardChimera(mfaba, mfbba, mfcba, vvx, vx2); + VF::LBM::backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); + VF::LBM::backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); + VF::LBM::backwardChimera(mfaca, mfbca, mfcca, vvx, vx2); + VF::LBM::backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); + VF::LBM::backwardChimera(mfacc, mfbcc, mfccc, vvx, vx2); + + //////////////////////////////////////////////////////////////////////////////////// + mfcbb+=EQcbb; + mfabb+=EQabb; + mfbcb+=EQbcb; + mfbab+=EQbab; + mfbbc+=EQbbc; + mfbba+=EQbba; + mfccb+=EQccb; + mfaab+=EQaab; + mfcab+=EQcab; + mfacb+=EQacb; + mfcbc+=EQcbc; + mfaba+=EQaba; + mfcba+=EQcba; + mfabc+=EQabc; + mfbcc+=EQbcc; + mfbaa+=EQbaa; + mfbca+=EQbca; + mfbac+=EQbac; + mfbbb+=EQbbb; + mfccc+=EQccc; + mfaac+=EQaac; + mfcac+=EQcac; + mfacc+=EQacc; + mfcca+=EQcca; + mfaaa+=EQaaa; + mfcaa+=EQcaa; + mfaca+=EQaca; + + + ////////////////////////////////////////////////////////////////////////////////////// + ////back + ////////////////////////////////////////////////////////////////////////////////////// + ////mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// Z - Dir + //backwardChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, one); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfaba, mfabb, mfabc, vvz, vz2); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c1o3); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbaa, mfbab, mfbac, vvz, vz2); + ///////////b////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbba, mfbbb, mfbbc, vvz, vz2); + ///////////b////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbca, mfbcb, mfbcc, vvz, vz2); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c1o3); + ///////////c////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfcba, mfcbb, mfcbc, vvz, vz2); + ///////////c////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + ////mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// Y - Dir + //backwardChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c1o6); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaab, mfabb, mfacb, vvy, vy2, c2o3); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c1o6); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbaa, mfbba, mfbca, vvz, vz2); + ///////////b////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbab, mfbbb, mfbcb, vvz, vz2); + ///////////b////////////////////////////////////////////////////////////////////////// + //backwardChimera(mfbac, mfbbc, mfbcc, vvz, vz2); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c1o18); + ///////////c////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfcab, mfcbb, mfccb, vvy, vy2, c2o9); + ///////////c////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c1o18); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + ////mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + ////////////////////////////////////////////////////////////////////////////////////// + //// X - Dir + //backwardChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaba, mfbba, mfcba, vvx, vx2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaab, mfbab, mfcab, vvx, vx2, c1o9); + /////////////b//////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfabb, mfbbb, mfcbb, vvx, vx2, c4o9); + /////////////b//////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfacb, mfbcb, mfccb, vvx, vx2, c1o9); + ////////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c1o36); + /////////////c//////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfabc, mfbbc, mfcbc, vvx, vx2, c1o9); + /////////////c//////////////////////////////////////////////////////////////////////// + //backwardChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c1o36); + ////////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////////////////// + real drhoPost = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + mfbbb += drho - drhoPost; + //////////////////////////////////////////////////////////////////////////////////// + (D.f[dirE])[k] = mfabb;//(D.f[ dirE ])[ke ] = mfabb;// - c2over27 ; (D.f[ dirE ])[k ] + (D.f[dirW])[kw] = mfcbb;//(D.f[ dirW ])[kw ] = mfcbb;// - c2over27 ; (D.f[ dirW ])[kw ] + (D.f[dirN])[k] = mfbab;//(D.f[ dirN ])[kn ] = mfbab;// - c2over27 ; (D.f[ dirN ])[k ] + (D.f[dirS])[ks] = mfbcb;//(D.f[ dirS ])[ks ] = mfbcb;// - c2over27 ; (D.f[ dirS ])[ks ] + (D.f[dirT])[k] = mfbba;//(D.f[ dirT ])[kt ] = mfbba;// - c2over27 ; (D.f[ dirT ])[k ] + (D.f[dirB])[kb] = mfbbc;//(D.f[ dirB ])[kb ] = mfbbc;// - c2over27 ; (D.f[ dirB ])[kb ] + (D.f[dirNE])[k] = mfaab;//(D.f[ dirNE ])[kne ] = mfaab;// - c1over54 ; (D.f[ dirNE ])[k ] + (D.f[dirSW])[ksw] = mfccb;//(D.f[ dirSW ])[ksw ] = mfccb;// - c1over54 ; (D.f[ dirSW ])[ksw ] + (D.f[dirSE])[ks] = mfacb;//(D.f[ dirSE ])[kse ] = mfacb;// - c1over54 ; (D.f[ dirSE ])[ks ] + (D.f[dirNW])[kw] = mfcab;//(D.f[ dirNW ])[knw ] = mfcab;// - c1over54 ; (D.f[ dirNW ])[kw ] + (D.f[dirTE])[k] = mfaba;//(D.f[ dirTE ])[kte ] = mfaba;// - c1over54 ; (D.f[ dirTE ])[k ] + (D.f[dirBW])[kbw] = mfcbc;//(D.f[ dirBW ])[kbw ] = mfcbc;// - c1over54 ; (D.f[ dirBW ])[kbw ] + (D.f[dirBE])[kb] = mfabc;//(D.f[ dirBE ])[kbe ] = mfabc;// - c1over54 ; (D.f[ dirBE ])[kb ] + (D.f[dirTW])[kw] = mfcba;//(D.f[ dirTW ])[ktw ] = mfcba;// - c1over54 ; (D.f[ dirTW ])[kw ] + (D.f[dirTN])[k] = mfbaa;//(D.f[ dirTN ])[ktn ] = mfbaa;// - c1over54 ; (D.f[ dirTN ])[k ] + (D.f[dirBS])[kbs] = mfbcc;//(D.f[ dirBS ])[kbs ] = mfbcc;// - c1over54 ; (D.f[ dirBS ])[kbs ] + (D.f[dirBN])[kb] = mfbac;//(D.f[ dirBN ])[kbn ] = mfbac;// - c1over54 ; (D.f[ dirBN ])[kb ] + (D.f[dirTS])[ks] = mfbca;//(D.f[ dirTS ])[kts ] = mfbca;// - c1over54 ; (D.f[ dirTS ])[ks ] + (D.f[dirZERO])[k] = mfbbb;//(D.f[ dirZERO])[kzero] = mfbbb;// - c8over27 ; (D.f[ dirZERO])[k ] + (D.f[dirTNE])[k] = mfaaa;//(D.f[ dirTNE ])[ktne ] = mfaaa;// - c1over216; (D.f[ dirTNE ])[k ] + (D.f[dirTSE])[ks] = mfaca;//(D.f[ dirTSE ])[ktse ] = mfaca;// - c1over216; (D.f[ dirTSE ])[ks ] + (D.f[dirBNE])[kb] = mfaac;//(D.f[ dirBNE ])[kbne ] = mfaac;// - c1over216; (D.f[ dirBNE ])[kb ] + (D.f[dirBSE])[kbs] = mfacc;//(D.f[ dirBSE ])[kbse ] = mfacc;// - c1over216; (D.f[ dirBSE ])[kbs ] + (D.f[dirTNW])[kw] = mfcaa;//(D.f[ dirTNW ])[ktnw ] = mfcaa;// - c1over216; (D.f[ dirTNW ])[kw ] + (D.f[dirTSW])[ksw] = mfcca;//(D.f[ dirTSW ])[ktsw ] = mfcca;// - c1over216; (D.f[ dirTSW ])[ksw ] + (D.f[dirBNW])[kbw] = mfcac;//(D.f[ dirBNW ])[kbnw ] = mfcac;// - c1over216; (D.f[ dirBNW ])[kbw ] + (D.f[dirBSW])[kbsw] = mfccc;//(D.f[ dirBSW ])[kbsw ] = mfccc;// - c1over216; (D.f[ dirBSW ])[kbsw] + //////////////////////////////////////////////////////////////////////////////////// + } + } } //////////////////////////////////////////////////////////////////////////////// @@ -1728,483 +2577,483 @@ extern "C" __global__ void Cumulant_One_preconditioned_chim_Comp_SP_27( //////////////////////////////////////////////////////////////////////////////// extern "C" __global__ void Cumulant_One_chim_Comp_SP_27( - real omega, - unsigned int* bcMatD, - unsigned int* neighborX, - unsigned int* neighborY, - unsigned int* neighborZ, - real* DDStart, - int size_Mat, - int level, - real* forces, - bool EvenOrOdd) + real omega, + unsigned int* bcMatD, + unsigned int* neighborX, + unsigned int* neighborY, + unsigned int* neighborZ, + real* DDStart, + int size_Mat, + int level, + real* forces, + bool EvenOrOdd) { - //////////////////////////////////////////////////////////////////////////////// - const unsigned x = threadIdx.x; // Globaler x-Index - const unsigned y = blockIdx.x; // Globaler y-Index - const unsigned z = blockIdx.y; // Globaler z-Index - - const unsigned nx = blockDim.x; - const unsigned ny = gridDim.x; - - const unsigned k = nx*(ny*z + y) + x; - ////////////////////////////////////////////////////////////////////////// - - if (k<size_Mat) - { - //////////////////////////////////////////////////////////////////////////////// - unsigned int BC; - BC = bcMatD[k]; - - if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/) - { - Distributions27 D; - if (EvenOrOdd == true) - { - D.f[dirE ] = &DDStart[dirE *size_Mat]; - D.f[dirW ] = &DDStart[dirW *size_Mat]; - D.f[dirN ] = &DDStart[dirN *size_Mat]; - D.f[dirS ] = &DDStart[dirS *size_Mat]; - D.f[dirT ] = &DDStart[dirT *size_Mat]; - D.f[dirB ] = &DDStart[dirB *size_Mat]; - D.f[dirNE ] = &DDStart[dirNE *size_Mat]; - D.f[dirSW ] = &DDStart[dirSW *size_Mat]; - D.f[dirSE ] = &DDStart[dirSE *size_Mat]; - D.f[dirNW ] = &DDStart[dirNW *size_Mat]; - D.f[dirTE ] = &DDStart[dirTE *size_Mat]; - D.f[dirBW ] = &DDStart[dirBW *size_Mat]; - D.f[dirBE ] = &DDStart[dirBE *size_Mat]; - D.f[dirTW ] = &DDStart[dirTW *size_Mat]; - D.f[dirTN ] = &DDStart[dirTN *size_Mat]; - D.f[dirBS ] = &DDStart[dirBS *size_Mat]; - D.f[dirBN ] = &DDStart[dirBN *size_Mat]; - D.f[dirTS ] = &DDStart[dirTS *size_Mat]; - D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; - D.f[dirTNE ] = &DDStart[dirTNE *size_Mat]; - D.f[dirTSW ] = &DDStart[dirTSW *size_Mat]; - D.f[dirTSE ] = &DDStart[dirTSE *size_Mat]; - D.f[dirTNW ] = &DDStart[dirTNW *size_Mat]; - D.f[dirBNE ] = &DDStart[dirBNE *size_Mat]; - D.f[dirBSW ] = &DDStart[dirBSW *size_Mat]; - D.f[dirBSE ] = &DDStart[dirBSE *size_Mat]; - D.f[dirBNW ] = &DDStart[dirBNW *size_Mat]; - } - else - { - D.f[dirW ] = &DDStart[dirE *size_Mat]; - D.f[dirE ] = &DDStart[dirW *size_Mat]; - D.f[dirS ] = &DDStart[dirN *size_Mat]; - D.f[dirN ] = &DDStart[dirS *size_Mat]; - D.f[dirB ] = &DDStart[dirT *size_Mat]; - D.f[dirT ] = &DDStart[dirB *size_Mat]; - D.f[dirSW ] = &DDStart[dirNE *size_Mat]; - D.f[dirNE ] = &DDStart[dirSW *size_Mat]; - D.f[dirNW ] = &DDStart[dirSE *size_Mat]; - D.f[dirSE ] = &DDStart[dirNW *size_Mat]; - D.f[dirBW ] = &DDStart[dirTE *size_Mat]; - D.f[dirTE ] = &DDStart[dirBW *size_Mat]; - D.f[dirTW ] = &DDStart[dirBE *size_Mat]; - D.f[dirBE ] = &DDStart[dirTW *size_Mat]; - D.f[dirBS ] = &DDStart[dirTN *size_Mat]; - D.f[dirTN ] = &DDStart[dirBS *size_Mat]; - D.f[dirTS ] = &DDStart[dirBN *size_Mat]; - D.f[dirBN ] = &DDStart[dirTS *size_Mat]; - D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; - D.f[dirBSW ] = &DDStart[dirTNE *size_Mat]; - D.f[dirBNE ] = &DDStart[dirTSW *size_Mat]; - D.f[dirBNW ] = &DDStart[dirTSE *size_Mat]; - D.f[dirBSE ] = &DDStart[dirTNW *size_Mat]; - D.f[dirTSW ] = &DDStart[dirBNE *size_Mat]; - D.f[dirTNE ] = &DDStart[dirBSW *size_Mat]; - D.f[dirTNW ] = &DDStart[dirBSE *size_Mat]; - D.f[dirTSE ] = &DDStart[dirBNW *size_Mat]; - } - //////////////////////////////////////////////////////////////////////////////// - //index - unsigned int kw = neighborX[k]; - unsigned int ks = neighborY[k]; - unsigned int kb = neighborZ[k]; - unsigned int ksw = neighborY[kw]; - unsigned int kbw = neighborZ[kw]; - unsigned int kbs = neighborZ[ks]; - unsigned int kbsw = neighborZ[ksw]; - //////////////////////////////////////////////////////////////////////////////////// - real mfcbb = (D.f[dirE ])[k ]; - real mfabb = (D.f[dirW ])[kw ]; - real mfbcb = (D.f[dirN ])[k ]; - real mfbab = (D.f[dirS ])[ks ]; - real mfbbc = (D.f[dirT ])[k ]; - real mfbba = (D.f[dirB ])[kb ]; - real mfccb = (D.f[dirNE ])[k ]; - real mfaab = (D.f[dirSW ])[ksw ]; - real mfcab = (D.f[dirSE ])[ks ]; - real mfacb = (D.f[dirNW ])[kw ]; - real mfcbc = (D.f[dirTE ])[k ]; - real mfaba = (D.f[dirBW ])[kbw ]; - real mfcba = (D.f[dirBE ])[kb ]; - real mfabc = (D.f[dirTW ])[kw ]; - real mfbcc = (D.f[dirTN ])[k ]; - real mfbaa = (D.f[dirBS ])[kbs ]; - real mfbca = (D.f[dirBN ])[kb ]; - real mfbac = (D.f[dirTS ])[ks ]; - real mfbbb = (D.f[dirZERO])[k ]; - real mfccc = (D.f[dirTNE ])[k ]; - real mfaac = (D.f[dirTSW ])[ksw ]; - real mfcac = (D.f[dirTSE ])[ks ]; - real mfacc = (D.f[dirTNW ])[kw ]; - real mfcca = (D.f[dirBNE ])[kb ]; - real mfaaa = (D.f[dirBSW ])[kbsw]; - real mfcaa = (D.f[dirBSE ])[kbs ]; - real mfaca = (D.f[dirBNW ])[kbw ]; - //////////////////////////////////////////////////////////////////////////////////// - real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + - (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + - ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; - - real rho = c1o1 + drho; - real OOrho = c1o1 / rho; - //////////////////////////////////////////////////////////////////////////////////// - real vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + - (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + - (mfcbb - mfabb)) * OOrho; - real vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + - (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + - (mfbcb - mfbab)) * OOrho; - real vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + - (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + - (mfbbc - mfbba)) * OOrho; - //////////////////////////////////////////////////////////////////////////////////// - //the force be with you - real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; // - real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero; - real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero; - vvx += fx*c1o2; - vvy += fy*c1o2; - vvz += fz*c1o2; - //////////////////////////////////////////////////////////////////////////////////// - //real omega = omega_in; - //////////////////////////////////////////////////////////////////////////////////// - //fast - //real oMdrho = c1o1; // comp special - //real m0, m1, m2; - real vx2; - real vy2; - real vz2; - vx2 = vvx*vvx; - vy2 = vvy*vvy; - vz2 = vvz*vvz; - //////////////////////////////////////////////////////////////////////////////////// - //real wadjust; - //real qudricLimitP = c1o100;// * 0.0001f; - //real qudricLimitM = c1o100;// * 0.0001f; - //real qudricLimitD = c1o100;// * 0.001f; - //////////////////////////////////////////////////////////////////////////////////// - //Hin - //////////////////////////////////////////////////////////////////////////////////// - // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren - //////////////////////////////////////////////////////////////////////////////////// - // Z - Dir - VF::LBM::forwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, 36.0f, c1o36); - VF::LBM::forwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, 9.0f , c1o9 ); - VF::LBM::forwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, 36.0f, c1o36); - VF::LBM::forwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, 9.0f , c1o9 ); - VF::LBM::forwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, 2.25f, c4o9 ); - VF::LBM::forwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, 9.0f , c1o9 ); - VF::LBM::forwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, 36.0f, c1o36); - VF::LBM::forwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, 9.0f , c1o9 ); - VF::LBM::forwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, 36.0f, c1o36); - - //////////////////////////////////////////////////////////////////////////////////// - // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren - //////////////////////////////////////////////////////////////////////////////////// - // Y - Dir - VF::LBM::forwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, 6.0f , c1o6 ); - VF::LBM::forwardChimera( mfaab, mfabb, mfacb, vvy, vy2); - VF::LBM::forwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, 18.0f, c1o18); - VF::LBM::forwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, 1.5f , c2o3 ); - VF::LBM::forwardChimera( mfbab, mfbbb, mfbcb, vvy, vy2); - VF::LBM::forwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, 4.5f , c2o9 ); - VF::LBM::forwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, 6.0f , c1o6 ); - VF::LBM::forwardChimera( mfcab, mfcbb, mfccb, vvy, vy2); - VF::LBM::forwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, 18.0f, c1o18); - - //////////////////////////////////////////////////////////////////////////////////// - // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren - //////////////////////////////////////////////////////////////////////////////////// - // X - Dir - VF::LBM::forwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1); - VF::LBM::forwardChimera( mfaba, mfbba, mfcba, vvx, vx2); - VF::LBM::forwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, 3.0f, c1o3); - VF::LBM::forwardChimera( mfaab, mfbab, mfcab, vvx, vx2); - VF::LBM::forwardChimera( mfabb, mfbbb, mfcbb, vvx, vx2); - VF::LBM::forwardChimera( mfacb, mfbcb, mfccb, vvx, vx2); - VF::LBM::forwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, 3.0f, c1o3); - VF::LBM::forwardChimera( mfabc, mfbbc, mfcbc, vvx, vx2); - VF::LBM::forwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, 9.0f, c1o9); - - //////////////////////////////////////////////////////////////////////////////////// - // Cumulants - //////////////////////////////////////////////////////////////////////////////////// - real OxxPyyPzz = c1o1; - //////////////////////////////////////////////////////////// - //3. - ////////////////////////////// - real OxyyPxzz = c1o1; - real OxyyMxzz = c1o1; - //real Oxyz = c1o1; - //////////////////////////////////////////////////////////// - //4. - ////////////////////////////// - real O4 = c1o1; - //////////////////////////////////////////////////////////// - //5. - ////////////////////////////// - real O5 = c1o1; - //////////////////////////////////////////////////////////// - //6. - ////////////////////////////// - real O6 = c1o1; - //////////////////////////////////////////////////////////// - - - //central moments to cumulants - //4. - real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) * OOrho; - real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) * OOrho; - real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) * OOrho; - - real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) * OOrho - c1o9*(drho * OOrho)); - real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) * OOrho - c1o9*(drho * OOrho)); - real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) * OOrho - c1o9*(drho * OOrho)); - - //5. - real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) * OOrho; - real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) * OOrho; - real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) * OOrho; - - //6. - real CUMccc = mfccc + ((-c4o1 * mfbbb * mfbbb - - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho - + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) - + c2o1 * (mfcaa * mfaca * mfaac) - + c16o1 * mfbba * mfbab * mfabb) * OOrho * OOrho - - c1o3 * (mfacc + mfcac + mfcca) * OOrho - - c1o9 * (mfcaa + mfaca + mfaac) * OOrho - + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) - + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 - + c1o27*((drho * drho - drho) * OOrho * OOrho )); - - - //2. - // linear combinations - real mxxPyyPzz = mfcaa + mfaca + mfaac; - real mxxMyy = mfcaa - mfaca; - real mxxMzz = mfcaa - mfaac; - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - //incl. correction (hat noch nicht so gut funktioniert...Optimierungsbedarf??) - { - real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); - real dyuy = dxux + omega * c3o2 * mxxMyy; - real dzuz = dxux + omega * c3o2 * mxxMzz; - - //relax - mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz)- c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz; - mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); - mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); - - } - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ////no correction - //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz; - //mxxMyy += -(-omega) * (-mxxMyy); - //mxxMzz += -(-omega) * (-mxxMzz); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - mfabb += omega * (-mfabb); - mfbab += omega * (-mfbab); - mfbba += omega * (-mfbba); - - ////////////////////////////////////////////////////////////////////////// - - // linear combinations back - mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); - mfaca = c1o3 * (-c2o1* mxxMyy + mxxMzz + mxxPyyPzz); - mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz); - - //3. - // linear combinations - - real mxxyPyzz = mfcba + mfabc; - real mxxyMyzz = mfcba - mfabc; - - real mxxzPyyz = mfcab + mfacb; - real mxxzMyyz = mfcab - mfacb; - - real mxyyPxzz = mfbca + mfbac; - real mxyyMxzz = mfbca - mfbac; - - //relax - ////////////////////////////////////////////////////////////////////////// - mfbbb += OxyyMxzz * (-mfbbb); - mxxyPyzz += OxyyPxzz * (-mxxyPyzz); - mxxyMyzz += OxyyMxzz * (-mxxyMyzz); - mxxzPyyz += OxyyPxzz * (-mxxzPyyz); - mxxzMyyz += OxyyMxzz * (-mxxzMyyz); - mxyyPxzz += OxyyPxzz * (-mxyyPxzz); - mxyyMxzz += OxyyMxzz * (-mxyyMxzz); - ////////////////////////////////////////////////////////////////////////// - - mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; - mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; - mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; - mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; - mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; - mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; - - //4. - ////////////////////////////////////////////////////////////////////////// - CUMacc += O4 * (-CUMacc); - CUMcac += O4 * (-CUMcac); - CUMcca += O4 * (-CUMcca); - - CUMbbc += O4 * (-CUMbbc); - CUMbcb += O4 * (-CUMbcb); - CUMcbb += O4 * (-CUMcbb); - ////////////////////////////////////////////////////////////////////////// - - - //5. - CUMbcc += O5 * (-CUMbcc); - CUMcbc += O5 * (-CUMcbc); - CUMccb += O5 * (-CUMccb); - - //6. - CUMccc += O6 * (-CUMccc); - - - - //back cumulants to central moments - //4. - mfcbb = CUMcbb + c1o3*((c3o1*mfcaa + c1o1) * mfabb + c6o1 * mfbba * mfbab) * OOrho; - mfbcb = CUMbcb + c1o3*((c3o1*mfaca + c1o1) * mfbab + c6o1 * mfbba * mfabb) * OOrho; - mfbbc = CUMbbc + c1o3*((c3o1*mfaac + c1o1) * mfbba + c6o1 * mfbab * mfabb) * OOrho; - - mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba)*c9o1 + c3o1 * (mfcaa + mfaca)) * OOrho - (drho * OOrho))*c1o9; - mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab)*c9o1 + c3o1 * (mfcaa + mfaac)) * OOrho - (drho * OOrho))*c1o9; - mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb)*c9o1 + c3o1 * (mfaac + mfaca)) * OOrho - (drho * OOrho))*c1o9; - - //5. - mfbcc = CUMbcc + c1o3 *(c3o1*(mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + (mfbca + mfbac)) * OOrho; - mfcbc = CUMcbc + c1o3 *(c3o1*(mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + (mfcba + mfabc)) * OOrho; - mfccb = CUMccb + c1o3 *(c3o1*(mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + (mfacb + mfcab)) * OOrho; - - //6. - mfccc = - CUMccc - ((-c4o1 * mfbbb * mfbbb - - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho - + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) - + c2o1 * (mfcaa * mfaca * mfaac) - + c16o1 * mfbba * mfbab * mfabb) * OOrho * OOrho - - c1o3 * (mfacc + mfcac + mfcca) * OOrho - - c1o9 * (mfcaa + mfaca + mfaac) * OOrho - + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) - + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 - + c1o27*((drho * drho - drho) * OOrho * OOrho )); - - //////////////////////////////////////////////////////////////////////////////////// - //the force be with you - mfbaa = -mfbaa; - mfaba = -mfaba; - mfaab = -mfaab; - //////////////////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////////////////// - //back - //////////////////////////////////////////////////////////////////////////////////// - //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren - //////////////////////////////////////////////////////////////////////////////////// - // X - Dir - VF::LBM::backwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1); - VF::LBM::backwardChimera( mfaba, mfbba, mfcba, vvx, vx2); - VF::LBM::backwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, 3.0f, c1o3); - VF::LBM::backwardChimera( mfaab, mfbab, mfcab, vvx, vx2); - VF::LBM::backwardChimera( mfabb, mfbbb, mfcbb, vvx, vx2); - VF::LBM::backwardChimera( mfacb, mfbcb, mfccb, vvx, vx2); - VF::LBM::backwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, 3.0f, c1o3); - VF::LBM::backwardChimera( mfabc, mfbbc, mfcbc, vvx, vx2); - VF::LBM::backwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, 9.0f, c1o9); - - //////////////////////////////////////////////////////////////////////////////////// - //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren - //////////////////////////////////////////////////////////////////////////////////// - // Y - Dir - VF::LBM::backwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, 6.0f , c1o6 ); - VF::LBM::backwardChimera( mfaab, mfabb, mfacb, vvy, vy2); - VF::LBM::backwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, 18.0f, c1o18); - VF::LBM::backwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, 1.5f , c2o3 ); - VF::LBM::backwardChimera( mfbab, mfbbb, mfbcb, vvy, vy2); - VF::LBM::backwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, 4.5f , c2o9 ); - VF::LBM::backwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, 6.0f , c1o6 ); - VF::LBM::backwardChimera( mfcab, mfcbb, mfccb, vvy, vy2); - VF::LBM::backwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, 18.0f, c1o18); - - //////////////////////////////////////////////////////////////////////////////////// - //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren - //////////////////////////////////////////////////////////////////////////////////// - // Z - Dir - VF::LBM::backwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, 36.0f, c1o36); - VF::LBM::backwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, 9.0f , c1o9 ); - VF::LBM::backwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, 36.0f, c1o36); - VF::LBM::backwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, 9.0f , c1o9 ); - VF::LBM::backwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, 2.25f, c4o9 ); - VF::LBM::backwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, 9.0f , c1o9 ); - VF::LBM::backwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, 36.0f, c1o36); - VF::LBM::backwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, 9.0f , c1o9 ); - VF::LBM::backwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, 36.0f, c1o36); - - ////////////////////////////////////////////////////////////////////////////////////// - real drhoPost = - ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + - (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + - ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; - mfbbb += drho - drhoPost; - //////////////////////////////////////////////////////////////////////////////////// - (D.f[dirE ])[k ] = mfabb; - (D.f[dirW ])[kw ] = mfcbb; - (D.f[dirN ])[k ] = mfbab; - (D.f[dirS ])[ks ] = mfbcb; - (D.f[dirT ])[k ] = mfbba; - (D.f[dirB ])[kb ] = mfbbc; - (D.f[dirNE ])[k ] = mfaab; - (D.f[dirSW ])[ksw ] = mfccb; - (D.f[dirSE ])[ks ] = mfacb; - (D.f[dirNW ])[kw ] = mfcab; - (D.f[dirTE ])[k ] = mfaba; - (D.f[dirBW ])[kbw ] = mfcbc; - (D.f[dirBE ])[kb ] = mfabc; - (D.f[dirTW ])[kw ] = mfcba; - (D.f[dirTN ])[k ] = mfbaa; - (D.f[dirBS ])[kbs ] = mfbcc; - (D.f[dirBN ])[kb ] = mfbac; - (D.f[dirTS ])[ks ] = mfbca; - (D.f[dirZERO])[k ] = mfbbb; - (D.f[dirTNE ])[k ] = mfaaa; - (D.f[dirTSE ])[ks ] = mfaca; - (D.f[dirBNE ])[kb ] = mfaac; - (D.f[dirBSE ])[kbs ] = mfacc; - (D.f[dirTNW ])[kw ] = mfcaa; - (D.f[dirTSW ])[ksw ] = mfcca; - (D.f[dirBNW ])[kbw ] = mfcac; - (D.f[dirBSW ])[kbsw] = mfccc; - } - } + //////////////////////////////////////////////////////////////////////////////// + const unsigned x = threadIdx.x; // Globaler x-Index + const unsigned y = blockIdx.x; // Globaler y-Index + const unsigned z = blockIdx.y; // Globaler z-Index + + const unsigned nx = blockDim.x; + const unsigned ny = gridDim.x; + + const unsigned k = nx*(ny*z + y) + x; + ////////////////////////////////////////////////////////////////////////// + + if (k<size_Mat) + { + //////////////////////////////////////////////////////////////////////////////// + unsigned int BC; + BC = bcMatD[k]; + + if (BC >= GEO_FLUID/*(BC != GEO_SOLID) && (BC != GEO_VOID)*/) + { + Distributions27 D; + if (EvenOrOdd == true) + { + D.f[dirE ] = &DDStart[dirE *size_Mat]; + D.f[dirW ] = &DDStart[dirW *size_Mat]; + D.f[dirN ] = &DDStart[dirN *size_Mat]; + D.f[dirS ] = &DDStart[dirS *size_Mat]; + D.f[dirT ] = &DDStart[dirT *size_Mat]; + D.f[dirB ] = &DDStart[dirB *size_Mat]; + D.f[dirNE ] = &DDStart[dirNE *size_Mat]; + D.f[dirSW ] = &DDStart[dirSW *size_Mat]; + D.f[dirSE ] = &DDStart[dirSE *size_Mat]; + D.f[dirNW ] = &DDStart[dirNW *size_Mat]; + D.f[dirTE ] = &DDStart[dirTE *size_Mat]; + D.f[dirBW ] = &DDStart[dirBW *size_Mat]; + D.f[dirBE ] = &DDStart[dirBE *size_Mat]; + D.f[dirTW ] = &DDStart[dirTW *size_Mat]; + D.f[dirTN ] = &DDStart[dirTN *size_Mat]; + D.f[dirBS ] = &DDStart[dirBS *size_Mat]; + D.f[dirBN ] = &DDStart[dirBN *size_Mat]; + D.f[dirTS ] = &DDStart[dirTS *size_Mat]; + D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; + D.f[dirTNE ] = &DDStart[dirTNE *size_Mat]; + D.f[dirTSW ] = &DDStart[dirTSW *size_Mat]; + D.f[dirTSE ] = &DDStart[dirTSE *size_Mat]; + D.f[dirTNW ] = &DDStart[dirTNW *size_Mat]; + D.f[dirBNE ] = &DDStart[dirBNE *size_Mat]; + D.f[dirBSW ] = &DDStart[dirBSW *size_Mat]; + D.f[dirBSE ] = &DDStart[dirBSE *size_Mat]; + D.f[dirBNW ] = &DDStart[dirBNW *size_Mat]; + } + else + { + D.f[dirW ] = &DDStart[dirE *size_Mat]; + D.f[dirE ] = &DDStart[dirW *size_Mat]; + D.f[dirS ] = &DDStart[dirN *size_Mat]; + D.f[dirN ] = &DDStart[dirS *size_Mat]; + D.f[dirB ] = &DDStart[dirT *size_Mat]; + D.f[dirT ] = &DDStart[dirB *size_Mat]; + D.f[dirSW ] = &DDStart[dirNE *size_Mat]; + D.f[dirNE ] = &DDStart[dirSW *size_Mat]; + D.f[dirNW ] = &DDStart[dirSE *size_Mat]; + D.f[dirSE ] = &DDStart[dirNW *size_Mat]; + D.f[dirBW ] = &DDStart[dirTE *size_Mat]; + D.f[dirTE ] = &DDStart[dirBW *size_Mat]; + D.f[dirTW ] = &DDStart[dirBE *size_Mat]; + D.f[dirBE ] = &DDStart[dirTW *size_Mat]; + D.f[dirBS ] = &DDStart[dirTN *size_Mat]; + D.f[dirTN ] = &DDStart[dirBS *size_Mat]; + D.f[dirTS ] = &DDStart[dirBN *size_Mat]; + D.f[dirBN ] = &DDStart[dirTS *size_Mat]; + D.f[dirZERO] = &DDStart[dirZERO*size_Mat]; + D.f[dirBSW ] = &DDStart[dirTNE *size_Mat]; + D.f[dirBNE ] = &DDStart[dirTSW *size_Mat]; + D.f[dirBNW ] = &DDStart[dirTSE *size_Mat]; + D.f[dirBSE ] = &DDStart[dirTNW *size_Mat]; + D.f[dirTSW ] = &DDStart[dirBNE *size_Mat]; + D.f[dirTNE ] = &DDStart[dirBSW *size_Mat]; + D.f[dirTNW ] = &DDStart[dirBSE *size_Mat]; + D.f[dirTSE ] = &DDStart[dirBNW *size_Mat]; + } + //////////////////////////////////////////////////////////////////////////////// + //index + unsigned int kw = neighborX[k]; + unsigned int ks = neighborY[k]; + unsigned int kb = neighborZ[k]; + unsigned int ksw = neighborY[kw]; + unsigned int kbw = neighborZ[kw]; + unsigned int kbs = neighborZ[ks]; + unsigned int kbsw = neighborZ[ksw]; + //////////////////////////////////////////////////////////////////////////////////// + real mfcbb = (D.f[dirE ])[k ]; + real mfabb = (D.f[dirW ])[kw ]; + real mfbcb = (D.f[dirN ])[k ]; + real mfbab = (D.f[dirS ])[ks ]; + real mfbbc = (D.f[dirT ])[k ]; + real mfbba = (D.f[dirB ])[kb ]; + real mfccb = (D.f[dirNE ])[k ]; + real mfaab = (D.f[dirSW ])[ksw ]; + real mfcab = (D.f[dirSE ])[ks ]; + real mfacb = (D.f[dirNW ])[kw ]; + real mfcbc = (D.f[dirTE ])[k ]; + real mfaba = (D.f[dirBW ])[kbw ]; + real mfcba = (D.f[dirBE ])[kb ]; + real mfabc = (D.f[dirTW ])[kw ]; + real mfbcc = (D.f[dirTN ])[k ]; + real mfbaa = (D.f[dirBS ])[kbs ]; + real mfbca = (D.f[dirBN ])[kb ]; + real mfbac = (D.f[dirTS ])[ks ]; + real mfbbb = (D.f[dirZERO])[k ]; + real mfccc = (D.f[dirTNE ])[k ]; + real mfaac = (D.f[dirTSW ])[ksw ]; + real mfcac = (D.f[dirTSE ])[ks ]; + real mfacc = (D.f[dirTNW ])[kw ]; + real mfcca = (D.f[dirBNE ])[kb ]; + real mfaaa = (D.f[dirBSW ])[kbsw]; + real mfcaa = (D.f[dirBSE ])[kbs ]; + real mfaca = (D.f[dirBNW ])[kbw ]; + //////////////////////////////////////////////////////////////////////////////////// + real drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + + real rho = c1o1 + drho; + real OOrho = c1o1 / rho; + //////////////////////////////////////////////////////////////////////////////////// + real vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)) * OOrho; + real vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)) * OOrho; + real vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)) * OOrho; + //////////////////////////////////////////////////////////////////////////////////// + //the force be with you + real fx = forces[0] / (pow((double)c2o1, (double)level)); //zero;//0.0032653/(pow(two,level)); //0.000000005;//(two/1600000.0) / 120.0; // + real fy = forces[1] / (pow((double)c2o1, (double)level)); //zero; + real fz = forces[2] / (pow((double)c2o1, (double)level)); //zero; + vvx += fx*c1o2; + vvy += fy*c1o2; + vvz += fz*c1o2; + //////////////////////////////////////////////////////////////////////////////////// + //real omega = omega_in; + //////////////////////////////////////////////////////////////////////////////////// + //fast + //real oMdrho = c1o1; // comp special + //real m0, m1, m2; + real vx2; + real vy2; + real vz2; + vx2 = vvx*vvx; + vy2 = vvy*vvy; + vz2 = vvz*vvz; + //////////////////////////////////////////////////////////////////////////////////// + //real wadjust; + //real qudricLimitP = c1o100;// * 0.0001f; + //real qudricLimitM = c1o100;// * 0.0001f; + //real qudricLimitD = c1o100;// * 0.001f; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + VF::LBM::forwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, 36.0f, c1o36); + VF::LBM::forwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, 9.0f , c1o9 ); + VF::LBM::forwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, 36.0f, c1o36); + VF::LBM::forwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, 9.0f , c1o9 ); + VF::LBM::forwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, 2.25f, c4o9 ); + VF::LBM::forwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, 9.0f , c1o9 ); + VF::LBM::forwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, 36.0f, c1o36); + VF::LBM::forwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, 9.0f , c1o9 ); + VF::LBM::forwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, 36.0f, c1o36); + + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + VF::LBM::forwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, 6.0f , c1o6 ); + VF::LBM::forwardChimera( mfaab, mfabb, mfacb, vvy, vy2); + VF::LBM::forwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, 18.0f, c1o18); + VF::LBM::forwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, 1.5f , c2o3 ); + VF::LBM::forwardChimera( mfbab, mfbbb, mfbcb, vvy, vy2); + VF::LBM::forwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, 4.5f , c2o9 ); + VF::LBM::forwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, 6.0f , c1o6 ); + VF::LBM::forwardChimera( mfcab, mfcbb, mfccb, vvy, vy2); + VF::LBM::forwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, 18.0f, c1o18); + + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + VF::LBM::forwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1); + VF::LBM::forwardChimera( mfaba, mfbba, mfcba, vvx, vx2); + VF::LBM::forwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, 3.0f, c1o3); + VF::LBM::forwardChimera( mfaab, mfbab, mfcab, vvx, vx2); + VF::LBM::forwardChimera( mfabb, mfbbb, mfcbb, vvx, vx2); + VF::LBM::forwardChimera( mfacb, mfbcb, mfccb, vvx, vx2); + VF::LBM::forwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, 3.0f, c1o3); + VF::LBM::forwardChimera( mfabc, mfbbc, mfcbc, vvx, vx2); + VF::LBM::forwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, 9.0f, c1o9); + + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + real OxxPyyPzz = c1o1; + //////////////////////////////////////////////////////////// + //3. + ////////////////////////////// + real OxyyPxzz = c1o1; + real OxyyMxzz = c1o1; + //real Oxyz = c1o1; + //////////////////////////////////////////////////////////// + //4. + ////////////////////////////// + real O4 = c1o1; + //////////////////////////////////////////////////////////// + //5. + ////////////////////////////// + real O5 = c1o1; + //////////////////////////////////////////////////////////// + //6. + ////////////////////////////// + real O6 = c1o1; + //////////////////////////////////////////////////////////// + + + //central moments to cumulants + //4. + real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) * OOrho; + real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) * OOrho; + real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) * OOrho; + + real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) * OOrho - c1o9*(drho * OOrho)); + real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) * OOrho - c1o9*(drho * OOrho)); + real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) * OOrho - c1o9*(drho * OOrho)); + + //5. + real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) * OOrho; + real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) * OOrho; + real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) * OOrho; + + //6. + real CUMccc = mfccc + ((-c4o1 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho + + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2o1 * (mfcaa * mfaca * mfaac) + + c16o1 * mfbba * mfbab * mfabb) * OOrho * OOrho + - c1o3 * (mfacc + mfcac + mfcca) * OOrho + - c1o9 * (mfcaa + mfaca + mfaac) * OOrho + + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 + + c1o27*((drho * drho - drho) * OOrho * OOrho )); + + + //2. + // linear combinations + real mxxPyyPzz = mfcaa + mfaca + mfaac; + real mxxMyy = mfcaa - mfaca; + real mxxMzz = mfcaa - mfaac; + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //incl. correction (hat noch nicht so gut funktioniert...Optimierungsbedarf??) + { + real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + real dyuy = dxux + omega * c3o2 * mxxMyy; + real dzuz = dxux + omega * c3o2 * mxxMzz; + + //relax + mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz)- c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz; + mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); + + } + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////no correction + //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz);//-magicBulk*OxxPyyPzz; + //mxxMyy += -(-omega) * (-mxxMyy); + //mxxMzz += -(-omega) * (-mxxMzz); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + mfabb += omega * (-mfabb); + mfbab += omega * (-mfbab); + mfbba += omega * (-mfbba); + + ////////////////////////////////////////////////////////////////////////// + + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-c2o1* mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + + real mxxyPyzz = mfcba + mfabc; + real mxxyMyzz = mfcba - mfabc; + + real mxxzPyyz = mfcab + mfacb; + real mxxzMyyz = mfcab - mfacb; + + real mxyyPxzz = mfbca + mfbac; + real mxyyMxzz = mfbca - mfbac; + + //relax + ////////////////////////////////////////////////////////////////////////// + mfbbb += OxyyMxzz * (-mfbbb); + mxxyPyzz += OxyyPxzz * (-mxxyPyzz); + mxxyMyzz += OxyyMxzz * (-mxxyMyzz); + mxxzPyyz += OxyyPxzz * (-mxxzPyyz); + mxxzMyyz += OxyyMxzz * (-mxxzMyyz); + mxyyPxzz += OxyyPxzz * (-mxyyPxzz); + mxyyMxzz += OxyyMxzz * (-mxyyMxzz); + ////////////////////////////////////////////////////////////////////////// + + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + ////////////////////////////////////////////////////////////////////////// + CUMacc += O4 * (-CUMacc); + CUMcac += O4 * (-CUMcac); + CUMcca += O4 * (-CUMcca); + + CUMbbc += O4 * (-CUMbbc); + CUMbcb += O4 * (-CUMbcb); + CUMcbb += O4 * (-CUMcbb); + ////////////////////////////////////////////////////////////////////////// + + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + + + //back cumulants to central moments + //4. + mfcbb = CUMcbb + c1o3*((c3o1*mfcaa + c1o1) * mfabb + c6o1 * mfbba * mfbab) * OOrho; + mfbcb = CUMbcb + c1o3*((c3o1*mfaca + c1o1) * mfbab + c6o1 * mfbba * mfabb) * OOrho; + mfbbc = CUMbbc + c1o3*((c3o1*mfaac + c1o1) * mfbba + c6o1 * mfbab * mfabb) * OOrho; + + mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba)*c9o1 + c3o1 * (mfcaa + mfaca)) * OOrho - (drho * OOrho))*c1o9; + mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab)*c9o1 + c3o1 * (mfcaa + mfaac)) * OOrho - (drho * OOrho))*c1o9; + mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb)*c9o1 + c3o1 * (mfaac + mfaca)) * OOrho - (drho * OOrho))*c1o9; + + //5. + mfbcc = CUMbcc + c1o3 *(c3o1*(mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + (mfbca + mfbac)) * OOrho; + mfcbc = CUMcbc + c1o3 *(c3o1*(mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + (mfcba + mfabc)) * OOrho; + mfccb = CUMccb + c1o3 *(c3o1*(mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + (mfacb + mfcab)) * OOrho; + + //6. + mfccc = + CUMccc - ((-c4o1 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho + + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2o1 * (mfcaa * mfaca * mfaac) + + c16o1 * mfbba * mfbab * mfabb) * OOrho * OOrho + - c1o3 * (mfacc + mfcac + mfcca) * OOrho + - c1o9 * (mfcaa + mfaca + mfaac) * OOrho + + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 + + c1o27*((drho * drho - drho) * OOrho * OOrho )); + + //////////////////////////////////////////////////////////////////////////////////// + //the force be with you + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + //////////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + VF::LBM::backwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1); + VF::LBM::backwardChimera( mfaba, mfbba, mfcba, vvx, vx2); + VF::LBM::backwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, 3.0f, c1o3); + VF::LBM::backwardChimera( mfaab, mfbab, mfcab, vvx, vx2); + VF::LBM::backwardChimera( mfabb, mfbbb, mfcbb, vvx, vx2); + VF::LBM::backwardChimera( mfacb, mfbcb, mfccb, vvx, vx2); + VF::LBM::backwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, 3.0f, c1o3); + VF::LBM::backwardChimera( mfabc, mfbbc, mfcbc, vvx, vx2); + VF::LBM::backwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, 9.0f, c1o9); + + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + VF::LBM::backwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, 6.0f , c1o6 ); + VF::LBM::backwardChimera( mfaab, mfabb, mfacb, vvy, vy2); + VF::LBM::backwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, 18.0f, c1o18); + VF::LBM::backwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, 1.5f , c2o3 ); + VF::LBM::backwardChimera( mfbab, mfbbb, mfbcb, vvy, vy2); + VF::LBM::backwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, 4.5f , c2o9 ); + VF::LBM::backwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, 6.0f , c1o6 ); + VF::LBM::backwardChimera( mfcab, mfcbb, mfccb, vvy, vy2); + VF::LBM::backwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, 18.0f, c1o18); + + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + VF::LBM::backwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, 36.0f, c1o36); + VF::LBM::backwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, 9.0f , c1o9 ); + VF::LBM::backwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, 36.0f, c1o36); + VF::LBM::backwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, 9.0f , c1o9 ); + VF::LBM::backwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, 2.25f, c4o9 ); + VF::LBM::backwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, 9.0f , c1o9 ); + VF::LBM::backwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, 36.0f, c1o36); + VF::LBM::backwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, 9.0f , c1o9 ); + VF::LBM::backwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, 36.0f, c1o36); + + ////////////////////////////////////////////////////////////////////////////////////// + real drhoPost = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + mfbbb += drho - drhoPost; + //////////////////////////////////////////////////////////////////////////////////// + (D.f[dirE ])[k ] = mfabb; + (D.f[dirW ])[kw ] = mfcbb; + (D.f[dirN ])[k ] = mfbab; + (D.f[dirS ])[ks ] = mfbcb; + (D.f[dirT ])[k ] = mfbba; + (D.f[dirB ])[kb ] = mfbbc; + (D.f[dirNE ])[k ] = mfaab; + (D.f[dirSW ])[ksw ] = mfccb; + (D.f[dirSE ])[ks ] = mfacb; + (D.f[dirNW ])[kw ] = mfcab; + (D.f[dirTE ])[k ] = mfaba; + (D.f[dirBW ])[kbw ] = mfcbc; + (D.f[dirBE ])[kb ] = mfabc; + (D.f[dirTW ])[kw ] = mfcba; + (D.f[dirTN ])[k ] = mfbaa; + (D.f[dirBS ])[kbs ] = mfbcc; + (D.f[dirBN ])[kb ] = mfbac; + (D.f[dirTS ])[ks ] = mfbca; + (D.f[dirZERO])[k ] = mfbbb; + (D.f[dirTNE ])[k ] = mfaaa; + (D.f[dirTSE ])[ks ] = mfaca; + (D.f[dirBNE ])[kb ] = mfaac; + (D.f[dirBSE ])[kbs ] = mfacc; + (D.f[dirTNW ])[kw ] = mfcaa; + (D.f[dirTSW ])[ksw ] = mfcca; + (D.f[dirBNW ])[kbw ] = mfcac; + (D.f[dirBSW ])[kbsw] = mfccc; + } + } } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h index 3589bcea1..fb4a0a556 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h +++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Interface.h @@ -131,6 +131,36 @@ extern "C" void KernelKumNewSP27( unsigned int numberOfThreads, int size_Mat, bool EvenOrOdd); +////////////////////////////////////////////////////////////////////////// +//! \brief Cumulant LBM kernel +extern "C" void CumulantK17LBMDeviceKernel( + uint numberOfThreads, + real omega, + uint* typeOfGridNode, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + real* distributions, + int size_Mat, + int level, + real* forces, + bool isEvenTimestep); + + ////////////////////////////////////////////////////////////////////////// +//! \brief Cumulant LBM kernel +extern "C" void CumulantK17LBMDeviceKernel_old( + uint numberOfThreads, + real omega, + uint* typeOfGridNode, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + real* distributions, + int size_Mat, + int level, + real* forces, + bool isEvenTimestep); + extern "C" void CumulantOnePreconditionedErrorDiffusionChimCompSP27( unsigned int numberOfThreads, real s9, diff --git a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh index b41724df4..069682862 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh +++ b/src/gpu/VirtualFluids_GPU/GPU/GPU_Kernels.cuh @@ -141,6 +141,35 @@ extern "C" __global__ void LB_Kernel_Kum_Comp_SP_27(real s9, bool EvenOrOdd); +///////////////////////////////////////////////////////////////////////// +//! \brief \ref Cumulant_K17_LBM_Device_Kernel : Cumulant K17 lattice Boltzmann device kernel function +extern "C" __global__ void Cumulant_K17_LBM_Device_Kernel( + real omega, + uint* typeOfGridNode, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + real* distributions, + int size_Mat, + int level, + real* forces, + bool isEvenTimestep); + + ///////////////////////////////////////////////////////////////////////// +//! \brief \ref Cumulant_K17_LBM_Device_Kernel : Cumulant K17 lattice Boltzmann device kernel function +extern "C" __global__ void Cumulant_K17_LBM_Device_Kernel_old( + real omega, + uint* typeOfGridNode, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + real* distributions, + int size_Mat, + int level, + real* forces, + bool isEvenTimestep); + + extern "C" __global__ void Cumulant_One_preconditioned_errorDiffusion_chim_Comp_SP_27( real omega, unsigned int* bcMatD, diff --git a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu index 41bde987c..0442a5117 100644 --- a/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu +++ b/src/gpu/VirtualFluids_GPU/GPU/LBMKernel.cu @@ -353,6 +353,72 @@ extern "C" void KernelKumNewCompSP27(unsigned int numberOfThreads, // EvenOrOdd); //getLastCudaError("LB_Kernel_Kum_New_Comp_SP_27 execution failed"); } + +////////////////////////////////////////////////////////////////////////// +extern "C" void CumulantK17LBMDeviceKernel( + uint numberOfThreads, + real omega, + uint* typeOfGridNode, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + real* distributions, + int size_Mat, + int level, + real* forces, + bool isEvenTimestep) +{ + int Grid = (size_Mat / numberOfThreads) + 1; + dim3 grid(Grid, 1, 1); + dim3 threads(numberOfThreads, 1, 1); + + Cumulant_K17_LBM_Device_Kernel <<< grid, threads >>> ( + omega, + typeOfGridNode, + neighborX, + neighborY, + neighborZ, + distributions, + size_Mat, + level, + forces, + isEvenTimestep); + getLastCudaError("Cumulant_K17_AA2016_chim_Comp_SP_27 execution failed"); +} + + +////////////////////////////////////////////////////////////////////////// +extern "C" void CumulantK17LBMDeviceKernel_old( + uint numberOfThreads, + real omega, + uint* typeOfGridNode, + uint* neighborX, + uint* neighborY, + uint* neighborZ, + real* distributions, + int size_Mat, + int level, + real* forces, + bool isEvenTimestep) +{ + int Grid = (size_Mat / numberOfThreads) + 1; + dim3 grid(Grid, 1, 1); + dim3 threads(numberOfThreads, 1, 1); + + Cumulant_K17_LBM_Device_Kernel_old <<< grid, threads >>> ( + omega, + typeOfGridNode, + neighborX, + neighborY, + neighborZ, + distributions, + size_Mat, + level, + forces, + isEvenTimestep); + getLastCudaError("Cumulant_K17_AA2016_chim_Comp_SP_27 execution failed"); +} + ////////////////////////////////////////////////////////////////////////// extern "C" void CumulantOnePreconditionedErrorDiffusionChimCompSP27(unsigned int numberOfThreads, real s9, diff --git a/src/gpu/VirtualFluids_GPU/LBM/D3Q27.h b/src/gpu/VirtualFluids_GPU/LBM/D3Q27.h index 546dccd46..5e769b603 100644 --- a/src/gpu/VirtualFluids_GPU/LBM/D3Q27.h +++ b/src/gpu/VirtualFluids_GPU/LBM/D3Q27.h @@ -21,6 +21,7 @@ #define dirBN /*f17*/ 16 #define dirTS /*f18*/ 17 #define dirZERO /*f0 */ 18 +#define dirREST /*f0 */ 18 #define dirTNE /*f */ 19 #define dirBNE /*f */ 20 diff --git a/src/lbm/ChimeraTests.cpp b/src/lbm/ChimeraTests.cpp index 2b9e13ad7..9395cb587 100644 --- a/src/lbm/ChimeraTests.cpp +++ b/src/lbm/ChimeraTests.cpp @@ -2,6 +2,12 @@ #include "Chimera.h" +#ifdef VF_DOUBLE_ACCURACY +#define REAL_EQ(a) testing::DoubleEq(a) +#else +#define REAL_EQ(a) testing::FloatEq(a) +#endif + /* * InverseChimeraWithK */ @@ -19,9 +25,9 @@ TEST(ChimeraTest, forwardInverseChimeraWithK) VF::LBM::forwardInverseChimeraWithK(mfa, mfb, mfc, vv, v2, K, Kinverse); - EXPECT_THAT(mfa, testing::DoubleEq(3.)); // mfa + mfb + mfc - EXPECT_THAT(mfb, testing::DoubleEq(-4.)); // -(mfa + mfb + mfc + 1) - EXPECT_THAT(mfc, testing::DoubleEq(6.)); // (mfa + mfc) + (mfa + mfb + mfc + 1) + EXPECT_THAT(mfa, REAL_EQ(3.)); // mfa + mfb + mfc + EXPECT_THAT(mfb, REAL_EQ(-4.)); // -(mfa + mfb + mfc + 1) + EXPECT_THAT(mfc, REAL_EQ(6.)); // (mfa + mfc) + (mfa + mfb + mfc + 1) } @@ -41,9 +47,9 @@ TEST(ChimeraTest, backwardInverseChimeraWithK) VF::LBM::backwardInverseChimeraWithK(mfa, mfb, mfc, vv, v2, K, Kinverse); // resulting in the start values from the test above. - EXPECT_THAT(mfa, testing::DoubleEq(1.)); - EXPECT_THAT(mfb, testing::DoubleEq(1.)); - EXPECT_THAT(mfc, testing::DoubleEq(1.)); + EXPECT_THAT(mfa, REAL_EQ(1.)); + EXPECT_THAT(mfb, REAL_EQ(1.)); + EXPECT_THAT(mfc, REAL_EQ(1.)); } /* @@ -60,9 +66,9 @@ TEST(ChimeraTest, forwardChimera) VF::LBM::forwardChimera(mfa, mfb, mfc, vv, v2); - EXPECT_THAT(mfa, testing::DoubleEq(3.)); // mfa + mfb + mfc - EXPECT_THAT(mfb, testing::DoubleEq(-3.)); // -(mfa + mfb + mfc) - EXPECT_THAT(mfc, testing::DoubleEq(5.)); // (mfa + mfc) + (mfa + mfb + mfc) + EXPECT_THAT(mfa, REAL_EQ(3.)); // mfa + mfb + mfc + EXPECT_THAT(mfb, REAL_EQ(-3.)); // -(mfa + mfb + mfc) + EXPECT_THAT(mfc, REAL_EQ(5.)); // (mfa + mfc) + (mfa + mfb + mfc) } @@ -79,9 +85,9 @@ TEST(ChimeraTest, backwardChimera) VF::LBM::backwardChimera(mfa, mfb, mfc, vv, v2); // resulting in the start values from the test above. - EXPECT_THAT(mfa, testing::DoubleEq(1.)); - EXPECT_THAT(mfb, testing::DoubleEq(1.)); - EXPECT_THAT(mfc, testing::DoubleEq(1.)); + EXPECT_THAT(mfa, REAL_EQ(1.)); + EXPECT_THAT(mfb, REAL_EQ(1.)); + EXPECT_THAT(mfc, REAL_EQ(1.)); } /* @@ -100,9 +106,9 @@ TEST(ChimeraTest, forwardChimeraWithK) VF::LBM::forwardChimeraWithK(mfa, mfb, mfc, vv, v2, K); - EXPECT_THAT(mfa, testing::DoubleEq(3.)); // mfa + mfb + mfc - EXPECT_THAT(mfb, testing::DoubleEq(-4.)); // -(mfa + mfb + mfc) - EXPECT_THAT(mfc, testing::DoubleEq(6.)); // (mfa + mfc) + (mfa + mfb + mfc) + EXPECT_THAT(mfa, REAL_EQ(3.)); // mfa + mfb + mfc + EXPECT_THAT(mfb, REAL_EQ(-4.)); // -(mfa + mfb + mfc) + EXPECT_THAT(mfc, REAL_EQ(6.)); // (mfa + mfc) + (mfa + mfb + mfc) } @@ -121,7 +127,7 @@ TEST(ChimeraTest, backwardChimeraWithK) VF::LBM::backwardChimeraWithK(mfa, mfb, mfc, vv, v2, K); // resulting in the start values from the test above. - EXPECT_THAT(mfa, testing::DoubleEq(1.)); - EXPECT_THAT(mfb, testing::DoubleEq(1.)); - EXPECT_THAT(mfc, testing::DoubleEq(1.)); + EXPECT_THAT(mfa, REAL_EQ(1.)); + EXPECT_THAT(mfb, REAL_EQ(1.)); + EXPECT_THAT(mfc, REAL_EQ(1.)); } diff --git a/src/lbm/CumulantChimera.h b/src/lbm/CumulantChimera.h new file mode 100644 index 000000000..90c3d53cd --- /dev/null +++ b/src/lbm/CumulantChimera.h @@ -0,0 +1,435 @@ +#ifndef LBM_CUMULANT_CHIMERA_H +#define LBM_CUMULANT_CHIMERA_H + +#ifndef __host__ +#define __host__ +#endif +#ifndef __device__ +#define __device__ +#endif + + +#include <basics/Core/DataTypes.h> +#include <basics/Core/RealConstants.h> + +#include "D3Q27.h" +#include "Chimera.h" +#include "MacroscopicQuantities.h" + +namespace VF +{ +namespace LBM +{ + +struct Distribution27 +{ + real f[27]; + + inline __host__ __device__ real getDensity_() const + { + return getDensity(f); + } +}; + +inline __host__ __device__ Distribution27 cumulantChimera(const Distribution27& distribution, real omega, const real* forces) +{ + real mfcbb = distribution.f[DIR::PZZ]; + real mfabb = distribution.f[DIR::MZZ]; + real mfbcb = distribution.f[DIR::ZPZ]; + real mfbab = distribution.f[DIR::ZMZ]; + real mfbbc = distribution.f[DIR::ZZP]; + real mfbba = distribution.f[DIR::ZZM]; + real mfccb = distribution.f[DIR::PPZ]; + real mfaab = distribution.f[DIR::MMZ]; + real mfcab = distribution.f[DIR::PMZ]; + real mfacb = distribution.f[DIR::MPZ]; + real mfcbc = distribution.f[DIR::PZP]; + real mfaba = distribution.f[DIR::MZM]; + real mfcba = distribution.f[DIR::PZM]; + real mfabc = distribution.f[DIR::MZP]; + real mfbcc = distribution.f[DIR::ZPP]; + real mfbaa = distribution.f[DIR::ZMM]; + real mfbca = distribution.f[DIR::ZPM]; + real mfbac = distribution.f[DIR::ZMP]; + real mfccc = distribution.f[DIR::PPP]; + real mfacc = distribution.f[DIR::MPP]; + real mfcac = distribution.f[DIR::PMP]; + real mfaac = distribution.f[DIR::MMP]; + real mfcca = distribution.f[DIR::PPM]; + real mfaca = distribution.f[DIR::MPM]; + real mfcaa = distribution.f[DIR::PMM]; + real mfaaa = distribution.f[DIR::MMM]; + real mfbbb = distribution.f[DIR::ZZZ]; + + //////////////////////////////////////////////////////////////////////////////////// + //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! + real drho = + ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc))) + mfbbb; + real rho = c1o1 + drho; + real OOrho = c1o1 / rho; + real vvx = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)) * OOrho; + real vvy = + ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)) * OOrho; + real vvz = + ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)) * OOrho; + //////////////////////////////////////////////////////////////////////////////////// + //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! + vvx += forces[0] * c1o2; + vvy += forces[1] * c1o2; + vvz += forces[2] * c1o2; + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + real vx2 = vvx*vvx; + real vy2 = vvy*vvy; + real vz2 = vvz*vvz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Set relaxation limiters for third order cumulants to default value \f$ \lambda=0.001 \f$ according to section 6 in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + real wadjust; + real qudricLimitP = c1o100; + real qudricLimitM = c1o100; + real qudricLimitD = c1o100; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in \ref + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! see also Eq. (6)-(14) in \ref + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + VF::LBM::forwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36o1, c1o36); + VF::LBM::forwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9o1, c1o9); + VF::LBM::forwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36o1, c1o36); + VF::LBM::forwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9o1, c1o9); + VF::LBM::forwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9); + VF::LBM::forwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9o1, c1o9); + VF::LBM::forwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36o1, c1o36); + VF::LBM::forwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9o1, c1o9); + VF::LBM::forwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36o1, c1o36); + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + VF::LBM::forwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6o1, c1o6); + VF::LBM::forwardChimera( mfaab, mfabb, mfacb, vvy, vy2); + VF::LBM::forwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18o1, c1o18); + VF::LBM::forwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3); + VF::LBM::forwardChimera( mfbab, mfbbb, mfbcb, vvy, vy2); + VF::LBM::forwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9); + VF::LBM::forwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6o1, c1o6); + VF::LBM::forwardChimera( mfcab, mfcbb, mfccb, vvy, vy2); + VF::LBM::forwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18o1, c1o18); + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + VF::LBM::forwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1); + VF::LBM::forwardChimera( mfaba, mfbba, mfcba, vvx, vx2); + VF::LBM::forwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3o1, c1o3); + VF::LBM::forwardChimera( mfaab, mfbab, mfcab, vvx, vx2); + VF::LBM::forwardChimera( mfabb, mfbbb, mfcbb, vvx, vx2); + VF::LBM::forwardChimera( mfacb, mfbcb, mfccb, vvx, vx2); + VF::LBM::forwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3o1, c1o3); + VF::LBM::forwardChimera( mfabc, mfbbc, mfcbc, vvx, vx2); + VF::LBM::forwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c3o1, c1o9); + //////////////////////////////////////////////////////////////////////////////////// + //! - Setting relaxation rates for non-hydrodynamic cumulants (default values). Variable names and equations according to + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! => [NAME IN PAPER]=[NAME IN CODE]=[DEFAULT VALUE]. + //! - Trace of second order cumulants \f$ C_{200}+C_{020}+C_{002} \f$ used to adjust bulk viscosity:\f$\omega_2=OxxPyyPzz=1.0 \f$. + //! - Third order cumulants \f$ C_{120}+C_{102}, C_{210}+C_{012}, C_{201}+C_{021} \f$: \f$ \omega_3=OxyyPxzz \f$ set according to Eq. (111) with simplifications assuming \f$ \omega_2=1.0\f$. + //! - Third order cumulants \f$ C_{120}-C_{102}, C_{210}-C_{012}, C_{201}-C_{021} \f$: \f$ \omega_4 = OxyyMxzz \f$ set according to Eq. (112) with simplifications assuming \f$ \omega_2 = 1.0\f$. + //! - Third order cumulants \f$ C_{111} \f$: \f$ \omega_5 = Oxyz \f$ set according to Eq. (113) with simplifications assuming \f$ \omega_2 = 1.0\f$ (modify for different bulk viscosity). + //! - Fourth order cumulants \f$ C_{220}, C_{202}, C_{022}, C_{211}, C_{121}, C_{112} \f$: for simplification all set to the same default value \f$ \omega_6=\omega_7=\omega_8=O4=1.0 \f$. + //! - Fifth order cumulants \f$ C_{221}, C_{212}, C_{122}\f$: \f$\omega_9=O5=1.0\f$. + //! - Sixth order cumulant \f$ C_{222}\f$: \f$\omega_{10}=O6=1.0\f$. + //! + //////////////////////////////////////////////////////////// + //2. + real OxxPyyPzz = c1o1; + //////////////////////////////////////////////////////////// + //3. + real OxyyPxzz = c8o1 * (-c2o1 + omega) * ( c1o1 + c2o1*omega) / (-c8o1 - c14o1*omega + c7o1*omega*omega); + real OxyyMxzz = c8o1 * (-c2o1 + omega) * (-c7o1 + c4o1*omega) / (c56o1 - c50o1*omega + c9o1*omega*omega); + real Oxyz = c24o1 * (-c2o1 + omega) * (-c2o1 - c7o1*omega + c3o1*omega*omega) / (c48o1 + c152o1*omega - c130o1*omega*omega + c29o1*omega*omega*omega); + //////////////////////////////////////////////////////////// + //4. + real O4 = c1o1; + //////////////////////////////////////////////////////////// + //5. + real O5 = c1o1; + //////////////////////////////////////////////////////////// + //6. + real O6 = c1o1; + //////////////////////////////////////////////////////////////////////////////////// + //! - A and B: parameters for fourth order convergence of the diffusion term according to Eq. (114) and (115) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! with simplifications assuming \f$ \omega_2 = 1.0 \f$ (modify for different bulk viscosity). + //! + real A = (c4o1 + c2o1*omega - c3o1*omega*omega) / (c2o1 - c7o1*omega + c5o1*omega*omega); + real B = (c4o1 + c28o1*omega - c14o1*omega*omega) / (c6o1 - c21o1*omega + c15o1*omega*omega); + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute cumulants from central moments according to Eq. (20)-(23) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + //////////////////////////////////////////////////////////// + //4. + real CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2o1 * mfbba * mfbab) * OOrho; + real CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2o1 * mfbba * mfabb) * OOrho; + real CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2o1 * mfbab * mfabb) * OOrho; + real CUMcca = mfcca - (((mfcaa * mfaca + c2o1 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) * OOrho - c1o9*(drho * OOrho)); + real CUMcac = mfcac - (((mfcaa * mfaac + c2o1 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) * OOrho - c1o9*(drho * OOrho)); + real CUMacc = mfacc - (((mfaac * mfaca + c2o1 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) * OOrho - c1o9*(drho * OOrho)); + //////////////////////////////////////////////////////////// + //5. + real CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) * OOrho; + real CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) * OOrho; + real CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) * OOrho; + //////////////////////////////////////////////////////////// + //6. + real CUMccc = mfccc + ((-c4o1 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho + + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2o1 * (mfcaa * mfaca * mfaac) + + c16o1 * mfbba * mfbab * mfabb) * OOrho * OOrho + - c1o3 * (mfacc + mfcac + mfcca) * OOrho + - c1o9 * (mfcaa + mfaca + mfaac) * OOrho + + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 + + c1o27*((drho * drho - drho) * OOrho * OOrho)); + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute linear combinations of second and third order cumulants + //! + //////////////////////////////////////////////////////////// + //2. + real mxxPyyPzz = mfcaa + mfaca + mfaac; + real mxxMyy = mfcaa - mfaca; + real mxxMzz = mfcaa - mfaac; + //////////////////////////////////////////////////////////// + //3. + real mxxyPyzz = mfcba + mfabc; + real mxxyMyzz = mfcba - mfabc; + real mxxzPyyz = mfcab + mfacb; + real mxxzMyyz = mfcab - mfacb; + real mxyyPxzz = mfbca + mfbac; + real mxyyMxzz = mfbca - mfbac; + //////////////////////////////////////////////////////////////////////////////////// + //incl. correction + //////////////////////////////////////////////////////////// + //! - Compute velocity gradients from second order cumulants according to Eq. (27)-(32) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! Further explanations of the correction in viscosity in Appendix H of + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! Note that the division by rho is omitted here as we need rho times the gradients later. + //! + real Dxy = -c3o1*omega*mfbba; + real Dxz = -c3o1*omega*mfbab; + real Dyz = -c3o1*omega*mfabb; + real dxux = c1o2 * (-omega) *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + real dyuy = dxux + omega * c3o2 * mxxMyy; + real dzuz = dxux + omega * c3o2 * mxxMzz; + //////////////////////////////////////////////////////////// + //! - Relaxation of second order cumulants with correction terms according to Eq. (33)-(35) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - c3o1 * (c1o1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += omega * (-mxxMyy) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += omega * (-mxxMzz) - c3o1 * (c1o1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); + //////////////////////////////////////////////////////////////////////////////////// + ////no correction + //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz); + //mxxMyy += -(-omega) * (-mxxMyy); + //mxxMzz += -(-omega) * (-mxxMzz); + ////////////////////////////////////////////////////////////////////////// + mfabb += omega * (-mfabb); + mfbab += omega * (-mfbab); + mfbba += omega * (-mfbba); + //////////////////////////////////////////////////////////////////////////////////// + //relax + ////////////////////////////////////////////////////////////////////////// + // incl. limiter + //! - Relaxation of third order cumulants including limiter according to Eq. (116)-(123) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + wadjust = Oxyz + (c1o1 - Oxyz)*abs(mfbbb) / (abs(mfbbb) + qudricLimitD); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (c1o1 - OxyyPxzz)*abs(mxxyPyzz) / (abs(mxxyPyzz) + qudricLimitP); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (c1o1 - OxyyMxzz)*abs(mxxyMyzz) / (abs(mxxyMyzz) + qudricLimitM); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (c1o1 - OxyyPxzz)*abs(mxxzPyyz) / (abs(mxxzPyyz) + qudricLimitP); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (c1o1 - OxyyMxzz)*abs(mxxzMyyz) / (abs(mxxzMyyz) + qudricLimitM); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (c1o1 - OxyyPxzz)*abs(mxyyPxzz) / (abs(mxyyPxzz) + qudricLimitP); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (c1o1 - OxyyMxzz)*abs(mxyyMxzz) / (abs(mxyyMxzz) + qudricLimitM); + mxyyMxzz += wadjust * (-mxyyMxzz); + ////////////////////////////////////////////////////////////////////////// + // no limiter + //mfbbb += OxyyMxzz * (-mfbbb); + //mxxyPyzz += OxyyPxzz * (-mxxyPyzz); + //mxxyMyzz += OxyyMxzz * (-mxxyMyzz); + //mxxzPyyz += OxyyPxzz * (-mxxzPyyz); + //mxxzMyyz += OxyyMxzz * (-mxxzMyyz); + //mxyyPxzz += OxyyPxzz * (-mxyyPxzz); + //mxyyMxzz += OxyyMxzz * (-mxyyMxzz); + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute inverse linear combinations of second and third order cumulants + //! + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-c2o1* mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - c2o1* mxxMzz + mxxPyyPzz); + mfcba = ( mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = ( mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = ( mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //4. + // no limiter + //! - Relax fourth order cumulants to modified equilibrium for fourth order convergence of diffusion according to Eq. (43)-(48) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + CUMacc = -O4*(c1o1 / omega - c1o2) * (dyuy + dzuz) * c2o3 * A + (c1o1 - O4) * (CUMacc); + CUMcac = -O4*(c1o1 / omega - c1o2) * (dxux + dzuz) * c2o3 * A + (c1o1 - O4) * (CUMcac); + CUMcca = -O4*(c1o1 / omega - c1o2) * (dyuy + dxux) * c2o3 * A + (c1o1 - O4) * (CUMcca); + CUMbbc = -O4*(c1o1 / omega - c1o2) * Dxy * c1o3 * B + (c1o1 - O4) * (CUMbbc); + CUMbcb = -O4*(c1o1 / omega - c1o2) * Dxz * c1o3 * B + (c1o1 - O4) * (CUMbcb); + CUMcbb = -O4*(c1o1 / omega - c1o2) * Dyz * c1o3 * B + (c1o1 - O4) * (CUMcbb); + ////////////////////////////////////////////////////////////////////////// + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + ////////////////////////////////////////////////////////////////////////// + //6. + CUMccc += O6 * (-CUMccc); + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute central moments from post collision cumulants according to Eq. (53)-(56) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + ////////////////////////////////////////////////////////////////////////// + //4. + mfcbb = CUMcbb + c1o3*((c3o1*mfcaa + c1o1) * mfabb + c6o1 * mfbba * mfbab) * OOrho; + mfbcb = CUMbcb + c1o3*((c3o1*mfaca + c1o1) * mfbab + c6o1 * mfbba * mfabb) * OOrho; + mfbbc = CUMbbc + c1o3*((c3o1*mfaac + c1o1) * mfbba + c6o1 * mfbab * mfabb) * OOrho; + mfcca = CUMcca + (((mfcaa * mfaca + c2o1 * mfbba * mfbba)*c9o1 + c3o1 * (mfcaa + mfaca)) * OOrho - (drho * OOrho))*c1o9; + mfcac = CUMcac + (((mfcaa * mfaac + c2o1 * mfbab * mfbab)*c9o1 + c3o1 * (mfcaa + mfaac)) * OOrho - (drho * OOrho))*c1o9; + mfacc = CUMacc + (((mfaac * mfaca + c2o1 * mfabb * mfabb)*c9o1 + c3o1 * (mfaac + mfaca)) * OOrho - (drho * OOrho))*c1o9; + ////////////////////////////////////////////////////////////////////////// + //5. + mfbcc = CUMbcc + c1o3 *(c3o1*(mfaac * mfbca + mfaca * mfbac + c4o1 * mfabb * mfbbb + c2o1 * (mfbab * mfacb + mfbba * mfabc)) + (mfbca + mfbac)) * OOrho; + mfcbc = CUMcbc + c1o3 *(c3o1*(mfaac * mfcba + mfcaa * mfabc + c4o1 * mfbab * mfbbb + c2o1 * (mfabb * mfcab + mfbba * mfbac)) + (mfcba + mfabc)) * OOrho; + mfccb = CUMccb + c1o3 *(c3o1*(mfcaa * mfacb + mfaca * mfcab + c4o1 * mfbba * mfbbb + c2o1 * (mfbab * mfbca + mfabb * mfcba)) + (mfacb + mfcab)) * OOrho; + ////////////////////////////////////////////////////////////////////////// + //6. + mfccc = CUMccc - ((-c4o1 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4o1 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2o1 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho + + (c4o1 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2o1 * (mfcaa * mfaca * mfaac) + + c16o1 * mfbba * mfbab * mfabb) * OOrho * OOrho + - c1o3 * (mfacc + mfcac + mfcca) * OOrho + - c1o9 * (mfcaa + mfaca + mfaac) * OOrho + + (c2o1 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 *(mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 + + c1o27*((drho * drho - drho) * OOrho * OOrho)); + //////////////////////////////////////////////////////////////////////////////////// + //! - Add acceleration (body force) to first order cumulants according to Eq. (85)-(87) in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa 2015.05.001 ]</b></a> + //! see also Eq. (88)-(96) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05 040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + VF::LBM::backwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1o1, c1o1); + VF::LBM::backwardChimera( mfaba, mfbba, mfcba, vvx, vx2); + VF::LBM::backwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3o1, c1o3); + VF::LBM::backwardChimera( mfaab, mfbab, mfcab, vvx, vx2); + VF::LBM::backwardChimera( mfabb, mfbbb, mfcbb, vvx, vx2); + VF::LBM::backwardChimera( mfacb, mfbcb, mfccb, vvx, vx2); + VF::LBM::backwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3o1, c1o3); + VF::LBM::backwardChimera( mfabc, mfbbc, mfcbc, vvx, vx2); + VF::LBM::backwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c9o1, c1o9); + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + VF::LBM::backwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6o1, c1o6); + VF::LBM::backwardChimera( mfaab, mfabb, mfacb, vvy, vy2); + VF::LBM::backwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18o1, c1o18); + VF::LBM::backwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3); + VF::LBM::backwardChimera( mfbab, mfbbb, mfbcb, vvy, vy2); + VF::LBM::backwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9); + VF::LBM::backwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6o1, c1o6); + VF::LBM::backwardChimera( mfcab, mfcbb, mfccb, vvy, vy2); + VF::LBM::backwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18o1, c1o18); + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + VF::LBM::backwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36o1, c1o36); + VF::LBM::backwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9o1, c1o9); + VF::LBM::backwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36o1, c1o36); + VF::LBM::backwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9o1, c1o9); + VF::LBM::backwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9); + VF::LBM::backwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9o1, c1o9); + VF::LBM::backwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36o1, c1o36); + VF::LBM::backwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9o1, c1o9); + VF::LBM::backwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36o1, c1o36); + + Distribution27 distribution_calculated; + + distribution_calculated.f[DIR::PZZ] = mfcbb; + distribution_calculated.f[DIR::MZZ] = mfabb; + distribution_calculated.f[DIR::ZPZ] = mfbcb; + distribution_calculated.f[DIR::ZMZ] = mfbab; + distribution_calculated.f[DIR::ZZP] = mfbbc; + distribution_calculated.f[DIR::ZZM] = mfbba; + distribution_calculated.f[DIR::PPZ] = mfccb; + distribution_calculated.f[DIR::MMZ] = mfaab; + distribution_calculated.f[DIR::PMZ] = mfcab; + distribution_calculated.f[DIR::MPZ] = mfacb; + distribution_calculated.f[DIR::PZP] = mfcbc; + distribution_calculated.f[DIR::MZM] = mfaba; + distribution_calculated.f[DIR::PZM] = mfcba; + distribution_calculated.f[DIR::MZP] = mfabc; + distribution_calculated.f[DIR::ZPP] = mfbcc; + distribution_calculated.f[DIR::ZMM] = mfbaa; + distribution_calculated.f[DIR::ZPM] = mfbca; + distribution_calculated.f[DIR::ZMP] = mfbac; + distribution_calculated.f[DIR::PPP] = mfccc; + distribution_calculated.f[DIR::MPP] = mfacc; + distribution_calculated.f[DIR::PMP] = mfcac; + distribution_calculated.f[DIR::MMP] = mfaac; + distribution_calculated.f[DIR::PPM] = mfcca; + distribution_calculated.f[DIR::MPM] = mfaca; + distribution_calculated.f[DIR::PMM] = mfcaa; + distribution_calculated.f[DIR::MMM] = mfaaa; + distribution_calculated.f[DIR::ZZZ] = mfbbb; + + return distribution_calculated; +} + +} +} +#endif diff --git a/src/lbm/D3Q27.h b/src/lbm/D3Q27.h index b07c0e721..4eaac9f7f 100644 --- a/src/lbm/D3Q27.h +++ b/src/lbm/D3Q27.h @@ -36,6 +36,34 @@ static constexpr int BSE = 24; static constexpr int BSW = 25; static constexpr int REST = 26; +static constexpr int PZZ = 0; +static constexpr int MZZ = 1; +static constexpr int ZPZ = 2; +static constexpr int ZMZ = 3; +static constexpr int ZZP = 4; +static constexpr int ZZM = 5; +static constexpr int PPZ = 6; +static constexpr int MMZ = 7; +static constexpr int PMZ = 8; +static constexpr int MPZ = 9; +static constexpr int PZP = 10; +static constexpr int MZM = 11; +static constexpr int PZM = 12; +static constexpr int MZP = 13; +static constexpr int ZPP = 14; +static constexpr int ZMM = 15; +static constexpr int ZPM = 16; +static constexpr int ZMP = 17; +static constexpr int PPP = 18; +static constexpr int MPP = 19; +static constexpr int PMP = 20; +static constexpr int MMP = 21; +static constexpr int PPM = 22; +static constexpr int MPM = 23; +static constexpr int PMM = 24; +static constexpr int MMM = 25; +static constexpr int ZZZ = 26; + } } } -- GitLab