From b94a8814bd2bc5b60cf754aa90613aa64348d0f3 Mon Sep 17 00:00:00 2001 From: kutscher <kutscher@irmb.tu-bs.de> Date: Thu, 27 Aug 2020 14:05:54 +0200 Subject: [PATCH] add Thixotropy branch --- apps/cpu/Applications.cmake | 3 +- apps/cpu/HerschelBulkleySphere/CMakeLists.txt | 27 + apps/cpu/HerschelBulkleySphere/hbsphere.cfg | 24 + apps/cpu/HerschelBulkleySphere/hbsphere.cpp | 331 +++ src/cpu/VirtualFluids.h | 29 +- .../BoundaryConditions/BCAlgorithm.cpp | 5 + .../BoundaryConditions/BCAlgorithm.h | 64 +- .../BinghamModelNoSlipBCAlgorithm.h | 27 + .../BoundaryConditions/BoundaryConditions.h | 52 +- .../DensityAndThixotropyBCAlgorithm.cpp | 89 + .../DensityAndThixotropyBCAlgorithm.h | 25 + .../HerschelBulkleyModelNoSlipBCAlgorithm.h | 27 + .../NoSlipAndThixotropyBCAlgorithm.cpp | 70 + .../NoSlipAndThixotropyBCAlgorithm.h | 22 + ...lectingOutflowAndThixotropyBCAlgorithm.cpp | 339 +++ ...eflectingOutflowAndThixotropyBCAlgorithm.h | 25 + .../SimpleVelocityBCAlgorithm.cpp | 83 + .../SimpleVelocityBCAlgorithm.h | 54 + .../ThixotropyNoSlipBCAlgorithm.cpp | 41 + .../ThixotropyNoSlipBCAlgorithm.h | 20 + .../VelocityAndThixotropyBCAlgorithm.cpp | 105 + .../VelocityAndThixotropyBCAlgorithm.h | 24 + ...ityWithDensityAndThixotropyBCAlgorithm.cpp | 100 + ...ocityWithDensityAndThixotropyBCAlgorithm.h | 31 + .../VelocityWithDensityBCAlgorithm.cpp | 41 +- .../VelocityWithDensityBCAlgorithm.h | 4 +- .../WriteMacroscopicQuantitiesCoProcessor.cpp | 232 +- .../WriteThixotropyQuantitiesCoProcessor.cpp | 237 ++ .../WriteThixotropyQuantitiesCoProcessor.h | 42 + .../ThixotropyFullDirectConnector.cpp | 291 +++ .../ThixotropyFullDirectConnector.h | 222 ++ .../ThixotropyFullVectorConnector.cpp | 483 ++++ .../ThixotropyFullVectorConnector.h | 189 ++ src/cpu/VirtualFluidsCore/Data/DataSet3D.h | 189 +- .../VirtualFluidsCore/LBM/BasicLBMKernel.cpp | 61 + .../VirtualFluidsCore/LBM/BasicLBMKernel.h | 25 + .../LBM/BinghamModelLBMKernel.h | 38 + .../LBM/CompressibleCumulantLBMKernel.cpp | 3 +- .../LBM/CumulantLBMKernel.cpp | 1972 +++++++++++++++++ .../VirtualFluidsCore/LBM/CumulantLBMKernel.h | 55 + src/cpu/VirtualFluidsCore/LBM/D3Q27System.h | 1898 +++++++++------- .../LBM/HerschelBulkleyModelLBMKernel.h | 38 + src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp | 43 + src/cpu/VirtualFluidsCore/LBM/Thixotropy.h | 103 + .../LBM/ThixotropyExpLBMKernel.cpp | 1874 ++++++++++++++++ .../LBM/ThixotropyExpLBMKernel.h | 72 + .../LBM/ThixotropyLBMKernel.cpp | 1868 ++++++++++++++++ .../LBM/ThixotropyLBMKernel.h | 72 + .../LBM/ThixotropyModelLBMKernel.cpp | 895 ++++++++ .../LBM/ThixotropyModelLBMKernel.h | 51 + .../BoundaryConditionsBlockVisitor.cpp | 71 +- .../InitDistributionsBlockVisitor.cpp | 361 ++- .../Visitors/InitThixotropyBlockVisitor.cpp | 435 ++++ .../Visitors/InitThixotropyBlockVisitor.h | 93 + .../Visitors/SetConnectorsBlockVisitor.cpp | 896 ++++---- 55 files changed, 12789 insertions(+), 1682 deletions(-) create mode 100644 apps/cpu/HerschelBulkleySphere/CMakeLists.txt create mode 100644 apps/cpu/HerschelBulkleySphere/hbsphere.cfg create mode 100644 apps/cpu/HerschelBulkleySphere/hbsphere.cpp create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.cpp create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.h create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/HerschelBulkleyModelNoSlipBCAlgorithm.h create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.cpp create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.h create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.cpp create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.h create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.h create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.cpp create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.h create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.cpp create mode 100644 src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.h create mode 100644 src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp create mode 100644 src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.cpp create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.h create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.cpp create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.h create mode 100644 src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp create mode 100644 src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.h create mode 100644 src/cpu/VirtualFluidsCore/LBM/BinghamModelLBMKernel.h create mode 100644 src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp create mode 100644 src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h create mode 100644 src/cpu/VirtualFluidsCore/LBM/HerschelBulkleyModelLBMKernel.h create mode 100644 src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp create mode 100644 src/cpu/VirtualFluidsCore/LBM/Thixotropy.h create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.h create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.h create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.cpp create mode 100644 src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.h create mode 100644 src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp create mode 100644 src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.h diff --git a/apps/cpu/Applications.cmake b/apps/cpu/Applications.cmake index 920e01efb..0b92f834e 100644 --- a/apps/cpu/Applications.cmake +++ b/apps/cpu/Applications.cmake @@ -64,4 +64,5 @@ #add_subdirectory(Applications/bChannelVA) #add_subdirectory(Applications/OrganPipe) #add_subdirectory(Applications/LidDrivenCavity) -add_subdirectory(${APPS_ROOT_CPU}/poiseuille_example) +add_subdirectory(${APPS_ROOT_CPU}/HerschelBulkleySphere) + diff --git a/apps/cpu/HerschelBulkleySphere/CMakeLists.txt b/apps/cpu/HerschelBulkleySphere/CMakeLists.txt new file mode 100644 index 000000000..162bf5604 --- /dev/null +++ b/apps/cpu/HerschelBulkleySphere/CMakeLists.txt @@ -0,0 +1,27 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8) + +######################################################## +## C++ PROJECT ### +######################################################## +PROJECT(HerschelBulkleySphere) + +INCLUDE(${APPS_ROOT_CPU}/IncludsList.cmake) + +################################################################ +## LOCAL FILES ### +################################################################ +# FILE(GLOB SPECIFIC_FILES ${CMAKE_CURRENT_SOURCE_DIR}/*.h + # ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp + # ${CMAKE_CURRENT_SOURCE_DIR}/*.hpp ) + +# SET(ALL_SOURCES ${ALL_SOURCES} ${SPECIFIC_FILES}) +# SOURCE_GROUP(src FILES ${SPECIFIC_FILES}) + +# SET(CAB_ADDITIONAL_LINK_LIBRARIES VirtualFluids) + +################################################################ +## CREATE PROJECT ### +################################################################ +# CREATE_CAB_PROJECT(hbsphere BINARY) + +vf_add_library(BUILDTYPE binary DEPENDS VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES hbsphere.cpp ) \ No newline at end of file diff --git a/apps/cpu/HerschelBulkleySphere/hbsphere.cfg b/apps/cpu/HerschelBulkleySphere/hbsphere.cfg new file mode 100644 index 000000000..1f636ec21 --- /dev/null +++ b/apps/cpu/HerschelBulkleySphere/hbsphere.cfg @@ -0,0 +1,24 @@ +outputPath = /work/koskuche/Herschel-BulkleySphere + +numOfThreads = 1 +availMem = 8e9 +logToFile = false + +blocknx = 10 10 10 +boundingBox = 600 600 600 #30*20=600**3=216000000 +deltax = 1 +radius = 15 + +velocity = 1e-3 +n = 0.3 +Re = 1 +Bn = 0.01 + +newStart = true +restartStep = 100000 + +cpStart = 10000 +cpStep = 10000 + +outTime = 10000 +endTime = 1000000 \ No newline at end of file diff --git a/apps/cpu/HerschelBulkleySphere/hbsphere.cpp b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp new file mode 100644 index 000000000..deb44fc21 --- /dev/null +++ b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp @@ -0,0 +1,331 @@ +#include <iostream> +#include <string> + +#include <VirtualFluids.h> + +using namespace std; + + +void bflow(string configname) +{ + try + { + ConfigurationFile config; + config.load(configname); + + string outputPath = config.getValue<string>("outputPath"); + int numOfThreads = config.getValue<int>("numOfThreads"); + vector<int> blocknx = config.getVector<int>("blocknx"); + vector<double> boundingBox = config.getVector<double>("boundingBox"); + //double nuLB = config.getValue<double>("nuLB"); + double endTime = config.getValue<double>("endTime"); + double outTime = config.getValue<double>("outTime"); + double availMem = config.getValue<double>("availMem"); + //int refineLevel = config.getValue<int>("refineLevel"); + bool logToFile = config.getValue<bool>("logToFile"); + double restartStep = config.getValue<double>("restartStep"); + double deltax = config.getValue<double>("deltax"); + double radius = config.getValue<double>("radius"); + double cpStep = config.getValue<double>("cpStep"); + double cpStart = config.getValue<double>("cpStart"); + bool newStart = config.getValue<bool>("newStart"); + double velocity = config.getValue<double>("velocity"); + double n = config.getValue<double>("n"); + double Re = config.getValue<double>("Re"); + double Bn = config.getValue<double>("Bn"); + + SPtr<Communicator> comm = MPICommunicator::getInstance(); + int myid = comm->getProcessID(); + + if (logToFile) + { +#if defined(__unix__) + if (myid == 0) + { + const char* str = outputPath.c_str(); + mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + } +#endif + + if (myid == 0) + { + stringstream logFilename; + logFilename << outputPath + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt"; + UbLog::output_policy::setStream(logFilename.str()); + } + } + + LBMReal rhoLB = 0.0; + + SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter()); + + //bounding box + + //double g_minX1 = 0; + //double g_minX2 = 0; + //double g_minX3 = 0; + + //double g_maxX1 = boundingBox[0]; + //double g_maxX2 = boundingBox[1]; + //double g_maxX3 = boundingBox[2]; + + double g_minX1 = -boundingBox[0]/2.0; + double g_minX2 = -boundingBox[1] / 2.0; + double g_minX3 = -boundingBox[2]/2.0; + + double g_maxX1 = boundingBox[0]/2.0; + double g_maxX2 = boundingBox[1]/2.0; + double g_maxX3 = boundingBox[2]/2.0; + + double blockLength = 3.0 * deltax; + + double d = 2.0 * radius; + double U = velocity; + double Gamma = U / d; + + double k = (U * d) / (Re * std::pow(Gamma, n - 1)); + + double tau0 = Bn * k * std::pow(Gamma, n); + + SPtr<Thixotropy> thix = Thixotropy::getInstance(); + thix->setPowerIndex(n); + thix->setViscosityParameter(k); + thix->setYieldStress(tau0); + + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new HerschelBulkleyModelNoSlipBCAlgorithm())); + //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new BinghamModelNoSlipBCAlgorithm())); + + mu::Parser fct; + fct.SetExpr("U"); + fct.DefineConst("U", velocity); + SPtr<BCAdapter> velocityBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST)); + velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm())); + + SPtr<BCAdapter> densityBCAdapter(new DensityBCAdapter()); + densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm())); + + //BS visitor + BoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + bcVisitor.addBC(velocityBCAdapter); + bcVisitor.addBC(densityBCAdapter); + + SPtr<BCProcessor> bcProc; + bcProc = SPtr<BCProcessor>(new BCProcessor()); + + SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel()); + kernel->setBCProcessor(bcProc); + + SPtr<Grid3D> grid(new Grid3D(comm)); + grid->setPeriodicX1(false); + grid->setPeriodicX2(false); + grid->setPeriodicX3(false); + grid->setDeltaX(deltax); + grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]); + + SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3)); + if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); + + //sphere + SPtr<GbObject3D> sphere(new GbSphere3D(0, 0, 0, radius)); + GbSystem3D::writeGeoObject(sphere.get(), outputPath + "/geo/sphere", WbWriterVtkXmlBinary::getInstance()); + SPtr<D3Q27Interactor> sphereInt(new D3Q27Interactor(sphere, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + ////////////////////////////////////////////////////////////////////////// + //restart + SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart)); + SPtr<MPIIOMigrationBECoProcessor> restartCoProcessor(new MPIIOMigrationBECoProcessor(grid, mSch, outputPath, comm)); + restartCoProcessor->setLBMKernel(kernel); + restartCoProcessor->setBCProcessor(bcProc); + ////////////////////////////////////////////////////////////////////////// + + if (myid == 0) + { + UBLOG(logINFO, "Parameters:"); + //UBLOG(logINFO, "forcing = " << forcing); + UBLOG(logINFO, "rho = " << rhoLB); + UBLOG(logINFO, "U = " << U); + UBLOG(logINFO, "Re = " << Re); + UBLOG(logINFO, "Bn = " << Bn); + UBLOG(logINFO, "k = " << k); + UBLOG(logINFO, "n = " << n); + UBLOG(logINFO, "tau0 = " << tau0); + UBLOG(logINFO, "deltax = " << deltax); + //UBLOG(logINFO, "number of levels = " << refineLevel + 1); + UBLOG(logINFO, "number of threads = " << numOfThreads); + UBLOG(logINFO, "number of processes = " << comm->getNumberOfProcesses()); + UBLOG(logINFO, "Preprozess - start"); + } + + if (newStart) + { + GenBlocksGridVisitor genBlocks(gridCube); + grid->accept(genBlocks); + + //walls + GbCuboid3DPtr wallZmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_minX3)); + if (myid == 0) GbSystem3D::writeGeoObject(wallZmin.get(), outputPath + "/geo/wallZmin", WbWriterVtkXmlASCII::getInstance()); + + GbCuboid3DPtr wallZmax(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_maxX3, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength)); + if (myid == 0) GbSystem3D::writeGeoObject(wallZmax.get(), outputPath + "/geo/wallZmax", WbWriterVtkXmlASCII::getInstance()); + + GbCuboid3DPtr wallYmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_minX2, g_maxX3 + blockLength)); + if (myid == 0) GbSystem3D::writeGeoObject(wallYmin.get(), outputPath + "/geo/wallYmin", WbWriterVtkXmlASCII::getInstance()); + + GbCuboid3DPtr wallYmax(new GbCuboid3D(g_minX1 - blockLength, g_maxX2, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength)); + if (myid == 0) GbSystem3D::writeGeoObject(wallYmax.get(), outputPath + "/geo/wallYmax", WbWriterVtkXmlASCII::getInstance()); + + GbCuboid3DPtr wallXmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_minX1, g_maxX2 + blockLength, g_maxX3 + blockLength)); + if (myid == 0) GbSystem3D::writeGeoObject(wallXmin.get(), outputPath + "/geo/wallXmin", WbWriterVtkXmlASCII::getInstance()); + + GbCuboid3DPtr wallXmax(new GbCuboid3D(g_maxX1, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength)); + if (myid == 0) GbSystem3D::writeGeoObject(wallXmax.get(), outputPath + "/geo/wallXmax", WbWriterVtkXmlASCII::getInstance()); + + //wall interactors + SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + SPtr<D3Q27Interactor> wallXminInt(new D3Q27Interactor(wallXmin, grid, velocityBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallXmaxInt(new D3Q27Interactor(wallXmax, grid, densityBCAdapter, Interactor3D::SOLID)); + + //////////////////////////////////////////// + //METIS + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY)); + //////////////////////////////////////////// + /////delete solid blocks + if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start"); + InteractorsHelper intHelper(grid, metisVisitor); + intHelper.addInteractor(wallZminInt); + intHelper.addInteractor(wallZmaxInt); + intHelper.addInteractor(wallYminInt); + intHelper.addInteractor(wallYmaxInt); + intHelper.addInteractor(wallXminInt); + intHelper.addInteractor(wallXmaxInt); + intHelper.addInteractor(sphereInt); + intHelper.selectBlocks(); + if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end"); + ////////////////////////////////////// + + SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm)); + ppblocks->process(0); + + unsigned long nob = grid->getNumberOfBlocks(); + int gl = 3; + unsigned long nodb = (blocknx[0]) * (blocknx[1]) * (blocknx[2]); + unsigned long nod = nob * (blocknx[0]) * (blocknx[1]) * (blocknx[2]); + unsigned long nodg = nob * (blocknx[0] + gl) * (blocknx[1] + gl) * (blocknx[1] + gl); + double needMemAll = double(nodg * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4)); + double needMem = needMemAll / double(comm->getNumberOfProcesses()); + + if (myid == 0) + { + UBLOG(logINFO, "Number of blocks = " << nob); + UBLOG(logINFO, "Number of nodes = " << nod); + int minInitLevel = grid->getCoarsestInitializedLevel(); + int maxInitLevel = grid->getFinestInitializedLevel(); + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + int nobl = grid->getNumberOfBlocks(level); + UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl); + UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * nodb); + } + UBLOG(logINFO, "Necessary memory = " << needMemAll << " bytes"); + UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes"); + UBLOG(logINFO, "Available memory per process = " << availMem << " bytes"); + } + + SetKernelBlockVisitor kernelVisitor(kernel, k, availMem, needMem); + grid->accept(kernelVisitor); + + //BC + intHelper.setBC(); + + //initialization of distributions + InitDistributionsBlockVisitor initVisitor; + grid->accept(initVisitor); + + + if (myid == 0) UBLOG(logINFO, "Preprozess - end"); + } + else + { + restartCoProcessor->restart((int)restartStep); + grid->setTimeStep(restartStep); + } + + omp_set_num_threads(numOfThreads); + + //set connectors + InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor()); + SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, k, iProcessor); + grid->accept(setConnsVisitor); + + grid->accept(bcVisitor); + + SPtr<UbScheduler> geoSch(new UbScheduler(1)); + WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm); + ppgeo.process(0); + + SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100)); + SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm)); + + //write data for visualization of macroscopic quantities + SPtr<UbScheduler> visSch(new UbScheduler(outTime)); + //SPtr<UbScheduler> visSch(new UbScheduler(10,1)); + SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlASCII::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + writeMQCoProcessor->process(0); + + double area = 4*UbMath::PI*radius*radius; + SPtr<UbScheduler> forceSch(new UbScheduler(1000)); + SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, outputPath + "/forces/forces.txt", comm, velocity, area); + fp->addInteractor(sphereInt); + + SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1)); + SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); + calculator->addCoProcessor(npr); + calculator->addCoProcessor(fp); + calculator->addCoProcessor(writeMQCoProcessor); + calculator->addCoProcessor(restartCoProcessor); + + if (myid == 0) UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) UBLOG(logINFO, "Simulation-end"); + } + catch (std::exception& e) + { + cerr << e.what() << endl << flush; + } + catch (std::string& s) + { + cerr << s << endl; + } + catch (...) + { + cerr << "unknown exception" << endl; + } + +} + +////////////////////////////////////////////////////////////////////////// +int main(int argc, char* argv[]) +{ + if (argv != NULL) + { + if (argv[1] != NULL) + { + //pflowForcing(string(argv[1])); + bflow(string(argv[1])); + } + else + { + cout << "Configuration file is missing!" << endl; + } + } + + return 0; +} diff --git a/src/cpu/VirtualFluids.h b/src/cpu/VirtualFluids.h index 576687d69..31671c3ed 100644 --- a/src/cpu/VirtualFluids.h +++ b/src/cpu/VirtualFluids.h @@ -121,6 +121,15 @@ #include <BoundaryConditions/VelocityBCAdapter.h> #include <BoundaryConditions/VelocityBCAlgorithm.h> #include <BoundaryConditions/VelocityWithDensityBCAlgorithm.h> +#include <BoundaryConditions/DensityAndThixotropyBCAlgorithm.h> +#include <BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.h> +#include <BoundaryConditions/VelocityAndThixotropyBCAlgorithm.h> +#include <BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.h> +#include <BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.h> +#include <BoundaryConditions/SimpleVelocityBCAlgorithm.h> +#include <BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h> +#include <BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h> +#include <BoundaryConditions/HerschelBulkleyModelNoSlipBCAlgorithm.h> #include <Connectors/Block3DConnector.h> #include <Connectors/Block3DConnectorFactory.h> @@ -182,8 +191,7 @@ #include <CoProcessors/MPIIOMigrationCoProcessor.h> #include <CoProcessors/MPIIORestartCoProcessor.h> #include <CoProcessors/MicrophoneArrayCoProcessor.h> -#include <CoProcessors/PressureCoefficientCoProcessor.h> -#include <CoProcessors/TimeAveragedValuesCoProcessor.h> +#include <WriteThixotropyQuantitiesCoProcessor.h> #include <IntegrateValuesHelper.h> //#include <LBM/D3Q27CompactInterpolationProcessor.h> @@ -206,7 +214,14 @@ #include <LBM/LBMKernelETD3Q27BGK.h> #include <LBM/LBMSystem.h> #include <LBM/LBMUnitConverter.h> -#include <LBM/VoidLBMKernel.h> +//#include <LBM/BGKLBMKernel.h> +#include <LBM/ThixotropyLBMKernel.h> +#include <LBM/ThixotropyExpLBMKernel.h> +#include <LBM/CumulantLBMKernel.h> +#include <LBM/ThixotropyModelLBMKernel.h> +#include <LBM/BinghamModelLBMKernel.h> +#include <LBM/HerschelBulkleyModelLBMKernel.h> + #include <geometry3d/CoordinateTransformation3D.h> #include <geometry3d/GbCuboid3D.h> @@ -287,6 +302,14 @@ #include <Visitors/SetSpongeLayerBlockVisitor.h> #include <Visitors/SetUndefinedNodesBlockVisitor.h> #include <Visitors/ViscosityBlockVisitor.h> +#include <Visitors/BoundaryConditionsBlockVisitor.h> +#include <Visitors/BoundaryConditionsBlockVisitor.h> +#include <Visitors/ChangeBoundaryDensityBlockVisitor.h> +#include <InitDistributionsFromFileBlockVisitor.h> +#include <InitDistributionsWithInterpolationGridVisitor.h> +#include <InitThixotropyBlockVisitor.h> +#include <CheckRatioBlockVisitor.h> +#include <SpongeLayerBlockVisitor.h> #include <ZoltanPartitioningGridVisitor.h> #include <RefineAroundGbObjectHelper.h> diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp index 61b427e32..8737b8c04 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp @@ -36,7 +36,12 @@ #include "BCArray3D.h" #include "BoundaryConditions.h" #include "EsoTwist3D.h" +#include "BCArray3D.h" + +BCAlgorithm::BCAlgorithm() : compressible(false), thixotropy(false) +{ +} ////////////////////////////////////////////////////////////////////////// void BCAlgorithm::setNodeIndex(int x1, int x2, int x3) { diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h index 7cef8205c..abc4a7072 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h @@ -47,36 +47,48 @@ class BoundaryConditions; class BCAlgorithm { public: - static const char VelocityBCAlgorithm = 0; - static const char EqDensityBCAlgorithm = 1; - static const char NonEqDensityBCAlgorithm = 2; - static const char NoSlipBCAlgorithm = 3; - static const char SlipBCAlgorithm = 4; - static const char HighViscosityNoSlipBCAlgorithm = 5; - static const char ThinWallNoSlipBCAlgorithm = 6; - static const char VelocityWithDensityBCAlgorithm = 7; - static const char NonReflectingOutflowBCAlgorithm = 8; + static const char VelocityBCAlgorithm = 0; + static const char EqDensityBCAlgorithm = 1; + static const char NonEqDensityBCAlgorithm = 2; + static const char NoSlipBCAlgorithm = 3; + static const char SlipBCAlgorithm = 4; + static const char HighViscosityNoSlipBCAlgorithm = 5; + static const char ThinWallNoSlipBCAlgorithm = 6; + static const char VelocityWithDensityBCAlgorithm = 7; + static const char NonReflectingOutflowBCAlgorithm = 8; + static const char VelocityAndThixotropyBCAlgorithm = 9; + static const char DensityAndThixotropyBCAlgorithm = 10; + static const char NoSlipAndThixotropyBCAlgorithm = 11; + static const char NonReflectingOutflowAndThixotropyBCAlgorithm = 12; + static const char VelocityWithDensityAndThixotropyBCAlgorithm = 13; + static const char BinghamModelNoSlipBCAlgorithm = 14; + static const char HerschelBulkleyModelNoSlipBCAlgorithm = 15; + static const char SimpleVelocityBCAlgorithm = 16; + -public: - BCAlgorithm() = default; - virtual ~BCAlgorithm() = default; - virtual void addDistributions(SPtr<DistributionArray3D> distributions) = 0; - void setNodeIndex(int x1, int x2, int x3); - void setBcPointer(SPtr<BoundaryConditions> bcPtr); - void setCompressible(bool c); - void setCollFactor(LBMReal cf); - char getType(); - bool isPreCollision(); - virtual SPtr<BCAlgorithm> clone() = 0; - SPtr<BCArray3D> getBcArray(); - void setBcArray(SPtr<BCArray3D> bcarray); - virtual void applyBC() = 0; +public: + BCAlgorithm(); + virtual ~BCAlgorithm() {} + + virtual void addDistributions(SPtr<DistributionArray3D> distributions) = 0; + void setNodeIndex(int x1, int x2, int x3); + void setBcPointer(SPtr<BoundaryConditions> bcPtr); + void setCompressible(bool c); + void setCollFactor(LBMReal cf); + char getType(); + bool isPreCollision(); + virtual SPtr<BCAlgorithm> clone() = 0; + SPtr<BCArray3D> getBcArray(); + void setBcArray(SPtr<BCArray3D> bcarray); + virtual void applyBC() = 0; + bool getThixotropy(){ return thixotropy;}; protected: - bool compressible{ false }; - char type; - bool preCollision; + bool compressible; + char type; + bool preCollision; + bool thixotropy; SPtr<BoundaryConditions> bcPtr; SPtr<DistributionArray3D> distributions; diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h new file mode 100644 index 000000000..a42938413 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h @@ -0,0 +1,27 @@ +#ifndef BinghamModelNoSlipBCAlgorithm_h__ +#define BinghamModelNoSlipBCAlgorithm_h__ + +#include "ThixotropyNoSlipBCAlgorithm.h" +#include "Thixotropy.h" + +class BinghamModelNoSlipBCAlgorithm : public ThixotropyNoSlipBCAlgorithm +{ +public: + BinghamModelNoSlipBCAlgorithm() + { + BCAlgorithm::type = BCAlgorithm::BinghamModelNoSlipBCAlgorithm; + BCAlgorithm::preCollision = true; + } + ~BinghamModelNoSlipBCAlgorithm() {} + SPtr<BCAlgorithm> clone() override + { + SPtr<BCAlgorithm> bc(new BinghamModelNoSlipBCAlgorithm()); + return bc; + } +protected: + LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const override + { + return Thixotropy::getBinghamCollFactor(omegaInf, shearRate, drho); + } +}; +#endif // BinghamModelNoSlipBCAlgorithm_h__ diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h index 886d1ee2d..a2c495bc1 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h @@ -47,7 +47,32 @@ class BoundaryConditions { public: - BoundaryConditions() + BoundaryConditions() + : noslipBoundaryFlags(0) + , slipBoundaryFlags(0) + , velocityBoundaryFlags(0) + , densityBoundaryFlags(0) + , wallModelBoundaryFlags(0) + , bcVelocityX1(0.0f) + , bcVelocityX2(0.0f) + , bcVelocityX3(0.0f) + , bcDensity(0.0f) + //, bcThixotropy(0.0f) + , bcLodiDensity(0.0f) + , bcLodiVelocityX1(0.0f) + , bcLodiVelocityX2(0.0f) + , bcLodiVelocityX3(0.0f) + , bcLodiLentgh(0.0f) + , nx1(0.0f) + , nx2(0.0f) + , nx3(0.0f) + , algorithmType(-1) + { + //wenn folgendes nicht geht, dann hat man weiter unten bei der bit-geschichte ein ernstes problem!!! + UB_STATIC_ASSERT( sizeof(long long) >= 8); + //UB_STATIC_ASSERT( sizeof(double) >= 16); + //UB_STATIC_ASSERT( sizeof(long long) == 32); + UB_STATIC_ASSERT( (sizeof(long long)*8) >= (D3Q27System::FENDDIR+1)*BoundaryConditions::optionDigits ); { UB_STATIC_ASSERT(sizeof(long long) >= 8); @@ -276,17 +301,20 @@ public: void setBoundaryDensity(LBMReal density) { this->bcDensity = density; } LBMReal getBoundaryDensity() { return this->bcDensity; } - // Lodi extension - void setDensityLodiDensity(const LBMReal &bcLodiDensity) { this->bcLodiDensity = bcLodiDensity; } - void setDensityLodiVelocityX1(const LBMReal &bcLodiVelocityX1) { this->bcLodiVelocityX1 = bcLodiVelocityX1; } - void setDensityLodiVelocityX2(const LBMReal &bcLodiVelocityX2) { this->bcLodiVelocityX2 = bcLodiVelocityX2; } - void setDensityLodiVelocityX3(const LBMReal &bcLodiVelocityX3) { this->bcLodiVelocityX3 = bcLodiVelocityX3; } - void setDensityLodiLength(const LBMReal &bcLodiLentgh) { this->bcLodiLentgh = bcLodiLentgh; } - LBMReal getDensityLodiDensity() const { return this->bcLodiDensity; } - LBMReal getDensityLodiVelocityX1() const { return this->bcLodiVelocityX1; } - LBMReal getDensityLodiVelocityX2() const { return this->bcLodiVelocityX2; } - LBMReal getDensityLodiVelocityX3() const { return this->bcLodiVelocityX3; } - LBMReal getDensityLodiLength() const { return this->bcLodiLentgh; } + //void setBoundaryThixotropy(float thixotropy) { this->bcDensity = thixotropy; } + //float getBoundaryThixotropy() { return this->bcThixotropy; } + + ////Lodi extension + void setDensityLodiDensity(const float& bcLodiDensity) { this->bcLodiDensity = bcLodiDensity; } + void setDensityLodiVelocityX1(const float& bcLodiVelocityX1) { this->bcLodiVelocityX1 = bcLodiVelocityX1; } + void setDensityLodiVelocityX2(const float& bcLodiVelocityX2) { this->bcLodiVelocityX2 = bcLodiVelocityX2; } + void setDensityLodiVelocityX3(const float& bcLodiVelocityX3) { this->bcLodiVelocityX3 = bcLodiVelocityX3; } + void setDensityLodiLength(const float& bcLodiLentgh) { this->bcLodiLentgh = bcLodiLentgh; } + float getDensityLodiDensity() const { return this->bcLodiDensity; } + float getDensityLodiVelocityX1() const { return this->bcLodiVelocityX1; } + float getDensityLodiVelocityX2() const { return this->bcLodiVelocityX2; } + float getDensityLodiVelocityX3() const { return this->bcLodiVelocityX3; } + float getDensityLodiLength() const { return this->bcLodiLentgh; } LBMReal &densityLodiDensity() { return this->bcLodiDensity; } LBMReal &densityLodiVelocityX1() { return this->bcLodiVelocityX1; } diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.cpp new file mode 100644 index 000000000..45b467596 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.cpp @@ -0,0 +1,89 @@ +#include "DensityAndThixotropyBCAlgorithm.h" +#include "DistributionArray3D.h" +#include "BoundaryConditions.h" + +DensityAndThixotropyBCAlgorithm::DensityAndThixotropyBCAlgorithm() +{ + BCAlgorithm::type = BCAlgorithm::DensityAndThixotropyBCAlgorithm; + BCAlgorithm::preCollision = false; + BCAlgorithm::thixotropy = true; + lambdaBC = 0.0; +} +////////////////////////////////////////////////////////////////////////// +DensityAndThixotropyBCAlgorithm::~DensityAndThixotropyBCAlgorithm() +{ + +} +////////////////////////////////////////////////////////////////////////// +SPtr<BCAlgorithm> DensityAndThixotropyBCAlgorithm::clone() +{ + SPtr<BCAlgorithm> bc(new DensityAndThixotropyBCAlgorithm()); + dynamicPointerCast<DensityAndThixotropyBCAlgorithm>(bc)->setLambdaBC(lambdaBC); + return bc; +} +////////////////////////////////////////////////////////////////////////// +void DensityAndThixotropyBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions) +{ + this->distributions = distributions; +} +////////////////////////////////////////////////////////////////////////// +//void DensityAndThixotropyBCAlgorithm::addDistributionsF(DistributionArray3DPtr distributions) +//{ +// this->distributionsf = distributions; +//} +////////////////////////////////////////////////////////////////////////// +void DensityAndThixotropyBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions) +{ + this->distributionsH = distributions; +} +////////////////////////////////////////////////////////////////////////// +void DensityAndThixotropyBCAlgorithm::applyBC() +{ + using namespace D3Q27System; + + LBMReal f[D3Q27System::ENDF + 1]; + LBMReal feq[D3Q27System::ENDF + 1]; + LBMReal h[D3Q27System::ENDF + 1]; + LBMReal heq[D3Q27System::ENDF + 1]; + distributions->getDistributionInv(f, x1, x2, x3); + distributionsH->getDistributionInv(h, x1, x2, x3); + + LBMReal rho, vx1, vx2, vx3; + + calcMacrosFct(f, rho, vx1, vx2, vx3); + calcFeqFct(feq, rho, vx1, vx2, vx3); + + LBMReal lambda = D3Q27System::getDensity(h); + D3Q27System::calcCompFeq(heq, lambda, vx1, vx2, vx3); + + + int nx1 = x1; + int nx2 = x2; + int nx3 = x3; + int direction = -1; + + //flag points in direction of fluid + if (bcPtr->hasDensityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; direction = D3Q27System::E; } + else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::W)) { nx1 += 1; direction = D3Q27System::W; } + else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; direction = D3Q27System::N; } + else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::S)) { nx2 += 1; direction = D3Q27System::S; } + else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; direction = D3Q27System::T; } + else if (bcPtr->hasDensityBoundaryFlag(D3Q27System::B)) { nx3 += 1; direction = D3Q27System::B; } + else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary...")); + + LBMReal rhoBC = bcPtr->getBoundaryDensity(); + + for (int fdir = D3Q27System::STARTF; fdir <= D3Q27System::ENDF; fdir++) + { + if (bcPtr->hasDensityBoundaryFlag(fdir)) + { + LBMReal ftemp = calcFeqsForDirFct(fdir, rho, vx1, vx2, vx3); + ftemp = calcFeqsForDirFct(fdir, rhoBC, vx1, vx2, vx3) + f[fdir] - ftemp; + distributions->setDistributionForDirection(ftemp, nx1, nx2, nx3, fdir); + + LBMReal htemp = D3Q27System::getCompFeqForDirection(fdir, lambda, vx1, vx2, vx3); + htemp = D3Q27System::getCompFeqForDirection(fdir,lambdaBC, vx1, vx2, vx3) + h[fdir] - htemp; + distributionsH->setDistributionForDirection(htemp, nx1, nx2, nx3, fdir); + } + } +} diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.h new file mode 100644 index 000000000..069b6f1c6 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.h @@ -0,0 +1,25 @@ +#ifndef DensityAndThixotropyBCAlgorithm_h__ +#define DensityAndThixotropyBCAlgorithm_h__ + +#include "BCAlgorithm.h" + + +class DensityAndThixotropyBCAlgorithm : public BCAlgorithm +{ +public: + DensityAndThixotropyBCAlgorithm(); + virtual ~DensityAndThixotropyBCAlgorithm(); + SPtr<BCAlgorithm> clone(); + void addDistributions(SPtr<DistributionArray3D> distributions); + //void addDistributionsF(SPtr<DistributionArray3D> distributions); + void addDistributionsH(SPtr<DistributionArray3D> distributions); + void applyBC(); + void setLambdaBC(LBMReal lambda) { this->lambdaBC = lambda; } + LBMReal getLambdaBC() { return this->lambdaBC; } +protected: + SPtr<DistributionArray3D> distributionsH; +private: + LBMReal lambdaBC; +}; +#endif // DensityAndThixotropyBCAlgorithm_h__ + diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/HerschelBulkleyModelNoSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/HerschelBulkleyModelNoSlipBCAlgorithm.h new file mode 100644 index 000000000..46bfbd193 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/HerschelBulkleyModelNoSlipBCAlgorithm.h @@ -0,0 +1,27 @@ +#ifndef HerschelBulkleyModelNoSlipBCAlgorithm_h__ +#define HerschelBulkleyModelNoSlipBCAlgorithm_h__ + +#include "ThixotropyNoSlipBCAlgorithm.h" +#include "Thixotropy.h" + +class HerschelBulkleyModelNoSlipBCAlgorithm : public ThixotropyNoSlipBCAlgorithm +{ +public: + HerschelBulkleyModelNoSlipBCAlgorithm() + { + BCAlgorithm::type = BCAlgorithm::HerschelBulkleyModelNoSlipBCAlgorithm; + BCAlgorithm::preCollision = true; + } + ~HerschelBulkleyModelNoSlipBCAlgorithm() {} + SPtr<BCAlgorithm> clone() override + { + SPtr<BCAlgorithm> bc(new HerschelBulkleyModelNoSlipBCAlgorithm()); + return bc; + } +protected: + LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const override + { + return Thixotropy::getHerschelBulkleyCollFactor(omegaInf, shearRate, drho); + } +}; +#endif // HerschelBulkleyModelNoSlipBCAlgorithm_h__ \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.cpp new file mode 100644 index 000000000..cfed98d78 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.cpp @@ -0,0 +1,70 @@ +#include "NoSlipAndThixotropyBCAlgorithm.h" +#include "DistributionArray3D.h" +#include "BoundaryConditions.h" + +NoSlipAndThixotropyBCAlgorithm::NoSlipAndThixotropyBCAlgorithm() +{ + BCAlgorithm::type = BCAlgorithm::NoSlipAndThixotropyBCAlgorithm; + BCAlgorithm::preCollision = false; + BCAlgorithm::thixotropy = true; + +} +////////////////////////////////////////////////////////////////////////// +NoSlipAndThixotropyBCAlgorithm::~NoSlipAndThixotropyBCAlgorithm() +{ + +} +////////////////////////////////////////////////////////////////////////// +SPtr<BCAlgorithm> NoSlipAndThixotropyBCAlgorithm::clone() +{ + SPtr<BCAlgorithm> bc(new NoSlipAndThixotropyBCAlgorithm()); + return bc; +} +////////////////////////////////////////////////////////////////////////// +void NoSlipAndThixotropyBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions) +{ + this->distributions = distributions; +} +////////////////////////////////////////////////////////////////////////// +//void NoSlipAndThixotropyBCAlgorithm::addDistributionsF(SPtr<DistributionArray3D> distributions) +//{ +// this->distributionsf = distributions; +//} +////////////////////////////////////////////////////////////////////////// +void NoSlipAndThixotropyBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions) +{ + this->distributionsH = distributions; +} +////////////////////////////////////////////////////////////////////////// +void NoSlipAndThixotropyBCAlgorithm::applyBC() +{ + LBMReal f[D3Q27System::ENDF + 1]; + LBMReal feq[D3Q27System::ENDF + 1]; + LBMReal h[D3Q27System::ENDF + 1]; + LBMReal heq[D3Q27System::ENDF + 1]; + distributions->getDistributionInv(f, x1, x2, x3); + distributionsH->getDistributionInv(h, x1, x2, x3); + LBMReal rho, vx1, vx2, vx3;//, concentration, fl1, fl2, fl3, m100; + calcMacrosFct(f, rho, vx1, vx2, vx3); + calcFeqFct(feq, rho, vx1, vx2, vx3); + + //calcDiffusionMacrosFctPost(h, concentration, fl1, fl2, fl3, m100, collFactor); + LBMReal lambda = D3Q27System::getDensity(h); + D3Q27System::calcCompFeq(heq, lambda, 0., 0., 0.); + + for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) + { + if (bcPtr->hasNoSlipBoundaryFlag(fdir)) + { + //quadratic bounce back + const int invDir = D3Q27System::INVDIR[fdir]; + LBMReal q = bcPtr->getQ(invDir); + LBMReal fReturnf = ((1.0 - q) / (1.0 + q))*((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir]) + ((q / (1.0 + q))*(f[invDir] + f[fdir])); + LBMReal fReturnh = ((1.0 - q) / (1.0 + q))*((h[invDir] - heq[invDir]) / (1.0 - collFactor) + heq[invDir]) + ((q / (1.0 + q))*(h[invDir] + h[fdir])); + + distributions->setDistributionForDirection(fReturnf, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir); + distributionsH->setDistributionForDirection(fReturnh, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir); + + } + } +} diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.h new file mode 100644 index 000000000..a7225e393 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NoSlipAndThixotropyBCAlgorithm.h @@ -0,0 +1,22 @@ +#ifndef NoSlipAndThixotropyBCAlgorithm_h__ +#define NoSlipAndThixotropyBCAlgorithm_h__ + +#include "BCAlgorithm.h" + +class NoSlipAndThixotropyBCAlgorithm : public BCAlgorithm +{ +public: + NoSlipAndThixotropyBCAlgorithm(); + virtual ~NoSlipAndThixotropyBCAlgorithm(); + SPtr<BCAlgorithm> clone(); + void addDistributions(SPtr<DistributionArray3D> distributions); + //void addDistributionsF(DistributionArray3DPtr distributions); + void addDistributionsH(SPtr<DistributionArray3D> distributions); + void applyBC(); +protected: + SPtr<DistributionArray3D> distributionsH; +private: + +}; +#endif // NoSlipAndThixotropyBCAlgorithm_h__ + diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.cpp new file mode 100644 index 000000000..006f45619 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.cpp @@ -0,0 +1,339 @@ +#include "NonReflectingOutflowAndThixotropyBCAlgorithm.h" +#include "DistributionArray3D.h" +#include "BoundaryConditions.h" + +NonReflectingOutflowAndThixotropyBCAlgorithm::NonReflectingOutflowAndThixotropyBCAlgorithm() +{ + BCAlgorithm::type = BCAlgorithm::NonReflectingOutflowAndThixotropyBCAlgorithm; + BCAlgorithm::preCollision = true; + BCAlgorithm::thixotropy = true; +} +////////////////////////////////////////////////////////////////////////// +NonReflectingOutflowAndThixotropyBCAlgorithm::~NonReflectingOutflowAndThixotropyBCAlgorithm() +{ + +} +////////////////////////////////////////////////////////////////////////// +SPtr<BCAlgorithm> NonReflectingOutflowAndThixotropyBCAlgorithm::clone() +{ + SPtr<BCAlgorithm> bc(new NonReflectingOutflowAndThixotropyBCAlgorithm()); + return bc; +} +////////////////////////////////////////////////////////////////////////// +void NonReflectingOutflowAndThixotropyBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions) +{ + this->distributions = distributions; +} +////////////////////////////////////////////////////////////////////////// +//void NonReflectingOutflowAndThixotropyBCAlgorithm::addDistributionsF(DistributionArray3DPtr distributions) +//{ +// this->distributionsf = distributions; +//} +////////////////////////////////////////////////////////////////////////// +void NonReflectingOutflowAndThixotropyBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions) +{ + this->distributionsH = distributions; +} +////////////////////////////////////////////////////////////////////////// +void NonReflectingOutflowAndThixotropyBCAlgorithm::applyBC() +{ + using namespace D3Q27System; + LBMReal f[ENDF + 1]; + LBMReal ftemp[ENDF + 1]; + + int nx1 = x1; + int nx2 = x2; + int nx3 = x3; + int direction = -1; + + //flag points in direction of fluid + if (bcPtr->hasDensityBoundaryFlag(E)) { nx1 += 1; direction = E; } + else if (bcPtr->hasDensityBoundaryFlag(W)) { nx1 -= 1; direction = W; } + else if (bcPtr->hasDensityBoundaryFlag(N)) { nx2 += 1; direction = N; } + else if (bcPtr->hasDensityBoundaryFlag(S)) { nx2 -= 1; direction = S; } + else if (bcPtr->hasDensityBoundaryFlag(T)) { nx3 += 1; direction = T; } + else if (bcPtr->hasDensityBoundaryFlag(B)) { nx3 -= 1; direction = B; } + else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on density boundary...")); + + distributions->getDistribution(f, x1, x2, x3); + distributions->getDistribution(ftemp, nx1, nx2, nx3); + + LBMReal rho, vx1, vx2, vx3; + calcMacrosFct(f, rho, vx1, vx2, vx3); + + switch (direction) + { + case E: + f[E] = ftemp[E] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[E]; + f[NE] = ftemp[NE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[NE]; + f[SE] = ftemp[SE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[SE]; + f[TE] = ftemp[TE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[TE]; + f[BE] = ftemp[BE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[BE]; + f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[TNE]; + f[TSE] = ftemp[TSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[TSE]; + f[BNE] = ftemp[BNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[BNE]; + f[BSE] = ftemp[BSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * f[BSE]; + + distributions->setDistributionInvForDirection(f[E], x1 + DX1[W], x2 + DX2[W], x3 + DX3[W], W); + distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW); + distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW); + distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW); + distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW); + distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); + distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); + distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); + distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); + break; + case W: + f[W] = ftemp[W] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[W]; + f[NW] = ftemp[NW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[NW]; + f[SW] = ftemp[SW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[SW]; + f[TW] = ftemp[TW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[TW]; + f[BW] = ftemp[BW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[BW]; + f[TNW] = ftemp[TNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[TNW]; + f[TSW] = ftemp[TSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[TSW]; + f[BNW] = ftemp[BNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[BNW]; + f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * f[BSW]; + + distributions->setDistributionInvForDirection(f[W], x1 + DX1[E], x2 + DX2[E], x3 + DX3[E], E); + distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE); + distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE); + distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE); + distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE); + distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); + distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); + distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); + distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + break; + case N: + f[N] = ftemp[N] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[N]; + f[NE] = ftemp[NE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[NE]; + f[NW] = ftemp[NW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[NW]; + f[TN] = ftemp[TN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[TN]; + f[BN] = ftemp[BN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[BN]; + f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[TNE]; + f[TNW] = ftemp[TNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[TNW]; + f[BNE] = ftemp[BNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[BNE]; + f[BNW] = ftemp[BNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * f[BNW]; + + distributions->setDistributionInvForDirection(f[N], x1 + DX1[S], x2 + DX2[S], x3 + DX3[S], S); + distributions->setDistributionInvForDirection(f[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW); + distributions->setDistributionInvForDirection(f[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE); + distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS); + distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS); + distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); + distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); + distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); + distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); + break; + case S: + f[S] = ftemp[S] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[S]; + f[SE] = ftemp[SE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[SE]; + f[SW] = ftemp[SW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[SW]; + f[TS] = ftemp[TS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[TS]; + f[BS] = ftemp[BS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[BS]; + f[TSE] = ftemp[TSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[TSE]; + f[TSW] = ftemp[TSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[TSW]; + f[BSE] = ftemp[BSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[BSE]; + f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * f[BSW]; + + distributions->setDistributionInvForDirection(f[S], x1 + DX1[N], x2 + DX2[N], x3 + DX3[N], N); + distributions->setDistributionInvForDirection(f[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW); + distributions->setDistributionInvForDirection(f[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE); + distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN); + distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN); + distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); + distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); + distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); + distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + break; + case T: + f[T] = ftemp[T] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[T]; + f[TE] = ftemp[TE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TE]; + f[TW] = ftemp[TW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TW]; + f[TN] = ftemp[TN] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TN]; + f[TS] = ftemp[TS] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TS]; + f[TNE] = ftemp[TNE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TNE]; + f[TNW] = ftemp[TNW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TNW]; + f[TSE] = ftemp[TSE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TSE]; + f[TSW] = ftemp[TSW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * f[TSW]; + + distributions->setDistributionInvForDirection(f[T], x1 + DX1[B], x2 + DX2[B], x3 + DX3[B], B); + distributions->setDistributionInvForDirection(f[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW); + distributions->setDistributionInvForDirection(f[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE); + distributions->setDistributionInvForDirection(f[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS); + distributions->setDistributionInvForDirection(f[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN); + distributions->setDistributionInvForDirection(f[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); + distributions->setDistributionInvForDirection(f[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); + distributions->setDistributionInvForDirection(f[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); + distributions->setDistributionInvForDirection(f[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); + break; + case B: + f[B] = ftemp[B] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[B]; + f[BE] = ftemp[BE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BE]; + f[BW] = ftemp[BW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BW]; + f[BN] = ftemp[BN] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BN]; + f[BS] = ftemp[BS] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BS]; + f[BNE] = ftemp[BNE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BNE]; + f[BNW] = ftemp[BNW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BNW]; + f[BSE] = ftemp[BSE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BSE]; + f[BSW] = ftemp[BSW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * f[BSW]; + + distributions->setDistributionInvForDirection(f[B], x1 + DX1[T], x2 + DX2[T], x3 + DX3[T], T); + distributions->setDistributionInvForDirection(f[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW); + distributions->setDistributionInvForDirection(f[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE); + distributions->setDistributionInvForDirection(f[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS); + distributions->setDistributionInvForDirection(f[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN); + distributions->setDistributionInvForDirection(f[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); + distributions->setDistributionInvForDirection(f[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); + distributions->setDistributionInvForDirection(f[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); + distributions->setDistributionInvForDirection(f[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + break; + default: + UB_THROW(UbException(UB_EXARGS, "It isn't implemented non reflecting density boundary for this direction!")); + } + LBMReal h[D3Q27System::ENDF + 1]; + LBMReal htemp[ENDF + 1]; + + distributionsH->getDistribution(h, x1, x2, x3); + distributionsH->getDistribution(htemp, nx1, nx2, nx3); + + vx1 = 0.0; + vx2 = 0.0; + vx3 = 0.0; + + //LBMReal rho, vx1, vx2, vx3; + //calcMacrosFct(f, rho, vx1, vx2, vx3); + + switch (direction) + { + case E: + h[E] = htemp[E] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[E]; + h[NE] = htemp[NE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[NE]; + h[SE] = htemp[SE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[SE]; + h[TE] = htemp[TE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[TE]; + h[BE] = htemp[BE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[BE]; + h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[TNE]; + h[TSE] = htemp[TSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[TSE]; + h[BNE] = htemp[BNE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[BNE]; + h[BSE] = htemp[BSE] * (one_over_sqrt3 + vx1) + (1.0 - one_over_sqrt3 - vx1) * h[BSE]; + + distributionsH->setDistributionInvForDirection(h[E], x1 + DX1[W], x2 + DX2[W], x3 + DX3[W], W); + distributionsH->setDistributionInvForDirection(h[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW); + distributionsH->setDistributionInvForDirection(h[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW); + distributionsH->setDistributionInvForDirection(h[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW); + distributionsH->setDistributionInvForDirection(h[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW); + distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); + distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); + distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); + distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); + break; + case W: + h[W] = htemp[W] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[W]; + h[NW] = htemp[NW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[NW]; + h[SW] = htemp[SW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[SW]; + h[TW] = htemp[TW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[TW]; + h[BW] = htemp[BW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[BW]; + h[TNW] = htemp[TNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[TNW]; + h[TSW] = htemp[TSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[TSW]; + h[BNW] = htemp[BNW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[BNW]; + h[BSW] = htemp[BSW] * (one_over_sqrt3 - vx1) + (1.0 - one_over_sqrt3 + vx1) * h[BSW]; + + distributionsH->setDistributionInvForDirection(h[W], x1 + DX1[E], x2 + DX2[E], x3 + DX3[E], E); + distributionsH->setDistributionInvForDirection(h[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE); + distributionsH->setDistributionInvForDirection(h[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE); + distributionsH->setDistributionInvForDirection(h[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE); + distributionsH->setDistributionInvForDirection(h[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE); + distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); + distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); + distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); + distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + break; + case N: + h[N] = htemp[N] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[N]; + h[NE] = htemp[NE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[NE]; + h[NW] = htemp[NW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[NW]; + h[TN] = htemp[TN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[TN]; + h[BN] = htemp[BN] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[BN]; + h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[TNE]; + h[TNW] = htemp[TNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[TNW]; + h[BNE] = htemp[BNE] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[BNE]; + h[BNW] = htemp[BNW] * (one_over_sqrt3 + vx2) + (1.0 - one_over_sqrt3 - vx2) * h[BNW]; + + distributionsH->setDistributionInvForDirection(h[N], x1 + DX1[S], x2 + DX2[S], x3 + DX3[S], S); + distributionsH->setDistributionInvForDirection(h[NE], x1 + DX1[SW], x2 + DX2[SW], x3 + DX3[SW], SW); + distributionsH->setDistributionInvForDirection(h[NW], x1 + DX1[SE], x2 + DX2[SE], x3 + DX3[SE], SE); + distributionsH->setDistributionInvForDirection(h[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS); + distributionsH->setDistributionInvForDirection(h[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS); + distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); + distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); + distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); + distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); + break; + case S: + h[S] = htemp[S] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[S]; + h[SE] = htemp[SE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[SE]; + h[SW] = htemp[SW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[SW]; + h[TS] = htemp[TS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[TS]; + h[BS] = htemp[BS] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[BS]; + h[TSE] = htemp[TSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[TSE]; + h[TSW] = htemp[TSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[TSW]; + h[BSE] = htemp[BSE] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[BSE]; + h[BSW] = htemp[BSW] * (one_over_sqrt3 - vx2) + (1.0 - one_over_sqrt3 + vx2) * h[BSW]; + + distributionsH->setDistributionInvForDirection(h[S], x1 + DX1[N], x2 + DX2[N], x3 + DX3[N], N); + distributionsH->setDistributionInvForDirection(h[SE], x1 + DX1[NW], x2 + DX2[NW], x3 + DX3[NW], NW); + distributionsH->setDistributionInvForDirection(h[SW], x1 + DX1[NE], x2 + DX2[NE], x3 + DX3[NE], NE); + distributionsH->setDistributionInvForDirection(h[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN); + distributionsH->setDistributionInvForDirection(h[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN); + distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); + distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); + distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); + distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + break; + case T: + h[T] = htemp[T] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[T]; + h[TE] = htemp[TE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TE]; + h[TW] = htemp[TW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TW]; + h[TN] = htemp[TN] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TN]; + h[TS] = htemp[TS] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TS]; + h[TNE] = htemp[TNE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TNE]; + h[TNW] = htemp[TNW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TNW]; + h[TSE] = htemp[TSE] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TSE]; + h[TSW] = htemp[TSW] * (one_over_sqrt3 + vx3) + (1.0 - one_over_sqrt3 - vx3) * h[TSW]; + + distributionsH->setDistributionInvForDirection(h[T], x1 + DX1[B], x2 + DX2[B], x3 + DX3[B], B); + distributionsH->setDistributionInvForDirection(h[TE], x1 + DX1[BW], x2 + DX2[BW], x3 + DX3[BW], BW); + distributionsH->setDistributionInvForDirection(h[TW], x1 + DX1[BE], x2 + DX2[BE], x3 + DX3[BE], BE); + distributionsH->setDistributionInvForDirection(h[TN], x1 + DX1[BS], x2 + DX2[BS], x3 + DX3[BS], BS); + distributionsH->setDistributionInvForDirection(h[TS], x1 + DX1[BN], x2 + DX2[BN], x3 + DX3[BN], BN); + distributionsH->setDistributionInvForDirection(h[TNE], x1 + DX1[BSW], x2 + DX2[BSW], x3 + DX3[BSW], BSW); + distributionsH->setDistributionInvForDirection(h[TNW], x1 + DX1[BSE], x2 + DX2[BSE], x3 + DX3[BSE], BSE); + distributionsH->setDistributionInvForDirection(h[TSE], x1 + DX1[BNW], x2 + DX2[BNW], x3 + DX3[BNW], BNW); + distributionsH->setDistributionInvForDirection(h[TSW], x1 + DX1[BNE], x2 + DX2[BNE], x3 + DX3[BNE], BNE); + break; + case B: + h[B] = htemp[B] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[B]; + h[BE] = htemp[BE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BE]; + h[BW] = htemp[BW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BW]; + h[BN] = htemp[BN] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BN]; + h[BS] = htemp[BS] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BS]; + h[BNE] = htemp[BNE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BNE]; + h[BNW] = htemp[BNW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BNW]; + h[BSE] = htemp[BSE] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BSE]; + h[BSW] = htemp[BSW] * (one_over_sqrt3 - vx3) + (1.0 - one_over_sqrt3 + vx3) * h[BSW]; + + distributionsH->setDistributionInvForDirection(h[B], x1 + DX1[T], x2 + DX2[T], x3 + DX3[T], T); + distributionsH->setDistributionInvForDirection(h[BE], x1 + DX1[TW], x2 + DX2[TW], x3 + DX3[TW], TW); + distributionsH->setDistributionInvForDirection(h[BW], x1 + DX1[TE], x2 + DX2[TE], x3 + DX3[TE], TE); + distributionsH->setDistributionInvForDirection(h[BN], x1 + DX1[TS], x2 + DX2[TS], x3 + DX3[TS], TS); + distributionsH->setDistributionInvForDirection(h[BS], x1 + DX1[TN], x2 + DX2[TN], x3 + DX3[TN], TN); + distributionsH->setDistributionInvForDirection(h[BNE], x1 + DX1[TSW], x2 + DX2[TSW], x3 + DX3[TSW], TSW); + distributionsH->setDistributionInvForDirection(h[BNW], x1 + DX1[TSE], x2 + DX2[TSE], x3 + DX3[TSE], TSE); + distributionsH->setDistributionInvForDirection(h[BSE], x1 + DX1[TNW], x2 + DX2[TNW], x3 + DX3[TNW], TNW); + distributionsH->setDistributionInvForDirection(h[BSW], x1 + DX1[TNE], x2 + DX2[TNE], x3 + DX3[TNE], TNE); + break; + default: + UB_THROW(UbException(UB_EXARGS, "It isn't implemented non reflecting density boundary for this direction!")); + } +} diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.h new file mode 100644 index 000000000..8c096a5e5 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/NonReflectingOutflowAndThixotropyBCAlgorithm.h @@ -0,0 +1,25 @@ +#ifndef NonReflectingOutflowAndThixotropyBCAlgorithm_h__ +#define NonReflectingOutflowAndThixotropyBCAlgorithm_h__ + +#include "BCAlgorithm.h" + + +class NonReflectingOutflowAndThixotropyBCAlgorithm : public BCAlgorithm +{ +public: + NonReflectingOutflowAndThixotropyBCAlgorithm(); + virtual ~NonReflectingOutflowAndThixotropyBCAlgorithm(); + SPtr<BCAlgorithm> clone(); + void addDistributions(SPtr<DistributionArray3D> distributions); + //void addDistributionsF(SPtr<DistributionArray3D> distributions); + void addDistributionsH(SPtr<DistributionArray3D> distributions); + void applyBC(); + //void setLambdaBC(LBMReal lambda) { this->lambdaBC = lambda; } + //LBMReal getLambdaBC() { return this->lambdaBC; } +protected: + SPtr<DistributionArray3D> distributionsH; +private: + //LBMReal lambdaBC; +}; +#endif // NonReflectingOutflowAndThixotropyBCAlgorithm_h__ + diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp new file mode 100644 index 000000000..a86ee50d5 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp @@ -0,0 +1,83 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ \ +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// This file is part of VirtualFluids. VirtualFluids is free software: you can +// redistribute it and/or modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. +// +//! \file SimpleVelocityBCAlgorithm.cpp +//! \ingroup BoundarConditions +//! \author Konstantin Kutscher +//======================================================================================= + +#include "SimpleVelocityBCAlgorithm.h" +#include "DistributionArray3D.h" +#include "BoundaryConditions.h" + +SimpleVelocityBCAlgorithm::SimpleVelocityBCAlgorithm() +{ + BCAlgorithm::type = BCAlgorithm::SimpleVelocityBCAlgorithm; + BCAlgorithm::preCollision = false; +} +////////////////////////////////////////////////////////////////////////// +SimpleVelocityBCAlgorithm::~SimpleVelocityBCAlgorithm() +{ +} +////////////////////////////////////////////////////////////////////////// +SPtr<BCAlgorithm> SimpleVelocityBCAlgorithm::clone() +{ + SPtr<BCAlgorithm> bc(new SimpleVelocityBCAlgorithm()); + return bc; +} +////////////////////////////////////////////////////////////////////////// +void SimpleVelocityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions) +{ + this->distributions = distributions; +} +////////////////////////////////////////////////////////////////////////// +void SimpleVelocityBCAlgorithm::applyBC() +{ + LBMReal f[D3Q27System::ENDF+1]; + LBMReal feq[D3Q27System::ENDF+1]; + distributions->getDistributionInv(f, x1, x2, x3); + LBMReal rho, vx1, vx2, vx3, drho; + calcMacrosFct(f, drho, vx1, vx2, vx3); + calcFeqFct(feq, drho, vx1, vx2, vx3); + + rho = 1.0+drho*compressibleFactor; + + for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++) + { + if (bcPtr->hasVelocityBoundaryFlag(fdir)) + { + const int invDir = D3Q27System::INVDIR[fdir]; + LBMReal q = bcPtr->getQ(invDir); + LBMReal velocity = bcPtr->getBoundaryVelocity(invDir); + LBMReal fReturn = f[invDir] - velocity; + distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); + } + } + +} + diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.h new file mode 100644 index 000000000..714276760 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.h @@ -0,0 +1,54 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// This file is part of VirtualFluids. VirtualFluids is free software: you can +// redistribute it and/or modify it under the terms of the GNU General Public +// License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. +// +// You should have received a copy of the GNU General Public License along +// with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. +// +//! \file SimpleVelocityBCAlgorithm.h +//! \ingroup BoundarConditions +//! \author Konstantin Kutscher +//======================================================================================= + +#ifndef SimpleVelocityBCAlgorithm_H +#define SimpleVelocityBCAlgorithm_H + +#include "BCAlgorithm.h" +#include <PointerDefinitions.h> + +class DistributionArray3D; + +//! \brief A class implements velocyty boundary condition +class SimpleVelocityBCAlgorithm : public BCAlgorithm +{ +public: + SimpleVelocityBCAlgorithm(); + ~SimpleVelocityBCAlgorithm(); + SPtr<BCAlgorithm> clone(); + void addDistributions(SPtr<DistributionArray3D> distributions); + void applyBC() override; +}; + +#endif + diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp new file mode 100644 index 000000000..083b8703e --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp @@ -0,0 +1,41 @@ +#include "ThixotropyNoSlipBCAlgorithm.h" +#include "DistributionArray3D.h" +#include "BoundaryConditions.h" + +ThixotropyNoSlipBCAlgorithm::ThixotropyNoSlipBCAlgorithm() +{ +} +////////////////////////////////////////////////////////////////////////// +ThixotropyNoSlipBCAlgorithm::~ThixotropyNoSlipBCAlgorithm() +{ +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyNoSlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions) +{ + this->distributions = distributions; +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyNoSlipBCAlgorithm::applyBC() +{ + LBMReal f[D3Q27System::ENDF + 1]; + LBMReal feq[D3Q27System::ENDF + 1]; + distributions->getDistribution(f, x1, x2, x3); + LBMReal rho, vx1, vx2, vx3; + calcMacrosFct(f, rho, vx1, vx2, vx3); + calcFeqFct(feq, rho, vx1, vx2, vx3); + + for (int fDir = D3Q27System::FSTARTDIR; fDir <= D3Q27System::FENDDIR; fDir++) + { + if (bcPtr->hasNoSlipBoundaryFlag(fDir)) + { + LBMReal shearRate = D3Q27System::getShearRate(f, collFactor); + LBMReal collFactorF = getThyxotropyCollFactor(collFactor, shearRate, rho); + + //quadratic bounce back + const int invDir = D3Q27System::INVDIR[fDir]; + LBMReal q = bcPtr->getQ(invDir); + LBMReal fReturn =(f[invDir] + q * f[fDir] + q * collFactorF * (feq[invDir] - f[invDir] + feq[fDir] - f[fDir])) / (1.0 + q); + distributions->setDistributionInvForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], invDir); + } + } +} \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h new file mode 100644 index 000000000..284cbbf2f --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.h @@ -0,0 +1,20 @@ +#ifndef ThixotropyNoSlipBCAlgorithm_h__ +#define ThixotropyNoSlipBCAlgorithm_h__ + +#include "BCAlgorithm.h" +#include <PointerDefinitions.h> + +class DistributionArray3D; + +class ThixotropyNoSlipBCAlgorithm : public BCAlgorithm +{ +public: + ThixotropyNoSlipBCAlgorithm(); + ~ThixotropyNoSlipBCAlgorithm(); + virtual SPtr<BCAlgorithm> clone() override { UB_THROW(UbException("LBMReal clone() - belongs in the derived class")); } + void addDistributions(SPtr<DistributionArray3D> distributions); + void applyBC() override; +protected: + virtual LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const = 0; // { UB_THROW(UbException("LBMReal getThyxotropyCollFactor() - belongs in the derived class")); } +}; +#endif // ThixotropyNoSlipBCAlgorithm_h__ diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.cpp new file mode 100644 index 000000000..575521827 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.cpp @@ -0,0 +1,105 @@ +#include "VelocityAndThixotropyBCAlgorithm.h" +#include "DistributionArray3D.h" +#include "BoundaryConditions.h" + +VelocityAndThixotropyBCAlgorithm::VelocityAndThixotropyBCAlgorithm() +{ + BCAlgorithm::type = BCAlgorithm::VelocityAndThixotropyBCAlgorithm; + BCAlgorithm::preCollision = false; + BCAlgorithm::thixotropy = true; + lambdaBC = 0.0; +} +////////////////////////////////////////////////////////////////////////// +VelocityAndThixotropyBCAlgorithm::~VelocityAndThixotropyBCAlgorithm() +{ + +} +////////////////////////////////////////////////////////////////////////// +SPtr<BCAlgorithm> VelocityAndThixotropyBCAlgorithm::clone() +{ + SPtr<BCAlgorithm> bc(new VelocityAndThixotropyBCAlgorithm()); + dynamicPointerCast<VelocityAndThixotropyBCAlgorithm>(bc)->setLambdaBC(lambdaBC); + return bc; +} +////////////////////////////////////////////////////////////////////////// +void VelocityAndThixotropyBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions) +{ + this->distributions = distributions; +} +////////////////////////////////////////////////////////////////////////// +//void VelocityAndThixotropyBCAlgorithm::addDistributionsF(DistributionArray3DPtr distributions) +//{ +// this->distributionsf = distributions; +//} +////////////////////////////////////////////////////////////////////////// +void VelocityAndThixotropyBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions) +{ + this->distributionsH = distributions; +} +////////////////////////////////////////////////////////////////////////// +void VelocityAndThixotropyBCAlgorithm::applyBC() +{ + LBMReal f[D3Q27System::ENDF + 1]; + LBMReal feq[D3Q27System::ENDF + 1]; + LBMReal h[D3Q27System::ENDF + 1]; + + distributions->getDistributionInv(f, x1, x2, x3); + distributionsH->getDistributionInv(h, x1, x2, x3); + + LBMReal rho, vx1, vx2, vx3, drho; + calcMacrosFct(f, drho, vx1, vx2, vx3); + calcFeqFct(feq, drho, vx1, vx2, vx3); + + rho = 1.0 + drho * compressibleFactor; + + //calcDiffusionMacrosFctPost(h, concentration, fl1, fl2, fl3, m100, collFactor); + LBMReal lambda = D3Q27System::getDensity(h); + + int nx1 = x1; + int nx2 = x2; + int nx3 = x3; + int direction = -1; + + //flag points in direction of fluid + if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; direction = D3Q27System::E; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; direction = D3Q27System::W; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; direction = D3Q27System::N; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; direction = D3Q27System::S; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; direction = D3Q27System::T; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; direction = D3Q27System::B; } + else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary...")); + + //lambdaBC = bcPtr->getBoundaryThixotropy(); + + //LBMReal rhoBC = bcPtr->getBoundaryDensity(); + + //for (int fdir = D3Q27System::STARTF; fdir <= D3Q27System::ENDF; fdir++) + //{ + // if (bcPtr->hasDensityBoundaryFlag(fdir)) + // { + // LBMReal ftemp = calcFeqsForDirFct(fdir, rho, vx1, vx2, vx3); + // ftemp = calcFeqsForDirFct(fdir, rhoBC, vx1, vx2, vx3) + f[fdir] - ftemp; + // distributions->setDistributionForDirection(ftemp, nx1, nx2, nx3, fdir); + + // LBMReal htemp = D3Q27System::getCompFeqForDirection(fdir, lambda, vx1, vx2, vx3); + // htemp = D3Q27System::getCompFeqForDirection(fdir,lambdaBC, vx1, vx2, vx3) + h[fdir] - htemp; + // distributionsH->setDistributionForDirection(htemp, nx1, nx2, nx3, fdir); + // } + //} + + for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) + { + if (bcPtr->hasVelocityBoundaryFlag(fdir)) + { + const int invDir = D3Q27System::INVDIR[fdir]; + LBMReal q = bcPtr->getQ(invDir);// m+m q=0 stabiler + LBMReal velocity = bcPtr->getBoundaryVelocity(invDir); + LBMReal fReturn = ((1.0 - q) / (1.0 + q)) * ((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir]) + ((q * (f[invDir] + f[fdir]) - velocity * rho) / (1.0 + q)); + distributions->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir); + + LBMReal htemp = D3Q27System::getCompFeqForDirection(fdir, lambda, vx1, vx2, vx3); + htemp = D3Q27System::getCompFeqForDirection(fdir, lambdaBC, vx1, vx2, vx3) + h[fdir] - htemp; + distributionsH->setDistributionForDirection(htemp, nx1, nx2, nx3, fdir); + } + } +} diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.h new file mode 100644 index 000000000..0ab2e83c9 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityAndThixotropyBCAlgorithm.h @@ -0,0 +1,24 @@ +#ifndef VelocityAndThixotropyBCAlgorithm_h__ +#define VelocityAndThixotropyBCAlgorithm_h__ + +#include "BCAlgorithm.h" + + +class VelocityAndThixotropyBCAlgorithm : public BCAlgorithm +{ +public: + VelocityAndThixotropyBCAlgorithm(); + virtual ~VelocityAndThixotropyBCAlgorithm(); + SPtr<BCAlgorithm> clone(); + void addDistributions(SPtr<DistributionArray3D> distributions); + void addDistributionsH(SPtr<DistributionArray3D> distributions); + void applyBC(); + void setLambdaBC(LBMReal lambda) { this->lambdaBC = lambda; } + LBMReal getLambdaBC() { return this->lambdaBC; } +protected: + SPtr<DistributionArray3D> distributionsH; +private: + LBMReal lambdaBC; +}; +#endif // VelocityAndThixotropyBCAlgorithm_h__ + diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.cpp new file mode 100644 index 000000000..d08d112d4 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.cpp @@ -0,0 +1,100 @@ +#include "VelocityWithDensityAndThixotropyBCAlgorithm.h" +#include "DistributionArray3D.h" +#include "BCArray3D.h" + +VelocityWithDensityAndThixotropyBCAlgorithm::VelocityWithDensityAndThixotropyBCAlgorithm() +{ + BCAlgorithm::type = BCAlgorithm::VelocityWithDensityAndThixotropyBCAlgorithm; + BCAlgorithm::preCollision = false; +} +////////////////////////////////////////////////////////////////////////// +VelocityWithDensityAndThixotropyBCAlgorithm::~VelocityWithDensityAndThixotropyBCAlgorithm() +{ + +} +////////////////////////////////////////////////////////////////////////// +SPtr<BCAlgorithm> VelocityWithDensityAndThixotropyBCAlgorithm::clone() +{ + SPtr<BCAlgorithm> bc(new VelocityWithDensityAndThixotropyBCAlgorithm()); + dynamicPointerCast<VelocityWithDensityAndThixotropyBCAlgorithm>(bc)->setLambdaBC(lambdaBC); + return bc; +} +////////////////////////////////////////////////////////////////////////// +void VelocityWithDensityAndThixotropyBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions) +{ + this->distributions = distributions; +} +////////////////////////////////////////////////////////////////////////// +void VelocityWithDensityAndThixotropyBCAlgorithm::addDistributionsH(SPtr<DistributionArray3D> distributions) +{ + this->distributionsH = distributions; +} +////////////////////////////////////////////////////////////////////////// +void VelocityWithDensityAndThixotropyBCAlgorithm::applyBC() +{ + //velocity bc for non reflecting pressure bc + LBMReal f[D3Q27System::ENDF+1]; + distributions->getDistributionInv(f, x1, x2, x3); + + LBMReal h[D3Q27System::ENDF + 1]; + distributionsH->getDistributionInv(h, x1, x2, x3); + + LBMReal rho, vx1, vx2, vx3, drho; + calcMacrosFct(f, drho, vx1, vx2, vx3); + + rho = 1.0+drho*compressibleFactor; + + /////////////////////////////////////////////////////////////////// + // Thixotropy + LBMReal lambda = D3Q27System::getDensity(h); + + int nx1 = x1; + int nx2 = x2; + int nx3 = x3; + int direction = -1; + + //flag points in direction of fluid + if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::E)) { nx1 -= 1; direction = D3Q27System::E; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::W)) { nx1 += 1; direction = D3Q27System::W; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::N)) { nx2 -= 1; direction = D3Q27System::N; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::S)) { nx2 += 1; direction = D3Q27System::S; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::T)) { nx3 -= 1; direction = D3Q27System::T; } + else if (bcPtr->hasVelocityBoundaryFlag(D3Q27System::B)) { nx3 += 1; direction = D3Q27System::B; } + else UB_THROW(UbException(UB_EXARGS, "Danger...no orthogonal BC-Flag on velocity boundary...")); + + for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) + { + int nX1 = x1 + D3Q27System::DX1[fdir]; + int nX2 = x2 + D3Q27System::DX2[fdir]; + int nX3 = x3 + D3Q27System::DX3[fdir]; + + int minX1 = 0; + int minX2 = 0; + int minX3 = 0; + + int maxX1 = (int)bcArray->getNX1(); + int maxX2 = (int)bcArray->getNX2(); + int maxX3 = (int)bcArray->getNX3(); + + if (minX1 <= nX1 && maxX1 > nX1 && minX2 <= nX2 && maxX2 > nX2 && minX3 <= nX3 && maxX3 > nX3) + { + if (bcArray->isSolid(nX1,nX2,nX3)) + { + const int invDir = D3Q27System::INVDIR[fdir]; + LBMReal q =1.0;// bcPtr->getQ(invDir);// m+m q=0 stabiler + LBMReal velocity = bcPtr->getBoundaryVelocity(fdir); + + LBMReal fReturn = (f[fdir] + f[invDir] - velocity*rho) / 2.0 - drho*D3Q27System::WEIGTH[invDir]; + distributions->setDistributionForDirection(fReturn, nX1, nX2, nX3, invDir); + } + } + + if (bcPtr->hasVelocityBoundaryFlag(fdir)) + { + const int invDir = D3Q27System::INVDIR[fdir]; + LBMReal htemp = D3Q27System::getCompFeqForDirection(fdir, lambda, vx1, vx2, vx3); + htemp = D3Q27System::getCompFeqForDirection(fdir, lambdaBC, vx1, vx2, vx3) + h[fdir] - htemp; + distributionsH->setDistributionForDirection(htemp, nx1, nx2, nx3, fdir); + } + } +} diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.h new file mode 100644 index 000000000..b8cd10143 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityAndThixotropyBCAlgorithm.h @@ -0,0 +1,31 @@ +//! \file VelocityWithDensityAndThixotropyBCAlgorithm.h +//! \brief Class implements velocity bc for non reflecting pressure bc. +//! \author Konstantin Kutscher + +#ifndef VelocityWithDensityAndThixotropyBCAlgorithm_h__ +#define VelocityWithDensityAndThixotropyBCAlgorithm_h__ + +#include "BCAlgorithm.h" +#include <PointerDefinitions.h> + +class DistributionArray3D; + +//! \brief Class implements Dirichlet boundary condition for velocity. Set density in system. It is used together with non reflecting outflow. + +class VelocityWithDensityAndThixotropyBCAlgorithm : public BCAlgorithm +{ +public: + VelocityWithDensityAndThixotropyBCAlgorithm(); + ~VelocityWithDensityAndThixotropyBCAlgorithm(); + SPtr<BCAlgorithm> clone(); + void addDistributions(SPtr<DistributionArray3D> distributions); + void addDistributionsH(SPtr<DistributionArray3D> distributions); + void applyBC(); + void setLambdaBC(LBMReal lambda) { this->lambdaBC = lambda; } + LBMReal getLambdaBC() { return this->lambdaBC; } +protected: + SPtr<DistributionArray3D> distributionsH; +private: + LBMReal lambdaBC; +}; +#endif // VelocityWithDensityAndThixotropyBCAlgorithm_h__ diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp index 98ead1e2d..ecafaa158 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp @@ -23,34 +23,21 @@ void VelocityWithDensityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> ////////////////////////////////////////////////////////////////////////// void VelocityWithDensityBCAlgorithm::applyBC() { - // velocity bc for non reflecting pressure bc - LBMReal f[D3Q27System::ENDF + 1]; - LBMReal feq[D3Q27System::ENDF + 1]; - distributions->getDistributionInv(f, x1, x2, x3); - LBMReal rho, vx1, vx2, vx3, drho; - calcMacrosFct(f, drho, vx1, vx2, vx3); - calcFeqFct(feq, drho, vx1, vx2, vx3); + //velocity bc for non reflecting pressure bc + LBMReal f[D3Q27System::ENDF+1]; + LBMReal feq[D3Q27System::ENDF+1]; + distributions->getDistributionInv(f, x1, x2, x3); + LBMReal rho, vx1, vx2, vx3, drho; + calcMacrosFct(f, drho, vx1, vx2, vx3); + //calcFeqFct(feq, drho, vx1, vx2, vx3); + + rho = 1.0+drho*compressibleFactor; - rho = 1.0 + drho * compressibleFactor; - - for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) { - // if (bcPtr->hasVelocityBoundaryFlag(fdir)) - //{ - // const int invDir = D3Q27System::INVDIR[fdir]; - // LBMReal q = bcPtr->getQ(invDir);// m+m q=0 stabiler - // LBMReal velocity = bcPtr->getBoundaryVelocity(invDir); - // //normal velocity bc: LBMReal fReturn = - // ((1.0-q)/(1.0+q))*((f[invDir]-feq[invDir])/(1.0-collFactor)+feq[invDir])+((q*(f[invDir]+f[fdir])-velocity*rho)/(1.0+q)); - // //LBMReal fReturn = ((1.0 - q) / (1.0 + q))*((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir]) - // + ((q*(f[invDir] + f[fdir]) - velocity) / (1.0 + q))-drho*D3Q27System::WEIGTH[invDir]; - // //LBMReal fReturn = ((1.0 - q) / (1.0 + q))*((f[invDir] - feq[invDir]) / (1.0 - collFactor) + feq[invDir]) - // + ((q*(f[invDir] + f[fdir]) - velocity*rho) / (1.0 + q))-drho*D3Q27System::WEIGTH[invDir]; LBMReal fReturn - // = ((1.0 - q) / (1.0 + q))*((f[invDir] - feq[invDir]*collFactor) / (1.0 - collFactor)) + ((q*(f[invDir] + - // f[fdir]) - velocity*rho) / (1.0 + q))-drho*D3Q27System::WEIGTH[invDir]; - // - // distributions->setDistributionForDirection(fReturn, x1 + D3Q27System::DX1[invDir], x2 + - // D3Q27System::DX2[invDir], x3 + D3Q27System::DX3[invDir], fdir); - //} + for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) + { + int nX1 = x1 + D3Q27System::DX1[fdir]; + int nX2 = x2 + D3Q27System::DX2[fdir]; + int nX3 = x3 + D3Q27System::DX3[fdir]; int nX1 = x1 + D3Q27System::DX1[fdir]; int nX2 = x2 + D3Q27System::DX2[fdir]; diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h index c590bd4a9..a8c0a4706 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h @@ -1,4 +1,4 @@ -//! \file NonReflectingVelocityBCAlgorithm.h +//! \file VelocityWithDensityBCAlgorithm.h //! \brief Class implements velocity bc for non reflecting pressure bc. //! \author Konstantin Kutscher @@ -22,4 +22,4 @@ public: void addDistributions(SPtr<DistributionArray3D> distributions) override; void applyBC() override; }; -#endif // NonReflectingVelocityBCAlgorithm_h__ +#endif // VelocityWithDensityBCAlgorithm_h__ diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp index a4558c64b..1d71e4bbf 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp @@ -145,120 +145,126 @@ void WriteMacroscopicQuantitiesCoProcessor::clearData() ////////////////////////////////////////////////////////////////////////// void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) { - double level = (double) block->getLevel(); - // double blockID = (double)block->getGlobalID(); - - // Diese Daten werden geschrieben: - datanames.resize(0); - datanames.emplace_back("Rho"); - datanames.emplace_back("Vx"); - datanames.emplace_back("Vy"); - datanames.emplace_back("Vz"); - // datanames.emplace_back("Press"); - datanames.emplace_back("Level"); - // datanames.emplace_back("BlockID"); - - data.resize(datanames.size()); - - SPtr<ILBMKernel> kernel = block->getKernel(); - SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); - SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); - LBMReal f[D3Q27System::ENDF + 1]; - LBMReal vx1, vx2, vx3, rho; - - if (block->getKernel()->getCompressible()) - { - calcMacros = &D3Q27System::calcCompMacroscopicValues; - } else - { - calcMacros = &D3Q27System::calcIncompMacroscopicValues; - } - - int minX1 = 0; - int minX2 = 0; - int minX3 = 0; - - int maxX1 = (int) (distributions->getNX1()); - int maxX2 = (int) (distributions->getNX2()); - int maxX3 = (int) (distributions->getNX3()); - - // int minX1 = 1; - // int minX2 = 1; - // int minX3 = 1; - - // int maxX1 = (int)(distributions->getNX1()); - // int maxX2 = (int)(distributions->getNX2()); - // int maxX3 = (int)(distributions->getNX3()); - - // nummern vergeben und node vector erstellen + daten sammeln - CbArray3D<int> nodeNumbers((int) maxX1, (int) maxX2, (int) maxX3, -1); - maxX1 -= 2; - maxX2 -= 2; - maxX3 -= 2; - - // D3Q27BoundaryConditionPtr bcPtr; - int nr = (int) nodes.size(); - - for (int ix3 = minX3; ix3 <= maxX3; ix3++) - { - for (int ix2 = minX2; ix2 <= maxX2; ix2++) - { - for (int ix1 = minX1; ix1 <= maxX1; ix1++) + double level = (double)block->getLevel(); + double blockID = (double)block->getGlobalID(); + + //Diese Daten werden geschrieben: + datanames.resize(0); + datanames.push_back("Rho"); + datanames.push_back("Vx"); + datanames.push_back("Vy"); + datanames.push_back("Vz"); + //datanames.push_back("Press"); + //datanames.push_back("Level"); + //datanames.push_back("BlockID"); + //datanames.push_back("gamma"); + //datanames.push_back("collFactor"); + + + data.resize(datanames.size()); + + SPtr<ILBMKernel> kernel = block->getKernel(); + SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); + SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); + LBMReal f[D3Q27System::ENDF+1]; + LBMReal vx1,vx2,vx3,rho; + + //knotennummerierung faengt immer bei 0 an! + unsigned int SWB,SEB,NEB,NWB,SWT,SET,NET,NWT; + + if(block->getKernel()->getCompressible()) + { + calcMacros = &D3Q27System::calcCompMacroscopicValues; + } + else + { + calcMacros = &D3Q27System::calcIncompMacroscopicValues; + } + + int minX1 = 0; + int minX2 = 0; + int minX3 = 0; + + int maxX1 = (int)(distributions->getNX1()); + int maxX2 = (int)(distributions->getNX2()); + int maxX3 = (int)(distributions->getNX3()); + + //int minX1 = 1; + //int minX2 = 1; + //int minX3 = 1; + + //int maxX1 = (int)(distributions->getNX1()); + //int maxX2 = (int)(distributions->getNX2()); + //int maxX3 = (int)(distributions->getNX3()); + + //nummern vergeben und node vector erstellen + daten sammeln + CbArray3D<int> nodeNumbers((int)maxX1, (int)maxX2, (int)maxX3,-1); + maxX1 -= 2; + maxX2 -= 2; + maxX3 -= 2; + + //D3Q27BoundaryConditionPtr bcPtr; + int nr = (int)nodes.size(); + + for(int ix3=minX3; ix3<=maxX3; ix3++) + { + for(int ix2=minX2; ix2<=maxX2; ix2++) + { + for(int ix1=minX1; ix1<=maxX1; ix1++) + { + if(!bcArray->isUndefined(ix1,ix2,ix3) && !bcArray->isSolid(ix1,ix2,ix3)) { - if (!bcArray->isUndefined(ix1, ix2, ix3) && !bcArray->isSolid(ix1, ix2, ix3)) - { - int index = 0; - nodeNumbers(ix1, ix2, ix3) = nr++; - Vector3D worldCoordinates = grid->getNodeCoordinates(block, ix1, ix2, ix3); - nodes.emplace_back(float(worldCoordinates[0]), float(worldCoordinates[1]), - float(worldCoordinates[2])); - - distributions->getDistribution(f, ix1, ix2, ix3); - calcMacros(f, rho, vx1, vx2, vx3); - // double press = D3Q27System::calcPress(f,rho,vx1,vx2,vx3); - - if (UbMath::isNaN(rho) || UbMath::isInfinity(rho)) - UB_THROW(UbException( - UB_EXARGS, "rho is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" + - block->toString() + ", node=" + UbSystem::toString(ix1) + "," + - UbSystem::toString(ix2) + "," + UbSystem::toString(ix3))); - // rho=999.0; - // if (UbMath::isNaN(press) || UbMath::isInfinity(press)) - // UB_THROW( UbException(UB_EXARGS,"press is not a number (nan or -1.#IND) or infinity number - // -1.#INF in block="+block->toString()+ - // ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); - // press=999.0; - if (UbMath::isNaN(vx1) || UbMath::isInfinity(vx1)) - UB_THROW(UbException( - UB_EXARGS, "vx1 is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" + - block->toString() + ", node=" + UbSystem::toString(ix1) + "," + - UbSystem::toString(ix2) + "," + UbSystem::toString(ix3))); - // vx1=999.0; - if (UbMath::isNaN(vx2) || UbMath::isInfinity(vx2)) - UB_THROW(UbException( - UB_EXARGS, "vx2 is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" + - block->toString() + ", node=" + UbSystem::toString(ix1) + "," + - UbSystem::toString(ix2) + "," + UbSystem::toString(ix3))); - // vx2=999.0; - if (UbMath::isNaN(vx3) || UbMath::isInfinity(vx3)) - UB_THROW(UbException( - UB_EXARGS, "vx3 is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" + - block->toString() + ", node=" + UbSystem::toString(ix1) + "," + - UbSystem::toString(ix2) + "," + UbSystem::toString(ix3))); - - data[index++].push_back(rho); - data[index++].push_back(vx1); - data[index++].push_back(vx2); - data[index++].push_back(vx3); - - // data[index++].push_back(rho * conv->getFactorDensityLbToW2() ); - // data[index++].push_back(vx1 * conv->getFactorVelocityLbToW2()); - // data[index++].push_back(vx2 * conv->getFactorVelocityLbToW2()); - // data[index++].push_back(vx3 * conv->getFactorVelocityLbToW2()); - // data[index++].push_back(press * conv->getFactorPressureLbToW2()); - data[index++].push_back(level); - // data[index++].push_back(blockID); - } + int index = 0; + nodeNumbers(ix1,ix2,ix3) = nr++; + Vector3D worldCoordinates = grid->getNodeCoordinates(block, ix1, ix2, ix3); + nodes.push_back( UbTupleFloat3(float(worldCoordinates[0]), + float(worldCoordinates[1]), + float(worldCoordinates[2]) )); + + distributions->getDistribution(f, ix1, ix2, ix3); + calcMacros(f,rho,vx1,vx2,vx3); + double press = D3Q27System::getPressure(f); //D3Q27System::calcPress(f,rho,vx1,vx2,vx3); + + if (UbMath::isNaN(rho) || UbMath::isInfinity(rho)) + UB_THROW( UbException(UB_EXARGS,"rho is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+ + ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); + //rho=999.0; + if (UbMath::isNaN(press) || UbMath::isInfinity(press)) + UB_THROW( UbException(UB_EXARGS,"press is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+ + ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); + //press=999.0; + if (UbMath::isNaN(vx1) || UbMath::isInfinity(vx1)) + UB_THROW( UbException(UB_EXARGS,"vx1 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+ + ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); + //vx1=999.0; + if (UbMath::isNaN(vx2) || UbMath::isInfinity(vx2)) + UB_THROW( UbException(UB_EXARGS,"vx2 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+ + ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); + //vx2=999.0; + if (UbMath::isNaN(vx3) || UbMath::isInfinity(vx3)) + UB_THROW( UbException(UB_EXARGS,"vx3 is not a number (nan or -1.#IND) or infinity number -1.#INF in block="+block->toString()+ + ", node="+UbSystem::toString(ix1)+","+UbSystem::toString(ix2)+","+UbSystem::toString(ix3))); + //vx3 = 999.0; + + data[index++].push_back(rho); + data[index++].push_back(vx1); + data[index++].push_back(vx2); + data[index++].push_back(vx3); + + //shearRate = D3Q27System::getShearRate(f, collFactor); + + //LBMReal collFactorF = BinghamModelLBMKernel::getBinghamCollFactor(collFactor, yieldStress, shearRate, rho); + + //data[index++].push_back(shearRate); + //data[index++].push_back(collFactorF); + + //data[index++].push_back((rho+1.0) * conv->getFactorDensityLbToW() ); + //data[index++].push_back(vx1 * conv->getFactorVelocityLbToW()); + //data[index++].push_back(vx2 * conv->getFactorVelocityLbToW()); + //data[index++].push_back(vx3 * conv->getFactorVelocityLbToW()); + //data[index++].push_back((press * conv->getFactorPressureLbToW()) / ((rho+1.0) * conv->getFactorDensityLbToW())); + //data[index++].push_back(level); + //data[index++].push_back(blockID); } } } diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp new file mode 100644 index 000000000..f1dca3474 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp @@ -0,0 +1,237 @@ +#include "WriteThixotropyQuantitiesCoProcessor.h" +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "UbScheduler.h" +#include "DataSet3D.h" +#include "D3Q27System.h" +#include "BCArray3D.h" +#include <vector> +#include <string> +#include <algorithm> +#include <numeric> +#include "basics/writer/WbWriterVtkXmlASCII.h" +#include "ThixotropyExpLBMKernel.h" + +using namespace std; + +WriteThixotropyQuantitiesCoProcessor::WriteThixotropyQuantitiesCoProcessor() +{ + +} +////////////////////////////////////////////////////////////////////////// +WriteThixotropyQuantitiesCoProcessor::WriteThixotropyQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, SPtr<Communicator> comm) : CoProcessor(grid, s), path(path), writer(writer), conv(conv), comm(comm) +{ + gridRank = comm->getProcessID(); + minInitLevel = this->grid->getCoarsestInitializedLevel(); + maxInitLevel = this->grid->getFinestInitializedLevel(); + + blockVector.resize(maxInitLevel + 1); + + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + grid->getBlocks(level, gridRank, true, blockVector[level]); + } +} +////////////////////////////////////////////////////////////////////////// +void WriteThixotropyQuantitiesCoProcessor::init() +{ + +} +////////////////////////////////////////////////////////////////////////// +void WriteThixotropyQuantitiesCoProcessor::process(double step) +{ + if (scheduler->isDue(step)) + collectData(step); + + UBLOG(logDEBUG3, "WriteThixotropyQuantitiesCoProcessor::update:" << step); +} +////////////////////////////////////////////////////////////////////////// +void WriteThixotropyQuantitiesCoProcessor::collectData(double step) +{ + int istep = static_cast<int>(step); + //ConcentrationSum = 0; + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + for(SPtr<Block3D> block : blockVector[level]) + { + if (block) + { + addDataMQ(block); + } + } + } + //cout <<"at step = "<< step << ", the sum of Concentration in the domain = "<<ConcentrationSum << endl; + string pfilePath, partPath, subfolder, cfilePath; + + subfolder = "thyxotropy" + UbSystem::toString(istep); + pfilePath = path + "/thyxotropy/" + subfolder; + cfilePath = path + "/thyxotropy/thyxotropy_collection"; + partPath = pfilePath + "/thyxotropy" + UbSystem::toString(gridRank) + "_" + UbSystem::toString(istep); + + + string partName = writer->writeOctsWithNodeData(partPath, nodes, cells, datanames, data); + + size_t found = partName.find_last_of("/"); + string piece = partName.substr(found + 1); + piece = subfolder + "/" + piece; + + vector<string> cellDataNames; + vector<string> pieces = comm->gather(piece); + if (comm->getProcessID() == comm->getRoot()) + { + string pname = WbWriterVtkXmlASCII::getInstance()->writeParallelFile(pfilePath, pieces, datanames, cellDataNames); + found = pname.find_last_of("/"); + piece = pname.substr(found + 1); + + vector<string> filenames; + filenames.push_back(piece); + if (step == CoProcessor::scheduler->getMinBegin()) + { + WbWriterVtkXmlASCII::getInstance()->writeCollection(cfilePath, filenames, istep, false); + } + else + { + WbWriterVtkXmlASCII::getInstance()->addFilesToCollection(cfilePath, filenames, istep, false); + } + UBLOG(logINFO, "WriteThixotropyQuantitiesCoProcessor step: " << istep); + } + + clearData(); +} +////////////////////////////////////////////////////////////////////////// +void WriteThixotropyQuantitiesCoProcessor::clearData() +{ + nodes.clear(); + cells.clear(); + datanames.clear(); + data.clear(); +} +////////////////////////////////////////////////////////////////////////// +void WriteThixotropyQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) +{ + UbTupleDouble3 org = grid->getBlockWorldCoordinates(block); + UbTupleDouble3 blockLengths = grid->getBlockLengths(block); + UbTupleDouble3 nodeOffset = grid->getNodeOffset(block); + double dx = grid->getDeltaX(block); + + double level = (double)block->getLevel(); + double blockID = (double)block->getGlobalID(); + + //Diese Daten werden geschrieben: + datanames.resize(0); + datanames.push_back("lambda"); + //datanames.push_back("ShearRate"); + //datanames.push_back("collFactor"); + //datanames.push_back("Fluxx"); + //datanames.push_back("Fluxy"); + //datanames.push_back("Fluxz"); + //datanames.push_back("delC"); + //datanames.push_back("diff"); + //datanames.push_back("AccumulatedConcentration"); + //datanames.push_back("m100"); + //datanames.push_back("Level"); + //datanames.push_back("BlockID"); + + + + data.resize(datanames.size()); + + SPtr<ILBMKernel> kernel = block->getKernel(); + SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); + SPtr<DistributionArray3D> distributionsF = kernel->getDataSet()->getFdistributions(); + SPtr<DistributionArray3D> distributionsH = kernel->getDataSet()->getHdistributions(); + //LBMReal collFactorF = staticPointerCast<ThixotropyExpLBMKernel>(kernel)->getCollisionFactorF(); + LBMReal collFactor = kernel->getCollisionFactor(); + LBMReal f[D3Q27System::ENDF + 1]; + LBMReal h[D3Q27System::ENDF + 1]; + LBMReal lambda, gammaDot; + + //knotennummerierung faengt immer bei 0 an! + unsigned int SWB, SEB, NEB, NWB, SWT, SET, NET, NWT; + + int minX1 = 0; + int minX2 = 0; + int minX3 = 0; + + int maxX1 = (int)(distributionsH->getNX1()); + int maxX2 = (int)(distributionsH->getNX2()); + int maxX3 = (int)(distributionsH->getNX3()); + + //int minX1 = 1; + //int minX2 = 1; + //int minX3 = 1; + + //int maxX1 = (int)(distributions->getNX1()); + //int maxX2 = (int)(distributions->getNX2()); + //int maxX3 = (int)(distributions->getNX3()); + + //nummern vergeben und node vector erstellen + daten sammeln + CbArray3D<int> nodeNumbers((int)maxX1, (int)maxX2, (int)maxX3, -1); + maxX1 -= 2; + maxX2 -= 2; + maxX3 -= 2; + //D3Q27BoundaryConditionPtr bcPtr; + int nr = (int)nodes.size(); + + for (size_t ix3 = minX3; ix3 <= maxX3; ix3++) + { + for (size_t ix2 = minX2; ix2 <= maxX2; ix2++) + { + for (size_t ix1 = minX1; ix1 <= maxX1; ix1++) + { + if (!bcArray->isUndefined(ix1, ix2, ix3) && !bcArray->isSolid(ix1, ix2, ix3)) + { + int index = 0; + nodeNumbers(ix1, ix2, ix3) = nr++; + nodes.push_back(makeUbTuple(float(val<1>(org) - val<1>(nodeOffset) + ix1*dx), + float(val<2>(org) - val<2>(nodeOffset) + ix2*dx), + float(val<3>(org) - val<3>(nodeOffset) + ix3*dx))); + + distributionsH->getDistribution(h, ix1, ix2, ix3); + + lambda = D3Q27System::getDensity(h); + + if (UbMath::isNaN(lambda) || UbMath::isInfinity(lambda) ) + UB_THROW(UbException(UB_EXARGS, "lambda is not a number (nan or -1.#IND) or infinity number -1.#INF in block=" + block->toString() + + ", node=" + UbSystem::toString(ix1) + "," + UbSystem::toString(ix2) + "," + UbSystem::toString(ix3))); + + distributionsF->getDistribution(f, ix1, ix2, ix3); + LBMReal rho = D3Q27System::getDensity(f); + + //gammaDot = BinghamModel::getShearRate(f, collFactor); + + //LBMReal collFactorF = collFactor - 1e-6 / (gammaDot + one * 1e-9); + //collFactorF = (collFactorF < 0.5) ? 0.5 : collFactorF; + + data[index++].push_back(lambda); + //data[index++].push_back(gammaDot); + //data[index++].push_back(collFactorF); + } + } + } + } + maxX1 -= 1; + maxX2 -= 1; + maxX3 -= 1; + //cell vector erstellen + for (int ix3 = minX3; ix3 <= maxX3; ix3++) + { + for (int ix2 = minX2; ix2 <= maxX2; ix2++) + { + for (int ix1 = minX1; ix1 <= maxX1; ix1++) + { + if ((SWB = nodeNumbers(ix1, ix2, ix3)) >= 0 + && (SEB = nodeNumbers(ix1 + 1, ix2, ix3)) >= 0 + && (NEB = nodeNumbers(ix1 + 1, ix2 + 1, ix3)) >= 0 + && (NWB = nodeNumbers(ix1, ix2 + 1, ix3)) >= 0 + && (SWT = nodeNumbers(ix1, ix2, ix3 + 1)) >= 0 + && (SET = nodeNumbers(ix1 + 1, ix2, ix3 + 1)) >= 0 + && (NET = nodeNumbers(ix1 + 1, ix2 + 1, ix3 + 1)) >= 0 + && (NWT = nodeNumbers(ix1, ix2 + 1, ix3 + 1)) >= 0) + { + cells.push_back(makeUbTuple(SWB, SEB, NEB, NWB, SWT, SET, NET, NWT)); + } + } + } + } +} diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h new file mode 100644 index 000000000..58430fd9e --- /dev/null +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h @@ -0,0 +1,42 @@ +#ifndef WriteThixotropyQuantitiesCoProcessor_H +#define WriteThixotropyQuantitiesCoProcessor_H + +#include "CoProcessor.h" +#include "Grid3D.h" +#include "Block3D.h" +#include "LBMUnitConverter.h" +#include "Communicator.h" +#include "WbWriter.h" + +class WriteThixotropyQuantitiesCoProcessor : public CoProcessor +{ +public: + WriteThixotropyQuantitiesCoProcessor(); + WriteThixotropyQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string& path, WbWriter* const writer, SPtr<LBMUnitConverter> conv, SPtr<Communicator> comm); + ~WriteThixotropyQuantitiesCoProcessor() {} + + void process(double step) override; + +protected: + void collectData(double step); + void addDataMQ(SPtr<Block3D> block); + void clearData(); + +private: + void init(); + std::vector<UbTupleFloat3> nodes; + std::vector<UbTupleUInt8> cells; + std::vector<std::string> datanames; + std::vector<std::vector<double> > data; + std::string path; + WbWriter* writer; + SPtr<LBMUnitConverter> conv; + bool bcInformation; + std::vector<std::vector<SPtr<Block3D> > > blockVector; + int minInitLevel; + int maxInitLevel; + int gridRank; + SPtr<Communicator> comm; + double ConcentrationSum; +}; +#endif diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.cpp new file mode 100644 index 000000000..3fb819ab7 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.cpp @@ -0,0 +1,291 @@ +#include "ThixotropyFullDirectConnector.h" +#include "LBMKernel.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "DataSet3D.h" +#include "EsoTwist3D.h" + + +using namespace std; + +ThixotropyFullDirectConnector::ThixotropyFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir) + : LocalBlock3DConnector(from, to, sendDir) + +{ + +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyFullDirectConnector::init() +{ + maxX1 = (int)this->from.lock()->getKernel()->getDataSet()->getFdistributions()->getNX1() - 1; + maxX2 = (int)this->from.lock()->getKernel()->getDataSet()->getFdistributions()->getNX2() - 1; + maxX3 = (int)this->from.lock()->getKernel()->getDataSet()->getFdistributions()->getNX3() - 1; + + fFrom =dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getFdistributions()); + fTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getFdistributions()); + hFrom = dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getHdistributions()); + hTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getHdistributions()); + + //celltypematrixFrom = from.lock()->getKernel()->getBCProcessor()->getCellsTypeArray(); + //fillVolumeMatrixFrom = from.lock()->getKernel()->getBCProcessor()->getFillVolumeArray(); + //normalMatrixFrom = from.lock()->getKernel()->getBCProcessor()->getNormalArray(); + //changeInConcMatrixFrom = from.lock()->getKernel()->getBCProcessor()->getChangeInConcentrationArray(); + //deltaVolumeMatrixFrom = from.lock()->getKernel()->getBCProcessor()->getChangeInVolumeArray(); + + //celltypematrixTo = to.lock()->getKernel()->getBCProcessor()->getCellsTypeArray(); + //fillVolumeMatrixTo = to.lock()->getKernel()->getBCProcessor()->getFillVolumeArray(); + //normalMatrixTo = to.lock()->getKernel()->getBCProcessor()->getNormalArray(); + //changeInConcMatrixTo = to.lock()->getKernel()->getBCProcessor()->getChangeInConcentrationArray(); + //deltaVolumeMatrixTo = to.lock()->getKernel()->getBCProcessor()->getChangeInVolumeArray(); + + //bcArrayFrom = from.lock()->getKernel()->getBCProcessor()->getBCArray(); + //bcArrayTo = to.lock()->getKernel()->getBCProcessor()->getBCArray(); + + //bcArrayReactiveFrom = from.lock()->getKernel()->getBCProcessor()->getBCArrayReactive(); + //bcArrayReactiveTo = to.lock()->getKernel()->getBCProcessor()->getBCArrayReactive(); + + // maxX1 = (int)this->from.lock()->getKernel()->getBCProcessor()->getCellsTypeArray()->getNX1()/* - 1*/; + // maxX2 = (int)this->from.lock()->getKernel()->getBCProcessor()->getCellsTypeArray()->getNX2()/* - 1*/; + // maxX3 = (int)this->from.lock()->getKernel()->getBCProcessor()->getCellsTypeArray()->getNX3()/* - 1*/; +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyFullDirectConnector::sendVectors() +{ + localDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getLocalDistributions(); + nonLocalDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getNonLocalDistributions(); + zeroDistributionsFromf = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fFrom)->getZeroDistributions(); + + localDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getLocalDistributions(); + nonLocalDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getNonLocalDistributions(); + zeroDistributionsTof = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fTo)->getZeroDistributions(); + + localDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getLocalDistributions(); + nonLocalDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getNonLocalDistributions(); + zeroDistributionsFromh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hFrom)->getZeroDistributions(); + + localDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getLocalDistributions(); + nonLocalDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getNonLocalDistributions(); + zeroDistributionsToh = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hTo)->getZeroDistributions(); + + bool con = /*(from.lock()->getGlobalID()==11) &&*/ (to.lock()->getGlobalID() == 1); + + //EAST + if (sendDir == D3Q27System::E) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + exchangeData(maxX1 - 1, x2, x3, 0, x2, x3); + //exchangeDataforCells(maxX1 - 1, x2, x3, 0, x2, x3); + } + } + } + //WEST + else if (sendDir == D3Q27System::W) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + exchangeData(1, x2, x3, maxX1, x2, x3); + //exchangeDataforCells(1, x2, x3, maxX1, x2, x3); + } + } + } + //NORTH + else if (sendDir == D3Q27System::N) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + exchangeData(x1, maxX2 - 1, x3, x1, 0, x3); + //exchangeDataforCells(x1, maxX2 - 1, x3, x1, 0, x3); + } + } + } + //SOUTH + else if (sendDir == D3Q27System::S) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + exchangeData(x1, 1, x3, x1, maxX2, x3); + //exchangeDataforCells(x1, 1, x3, x1, maxX2, x3); + } + } + } + + //TOP + else if (sendDir == D3Q27System::T) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + exchangeData(x1, x2, maxX3 - 1, x1, x2, 0); + //exchangeDataforCells(x1, x2, maxX3 - 1, x1, x2, 0); + } + } + } + //BOTTOM + else if (sendDir == D3Q27System::B) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + exchangeData(x1, x2, 1, x1, x2, maxX3); + //exchangeDataforCells(x1, x2, 1, x1, x2, maxX3); + } + } + } + //NORTHEAST + else if (sendDir == D3Q27System::NE) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + exchangeData(maxX1 - 1, maxX2 - 1, x3, 0, 0, x3); + //exchangeDataforCells(maxX1 - 1, maxX2 - 1, x3, 0, 0, x3); + + } + } + //NORTHWEST + else if (sendDir == D3Q27System::NW) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + exchangeData(1, maxX2 - 1, x3, maxX1, 0, x3); + //exchangeDataforCells(1, maxX2 - 1, x3, maxX1, 0, x3); + } + } + //SOUTHWEST + else if (sendDir == D3Q27System::SW) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + exchangeData(1, 1, x3, maxX1, maxX2, x3); + //exchangeDataforCells(1, 1, x3, maxX1, maxX2, x3); + + } + } + //SOUTHEAST + else if (sendDir == D3Q27System::SE) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + exchangeData(maxX1 - 1, 1, x3, 0, maxX2, x3); + //exchangeDataforCells(maxX1 - 1, 1, x3, 0, maxX2, x3); + + } + } + else if (sendDir == D3Q27System::TE) + for (int x2 = 1; x2 < maxX2; x2++) + { + exchangeData(maxX1 - 1, x2, maxX3 - 1, 0, x2, 0); + //exchangeDataforCells(maxX1 - 1, x2, maxX3 - 1, 0, x2, 0); + + } + else if (sendDir == D3Q27System::BW) + for (int x2 = 1; x2 < maxX2; x2++) + { + exchangeData(1, x2, 1, maxX1, x2, maxX3); + //exchangeDataforCells(1, x2, 1, maxX1, x2, maxX3); + + } + else if (sendDir == D3Q27System::BE) + for (int x2 = 1; x2 < maxX2; x2++) + { + exchangeData(maxX1 - 1, x2, 1, 0, x2, maxX3); + //exchangeDataforCells(maxX1 - 1, x2, 1, 0, x2, maxX3); + + } + else if (sendDir == D3Q27System::TW) + for (int x2 = 1; x2 < maxX2; x2++) + { + exchangeData(1, x2, maxX3 - 1, maxX1, x2, 0); + //exchangeDataforCells(1, x2, maxX3 - 1, maxX1, x2, 0); + + } + else if (sendDir == D3Q27System::TN) + for (int x1 = 1; x1 < maxX1; x1++) + { + exchangeData(x1, maxX2 - 1, maxX3 - 1, x1, 0, 0); + //exchangeDataforCells(x1, maxX2 - 1, maxX3 - 1, x1, 0, 0); + + } + else if (sendDir == D3Q27System::BS) + for (int x1 = 1; x1 < maxX1; x1++) + { + exchangeData(x1, 1, 1, x1, maxX2, maxX3); + //exchangeDataforCells(x1, 1, 1, x1, maxX2, maxX3); + + } + else if (sendDir == D3Q27System::BN) + for (int x1 = 1; x1 < maxX1; x1++) + { + exchangeData(x1, maxX2 - 1, 1, x1, 0, maxX3); + //exchangeDataforCells(x1, maxX2 - 1, 1, x1, 0, maxX3); + + } + + else if (sendDir == D3Q27System::TS) + for (int x1 = 1; x1 < maxX1; x1++) + { + exchangeData(x1, 1, maxX3 - 1, x1, maxX2, 0); + //exchangeDataforCells(x1, 1, maxX3 - 1, x1, maxX2, 0); + + } + + else if (sendDir == D3Q27System::TSW) + { + exchangeData(1, 1, maxX3 - 1, maxX1, maxX2, 0); + //exchangeDataforCells(1, 1, maxX3 - 1, maxX1, maxX2, 0); + + } + else if (sendDir == D3Q27System::TSE) + { + exchangeData(maxX1 - 1, 1, maxX3 - 1, 0, maxX2, 0); + //exchangeDataforCells(maxX1 - 1, 1, maxX3 - 1, 0, maxX2, 0); + + } + else if (sendDir == D3Q27System::TNW) + { + exchangeData(1, maxX2 - 1, maxX3 - 1, maxX1, 0, 0); + //exchangeDataforCells(1, maxX2 - 1, maxX3 - 1, maxX1, 0, 0); + + } + else if (sendDir == D3Q27System::TNE) + { + exchangeData(maxX1 - 1, maxX2 - 1, maxX3 - 1, 0, 0, 0); + //exchangeDataforCells(maxX1 - 1, maxX2 - 1, maxX3 - 1, 0, 0, 0); + + } + else if (sendDir == D3Q27System::BSW) + { + exchangeData(1, 1, 1, maxX1, maxX2, maxX3); + //exchangeDataforCells(1, 1, 1, maxX1, maxX2, maxX3); + + } + else if (sendDir == D3Q27System::BSE) + { + exchangeData(maxX1 - 1, 1, 1, 0, maxX2, maxX3); + //exchangeDataforCells(maxX1 - 1, 1, 1, 0, maxX2, maxX3); + + } + else if (sendDir == D3Q27System::BNW) + { + exchangeData(1, maxX2 - 1, 1, maxX1, 0, maxX3); + //exchangeDataforCells(1, maxX2 - 1, 1, maxX1, 0, maxX3); + + } + else if (sendDir == D3Q27System::BNE) + { + exchangeData(maxX1 - 1, maxX2 - 1, 1, 0, 0, maxX3); + //exchangeDataforCells(maxX1 - 1, maxX2 - 1, 1, 0, 0, maxX3); + + } + else UB_THROW(UbException(UB_EXARGS, "unknown dir")); +} + diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.h b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.h new file mode 100644 index 000000000..1fecd5d0a --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullDirectConnector.h @@ -0,0 +1,222 @@ +/** +* @file ThixotropyFullDirectConnector.h +* @brief Connector send and receive full distribution in shared memory +* +* @author Hussein Alihussein +* @date 28.11.2018 +*/ +#ifndef ThixotropyFullDirectConnector_H +#define ThixotropyFullDirectConnector_H + +#include "LocalBlock3DConnector.h" +#include "Block3D.h" +#include "D3Q27System.h" +#include "basics/container/CbArray3D.h" +#include "basics/container/CbArray4D.h" +#include "BCArray3D.h" + +class EsoTwist3D; + +//! \brief Exchange data between blocks. +//! \details Connector send and receive full distributions between two blocks in shared memory. +//! \author Hussein Alihussein + +class ThixotropyFullDirectConnector : public LocalBlock3DConnector +{ +public: + ThixotropyFullDirectConnector(SPtr<Block3D> from, SPtr<Block3D> to, int sendDir); + void init(); + void sendVectors(); + //void sendCellVectors(); + +protected: + inline void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To); + //inline void exchangeDataforCells(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To); + //void ExchangeDatabcArray(SPtr<BCArray3D> bcArrayFrom, SPtr<BCArray3D> bcArrayTo, int x1From, int x2From, int x3From, int x1To, int x2To, int x3To); + //void ExchangeDatabcArrayReactive(BCArray3DReactivePtr bcArrayFrom, BCArray3DReactivePtr bcArrayTo, int x1From, int x2From, int x3From, int x1To, int x2To, int x3To); +private: + int maxX1; + int maxX2; + int maxX3; + + //CbArray3D<int>::CbArray3DPtr celltypematrixFrom; + //CbArray3D<double>::CbArray3DPtr fillVolumeMatrixFrom; + //CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr normalMatrixFrom; + //CbArray3D<double>::CbArray3DPtr changeInConcMatrixFrom; + //CbArray3D<double>::CbArray3DPtr deltaVolumeMatrixFrom; + + //CbArray3D<int>::CbArray3DPtr celltypematrixTo; + //CbArray3D<double>::CbArray3DPtr fillVolumeMatrixTo; + //CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr normalMatrixTo; + //CbArray3D<double>::CbArray3DPtr changeInConcMatrixTo; + //CbArray3D<double>::CbArray3DPtr deltaVolumeMatrixTo; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromf; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromf; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsFromf; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsTof; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsTof; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsTof; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsFromh; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsFromh; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsFromh; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsToh; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsToh; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsToh; + + SPtr<EsoTwist3D> fFrom, hFrom; + SPtr<EsoTwist3D> fTo, hTo; + + //BCArray3DPtr bcArrayFrom; + //BCArray3DPtr bcArrayTo; + + //BCArray3DReactivePtr bcArrayReactiveFrom; + //BCArray3DReactivePtr bcArrayReactiveTo; +}; + + +////////////////////////////////////////////////////////////////////////// +inline void ThixotropyFullDirectConnector::exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) +{ + + + (*this->localDistributionsTof)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_E, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_N, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_T, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NE, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_NW, x1From + 1, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TE, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TW, x1From + 1, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TN, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TS, x1From, x2From + 1, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNE, x1From, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From); + (*this->localDistributionsTof)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromf)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From); + + (*this->nonLocalDistributionsTof)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_W, x1From + 1, x2From, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_S, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_B, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_SE, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BE, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BN, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsTof)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromf)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1); + + (*this->zeroDistributionsTof)(x1To, x2To, x3To) = (*this->zeroDistributionsFromf)(x1From, x2From, x3From); + + + (*this->localDistributionsToh)(D3Q27System::ET_E, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_E, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_N, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_N, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_T, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_T, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_NE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NE, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_NW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_NW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TE, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TN, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TN, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TS, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TS, x1From, x2From + 1, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TNE, x1To, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNE, x1From, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TNW, x1To + 1, x2To, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TNW, x1From + 1, x2From, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TSE, x1To, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSE, x1From, x2From + 1, x3From); + (*this->localDistributionsToh)(D3Q27System::ET_TSW, x1To + 1, x2To + 1, x3To) = (*this->localDistributionsFromh)(D3Q27System::ET_TSW, x1From + 1, x2From + 1, x3From); + + (*this->nonLocalDistributionsToh)(D3Q27System::ET_W, x1To + 1, x2To, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_W, x1From + 1, x2From, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_S, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_S, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_B, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_B, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_SW, x1To + 1, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SW, x1From + 1, x2From + 1, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_SE, x1To, x2To + 1, x3To) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_SE, x1From, x2From + 1, x3From); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BE, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BS, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BS, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BN, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BN, x1From, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BSW, x1To + 1, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSW, x1From + 1, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BSE, x1To, x2To + 1, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BSE, x1From, x2From + 1, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BNW, x1To + 1, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNW, x1From + 1, x2From, x3From + 1); + (*this->nonLocalDistributionsToh)(D3Q27System::ET_BNE, x1To, x2To, x3To + 1) = (*this->nonLocalDistributionsFromh)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1); + + (*this->zeroDistributionsToh)(x1To, x2To, x3To) = (*this->zeroDistributionsFromh)(x1From, x2From, x3From); +} +////////////////////////////////////////////////////////////////////////// +//inline void ThixotropyFullDirectConnector::exchangeDataforCells(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) +//{ +// //(*this->celltypematrixTo)( x1To, x2To, x3To) = (*this->celltypematrixFrom)( x1From, x2From, x3From); +// +// (*this->celltypematrixTo)(x1To, x2To, x3To) = (*this->celltypematrixFrom)(x1From, x2From, x3From); +// (*this->fillVolumeMatrixTo)(x1To, x2To, x3To) = (*this->fillVolumeMatrixFrom)(x1From, x2From, x3From); +// (*this->changeInConcMatrixTo)(x1To, x2To, x3To) = (*this->changeInConcMatrixFrom)(x1From, x2From, x3From); +// (*this->deltaVolumeMatrixTo)(x1To, x2To, x3To) = (*this->deltaVolumeMatrixFrom)(x1From, x2From, x3From); +// +// (*this->normalMatrixTo)(0, x1To, x2To, x3To) = (*this->normalMatrixFrom)(0, x1From, x2From, x3From); +// (*this->normalMatrixTo)(1, x1To, x2To, x3To) = (*this->normalMatrixFrom)(1, x1From, x2From, x3From); +// (*this->normalMatrixTo)(2, x1To, x2To, x3To) = (*this->normalMatrixFrom)(2, x1From, x2From, x3From); +// //bcArrayTo->bcindexmatrix(x1To, x2To, x3To) = bcArrayFrom->bcindexmatrix(x1From, x2From, x3From); +// ExchangeDatabcArray(bcArrayFrom, bcArrayTo, x1From, x2From, x3From, x1To, x2To, x3To); +// ExchangeDatabcArrayReactive(bcArrayReactiveFrom, bcArrayReactiveTo, x1From, x2From, x3From, x1To, x2To, x3To); +//} +//////////////////////////////////////////////////////////////////////////// +//inline void ThixotropyFullDirectConnector::ExchangeDatabcArray(BCArray3DPtr bcArrayFrom, BCArray3DPtr bcArrayTo, int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) +//{ +// if (bcArrayFrom->isFluid(x1From, x2From, x3From)) +// { +// if (bcArrayFrom->hasBC(x1From, x2From, x3From)) +// { +// BoundaryConditionsPtr bc = bcArrayFrom->getBC(x1From, x2From, x3From); +// +// bcArrayTo->setBC(x1To, x2To, x3To, bc); +// +// } +// else if (bcArrayFrom->isFluidWithoutBC(x1From, x2From, x3From)) +// { +// bcArrayTo->setFluid(x1To, x2To, x3To); +// } +// } +// else if (bcArrayFrom->isSolid(x1From, x2From, x3From)) +// { +// bcArrayTo->setSolid(x1To, x2To, x3To); +// } +// else +// { +// bcArrayTo->setUndefined(x1To, x2To, x3To); +// } +// +//} +//////////////////////////////////////////////////////////////////////////// +//inline void ThixotropyFullDirectConnector::ExchangeDatabcArrayReactive(BCArray3DReactivePtr bcArrayFrom, BCArray3DReactivePtr bcArrayTo, int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) +//{ +// if (bcArrayFrom->isFluid(x1From, x2From, x3From)) +// { +// if (bcArrayFrom->hasBC(x1From, x2From, x3From)) +// { +// BoundaryConditionsPtr bc = bcArrayFrom->getBC(x1From, x2From, x3From); +// +// bcArrayTo->setBC(x1To, x2To, x3To, bc); +// +// } +// else if (bcArrayFrom->isFluidWithoutBC(x1From, x2From, x3From)) +// { +// bcArrayTo->setFluid(x1To, x2To, x3To); +// } +// } +// else if (bcArrayFrom->isSolid(x1From, x2From, x3From)) +// { +// bcArrayTo->setSolid(x1To, x2To, x3To); +// } +// else if (bcArrayFrom->isReactiveSolid(x1From, x2From, x3From)) +// { +// bcArrayTo->setReactiveSolidType1(x1To, x2To, x3To); +// } +// else +// { +// bcArrayTo->setUndefined(x1To, x2To, x3To); +// } +// +//} +#endif \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.cpp new file mode 100644 index 000000000..89950b25e --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.cpp @@ -0,0 +1,483 @@ +#include "ThixotropyFullVectorConnector.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "LBMKernel.h" +#include "Block3D.h" +#include "LBMKernel.h" +#include "EsoTwist3D.h" +#include "DataSet3D.h" + +////////////////////////////////////////////////////////////////////////// +ThixotropyFullVectorConnector::ThixotropyFullVectorConnector(SPtr<Block3D> block + , VectorTransmitterPtr sender + , VectorTransmitterPtr receiver + , int sendDir) + : RemoteBlock3DConnector(block, sender, receiver, sendDir) +{ + if (!block || !sender || !receiver) + UB_THROW(UbException(UB_EXARGS, "sender or receiver == NULL!!")); + +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyFullVectorConnector::init() +{ + maxX1 = (int)block.lock()->getKernel()->getDataSet()->getFdistributions()->getNX1() - 1; + maxX2 = (int)block.lock()->getKernel()->getDataSet()->getFdistributions()->getNX2() - 1; + maxX3 = (int)block.lock()->getKernel()->getDataSet()->getFdistributions()->getNX3() - 1; + + fDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getFdistributions()); + hDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getHdistributions()); + + int anz = 2*27; + switch (sendDir) + { + case D3Q27System::ZERO: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break; + case D3Q27System::E: + case D3Q27System::W: sender->getData().resize(maxX2*maxX3*anz, 0.0); break; + case D3Q27System::N: + case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz, 0.0); break; + case D3Q27System::T: + case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz, 0.0); break; + + case D3Q27System::NE: + case D3Q27System::SW: + case D3Q27System::SE: + case D3Q27System::NW: sender->getData().resize(maxX3*anz, 0.0); break; + + case D3Q27System::TE: + case D3Q27System::BW: + case D3Q27System::BE: + case D3Q27System::TW: sender->getData().resize(maxX2*anz, 0.0); break; + + case D3Q27System::TN: + case D3Q27System::BS: + case D3Q27System::BN: + case D3Q27System::TS: sender->getData().resize(maxX1*anz, 0.0); break; + + case D3Q27System::TNE: + case D3Q27System::BSW: + case D3Q27System::BNE: + case D3Q27System::TSW: + case D3Q27System::TSE: + case D3Q27System::BNW: + case D3Q27System::BSE: + case D3Q27System::TNW: sender->getData().resize(anz, 0.0); break; + + default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir")); + } +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyFullVectorConnector::fillSendVectors() +{ + localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getLocalDistributions(); + nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getNonLocalDistributions(); + zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getZeroDistributions(); + + localHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getLocalDistributions(); + nonLocalHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getNonLocalDistributions(); + zeroHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getZeroDistributions(); + + + + vector_type& sdata = sender->getData(); + + int index = 0; + //EAST + if (sendDir == D3Q27System::E) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + fillData(sdata, index, maxX1 - 1, x2, x3); + } + } + } + //WEST + else if (sendDir == D3Q27System::W) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + fillData(sdata, index, 1, x2, x3); + } + } + } + //NORTH + else if (sendDir == D3Q27System::N) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + fillData(sdata, index, x1, maxX2 - 1, x3); + } + } + } + //SOUTH + else if (sendDir == D3Q27System::S) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + fillData(sdata, index, x1, 1, x3); + } + } + } + //TOP + else if (sendDir == D3Q27System::T) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + fillData(sdata, index, x1, x2, maxX3 - 1); + } + } + } + //BOTTOM + else if (sendDir == D3Q27System::B) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + fillData(sdata, index, x1, x2, 1); + } + } + } + //NE NW SW SE + else if (sendDir == D3Q27System::NE || sendDir == D3Q27System::NW || sendDir == D3Q27System::SW || sendDir == D3Q27System::SE) + { + int x1 = 0; + int x2 = 0; + switch (sendDir) + { + case D3Q27System::NE: + x1 = maxX1 - 1; + x2 = maxX2 - 1; + break; + case D3Q27System::NW: + x1 = 1; + x2 = maxX2 - 1; + break; + case D3Q27System::SW: + x1 = 1; + x2 = 1; + break; + case D3Q27System::SE: + x1 = maxX1 - 1; + x2 = 1; + break; + } + for (int x3 = 1; x3 < maxX3; x3++) + { + fillData(sdata, index, x1, x2, x3); + } + } + //TE TW BW BE + else if (sendDir == D3Q27System::TE || sendDir == D3Q27System::TW || sendDir == D3Q27System::BW || sendDir == D3Q27System::BE) + { + int x1 = 0; + int x3 = 0; + switch (sendDir) + { + case D3Q27System::TE: + x1 = maxX1 - 1; + x3 = maxX3 - 1; + break; + case D3Q27System::TW: + x1 = 1; + x3 = maxX3 - 1; + break; + case D3Q27System::BW: + x1 = 1; + x3 = 1; + break; + case D3Q27System::BE: + x1 = maxX1 - 1; + x3 = 1; + break; + } + for (int x2 = 1; x2 < maxX2; x2++) + { + fillData(sdata, index, x1, x2, x3); + } + } + //TN BN BS TS + else if (sendDir == D3Q27System::TN || sendDir == D3Q27System::BN || sendDir == D3Q27System::BS || sendDir == D3Q27System::TS) + { + int x2 = 0; + int x3 = 0; + switch (sendDir) + { + case D3Q27System::TN: + x3 = maxX3 - 1; + x2 = maxX2 - 1; + break; + case D3Q27System::BN: + x3 = 1; + x2 = maxX2 - 1; + break; + case D3Q27System::BS: + x3 = 1; + x2 = 1; + break; + case D3Q27System::TS: + x3 = maxX3 - 1; + x2 = 1; + break; + } + for (int x1 = 1; x1 < maxX1; x1++) + { + fillData(sdata, index, x1, x2, x3); + } + } + //TNE TNW TSW TSE BNE BNW BSW BSE + else if (sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSW || sendDir == D3Q27System::TSE + || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW || sendDir == D3Q27System::BSW || sendDir == D3Q27System::BSE) + { + int x1 = 0; + int x2 = 0; + int x3 = 0; + switch (sendDir) + { + case D3Q27System::TNE: x1 = maxX1 - 1; x2 = maxX2 - 1; x3 = maxX3 - 1; break; + case D3Q27System::TNW: x1 = 1; x2 = maxX2 - 1; x3 = maxX3 - 1; break; + case D3Q27System::TSW: x1 = 1; x2 = 1; x3 = maxX3 - 1; break; + case D3Q27System::TSE: x1 = maxX1 - 1; x2 = 1; x3 = maxX3 - 1; break; + case D3Q27System::BNE: x1 = maxX1 - 1; x2 = maxX2 - 1; x3 = 1; break; + case D3Q27System::BNW: x1 = 1; x2 = maxX2 - 1; x3 = 1; break; + case D3Q27System::BSW: x1 = 1; x2 = 1; x3 = 1; break; + case D3Q27System::BSE: x1 = maxX1 - 1; x2 = 1; x3 = 1; break; + } + fillData(sdata, index, x1, x2, x3); + } + else UB_THROW(UbException(UB_EXARGS, "unknown dir")); +} +//////////////////////////////////////////////////////////////////////// +void ThixotropyFullVectorConnector::distributeReceiveVectors() +{ + /*e.g. connector sendet nach EAST --> empfaengt daten aus WEST ;-)*/ + + localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getLocalDistributions(); + nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getNonLocalDistributions(); + zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getZeroDistributions(); + + localHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getLocalDistributions(); + nonLocalHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getNonLocalDistributions(); + zeroHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getZeroDistributions(); + + vector_type& rdata = receiver->getData(); + + int index = 0; + + if (sendDir == D3Q27System::W) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + distributeData(rdata, index, 0, x2, x3); + } + } + } + else if (sendDir == D3Q27System::E) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + distributeData(rdata, index, maxX1, x2, x3); + } + } + } + else if (sendDir == D3Q27System::S) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + distributeData(rdata, index, x1, 0, x3); + } + } + } + else if (sendDir == D3Q27System::N) + { + for (int x3 = 1; x3 < maxX3; x3++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + distributeData(rdata, index, x1, maxX2, x3); + } + } + } + else if (sendDir == D3Q27System::B) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + distributeData(rdata, index, x1, x2, 0); + } + } + } + else if (sendDir == D3Q27System::T) + { + for (int x2 = 1; x2 < maxX2; x2++) + { + for (int x1 = 1; x1 < maxX1; x1++) + { + distributeData(rdata, index, x1, x2, maxX3); + } + } + } + //NE NW SW SE + else if (sendDir == D3Q27System::NE || sendDir == D3Q27System::NW || sendDir == D3Q27System::SW || sendDir == D3Q27System::SE) + { + int x1 = 0; + int x2 = 0; + switch (sendDir) //wenn sendir NE dann kommen werte von SW + { + case D3Q27System::NE: + x1 = maxX1; + x2 = maxX2; + break; + case D3Q27System::NW: + x1 = 0; + x2 = maxX2; + break; + case D3Q27System::SW: + x1 = 0; + x2 = 0; + break; + case D3Q27System::SE: + x1 = maxX1; + x2 = 0; + break; + } + for (int x3 = 1; x3 < maxX3; x3++) + { + distributeData(rdata, index, x1, x2, x3); + } + + } + //TE TW BW BE + else if (sendDir == D3Q27System::TE || sendDir == D3Q27System::TW || sendDir == D3Q27System::BW || sendDir == D3Q27System::BE) + + { + int x1 = 0; + int x3 = 0; + switch (sendDir) //wenn sendir NE dann kommen werte von SW + { + case D3Q27System::TE: + x1 = maxX1; + x3 = maxX3; + break; + case D3Q27System::TW: + x1 = 0; + x3 = maxX3; + break; + case D3Q27System::BW: + x1 = 0; + x3 = 0; + break; + case D3Q27System::BE: + x1 = maxX1; + x3 = 0; + break; + } + for (int x2 = 1; x2 < maxX2; x2++) + { + distributeData(rdata, index, x1, x2, x3); + } + } + //TN BN BS TS + else if (sendDir == D3Q27System::TN || sendDir == D3Q27System::BN || sendDir == D3Q27System::BS || sendDir == D3Q27System::TS) + { + int x2 = 0; + int x3 = 0; + switch (sendDir) + { + case D3Q27System::TN: + x3 = maxX3; + x2 = maxX2; + break; + case D3Q27System::BN: + x3 = 0; + x2 = maxX2; + break; + case D3Q27System::BS: + x3 = 0; + x2 = 0; + break; + case D3Q27System::TS: + x3 = maxX3; + x2 = 0; + break; + + } + for (int x1 = 1; x1 < maxX1; x1++) + { + distributeData(rdata, index, x1, x2, x3); + } + } + //TNE TNW TSW TSE BNE BNW BSW BSE + else if (sendDir == D3Q27System::TNE || sendDir == D3Q27System::TNW || sendDir == D3Q27System::TSW || sendDir == D3Q27System::TSE + || sendDir == D3Q27System::BNE || sendDir == D3Q27System::BNW || sendDir == D3Q27System::BSW || sendDir == D3Q27System::BSE) + { + int x1 = 0; + int x2 = 0; + int x3 = 0; + + switch (sendDir) + { + case D3Q27System::TNE: + x1 = maxX1; + x2 = maxX2; + x3 = maxX3; + break; + case D3Q27System::TNW: + x1 = 0; + x2 = maxX2; + x3 = maxX3; + break; + case D3Q27System::TSW: + x1 = 0; + x2 = 0; + x3 = maxX3; + break; + case D3Q27System::TSE: + x1 = maxX1; + x2 = 0; + x3 = maxX3; + break; + case D3Q27System::BNE: + x1 = maxX1; + x2 = maxX2; + x3 = 0; + break; + case D3Q27System::BNW: + x1 = 0; + x2 = maxX2; + x3 = 0; + break; + case D3Q27System::BSW: + x1 = 0; + x2 = 0; + x3 = 0; + break; + case D3Q27System::BSE: + x1 = maxX1; + x2 = 0; + x3 = 0; + break; + } + distributeData(rdata, index, x1, x2, x3); + } + else UB_THROW(UbException(UB_EXARGS, "unknown dir")); +} +////////////////////////////////////////////////////////////////////////// + + diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.h new file mode 100644 index 000000000..0b2bd66b9 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/ThixotropyFullVectorConnector.h @@ -0,0 +1,189 @@ +#ifndef ThixotropyFullVectorConnector_H +#define ThixotropyFullVectorConnector_H + +#include <vector> + +#include "RemoteBlock3DConnector.h" +#include "D3Q27System.h" +//#include "Block3D.h" +//#include "LBMKernel.h" +//#include "EsoTwist3D.h" +#include "basics/container/CbArray3D.h" +#include "basics/container/CbArray4D.h" + +class EsoTwist3D; +class Block3D; + +//daten werden in einen vector (dieser befindet sich im transmitter) kopiert +//der vector wird via transmitter uebertragen +//transmitter kann ein lokal, MPI, RCG, CTL oder was auch immer fuer ein +//transmitter sein, der von Transmitter abgeleitet ist ;-) +class ThixotropyFullVectorConnector : public RemoteBlock3DConnector +{ +public: + ThixotropyFullVectorConnector(SPtr<Block3D> block + , VectorTransmitterPtr sender + , VectorTransmitterPtr receiver + , int sendDir); + + void init(); + + void fillSendVectors(); + void distributeReceiveVectors(); + +protected: + inline void fillData(vector_type& sdata, int& index, int x1, int x2, int x3); + inline void distributeData(vector_type& rdata, int& index, int x1, int x2, int x3); +private: + int maxX1; + int maxX2; + int maxX3; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributions; + + SPtr<EsoTwist3D> fDis; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localHdistributions; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalHdistributions; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroHdistributions; + + + SPtr<EsoTwist3D> hDis; + +}; + +////////////////////////////////////////////////////////////////////////// +inline void ThixotropyFullVectorConnector::fillData(vector_type& sdata, int& index, int x1, int x2, int x3) +{ + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + + sdata[index++] = (*this->zeroDistributions)(x1, x2, x3); + + + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + + sdata[index++] = (*this->zeroHdistributions)(x1, x2, x3); + +} +////////////////////////////////////////////////////////////////////////// +inline void ThixotropyFullVectorConnector::distributeData(vector_type& rdata, int& index, int x1, int x2, int x3) +{ + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++]; + + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++]; + + (*this->zeroDistributions)(x1, x2, x3) = rdata[index++]; + + + (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++]; + + (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++]; + + (*this->zeroHdistributions)(x1, x2, x3) = rdata[index++]; +} + + +#endif //D3Q27VECTORCONNECTOR_H + diff --git a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h index c0171588b..d0ed4c60f 100644 --- a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h +++ b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h @@ -1,124 +1,151 @@ -//======================================================================================= -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ -// \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ -// -// This file is part of VirtualFluids. VirtualFluids is free software: you can -// redistribute it and/or modify it under the terms of the GNU General Public -// License as published by the Free Software Foundation, either version 3 of -// the License, or (at your option) any later version. -// -// VirtualFluids is distributed in the hope that it will be useful, but WITHOUT -// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with VirtualFluids (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>. -// -//! \file DataSet3D.h -//! \ingroup Data -//! \author Konstantin Kutscher -//======================================================================================= - #ifndef DataSet3D_h #define DataSet3D_h #include <PointerDefinitions.h> -#include "DistributionArray3D.h" -#include "basics/container/CbArray3D.h" #include "basics/container/CbArray4D.h" +#include "basics/container/CbArray3D.h" +#include "DistributionArray3D.h" -using AverageValuesArray3D = CbArray4D<LBMReal, IndexerX4X3X2X1>; -using ShearStressValuesArray3D = CbArray4D<LBMReal, IndexerX4X3X2X1>; -using RelaxationFactorArray3D = CbArray3D<LBMReal, IndexerX3X2X1>; +typedef CbArray4D<LBMReal,IndexerX4X3X2X1> AverageValuesArray3D; +typedef CbArray4D<LBMReal,IndexerX4X3X2X1> ShearStressValuesArray3D; +typedef CbArray3D<LBMReal, IndexerX3X2X1> RelaxationFactorArray3D; -//! A class provides an interface for data structures in the kernel. class DataSet3D { public: - SPtr<DistributionArray3D> getFdistributions() const; - void setFdistributions(SPtr<DistributionArray3D> distributions); + SPtr<DistributionArray3D> getFdistributions() const; + void setFdistributions(SPtr<DistributionArray3D> distributions); - SPtr<AverageValuesArray3D> getAverageDensity() const; - void setAverageDensity(SPtr<AverageValuesArray3D> values); + SPtr<DistributionArray3D> getHdistributions() const; + void setHdistributions(SPtr<DistributionArray3D> distributions); - SPtr<AverageValuesArray3D> getAverageVelocity() const; - void setAverageVelocity(SPtr<AverageValuesArray3D> values); + SPtr<AverageValuesArray3D> getAverageDensity() const; + void setAverageDensity(SPtr<AverageValuesArray3D> values); - SPtr<AverageValuesArray3D> getAverageFluctuations() const; - void setAverageFluctuations(SPtr<AverageValuesArray3D> values); + SPtr<AverageValuesArray3D> getAverageVelocity() const; + void setAverageVelocity(SPtr<AverageValuesArray3D> values); - SPtr<AverageValuesArray3D> getAverageTriplecorrelations() const; - void setAverageTriplecorrelations(SPtr<AverageValuesArray3D> values); + SPtr<AverageValuesArray3D> getAverageFluctuations() const; + void setAverageFluctuations(SPtr<AverageValuesArray3D> values); - SPtr<AverageValuesArray3D> getAverageValues() const; - void setAverageValues(SPtr<AverageValuesArray3D> values); - - SPtr<ShearStressValuesArray3D> getShearStressValues() const; - void setShearStressValues(SPtr<ShearStressValuesArray3D> values); - - SPtr<RelaxationFactorArray3D> getRelaxationFactor() const; - void setRelaxationFactor(SPtr<RelaxationFactorArray3D> values); + SPtr<AverageValuesArray3D> getAverageTriplecorrelations() const; + void setAverageTriplecorrelations(SPtr<AverageValuesArray3D> values); + + SPtr<AverageValuesArray3D> getAverageValues() const; + void setAverageValues(SPtr<AverageValuesArray3D> values); + + SPtr<ShearStressValuesArray3D> getShearStressValues() const; + void setShearStressValues(SPtr<ShearStressValuesArray3D> values); + SPtr<RelaxationFactorArray3D> getRelaxationFactor() const; + void setRelaxationFactor(SPtr<RelaxationFactorArray3D> values); protected: private: - SPtr<DistributionArray3D> fdistributions; - SPtr<AverageValuesArray3D> averageValues; + SPtr<DistributionArray3D> fdistributions; + + SPtr<DistributionArray3D> hdistributions; + + SPtr<AverageValuesArray3D> averageValues; + + SPtr<AverageValuesArray3D> averageDensity; + SPtr<AverageValuesArray3D> averageVelocity; + SPtr<AverageValuesArray3D> averageFluktuations; + SPtr<AverageValuesArray3D> averageTriplecorrelations; - SPtr<AverageValuesArray3D> averageDensity; - SPtr<AverageValuesArray3D> averageVelocity; - SPtr<AverageValuesArray3D> averageFluktuations; - SPtr<AverageValuesArray3D> averageTriplecorrelations; + SPtr<ShearStressValuesArray3D> shearStressValues; - SPtr<ShearStressValuesArray3D> shearStressValues; + SPtr<RelaxationFactorArray3D> relaxationFactor; - SPtr<RelaxationFactorArray3D> relaxationFactor; }; -inline SPtr<DistributionArray3D> DataSet3D::getFdistributions() const { return fdistributions; } +inline SPtr<DistributionArray3D> DataSet3D::getFdistributions() const +{ + return fdistributions; +} + +inline void DataSet3D::setFdistributions(SPtr<DistributionArray3D> distributions) +{ + fdistributions = distributions; +} + +inline SPtr<DistributionArray3D> DataSet3D::getHdistributions() const +{ + return hdistributions; +} -inline void DataSet3D::setFdistributions(SPtr<DistributionArray3D> distributions) { fdistributions = distributions; } +inline void DataSet3D::setHdistributions(SPtr<DistributionArray3D> distributions) +{ + hdistributions = distributions; +} -inline SPtr<AverageValuesArray3D> DataSet3D::getAverageValues() const { return averageValues; } +inline SPtr<AverageValuesArray3D> DataSet3D::getAverageValues() const +{ + return averageValues; +} -inline void DataSet3D::setAverageValues(SPtr<AverageValuesArray3D> values) { averageValues = values; } +inline void DataSet3D::setAverageValues(SPtr<AverageValuesArray3D> values) +{ + averageValues = values; +} -inline SPtr<AverageValuesArray3D> DataSet3D::getAverageDensity() const { return averageDensity; } +inline SPtr<AverageValuesArray3D> DataSet3D::getAverageDensity() const +{ + return averageDensity; +} -inline void DataSet3D::setAverageDensity(SPtr<AverageValuesArray3D> values) { averageDensity = values; } +inline void DataSet3D::setAverageDensity(SPtr<AverageValuesArray3D> values) +{ + averageDensity = values; +} -inline SPtr<AverageValuesArray3D> DataSet3D::getAverageVelocity() const { return averageVelocity; } +inline SPtr<AverageValuesArray3D> DataSet3D::getAverageVelocity() const +{ + return averageVelocity; +} -inline void DataSet3D::setAverageVelocity(SPtr<AverageValuesArray3D> values) { averageVelocity = values; } +inline void DataSet3D::setAverageVelocity(SPtr<AverageValuesArray3D> values) +{ + averageVelocity = values; +} -inline SPtr<AverageValuesArray3D> DataSet3D::getAverageFluctuations() const { return averageFluktuations; } +inline SPtr<AverageValuesArray3D> DataSet3D::getAverageFluctuations() const +{ + return averageFluktuations; +} -inline void DataSet3D::setAverageFluctuations(SPtr<AverageValuesArray3D> values) { averageFluktuations = values; } +inline void DataSet3D::setAverageFluctuations(SPtr<AverageValuesArray3D> values) +{ + averageFluktuations = values; +} -inline SPtr<AverageValuesArray3D> DataSet3D::getAverageTriplecorrelations() const { return averageTriplecorrelations; } +inline SPtr<AverageValuesArray3D> DataSet3D::getAverageTriplecorrelations() const +{ + return averageTriplecorrelations; +} inline void DataSet3D::setAverageTriplecorrelations(SPtr<AverageValuesArray3D> values) { - averageTriplecorrelations = values; + averageTriplecorrelations = values; } -inline SPtr<ShearStressValuesArray3D> DataSet3D::getShearStressValues() const { return shearStressValues; } +inline SPtr<ShearStressValuesArray3D> DataSet3D::getShearStressValues() const +{ + return shearStressValues; +} -inline void DataSet3D::setShearStressValues(SPtr<ShearStressValuesArray3D> values) { shearStressValues = values; } +inline void DataSet3D::setShearStressValues(SPtr<ShearStressValuesArray3D> values) +{ + shearStressValues = values; +} -inline SPtr<RelaxationFactorArray3D> DataSet3D::getRelaxationFactor() const { return relaxationFactor; } +inline SPtr<RelaxationFactorArray3D> DataSet3D::getRelaxationFactor() const +{ + return relaxationFactor; +} -inline void DataSet3D::setRelaxationFactor(SPtr<RelaxationFactorArray3D> values) { relaxationFactor = values; } +inline void DataSet3D::setRelaxationFactor(SPtr<RelaxationFactorArray3D> values) +{ + relaxationFactor = values; +} #endif diff --git a/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp new file mode 100644 index 000000000..553c49961 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp @@ -0,0 +1,61 @@ +#include "BasicLBMKernel.h" +#include "D3Q27System.h" +#include "BCArray3D.h" +#include "BCProcessor.h" + +BasicLBMKernel::BasicLBMKernel() +{ + +} + +BasicLBMKernel::~BasicLBMKernel(void) +{ +} + +void BasicLBMKernel::calculate(int step) +{ + using namespace D3Q27System; + using namespace std; + + //timer.resetAndStart(); + + + ///////////////////////////////////// + + //localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + //nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + //zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + + initData(); + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + const int bcArrayMaxX1 = (int)bcArray->getNX1(); + const int bcArrayMaxX2 = (int)bcArray->getNX2(); + const int bcArrayMaxX3 = (int)bcArray->getNX3(); + + minX1 = ghostLayerWidth; + minX2 = ghostLayerWidth; + minX3 = ghostLayerWidth; + maxX1 = bcArrayMaxX1 - ghostLayerWidth; + maxX2 = bcArrayMaxX2 - ghostLayerWidth; + maxX3 = bcArrayMaxX3 - ghostLayerWidth; + + for (int x3 = minX3; x3 < maxX3; x3++) + { + for (int x2 = minX2; x2 < maxX2; x2++) + { + for (int x1 = minX1; x1 < maxX1; x1++) + { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) + { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + + nodeCollision(step, x1, x2, x3); + } + } + } + } +} diff --git a/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.h new file mode 100644 index 000000000..4a6b4632f --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.h @@ -0,0 +1,25 @@ +#ifndef BasicLBMKernell_h__ +#define BasicLBMKernel_h__ + +#include "LBMKernel.h" + + +class BasicLBMKernel : public LBMKernel +{ +public: + BasicLBMKernel(); + virtual ~BasicLBMKernel(void); + virtual void calculate(int step); + virtual SPtr<LBMKernel> clone() = 0; +protected: + virtual void initData(){} + virtual void nodeCollision(int step, int x1, int x2, int x3) {} + int minX1; + int minX2; + int minX3; + int maxX1; + int maxX2; + int maxX3; +}; + +#endif // BasicLBMKernel_h__ \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/LBM/BinghamModelLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/BinghamModelLBMKernel.h new file mode 100644 index 000000000..8a3f1e58f --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/BinghamModelLBMKernel.h @@ -0,0 +1,38 @@ +#ifndef BinghamModelLBMKernel_H +#define BinghamModelLBMKernel_H + +#include "ThixotropyModelLBMKernel.h" +#include "Thixotropy.h" + +//! \brief Cumulant LBM kernel + Bingham plastic model +//! \author K. Kutscher, M. Geier +class BinghamModelLBMKernel : public ThixotropyModelLBMKernel +{ +public: + BinghamModelLBMKernel() {}; + ~BinghamModelLBMKernel() {}; + SPtr<LBMKernel> clone() override + { + SPtr<LBMKernel> kernel(new BinghamModelLBMKernel()); + kernel->setNX(nx); + kernel->setCollisionFactor(collFactor); + dynamicPointerCast<BinghamModelLBMKernel>(kernel)->initDataSet(); + kernel->setBCProcessor(bcProcessor->clone(kernel)); + kernel->setWithForcing(withForcing); + kernel->setForcingX1(muForcingX1); + kernel->setForcingX2(muForcingX2); + kernel->setForcingX3(muForcingX3); + kernel->setIndex(ix1, ix2, ix3); + kernel->setDeltaT(deltaT); + + return kernel; + } +protected: + LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const override + { + return Thixotropy::getBinghamCollFactor(omegaInf, shearRate, drho); + } +}; + + +#endif diff --git a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp index b01159e58..5542d2c98 100644 --- a/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/CompressibleCumulantLBMKernel.cpp @@ -13,9 +13,8 @@ using namespace UbMath; CompressibleCumulantLBMKernel::CompressibleCumulantLBMKernel() { this->compressible = true; - this->parameter = NORMAL; + this->parameter = CompressibleCumulantLBMKernel::NORMAL; this->OxyyMxzz = 1.0; - this->compressible = true; this->bulkOmegaToOmega = false; this->OxxPyyPzz = 1.0; } diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp new file mode 100644 index 000000000..57e26c7e0 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.cpp @@ -0,0 +1,1972 @@ +#include "CumulantLBMKernel.h" +#include "D3Q27System.h" +#include "InterpolationProcessor.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include <math.h> +#include "DataSet3D.h" +#include "Block3D.h" + +#define PROOF_CORRECTNESS + +////////////////////////////////////////////////////////////////////////// +CumulantLBMKernel::CumulantLBMKernel() +{ + this->compressible = true; + this->parameter = CumulantLBMKernel::NORMAL; + this->OxyyMxzz = 1.0; + this->bulkOmegaToOmega = false; + this->OxxPyyPzz = 1.0; +} +////////////////////////////////////////////////////////////////////////// +CumulantLBMKernel::~CumulantLBMKernel(void) +{ + +} +////////////////////////////////////////////////////////////////////////// +void CumulantLBMKernel::initDataSet() +{ + SPtr<DistributionArray3D> d(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9)); + dataSet->setFdistributions(d); +} +////////////////////////////////////////////////////////////////////////// +SPtr<LBMKernel> CumulantLBMKernel::clone() +{ + SPtr<LBMKernel> kernel(new CumulantLBMKernel()); + kernel->setNX(nx); + dynamicPointerCast<CumulantLBMKernel>(kernel)->initDataSet(); + kernel->setCollisionFactor(this->collFactor); + kernel->setBCProcessor(bcProcessor->clone(kernel)); + kernel->setWithForcing(withForcing); + kernel->setForcingX1(muForcingX1); + kernel->setForcingX2(muForcingX2); + kernel->setForcingX3(muForcingX3); + kernel->setIndex(ix1, ix2, ix3); + kernel->setDeltaT(deltaT); + kernel->setBlock(block.lock()); + + switch (parameter) + { + case NORMAL: + dynamicPointerCast<CumulantLBMKernel>(kernel)->OxyyMxzz = 1.0; + break; + case MAGIC: + dynamicPointerCast<CumulantLBMKernel>(kernel)->OxyyMxzz = 2.0 + (-collFactor); + break; + } + + if (bulkOmegaToOmega) + { + dynamicPointerCast<CumulantLBMKernel>(kernel)->OxxPyyPzz = collFactor; + } + else + { + dynamicPointerCast<CumulantLBMKernel>(kernel)->OxxPyyPzz = one; + } + return kernel; +} +////////////////////////////////////////////////////////////////////////// +//void CumulantLBMKernel::calculate(int step) +//{ +// using namespace D3Q27System; +// using namespace std; +// +// //timer.resetAndStart(); +// +// //initializing of forcing stuff +// if (withForcing) +// { +// muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); +// muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); +// muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); +// +// muDeltaT = deltaT; +// +// muForcingX1.DefineVar("dt", &muDeltaT); +// muForcingX2.DefineVar("dt", &muDeltaT); +// muForcingX3.DefineVar("dt", &muDeltaT); +// +// muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0); +// +// muForcingX1.DefineVar("nu", &muNu); +// muForcingX2.DefineVar("nu", &muNu); +// muForcingX3.DefineVar("nu", &muNu); +// +// LBMReal forcingX1 = 0; +// LBMReal forcingX2 = 0; +// LBMReal forcingX3 = 0; +// } +// ///////////////////////////////////// +// +// localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); +// nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); +// zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); +// +// SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); +// +// const int bcArrayMaxX1 = (int)bcArray->getNX1(); +// const int bcArrayMaxX2 = (int)bcArray->getNX2(); +// const int bcArrayMaxX3 = (int)bcArray->getNX3(); +// +// int minX1 = ghostLayerWidth; +// int minX2 = ghostLayerWidth; +// int minX3 = ghostLayerWidth; +// int maxX1 = bcArrayMaxX1 - ghostLayerWidth; +// int maxX2 = bcArrayMaxX2 - ghostLayerWidth; +// int maxX3 = bcArrayMaxX3 - ghostLayerWidth; +// +// LBMReal omega = collFactor; +// +// +// //#pragma omp parallel num_threads(8) +// { +// // int i = omp_get_thread_num(); +// // printf_s("Hello from thread %d\n", i); +// //} +// //#pragma omp for +// for (int x3 = minX3; x3 < maxX3; x3++) +// { +// for (int x2 = minX2; x2 < maxX2; x2++) +// { +// for (int x1 = minX1; x1 < maxX1; x1++) +// { +// if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) +// { +// int x1p = x1 + 1; +// int x2p = x2 + 1; +// int x3p = x3 + 1; +// ////////////////////////////////////////////////////////////////////////// +// //read distribution +// //////////////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////////////// +// +// //E N T +// //c c c +// ////////// +// //W S B +// //a a a +// +// //Rest ist b +// +// //mfxyz +// //a - negative +// //b - null +// //c - positive +// +// // a b c +// //-1 0 1 +// +// LBMReal mfcbb = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); +// LBMReal mfbcb = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); +// LBMReal mfbbc = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); +// LBMReal mfccb = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); +// LBMReal mfacb = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3); +// LBMReal mfcbc = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); +// LBMReal mfabc = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3); +// LBMReal mfbcc = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); +// LBMReal mfbac = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3); +// LBMReal mfccc = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); +// LBMReal mfacc = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3); +// LBMReal mfcac = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3); +// LBMReal mfaac = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3); +// +// LBMReal mfabb = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3); +// LBMReal mfbab = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3); +// LBMReal mfbba = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p); +// LBMReal mfaab = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3); +// LBMReal mfcab = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3); +// LBMReal mfaba = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p); +// LBMReal mfcba = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p); +// LBMReal mfbaa = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p); +// LBMReal mfbca = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p); +// LBMReal mfaaa = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p); +// LBMReal mfcaa = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p); +// LBMReal mfaca = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p); +// LBMReal mfcca = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p); +// +// LBMReal mfbbb = (*this->zeroDistributions)(x1, x2, x3); +// +// //////////////////////////////////////////////////////////////////////////////////// +// LBMReal drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + +// (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + +// ((mfabb + mfcbb) + (mfbab + mfbcb)) + (mfbba + mfbbc)) + mfbbb; +// +// LBMReal rho = one + drho; +// //////////////////////////////////////////////////////////////////////////////////// +// LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + +// (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + +// (mfcbb - mfabb)) / rho; +// LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + +// (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + +// (mfbcb - mfbab)) / rho; +// LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + +// (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + +// (mfbbc - mfbba)) / rho; +// //////////////////////////////////////////////////////////////////////////////////// +// +// //forcing +// /////////////////////////////////////////////////////////////////////////////////////////// +// if (withForcing) +// { +// muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1); +// muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2); +// muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3); +// +// forcingX1 = muForcingX1.Eval(); +// forcingX2 = muForcingX2.Eval(); +// forcingX3 = muForcingX3.Eval(); +// +// vvx += forcingX1 * deltaT * 0.5; // X +// vvy += forcingX2 * deltaT * 0.5; // Y +// vvz += forcingX3 * deltaT * 0.5; // Z +// } +// /////////////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// LBMReal oMdrho = one; // comp special +// //////////////////////////////////////////////////////////////////////////////////// +// LBMReal m0, m1, m2; +// LBMReal vx2; +// LBMReal vy2; +// LBMReal vz2; +// vx2 = vvx * vvx; +// vy2 = vvy * vvy; +// vz2 = vvz * vvz; +// //////////////////////////////////////////////////////////////////////////////////// +// //LBMReal wadjust; +// //LBMReal qudricLimitP = 0.01f;// * 0.0001f; +// //LBMReal qudricLimitM = 0.01f;// * 0.0001f; +// //LBMReal qudricLimitD = 0.01f;// * 0.001f; +// //LBMReal s9 = minusomega; +// //test +// //s9 = 0.; +// //////////////////////////////////////////////////////////////////////////////////// +// //Hin +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Z - Dir +// m2 = mfaaa + mfaac; +// m1 = mfaac - mfaaa; +// m0 = m2 + mfaab; +// mfaaa = m0; +// m0 += c1o36 * oMdrho; +// mfaab = m1 - m0 * vvz; +// mfaac = m2 - two * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaba + mfabc; +// m1 = mfabc - mfaba; +// m0 = m2 + mfabb; +// mfaba = m0; +// m0 += c1o9 * oMdrho; +// mfabb = m1 - m0 * vvz; +// mfabc = m2 - two * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaca + mfacc; +// m1 = mfacc - mfaca; +// m0 = m2 + mfacb; +// mfaca = m0; +// m0 += c1o36 * oMdrho; +// mfacb = m1 - m0 * vvz; +// mfacc = m2 - two * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbaa + mfbac; +// m1 = mfbac - mfbaa; +// m0 = m2 + mfbab; +// mfbaa = m0; +// m0 += c1o9 * oMdrho; +// mfbab = m1 - m0 * vvz; +// mfbac = m2 - two * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbba + mfbbc; +// m1 = mfbbc - mfbba; +// m0 = m2 + mfbbb; +// mfbba = m0; +// m0 += c4o9 * oMdrho; +// mfbbb = m1 - m0 * vvz; +// mfbbc = m2 - two * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbca + mfbcc; +// m1 = mfbcc - mfbca; +// m0 = m2 + mfbcb; +// mfbca = m0; +// m0 += c1o9 * oMdrho; +// mfbcb = m1 - m0 * vvz; +// mfbcc = m2 - two * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcaa + mfcac; +// m1 = mfcac - mfcaa; +// m0 = m2 + mfcab; +// mfcaa = m0; +// m0 += c1o36 * oMdrho; +// mfcab = m1 - m0 * vvz; +// mfcac = m2 - two * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcba + mfcbc; +// m1 = mfcbc - mfcba; +// m0 = m2 + mfcbb; +// mfcba = m0; +// m0 += c1o9 * oMdrho; +// mfcbb = m1 - m0 * vvz; +// mfcbc = m2 - two * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcca + mfccc; +// m1 = mfccc - mfcca; +// m0 = m2 + mfccb; +// mfcca = m0; +// m0 += c1o36 * oMdrho; +// mfccb = m1 - m0 * vvz; +// mfccc = m2 - two * m1 * vvz + vz2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Y - Dir +// m2 = mfaaa + mfaca; +// m1 = mfaca - mfaaa; +// m0 = m2 + mfaba; +// mfaaa = m0; +// m0 += c1o6 * oMdrho; +// mfaba = m1 - m0 * vvy; +// mfaca = m2 - two * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaab + mfacb; +// m1 = mfacb - mfaab; +// m0 = m2 + mfabb; +// mfaab = m0; +// mfabb = m1 - m0 * vvy; +// mfacb = m2 - two * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaac + mfacc; +// m1 = mfacc - mfaac; +// m0 = m2 + mfabc; +// mfaac = m0; +// m0 += c1o18 * oMdrho; +// mfabc = m1 - m0 * vvy; +// mfacc = m2 - two * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbaa + mfbca; +// m1 = mfbca - mfbaa; +// m0 = m2 + mfbba; +// mfbaa = m0; +// m0 += c2o3 * oMdrho; +// mfbba = m1 - m0 * vvy; +// mfbca = m2 - two * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbab + mfbcb; +// m1 = mfbcb - mfbab; +// m0 = m2 + mfbbb; +// mfbab = m0; +// mfbbb = m1 - m0 * vvy; +// mfbcb = m2 - two * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfbac + mfbcc; +// m1 = mfbcc - mfbac; +// m0 = m2 + mfbbc; +// mfbac = m0; +// m0 += c2o9 * oMdrho; +// mfbbc = m1 - m0 * vvy; +// mfbcc = m2 - two * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcaa + mfcca; +// m1 = mfcca - mfcaa; +// m0 = m2 + mfcba; +// mfcaa = m0; +// m0 += c1o6 * oMdrho; +// mfcba = m1 - m0 * vvy; +// mfcca = m2 - two * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcab + mfccb; +// m1 = mfccb - mfcab; +// m0 = m2 + mfcbb; +// mfcab = m0; +// mfcbb = m1 - m0 * vvy; +// mfccb = m2 - two * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfcac + mfccc; +// m1 = mfccc - mfcac; +// m0 = m2 + mfcbc; +// mfcac = m0; +// m0 += c1o18 * oMdrho; +// mfcbc = m1 - m0 * vvy; +// mfccc = m2 - two * m1 * vvy + vy2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // X - Dir +// m2 = mfaaa + mfcaa; +// m1 = mfcaa - mfaaa; +// m0 = m2 + mfbaa; +// mfaaa = m0; +// m0 += one * oMdrho; +// mfbaa = m1 - m0 * vvx; +// mfcaa = m2 - two * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaba + mfcba; +// m1 = mfcba - mfaba; +// m0 = m2 + mfbba; +// mfaba = m0; +// mfbba = m1 - m0 * vvx; +// mfcba = m2 - two * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaca + mfcca; +// m1 = mfcca - mfaca; +// m0 = m2 + mfbca; +// mfaca = m0; +// m0 += c1o3 * oMdrho; +// mfbca = m1 - m0 * vvx; +// mfcca = m2 - two * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaab + mfcab; +// m1 = mfcab - mfaab; +// m0 = m2 + mfbab; +// mfaab = m0; +// mfbab = m1 - m0 * vvx; +// mfcab = m2 - two * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfabb + mfcbb; +// m1 = mfcbb - mfabb; +// m0 = m2 + mfbbb; +// mfabb = m0; +// mfbbb = m1 - m0 * vvx; +// mfcbb = m2 - two * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfacb + mfccb; +// m1 = mfccb - mfacb; +// m0 = m2 + mfbcb; +// mfacb = m0; +// mfbcb = m1 - m0 * vvx; +// mfccb = m2 - two * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfaac + mfcac; +// m1 = mfcac - mfaac; +// m0 = m2 + mfbac; +// mfaac = m0; +// m0 += c1o3 * oMdrho; +// mfbac = m1 - m0 * vvx; +// mfcac = m2 - two * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfabc + mfcbc; +// m1 = mfcbc - mfabc; +// m0 = m2 + mfbbc; +// mfabc = m0; +// mfbbc = m1 - m0 * vvx; +// mfcbc = m2 - two * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// m2 = mfacc + mfccc; +// m1 = mfccc - mfacc; +// m0 = m2 + mfbcc; +// mfacc = m0; +// m0 += c1o9 * oMdrho; +// mfbcc = m1 - m0 * vvx; +// mfccc = m2 - two * m1 * vvx + vx2 * m0; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// +// +// //////////////////////////////////////////////////////////////////////////////////// +// // Cumulants +// //////////////////////////////////////////////////////////////////////////////////// +// +// //LBMReal OxxPyyPzz = one; // bulk viscosity +// +// //////////////////////////////////////////////////////////// +// //3. +// ////////////////////////////// +// LBMReal OxyyPxzz = one;//three * (two - omega) / (three - omega);// +// //LBMReal OxyyMxzz = one;//six * (two - omega) / (six - omega);// +// LBMReal Oxyz = one;//twelve * (two - omega) / (twelve + omega);// +// ////////////////////////////// +// //LBMReal OxyyPxzz = two-omega;// +// //LBMReal OxyyMxzz = two-omega;// +// ////////////////////////////// +// //LBMReal OxyyPxzz = (eight * (omega - two)) / (omega - eight);//Ginzburg +// //LBMReal OxyyMxzz = (eight * (omega - two)) / (omega - eight);//Ginzburg +// ////////////////////////////// +// //LBMReal OxyyPxzz = omega;//BGK +// //LBMReal OxyyMxzz = omega;//BGK +// ////////////////////////////// +// //LBMReal OxyyPxzz = (one + omega) / two;//1P5 +// //LBMReal OxyyMxzz = (one + omega) / two;//1P5 +// ////////////////////////////// +// //LBMReal OxyyPxzz = (three - omega) / two;//0P5 +// //LBMReal OxyyMxzz = (three - omega) / two;//0P5 +// ////////////////////////////// +// //LBMReal OxyyPxzz = (one + (eight * (omega - two)) / (omega - eight)) / two;//one + Ginzburg / two ... Car +// //LBMReal OxyyMxzz = (one + (eight * (omega - two)) / (omega - eight)) / two;//one + Ginzburg / two ... Car +// //////////////////////////////////////////////////////////// +// //4. +// ////////////////////////////// +// LBMReal O4 = one; +// ////////////////////////////// +// //LBMReal O4 = omega;//TRT +// //////////////////////////////////////////////////////////// +// //5. +// ////////////////////////////// +// LBMReal O5 = one; +// //////////////////////////////////////////////////////////// +// //6. +// ////////////////////////////// +// LBMReal O6 = one; +// //////////////////////////////////////////////////////////// +// +// +// //central moments to cumulants +// //4. +// LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + two * mfbba * mfbab) / rho; //ab 15.05.2015 verwendet +// LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + two * mfbba * mfabb) / rho; //ab 15.05.2015 verwendet +// LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + two * mfbab * mfabb) / rho; //ab 15.05.2015 verwendet +// +// LBMReal CUMcca = mfcca - (((mfcaa * mfaca + two * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9 * (drho / rho)); +// LBMReal CUMcac = mfcac - (((mfcaa * mfaac + two * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9 * (drho / rho)); +// LBMReal CUMacc = mfacc - (((mfaac * mfaca + two * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9 * (drho / rho)); +// +// //5. +// LBMReal CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + four * mfabb * mfbbb + two * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; +// LBMReal CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + four * mfbab * mfbbb + two * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; +// LBMReal CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + four * mfbba * mfbbb + two * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; +// +// //6. +// +// LBMReal CUMccc = mfccc + ((-four * mfbbb * mfbbb +// - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) +// - four * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) +// - two * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho +// + (four * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) +// + two * (mfcaa * mfaca * mfaac) +// + sixteen * mfbba * mfbab * mfabb) / (rho * rho) +// - c1o3 * (mfacc + mfcac + mfcca) / rho +// - c1o9 * (mfcaa + mfaca + mfaac) / rho +// + (two * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) +// + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 +// + c1o27 * ((drho * drho - drho) / (rho * rho))); +// //+ c1o27*(one -three/rho +two/(rho*rho))); +// +// +// +// +// //2. +// // linear combinations +// LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; +// LBMReal mxxMyy = mfcaa - mfaca; +// LBMReal mxxMzz = mfcaa - mfaac; +// +// ////////////////////////////////////////////////////////////////////////// +// // LBMReal magicBulk=(CUMacc+CUMcac+CUMcca)*(one/OxxPyyPzz-c1o2)*c3o2*8.; +// +// ////////////////////////////////////////////////////////////////////////// +// //limiter-Scheise Teil 1 +// //LBMReal oxxyy,oxxzz,oxy,oxz,oyz; +// //LBMReal smag=0.001; +// //oxxyy = omega+(one-omega)*fabs(mxxMyy)/(fabs(mxxMyy)+smag); +// //oxxzz = omega+(one-omega)*fabs(mxxMzz)/(fabs(mxxMzz)+smag); +// //oxy = omega+(one-omega)*fabs(mfbba)/(fabs(mfbba)+smag); +// //oxz = omega+(one-omega)*fabs(mfbab)/(fabs(mfbab)+smag); +// //oyz = omega+(one-omega)*fabs(mfabb)/(fabs(mfabb)+smag); +// +// //////////////////////////////////////////////////////////////////////////// +// ////Teil 1b +// //LBMReal constante = 1000.0; +// //LBMReal nuEddi = constante * fabs(mxxPyyPzz); +// //LBMReal omegaLimit = one / (one / omega + three * nuEddi); +// +// //{ +// // LBMReal dxux = c1o2 * (-omegaLimit) *(mxxMyy + mxxMzz) + OxxPyyPzz * (mfaaa - mxxPyyPzz); +// // LBMReal dyuy = dxux + omegaLimit * c3o2 * mxxMyy; +// // LBMReal dzuz = dxux + omegaLimit * c3o2 * mxxMzz; +// +// ////relax +// //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz)- three * (one - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); +// //mxxMyy += omegaLimit * (-mxxMyy) - three * (one + c1o2 * (-omegaLimit)) * (vx2 * dxux + vy2 * dyuy); +// //mxxMzz += omegaLimit * (-mxxMzz) - three * (one + c1o2 * (-omegaLimit)) * (vx2 * dxux + vz2 * dzuz); +// +// //} +// //mfabb += omegaLimit * (-mfabb); +// //mfbab += omegaLimit * (-mfbab); +// //mfbba += omegaLimit * (-mfbba); +// //////////////////////////////////////////////////////////////////////////// +// +// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// //incl. correction (hat noch nicht so gut funktioniert...Optimierungsbedarf??) +// { +// LBMReal dxux = c1o2 * (-omega) * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); +// LBMReal dyuy = dxux + omega * c3o2 * mxxMyy; +// LBMReal dzuz = dxux + omega * c3o2 * mxxMzz; +// +// //relax +// mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - three * (one - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz; +// mxxMyy += omega * (-mxxMyy) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); +// mxxMzz += omega * (-mxxMzz) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); +// +// ////////////////////////////////////////////////////////////////////////// +// //limiter-Scheise Teil 2 +// //mxxMyy += oxxyy * (-mxxMyy) - three * (one + c1o2 * (-omega)) * (vx2 * dxux + vy2 * dyuy); +// //mxxMzz += oxxzz * (-mxxMzz) - three * (one + c1o2 * (-omega)) * (vx2 * dxux + vz2 * dzuz); +// ////////////////////////////////////////////////////////////////////////// +// +// } +// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// ////no correction +// //mxxPyyPzz += OxxPyyPzz*(mfaaa-mxxPyyPzz);//-magicBulk*OxxPyyPzz; +// //mxxMyy += -(-omega) * (-mxxMyy); +// //mxxMzz += -(-omega) * (-mxxMzz); +// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// mfabb += omega * (-mfabb); +// mfbab += omega * (-mfbab); +// mfbba += omega * (-mfbba); +// +// ////////////////////////////////////////////////////////////////////////// +// //limiter-Scheise Teil 3 +// //mfabb += oyz * (-mfabb); +// //mfbab += oxz * (-mfbab); +// //mfbba += oxy * (-mfbba); +// ////////////////////////////////////////////////////////////////////////// +// +// // linear combinations back +// mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); +// mfaca = c1o3 * (-two * mxxMyy + mxxMzz + mxxPyyPzz); +// mfaac = c1o3 * (mxxMyy - two * mxxMzz + mxxPyyPzz); +// +// //3. +// // linear combinations +// +// LBMReal mxxyPyzz = mfcba + mfabc; +// LBMReal mxxyMyzz = mfcba - mfabc; +// +// LBMReal mxxzPyyz = mfcab + mfacb; +// LBMReal mxxzMyyz = mfcab - mfacb; +// +// LBMReal mxyyPxzz = mfbca + mfbac; +// LBMReal mxyyMxzz = mfbca - mfbac; +// +// //relax +// ////////////////////////////////////////////////////////////////////////// +// //das ist der limiter +// //wadjust = Oxyz+(one-Oxyz)*fabs(mfbbb)/(fabs(mfbbb)+qudricLimitD); +// //mfbbb += wadjust * (-mfbbb); +// //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxxyPyzz)/(fabs(mxxyPyzz)+qudricLimitP); +// //mxxyPyzz += wadjust * (-mxxyPyzz); +// //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxxyMyzz)/(fabs(mxxyMyzz)+qudricLimitM); +// //mxxyMyzz += wadjust * (-mxxyMyzz); +// //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxxzPyyz)/(fabs(mxxzPyyz)+qudricLimitP); +// //mxxzPyyz += wadjust * (-mxxzPyyz); +// //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxxzMyyz)/(fabs(mxxzMyyz)+qudricLimitM); +// //mxxzMyyz += wadjust * (-mxxzMyyz); +// //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxyyPxzz)/(fabs(mxyyPxzz)+qudricLimitP); +// //mxyyPxzz += wadjust * (-mxyyPxzz); +// //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxyyMxzz)/(fabs(mxyyMxzz)+qudricLimitM); +// //mxyyMxzz += wadjust * (-mxyyMxzz); +// ////////////////////////////////////////////////////////////////////////// +// //ohne limiter +// mfbbb += OxyyMxzz * (-mfbbb); +// mxxyPyzz += OxyyPxzz * (-mxxyPyzz); +// mxxyMyzz += OxyyMxzz * (-mxxyMyzz); +// mxxzPyyz += OxyyPxzz * (-mxxzPyyz); +// mxxzMyyz += OxyyMxzz * (-mxxzMyyz); +// mxyyPxzz += OxyyPxzz * (-mxyyPxzz); +// mxyyMxzz += OxyyMxzz * (-mxyyMxzz); +// ////////////////////////////////////////////////////////////////////////// +// +// //// linear combinations back +// mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; +// mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; +// mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; +// mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; +// mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; +// mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; +// +// //4. +// ////////////////////////////////////////////////////////////////////////// +// //mit limiter +// // wadjust = O4+(one-O4)*fabs(CUMacc)/(fabs(CUMacc)+qudricLimit); +// //CUMacc += wadjust * (-CUMacc); +// // wadjust = O4+(one-O4)*fabs(CUMcac)/(fabs(CUMcac)+qudricLimit); +// //CUMcac += wadjust * (-CUMcac); +// // wadjust = O4+(one-O4)*fabs(CUMcca)/(fabs(CUMcca)+qudricLimit); +// //CUMcca += wadjust * (-CUMcca); +// +// // wadjust = O4+(one-O4)*fabs(CUMbbc)/(fabs(CUMbbc)+qudricLimit); +// //CUMbbc += wadjust * (-CUMbbc); +// // wadjust = O4+(one-O4)*fabs(CUMbcb)/(fabs(CUMbcb)+qudricLimit); +// //CUMbcb += wadjust * (-CUMbcb); +// // wadjust = O4+(one-O4)*fabs(CUMcbb)/(fabs(CUMcbb)+qudricLimit); +// //CUMcbb += wadjust * (-CUMcbb); +// ////////////////////////////////////////////////////////////////////////// +// //ohne limiter +// CUMacc += O4 * (-CUMacc); +// CUMcac += O4 * (-CUMcac); +// CUMcca += O4 * (-CUMcca); +// +// CUMbbc += O4 * (-CUMbbc); +// CUMbcb += O4 * (-CUMbcb); +// CUMcbb += O4 * (-CUMcbb); +// ////////////////////////////////////////////////////////////////////////// +// +// +// //5. +// CUMbcc += O5 * (-CUMbcc); +// CUMcbc += O5 * (-CUMcbc); +// CUMccb += O5 * (-CUMccb); +// +// //6. +// CUMccc += O6 * (-CUMccc); +// +// +// +// //back cumulants to central moments +// //4. +// mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + two * mfbba * mfbab) / rho; +// mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + two * mfbba * mfabb) / rho; +// mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + two * mfbab * mfabb) / rho; +// +// mfcca = CUMcca + (((mfcaa * mfaca + two * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9 * (drho / rho));//(one/rho-one)); +// mfcac = CUMcac + (((mfcaa * mfaac + two * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9 * (drho / rho));//(one/rho-one)); +// mfacc = CUMacc + (((mfaac * mfaca + two * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9 * (drho / rho));//(one/rho-one)); +// +// //5. +// mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + four * mfabb * mfbbb + two * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; +// mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + four * mfbab * mfbbb + two * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; +// mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + four * mfbba * mfbbb + two * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; +// +// //6. +// +// mfccc = CUMccc - ((-four * mfbbb * mfbbb +// - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) +// - four * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) +// - two * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho +// + (four * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) +// + two * (mfcaa * mfaca * mfaac) +// + sixteen * mfbba * mfbab * mfabb) / (rho * rho) +// - c1o3 * (mfacc + mfcac + mfcca) / rho +// - c1o9 * (mfcaa + mfaca + mfaac) / rho +// + (two * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) +// + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 +// + c1o27 * ((drho * drho - drho) / (rho * rho))); +// //////////////////////////////////////////////////////////////////////////////////// +// //forcing +// mfbaa = -mfbaa; +// mfaba = -mfaba; +// mfaab = -mfaab; +// ////////////////////////////////////////////////////////////////////////////////////// +// +// //////////////////////////////////////////////////////////////////////////////////// +// //back +// //////////////////////////////////////////////////////////////////////////////////// +// //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Z - Dir +// m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + one * oMdrho) * (vz2 - vvz) * c1o2; +// m1 = -mfaac - two * mfaab * vvz + mfaaa * (one - vz2) - one * oMdrho * vz2; +// m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + one * oMdrho) * (vz2 + vvz) * c1o2; +// mfaaa = m0; +// mfaab = m1; +// mfaac = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; +// m1 = -mfabc - two * mfabb * vvz + mfaba * (one - vz2); +// m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; +// mfaba = m0; +// mfabb = m1; +// mfabc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; +// m1 = -mfacc - two * mfacb * vvz + mfaca * (one - vz2) - c1o3 * oMdrho * vz2; +// m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; +// mfaca = m0; +// mfacb = m1; +// mfacc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; +// m1 = -mfbac - two * mfbab * vvz + mfbaa * (one - vz2); +// m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; +// mfbaa = m0; +// mfbab = m1; +// mfbac = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; +// m1 = -mfbbc - two * mfbbb * vvz + mfbba * (one - vz2); +// m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; +// mfbba = m0; +// mfbbb = m1; +// mfbbc = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; +// m1 = -mfbcc - two * mfbcb * vvz + mfbca * (one - vz2); +// m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; +// mfbca = m0; +// mfbcb = m1; +// mfbcc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; +// m1 = -mfcac - two * mfcab * vvz + mfcaa * (one - vz2) - c1o3 * oMdrho * vz2; +// m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; +// mfcaa = m0; +// mfcab = m1; +// mfcac = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; +// m1 = -mfcbc - two * mfcbb * vvz + mfcba * (one - vz2); +// m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; +// mfcba = m0; +// mfcbb = m1; +// mfcbc = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; +// m1 = -mfccc - two * mfccb * vvz + mfcca * (one - vz2) - c1o9 * oMdrho * vz2; +// m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; +// mfcca = m0; +// mfccb = m1; +// mfccc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // Y - Dir +// m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfaca - two * mfaba * vvy + mfaaa * (one - vy2) - c1o6 * oMdrho * vy2; +// m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; +// mfaaa = m0; +// mfaba = m1; +// mfaca = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfacb - two * mfabb * vvy + mfaab * (one - vy2) - c2o3 * oMdrho * vy2; +// m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; +// mfaab = m0; +// mfabb = m1; +// mfacb = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfacc - two * mfabc * vvy + mfaac * (one - vy2) - c1o6 * oMdrho * vy2; +// m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; +// mfaac = m0; +// mfabc = m1; +// mfacc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; +// m1 = -mfbca - two * mfbba * vvy + mfbaa * (one - vy2); +// m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; +// mfbaa = m0; +// mfbba = m1; +// mfbca = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; +// m1 = -mfbcb - two * mfbbb * vvy + mfbab * (one - vy2); +// m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; +// mfbab = m0; +// mfbbb = m1; +// mfbcb = m2; +// /////////b////////////////////////////////////////////////////////////////////////// +// m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; +// m1 = -mfbcc - two * mfbbc * vvy + mfbac * (one - vy2); +// m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; +// mfbac = m0; +// mfbbc = m1; +// mfbcc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfcca - two * mfcba * vvy + mfcaa * (one - vy2) - c1o18 * oMdrho * vy2; +// m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; +// mfcaa = m0; +// mfcba = m1; +// mfcca = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfccb - two * mfcbb * vvy + mfcab * (one - vy2) - c2o9 * oMdrho * vy2; +// m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; +// mfcab = m0; +// mfcbb = m1; +// mfccb = m2; +// /////////c////////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; +// m1 = -mfccc - two * mfcbc * vvy + mfcac * (one - vy2) - c1o18 * oMdrho * vy2; +// m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; +// mfcac = m0; +// mfcbc = m1; +// mfccc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren +// //////////////////////////////////////////////////////////////////////////////////// +// // X - Dir +// m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcaa - two * mfbaa * vvx + mfaaa * (one - vx2) - c1o36 * oMdrho * vx2; +// m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; +// mfaaa = m0; +// mfbaa = m1; +// mfcaa = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcba - two * mfbba * vvx + mfaba * (one - vx2) - c1o9 * oMdrho * vx2; +// m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; +// mfaba = m0; +// mfbba = m1; +// mfcba = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcca - two * mfbca * vvx + mfaca * (one - vx2) - c1o36 * oMdrho * vx2; +// m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; +// mfaca = m0; +// mfbca = m1; +// mfcca = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcab - two * mfbab * vvx + mfaab * (one - vx2) - c1o9 * oMdrho * vx2; +// m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; +// mfaab = m0; +// mfbab = m1; +// mfcab = m2; +// ///////////b//////////////////////////////////////////////////////////////////////// +// m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcbb - two * mfbbb * vvx + mfabb * (one - vx2) - c4o9 * oMdrho * vx2; +// m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; +// mfabb = m0; +// mfbbb = m1; +// mfcbb = m2; +// ///////////b//////////////////////////////////////////////////////////////////////// +// m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfccb - two * mfbcb * vvx + mfacb * (one - vx2) - c1o9 * oMdrho * vx2; +// m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; +// mfacb = m0; +// mfbcb = m1; +// mfccb = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// //////////////////////////////////////////////////////////////////////////////////// +// m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcac - two * mfbac * vvx + mfaac * (one - vx2) - c1o36 * oMdrho * vx2; +// m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; +// mfaac = m0; +// mfbac = m1; +// mfcac = m2; +// ///////////c//////////////////////////////////////////////////////////////////////// +// m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfcbc - two * mfbbc * vvx + mfabc * (one - vx2) - c1o9 * oMdrho * vx2; +// m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; +// mfabc = m0; +// mfbbc = m1; +// mfcbc = m2; +// ///////////c//////////////////////////////////////////////////////////////////////// +// m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; +// m1 = -mfccc - two * mfbcc * vvx + mfacc * (one - vx2) - c1o36 * oMdrho * vx2; +// m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; +// mfacc = m0; +// mfbcc = m1; +// mfccc = m2; +// //////////////////////////////////////////////////////////////////////////////////// +// +// ////////////////////////////////////////////////////////////////////////// +// //proof correctness +// ////////////////////////////////////////////////////////////////////////// +//#ifdef PROOF_CORRECTNESS +// LBMReal drho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) +// + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) +// + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; +// //LBMReal dif = fabs(rho - rho_post); +// LBMReal dif = drho - drho_post; +//#ifdef SINGLEPRECISION +// if (dif > 10.0E-7 || dif < -10.0E-7) +//#else +// if (dif > 10.0E-15 || dif < -10.0E-15) +//#endif +// { +// UB_THROW(UbException(UB_EXARGS, "rho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(drho_post) +// + " dif=" + UbSystem::toString(dif) +// + " rho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3) +// + " in " + block.lock()->toString() + " step = " + UbSystem::toString(step))); +// } +//#endif +// ////////////////////////////////////////////////////////////////////////// +// //write distribution +// ////////////////////////////////////////////////////////////////////////// +// (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = mfabb; +// (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = mfbab; +// (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = mfbba; +// (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; +// (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; +// (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; +// (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; +// (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; +// (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; +// (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; +// (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; +// (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; +// (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; +// +// (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; +// (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; +// (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; +// (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; +// (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; +// (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; +// (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; +// (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; +// (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; +// (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; +// (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; +// (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; +// (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; +// +// (*this->zeroDistributions)(x1, x2, x3) = mfbbb; +// ////////////////////////////////////////////////////////////////////////// +// +// } +// } +// } +// } +// +// } +// +// //timer.stop(); +//} +////////////////////////////////////////////////////////////////////////// +double CumulantLBMKernel::getCalculationTime() +{ + //return timer.getDuration(); + return timer.getTotalTime(); +} +////////////////////////////////////////////////////////////////////////// +void CumulantLBMKernel::setBulkOmegaToOmega(bool value) +{ + bulkOmegaToOmega = value; +} +////////////////////////////////////////////////////////////////////////// +void CumulantLBMKernel::setRelaxationParameter(Parameter p) +{ + parameter = p; +} + +void CumulantLBMKernel::initData() +{ + //initializing of forcing stuff + if (withForcing) + { + muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); + muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); + muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); + + muDeltaT = deltaT; + + muForcingX1.DefineVar("dt", &muDeltaT); + muForcingX2.DefineVar("dt", &muDeltaT); + muForcingX3.DefineVar("dt", &muDeltaT); + + muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0); + + muForcingX1.DefineVar("nu", &muNu); + muForcingX2.DefineVar("nu", &muNu); + muForcingX3.DefineVar("nu", &muNu); + + LBMReal forcingX1 = 0; + LBMReal forcingX2 = 0; + LBMReal forcingX3 = 0; + } + localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + omega = collFactor; +} + +void CumulantLBMKernel::nodeCollision(int step, int x1, int x2, int x3) +{ + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + ////////////////////////////////////////////////////////////////////////// + //read distribution + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + //E N T + //c c c + ////////// + //W S B + //a a a + + //Rest ist b + + //mfxyz + //a - negative + //b - null + //c - positive + + // a b c + //-1 0 1 + + LBMReal mfcbb = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3); + + LBMReal mfabb = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributions)(x1, x2, x3); + + //////////////////////////////////////////////////////////////////////////////////// + LBMReal drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb)) + (mfbba + mfbbc)) + mfbbb; + + LBMReal rho = one + drho; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)) / rho; + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)) / rho; + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)) / rho; + //////////////////////////////////////////////////////////////////////////////////// + + //forcing + /////////////////////////////////////////////////////////////////////////////////////////// + if (withForcing) + { + muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1); + muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2); + muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3); + + forcingX1 = muForcingX1.Eval(); + forcingX2 = muForcingX2.Eval(); + forcingX3 = muForcingX3.Eval(); + + vvx += forcingX1 * deltaT * 0.5; // X + vvy += forcingX2 * deltaT * 0.5; // Y + vvz += forcingX3 * deltaT * 0.5; // Z + } + /////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////// + LBMReal oMdrho = one; // comp special + //////////////////////////////////////////////////////////////////////////////////// + LBMReal m0, m1, m2; + LBMReal vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx * vvx; + vy2 = vvy * vvy; + vz2 = vvz * vvz; + //////////////////////////////////////////////////////////////////////////////////// + //LBMReal wadjust; + //LBMReal qudricLimitP = 0.01f;// * 0.0001f; + //LBMReal qudricLimitM = 0.01f;// * 0.0001f; + //LBMReal qudricLimitD = 0.01f;// * 0.001f; + //LBMReal s9 = minusomega; + //test + //s9 = 0.; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m2 = mfaaa + mfaac; + m1 = mfaac - mfaaa; + m0 = m2 + mfaab; + mfaaa = m0; + m0 += c1o36 * oMdrho; + mfaab = m1 - m0 * vvz; + mfaac = m2 - two * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfabc; + m1 = mfabc - mfaba; + m0 = m2 + mfabb; + mfaba = m0; + m0 += c1o9 * oMdrho; + mfabb = m1 - m0 * vvz; + mfabc = m2 - two * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfacc; + m1 = mfacc - mfaca; + m0 = m2 + mfacb; + mfaca = m0; + m0 += c1o36 * oMdrho; + mfacb = m1 - m0 * vvz; + mfacc = m2 - two * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbac; + m1 = mfbac - mfbaa; + m0 = m2 + mfbab; + mfbaa = m0; + m0 += c1o9 * oMdrho; + mfbab = m1 - m0 * vvz; + mfbac = m2 - two * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbba + mfbbc; + m1 = mfbbc - mfbba; + m0 = m2 + mfbbb; + mfbba = m0; + m0 += c4o9 * oMdrho; + mfbbb = m1 - m0 * vvz; + mfbbc = m2 - two * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbca + mfbcc; + m1 = mfbcc - mfbca; + m0 = m2 + mfbcb; + mfbca = m0; + m0 += c1o9 * oMdrho; + mfbcb = m1 - m0 * vvz; + mfbcc = m2 - two * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcac; + m1 = mfcac - mfcaa; + m0 = m2 + mfcab; + mfcaa = m0; + m0 += c1o36 * oMdrho; + mfcab = m1 - m0 * vvz; + mfcac = m2 - two * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcba + mfcbc; + m1 = mfcbc - mfcba; + m0 = m2 + mfcbb; + mfcba = m0; + m0 += c1o9 * oMdrho; + mfcbb = m1 - m0 * vvz; + mfcbc = m2 - two * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcca + mfccc; + m1 = mfccc - mfcca; + m0 = m2 + mfccb; + mfcca = m0; + m0 += c1o36 * oMdrho; + mfccb = m1 - m0 * vvz; + mfccc = m2 - two * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m2 = mfaaa + mfaca; + m1 = mfaca - mfaaa; + m0 = m2 + mfaba; + mfaaa = m0; + m0 += c1o6 * oMdrho; + mfaba = m1 - m0 * vvy; + mfaca = m2 - two * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfacb; + m1 = mfacb - mfaab; + m0 = m2 + mfabb; + mfaab = m0; + mfabb = m1 - m0 * vvy; + mfacb = m2 - two * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfacc; + m1 = mfacc - mfaac; + m0 = m2 + mfabc; + mfaac = m0; + m0 += c1o18 * oMdrho; + mfabc = m1 - m0 * vvy; + mfacc = m2 - two * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbca; + m1 = mfbca - mfbaa; + m0 = m2 + mfbba; + mfbaa = m0; + m0 += c2o3 * oMdrho; + mfbba = m1 - m0 * vvy; + mfbca = m2 - two * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbab + mfbcb; + m1 = mfbcb - mfbab; + m0 = m2 + mfbbb; + mfbab = m0; + mfbbb = m1 - m0 * vvy; + mfbcb = m2 - two * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbac + mfbcc; + m1 = mfbcc - mfbac; + m0 = m2 + mfbbc; + mfbac = m0; + m0 += c2o9 * oMdrho; + mfbbc = m1 - m0 * vvy; + mfbcc = m2 - two * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcca; + m1 = mfcca - mfcaa; + m0 = m2 + mfcba; + mfcaa = m0; + m0 += c1o6 * oMdrho; + mfcba = m1 - m0 * vvy; + mfcca = m2 - two * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcab + mfccb; + m1 = mfccb - mfcab; + m0 = m2 + mfcbb; + mfcab = m0; + mfcbb = m1 - m0 * vvy; + mfccb = m2 - two * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcac + mfccc; + m1 = mfccc - mfcac; + m0 = m2 + mfcbc; + mfcac = m0; + m0 += c1o18 * oMdrho; + mfcbc = m1 - m0 * vvy; + mfccc = m2 - two * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m2 = mfaaa + mfcaa; + m1 = mfcaa - mfaaa; + m0 = m2 + mfbaa; + mfaaa = m0; + m0 += one * oMdrho; + mfbaa = m1 - m0 * vvx; + mfcaa = m2 - two * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfcba; + m1 = mfcba - mfaba; + m0 = m2 + mfbba; + mfaba = m0; + mfbba = m1 - m0 * vvx; + mfcba = m2 - two * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfcca; + m1 = mfcca - mfaca; + m0 = m2 + mfbca; + mfaca = m0; + m0 += c1o3 * oMdrho; + mfbca = m1 - m0 * vvx; + mfcca = m2 - two * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfcab; + m1 = mfcab - mfaab; + m0 = m2 + mfbab; + mfaab = m0; + mfbab = m1 - m0 * vvx; + mfcab = m2 - two * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabb + mfcbb; + m1 = mfcbb - mfabb; + m0 = m2 + mfbbb; + mfabb = m0; + mfbbb = m1 - m0 * vvx; + mfcbb = m2 - two * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacb + mfccb; + m1 = mfccb - mfacb; + m0 = m2 + mfbcb; + mfacb = m0; + mfbcb = m1 - m0 * vvx; + mfccb = m2 - two * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfcac; + m1 = mfcac - mfaac; + m0 = m2 + mfbac; + mfaac = m0; + m0 += c1o3 * oMdrho; + mfbac = m1 - m0 * vvx; + mfcac = m2 - two * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabc + mfcbc; + m1 = mfcbc - mfabc; + m0 = m2 + mfbbc; + mfabc = m0; + mfbbc = m1 - m0 * vvx; + mfcbc = m2 - two * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacc + mfccc; + m1 = mfccc - mfacc; + m0 = m2 + mfbcc; + mfacc = m0; + m0 += c1o9 * oMdrho; + mfbcc = m1 - m0 * vvx; + mfccc = m2 - two * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + + + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + + //LBMReal OxxPyyPzz = one; // bulk viscosity + + //////////////////////////////////////////////////////////// + //3. + ////////////////////////////// + LBMReal OxyyPxzz = one;//three * (two - omega) / (three - omega);// + //LBMReal OxyyMxzz = one;//six * (two - omega) / (six - omega);// + LBMReal Oxyz = one;//twelve * (two - omega) / (twelve + omega);// + ////////////////////////////// + //LBMReal OxyyPxzz = two-omega;// + //LBMReal OxyyMxzz = two-omega;// + ////////////////////////////// + //LBMReal OxyyPxzz = (eight * (omega - two)) / (omega - eight);//Ginzburg + //LBMReal OxyyMxzz = (eight * (omega - two)) / (omega - eight);//Ginzburg + ////////////////////////////// + //LBMReal OxyyPxzz = omega;//BGK + //LBMReal OxyyMxzz = omega;//BGK + ////////////////////////////// + //LBMReal OxyyPxzz = (one + omega) / two;//1P5 + //LBMReal OxyyMxzz = (one + omega) / two;//1P5 + ////////////////////////////// + //LBMReal OxyyPxzz = (three - omega) / two;//0P5 + //LBMReal OxyyMxzz = (three - omega) / two;//0P5 + ////////////////////////////// + //LBMReal OxyyPxzz = (one + (eight * (omega - two)) / (omega - eight)) / two;//one + Ginzburg / two ... Car + //LBMReal OxyyMxzz = (one + (eight * (omega - two)) / (omega - eight)) / two;//one + Ginzburg / two ... Car + //////////////////////////////////////////////////////////// + //4. + ////////////////////////////// + LBMReal O4 = one; + ////////////////////////////// + //LBMReal O4 = omega;//TRT + //////////////////////////////////////////////////////////// + //5. + ////////////////////////////// + LBMReal O5 = one; + //////////////////////////////////////////////////////////// + //6. + ////////////////////////////// + LBMReal O6 = one; + //////////////////////////////////////////////////////////// + + + //central moments to cumulants + //4. + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + two * mfbba * mfbab) / rho; //ab 15.05.2015 verwendet + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + two * mfbba * mfabb) / rho; //ab 15.05.2015 verwendet + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + two * mfbab * mfabb) / rho; //ab 15.05.2015 verwendet + + LBMReal CUMcca = mfcca - (((mfcaa * mfaca + two * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9 * (drho / rho)); + LBMReal CUMcac = mfcac - (((mfcaa * mfaac + two * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9 * (drho / rho)); + LBMReal CUMacc = mfacc - (((mfaac * mfaca + two * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9 * (drho / rho)); + + //5. + LBMReal CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + four * mfabb * mfbbb + two * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; + LBMReal CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + four * mfbab * mfbbb + two * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; + LBMReal CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + four * mfbba * mfbbb + two * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; + + //6. + + LBMReal CUMccc = mfccc + ((-four * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - four * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - two * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho + + (four * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + two * (mfcaa * mfaca * mfaac) + + sixteen * mfbba * mfbab * mfabb) / (rho * rho) + - c1o3 * (mfacc + mfcac + mfcca) / rho + - c1o9 * (mfcaa + mfaca + mfaac) / rho + + (two * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 + + c1o27 * ((drho * drho - drho) / (rho * rho))); + //+ c1o27*(one -three/rho +two/(rho*rho))); + + + + +//2. +// linear combinations + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + ////////////////////////////////////////////////////////////////////////// +// LBMReal magicBulk=(CUMacc+CUMcac+CUMcca)*(one/OxxPyyPzz-c1o2)*c3o2*8.; + + ////////////////////////////////////////////////////////////////////////// + //limiter-Scheise Teil 1 + //LBMReal oxxyy,oxxzz,oxy,oxz,oyz; + //LBMReal smag=0.001; + //oxxyy = omega+(one-omega)*fabs(mxxMyy)/(fabs(mxxMyy)+smag); + //oxxzz = omega+(one-omega)*fabs(mxxMzz)/(fabs(mxxMzz)+smag); + //oxy = omega+(one-omega)*fabs(mfbba)/(fabs(mfbba)+smag); + //oxz = omega+(one-omega)*fabs(mfbab)/(fabs(mfbab)+smag); + //oyz = omega+(one-omega)*fabs(mfabb)/(fabs(mfabb)+smag); + + //////////////////////////////////////////////////////////////////////////// + ////Teil 1b + //LBMReal constante = 1000.0; + //LBMReal nuEddi = constante * fabs(mxxPyyPzz); + //LBMReal omegaLimit = one / (one / omega + three * nuEddi); + + //{ + // LBMReal dxux = c1o2 * (-omegaLimit) *(mxxMyy + mxxMzz) + OxxPyyPzz * (mfaaa - mxxPyyPzz); + // LBMReal dyuy = dxux + omegaLimit * c3o2 * mxxMyy; + // LBMReal dzuz = dxux + omegaLimit * c3o2 * mxxMzz; + + ////relax + //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz)- three * (one - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + //mxxMyy += omegaLimit * (-mxxMyy) - three * (one + c1o2 * (-omegaLimit)) * (vx2 * dxux + vy2 * dyuy); + //mxxMzz += omegaLimit * (-mxxMzz) - three * (one + c1o2 * (-omegaLimit)) * (vx2 * dxux + vz2 * dzuz); + + //} + //mfabb += omegaLimit * (-mfabb); + //mfbab += omegaLimit * (-mfbab); + //mfbba += omegaLimit * (-mfbba); + //////////////////////////////////////////////////////////////////////////// + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //incl. correction (hat noch nicht so gut funktioniert...Optimierungsbedarf??) + { + LBMReal dxux = c1o2 * (-omega) * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + LBMReal dyuy = dxux + omega * c3o2 * mxxMyy; + LBMReal dzuz = dxux + omega * c3o2 * mxxMzz; + + //relax + mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - three * (one - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz);//-magicBulk*OxxPyyPzz; + mxxMyy += omega * (-mxxMyy) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += omega * (-mxxMzz) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); + + ////////////////////////////////////////////////////////////////////////// + //limiter-Scheise Teil 2 + //mxxMyy += oxxyy * (-mxxMyy) - three * (one + c1o2 * (-omega)) * (vx2 * dxux + vy2 * dyuy); + //mxxMzz += oxxzz * (-mxxMzz) - three * (one + c1o2 * (-omega)) * (vx2 * dxux + vz2 * dzuz); + ////////////////////////////////////////////////////////////////////////// + + } + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////no correction + //mxxPyyPzz += OxxPyyPzz*(mfaaa-mxxPyyPzz);//-magicBulk*OxxPyyPzz; + //mxxMyy += -(-omega) * (-mxxMyy); + //mxxMzz += -(-omega) * (-mxxMzz); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + mfabb += omega * (-mfabb); + mfbab += omega * (-mfbab); + mfbba += omega * (-mfbba); + + ////////////////////////////////////////////////////////////////////////// + //limiter-Scheise Teil 3 + //mfabb += oyz * (-mfabb); + //mfbab += oxz * (-mfbab); + //mfbba += oxy * (-mfbba); + ////////////////////////////////////////////////////////////////////////// + + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-two * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - two * mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + //relax + ////////////////////////////////////////////////////////////////////////// + //das ist der limiter + //wadjust = Oxyz+(one-Oxyz)*fabs(mfbbb)/(fabs(mfbbb)+qudricLimitD); + //mfbbb += wadjust * (-mfbbb); + //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxxyPyzz)/(fabs(mxxyPyzz)+qudricLimitP); + //mxxyPyzz += wadjust * (-mxxyPyzz); + //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxxyMyzz)/(fabs(mxxyMyzz)+qudricLimitM); + //mxxyMyzz += wadjust * (-mxxyMyzz); + //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxxzPyyz)/(fabs(mxxzPyyz)+qudricLimitP); + //mxxzPyyz += wadjust * (-mxxzPyyz); + //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxxzMyyz)/(fabs(mxxzMyyz)+qudricLimitM); + //mxxzMyyz += wadjust * (-mxxzMyyz); + //wadjust = OxyyPxzz+(one-OxyyPxzz)*fabs(mxyyPxzz)/(fabs(mxyyPxzz)+qudricLimitP); + //mxyyPxzz += wadjust * (-mxyyPxzz); + //wadjust = OxyyMxzz+(one-OxyyMxzz)*fabs(mxyyMxzz)/(fabs(mxyyMxzz)+qudricLimitM); + //mxyyMxzz += wadjust * (-mxyyMxzz); + ////////////////////////////////////////////////////////////////////////// + //ohne limiter + mfbbb += OxyyMxzz * (-mfbbb); + mxxyPyzz += OxyyPxzz * (-mxxyPyzz); + mxxyMyzz += OxyyMxzz * (-mxxyMyzz); + mxxzPyyz += OxyyPxzz * (-mxxzPyyz); + mxxzMyyz += OxyyMxzz * (-mxxzMyyz); + mxyyPxzz += OxyyPxzz * (-mxyyPxzz); + mxyyMxzz += OxyyMxzz * (-mxyyMxzz); + ////////////////////////////////////////////////////////////////////////// + + //// linear combinations back + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + ////////////////////////////////////////////////////////////////////////// + //mit limiter +// wadjust = O4+(one-O4)*fabs(CUMacc)/(fabs(CUMacc)+qudricLimit); + //CUMacc += wadjust * (-CUMacc); +// wadjust = O4+(one-O4)*fabs(CUMcac)/(fabs(CUMcac)+qudricLimit); + //CUMcac += wadjust * (-CUMcac); +// wadjust = O4+(one-O4)*fabs(CUMcca)/(fabs(CUMcca)+qudricLimit); + //CUMcca += wadjust * (-CUMcca); + +// wadjust = O4+(one-O4)*fabs(CUMbbc)/(fabs(CUMbbc)+qudricLimit); + //CUMbbc += wadjust * (-CUMbbc); +// wadjust = O4+(one-O4)*fabs(CUMbcb)/(fabs(CUMbcb)+qudricLimit); + //CUMbcb += wadjust * (-CUMbcb); +// wadjust = O4+(one-O4)*fabs(CUMcbb)/(fabs(CUMcbb)+qudricLimit); + //CUMcbb += wadjust * (-CUMcbb); + ////////////////////////////////////////////////////////////////////////// + //ohne limiter + CUMacc += O4 * (-CUMacc); + CUMcac += O4 * (-CUMcac); + CUMcca += O4 * (-CUMcca); + + CUMbbc += O4 * (-CUMbbc); + CUMbcb += O4 * (-CUMbcb); + CUMcbb += O4 * (-CUMcbb); + ////////////////////////////////////////////////////////////////////////// + + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + + + //back cumulants to central moments + //4. + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + two * mfbba * mfbab) / rho; + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + two * mfbba * mfabb) / rho; + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + two * mfbab * mfabb) / rho; + + mfcca = CUMcca + (((mfcaa * mfaca + two * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) / rho - c1o9 * (drho / rho));//(one/rho-one)); + mfcac = CUMcac + (((mfcaa * mfaac + two * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) / rho - c1o9 * (drho / rho));//(one/rho-one)); + mfacc = CUMacc + (((mfaac * mfaca + two * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) / rho - c1o9 * (drho / rho));//(one/rho-one)); + + //5. + mfbcc = CUMbcc + ((mfaac * mfbca + mfaca * mfbac + four * mfabb * mfbbb + two * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) / rho; + mfcbc = CUMcbc + ((mfaac * mfcba + mfcaa * mfabc + four * mfbab * mfbbb + two * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) / rho; + mfccb = CUMccb + ((mfcaa * mfacb + mfaca * mfcab + four * mfbba * mfbbb + two * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) / rho; + + //6. + + mfccc = CUMccc - ((-four * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - four * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - two * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) / rho + + (four * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + two * (mfcaa * mfaca * mfaac) + + sixteen * mfbba * mfbab * mfabb) / (rho * rho) + - c1o3 * (mfacc + mfcac + mfcca) / rho + - c1o9 * (mfcaa + mfaca + mfaac) / rho + + (two * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) / (rho * rho) * c2o3 + + c1o27 * ((drho * drho - drho) / (rho * rho))); + //////////////////////////////////////////////////////////////////////////////////// + //forcing + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + ////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////// +//back +//////////////////////////////////////////////////////////////////////////////////// +//mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren +//////////////////////////////////////////////////////////////////////////////////// +// Z - Dir + m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + one * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfaac - two * mfaab * vvz + mfaaa * (one - vz2) - one * oMdrho * vz2; + m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + one * oMdrho) * (vz2 + vvz) * c1o2; + mfaaa = m0; + mfaab = m1; + mfaac = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; + m1 = -mfabc - two * mfabb * vvz + mfaba * (one - vz2); + m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; + mfaba = m0; + mfabb = m1; + mfabc = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfacc - two * mfacb * vvz + mfaca * (one - vz2) - c1o3 * oMdrho * vz2; + m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfaca = m0; + mfacb = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; + m1 = -mfbac - two * mfbab * vvz + mfbaa * (one - vz2); + m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; + mfbaa = m0; + mfbab = m1; + mfbac = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; + m1 = -mfbbc - two * mfbbb * vvz + mfbba * (one - vz2); + m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; + mfbba = m0; + mfbbb = m1; + mfbbc = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; + m1 = -mfbcc - two * mfbcb * vvz + mfbca * (one - vz2); + m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; + mfbca = m0; + mfbcb = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfcac - two * mfcab * vvz + mfcaa * (one - vz2) - c1o3 * oMdrho * vz2; + m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfcaa = m0; + mfcab = m1; + mfcac = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; + m1 = -mfcbc - two * mfcbb * vvz + mfcba * (one - vz2); + m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; + mfcba = m0; + mfcbb = m1; + mfcbc = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfccc - two * mfccb * vvz + mfcca * (one - vz2) - c1o9 * oMdrho * vz2; + m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; + mfcca = m0; + mfccb = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfaca - two * mfaba * vvy + mfaaa * (one - vy2) - c1o6 * oMdrho * vy2; + m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaaa = m0; + mfaba = m1; + mfaca = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacb - two * mfabb * vvy + mfaab * (one - vy2) - c2o3 * oMdrho * vy2; + m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; + mfaab = m0; + mfabb = m1; + mfacb = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacc - two * mfabc * vvy + mfaac * (one - vy2) - c1o6 * oMdrho * vy2; + m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaac = m0; + mfabc = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; + m1 = -mfbca - two * mfbba * vvy + mfbaa * (one - vy2); + m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; + mfbaa = m0; + mfbba = m1; + mfbca = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; + m1 = -mfbcb - two * mfbbb * vvy + mfbab * (one - vy2); + m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; + mfbab = m0; + mfbbb = m1; + mfbcb = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; + m1 = -mfbcc - two * mfbbc * vvy + mfbac * (one - vy2); + m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; + mfbac = m0; + mfbbc = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfcca - two * mfcba * vvy + mfcaa * (one - vy2) - c1o18 * oMdrho * vy2; + m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcaa = m0; + mfcba = m1; + mfcca = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccb - two * mfcbb * vvy + mfcab * (one - vy2) - c2o9 * oMdrho * vy2; + m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; + mfcab = m0; + mfcbb = m1; + mfccb = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccc - two * mfcbc * vvy + mfcac * (one - vy2) - c1o18 * oMdrho * vy2; + m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcac = m0; + mfcbc = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcaa - two * mfbaa * vvx + mfaaa * (one - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaaa = m0; + mfbaa = m1; + mfcaa = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcba - two * mfbba * vvx + mfaba * (one - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaba = m0; + mfbba = m1; + mfcba = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcca - two * mfbca * vvx + mfaca * (one - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaca = m0; + mfbca = m1; + mfcca = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcab - two * mfbab * vvx + mfaab * (one - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaab = m0; + mfbab = m1; + mfcab = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbb - two * mfbbb * vvx + mfabb * (one - vx2) - c4o9 * oMdrho * vx2; + m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabb = m0; + mfbbb = m1; + mfcbb = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccb - two * mfbcb * vvx + mfacb * (one - vx2) - c1o9 * oMdrho * vx2; + m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfacb = m0; + mfbcb = m1; + mfccb = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcac - two * mfbac * vvx + mfaac * (one - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaac = m0; + mfbac = m1; + mfcac = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbc - two * mfbbc * vvx + mfabc * (one - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabc = m0; + mfbbc = m1; + mfcbc = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccc - two * mfbcc * vvx + mfacc * (one - vx2) - c1o36 * oMdrho * vx2; + m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfacc = m0; + mfbcc = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// +#ifdef PROOF_CORRECTNESS + LBMReal drho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + //LBMReal dif = fabs(rho - rho_post); + LBMReal dif = drho - drho_post; +#ifdef SINGLEPRECISION + if (dif > 10.0E-7 || dif < -10.0E-7) +#else + if (dif > 10.0E-15 || dif < -10.0E-15) +#endif + { + UB_THROW(UbException(UB_EXARGS, "rho=" + UbSystem::toString(drho) + ", rho_post=" + UbSystem::toString(drho_post) + + " dif=" + UbSystem::toString(dif) + + " rho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3) + + " in " + block.lock()->toString() + " step = " + UbSystem::toString(step))); + } +#endif + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributions)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributions)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributions)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributions)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributions)(x1, x2, x3) = mfbbb; + ////////////////////////////////////////////////////////////////////////// +} diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h new file mode 100644 index 000000000..b75b13031 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/CumulantLBMKernel.h @@ -0,0 +1,55 @@ +#ifndef CumulantLBMKernel_h__ +#define CumulantLBMKernel_h__ + +#include "BasicLBMKernel.h" +#include "BCProcessor.h" +#include "D3Q27System.h" +#include "basics/utilities/UbTiming.h" +#include "basics/container/CbArray4D.h" +#include "basics/container/CbArray3D.h" + +//! \brief compressible cumulant LBM kernel. +//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model +//! \author K. Kutscher, M. Geier +class CumulantLBMKernel : public BasicLBMKernel +{ +public: + //! This option set relaxation parameter: NORMAL + enum Parameter { NORMAL, MAGIC }; +public: + CumulantLBMKernel(); + virtual ~CumulantLBMKernel(void); + //virtual void calculate(int step); + SPtr<LBMKernel> clone(); + double getCalculationTime(); + void setBulkOmegaToOmega(bool value); + void setRelaxationParameter(Parameter p); +protected: + void initData() override; + void nodeCollision(int step, int x1, int x2, int x3) override; + void initDataSet(); + LBMReal f[D3Q27System::ENDF + 1]; + + UbTimer timer; + + LBMReal OxyyMxzz; + Parameter parameter; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributions; + + mu::value_type muX1, muX2, muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; + + // bulk viscosity + bool bulkOmegaToOmega; + LBMReal OxxPyyPzz; + + LBMReal omega; +}; +#endif // CumulantLBMKernel_h__ \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h index 1376e0da6..d94a7f37d 100644 --- a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h +++ b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h @@ -35,784 +35,1146 @@ #define D3Q27SYSTEM_H #include <cmath> -#include <iostream> #include <string> +#include <iostream> + +#ifdef RCF_USE_SF_SERIALIZATION + #include <SF/Serializer.hpp> + #if CAB_RCF <= 903 + #include <SF/SerializeEnum.hpp> + #endif +#endif //RCF_USE_SF_SERIALIZATION + +#include <basics/utilities/UbException.h> +#include <basics/utilities/UbTuple.h> +#include <basics/utilities/UbMath.h> +#include <basics/utilities/UbSystem.h> +//#include "Patch3DSystem.h" #include "LBMSystem.h" -#include "UbException.h" -#include "UbMath.h" - -//! \brief namespace for global system-functions -namespace D3Q27System -{ -////////////////////////////////////////////////////////////////////////// -// DIRECTION STUFF -static const int FSTARTDIR = 0; -static const int FENDDIR = 25; // D3Q27 - -static const int STARTF = 0; -static const int ENDF = 26; // D3Q27 - -static const int STARTDIR = 0; -static const int ENDDIR = 26; - -extern const int DX1[ENDDIR + 1]; -extern const int DX2[ENDDIR + 1]; -extern const int DX3[ENDDIR + 1]; -extern const double WEIGTH[ENDDIR + 1]; - -extern const double cNorm[3][ENDDIR]; - -// static const int ZERO /*f0 */ = 0; -// static const int E /*f1 */ = 1; -// static const int W /*f2 */ = 2; -// static const int N /*f3 */ = 3; -// static const int S /*f4 */ = 4; -// static const int T /*f5 */ = 5; -// static const int B /*f6 */ = 6; -// static const int NE /*f7 */ = 7; -// static const int SW /*f8 */ = 8; -// static const int SE /*f9 */ = 9; -// static const int NW /*f10*/ = 10; -// static const int TE /*f11*/ = 11; -// static const int BW /*f12*/ = 12; -// static const int BE /*f13*/ = 13; -// static const int TW /*f14*/ = 14; -// static const int TN /*f15*/ = 15; -// static const int BS /*f16*/ = 16; -// static const int BN /*f17*/ = 17; -// static const int TS /*f18*/ = 18; -// static const int TNE = 19; -// static const int TNW = 20; -// static const int TSE = 21; -// static const int TSW = 22; -// static const int BNE = 23; -// static const int BNW = 24; -// static const int BSE = 25; -// static const int BSW = 26; - -static const int E /*f1 */ = 0; -static const int W /*f2 */ = 1; -static const int N /*f3 */ = 2; -static const int S /*f4 */ = 3; -static const int T /*f5 */ = 4; -static const int B /*f6 */ = 5; -static const int NE /*f7 */ = 6; -static const int SW /*f8 */ = 7; -static const int SE /*f9 */ = 8; -static const int NW /*f10*/ = 9; -static const int TE /*f11*/ = 10; -static const int BW /*f12*/ = 11; -static const int BE /*f13*/ = 12; -static const int TW /*f14*/ = 13; -static const int TN /*f15*/ = 14; -static const int BS /*f16*/ = 15; -static const int BN /*f17*/ = 16; -static const int TS /*f18*/ = 17; -static const int TNE = 18; -static const int TNW = 19; -static const int TSE = 20; -static const int TSW = 21; -static const int BNE = 22; -static const int BNW = 23; -static const int BSE = 24; -static const int BSW = 25; -static const int ZERO /*f0 */ = 26; - -static const int INV_E = W; -static const int INV_W = E; -static const int INV_N = S; -static const int INV_S = N; -static const int INV_T = B; -static const int INV_B = T; -static const int INV_NE = SW; -static const int INV_SW = NE; -static const int INV_SE = NW; -static const int INV_NW = SE; -static const int INV_TE = BW; -static const int INV_BW = TE; -static const int INV_BE = TW; -static const int INV_TW = BE; -static const int INV_TN = BS; -static const int INV_BS = TN; -static const int INV_BN = TS; -static const int INV_TS = BN; -static const int INV_TNE = BSW; -static const int INV_TNW = BSE; -static const int INV_TSE = BNW; -static const int INV_TSW = BNE; -static const int INV_BNE = TSW; -static const int INV_BNW = TSE; -static const int INV_BSE = TNW; -static const int INV_BSW = TNE; - -extern const int INVDIR[ENDDIR + 1]; - -static const int ET_E = 0; -static const int ET_W = 0; -static const int ET_N = 1; -static const int ET_S = 1; -static const int ET_T = 2; -static const int ET_B = 2; -static const int ET_NE = 3; -static const int ET_SW = 3; -static const int ET_SE = 4; -static const int ET_NW = 4; -static const int ET_TE = 5; -static const int ET_BW = 5; -static const int ET_BE = 6; -static const int ET_TW = 6; -static const int ET_TN = 7; -static const int ET_BS = 7; -static const int ET_BN = 8; -static const int ET_TS = 8; -static const int ET_TNE = 9; -static const int ET_BSW = 9; -static const int ET_TNW = 10; -static const int ET_BSE = 10; -static const int ET_TSE = 11; -static const int ET_BNW = 11; -static const int ET_TSW = 12; -static const int ET_BNE = 12; - -static const int M_RHO = 0; -static const int M_EN = 1; -static const int M_EPS = 2; -static const int M_JX1 = 3; -static const int M_QX1 = 4; -static const int M_JX2 = 5; -static const int M_QX2 = 6; -static const int M_JX3 = 7; -static const int M_QX3 = 8; -static const int M_3PX1X1 = 9; -static const int M_3PIX1X1 = 10; -static const int M_PWW = 11; -static const int M_PIWW = 12; -static const int M_PX1X2 = 13; -static const int M_PX2X3 = 14; -static const int M_PX1X3 = 15; -static const int M_MX1 = 16; -static const int M_MX2 = 17; -static const int M_MX3 = 18; - -static const int STARTM = 0; -static const int ENDM = 18; // D3Q27 - -////////////////////////////////////////////////////////////////////////// -// MACROSCOPIC VALUES -/*=====================================================================*/ -static LBMReal getDensity(const LBMReal *const &f /*[27]*/) -{ - return ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) + - (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) + - ((f[BN] + f[TS]) + (f[TN] + f[BS]))) + - ((f[E] + f[W]) + (f[N] + f[S]) + (f[T] + f[B])) + f[ZERO]; -} -/*=====================================================================*/ -// ATTENTION: does not apply to all models -> use certificate instead of static! to do -static LBMReal getPressure(const LBMReal *const &f /*[27]*/) { return REAL_CAST(UbMath::c1o3) * getDensity(f); } -/*=====================================================================*/ -static LBMReal getIncompVelocityX1(const LBMReal *const &f /*[27]*/) -{ - return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + - (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])); -} -/*=====================================================================*/ -static LBMReal getIncompVelocityX2(const LBMReal *const &f /*[27]*/) -{ - return ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + - (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])); -} -/*=====================================================================*/ -static LBMReal getIncompVelocityX3(const LBMReal *const &f /*[27]*/) -{ - return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + - (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])); -} -/*=====================================================================*/ -static void calcDensity(const LBMReal *const &f /*[27]*/, LBMReal &rho) -{ - rho = ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) + - (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) + - ((f[BN] + f[TS]) + (f[TN] + f[BS]))) + - ((f[E] + f[W]) + (f[N] + f[S]) + (f[T] + f[B])) + f[ZERO]; -} -/*=====================================================================*/ -static void calcIncompVelocityX1(const LBMReal *const &f /*[27]*/, LBMReal &vx1) -{ - vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + - (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])); -} -/*=====================================================================*/ -static void calcIncompVelocityX2(const LBMReal *const &f /*[27]*/, LBMReal &vx2) -{ - vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + - (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])); -} -/*=====================================================================*/ -static void calcIncompVelocityX3(const LBMReal *const &f /*[27]*/, LBMReal &vx3) -{ - vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + - (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])); -} -/*=====================================================================*/ -static LBMReal getCompVelocityX1(const LBMReal *const &f /*[27]*/) -{ - return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + - (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])) / - getDensity(f); -} -/*=====================================================================*/ -static LBMReal getCompVelocityX2(const LBMReal *const &f /*[27]*/) -{ - return ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + - (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])) / - getDensity(f); -} -/*=====================================================================*/ -static LBMReal getCompVelocityX3(const LBMReal *const &f /*[27]*/) -{ - return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + - (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])) / - getDensity(f); -} -/*=====================================================================*/ -static void calcCompVelocityX1(const LBMReal *const &f /*[27]*/, LBMReal &vx1) -{ - vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + - (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + (f[E] - f[W])) / - getDensity(f); -} -/*=====================================================================*/ -static void calcCompVelocityX2(const LBMReal *const &f /*[27]*/, LBMReal &vx2) -{ - vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + - (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + (f[N] - f[S])) / - getDensity(f); -} -/*=====================================================================*/ -static void calcCompVelocityX3(const LBMReal *const &f /*[27]*/, LBMReal &vx3) -{ - vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + - (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + (f[T] - f[B])) / - getDensity(f); -} -/*=====================================================================*/ -static void calcIncompMacroscopicValues(const LBMReal *const &f /*[27]*/, LBMReal &rho, LBMReal &vx1, LBMReal &vx2, - LBMReal &vx3) -{ - D3Q27System::calcDensity(f, rho); - D3Q27System::calcIncompVelocityX1(f, vx1); - D3Q27System::calcIncompVelocityX2(f, vx2); - D3Q27System::calcIncompVelocityX3(f, vx3); -} - -/*=====================================================================*/ -static void calcCompMacroscopicValues(const LBMReal *const &f /*[27]*/, LBMReal &drho, LBMReal &vx1, LBMReal &vx2, - LBMReal &vx3) -{ - D3Q27System::calcDensity(f, drho); - D3Q27System::calcIncompVelocityX1(f, vx1); - D3Q27System::calcIncompVelocityX2(f, vx2); - D3Q27System::calcIncompVelocityX3(f, vx3); - LBMReal rho = drho + UbMath::c1; - vx1 /= rho; - vx2 /= rho; - vx3 /= rho; -} -////////////////////////////////////////////////////////////////////////// -static LBMReal getCompFeqForDirection(const int &direction, const LBMReal &drho, const LBMReal &vx1, const LBMReal &vx2, - const LBMReal &vx3) -{ - using namespace UbMath; - LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); - - ////----- - LBMReal rho = drho + c1; - switch (direction) { - case ZERO: - return REAL_CAST(c8o27 * (drho + rho * (-cu_sq))); - case E: - return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq))); - case W: - return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq))); - case N: - return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq))); - case S: - return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq))); - case T: - return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq))); - case B: - return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq))); - case NE: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq))); - case SW: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq))); - case SE: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq))); - case NW: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq))); - case TE: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq))); - case BW: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq))); - case BE: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq))); - case TW: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq))); - case TN: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq))); - case BS: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq))); - case BN: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq))); - case TS: - return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq))); - case TNE: - return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + - c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq))); - case BSW: - return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + - c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq))); - case BNE: - return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + - c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq))); - case TSW: - return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + - c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq))); - case TSE: - return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + - c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq))); - case BNW: - return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + - c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq))); - case BSE: - return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + - c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq))); - case TNW: - return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + - c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq))); - default: - throw UbException(UB_EXARGS, "unknown dir"); - } -} -////////////////////////////////////////////////////////////////////////// -static void calcCompFeq(LBMReal *const &feq /*[27]*/, const LBMReal &drho, const LBMReal &vx1, const LBMReal &vx2, - const LBMReal &vx3) -{ - using namespace UbMath; - - LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); - LBMReal rho = drho + c1; - - feq[ZERO] = c8o27 * (drho + rho * (-cu_sq)); - feq[E] = c2o27 * (drho + rho * (3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq)); - feq[W] = c2o27 * (drho + rho * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq)); - feq[N] = c2o27 * (drho + rho * (3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq)); - feq[S] = c2o27 * (drho + rho * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq)); - feq[T] = c2o27 * (drho + rho * (3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq)); - feq[B] = c2o27 * (drho + rho * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq)); - feq[NE] = c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); - feq[SW] = c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); - feq[SE] = c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); - feq[NW] = c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); - feq[TE] = c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); - feq[BW] = c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); - feq[BE] = c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); - feq[TW] = c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); - feq[TN] = c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); - feq[BS] = c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); - feq[BN] = c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); - feq[TS] = c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); - feq[TNE] = c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); - feq[BSW] = - c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); - feq[BNE] = c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); - feq[TSW] = - c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); - feq[TSE] = c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); - feq[BNW] = - c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); - feq[BSE] = c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); - feq[TNW] = - c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)); -} -////////////////////////////////////////////////////////////////////////// -static LBMReal getIncompFeqForDirection(const int &direction, const LBMReal &drho, const LBMReal &vx1, - const LBMReal &vx2, const LBMReal &vx3) -{ - using namespace UbMath; - - LBMReal cu_sq = 1.5f * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); - - switch (direction) { - case ZERO: - return REAL_CAST(c8o27 * (drho - cu_sq)); - case E: - return REAL_CAST(c2o27 * (drho + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq)); - case W: - return REAL_CAST(c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq)); - case N: - return REAL_CAST(c2o27 * (drho + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq)); - case S: - return REAL_CAST(c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq)); - case T: - return REAL_CAST(c2o27 * (drho + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq)); - case B: - return REAL_CAST(c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq)); - case NE: - return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); - case SW: - return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); - case SE: - return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); - case NW: - return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); - case TE: - return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); - case BW: - return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); - case BE: - return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); - case TW: - return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); - case TN: - return REAL_CAST(c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); - case BS: - return REAL_CAST(c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); - case BN: - return REAL_CAST(c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); - case TS: - return REAL_CAST(c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); - case TNE: - return REAL_CAST(c1o216 * - (drho + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); - case BSW: - return REAL_CAST( - c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); - case BNE: - return REAL_CAST(c1o216 * - (drho + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); - case TSW: - return REAL_CAST( - c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); - case TSE: - return REAL_CAST(c1o216 * - (drho + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); - case BNW: - return REAL_CAST( - c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); - case BSE: - return REAL_CAST(c1o216 * - (drho + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); - case TNW: - return REAL_CAST( - c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)); - default: - throw UbException(UB_EXARGS, "unknown dir"); - } -} -////////////////////////////////////////////////////////////////////////// -static void calcIncompFeq(LBMReal *const &feq /*[27]*/, const LBMReal &drho, const LBMReal &vx1, const LBMReal &vx2, - const LBMReal &vx3) -{ - using namespace UbMath; - - LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); - - feq[ZERO] = c8o27 * (drho - cu_sq); - feq[E] = c2o27 * (drho + 3.0 * (vx1) + c9o2 * (vx1) * (vx1)-cu_sq); - feq[W] = c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq); - feq[N] = c2o27 * (drho + 3.0 * (vx2) + c9o2 * (vx2) * (vx2)-cu_sq); - feq[S] = c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq); - feq[T] = c2o27 * (drho + 3.0 * (vx3) + c9o2 * (vx3) * (vx3)-cu_sq); - feq[B] = c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq); - feq[NE] = c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq); - feq[SW] = c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq); - feq[SE] = c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq); - feq[NW] = c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq); - feq[TE] = c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq); - feq[BW] = c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq); - feq[BE] = c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq); - feq[TW] = c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq); - feq[TN] = c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq); - feq[BS] = c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq); - feq[BN] = c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq); - feq[TS] = c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq); - feq[TNE] = c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq); - feq[BSW] = c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq); - feq[BNE] = c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq); - feq[TSW] = c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq); - feq[TSE] = c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq); - feq[BNW] = c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq); - feq[BSE] = c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq); - feq[TNW] = c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq); -} -////////////////////////////////////////////////////////////////////////// -static inline float getBoundaryVelocityForDirection(const int &direction, const float &bcVelocityX1, - const float &bcVelocityX2, const float &bcVelocityX3) -{ - using namespace UbMath; - - switch (direction) { - case E: - return (float)(UbMath::c4o9 * (+bcVelocityX1)); - case W: - return (float)(UbMath::c4o9 * (-bcVelocityX1)); - case N: - return (float)(UbMath::c4o9 * (+bcVelocityX2)); - case S: - return (float)(UbMath::c4o9 * (-bcVelocityX2)); - case T: - return (float)(UbMath::c4o9 * (+bcVelocityX3)); - case B: - return (float)(UbMath::c4o9 * (-bcVelocityX3)); - case NE: - return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX2)); - case SW: - return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX2)); - case SE: - return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX2)); - case NW: - return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX2)); - case TE: - return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX3)); - case BW: - return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX3)); - case BE: - return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX3)); - case TW: - return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX3)); - case TN: - return (float)(UbMath::c1o9 * (+bcVelocityX2 + bcVelocityX3)); - case BS: - return (float)(UbMath::c1o9 * (-bcVelocityX2 - bcVelocityX3)); - case BN: - return (float)(UbMath::c1o9 * (+bcVelocityX2 - bcVelocityX3)); - case TS: - return (float)(UbMath::c1o9 * (-bcVelocityX2 + bcVelocityX3)); - case TNE: - return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); - case BSW: - return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); - case BNE: - return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); - case TSW: - return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); - case TSE: - return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); - case BNW: - return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); - case BSE: - return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); - case TNW: - return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); - default: - throw UbException(UB_EXARGS, "unknown direction"); - } -} -/*=====================================================================*/ -static const int &getInvertDirection(const int &direction) -{ + +/*=========================================================================*/ +/* D3Q27System */ +/* */ +/** +class for global system-functions +<BR><BR> +@author <A HREF="mailto:kucher@irmb.tu-bs.de">K. Kucher</A> +@version 1.0 - 22.10.09 +*/ + +/* +usage: ... +*/ + + +#ifndef SWIG + using namespace UbMath; +#endif + + namespace D3Q27System + { + //enum COLLISIONMODEL { UNDEFINED, INCOMPLBGKMODEL, COMPLBGKMODEL, COMPLBGKWTMODEL, INCOMPLBGKLESMODEL, INCOMPLBGKNONNEWTONIANMODEL + // , INCOMPGLBEJTMODEL, COMPGLBEJTMODEL, COMPGLBEJTWTMODEL, INCOMPGLBEJTLESMODEL, INCOMPGLBEJTWALEMODEL + // , CASCADEDMODEL}; + // + // #if defined(RCF_USE_SF_SERIALIZATION) && (CAB_RCF <= 903) + // SF_SERIALIZE_ENUM(COLLISIONMODEL) //muss im namespace stehen, sonst funzt es nicht! + // #endif + + ///*=====================================================================*/ + //std::string toString(const COLLISIONMODEL& model); + ///*=====================================================================*/ + //COLLISIONMODEL getCollModelByString(const std::string& str); + ///*=====================================================================*/ + + ///*=====================================================================*/ + //static bool isCompModel(const COLLISIONMODEL& model) + //{ + // switch(model) + // { + // case COMPLBGKMODEL : return true; + // case COMPLBGKWTMODEL : return true; + // case COMPGLBEJTWTMODEL : return true; + // case COMPGLBEJTMODEL : return true; + // case CASCADEDMODEL : return true; + // + // case INCOMPLBGKMODEL : return false; + // case INCOMPGLBEJTMODEL : return false; + // case INCOMPLBGKLESMODEL : return false; + // case INCOMPGLBEJTLESMODEL : return false; + // case INCOMPGLBEJTWALEMODEL : return false; + // case INCOMPLBGKNONNEWTONIANMODEL : return false; + + // default: throw UbException(UB_EXARGS,"unknown model"); + // } + //} + ///*=====================================================================*/ + //static bool isGLBEModel(const COLLISIONMODEL& model) + //{ + // switch(model) + // { + // case COMPGLBEJTWTMODEL : return true; + // case COMPGLBEJTMODEL : return true; + // case INCOMPGLBEJTMODEL : return true; + // case INCOMPGLBEJTLESMODEL : return true; + // case INCOMPGLBEJTWALEMODEL : return false; + + // case COMPLBGKMODEL : return false; + // case COMPLBGKWTMODEL : return false; + // case INCOMPLBGKMODEL : return false; + // case INCOMPLBGKLESMODEL : return false; + // case INCOMPLBGKNONNEWTONIANMODEL : return false; + + // default: throw UbException(UB_EXARGS,"unknown model"); + // } + //} + //static bool isLESModel(const COLLISIONMODEL& model) + //{ + // switch(model) + // { + // case INCOMPGLBEJTLESMODEL : return true; + // case INCOMPLBGKLESMODEL : return true; + // case INCOMPGLBEJTWALEMODEL : return true; + // + // case COMPGLBEJTWTMODEL : return false; + // case COMPGLBEJTMODEL : return false; + // case INCOMPGLBEJTMODEL : return false; + // case COMPLBGKMODEL : return false; + // case COMPLBGKWTMODEL : return false; + // case INCOMPLBGKMODEL : return false; + // case INCOMPLBGKNONNEWTONIANMODEL : return false; + + // default: throw UbException(UB_EXARGS,"unknown model"); + // } + //} + + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //DIRECTION STUFF + static const int FSTARTDIR = 0; + static const int FENDDIR = 25; //D3Q27 + + //static const int FSTARTDIR = 1; + //static const int FENDDIR = 26; //D3Q27 + + static const int STARTF = 0; + static const int ENDF = 26; //D3Q27 + + //extern const int EX1[ENDF+1]; + //extern const int EX2[ENDF+1]; + //extern const int EX3[ENDF+1]; + + static const int STARTDIR = 0; + static const int ENDDIR = 26; //alle geometrischen richtungen + + extern const int DX1[ENDDIR + 1]; + extern const int DX2[ENDDIR + 1]; + extern const int DX3[ENDDIR + 1]; + extern const double WEIGTH[ENDDIR + 1]; + + extern const double cNorm[3][ENDDIR]; + + //static const int ZERO /*f0 */ = 0; + //static const int E /*f1 */ = 1; + //static const int W /*f2 */ = 2; + //static const int N /*f3 */ = 3; + //static const int S /*f4 */ = 4; + //static const int T /*f5 */ = 5; + //static const int B /*f6 */ = 6; + //static const int NE /*f7 */ = 7; + //static const int SW /*f8 */ = 8; + //static const int SE /*f9 */ = 9; + //static const int NW /*f10*/ = 10; + //static const int TE /*f11*/ = 11; + //static const int BW /*f12*/ = 12; + //static const int BE /*f13*/ = 13; + //static const int TW /*f14*/ = 14; + //static const int TN /*f15*/ = 15; + //static const int BS /*f16*/ = 16; + //static const int BN /*f17*/ = 17; + //static const int TS /*f18*/ = 18; + //static const int TNE = 19; + //static const int TNW = 20; + //static const int TSE = 21; + //static const int TSW = 22; + //static const int BNE = 23; + //static const int BNW = 24; + //static const int BSE = 25; + //static const int BSW = 26; + + static const int E /*f1 */ = 0; + static const int W /*f2 */ = 1; + static const int N /*f3 */ = 2; + static const int S /*f4 */ = 3; + static const int T /*f5 */ = 4; + static const int B /*f6 */ = 5; + static const int NE /*f7 */ = 6; + static const int SW /*f8 */ = 7; + static const int SE /*f9 */ = 8; + static const int NW /*f10*/ = 9; + static const int TE /*f11*/ = 10; + static const int BW /*f12*/ = 11; + static const int BE /*f13*/ = 12; + static const int TW /*f14*/ = 13; + static const int TN /*f15*/ = 14; + static const int BS /*f16*/ = 15; + static const int BN /*f17*/ = 16; + static const int TS /*f18*/ = 17; + static const int TNE = 18; + static const int TNW = 19; + static const int TSE = 20; + static const int TSW = 21; + static const int BNE = 22; + static const int BNW = 23; + static const int BSE = 24; + static const int BSW = 25; + static const int ZERO /*f0 */ = 26; + + static const int INV_E = W; + static const int INV_W = E; + static const int INV_N = S; + static const int INV_S = N; + static const int INV_T = B; + static const int INV_B = T; + static const int INV_NE = SW; + static const int INV_SW = NE; + static const int INV_SE = NW; + static const int INV_NW = SE; + static const int INV_TE = BW; + static const int INV_BW = TE; + static const int INV_BE = TW; + static const int INV_TW = BE; + static const int INV_TN = BS; + static const int INV_BS = TN; + static const int INV_BN = TS; + static const int INV_TS = BN; + static const int INV_TNE = BSW; + static const int INV_TNW = BSE; + static const int INV_TSE = BNW; + static const int INV_TSW = BNE; + static const int INV_BNE = TSW; + static const int INV_BNW = TSE; + static const int INV_BSE = TNW; + static const int INV_BSW = TNE; + + extern const int INVDIR[ENDDIR + 1]; + + static const int ET_E = 0; + static const int ET_W = 0; + static const int ET_N = 1; + static const int ET_S = 1; + static const int ET_T = 2; + static const int ET_B = 2; + static const int ET_NE = 3; + static const int ET_SW = 3; + static const int ET_SE = 4; + static const int ET_NW = 4; + static const int ET_TE = 5; + static const int ET_BW = 5; + static const int ET_BE = 6; + static const int ET_TW = 6; + static const int ET_TN = 7; + static const int ET_BS = 7; + static const int ET_BN = 8; + static const int ET_TS = 8; + static const int ET_TNE = 9; + static const int ET_BSW = 9; + static const int ET_TNW = 10; + static const int ET_BSE = 10; + static const int ET_TSE = 11; + static const int ET_BNW = 11; + static const int ET_TSW = 12; + static const int ET_BNE = 12; + + static const int M_RHO = 0; + static const int M_EN = 1; + static const int M_EPS = 2; + static const int M_JX1 = 3; + static const int M_QX1 = 4; + static const int M_JX2 = 5; + static const int M_QX2 = 6; + static const int M_JX3 = 7; + static const int M_QX3 = 8; + static const int M_3PX1X1 = 9; + static const int M_3PIX1X1 = 10; + static const int M_PWW = 11; + static const int M_PIWW = 12; + static const int M_PX1X2 = 13; + static const int M_PX2X3 = 14; + static const int M_PX1X3 = 15; + static const int M_MX1 = 16; + static const int M_MX2 = 17; + static const int M_MX3 = 18; + + static const int STARTM = 0; + static const int ENDM = 18; //D3Q27 + + + + ////////////////////////////////////////////////////////////////////////// + //MACROSCOPIC VALUES + /*=====================================================================*/ + static LBMReal getDensity(const LBMReal* const& f/*[27]*/) + { + return ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) + + (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) + + ((f[BN] + f[TS]) + (f[TN] + f[BS]))) + ((f[E] + f[W]) + (f[N] + f[S]) + + (f[T] + f[B])) + f[ZERO]; + } + /*=====================================================================*/ + //ACHTUNG: gilt nicht fuer alle modelle -> praedikat verwenden anstelle static! toDo + static LBMReal getPressure(const LBMReal* const& f/*[27]*/) + { + return REAL_CAST(c1o3) * getDensity(f); + } + /*=====================================================================*/ + static LBMReal getIncompVelocityX1(const LBMReal* const& f/*[27]*/) + { + return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + + (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + + (f[E] - f[W])); + } + /*=====================================================================*/ + static LBMReal getIncompVelocityX2(const LBMReal* const& f/*[27]*/) + { + return ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + + (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + + (f[N] - f[S])); + } + /*=====================================================================*/ + static LBMReal getIncompVelocityX3(const LBMReal* const& f/*[27]*/) + { + return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + + (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + + (f[T] - f[B])); + } + /*=====================================================================*/ + static void calcDensity(const LBMReal* const& f/*[27]*/, LBMReal& rho) + { + rho = ((f[TNE] + f[BSW]) + (f[TSE] + f[BNW])) + ((f[BSE] + f[TNW]) + (f[TSW] + f[BNE])) + + (((f[NE] + f[SW]) + (f[SE] + f[NW])) + ((f[TE] + f[BW]) + (f[BE] + f[TW])) + + ((f[BN] + f[TS]) + (f[TN] + f[BS]))) + ((f[E] + f[W]) + (f[N] + f[S]) + + (f[T] + f[B])) + f[ZERO]; + + } + /*=====================================================================*/ + static void calcIncompVelocityX1(const LBMReal* const& f/*[27]*/, LBMReal& vx1) + { + vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + + (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + + (f[E] - f[W])); + } + /*=====================================================================*/ + static void calcIncompVelocityX2(const LBMReal* const& f/*[27]*/, LBMReal& vx2) + { + vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + + (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + + (f[N] - f[S])); + } + /*=====================================================================*/ + static void calcIncompVelocityX3(const LBMReal* const& f/*[27]*/, LBMReal& vx3) + { + vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + + (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + + (f[T] - f[B])); + } + /*=====================================================================*/ + static LBMReal getCompVelocityX1(const LBMReal* const& f/*[27]*/) + { + return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + + (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + + (f[E] - f[W])) / getDensity(f); + } + /*=====================================================================*/ + static LBMReal getCompVelocityX2(const LBMReal* const& f/*[27]*/) + { + return ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + + (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + + (f[N] - f[S])) / getDensity(f); + } + /*=====================================================================*/ + static LBMReal getCompVelocityX3(const LBMReal* const& f/*[27]*/) + { + return ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + + (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + + (f[T] - f[B])) / getDensity(f); + } + /*=====================================================================*/ + static void calcCompVelocityX1(const LBMReal* const& f/*[27]*/, LBMReal& vx1) + { + vx1 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[BSE] - f[TNW]) + (f[BNE] - f[TSW]))) + + (((f[BE] - f[TW]) + (f[TE] - f[BW])) + ((f[SE] - f[NW]) + (f[NE] - f[SW]))) + + (f[E] - f[W])) / getDensity(f); + } + /*=====================================================================*/ + static void calcCompVelocityX2(const LBMReal* const& f/*[27]*/, LBMReal& vx2) + { + vx2 = ((((f[TNE] - f[BSW]) + (f[BNW] - f[TSE])) + ((f[TNW] - f[BSE]) + (f[BNE] - f[TSW]))) + + (((f[BN] - f[TS]) + (f[TN] - f[BS])) + ((f[NW] - f[SE]) + (f[NE] - f[SW]))) + + (f[N] - f[S])) / getDensity(f); + } + /*=====================================================================*/ + static void calcCompVelocityX3(const LBMReal* const& f/*[27]*/, LBMReal& vx3) + { + vx3 = ((((f[TNE] - f[BSW]) + (f[TSE] - f[BNW])) + ((f[TNW] - f[BSE]) + (f[TSW] - f[BNE]))) + + (((f[TS] - f[BN]) + (f[TN] - f[BS])) + ((f[TW] - f[BE]) + (f[TE] - f[BW]))) + + (f[T] - f[B])) / getDensity(f); + } + /*=====================================================================*/ + static void calcIncompMacroscopicValues(const LBMReal* const& f/*[27]*/, LBMReal& rho, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3) + { + D3Q27System::calcDensity(f, rho); + D3Q27System::calcIncompVelocityX1(f, vx1); + D3Q27System::calcIncompVelocityX2(f, vx2); + D3Q27System::calcIncompVelocityX3(f, vx3); + } + + /*=====================================================================*/ + static void calcCompMacroscopicValues(const LBMReal* const& f/*[27]*/, LBMReal& drho, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3) + { + D3Q27System::calcDensity(f, drho); + D3Q27System::calcIncompVelocityX1(f, vx1); + D3Q27System::calcIncompVelocityX2(f, vx2); + D3Q27System::calcIncompVelocityX3(f, vx3); + LBMReal rho = drho + one; + vx1 /= rho; + vx2 /= rho; + vx3 /= rho; + } + ////////////////////////////////////////////////////////////////////////// + static LBMReal getCompFeqForDirection(const int& direction, const LBMReal& drho, const LBMReal& vx1, const LBMReal& vx2, const LBMReal& vx3) + { + LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); + + //switch(direction) + //{ + // case ZERO : return REAL_CAST( c8o27*rho*(1.0-cu_sq)); + // case E : return REAL_CAST( c2o27*rho*(1.0+3.0*( vx1 )+c9o2*( vx1 )*( vx1 )-cu_sq)); + // case W : return REAL_CAST( c2o27*rho*(1.0+3.0*(-vx1 )+c9o2*(-vx1 )*(-vx1 )-cu_sq)); + // case N : return REAL_CAST( c2o27*rho*(1.0+3.0*( vx2)+c9o2*( vx2)*( vx2)-cu_sq)); + // case S : return REAL_CAST( c2o27*rho*(1.0+3.0*( -vx2)+c9o2*( -vx2)*( -vx2)-cu_sq)); + // case T : return REAL_CAST( c2o27*rho*(1.0+3.0*( vx3 )+c9o2*( vx3)*( vx3)-cu_sq)); + // case B : return REAL_CAST( c2o27*rho*(1.0+3.0*( -vx3)+c9o2*( -vx3)*( -vx3)-cu_sq)); + // case NE : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx1+vx2)+c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq)); + // case SW : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq)); + // case SE : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx1-vx2)+c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq)); + // case NW : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq)); + // case TE : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx1+vx3)+c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq)); + // case BW : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq)); + // case BE : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx1-vx3)+c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq)); + // case TW : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq)); + // case TN : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq)); + // case BS : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq)); + // case BN : return REAL_CAST( c1o54*rho*(1.0+3.0*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq)); + // case TS : return REAL_CAST( c1o54*rho*(1.0+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq)); + // case TNE : return REAL_CAST(c1o216*rho*(1.0+3.0*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq)); + // case BSW : return REAL_CAST(c1o216*rho*(1.0+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq)); + // case BNE : return REAL_CAST(c1o216*rho*(1.0+3.0*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq)); + // case TSW : return REAL_CAST(c1o216*rho*(1.0+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq)); + // case TSE : return REAL_CAST(c1o216*rho*(1.0+3.0*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq)); + // case BNW : return REAL_CAST(c1o216*rho*(1.0+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq)); + // case BSE : return REAL_CAST(c1o216*rho*(1.0+3.0*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq)); + // case TNW : return REAL_CAST(c1o216*rho*(1.0+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq)); + // default: throw UbException(UB_EXARGS,"unknown dir"); + //} + + + ////----- + LBMReal rho = drho + one; + switch (direction) + { + case ZERO: return REAL_CAST(c8o27 * (drho + rho * (-cu_sq))); + case E: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx1)+c9o2 * (vx1) * (vx1)-cu_sq))); + case W: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq))); + case N: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx2)+c9o2 * (vx2) * (vx2)-cu_sq))); + case S: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq))); + case T: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (vx3)+c9o2 * (vx3) * (vx3)-cu_sq))); + case B: return REAL_CAST(c2o27 * (drho + rho * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq))); + case NE: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq))); + case SW: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq))); + case SE: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq))); + case NW: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq))); + case TE: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq))); + case BW: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq))); + case BE: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq))); + case TW: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq))); + case TN: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq))); + case BS: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq))); + case BN: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq))); + case TS: return REAL_CAST(c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq))); + case TNE: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq))); + case BSW: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq))); + case BNE: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq))); + case TSW: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq))); + case TSE: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq))); + case BNW: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq))); + case BSE: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq))); + case TNW: return REAL_CAST(c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq))); + default: throw UbException(UB_EXARGS, "unknown dir"); + } + + } + ////////////////////////////////////////////////////////////////////////// + static void calcCompFeq(LBMReal* const& feq/*[27]*/, const LBMReal& drho, const LBMReal& vx1, const LBMReal& vx2, const LBMReal& vx3) + { + //LBMReal cu_sq=1.5*(vx1*vx1+vx2*vx2+vx3*vx3); + + //feq[ZERO] = c8o27*rho*(1.0-cu_sq); + //feq[E] = c2o27*rho*(1.0+3.0*( vx1 )+c9o2*( vx1 )*( vx1 )-cu_sq); + //feq[W] = c2o27*rho*(1.0+3.0*(-vx1 )+c9o2*(-vx1 )*(-vx1 )-cu_sq); + //feq[N] = c2o27*rho*(1.0+3.0*( vx2)+c9o2*( vx2)*( vx2)-cu_sq); + //feq[S] = c2o27*rho*(1.0+3.0*( -vx2)+c9o2*( -vx2)*( -vx2)-cu_sq); + //feq[T] = c2o27*rho*(1.0+3.0*( vx3 )+c9o2*( vx3)*( vx3)-cu_sq); + //feq[B] = c2o27*rho*(1.0+3.0*( -vx3)+c9o2*( -vx3)*( -vx3)-cu_sq); + //feq[NE] = c1o54*rho*(1.0+3.0*( vx1+vx2)+c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq); + //feq[SW] = c1o54*rho*(1.0+3.0*(-vx1-vx2)+c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq); + //feq[SE] = c1o54*rho*(1.0+3.0*( vx1-vx2)+c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq); + //feq[NW] = c1o54*rho*(1.0+3.0*(-vx1+vx2)+c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq); + //feq[TE] = c1o54*rho*(1.0+3.0*( vx1+vx3)+c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq); + //feq[BW] = c1o54*rho*(1.0+3.0*(-vx1-vx3)+c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq); + //feq[BE] = c1o54*rho*(1.0+3.0*( vx1-vx3)+c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq); + //feq[TW] = c1o54*rho*(1.0+3.0*(-vx1+vx3)+c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq); + //feq[TN] = c1o54*rho*(1.0+3.0*( vx2+vx3)+c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq); + //feq[BS] = c1o54*rho*(1.0+3.0*(-vx2-vx3)+c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq); + //feq[BN] = c1o54*rho*(1.0+3.0*( vx2-vx3)+c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq); + //feq[TS] = c1o54*rho*(1.0+3.0*(-vx2+vx3)+c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq); + //feq[TNE] = c1o216*rho*(1.0+3.0*( vx1+vx2+vx3)+c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); + //feq[BSW] = c1o216*rho*(1.0+3.0*(-vx1-vx2-vx3)+c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); + //feq[BNE] = c1o216*rho*(1.0+3.0*( vx1+vx2-vx3)+c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); + //feq[TSW] = c1o216*rho*(1.0+3.0*(-vx1-vx2+vx3)+c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); + //feq[TSE] = c1o216*rho*(1.0+3.0*( vx1-vx2+vx3)+c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); + //feq[BNW] = c1o216*rho*(1.0+3.0*(-vx1+vx2-vx3)+c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); + //feq[BSE] = c1o216*rho*(1.0+3.0*( vx1-vx2-vx3)+c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); + //feq[TNW] = c1o216*rho*(1.0+3.0*(-vx1+vx2+vx3)+c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); + + ////////////////////////////////////////////////////////////////////////// + + LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); + LBMReal rho = drho + one; + + feq[ZERO] = c8o27 * (drho + rho * (-cu_sq)); + feq[E] = c2o27 * (drho + rho * (3.0 * (vx1)+c9o2 * (vx1) * (vx1)-cu_sq)); + feq[W] = c2o27 * (drho + rho * (3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq)); + feq[N] = c2o27 * (drho + rho * (3.0 * (vx2)+c9o2 * (vx2) * (vx2)-cu_sq)); + feq[S] = c2o27 * (drho + rho * (3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq)); + feq[T] = c2o27 * (drho + rho * (3.0 * (vx3)+c9o2 * (vx3) * (vx3)-cu_sq)); + feq[B] = c2o27 * (drho + rho * (3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq)); + feq[NE] = c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); + feq[SW] = c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); + feq[SE] = c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); + feq[NW] = c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); + feq[TE] = c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); + feq[BW] = c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); + feq[BE] = c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); + feq[TW] = c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); + feq[TN] = c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); + feq[BS] = c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); + feq[BN] = c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); + feq[TS] = c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); + feq[TNE] = c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); + feq[BSW] = c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); + feq[BNE] = c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); + feq[TSW] = c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); + feq[TSE] = c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); + feq[BNW] = c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); + feq[BSE] = c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); + feq[TNW] = c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)); + } + ////////////////////////////////////////////////////////////////////////// + static LBMReal getIncompFeqForDirection(const int& direction, const LBMReal& drho, const LBMReal& vx1, const LBMReal& vx2, const LBMReal& vx3) + { + LBMReal cu_sq = 1.5f * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); + + switch (direction) + { + case ZERO: return REAL_CAST(c8o27 * (drho - cu_sq)); + case E: return REAL_CAST(c2o27 * (drho + 3.0 * (vx1)+c9o2 * (vx1) * (vx1)-cu_sq)); + case W: return REAL_CAST(c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq)); + case N: return REAL_CAST(c2o27 * (drho + 3.0 * (vx2)+c9o2 * (vx2) * (vx2)-cu_sq)); + case S: return REAL_CAST(c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq)); + case T: return REAL_CAST(c2o27 * (drho + 3.0 * (vx3)+c9o2 * (vx3) * (vx3)-cu_sq)); + case B: return REAL_CAST(c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq)); + case NE: return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); + case SW: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); + case SE: return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); + case NW: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); + case TE: return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); + case BW: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); + case BE: return REAL_CAST(c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); + case TW: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); + case TN: return REAL_CAST(c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); + case BS: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); + case BN: return REAL_CAST(c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); + case TS: return REAL_CAST(c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); + case TNE: return REAL_CAST(c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); + case BSW: return REAL_CAST(c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); + case BNE: return REAL_CAST(c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); + case TSW: return REAL_CAST(c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); + case TSE: return REAL_CAST(c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); + case BNW: return REAL_CAST(c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); + case BSE: return REAL_CAST(c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); + case TNW: return REAL_CAST(c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq)); + default: throw UbException(UB_EXARGS, "unknown dir"); + } + } + ////////////////////////////////////////////////////////////////////////// + static void calcIncompFeq(LBMReal* const& feq/*[27]*/, const LBMReal& drho, const LBMReal& vx1, const LBMReal& vx2, const LBMReal& vx3) + { + LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); + + feq[ZERO] = c8o27 * (drho - cu_sq); + feq[E] = c2o27 * (drho + 3.0 * (vx1)+c9o2 * (vx1) * (vx1)-cu_sq); + feq[W] = c2o27 * (drho + 3.0 * (-vx1) + c9o2 * (-vx1) * (-vx1) - cu_sq); + feq[N] = c2o27 * (drho + 3.0 * (vx2)+c9o2 * (vx2) * (vx2)-cu_sq); + feq[S] = c2o27 * (drho + 3.0 * (-vx2) + c9o2 * (-vx2) * (-vx2) - cu_sq); + feq[T] = c2o27 * (drho + 3.0 * (vx3)+c9o2 * (vx3) * (vx3)-cu_sq); + feq[B] = c2o27 * (drho + 3.0 * (-vx3) + c9o2 * (-vx3) * (-vx3) - cu_sq); + feq[NE] = c1o54 * (drho + 3.0 * (vx1 + vx2) + c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq); + feq[SW] = c1o54 * (drho + 3.0 * (-vx1 - vx2) + c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq); + feq[SE] = c1o54 * (drho + 3.0 * (vx1 - vx2) + c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq); + feq[NW] = c1o54 * (drho + 3.0 * (-vx1 + vx2) + c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq); + feq[TE] = c1o54 * (drho + 3.0 * (vx1 + vx3) + c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq); + feq[BW] = c1o54 * (drho + 3.0 * (-vx1 - vx3) + c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq); + feq[BE] = c1o54 * (drho + 3.0 * (vx1 - vx3) + c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq); + feq[TW] = c1o54 * (drho + 3.0 * (-vx1 + vx3) + c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq); + feq[TN] = c1o54 * (drho + 3.0 * (vx2 + vx3) + c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq); + feq[BS] = c1o54 * (drho + 3.0 * (-vx2 - vx3) + c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq); + feq[BN] = c1o54 * (drho + 3.0 * (vx2 - vx3) + c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq); + feq[TS] = c1o54 * (drho + 3.0 * (-vx2 + vx3) + c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq); + feq[TNE] = c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq); + feq[BSW] = c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq); + feq[BNE] = c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq); + feq[TSW] = c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq); + feq[TSE] = c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq); + feq[BNW] = c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq); + feq[BSE] = c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq); + feq[TNW] = c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq); + } + ////////////////////////////////////////////////////////////////////////// + static inline float getBoundaryVelocityForDirection(const int& direction, const float& bcVelocityX1, const float& bcVelocityX2, const float& bcVelocityX3) + { + switch (direction) + { + case E: return (float)(UbMath::c4o9 * (+bcVelocityX1)); + case W: return (float)(UbMath::c4o9 * (-bcVelocityX1)); + case N: return (float)(UbMath::c4o9 * (+bcVelocityX2)); + case S: return (float)(UbMath::c4o9 * (-bcVelocityX2)); + case T: return (float)(UbMath::c4o9 * (+bcVelocityX3)); + case B: return (float)(UbMath::c4o9 * (-bcVelocityX3)); + case NE: return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX2)); + case SW: return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX2)); + case SE: return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX2)); + case NW: return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX2)); + case TE: return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX3)); + case BW: return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX3)); + case BE: return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX3)); + case TW: return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX3)); + case TN: return (float)(UbMath::c1o9 * (+bcVelocityX2 + bcVelocityX3)); + case BS: return (float)(UbMath::c1o9 * (-bcVelocityX2 - bcVelocityX3)); + case BN: return (float)(UbMath::c1o9 * (+bcVelocityX2 - bcVelocityX3)); + case TS: return (float)(UbMath::c1o9 * (-bcVelocityX2 + bcVelocityX3)); + case TNE: return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); + case BSW: return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); + case BNE: return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); + case TSW: return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); + case TSE: return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); + case BNW: return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); + case BSE: return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); + case TNW: return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); + default: throw UbException(UB_EXARGS, "unknown direction"); + } + } + /*=====================================================================*/ + static const int& getInvertDirection(const int& direction) + { #ifdef _DEBUG - if (direction < STARTDIR || direction > ENDDIR) - throw UbException(UB_EXARGS, "unknown direction"); + if (direction<STARTDIR || direction>ENDDIR) + throw UbException(UB_EXARGS, "unknown direction"); #endif - return INVDIR[direction]; -} -/*=====================================================================*/ -static void getLBMDirections(std::vector<int> &dirs, bool onlyLBdirs = false) -{ - std::vector<int> D3Q27Dirs; - if (onlyLBdirs) /*FSTARTDIR->FENDDIR*/ - { - dirs.resize(FENDDIR + 1); - for (int dir = FSTARTDIR; dir <= FENDDIR; ++dir) - dirs[dir] = dir; - } else /*STARTDIR->ENDDIR*/ - { - dirs.resize(ENDDIR + 1); - for (int dir = STARTDIR; dir <= ENDDIR; ++dir) - dirs[dir] = dir; - } -} -////////////////////////////////////////////////////////////////////////// -static std::vector<int> getEX(const int &exn) -{ - std::vector<int> ex; - ex.resize(ENDDIR + 1); - switch (exn) { - case 1: + return INVDIR[direction]; + } + /*=====================================================================*/ + static void getLBMDirections(std::vector<int>& dirs, bool onlyLBdirs = false) + { + std::vector<int> D3Q27Dirs; + if (onlyLBdirs) /*FSTARTDIR->FENDDIR*/ + { + dirs.resize(FENDDIR + 1); + for (int dir = FSTARTDIR; dir <= FENDDIR; ++dir) + dirs[dir] = dir; + } + else /*STARTDIR->ENDDIR*/ + { + dirs.resize(ENDDIR + 1); + for (int dir = STARTDIR; dir <= ENDDIR; ++dir) + dirs[dir] = dir; + } + } + ////////////////////////////////////////////////////////////////////////// + static std::vector<int> getEX(const int& exn) + { + std::vector<int> ex; + ex.resize(ENDDIR + 1); + switch (exn) + { + case 1: for (int dir = STARTDIR; dir < ENDDIR; ++dir) - ex[dir] = DX1[dir]; + ex[dir] = DX1[dir]; break; - case 2: + case 2: for (int dir = STARTDIR; dir < ENDDIR; ++dir) - ex[dir] = DX2[dir]; + ex[dir] = DX2[dir]; break; - case 3: + case 3: for (int dir = STARTDIR; dir < ENDDIR; ++dir) - ex[dir] = DX3[dir]; + ex[dir] = DX3[dir]; break; - } - return ex; -} -////////////////////////////////////////////////////////////////////////// -static inline void calcDistanceToNeighbors(std::vector<double> &distNeigh, const double &deltaX1) -{ - // distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1); - double sqrt3 = UbMath::sqrt3; - double sqrt2 = UbMath::sqrt2; - distNeigh[E] = distNeigh[W] = distNeigh[N] = deltaX1; - distNeigh[S] = distNeigh[T] = distNeigh[B] = deltaX1; - distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = sqrt2 * deltaX1; - distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = sqrt2 * deltaX1; - distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = sqrt2 * deltaX1; - distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = sqrt3 * deltaX1; - distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = sqrt3 * deltaX1; -} -////////////////////////////////////////////////////////////////////////// -static inline void calcDistanceToNeighbors(std::vector<double> &distNeigh, const double &deltaX1, const double &deltaX2, - const double &deltaX3) -{ - // distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1); - distNeigh[E] = distNeigh[W] = deltaX1; - distNeigh[N] = distNeigh[S] = deltaX2; - distNeigh[T] = distNeigh[B] = deltaX3; - distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2); - distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = sqrt(deltaX1 * deltaX1 + deltaX3 * deltaX3); - distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = sqrt(deltaX2 * deltaX2 + deltaX3 * deltaX3); - distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = - sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3); - distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = - sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3); -} -////////////////////////////////////////////////////////////////////////// -static inline void initRayVectors(double *const &rayX1, double *const &rayX2, double *const &rayX3) -{ - using namespace UbMath; - - int fdir; - double c1oS2 = UbMath::one_over_sqrt2; - double c1oS3 = UbMath::one_over_sqrt3; - fdir = E; - rayX1[fdir] = 1.0; - rayX2[fdir] = 0.0; - rayX3[fdir] = 0.0; - fdir = W; - rayX1[fdir] = -1.0; - rayX2[fdir] = 0.0; - rayX3[fdir] = 0.0; - fdir = N; - rayX1[fdir] = 0.0; - rayX2[fdir] = 1.0; - rayX3[fdir] = 0.0; - fdir = S; - rayX1[fdir] = 0.0; - rayX2[fdir] = -1.0; - rayX3[fdir] = 0.0; - fdir = T; - rayX1[fdir] = 0.0; - rayX2[fdir] = 0.0; - rayX3[fdir] = 1.0; - fdir = B; - rayX1[fdir] = 0.0; - rayX2[fdir] = 0.0; - rayX3[fdir] = -1.0; - fdir = NE; - rayX1[fdir] = c1oS2; - rayX2[fdir] = c1oS2; - rayX3[fdir] = 0.0; - fdir = SW; - rayX1[fdir] = -c1oS2; - rayX2[fdir] = -c1oS2; - rayX3[fdir] = 0.0; - fdir = SE; - rayX1[fdir] = c1oS2; - rayX2[fdir] = -c1oS2; - rayX3[fdir] = 0.0; - fdir = NW; - rayX1[fdir] = -c1oS2; - rayX2[fdir] = c1oS2; - rayX3[fdir] = 0.0; - fdir = TE; - rayX1[fdir] = c1oS2; - rayX2[fdir] = 0.0; - rayX3[fdir] = c1oS2; - fdir = BW; - rayX1[fdir] = -c1oS2; - rayX2[fdir] = 0.0; - rayX3[fdir] = -c1oS2; - fdir = BE; - rayX1[fdir] = c1oS2; - rayX2[fdir] = 0.0; - rayX3[fdir] = -c1oS2; - fdir = TW; - rayX1[fdir] = -c1oS2; - rayX2[fdir] = 0.0; - rayX3[fdir] = c1oS2; - fdir = TN; - rayX1[fdir] = 0.0; - rayX2[fdir] = c1oS2; - rayX3[fdir] = c1oS2; - fdir = BS; - rayX1[fdir] = 0.0; - rayX2[fdir] = -c1oS2; - rayX3[fdir] = -c1oS2; - fdir = BN; - rayX1[fdir] = 0.0; - rayX2[fdir] = c1oS2; - rayX3[fdir] = -c1oS2; - fdir = TS; - rayX1[fdir] = 0.0; - rayX2[fdir] = -c1oS2; - rayX3[fdir] = c1oS2; - fdir = TNE; - rayX1[fdir] = c1oS3; - rayX2[fdir] = c1oS3; - rayX3[fdir] = c1oS3; - fdir = TNW; - rayX1[fdir] = -c1oS3; - rayX2[fdir] = c1oS3; - rayX3[fdir] = c1oS3; - fdir = TSE; - rayX1[fdir] = c1oS3; - rayX2[fdir] = -c1oS3; - rayX3[fdir] = c1oS3; - fdir = TSW; - rayX1[fdir] = -c1oS3; - rayX2[fdir] = -c1oS3; - rayX3[fdir] = c1oS3; - fdir = BNE; - rayX1[fdir] = c1oS3; - rayX2[fdir] = c1oS3; - rayX3[fdir] = -c1oS3; - fdir = BNW; - rayX1[fdir] = -c1oS3; - rayX2[fdir] = c1oS3; - rayX3[fdir] = -c1oS3; - fdir = BSE; - rayX1[fdir] = c1oS3; - rayX2[fdir] = -c1oS3; - rayX3[fdir] = -c1oS3; - fdir = BSW; - rayX1[fdir] = -c1oS3; - rayX2[fdir] = -c1oS3; - rayX3[fdir] = -c1oS3; -} -////////////////////////////////////////////////////////////////////////// -static inline LBMReal calcPress(const LBMReal *const f, LBMReal rho, LBMReal vx1, LBMReal vx2, LBMReal vx3) -{ - using namespace UbMath; - LBMReal OxxPyyPzz = c1; - return ((f[E] + f[W] + f[N] + f[S] + f[T] + f[B] + - c2 * (f[NE] + f[SW] + f[SE] + f[NW] + f[TE] + f[BW] + f[BE] + f[TW] + f[TN] + f[BS] + f[BN] + f[TS]) + - c3 * (f[TNE] + f[TSW] + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW]) - - (vx1 * vx1 + vx2 * vx2 + vx3 * vx3)) * - (c1 - c1o2 * OxxPyyPzz) + - OxxPyyPzz * c1o2 * (rho)) * - c1o3; -} -} // namespace D3Q27System + } + return ex; + } + ////////////////////////////////////////////////////////////////////////// + static inline void calcDistanceToNeighbors(std::vector<double>& distNeigh, const double& deltaX1) + { + //distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1); + double sqrt3 = UbMath::sqrt3; + double sqrt2 = UbMath::sqrt2; + distNeigh[E] = distNeigh[W] = distNeigh[N] = deltaX1; + distNeigh[S] = distNeigh[T] = distNeigh[B] = deltaX1; + distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = sqrt2 * deltaX1; + distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = sqrt2 * deltaX1; + distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = sqrt2 * deltaX1; + distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = sqrt3 * deltaX1; + distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = sqrt3 * deltaX1; + } + ////////////////////////////////////////////////////////////////////////// + static inline void calcDistanceToNeighbors(std::vector<double>& distNeigh, const double& deltaX1, const double& deltaX2, const double& deltaX3) + { + //distNeigh.resize(FENDDIR+1, UbMath::sqrt2*deltaX1); + double sqrt3 = UbMath::sqrt3; + double sqrt2 = UbMath::sqrt2; + distNeigh[E] = distNeigh[W] = deltaX1; + distNeigh[N] = distNeigh[S] = deltaX2; + distNeigh[T] = distNeigh[B] = deltaX3; + distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2); + distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = sqrt(deltaX1 * deltaX1 + deltaX3 * deltaX3); + distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = sqrt(deltaX2 * deltaX2 + deltaX3 * deltaX3); + distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3); + distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = sqrt(deltaX1 * deltaX1 + deltaX2 * deltaX2 + deltaX3 * deltaX3); + } + ////////////////////////////////////////////////////////////////////////// + static inline void initRayVectors(double* const& rayX1, double* const& rayX2, double* const& rayX3) + { + int fdir; + double c1oS2 = UbMath::one_over_sqrt2; + double c1oS3 = UbMath::one_over_sqrt3; + fdir = E; rayX1[fdir] = 1.0; rayX2[fdir] = 0.0; rayX3[fdir] = 0.0; + fdir = W; rayX1[fdir] = -1.0; rayX2[fdir] = 0.0; rayX3[fdir] = 0.0; + fdir = N; rayX1[fdir] = 0.0; rayX2[fdir] = 1.0; rayX3[fdir] = 0.0; + fdir = S; rayX1[fdir] = 0.0; rayX2[fdir] = -1.0; rayX3[fdir] = 0.0; + fdir = T; rayX1[fdir] = 0.0; rayX2[fdir] = 0.0; rayX3[fdir] = 1.0; + fdir = B; rayX1[fdir] = 0.0; rayX2[fdir] = 0.0; rayX3[fdir] = -1.0; + fdir = NE; rayX1[fdir] = c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] = 0.0; + fdir = SW; rayX1[fdir] = -c1oS2; rayX2[fdir] = -c1oS2; rayX3[fdir] = 0.0; + fdir = SE; rayX1[fdir] = c1oS2; rayX2[fdir] = -c1oS2; rayX3[fdir] = 0.0; + fdir = NW; rayX1[fdir] = -c1oS2; rayX2[fdir] = c1oS2; rayX3[fdir] = 0.0; + fdir = TE; rayX1[fdir] = c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = c1oS2; + fdir = BW; rayX1[fdir] = -c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = -c1oS2; + fdir = BE; rayX1[fdir] = c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = -c1oS2; + fdir = TW; rayX1[fdir] = -c1oS2; rayX2[fdir] = 0.0; rayX3[fdir] = c1oS2; + fdir = TN; rayX1[fdir] = 0.0; rayX2[fdir] = c1oS2; rayX3[fdir] = c1oS2; + fdir = BS; rayX1[fdir] = 0.0; rayX2[fdir] = -c1oS2; rayX3[fdir] = -c1oS2; + fdir = BN; rayX1[fdir] = 0.0; rayX2[fdir] = c1oS2; rayX3[fdir] = -c1oS2; + fdir = TS; rayX1[fdir] = 0.0; rayX2[fdir] = -c1oS2; rayX3[fdir] = c1oS2; + fdir = TNE; rayX1[fdir] = c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = c1oS3; + fdir = TNW; rayX1[fdir] = -c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = c1oS3; + fdir = TSE; rayX1[fdir] = c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = c1oS3; + fdir = TSW; rayX1[fdir] = -c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = c1oS3; + fdir = BNE; rayX1[fdir] = c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = -c1oS3; + fdir = BNW; rayX1[fdir] = -c1oS3; rayX2[fdir] = c1oS3; rayX3[fdir] = -c1oS3; + fdir = BSE; rayX1[fdir] = c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = -c1oS3; + fdir = BSW; rayX1[fdir] = -c1oS3; rayX2[fdir] = -c1oS3; rayX3[fdir] = -c1oS3; + } + ////////////////////////////////////////////////////////////////////////// + static inline LBMReal calcPress(const LBMReal* const f, LBMReal rho, LBMReal vx1, LBMReal vx2, LBMReal vx3) + { + LBMReal op = 1.0; + return ((f[E] + f[W] + f[N] + f[S] + f[T] + f[B] + 2. * (f[NE] + f[SW] + f[SE] + f[NW] + f[TE] + f[BW] + f[BE] + f[TW] + f[TN] + f[BS] + f[BN] + f[TS]) + + 3. * (f[TNE] + f[TSW] + f[TSE] + f[TNW] + f[BNE] + f[BSW] + f[BSE] + f[BNW]) - (vx1 * vx1 + vx2 * vx2 + vx3 * vx3)) * (1 - 0.5 * op) + op * 0.5 * (rho)) * c1o3; + + } + ////////////////////////////////////////////////////////////////////////// + static inline LBMReal getShearRate(const LBMReal* const f, LBMReal collFactorF) + { + LBMReal mfcbb = f[E]; + LBMReal mfbcb = f[N]; + LBMReal mfbbc = f[T]; + LBMReal mfccb = f[NE]; + LBMReal mfacb = f[NW]; + LBMReal mfcbc = f[TE]; + LBMReal mfabc = f[TW]; + LBMReal mfbcc = f[TN]; + LBMReal mfbac = f[TS]; + LBMReal mfccc = f[TNE]; + LBMReal mfacc = f[TNW]; + LBMReal mfcac = f[TSE]; + LBMReal mfaac = f[TSW]; + + LBMReal mfabb = f[W]; + LBMReal mfbab = f[S]; + LBMReal mfbba = f[B]; + LBMReal mfaab = f[SW]; + LBMReal mfcab = f[SE]; + LBMReal mfaba = f[BW]; + LBMReal mfcba = f[BE]; + LBMReal mfbaa = f[BS]; + LBMReal mfbca = f[BN]; + LBMReal mfaaa = f[BSW]; + LBMReal mfcaa = f[BSE]; + LBMReal mfaca = f[BNW]; + LBMReal mfcca = f[BNE]; + + LBMReal mfbbb = f[ZERO]; + + LBMReal m0, m1, m2; + + LBMReal rho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + //LBMReal OxxPyyPzz = 1.; + + LBMReal oMdrho; + + oMdrho = mfccc + mfaaa; + m0 = mfaca + mfcac; + m1 = mfacc + mfcaa; + m2 = mfaac + mfcca; + oMdrho += m0; + m1 += m2; + oMdrho += m1; + m0 = mfbac + mfbca; + m1 = mfbaa + mfbcc; + m0 += m1; + m1 = mfabc + mfcba; + m2 = mfaba + mfcbc; + m1 += m2; + m0 += m1; + m1 = mfacb + mfcab; + m2 = mfaab + mfccb; + m1 += m2; + m0 += m1; + oMdrho += m0; + m0 = mfabb + mfcbb; + m1 = mfbab + mfbcb; + m2 = mfbba + mfbbc; + m0 += m1 + m2; + m0 += mfbbb; //hat gefehlt + oMdrho = 1. - (oMdrho + m0); + + LBMReal vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx * vvx; + vy2 = vvy * vvy; + vz2 = vvz * vvz; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal qudricLimit = 0.01; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m2 = mfaaa + mfaac; + m1 = mfaac - mfaaa; + m0 = m2 + mfaab; + mfaaa = m0; + m0 += c1o36 * oMdrho; + mfaab = m1 - m0 * vvz; + mfaac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfabc; + m1 = mfabc - mfaba; + m0 = m2 + mfabb; + mfaba = m0; + m0 += c1o9 * oMdrho; + mfabb = m1 - m0 * vvz; + mfabc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfacc; + m1 = mfacc - mfaca; + m0 = m2 + mfacb; + mfaca = m0; + m0 += c1o36 * oMdrho; + mfacb = m1 - m0 * vvz; + mfacc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbac; + m1 = mfbac - mfbaa; + m0 = m2 + mfbab; + mfbaa = m0; + m0 += c1o9 * oMdrho; + mfbab = m1 - m0 * vvz; + mfbac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbba + mfbbc; + m1 = mfbbc - mfbba; + m0 = m2 + mfbbb; + mfbba = m0; + m0 += c4o9 * oMdrho; + mfbbb = m1 - m0 * vvz; + mfbbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbca + mfbcc; + m1 = mfbcc - mfbca; + m0 = m2 + mfbcb; + mfbca = m0; + m0 += c1o9 * oMdrho; + mfbcb = m1 - m0 * vvz; + mfbcc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcac; + m1 = mfcac - mfcaa; + m0 = m2 + mfcab; + mfcaa = m0; + m0 += c1o36 * oMdrho; + mfcab = m1 - m0 * vvz; + mfcac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcba + mfcbc; + m1 = mfcbc - mfcba; + m0 = m2 + mfcbb; + mfcba = m0; + m0 += c1o9 * oMdrho; + mfcbb = m1 - m0 * vvz; + mfcbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcca + mfccc; + m1 = mfccc - mfcca; + m0 = m2 + mfccb; + mfcca = m0; + m0 += c1o36 * oMdrho; + mfccb = m1 - m0 * vvz; + mfccc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m2 = mfaaa + mfaca; + m1 = mfaca - mfaaa; + m0 = m2 + mfaba; + mfaaa = m0; + m0 += c1o6 * oMdrho; + mfaba = m1 - m0 * vvy; + mfaca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfacb; + m1 = mfacb - mfaab; + m0 = m2 + mfabb; + mfaab = m0; + mfabb = m1 - m0 * vvy; + mfacb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfacc; + m1 = mfacc - mfaac; + m0 = m2 + mfabc; + mfaac = m0; + m0 += c1o18 * oMdrho; + mfabc = m1 - m0 * vvy; + mfacc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbca; + m1 = mfbca - mfbaa; + m0 = m2 + mfbba; + mfbaa = m0; + m0 += c2o3 * oMdrho; + mfbba = m1 - m0 * vvy; + mfbca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbab + mfbcb; + m1 = mfbcb - mfbab; + m0 = m2 + mfbbb; + mfbab = m0; + mfbbb = m1 - m0 * vvy; + mfbcb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbac + mfbcc; + m1 = mfbcc - mfbac; + m0 = m2 + mfbbc; + mfbac = m0; + m0 += c2o9 * oMdrho; + mfbbc = m1 - m0 * vvy; + mfbcc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcca; + m1 = mfcca - mfcaa; + m0 = m2 + mfcba; + mfcaa = m0; + m0 += c1o6 * oMdrho; + mfcba = m1 - m0 * vvy; + mfcca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcab + mfccb; + m1 = mfccb - mfcab; + m0 = m2 + mfcbb; + mfcab = m0; + mfcbb = m1 - m0 * vvy; + mfccb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcac + mfccc; + m1 = mfccc - mfcac; + m0 = m2 + mfcbc; + mfcac = m0; + m0 += c1o18 * oMdrho; + mfcbc = m1 - m0 * vvy; + mfccc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m2 = mfaaa + mfcaa; + m1 = mfcaa - mfaaa; + m0 = m2 + mfbaa; + mfaaa = m0; + m0 += 1. * oMdrho; + mfbaa = m1 - m0 * vvx; + mfcaa = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfcba; + m1 = mfcba - mfaba; + m0 = m2 + mfbba; + mfaba = m0; + mfbba = m1 - m0 * vvx; + mfcba = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfcca; + m1 = mfcca - mfaca; + m0 = m2 + mfbca; + mfaca = m0; + m0 += c1o3 * oMdrho; + mfbca = m1 - m0 * vvx; + mfcca = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfcab; + m1 = mfcab - mfaab; + m0 = m2 + mfbab; + mfaab = m0; + mfbab = m1 - m0 * vvx; + mfcab = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabb + mfcbb; + m1 = mfcbb - mfabb; + m0 = m2 + mfbbb; + mfabb = m0; + mfbbb = m1 - m0 * vvx; + mfcbb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacb + mfccb; + m1 = mfccb - mfacb; + m0 = m2 + mfbcb; + mfacb = m0; + mfbcb = m1 - m0 * vvx; + mfccb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfcac; + m1 = mfcac - mfaac; + m0 = m2 + mfbac; + mfaac = m0; + m0 += c1o3 * oMdrho; + mfbac = m1 - m0 * vvx; + mfcac = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabc + mfcbc; + m1 = mfcbc - mfabc; + m0 = m2 + mfbbc; + mfabc = m0; + mfbbc = m1 - m0 * vvx; + mfcbc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacc + mfccc; + m1 = mfccc - mfacc; + m0 = m2 + mfbcc; + mfacc = m0; + m0 += c1o9 * oMdrho; + mfbcc = m1 - m0 * vvx; + mfccc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity + LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// + //LBMReal OxyyMxzz = 1.;//2+s9;// + LBMReal O4 = 1.; + LBMReal O5 = 1.; + LBMReal O6 = 1.; + + //Cum 4. + //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); + LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); + LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); + + //Cum 5. + LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho; + LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho; + LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho; + + //Cum 6. + LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho; + + + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + LBMReal dxux = -c1o2 * collFactorF * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + LBMReal dyuy = dxux + collFactorF * c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorF * c3o2 * mxxMzz; + + LBMReal Dxy = -three * collFactorF * mfbba; + LBMReal Dxz = -three * collFactorF * mfbab; + LBMReal Dyz = -three * collFactorF * mfabb; + + return sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one); + } + } #endif + + + diff --git a/src/cpu/VirtualFluidsCore/LBM/HerschelBulkleyModelLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/HerschelBulkleyModelLBMKernel.h new file mode 100644 index 000000000..c5cff32aa --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/HerschelBulkleyModelLBMKernel.h @@ -0,0 +1,38 @@ +#ifndef HerschelBulkleyModelLBMKernel_H +#define HerschelBulkleyModelLBMKernel_H + +#include "ThixotropyModelLBMKernel.h" +#include "Thixotropy.h" + +//! \brief Cumulant LBM kernel + Herschel-Bulkley plastic model +//! \author K. Kutscher, M. Geier +class HerschelBulkleyModelLBMKernel : public ThixotropyModelLBMKernel +{ +public: + HerschelBulkleyModelLBMKernel() {}; + ~HerschelBulkleyModelLBMKernel() {}; + SPtr<LBMKernel> clone() override + { + SPtr<LBMKernel> kernel(new HerschelBulkleyModelLBMKernel()); + kernel->setNX(nx); + kernel->setCollisionFactor(collFactor); + dynamicPointerCast<HerschelBulkleyModelLBMKernel>(kernel)->initDataSet(); + kernel->setBCProcessor(bcProcessor->clone(kernel)); + kernel->setWithForcing(withForcing); + kernel->setForcingX1(muForcingX1); + kernel->setForcingX2(muForcingX2); + kernel->setForcingX3(muForcingX3); + kernel->setIndex(ix1, ix2, ix3); + kernel->setDeltaT(deltaT); + + return kernel; + } +protected: + LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const override + { + return Thixotropy::getHerschelBulkleyCollFactor(omegaInf, shearRate, drho); + } +}; + + +#endif \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp new file mode 100644 index 000000000..e957b83e3 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp @@ -0,0 +1,43 @@ +#include "Thixotropy.h" + +SPtr<Thixotropy> Thixotropy::instance = SPtr<Thixotropy>(); +LBMReal Thixotropy::tau0 = 0; +LBMReal Thixotropy::k = 0; +LBMReal Thixotropy::n = 1; + +////////////////////////////////////////////////////////////////////////// +SPtr<Thixotropy> Thixotropy::getInstance() +{ + if (!instance) + instance = SPtr<Thixotropy>(new Thixotropy()); + return instance; +} + +void Thixotropy::setYieldStress(LBMReal yieldStress) +{ + tau0 = yieldStress; +} +LBMReal Thixotropy::getYieldStress() +{ + return tau0; +} +void Thixotropy::setViscosityParameter(LBMReal kParameter) +{ + k = kParameter; +} +LBMReal Thixotropy::getViscosityParameter() +{ + return k; +} +void Thixotropy::setPowerIndex(LBMReal index) +{ + n = index; +} +LBMReal Thixotropy::getPowerIndex() +{ + return n; +} + +Thixotropy::Thixotropy() +{ +} \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/LBM/Thixotropy.h b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.h new file mode 100644 index 000000000..bb38862b0 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.h @@ -0,0 +1,103 @@ +#ifndef Thixotropy_H +#define Thixotropy_H + +#include <PointerDefinitions.h> +#include <LBMSystem.h> +#include <UbMath.h> + +//namespace Thixotropy +//{ +// ////////////////////////////////////////////////////////////////////////// +// inline LBMReal getBinghamCollFactor(LBMReal omegaInf, LBMReal yieldSterss, LBMReal shearRate, LBMReal drho) +// { +// LBMReal cs2 = one_over_sqrt3 * one_over_sqrt3; +// LBMReal rho = one + drho; +// LBMReal omega = omegaInf * (one - (omegaInf * yieldSterss) / (shearRate * cs2 * rho + UbMath::Epsilon<LBMReal>::val())); +// return omega; +// } +// ////////////////////////////////////////////////////////////////////////// +// inline LBMReal getHerschelBulkleyCollFactor(LBMReal omegaInf, LBMReal yieldSterss, LBMReal shearRate, LBMReal drho, LBMReal k, LBMReal n) +// { +// LBMReal cs2 = one_over_sqrt3 * one_over_sqrt3; +// LBMReal rho = one + drho; +// LBMReal gammaDot = shearRate; +// LBMReal tau0 = yieldSterss; +// LBMReal omega = omegaInf; +// LBMReal epsilon = 1; +// +// while (epsilon > 1e-10) +// { +// LBMReal omegaOld = omega; +// LBMReal gammaDotPowN = std::pow(gammaDot, n); +// LBMReal omegaByOmegaInfPowN = std::pow(omega / omegaInf, n); +// LBMReal numerator = (2.0 * gammaDotPowN * k * omegaByOmegaInfPowN * omegaInf + cs2 * gammaDot * (omega - 2.0) * rho + 2.0 * omegaInf * tau0); +// LBMReal denominator = (2.0 * k * n * gammaDotPowN * omegaByOmegaInfPowN * omegaInf + cs2 * gammaDot * rho * omega) + UbMath::Epsilon<LBMReal>::val(); +// omega = omega - omega * numerator / denominator; +// omega = (omega < zeroReal) ? c1o2 * omegaOld : omega; +// epsilon = std::abs(omega - omegaOld); +// } +// +// return omega; +// } +//} + +class Thixotropy +{ +public: + Thixotropy(Thixotropy const&) = delete; + Thixotropy& operator=(Thixotropy const&) = delete; + static SPtr<Thixotropy> getInstance(); + void setYieldStress(LBMReal tau0); + LBMReal getYieldStress(); + + void setViscosityParameter(LBMReal k); + LBMReal getViscosityParameter(); + + void setPowerIndex(LBMReal n); + LBMReal getPowerIndex(); + + static LBMReal getBinghamCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho); + static LBMReal getHerschelBulkleyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho); +private: + Thixotropy(); + + static SPtr<Thixotropy> instance; + + static LBMReal tau0; + static LBMReal k; + static LBMReal n; +}; + +////////////////////////////////////////////////////////////////////////// +inline LBMReal Thixotropy::getBinghamCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) +{ + LBMReal cs2 = UbMath::one_over_sqrt3 * UbMath::one_over_sqrt3; + LBMReal rho = UbMath::one + drho; + LBMReal omega = omegaInf * (UbMath::one - (omegaInf * tau0) / (shearRate * cs2 * rho + UbMath::Epsilon<LBMReal>::val())); + return omega; +} +////////////////////////////////////////////////////////////////////////// +inline LBMReal Thixotropy::getHerschelBulkleyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) +{ + LBMReal cs2 = UbMath::one_over_sqrt3 * UbMath::one_over_sqrt3; + LBMReal rho = UbMath::one + drho; + LBMReal gammaDot = shearRate; + LBMReal omega = omegaInf; + LBMReal epsilon = 1; + + while (epsilon > 1e-10) + { + LBMReal omegaOld = omega; + LBMReal gammaDotPowN = std::pow(gammaDot, n); + LBMReal omegaByOmegaInfPowN = std::pow(omega / omegaInf, n); + LBMReal numerator = (2.0 * gammaDotPowN * k * omegaByOmegaInfPowN * omegaInf + cs2 * gammaDot * (omega - 2.0) * rho + 2.0 * omegaInf * tau0); + LBMReal denominator = (2.0 * k * n * gammaDotPowN * omegaByOmegaInfPowN * omegaInf + cs2 * gammaDot * rho * omega) + UbMath::Epsilon<LBMReal>::val(); + omega = omega - omega * numerator / denominator; + omega = (omega < UbMath::zeroReal) ? UbMath::c1o2 * omegaOld : omega; + epsilon = std::abs(omega - omegaOld); + } + + return omega; +} + +#endif diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp new file mode 100644 index 000000000..adbca6c6c --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp @@ -0,0 +1,1874 @@ +#include "ThixotropyExpLBMKernel.h" +#include "D3Q27System.h" +#include "InterpolationProcessor.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include <math.h> +#include "DataSet3D.h" +#include "LBMKernel.h" + +#define PROOF_CORRECTNESS + +////////////////////////////////////////////////////////////////////////// +ThixotropyExpLBMKernel::ThixotropyExpLBMKernel() +{ + this->parameter = ThixotropyExpLBMKernel::NORMAL; + this->compressible = false; + //this->TwoDistributions = true; +} +////////////////////////////////////////////////////////////////////////// +ThixotropyExpLBMKernel::~ThixotropyExpLBMKernel(void) +{ + +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyExpLBMKernel::initDataSet() +{ + //DistributionArray3DPtr d(new D3Q27EsoTwist3DSplittedVector(nx1+ghostLayerWitdh*2, nx2+ghostLayerWitdh*2, nx3+ghostLayerWitdh*2, -999.0)); + SPtr<DistributionArray3D> df(new D3Q27EsoTwist3DSplittedVector(nx[0]+2, nx[1]+2, nx[2]+2, -999.0)); + SPtr<DistributionArray3D> dh(new D3Q27EsoTwist3DSplittedVector(nx[0]+2, nx[1]+2, nx[2]+2, -999.0)); + dataSet->setFdistributions(df); + dataSet->setHdistributions(dh); +} +////////////////////////////////////////////////////////////////////////// +SPtr<LBMKernel> ThixotropyExpLBMKernel::clone() +{ + SPtr<LBMKernel> kernel(new ThixotropyExpLBMKernel()); + kernel->setNX(nx); + kernel->setCollisionFactor(collFactor); + collFactorF = collFactor; + collFactorH = collFactor; + dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->initDataSet(); + dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->setCollisionFactorF(this->collFactorF); + dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->setCollisionFactorH(this->collFactorH); + dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->setAlpha(this->alpha); + dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->setTheta(this->theta); + kernel->setBCProcessor(bcProcessor->clone(kernel)); + kernel->setWithForcing(withForcing); + kernel->setForcingX1(muForcingX1); + kernel->setForcingX2(muForcingX2); + kernel->setForcingX3(muForcingX3); + kernel->setIndex(ix1, ix2, ix3); + kernel->setDeltaT(deltaT); + + switch (parameter) + { + case NORMAL: + dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->OxyyMxzz = 1.0; + break; + case MAGIC: + dynamicPointerCast<ThixotropyExpLBMKernel>(kernel)->OxyyMxzz = 2.0 + (-collFactorF); + break; + } + return kernel; +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyExpLBMKernel::calculate(int step) +{ + using namespace D3Q27System; + + //initializing of forcing stuff + if (withForcing) + { + muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); + muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); + muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); + + muDeltaT = deltaT; + + muForcingX1.DefineVar("dt", &muDeltaT); + muForcingX2.DefineVar("dt", &muDeltaT); + muForcingX3.DefineVar("dt", &muDeltaT); + + muNu = (1.0 / 3.0)*(1.0 / collFactor - 1.0 / 2.0); + + muForcingX1.DefineVar("nu", &muNu); + muForcingX2.DefineVar("nu", &muNu); + muForcingX3.DefineVar("nu", &muNu); + + LBMReal forcingX1 = 0; + LBMReal forcingX2 = 0; + LBMReal forcingX3 = 0; + } + ///////////////////////////////////// + + localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + + localDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions(); + nonLocalDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions(); + zeroDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions(); + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + const int bcArrayMaxX1 = (int)bcArray->getNX1(); + const int bcArrayMaxX2 = (int)bcArray->getNX2(); + const int bcArrayMaxX3 = (int)bcArray->getNX3(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = bcArrayMaxX1 - ghostLayerWidth; + int maxX2 = bcArrayMaxX2 - ghostLayerWidth; + int maxX3 = bcArrayMaxX3 - ghostLayerWidth; + + + //#pragma omp parallel num_threads(8) + { + // int i = omp_get_thread_num(); + // printf_s("Hello from thread %d\n", i); + //} + //#pragma omp for + for (int x3 = minX3; x3 < maxX3; x3++) + { + for (int x2 = minX2; x2 < maxX2; x2++) + { + for (int x1 = minX1; x1 < maxX1; x1++) + { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) + { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + ////////////////////////////////////////////////////////////////////////// + //read distribution + // Cumulant (NSE part) + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + LBMReal mfcbb = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); + + LBMReal mfabb = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsH)(x1, x2, x3); + + LBMReal lambda = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + //E N T + //c c c + ////////// + //W S B + //a a a + + //Rest ist b + + //mfxyz + //a - negative + //b - null + //c - positive + + // a b c + //-1 0 1 + + mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + + mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal m0, m1, m2; + + LBMReal rho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + + LBMReal eta0 = (1/collFactor-c1o2)*c1o3; + LBMReal eta = (1 + lambda)* eta0; + //collFactorF = one/(3*eta/(rho+one)+c1o2); + collFactorF = collFactor; + + //forcing + /////////////////////////////////////////////////////////////////////////////////////////// + if (withForcing) + { + muX1 = static_cast<double>(x1 - 1 + ix1*maxX1); + muX2 = static_cast<double>(x2 - 1 + ix2*maxX2); + muX3 = static_cast<double>(x3 - 1 + ix3*maxX3); + + forcingX1 = muForcingX1.Eval(); + forcingX2 = muForcingX2.Eval(); + forcingX3 = muForcingX3.Eval(); + + vvx += forcingX1*deltaT*0.5; // X + vvy += forcingX2*deltaT*0.5; // Y + vvz += forcingX3*deltaT*0.5; // Z + } + /////////////////////////////////////////////////////////////////////////////////////////// + LBMReal oMdrho; + + oMdrho = mfccc + mfaaa; + m0 = mfaca + mfcac; + m1 = mfacc + mfcaa; + m2 = mfaac + mfcca; + oMdrho += m0; + m1 += m2; + oMdrho += m1; + m0 = mfbac + mfbca; + m1 = mfbaa + mfbcc; + m0 += m1; + m1 = mfabc + mfcba; + m2 = mfaba + mfcbc; + m1 += m2; + m0 += m1; + m1 = mfacb + mfcab; + m2 = mfaab + mfccb; + m1 += m2; + m0 += m1; + oMdrho += m0; + m0 = mfabb + mfcbb; + m1 = mfbab + mfbcb; + m2 = mfbba + mfbbc; + m0 += m1 + m2; + m0 += mfbbb; //hat gefehlt + oMdrho = 1. - (oMdrho + m0); + + LBMReal vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx*vvx; + vy2 = vvy*vvy; + vz2 = vvz*vvz; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal wadjust; + LBMReal qudricLimit = 0.01; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m2 = mfaaa + mfaac; + m1 = mfaac - mfaaa; + m0 = m2 + mfaab; + mfaaa = m0; + m0 += c1o36 * oMdrho; + mfaab = m1 - m0 * vvz; + mfaac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfabc; + m1 = mfabc - mfaba; + m0 = m2 + mfabb; + mfaba = m0; + m0 += c1o9 * oMdrho; + mfabb = m1 - m0 * vvz; + mfabc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfacc; + m1 = mfacc - mfaca; + m0 = m2 + mfacb; + mfaca = m0; + m0 += c1o36 * oMdrho; + mfacb = m1 - m0 * vvz; + mfacc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbac; + m1 = mfbac - mfbaa; + m0 = m2 + mfbab; + mfbaa = m0; + m0 += c1o9 * oMdrho; + mfbab = m1 - m0 * vvz; + mfbac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbba + mfbbc; + m1 = mfbbc - mfbba; + m0 = m2 + mfbbb; + mfbba = m0; + m0 += c4o9 * oMdrho; + mfbbb = m1 - m0 * vvz; + mfbbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbca + mfbcc; + m1 = mfbcc - mfbca; + m0 = m2 + mfbcb; + mfbca = m0; + m0 += c1o9 * oMdrho; + mfbcb = m1 - m0 * vvz; + mfbcc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcac; + m1 = mfcac - mfcaa; + m0 = m2 + mfcab; + mfcaa = m0; + m0 += c1o36 * oMdrho; + mfcab = m1 - m0 * vvz; + mfcac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcba + mfcbc; + m1 = mfcbc - mfcba; + m0 = m2 + mfcbb; + mfcba = m0; + m0 += c1o9 * oMdrho; + mfcbb = m1 - m0 * vvz; + mfcbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcca + mfccc; + m1 = mfccc - mfcca; + m0 = m2 + mfccb; + mfcca = m0; + m0 += c1o36 * oMdrho; + mfccb = m1 - m0 * vvz; + mfccc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m2 = mfaaa + mfaca; + m1 = mfaca - mfaaa; + m0 = m2 + mfaba; + mfaaa = m0; + m0 += c1o6 * oMdrho; + mfaba = m1 - m0 * vvy; + mfaca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfacb; + m1 = mfacb - mfaab; + m0 = m2 + mfabb; + mfaab = m0; + mfabb = m1 - m0 * vvy; + mfacb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfacc; + m1 = mfacc - mfaac; + m0 = m2 + mfabc; + mfaac = m0; + m0 += c1o18 * oMdrho; + mfabc = m1 - m0 * vvy; + mfacc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbca; + m1 = mfbca - mfbaa; + m0 = m2 + mfbba; + mfbaa = m0; + m0 += c2o3 * oMdrho; + mfbba = m1 - m0 * vvy; + mfbca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbab + mfbcb; + m1 = mfbcb - mfbab; + m0 = m2 + mfbbb; + mfbab = m0; + mfbbb = m1 - m0 * vvy; + mfbcb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbac + mfbcc; + m1 = mfbcc - mfbac; + m0 = m2 + mfbbc; + mfbac = m0; + m0 += c2o9 * oMdrho; + mfbbc = m1 - m0 * vvy; + mfbcc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcca; + m1 = mfcca - mfcaa; + m0 = m2 + mfcba; + mfcaa = m0; + m0 += c1o6 * oMdrho; + mfcba = m1 - m0 * vvy; + mfcca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcab + mfccb; + m1 = mfccb - mfcab; + m0 = m2 + mfcbb; + mfcab = m0; + mfcbb = m1 - m0 * vvy; + mfccb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcac + mfccc; + m1 = mfccc - mfcac; + m0 = m2 + mfcbc; + mfcac = m0; + m0 += c1o18 * oMdrho; + mfcbc = m1 - m0 * vvy; + mfccc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m2 = mfaaa + mfcaa; + m1 = mfcaa - mfaaa; + m0 = m2 + mfbaa; + mfaaa = m0; + m0 += 1. * oMdrho; + mfbaa = m1 - m0 * vvx; + mfcaa = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfcba; + m1 = mfcba - mfaba; + m0 = m2 + mfbba; + mfaba = m0; + mfbba = m1 - m0 * vvx; + mfcba = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfcca; + m1 = mfcca - mfaca; + m0 = m2 + mfbca; + mfaca = m0; + m0 += c1o3 * oMdrho; + mfbca = m1 - m0 * vvx; + mfcca = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfcab; + m1 = mfcab - mfaab; + m0 = m2 + mfbab; + mfaab = m0; + mfbab = m1 - m0 * vvx; + mfcab = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabb + mfcbb; + m1 = mfcbb - mfabb; + m0 = m2 + mfbbb; + mfabb = m0; + mfbbb = m1 - m0 * vvx; + mfcbb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacb + mfccb; + m1 = mfccb - mfacb; + m0 = m2 + mfbcb; + mfacb = m0; + mfbcb = m1 - m0 * vvx; + mfccb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfcac; + m1 = mfcac - mfaac; + m0 = m2 + mfbac; + mfaac = m0; + m0 += c1o3 * oMdrho; + mfbac = m1 - m0 * vvx; + mfcac = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabc + mfcbc; + m1 = mfcbc - mfabc; + m0 = m2 + mfbbc; + mfabc = m0; + mfbbc = m1 - m0 * vvx; + mfcbc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacc + mfccc; + m1 = mfccc - mfacc; + m0 = m2 + mfbcc; + mfacc = m0; + m0 += c1o9 * oMdrho; + mfbcc = m1 - m0 * vvx; + mfccc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity + LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// + //LBMReal OxyyMxzz = 1.;//2+s9;// + LBMReal O4 = 1.; + LBMReal O5 = 1.; + LBMReal O6 = 1.; + + //Cum 4. + //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho); + LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho - 1)*oMdrho); + LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho); + + //Cum 5. + LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho; + LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho; + LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho; + + //Cum 6. + LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3* (mfacc + mfcac + mfcca) * oMdrho - c1o9*oMdrho*oMdrho + - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1. - 2.* oMdrho) - c1o27* oMdrho * oMdrho*(-2.* oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) + c1o27*oMdrho; + + //2. + // linear combinations + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + LBMReal dxux = -c1o2 * collFactorF *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz*(mfaaa - mxxPyyPzz); + LBMReal dyuy = dxux + collFactorF * c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorF * c3o2 * mxxMzz; + + LBMReal Dxy =-three*collFactorF*mfbba; + LBMReal Dxz =-three*collFactorF*mfbab; + LBMReal Dyz =-three*collFactorF*mfabb; + + LBMReal gammaDot = sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one); + //collFactorF = BinghamModel::getBinghamCollFactor(collFactorF, gammaDot, rho); + + //relax + mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += collFactorF * (-mxxMyy) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += collFactorF * (-mxxMzz) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vz2 * dzuz); + + mfabb += collFactorF * (-mfabb); + mfbab += collFactorF * (-mfbab); + mfbba += collFactorF * (-mfbba); + + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + //relax + wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); + mxyyMxzz += wadjust * (-mxyyMxzz); + + // linear combinations back + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + CUMacc += O4 * (-CUMacc); + CUMcac += O4 * (-CUMcac); + CUMcca += O4 * (-CUMcca); + + CUMbbc += O4 * (-CUMbbc); + CUMbcb += O4 * (-CUMbcb); + CUMcbb += O4 * (-CUMcbb); + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + //back cumulants to central moments + //4. + //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho; + mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho - 1)*oMdrho; + mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho; + + //5. + mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho; + mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho; + mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho; + + //6. + mfccc = CUMccc - ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3* (mfacc + mfcac + mfcca) * oMdrho - c1o9*oMdrho*oMdrho + - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1. - 2.* oMdrho) - c1o27* oMdrho * oMdrho*(-2.* oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) - c1o27*oMdrho; + + //////////////////////////////////////////////////////////////////////////////////// + //forcing + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + ////////////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2; + m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2; + mfaaa = m0; + mfaab = m1; + mfaac = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; + m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2); + m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; + mfaba = m0; + mfabb = m1; + mfabc = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfaca = m0; + mfacb = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; + m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2); + m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; + mfbaa = m0; + mfbab = m1; + mfbac = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; + m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2); + m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; + mfbba = m0; + mfbbb = m1; + mfbbc = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; + m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2); + m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; + mfbca = m0; + mfbcb = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfcaa = m0; + mfcab = m1; + mfcac = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; + m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2); + m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; + mfcba = m0; + mfcbb = m1; + mfcbc = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2; + m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; + mfcca = m0; + mfccb = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaaa = m0; + mfaba = m1; + mfaca = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2; + m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; + mfaab = m0; + mfabb = m1; + mfacb = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaac = m0; + mfabc = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; + m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2); + m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; + mfbaa = m0; + mfbba = m1; + mfbca = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; + m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2); + m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; + mfbab = m0; + mfbbb = m1; + mfbcb = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; + m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2); + m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; + mfbac = m0; + mfbbc = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcaa = m0; + mfcba = m1; + mfcca = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2; + m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; + mfcab = m0; + mfcbb = m1; + mfccb = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcac = m0; + mfcbc = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaaa = m0; + mfbaa = m1; + mfcaa = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaba = m0; + mfbba = m1; + mfcba = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaca = m0; + mfbca = m1; + mfcca = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaab = m0; + mfbab = m1; + mfcab = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2; + m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabb = m0; + mfbbb = m1; + mfcbb = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfacb = m0; + mfbcb = m1; + mfccb = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaac = m0; + mfbac = m1; + mfcac = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabc = m0; + mfbbc = m1; + mfcbc = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfacc = m0; + mfbcc = m1; + mfccc = m2; + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// +#ifdef PROOF_CORRECTNESS + LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + //LBMReal dif = fabs(rho - rho_post); + LBMReal dif = rho - rho_post; +#ifdef SINGLEPRECISION + if (dif > 10.0E-7 || dif < -10.0E-7) +#else + if (dif > 10.0E-15 || dif < -10.0E-15) +#endif + { + UB_THROW(UbException(UB_EXARGS, "rho=" + UbSystem::toString(rho) + ", rho_post=" + UbSystem::toString(rho_post) + + " dif=" + UbSystem::toString(dif) + + " rho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); + //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): rho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); + //exit(EXIT_FAILURE); + } +#endif + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb; + + + + + + + + + + + + + + + + + LBMReal ux, uy, uz; + + ux = vvx; + uy = vvy; + uz = vvz; + + + + + //////////////////////////////////////////////////////////////////////////// + // Central Factorized Moment (advection diffusion part) + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //read distribution + + mfcbb = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); + + mfabb = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); + + mfbbb = (*this->zeroDistributionsH)(x1, x2, x3); + + //////////////////////////////////////////////////////////////////////////////////// + LBMReal drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb)) + (mfbba + mfbbc)) + mfbbb; + + //flocculation + //LBMReal lambda = drho; + + //LBMReal theta = 60 * 1.28172e+06; + //LBMReal alpha = 0.005;// *10.0; + + //LBMReal gammaDot = sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one); + + //collFactorF = collFactorF - 1e-4 / (gammaDot + one * 1e-9); + + //collFactorF = (collFactorF < 0.5) ? 0.5 : collFactorF; + + LBMReal dlambda = one / theta - alpha * lambda * gammaDot; + + + ////////////////////////////////////////////////////////////////////////// + //collision Factorized Central moment Kernel Geier 2015 + ////////////////////////////////////////////////////////////////////////// + LBMReal Mom000 = mfaaa + mfaab + mfaac + mfaba + mfabb + mfabc + mfaca + + mfacb + mfacc + mfbaa + mfbab + mfbac + mfbba + mfbbb + mfbbc + mfbca + + mfbcb + mfbcc + mfcaa + mfcab + mfcac + mfcba + mfcbb + mfcbc + mfcca + mfccb + mfccc; + + Mom000 += dlambda*c1o2; //1 + + //(100)// + LBMReal Mom100 = mfaaa*(-1 - ux) + mfaab*(-1 - ux) + mfaac*(-1 - ux) + mfaba*(-1 - ux) + mfabb*(-1 - ux) + mfabc*(-1 - ux) + mfaca*(-1 - ux) + + mfacb*(-1 - ux) + mfacc*(-1 - ux) + mfcaa*(1 - ux) + mfcab*(1 - ux) + mfcac*(1 - ux) + mfcba*(1 - ux) + mfcbb*(1 - ux) + + mfcbc*(1 - ux) + mfcca*(1 - ux) + mfccb*(1 - ux) + mfccc*(1 - ux) - mfbaa*ux - mfbab*ux - mfbac*ux - mfbba*ux - mfbbb*ux - + mfbbc*ux - mfbca*ux - mfbcb*ux - mfbcc*ux; + + LBMReal Mom010 = mfaaa*(-1 - uy) + mfaab*(-1 - uy) + mfaac*(-1 - uy) + mfbaa*(-1 - uy) + mfbab*(-1 - uy) + mfbac*(-1 - uy) + mfcaa*(-1 - uy) + + mfcab*(-1 - uy) + mfcac*(-1 - uy) + mfaca*(1 - uy) + mfacb*(1 - uy) + mfacc*(1 - uy) + mfbca*(1 - uy) + mfbcb*(1 - uy) + + mfbcc*(1 - uy) + mfcca*(1 - uy) + mfccb*(1 - uy) + mfccc*(1 - uy) - mfaba*uy - mfabb*uy - mfabc*uy - mfbba*uy - mfbbb*uy - + mfbbc*uy - mfcba*uy - mfcbb*uy - mfcbc*uy; + + LBMReal Mom001 = mfaaa*(-1 - uz) + mfaba*(-1 - uz) + mfaca*(-1 - uz) + mfbaa*(-1 - uz) + mfbba*(-1 - uz) + mfbca*(-1 - uz) + mfcaa*(-1 - uz) + + mfcba*(-1 - uz) + mfcca*(-1 - uz) + mfaac*(1 - uz) + mfabc*(1 - uz) + mfacc*(1 - uz) + mfbac*(1 - uz) + mfbbc*(1 - uz) + + mfbcc*(1 - uz) + mfcac*(1 - uz) + mfcbc*(1 - uz) + mfccc*(1 - uz) - mfaab*uz - mfabb*uz - mfacb*uz - mfbab*uz - mfbbb*uz - + mfbcb*uz - mfcab*uz - mfcbb*uz - mfccb*uz; + //// + + //(110)// + LBMReal Mom110 = mfaaa*(-1 - ux)*(-1 - uy) + mfaab*(-1 - ux)*(-1 - uy) + mfaac*(-1 - ux)*(-1 - uy) + mfcaa*(1 - ux)*(-1 - uy) + + mfcab*(1 - ux)*(-1 - uy) + mfcac*(1 - ux)*(-1 - uy) - mfbaa*ux*(-1 - uy) - mfbab*ux*(-1 - uy) - mfbac*ux*(-1 - uy) + + mfaca*(-1 - ux)*(1 - uy) + mfacb*(-1 - ux)*(1 - uy) + mfacc*(-1 - ux)*(1 - uy) + mfcca*(1 - ux)*(1 - uy) + mfccb*(1 - ux)*(1 - uy) + + mfccc*(1 - ux)*(1 - uy) - mfbca*ux*(1 - uy) - mfbcb*ux*(1 - uy) - mfbcc*ux*(1 - uy) - mfaba*(-1 - ux)*uy - mfabb*(-1 - ux)*uy - + mfabc*(-1 - ux)*uy - mfcba*(1 - ux)*uy - mfcbb*(1 - ux)*uy - mfcbc*(1 - ux)*uy + mfbba*ux*uy + mfbbb*ux*uy + mfbbc*ux*uy; + + LBMReal Mom101 = mfaaa*(-1 - ux)*(-1 - uz) + mfaba*(-1 - ux)*(-1 - uz) + mfaca*(-1 - ux)*(-1 - uz) + mfcaa*(1 - ux)*(-1 - uz) + + mfcba*(1 - ux)*(-1 - uz) + mfcca*(1 - ux)*(-1 - uz) - mfbaa*ux*(-1 - uz) - mfbba*ux*(-1 - uz) - mfbca*ux*(-1 - uz) + + mfaac*(-1 - ux)*(1 - uz) + mfabc*(-1 - ux)*(1 - uz) + mfacc*(-1 - ux)*(1 - uz) + mfcac*(1 - ux)*(1 - uz) + mfcbc*(1 - ux)*(1 - uz) + + mfccc*(1 - ux)*(1 - uz) - mfbac*ux*(1 - uz) - mfbbc*ux*(1 - uz) - mfbcc*ux*(1 - uz) - mfaab*(-1 - ux)*uz - mfabb*(-1 - ux)*uz - + mfacb*(-1 - ux)*uz - mfcab*(1 - ux)*uz - mfcbb*(1 - ux)*uz - mfccb*(1 - ux)*uz + mfbab*ux*uz + mfbbb*ux*uz + mfbcb*ux*uz; + + LBMReal Mom011 = mfaaa*(-1 - uy)*(-1 - uz) + mfbaa*(-1 - uy)*(-1 - uz) + mfcaa*(-1 - uy)*(-1 - uz) + mfaca*(1 - uy)*(-1 - uz) + + mfbca*(1 - uy)*(-1 - uz) + mfcca*(1 - uy)*(-1 - uz) - mfaba*uy*(-1 - uz) - mfbba*uy*(-1 - uz) - mfcba*uy*(-1 - uz) + + mfaac*(-1 - uy)*(1 - uz) + mfbac*(-1 - uy)*(1 - uz) + mfcac*(-1 - uy)*(1 - uz) + mfacc*(1 - uy)*(1 - uz) + mfbcc*(1 - uy)*(1 - uz) + + mfccc*(1 - uy)*(1 - uz) - mfabc*uy*(1 - uz) - mfbbc*uy*(1 - uz) - mfcbc*uy*(1 - uz) - mfaab*(-1 - uy)*uz - mfbab*(-1 - uy)*uz - + mfcab*(-1 - uy)*uz - mfacb*(1 - uy)*uz - mfbcb*(1 - uy)*uz - mfccb*(1 - uy)*uz + mfabb*uy*uz + mfbbb*uy*uz + mfcbb*uy*uz; + //// + + LBMReal Mom111 = mfaaa*(-1 - ux)*(-1 - uy)*(-1 - uz) + mfcaa*(1 - ux)*(-1 - uy)*(-1 - uz) - mfbaa*ux*(-1 - uy)*(-1 - uz) + + mfaca*(-1 - ux)*(1 - uy)*(-1 - uz) + mfcca*(1 - ux)*(1 - uy)*(-1 - uz) - mfbca*ux*(1 - uy)*(-1 - uz) - + mfaba*(-1 - ux)*uy*(-1 - uz) - mfcba*(1 - ux)*uy*(-1 - uz) + mfbba*ux*uy*(-1 - uz) + mfaac*(-1 - ux)*(-1 - uy)*(1 - uz) + + mfcac*(1 - ux)*(-1 - uy)*(1 - uz) - mfbac*ux*(-1 - uy)*(1 - uz) + mfacc*(-1 - ux)*(1 - uy)*(1 - uz) + + mfccc*(1 - ux)*(1 - uy)*(1 - uz) - mfbcc*ux*(1 - uy)*(1 - uz) - mfabc*(-1 - ux)*uy*(1 - uz) - mfcbc*(1 - ux)*uy*(1 - uz) + + mfbbc*ux*uy*(1 - uz) - mfaab*(-1 - ux)*(-1 - uy)*uz - mfcab*(1 - ux)*(-1 - uy)*uz + mfbab*ux*(-1 - uy)*uz - + mfacb*(-1 - ux)*(1 - uy)*uz - mfccb*(1 - ux)*(1 - uy)*uz + mfbcb*ux*(1 - uy)*uz + mfabb*(-1 - ux)*uy*uz + mfcbb*(1 - ux)*uy*uz - + mfbbb*ux*uy*uz; + + //(200)// + LBMReal Mom200 = ((mfcaa + mfcab + mfcac + mfcba + mfcbb + mfcbc + mfcca + mfccb + + mfccc)*pow(-1 + ux, 2) + + (mfbaa + mfbab + mfbac + mfbba + mfbbb + mfbbc + mfbca + + mfbcb + mfbcc)*pow(ux, 2) + + (mfaaa + mfaab + mfaac + mfaba + mfabb + mfabc + mfaca + + mfacb + mfacc)*pow(1 + ux, 2)) - Mom000 / 3; + + LBMReal Mom020 = ((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) + + (mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) + + (mfcca + mfccb + mfccc)*pow(-1 + uy, 2) + + (mfaba + mfabb + mfabc)*pow(uy, 2) + + (mfbba + mfbbb + mfbbc)*pow(uy, 2) + + (mfcba + mfcbb + mfcbc)*pow(uy, 2) + + (mfaaa + mfaab + mfaac)*pow(1 + uy, 2) + + (mfbaa + mfbab + mfbac)*pow(1 + uy, 2) + + (mfcaa + mfcab + mfcac)*pow(1 + uy, 2)) - Mom000 / 3; + + LBMReal Mom002 = (mfaba + mfabc + mfaca + mfacc + mfbba + mfbbc + mfbca + mfbcc + + mfcba + mfcbc + mfcca + mfccc + mfaac*pow(-1 + uz, 2) + + mfbac*pow(-1 + uz, 2) + mfcac*pow(-1 + uz, 2) + + 2 * mfaba*uz - 2 * mfabc*uz + 2 * mfaca*uz - 2 * mfacc*uz + + 2 * mfbba*uz - 2 * mfbbc*uz + 2 * mfbca*uz - 2 * mfbcc*uz + + 2 * mfcba*uz - 2 * mfcbc*uz + 2 * mfcca*uz - 2 * mfccc*uz + + mfaab*pow(uz, 2) + mfaba*pow(uz, 2) + mfabb*pow(uz, 2) + + mfabc*pow(uz, 2) + mfaca*pow(uz, 2) + mfacb*pow(uz, 2) + + mfacc*pow(uz, 2) + mfbab*pow(uz, 2) + mfbba*pow(uz, 2) + + mfbbb*pow(uz, 2) + mfbbc*pow(uz, 2) + mfbca*pow(uz, 2) + + mfbcb*pow(uz, 2) + mfbcc*pow(uz, 2) + mfcab*pow(uz, 2) + + mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) + mfcbc*pow(uz, 2) + + mfcca*pow(uz, 2) + mfccb*pow(uz, 2) + mfccc*pow(uz, 2) + + mfaaa*pow(1 + uz, 2) + mfbaa*pow(1 + uz, 2) + + mfcaa*pow(1 + uz, 2)) - Mom000 / 3; + //// + + //(210)// + LBMReal Mom210 = (pow(1 + ux, 2)*(-((mfaca + mfacb + mfacc)*(-1 + uy)) - + (mfaba + mfabb + mfabc)*uy - + (mfaaa + mfaab + mfaac)*(1 + uy)) + + pow(ux, 2)*(-((mfbca + mfbcb + mfbcc)*(-1 + uy)) - + (mfbba + mfbbb + mfbbc)*uy - + (mfbaa + mfbab + mfbac)*(1 + uy)) + + pow(-1 + ux, 2)*(-((mfcca + mfccb + mfccc)*(-1 + uy)) - + (mfcba + mfcbb + mfcbc)*uy - + (mfcaa + mfcab + mfcac)*(1 + uy))) - Mom010 / 3; + + LBMReal Mom201 = (-(pow(1 + ux, 2)*(mfaba - mfabc + mfaca - mfacc + + mfaac*(-1 + uz) + mfaab*uz + mfaba*uz + mfabb*uz + + mfabc*uz + mfaca*uz + mfacb*uz + mfacc*uz + + mfaaa*(1 + uz))) - + pow(ux, 2)*(mfbba - mfbbc + mfbca - mfbcc + + mfbac*(-1 + uz) + mfbab*uz + mfbba*uz + mfbbb*uz + + mfbbc*uz + mfbca*uz + mfbcb*uz + mfbcc*uz + mfbaa*(1 + uz)) + - pow(-1 + ux, 2)*(mfcba - mfcbc + mfcca - mfccc + + mfcac*(-1 + uz) + mfcab*uz + mfcba*uz + mfcbb*uz + + mfcbc*uz + mfcca*uz + mfccb*uz + mfccc*uz + mfcaa*(1 + uz))) - Mom001 / 3; + + LBMReal Mom120 = ((-1 - ux)*((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) + + (mfaba + mfabb + mfabc)*pow(uy, 2) + + (mfaaa + mfaab + mfaac)*pow(1 + uy, 2)) - + ux*((mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) + + (mfbba + mfbbb + mfbbc)*pow(uy, 2) + + (mfbaa + mfbab + mfbac)*pow(1 + uy, 2)) + + (1 - ux)*((mfcca + mfccb + mfccc)*pow(-1 + uy, 2) + + (mfcba + mfcbb + mfcbc)*pow(uy, 2) + + (mfcaa + mfcab + mfcac)*pow(1 + uy, 2))) - Mom100 / 3; + + + LBMReal Mom102 = (-((1 + ux)*(mfaba + mfabc + mfaca + mfacc + + mfaac*pow(-1 + uz, 2) + 2 * mfaba*uz - 2 * mfabc*uz + + 2 * mfaca*uz - 2 * mfacc*uz + mfaab*pow(uz, 2) + + mfaba*pow(uz, 2) + mfabb*pow(uz, 2) + + mfabc*pow(uz, 2) + mfaca*pow(uz, 2) + + mfacb*pow(uz, 2) + mfacc*pow(uz, 2) + + mfaaa*pow(1 + uz, 2))) - + ux*(mfbba + mfbbc + mfbca + mfbcc + mfbac*pow(-1 + uz, 2) + + 2 * mfbba*uz - 2 * mfbbc*uz + 2 * mfbca*uz - 2 * mfbcc*uz + + mfbab*pow(uz, 2) + mfbba*pow(uz, 2) + + mfbbb*pow(uz, 2) + mfbbc*pow(uz, 2) + + mfbca*pow(uz, 2) + mfbcb*pow(uz, 2) + + mfbcc*pow(uz, 2) + mfbaa*pow(1 + uz, 2)) - + (-1 + ux)*(mfcba + mfcbc + mfcca + mfccc + + mfcac*pow(-1 + uz, 2) + 2 * mfcba*uz - 2 * mfcbc*uz + + 2 * mfcca*uz - 2 * mfccc*uz + mfcab*pow(uz, 2) + + mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) + + mfcbc*pow(uz, 2) + mfcca*pow(uz, 2) + + mfccb*pow(uz, 2) + mfccc*pow(uz, 2) + + mfcaa*pow(1 + uz, 2))) - Mom100 / 3; + + LBMReal Mom021 = (-(pow(1 + uy, 2)*(mfaac*(-1 + uz) + mfaab*uz + + mfaaa*(1 + uz))) - + pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz + mfaba*(1 + uz)) - + pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz + + mfaca*(1 + uz)) - pow(1 + uy, 2)* + (mfbac*(-1 + uz) + mfbab*uz + mfbaa*(1 + uz)) - + pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz + mfbba*(1 + uz)) - + pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz + + mfbca*(1 + uz)) - pow(1 + uy, 2)* + (mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz)) - + pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz + mfcba*(1 + uz)) - + pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz + mfcca*(1 + uz))) - Mom001 / 3; + + LBMReal Mom012 = (-((1 + uy)*(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) + + mfaaa*pow(1 + uz, 2))) - + uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) - + (-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) + + mfaca*pow(1 + uz, 2)) - + (1 + uy)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) + + mfbaa*pow(1 + uz, 2)) - + uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) - + (-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) + + mfbca*pow(1 + uz, 2)) - + (1 + uy)*(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) + + mfcaa*pow(1 + uz, 2)) - + uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) - + (-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) + + mfcca*pow(1 + uz, 2))) - Mom010 / 3; + //// + + + //(220)// + LBMReal Mom220 = (pow(1 + ux, 2)*((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) + + (mfaba + mfabb + mfabc)*pow(uy, 2) + + (mfaaa + mfaab + mfaac)*pow(1 + uy, 2)) + + pow(ux, 2)*((mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) + + (mfbba + mfbbb + mfbbc)*pow(uy, 2) + + (mfbaa + mfbab + mfbac)*pow(1 + uy, 2)) + + pow(-1 + ux, 2)*((mfcca + mfccb + mfccc)*pow(-1 + uy, 2) + + (mfcba + mfcbb + mfcbc)*pow(uy, 2) + + (mfcaa + mfcab + mfcac)*pow(1 + uy, 2))) - Mom000 / 9; + + LBMReal Mom202 = (pow(1 + ux, 2)*(mfaba + mfabc + mfaca + mfacc + + mfaac*pow(-1 + uz, 2) + 2 * mfaba*uz - 2 * mfabc*uz + + 2 * mfaca*uz - 2 * mfacc*uz + mfaab*pow(uz, 2) + + mfaba*pow(uz, 2) + mfabb*pow(uz, 2) + + mfabc*pow(uz, 2) + mfaca*pow(uz, 2) + + mfacb*pow(uz, 2) + mfacc*pow(uz, 2) + + mfaaa*pow(1 + uz, 2)) + + pow(ux, 2)*(mfbba + mfbbc + mfbca + mfbcc + + mfbac*pow(-1 + uz, 2) + 2 * mfbba*uz - 2 * mfbbc*uz + + 2 * mfbca*uz - 2 * mfbcc*uz + mfbab*pow(uz, 2) + + mfbba*pow(uz, 2) + mfbbb*pow(uz, 2) + + mfbbc*pow(uz, 2) + mfbca*pow(uz, 2) + + mfbcb*pow(uz, 2) + mfbcc*pow(uz, 2) + + mfbaa*pow(1 + uz, 2)) + + pow(-1 + ux, 2)*(mfcba + mfcbc + mfcca + mfccc + + mfcac*pow(-1 + uz, 2) + 2 * mfcba*uz - 2 * mfcbc*uz + + 2 * mfcca*uz - 2 * mfccc*uz + mfcab*pow(uz, 2) + + mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) + + mfcbc*pow(uz, 2) + mfcca*pow(uz, 2) + + mfccb*pow(uz, 2) + mfccc*pow(uz, 2) + + mfcaa*pow(1 + uz, 2))) - Mom000 / 9; + + LBMReal Mom022 = (pow(1 + uy, 2)*(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) + + mfaaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) + + mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2)) + + pow(1 + uy, 2)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) + + mfbaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) + + mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2)) + + pow(1 + uy, 2)*(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) + + mfcaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) + + mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2))) - Mom000 / 9; + //// + + //(221)// + LBMReal Mom221 = (pow(1 + ux, 2)*(-(pow(1 + uy, 2)* + (mfaac*(-1 + uz) + mfaab*uz + mfaaa*(1 + uz))) - + pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz + + mfaba*(1 + uz)) - + pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz + + mfaca*(1 + uz))) + + pow(ux, 2)*(-(pow(1 + uy, 2)* + (mfbac*(-1 + uz) + mfbab*uz + mfbaa*(1 + uz))) - + pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz + + mfbba*(1 + uz)) - + pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz + + mfbca*(1 + uz))) + + pow(-1 + ux, 2)*(-(pow(1 + uy, 2)* + (mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz))) - + pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz + + mfcba*(1 + uz)) - + pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz + + mfcca*(1 + uz)))) - Mom001 / 9; + + LBMReal Mom212 = (pow(1 + ux, 2)*(-((1 + uy)* + (mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) + + mfaaa*pow(1 + uz, 2))) - + uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) - + (-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) + + mfaca*pow(1 + uz, 2))) + + pow(ux, 2)*(-((1 + uy)* + (mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) + + mfbaa*pow(1 + uz, 2))) - + uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) - + (-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) + + mfbca*pow(1 + uz, 2))) + + pow(-1 + ux, 2)*(-((1 + uy)* + (mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) + + mfcaa*pow(1 + uz, 2))) - + uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) - + (-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) + + mfcca*pow(1 + uz, 2)))) - Mom010 / 9; + + LBMReal Mom122 = ((-1 - ux)*(pow(1 + uy, 2)* + (mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) + + mfaaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) + + mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2))) - + ux*(pow(1 + uy, 2)*(mfbac*pow(-1 + uz, 2) + + mfbab*pow(uz, 2) + mfbaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) + + mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2))) + + (1 - ux)*(pow(1 + uy, 2)* + (mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) + + mfcaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) + + mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2)))) - Mom100 / 9; + //// + + //(211)// + LBMReal Mom211 = (pow(1 + ux, 2)*((1 + uy)*(mfaac*(-1 + uz) + mfaab*uz + + mfaaa*(1 + uz)) + + uy*(mfabc*(-1 + uz) + mfabb*uz + mfaba*(1 + uz)) + + (-1 + uy)*(mfacc*(-1 + uz) + mfacb*uz + mfaca*(1 + uz))) + + pow(ux, 2)*((1 + uy)*(mfbac*(-1 + uz) + mfbab*uz + + mfbaa*(1 + uz)) + + uy*(mfbbc*(-1 + uz) + mfbbb*uz + mfbba*(1 + uz)) + + (-1 + uy)*(mfbcc*(-1 + uz) + mfbcb*uz + mfbca*(1 + uz))) + + pow(-1 + ux, 2)*((1 + uy)* + (mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz)) + + uy*(mfcbc*(-1 + uz) + mfcbb*uz + mfcba*(1 + uz)) + + (-1 + uy)*(mfccc*(-1 + uz) + mfccb*uz + mfcca*(1 + uz)))) - Mom011 / 3; + + LBMReal Mom121 = ((-1 - ux)*(-(pow(1 + uy, 2)* + (mfaac*(-1 + uz) + mfaab*uz + mfaaa*(1 + uz))) - + pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz + + mfaba*(1 + uz)) - + pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz + + mfaca*(1 + uz))) - + ux*(-(pow(1 + uy, 2)*(mfbac*(-1 + uz) + mfbab*uz + + mfbaa*(1 + uz))) - + pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz + + mfbba*(1 + uz)) - + pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz + + mfbca*(1 + uz))) + + (1 - ux)*(-(pow(1 + uy, 2)* + (mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz))) - + pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz + + mfcba*(1 + uz)) - + pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz + + mfcca*(1 + uz)))) - Mom101 / 3; + + LBMReal Mom112 = ((-1 - ux)*(-((1 + uy)*(mfaac*pow(-1 + uz, 2) + + mfaab*pow(uz, 2) + mfaaa*pow(1 + uz, 2))) - + uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) - + (-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) + + mfaca*pow(1 + uz, 2))) - + ux*(-((1 + uy)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) + + mfbaa*pow(1 + uz, 2))) - + uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) - + (-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) + + mfbca*pow(1 + uz, 2))) + + (1 - ux)*(-((1 + uy)*(mfcac*pow(-1 + uz, 2) + + mfcab*pow(uz, 2) + mfcaa*pow(1 + uz, 2))) - + uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) - + (-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) + + mfcca*pow(1 + uz, 2)))) - Mom110 / 3; + //// + + //(222)// + LBMReal Mom222 = (pow(1 + ux, 2)*(pow(1 + uy, 2)* + (mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) + + mfaaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) + + mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2))) + + pow(ux, 2)*(pow(1 + uy, 2)* + (mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) + + mfbaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) + + mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2))) + + pow(-1 + ux, 2)*(pow(1 + uy, 2)* + (mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) + + mfcaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) + + mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2)))) - Mom000 / 27; + //// + + + + + + LBMReal Meq000 = drho+dlambda*c1o2; + + + // relaxation Central Moment MRT + + Mom000 = Meq000; + + Mom000 += dlambda*c1o2; + + Mom100 = (1 - collFactorH) * Mom100; + Mom010 = (1 - collFactorH) * Mom010; + Mom001 = (1 - collFactorH) * Mom001; + + Mom110 = 0; + Mom101 = 0; + Mom011 = 0; + + Mom111 = 0; + + //(200)// + Mom200 = Mom000 / 3; + Mom020 = Mom000 / 3; + Mom002 = Mom000 / 3; + //// + + //(210)// + Mom210 = Mom010 / 3; + Mom201 = Mom001 / 3; + Mom120 = Mom100 / 3; + + + Mom102 = Mom100 / 3; + Mom021 = Mom001 / 3; + Mom012 = Mom010 / 3; + //// + + + //(220)// + Mom220 = Mom000 / 9; + Mom202 = Mom000 / 9; + Mom022 = Mom000 / 9; + //// + + //(221)// + Mom221 = Mom001 / 9; + Mom212 = Mom010 / 9; + Mom122 = Mom100 / 9; + //// + + //(211)// + Mom211 = Mom011 / 3; + Mom121 = Mom101 / 3; + Mom112 = Mom110 / 3; + //// + + //(222)// + Mom222 = Mom000 / 27; + //// + + + + //Back transformation to distributions + + mfcbb = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + + 2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy + + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))* + (-1 + pow(uy, 2)) - + 2 * (-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) - + 2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))* + uy - (Mom101 + Mom201 + 2 * Mom101*ux + + Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*uz + + (-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) - + 2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))* + uy - (Mom100 + Mom200 + 2 * Mom100*ux + + Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))* + (1 - pow(uz, 2))) / 2.; + mfbcb = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) + + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy* + (1 + uy) + (Mom212 + 2 * Mom112*ux + + Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) - + 2 * (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy* + (1 + uy) - (Mom211 + 2 * Mom111*ux + + Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*uz + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy* + (1 + uy) - (Mom210 + 2 * Mom110*ux + + Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))* + (1 - pow(uz, 2))) / 2.; + mfbbc = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) + + 2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy + + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)) + + (Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) + + 2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))* + uy + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)))*uz*(1 + uz) + + (Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) + + 2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))* + uy + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)))*(1 + 2 * uz)) / 2.; + mfccb = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) - + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy* + (1 + uy) - (Mom112 + Mom212 + 2 * Mom112*ux + + Mom012*ux*(1 + ux))*(1 + 2 * uy) - + 2 * (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy* + (1 + uy) + (Mom111 + Mom211 + 2 * Mom111*ux + + Mom011*ux*(1 + ux))*(1 + 2 * uy))*uz + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy* + (1 + uy) + (Mom110 + Mom210 + 2 * Mom110*ux + + Mom010*ux*(1 + ux))*(1 + 2 * uy))*(1 - pow(uz, 2))) / 4.; + mfacb = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux - + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy* + (1 + uy) - (Mom212 + Mom012*(-1 + ux)*ux + + Mom112*(-1 + 2 * ux))*(1 + 2 * uy) - + 2 * (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy* + (1 + uy) + (Mom211 + Mom011*(-1 + ux)*ux + + Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*uz + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy* + (1 + uy) + (Mom210 + Mom010*(-1 + ux)*ux + + Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*(1 - pow(uz, 2))) / 4.; + mfcbc = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) - + 2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy - + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))* + (-1 + pow(uy, 2)) + + (-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) - + 2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))* + uy - (Mom100 + Mom200 + 2 * Mom100*ux + + Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))*uz*(1 + uz) + + (-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) - + 2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))* + uy - (Mom101 + Mom201 + 2 * Mom101*ux + + Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*(1 + 2 * uz)) / 4.; + mfabc = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux - + 2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy - + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))* + (-1 + pow(uy, 2)) + + (Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux - + 2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))* + uy - (Mom200 + Mom000*(-1 + ux)*ux + + Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*uz*(1 + uz) + + (Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux - + 2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))* + uy - (Mom201 + Mom001*(-1 + ux)*ux + + Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(1 + 2 * uz)) / 4.; + mfbcc = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy* + (1 + uy) - (Mom212 + 2 * Mom112*ux + + Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy* + (1 + uy) - (Mom210 + 2 * Mom110*ux + + Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))*uz*(1 + uz) + + (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy* + (1 + uy) - (Mom211 + 2 * Mom111*ux + + Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(1 + 2 * uz)) / 4.; + mfbac = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))* + (-1 + uy)*uy - (Mom212 + 2 * Mom112*ux + + Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))* + (-1 + uy)*uy - (Mom210 + 2 * Mom110*ux + + Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*uz*(1 + uz) + + (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))* + (-1 + uy)*uy - (Mom211 + 2 * Mom111*ux + + Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(1 + 2 * uz)) / 4.; + mfccc = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy* + (1 + uy) + (Mom112 + Mom212 + 2 * Mom112*ux + + Mom012*ux*(1 + ux))*(1 + 2 * uy) + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy* + (1 + uy) + (Mom110 + Mom210 + 2 * Mom110*ux + + Mom010*ux*(1 + ux))*(1 + 2 * uy))*uz*(1 + uz) + + (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy* + (1 + uy) + (Mom111 + Mom211 + 2 * Mom111*ux + + Mom011*ux*(1 + ux))*(1 + 2 * uy))*(1 + 2 * uz)) / 8.; + mfacc = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy* + (1 + uy) + (Mom212 + Mom012*(-1 + ux)*ux + + Mom112*(-1 + 2 * ux))*(1 + 2 * uy) + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy* + (1 + uy) + (Mom210 + Mom010*(-1 + ux)*ux + + Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*uz*(1 + uz) + + (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy* + (1 + uy) + (Mom211 + Mom011*(-1 + ux)*ux + + Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*(1 + 2 * uz)) / 8.; + mfcac = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))* + (-1 + uy)*uy + (Mom112 + Mom212 + 2 * Mom112*ux + + Mom012*ux*(1 + ux))*(-1 + 2 * uy) + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))* + (-1 + uy)*uy + (Mom110 + Mom210 + 2 * Mom110*ux + + Mom010*ux*(1 + ux))*(-1 + 2 * uy))*uz*(1 + uz) + + (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))* + (-1 + uy)*uy + (Mom111 + Mom211 + 2 * Mom111*ux + + Mom011*ux*(1 + ux))*(-1 + 2 * uy))*(1 + 2 * uz)) / 8.; + mfaac = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))* + (-1 + uy)*uy + (Mom212 + Mom012*(-1 + ux)*ux + + Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))* + (-1 + uy)*uy + (Mom210 + Mom010*(-1 + ux)*ux + + Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*uz*(1 + uz) + + (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))* + (-1 + uy)*uy + (Mom211 + Mom011*(-1 + ux)*ux + + Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*(1 + 2 * uz)) / 8.; + + mfabb = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + + 2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy + + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))* + (-1 + pow(uy, 2)) - + 2 * (Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux - + 2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))* + uy - (Mom201 + Mom001*(-1 + ux)*ux + + Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*uz + + (Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux - + 2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))* + uy - (Mom200 + Mom000*(-1 + ux)*ux + + Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))* + (1 - pow(uz, 2))) / 2.; + mfbab = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) + + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))* + (-1 + uy)*uy + (Mom212 + 2 * Mom112*ux + + Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) - + 2 * (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))* + (-1 + uy)*uy - (Mom211 + 2 * Mom111*ux + + Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*uz + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))* + (-1 + uy)*uy - (Mom210 + 2 * Mom110*ux + + Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))* + (1 - pow(uz, 2))) / 2.; + mfbba = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) + + 2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy + + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)) + + (Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) + + 2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))* + uy + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)))*(-1 + uz)*uz + + (Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) + + 2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))* + uy + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 2.; + mfaab = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux - + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))* + (-1 + uy)*uy - (Mom212 + Mom012*(-1 + ux)*ux + + Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) - + 2 * (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))* + (-1 + uy)*uy + (Mom211 + Mom011*(-1 + ux)*ux + + Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*uz + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))* + (-1 + uy)*uy + (Mom210 + Mom010*(-1 + ux)*ux + + Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*(1 - pow(uz, 2))) / 4.; + mfcab = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) - + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))* + (-1 + uy)*uy - (Mom112 + Mom212 + 2 * Mom112*ux + + Mom012*ux*(1 + ux))*(-1 + 2 * uy) - + 2 * (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))* + (-1 + uy)*uy + (Mom111 + Mom211 + 2 * Mom111*ux + + Mom011*ux*(1 + ux))*(-1 + 2 * uy))*uz + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))* + (-1 + uy)*uy + (Mom110 + Mom210 + 2 * Mom110*ux + + Mom010*ux*(1 + ux))*(-1 + 2 * uy))*(1 - pow(uz, 2))) / 4.; + mfaba = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux - 2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy - + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*(-1 + pow(uy, 2)) + + (Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux - 2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*uy - + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(-1 + uz)*uz + + (Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux - 2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*uy - + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 4.; + mfcba = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) - 2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy - + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*(-1 + pow(uy, 2)) + + (-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) - 2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*uy - + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))*(-1 + uz)*uz + + (-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) - 2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*uy - + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 4.; + mfbaa = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*(-1 + uy)*uy - + (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*(-1 + uy)*uy - + (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(-1 + uz)*uz + + (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*(-1 + uy)*uy - + (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 4.; + mfbca = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy*(1 + uy) - + (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy*(1 + uy) - + (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(-1 + uz)*uz + + (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy*(1 + uy) - + (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(-1 + 2 * uz)) / 4.; + mfaaa = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*(-1 + uy)*uy + + (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*(-1 + uy)*uy + + (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*(-1 + uz)*uz + + (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*(-1 + uy)*uy + + (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 8.; + mfcaa = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*(-1 + uy)*uy + + (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*(-1 + 2 * uy) + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*(-1 + uy)*uy + + (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*(-1 + 2 * uy))*(-1 + uz)*uz + + (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*(-1 + uy)*uy + + (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 8.; + mfaca = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy*(1 + uy) + + (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*(1 + 2 * uy) + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy*(1 + uy) + + (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*(-1 + uz)*uz + + (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy*(1 + uy) + + (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*(-1 + 2 * uz)) / 8.; + mfcca = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy*(1 + uy) + + (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*(1 + 2 * uy) + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy*(1 + uy) + + (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*(1 + 2 * uy))*(-1 + uz)*uz + + (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy*(1 + uy) + + (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*(1 + 2 * uy))*(-1 + 2 * uz)) / 8.; + + mfbbb = Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - 2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy - + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)) - + 2 * (Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) + 2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*uy + + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)))*uz + + (Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) + 2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*uy + + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)))*(1 - pow(uz, 2)); + + //////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// +//#ifdef PROOF_CORRECTNESS + LBMReal drho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + //UBLOG(logINFO, "lambda ="<<drho_post); +// //LBMReal dif = fabs(rho - rho_post); +// dif = drho - drho_post; +//#ifdef SINGLEPRECISION +// if (dif > 10.0E-7 || dif < -10.0E-7) +//#else +// if (dif > 10.0E-15 || dif < -10.0E-15) +//#endif +// { +// UB_THROW(UbException(UB_EXARGS, "Flocculation=" + UbSystem::toString(drho) + ", flocculation post=" + UbSystem::toString(drho_post) +// + " dif=" + UbSystem::toString(dif) +// + " Flocculation is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); +// //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): rho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); +// //exit(EXIT_FAILURE); +// } +//#endif + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; + (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; + (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; + (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsH)(x1, x2, x3) = mfbbb; + ////////////////////////////////////////////////////////////////////////// + + + } + } + } + } + + } +} +////////////////////////////////////////////////////////////////////////// +double ThixotropyExpLBMKernel::getCalculationTime() +{ + //return timer.getDuration(); + return timer.getTotalTime(); +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyExpLBMKernel::setCollisionFactorF(double collFactor) +{ + setCollisionFactor(collFactor); + this->collFactorF = collFactor; + +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyExpLBMKernel::setCollisionFactorH(double collFactor) +{ + this->collFactorH = collFactor; +} +////////////////////////////////////////////////////////////////////////// +double ThixotropyExpLBMKernel::getCollisionFactorF() const +{ + return this->collFactorF; +} +////////////////////////////////////////////////////////////////////////// +double ThixotropyExpLBMKernel::getCollisionFactorH() const +{ + return this->collFactorH; +} +void ThixotropyExpLBMKernel::setAlpha(double alpha) +{ + this->alpha = alpha; +} +double ThixotropyExpLBMKernel::getAlpha() const +{ + return this->alpha; +} +void ThixotropyExpLBMKernel::setTheta(double theta) +{ + this->theta = theta; +} +double ThixotropyExpLBMKernel::getTheta() const +{ + return this->theta; +} +void ThixotropyExpLBMKernel::swapDistributions() +{ + LBMKernel::swapDistributions(); + dataSet->getHdistributions()->swap(); +} +////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.h new file mode 100644 index 000000000..3104808ad --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.h @@ -0,0 +1,72 @@ +#ifndef ThixotropyExpLBMKernel_H +#define ThixotropyExpLBMKernel_H + +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "D3Q27System.h" +#include "basics/utilities/UbTiming.h" +#include "basics/container/CbArray4D.h" +#include "basics/container/CbArray3D.h" + +class ThixotropyExpLBMKernel; + +//! \brief Cumulant + Fact. Central LBM kernel. +//! \author Hussein +class ThixotropyExpLBMKernel : public LBMKernel +{ +public: + //! This option set relaxation parameter: NORMAL + enum Parameter { NORMAL, MAGIC }; +public: + ThixotropyExpLBMKernel(); + virtual ~ThixotropyExpLBMKernel(void); + virtual void calculate(int step); + virtual SPtr<LBMKernel> clone(); + double getCalculationTime(); + + void setCollisionFactorF(double collFactor); + void setCollisionFactorH(double collFactor); + double getCollisionFactorF() const; + double getCollisionFactorH() const; + + void setAlpha(double alpha); + double getAlpha() const; + + void setTheta(double theta); + double getTheta() const; + + void swapDistributions(); + +protected: + virtual void initDataSet(); + LBMReal f[D3Q27System::ENDF + 1]; + + UbTimer timer; + + LBMReal OxyyMxzz; + Parameter parameter; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsF; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH; + + mu::value_type muX1, muX2, muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; + + LBMReal collFactorF; + LBMReal collFactorH; + + LBMReal theta; + LBMReal alpha; +}; + +#endif + diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp new file mode 100644 index 000000000..949e7777d --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp @@ -0,0 +1,1868 @@ +#include "ThixotropyLBMKernel.h" +#include "D3Q27System.h" +#include "InterpolationProcessor.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include <math.h> +#include "DataSet3D.h" +#include "LBMKernel.h" + +#define PROOF_CORRECTNESS + +////////////////////////////////////////////////////////////////////////// +ThixotropyLBMKernel::ThixotropyLBMKernel() +{ + this->parameter = ThixotropyLBMKernel::NORMAL; + this->compressible = false; + //this->TwoDistributions = true; +} +////////////////////////////////////////////////////////////////////////// +ThixotropyLBMKernel::~ThixotropyLBMKernel(void) +{ + +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyLBMKernel::initDataSet() +{ + //DistributionArray3DPtr d(new D3Q27EsoTwist3DSplittedVector(nx1+ghostLayerWitdh*2, nx2+ghostLayerWitdh*2, nx3+ghostLayerWitdh*2, -999.0)); + SPtr<DistributionArray3D> df(new D3Q27EsoTwist3DSplittedVector(nx[0]+2, nx[1]+2, nx[2]+2, -999.0)); + SPtr<DistributionArray3D> dh(new D3Q27EsoTwist3DSplittedVector(nx[0]+2, nx[1]+2, nx[2]+2, -999.0)); + dataSet->setFdistributions(df); + dataSet->setHdistributions(dh); +} +////////////////////////////////////////////////////////////////////////// +SPtr<LBMKernel> ThixotropyLBMKernel::clone() +{ + SPtr<LBMKernel> kernel(new ThixotropyLBMKernel()); + kernel->setNX(nx); + kernel->setCollisionFactor(collFactor); + collFactorF = collFactor; + collFactorH = collFactor; + dynamicPointerCast<ThixotropyLBMKernel>(kernel)->initDataSet(); + dynamicPointerCast<ThixotropyLBMKernel>(kernel)->setCollisionFactorF(this->collFactorF); + dynamicPointerCast<ThixotropyLBMKernel>(kernel)->setCollisionFactorH(this->collFactorH); + dynamicPointerCast<ThixotropyLBMKernel>(kernel)->setAlpha(this->alpha); + dynamicPointerCast<ThixotropyLBMKernel>(kernel)->setTheta(this->theta); + kernel->setBCProcessor(bcProcessor->clone(kernel)); + kernel->setWithForcing(withForcing); + kernel->setForcingX1(muForcingX1); + kernel->setForcingX2(muForcingX2); + kernel->setForcingX3(muForcingX3); + kernel->setIndex(ix1, ix2, ix3); + kernel->setDeltaT(deltaT); + + switch (parameter) + { + case NORMAL: + dynamicPointerCast<ThixotropyLBMKernel>(kernel)->OxyyMxzz = 1.0; + break; + case MAGIC: + dynamicPointerCast<ThixotropyLBMKernel>(kernel)->OxyyMxzz = 2.0 + (-collFactorF); + break; + } + return kernel; +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyLBMKernel::calculate(int step) +{ + using namespace D3Q27System; + + //initializing of forcing stuff + if (withForcing) + { + muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); + muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); + muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); + + muDeltaT = deltaT; + + muForcingX1.DefineVar("dt", &muDeltaT); + muForcingX2.DefineVar("dt", &muDeltaT); + muForcingX3.DefineVar("dt", &muDeltaT); + + muNu = (1.0 / 3.0)*(1.0 / collFactorF - 1.0 / 2.0); + + muForcingX1.DefineVar("nu", &muNu); + muForcingX2.DefineVar("nu", &muNu); + muForcingX3.DefineVar("nu", &muNu); + + LBMReal forcingX1 = 0; + LBMReal forcingX2 = 0; + LBMReal forcingX3 = 0; + } + ///////////////////////////////////// + + localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + + localDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getLocalDistributions(); + nonLocalDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getNonLocalDistributions(); + zeroDistributionsH = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getHdistributions())->getZeroDistributions(); + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + const int bcArrayMaxX1 = (int)bcArray->getNX1(); + const int bcArrayMaxX2 = (int)bcArray->getNX2(); + const int bcArrayMaxX3 = (int)bcArray->getNX3(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = bcArrayMaxX1 - ghostLayerWidth; + int maxX2 = bcArrayMaxX2 - ghostLayerWidth; + int maxX3 = bcArrayMaxX3 - ghostLayerWidth; + + + //#pragma omp parallel num_threads(8) + { + // int i = omp_get_thread_num(); + // printf_s("Hello from thread %d\n", i); + //} + //#pragma omp for + for (int x3 = minX3; x3 < maxX3; x3++) + { + for (int x2 = minX2; x2 < maxX2; x2++) + { + for (int x1 = minX1; x1 < maxX1; x1++) + { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) + { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + ////////////////////////////////////////////////////////////////////////// + //read distribution + // Cumulant (NSE part) + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + LBMReal mfcbb = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); + + LBMReal mfabb = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsH)(x1, x2, x3); + + LBMReal lambda = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + //E N T + //c c c + ////////// + //W S B + //a a a + + //Rest ist b + + //mfxyz + //a - negative + //b - null + //c - positive + + // a b c + //-1 0 1 + + mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + + mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal m0, m1, m2; + + LBMReal rho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + + LBMReal eta0 = (1/collFactor-c1o2)*c1o3; + LBMReal eta = (1 + lambda)* eta0; + collFactorF = one/(3*eta/(rho+one)+c1o2); + //collFactorF = collFactor; + + //forcing + /////////////////////////////////////////////////////////////////////////////////////////// + if (withForcing) + { + muX1 = static_cast<double>(x1 - 1 + ix1*maxX1); + muX2 = static_cast<double>(x2 - 1 + ix2*maxX2); + muX3 = static_cast<double>(x3 - 1 + ix3*maxX3); + + forcingX1 = muForcingX1.Eval(); + forcingX2 = muForcingX2.Eval(); + forcingX3 = muForcingX3.Eval(); + + vvx += forcingX1*deltaT*0.5; // X + vvy += forcingX2*deltaT*0.5; // Y + vvz += forcingX3*deltaT*0.5; // Z + } + /////////////////////////////////////////////////////////////////////////////////////////// + LBMReal oMdrho; + + oMdrho = mfccc + mfaaa; + m0 = mfaca + mfcac; + m1 = mfacc + mfcaa; + m2 = mfaac + mfcca; + oMdrho += m0; + m1 += m2; + oMdrho += m1; + m0 = mfbac + mfbca; + m1 = mfbaa + mfbcc; + m0 += m1; + m1 = mfabc + mfcba; + m2 = mfaba + mfcbc; + m1 += m2; + m0 += m1; + m1 = mfacb + mfcab; + m2 = mfaab + mfccb; + m1 += m2; + m0 += m1; + oMdrho += m0; + m0 = mfabb + mfcbb; + m1 = mfbab + mfbcb; + m2 = mfbba + mfbbc; + m0 += m1 + m2; + m0 += mfbbb; //hat gefehlt + oMdrho = 1. - (oMdrho + m0); + + LBMReal vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx*vvx; + vy2 = vvy*vvy; + vz2 = vvz*vvz; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal wadjust; + LBMReal qudricLimit = 0.01; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m2 = mfaaa + mfaac; + m1 = mfaac - mfaaa; + m0 = m2 + mfaab; + mfaaa = m0; + m0 += c1o36 * oMdrho; + mfaab = m1 - m0 * vvz; + mfaac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfabc; + m1 = mfabc - mfaba; + m0 = m2 + mfabb; + mfaba = m0; + m0 += c1o9 * oMdrho; + mfabb = m1 - m0 * vvz; + mfabc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfacc; + m1 = mfacc - mfaca; + m0 = m2 + mfacb; + mfaca = m0; + m0 += c1o36 * oMdrho; + mfacb = m1 - m0 * vvz; + mfacc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbac; + m1 = mfbac - mfbaa; + m0 = m2 + mfbab; + mfbaa = m0; + m0 += c1o9 * oMdrho; + mfbab = m1 - m0 * vvz; + mfbac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbba + mfbbc; + m1 = mfbbc - mfbba; + m0 = m2 + mfbbb; + mfbba = m0; + m0 += c4o9 * oMdrho; + mfbbb = m1 - m0 * vvz; + mfbbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbca + mfbcc; + m1 = mfbcc - mfbca; + m0 = m2 + mfbcb; + mfbca = m0; + m0 += c1o9 * oMdrho; + mfbcb = m1 - m0 * vvz; + mfbcc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcac; + m1 = mfcac - mfcaa; + m0 = m2 + mfcab; + mfcaa = m0; + m0 += c1o36 * oMdrho; + mfcab = m1 - m0 * vvz; + mfcac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcba + mfcbc; + m1 = mfcbc - mfcba; + m0 = m2 + mfcbb; + mfcba = m0; + m0 += c1o9 * oMdrho; + mfcbb = m1 - m0 * vvz; + mfcbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcca + mfccc; + m1 = mfccc - mfcca; + m0 = m2 + mfccb; + mfcca = m0; + m0 += c1o36 * oMdrho; + mfccb = m1 - m0 * vvz; + mfccc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m2 = mfaaa + mfaca; + m1 = mfaca - mfaaa; + m0 = m2 + mfaba; + mfaaa = m0; + m0 += c1o6 * oMdrho; + mfaba = m1 - m0 * vvy; + mfaca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfacb; + m1 = mfacb - mfaab; + m0 = m2 + mfabb; + mfaab = m0; + mfabb = m1 - m0 * vvy; + mfacb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfacc; + m1 = mfacc - mfaac; + m0 = m2 + mfabc; + mfaac = m0; + m0 += c1o18 * oMdrho; + mfabc = m1 - m0 * vvy; + mfacc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbca; + m1 = mfbca - mfbaa; + m0 = m2 + mfbba; + mfbaa = m0; + m0 += c2o3 * oMdrho; + mfbba = m1 - m0 * vvy; + mfbca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbab + mfbcb; + m1 = mfbcb - mfbab; + m0 = m2 + mfbbb; + mfbab = m0; + mfbbb = m1 - m0 * vvy; + mfbcb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbac + mfbcc; + m1 = mfbcc - mfbac; + m0 = m2 + mfbbc; + mfbac = m0; + m0 += c2o9 * oMdrho; + mfbbc = m1 - m0 * vvy; + mfbcc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcca; + m1 = mfcca - mfcaa; + m0 = m2 + mfcba; + mfcaa = m0; + m0 += c1o6 * oMdrho; + mfcba = m1 - m0 * vvy; + mfcca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcab + mfccb; + m1 = mfccb - mfcab; + m0 = m2 + mfcbb; + mfcab = m0; + mfcbb = m1 - m0 * vvy; + mfccb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcac + mfccc; + m1 = mfccc - mfcac; + m0 = m2 + mfcbc; + mfcac = m0; + m0 += c1o18 * oMdrho; + mfcbc = m1 - m0 * vvy; + mfccc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m2 = mfaaa + mfcaa; + m1 = mfcaa - mfaaa; + m0 = m2 + mfbaa; + mfaaa = m0; + m0 += 1. * oMdrho; + mfbaa = m1 - m0 * vvx; + mfcaa = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfcba; + m1 = mfcba - mfaba; + m0 = m2 + mfbba; + mfaba = m0; + mfbba = m1 - m0 * vvx; + mfcba = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfcca; + m1 = mfcca - mfaca; + m0 = m2 + mfbca; + mfaca = m0; + m0 += c1o3 * oMdrho; + mfbca = m1 - m0 * vvx; + mfcca = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfcab; + m1 = mfcab - mfaab; + m0 = m2 + mfbab; + mfaab = m0; + mfbab = m1 - m0 * vvx; + mfcab = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabb + mfcbb; + m1 = mfcbb - mfabb; + m0 = m2 + mfbbb; + mfabb = m0; + mfbbb = m1 - m0 * vvx; + mfcbb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacb + mfccb; + m1 = mfccb - mfacb; + m0 = m2 + mfbcb; + mfacb = m0; + mfbcb = m1 - m0 * vvx; + mfccb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfcac; + m1 = mfcac - mfaac; + m0 = m2 + mfbac; + mfaac = m0; + m0 += c1o3 * oMdrho; + mfbac = m1 - m0 * vvx; + mfcac = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabc + mfcbc; + m1 = mfcbc - mfabc; + m0 = m2 + mfbbc; + mfabc = m0; + mfbbc = m1 - m0 * vvx; + mfcbc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacc + mfccc; + m1 = mfccc - mfacc; + m0 = m2 + mfbcc; + mfacc = m0; + m0 += c1o9 * oMdrho; + mfbcc = m1 - m0 * vvx; + mfccc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity + LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// + //LBMReal OxyyMxzz = 1.;//2+s9;// + LBMReal O4 = 1.; + LBMReal O5 = 1.; + LBMReal O6 = 1.; + + //Cum 4. + //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho); + LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho - 1)*oMdrho); + LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho); + + //Cum 5. + LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho; + LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho; + LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho; + + //Cum 6. + LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3* (mfacc + mfcac + mfcca) * oMdrho - c1o9*oMdrho*oMdrho + - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1. - 2.* oMdrho) - c1o27* oMdrho * oMdrho*(-2.* oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) + c1o27*oMdrho; + + //2. + // linear combinations + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + LBMReal dxux = -c1o2 * collFactorF *(mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz*(mfaaa - mxxPyyPzz); + LBMReal dyuy = dxux + collFactorF * c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorF * c3o2 * mxxMzz; + + LBMReal Dxy =-three*collFactorF*mfbba; + LBMReal Dxz =-three*collFactorF*mfbab; + LBMReal Dyz =-three*collFactorF*mfabb; + + //relax + mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += collFactorF * (-mxxMyy) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += collFactorF * (-mxxMzz) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vz2 * dzuz); + + mfabb += collFactorF * (-mfabb); + mfbab += collFactorF * (-mfbab); + mfbba += collFactorF * (-mfbba); + + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + //relax + wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (1. - OxyyPxzz)*fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz)*fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); + mxyyMxzz += wadjust * (-mxyyMxzz); + + // linear combinations back + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + CUMacc += O4 * (-CUMacc); + CUMcac += O4 * (-CUMcac); + CUMcca += O4 * (-CUMcca); + + CUMbbc += O4 * (-CUMbbc); + CUMbcb += O4 * (-CUMbcb); + CUMcbb += O4 * (-CUMcbb); + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + //back cumulants to central moments + //4. + //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho; + mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9*(oMdrho - 1)*oMdrho; + mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9*(oMdrho - 1)*oMdrho; + + //5. + mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho; + mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho; + mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho; + + //6. + mfccc = CUMccc - ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3* (mfacc + mfcac + mfcca) * oMdrho - c1o9*oMdrho*oMdrho + - c1o9* (mfcaa + mfaca + mfaac) * oMdrho*(1. - 2.* oMdrho) - c1o27* oMdrho * oMdrho*(-2.* oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3*oMdrho) - c1o27*oMdrho; + + //////////////////////////////////////////////////////////////////////////////////// + //forcing + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + ////////////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2; + m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2; + mfaaa = m0; + mfaab = m1; + mfaac = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; + m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2); + m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; + mfaba = m0; + mfabb = m1; + mfabc = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfaca = m0; + mfacb = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; + m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2); + m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; + mfbaa = m0; + mfbab = m1; + mfbac = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; + m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2); + m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; + mfbba = m0; + mfbbb = m1; + mfbbc = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; + m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2); + m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; + mfbca = m0; + mfbcb = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfcaa = m0; + mfcab = m1; + mfcac = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; + m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2); + m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; + mfcba = m0; + mfcbb = m1; + mfcbc = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2; + m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; + mfcca = m0; + mfccb = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaaa = m0; + mfaba = m1; + mfaca = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2; + m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; + mfaab = m0; + mfabb = m1; + mfacb = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaac = m0; + mfabc = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; + m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2); + m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; + mfbaa = m0; + mfbba = m1; + mfbca = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; + m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2); + m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; + mfbab = m0; + mfbbb = m1; + mfbcb = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; + m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2); + m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; + mfbac = m0; + mfbbc = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcaa = m0; + mfcba = m1; + mfcca = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2; + m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; + mfcab = m0; + mfcbb = m1; + mfccb = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcac = m0; + mfcbc = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaaa = m0; + mfbaa = m1; + mfcaa = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaba = m0; + mfbba = m1; + mfcba = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaca = m0; + mfbca = m1; + mfcca = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaab = m0; + mfbab = m1; + mfcab = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2; + m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabb = m0; + mfbbb = m1; + mfcbb = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfacb = m0; + mfbcb = m1; + mfccb = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaac = m0; + mfbac = m1; + mfcac = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabc = m0; + mfbbc = m1; + mfcbc = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfacc = m0; + mfbcc = m1; + mfccc = m2; + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// +#ifdef PROOF_CORRECTNESS + LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + //LBMReal dif = fabs(rho - rho_post); + LBMReal dif = rho - rho_post; +#ifdef SINGLEPRECISION + if (dif > 10.0E-7 || dif < -10.0E-7) +#else + if (dif > 10.0E-15 || dif < -10.0E-15) +#endif + { + UB_THROW(UbException(UB_EXARGS, "rho=" + UbSystem::toString(rho) + ", rho_post=" + UbSystem::toString(rho_post) + + " dif=" + UbSystem::toString(dif) + + " rho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); + //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): rho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); + //exit(EXIT_FAILURE); + } +#endif + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb; + + + + + + + + + + + + + + + + + LBMReal ux, uy, uz; + + ux = vvx; + uy = vvy; + uz = vvz; + + + + + //////////////////////////////////////////////////////////////////////////// + // Central Factorized Moment (advection diffusion part) + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //read distribution + + mfcbb = (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3); + mfbcb = (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3); + mfbbc = (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3); + mfccb = (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3); + mfacb = (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3); + mfcbc = (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3); + mfabc = (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3); + mfbcc = (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3); + mfbac = (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3); + mfccc = (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3); + mfacc = (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3); + mfcac = (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3); + mfaac = (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3); + + mfabb = (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3); + mfbab = (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3); + mfbba = (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p); + mfaab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3); + mfcab = (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3); + mfaba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p); + mfcba = (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p); + mfbaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p); + mfbca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p); + mfaaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p); + mfcaa = (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p); + mfaca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p); + mfcca = (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p); + + mfbbb = (*this->zeroDistributionsH)(x1, x2, x3); + + //////////////////////////////////////////////////////////////////////////////////// + LBMReal drho = ((((mfccc + mfaaa) + (mfaca + mfcac)) + ((mfacc + mfcaa) + (mfaac + mfcca))) + + (((mfbac + mfbca) + (mfbaa + mfbcc)) + ((mfabc + mfcba) + (mfaba + mfcbc)) + ((mfacb + mfcab) + (mfaab + mfccb))) + + ((mfabb + mfcbb) + (mfbab + mfbcb)) + (mfbba + mfbbc)) + mfbbb; + + //flocculation + //LBMReal lambda = drho; + + //LBMReal theta = 60 * 1.28172e+06; + //LBMReal alpha = 0.005;// *10.0; + + LBMReal gammaDot = sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one); + + LBMReal dlambda = one / theta - alpha * lambda * gammaDot; + + //LBMReal dlambda = one / (T*pow(lambda,m)) - alpha * lambda * gammaDot; + + ////////////////////////////////////////////////////////////////////////// + //collision Factorized Central moment Kernel Geier 2015 + ////////////////////////////////////////////////////////////////////////// + LBMReal Mom000 = mfaaa + mfaab + mfaac + mfaba + mfabb + mfabc + mfaca + + mfacb + mfacc + mfbaa + mfbab + mfbac + mfbba + mfbbb + mfbbc + mfbca + + mfbcb + mfbcc + mfcaa + mfcab + mfcac + mfcba + mfcbb + mfcbc + mfcca + mfccb + mfccc; + + Mom000 += dlambda*c1o2; //1 + + //(100)// + LBMReal Mom100 = mfaaa*(-1 - ux) + mfaab*(-1 - ux) + mfaac*(-1 - ux) + mfaba*(-1 - ux) + mfabb*(-1 - ux) + mfabc*(-1 - ux) + mfaca*(-1 - ux) + + mfacb*(-1 - ux) + mfacc*(-1 - ux) + mfcaa*(1 - ux) + mfcab*(1 - ux) + mfcac*(1 - ux) + mfcba*(1 - ux) + mfcbb*(1 - ux) + + mfcbc*(1 - ux) + mfcca*(1 - ux) + mfccb*(1 - ux) + mfccc*(1 - ux) - mfbaa*ux - mfbab*ux - mfbac*ux - mfbba*ux - mfbbb*ux - + mfbbc*ux - mfbca*ux - mfbcb*ux - mfbcc*ux; + + LBMReal Mom010 = mfaaa*(-1 - uy) + mfaab*(-1 - uy) + mfaac*(-1 - uy) + mfbaa*(-1 - uy) + mfbab*(-1 - uy) + mfbac*(-1 - uy) + mfcaa*(-1 - uy) + + mfcab*(-1 - uy) + mfcac*(-1 - uy) + mfaca*(1 - uy) + mfacb*(1 - uy) + mfacc*(1 - uy) + mfbca*(1 - uy) + mfbcb*(1 - uy) + + mfbcc*(1 - uy) + mfcca*(1 - uy) + mfccb*(1 - uy) + mfccc*(1 - uy) - mfaba*uy - mfabb*uy - mfabc*uy - mfbba*uy - mfbbb*uy - + mfbbc*uy - mfcba*uy - mfcbb*uy - mfcbc*uy; + + LBMReal Mom001 = mfaaa*(-1 - uz) + mfaba*(-1 - uz) + mfaca*(-1 - uz) + mfbaa*(-1 - uz) + mfbba*(-1 - uz) + mfbca*(-1 - uz) + mfcaa*(-1 - uz) + + mfcba*(-1 - uz) + mfcca*(-1 - uz) + mfaac*(1 - uz) + mfabc*(1 - uz) + mfacc*(1 - uz) + mfbac*(1 - uz) + mfbbc*(1 - uz) + + mfbcc*(1 - uz) + mfcac*(1 - uz) + mfcbc*(1 - uz) + mfccc*(1 - uz) - mfaab*uz - mfabb*uz - mfacb*uz - mfbab*uz - mfbbb*uz - + mfbcb*uz - mfcab*uz - mfcbb*uz - mfccb*uz; + //// + + //(110)// + LBMReal Mom110 = mfaaa*(-1 - ux)*(-1 - uy) + mfaab*(-1 - ux)*(-1 - uy) + mfaac*(-1 - ux)*(-1 - uy) + mfcaa*(1 - ux)*(-1 - uy) + + mfcab*(1 - ux)*(-1 - uy) + mfcac*(1 - ux)*(-1 - uy) - mfbaa*ux*(-1 - uy) - mfbab*ux*(-1 - uy) - mfbac*ux*(-1 - uy) + + mfaca*(-1 - ux)*(1 - uy) + mfacb*(-1 - ux)*(1 - uy) + mfacc*(-1 - ux)*(1 - uy) + mfcca*(1 - ux)*(1 - uy) + mfccb*(1 - ux)*(1 - uy) + + mfccc*(1 - ux)*(1 - uy) - mfbca*ux*(1 - uy) - mfbcb*ux*(1 - uy) - mfbcc*ux*(1 - uy) - mfaba*(-1 - ux)*uy - mfabb*(-1 - ux)*uy - + mfabc*(-1 - ux)*uy - mfcba*(1 - ux)*uy - mfcbb*(1 - ux)*uy - mfcbc*(1 - ux)*uy + mfbba*ux*uy + mfbbb*ux*uy + mfbbc*ux*uy; + + LBMReal Mom101 = mfaaa*(-1 - ux)*(-1 - uz) + mfaba*(-1 - ux)*(-1 - uz) + mfaca*(-1 - ux)*(-1 - uz) + mfcaa*(1 - ux)*(-1 - uz) + + mfcba*(1 - ux)*(-1 - uz) + mfcca*(1 - ux)*(-1 - uz) - mfbaa*ux*(-1 - uz) - mfbba*ux*(-1 - uz) - mfbca*ux*(-1 - uz) + + mfaac*(-1 - ux)*(1 - uz) + mfabc*(-1 - ux)*(1 - uz) + mfacc*(-1 - ux)*(1 - uz) + mfcac*(1 - ux)*(1 - uz) + mfcbc*(1 - ux)*(1 - uz) + + mfccc*(1 - ux)*(1 - uz) - mfbac*ux*(1 - uz) - mfbbc*ux*(1 - uz) - mfbcc*ux*(1 - uz) - mfaab*(-1 - ux)*uz - mfabb*(-1 - ux)*uz - + mfacb*(-1 - ux)*uz - mfcab*(1 - ux)*uz - mfcbb*(1 - ux)*uz - mfccb*(1 - ux)*uz + mfbab*ux*uz + mfbbb*ux*uz + mfbcb*ux*uz; + + LBMReal Mom011 = mfaaa*(-1 - uy)*(-1 - uz) + mfbaa*(-1 - uy)*(-1 - uz) + mfcaa*(-1 - uy)*(-1 - uz) + mfaca*(1 - uy)*(-1 - uz) + + mfbca*(1 - uy)*(-1 - uz) + mfcca*(1 - uy)*(-1 - uz) - mfaba*uy*(-1 - uz) - mfbba*uy*(-1 - uz) - mfcba*uy*(-1 - uz) + + mfaac*(-1 - uy)*(1 - uz) + mfbac*(-1 - uy)*(1 - uz) + mfcac*(-1 - uy)*(1 - uz) + mfacc*(1 - uy)*(1 - uz) + mfbcc*(1 - uy)*(1 - uz) + + mfccc*(1 - uy)*(1 - uz) - mfabc*uy*(1 - uz) - mfbbc*uy*(1 - uz) - mfcbc*uy*(1 - uz) - mfaab*(-1 - uy)*uz - mfbab*(-1 - uy)*uz - + mfcab*(-1 - uy)*uz - mfacb*(1 - uy)*uz - mfbcb*(1 - uy)*uz - mfccb*(1 - uy)*uz + mfabb*uy*uz + mfbbb*uy*uz + mfcbb*uy*uz; + //// + + LBMReal Mom111 = mfaaa*(-1 - ux)*(-1 - uy)*(-1 - uz) + mfcaa*(1 - ux)*(-1 - uy)*(-1 - uz) - mfbaa*ux*(-1 - uy)*(-1 - uz) + + mfaca*(-1 - ux)*(1 - uy)*(-1 - uz) + mfcca*(1 - ux)*(1 - uy)*(-1 - uz) - mfbca*ux*(1 - uy)*(-1 - uz) - + mfaba*(-1 - ux)*uy*(-1 - uz) - mfcba*(1 - ux)*uy*(-1 - uz) + mfbba*ux*uy*(-1 - uz) + mfaac*(-1 - ux)*(-1 - uy)*(1 - uz) + + mfcac*(1 - ux)*(-1 - uy)*(1 - uz) - mfbac*ux*(-1 - uy)*(1 - uz) + mfacc*(-1 - ux)*(1 - uy)*(1 - uz) + + mfccc*(1 - ux)*(1 - uy)*(1 - uz) - mfbcc*ux*(1 - uy)*(1 - uz) - mfabc*(-1 - ux)*uy*(1 - uz) - mfcbc*(1 - ux)*uy*(1 - uz) + + mfbbc*ux*uy*(1 - uz) - mfaab*(-1 - ux)*(-1 - uy)*uz - mfcab*(1 - ux)*(-1 - uy)*uz + mfbab*ux*(-1 - uy)*uz - + mfacb*(-1 - ux)*(1 - uy)*uz - mfccb*(1 - ux)*(1 - uy)*uz + mfbcb*ux*(1 - uy)*uz + mfabb*(-1 - ux)*uy*uz + mfcbb*(1 - ux)*uy*uz - + mfbbb*ux*uy*uz; + + //(200)// + LBMReal Mom200 = ((mfcaa + mfcab + mfcac + mfcba + mfcbb + mfcbc + mfcca + mfccb + + mfccc)*pow(-1 + ux, 2) + + (mfbaa + mfbab + mfbac + mfbba + mfbbb + mfbbc + mfbca + + mfbcb + mfbcc)*pow(ux, 2) + + (mfaaa + mfaab + mfaac + mfaba + mfabb + mfabc + mfaca + + mfacb + mfacc)*pow(1 + ux, 2)) - Mom000 / 3; + + LBMReal Mom020 = ((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) + + (mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) + + (mfcca + mfccb + mfccc)*pow(-1 + uy, 2) + + (mfaba + mfabb + mfabc)*pow(uy, 2) + + (mfbba + mfbbb + mfbbc)*pow(uy, 2) + + (mfcba + mfcbb + mfcbc)*pow(uy, 2) + + (mfaaa + mfaab + mfaac)*pow(1 + uy, 2) + + (mfbaa + mfbab + mfbac)*pow(1 + uy, 2) + + (mfcaa + mfcab + mfcac)*pow(1 + uy, 2)) - Mom000 / 3; + + LBMReal Mom002 = (mfaba + mfabc + mfaca + mfacc + mfbba + mfbbc + mfbca + mfbcc + + mfcba + mfcbc + mfcca + mfccc + mfaac*pow(-1 + uz, 2) + + mfbac*pow(-1 + uz, 2) + mfcac*pow(-1 + uz, 2) + + 2 * mfaba*uz - 2 * mfabc*uz + 2 * mfaca*uz - 2 * mfacc*uz + + 2 * mfbba*uz - 2 * mfbbc*uz + 2 * mfbca*uz - 2 * mfbcc*uz + + 2 * mfcba*uz - 2 * mfcbc*uz + 2 * mfcca*uz - 2 * mfccc*uz + + mfaab*pow(uz, 2) + mfaba*pow(uz, 2) + mfabb*pow(uz, 2) + + mfabc*pow(uz, 2) + mfaca*pow(uz, 2) + mfacb*pow(uz, 2) + + mfacc*pow(uz, 2) + mfbab*pow(uz, 2) + mfbba*pow(uz, 2) + + mfbbb*pow(uz, 2) + mfbbc*pow(uz, 2) + mfbca*pow(uz, 2) + + mfbcb*pow(uz, 2) + mfbcc*pow(uz, 2) + mfcab*pow(uz, 2) + + mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) + mfcbc*pow(uz, 2) + + mfcca*pow(uz, 2) + mfccb*pow(uz, 2) + mfccc*pow(uz, 2) + + mfaaa*pow(1 + uz, 2) + mfbaa*pow(1 + uz, 2) + + mfcaa*pow(1 + uz, 2)) - Mom000 / 3; + //// + + //(210)// + LBMReal Mom210 = (pow(1 + ux, 2)*(-((mfaca + mfacb + mfacc)*(-1 + uy)) - + (mfaba + mfabb + mfabc)*uy - + (mfaaa + mfaab + mfaac)*(1 + uy)) + + pow(ux, 2)*(-((mfbca + mfbcb + mfbcc)*(-1 + uy)) - + (mfbba + mfbbb + mfbbc)*uy - + (mfbaa + mfbab + mfbac)*(1 + uy)) + + pow(-1 + ux, 2)*(-((mfcca + mfccb + mfccc)*(-1 + uy)) - + (mfcba + mfcbb + mfcbc)*uy - + (mfcaa + mfcab + mfcac)*(1 + uy))) - Mom010 / 3; + + LBMReal Mom201 = (-(pow(1 + ux, 2)*(mfaba - mfabc + mfaca - mfacc + + mfaac*(-1 + uz) + mfaab*uz + mfaba*uz + mfabb*uz + + mfabc*uz + mfaca*uz + mfacb*uz + mfacc*uz + + mfaaa*(1 + uz))) - + pow(ux, 2)*(mfbba - mfbbc + mfbca - mfbcc + + mfbac*(-1 + uz) + mfbab*uz + mfbba*uz + mfbbb*uz + + mfbbc*uz + mfbca*uz + mfbcb*uz + mfbcc*uz + mfbaa*(1 + uz)) + - pow(-1 + ux, 2)*(mfcba - mfcbc + mfcca - mfccc + + mfcac*(-1 + uz) + mfcab*uz + mfcba*uz + mfcbb*uz + + mfcbc*uz + mfcca*uz + mfccb*uz + mfccc*uz + mfcaa*(1 + uz))) - Mom001 / 3; + + LBMReal Mom120 = ((-1 - ux)*((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) + + (mfaba + mfabb + mfabc)*pow(uy, 2) + + (mfaaa + mfaab + mfaac)*pow(1 + uy, 2)) - + ux*((mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) + + (mfbba + mfbbb + mfbbc)*pow(uy, 2) + + (mfbaa + mfbab + mfbac)*pow(1 + uy, 2)) + + (1 - ux)*((mfcca + mfccb + mfccc)*pow(-1 + uy, 2) + + (mfcba + mfcbb + mfcbc)*pow(uy, 2) + + (mfcaa + mfcab + mfcac)*pow(1 + uy, 2))) - Mom100 / 3; + + + LBMReal Mom102 = (-((1 + ux)*(mfaba + mfabc + mfaca + mfacc + + mfaac*pow(-1 + uz, 2) + 2 * mfaba*uz - 2 * mfabc*uz + + 2 * mfaca*uz - 2 * mfacc*uz + mfaab*pow(uz, 2) + + mfaba*pow(uz, 2) + mfabb*pow(uz, 2) + + mfabc*pow(uz, 2) + mfaca*pow(uz, 2) + + mfacb*pow(uz, 2) + mfacc*pow(uz, 2) + + mfaaa*pow(1 + uz, 2))) - + ux*(mfbba + mfbbc + mfbca + mfbcc + mfbac*pow(-1 + uz, 2) + + 2 * mfbba*uz - 2 * mfbbc*uz + 2 * mfbca*uz - 2 * mfbcc*uz + + mfbab*pow(uz, 2) + mfbba*pow(uz, 2) + + mfbbb*pow(uz, 2) + mfbbc*pow(uz, 2) + + mfbca*pow(uz, 2) + mfbcb*pow(uz, 2) + + mfbcc*pow(uz, 2) + mfbaa*pow(1 + uz, 2)) - + (-1 + ux)*(mfcba + mfcbc + mfcca + mfccc + + mfcac*pow(-1 + uz, 2) + 2 * mfcba*uz - 2 * mfcbc*uz + + 2 * mfcca*uz - 2 * mfccc*uz + mfcab*pow(uz, 2) + + mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) + + mfcbc*pow(uz, 2) + mfcca*pow(uz, 2) + + mfccb*pow(uz, 2) + mfccc*pow(uz, 2) + + mfcaa*pow(1 + uz, 2))) - Mom100 / 3; + + LBMReal Mom021 = (-(pow(1 + uy, 2)*(mfaac*(-1 + uz) + mfaab*uz + + mfaaa*(1 + uz))) - + pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz + mfaba*(1 + uz)) - + pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz + + mfaca*(1 + uz)) - pow(1 + uy, 2)* + (mfbac*(-1 + uz) + mfbab*uz + mfbaa*(1 + uz)) - + pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz + mfbba*(1 + uz)) - + pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz + + mfbca*(1 + uz)) - pow(1 + uy, 2)* + (mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz)) - + pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz + mfcba*(1 + uz)) - + pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz + mfcca*(1 + uz))) - Mom001 / 3; + + LBMReal Mom012 = (-((1 + uy)*(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) + + mfaaa*pow(1 + uz, 2))) - + uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) - + (-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) + + mfaca*pow(1 + uz, 2)) - + (1 + uy)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) + + mfbaa*pow(1 + uz, 2)) - + uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) - + (-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) + + mfbca*pow(1 + uz, 2)) - + (1 + uy)*(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) + + mfcaa*pow(1 + uz, 2)) - + uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) - + (-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) + + mfcca*pow(1 + uz, 2))) - Mom010 / 3; + //// + + + //(220)// + LBMReal Mom220 = (pow(1 + ux, 2)*((mfaca + mfacb + mfacc)*pow(-1 + uy, 2) + + (mfaba + mfabb + mfabc)*pow(uy, 2) + + (mfaaa + mfaab + mfaac)*pow(1 + uy, 2)) + + pow(ux, 2)*((mfbca + mfbcb + mfbcc)*pow(-1 + uy, 2) + + (mfbba + mfbbb + mfbbc)*pow(uy, 2) + + (mfbaa + mfbab + mfbac)*pow(1 + uy, 2)) + + pow(-1 + ux, 2)*((mfcca + mfccb + mfccc)*pow(-1 + uy, 2) + + (mfcba + mfcbb + mfcbc)*pow(uy, 2) + + (mfcaa + mfcab + mfcac)*pow(1 + uy, 2))) - Mom000 / 9; + + LBMReal Mom202 = (pow(1 + ux, 2)*(mfaba + mfabc + mfaca + mfacc + + mfaac*pow(-1 + uz, 2) + 2 * mfaba*uz - 2 * mfabc*uz + + 2 * mfaca*uz - 2 * mfacc*uz + mfaab*pow(uz, 2) + + mfaba*pow(uz, 2) + mfabb*pow(uz, 2) + + mfabc*pow(uz, 2) + mfaca*pow(uz, 2) + + mfacb*pow(uz, 2) + mfacc*pow(uz, 2) + + mfaaa*pow(1 + uz, 2)) + + pow(ux, 2)*(mfbba + mfbbc + mfbca + mfbcc + + mfbac*pow(-1 + uz, 2) + 2 * mfbba*uz - 2 * mfbbc*uz + + 2 * mfbca*uz - 2 * mfbcc*uz + mfbab*pow(uz, 2) + + mfbba*pow(uz, 2) + mfbbb*pow(uz, 2) + + mfbbc*pow(uz, 2) + mfbca*pow(uz, 2) + + mfbcb*pow(uz, 2) + mfbcc*pow(uz, 2) + + mfbaa*pow(1 + uz, 2)) + + pow(-1 + ux, 2)*(mfcba + mfcbc + mfcca + mfccc + + mfcac*pow(-1 + uz, 2) + 2 * mfcba*uz - 2 * mfcbc*uz + + 2 * mfcca*uz - 2 * mfccc*uz + mfcab*pow(uz, 2) + + mfcba*pow(uz, 2) + mfcbb*pow(uz, 2) + + mfcbc*pow(uz, 2) + mfcca*pow(uz, 2) + + mfccb*pow(uz, 2) + mfccc*pow(uz, 2) + + mfcaa*pow(1 + uz, 2))) - Mom000 / 9; + + LBMReal Mom022 = (pow(1 + uy, 2)*(mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) + + mfaaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) + + mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2)) + + pow(1 + uy, 2)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) + + mfbaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) + + mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2)) + + pow(1 + uy, 2)*(mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) + + mfcaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) + + mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2))) - Mom000 / 9; + //// + + //(221)// + LBMReal Mom221 = (pow(1 + ux, 2)*(-(pow(1 + uy, 2)* + (mfaac*(-1 + uz) + mfaab*uz + mfaaa*(1 + uz))) - + pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz + + mfaba*(1 + uz)) - + pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz + + mfaca*(1 + uz))) + + pow(ux, 2)*(-(pow(1 + uy, 2)* + (mfbac*(-1 + uz) + mfbab*uz + mfbaa*(1 + uz))) - + pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz + + mfbba*(1 + uz)) - + pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz + + mfbca*(1 + uz))) + + pow(-1 + ux, 2)*(-(pow(1 + uy, 2)* + (mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz))) - + pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz + + mfcba*(1 + uz)) - + pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz + + mfcca*(1 + uz)))) - Mom001 / 9; + + LBMReal Mom212 = (pow(1 + ux, 2)*(-((1 + uy)* + (mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) + + mfaaa*pow(1 + uz, 2))) - + uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) - + (-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) + + mfaca*pow(1 + uz, 2))) + + pow(ux, 2)*(-((1 + uy)* + (mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) + + mfbaa*pow(1 + uz, 2))) - + uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) - + (-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) + + mfbca*pow(1 + uz, 2))) + + pow(-1 + ux, 2)*(-((1 + uy)* + (mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) + + mfcaa*pow(1 + uz, 2))) - + uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) - + (-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) + + mfcca*pow(1 + uz, 2)))) - Mom010 / 9; + + LBMReal Mom122 = ((-1 - ux)*(pow(1 + uy, 2)* + (mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) + + mfaaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) + + mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2))) - + ux*(pow(1 + uy, 2)*(mfbac*pow(-1 + uz, 2) + + mfbab*pow(uz, 2) + mfbaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) + + mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2))) + + (1 - ux)*(pow(1 + uy, 2)* + (mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) + + mfcaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) + + mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2)))) - Mom100 / 9; + //// + + //(211)// + LBMReal Mom211 = (pow(1 + ux, 2)*((1 + uy)*(mfaac*(-1 + uz) + mfaab*uz + + mfaaa*(1 + uz)) + + uy*(mfabc*(-1 + uz) + mfabb*uz + mfaba*(1 + uz)) + + (-1 + uy)*(mfacc*(-1 + uz) + mfacb*uz + mfaca*(1 + uz))) + + pow(ux, 2)*((1 + uy)*(mfbac*(-1 + uz) + mfbab*uz + + mfbaa*(1 + uz)) + + uy*(mfbbc*(-1 + uz) + mfbbb*uz + mfbba*(1 + uz)) + + (-1 + uy)*(mfbcc*(-1 + uz) + mfbcb*uz + mfbca*(1 + uz))) + + pow(-1 + ux, 2)*((1 + uy)* + (mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz)) + + uy*(mfcbc*(-1 + uz) + mfcbb*uz + mfcba*(1 + uz)) + + (-1 + uy)*(mfccc*(-1 + uz) + mfccb*uz + mfcca*(1 + uz)))) - Mom011 / 3; + + LBMReal Mom121 = ((-1 - ux)*(-(pow(1 + uy, 2)* + (mfaac*(-1 + uz) + mfaab*uz + mfaaa*(1 + uz))) - + pow(uy, 2)*(mfabc*(-1 + uz) + mfabb*uz + + mfaba*(1 + uz)) - + pow(-1 + uy, 2)*(mfacc*(-1 + uz) + mfacb*uz + + mfaca*(1 + uz))) - + ux*(-(pow(1 + uy, 2)*(mfbac*(-1 + uz) + mfbab*uz + + mfbaa*(1 + uz))) - + pow(uy, 2)*(mfbbc*(-1 + uz) + mfbbb*uz + + mfbba*(1 + uz)) - + pow(-1 + uy, 2)*(mfbcc*(-1 + uz) + mfbcb*uz + + mfbca*(1 + uz))) + + (1 - ux)*(-(pow(1 + uy, 2)* + (mfcac*(-1 + uz) + mfcab*uz + mfcaa*(1 + uz))) - + pow(uy, 2)*(mfcbc*(-1 + uz) + mfcbb*uz + + mfcba*(1 + uz)) - + pow(-1 + uy, 2)*(mfccc*(-1 + uz) + mfccb*uz + + mfcca*(1 + uz)))) - Mom101 / 3; + + LBMReal Mom112 = ((-1 - ux)*(-((1 + uy)*(mfaac*pow(-1 + uz, 2) + + mfaab*pow(uz, 2) + mfaaa*pow(1 + uz, 2))) - + uy*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) - + (-1 + uy)*(mfacc*pow(-1 + uz, 2) + mfacb*pow(uz, 2) + + mfaca*pow(1 + uz, 2))) - + ux*(-((1 + uy)*(mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) + + mfbaa*pow(1 + uz, 2))) - + uy*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) - + (-1 + uy)*(mfbcc*pow(-1 + uz, 2) + mfbcb*pow(uz, 2) + + mfbca*pow(1 + uz, 2))) + + (1 - ux)*(-((1 + uy)*(mfcac*pow(-1 + uz, 2) + + mfcab*pow(uz, 2) + mfcaa*pow(1 + uz, 2))) - + uy*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) - + (-1 + uy)*(mfccc*pow(-1 + uz, 2) + mfccb*pow(uz, 2) + + mfcca*pow(1 + uz, 2)))) - Mom110 / 3; + //// + + //(222)// + LBMReal Mom222 = (pow(1 + ux, 2)*(pow(1 + uy, 2)* + (mfaac*pow(-1 + uz, 2) + mfaab*pow(uz, 2) + + mfaaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfabc*pow(-1 + uz, 2) + mfabb*pow(uz, 2) + + mfaba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfacc*pow(-1 + uz, 2) + + mfacb*pow(uz, 2) + mfaca*pow(1 + uz, 2))) + + pow(ux, 2)*(pow(1 + uy, 2)* + (mfbac*pow(-1 + uz, 2) + mfbab*pow(uz, 2) + + mfbaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfbbc*pow(-1 + uz, 2) + mfbbb*pow(uz, 2) + + mfbba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfbcc*pow(-1 + uz, 2) + + mfbcb*pow(uz, 2) + mfbca*pow(1 + uz, 2))) + + pow(-1 + ux, 2)*(pow(1 + uy, 2)* + (mfcac*pow(-1 + uz, 2) + mfcab*pow(uz, 2) + + mfcaa*pow(1 + uz, 2)) + + pow(uy, 2)*(mfcbc*pow(-1 + uz, 2) + mfcbb*pow(uz, 2) + + mfcba*pow(1 + uz, 2)) + + pow(-1 + uy, 2)*(mfccc*pow(-1 + uz, 2) + + mfccb*pow(uz, 2) + mfcca*pow(1 + uz, 2)))) - Mom000 / 27; + //// + + + + + + LBMReal Meq000 = drho+dlambda*c1o2; + + + // relaxation Central Moment MRT + + Mom000 = Meq000; + + Mom000 += dlambda*c1o2; + + Mom100 = (1 - collFactorH) * Mom100; + Mom010 = (1 - collFactorH) * Mom010; + Mom001 = (1 - collFactorH) * Mom001; + + Mom110 = 0; + Mom101 = 0; + Mom011 = 0; + + Mom111 = 0; + + //(200)// + Mom200 = Mom000 / 3; + Mom020 = Mom000 / 3; + Mom002 = Mom000 / 3; + //// + + //(210)// + Mom210 = Mom010 / 3; + Mom201 = Mom001 / 3; + Mom120 = Mom100 / 3; + + + Mom102 = Mom100 / 3; + Mom021 = Mom001 / 3; + Mom012 = Mom010 / 3; + //// + + + //(220)// + Mom220 = Mom000 / 9; + Mom202 = Mom000 / 9; + Mom022 = Mom000 / 9; + //// + + //(221)// + Mom221 = Mom001 / 9; + Mom212 = Mom010 / 9; + Mom122 = Mom100 / 9; + //// + + //(211)// + Mom211 = Mom011 / 3; + Mom121 = Mom101 / 3; + Mom112 = Mom110 / 3; + //// + + //(222)// + Mom222 = Mom000 / 27; + //// + + + + //Back transformation to distributions + + mfcbb = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + + 2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy + + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))* + (-1 + pow(uy, 2)) - + 2 * (-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) - + 2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))* + uy - (Mom101 + Mom201 + 2 * Mom101*ux + + Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*uz + + (-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) - + 2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))* + uy - (Mom100 + Mom200 + 2 * Mom100*ux + + Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))* + (1 - pow(uz, 2))) / 2.; + mfbcb = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) + + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy* + (1 + uy) + (Mom212 + 2 * Mom112*ux + + Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) - + 2 * (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy* + (1 + uy) - (Mom211 + 2 * Mom111*ux + + Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*uz + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy* + (1 + uy) - (Mom210 + 2 * Mom110*ux + + Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))* + (1 - pow(uz, 2))) / 2.; + mfbbc = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) + + 2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy + + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)) + + (Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) + + 2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))* + uy + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)))*uz*(1 + uz) + + (Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) + + 2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))* + uy + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)))*(1 + 2 * uz)) / 2.; + mfccb = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) - + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy* + (1 + uy) - (Mom112 + Mom212 + 2 * Mom112*ux + + Mom012*ux*(1 + ux))*(1 + 2 * uy) - + 2 * (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy* + (1 + uy) + (Mom111 + Mom211 + 2 * Mom111*ux + + Mom011*ux*(1 + ux))*(1 + 2 * uy))*uz + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy* + (1 + uy) + (Mom110 + Mom210 + 2 * Mom110*ux + + Mom010*ux*(1 + ux))*(1 + 2 * uy))*(1 - pow(uz, 2))) / 4.; + mfacb = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux - + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy* + (1 + uy) - (Mom212 + Mom012*(-1 + ux)*ux + + Mom112*(-1 + 2 * ux))*(1 + 2 * uy) - + 2 * (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy* + (1 + uy) + (Mom211 + Mom011*(-1 + ux)*ux + + Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*uz + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy* + (1 + uy) + (Mom210 + Mom010*(-1 + ux)*ux + + Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*(1 - pow(uz, 2))) / 4.; + mfcbc = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) - + 2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy - + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))* + (-1 + pow(uy, 2)) + + (-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) - + 2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))* + uy - (Mom100 + Mom200 + 2 * Mom100*ux + + Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))*uz*(1 + uz) + + (-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) - + 2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))* + uy - (Mom101 + Mom201 + 2 * Mom101*ux + + Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*(1 + 2 * uz)) / 4.; + mfabc = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux - + 2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy - + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))* + (-1 + pow(uy, 2)) + + (Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux - + 2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))* + uy - (Mom200 + Mom000*(-1 + ux)*ux + + Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*uz*(1 + uz) + + (Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux - + 2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))* + uy - (Mom201 + Mom001*(-1 + ux)*ux + + Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(1 + 2 * uz)) / 4.; + mfbcc = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy* + (1 + uy) - (Mom212 + 2 * Mom112*ux + + Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy* + (1 + uy) - (Mom210 + 2 * Mom110*ux + + Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))*uz*(1 + uz) + + (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy* + (1 + uy) - (Mom211 + 2 * Mom111*ux + + Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(1 + 2 * uz)) / 4.; + mfbac = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))* + (-1 + uy)*uy - (Mom212 + 2 * Mom112*ux + + Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))* + (-1 + uy)*uy - (Mom210 + 2 * Mom110*ux + + Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*uz*(1 + uz) + + (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))* + (-1 + uy)*uy - (Mom211 + 2 * Mom111*ux + + Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(1 + 2 * uz)) / 4.; + mfccc = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy* + (1 + uy) + (Mom112 + Mom212 + 2 * Mom112*ux + + Mom012*ux*(1 + ux))*(1 + 2 * uy) + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy* + (1 + uy) + (Mom110 + Mom210 + 2 * Mom110*ux + + Mom010*ux*(1 + ux))*(1 + 2 * uy))*uz*(1 + uz) + + (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy* + (1 + uy) + (Mom111 + Mom211 + 2 * Mom111*ux + + Mom011*ux*(1 + ux))*(1 + 2 * uy))*(1 + 2 * uz)) / 8.; + mfacc = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy* + (1 + uy) + (Mom212 + Mom012*(-1 + ux)*ux + + Mom112*(-1 + 2 * ux))*(1 + 2 * uy) + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy* + (1 + uy) + (Mom210 + Mom010*(-1 + ux)*ux + + Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*uz*(1 + uz) + + (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy* + (1 + uy) + (Mom211 + Mom011*(-1 + ux)*ux + + Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*(1 + 2 * uz)) / 8.; + mfcac = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))* + (-1 + uy)*uy + (Mom112 + Mom212 + 2 * Mom112*ux + + Mom012*ux*(1 + ux))*(-1 + 2 * uy) + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))* + (-1 + uy)*uy + (Mom110 + Mom210 + 2 * Mom110*ux + + Mom010*ux*(1 + ux))*(-1 + 2 * uy))*uz*(1 + uz) + + (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))* + (-1 + uy)*uy + (Mom111 + Mom211 + 2 * Mom111*ux + + Mom011*ux*(1 + ux))*(-1 + 2 * uy))*(1 + 2 * uz)) / 8.; + mfaac = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))* + (-1 + uy)*uy + (Mom212 + Mom012*(-1 + ux)*ux + + Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))* + (-1 + uy)*uy + (Mom210 + Mom010*(-1 + ux)*ux + + Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*uz*(1 + uz) + + (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))* + (-1 + uy)*uy + (Mom211 + Mom011*(-1 + ux)*ux + + Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*(1 + 2 * uz)) / 8.; + + mfabb = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + + 2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy + + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))* + (-1 + pow(uy, 2)) - + 2 * (Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux - + 2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))* + uy - (Mom201 + Mom001*(-1 + ux)*ux + + Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*uz + + (Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux - + 2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))* + uy - (Mom200 + Mom000*(-1 + ux)*ux + + Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))* + (1 - pow(uz, 2))) / 2.; + mfbab = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) + + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))* + (-1 + uy)*uy + (Mom212 + 2 * Mom112*ux + + Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) - + 2 * (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))* + (-1 + uy)*uy - (Mom211 + 2 * Mom111*ux + + Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*uz + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))* + (-1 + uy)*uy - (Mom210 + 2 * Mom110*ux + + Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))* + (1 - pow(uz, 2))) / 2.; + mfbba = (Mom222 + 2 * Mom122*ux + Mom022*(-1 + pow(ux, 2)) + + 2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy + + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)) + + (Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) + + 2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))* + uy + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)))*(-1 + uz)*uz + + (Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) + + 2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))* + uy + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))* + (-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 2.; + mfaab = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux - + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))* + (-1 + uy)*uy - (Mom212 + Mom012*(-1 + ux)*ux + + Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) - + 2 * (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))* + (-1 + uy)*uy + (Mom211 + Mom011*(-1 + ux)*ux + + Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*uz + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))* + (-1 + uy)*uy + (Mom210 + Mom010*(-1 + ux)*ux + + Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*(1 - pow(uz, 2))) / 4.; + mfcab = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) - + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))* + (-1 + uy)*uy - (Mom112 + Mom212 + 2 * Mom112*ux + + Mom012*ux*(1 + ux))*(-1 + 2 * uy) - + 2 * (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))* + (-1 + uy)*uy + (Mom111 + Mom211 + 2 * Mom111*ux + + Mom011*ux*(1 + ux))*(-1 + 2 * uy))*uz + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))* + (-1 + uy)*uy + (Mom110 + Mom210 + 2 * Mom110*ux + + Mom010*ux*(1 + ux))*(-1 + 2 * uy))*(1 - pow(uz, 2))) / 4.; + mfaba = (Mom122 - Mom222 - 2 * Mom122*ux - Mom022*(-1 + ux)*ux - 2 * (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*uy - + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*(-1 + pow(uy, 2)) + + (Mom120 - Mom220 - 2 * Mom120*ux - Mom020*(-1 + ux)*ux - 2 * (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*uy - + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(-1 + uz)*uz + + (Mom121 - Mom221 - 2 * Mom121*ux - Mom021*(-1 + ux)*ux - 2 * (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*uy - + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*(-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 4.; + mfcba = (-Mom222 - Mom022*ux*(1 + ux) - Mom122*(1 + 2 * ux) - 2 * (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*uy - + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*(-1 + pow(uy, 2)) + + (-Mom220 - Mom020*ux*(1 + ux) - Mom120*(1 + 2 * ux) - 2 * (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*uy - + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*(-1 + pow(uy, 2)))*(-1 + uz)*uz + + (-Mom221 - Mom021*ux*(1 + ux) - Mom121*(1 + 2 * ux) - 2 * (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*uy - + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*(-1 + pow(uy, 2)))*(-1 + 2 * uz)) / 4.; + mfbaa = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*(-1 + uy)*uy - + (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*(-1 + 2 * uy) + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*(-1 + uy)*uy - + (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(-1 + uz)*uz + + (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*(-1 + uy)*uy - + (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 4.; + mfbca = (Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*uy*(1 + uy) - + (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*(1 + 2 * uy) + + (Mom020 - Mom220 - 2 * Mom120*ux - Mom020*pow(ux, 2) - + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*uy*(1 + uy) - + (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(-1 + uz)*uz + + (Mom021 - Mom221 - 2 * Mom121*ux - Mom021*pow(ux, 2) - + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*uy*(1 + uy) - + (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*(1 + 2 * uy))*(-1 + 2 * uz)) / 4.; + mfaaa = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*(-1 + uy)*uy + + (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*(-1 + 2 * uy) + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*(-1 + uy)*uy + + (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*(-1 + 2 * uy))*(-1 + uz)*uz + + (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*(-1 + uy)*uy + + (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 8.; + mfcaa = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*(-1 + uy)*uy + + (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*(-1 + 2 * uy) + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*(-1 + uy)*uy + + (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*(-1 + 2 * uy))*(-1 + uz)*uz + + (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*(-1 + uy)*uy + + (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*(-1 + 2 * uy))*(-1 + 2 * uz)) / 8.; + mfaca = (Mom222 + Mom022*(-1 + ux)*ux + Mom122*(-1 + 2 * ux) + (Mom202 + Mom002*(-1 + ux)*ux + Mom102*(-1 + 2 * ux))*uy*(1 + uy) + + (Mom212 + Mom012*(-1 + ux)*ux + Mom112*(-1 + 2 * ux))*(1 + 2 * uy) + + (Mom220 + Mom020*(-1 + ux)*ux + Mom120*(-1 + 2 * ux) + + (Mom200 + Mom000*(-1 + ux)*ux + Mom100*(-1 + 2 * ux))*uy*(1 + uy) + + (Mom210 + Mom010*(-1 + ux)*ux + Mom110*(-1 + 2 * ux))*(1 + 2 * uy))*(-1 + uz)*uz + + (Mom221 + Mom021*(-1 + ux)*ux + Mom121*(-1 + 2 * ux) + + (Mom201 + Mom001*(-1 + ux)*ux + Mom101*(-1 + 2 * ux))*uy*(1 + uy) + + (Mom211 + Mom011*(-1 + ux)*ux + Mom111*(-1 + 2 * ux))*(1 + 2 * uy))*(-1 + 2 * uz)) / 8.; + mfcca = (Mom122 + Mom222 + 2 * Mom122*ux + Mom022*ux*(1 + ux) + (Mom102 + Mom202 + 2 * Mom102*ux + Mom002*ux*(1 + ux))*uy*(1 + uy) + + (Mom112 + Mom212 + 2 * Mom112*ux + Mom012*ux*(1 + ux))*(1 + 2 * uy) + + (Mom120 + Mom220 + 2 * Mom120*ux + Mom020*ux*(1 + ux) + + (Mom100 + Mom200 + 2 * Mom100*ux + Mom000*ux*(1 + ux))*uy*(1 + uy) + + (Mom110 + Mom210 + 2 * Mom110*ux + Mom010*ux*(1 + ux))*(1 + 2 * uy))*(-1 + uz)*uz + + (Mom121 + Mom221 + 2 * Mom121*ux + Mom021*ux*(1 + ux) + + (Mom101 + Mom201 + 2 * Mom101*ux + Mom001*ux*(1 + ux))*uy*(1 + uy) + + (Mom111 + Mom211 + 2 * Mom111*ux + Mom011*ux*(1 + ux))*(1 + 2 * uy))*(-1 + 2 * uz)) / 8.; + + mfbbb = Mom022 - Mom222 - 2 * Mom122*ux - Mom022*pow(ux, 2) - 2 * (Mom212 + 2 * Mom112*ux + Mom012*(-1 + pow(ux, 2)))*uy - + (Mom202 + 2 * Mom102*ux + Mom002*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)) - + 2 * (Mom221 + 2 * Mom121*ux + Mom021*(-1 + pow(ux, 2)) + 2 * (Mom211 + 2 * Mom111*ux + Mom011*(-1 + pow(ux, 2)))*uy + + (Mom201 + 2 * Mom101*ux + Mom001*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)))*uz + + (Mom220 + 2 * Mom120*ux + Mom020*(-1 + pow(ux, 2)) + 2 * (Mom210 + 2 * Mom110*ux + Mom010*(-1 + pow(ux, 2)))*uy + + (Mom200 + 2 * Mom100*ux + Mom000*(-1 + pow(ux, 2)))*(-1 + pow(uy, 2)))*(1 - pow(uz, 2)); + + //////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// +//#ifdef PROOF_CORRECTNESS + LBMReal drho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + //UBLOG(logINFO, "lambda ="<<drho_post); +// //LBMReal dif = fabs(rho - rho_post); +// dif = drho - drho_post; +//#ifdef SINGLEPRECISION +// if (dif > 10.0E-7 || dif < -10.0E-7) +//#else +// if (dif > 10.0E-15 || dif < -10.0E-15) +//#endif +// { +// UB_THROW(UbException(UB_EXARGS, "Flocculation=" + UbSystem::toString(drho) + ", flocculation post=" + UbSystem::toString(drho_post) +// + " dif=" + UbSystem::toString(dif) +// + " Flocculation is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); +// //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): rho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); +// //exit(EXIT_FAILURE); +// } +//#endif + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributionsH)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsH)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsH)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsH)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsH)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsH)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsH)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsH)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsH)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsH)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsH)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsH)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsH)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsH)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; + (*this->nonLocalDistributionsH)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; + (*this->nonLocalDistributionsH)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; + (*this->nonLocalDistributionsH)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsH)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsH)(x1, x2, x3) = mfbbb; + ////////////////////////////////////////////////////////////////////////// + + + } + } + } + } + + } +} +////////////////////////////////////////////////////////////////////////// +double ThixotropyLBMKernel::getCalculationTime() +{ + //return timer.getDuration(); + return timer.getTotalTime(); +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyLBMKernel::setCollisionFactorF(double collFactor) +{ + setCollisionFactor(collFactor); + this->collFactorF = collFactor; + +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyLBMKernel::setCollisionFactorH(double collFactor) +{ + this->collFactorH = collFactor; +} +////////////////////////////////////////////////////////////////////////// +double ThixotropyLBMKernel::getCollisionFactorF() const +{ + return this->collFactorF; +} +////////////////////////////////////////////////////////////////////////// +double ThixotropyLBMKernel::getCollisionFactorH() const +{ + return this->collFactorH; +} +void ThixotropyLBMKernel::setAlpha(double alpha) +{ + this->alpha = alpha; +} +double ThixotropyLBMKernel::getAlpha() const +{ + return this->alpha; +} +void ThixotropyLBMKernel::setTheta(double theta) +{ + this->theta = theta; +} +double ThixotropyLBMKernel::getTheta() const +{ + return this->theta; +} +void ThixotropyLBMKernel::swapDistributions() +{ + LBMKernel::swapDistributions(); + dataSet->getHdistributions()->swap(); +} +////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.h new file mode 100644 index 000000000..c74af1b1e --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.h @@ -0,0 +1,72 @@ +#ifndef ThixotropyLBMKernel_H +#define ThixotropyLBMKernel_H + +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "D3Q27System.h" +#include "basics/utilities/UbTiming.h" +#include "basics/container/CbArray4D.h" +#include "basics/container/CbArray3D.h" + +class ThixotropyLBMKernel; + +//! \brief Cumulant + Fact. Central LBM kernel. +//! \author Hussein +class ThixotropyLBMKernel : public LBMKernel +{ +public: + //! This option set relaxation parameter: NORMAL + enum Parameter { NORMAL, MAGIC }; +public: + ThixotropyLBMKernel(); + virtual ~ThixotropyLBMKernel(void); + virtual void calculate(int step); + virtual SPtr<LBMKernel> clone(); + double getCalculationTime(); + + void setCollisionFactorF(double collFactor); + void setCollisionFactorH(double collFactor); + double getCollisionFactorF() const; + double getCollisionFactorH() const; + + void setAlpha(double alpha); + double getAlpha() const; + + void setTheta(double theta); + double getTheta() const; + + void swapDistributions(); + +protected: + virtual void initDataSet(); + LBMReal f[D3Q27System::ENDF + 1]; + + UbTimer timer; + + LBMReal OxyyMxzz; + Parameter parameter; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsF; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsH; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsH; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsH; + + mu::value_type muX1, muX2, muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; + + LBMReal collFactorF; + LBMReal collFactorH; + + LBMReal theta; + LBMReal alpha; +}; + +#endif + diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.cpp new file mode 100644 index 000000000..8d512f6e3 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.cpp @@ -0,0 +1,895 @@ +#include "ThixotropyModelLBMKernel.h" +#include "D3Q27System.h" +#include "BCArray3D.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include <math.h> +#include "DataSet3D.h" +#include "LBMKernel.h" + +#define PROOF_CORRECTNESS + +ThixotropyModelLBMKernel::ThixotropyModelLBMKernel() : forcingX1(0), forcingX2(0), forcingX3(0) +{ + compressible = false; + OxyyMxzz = 1.0; +} + +ThixotropyModelLBMKernel::~ThixotropyModelLBMKernel() +{ +} + +void ThixotropyModelLBMKernel::calculate(int step) +{ + using namespace D3Q27System; + + //initializing of forcing stuff + if (withForcing) + { + muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); + muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); + muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); + + muDeltaT = deltaT; + + muForcingX1.DefineVar("dt", &muDeltaT); + muForcingX2.DefineVar("dt", &muDeltaT); + muForcingX3.DefineVar("dt", &muDeltaT); + + muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0); + + muForcingX1.DefineVar("nu", &muNu); + muForcingX2.DefineVar("nu", &muNu); + muForcingX3.DefineVar("nu", &muNu); + } + ///////////////////////////////////// + + localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + const int bcArrayMaxX1 = (int)bcArray->getNX1(); + const int bcArrayMaxX2 = (int)bcArray->getNX2(); + const int bcArrayMaxX3 = (int)bcArray->getNX3(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = bcArrayMaxX1 - ghostLayerWidth; + int maxX2 = bcArrayMaxX2 - ghostLayerWidth; + int maxX3 = bcArrayMaxX3 - ghostLayerWidth; + + + { + for (int x3 = minX3; x3 < maxX3; x3++) + { + for (int x2 = minX2; x2 < maxX2; x2++) + { + for (int x1 = minX1; x1 < maxX1; x1++) + { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) + { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + ////////////////////////////////////////////////////////////////////////// + //read distribution + // Cumulant (NSE part) + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + //E N T + //c c c + ////////// + //W S B + //a a a + + //Rest ist b + + //mfxyz + //a - negative + //b - null + //c - positive + + // a b c + //-1 0 1 + + LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + + LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal m0, m1, m2; + + LBMReal rho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + LBMReal collFactorF = collFactor; + + //forcing + /////////////////////////////////////////////////////////////////////////////////////////// + if (withForcing) + { + muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1); + muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2); + muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3); + + forcingX1 = muForcingX1.Eval(); + forcingX2 = muForcingX2.Eval(); + forcingX3 = muForcingX3.Eval(); + + vvx += forcingX1 * deltaT * 0.5; // X + vvy += forcingX2 * deltaT * 0.5; // Y + vvz += forcingX3 * deltaT * 0.5; // Z + } + /////////////////////////////////////////////////////////////////////////////////////////// + LBMReal oMdrho; + + oMdrho = mfccc + mfaaa; + m0 = mfaca + mfcac; + m1 = mfacc + mfcaa; + m2 = mfaac + mfcca; + oMdrho += m0; + m1 += m2; + oMdrho += m1; + m0 = mfbac + mfbca; + m1 = mfbaa + mfbcc; + m0 += m1; + m1 = mfabc + mfcba; + m2 = mfaba + mfcbc; + m1 += m2; + m0 += m1; + m1 = mfacb + mfcab; + m2 = mfaab + mfccb; + m1 += m2; + m0 += m1; + oMdrho += m0; + m0 = mfabb + mfcbb; + m1 = mfbab + mfbcb; + m2 = mfbba + mfbbc; + m0 += m1 + m2; + m0 += mfbbb; //hat gefehlt + oMdrho = 1. - (oMdrho + m0); + + LBMReal vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx * vvx; + vy2 = vvy * vvy; + vz2 = vvz * vvz; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal wadjust; + LBMReal qudricLimit = 0.01; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m2 = mfaaa + mfaac; + m1 = mfaac - mfaaa; + m0 = m2 + mfaab; + mfaaa = m0; + m0 += c1o36 * oMdrho; + mfaab = m1 - m0 * vvz; + mfaac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfabc; + m1 = mfabc - mfaba; + m0 = m2 + mfabb; + mfaba = m0; + m0 += c1o9 * oMdrho; + mfabb = m1 - m0 * vvz; + mfabc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfacc; + m1 = mfacc - mfaca; + m0 = m2 + mfacb; + mfaca = m0; + m0 += c1o36 * oMdrho; + mfacb = m1 - m0 * vvz; + mfacc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbac; + m1 = mfbac - mfbaa; + m0 = m2 + mfbab; + mfbaa = m0; + m0 += c1o9 * oMdrho; + mfbab = m1 - m0 * vvz; + mfbac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbba + mfbbc; + m1 = mfbbc - mfbba; + m0 = m2 + mfbbb; + mfbba = m0; + m0 += c4o9 * oMdrho; + mfbbb = m1 - m0 * vvz; + mfbbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbca + mfbcc; + m1 = mfbcc - mfbca; + m0 = m2 + mfbcb; + mfbca = m0; + m0 += c1o9 * oMdrho; + mfbcb = m1 - m0 * vvz; + mfbcc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcac; + m1 = mfcac - mfcaa; + m0 = m2 + mfcab; + mfcaa = m0; + m0 += c1o36 * oMdrho; + mfcab = m1 - m0 * vvz; + mfcac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcba + mfcbc; + m1 = mfcbc - mfcba; + m0 = m2 + mfcbb; + mfcba = m0; + m0 += c1o9 * oMdrho; + mfcbb = m1 - m0 * vvz; + mfcbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcca + mfccc; + m1 = mfccc - mfcca; + m0 = m2 + mfccb; + mfcca = m0; + m0 += c1o36 * oMdrho; + mfccb = m1 - m0 * vvz; + mfccc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m2 = mfaaa + mfaca; + m1 = mfaca - mfaaa; + m0 = m2 + mfaba; + mfaaa = m0; + m0 += c1o6 * oMdrho; + mfaba = m1 - m0 * vvy; + mfaca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfacb; + m1 = mfacb - mfaab; + m0 = m2 + mfabb; + mfaab = m0; + mfabb = m1 - m0 * vvy; + mfacb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfacc; + m1 = mfacc - mfaac; + m0 = m2 + mfabc; + mfaac = m0; + m0 += c1o18 * oMdrho; + mfabc = m1 - m0 * vvy; + mfacc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbca; + m1 = mfbca - mfbaa; + m0 = m2 + mfbba; + mfbaa = m0; + m0 += c2o3 * oMdrho; + mfbba = m1 - m0 * vvy; + mfbca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbab + mfbcb; + m1 = mfbcb - mfbab; + m0 = m2 + mfbbb; + mfbab = m0; + mfbbb = m1 - m0 * vvy; + mfbcb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbac + mfbcc; + m1 = mfbcc - mfbac; + m0 = m2 + mfbbc; + mfbac = m0; + m0 += c2o9 * oMdrho; + mfbbc = m1 - m0 * vvy; + mfbcc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcca; + m1 = mfcca - mfcaa; + m0 = m2 + mfcba; + mfcaa = m0; + m0 += c1o6 * oMdrho; + mfcba = m1 - m0 * vvy; + mfcca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcab + mfccb; + m1 = mfccb - mfcab; + m0 = m2 + mfcbb; + mfcab = m0; + mfcbb = m1 - m0 * vvy; + mfccb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcac + mfccc; + m1 = mfccc - mfcac; + m0 = m2 + mfcbc; + mfcac = m0; + m0 += c1o18 * oMdrho; + mfcbc = m1 - m0 * vvy; + mfccc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m2 = mfaaa + mfcaa; + m1 = mfcaa - mfaaa; + m0 = m2 + mfbaa; + mfaaa = m0; + m0 += 1. * oMdrho; + mfbaa = m1 - m0 * vvx; + mfcaa = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfcba; + m1 = mfcba - mfaba; + m0 = m2 + mfbba; + mfaba = m0; + mfbba = m1 - m0 * vvx; + mfcba = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfcca; + m1 = mfcca - mfaca; + m0 = m2 + mfbca; + mfaca = m0; + m0 += c1o3 * oMdrho; + mfbca = m1 - m0 * vvx; + mfcca = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfcab; + m1 = mfcab - mfaab; + m0 = m2 + mfbab; + mfaab = m0; + mfbab = m1 - m0 * vvx; + mfcab = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabb + mfcbb; + m1 = mfcbb - mfabb; + m0 = m2 + mfbbb; + mfabb = m0; + mfbbb = m1 - m0 * vvx; + mfcbb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacb + mfccb; + m1 = mfccb - mfacb; + m0 = m2 + mfbcb; + mfacb = m0; + mfbcb = m1 - m0 * vvx; + mfccb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfcac; + m1 = mfcac - mfaac; + m0 = m2 + mfbac; + mfaac = m0; + m0 += c1o3 * oMdrho; + mfbac = m1 - m0 * vvx; + mfcac = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabc + mfcbc; + m1 = mfcbc - mfabc; + m0 = m2 + mfbbc; + mfabc = m0; + mfbbc = m1 - m0 * vvx; + mfcbc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacc + mfccc; + m1 = mfccc - mfacc; + m0 = m2 + mfbcc; + mfacc = m0; + m0 += c1o9 * oMdrho; + mfbcc = m1 - m0 * vvx; + mfccc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity + LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// + //LBMReal OxyyMxzz = 1.;//2+s9;// + LBMReal O4 = 1.; + LBMReal O5 = 1.; + LBMReal O6 = 1.; + + //Cum 4. + //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); + LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); + LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); + + //Cum 5. + LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho; + LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho; + LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho; + + //Cum 6. + LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho; + + //2. + // linear combinations + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + LBMReal dxux = -c1o2 * collFactorF * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + LBMReal dyuy = dxux + collFactorF * c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorF * c3o2 * mxxMzz; + + LBMReal Dxy = -three * collFactorF * mfbba; + LBMReal Dxz = -three * collFactorF * mfbab; + LBMReal Dyz = -three * collFactorF * mfabb; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //non Newtonian fluid collision factor + LBMReal shearRate = sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one); + collFactorF = getThyxotropyCollFactor(collFactorF, shearRate, rho); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + //relax + mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += collFactorF * (-mxxMyy) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += collFactorF * (-mxxMzz) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vz2 * dzuz); + + mfabb += collFactorF * (-mfabb); + mfbab += collFactorF * (-mfbab); + mfbba += collFactorF * (-mfbba); + + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + //relax + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); + mxyyMxzz += wadjust * (-mxyyMxzz); + + // linear combinations back + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + CUMacc += O4 * (-CUMacc); + CUMcac += O4 * (-CUMcac); + CUMcca += O4 * (-CUMcca); + + CUMbbc += O4 * (-CUMbbc); + CUMbcb += O4 * (-CUMbcb); + CUMcbb += O4 * (-CUMcbb); + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + //back cumulants to central moments + //4. + //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho; + mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho; + mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho; + + //5. + mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho; + mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho; + mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho; + + //6. + mfccc = CUMccc - ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho; + + //////////////////////////////////////////////////////////////////////////////////// + //forcing + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + ////////////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2; + m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2; + mfaaa = m0; + mfaab = m1; + mfaac = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; + m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2); + m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; + mfaba = m0; + mfabb = m1; + mfabc = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfaca = m0; + mfacb = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; + m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2); + m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; + mfbaa = m0; + mfbab = m1; + mfbac = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; + m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2); + m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; + mfbba = m0; + mfbbb = m1; + mfbbc = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; + m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2); + m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; + mfbca = m0; + mfbcb = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfcaa = m0; + mfcab = m1; + mfcac = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; + m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2); + m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; + mfcba = m0; + mfcbb = m1; + mfcbc = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2; + m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; + mfcca = m0; + mfccb = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaaa = m0; + mfaba = m1; + mfaca = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2; + m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; + mfaab = m0; + mfabb = m1; + mfacb = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaac = m0; + mfabc = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; + m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2); + m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; + mfbaa = m0; + mfbba = m1; + mfbca = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; + m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2); + m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; + mfbab = m0; + mfbbb = m1; + mfbcb = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; + m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2); + m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; + mfbac = m0; + mfbbc = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcaa = m0; + mfcba = m1; + mfcca = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2; + m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; + mfcab = m0; + mfcbb = m1; + mfccb = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcac = m0; + mfcbc = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaaa = m0; + mfbaa = m1; + mfcaa = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaba = m0; + mfbba = m1; + mfcba = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaca = m0; + mfbca = m1; + mfcca = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaab = m0; + mfbab = m1; + mfcab = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2; + m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabb = m0; + mfbbb = m1; + mfcbb = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfacb = m0; + mfbcb = m1; + mfccb = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaac = m0; + mfbac = m1; + mfcac = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabc = m0; + mfbbc = m1; + mfcbc = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfacc = m0; + mfbcc = m1; + mfccc = m2; + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// +#ifdef PROOF_CORRECTNESS + LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + //LBMReal dif = fabs(rho - rho_post); + LBMReal dif = rho - rho_post; +#ifdef SINGLEPRECISION + if (dif > 10.0E-7 || dif < -10.0E-7) +#else + if (dif > 10.0E-15 || dif < -10.0E-15) +#endif + { + UB_THROW(UbException(UB_EXARGS, "rho=" + UbSystem::toString(rho) + ", rho_post=" + UbSystem::toString(rho_post) + + " dif=" + UbSystem::toString(dif) + + " rho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); + //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): rho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); + //exit(EXIT_FAILURE); + } +#endif + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb; + } + } + } + } + + } +} + +//SPtr<LBMKernel> ThixotropyModelLBMKernel::clone() +//{ +// SPtr<LBMKernel> kernel(new ThixotropyModelLBMKernel()); +// kernel->setNX(nx); +// kernel->setCollisionFactor(collFactor); +// collFactorF = collFactor; +// dynamicPointerCast<ThixotropyModelLBMKernel>(kernel)->initDataSet(); +// kernel->setBCProcessor(bcProcessor->clone(kernel)); +// kernel->setWithForcing(withForcing); +// kernel->setForcingX1(muForcingX1); +// kernel->setForcingX2(muForcingX2); +// kernel->setForcingX3(muForcingX3); +// kernel->setIndex(ix1, ix2, ix3); +// kernel->setDeltaT(deltaT); +// +// return kernel; +//} + +double ThixotropyModelLBMKernel::getCalculationTime() +{ + return timer.getTotalTime(); +} + +void ThixotropyModelLBMKernel::swapDistributions() +{ + LBMKernel::swapDistributions(); +} + +void ThixotropyModelLBMKernel::initDataSet() +{ + SPtr<DistributionArray3D> df(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.0)); + dataSet->setFdistributions(df); +} diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.h new file mode 100644 index 000000000..d3210a084 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel.h @@ -0,0 +1,51 @@ +#ifndef ThixotropyModelLBMKernel_H +#define ThixotropyModelLBMKernel_H + +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "D3Q27System.h" +#include "basics/utilities/UbTiming.h" +#include "basics/container/CbArray4D.h" +#include "basics/container/CbArray3D.h" + +class ThixotropyModelLBMKernel; + +//! \brief abstract class for Template Method use Cumulant LBM. +//! \author K. Kutscher, M. Geier +class ThixotropyModelLBMKernel : public LBMKernel +{ +public: + ThixotropyModelLBMKernel(); + virtual ~ThixotropyModelLBMKernel(); + void calculate(int step); + virtual SPtr<LBMKernel> clone() { UB_THROW(UbException("SPtr<LBMKernel> clone() - belongs in the derived class")); }; + double getCalculationTime(); + + void swapDistributions(); + +protected: + void initDataSet(); + + virtual LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const { UB_THROW(UbException("LBMReal getThyxotropyCollFactor() - belongs in the derived class")); } + + LBMReal f[D3Q27System::ENDF + 1]; + + UbTimer timer; + + LBMReal OxyyMxzz; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsF; + + mu::value_type muX1, muX2, muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; + + bool test; +}; + +#endif diff --git a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp index 49d945ceb..5b61b8565 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp @@ -39,8 +39,20 @@ #include "D3Q27EsoTwist3DSplittedVector.h" #include "DataSet3D.h" #include "Grid3D.h" -#include "Grid3DSystem.h" -#include "LBMKernel.h" +#include "BCAdapter.h" +#include "Block3D.h" +#include "BCArray3D.h" + +#include "DensityAndThixotropyBCAlgorithm.h" +#include "VelocityAndThixotropyBCAlgorithm.h" +#include "NoSlipAndThixotropyBCAlgorithm.h" +#include "NonReflectingOutflowAndThixotropyBCAlgorithm.h" +#include "VelocityWithDensityAndThixotropyBCAlgorithm.h" + + +BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : +Block3DVisitor(0, Grid3DSystem::MAXLEVEL) +{ BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) {} ////////////////////////////////////////////////////////////////////////// @@ -86,19 +98,48 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc char alg = bcPtr->getBcAlgorithmType(); SPtr<BCAlgorithm> bca = bcMap[alg]; - if (bca) { - bca = bca->clone(); - bca->setNodeIndex(x1, x2, x3); - bca->setBcPointer(bcPtr); - bca->addDistributions(distributions); - bca->setCollFactor(collFactor); - bca->setCompressible(compressible); - bca->setBcArray(bcArray); - bcProcessor->addBC(bca); - } - } - } - } + for (int x3 = minX3; x3 < maxX3; x3++) + { + for (int x2 = minX2; x2 < maxX2; x2++) + { + for (int x1 = minX1; x1 < maxX1; x1++) + { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) + { + if ((bcPtr = bcArray->getBC(x1, x2, x3)) != NULL) + { + char alg = bcPtr->getBcAlgorithmType(); + SPtr<BCAlgorithm> bca = bcMap[alg]; + + if (bca) + { + bca = bca->clone(); + bca->setNodeIndex(x1, x2, x3); + bca->setBcPointer(bcPtr); + bca->addDistributions(distributions); + //if (bca->getThixotropy()) + //{ + // std::static_pointer_cast<DensityAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions()); + // std::static_pointer_cast<DensityAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions()); + //} + if(alg == BCAlgorithm::VelocityAndThixotropyBCAlgorithm) + std::static_pointer_cast<VelocityAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions()); + if (alg == BCAlgorithm::DensityAndThixotropyBCAlgorithm) + std::static_pointer_cast<DensityAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions()); + if (alg == BCAlgorithm::NoSlipAndThixotropyBCAlgorithm) + std::static_pointer_cast<NoSlipAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions()); + if (alg == BCAlgorithm::NonReflectingOutflowAndThixotropyBCAlgorithm) + std::static_pointer_cast<NonReflectingOutflowAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions()); + if (alg == BCAlgorithm::VelocityWithDensityAndThixotropyBCAlgorithm) + std::static_pointer_cast<VelocityWithDensityAndThixotropyBCAlgorithm>(bca)->addDistributionsH(kernel->getDataSet()->getHdistributions()); + + bca->setCollFactor(collFactor); + bca->setCompressible(compressible); + bca->setBcArray(bcArray); + bcProcessor->addBC(bca); + } + } + } } } } diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp index c424a6376..c17d8f659 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp @@ -123,195 +123,180 @@ void InitDistributionsBlockVisitor::setRho(LBMReal rho) ////////////////////////////////////////////////////////////////////////// void InitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<Block3D> block) { - using namespace D3Q27System; - - if (!block) - UB_THROW(UbException(UB_EXARGS, "block is not exist")); - - // UbTupleDouble3 blockLengths = grid->getBlockLengths(block); - // UbTupleDouble3 nodeOffset = grid->getNodeOffset(block); - double dx = grid->getDeltaX(block); - - // define vars for functions - mu::value_type x1, x2, x3; - this->muVx1.DefineVar("x1", &x1); - this->muVx1.DefineVar("x2", &x2); - this->muVx1.DefineVar("x3", &x3); - this->muVx2.DefineVar("x1", &x1); - this->muVx2.DefineVar("x2", &x2); - this->muVx2.DefineVar("x3", &x3); - this->muVx3.DefineVar("x1", &x1); - this->muVx3.DefineVar("x2", &x2); - this->muVx3.DefineVar("x3", &x3); - this->muRho.DefineVar("x1", &x1); - this->muRho.DefineVar("x2", &x2); - this->muRho.DefineVar("x3", &x3); - - using CalcFeqsFct = void (*)(LBMReal *const & /*feq[27]*/, const LBMReal & /*(d)rho*/, const LBMReal & /*vx1*/, - const LBMReal & /*vx2*/, const LBMReal & /*vx3*/); - CalcFeqsFct calcFeqsFct = NULL; - - LBMReal vx1, vx2, vx3, rho; - - int gridRank = grid->getRank(); - int blockRank = block->getRank(); - - if (blockRank == gridRank && block->isActive()) { - SPtr<ILBMKernel> kernel = block->getKernel(); - if (!kernel) - throw UbException(UB_EXARGS, "The LBM kernel isn't exist in block: " + block->toString()); - - if (kernel->getCompressible()) - calcFeqsFct = &D3Q27System::calcCompFeq; - else - calcFeqsFct = &D3Q27System::calcIncompFeq; - - // UbTupleDouble3 org = grid->getBlockWorldCoordinates(block); - - SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); - SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); - - LBMReal o = kernel->getCollisionFactor(); - - LBMReal f[D3Q27System::ENDF + 1]; - - for (size_t ix3 = 0; ix3 < bcArray->getNX3(); ix3++) - for (size_t ix2 = 0; ix2 < bcArray->getNX2(); ix2++) - for (size_t ix1 = 0; ix1 < bcArray->getNX1(); ix1++) { - Vector3D coords = grid->getNodeCoordinates(block, ix1, ix2, ix3); - x1 = coords[0]; - x2 = coords[1]; - x3 = coords[2]; - - vx1 = muVx1.Eval(); - vx2 = muVx2.Eval(); - vx3 = muVx3.Eval(); - rho = muRho.Eval(); - - // x-derivative - double deltaX = dx * 0.5; - x1 = coords[0] + deltaX; - double vx1Plusx1 = muVx1.Eval(); - double vx2Plusx1 = muVx2.Eval(); - double vx3Plusx1 = muVx3.Eval(); - - x1 = coords[0] - deltaX; - double vx1Minusx1 = muVx1.Eval(); - double vx2Minusx1 = muVx2.Eval(); - double vx3Minusx1 = muVx3.Eval(); - - // y-derivative - x1 = coords[0]; - x2 = coords[1] + deltaX; - double vx1Plusx2 = muVx1.Eval(); - double vx2Plusx2 = muVx2.Eval(); - double vx3Plusx2 = muVx3.Eval(); - - x2 = coords[1] - deltaX; - double vx1Minusx2 = muVx1.Eval(); - double vx2Minusx2 = muVx2.Eval(); - double vx3Minusx2 = muVx3.Eval(); - - // z-derivative - x2 = coords[1]; - x3 = coords[2] + deltaX; - double vx1Plusx3 = muVx1.Eval(); - double vx2Plusx3 = muVx2.Eval(); - double vx3Plusx3 = muVx3.Eval(); - - x3 = coords[2] - deltaX; - double vx1Minusx3 = muVx1.Eval(); - double vx2Minusx3 = muVx2.Eval(); - double vx3Minusx3 = muVx3.Eval(); - - double ax = (vx1Plusx1 - vx1Minusx1) / (2.0 * deltaX) * dx; - double bx = (vx2Plusx1 - vx2Minusx1) / (2.0 * deltaX) * dx; - double cx = (vx3Plusx1 - vx3Minusx1) / (2.0 * deltaX) * dx; - - double ay = (vx1Plusx2 - vx1Minusx2) / (2.0 * deltaX) * dx; - double by = (vx2Plusx2 - vx2Minusx2) / (2.0 * deltaX) * dx; - double cy = (vx3Plusx2 - vx3Minusx2) / (2.0 * deltaX) * dx; - - double az = (vx1Plusx3 - vx1Minusx3) / (2.0 * deltaX) * dx; - double bz = (vx2Plusx3 - vx2Minusx3) / (2.0 * deltaX) * dx; - double cz = (vx3Plusx3 - vx3Minusx3) / (2.0 * deltaX) * dx; - double eps_new = 1.0; - LBMReal op = 1.; - - LBMReal feq[27]; - - calcFeqsFct(feq, rho, vx1, vx2, vx3); - - double f_E = - eps_new * - ((5. * ax * o + 5. * by * o + 5. * cz * o - 8. * ax * op + 4. * by * op + 4. * cz * op) / - (54. * o * op)); - double f_N = f_E + eps_new * ((2. * (ax - by)) / (9. * o)); - double f_T = f_E + eps_new * ((2. * (ax - cz)) / (9. * o)); - double f_NE = - eps_new * - (-(5. * cz * o + 3. * (ay + bx) * op - 2. * cz * op + ax * (5. * o + op) + by * (5. * o + op)) / - (54. * o * op)); - double f_SE = f_NE + eps_new * ((ay + bx) / (9. * o)); - double f_TE = - eps_new * - (-(5. * cz * o + by * (5. * o - 2. * op) + 3. * (az + cx) * op + cz * op + ax * (5. * o + op)) / - (54. * o * op)); - double f_BE = f_TE + eps_new * ((az + cx) / (9. * o)); - double f_TN = eps_new * (-(5. * ax * o + 5. * by * o + 5. * cz * o - 2. * ax * op + by * op + - 3. * bz * op + 3. * cy * op + cz * op) / - (54. * o * op)); - double f_BN = f_TN + eps_new * ((bz + cy) / (9. * o)); - double f_ZERO = eps_new * ((5. * (ax + by + cz)) / (9. * op)); - double f_TNE = eps_new * (-(ay + az + bx + bz + cx + cy) / (72. * o)); - double f_TSW = -eps_new * ((ay + bx) / (36. * o)) - f_TNE; - double f_TSE = -eps_new * ((az + cx) / (36. * o)) - f_TNE; - double f_TNW = -eps_new * ((bz + cy) / (36. * o)) - f_TNE; - - f[E] = f_E + feq[E]; - f[W] = f_E + feq[W]; - f[N] = f_N + feq[N]; - f[S] = f_N + feq[S]; - f[T] = f_T + feq[T]; - f[B] = f_T + feq[B]; - f[NE] = f_NE + feq[NE]; - f[SW] = f_NE + feq[SW]; - f[SE] = f_SE + feq[SE]; - f[NW] = f_SE + feq[NW]; - f[TE] = f_TE + feq[TE]; - f[BW] = f_TE + feq[BW]; - f[BE] = f_BE + feq[BE]; - f[TW] = f_BE + feq[TW]; - f[TN] = f_TN + feq[TN]; - f[BS] = f_TN + feq[BS]; - f[BN] = f_BN + feq[BN]; - f[TS] = f_BN + feq[TS]; - f[TNE] = f_TNE + feq[TNE]; - f[TNW] = f_TNW + feq[TNW]; - f[TSE] = f_TSE + feq[TSE]; - f[TSW] = f_TSW + feq[TSW]; - f[BNE] = f_TSW + feq[BNE]; - f[BNW] = f_TSE + feq[BNW]; - f[BSE] = f_TNW + feq[BSE]; - f[BSW] = f_TNE + feq[BSW]; - f[ZERO] = f_ZERO + feq[ZERO]; - - // calcFeqsFct(f,rho,vx1,vx2,vx3); - // distributions->setDistribution(f, ix1, ix2, ix3); - distributions->setDistributionInv(f, ix1, ix2, ix3); - - // distributions->swap(); - // distributions->setDistribution(f, ix1, ix2, ix3); - // distributions->setDistributionInv(f, ix1, ix2, ix3); - // distributions->swap(); - } - } + using namespace D3Q27System; + + if(!block) UB_THROW( UbException(UB_EXARGS,"block is not exist") ); + + double dx = grid->getDeltaX(block); + + //define vars for functions + mu::value_type x1,x2,x3; + this->muVx1.DefineVar("x1",&x1); this->muVx1.DefineVar("x2",&x2); this->muVx1.DefineVar("x3",&x3); + this->muVx2.DefineVar("x1",&x1); this->muVx2.DefineVar("x2",&x2); this->muVx2.DefineVar("x3",&x3); + this->muVx3.DefineVar("x1",&x1); this->muVx3.DefineVar("x2",&x2); this->muVx3.DefineVar("x3",&x3); + this->muRho.DefineVar("x1",&x1); this->muRho.DefineVar("x2",&x2); this->muRho.DefineVar("x3",&x3); + + //Funktionszeiger + typedef void (*CalcFeqsFct)(LBMReal* const& /*feq[27]*/,const LBMReal& /*(d)rho*/,const LBMReal& /*vx1*/,const LBMReal& /*vx2*/,const LBMReal& /*vx3*/); + CalcFeqsFct calcFeqsFct = NULL; + + LBMReal vx1,vx2,vx3,rho; + + int gridRank = grid->getRank(); + int blockRank = block->getRank(); + + if (blockRank == gridRank && block->isActive()) + { + SPtr<ILBMKernel> kernel = block->getKernel(); + if (!kernel) + throw UbException(UB_EXARGS, "The LBM kernel isn't exist in block: "+block->toString()); + + if(kernel->getCompressible()) + calcFeqsFct = &D3Q27System::calcCompFeq; + else + calcFeqsFct = &D3Q27System::calcIncompFeq; + + SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); + SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); + + LBMReal o = kernel->getCollisionFactor(); + + LBMReal f[D3Q27System::ENDF+1]; + + size_t nx1 = distributions->getNX1(); + size_t nx2 = distributions->getNX2(); + size_t nx3 = distributions->getNX3(); + + for(int ix3=0; ix3<bcArray->getNX3(); ix3++) + for(int ix2=0; ix2<bcArray->getNX2(); ix2++) + for(int ix1=0; ix1<bcArray->getNX1(); ix1++) + { + Vector3D coords = grid->getNodeCoordinates(block, ix1, ix2, ix3); + x1 = coords[0]; + x2 = coords[1]; + x3 = coords[2]; + + vx1 = muVx1.Eval(); + vx2 = muVx2.Eval(); + vx3 = muVx3.Eval(); + rho = muRho.Eval(); + + //x-derivative + double deltaX=dx*0.5; + x1 = coords[0]+deltaX; + double vx1Plusx1 = muVx1.Eval(); + double vx2Plusx1 = muVx2.Eval(); + double vx3Plusx1 = muVx3.Eval(); + + x1 = coords[0]-deltaX; + double vx1Minusx1 = muVx1.Eval(); + double vx2Minusx1 = muVx2.Eval(); + double vx3Minusx1 = muVx3.Eval(); + + //y-derivative + x1 = coords[0]; + x2 = coords[1]+deltaX; + double vx1Plusx2 = muVx1.Eval(); + double vx2Plusx2 = muVx2.Eval(); + double vx3Plusx2 = muVx3.Eval(); + + x2 = coords[1]-deltaX; + double vx1Minusx2 = muVx1.Eval(); + double vx2Minusx2 = muVx2.Eval(); + double vx3Minusx2 = muVx3.Eval(); + + //z-derivative + x2 = coords[1]; + x3 = coords[2]+deltaX; + double vx1Plusx3 = muVx1.Eval(); + double vx2Plusx3 = muVx2.Eval(); + double vx3Plusx3 = muVx3.Eval(); + + x3 = coords[2]-deltaX; + double vx1Minusx3 = muVx1.Eval(); + double vx2Minusx3 = muVx2.Eval(); + double vx3Minusx3 = muVx3.Eval(); + + double ax=(vx1Plusx1-vx1Minusx1)/(2.0*deltaX)*dx; + double bx=(vx2Plusx1-vx2Minusx1)/(2.0*deltaX)*dx; + double cx=(vx3Plusx1-vx3Minusx1)/(2.0*deltaX)*dx; + + double ay=(vx1Plusx2-vx1Minusx2)/(2.0*deltaX)*dx; + double by=(vx2Plusx2-vx2Minusx2)/(2.0*deltaX)*dx; + double cy=(vx3Plusx2-vx3Minusx2)/(2.0*deltaX)*dx; + + double az=(vx1Plusx3-vx1Minusx3)/(2.0*deltaX)*dx; + double bz=(vx2Plusx3-vx2Minusx3)/(2.0*deltaX)*dx; + double cz=(vx3Plusx3-vx3Minusx3)/(2.0*deltaX)*dx; + double eps_new=1.0; + LBMReal op = 1.; + + LBMReal feq[27]; + + calcFeqsFct(feq,rho,vx1,vx2,vx3); + + double f_E = eps_new *((5.*ax*o + 5.*by*o + 5.*cz*o - 8.*ax*op + 4.*by*op + 4.*cz*op)/(54.*o*op)); + double f_N = f_E + eps_new *((2.*(ax - by))/(9.*o)); + double f_T = f_E + eps_new *((2.*(ax - cz))/(9.*o)); + double f_NE = eps_new *(-(5.*cz*o + 3.*(ay + bx)*op - 2.*cz*op + ax*(5.*o + op) + by*(5.*o + op))/(54.*o*op)); + double f_SE = f_NE + eps_new *(( ay + bx )/(9.*o)); + double f_TE = eps_new *(-(5.*cz*o + by*(5.*o - 2.*op) + 3.*(az + cx)*op + cz*op + ax*(5.*o + op))/(54.*o*op)); + double f_BE = f_TE + eps_new *(( az + cx )/(9.*o)); + double f_TN = eps_new *(-(5.*ax*o + 5.*by*o + 5.*cz*o - 2.*ax*op + by*op + 3.*bz*op + 3.*cy*op + cz*op)/(54.*o*op)); + double f_BN = f_TN + eps_new *(( bz + cy )/(9.*o)); + double f_ZERO = eps_new *((5.*(ax + by + cz))/(9.*op)); + double f_TNE = eps_new *(-(ay + az + bx + bz + cx + cy)/(72.*o)); + double f_TSW = - eps_new *((ay + bx)/(36.*o)) - f_TNE; + double f_TSE = - eps_new *((az + cx)/(36.*o)) - f_TNE; + double f_TNW = - eps_new *((bz + cy)/(36.*o)) - f_TNE; + + + f[E] = f_E + feq[E]; + f[W] = f_E + feq[W]; + f[N] = f_N + feq[N]; + f[S] = f_N + feq[S]; + f[T] = f_T + feq[T]; + f[B] = f_T + feq[B]; + f[NE] = f_NE + feq[NE]; + f[SW] = f_NE + feq[SW]; + f[SE] = f_SE + feq[SE]; + f[NW] = f_SE + feq[NW]; + f[TE] = f_TE + feq[TE]; + f[BW] = f_TE + feq[BW]; + f[BE] = f_BE + feq[BE]; + f[TW] = f_BE + feq[TW]; + f[TN] = f_TN + feq[TN]; + f[BS] = f_TN + feq[BS]; + f[BN] = f_BN + feq[BN]; + f[TS] = f_BN + feq[TS]; + f[TNE] = f_TNE + feq[TNE]; + f[TNW] = f_TNW + feq[TNW]; + f[TSE] = f_TSE + feq[TSE]; + f[TSW] = f_TSW + feq[TSW]; + f[BNE] = f_TSW + feq[BNE]; + f[BNW] = f_TSE + feq[BNW]; + f[BSE] = f_TNW + feq[BSE]; + f[BSW] = f_TNE + feq[BSW]; + f[ZERO] = f_ZERO + feq[ZERO]; + + //calcFeqsFct(f,rho,vx1,vx2,vx3); + distributions->setDistribution(f, ix1, ix2, ix3); + distributions->setDistributionInv(f, ix1, ix2, ix3); + + //distributions->swap(); + //distributions->setDistribution(f, ix1, ix2, ix3); + //distributions->setDistributionInv(f, ix1, ix2, ix3); + //distributions->swap(); + + } + } + + //variablen der functions loeschen, da die verwiesenen Objecte nach dem verlassen des scopes ungueltig sind! + this->muVx1.ClearVar(); + this->muVx2.ClearVar(); + this->muVx3.ClearVar(); + this->muRho.ClearVar(); - // variablen der functions loeschen, da die verwiesenen Objecte nach dem verlassen des scopes ungueltig sind! - this->muVx1.ClearVar(); - this->muVx2.ClearVar(); - this->muVx3.ClearVar(); - this->muRho.ClearVar(); } ////////////////////////////////////////////////////////////////////////// void InitDistributionsBlockVisitor::checkFunction(mu::Parser fct) diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp new file mode 100644 index 000000000..70d7874f2 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp @@ -0,0 +1,435 @@ +#include "InitThixotropyBlockVisitor.h" +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "Grid3DSystem.h" +#include "DataSet3D.h" +#include "EsoTwist3D.h" +#include "Grid3D.h" +#include "Block3D.h" +#include "BCArray3D.h" + +InitThixotropyBlockVisitor::InitThixotropyBlockVisitor() + : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) +{ + //this->setVx1(0.0); + //this->setVx2(0.0); + //this->setVx3(0.0); + //this->setRho(0.0); + //this->setf1(0.0); + //this->setf2(0.0); + //this->setf3(0.0); + //this->setConcentration(0.0); + this->setLambda(0.0); +} +////////////////////////////////////////////////////////////////////////// +//InitThixotropyBlockVisitor::InitThixotropyBlockVisitor(LBMReal lambda /*LBMReal nu, LBMReal D, LBMReal rho, LBMReal vx1, LBMReal vx2, LBMReal vx3, LBMReal c, LBMReal f1, LBMReal f2, LBMReal f3*/) +// : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) +//{ +// //this->setVx1(vx1); +// //this->setVx2(vx2); +// //this->setVx3(vx3); +// //this->setRho(rho); +// //this->setf1(vx1); +// //this->setf2(vx2); +// //this->setf3(vx3); +// //this->setConcentration(rho); +// //this->setNu(nu); +// //this->setD(D); +// this->setLambda(lambda); +//} +////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setVx1(const mu::Parser& parser) +//{ +// this->checkFunction(parser); +// this->muVx1 = parser; +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setVx2(const mu::Parser& parser) +//{ +// this->checkFunction(parser); +// this->muVx2 = parser; +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setVx3(const mu::Parser& parser) +//{ +// this->checkFunction(parser); +// this->muVx3 = parser; +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setRho(const mu::Parser& parser) +//{ +// this->checkFunction(parser); +// this->muRho = parser; +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setf1(const mu::Parser& parser) +//{ +// this->checkFunction(parser); +// this->muf1 = parser; +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setf2(const mu::Parser& parser) +//{ +// this->checkFunction(parser); +// this->muf2 = parser; +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setf3(const mu::Parser& parser) +//{ +// this->checkFunction(parser); +// this->muf3 = parser; +//} +//////////////////////////////////////////////////////////////////////////// +void InitThixotropyBlockVisitor::setLambda(const mu::Parser& parser) +{ + this->checkFunction(parser); + this->muLambda = parser; +} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setVx1(const std::string& muParserString) +//{ +// this->muVx1.SetExpr(muParserString); +// this->checkFunction(muVx1); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setVx2(const std::string& muParserString) +//{ +// this->muVx2.SetExpr(muParserString); +// this->checkFunction(muVx2); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setVx3(const std::string& muParserString) +//{ +// this->muVx3.SetExpr(muParserString); +// this->checkFunction(muVx3); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setRho(const std::string& muParserString) +//{ +// this->muRho.SetExpr(muParserString); +// this->checkFunction(muRho); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setf1(const std::string& muParserString) +//{ +// this->muf1.SetExpr(muParserString); +// this->checkFunction(muf1); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setf2(const std::string& muParserString) +//{ +// this->muf2.SetExpr(muParserString); +// this->checkFunction(muf2); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setf3(const std::string& muParserString) +//{ +// this->muf3.SetExpr(muParserString); +// this->checkFunction(muf3); +//} +//////////////////////////////////////////////////////////////////////////// +void InitThixotropyBlockVisitor::setLambda(const std::string& muParserString) +{ + this->muLambda.SetExpr(muParserString); + this->checkFunction(muLambda); +} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setVx1(LBMReal vx1) +//{ +// this->muVx1.SetExpr(UbSystem::toString(vx1, D3Q27RealLim::digits10)); +// this->checkFunction(muVx1); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setVx2(LBMReal vx2) +//{ +// this->muVx2.SetExpr(UbSystem::toString(vx2, D3Q27RealLim::digits10)); +// this->checkFunction(muVx2); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setVx3(LBMReal vx3) +//{ +// this->muVx3.SetExpr(UbSystem::toString(vx3, D3Q27RealLim::digits10)); +// this->checkFunction(muVx3); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setRho(LBMReal rho) +//{ +// this->muRho.SetExpr(UbSystem::toString(rho, D3Q27RealLim::digits10)); +// this->checkFunction(muRho); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setf1(LBMReal f1) +//{ +// this->muf1.SetExpr(UbSystem::toString(f1, D3Q27RealLim::digits10)); +// this->checkFunction(muf1); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setf2(LBMReal f2) +//{ +// this->muf2.SetExpr(UbSystem::toString(f2, D3Q27RealLim::digits10)); +// this->checkFunction(muf2); +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setf3(LBMReal f3) +//{ +// this->muf3.SetExpr(UbSystem::toString(f3, D3Q27RealLim::digits10)); +// this->checkFunction(muf3); +//} +////////////////////////////////////////////////////////////////////////// +void InitThixotropyBlockVisitor::setLambda(LBMReal lambda) +{ + this->muLambda.SetExpr(UbSystem::toString(lambda, D3Q27RealLim::digits10)); + this->checkFunction(muLambda); +} +////////////////////////////////////////////////////////////////////////// +void InitThixotropyBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<Block3D> block) +{ + using namespace D3Q27System; + + if(!block) UB_THROW( UbException(UB_EXARGS,"block is not exist") ); + + double dx = grid->getDeltaX(block); + + //define vars for functions + mu::value_type x1,x2,x3; + //this->muVx1.DefineVar("x1",&x1); this->muVx1.DefineVar("x2",&x2); this->muVx1.DefineVar("x3",&x3); + //this->muVx2.DefineVar("x1",&x1); this->muVx2.DefineVar("x2",&x2); this->muVx2.DefineVar("x3",&x3); + //this->muVx3.DefineVar("x1",&x1); this->muVx3.DefineVar("x2",&x2); this->muVx3.DefineVar("x3",&x3); + //this->muRho.DefineVar("x1",&x1); this->muRho.DefineVar("x2",&x2); this->muRho.DefineVar("x3",&x3); + + this->muLambda.DefineVar("x1",&x1); this->muLambda.DefineVar("x2",&x2); this->muLambda.DefineVar("x3",&x3); + + //Funktionszeiger + typedef void (*CalcFeqsFct)(LBMReal* const& /*feq[27]*/,const LBMReal& /*(d)rho*/,const LBMReal& /*vx1*/,const LBMReal& /*vx2*/,const LBMReal& /*vx3*/); + CalcFeqsFct calcFeqsFct = NULL; + + LBMReal vx1,vx2,vx3,rho; + + int gridRank = grid->getRank(); + int blockRank = block->getRank(); + + if (blockRank == gridRank && block->isActive()) + { + SPtr<ILBMKernel> kernel = block->getKernel(); + if (!kernel) + throw UbException(UB_EXARGS, "The LBM kernel isn't exist in block: "+block->toString()); + + if(kernel->getCompressible()) + calcFeqsFct = &D3Q27System::calcCompFeq; + else + calcFeqsFct = &D3Q27System::calcIncompFeq; + + SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); + SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getHdistributions(); + + LBMReal o = kernel->getCollisionFactor(); + + LBMReal h[D3Q27System::ENDF+1]; + + size_t nx1 = distributions->getNX1(); + size_t nx2 = distributions->getNX2(); + size_t nx3 = distributions->getNX3(); + + for(int ix3=0; ix3<bcArray->getNX3(); ix3++) + for(int ix2=0; ix2<bcArray->getNX2(); ix2++) + for(int ix1=0; ix1<bcArray->getNX1(); ix1++) + { + //UbTupleDouble3 coords = grid->getNodeCoordinates(block, ix1, ix2, ix3); + //x1 = val<1>(coords); + //x2 = val<2>(coords); + //x3 = val<3>(coords); + + //vx1 = muVx1.Eval(); + //vx2 = muVx2.Eval(); + //vx3 = muVx3.Eval(); + //rho = muRho.Eval(); + + //f1 = muf1.Eval(); + //f2 = muf2.Eval(); + //f3 = muf3.Eval(); + //conc = muConcentration.Eval(); + + //initialize(f, x1, x2, x3, vx1, vx2, vx3, rho, coords, dx, o, true); + //initialize(h, x1, x2, x3, f1, f2, f3, conc, coords, dx, oDiffusion, false); + + + //distributionsf->setDistribution(f, ix1, ix2, ix3); + //distributionsf->setDistributionInv(f, ix1, ix2, ix3); + + LBMReal lambda = muLambda.Eval(); + + calcFeqsFct(h,lambda,0.0,0.0,0.0); + + distributions->setDistribution(h, ix1, ix2, ix3); + distributions->setDistributionInv(h, ix1, ix2, ix3); + + + } + } + + //variablen der functions loeschen, da die verwiesenen Objecte nach dem verlassen des scopes ungueltig sind! + //this->muVx1.ClearVar(); + //this->muVx2.ClearVar(); + //this->muVx3.ClearVar(); + //this->muRho.ClearVar(); + + this->muLambda.ClearVar(); +} +////////////////////////////////////////////////////////////////////////// +void InitThixotropyBlockVisitor::checkFunction(mu::Parser fct) +{ + double x1 = 1.0, x2 = 1.0, x3 = 1.0; + fct.DefineVar("x1", &x1); + fct.DefineVar("x2", &x2); + fct.DefineVar("x3", &x3); + + try + { + fct.Eval(); + fct.ClearVar(); + } + catch (mu::ParserError & e) + { + throw UbException(UB_EXARGS, "function: " + e.GetExpr() + (std::string)"error: " + e.GetMsg() + + (std::string)", only x1,x2,x3 are allowed as variables"); + } +} +////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setNu(LBMReal nu) +//{ +// this->nu = nu; +//} +//////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::setD(LBMReal D) +//{ +// this->D = D; +//} +////////////////////////////////////////////////////////////////////////// +//void InitThixotropyBlockVisitor::initialize(double* f, double x1, double x2, double x3, double vx1, double vx2, double vx3, double rho, UbTupleDouble3 coords, double dx, double o, bool NSE) +//{ +// using namespace D3Q27System; +// //Funktionszeiger +// typedef void(*CalcFeqsFct)(LBMReal* const& /*feq[27]*/, const LBMReal& /*(d)rho*/, const LBMReal& /*vx1*/, const LBMReal& /*vx2*/, const LBMReal& /*vx3*/); +// CalcFeqsFct calcFeqsFct = NULL; +// +// +// //if (NSE) +// //{ +// // calcFeqsFct = &D3Q27System::calcIncompFeq; +// +// //} +// //else +// //{ +// //calcFeqsFct = &D3Q27System::calcCompFeq; +// //muVx1 = muf1; +// //muVx2 = muf2; +// //muVx3 = muf3; +// //} +// +// if (kernel->getCompressible()) +// calcFeqsFct = &D3Q27System::calcCompFeq; +// else +// calcFeqsFct = &D3Q27System::calcIncompFeq; +// +// //x-derivative +// double deltaX = dx * 0.5; +// x1 = val<1>(coords) + deltaX; +// double vx1Plusx1 = muVx1.Eval(); +// double vx2Plusx1 = muVx2.Eval(); +// double vx3Plusx1 = muVx3.Eval(); +// +// x1 = val<1>(coords) - deltaX; +// double vx1Minusx1 = muVx1.Eval(); +// double vx2Minusx1 = muVx2.Eval(); +// double vx3Minusx1 = muVx3.Eval(); +// +// //y-derivative +// x1 = val<1>(coords); +// x2 = val<2>(coords) + deltaX; +// double vx1Plusx2 = muVx1.Eval(); +// double vx2Plusx2 = muVx2.Eval(); +// double vx3Plusx2 = muVx3.Eval(); +// +// x2 = val<2>(coords) - deltaX; +// double vx1Minusx2 = muVx1.Eval(); +// double vx2Minusx2 = muVx2.Eval(); +// double vx3Minusx2 = muVx3.Eval(); +// +// //z-derivative +// x2 = val<2>(coords); +// x3 = val<3>(coords) + deltaX; +// double vx1Plusx3 = muVx1.Eval(); +// double vx2Plusx3 = muVx2.Eval(); +// double vx3Plusx3 = muVx3.Eval(); +// +// x3 = val<3>(coords) - deltaX; +// double vx1Minusx3 = muVx1.Eval(); +// double vx2Minusx3 = muVx2.Eval(); +// double vx3Minusx3 = muVx3.Eval(); +// +// double ax = (vx1Plusx1 - vx1Minusx1) / (2.0 * deltaX) * dx; +// double bx = (vx2Plusx1 - vx2Minusx1) / (2.0 * deltaX) * dx; +// double cx = (vx3Plusx1 - vx3Minusx1) / (2.0 * deltaX) * dx; +// +// double ay = (vx1Plusx2 - vx1Minusx2) / (2.0 * deltaX) * dx; +// double by = (vx2Plusx2 - vx2Minusx2) / (2.0 * deltaX) * dx; +// double cy = (vx3Plusx2 - vx3Minusx2) / (2.0 * deltaX) * dx; +// +// double az = (vx1Plusx3 - vx1Minusx3) / (2.0 * deltaX) * dx; +// double bz = (vx2Plusx3 - vx2Minusx3) / (2.0 * deltaX) * dx; +// double cz = (vx3Plusx3 - vx3Minusx3) / (2.0 * deltaX) * dx; +// double eps_new = 1.0; +// LBMReal op = 1.; +// +// LBMReal feq[27]; +// +// calcFeqsFct(feq, rho, vx1, vx2, vx3); +// +// double f_E = eps_new * ((5. * ax * o + 5. * by * o + 5. * cz * o - 8. * ax * op + 4. * by * op + 4. * cz * op) / (54. * o * op)); +// double f_N = f_E + eps_new * ((2. * (ax - by)) / (9. * o)); +// double f_T = f_E + eps_new * ((2. * (ax - cz)) / (9. * o)); +// double f_NE = eps_new * (-(5. * cz * o + 3. * (ay + bx) * op - 2. * cz * op + ax * (5. * o + op) + by * (5. * o + op)) / (54. * o * op)); +// double f_SE = f_NE + eps_new * ((ay + bx) / (9. * o)); +// double f_TE = eps_new * (-(5. * cz * o + by * (5. * o - 2. * op) + 3. * (az + cx) * op + cz * op + ax * (5. * o + op)) / (54. * o * op)); +// double f_BE = f_TE + eps_new * ((az + cx) / (9. * o)); +// double f_TN = eps_new * (-(5. * ax * o + 5. * by * o + 5. * cz * o - 2. * ax * op + by * op + 3. * bz * op + 3. * cy * op + cz * op) / (54. * o * op)); +// double f_BN = f_TN + eps_new * ((bz + cy) / (9. * o)); +// double f_ZERO = eps_new * ((5. * (ax + by + cz)) / (9. * op)); +// double f_TNE = eps_new * (-(ay + az + bx + bz + cx + cy) / (72. * o)); +// double f_TSW = -eps_new * ((ay + bx) / (36. * o)) - f_TNE; +// double f_TSE = -eps_new * ((az + cx) / (36. * o)) - f_TNE; +// double f_TNW = -eps_new * ((bz + cy) / (36. * o)) - f_TNE; +// +// +// f[E] = f_E + feq[E]; +// f[W] = f_E + feq[W]; +// f[N] = f_N + feq[N]; +// f[S] = f_N + feq[S]; +// f[T] = f_T + feq[T]; +// f[B] = f_T + feq[B]; +// f[NE] = f_NE + feq[NE]; +// f[SW] = f_NE + feq[SW]; +// f[SE] = f_SE + feq[SE]; +// f[NW] = f_SE + feq[NW]; +// f[TE] = f_TE + feq[TE]; +// f[BW] = f_TE + feq[BW]; +// f[BE] = f_BE + feq[BE]; +// f[TW] = f_BE + feq[TW]; +// f[TN] = f_TN + feq[TN]; +// f[BS] = f_TN + feq[BS]; +// f[BN] = f_BN + feq[BN]; +// f[TS] = f_BN + feq[TS]; +// f[TNE] = f_TNE + feq[TNE]; +// f[TNW] = f_TNW + feq[TNW]; +// f[TSE] = f_TSE + feq[TSE]; +// f[TSW] = f_TSW + feq[TSW]; +// f[BNE] = f_TSW + feq[BNE]; +// f[BNW] = f_TSE + feq[BNW]; +// f[BSE] = f_TNW + feq[BSE]; +// f[BSW] = f_TNE + feq[BSW]; +// f[ZERO] = f_ZERO + feq[ZERO]; +// +// +// +// +//} diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.h new file mode 100644 index 000000000..f7054340d --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.h @@ -0,0 +1,93 @@ +#ifndef InitThixotropyBlockVisitor_H +#define InitThixotropyBlockVisitor_H + +#include <PointerDefinitions.h> + +#include "Block3DVisitor.h" +#include "D3Q27System.h" + +#include <MuParser/include/muParser.h> + +/*================================================================================*/ +/* D3Q27ETInitThixotropyBlockVisitor */ +/* */ + + + + +class InitThixotropyBlockVisitor : public Block3DVisitor +{ +public: + typedef std::numeric_limits<LBMReal> D3Q27RealLim; + +public: + InitThixotropyBlockVisitor(); + //D3Q27ETInitThixotropyBlockVisitor(LBMReal rho, LBMReal vx1=0.0, LBMReal vx2=0.0, LBMReal vx3=0.0); + //! Constructor + //! \param nu - viscosity + //! \param rho - density + //! \param vx1 - velocity in x + //! \param vx2 - velocity in y + //! \param vx3 - velocity in z + //InitThixotropyBlockVisitor(LBMReal lambda /*LBMReal nu, LBMReal D, LBMReal rho, LBMReal vx1 = 0.0, LBMReal vx2 = 0.0, LBMReal vx3 = 0.0, LBMReal c=0.0, LBMReal f1 = 0.0, LBMReal f2 = 0.0, LBMReal f3 = 0.0*/); + ////////////////////////////////////////////////////////////////////////// + //automatic vars are: x1,x2, x3 + //ussage example: setVx1("x1*0.01+x2*0.003") + ////////////////////////////////////////////////////////////////////////// + //void setVx1(const mu::Parser& parser); + //void setVx2(const mu::Parser& parser); + //void setVx3(const mu::Parser& parser); + //void setRho(const mu::Parser& parser); + + //void setVx1(const std::string& muParserString); + //void setVx2(const std::string& muParserString); + //void setVx3(const std::string& muParserString); + //void setRho(const std::string& muParserString); + //////////////////////////////////////////////////////////////////////////// + //void setVx1(LBMReal vx1); + //void setVx2(LBMReal vx2); + //void setVx3(LBMReal vx3); + //void setRho(LBMReal rho); + //void setNu(LBMReal nu); + + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //void setf1(const mu::Parser& parser); + //void setf2(const mu::Parser& parser); + //void setf3(const mu::Parser& parser); + void setLambda(const mu::Parser& parser); + + //void setf1(const std::string& muParserString); + //void setf2(const std::string& muParserString); + //void setf3(const std::string& muParserString); + void setLambda(const std::string& muParserString); + ////////////////////////////////////////////////////////////////////////// + //void setf1(LBMReal f1); + //void setf2(LBMReal f2); + //void setf3(LBMReal f3); + void setLambda(LBMReal lambda); + //void setD(LBMReal D); + + //void initialize(double* f, double x1, double x2, double x3, double vx1, double vx2, double vx3, double rho, UbTupleDouble3 coords, double dx, double o, bool NSE); + + void visit(const SPtr<Grid3D> grid, SPtr<Block3D> block); + +protected: + void checkFunction(mu::Parser fct); + typedef void(*CalcFeqsFct)(LBMReal* const& /*feq[27]*/, const LBMReal& /*(d)rho*/, const LBMReal& /*vx1*/, const LBMReal& /*vx2*/, const LBMReal& /*vx3*/); + +private: + mu::Parser muVx1; + mu::Parser muVx2; + mu::Parser muVx3; + //mu::Parser muRho; + //LBMReal nu; + + //mu::Parser muf1; + //mu::Parser muf2; + //mu::Parser muf3; + mu::Parser muLambda; + //LBMReal D; +}; + +#endif //D3Q27INITDISTRIBUTIONSPATCHVISITOR_H diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.cpp index 067b93bba..ddc252155 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.cpp @@ -32,484 +32,492 @@ //======================================================================================= #include "SetConnectorsBlockVisitor.h" -#include "D3Q27ETCFOffVectorConnector.h" -#include "D3Q27ETFCOffVectorConnector.h" #include "D3Q27ETFullDirectConnector.h" #include "D3Q27ETFullVectorConnector.h" +#include "D3Q27ETCFOffVectorConnector.h" +#include "D3Q27ETFCOffVectorConnector.h" +#include "ThixotropyFullDirectConnector.h" +#include "ThixotropyFullVectorConnector.h" #include "Grid3DSystem.h" #include <basics/transmitter/TbTransmitterLocal.h> #include "Communicator.h" #include "InterpolationProcessor.h" -SetConnectorsBlockVisitor::SetConnectorsBlockVisitor(SPtr<Communicator> comm, bool fullConnector, int dirs, LBMReal nue, - InterpolationProcessorPtr iProcessor) - : Block3DVisitor(0, Grid3DSystem::MAXLEVEL), comm(comm), fullConnector(fullConnector), dirs(dirs), nue(nue), - iProcessor(iProcessor) +SetConnectorsBlockVisitor::SetConnectorsBlockVisitor(SPtr<Communicator> comm, bool fullConnector, int dirs, + LBMReal nue, InterpolationProcessorPtr iProcessor) : +Block3DVisitor(0, Grid3DSystem::MAXLEVEL), + comm(comm), + fullConnector(fullConnector), + dirs(dirs), + nue(nue), + iProcessor(iProcessor) { } ////////////////////////////////////////////////////////////////////////// -SetConnectorsBlockVisitor::~SetConnectorsBlockVisitor(void) = default; +SetConnectorsBlockVisitor::~SetConnectorsBlockVisitor(void) +{ +} ////////////////////////////////////////////////////////////////////////// void SetConnectorsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block) { - if (!block) - return; + if(!block) return; - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::visit() - start"); - UBLOG(logDEBUG5, block->toString()); + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::visit() - start"); + UBLOG(logDEBUG5, block->toString()); - gridRank = comm->getProcessID(); - grid->setRank(gridRank); + gridRank = comm->getProcessID(); + grid->setRank(gridRank); - setSameLevelConnectors(grid, block); + setSameLevelConnectors(grid, block); - if (grid->getFinestInitializedLevel() > grid->getCoarsestInitializedLevel()) - setInterpolationConnectors(grid, block); + if(grid->getFinestInitializedLevel() > grid->getCoarsestInitializedLevel()) + setInterpolationConnectors(grid, block); - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::visit() - end"); + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::visit() - end"); } ////////////////////////////////////////////////////////////////////////// void SetConnectorsBlockVisitor::setSameLevelConnectors(SPtr<Grid3D> grid, SPtr<Block3D> block) { - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setSameLevelConnectors() - start"); - int blockRank = block->getRank(); - if (gridRank == blockRank && block->isActive()) { - block->clearWeight(); - std::vector<SPtr<Block3D>> neighbors; - int ix1 = block->getX1(); - int ix2 = block->getX2(); - int ix3 = block->getX3(); - int level = block->getLevel(); - // grid->getAllNeighbors(ix1, ix2, ix3, level, level, neighbors); - - // if (block->getGlobalID()==2512) - //{ - // int test = 0; - //} - - for (int dir = 0; dir < dirs; dir++) { - SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level); - - if (neighBlock) { - int neighBlockRank = neighBlock->getRank(); - if (blockRank == neighBlockRank && neighBlock->isActive()) { - SPtr<Block3DConnector> connector; - connector = SPtr<Block3DConnector>(new D3Q27ETFullDirectConnector(block, neighBlock, dir)); - block->setConnector(connector); - } else if (blockRank != neighBlockRank && neighBlock->isActive()) { - setRemoteConnectors(block, neighBlock, dir, fullConnector); - - if (dir >= 0 && dir <= 5) { - int weight = block->getWeight(neighBlockRank); - weight++; - block->setWeight(neighBlockRank, weight); - } - } - } - } - - // if (block->getGlobalID()==2794) - //{ - // UBLOG(logINFO, block->toString()); - //} - - int weight = block->getNumberOfLocalConnectorsForSurfaces(); - weight = 6 - weight; - block->addWeightForAll(weight); - } - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setSameLevelConnectors() - end"); + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setSameLevelConnectors() - start"); + int blockRank = block->getRank(); + if (gridRank == blockRank && block->isActive()) + { + block->clearWeight(); + std::vector<SPtr<Block3D>> neighbors; + int ix1 = block->getX1(); + int ix2 = block->getX2(); + int ix3 = block->getX3(); + int level = block->getLevel(); + //grid->getAllNeighbors(ix1, ix2, ix3, level, level, neighbors); + + //if (block->getGlobalID()==2512) + //{ + // int test = 0; + //} + + for( int dir = 0; dir < dirs; dir++) + { + SPtr<Block3D> neighBlock = grid->getNeighborBlock(dir, ix1, ix2, ix3, level); + + if(neighBlock) + { + int neighBlockRank = neighBlock->getRank(); + if(blockRank == neighBlockRank && neighBlock->isActive()) + { + SPtr<Block3DConnector> connector; + connector = SPtr<Block3DConnector>(new D3Q27ETFullDirectConnector( block, neighBlock, dir)); + //connector = SPtr<Block3DConnector>(new ThixotropyFullDirectConnector( block, neighBlock, dir)); + block->setConnector(connector); + } + else if(blockRank != neighBlockRank && neighBlock->isActive()) + { + setRemoteConnectors(block, neighBlock, dir, fullConnector); + + if(dir >=0 && dir<=5) + { + int weight = block->getWeight(neighBlockRank); + weight++; + block->setWeight(neighBlockRank, weight); + } + } + } + } + + //if (block->getGlobalID()==2794) + //{ + // UBLOG(logINFO, block->toString()); + //} + + int weight = block->getNumberOfLocalConnectorsForSurfaces(); + weight = 6 - weight; + block->addWeightForAll(weight); + } + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setSameLevelConnectors() - end"); } ////////////////////////////////////////////////////////////////////////// -void SetConnectorsBlockVisitor::setRemoteConnectors(SPtr<Block3D> sblock, SPtr<Block3D> tblock, int dir, - bool /*fullConnector*/) +void SetConnectorsBlockVisitor::setRemoteConnectors(SPtr<Block3D> sblock, SPtr<Block3D> tblock, int dir, bool fullConnector) { - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setRemoteConnectors() - start"); - CreateTransmittersHelper helper; - CreateTransmittersHelper::TransmitterPtr sender, receiver; - helper.createTransmitters(sblock, tblock, dir, CreateTransmittersHelper::NONE, sender, receiver, comm, - CreateTransmittersHelper::MPI); - - SPtr<Block3DConnector> connector; - connector = SPtr<Block3DConnector>(new D3Q27ETFullVectorConnector(sblock, sender, receiver, dir)); - sblock->setConnector(connector); - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setRemoteConnectors() - end"); + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setRemoteConnectors() - start"); + CreateTransmittersHelper helper; + CreateTransmittersHelper::TransmitterPtr sender, receiver; + helper.createTransmitters(sblock, tblock, dir, CreateTransmittersHelper::NONE, sender, receiver, comm, CreateTransmittersHelper::MPI); + + + SPtr<Block3DConnector> connector; + connector = SPtr<Block3DConnector>(new D3Q27ETFullVectorConnector(sblock, sender, receiver, dir)); + //connector = SPtr<Block3DConnector>(new ThixotropyFullVectorConnector(sblock, sender, receiver, dir)); + sblock->setConnector(connector); + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setRemoteConnectors() - end"); } ////////////////////////////////////////////////////////////////////////// void SetConnectorsBlockVisitor::setInterpolationConnectors(SPtr<Grid3D> grid, SPtr<Block3D> block) { - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors() - start"); - // int blockRank = block->getRank(); - // if (block->getGlobalID()==394) - // { - // int test=0; - // } - - // search for all blocks with different ranks - if (block->hasInterpolationFlagCF() && block->isActive()) { - int fbx1 = block->getX1() << 1; - int fbx2 = block->getX2() << 1; - int fbx3 = block->getX3() << 1; - int level = block->getLevel() + 1; - - if (block->hasInterpolationFlagCF(D3Q27System::E)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2, fbx3, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3, level); - SPtr<Block3D> fblockNW = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level); - SPtr<Block3D> fblockNE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::E); - } - if (block->hasInterpolationFlagCF(D3Q27System::W)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1, fbx2 + 1, fbx3, level); - SPtr<Block3D> fblockNW = grid->getBlock(fbx1, fbx2, fbx3 + 1, level); - SPtr<Block3D> fblockNE = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::W); - } - if (block->hasInterpolationFlagCF(D3Q27System::N)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 1, fbx3, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3, level); - SPtr<Block3D> fblockNW = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level); - SPtr<Block3D> fblockNE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::N); - } - if (block->hasInterpolationFlagCF(D3Q27System::S)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3, level); - SPtr<Block3D> fblockNW = grid->getBlock(fbx1, fbx2, fbx3 + 1, level); - SPtr<Block3D> fblockNE = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::S); - } - if (block->hasInterpolationFlagCF(D3Q27System::T)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3 + 1, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level); - SPtr<Block3D> fblockNW = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level); - SPtr<Block3D> fblockNE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::T); - } - if (block->hasInterpolationFlagCF(D3Q27System::B)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3, level); - SPtr<Block3D> fblockNW = grid->getBlock(fbx1, fbx2 + 1, fbx3, level); - SPtr<Block3D> fblockNE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::B); - } - - //////NE-NW-SE-SW - if (block->hasInterpolationFlagCF(D3Q27System::NE) && !block->hasInterpolationFlagCF(D3Q27System::N) && - !block->hasInterpolationFlagCF(D3Q27System::E)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 0, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NE); - } - if (block->hasInterpolationFlagCF(D3Q27System::SW) && !block->hasInterpolationFlagCF(D3Q27System::W) && - !block->hasInterpolationFlagCF(D3Q27System::S)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1, fbx2, fbx3 + 1, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SW); - } - if (block->hasInterpolationFlagCF(D3Q27System::SE) && !block->hasInterpolationFlagCF(D3Q27System::E) && - !block->hasInterpolationFlagCF(D3Q27System::S)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 0, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SE); - } - if (block->hasInterpolationFlagCF(D3Q27System::NW) && !block->hasInterpolationFlagCF(D3Q27System::N) && - !block->hasInterpolationFlagCF(D3Q27System::W)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 1, fbx3, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NW); - } - - /////////TE-BW-BE-TW 1-0 - if (block->hasInterpolationFlagCF(D3Q27System::TE) && !block->hasInterpolationFlagCF(D3Q27System::E) && - !block->hasInterpolationFlagCF(D3Q27System::T)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2 + 0, fbx3 + 1, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2+0, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TE); - } - if (block->hasInterpolationFlagCF(D3Q27System::BW) && !block->hasInterpolationFlagCF(D3Q27System::W) && - !block->hasInterpolationFlagCF(D3Q27System::B)) { - - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 0, fbx3, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1, fbx2 + 1, fbx3, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2+0, fbx3, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2+1, fbx3, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BW); - } - if (block->hasInterpolationFlagCF(D3Q27System::BE) && !block->hasInterpolationFlagCF(D3Q27System::E) && - !block->hasInterpolationFlagCF(D3Q27System::B)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2 + 0, fbx3, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2+0, fbx3, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BE); - } - if (block->hasInterpolationFlagCF(D3Q27System::TW) && !block->hasInterpolationFlagCF(D3Q27System::W) && - !block->hasInterpolationFlagCF(D3Q27System::T)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 0, fbx3 + 1, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2+0, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TW); - } - - //////TN-BS-BN-TS - if (block->hasInterpolationFlagCF(D3Q27System::TN) && !block->hasInterpolationFlagCF(D3Q27System::N) && - !block->hasInterpolationFlagCF(D3Q27System::T)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 0, fbx2 + 1, fbx3 + 1, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+0, fbx2+1, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TN); - } - if (block->hasInterpolationFlagCF(D3Q27System::BS) && !block->hasInterpolationFlagCF(D3Q27System::S) && - !block->hasInterpolationFlagCF(D3Q27System::B)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 0, fbx2, fbx3, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+0, fbx2, fbx3, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2, fbx3, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BS); - } - if (block->hasInterpolationFlagCF(D3Q27System::BN) && !block->hasInterpolationFlagCF(D3Q27System::N) && - !block->hasInterpolationFlagCF(D3Q27System::B)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 0, fbx2 + 1, fbx3, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+0, fbx2+1, fbx3, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BN); - } - if (block->hasInterpolationFlagCF(D3Q27System::TS) && !block->hasInterpolationFlagCF(D3Q27System::S) && - !block->hasInterpolationFlagCF(D3Q27System::T)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 0, fbx2, fbx3 + 1, level); - SPtr<Block3D> fblockSE = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+0, fbx2, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TS); - } - - //////corners - if (block->hasInterpolationFlagCF(D3Q27System::TNE) && !block->hasInterpolationFlagCF(D3Q27System::TE) && - !block->hasInterpolationFlagCF(D3Q27System::TN) && !block->hasInterpolationFlagCF(D3Q27System::NE) && - !block->hasInterpolationFlagCF(D3Q27System::T) && !block->hasInterpolationFlagCF(D3Q27System::N) && - !block->hasInterpolationFlagCF(D3Q27System::E)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 1, level); - SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNE); - } - if (block->hasInterpolationFlagCF(D3Q27System::TSW) && !block->hasInterpolationFlagCF(D3Q27System::TW) && - !block->hasInterpolationFlagCF(D3Q27System::TS) && !block->hasInterpolationFlagCF(D3Q27System::SW) && - !block->hasInterpolationFlagCF(D3Q27System::T) && !block->hasInterpolationFlagCF(D3Q27System::W) && - !block->hasInterpolationFlagCF(D3Q27System::S)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3 + 1, level); - SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1, fbx2, fbx3, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSW); - } - if (block->hasInterpolationFlagCF(D3Q27System::TSE) && !block->hasInterpolationFlagCF(D3Q27System::TE) && - !block->hasInterpolationFlagCF(D3Q27System::TS) && !block->hasInterpolationFlagCF(D3Q27System::SE) && - !block->hasInterpolationFlagCF(D3Q27System::T) && !block->hasInterpolationFlagCF(D3Q27System::E) && - !block->hasInterpolationFlagCF(D3Q27System::S)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2, fbx3 + 1, level); - SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1+1, fbx2, fbx3+0, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSE); - } - if (block->hasInterpolationFlagCF(D3Q27System::TNW) && !block->hasInterpolationFlagCF(D3Q27System::TW) && - !block->hasInterpolationFlagCF(D3Q27System::TN) && !block->hasInterpolationFlagCF(D3Q27System::NW) && - !block->hasInterpolationFlagCF(D3Q27System::T) && !block->hasInterpolationFlagCF(D3Q27System::N) && - !block->hasInterpolationFlagCF(D3Q27System::W)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 1, level); - SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1, fbx2+1, fbx3, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNW); - } - if (block->hasInterpolationFlagCF(D3Q27System::BNE) && !block->hasInterpolationFlagCF(D3Q27System::BE) && - !block->hasInterpolationFlagCF(D3Q27System::BN) && !block->hasInterpolationFlagCF(D3Q27System::NE) && - !block->hasInterpolationFlagCF(D3Q27System::B) && !block->hasInterpolationFlagCF(D3Q27System::N) && - !block->hasInterpolationFlagCF(D3Q27System::E)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2 + 1, fbx3 + 0, level); - SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNE); - } - if (block->hasInterpolationFlagCF(D3Q27System::BSW) && !block->hasInterpolationFlagCF(D3Q27System::BS) && - !block->hasInterpolationFlagCF(D3Q27System::BW) && !block->hasInterpolationFlagCF(D3Q27System::SW) && - !block->hasInterpolationFlagCF(D3Q27System::B) && !block->hasInterpolationFlagCF(D3Q27System::W) && - !block->hasInterpolationFlagCF(D3Q27System::S)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3 + 0, level); - SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1, fbx2, fbx3, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSW); - } - if (block->hasInterpolationFlagCF(D3Q27System::BSE) && !block->hasInterpolationFlagCF(D3Q27System::BS) && - !block->hasInterpolationFlagCF(D3Q27System::BE) && !block->hasInterpolationFlagCF(D3Q27System::SE) && - !block->hasInterpolationFlagCF(D3Q27System::B) && !block->hasInterpolationFlagCF(D3Q27System::E) && - !block->hasInterpolationFlagCF(D3Q27System::S)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1 + 1, fbx2, fbx3, level); - SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1+1, fbx2, fbx3+0, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSE); - } - if (block->hasInterpolationFlagCF(D3Q27System::BNW) && !block->hasInterpolationFlagCF(D3Q27System::BN) && - !block->hasInterpolationFlagCF(D3Q27System::BW) && !block->hasInterpolationFlagCF(D3Q27System::NW) && - !block->hasInterpolationFlagCF(D3Q27System::B) && !block->hasInterpolationFlagCF(D3Q27System::N) && - !block->hasInterpolationFlagCF(D3Q27System::W)) { - SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2 + 1, fbx3 + 0, level); - SPtr<Block3D> fblockSE; // = grid->getBlock(fbx1, fbx2+1, fbx3, level); - SPtr<Block3D> fblockNW; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); - SPtr<Block3D> fblockNE; // = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); - - setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNW); - } - } - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors() - end"); + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors() - start"); + int blockRank = block->getRank(); + if (block->getGlobalID()==394) + { + int test=0; + } + + //search for all blocks with different ranks + if (block->hasInterpolationFlagCF() && block->isActive()) + { + int fbx1 = block->getX1() << 1; + int fbx2 = block->getX2() << 1; + int fbx3 = block->getX3() << 1; + int level = block->getLevel() + 1; + + if( block->hasInterpolationFlagCF(D3Q27System::E)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2,fbx3,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level); + SPtr<Block3D> fblockNW = grid->getBlock(fbx1+1,fbx2,fbx3+1,level); + SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::E); + } + if( block->hasInterpolationFlagCF(D3Q27System::W)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3,level); + SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2,fbx3+1,level); + SPtr<Block3D> fblockNE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::W); + } + if( block->hasInterpolationFlagCF(D3Q27System::N)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+1,fbx3,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level); + SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3+1,level); + SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::N); + } + if( block->hasInterpolationFlagCF(D3Q27System::S)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level); + SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2,fbx3+1,level); + SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::S); + } + if( block->hasInterpolationFlagCF(D3Q27System::T)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3+1,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level); + SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3+1,level); + SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::T); + } + if( block->hasInterpolationFlagCF(D3Q27System::B)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level); + SPtr<Block3D> fblockNW = grid->getBlock(fbx1,fbx2+1,fbx3,level); + SPtr<Block3D> fblockNE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::B); + } + + //////NE-NW-SE-SW + if( block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+1,fbx3+0,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NE); + } + if( block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2,fbx3,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2,fbx3+1,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SW); + } + if( block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2,fbx3+0,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::SE); + } + if( block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+1,fbx3,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::NW); + } + + /////////TE-BW-BE-TW 1-0 + if( block->hasInterpolationFlagCF(D3Q27System::TE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::T)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+0,fbx3+1,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+0, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TE); + } + if( block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::B)) + { + + SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+0,fbx3,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+0, fbx3, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BW); + } + if( block->hasInterpolationFlagCF(D3Q27System::BE)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::B)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1,fbx2+0,fbx3,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+0, fbx3, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BE); + } + if( block->hasInterpolationFlagCF(D3Q27System::TW)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::T)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1,fbx2+0,fbx3+1,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1,fbx2+1,fbx3+1,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+0, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TW); + } + + //////TN-BS-BN-TS + if( block->hasInterpolationFlagCF(D3Q27System::TN)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::T)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2+1,fbx3+1,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3+1,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2+1, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TN); + } + if( block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::S) && !block->hasInterpolationFlagCF(D3Q27System::B)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2,fbx3,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2, fbx3, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BS); + } + if( block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::B)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2+1,fbx3,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2+1,fbx3,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2+1, fbx3, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BN); + } + if( block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::S) && !block->hasInterpolationFlagCF(D3Q27System::T)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+0,fbx2,fbx3+1,level); + SPtr<Block3D> fblockSE = grid->getBlock(fbx1+1,fbx2,fbx3+1,level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+0, fbx2, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TS); + } + + + + + //////corners + if (block->hasInterpolationFlagCF(D3Q27System::TNE)&&!block->hasInterpolationFlagCF(D3Q27System::TE)&&!block->hasInterpolationFlagCF(D3Q27System::TN)&&!block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::T)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); + SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNE); + } + if (block->hasInterpolationFlagCF(D3Q27System::TSW)&&!block->hasInterpolationFlagCF(D3Q27System::TW)&&!block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3+1, level); + SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2, fbx3, level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSW); + } + if (block->hasInterpolationFlagCF(D3Q27System::TSE)&&!block->hasInterpolationFlagCF(D3Q27System::TE)&&!block->hasInterpolationFlagCF(D3Q27System::TS)&& !block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); + SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2, fbx3+0, level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TSE); + } + if (block->hasInterpolationFlagCF(D3Q27System::TNW)&&!block->hasInterpolationFlagCF(D3Q27System::TW)&&!block->hasInterpolationFlagCF(D3Q27System::TN)&& !block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::T)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); + SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::TNW); + } + if (block->hasInterpolationFlagCF(D3Q27System::BNE)&&!block->hasInterpolationFlagCF(D3Q27System::BE)&&!block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::NE)&&!block->hasInterpolationFlagCF(D3Q27System::B)&&!block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::E)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level); + SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+0, level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2+1, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNE); + } + if (block->hasInterpolationFlagCF(D3Q27System::BSW)&& !block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::SW)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::W) && !block->hasInterpolationFlagCF(D3Q27System::S)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2, fbx3+0, level); + SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2, fbx3, level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSW); + } + if (block->hasInterpolationFlagCF(D3Q27System::BSE)&& !block->hasInterpolationFlagCF(D3Q27System::BS)&& !block->hasInterpolationFlagCF(D3Q27System::BE)&& !block->hasInterpolationFlagCF(D3Q27System::SE)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::E) && !block->hasInterpolationFlagCF(D3Q27System::S)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1+1, fbx2, fbx3, level); + SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1+1, fbx2, fbx3+0, level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1+1, fbx2, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BSE); + } + if (block->hasInterpolationFlagCF(D3Q27System::BNW)&& !block->hasInterpolationFlagCF(D3Q27System::BN)&& !block->hasInterpolationFlagCF(D3Q27System::BW)&& !block->hasInterpolationFlagCF(D3Q27System::NW)&& !block->hasInterpolationFlagCF(D3Q27System::B)&& !block->hasInterpolationFlagCF(D3Q27System::N) && !block->hasInterpolationFlagCF(D3Q27System::W)) + { + SPtr<Block3D> fblockSW = grid->getBlock(fbx1, fbx2+1, fbx3+0, level); + SPtr<Block3D> fblockSE;// = grid->getBlock(fbx1, fbx2+1, fbx3, level); + SPtr<Block3D> fblockNW;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); + SPtr<Block3D> fblockNE;// = grid->getBlock(fbx1, fbx2+1, fbx3+1, level); + + setInterpolationConnectors(fblockSW, fblockSE, fblockNW, fblockNE, block, D3Q27System::BNW); + } + + } + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors() - end"); } ////////////////////////////////////////////////////////////////////////// -void SetConnectorsBlockVisitor::setInterpolationConnectors(SPtr<Block3D> fBlockSW, SPtr<Block3D> fBlockSE, - SPtr<Block3D> fBlockNW, SPtr<Block3D> fBlockNE, - SPtr<Block3D> cBlock, int dir) +void SetConnectorsBlockVisitor::setInterpolationConnectors(SPtr<Block3D> fBlockSW, SPtr<Block3D> fBlockSE, SPtr<Block3D> fBlockNW, SPtr<Block3D> fBlockNE, SPtr<Block3D> cBlock, int dir) { - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors(...) - start"); - int fBlockSWRank = -999, fBlockSERank = -999, fBlockNWRank = -999, fBlockNERank = -999; - if (fBlockSW) - fBlockSWRank = fBlockSW->getRank(); - if (fBlockNW) - fBlockNWRank = fBlockNW->getRank(); - if (fBlockSE) - fBlockSERank = fBlockSE->getRank(); - if (fBlockNE) - fBlockNERank = fBlockNE->getRank(); - int cBlockRank = cBlock->getRank(); - - LBMReal omegaF; - if (fBlockSW) - omegaF = LBMSystem::calcCollisionFactor(nue, fBlockSW->getLevel()); - if (fBlockNW) - omegaF = LBMSystem::calcCollisionFactor(nue, fBlockNW->getLevel()); - if (fBlockSE) - omegaF = LBMSystem::calcCollisionFactor(nue, fBlockSE->getLevel()); - if (fBlockNE) - omegaF = LBMSystem::calcCollisionFactor(nue, fBlockNE->getLevel()); - LBMReal omegaC = LBMSystem::calcCollisionFactor(nue, cBlock->getLevel()); - iProcessor->setOmegas(omegaC, omegaF); - - InterpolationProcessorPtr cIProcessor(iProcessor->clone()); - InterpolationProcessorPtr fIProcessorSW(iProcessor->clone()); - InterpolationProcessorPtr fIProcessorSE(iProcessor->clone()); - InterpolationProcessorPtr fIProcessorNW(iProcessor->clone()); - InterpolationProcessorPtr fIProcessorNE(iProcessor->clone()); - - CreateTransmittersHelper::TransmitterPtr senderCFevenEvenSW, receiverCFevenEvenSW, senderCFevenOddNW, - receiverCFevenOddNW, senderCFoddEvenSE, receiverCFoddEvenSE, senderCFoddOddNE, receiverCFoddOddNE, - senderFCevenEvenSW, receiverFCevenEvenSW, senderFCevenOddNW, receiverFCevenOddNW, senderFCoddEvenSE, - receiverFCoddEvenSE, senderFCoddOddNE, receiverFCoddOddNE; - - if (fBlockSW) - createTransmitters(cBlock, fBlockSW, dir, CreateTransmittersHelper::SW, senderCFevenEvenSW, - receiverCFevenEvenSW, senderFCevenEvenSW, receiverFCevenEvenSW); - if (fBlockNW) - createTransmitters(cBlock, fBlockNW, dir, CreateTransmittersHelper::NW, senderCFevenOddNW, receiverCFevenOddNW, - senderFCevenOddNW, receiverFCevenOddNW); - if (fBlockSE) - createTransmitters(cBlock, fBlockSE, dir, CreateTransmittersHelper::SE, senderCFoddEvenSE, receiverCFoddEvenSE, - senderFCoddEvenSE, receiverFCoddEvenSE); - if (fBlockNE) - createTransmitters(cBlock, fBlockNE, dir, CreateTransmittersHelper::NE, senderCFoddOddNE, receiverCFoddOddNE, - senderFCoddOddNE, receiverFCoddOddNE); - - if (cBlockRank == gridRank) { - SPtr<Block3DConnector> connector(new D3Q27ETCFOffVectorConnector<TbTransmitter<CbVector<LBMReal>>>( - cBlock, senderCFevenEvenSW, receiverCFevenEvenSW, senderCFevenOddNW, receiverCFevenOddNW, senderCFoddEvenSE, - receiverCFoddEvenSE, senderCFoddOddNE, receiverCFoddOddNE, dir, cIProcessor)); - cBlock->setConnector(connector); - } - if (fBlockSW && fBlockSWRank == gridRank) { - SPtr<Block3DConnector> connector(new D3Q27ETFCOffVectorConnector<TbTransmitter<CbVector<LBMReal>>>( - fBlockSW, senderFCevenEvenSW, receiverFCevenEvenSW, dir, fIProcessorSW, EvenEvenSW)); - fBlockSW->setConnector(connector); - } - if (fBlockNW && fBlockNWRank == gridRank) { - SPtr<Block3DConnector> connector(new D3Q27ETFCOffVectorConnector<TbTransmitter<CbVector<LBMReal>>>( - fBlockNW, senderFCevenOddNW, receiverFCevenOddNW, dir, fIProcessorNW, EvenOddNW)); - fBlockNW->setConnector(connector); - } - if (fBlockSE && fBlockSERank == gridRank) { - SPtr<Block3DConnector> connector(new D3Q27ETFCOffVectorConnector<TbTransmitter<CbVector<LBMReal>>>( - fBlockSE, senderFCoddEvenSE, receiverFCoddEvenSE, dir, fIProcessorSE, OddEvenSE)); - fBlockSE->setConnector(connector); - } - if (fBlockNE && fBlockNERank == gridRank) { - SPtr<Block3DConnector> connector(new D3Q27ETFCOffVectorConnector<TbTransmitter<CbVector<LBMReal>>>( - fBlockNE, senderFCoddOddNE, receiverFCoddOddNE, dir, fIProcessorNE, OddOddNE)); - fBlockNE->setConnector(connector); - } - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors(...) - end"); + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors(...) - start"); + int fBlockSWRank = -999, fBlockSERank = -999, fBlockNWRank = -999, fBlockNERank = -999; + if(fBlockSW) fBlockSWRank = fBlockSW->getRank(); + if(fBlockNW) fBlockNWRank = fBlockNW->getRank(); + if(fBlockSE) fBlockSERank = fBlockSE->getRank(); + if(fBlockNE) fBlockNERank = fBlockNE->getRank(); + int cBlockRank = cBlock->getRank(); + + LBMReal omegaF; + if(fBlockSW) omegaF =LBMSystem::calcCollisionFactor(nue, fBlockSW->getLevel()); + if(fBlockNW) omegaF =LBMSystem::calcCollisionFactor(nue, fBlockNW->getLevel()); + if(fBlockSE) omegaF =LBMSystem::calcCollisionFactor(nue, fBlockSE->getLevel()); + if(fBlockNE) omegaF =LBMSystem::calcCollisionFactor(nue, fBlockNE->getLevel()); + LBMReal omegaC = LBMSystem::calcCollisionFactor(nue, cBlock->getLevel()); + iProcessor->setOmegas(omegaC, omegaF); + + InterpolationProcessorPtr cIProcessor(iProcessor->clone()); + InterpolationProcessorPtr fIProcessorSW(iProcessor->clone()); + InterpolationProcessorPtr fIProcessorSE(iProcessor->clone()); + InterpolationProcessorPtr fIProcessorNW(iProcessor->clone()); + InterpolationProcessorPtr fIProcessorNE(iProcessor->clone()); + + CreateTransmittersHelper::TransmitterPtr senderCFevenEvenSW, receiverCFevenEvenSW, + senderCFevenOddNW, receiverCFevenOddNW, + senderCFoddEvenSE, receiverCFoddEvenSE, + senderCFoddOddNE, receiverCFoddOddNE, + senderFCevenEvenSW, receiverFCevenEvenSW, + senderFCevenOddNW, receiverFCevenOddNW, + senderFCoddEvenSE, receiverFCoddEvenSE, + senderFCoddOddNE, receiverFCoddOddNE; + + if(fBlockSW) createTransmitters(cBlock, fBlockSW, dir, CreateTransmittersHelper::SW, senderCFevenEvenSW, receiverCFevenEvenSW, senderFCevenEvenSW, receiverFCevenEvenSW); + if(fBlockNW) createTransmitters(cBlock, fBlockNW, dir, CreateTransmittersHelper::NW, senderCFevenOddNW, receiverCFevenOddNW, senderFCevenOddNW, receiverFCevenOddNW); + if(fBlockSE) createTransmitters(cBlock, fBlockSE, dir, CreateTransmittersHelper::SE, senderCFoddEvenSE, receiverCFoddEvenSE, senderFCoddEvenSE, receiverFCoddEvenSE); + if(fBlockNE) createTransmitters(cBlock, fBlockNE, dir, CreateTransmittersHelper::NE, senderCFoddOddNE, receiverCFoddOddNE, senderFCoddOddNE, receiverFCoddOddNE); + + if(cBlockRank == gridRank) + { + SPtr<Block3DConnector> connector(new D3Q27ETCFOffVectorConnector< TbTransmitter< CbVector< LBMReal > > >(cBlock, + senderCFevenEvenSW, receiverCFevenEvenSW, senderCFevenOddNW, receiverCFevenOddNW, + senderCFoddEvenSE, receiverCFoddEvenSE, senderCFoddOddNE, receiverCFoddOddNE, + dir, cIProcessor) ); + cBlock->setConnector(connector); + } + if(fBlockSW && fBlockSWRank == gridRank) + { + SPtr<Block3DConnector> connector( new D3Q27ETFCOffVectorConnector< TbTransmitter< CbVector< LBMReal > > >(fBlockSW, + senderFCevenEvenSW, receiverFCevenEvenSW, dir, fIProcessorSW, EvenEvenSW) ); + fBlockSW->setConnector(connector); + } + if(fBlockNW && fBlockNWRank == gridRank) + { + SPtr<Block3DConnector> connector( new D3Q27ETFCOffVectorConnector< TbTransmitter< CbVector< LBMReal > > >(fBlockNW, + senderFCevenOddNW, receiverFCevenOddNW, dir, fIProcessorNW, EvenOddNW) ); + fBlockNW->setConnector(connector); + } + if(fBlockSE && fBlockSERank == gridRank) + { + SPtr<Block3DConnector> connector( new D3Q27ETFCOffVectorConnector< TbTransmitter< CbVector< LBMReal > > >(fBlockSE, + senderFCoddEvenSE, receiverFCoddEvenSE, dir, fIProcessorSE, OddEvenSE) ); + fBlockSE->setConnector(connector); + } + if(fBlockNE && fBlockNERank == gridRank) + { + SPtr<Block3DConnector> connector( new D3Q27ETFCOffVectorConnector< TbTransmitter< CbVector< LBMReal > > >(fBlockNE, + senderFCoddOddNE, receiverFCoddOddNE, dir, fIProcessorNE, OddOddNE) ); + fBlockNE->setConnector(connector); + } + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::setInterpolationConnectors(...) - end"); } ////////////////////////////////////////////////////////////////////////// -void SetConnectorsBlockVisitor::createTransmitters(SPtr<Block3D> cBlock, SPtr<Block3D> fBlock, int dir, - CreateTransmittersHelper::IBlock ib, - CreateTransmittersHelper::TransmitterPtr &senderCF, - CreateTransmittersHelper::TransmitterPtr &receiverCF, - CreateTransmittersHelper::TransmitterPtr &senderFC, - CreateTransmittersHelper::TransmitterPtr &receiverFC) +void SetConnectorsBlockVisitor::createTransmitters(SPtr<Block3D> cBlock, SPtr<Block3D> fBlock, int dir, + CreateTransmittersHelper::IBlock ib, + CreateTransmittersHelper::TransmitterPtr& senderCF, + CreateTransmittersHelper::TransmitterPtr& receiverCF, + CreateTransmittersHelper::TransmitterPtr& senderFC, + CreateTransmittersHelper::TransmitterPtr& receiverFC) { - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::createTransmitters(...) - start"); - CreateTransmittersHelper helper; - // bool MPIpool = true; - // bool orthogonal = false; - int fBlockRank = fBlock->getRank(); - int cBlockRank = cBlock->getRank(); - if (fBlockRank == cBlockRank && fBlockRank == gridRank) { - senderCF = receiverFC = CreateTransmittersHelper::TransmitterPtr(new TbLocalTransmitter<CbVector<LBMReal>>()); - senderFC = receiverCF = CreateTransmittersHelper::TransmitterPtr(new TbLocalTransmitter<CbVector<LBMReal>>()); - } else if (cBlockRank == gridRank) { - helper.createTransmitters(cBlock, fBlock, dir, ib, senderCF, receiverCF, comm, CreateTransmittersHelper::MPI); - } else if (fBlockRank == gridRank) { - helper.createTransmitters(fBlock, cBlock, dir, ib, senderFC, receiverFC, comm, CreateTransmittersHelper::MPI); - } - UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::createTransmitters(...) - end"); + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::createTransmitters(...) - start"); + CreateTransmittersHelper helper; + bool MPIpool = true; + bool orthogonal = false; + int fBlockRank = fBlock->getRank(); + int cBlockRank = cBlock->getRank(); + if(fBlockRank == cBlockRank && fBlockRank == gridRank) + { + senderCF = receiverFC = CreateTransmittersHelper::TransmitterPtr( new TbLocalTransmitter< CbVector< LBMReal > >()); + senderFC = receiverCF = CreateTransmittersHelper::TransmitterPtr( new TbLocalTransmitter< CbVector< LBMReal > >()); + } + else if(cBlockRank == gridRank) + { + helper.createTransmitters(cBlock, fBlock, dir, ib, senderCF, receiverCF, comm, CreateTransmittersHelper::MPI); + } + else if(fBlockRank == gridRank) + { + helper.createTransmitters(fBlock, cBlock, dir, ib, senderFC, receiverFC, comm, CreateTransmittersHelper::MPI); + } + UBLOG(logDEBUG5, "D3Q27SetConnectorsBlockVisitor::createTransmitters(...) - end"); } + -- GitLab