diff --git a/.gitignore b/.gitignore index 8447c8ba9d21d2aedf8047d5e57d9c1e79a9a350..4879d82bb2c5ce51f43be6ea9fb183cd6e28097c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,12 @@ # build directories +buildDev/ build/ buildDev/ bin/ cmake-build-debug/ MSVC2017/ VS2017/ +run/ # Python _skbuild/ @@ -23,3 +25,4 @@ output/ # MacOS .DS_Store + diff --git a/CMake/cmake_config_files/BLOGIN1.config.cmake b/CMake/cmake_config_files/BLOGIN1.config.cmake new file mode 100644 index 0000000000000000000000000000000000000000..9400e45f964dd3e0331b178e8b766c4c7fa7c08f --- /dev/null +++ b/CMake/cmake_config_files/BLOGIN1.config.cmake @@ -0,0 +1 @@ +INCLUDE("CMake/cmake_config_files/LISE.config.cmake") \ No newline at end of file diff --git a/CMake/cmake_config_files/BLOGIN2.config.cmake b/CMake/cmake_config_files/BLOGIN2.config.cmake new file mode 100644 index 0000000000000000000000000000000000000000..9400e45f964dd3e0331b178e8b766c4c7fa7c08f --- /dev/null +++ b/CMake/cmake_config_files/BLOGIN2.config.cmake @@ -0,0 +1 @@ +INCLUDE("CMake/cmake_config_files/LISE.config.cmake") \ No newline at end of file diff --git a/CMake/cmake_config_files/LISE.config.cmake b/CMake/cmake_config_files/LISE.config.cmake new file mode 100644 index 0000000000000000000000000000000000000000..42f10b7dd54854d8b9e4a50616468a7f9292a331 --- /dev/null +++ b/CMake/cmake_config_files/LISE.config.cmake @@ -0,0 +1,18 @@ +LIST(APPEND CAB_ADDTIONAL_COMPILER_FLAGS -D__unix__) +LIST(APPEND CAB_ADDTIONAL_COMPILER_FLAGS -D__UNIX__) + +################################################################################# +# METIS +################################################################################# +IF(${USE_METIS}) + SET(METIS_INCLUDEDIR "/home/niikonst/metis-5.1.0/include") + SET(METIS_DEBUG_LIBRARY "/home/niikonst/metis-5.1.0/build/Linux-x86_64/libmetis/libmetis.a") + SET(METIS_RELEASE_LIBRARY "/home/niikonst/metis-5.1.0/build/Linux-x86_64/libmetis/libmetis.a") +ENDIF() +################################################################################# +# BOOST +################################################################################# +SET(BOOST_VERSION "1.72.0") +SET(BOOST_ROOT "/sw/tools/boost/1.72.0/skl/openmpi.3.1.5-gcc.9.2.0") +SET(BOOST_DIR ${BOOST_ROOT}) +SET(BOOST_LIBRARYDIR ${BOOST_ROOT}"/lib") \ No newline at end of file diff --git a/CMake/compilerflags/icc190.cmake b/CMake/compilerflags/icc190.cmake new file mode 100644 index 0000000000000000000000000000000000000000..31c17961766ef74c7dde9e568c3db0399547381f --- /dev/null +++ b/CMake/compilerflags/icc190.cmake @@ -0,0 +1,37 @@ +############################################################################################################### +## +## intel190 +## +############################################################################################################### + +MACRO(SET_COMPILER_SPECIFIC_FLAGS_INTERN build_type use64BitOptions) + # auto_ptr warning from mu::Parser + LIST(APPEND CAB_COMPILER_ADDTIONAL_CXX_COMPILER_FLAGS "-wd1478") + + # main intel compiler flags as CMake-list ("xx;yy;") + LIST(APPEND CAB_COMPILER_ADDTIONAL_CXX_COMPILER_FLAGS "-xHOST;-O3;-ip;-fno-alias;-mcmodel=medium;-qopt-streaming-stores=always;-qopt-zmm-usage=high") + + #Debug + #LIST(APPEND CAB_COMPILER_ADDTIONAL_CXX_COMPILER_FLAGS "-g -traceback") + + ############################################################################################################### + ## OpenMP support + ############################################################################################################### + IF(USE_OPENMP) + LIST(APPEND CAB_COMPILER_ADDTIONAL_CXX_COMPILER_FLAGS "-qopenmp") + LIST(APPEND CAB_ADDITIONAL_LINK_FLAGS "-parallel") + ENDIF() + + ############################################################################################################### + ## mt support + ############################################################################################################### + #LIST(APPEND CAB_COMPILER_ADDTIONAL_CXX_COMPILER_FLAGS "-pthread") + #LIST(APPEND CAB_COMPILER_ADDTIONAL_C_COMPILER_FLAGS "-pthread") + + ############################################################################################################# + # c++ 11 support + ############################################################################################################# + LIST(APPEND CAB_COMPILER_ADDTIONAL_CXX_COMPILER_FLAGS "-std=c++11") + LIST(APPEND CAB_COMPILER_ADDTIONAL_C_COMPILER_FLAGS "-std=c++11") + +ENDMACRO(SET_COMPILER_SPECIFIC_FLAGS_INTERN build_type use64BitOptions) diff --git a/apps/cpu/Applications.cmake b/apps/cpu/Applications.cmake index 920e01efbc3e2ebcb498fe0775247836cb02caef..fb5b9cdf5136f95fad370ee68bf16fbcdb0ba1bd 100644 --- a/apps/cpu/Applications.cmake +++ b/apps/cpu/Applications.cmake @@ -2,7 +2,7 @@ #add_subdirectory(Applications/gridRf) #add_subdirectory(Applications/greenvortex) # add_subdirectory(Applications/micropart) -#add_subdirectory(Applications/sphere) +add_subdirectory(${APPS_ROOT_CPU}/sphere) #add_subdirectory(Applications/vfscript) #add_subdirectory(Applications/reefer) #add_subdirectory(Applications/bananas) @@ -11,8 +11,8 @@ #add_subdirectory(Applications/bananas2) # add_subdirectory(Applications/plate) # add_subdirectory(Applications/plate2) -##add_subdirectory(Applications/FlowAroundCylinder) -#add_subdirectory(${APPS_ROOT_CPU}/LaminarTubeFlow) +add_subdirectory(${APPS_ROOT_CPU}/FlowAroundCylinder) +add_subdirectory(${APPS_ROOT_CPU}/LaminarTubeFlow) # add_subdirectory(Applications/LaminarTubeFlowConv) #add_subdirectory(Applications/cylinderSt) #add_subdirectory(Applications/mpichTest) @@ -64,4 +64,8 @@ #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) +add_subdirectory(${APPS_ROOT_CPU}/HerschelBulkleyModel) +add_subdirectory(${APPS_ROOT_CPU}/rheometer) +add_subdirectory(${APPS_ROOT_CPU}/CouetteFlow) + diff --git a/apps/cpu/CouetteFlow/CMakeLists.txt b/apps/cpu/CouetteFlow/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..56931592d831ded425580f40af35e5f4c4a7c1c2 --- /dev/null +++ b/apps/cpu/CouetteFlow/CMakeLists.txt @@ -0,0 +1,6 @@ +######################################################## +## C++ PROJECT ### +######################################################## +PROJECT(CouetteFlow) + +vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES cflow.cpp ) \ No newline at end of file diff --git a/apps/cpu/CouetteFlow/cf1.cfg b/apps/cpu/CouetteFlow/cf1.cfg new file mode 100644 index 0000000000000000000000000000000000000000..0fa9976114e4092b59426acecaadf47fbbf0e5dc --- /dev/null +++ b/apps/cpu/CouetteFlow/cf1.cfg @@ -0,0 +1,32 @@ +pathname = d:/temp/BinghamNewTest2 + +numOfThreads = 4 +availMem = 8e9 +logToFile = false + +# blocknx = 2 32 32 +# boundingBox = 0.25 32 32 +# deltax = 0.125 #0.25 #0.5 #1 + +# nuLB = 0.05 +# forcing = 1e-7 #2e-7 #4e-7 #8e-7 + +# outTime = 10000 +# endTime = 1920000 #480000 #120000 #30000 + +blocknx = 2 32 2 +boundingBox = 2 32 2 +deltax = 1 + +#nuLB = 0.05 +forcing = 8e-7 +#n = 0.8 +#tau0 = 3e-6 + +velocity = 1e-3 +n = 0.4 +Re = 1 +Bn = 0.01 + +outTime = 1000 +endTime = 50000000 \ No newline at end of file diff --git a/apps/cpu/CouetteFlow/cflow.cpp b/apps/cpu/CouetteFlow/cflow.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f5a3abca7007e5907cd567460474105ba620d556 --- /dev/null +++ b/apps/cpu/CouetteFlow/cflow.cpp @@ -0,0 +1,307 @@ +#include <iostream> +#include <string> + +#include <VirtualFluids.h> + +using namespace std; + + +void bflow(string configname) +{ + try + { + ConfigurationFile config; + config.load(configname); + + string pathname = config.getValue<string>("pathname"); + int numOfThreads = config.getValue<int>("numOfThreads"); + vector<int> blocknx = config.getVector<int>("blocknx"); + vector<double> boundingBox = config.getVector<double>("boundingBox"); + //double nuLB = config.getValue<double>("nuLB"); + double endTime = config.getValue<double>("endTime"); + double outTime = config.getValue<double>("outTime"); + double availMem = config.getValue<double>("availMem"); + //int refineLevel = config.getValue<int>("refineLevel"); + bool logToFile = config.getValue<bool>("logToFile"); + //double restartStep = config.getValue<double>("restartStep"); + double deltax = config.getValue<double>("deltax"); + //double cpStep = config.getValue<double>("cpStep"); + //double cpStepStart = config.getValue<double>("cpStepStart"); + //bool newStart = config.getValue<bool>("newStart"); + double forcing = config.getValue<double>("forcing"); + //double n = config.getValue<double>("n"); + //double k = config.getValue<double>("k"); + //double tau0 = config.getValue<double>("tau0"); + double velocity = config.getValue<double>("velocity"); + double n = config.getValue<double>("n"); + double Re = config.getValue<double>("Re"); + double Bn = config.getValue<double>("Bn"); + + SPtr<Communicator> comm = MPICommunicator::getInstance(); + int myid = comm->getProcessID(); + + if (logToFile) + { +#if defined(__unix__) + if (myid == 0) + { + const char* str = pathname.c_str(); + mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + } +#endif + + if (myid == 0) + { + stringstream logFilename; + logFilename << pathname + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt"; + UbLog::output_policy::setStream(logFilename.str()); + } + } + + LBMReal rhoLB = 0.0; + + SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter()); + + //bounding box + //double g_minX1 = 0; + //double g_minX2 = 0; + //double g_minX3 = 0; + + //double g_maxX1 = boundingBox[0]; + //double g_maxX2 = boundingBox[1]; + //double g_maxX3 = boundingBox[2]; + + double g_minX1 = 0.0; + double g_minX2 = -boundingBox[1]/2.0; + double g_minX3 = -boundingBox[2]/2.0; + + double g_maxX1 = boundingBox[0]; + double g_maxX2 = boundingBox[1]/2.0; + double g_maxX3 = boundingBox[2]/2.0; + + double blockLength = 3.0 * deltax; + + double h = (g_maxX2) / 2.0; + double dex = g_maxX1; + + //LBMReal tau0 = 1.2e-7; + //LBMReal k = nuLB; + //LBMReal n = 0.4; + + + double d = boundingBox[1]; + double U = velocity; + double Gamma = U / d; + + double k = 0.05; // (U * d) / (Re * std::pow(Gamma, n - 1)); + double tau0 = 1e-6;// Bn* k* std::pow(Gamma, n); + + double beta = 14; + double c = 10; // 1.0 / 6.0; + double mu0 = 1e-4; + + SPtr<Thixotropy> thix = Thixotropy::getInstance(); + //Herschel-Bulkley + thix->setPowerIndex(n); + thix->setViscosityParameter(k); + thix->setYieldStress(tau0); + //Powell-Eyring + thix->setBeta(beta); + thix->setC(c); + thix->setMu0(mu0); + + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new HerschelBulkleyModelNoSlipBCAlgorithm())); + //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new PowellEyringModelNoSlipBCAlgorithm())); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new BinghamModelNoSlipBCAlgorithm())); + + //BS visitor + BoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + + SPtr<BCProcessor> bcProc; + bcProc = SPtr<BCProcessor>(new BCProcessor()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new PowellEyringModelLBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyK17LBMKernel()); + SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel()); + kernel->setForcingX1(forcing); + kernel->setWithForcing(true); + kernel->setBCProcessor(bcProc); + + + SPtr<Grid3D> grid(new Grid3D(comm)); + grid->setPeriodicX1(true); + grid->setPeriodicX2(false); + grid->setPeriodicX3(true); + grid->setDeltaX(deltax); + grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]); + + SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3)); + if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); + + + GenBlocksGridVisitor genBlocks(gridCube); + grid->accept(genBlocks); + + if (myid == 0) + { + UBLOG(logINFO, "Parameters:"); + UBLOG(logINFO, "forcing = " << forcing); + UBLOG(logINFO, "rho = " << rhoLB); + //UBLOG(logINFO, "nu = " << nuLB); + UBLOG(logINFO, "U = " << U); + UBLOG(logINFO, "Re = " << (U * d) / (k * std::pow(Gamma, n - 1))); + UBLOG(logINFO, "Bn = " << tau0 / (k * std::pow(Gamma, n))); + UBLOG(logINFO, "k = " << k); + UBLOG(logINFO, "n = " << n); + UBLOG(logINFO, "tau0 = " << tau0); + UBLOG(logINFO, "deltax = " << deltax); + //UBLOG(logINFO, "number of levels = " << refineLevel + 1); + UBLOG(logINFO, "numOfThreads = " << numOfThreads); + UBLOG(logINFO, "Preprozess - start"); + } + + //walls + //GbCuboid3DPtr addWallZmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_minX3)); + //if (myid == 0) GbSystem3D::writeGeoObject(addWallZmin.get(), pathname + "/geo/addWallZmin", WbWriterVtkXmlASCII::getInstance()); + + //GbCuboid3DPtr addWallZmax(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_maxX3, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength)); + //if (myid == 0) GbSystem3D::writeGeoObject(addWallZmax.get(), pathname + "/geo/addWallZmax", WbWriterVtkXmlASCII::getInstance()); + + GbCuboid3DPtr addWallYmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_minX2, g_maxX3 + blockLength)); + if (myid == 0) GbSystem3D::writeGeoObject(addWallYmin.get(), pathname + "/geo/addWallYmin", WbWriterVtkXmlASCII::getInstance()); + + GbCuboid3DPtr addWallYmax(new GbCuboid3D(g_minX1 - blockLength, g_maxX2, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength)); + if (myid == 0) GbSystem3D::writeGeoObject(addWallYmax.get(), pathname + "/geo/addWallYmax", WbWriterVtkXmlASCII::getInstance()); + + //wall interactors + //SPtr<D3Q27Interactor> addWallZminInt(new D3Q27Interactor(addWallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + //SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> addWallYmaxInt(new D3Q27Interactor(addWallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + //////////////////////////////////////////// + //METIS + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY)); + //////////////////////////////////////////// + /////delete solid blocks + if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start"); + InteractorsHelper intHelper(grid, metisVisitor); + //intHelper.addInteractor(addWallZminInt); + //intHelper.addInteractor(addWallZmaxInt); + intHelper.addInteractor(addWallYminInt); + intHelper.addInteractor(addWallYmaxInt); + intHelper.selectBlocks(); + if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end"); + ////////////////////////////////////// + + SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm)); + ppblocks->process(0); + + unsigned long nob = grid->getNumberOfBlocks(); + int gl = 3; + unsigned long nodb = (blocknx[0]) * (blocknx[1]) * (blocknx[2]); + unsigned long nod = nob * (blocknx[0]) * (blocknx[1]) * (blocknx[2]); + unsigned long nodg = nob * (blocknx[0] + gl) * (blocknx[1] + gl) * (blocknx[1] + gl); + double needMemAll = double(nodg * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4)); + double needMem = needMemAll / double(comm->getNumberOfProcesses()); + + if (myid == 0) + { + UBLOG(logINFO, "Number of blocks = " << nob); + UBLOG(logINFO, "Number of nodes = " << nod); + int minInitLevel = grid->getCoarsestInitializedLevel(); + int maxInitLevel = grid->getFinestInitializedLevel(); + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + int nobl = grid->getNumberOfBlocks(level); + UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl); + UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * nodb); + } + UBLOG(logINFO, "Necessary memory = " << needMemAll << " bytes"); + UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes"); + UBLOG(logINFO, "Available memory per process = " << availMem << " bytes"); + } + + SetKernelBlockVisitor kernelVisitor(kernel, k, availMem, needMem); + grid->accept(kernelVisitor); + + //BC + intHelper.setBC(); + + //initialization of distributions + InitDistributionsBlockVisitor initVisitor; + grid->accept(initVisitor); + + + if (myid == 0) UBLOG(logINFO, "Preprozess - end"); + + + //set connectors + InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor()); + SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, k, iProcessor); + grid->accept(setConnsVisitor); + + grid->accept(bcVisitor); + + SPtr<UbScheduler> geoSch(new UbScheduler(1)); + WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm); + ppgeo.process(1); + + SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100)); + SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm)); + + //write data for visualization of macroscopic quantities + SPtr<UbScheduler> visSch(new UbScheduler(outTime)); + SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname, + WbWriterVtkXmlASCII::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + + SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + + SPtr<UbScheduler> stepGhostLayer(new UbScheduler(outTime)); + SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); + calculator->addCoProcessor(npr); + calculator->addCoProcessor(writeMQCoProcessor); + calculator->addCoProcessor(writeThixotropicMQCoProcessor); + //calculator->addCoProcessor(migCoProcessor); + //calculator->addCoProcessor(restartCoProcessor); + + if (myid == 0) UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) UBLOG(logINFO, "Simulation-end"); + } + catch (std::exception& e) + { + cerr << e.what() << endl << flush; + } + catch (std::string& s) + { + cerr << s << endl; + } + catch (...) + { + cerr << "unknown exception" << endl; + } + +} + +////////////////////////////////////////////////////////////////////////// +int main(int argc, char* argv[]) +{ + if (argv != NULL) + { + if (argv[1] != NULL) + { + //pflowForcing(string(argv[1])); + bflow(string(argv[1])); + } + else + { + cout << "Configuration file is missing!" << endl; + } + } + + return 0; +} diff --git a/apps/cpu/FlowAroundCylinder/CMakeLists.txt b/apps/cpu/FlowAroundCylinder/CMakeLists.txt index a4173b62b4aee940c48262c99ee0cd003d596bc5..7bd09c7189fdf892e76816f8fba4ba95bf3f0867 100644 --- a/apps/cpu/FlowAroundCylinder/CMakeLists.txt +++ b/apps/cpu/FlowAroundCylinder/CMakeLists.txt @@ -1,25 +1,6 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) - ######################################################## ## C++ PROJECT ### ######################################################## PROJECT(cylinder) -INCLUDE(${APPS_ROOT}/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(cylinder BINARY) +vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES cylinder.cpp ) diff --git a/apps/cpu/FlowAroundCylinder/cylinder.cfg b/apps/cpu/FlowAroundCylinder/cylinder.cfg index b895c7a4949fd9b3367d76b50db1532461d1e0b3..0a7066ed9bc3351736c511d7aaeecaa04604fe55 100644 --- a/apps/cpu/FlowAroundCylinder/cylinder.cfg +++ b/apps/cpu/FlowAroundCylinder/cylinder.cfg @@ -2,11 +2,11 @@ pathOut = d:/temp/cylinder_test numOfThreads = 4 availMem = 15e9 -refineLevel = 1 +refineLevel = 0 blockNx = 25 41 41 uLB = 0.001 -dx = 0.005 -#dx = 0.01 +#dx = 0.005 +dx = 0.01 logToFile = false @@ -16,7 +16,7 @@ restartStep = 1000 cpStart = 1000 cpStep = 1000 -outTime = 100 +outTime = 10000 endTime = 100000 nupsStep = 100 100 10000000 \ No newline at end of file diff --git a/apps/cpu/FlowAroundCylinder/cylinder.cpp b/apps/cpu/FlowAroundCylinder/cylinder.cpp index da443cc37e002088316df79b3630225de54a490d..8e0073b779fac7f678cc8688e66bb52c9a4584c4 100644 --- a/apps/cpu/FlowAroundCylinder/cylinder.cpp +++ b/apps/cpu/FlowAroundCylinder/cylinder.cpp @@ -259,9 +259,9 @@ void run(string configname) intHelper.setBC(); - //domain decomposition - PQueuePartitioningGridVisitor pqPartVisitor(numOfThreads); - grid->accept(pqPartVisitor); + ////domain decomposition + //PQueuePartitioningGridVisitor pqPartVisitor(numOfThreads); + //grid->accept(pqPartVisitor); //initialization of distributions InitDistributionsBlockVisitor initVisitor; @@ -297,10 +297,11 @@ void run(string configname) SPtr<CoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, stepSch, pathOut, WbWriterVtkXmlBinary::getInstance(), conv, comm)); - //double area = (2.0*radius*H)/(dx*dx); - //double v = 4.0*uLB/9.0; - //CalculateForcesCoProcessor fp(grid, stepSch, pathOut + "/results/forces.txt", comm, v, area); - //fp.addInteractor(cylinderInt); + double area = (2.0*radius*H)/(dx*dx); + double v = 4.0*uLB/9.0; + SPtr<UbScheduler> forceSch(new UbScheduler(100)); + SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, pathOut + "/results/forces.txt", comm, v, area); + fp->addInteractor(cylinderInt); SPtr<UbScheduler> nupsSch(new UbScheduler(nupsStep[0], nupsStep[1], nupsStep[2])); std::shared_ptr<CoProcessor> nupsCoProcessor(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm)); @@ -309,7 +310,9 @@ void run(string configname) SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1)); SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); calculator->addCoProcessor(nupsCoProcessor); - calculator->addCoProcessor(writeMQCoProcessor); + calculator->addCoProcessor(fp); + calculator->addCoProcessor(writeMQCoProcessor); + if(myid == 0) UBLOG(logINFO,"Simulation-start"); calculator->calculate(); if(myid == 0) UBLOG(logINFO,"Simulation-end"); diff --git a/apps/cpu/HerschelBulkleyModel/CMakeLists.txt b/apps/cpu/HerschelBulkleyModel/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..fe04d5c61fdbf66fb1ab0966745301330ad0866e --- /dev/null +++ b/apps/cpu/HerschelBulkleyModel/CMakeLists.txt @@ -0,0 +1,6 @@ +######################################################## +## C++ PROJECT ### +######################################################## +PROJECT(HerschelBulkleyModel) + +vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES hbflow.cpp ) \ No newline at end of file diff --git a/apps/cpu/HerschelBulkleyModel/hbf1.cfg b/apps/cpu/HerschelBulkleyModel/hbf1.cfg new file mode 100644 index 0000000000000000000000000000000000000000..2eed172d57ee45a3c8884de41f67194381ee746a --- /dev/null +++ b/apps/cpu/HerschelBulkleyModel/hbf1.cfg @@ -0,0 +1,37 @@ +pathname = d:/temp/BinghamNewNewConvergenceAcousticScaling_20it/256 + +#pathname = d:/temp/Newton45/32 + +numOfThreads = 4 +availMem = 8e9 +logToFile = false + +# blocknx = 2 32 32 +# boundingBox = 0.25 32 32 +# deltax = 0.125 #0.25 #0.5 #1 + +# nuLB = 0.05 +# forcing = 1e-7 #2e-7 #4e-7 #8e-7 + +# outTime = 10000 +# endTime = 1920000 #480000 #120000 #30000 + +blocknx = 2 32 2 +boundingBox = 2 32 2 +deltax = 1 + +scaleFactor = 8 + +nuLB = 0.005 +forcing = 6e-9 +tau0 = 3e-8 + +#n = 0.8 + +velocity = 1e-3 +n = 0.4 +Re = 1 +Bn = 0.01 + +outTime = 1000 +endTime = 1000000 \ No newline at end of file diff --git a/apps/cpu/HerschelBulkleyModel/hbflow.cpp b/apps/cpu/HerschelBulkleyModel/hbflow.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d83f0f6d0494e2da4e1771273d14b447c13850f9 --- /dev/null +++ b/apps/cpu/HerschelBulkleyModel/hbflow.cpp @@ -0,0 +1,342 @@ +#include <iostream> +#include <string> + +#include <VirtualFluids.h> + +using namespace std; + + +void bflow(string configname) +{ + try + { + ConfigurationFile config; + config.load(configname); + + string pathname = config.getValue<string>("pathname"); + int numOfThreads = config.getValue<int>("numOfThreads"); + vector<int> blocknx = config.getVector<int>("blocknx"); + vector<double> boundingBox = config.getVector<double>("boundingBox"); + double nuLB = config.getValue<double>("nuLB"); + double endTime = config.getValue<double>("endTime"); + double outTime = config.getValue<double>("outTime"); + double availMem = config.getValue<double>("availMem"); + //int refineLevel = config.getValue<int>("refineLevel"); + bool logToFile = config.getValue<bool>("logToFile"); + //double restartStep = config.getValue<double>("restartStep"); + double deltax = config.getValue<double>("deltax"); + //double cpStep = config.getValue<double>("cpStep"); + //double cpStepStart = config.getValue<double>("cpStepStart"); + //bool newStart = config.getValue<bool>("newStart"); + double forcing = config.getValue<double>("forcing"); + //double n = config.getValue<double>("n"); + //double k = config.getValue<double>("k"); + double tau0 = config.getValue<double>("tau0"); + double velocity = config.getValue<double>("velocity"); + double n = config.getValue<double>("n"); + double Re = config.getValue<double>("Re"); + double Bn = config.getValue<double>("Bn"); + double scaleFactor = config.getValue<double>("scaleFactor"); + + SPtr<Communicator> comm = MPICommunicator::getInstance(); + int myid = comm->getProcessID(); + + if (logToFile) + { +#if defined(__unix__) + if (myid == 0) + { + const char* str = pathname.c_str(); + mkdir(str, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + } +#endif + + if (myid == 0) + { + stringstream logFilename; + logFilename << pathname + "/logfile" + UbSystem::toString(UbSystem::getTimeStamp()) + ".txt"; + UbLog::output_policy::setStream(logFilename.str()); + } + } + + LBMReal rhoLB = 0.0; + + SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter()); + + //bounding box + //double g_minX1 = -0.707107+1.0; + //double g_minX2 = -1.41421+1.0; + //double g_minX3 = 1.0; + + //double g_maxX1 = boundingBox[0]; + //double g_maxX2 = boundingBox[1]; + //double g_maxX3 = boundingBox[2]+1.0; + + double g_minX1 = 0.0; + double g_minX2 = -boundingBox[1]/2.0; + double g_minX3 = -boundingBox[2]/2.0; + + double g_maxX1 = boundingBox[0]; + double g_maxX2 = boundingBox[1]/2.0; + double g_maxX3 = boundingBox[2]/2.0; + + + + double blockLength = 3.0 * deltax; + + double h = (g_maxX2) / 2.0; + double dex = g_maxX1; + + //LBMReal tau0 = 1.2e-7; + //LBMReal k = nuLB; + //LBMReal n = 0.4; + + + double d = boundingBox[1]; + double U = velocity; + double Gamma = U / d; + + //double scaleFactor = 2.0; + + // Diffusive Scaling + + //double k = 0.005; // (U * d) / (Re * std::pow(Gamma, n - 1)); + //double tau0 = 3e-5 / (scaleFactor * scaleFactor);// *4.0);//*4.0);// Bn* k* std::pow(Gamma, n); + //forcing /= scaleFactor * scaleFactor * scaleFactor; + //endTime *= scaleFactor * scaleFactor; + //deltax /= scaleFactor; + + // Acoustic Scaling + + double k = nuLB * scaleFactor; + //double tau0 = 3e-5; + forcing /= scaleFactor; + endTime *= scaleFactor; + deltax /= scaleFactor; + + //outTime = endTime; + + double beta = 14; + double c = 10; // 1.0 / 6.0; + double mu0 = 1e-4; + + SPtr<Thixotropy> thix = Thixotropy::getInstance(); + //Herschel-Bulkley + thix->setPowerIndex(n); + thix->setViscosityParameter(k); + thix->setYieldStress(tau0); + //Powell-Eyring + thix->setBeta(beta); + thix->setC(c); + thix->setMu0(mu0); + + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new HerschelBulkleyModelNoSlipBCAlgorithm())); + //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new PowellEyringModelNoSlipBCAlgorithm())); + //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new BinghamModelNoSlipBCAlgorithm())); + + //BS visitor + BoundaryConditionsBlockVisitor bcVisitor; + //bcVisitor.addBC(noSlipBCAdapter); + + SPtr<BCProcessor> bcProc; + bcProc = SPtr<BCProcessor>(new BCProcessor()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new PowellEyringModelLBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel()); + SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyK17LBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CompressibleCumulant4thOrderViscosityLBMKernel()); + + //double forcingXY = forcing / sqrt(2.0); + //kernel->setForcingX1(forcingXY); + //kernel->setForcingX2(forcingXY); + kernel->setForcingX1(forcing); + kernel->setWithForcing(true); + kernel->setBCProcessor(bcProc); + + + SPtr<Grid3D> grid(new Grid3D(comm)); + grid->setPeriodicX1(true); + grid->setPeriodicX2(false); + grid->setPeriodicX3(true); + grid->setDeltaX(deltax); + grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]); + + SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3)); + if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); + + + GenBlocksGridVisitor genBlocks(gridCube); + grid->accept(genBlocks); + + if (myid == 0) + { + UBLOG(logINFO, "Parameters:"); + UBLOG(logINFO, "forcing = " << forcing); + UBLOG(logINFO, "rho = " << rhoLB); + //UBLOG(logINFO, "nu = " << nuLB); + UBLOG(logINFO, "U = " << U); + UBLOG(logINFO, "Re = " << (U * d) / (k * std::pow(Gamma, n - 1))); + UBLOG(logINFO, "Bn = " << tau0 / (k * std::pow(Gamma, n))); + UBLOG(logINFO, "k = " << k); + UBLOG(logINFO, "n = " << n); + UBLOG(logINFO, "tau0 = " << tau0); + UBLOG(logINFO, "deltax = " << deltax); + //UBLOG(logINFO, "number of levels = " << refineLevel + 1); + UBLOG(logINFO, "numOfThreads = " << numOfThreads); + UBLOG(logINFO, "Preprozess - start"); + } + + //walls + //GbCuboid3DPtr addWallZmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_minX3)); + //if (myid == 0) GbSystem3D::writeGeoObject(addWallZmin.get(), pathname + "/geo/addWallZmin", WbWriterVtkXmlASCII::getInstance()); + + //GbCuboid3DPtr addWallZmax(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_maxX3, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength)); + //if (myid == 0) GbSystem3D::writeGeoObject(addWallZmax.get(), pathname + "/geo/addWallZmax", WbWriterVtkXmlASCII::getInstance()); + + GbCuboid3DPtr addWallYmin(new GbCuboid3D(g_minX1 - blockLength, g_minX2 - blockLength, g_minX3 - blockLength, g_maxX1 + blockLength, g_minX2, g_maxX3 + blockLength)); + if (myid == 0) GbSystem3D::writeGeoObject(addWallYmin.get(), pathname + "/geo/addWallYmin", WbWriterVtkXmlASCII::getInstance()); + + GbCuboid3DPtr addWallYmax(new GbCuboid3D(g_minX1 - blockLength, g_maxX2, g_minX3 - blockLength, g_maxX1 + blockLength, g_maxX2 + blockLength, g_maxX3 + blockLength)); + if (myid == 0) GbSystem3D::writeGeoObject(addWallYmax.get(), pathname + "/geo/addWallYmax", WbWriterVtkXmlASCII::getInstance()); + + //GbCuboid3DPtr addWallXY(new GbCuboid3D(g_minX1 - 0.5*deltax, g_minX2 - 0.5 * deltax, g_minX3 - 0.5 * deltax, g_maxX1 + 0.5 * deltax, g_maxX2 + 0.5 * deltax, g_maxX3 + 0.5 * deltax)); + //if (myid == 0) GbSystem3D::writeGeoObject(addWallXY.get(), pathname + "/geo/addWallXY", WbWriterVtkXmlASCII::getInstance()); + + //SPtr<GbTriFaceMesh3D> wall45(new GbTriFaceMesh3D()); + //wall45->readMeshFromSTLFile("d:/Projects/TRR277/Project/WP1/PF45/Geo/wall45_ASCII.stl", true); + + + //wall interactors + //SPtr<D3Q27Interactor> addWallZminInt(new D3Q27Interactor(addWallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + //SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> addWallYmaxInt(new D3Q27Interactor(addWallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + //SPtr<D3Q27TriFaceMeshInteractor> wall45Int(new D3Q27TriFaceMeshInteractor(wall45, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + //////////////////////////////////////////// + //METIS + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::RECURSIVE)); + //////////////////////////////////////////// + /////delete solid blocks + if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start"); + InteractorsHelper intHelper(grid, metisVisitor); + //intHelper.addInteractor(addWallZminInt); + //intHelper.addInteractor(addWallZmaxInt); + intHelper.addInteractor(addWallYminInt); + intHelper.addInteractor(addWallYmaxInt); + //intHelper.addInteractor(wall45Int); + intHelper.selectBlocks(); + if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - end"); + ////////////////////////////////////// + + SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm)); + ppblocks->process(0); + + unsigned long nob = grid->getNumberOfBlocks(); + int gl = 3; + unsigned long nodb = (blocknx[0]) * (blocknx[1]) * (blocknx[2]); + unsigned long nod = nob * (blocknx[0]) * (blocknx[1]) * (blocknx[2]); + unsigned long nodg = nob * (blocknx[0] + gl) * (blocknx[1] + gl) * (blocknx[1] + gl); + double needMemAll = double(nodg * (27 * sizeof(double) + sizeof(int) + sizeof(float) * 4)); + double needMem = needMemAll / double(comm->getNumberOfProcesses()); + + if (myid == 0) + { + UBLOG(logINFO, "Number of blocks = " << nob); + UBLOG(logINFO, "Number of nodes = " << nod); + int minInitLevel = grid->getCoarsestInitializedLevel(); + int maxInitLevel = grid->getFinestInitializedLevel(); + for (int level = minInitLevel; level <= maxInitLevel; level++) + { + int nobl = grid->getNumberOfBlocks(level); + UBLOG(logINFO, "Number of blocks for level " << level << " = " << nobl); + UBLOG(logINFO, "Number of nodes for level " << level << " = " << nobl * nodb); + } + UBLOG(logINFO, "Necessary memory = " << needMemAll << " bytes"); + UBLOG(logINFO, "Necessary memory per process = " << needMem << " bytes"); + UBLOG(logINFO, "Available memory per process = " << availMem << " bytes"); + } + + SetKernelBlockVisitor kernelVisitor(kernel, k, availMem, needMem); + grid->accept(kernelVisitor); + + //BC + intHelper.setBC(); + + //initialization of distributions + InitDistributionsBlockVisitor initVisitor; + grid->accept(initVisitor); + + + if (myid == 0) UBLOG(logINFO, "Preprozess - end"); + + + //set connectors + InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor()); + SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, k, iProcessor); + grid->accept(setConnsVisitor); + + grid->accept(bcVisitor); + + SPtr<UbScheduler> geoSch(new UbScheduler(1)); + WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), comm); + ppgeo.process(1); + + SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100)); + SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm)); + + //write data for visualization of macroscopic quantities + SPtr<UbScheduler> visSch(new UbScheduler(outTime)); + SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, visSch, pathname, + WbWriterVtkXmlASCII::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + + SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + + SPtr<UbScheduler> stepGhostLayer(new UbScheduler(outTime)); + SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); + calculator->addCoProcessor(npr); + calculator->addCoProcessor(writeMQCoProcessor); + calculator->addCoProcessor(writeThixotropicMQCoProcessor); + //calculator->addCoProcessor(migCoProcessor); + //calculator->addCoProcessor(restartCoProcessor); + + if (myid == 0) UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) UBLOG(logINFO, "Simulation-end"); + } + catch (std::exception& e) + { + cerr << e.what() << endl << flush; + } + catch (std::string& s) + { + cerr << s << endl; + } + catch (...) + { + cerr << "unknown exception" << endl; + } + +} + +////////////////////////////////////////////////////////////////////////// +int main(int argc, char* argv[]) +{ + if (argv != NULL) + { + if (argv[1] != NULL) + { + //pflowForcing(string(argv[1])); + bflow(string(argv[1])); + } + else + { + cout << "Configuration file is missing!" << endl; + } + } + + return 0; +} diff --git a/apps/cpu/HerschelBulkleySphere/CMakeLists.txt b/apps/cpu/HerschelBulkleySphere/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..6902b6c6cca28ff3dccd765d9e16dd5e92a772bd --- /dev/null +++ b/apps/cpu/HerschelBulkleySphere/CMakeLists.txt @@ -0,0 +1,6 @@ +######################################################## +## C++ PROJECT ### +######################################################## +PROJECT(HerschelBulkleySphere) + +vf_add_library(BUILDTYPE binary PRIVATE_LINK 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 0000000000000000000000000000000000000000..ee4b49ef79ab0a589f355725a5b5bd61a376ee4c --- /dev/null +++ b/apps/cpu/HerschelBulkleySphere/hbsphere.cfg @@ -0,0 +1,29 @@ +outputPath = d:/temp/Herschel-Bulkley_sphere_Re_200_n_0.3_Bn_0.01_slip + +numOfThreads = 4 +availMem = 8e9 +logToFile = false + +blocknx = 25 25 25 +boundingBox = 125 50 50 +deltax = 1 + +refineLevel = 0 + +radius = 5 +sphereCenter = 25 25 25 + +velocity = 1e-3 +n = 0.3 +Re = 200 +Bn = 0.01 + + +newStart = true +restartStep = 100000 + +cpStart = 100000 +cpStep = 100000 + +outTime = 10000 +endTime = 100000 \ 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 0000000000000000000000000000000000000000..bfbf4d9ab58f168d9383c42b36aec614e8b85831 --- /dev/null +++ b/apps/cpu/HerschelBulkleySphere/hbsphere.cpp @@ -0,0 +1,388 @@ +#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"); + vector<double> sphereCenter = config.getVector<double>("sphereCenter"); + + 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); + + //double k = 0.05; // (U * d) / (Re * std::pow(Gamma, n - 1)); + //double tau0 = 3e-6; //Bn * k * std::pow(Gamma, n); + + //double forcing = 8e-7; + + double omegaMin = 1.0e-8; + + SPtr<Thixotropy> thix = Thixotropy::getInstance(); + thix->setPowerIndex(n); + thix->setViscosityParameter(k); + thix->setYieldStress(tau0); + thix->setOmegaMin(omegaMin); + + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm())); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new HerschelBulkleyModelNoSlipBCAlgorithm())); + //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new BinghamModelNoSlipBCAlgorithm())); + + SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter()); + slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleSlipBCAlgorithm())); + + mu::Parser fct; + fct.SetExpr("U"); + fct.DefineConst("U", velocity); + //double H = boundingBox[1]; + //mu::Parser fct; + //fct.SetExpr("16*U*x2*x3*(H-x2)*(H-x3)/H^4"); + //fct.DefineConst("U", U); + //fct.DefineConst("H", H); + SPtr<BCAdapter> velocityBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST)); + velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm())); + //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm())); + + SPtr<BCAdapter> densityBCAdapter(new DensityBCAdapter()); + densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm())); + //densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm())); + + + //BS visitor + BoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + bcVisitor.addBC(slipBCAdapter); + bcVisitor.addBC(velocityBCAdapter); + bcVisitor.addBC(densityBCAdapter); + + SPtr<BCProcessor> bcProc; + bcProc = SPtr<BCProcessor>(new BCProcessor()); + + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantLBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CompressibleCumulant4thOrderViscosityLBMKernel()); + SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyK17LBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel()); + kernel->setBCProcessor(bcProc); + //kernel->setForcingX1(forcing); + //kernel->setWithForcing(true); + + SPtr<Grid3D> grid(new Grid3D(comm)); + grid->setPeriodicX1(false); + grid->setPeriodicX2(true); + grid->setPeriodicX3(true); + grid->setDeltaX(deltax); + grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]); + + SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3)); + if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); + + //sphere + SPtr<GbObject3D> sphere(new GbSphere3D(sphereCenter[0], sphereCenter[1], sphereCenter[2], 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<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, outputPath, comm)); + restartCoProcessor->setLBMKernel(kernel); + restartCoProcessor->setBCProcessor(bcProc); + //restartCoProcessor->setNu(k); + ////////////////////////////////////////////////////////////////////////// + + if (myid == 0) + { + UBLOG(logINFO, "Parameters:"); + //UBLOG(logINFO, "forcing = " << forcing); + UBLOG(logINFO, "rho = " << rhoLB); + UBLOG(logINFO, "U = " << U); + UBLOG(logINFO, "Re = " << (U * d) / (k * std::pow(Gamma, n - 1))); + UBLOG(logINFO, "Bn = " << tau0 /(k * std::pow(Gamma, n))); + UBLOG(logINFO, "k = " << k); + UBLOG(logINFO, "n = " << n); + UBLOG(logINFO, "tau0 = " << tau0); + UBLOG(logINFO, "deltax = " << deltax); + UBLOG(logINFO, "number of levels = " << refineLevel + 1); + UBLOG(logINFO, "number of threads = " << numOfThreads); + UBLOG(logINFO, "number of processes = " << comm->getNumberOfProcesses()); + UBLOG(logINFO, "blocknx = " << blocknx[0] << " " << blocknx[1] << " " << blocknx[2]); + UBLOG(logINFO, "boundingBox = " << boundingBox[0] << " " << boundingBox[1] << " " << boundingBox[2]); + UBLOG(logINFO, "sphereCenter = " << sphereCenter[0] << " " << sphereCenter[1] << " " << sphereCenter[2]); + UBLOG(logINFO, "output path = " << outputPath); + UBLOG(logINFO, "Preprozess - start"); + } + + if (newStart) + { + GenBlocksGridVisitor genBlocks(gridCube); + grid->accept(genBlocks); + + if (refineLevel > 0) + { + GbCuboid3DPtr refCube(new GbCuboid3D(-10, -10, -10, 0, 0, 0)); + if (myid == 0) GbSystem3D::writeGeoObject(refCube.get(), outputPath + "/geo/refCube", WbWriterVtkXmlASCII::getInstance()); + + if (myid == 0) UBLOG(logINFO, "Refinement - start"); + RefineCrossAndInsideGbObjectHelper refineHelper(grid, refineLevel, comm); + //refineHelper.addGbObject(sphere, refineLevel); + refineHelper.addGbObject(refCube, refineLevel); + refineHelper.refine(); + if (myid == 0) UBLOG(logINFO, "Refinement - end"); + } + + //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, slipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, slipBCAdapter, Interactor3D::SOLID)); + + SPtr<D3Q27Interactor> wallYminInt(new D3Q27Interactor(wallYmin, grid, slipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> wallYmaxInt(new D3Q27Interactor(wallYmax, grid, slipBCAdapter, 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(wallXminInt); + intHelper.addInteractor(wallXmaxInt); + intHelper.addInteractor(wallYminInt); + intHelper.addInteractor(wallYmaxInt); + intHelper.addInteractor(wallZminInt); + intHelper.addInteractor(wallZmaxInt); + 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); + + if (refineLevel > 0) + { + SetUndefinedNodesBlockVisitor undefNodesVisitor; + grid->accept(undefNodesVisitor); + } + + //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); + SetBcBlocksBlockVisitor v(sphereInt); + grid->accept(v); + sphereInt->initInteractor(); + } + + omp_set_num_threads(numOfThreads); + + //set connectors + InterpolationProcessorPtr iProcessor(new ThixotropyInterpolationProcessor()); + static_pointer_cast<ThixotropyInterpolationProcessor>(iProcessor)->setOmegaMin(thix->getOmegaMin()); + 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, WbWriterVtkXmlASCII::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, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + //writeMQCoProcessor->process(0); + + double area = UbMath::PI*radius*radius; + SPtr<UbScheduler> forceSch(new UbScheduler(100)); + SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, outputPath + "/forces/forces.txt", comm, velocity, area); + fp->addInteractor(sphereInt); + + SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + + SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1)); + SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); + calculator->addCoProcessor(npr); + calculator->addCoProcessor(fp); + calculator->addCoProcessor(writeMQCoProcessor); + calculator->addCoProcessor(writeThixotropicMQCoProcessor); + calculator->addCoProcessor(restartCoProcessor); + + if (myid == 0) UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) UBLOG(logINFO, "Simulation-end"); + } + catch (std::exception& e) + { + cerr << e.what() << endl << flush; + } + catch (std::string& s) + { + cerr << s << endl; + } + catch (...) + { + cerr << "unknown exception" << endl; + } + +} + +////////////////////////////////////////////////////////////////////////// +int main(int argc, char* argv[]) +{ + if (argv != NULL) + { + if (argv[1] != NULL) + { + //pflowForcing(string(argv[1])); + bflow(string(argv[1])); + } + else + { + cout << "Configuration file is missing!" << endl; + } + } + + return 0; +} diff --git a/apps/cpu/rheometer/CMakeLists.txt b/apps/cpu/rheometer/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..d8a534096569e7c70ad4db41e0bb72decfcc5a8c --- /dev/null +++ b/apps/cpu/rheometer/CMakeLists.txt @@ -0,0 +1,6 @@ +######################################################## +## C++ PROJECT ### +######################################################## +PROJECT(rheometer) + +vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES rheometer.cpp ) \ No newline at end of file diff --git a/apps/cpu/rheometer/rheometer.cfg b/apps/cpu/rheometer/rheometer.cfg new file mode 100644 index 0000000000000000000000000000000000000000..f5d9fef26c61f9756875823c4b8a809d8bbb94e8 --- /dev/null +++ b/apps/cpu/rheometer/rheometer.cfg @@ -0,0 +1,31 @@ +outputPath = d:/temp/rheometer/rheometerBinghamqQBB/rheometerBingham_tau_20e-7_nu_1.5e-3_new_lim + +viscosityPath = d:/Projects/VirtualFluidsCombined/apps/cpu/rheometer + +numOfThreads = 4 +availMem = 8e9 +logToFile = false + +blocknx = 8 8 1 +#boundingBox = 32 32 1 +deltax = 1 + +#boundingBox = 0.02 0.02 0.00125 +#deltax = 0.000625 + +refineLevel = 0 + +OmegaLB = 4e-5 +tau0 = 20e-7 + +resolution = 32 +scaleFactor = 1 + +newStart = true +restartStep = 100000 + +cpStart = 10000 +cpStep = 10000 + +outTime = 10000 +endTime = 100000 \ No newline at end of file diff --git a/apps/cpu/rheometer/rheometer.cpp b/apps/cpu/rheometer/rheometer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..96c50e5c3c2640ac76b8582ab24432316c130397 --- /dev/null +++ b/apps/cpu/rheometer/rheometer.cpp @@ -0,0 +1,424 @@ +#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"); + string viscosityPath = config.getValue<string>("viscosityPath"); + int numOfThreads = config.getValue<int>("numOfThreads"); + vector<int> blocknx = config.getVector<int>("blocknx"); + //vector<double> boundingBox = config.getVector<double>("boundingBox"); + //double nuLB = 1.5e-3;//config.getValue<double>("nuLB"); + double endTime = config.getValue<double>("endTime"); + double outTime = config.getValue<double>("outTime"); + double availMem = config.getValue<double>("availMem"); + int refineLevel = config.getValue<int>("refineLevel"); + bool logToFile = config.getValue<bool>("logToFile"); + double restartStep = config.getValue<double>("restartStep"); + double deltax = config.getValue<double>("deltax"); + double cpStep = config.getValue<double>("cpStep"); + double cpStart = config.getValue<double>("cpStart"); + bool newStart = config.getValue<bool>("newStart"); + double OmegaLB = config.getValue<double>("OmegaLB"); + double tau0 = config.getValue<double>("tau0"); + double scaleFactor = config.getValue<double>("scaleFactor"); + double resolution = config.getValue<double>("resolution"); + + ConfigurationFile viscosity; + viscosity.load(viscosityPath + "/viscosity.cfg"); + double nuLB = viscosity.getValue<double>("nuLB"); + + outputPath = outputPath + "/rheometerBingham_" + config.getValue<string>("resolution") + "_" + config.getValue<string>("OmegaLB"); + + 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; + + //akoustic + OmegaLB /= scaleFactor; + nuLB *=scaleFactor; + endTime *= scaleFactor; + //outTime = endTime; + cpStart = endTime; + cpStep = endTime; + +//diffusive + //OmegaLB /= scaleFactor * scaleFactor; + //tau0 /= scaleFactor * scaleFactor; + //endTime *= scaleFactor * scaleFactor; + //outTime = endTime; + //cpStart = endTime; + //cpStep = endTime; + + SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter()); + // double uWorld = (N * PI) / 30.0; //0.0037699111843 + // double rhoWorld = 2350.0; //kg/m^3 + //double R0 = boundingBox[0] * 0.5; + + //SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter(deltax, uWorld*R0, rhoWorld, 1.0, uLB)); + //if (myid == 0) UBLOG(logINFO, conv->toString()); + + //bounding box + + double g_minX1 = 0; + double g_minX2 = 0; + double g_minX3 = 0; + + double g_maxX1 = resolution;// boundingBox[0]; + double g_maxX2 = resolution;// boundingBox[1]; + double g_maxX3 = 1.0; // 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 = uLB; + // double Gamma = U / d; + + // double muWorld = 20; //Pa*s + // double k = 0.0015; // muWorld / rhoWorld * conv->getFactorViscosityWToLb(); //(U * d) / (Re); + + // //double k = (U * d) / (Re * std::pow(Gamma, n - 1)); + // double yielStressWorld = 20; //Pa + // double tau0 = 1e-6;// 3e-6;//yielStressWorld * conv->getFactorPressureWToLb(); //Bn * k * std::pow(Gamma, n); + + //double k = 0.05; // (U * d) / (Re * std::pow(Gamma, n - 1)); + //double tau0 = 3e-6; //Bn * k * std::pow(Gamma, n); + + //double forcing = 8e-7; + + //double omegaMin = 1.0e-8; + + SPtr<Thixotropy> thix = Thixotropy::getInstance(); + //thix->setPowerIndex(n); + //thix->setViscosityParameter(k); + thix->setYieldStress(tau0); + //thix->setOmegaMin(omegaMin); + + SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); + //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm())); + //noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new HerschelBulkleyModelNoSlipBCAlgorithm())); + noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new BinghamModelNoSlipBCAlgorithm())); + + //SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter()); + //slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleSlipBCAlgorithm())); + + mu::Parser fctVx; + //fctVx.SetExpr("omega*(r-x2)"); + fctVx.SetExpr("-Omega*(x2-r)"); + fctVx.DefineConst("Omega", OmegaLB); + //fctVx.DefineConst("r", R0); + fctVx.DefineConst("r", g_maxX1*0.5); + + mu::Parser fctVy; + fctVy.SetExpr("Omega*(x1-r)"); + fctVy.DefineConst("Omega", OmegaLB); + //fctVy.DefineConst("r", R0); + fctVy.DefineConst("r", g_maxX2 * 0.5); + + mu::Parser fctVz; + fctVz.SetExpr("0.0"); + + SPtr<BCAdapter> velocityBCAdapter(new VelocityBCAdapter(true, true, true, fctVx, fctVy, fctVz, 0, BCFunction::INFCONST)); + //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm())); + //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm())); + //velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityWithDensityBCAlgorithm())); + velocityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new BinghamModelVelocityBCAlgorithm())); + + //SPtr<BCAdapter> densityBCAdapter(new DensityBCAdapter()); + //densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm())); + ////densityBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonReflectingOutflowBCAlgorithm())); + + + //BS visitor + BoundaryConditionsBlockVisitor bcVisitor; + bcVisitor.addBC(noSlipBCAdapter); + //bcVisitor.addBC(slipBCAdapter); + bcVisitor.addBC(velocityBCAdapter); + //bcVisitor.addBC(densityBCAdapter); + + SPtr<BCProcessor> bcProc; + bcProc = SPtr<BCProcessor>(new BCProcessor()); + + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CumulantLBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new CompressibleCumulant4thOrderViscosityLBMKernel()); + SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new RheologyK17LBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new HerschelBulkleyModelLBMKernel()); + //SPtr<LBMKernel> kernel = SPtr<LBMKernel>(new BinghamModelLBMKernel()); + kernel->setBCProcessor(bcProc); + //kernel->setForcingX1(forcing); + //kernel->setWithForcing(true); + + SPtr<Grid3D> grid(new Grid3D(comm)); + grid->setPeriodicX1(false); + grid->setPeriodicX2(false); + grid->setPeriodicX3(true); + grid->setDeltaX(deltax); + grid->setBlockNX(blocknx[0], blocknx[1], blocknx[2]); + + SPtr<GbObject3D> gridCube(new GbCuboid3D(g_minX1, g_minX2, g_minX3, g_maxX1, g_maxX2, g_maxX3)); + if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); + + ////////////////////////////////////////////////////////////////////////// + //restart + SPtr<UbScheduler> mSch(new UbScheduler(cpStep, cpStart)); + SPtr<MPIIOMigrationCoProcessor> restartCoProcessor(new MPIIOMigrationCoProcessor(grid, mSch, outputPath, comm)); + restartCoProcessor->setLBMKernel(kernel); + restartCoProcessor->setBCProcessor(bcProc); + //restartCoProcessor->setNu(k); + ////////////////////////////////////////////////////////////////////////// + + ////stator + SPtr<GbObject3D> stator(new GbCylinder3D(0.5 * g_maxX1, 0.5 * g_maxX2, g_minX3-2.0*deltax, 0.5 * g_maxX1, 0.5 * g_maxX2, g_maxX3+ 2.0 * deltax, 0.5 * g_maxX1)); + GbSystem3D::writeGeoObject(stator.get(), outputPath + "/geo/stator", WbWriterVtkXmlBinary::getInstance()); + + SPtr<D3Q27Interactor> statorInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(stator, grid, velocityBCAdapter, Interactor3D::INVERSESOLID)); + + ////rotor (cylinder) + SPtr<GbObject3D> rotor(new GbCylinder3D(0.5 * g_maxX1, 0.5 * g_maxX2, g_minX3- 2.0 * deltax, 0.5 * g_maxX1, 0.5 * g_maxX2, g_maxX3+ 2.0 * deltax, 0.25 * g_maxX1)); + GbSystem3D::writeGeoObject(rotor.get(), outputPath + "/geo/rotor", WbWriterVtkXmlBinary::getInstance()); + + SPtr<D3Q27Interactor> rotorInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(rotor, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + if (myid == 0) + { + UBLOG(logINFO, "Parameters:"); + //UBLOG(logINFO, "forcing = " << forcing); + UBLOG(logINFO, "rho = " << rhoLB); + UBLOG(logINFO, "uLB = " << OmegaLB); + UBLOG(logINFO, "nuLB = " << nuLB); + // UBLOG(logINFO, "Re = " << (U * d) / (k * std::pow(Gamma, n - 1))); + // UBLOG(logINFO, "Bn = " << tau0 /(k * std::pow(Gamma, n))); + // UBLOG(logINFO, "k = " << k); + // UBLOG(logINFO, "n = " << n); + UBLOG(logINFO, "tau0 = " << tau0); + UBLOG(logINFO, "scaleFactor = " << scaleFactor); + 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, "blocknx = " << blocknx[0] << " " << blocknx[1] << " " << blocknx[2]); + UBLOG(logINFO, "resolution = " << resolution); + // UBLOG(logINFO, "boundingBox = " << boundingBox[0] << " " << boundingBox[1] << " " << boundingBox[2]); + // UBLOG(logINFO, "sphereCenter = " << sphereCenter[0] << " " << sphereCenter[1] << " " << sphereCenter[2]); + UBLOG(logINFO, "output path = " << outputPath); + UBLOG(logINFO, "Preprozess - start"); + } + + if (newStart) + { + GenBlocksGridVisitor genBlocks(gridCube); + grid->accept(genBlocks); + + if (refineLevel > 0) + { + GbCuboid3DPtr refCube(new GbCuboid3D(-10, -10, -10, 0, 0, 0)); + if (myid == 0) GbSystem3D::writeGeoObject(refCube.get(), outputPath + "/geo/refCube", WbWriterVtkXmlASCII::getInstance()); + + if (myid == 0) UBLOG(logINFO, "Refinement - start"); + RefineCrossAndInsideGbObjectHelper refineHelper(grid, refineLevel, comm); + //refineHelper.addGbObject(sphere, refineLevel); + refineHelper.addGbObject(refCube, refineLevel); + refineHelper.refine(); + if (myid == 0) UBLOG(logINFO, "Refinement - end"); + } + + + //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()); + + ////wall interactors + //SPtr<D3Q27Interactor> wallZminInt(new D3Q27Interactor(wallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); + //SPtr<D3Q27Interactor> wallZmaxInt(new D3Q27Interactor(wallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + + //////////////////////////////////////////// + //METIS + SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::KWAY)); + //////////////////////////////////////////// + /////delete solid blocks + if (myid == 0) UBLOG(logINFO, "deleteSolidBlocks - start"); + InteractorsHelper intHelper(grid, metisVisitor); + //intHelper.addInteractor(wallZminInt); + //intHelper.addInteractor(wallZmaxInt); + intHelper.addInteractor(statorInt); + intHelper.addInteractor(rotorInt); + 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, nuLB, availMem, needMem); + grid->accept(kernelVisitor); + + if (refineLevel > 0) + { + SetUndefinedNodesBlockVisitor undefNodesVisitor; + grid->accept(undefNodesVisitor); + } + + //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); + SetBcBlocksBlockVisitor v1(rotorInt); + grid->accept(v1); + rotorInt->initInteractor(); + SetBcBlocksBlockVisitor v2(statorInt); + grid->accept(v2); + statorInt->initInteractor(); + } + + omp_set_num_threads(numOfThreads); + + //set connectors + InterpolationProcessorPtr iProcessor(new ThixotropyInterpolationProcessor()); + static_pointer_cast<ThixotropyInterpolationProcessor>(iProcessor)->setOmegaMin(thix->getOmegaMin()); + SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor); + grid->accept(setConnsVisitor); + + grid->accept(bcVisitor); + + SPtr<UbScheduler> geoSch(new UbScheduler(1)); + WriteBoundaryConditionsCoProcessor ppgeo = WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlASCII::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, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + //writeMQCoProcessor->process(0); + + SPtr<UbScheduler> forceSch(new UbScheduler(100)); + SPtr<CalculateTorqueCoProcessor> fp = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueRotor.txt", comm); + fp->addInteractor(rotorInt); + SPtr<CalculateTorqueCoProcessor> fp2 = make_shared<CalculateTorqueCoProcessor>(grid, forceSch, outputPath + "/torque/TorqueStator.txt", comm); + fp2->addInteractor(statorInt); + + SPtr<WriteThixotropyQuantitiesCoProcessor> writeThixotropicMQCoProcessor(new WriteThixotropyQuantitiesCoProcessor(grid, visSch, outputPath, WbWriterVtkXmlBinary::getInstance(), SPtr<LBMUnitConverter>(new LBMUnitConverter()), comm)); + + SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1)); + SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); + calculator->addCoProcessor(npr); + calculator->addCoProcessor(fp); + calculator->addCoProcessor(fp2); + calculator->addCoProcessor(writeMQCoProcessor); + calculator->addCoProcessor(writeThixotropicMQCoProcessor); + calculator->addCoProcessor(restartCoProcessor); + + if (myid == 0) UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) UBLOG(logINFO, "Simulation-end"); + } + catch (std::exception& e) + { + cerr << e.what() << endl << flush; + } + catch (std::string& s) + { + cerr << s << endl; + } + catch (...) + { + cerr << "unknown exception" << endl; + } + +} + +////////////////////////////////////////////////////////////////////////// +int main(int argc, char* argv[]) +{ + if (argv != NULL) + { + if (argv[1] != NULL) + { + //pflowForcing(string(argv[1])); + bflow(string(argv[1])); + } + else + { + cout << "Configuration file is missing!" << endl; + } + } + + return 0; +} diff --git a/apps/cpu/rheometer/viscosity.cfg b/apps/cpu/rheometer/viscosity.cfg new file mode 100644 index 0000000000000000000000000000000000000000..bf2822c7b1d6dd42fdcbc513a4e6b39264ab4180 --- /dev/null +++ b/apps/cpu/rheometer/viscosity.cfg @@ -0,0 +1 @@ +nuLB = 1.5e-3 \ No newline at end of file diff --git a/apps/cpu/sphere/CMakeLists.txt b/apps/cpu/sphere/CMakeLists.txt index 77d7e0a41ea36fef0813ace18ee699da481d2ddd..d80737cdd94aa0b912a62acd69dcd30372f6fd82 100644 --- a/apps/cpu/sphere/CMakeLists.txt +++ b/apps/cpu/sphere/CMakeLists.txt @@ -1,25 +1,6 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) - ######################################################## ## C++ PROJECT ### ######################################################## PROJECT(sphere) -INCLUDE(${APPS_ROOT}/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(sphere BINARY) +vf_add_library(BUILDTYPE binary PRIVATE_LINK VirtualFluidsCore basics ${MPI_CXX_LIBRARIES} FILES sphere.cpp ) \ No newline at end of file diff --git a/apps/cpu/sphere/config.txt b/apps/cpu/sphere/config.txt index cbd03fd4bb66449608a1ea07a79295b3bf340acb..aedb74bf054561257683e86c8991c6a3d8800d7a 100644 --- a/apps/cpu/sphere/config.txt +++ b/apps/cpu/sphere/config.txt @@ -1,7 +1,7 @@ -#Ordner für Simulationsergebnisse +#Ordner f�r Simulationsergebnisse path=d:/temp/sphere -#Verfügbare Arbeitsspeicher in Byte +#Verf�gbare Arbeitsspeicher in Byte memory=3e9 #Pfad zum Metafile @@ -11,12 +11,12 @@ metafile=d:/Data/insituDemo/metafile.csv outstep=1 #maximale Anzahl Simulationszeitschritte -endstep=100000 +endstep=10 #Anzahl von Threads threads=1 #max refierment level (1 - 5) -level=4 +level=1 test = true \ No newline at end of file diff --git a/apps/cpu/sphere/sphere.cpp b/apps/cpu/sphere/sphere.cpp index 872e7b81f402f5288eaf8b0f56678d7dfb4c34d9..388d36718312e74958ef54e6eadd071ef11507bc 100644 --- a/apps/cpu/sphere/sphere.cpp +++ b/apps/cpu/sphere/sphere.cpp @@ -9,110 +9,94 @@ void run(string configname) { try { - - //Sleep(30000); - - string machine = QUOTEME(CAB_MACHINE); - SPtr<Communicator> comm = MPICommunicator::getInstance(); int myid = comm->getProcessID(); int mybundle = comm->getBundleID(); int root = comm->getRoot(); - //ConfigFileReader cf(cstr); - //if ( !cf.read() ) - //{ - // std::string exceptionText = "Unable to read configuration file\n"; - // throw exceptionText; - //} - - //pathname = cf.getValue("path"); - //availMem = UbSystem::stringTo<double>(cf.getValue("memory")); - //string metafile = cf.getValue("metafile"); - //double outstep = UbSystem::stringTo<double>(cf.getValue("outstep")); - //double endstep = UbSystem::stringTo<double>(cf.getValue("endstep")); - //int numOfThreads = UbSystem::stringTo<int>(cf.getValue("threads")); - - ConfigurationFile config; - config.load(configname); - - string pathname = config.getValue<string>("path"); - double availMem = config.getValue<double>("memory"); - string metafile = config.getValue<string>("metafile"); - double outstep = config.getValue<double>("outstep"); - double endstep = config.getValue<double>("endstep"); - int numOfThreads = config.getValue<int>("threads"); - const int refineLevel = config.getValue<int>("level"); - - bool test = config.getValue<bool>("test"); - - LBMReal radius = 4; - LBMReal uLB = 0.1; + //ConfigurationFile config; + //config.load(configname); + + //string pathname = config.getValue<string>("path"); + //double availMem = config.getValue<double>("memory"); + //string metafile = config.getValue<string>("metafile"); + //double outstep = config.getValue<double>("outstep"); + //double endstep = config.getValue<double>("endstep"); + //int numOfThreads = config.getValue<int>("threads"); + //const int refineLevel = config.getValue<int>("level"); + + string outputPath = "d:/temp/sphereBlock_5_SBB"; + double availMem = 8e9; + double outstep = 10000; + double endstep = 1e6; + int numOfThreads = 4; + omp_set_num_threads(numOfThreads); + int refineLevel = 0; + + LBMReal radius = 5; + LBMReal uLB = 1e-3; LBMReal Re = 1; LBMReal rhoLB = 0.0; - //LBMReal nuLB = (uLB*2.0*radius)/Re; - //LBMReal nuLB = (uLB*L2)/Re; - LBMReal nuLB = 0.168666666667/100; + LBMReal nuLB = (uLB*2.0*radius)/Re; double dp_LB = 1e-6; double rhoLBinflow = dp_LB*3.0; SPtr<BCAdapter> noSlipBCAdapter(new NoSlipBCAdapter()); noSlipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NoSlipBCAlgorithm())); + SPtr<BCAdapter> slipBCAdapter(new SlipBCAdapter()); + slipBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleSlipBCAlgorithm())); + double H = 50; mu::Parser fct; fct.SetExpr("U"); fct.DefineConst("U", uLB); + //mu::Parser fct; + //fct.SetExpr("16*U*x2*x3*(H-x2)*(H-x3)/H^4"); + //fct.DefineConst("U", uLB); + //fct.DefineConst("H", H); SPtr<BCAdapter> velBCAdapter(new VelocityBCAdapter(true, false, false, fct, 0, BCFunction::INFCONST)); - velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm())); + //velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new VelocityBCAlgorithm())); + velBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new SimpleVelocityBCAlgorithm())); SPtr<BCAdapter> denBCAdapter(new DensityBCAdapter(rhoLB)); denBCAdapter->setBcAlgorithm(SPtr<BCAlgorithm>(new NonEqDensityBCAlgorithm())); BoundaryConditionsBlockVisitor bcVisitor; bcVisitor.addBC(noSlipBCAdapter); + bcVisitor.addBC(slipBCAdapter); bcVisitor.addBC(velBCAdapter); bcVisitor.addBC(denBCAdapter); - SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter()); - double dx = 1; - const int blocknx1 = 8; - const int blocknx2 = 8; - const int blocknx3 = 8; - - const int gridNx1 = 4;//18; - const int gridNx2 = 4;// 11; - const int gridNx3 = 4;// 11; - - //const int blocknx1 = 40; - //const int blocknx2 = 40; - //const int blocknx3 = 40; + const int blocknx1 = 50; + const int blocknx2 = 50; + const int blocknx3 = 50; - //const int gridNx1 = 2; - //const int gridNx2 = 2; - //const int gridNx3 = 2; - - double L1 = gridNx1*blocknx1; - double L2, L3; - L2 = gridNx2*blocknx1; - L3 = gridNx3*blocknx1; + const int gridNx1 = 150; + const int gridNx2 = H; + const int gridNx3 = H; + double L1, L2, L3; + L1 = gridNx1; + L2 = gridNx2; + L3 = gridNx3; + SPtr<LBMUnitConverter> conv = SPtr<LBMUnitConverter>(new LBMUnitConverter()); SPtr<Grid3D> grid(new Grid3D(comm)); grid->setDeltaX(dx); grid->setBlockNX(blocknx1, blocknx2, blocknx3); - ////////////////////////////////////////////////////////////////////////// - //restart - SPtr<UbScheduler> restartSch(new UbScheduler(100000, 100000, 100000)); - RestartCoProcessor rp(grid, restartSch, comm, pathname, RestartCoProcessor::BINARY); - ////////////////////////////////////////////////////////////////////////// + //sphere + //SPtr<GbObject3D> sphere(new GbSphere3D(L1 * 0.5, L2 * 0.5, L3 * 0.5, radius)); + SPtr<GbObject3D> sphere(new GbSphere3D(75, 25, 25, radius)); + GbSystem3D::writeGeoObject(sphere.get(), outputPath + "/geo/sphere", WbWriterVtkXmlBinary::getInstance()); + SPtr<D3Q27Interactor> sphereInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(sphere, grid, noSlipBCAdapter, Interactor3D::SOLID)); - if (grid->getTimeStep() == 0) + if (true) { const int baseLevel = 0; @@ -142,70 +126,54 @@ void run(string configname) } SPtr<GbObject3D> gridCube(new GbCuboid3D(d_minX1, d_minX2, d_minX3, d_maxX1, d_maxX2, d_maxX3)); - if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), pathname + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); + if (myid == 0) GbSystem3D::writeGeoObject(gridCube.get(), outputPath + "/geo/gridCube", WbWriterVtkXmlBinary::getInstance()); GenBlocksGridVisitor genBlocks(gridCube); grid->accept(genBlocks); - //sphere - //SPtr<GbObject3D> sphereRef(new GbSphere3D(L1/4.0, L2*0.5, L3*0.5, radius+1.0)); - //GbSystem3D::writeGeoObject(sphereRef.get(),pathname + "/geo/sphereRef", WbWriterVtkXmlBinary::getInstance()); - - - //sphere - SPtr<GbObject3D> sphere(new GbSphere3D(L1 / 2.0, L2*0.5, L3*0.5, radius)); - //SPtr<GbObject3D> sphere(new GbSphere3D(L1/2.0-4.0, L2*0.5+4.0, L3*0.5+4.0, radius)); - //SPtr<GbObject3D> sphere(new GbCuboid3D(L1/4.0-radius, L2/2.0-radius, L3/2.0-radius, L1/4.0+radius, L2/2.0+radius, L3/2.0+radius)); - GbSystem3D::writeGeoObject(sphere.get(), pathname + "/geo/sphere", WbWriterVtkXmlBinary::getInstance()); - double off = 0.0; SPtr<GbObject3D> refCube(new GbCuboid3D(sphere->getX1Minimum() - off, sphere->getX2Minimum() - off, sphere->getX3Minimum(), sphere->getX1Maximum() + off, sphere->getX2Maximum() + off, sphere->getX3Maximum())); - if (myid == 0) GbSystem3D::writeGeoObject(refCube.get(), pathname + "/geo/refCube", WbWriterVtkXmlBinary::getInstance()); + if (myid == 0) GbSystem3D::writeGeoObject(refCube.get(), outputPath + "/geo/refCube", WbWriterVtkXmlBinary::getInstance()); if (refineLevel > 0) { if (myid == 0) UBLOG(logINFO, "Refinement - start"); RefineCrossAndInsideGbObjectHelper refineHelper(grid, refineLevel, comm); - refineHelper.addGbObject(sphere, refineLevel); - //refineHelper.addGbObject(refCube, refineLevel); + //refineHelper.addGbObject(sphere, refineLevel); + refineHelper.addGbObject(refCube, refineLevel); refineHelper.refine(); if (myid == 0) UBLOG(logINFO, "Refinement - end"); } //walls GbCuboid3DPtr addWallYmin(new GbCuboid3D(d_minX1 - 4.0*blockLength, d_minX2 - 4.0*blockLength, d_minX3 - 4.0*blockLength, d_maxX1 + 4.0*blockLength, d_minX2, d_maxX3 + 4.0*blockLength)); - if (myid == 0) GbSystem3D::writeGeoObject(addWallYmin.get(), pathname + "/geo/addWallYmin", WbWriterVtkXmlASCII::getInstance()); + if (myid == 0) GbSystem3D::writeGeoObject(addWallYmin.get(), outputPath + "/geo/addWallYmin", WbWriterVtkXmlASCII::getInstance()); GbCuboid3DPtr addWallZmin(new GbCuboid3D(d_minX1 - 4.0*blockLength, d_minX2 - 4.0*blockLength, d_minX3 - 4.0*blockLength, d_maxX1 + 4.0*blockLength, d_maxX2 + 4.0*blockLength, d_minX3)); - if (myid == 0) GbSystem3D::writeGeoObject(addWallZmin.get(), pathname + "/geo/addWallZmin", WbWriterVtkXmlASCII::getInstance()); + if (myid == 0) GbSystem3D::writeGeoObject(addWallZmin.get(), outputPath + "/geo/addWallZmin", WbWriterVtkXmlASCII::getInstance()); GbCuboid3DPtr addWallYmax(new GbCuboid3D(d_minX1 - 4.0*blockLength, d_maxX2, d_minX3 - 4.0*blockLength, d_maxX1 + 4.0*blockLength, d_maxX2 + 4.0*blockLength, d_maxX3 + 4.0*blockLength)); - if (myid == 0) GbSystem3D::writeGeoObject(addWallYmax.get(), pathname + "/geo/addWallYmax", WbWriterVtkXmlASCII::getInstance()); + if (myid == 0) GbSystem3D::writeGeoObject(addWallYmax.get(), outputPath + "/geo/addWallYmax", WbWriterVtkXmlASCII::getInstance()); GbCuboid3DPtr addWallZmax(new GbCuboid3D(d_minX1 - 4.0*blockLength, d_minX2 - 4.0*blockLength, d_maxX3, d_maxX1 + 4.0*blockLength, d_maxX2 + 4.0*blockLength, d_maxX3 + 4.0*blockLength)); - if (myid == 0) GbSystem3D::writeGeoObject(addWallZmax.get(), pathname + "/geo/addWallZmax", WbWriterVtkXmlASCII::getInstance()); + if (myid == 0) GbSystem3D::writeGeoObject(addWallZmax.get(), outputPath + "/geo/addWallZmax", WbWriterVtkXmlASCII::getInstance()); //inflow GbCuboid3DPtr geoInflow(new GbCuboid3D(d_minX1 - 4.0*blockLength, d_minX2 - 4.0*blockLength, d_minX3 - 4.0*blockLength, d_minX1, d_maxX2 + 4.0*blockLength, d_maxX3 + 4.0*blockLength)); - if (myid == 0) GbSystem3D::writeGeoObject(geoInflow.get(), pathname + "/geo/geoInflow", WbWriterVtkXmlASCII::getInstance()); + if (myid == 0) GbSystem3D::writeGeoObject(geoInflow.get(), outputPath + "/geo/geoInflow", WbWriterVtkXmlASCII::getInstance()); //outflow GbCuboid3DPtr geoOutflow(new GbCuboid3D(d_maxX1, d_minX2 - 4.0*blockLength, d_minX3 - 4.0*blockLength, d_maxX1 + 4.0*blockLength, d_maxX2 + 4.0*blockLength, d_maxX3 + 4.0*blockLength)); - if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), pathname + "/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance()); + if (myid == 0) GbSystem3D::writeGeoObject(geoOutflow.get(), outputPath + "/geo/geoOutflow", WbWriterVtkXmlASCII::getInstance()); - WriteBlocksSPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm)); - - - - //sphere - SPtr<D3Q27Interactor> sphereInt = SPtr<D3Q27Interactor>(new D3Q27Interactor(sphere, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<CoProcessor> ppblocks(new WriteBlocksCoProcessor(grid, SPtr<UbScheduler>(new UbScheduler(1)), outputPath, WbWriterVtkXmlBinary::getInstance(), comm)); //walls - SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); - SPtr<D3Q27Interactor> addWallZminInt(new D3Q27Interactor(addWallZmin, grid, noSlipBCAdapter, Interactor3D::SOLID)); - SPtr<D3Q27Interactor> addWallYmaxInt(new D3Q27Interactor(addWallYmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); - SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, noSlipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> addWallYminInt(new D3Q27Interactor(addWallYmin, grid, slipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> addWallZminInt(new D3Q27Interactor(addWallZmin, grid, slipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> addWallYmaxInt(new D3Q27Interactor(addWallYmax, grid, slipBCAdapter, Interactor3D::SOLID)); + SPtr<D3Q27Interactor> addWallZmaxInt(new D3Q27Interactor(addWallZmax, grid, slipBCAdapter, Interactor3D::SOLID)); mu::Parser fct; fct.SetExpr("U"); @@ -223,7 +191,7 @@ void run(string configname) SPtr<Grid3DVisitor> metisVisitor(new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::B)); InteractorsHelper intHelper(grid, metisVisitor); - //intHelper.addInteractor(sphereInt); + intHelper.addInteractor(sphereInt); intHelper.addInteractor(addWallYminInt); intHelper.addInteractor(addWallZminInt); intHelper.addInteractor(addWallYmaxInt); @@ -232,19 +200,9 @@ void run(string configname) intHelper.addInteractor(outflowInt); intHelper.selectBlocks(); - //domain decomposition for threads - PQueuePartitioningGridVisitor pqPartVisitor(numOfThreads); - grid->accept(pqPartVisitor); - - - //set connectors - InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor()); - SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor); - grid->accept(setConnsVisitor); - - //Block3DSPtr<ConnectorFactory> factory(new Block3DConnectorFactory()); - //ConnectorBlockVisitor setConnsVisitor(comm, nuLB, iProcessor, factory); - //grid->accept(setConnsVisitor); + ////domain decomposition for threads + //PQueuePartitioningGridVisitor pqPartVisitor(numOfThreads); + //grid->accept(pqPartVisitor); ppblocks->process(0); ppblocks.reset(); @@ -265,7 +223,8 @@ void run(string configname) UBLOG(logINFO, "Available memory per process = " << availMem << " bytes"); } - SPtr<LBMKernel> kernel(new IncompressibleCumulantLBMKernel(blocknx1, blocknx2, blocknx3, IncompressibleCumulantLBMKernel::NORMAL)); + SPtr<LBMKernel> kernel(new IncompressibleCumulantLBMKernel()); + //SPtr<LBMKernel> kernel(new CompressibleCumulantLBMKernel()); SPtr<BCProcessor> bcProcessor(new BCProcessor()); @@ -292,51 +251,57 @@ void run(string configname) fctRoh.DefineConst("l", d_maxX1 - d_minX1); //initialization of distributions - InitDistributionsBlockVisitor initVisitor(nuLB, rhoLB); + InitDistributionsBlockVisitor initVisitor; initVisitor.setVx1(fct); //initVisitor.setRho(fctRoh); grid->accept(initVisitor); //Postrozess SPtr<UbScheduler> geoSch(new UbScheduler(1)); - WriteBoundaryConditionsSPtr<CoProcessor> ppgeo( - new WriteBoundaryConditionsCoProcessor(grid, geoSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm)); + SPtr<CoProcessor> ppgeo( + new WriteBoundaryConditionsCoProcessor(grid, geoSch, outputPath, WbWriterVtkXmlBinary::getInstance(), comm)); ppgeo->process(0); - ppgeo.reset();; + ppgeo.reset(); if (myid == 0) UBLOG(logINFO, "Preprozess - end"); } else { UBLOG(logINFO, "SetConnectors - start, id=" << myid); + } - //set connectors - InterpolationProcessorPtr iProcessor(new IncompressibleOffsetInterpolationProcessor()); - //D3Q27SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor); - SPtr<ConnectorFactory> cFactory(new Block3DConnectorFactory()); - ConnectorBlockVisitor setConnsVisitor(comm, nuLB, iProcessor, cFactory); - grid->accept(setConnsVisitor); + - UBLOG(logINFO, "SetConnectors - end, id=" << myid); - } + UBLOG(logINFO, "SetConnectors - start, id=" << myid); + //set connectors + SPtr<InterpolationProcessor> iProcessor(new IncompressibleOffsetInterpolationProcessor()); + //SPtr<CompressibleOffsetMomentsInterpolationProcessor> iProcessor(new CompressibleOffsetMomentsInterpolationProcessor()); + SetConnectorsBlockVisitor setConnsVisitor(comm, true, D3Q27System::ENDDIR, nuLB, iProcessor); + grid->accept(setConnsVisitor); + UBLOG(logINFO, "SetConnectors - end, id=" << myid); SPtr<UbScheduler> stepSch(new UbScheduler(outstep)); //stepSch->addSchedule(10000, 0, 1000000); - WriteMacroscopicQuantitiesCoProcessor pp(grid, stepSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv,comm); + SPtr<WriteMacroscopicQuantitiesCoProcessor> writeMQCoProcessor(new WriteMacroscopicQuantitiesCoProcessor(grid, stepSch, outputPath, WbWriterVtkXmlBinary::getInstance(), conv,comm)); SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100)); - NUPSCounterCoProcessor npr(grid, nupsSch, numOfThreads, comm); + SPtr<CoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm)); - const SPtr<ConcreteCalculatorFactory> calculatorFactory = std::make_shared<ConcreteCalculatorFactory>(stepSch); - CalculationManagerPtr calculation(new CalculationManager(grid, numOfThreads, endstep, calculatorFactory, CalculatorType::HYBRID)); + double area = UbMath::PI * radius * radius; + SPtr<UbScheduler> forceSch(new UbScheduler(100)); + SPtr<CalculateForcesCoProcessor> fp = make_shared<CalculateForcesCoProcessor>(grid, forceSch, outputPath + "/forces/forces.txt", comm, uLB, area); + fp->addInteractor(sphereInt); - if (myid == 0) - UBLOG(logINFO, "Simulation-start"); + SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1)); + SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endstep)); + calculator->addCoProcessor(npr); + calculator->addCoProcessor(fp); + calculator->addCoProcessor(writeMQCoProcessor); - calculation->calculate(); - if (myid == 0) - UBLOG(logINFO, "Simulation-end"); + if (myid == 0) UBLOG(logINFO, "Simulation-start"); + calculator->calculate(); + if (myid == 0) UBLOG(logINFO, "Simulation-end"); } catch (std::exception& e) @@ -359,14 +324,15 @@ int main(int argc, char* argv[]) { if (argv != NULL) { - if (argv[1] != NULL) - { - run(string(argv[1])); - } - else - { - cout << "Configuration file is missing!" << endl; - } + //if (argv[1] != NULL) + //{ + // run(string(argv[1])); + //} + //else + //{ + // cout << "Configuration file is missing!" << endl; + //} + run("sphere"); } } diff --git a/src/basics/Core/StringUtilities/StringUtil.cpp b/src/basics/Core/StringUtilities/StringUtil.cpp index 31496beae5953159c8d9a08a25fb5e808d9efea3..327a62346a91073834c8b710e90968a524ee2d28 100644 --- a/src/basics/Core/StringUtilities/StringUtil.cpp +++ b/src/basics/Core/StringUtilities/StringUtil.cpp @@ -1,5 +1,6 @@ #include "StringUtil.h" +#include <string.h> #include <regex> #include <sstream> diff --git a/src/cpu/VirtualFluids.h b/src/cpu/VirtualFluids.h index 576687d6957b70d2b52e9b8be89096c6ab336a4b..f90e05e07a78f1376caea529480e2e050de70c0c 100644 --- a/src/cpu/VirtualFluids.h +++ b/src/cpu/VirtualFluids.h @@ -121,6 +121,18 @@ #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 <BoundaryConditions/SimpleSlipBCAlgorithm.h> +#include <BoundaryConditions/PowellEyringModelNoSlipBCAlgorithm.h> +#include <BoundaryConditions/BinghamModelVelocityBCAlgorithm.h> #include <Connectors/Block3DConnector.h> #include <Connectors/Block3DConnectorFactory.h> @@ -157,10 +169,13 @@ #include <CoProcessors/AdjustForcingCoProcessor.h> #include <CoProcessors/CalculateForcesCoProcessor.h> -#include <CoProcessors/WriteBlocksCoProcessor.h> +#include <CoProcessors/CalculateTorqueCoProcessor.h> +#include <CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h> +#include <CoProcessors/WriteMQFromSelectionCoProcessor.h> #include <CoProcessors/WriteBoundaryConditionsCoProcessor.h> #include <CoProcessors/WriteMQFromSelectionCoProcessor.h> #include <CoProcessors/WriteMacroscopicQuantitiesCoProcessor.h> +#include <WriteBlocksCoProcessor.h> //#include <CoProcessors/PathLineCoProcessor.h> //#include <CoProcessors/PathLineCoProcessorMcpart.h> #include <CoProcessors/EmergencyExitCoProcessor.h> @@ -182,8 +197,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 +220,19 @@ #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/ThixotropyModelLBMKernel2.h> +#include <LBM/BinghamModelLBMKernel.h> +#include <LBM/HerschelBulkleyModelLBMKernel.h> +#include <LBM/ThixotropyInterpolationProcessor.h> +#include <LBM/RheologyK17LBMKernel.h> +#include <LBM/PowellEyringModelLBMKernel.h> + + #include <geometry3d/CoordinateTransformation3D.h> #include <geometry3d/GbCuboid3D.h> @@ -287,6 +313,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 61b427e323dce214240f439eb0ff45c62029e05f..8737b8c04d9c2546c30cc6657e6f17d295bd542f 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 7cef8205ce13d89802c9bbd7eebb5d6eb3759b3f..3adbed44871d82ef896fabd7834b6fb16e35b285 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h @@ -47,36 +47,50 @@ 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; + static const char SimpleSlipBCAlgorithm = 17; + static const char PowellEyringModelNoSlipBCAlgorithm = 18; + static const char BinghamModelVelocityBCAlgorithm = 19; -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/BCArray3D.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCArray3D.h index 835e5b1c95454a9fbe8186d6942c3936a5e0e2cc..b9d08f7117d9dc41c008c9d92a5780aceedad21c 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCArray3D.h +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCArray3D.h @@ -35,7 +35,7 @@ #define BCArray_H #include "BoundaryConditions.h" -#include "basics/container/CbArray3D.h" +#include "CbArray3D.h" #include <typeinfo> diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelNoSlipBCAlgorithm.h new file mode 100644 index 0000000000000000000000000000000000000000..a429384138f5183ba6853c18ed8a3e1a638bf932 --- /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/BinghamModelVelocityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelVelocityBCAlgorithm.h new file mode 100644 index 0000000000000000000000000000000000000000..0155babfc1d77427c9a18b7b295ad0ba1c05d793 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BinghamModelVelocityBCAlgorithm.h @@ -0,0 +1,27 @@ +#ifndef BinghamModelVelocityBCAlgorithm_h__ +#define BinghamModelVelocityBCAlgorithm_h__ + +#include "RheologicalVelocityBCAlgorithm.h" +#include "Thixotropy.h" + +class BinghamModelVelocityBCAlgorithm : public RheologicalVelocityBCAlgorithm +{ +public: + BinghamModelVelocityBCAlgorithm() + { + BCAlgorithm::type = BCAlgorithm::BinghamModelVelocityBCAlgorithm; + BCAlgorithm::preCollision = false; + } + ~BinghamModelVelocityBCAlgorithm() {} + SPtr<BCAlgorithm> clone() override + { + SPtr<BCAlgorithm> bc(new BinghamModelVelocityBCAlgorithm()); + return bc; + } +protected: + LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const override + { + return Thixotropy::getBinghamCollFactor(omegaInf, shearRate, drho); + } +}; +#endif // BinghamModelVelocityBCAlgorithm_h__ diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h index 886d1ee2d6f44402ba39255bce3ad16425ce437e..9539139ed77841218695f0ae687e3a13ec7758f9 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h @@ -46,17 +46,28 @@ //! Difenition of baundary conditions in grid generation class BoundaryConditions { + // public: + // enum BcAlgorithm{VelocityBC, SlipBC, NoSlipBC, ThinWallNoSlipBC, HighViscosityNoSlipBC, EqDensityBC, + // NonEqDensityBC, NonReflectingVelocityBC, NonReflectingDensityBC}; public: 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); for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) q[fdir] = -999.; } - virtual ~BoundaryConditions() = default; + virtual ~BoundaryConditions() {} virtual bool isEmpty() { @@ -83,9 +94,9 @@ protected: if ((secOpt + 1) > maxOptionVal) throw UbException(UB_EXARGS, "error: option > " + UbSystem::toString(maxOptionVal - 1)); - // all digits at the respective positions to "0" + // alle digits an den betreffenden postionen auf "0" flag &= ~(maxOptionVal << (direction * optionDigits)); - // set all digits according to the flag at the respective positions + // alle digitsan den betreffenden postionen entsprechend der marke setzen flag |= ((long long)(secOpt + 1) << (direction * optionDigits)); } @@ -150,13 +161,13 @@ public: { return (short)(((slipBoundaryFlags >> (optionDigits * direction)) & maxOptionVal) - 1); } - void setNormalVector(const LBMReal &nx1, const LBMReal &nx2, const LBMReal &nx3) + void setNormalVector(const float &nx1, const float &nx2, const float &nx3) { this->nx1 = nx1; this->nx2 = nx2; this->nx3 = nx3; } - UbTupleDouble3 getNormalVector() { return makeUbTuple(nx1, nx2, nx3); } + UbTupleFloat3 getNormalVector() { return makeUbTuple(nx1, nx2, nx3); } /*============== Velocity Boundary ========================*/ void setVelocityBoundaryFlag(const int &direction, const short &secOpt = 0) @@ -181,72 +192,73 @@ public: void setBoundaryVelocity(const Vector3D &vx) { - setBoundaryVelocityX1((LBMReal)vx[0]); - setBoundaryVelocityX2((LBMReal)vx[1]); - setBoundaryVelocityX3((LBMReal)vx[2]); + setBoundaryVelocityX1((float)vx[0]); + setBoundaryVelocityX2((float)vx[1]); + setBoundaryVelocityX3((float)vx[2]); } - void setBoundaryVelocityX1(const LBMReal &vx1) { this->bcVelocityX1 = vx1; } - void setBoundaryVelocityX2(const LBMReal &vx2) { this->bcVelocityX2 = vx2; } - void setBoundaryVelocityX3(const LBMReal &vx3) { this->bcVelocityX3 = vx3; } - LBMReal getBoundaryVelocityX1() { return this->bcVelocityX1; } - LBMReal getBoundaryVelocityX2() { return this->bcVelocityX2; } - LBMReal getBoundaryVelocityX3() { return this->bcVelocityX3; } - LBMReal getBoundaryVelocity(const int &direction) + void setBoundaryVelocityX1(const float &vx1) { this->bcVelocityX1 = vx1; } + void setBoundaryVelocityX2(const float &vx2) { this->bcVelocityX2 = vx2; } + void setBoundaryVelocityX3(const float &vx3) { this->bcVelocityX3 = vx3; } + float getBoundaryVelocityX1() { return this->bcVelocityX1; } + float getBoundaryVelocityX2() { return this->bcVelocityX2; } + float getBoundaryVelocityX3() { return this->bcVelocityX3; } + float getBoundaryVelocity(const int &direction) { switch (direction) { case D3Q27System::E: - return (LBMReal)(UbMath::c4o9 * - (+bcVelocityX1)); //(2/cs^2)(=6)*rho_0(=1 for incompressible)*wi*u*ei with cs=1/sqrt(3) + return (float)(UbMath::c4o9 * + (+bcVelocityX1)); //(2/cs^2)(=6)*rho_0(=1 bei inkompr)*wi*u*ei mit cs=1/sqrt(3) case D3Q27System::W: - return (LBMReal)(UbMath::c4o9 * (-bcVelocityX1)); + return (float)(UbMath::c4o9 * + (-bcVelocityX1)); // z.B. aus paper manfred MRT LB models in three dimensions (2002) case D3Q27System::N: - return (LBMReal)(UbMath::c4o9 * (+bcVelocityX2)); + return (float)(UbMath::c4o9 * (+bcVelocityX2)); case D3Q27System::S: - return (LBMReal)(UbMath::c4o9 * (-bcVelocityX2)); + return (float)(UbMath::c4o9 * (-bcVelocityX2)); case D3Q27System::T: - return (LBMReal)(UbMath::c4o9 * (+bcVelocityX3)); + return (float)(UbMath::c4o9 * (+bcVelocityX3)); case D3Q27System::B: - return (LBMReal)(UbMath::c4o9 * (-bcVelocityX3)); + return (float)(UbMath::c4o9 * (-bcVelocityX3)); case D3Q27System::NE: - return (LBMReal)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX2)); + return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX2)); case D3Q27System::SW: - return (LBMReal)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX2)); + return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX2)); case D3Q27System::SE: - return (LBMReal)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX2)); + return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX2)); case D3Q27System::NW: - return (LBMReal)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX2)); + return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX2)); case D3Q27System::TE: - return (LBMReal)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX3)); + return (float)(UbMath::c1o9 * (+bcVelocityX1 + bcVelocityX3)); case D3Q27System::BW: - return (LBMReal)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX3)); + return (float)(UbMath::c1o9 * (-bcVelocityX1 - bcVelocityX3)); case D3Q27System::BE: - return (LBMReal)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX3)); + return (float)(UbMath::c1o9 * (+bcVelocityX1 - bcVelocityX3)); case D3Q27System::TW: - return (LBMReal)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX3)); + return (float)(UbMath::c1o9 * (-bcVelocityX1 + bcVelocityX3)); case D3Q27System::TN: - return (LBMReal)(UbMath::c1o9 * (+bcVelocityX2 + bcVelocityX3)); + return (float)(UbMath::c1o9 * (+bcVelocityX2 + bcVelocityX3)); case D3Q27System::BS: - return (LBMReal)(UbMath::c1o9 * (-bcVelocityX2 - bcVelocityX3)); + return (float)(UbMath::c1o9 * (-bcVelocityX2 - bcVelocityX3)); case D3Q27System::BN: - return (LBMReal)(UbMath::c1o9 * (+bcVelocityX2 - bcVelocityX3)); + return (float)(UbMath::c1o9 * (+bcVelocityX2 - bcVelocityX3)); case D3Q27System::TS: - return (LBMReal)(UbMath::c1o9 * (-bcVelocityX2 + bcVelocityX3)); + return (float)(UbMath::c1o9 * (-bcVelocityX2 + bcVelocityX3)); case D3Q27System::TNE: - return (LBMReal)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); + return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); case D3Q27System::BSW: - return (LBMReal)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); + return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); case D3Q27System::BNE: - return (LBMReal)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); + return (float)(UbMath::c1o36 * (+bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); case D3Q27System::TSW: - return (LBMReal)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); + return (float)(UbMath::c1o36 * (-bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); case D3Q27System::TSE: - return (LBMReal)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); + return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 + bcVelocityX3)); case D3Q27System::BNW: - return (LBMReal)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); + return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 - bcVelocityX3)); case D3Q27System::BSE: - return (LBMReal)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); + return (float)(UbMath::c1o36 * (+bcVelocityX1 - bcVelocityX2 - bcVelocityX3)); case D3Q27System::TNW: - return (LBMReal)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); + return (float)(UbMath::c1o36 * (-bcVelocityX1 + bcVelocityX2 + bcVelocityX3)); default: throw UbException(UB_EXARGS, "unknown error"); } @@ -273,44 +285,44 @@ public: return (short)(((densityBoundaryFlags >> (optionDigits * direction)) & maxOptionVal) - 1); } - void setBoundaryDensity(LBMReal density) { this->bcDensity = density; } - LBMReal getBoundaryDensity() { return this->bcDensity; } + void setBoundaryDensity(float density) { this->bcDensity = density; } + float 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; } + ////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; } - LBMReal &densityLodiVelocityX2() { return this->bcLodiVelocityX2; } - LBMReal &densityLodiVelocityX3() { return this->bcLodiVelocityX3; } - LBMReal &densityLodiLentgh() { return this->bcLodiLentgh; } + float &densityLodiDensity() { return this->bcLodiDensity; } + float &densityLodiVelocityX1() { return this->bcLodiVelocityX1; } + float &densityLodiVelocityX2() { return this->bcLodiVelocityX2; } + float &densityLodiVelocityX3() { return this->bcLodiVelocityX3; } + float &densityLodiLentgh() { return this->bcLodiLentgh; } - const LBMReal &densityLodiDensity() const { return this->bcLodiDensity; } - const LBMReal &densityLodiVelocityX1() const { return this->bcLodiVelocityX1; } - const LBMReal &densityLodiVelocityX2() const { return this->bcLodiVelocityX2; } - const LBMReal &densityLodiVelocityX3() const { return this->bcLodiVelocityX3; } - const LBMReal &densityLodiLentgh() const { return this->bcLodiLentgh; } + const float &densityLodiDensity() const { return this->bcLodiDensity; } + const float &densityLodiVelocityX1() const { return this->bcLodiVelocityX1; } + const float &densityLodiVelocityX2() const { return this->bcLodiVelocityX2; } + const float &densityLodiVelocityX3() const { return this->bcLodiVelocityX3; } + const float &densityLodiLentgh() const { return this->bcLodiLentgh; } /*======================= Qs =============================*/ - void setQ(const LBMReal &val, const int &direction) { q[direction] = val; } - LBMReal getQ(const int &direction) { return q[direction]; } + void setQ(const float &val, const int &direction) { q[direction] = val; } + float getQ(const int &direction) { return q[direction]; } virtual std::vector<std::string> getBCNames() { std::vector<std::string> tmp; - tmp.emplace_back("NoSlipBC"); - tmp.emplace_back("SlipBC"); - tmp.emplace_back("VelocityBC"); - tmp.emplace_back("DensityBC"); + tmp.push_back("NoSlipBC"); + tmp.push_back("SlipBC"); + tmp.push_back("VelocityBC"); + tmp.push_back("DensityBC"); return tmp; } virtual std::vector<long long> getBCFlags() @@ -332,32 +344,35 @@ public: char getBcAlgorithmType() { return algorithmType; } public: - static const int optionDigits = 2; //--> 2 bits for secondary Option --> maxOptionVal = 7 + static const int optionDigits = + 2; //--> 3 bits fr secondary Option --> maxOptionVal = 7, da man mit drei Digits max die 7 darstellen kann static const long long maxOptionVal; // = ( 1<<optionDigits ) - 1; //2^3-1 -> 7 protected: - LBMReal q[D3Q27System::FENDDIR + 1]; + float q[D3Q27System::FENDDIR + 1]; + // float q[D3Q27System::STARTF+1]; - long long noslipBoundaryFlags{ 0 }; - long long slipBoundaryFlags{ 0 }; - long long velocityBoundaryFlags{ 0 }; - long long densityBoundaryFlags{ 0 }; - long long wallModelBoundaryFlags{ 0 }; + long long noslipBoundaryFlags; + long long slipBoundaryFlags; + long long velocityBoundaryFlags; + long long densityBoundaryFlags; + long long wallModelBoundaryFlags; - LBMReal bcVelocityX1{ 0.0f }; - LBMReal bcVelocityX2{ 0.0f }; - LBMReal bcVelocityX3{ 0.0f }; - LBMReal bcDensity{ 0.0f }; + float bcVelocityX1; + float bcVelocityX2; + float bcVelocityX3; + float bcDensity; + // float bcThixotropy; - LBMReal bcLodiDensity{ 0.0f }; - LBMReal bcLodiVelocityX1{ 0.0f }; - LBMReal bcLodiVelocityX2{ 0.0f }; - LBMReal bcLodiVelocityX3{ 0.0f }; - LBMReal bcLodiLentgh{ 0.0f }; + float bcLodiDensity; + float bcLodiVelocityX1; + float bcLodiVelocityX2; + float bcLodiVelocityX3; + float bcLodiLentgh; - LBMReal nx1{ 0.0f }, nx2{ 0.0f }, nx3{ 0.0f }; + float nx1, nx2, nx3; - char algorithmType{ -1 }; + char algorithmType; private: friend class MPIIORestartCoProcessor; @@ -365,4 +380,5 @@ private: friend class MPIIOMigrationBECoProcessor; }; + #endif diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/DensityAndThixotropyBCAlgorithm.cpp new file mode 100644 index 0000000000000000000000000000000000000000..45b467596bb502037c83e3ef33c3121d01be2975 --- /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 0000000000000000000000000000000000000000..069b6f1c697eda27821e6c213e1a961f62e292f0 --- /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 0000000000000000000000000000000000000000..46bfbd19310d8d4d710581fdde212461c922b5f1 --- /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 0000000000000000000000000000000000000000..cfed98d784cb70c647c9dcf45270174e29f99139 --- /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 0000000000000000000000000000000000000000..a7225e39392efaf5ef7ebb2831ebaa515fa3dcee --- /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 0000000000000000000000000000000000000000..006f45619d46051cea296584e48440acdddd7291 --- /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 0000000000000000000000000000000000000000..8c096a5e522a2cf2a47d9944b16154c186dea9ca --- /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/PowellEyringModelNoSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/PowellEyringModelNoSlipBCAlgorithm.h new file mode 100644 index 0000000000000000000000000000000000000000..f94266be4d87b33fc5858e1f48263d3cdbc082c5 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/PowellEyringModelNoSlipBCAlgorithm.h @@ -0,0 +1,27 @@ +#ifndef PowellEyringModelNoSlipBCAlgorithm_h__ +#define PowellEyringModelNoSlipBCAlgorithm_h__ + +#include "ThixotropyNoSlipBCAlgorithm.h" +#include "Thixotropy.h" + +class PowellEyringModelNoSlipBCAlgorithm : public ThixotropyNoSlipBCAlgorithm +{ +public: + PowellEyringModelNoSlipBCAlgorithm() + { + BCAlgorithm::type = BCAlgorithm::PowellEyringModelNoSlipBCAlgorithm; + BCAlgorithm::preCollision = true; + } + ~PowellEyringModelNoSlipBCAlgorithm() {} + SPtr<BCAlgorithm> clone() override + { + SPtr<BCAlgorithm> bc(new PowellEyringModelNoSlipBCAlgorithm()); + return bc; + } +protected: + LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const override + { + return Thixotropy::getHerschelBulkleyCollFactor(omegaInf, shearRate, drho); + } +}; +#endif // PowellEyringModelNoSlipBCAlgorithm_h__ \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologicalVelocityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologicalVelocityBCAlgorithm.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2614c703b4da29f666392edbe121b86d3ad78393 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologicalVelocityBCAlgorithm.cpp @@ -0,0 +1,47 @@ +#include "RheologicalVelocityBCAlgorithm.h" +#include "DistributionArray3D.h" +#include "BoundaryConditions.h" + +RheologicalVelocityBCAlgorithm::RheologicalVelocityBCAlgorithm() +{ + //BCAlgorithm::type = BCAlgorithm::RheologicalVelocityBCAlgorithm; + //BCAlgorithm::preCollision = false; +} +////////////////////////////////////////////////////////////////////////// +RheologicalVelocityBCAlgorithm::~RheologicalVelocityBCAlgorithm() +{ +} +////////////////////////////////////////////////////////////////////////// +void RheologicalVelocityBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions) +{ + this->distributions = distributions; +} +////////////////////////////////////////////////////////////////////////// +void RheologicalVelocityBCAlgorithm::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); + + LBMReal shearRate = D3Q27System::getShearRate(f, collFactor); + LBMReal collFactorF = getThyxotropyCollFactor(collFactor, shearRate, drho); + + 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); + 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); + } + } + +} + diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologicalVelocityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologicalVelocityBCAlgorithm.h new file mode 100644 index 0000000000000000000000000000000000000000..60237e3db6be7c1a77291146fe0f70db69018f0f --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/RheologicalVelocityBCAlgorithm.h @@ -0,0 +1,22 @@ +#ifndef RheologicalVelocityBCAlgorithm_h__ +#define RheologicalVelocityBCAlgorithm_h__ + +#include "BCAlgorithm.h" +#include <PointerDefinitions.h> + +class DistributionArray3D; + +class RheologicalVelocityBCAlgorithm : public BCAlgorithm +{ +public: + RheologicalVelocityBCAlgorithm(); + ~RheologicalVelocityBCAlgorithm(); + 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 // VelocityBoundaryCondition_h__ + diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp new file mode 100644 index 0000000000000000000000000000000000000000..380167005abc92d0137fd51fae81cf5fe6df8713 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.cpp @@ -0,0 +1,86 @@ +#include "SimpleSlipBCAlgorithm.h" +#include "DistributionArray3D.h" +#include "BoundaryConditions.h" + +SimpleSlipBCAlgorithm::SimpleSlipBCAlgorithm() +{ + BCAlgorithm::type = BCAlgorithm::SimpleSlipBCAlgorithm; + BCAlgorithm::preCollision = false; +} +////////////////////////////////////////////////////////////////////////// +SimpleSlipBCAlgorithm::~SimpleSlipBCAlgorithm() +{ + +} +////////////////////////////////////////////////////////////////////////// +SPtr<BCAlgorithm> SimpleSlipBCAlgorithm::clone() +{ + SPtr<BCAlgorithm> bc(new SimpleSlipBCAlgorithm()); + return bc; +} +////////////////////////////////////////////////////////////////////////// +void SimpleSlipBCAlgorithm::addDistributions(SPtr<DistributionArray3D> distributions) +{ + this->distributions = distributions; +} +////////////////////////////////////////////////////////////////////////// +void SimpleSlipBCAlgorithm::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); + + UbTupleFloat3 normale = bcPtr->getNormalVector(); + LBMReal amp = vx1*val<1>(normale)+vx2*val<2>(normale)+vx3*val<3>(normale); + + vx1 = vx1 - amp * val<1>(normale); //normale zeigt von struktur weg! + vx2 = vx2 - amp * val<2>(normale); //normale zeigt von struktur weg! + vx3 = vx3 - amp * val<3>(normale); //normale zeigt von struktur weg! + + rho = 1.0+drho*compressibleFactor; + + for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++) + { + if (bcPtr->hasSlipBoundaryFlag(fdir)) + { + //quadratic bounce back + const int invDir = D3Q27System::INVDIR[fdir]; + LBMReal velocity = 0.0; + switch (invDir) + { + case D3Q27System::E: velocity = (UbMath::c4o9*(+vx1)); break; //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3) + case D3Q27System::W: velocity = (UbMath::c4o9*(-vx1)); break; //z.B. aus paper manfred MRT LB models in three dimensions (2002) + case D3Q27System::N: velocity = (UbMath::c4o9*(+vx2)); break; + case D3Q27System::S: velocity = (UbMath::c4o9*(-vx2)); break; + case D3Q27System::T: velocity = (UbMath::c4o9*(+vx3)); break; + case D3Q27System::B: velocity = (UbMath::c4o9*(-vx3)); break; + case D3Q27System::NE: velocity = (UbMath::c1o9*(+vx1+vx2)); break; + case D3Q27System::SW: velocity = (UbMath::c1o9*(-vx1-vx2)); break; + case D3Q27System::SE: velocity = (UbMath::c1o9*(+vx1-vx2)); break; + case D3Q27System::NW: velocity = (UbMath::c1o9*(-vx1+vx2)); break; + case D3Q27System::TE: velocity = (UbMath::c1o9*(+vx1+vx3)); break; + case D3Q27System::BW: velocity = (UbMath::c1o9*(-vx1-vx3)); break; + case D3Q27System::BE: velocity = (UbMath::c1o9*(+vx1-vx3)); break; + case D3Q27System::TW: velocity = (UbMath::c1o9*(-vx1+vx3)); break; + case D3Q27System::TN: velocity = (UbMath::c1o9*(+vx2+vx3)); break; + case D3Q27System::BS: velocity = (UbMath::c1o9*(-vx2-vx3)); break; + case D3Q27System::BN: velocity = (UbMath::c1o9*(+vx2-vx3)); break; + case D3Q27System::TS: velocity = (UbMath::c1o9*(-vx2+vx3)); break; + case D3Q27System::TNE: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break; + case D3Q27System::BSW: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break; + case D3Q27System::BNE: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break; + case D3Q27System::TSW: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break; + case D3Q27System::TSE: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break; + case D3Q27System::BNW: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break; + case D3Q27System::BSE: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break; + case D3Q27System::TNW: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break; + default: throw UbException(UB_EXARGS, "unknown error"); + } + LBMReal fReturn = f[invDir] - velocity;; + distributions->setDistributionForDirection(fReturn, x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); + } + } +} \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.h new file mode 100644 index 0000000000000000000000000000000000000000..3da68623200d51d39e7c69b6ffb21554c9979eab --- /dev/null +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleSlipBCAlgorithm.h @@ -0,0 +1,51 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 SimpleSlipBCAlgorithm_h__ +#define SimpleSlipBCAlgorithm_h__ + +#include "BCAlgorithm.h" +#include <PointerDefinitions.h> + +class DistributionArray3D; + +//! \brief A class implements slip boundary condition by using simple bounce back +class SimpleSlipBCAlgorithm : public BCAlgorithm +{ +public: + SimpleSlipBCAlgorithm(); + virtual ~SimpleSlipBCAlgorithm(); + SPtr<BCAlgorithm> clone(); + void addDistributions(SPtr<DistributionArray3D> distributions); + void applyBC() override; +}; +#endif // SimpleSlipBCAlgorithm_h__ diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SimpleVelocityBCAlgorithm.cpp new file mode 100644 index 0000000000000000000000000000000000000000..27e0615e1879b6e52569ff354a152e132395aae8 --- /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 0000000000000000000000000000000000000000..714276760e379b93a433255a3a45981250f4bc91 --- /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/SlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp index 0dbbcd8f0fcb854b1cee03a10e947de8a9c43549..825d2bc0175acb5b2c10df3a89e87512dcc2e6e3 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/SlipBCAlgorithm.cpp @@ -27,7 +27,7 @@ void SlipBCAlgorithm::applyBC() calcMacrosFct(f, drho, vx1, vx2, vx3); calcFeqFct(feq, drho, vx1, vx2, vx3); - UbTupleDouble3 normale = bcPtr->getNormalVector(); + UbTupleFloat3 normale = bcPtr->getNormalVector(); LBMReal amp = vx1 * val<1>(normale) + vx2 * val<2>(normale) + vx3 * val<3>(normale); vx1 = vx1 - amp * val<1>(normale); // normale zeigt von struktur weg! @@ -36,100 +36,47 @@ void SlipBCAlgorithm::applyBC() rho = 1.0 + drho * compressibleFactor; - for (int fdir = D3Q27System::FSTARTDIR; fdir <= D3Q27System::FENDDIR; fdir++) { - if (bcPtr->hasSlipBoundaryFlag(fdir)) { - // quadratic bounce back - const int invDir = D3Q27System::INVDIR[fdir]; - LBMReal q = bcPtr->getQ(invDir); // m+m q=0 stabiler - // vx3=0; - LBMReal velocity = 0.0; - switch (invDir) { - case D3Q27System::E: - velocity = (UbMath::c4o9 * (+vx1)); - break; //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3) - case D3Q27System::W: - velocity = (UbMath::c4o9 * (-vx1)); - break; // z.B. aus paper manfred MRT LB models in three dimensions (2002) - case D3Q27System::N: - velocity = (UbMath::c4o9 * (+vx2)); - break; - case D3Q27System::S: - velocity = (UbMath::c4o9 * (-vx2)); - break; - case D3Q27System::T: - velocity = (UbMath::c4o9 * (+vx3)); - break; - case D3Q27System::B: - velocity = (UbMath::c4o9 * (-vx3)); - break; - case D3Q27System::NE: - velocity = (UbMath::c1o9 * (+vx1 + vx2)); - break; - case D3Q27System::SW: - velocity = (UbMath::c1o9 * (-vx1 - vx2)); - break; - case D3Q27System::SE: - velocity = (UbMath::c1o9 * (+vx1 - vx2)); - break; - case D3Q27System::NW: - velocity = (UbMath::c1o9 * (-vx1 + vx2)); - break; - case D3Q27System::TE: - velocity = (UbMath::c1o9 * (+vx1 + vx3)); - break; - case D3Q27System::BW: - velocity = (UbMath::c1o9 * (-vx1 - vx3)); - break; - case D3Q27System::BE: - velocity = (UbMath::c1o9 * (+vx1 - vx3)); - break; - case D3Q27System::TW: - velocity = (UbMath::c1o9 * (-vx1 + vx3)); - break; - case D3Q27System::TN: - velocity = (UbMath::c1o9 * (+vx2 + vx3)); - break; - case D3Q27System::BS: - velocity = (UbMath::c1o9 * (-vx2 - vx3)); - break; - case D3Q27System::BN: - velocity = (UbMath::c1o9 * (+vx2 - vx3)); - break; - case D3Q27System::TS: - velocity = (UbMath::c1o9 * (-vx2 + vx3)); - break; - case D3Q27System::TNE: - velocity = (UbMath::c1o36 * (+vx1 + vx2 + vx3)); - break; - case D3Q27System::BSW: - velocity = (UbMath::c1o36 * (-vx1 - vx2 - vx3)); - break; - case D3Q27System::BNE: - velocity = (UbMath::c1o36 * (+vx1 + vx2 - vx3)); - break; - case D3Q27System::TSW: - velocity = (UbMath::c1o36 * (-vx1 - vx2 + vx3)); - break; - case D3Q27System::TSE: - velocity = (UbMath::c1o36 * (+vx1 - vx2 + vx3)); - break; - case D3Q27System::BNW: - velocity = (UbMath::c1o36 * (-vx1 + vx2 - vx3)); - break; - case D3Q27System::BSE: - velocity = (UbMath::c1o36 * (+vx1 - vx2 - vx3)); - break; - case D3Q27System::TNW: - velocity = (UbMath::c1o36 * (-vx1 + vx2 + vx3)); - break; - default: - throw UbException(UB_EXARGS, "unknown error"); - } - 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); - } - } + for (int fdir = D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++) + { + if (bcPtr->hasSlipBoundaryFlag(fdir)) + { + //quadratic bounce back + const int invDir = D3Q27System::INVDIR[fdir]; + LBMReal q = bcPtr->getQ(invDir);// m+m q=0 stabiler + //vx3=0; + LBMReal velocity = 0.0; + switch (invDir) + { + case D3Q27System::E: velocity = (UbMath::c4o9*(+vx1)); break; //(2/cs^2)(=6)*rho_0(=1 bei imkompr)*wi*u*ei mit cs=1/sqrt(3) + case D3Q27System::W: velocity = (UbMath::c4o9*(-vx1)); break; //z.B. aus paper manfred MRT LB models in three dimensions (2002) + case D3Q27System::N: velocity = (UbMath::c4o9*(+vx2)); break; + case D3Q27System::S: velocity = (UbMath::c4o9*(-vx2)); break; + case D3Q27System::T: velocity = (UbMath::c4o9*(+vx3)); break; + case D3Q27System::B: velocity = (UbMath::c4o9*(-vx3)); break; + case D3Q27System::NE: velocity = (UbMath::c1o9*(+vx1+vx2)); break; + case D3Q27System::SW: velocity = (UbMath::c1o9*(-vx1-vx2)); break; + case D3Q27System::SE: velocity = (UbMath::c1o9*(+vx1-vx2)); break; + case D3Q27System::NW: velocity = (UbMath::c1o9*(-vx1+vx2)); break; + case D3Q27System::TE: velocity = (UbMath::c1o9*(+vx1+vx3)); break; + case D3Q27System::BW: velocity = (UbMath::c1o9*(-vx1-vx3)); break; + case D3Q27System::BE: velocity = (UbMath::c1o9*(+vx1-vx3)); break; + case D3Q27System::TW: velocity = (UbMath::c1o9*(-vx1+vx3)); break; + case D3Q27System::TN: velocity = (UbMath::c1o9*(+vx2+vx3)); break; + case D3Q27System::BS: velocity = (UbMath::c1o9*(-vx2-vx3)); break; + case D3Q27System::BN: velocity = (UbMath::c1o9*(+vx2-vx3)); break; + case D3Q27System::TS: velocity = (UbMath::c1o9*(-vx2+vx3)); break; + case D3Q27System::TNE: velocity = (UbMath::c1o36*(+vx1+vx2+vx3)); break; + case D3Q27System::BSW: velocity = (UbMath::c1o36*(-vx1-vx2-vx3)); break; + case D3Q27System::BNE: velocity = (UbMath::c1o36*(+vx1+vx2-vx3)); break; + case D3Q27System::TSW: velocity = (UbMath::c1o36*(-vx1-vx2+vx3)); break; + case D3Q27System::TSE: velocity = (UbMath::c1o36*(+vx1-vx2+vx3)); break; + case D3Q27System::BNW: velocity = (UbMath::c1o36*(-vx1+vx2-vx3)); break; + case D3Q27System::BSE: velocity = (UbMath::c1o36*(+vx1-vx2-vx3)); break; + case D3Q27System::TNW: velocity = (UbMath::c1o36*(-vx1+vx2+vx3)); break; + default: throw UbException(UB_EXARGS, "unknown error"); + } + 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); + } + } } \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/ThixotropyNoSlipBCAlgorithm.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0ee6d281d78998066a4f02e63a9aea0c5845369a --- /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); + + LBMReal shearRate = D3Q27System::getShearRate(f, collFactor); + LBMReal collFactorF = getThyxotropyCollFactor(collFactor, shearRate, rho); + + 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 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 0000000000000000000000000000000000000000..284cbbf2f6105c61d97784a0d215662a4fcb460e --- /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 0000000000000000000000000000000000000000..5755218278a263cfc9c4114b03e3e2fcd9b9b139 --- /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 0000000000000000000000000000000000000000..0ab2e83c9a6bfbe525c32bcb8de243d7fcfa735b --- /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 0000000000000000000000000000000000000000..d08d112d468229bc6bd948ab41472dd594045322 --- /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 0000000000000000000000000000000000000000..b8cd101435a4da2f38b99a5c440f0675b6538179 --- /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 98ead1e2d21ba62de5b00e3658af2e9e8cc768ef..96c4654394ca156a126bc0272ba92d087566f563 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.cpp @@ -23,35 +23,18 @@ 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); - - 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); - //} + //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; + 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]; diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/VelocityWithDensityBCAlgorithm.h index c590bd4a97dfc5f4f56999116dcb720ccfeefeab..a8c0a47063e932616e987135a3dfa9fff3400d70 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/CalculateTorqueCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..af7533ef5bffee3871f669adb2682412faf3b7bc --- /dev/null +++ b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.cpp @@ -0,0 +1,255 @@ +#include "CalculateTorqueCoProcessor.h" +#include "BCProcessor.h" + +#include "Communicator.h" +#include "D3Q27Interactor.h" +#include "UbScheduler.h" +#include "Grid3D.h" +#include "BoundaryConditions.h" +#include "DataSet3D.h" +#include "Block3D.h" +#include "LBMKernel.h" +#include "BCArray3D.h" +#include "EsoTwist3D.h" +#include "DistributionArray3D.h" + +CalculateTorqueCoProcessor::CalculateTorqueCoProcessor( SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, SPtr<Communicator> comm) : CoProcessor(grid, s), path(path), comm(comm), forceX1global(0), forceX2global(0), forceX3global(0) +{ + if (comm->getProcessID() == comm->getRoot()) + { + std::ofstream ostr; + std::string fname = path; + ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app); + if(!ostr) + { + ostr.clear(); + std::string path = UbSystem::getPathFromString(fname); + if(path.size()>0){ UbSystem::makeDirectory(path); ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);} + if(!ostr) throw UbException(UB_EXARGS,"couldn't open file "+fname); + } + ostr.width(12); + ostr << "step" << "\t"; + ostr.width(10); + ostr << "Tx" << "\t"; + ostr.width(18); + ostr << "Ty" << "\t"; + ostr.width(18); + ostr << "Tz" << std::endl; + ostr.close(); + } +} +////////////////////////////////////////////////////////////////////////// +CalculateTorqueCoProcessor::~CalculateTorqueCoProcessor() +{ + +} +////////////////////////////////////////////////////////////////////////// +void CalculateTorqueCoProcessor::process( double step ) +{ + if(scheduler->isDue(step) ) + collectData(step); + + UBLOG(logDEBUG3, "D3Q27ForcesCoProcessor::update:" << step); +} +////////////////////////////////////////////////////////////////////////// +void CalculateTorqueCoProcessor::collectData( double step ) +{ + calculateForces(); + + if (comm->getProcessID() == comm->getRoot()) + { + int istep = static_cast<int>(step); + std::ofstream ostr; + std::string fname = path; + ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app); + if(!ostr) + { + ostr.clear(); + std::string path = UbSystem::getPathFromString(fname); + if(path.size()>0){ UbSystem::makeDirectory(path); ostr.open(fname.c_str(), std::ios_base::out | std::ios_base::app);} + if(!ostr) throw UbException(UB_EXARGS,"couldn't open file "+fname); + } + + ostr.width(12); + ostr.setf(std::ios::fixed); + ostr << istep << "\t"; + write(&ostr, forceX1global, (char*)"\t"); + write(&ostr, forceX2global, (char*)"\t"); + write(&ostr, forceX3global, (char*)"\t"); + ostr << std::endl; + ostr.close(); + } +} +////////////////////////////////////////////////////////////////////////// +void CalculateTorqueCoProcessor::calculateForces() +{ + forceX1global = 0.0; + forceX2global = 0.0; + forceX3global = 0.0; + int counter = 0; + + for(SPtr<D3Q27Interactor> interactor : interactors) + { + double x1Centre = interactor->getGbObject3D()->getX1Centroid(); + double x2Centre = interactor->getGbObject3D()->getX2Centroid(); + double x3Centre = interactor->getGbObject3D()->getX3Centroid(); + + for(BcNodeIndicesMap::value_type t : interactor->getBcNodeIndicesMap()) + { + double torqueX1 = 0.0; + double torqueX2 = 0.0; + double torqueX3 = 0.0; + + SPtr<Block3D> block = t.first; + std::set< std::vector<int> >& transNodeIndicesSet = t.second; + + SPtr<ILBMKernel> kernel = block->getKernel(); + + if (kernel->getCompressible()) + { + calcMacrosFct = &D3Q27System::calcCompMacroscopicValues; + compressibleFactor = 1.0; + } + else + { + calcMacrosFct = &D3Q27System::calcIncompMacroscopicValues; + compressibleFactor = 0.0; + } + + SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); + SPtr<DistributionArray3D> distributions = kernel->getDataSet()->getFdistributions(); + distributions->swap(); + + int ghostLayerWidth = kernel->getGhostLayerWidth(); + int minX1 = ghostLayerWidth; + int maxX1 = (int)bcArray->getNX1() - 1 - ghostLayerWidth; + int minX2 = ghostLayerWidth; + int maxX2 = (int)bcArray->getNX2() - 1 - ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX3 = (int)bcArray->getNX3() - 1 - ghostLayerWidth; + + for(std::vector<int> node : transNodeIndicesSet) + { + int x1 = node[0]; + int x2 = node[1]; + int x3 = node[2]; + + Vector3D worldCoordinates = grid->getNodeCoordinates(block, x1, x2, x3); + + //without ghost nodes + if (x1 < minX1 || x1 > maxX1 || x2 < minX2 || x2 > maxX2 ||x3 < minX3 || x3 > maxX3 ) continue; + + if(bcArray->isFluid(x1,x2,x3)) //es kann sein, dass der node von einem anderen interactor z.B. als solid gemarkt wurde!!! + { + SPtr<BoundaryConditions> bc = bcArray->getBC(x1,x2,x3); + UbTupleDouble3 forceVec = getForces(x1,x2,x3,distributions,bc); + torqueX1 += (worldCoordinates[1] - x2Centre) * val<3>(forceVec) - (worldCoordinates[2] - x3Centre) * val<2>(forceVec); + torqueX2 += (worldCoordinates[2] - x3Centre) * val<1>(forceVec) - (worldCoordinates[0] - x1Centre) * val<3>(forceVec); + torqueX3 += (worldCoordinates[0] - x1Centre) * val<2>(forceVec) - (worldCoordinates[1] - x2Centre) * val<1>(forceVec); + //counter++; + //UBLOG(logINFO, "x1="<<(worldCoordinates[1] - x2Centre)<<",x2=" << (worldCoordinates[2] - x3Centre)<< ",x3=" << (worldCoordinates[0] - x1Centre) <<" forceX3 = " << forceX3); + } + } + //if we have got discretization with more level + // deltaX is LBM deltaX and equal LBM deltaT + double deltaX = LBMSystem::getDeltaT(block->getLevel()); //grid->getDeltaT(block); + double deltaXquadrat = deltaX*deltaX; + torqueX1 *= deltaXquadrat; + torqueX2 *= deltaXquadrat; + torqueX3 *= deltaXquadrat; + + distributions->swap(); + + forceX1global += torqueX1; + forceX2global += torqueX2; + forceX3global += torqueX3; + + //UBLOG(logINFO, "forceX3global = " << forceX3global); + } + } + std::vector<double> values; + std::vector<double> rvalues; + values.push_back(forceX1global); + values.push_back(forceX2global); + values.push_back(forceX3global); + + rvalues = comm->gather(values); + if (comm->getProcessID() == comm->getRoot()) + { + forceX1global = 0.0; + forceX2global = 0.0; + forceX3global = 0.0; + + for (int i = 0; i < (int)rvalues.size(); i+=3) + { + forceX1global += rvalues[i]; + forceX2global += rvalues[i+1]; + forceX3global += rvalues[i+2]; + } + } +} +////////////////////////////////////////////////////////////////////////// +UbTupleDouble3 CalculateTorqueCoProcessor::getForces(int x1, int x2, int x3, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc) +{ + UbTupleDouble3 force(0.0,0.0,0.0); + + LBMReal fs[D3Q27System::ENDF + 1]; + distributions->getDistributionInv(fs, x1, x2, x3); + LBMReal rho = 0.0, vx1 = 0.0, vx2 = 0.0, vx3 = 0.0, drho = 0.0; + calcMacrosFct(fs, drho, vx1, vx2, vx3); + rho = 1.0 + drho * compressibleFactor; + + if(bc) + { + //references to tuple "force" + double& forceX1 = val<1>(force); + double& forceX2 = val<2>(force); + double& forceX3 = val<3>(force); + double f, fnbr; + + for(int fdir=D3Q27System::FSTARTDIR; fdir<=D3Q27System::FENDDIR; fdir++) + { + if(bc->hasNoSlipBoundaryFlag(fdir) || bc->hasVelocityBoundaryFlag(fdir)) + { + const int invDir = D3Q27System::INVDIR[fdir]; + f = dynamicPointerCast<EsoTwist3D>(distributions)->getDistributionInvForDirection(x1, x2, x3, invDir); + fnbr = dynamicPointerCast<EsoTwist3D>(distributions)->getDistributionInvForDirection(x1+D3Q27System::DX1[invDir], x2+D3Q27System::DX2[invDir], x3+D3Q27System::DX3[invDir], fdir); + + Vector3D boundaryVelocity; + boundaryVelocity[0] = bc->getBoundaryVelocityX1(); + boundaryVelocity[1] = bc->getBoundaryVelocityX2(); + boundaryVelocity[2] = bc->getBoundaryVelocityX3(); + double correction[3] = { 0.0, 0.0, 0.0 }; + if (bc->hasVelocityBoundaryFlag(fdir)) + { + const double forceTerm = f - fnbr; + correction[0] = forceTerm * boundaryVelocity[0]; + correction[1] = forceTerm * boundaryVelocity[1]; + correction[2] = forceTerm * boundaryVelocity[2]; + } + + forceX1 += (f + fnbr) * D3Q27System::DX1[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[0]; + forceX2 += (f + fnbr) * D3Q27System::DX2[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[1]; + forceX3 += (f + fnbr) * D3Q27System::DX3[invDir] - 2.0 * D3Q27System::WEIGTH[invDir] * rho - correction[2]; + } + } + } + + return force; +} +////////////////////////////////////////////////////////////////////////// +void CalculateTorqueCoProcessor::addInteractor( SPtr<D3Q27Interactor> interactor ) +{ + interactors.push_back(interactor); +} +////////////////////////////////////////////////////////////////////////// +void CalculateTorqueCoProcessor::write(std::ofstream *fileObject, double value, char *separator) +{ + (*fileObject).width(12); + (*fileObject).precision(16); + (*fileObject).setf(std::ios::fixed); + (*fileObject) << value; + (*fileObject) << separator; +} + + diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..2eda4a063a8e4a6649380e05e2684d3f1a8f68ee --- /dev/null +++ b/src/cpu/VirtualFluidsCore/CoProcessors/CalculateTorqueCoProcessor.h @@ -0,0 +1,54 @@ +/* + * D3Q27ForcesCoProcessor.h + * + * Created on: 29.09.2012 + * Author: K. Kucher + */ + +#ifndef CalculateTorqueCoProcessor_H +#define CalculateTorqueCoProcessor_H + +#include <PointerDefinitions.h> +#include <string> +#include <vector> + +#include "CoProcessor.h" +#include "UbTuple.h" +#include "D3Q27System.h" + +class ForceCalculator; +class Communicator; +class Grid3D; +class UbScheduler; +class D3Q27Interactor; +class DistributionArray3D; +class BoundaryConditions; + +class CalculateTorqueCoProcessor: public CoProcessor +{ +public: + //! Constructor + CalculateTorqueCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, SPtr<Communicator> comm); + virtual ~CalculateTorqueCoProcessor(); + void process(double step); + void addInteractor(SPtr<D3Q27Interactor> interactor); +protected: + void collectData(double step); + void calculateForces(); + UbTupleDouble3 getForces(int x1, int x2, int x3, SPtr<DistributionArray3D> distributions, SPtr<BoundaryConditions> bc); + void write(std::ofstream *fileObject, double value, char *separator); +private: + std::string path; + SPtr<Communicator> comm; + std::vector<SPtr<D3Q27Interactor> > interactors; + double forceX1global; + double forceX2global; + double forceX3global; + + typedef void(*CalcMacrosFct)(const LBMReal* const& /*f[27]*/, LBMReal& /*rho*/, LBMReal& /*vx1*/, LBMReal& /*vx2*/, LBMReal& /*vx3*/); + CalcMacrosFct calcMacrosFct; + LBMReal compressibleFactor; +}; + + +#endif /* D3Q27ForcesCoProcessor_H */ diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp index bae45335e4c98bb60b6f67c65de3ec95ec19a3a0..88b5b574be4d6beb619a4e56c0bd11281f1fcbf8 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp @@ -141,7 +141,6 @@ void WriteBoundaryConditionsCoProcessor::addDataGeo(SPtr<Block3D> block) datanames.emplace_back("Boundary Conditions"); datanames.emplace_back("Geometry"); datanames.emplace_back("Level"); - // datanames.emplace_back("Interface CF"); data.resize(datanames.size()); @@ -149,7 +148,7 @@ void WriteBoundaryConditionsCoProcessor::addDataGeo(SPtr<Block3D> block) SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); // knotennummerierung faengt immer bei 0 an! - unsigned int SWB, SEB, NEB, NWB, SWT, SET, NET, NWT; + int SWB = 0, SEB = 0, NEB = 0, NWB = 0, SWT = 0, SET = 0, NET = 0, NWT = 0; int minX1 = 0; int minX2 = 0; @@ -198,15 +197,6 @@ void WriteBoundaryConditionsCoProcessor::addDataGeo(SPtr<Block3D> block) } data[2].push_back(level); - - // if (bcArray->isInterfaceCF(ix1, ix2, ix3)) - //{ - // data[3].push_back(1.0); - //} - // else - //{ - // data[3].push_back(0.0); - //} } } } @@ -225,7 +215,9 @@ void WriteBoundaryConditionsCoProcessor::addDataGeo(SPtr<Block3D> block) (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)); + cells.push_back(makeUbTuple((unsigned int)SWB, (unsigned int)SEB, (unsigned int)NEB, + (unsigned int)NWB, (unsigned int)SWT, (unsigned int)SET, + (unsigned int)NET, (unsigned int)NWT)); } } } diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp index a4558c64bf523a9ce2cffc58361a4bbf704daa87..43687af9c025aa66b9db0afc5222716054dd488f 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp @@ -145,32 +145,35 @@ void WriteMacroscopicQuantitiesCoProcessor::clearData() ////////////////////////////////////////////////////////////////////////// void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) { - double level = (double) block->getLevel(); - // double blockID = (double)block->getGlobalID(); + 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"); + 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<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()) - { + // knotennummerierung faengt immer bei 0 an! + int SWB, SEB, NEB, NWB, SWT, SET, NET, NWT; + + if (block->getKernel()->getCompressible()) { calcMacros = &D3Q27System::calcCompMacroscopicValues; - } else - { + } else { calcMacros = &D3Q27System::calcIncompMacroscopicValues; } @@ -178,9 +181,9 @@ void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) int minX2 = 0; int minX3 = 0; - int maxX1 = (int) (distributions->getNX1()); - int maxX2 = (int) (distributions->getNX2()); - int maxX3 = (int) (distributions->getNX3()); + int maxX1 = (int)(distributions->getNX1()); + int maxX2 = (int)(distributions->getNX2()); + int maxX3 = (int)(distributions->getNX3()); // int minX1 = 1; // int minX2 = 1; @@ -191,71 +194,73 @@ void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) // int maxX3 = (int)(distributions->getNX3()); // nummern vergeben und node vector erstellen + daten sammeln - CbArray3D<int> nodeNumbers((int) maxX1, (int) maxX2, (int) maxX3, -1); + CbArray3D<int> nodeNumbers((int)maxX1, (int)maxX2, (int)maxX3, -1); maxX1 -= 2; maxX2 -= 2; maxX3 -= 2; // D3Q27BoundaryConditionPtr bcPtr; - int nr = (int) nodes.size(); + 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)) - { - int index = 0; + 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)) { + 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])); + 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::calcPress(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; + // 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; + // 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; + // 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))); + // 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); - // 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()); + // 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); } @@ -265,34 +270,18 @@ void WriteMacroscopicQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) maxX1 -= 1; maxX2 -= 1; maxX3 -= 1; - - unsigned int SWB, SEB, NEB, NWB, SWT, SET, NET, NWT; - int SWBi, SEBi, NEBi, NWBi, SWTi, SETi, NETi, NWTi; // 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 ( - ( SWBi = nodeNumbers(ix1, ix2, ix3)) >= 0 - && (SEBi = nodeNumbers(ix1 + 1, ix2, ix3)) >= 0 - && (NEBi = nodeNumbers(ix1 + 1, ix2 + 1, ix3)) >= 0 - && (NWBi = nodeNumbers(ix1, ix2 + 1, ix3)) >= 0 - && (SWTi = nodeNumbers(ix1, ix2, ix3 + 1)) >= 0 - && (SETi = nodeNumbers(ix1 + 1, ix2, ix3 + 1)) >= 0 - && (NETi = nodeNumbers(ix1 + 1, ix2 + 1, ix3 + 1)) >= 0 - && (NWTi = nodeNumbers(ix1, ix2 + 1, ix3 + 1)) >= 0 - ) - { - SWB =SWBi; - SEB =SEBi; - NEB =NEBi; - NWB =NWBi; - SWT =SWTi; - SET =SETi; - NET =NETi; - NWT =NWTi; - - cells.push_back(makeUbTuple(SWB, SEB, NEB, NWB, SWT, SET, NET, NWT)); + 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((unsigned int)SWB, (unsigned int)SEB, (unsigned int)NEB, + (unsigned int)NWB, (unsigned int)SWT, (unsigned int)SET, + (unsigned int)NET, (unsigned int)NWT)); } } } diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..72e7114e6d13504727ea8d86d7641627df6056f6 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.cpp @@ -0,0 +1,253 @@ +#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" +#include "Thixotropy.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("viscosity"); + //datanames.push_back("lambda"); + //datanames.push_back("ShearRate"); + datanames.push_back("omega"); + //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 viscosity=0; // lambda, gammaDot; + + //knotennummerierung faengt immer bei 0 an! + int SWB, SEB, NEB, NWB, SWT, SET, NET, NWT; + + int minX1 = 0; + int minX2 = 0; + int minX3 = 0; + + int maxX1 = (int)(distributionsF->getNX1()); + int maxX2 = (int)(distributionsF->getNX2()); + int maxX3 = (int)(distributionsF->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); + + //LBMReal gammaDot = D3Q27System::getShearRate(f, collFactor); + + //LBMReal collFactorF = collFactor - 1e-6 / (gammaDot + one * 1e-9); + //collFactorF = (collFactorF < 0.5) ? 0.5 : collFactorF; + + //LBMReal collFactorF = Thixotropy::getBinghamCollFactor(collFactor, gammaDot, rho); + + //data[index++].push_back(lambda); + //data[index++].push_back(gammaDot); + //data[index++].push_back(collFactorF); + + distributionsF->getDistribution(f, ix1, ix2, ix3); + LBMReal rho = D3Q27System::getDensity(f); + LBMReal shearRate = D3Q27System::getShearRate(f, collFactor); + //LBMReal omega = Thixotropy::getHerschelBulkleyCollFactor(collFactor, shearRate, rho); + //LBMReal omega = Thixotropy::getPowellEyringCollFactor(collFactor, shearRate, rho); + LBMReal omega = Thixotropy::getBinghamCollFactor(collFactor, shearRate, rho); + LBMReal viscosity = (omega == 0) ? 0 : c1o3 * (c1/omega-c1o2); + + + data[index++].push_back(viscosity); + data[index++].push_back(omega); + } + } + } + } + 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((unsigned int)SWB, (unsigned int)SEB, (unsigned int)NEB, (unsigned int)NWB, (unsigned int)SWT, (unsigned int)SET, (unsigned int)NET, (unsigned int)NWT)); + } + } + } + } +} diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h b/src/cpu/VirtualFluidsCore/CoProcessors/WriteThixotropyQuantitiesCoProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..58430fd9ece771d9e9dacf496860787f7b1364f5 --- /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 0000000000000000000000000000000000000000..3fb819ab7b90b10964d07758ff8fbcb8a8603f38 --- /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 0000000000000000000000000000000000000000..1fecd5d0a9dd1b6c7921a2b7699cc8d9098df2e1 --- /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 0000000000000000000000000000000000000000..89950b25e872fd07cd71847407926d3fbb413318 --- /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 0000000000000000000000000000000000000000..0b2bd66b9fc88c7e8adfdbc37c9bb569392f5dd2 --- /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 c0171588bcd4a74680326c44db062dba63d4c41c..e869c39cdf1f305c5adaee1d1c803c9902c301ee 100644 --- a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h +++ b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h @@ -36,89 +36,149 @@ #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<AverageValuesArray3D> getAverageDensity() const; - void setAverageDensity(SPtr<AverageValuesArray3D> values); + SPtr<DistributionArray3D> getFdistributions() const; + void setFdistributions(SPtr<DistributionArray3D> distributions); - SPtr<AverageValuesArray3D> getAverageVelocity() const; - void setAverageVelocity(SPtr<AverageValuesArray3D> values); + SPtr<DistributionArray3D> getHdistributions() const; + void setHdistributions(SPtr<DistributionArray3D> distributions); - SPtr<AverageValuesArray3D> getAverageFluctuations() const; - void setAverageFluctuations(SPtr<AverageValuesArray3D> values); + SPtr<AverageValuesArray3D> getAverageDensity() const; + void setAverageDensity(SPtr<AverageValuesArray3D> values); - SPtr<AverageValuesArray3D> getAverageTriplecorrelations() const; - void setAverageTriplecorrelations(SPtr<AverageValuesArray3D> values); + SPtr<AverageValuesArray3D> getAverageVelocity() const; + void setAverageVelocity(SPtr<AverageValuesArray3D> values); - SPtr<AverageValuesArray3D> getAverageValues() const; - void setAverageValues(SPtr<AverageValuesArray3D> values); + SPtr<AverageValuesArray3D> getAverageFluctuations() const; + void setAverageFluctuations(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 void DataSet3D::setFdistributions(SPtr<DistributionArray3D> distributions) +{ + fdistributions = distributions; +} -inline SPtr<AverageValuesArray3D> DataSet3D::getAverageValues() const { return averageValues; } +inline SPtr<DistributionArray3D> DataSet3D::getHdistributions() const +{ + return hdistributions; +} -inline void DataSet3D::setAverageValues(SPtr<AverageValuesArray3D> values) { averageValues = values; } +inline void DataSet3D::setHdistributions(SPtr<DistributionArray3D> distributions) +{ + hdistributions = distributions; +} -inline SPtr<AverageValuesArray3D> DataSet3D::getAverageDensity() const { return averageDensity; } +inline SPtr<AverageValuesArray3D> DataSet3D::getAverageValues() const +{ + return averageValues; +} -inline void DataSet3D::setAverageDensity(SPtr<AverageValuesArray3D> values) { averageDensity = values; } +inline void DataSet3D::setAverageValues(SPtr<AverageValuesArray3D> values) +{ + averageValues = values; +} -inline SPtr<AverageValuesArray3D> DataSet3D::getAverageVelocity() const { return averageVelocity; } +inline SPtr<AverageValuesArray3D> DataSet3D::getAverageDensity() const +{ + return averageDensity; +} -inline void DataSet3D::setAverageVelocity(SPtr<AverageValuesArray3D> values) { averageVelocity = values; } +inline void DataSet3D::setAverageDensity(SPtr<AverageValuesArray3D> values) +{ + averageDensity = values; +} -inline SPtr<AverageValuesArray3D> DataSet3D::getAverageFluctuations() const { return averageFluktuations; } +inline SPtr<AverageValuesArray3D> DataSet3D::getAverageVelocity() const +{ + return averageVelocity; +} + +inline void DataSet3D::setAverageVelocity(SPtr<AverageValuesArray3D> values) +{ + averageVelocity = values; +} -inline void DataSet3D::setAverageFluctuations(SPtr<AverageValuesArray3D> values) { averageFluktuations = values; } +inline SPtr<AverageValuesArray3D> DataSet3D::getAverageFluctuations() const +{ + return averageFluktuations; +} -inline SPtr<AverageValuesArray3D> DataSet3D::getAverageTriplecorrelations() const { return averageTriplecorrelations; } +inline void DataSet3D::setAverageFluctuations(SPtr<AverageValuesArray3D> values) +{ + averageFluktuations = values; +} + +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/Grid/BasicCalculator.cpp b/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.cpp index 362225638cf12f73c397493c9e38e839d681b754..e41e7372502dd7f96b387e4845ac27084321c48a 100644 --- a/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.cpp +++ b/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.cpp @@ -33,12 +33,12 @@ #include "BasicCalculator.h" -#include "BCProcessor.h" #include "Block3D.h" -#include "Block3DConnector.h" +#include "BCProcessor.h" #include "LBMKernel.h" -#include "UbLogger.h" +#include "Block3DConnector.h" #include "UbScheduler.h" +#include "UbLogger.h" #ifdef _OPENMP #include <omp.h> @@ -48,126 +48,136 @@ //#define TIMING //#include "UbTiming.h" -BasicCalculator::BasicCalculator(SPtr<Grid3D> grid, SPtr<UbScheduler> additionalGhostLayerUpdateScheduler, - int numberOfTimeSteps) - : Calculator(grid, additionalGhostLayerUpdateScheduler, numberOfTimeSteps) +BasicCalculator::BasicCalculator(SPtr<Grid3D> grid, SPtr<UbScheduler> additionalGhostLayerUpdateScheduler, int numberOfTimeSteps) : + Calculator(grid, additionalGhostLayerUpdateScheduler, numberOfTimeSteps) { + } ////////////////////////////////////////////////////////////////////////// void BasicCalculator::calculate() { - UBLOG(logDEBUG1, "OMPCalculator::calculate() - started"); - int calcStep = 0; - try { - int minInitLevel = minLevel; - int maxInitLevel = maxLevel - minLevel; - int straightStartLevel = minInitLevel; - int internalIterations = 1 << (maxInitLevel - minInitLevel); - // int forwardStartLevel; - int threshold; + UBLOG(logDEBUG1, "OMPCalculator::calculate() - started"); + int calcStep = 0; + try + { + int minInitLevel = minLevel; + int maxInitLevel = maxLevel - minLevel; + int straightStartLevel = minInitLevel; + int internalIterations = 1 << (maxInitLevel - minInitLevel); + int forwardStartLevel; + int threshold; #ifdef TIMING - UbTimer timer; - double time[6]; + UbTimer timer; + double time[6]; #endif - for (calcStep = startTimeStep; calcStep <= numberOfTimeSteps; calcStep++) { - ////////////////////////////////////////////////////////////////////////// + for (calcStep = startTimeStep; calcStep <= numberOfTimeSteps; calcStep++) + { + ////////////////////////////////////////////////////////////////////////// #ifdef TIMING - UBLOG(logINFO, "calcStep = " << calcStep); + UBLOG(logINFO, "calcStep = " << calcStep); #endif - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// - for (int staggeredStep = 1; staggeredStep <= internalIterations; staggeredStep++) { - // forwardStartLevel = straightStartLevel; - if (staggeredStep == internalIterations) - straightStartLevel = minInitLevel; - else { - for (straightStartLevel = maxInitLevel, threshold = 1; (staggeredStep & threshold) != threshold; - straightStartLevel--, threshold <<= 1) - ; - } - ////////////////////////////////////////////////////////////////////////// + for (int staggeredStep = 1; staggeredStep <= internalIterations; staggeredStep++) + { + forwardStartLevel = straightStartLevel; + if (staggeredStep == internalIterations) straightStartLevel = minInitLevel; + else + { + for (straightStartLevel = maxInitLevel, threshold = 1; + (staggeredStep & threshold) != threshold; straightStartLevel--, threshold <<= 1); + } + ////////////////////////////////////////////////////////////////////////// #ifdef TIMING - timer.resetAndStart(); + timer.resetAndStart(); #endif - ////////////////////////////////////////////////////////////////////////// - applyPreCollisionBC(straightStartLevel, maxInitLevel); + ////////////////////////////////////////////////////////////////////////// + applyPreCollisionBC(straightStartLevel, maxInitLevel); - // do collision for all blocks - calculateBlocks(straightStartLevel, maxInitLevel, calcStep); - ////////////////////////////////////////////////////////////////////////// + //do collision for all blocks + calculateBlocks(straightStartLevel, maxInitLevel, calcStep); + ////////////////////////////////////////////////////////////////////////// #ifdef TIMING - time[0] = timer.stop(); - UBLOG(logINFO, "calculateBlocks time = " << time[0]); + time[0] = timer.stop(); + UBLOG(logINFO, "calculateBlocks time = " << time[0]); #endif - ////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// - // exchange data between blocks - exchangeBlockData(straightStartLevel, maxInitLevel); - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //exchange data between blocks + exchangeBlockData(straightStartLevel, maxInitLevel); + ////////////////////////////////////////////////////////////////////////// #ifdef TIMING - time[1] = timer.stop(); - UBLOG(logINFO, "exchangeBlockData time = " << time[1]); + time[1] = timer.stop(); + UBLOG(logINFO, "exchangeBlockData time = " << time[1]); #endif - ////////////////////////////////////////////////////////////////////////// - applyPostCollisionBC(straightStartLevel, maxInitLevel); - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + applyPostCollisionBC(straightStartLevel, maxInitLevel); + ////////////////////////////////////////////////////////////////////////// #ifdef TIMING - time[2] = timer.stop(); - UBLOG(logINFO, "applyBCs time = " << time[2]); + time[2] = timer.stop(); + UBLOG(logINFO, "applyBCs time = " << time[2]); #endif - ////////////////////////////////////////////////////////////////////////// - // swap distributions in kernel - swapDistributions(straightStartLevel, maxInitLevel); - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //swap distributions in kernel + swapDistributions(straightStartLevel, maxInitLevel); + ////////////////////////////////////////////////////////////////////////// #ifdef TIMING - time[3] = timer.stop(); - UBLOG(logINFO, "swapDistributions time = " << time[3]); + time[3] = timer.stop(); + UBLOG(logINFO, "swapDistributions time = " << time[3]); #endif - ////////////////////////////////////////////////////////////////////////// - if (refinement) { - if (straightStartLevel < maxInitLevel) - exchangeBlockData(straightStartLevel, maxInitLevel); - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + if (refinement) + { + if (straightStartLevel < maxInitLevel) + exchangeBlockData(straightStartLevel, maxInitLevel); + ////////////////////////////////////////////////////////////////////////// #ifdef TIMING - time[4] = timer.stop(); - UBLOG(logINFO, "refinement exchangeBlockData time = " << time[4]); + time[4] = timer.stop(); + UBLOG(logINFO, "refinement exchangeBlockData time = " << time[4]); #endif - ////////////////////////////////////////////////////////////////////////// - // now ghost nodes have actual values - // interpolation of interface nodes between grid levels - interpolation(straightStartLevel, maxInitLevel); - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //now ghost nodes have actual values + //interpolation of interface nodes between grid levels + interpolation(straightStartLevel, maxInitLevel); + ////////////////////////////////////////////////////////////////////////// #ifdef TIMING - time[5] = timer.stop(); - UBLOG(logINFO, "refinement interpolation time = " << time[5]); + time[5] = timer.stop(); + UBLOG(logINFO, "refinement interpolation time = " << time[5]); #endif - ////////////////////////////////////////////////////////////////////////// - } + ////////////////////////////////////////////////////////////////////////// } - // exchange data between blocks for visualization - if (additionalGhostLayerUpdateScheduler->isDue(calcStep)) { - exchangeBlockData(straightStartLevel, maxInitLevel); - } - coProcess((double)(calcStep)); - // now ghost nodes have actual values - } - UBLOG(logDEBUG1, "OMPCalculator::calculate() - stoped"); - } catch (std::exception &e) { - UBLOG(logERROR, e.what()); - UBLOG(logERROR, " step = " << calcStep); - // throw e; - // exit(EXIT_FAILURE); - } catch (std::string &s) { - UBLOG(logERROR, s); - // exit(EXIT_FAILURE); - // throw s; - } catch (...) { - UBLOG(logERROR, "unknown exception"); - // exit(EXIT_FAILURE); - // throw; - } + } + //exchange data between blocks for visualization + if (additionalGhostLayerUpdateScheduler->isDue(calcStep)) + { + exchangeBlockData(straightStartLevel, maxInitLevel); + } + coProcess((double)(calcStep)); + //now ghost nodes have actual values + } + UBLOG(logDEBUG1, "OMPCalculator::calculate() - stoped"); + } + catch (std::exception & e) + { + UBLOG(logERROR, e.what()); + UBLOG(logERROR, " step = " << calcStep); + //throw e; + //exit(EXIT_FAILURE); + } + catch (std::string & s) + { + UBLOG(logERROR, s); + //exit(EXIT_FAILURE); + //throw s; + } + catch (...) + { + UBLOG(logERROR, "unknown exception"); + //exit(EXIT_FAILURE); + //throw; + } } ////////////////////////////////////////////////////////////////////////// void BasicCalculator::calculateBlocks(int startLevel, int maxInitLevel, int calcStep) @@ -175,45 +185,50 @@ void BasicCalculator::calculateBlocks(int startLevel, int maxInitLevel, int calc #ifdef _OPENMP #pragma omp parallel #endif - { - SPtr<Block3D> blockTemp; - // startLevel bis maxInitLevel - for (int level = startLevel; level <= maxInitLevel; level++) { - // timer.resetAndStart(); - // call LBM kernel - int size = (int)blocks[level].size(); + { + SPtr<Block3D> blockTemp; + //startLevel bis maxInitLevel + for (int level = startLevel; level <= maxInitLevel; level++) + { + //timer.resetAndStart(); + //call LBM kernel + int size = (int)blocks[level].size(); #ifdef _OPENMP #pragma omp for schedule(OMP_SCHEDULE) #endif - for (int i = 0; i < size; i++) { - try { - blockTemp = blocks[level][i]; - blockTemp->getKernel()->calculate(calcStep); - } catch (std::exception &e) { - UBLOG(logERROR, e.what()); - UBLOG(logERROR, blockTemp->toString() << " step = " << calcStep); - std::exit(EXIT_FAILURE); - } + for (int i = 0; i < size; i++) + { + try + { + blockTemp = blocks[level][i]; + blockTemp->getKernel()->calculate(calcStep); + } + catch (std::exception & e) + { + UBLOG(logERROR, e.what()); + UBLOG(logERROR, blockTemp->toString() << " step = " << calcStep); + std::exit(EXIT_FAILURE); } - // timer.stop(); - // UBLOG(logINFO, "level = " << level << " blocks = " << blocks[level].size() << " collision time = " << - // timer.getTotalTime()); - } - } + } + //timer.stop(); + //UBLOG(logINFO, "level = " << level << " blocks = " << blocks[level].size() << " collision time = " << timer.getTotalTime()); + } + } } ////////////////////////////////////////////////////////////////////////// void BasicCalculator::exchangeBlockData(int startLevel, int maxInitLevel) { - // startLevel bis maxInitLevel - for (int level = startLevel; level <= maxInitLevel; level++) { - // connectorsPrepareLocal(localConns[level]); - connectorsSendLocal(localConns[level]); - // connectorsReceiveLocal(localConns[level]); + //startLevel bis maxInitLevel + for (int level = startLevel; level <= maxInitLevel; level++) + { + //connectorsPrepareLocal(localConns[level]); + connectorsSendLocal(localConns[level]); + //connectorsReceiveLocal(localConns[level]); - connectorsPrepareRemote(remoteConns[level]); - connectorsSendRemote(remoteConns[level]); - connectorsReceiveRemote(remoteConns[level]); - } + connectorsPrepareRemote(remoteConns[level]); + connectorsSendRemote(remoteConns[level]); + connectorsReceiveRemote(remoteConns[level]); + } } ////////////////////////////////////////////////////////////////////////// void BasicCalculator::swapDistributions(int startLevel, int maxInitLevel) @@ -221,156 +236,192 @@ void BasicCalculator::swapDistributions(int startLevel, int maxInitLevel) #ifdef _OPENMP #pragma omp parallel #endif - { - // startLevel bis maxInitLevel - for (int level = startLevel; level <= maxInitLevel; level++) { - int size = (int)blocks[level].size(); + { + //startLevel bis maxInitLevel + for (int level = startLevel; level <= maxInitLevel; level++) + { + int size = (int)blocks[level].size(); #ifdef _OPENMP #pragma omp for schedule(OMP_SCHEDULE) #endif - for (int i = 0; i < size; i++) { - blocks[level][i]->getKernel()->swapDistributions(); - } - } - } + for (int i = 0; i < size; i++) + { + blocks[level][i]->getKernel()->swapDistributions(); + } + } + } } ////////////////////////////////////////////////////////////////////////// -void BasicCalculator::connectorsPrepareLocal(std::vector<SPtr<Block3DConnector>> &connectors) +void BasicCalculator::connectorsPrepareLocal(std::vector< SPtr<Block3DConnector> >& connectors) { - int size = (int)connectors.size(); + int size = (int)connectors.size(); #ifdef _OPENMP #pragma omp parallel for schedule(OMP_SCHEDULE) #endif - for (int i = 0; i < size; i++) { - try { - connectors[i]->prepareForReceive(); - connectors[i]->prepareForSend(); - } catch (std::exception &e) { - UBLOG(logERROR, e.what()); - std::exit(EXIT_FAILURE); - } - } + for (int i = 0; i < size; i++) + { + try + { + connectors[i]->prepareForReceive(); + connectors[i]->prepareForSend(); + } + catch (std::exception & e) + { + UBLOG(logERROR, e.what()); + std::exit(EXIT_FAILURE); + } + } } ////////////////////////////////////////////////////////////////////////// -void BasicCalculator::connectorsSendLocal(std::vector<SPtr<Block3DConnector>> &connectors) +void BasicCalculator::connectorsSendLocal(std::vector< SPtr<Block3DConnector> >& connectors) { - int size = (int)connectors.size(); + int size = (int)connectors.size(); #ifdef _OPENMP #pragma omp parallel for schedule(OMP_SCHEDULE) #endif - for (int i = 0; i < size; i++) { - try { - connectors[i]->fillSendVectors(); - connectors[i]->sendVectors(); - } catch (std::exception &e) { - UBLOG(logERROR, e.what()); - std::exit(EXIT_FAILURE); - } - } + for (int i = 0; i < size; i++) + { + try + { + connectors[i]->fillSendVectors(); + connectors[i]->sendVectors(); + } + catch (std::exception & e) + { + UBLOG(logERROR, e.what()); + std::exit(EXIT_FAILURE); + } + } } ////////////////////////////////////////////////////////////////////////// -void BasicCalculator::connectorsReceiveLocal(std::vector<SPtr<Block3DConnector>> &connectors) +void BasicCalculator::connectorsReceiveLocal(std::vector< SPtr<Block3DConnector> >& connectors) { - int size = (int)connectors.size(); + int size = (int)connectors.size(); #ifdef _OPENMP #pragma omp parallel for schedule(OMP_SCHEDULE) #endif - for (int i = 0; i < size; i++) { - connectors[i]->receiveVectors(); - connectors[i]->distributeReceiveVectors(); - } + for (int i = 0; i < size; i++) + { + connectors[i]->receiveVectors(); + connectors[i]->distributeReceiveVectors(); + } } -void BasicCalculator::connectorsPrepareRemote(std::vector<SPtr<Block3DConnector>> &connectors) +void BasicCalculator::connectorsPrepareRemote(std::vector< SPtr<Block3DConnector> >& connectors) { - int size = (int)connectors.size(); - for (int i = 0; i < size; i++) { - connectors[i]->prepareForReceive(); - connectors[i]->prepareForSend(); - } + int size = (int)connectors.size(); + for (int i = 0; i < size; i++) + { + connectors[i]->prepareForReceive(); + connectors[i]->prepareForSend(); + } } ////////////////////////////////////////////////////////////////////////// -void BasicCalculator::connectorsSendRemote(std::vector<SPtr<Block3DConnector>> &connectors) +void BasicCalculator::connectorsSendRemote(std::vector< SPtr<Block3DConnector> >& connectors) { - int size = (int)connectors.size(); - for (int i = 0; i < size; i++) { - connectors[i]->fillSendVectors(); - connectors[i]->sendVectors(); - } + int size = (int)connectors.size(); + for (int i = 0; i < size; i++) + { + connectors[i]->fillSendVectors(); + connectors[i]->sendVectors(); + } } ////////////////////////////////////////////////////////////////////////// -void BasicCalculator::connectorsReceiveRemote(std::vector<SPtr<Block3DConnector>> &connectors) +void BasicCalculator::connectorsReceiveRemote(std::vector< SPtr<Block3DConnector> >& connectors) { - int size = (int)connectors.size(); - for (int i = 0; i < size; i++) { - connectors[i]->receiveVectors(); - connectors[i]->distributeReceiveVectors(); - } + int size = (int)connectors.size(); + for (int i = 0; i < size; i++) + { + connectors[i]->receiveVectors(); + connectors[i]->distributeReceiveVectors(); + } } ////////////////////////////////////////////////////////////////////////// void BasicCalculator::interpolation(int startLevel, int maxInitLevel) { - for (int level = startLevel; level < maxInitLevel; level++) { - connectorsPrepareLocal(localInterConns[level]); - connectorsPrepareRemote(remoteInterConns[level]); - } + for (int level = startLevel; level < maxInitLevel; level++) + { + connectorsPrepareLocal(localInterConns[level]); + connectorsPrepareRemote(remoteInterConns[level]); + } - for (int level = startLevel; level < maxInitLevel; level++) { - connectorsSendLocal(localInterConns[level]); - connectorsSendRemote(remoteInterConns[level]); - } + for (int level = startLevel; level < maxInitLevel; level++) + { + connectorsSendLocal(localInterConns[level]); + connectorsSendRemote(remoteInterConns[level]); + } - for (int level = startLevel; level < maxInitLevel; level++) { - connectorsReceiveLocal(localInterConns[level]); - connectorsReceiveRemote(remoteInterConns[level]); - } + for (int level = startLevel; level < maxInitLevel; level++) + { + connectorsReceiveLocal(localInterConns[level]); + connectorsReceiveRemote(remoteInterConns[level]); + } } ////////////////////////////////////////////////////////////////////////// void BasicCalculator::applyPreCollisionBC(int startLevel, int maxInitLevel) { - // startLevel bis maxInitLevel - for (int level = startLevel; level <= maxInitLevel; level++) { - int size = (int)blocks[level].size(); + //startLevel bis maxInitLevel + for (int level = startLevel; level <= maxInitLevel; level++) + { + int size = (int)blocks[level].size(); #ifdef _OPENMP #pragma omp parallel for schedule(OMP_SCHEDULE) #endif - for (int i = 0; i < size; i++) { - try { - blocks[level][i]->getKernel()->getBCProcessor()->applyPreCollisionBC(); - } catch (std::exception &e) { - UBLOG(logERROR, e.what()); - exit(EXIT_FAILURE); - } catch (std::string &s) { - UBLOG(logERROR, s); - exit(EXIT_FAILURE); - } catch (...) { - UBLOG(logERROR, "unknown exception"); - exit(EXIT_FAILURE); - } - } - } + for (int i = 0; i < size; i++) + { + try + { + blocks[level][i]->getKernel()->getBCProcessor()->applyPreCollisionBC(); + } + catch (std::exception & e) + { + UBLOG(logERROR, e.what()); + exit(EXIT_FAILURE); + } + catch (std::string & s) + { + UBLOG(logERROR, s); + exit(EXIT_FAILURE); + } + catch (...) + { + UBLOG(logERROR, "unknown exception"); + exit(EXIT_FAILURE); + } + } + } } ////////////////////////////////////////////////////////////////////////// void BasicCalculator::applyPostCollisionBC(int startLevel, int maxInitLevel) { - // startLevel bis maxInitLevel - for (int level = startLevel; level <= maxInitLevel; level++) { - int size = (int)blocks[level].size(); + //startLevel bis maxInitLevel + for (int level = startLevel; level <= maxInitLevel; level++) + { + int size = (int)blocks[level].size(); #ifdef _OPENMP #pragma omp parallel for schedule(OMP_SCHEDULE) #endif - for (int i = 0; i < size; i++) { - try { - blocks[level][i]->getKernel()->getBCProcessor()->applyPostCollisionBC(); - } catch (std::exception &e) { - UBLOG(logERROR, e.what()); - exit(EXIT_FAILURE); - } catch (std::string &s) { - UBLOG(logERROR, s); - exit(EXIT_FAILURE); - } catch (...) { - UBLOG(logERROR, "unknown exception"); - exit(EXIT_FAILURE); - } - } - } + for (int i = 0; i < size; i++) + { + try + { + blocks[level][i]->getKernel()->getBCProcessor()->applyPostCollisionBC(); + } + catch (std::exception & e) + { + UBLOG(logERROR, e.what()); + exit(EXIT_FAILURE); + } + catch (std::string & s) + { + UBLOG(logERROR, s); + exit(EXIT_FAILURE); + } + catch (...) + { + UBLOG(logERROR, "unknown exception"); + exit(EXIT_FAILURE); + } + } + } } + diff --git a/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/BasicLBMKernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..553c49961fe2ef66df9ff3ef5511ff495f051766 --- /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 0000000000000000000000000000000000000000..4a6b4632f3648e2cc7e92e2e8314c9ea4fe2c616 --- /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 0000000000000000000000000000000000000000..8a3f1e58fd8209c96bbc82f71cfbf3316fa2cf6c --- /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 b01159e580d9b551430741ce890d0fed32b91710..5542d2c9851e362e012a2950600a5225441f6644 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 0000000000000000000000000000000000000000..57e26c7e0f4d33ad2cf9983daab85dca37d8ed41 --- /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 0000000000000000000000000000000000000000..b75b13031fbfc0c112f2230607cb56928bcba24a --- /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 1376e0da61d5ba3f45ef7acf5e34abae66f89673..a15a7a82ba59f851df5a345989b607b8779e9ac2 100644 --- a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h +++ b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h @@ -35,784 +35,1148 @@ #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; + + + //TODO: may be factor 2 + return sqrt(c2 * (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 0000000000000000000000000000000000000000..c5cff32aab78c8a207143fb81b58f1ca0cba856b --- /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/PowellEyringModelLBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/PowellEyringModelLBMKernel.h new file mode 100644 index 0000000000000000000000000000000000000000..02932d808e2cbc242617405979435c78fd6386d9 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/PowellEyringModelLBMKernel.h @@ -0,0 +1,38 @@ +#ifndef PowellEyringModelLBMKernel_H +#define PowellEyringModelLBMKernel_H + +#include "ThixotropyModelLBMKernel.h" +#include "Thixotropy.h" + +//! \brief Cumulant LBM kernel + Herschel-Bulkley plastic model +//! \author K. Kutscher, M. Geier +class PowellEyringModelLBMKernel : public ThixotropyModelLBMKernel +{ +public: + PowellEyringModelLBMKernel() {}; + ~PowellEyringModelLBMKernel() {}; + SPtr<LBMKernel> clone() override + { + SPtr<LBMKernel> kernel(new PowellEyringModelLBMKernel()); + kernel->setNX(nx); + kernel->setCollisionFactor(collFactor); + dynamicPointerCast<PowellEyringModelLBMKernel>(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::getPowellEyringCollFactor(omegaInf, shearRate, drho); + } +}; + + +#endif \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..42c3240077e4b6cc3e3a279608bca0325b304b8c --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.cpp @@ -0,0 +1,1123 @@ +#include "RheologyK17LBMKernel.h" +#include "D3Q27System.h" +#include "InterpolationProcessor.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include <math.h> +#include "DataSet3D.h" +#include "LBMKernel.h" +#include "Block3D.h" +#include "Thixotropy.h" + +#define PROOF_CORRECTNESS + +////////////////////////////////////////////////////////////////////////// +RheologyK17LBMKernel::RheologyK17LBMKernel() +{ + this->compressible = true; + this->bulkViscosity = 0; + this->OxxPyyPzz = 1.0; +} +////////////////////////////////////////////////////////////////////////// +RheologyK17LBMKernel::~RheologyK17LBMKernel(void) +{ + +} +////////////////////////////////////////////////////////////////////////// +void RheologyK17LBMKernel::initDataSet() +{ + SPtr<DistributionArray3D> d(new D3Q27EsoTwist3DSplittedVector(nx[0]+2, nx[1]+2, nx[2]+2, -999.9)); + dataSet->setFdistributions(d); +} +////////////////////////////////////////////////////////////////////////// +SPtr<LBMKernel> RheologyK17LBMKernel::clone() +{ + SPtr<LBMKernel> kernel(new RheologyK17LBMKernel()); + kernel->setNX(nx); + dynamicPointerCast<RheologyK17LBMKernel>(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()); + + if (bulkViscosity != 0) + { + OxxPyyPzz = LBMSystem::calcOmega2(bulkViscosity, block.lock()->getLevel()); + } + else + { + OxxPyyPzz = one; + } + + dynamicPointerCast<RheologyK17LBMKernel>(kernel)->OxxPyyPzz = this->OxxPyyPzz; + + return kernel; +} +////////////////////////////////////////////////////////////////////////// +void RheologyK17LBMKernel::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; + + ////magic parameter for rheology + //LBMReal a = 10; + //OxxPyyPzz = c1 / (a * ((c1 / omega) - c1o2) + c1o2); + //OxxPyyPzz = (OxxPyyPzz > c1) ? c1 : OxxPyyPzz; + + ////LBMReal OxyyPxzz = eight*(-two+omega)*(one+two*omega)/(-eight-fourteen*omega+seven*omega*omega);//one; + ////LBMReal OxyyMxzz = eight*(-two+omega)*(-seven+four*omega)/(fiftysix-fifty*omega+nine*omega*omega);//one; + ////LBMReal Oxyz = twentyfour*(-two+omega)*(-two-seven*omega+three*omega*omega)/(fourtyeight+c152*omega-c130*omega*omega+twentynine*omega*omega*omega); + //LBMReal OxyyPxzz = 8.0*(omega-2.0)*(OxxPyyPzz*(3.0*omega-1.0)-5.0*omega)/(8.0*(5.0-2.0*omega)*omega+OxxPyyPzz*(8.0+omega*(9.0*omega-26.0))); + //LBMReal OxyyMxzz = 8.0*(omega-2.0)*(omega+OxxPyyPzz*(3.0*omega-7.0))/(OxxPyyPzz*(56.0-42.0*omega+9.0*omega*omega)-8.0*omega); + //LBMReal Oxyz = 24.0*(omega-2.0)*(4.0*omega*omega+omega*OxxPyyPzz*(18.0-13.0*omega)+OxxPyyPzz*OxxPyyPzz*(2.0+omega*(6.0*omega-11.0)))/(16.0*omega*omega*(omega-6.0)-2.0*omega*OxxPyyPzz*(216.0+5.0*omega*(9.0*omega-46.0))+OxxPyyPzz*OxxPyyPzz*(omega*(3.0*omega-10.0)*(15.0*omega-28.0)-48.0)); + + ////LBMReal A = (four + two*omega - three*omega*omega) / (two - seven*omega + five*omega*omega); + ////LBMReal B = (four + twentyeight*omega - fourteen*omega*omega) / (six - twentyone*omega + fiveteen*omega*omega); + + //LBMReal A = (4.0*omega*omega+2.0*omega*OxxPyyPzz*(omega-6.0)+OxxPyyPzz*OxxPyyPzz*(omega*(10.0-3.0*omega)-4.0))/((omega-OxxPyyPzz)*(OxxPyyPzz*(2.0+3.0*omega)-8.0*omega)); + //LBMReal B = (4.0*omega*OxxPyyPzz*(9.0*omega-16.0)-4.0*omega*omega-2.0*OxxPyyPzz*OxxPyyPzz*(2.0+9.0*omega*(omega-2.0)))/(3.0*(omega-OxxPyyPzz)*(OxxPyyPzz*(2.0+3.0*omega)-8.0*omega)); + + 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; + //////////////////////////////////////////////////////////////////////////////////// + + LBMReal omega = 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 = 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.01;// * 0.0001f; + LBMReal qudricLimitM = 0.01;// * 0.0001f; + LBMReal qudricLimitD = 0.01;// * 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 = eight*(-two+omega)*(one+two*omega)/(-eight-fourteen*omega+seven*omega*omega);//one; + + //LBMReal OxyyMxzz = eight*(-two+omega)*(-seven+four*omega)/(fiftysix-fifty*omega+nine*omega*omega);//one; + + //LBMReal Oxyz = twentyfour*(-two+omega)*(-two-seven*omega+three*omega*omega)/(fourtyeight+c152*omega-c130*omega*omega+twentynine*omega*omega*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; + + LBMReal Dxy =-three*omega*mfbba; + LBMReal Dxz =-three*omega*mfbab; + LBMReal Dyz =-three*omega*mfabb; + + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //non Newtonian fluid collision factor + LBMReal shearRate = sqrt(c2 * (dxux * dxux + dyuy * dyuy + dzuz * dzuz) + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (drho + c1); + //omega = getThyxotropyCollFactor(omega, shearRate, rho); + //omega = Thixotropy::getHerschelBulkleyCollFactor(omega, shearRate, drho); + omega = Thixotropy::getBinghamCollFactor(omega, shearRate, drho); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + dxux = c1o2 * (-omega) * (mxxMyy + mxxMzz);// +c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + dyuy = dxux + omega * c3o2 * mxxMyy; + dzuz = dxux + omega * c3o2 * mxxMzz; + + Dxy = -three * omega * mfbba; + Dxz = -three * omega * mfbab; + Dyz = -three * omega * mfabb; + + mxxMyy += omega * (-mxxMyy) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += omega * (-mxxMzz) - three * (one + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); + + mfabb += omega * (-mfabb); + mfbab += omega * (-mfbab); + mfbba += omega * (-mfbba); + + if(omega < c1) { omega = c1; } //arbitrary limit (24.09.2020) + + //omega = collFactor; + + //magic parameter for rheology + LBMReal a = 10; + OxxPyyPzz = c1 / (a * ((c1 / omega) - c1o2) + c1o2); + OxxPyyPzz = (OxxPyyPzz > c1) ? c1 : OxxPyyPzz; + + LBMReal OxyyPxzz = 8.0 * (omega - 2.0) * (OxxPyyPzz * (3.0 * omega - 1.0) - 5.0 * omega) / (8.0 * (5.0 - 2.0 * omega) * omega + OxxPyyPzz * (8.0 + omega * (9.0 * omega - 26.0))); + LBMReal OxyyMxzz = 8.0 * (omega - 2.0) * (omega + OxxPyyPzz * (3.0 * omega - 7.0)) / (OxxPyyPzz * (56.0 - 42.0 * omega + 9.0 * omega * omega) - 8.0 * omega); + LBMReal Oxyz = 24.0 * (omega - 2.0) * (4.0 * omega * omega + omega * OxxPyyPzz * (18.0 - 13.0 * omega) + OxxPyyPzz * OxxPyyPzz * (2.0 + omega * (6.0 * omega - 11.0))) / (16.0 * omega * omega * (omega - 6.0) - 2.0 * omega * OxxPyyPzz * (216.0 + 5.0 * omega * (9.0 * omega - 46.0)) + OxxPyyPzz * OxxPyyPzz * (omega * (3.0 * omega - 10.0) * (15.0 * omega - 28.0) - 48.0)); + + LBMReal A = (4.0 * omega * omega + 2.0 * omega * OxxPyyPzz * (omega - 6.0) + OxxPyyPzz * OxxPyyPzz * (omega * (10.0 - 3.0 * omega) - 4.0)) / ((omega - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * omega) - 8.0 * omega)); + LBMReal B = (4.0 * omega * OxxPyyPzz * (9.0 * omega - 16.0) - 4.0 * omega * omega - 2.0 * OxxPyyPzz * OxxPyyPzz * (2.0 + 9.0 * omega * (omega - 2.0))) / (3.0 * (omega - OxxPyyPzz) * (OxxPyyPzz * (2.0 + 3.0 * omega) - 8.0 * omega)); + + + //relax + + //wadjust = OxxPyyPzz+(one-OxxPyyPzz)*fabs((mfaaa-mxxPyyPzz))/(fabs((mfaaa-mxxPyyPzz))+qudricLimitD); + //mxxPyyPzz += wadjust*(mfaaa-mxxPyyPzz)-three * (one-c1o2 * OxxPyyPzz) * (vx2 * dxux+vy2 * dyuy+vz2 * dzuz); + mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - three * (one - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + + // 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); + CUMacc = -O4*(one / omega - c1o2) * (dyuy + dzuz) * c2o3 * A + (one - O4) * (CUMacc); + CUMcac = -O4*(one / omega - c1o2) * (dxux + dzuz) * c2o3 * A + (one - O4) * (CUMcac); + CUMcca = -O4*(one / omega - c1o2) * (dyuy + dxux) * c2o3 * A + (one - O4) * (CUMcca); + CUMbbc = -O4*(one / omega - c1o2) * Dxy * c1o3 * B + (one - O4) * (CUMbbc); + CUMbcb = -O4*(one / omega - c1o2) * Dxz * c1o3 * B + (one - O4) * (CUMbcb); + CUMcbb = -O4*(one / omega - c1o2) * Dyz * c1o3 * B + (one - O4) * (CUMcbb); + ////////////////////////////////////////////////////////////////////////// + + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + + + //back cumulants to central moments + //4. + mfcbb = CUMcbb+((mfcaa+c1o3) * mfabb+two * mfbba * mfbab)/rho; + mfbcb = CUMbcb+((mfaca+c1o3) * mfbab+two * mfbba * mfabb)/rho; + mfbbc = CUMbbc+((mfaac+c1o3) * mfbba+two * mfbab * mfabb)/rho; + + mfcca = CUMcca+(((mfcaa * mfaca+two * mfbba * mfbba)+c1o3 * (mfcaa+mfaca))/rho-c1o9*(drho/rho));//(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 RheologyK17LBMKernel::getCalculationTime() +{ + //return timer.getDuration(); + return timer.getTotalTime(); +} +////////////////////////////////////////////////////////////////////////// +void RheologyK17LBMKernel::setBulkViscosity(LBMReal value) +{ + bulkViscosity = value; +} + +////////////////////////////////////////////////////////////////////////// +//void RheologyK17LBMKernel::setBulkOmegaToOmega(bool value) +//{ +// bulkOmegaToOmega = value; +//} + +//void RheologyK17LBMKernel::setViscosityFlag(bool vf) +//{ +// viscosityFlag = vf; +//} diff --git a/src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.h new file mode 100644 index 0000000000000000000000000000000000000000..f2c211dffa5da0ca5e189759c75bdaad5a9a5006 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/RheologyK17LBMKernel.h @@ -0,0 +1,51 @@ +#ifndef RheologyK17LBMKernel_h__ +#define RheologyK17LBMKernel_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" + +//! \brief compressible cumulant LBM kernel with rheological properties of shear and bulk viscosity for non-Newtonian fluids. +//! \details CFD solver that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model +//! \author K. Kutscher, M. Geier +class RheologyK17LBMKernel : public LBMKernel +{ +public: + //! This option set relaxation parameter: NORMAL + enum Parameter{NORMAL, MAGIC}; +public: + RheologyK17LBMKernel(); + virtual ~RheologyK17LBMKernel(void); + virtual void calculate(int step); + virtual SPtr<LBMKernel> clone(); + double getCalculationTime() override; + //! The value should not be equal to a shear viscosity + void setBulkViscosity(LBMReal value); +protected: + virtual void initDataSet(); + LBMReal f[D3Q27System::ENDF+1]; + + UbTimer timer; + + 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 + LBMReal OxxPyyPzz; //omega2 (bulk viscosity) + LBMReal bulkViscosity; + +}; +#endif // RheologyK17LBMKernel_h__ + + diff --git a/src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f28c34f0ddc8be17807a32118074a0c07f36bcfa --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.cpp @@ -0,0 +1,86 @@ +#include "Thixotropy.h" + +SPtr<Thixotropy> Thixotropy::instance = SPtr<Thixotropy>(); +LBMReal Thixotropy::tau0 = 0; +LBMReal Thixotropy::k = 0; +LBMReal Thixotropy::n = 1; +LBMReal Thixotropy::omegaMin = 0; +LBMReal Thixotropy::beta = 0; +LBMReal Thixotropy::c = 0; +LBMReal Thixotropy::mu0 = 0; + +////////////////////////////////////////////////////////////////////////// +SPtr<Thixotropy> Thixotropy::getInstance() +{ + if (!instance) + instance = SPtr<Thixotropy>(new Thixotropy()); + return instance; +} + +void Thixotropy::setYieldStress(LBMReal yieldStress) +{ + tau0 = yieldStress; +} +LBMReal Thixotropy::getYieldStress() const +{ + return tau0; +} +void Thixotropy::setViscosityParameter(LBMReal kParameter) +{ + k = kParameter; +} +LBMReal Thixotropy::getViscosityParameter() const +{ + return k; +} +void Thixotropy::setPowerIndex(LBMReal index) +{ + n = index; +} +LBMReal Thixotropy::getPowerIndex() const +{ + return n; +} + +void Thixotropy::setOmegaMin(LBMReal omega) +{ + omegaMin = omega; +} +LBMReal Thixotropy::getOmegaMin() const +{ + return omegaMin; +} + +void Thixotropy::setBeta(LBMReal PowellEyringBeta) +{ + beta = PowellEyringBeta; +} + +LBMReal Thixotropy::getBeta() const +{ + return beta; +} + +void Thixotropy::setC(LBMReal PowellEyringC) +{ + c = PowellEyringC; +} + +LBMReal Thixotropy::getC() const +{ + return c; +} + +void Thixotropy::setMu0(LBMReal mu) +{ + mu0 = mu; +} + +LBMReal Thixotropy::getMu0() const +{ + return mu0; +} + +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 0000000000000000000000000000000000000000..a5ad23dabe7f4d048e854ac9d42a1674d73458a5 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/Thixotropy.h @@ -0,0 +1,162 @@ +#ifndef Thixotropy_H +#define Thixotropy_H + +#include <PointerDefinitions.h> +#include <LBMSystem.h> +#include <UbMath.h> +#include <math.h> + +class Thixotropy +{ +public: + Thixotropy(Thixotropy const&) = delete; + Thixotropy& operator=(Thixotropy const&) = delete; + static SPtr<Thixotropy> getInstance(); + void setYieldStress(LBMReal tau0); + LBMReal getYieldStress() const; + + void setViscosityParameter(LBMReal k); + LBMReal getViscosityParameter() const; + + void setPowerIndex(LBMReal n); + LBMReal getPowerIndex() const; + + void setOmegaMin(LBMReal omegaMin); + LBMReal getOmegaMin() const; + + void setBeta(LBMReal PowellEyringBeta); + LBMReal getBeta() const; + + void setC(LBMReal PowellEyringC); + LBMReal getC() const; + + void setMu0(LBMReal mu); + LBMReal getMu0() const; + + static LBMReal getBinghamCollFactorOld(LBMReal omegaInf, LBMReal shearRate, LBMReal drho); + static LBMReal getBinghamCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho); + static LBMReal getHerschelBulkleyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho); + static LBMReal getHerschelBulkleyCollFactorBackward(LBMReal shearRate, LBMReal drho); + static LBMReal getPowellEyringCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho); +private: + Thixotropy(); + + static SPtr<Thixotropy> instance; + + static LBMReal tau0; + static LBMReal k; + static LBMReal n; + static LBMReal omegaMin; + static LBMReal beta; + static LBMReal c; + static LBMReal mu0; +}; + +////////////////////////////////////////////////////////////////////////// +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())); + + //LBMReal omega = cs2 * cs2 * shearRate * shearRate * omegaInf * rho * rho / (cs2 * cs2 * shearRate * shearRate * rho * rho + cs2 * shearRate * omegaInf * rho * tau0+omegaInf*omegaInf*tau0*tau0); + + LBMReal a = omegaInf * tau0 / (cs2 * shearRate * rho); + //10 iterations + //LBMReal omega = omegaInf / (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a)))))))))); + + //20 iterations + //LBMReal omega = omegaInf / (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a * (1 + a)))))))))))))))))))); + + LBMReal omega = omegaInf*cs2 * shearRate * rho / (cs2 * shearRate * rho + omegaInf * tau0); + LBMReal shearRateNew = shearRate * (omega / omegaInf); + + for (int i = 0; i < 20; i++) + { + omega = omegaInf * cs2 * shearRateNew * rho / (cs2 * shearRateNew * rho + omegaInf * tau0); + shearRateNew = shearRate * (omega / omegaInf); + } + omega = omegaInf * cs2 * shearRateNew * rho / (cs2 * shearRateNew * rho + omegaInf * tau0); + + //if (omega < 0.2) + // omega = 0.2; + return omega; +} + +inline LBMReal Thixotropy::getBinghamCollFactorOld(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) +{ + const LBMReal cs2 = UbMath::c1o3; // UbMath::one_over_sqrt3* UbMath::one_over_sqrt3; + LBMReal rho = UbMath::one + drho; + + if (rho * cs2 * (UbMath::c1 / omegaInf - UbMath::c1o2) * shearRate < tau0) + return 0.0; + else + return omegaInf; +} +////////////////////////////////////////////////////////////////////////// +inline LBMReal Thixotropy::getHerschelBulkleyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) +{ + LBMReal cs2 = UbMath::one_over_sqrt3 * UbMath::one_over_sqrt3; + LBMReal rho = UbMath::one + drho; + LBMReal gammaDot = shearRate; + LBMReal omega = omegaInf; + LBMReal epsilon = 1; + LBMReal gammaDotPowN = std::pow(gammaDot, n); + + while (epsilon > 1e-10) + { + LBMReal omegaOld = omega; + LBMReal omegaByOmegaInfPowN = std::pow(omega / omegaInf, n);/* + LBMReal gammaDotPowOneMinusN = std::pow(gammaDot,1- n); + LBMReal omegaByOmegaInfPowOneMinusN = std::pow(omega / omegaInf, 1-n); + LBMReal numeratorA = (2.0* k * omegaInf + cs2 * gammaDotPowOneMinusN * omegaByOmegaInfPowOneMinusN *omegaInf* rho ); + LBMReal numeratorB = ( cs2 * gammaDot * ( - 2.0) * rho + 2.0 * omegaInf * tau0); + LBMReal denominatorA = (2.0 * k * n * omegaInf + cs2 * gammaDot * rho * omegaInf* gammaDotPowOneMinusN * omegaByOmegaInfPowOneMinusN) + UbMath::Epsilon<LBMReal>::val(); + LBMReal denominatorB = (2.0 * k * n * gammaDotPowN * omegaByOmegaInfPowN * omegaInf + cs2 * gammaDot * rho * omega) + UbMath::Epsilon<LBMReal>::val(); + omega = omega - omega *( numeratorA / denominatorA+ numeratorB / denominatorB);*/ + 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; + //omega = (omega < omegaMin) ? UbMath::c1o2 * (omegaOld-omegaMin)+omegaMin : omega; + epsilon = std::abs(omega - omegaOld); + } + + return omega; +} +////////////////////////////////////////////////////////////////////////// +inline LBMReal Thixotropy::getHerschelBulkleyCollFactorBackward(LBMReal shearRate, LBMReal drho) +{ + LBMReal rho = UbMath::one + drho; + LBMReal gamma = shearRate + UbMath::Epsilon<LBMReal>::val(); + LBMReal cs2 = UbMath::one_over_sqrt3 * UbMath::one_over_sqrt3; + + return 1.0 / ((tau0 + k * std::pow(gamma, n)) / (cs2 * rho * gamma) + UbMath::c1o2); +} +////////////////////////////////////////////////////////////////////////// +inline LBMReal Thixotropy::getPowellEyringCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) +{ + using namespace UbMath; + LBMReal cs2 = c1o3; // UbMath::one_over_sqrt3* UbMath::one_over_sqrt3; + LBMReal rho = c1 + drho; + LBMReal gammaDot = shearRate; + LBMReal omega = omegaInf; + LBMReal epsilon = 1; + + while (epsilon > 1e-10) + { + LBMReal omegaOld = omega; + epsilon = std::abs(omega - omegaOld); + + LBMReal numerator = c*sqrt(c1+(gammaDot*gammaDot*omega*omega)/(c*c*omegaInf*omegaInf))*(beta*(c2*gammaDot*mu0*omega+cs2*gammaDot*(omega-c2)*rho+c2*omegaInf*tau0)+c2*omegaInf*(asinh((gammaDot*omega)/(c*omegaInf)))); + + LBMReal denominator = gammaDot*(c2+beta*c*sqrt(c1+(gammaDot*gammaDot*omega*omega)/(c*c*omegaInf*omegaInf))*(c2*mu0+cs2*rho)) + UbMath::Epsilon<LBMReal>::val(); + + omega = omega - numerator / denominator; + + omega = (omega < UbMath::zeroReal) ? UbMath::c1o2 * omegaOld : omega; + } + + return omega; +} +#endif diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/ThixotropyExpLBMKernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..adbca6c6c57eab9fd520fe7e7fe1f8d7c055053c --- /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 0000000000000000000000000000000000000000..3104808ad21c3976a71ab7a84c06b542932ae08d --- /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/ThixotropyInterpolationProcessor.cpp b/src/cpu/VirtualFluidsCore/LBM/ThixotropyInterpolationProcessor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0f1edd355acde4f072c0bdfd36b25fc541046ced --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyInterpolationProcessor.cpp @@ -0,0 +1,671 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 ThixotropyInterpolationProcessor.cpp +//! \ingroup BoundarConditions +//! \author Konstantin Kutscher +//======================================================================================= + +#include "ThixotropyInterpolationProcessor.h" +#include "D3Q27System.h" +#include "Thixotropy.h" + + +ThixotropyInterpolationProcessor::ThixotropyInterpolationProcessor() + : omegaC(0.0), omegaF(0.0), omegaMin(0.0) +{ + +} +////////////////////////////////////////////////////////////////////////// +ThixotropyInterpolationProcessor::ThixotropyInterpolationProcessor(LBMReal omegaC, LBMReal omegaF, LBMReal omegaMin) + : omegaC(omegaC), omegaF(omegaF), omegaMin(omegaMin) +{ + +} +////////////////////////////////////////////////////////////////////////// +ThixotropyInterpolationProcessor::~ThixotropyInterpolationProcessor() +{ + +} +////////////////////////////////////////////////////////////////////////// +InterpolationProcessorPtr ThixotropyInterpolationProcessor::clone() +{ + InterpolationProcessorPtr iproc = InterpolationProcessorPtr (new ThixotropyInterpolationProcessor(this->omegaC, this->omegaF, this->omegaMin)); + return iproc; +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyInterpolationProcessor::setOmegas( LBMReal omegaC, LBMReal omegaF ) +{ + this->omegaC = omegaC; + this->omegaF = omegaF; +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyInterpolationProcessor::setOmegaMin( LBMReal omegaMin ) +{ + this->omegaMin = omegaMin; +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyInterpolationProcessor::setOffsets(LBMReal xoff, LBMReal yoff, LBMReal zoff) +{ + this->xoff = xoff; + this->yoff = yoff; + this->zoff = zoff; + this->xoff_sq = xoff * xoff; + this->yoff_sq = yoff * yoff; + this->zoff_sq = zoff * zoff; +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyInterpolationProcessor::interpolateCoarseToFine(D3Q27ICell& icellC, D3Q27ICell& icellF, LBMReal xoff, LBMReal yoff, LBMReal zoff) +{ + setOffsets(xoff, yoff, zoff); + calcInterpolatedCoefficiets(icellC, omegaC, 0.5, 0.25, -0.25, -0.25, -1, -1, -1); + calcInterpolatedNode(icellF.BSW, /*omegaF,*/ -0.25, -0.25, -0.25, calcPressBSW(), -1, -1, -1); + calcInterpolatedCoefficiets(icellC, omegaC, 0.5, 0.25, 0.25, -0.25, 1, 1, -1); + calcInterpolatedNode(icellF.BNE, /*omegaF,*/ 0.25, 0.25, -0.25, calcPressBNE(), 1, 1, -1); + calcInterpolatedCoefficiets(icellC, omegaC, 0.5, -0.25, 0.25, 0.25, -1, 1, 1); + calcInterpolatedNode(icellF.TNW, /*omegaF,*/ -0.25, 0.25, 0.25, calcPressTNW(), -1, 1, 1); + calcInterpolatedCoefficiets(icellC, omegaC, 0.5, 0.25, -0.25, 0.25, 1, -1, 1); + calcInterpolatedNode(icellF.TSE, /*omegaF,*/ 0.25, -0.25, 0.25, calcPressTSE(), 1, -1, 1); + calcInterpolatedCoefficiets(icellC, omegaC, 0.5, -0.25, 0.25, -0.25, -1, 1, -1); + calcInterpolatedNode(icellF.BNW, /*omegaF,*/ -0.25, 0.25, -0.25, calcPressBNW(), -1, 1, -1); + calcInterpolatedCoefficiets(icellC, omegaC, 0.5, 0.25, -0.25, -0.25, 1, -1, -1); + calcInterpolatedNode(icellF.BSE, /*omegaF,*/ 0.25, -0.25, -0.25, calcPressBSE(), 1, -1, -1); + calcInterpolatedCoefficiets(icellC, omegaC, 0.5, -0.25, -0.25, 0.25, -1, -1, 1); + calcInterpolatedNode(icellF.TSW, /*omegaF,*/ -0.25, -0.25, 0.25, calcPressTSW(), -1, -1, 1); + calcInterpolatedCoefficiets(icellC, omegaC, 0.5, 0.25, 0.25, 0.25, 1, 1, 1); + calcInterpolatedNode(icellF.TNE, /*omegaF,*/ 0.25, 0.25, 0.25, calcPressTNE(), 1, 1, 1); +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyInterpolationProcessor::interpolateFineToCoarse(D3Q27ICell& icellF, LBMReal* icellC, LBMReal xoff, LBMReal yoff, LBMReal zoff) +{ + setOffsets(xoff, yoff, zoff); + calcInterpolatedCoefficiets(icellF, omegaF, 2.0, 0, 0, 0, 0, 0, 0); + calcInterpolatedNodeFC(icellC, omegaC); +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyInterpolationProcessor::calcMoments(const LBMReal* const f, LBMReal omegaInf, LBMReal& press, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3, LBMReal& kxy, LBMReal& kyz, LBMReal& kxz, LBMReal& kxxMyy, LBMReal& kxxMzz) +{ + using namespace D3Q27System; + + rho = 0.0; + D3Q27System::calcIncompMacroscopicValues(f,rho,vx1,vx2,vx3); + + shearRate = D3Q27System::getShearRate(f, omegaInf); + + LBMReal omega = Thixotropy::getHerschelBulkleyCollFactor(omegaInf, shearRate, rho); + + press = rho; //interpolate rho! + + kxy = -3.*omega*((((f[TSW]+f[BNE])-(f[TNW]+f[BSE]))+((f[BSW]+f[TNE])-(f[BNW]+f[TSE])))+((f[SW]+f[NE])-(f[NW]+f[SE]))-(vx1*vx2));// might not be optimal MG 25.2.13 + kyz = -3.*omega*((((f[BSW]+f[TNE])-(f[TSE]+f[BNW]))+((f[BSE]+f[TNW])-(f[TSW]+f[BNE])))+((f[BS]+f[TN])-(f[TS]+f[BN]))-(vx2*vx3)); + kxz = -3.*omega*((((f[BNW]+f[TSE])-(f[TSW]+f[BNE]))+((f[BSW]+f[TNE])-(f[BSE]+f[TNW])))+((f[BW]+f[TE])-(f[TW]+f[BE]))-(vx1*vx3)); + kxxMyy = -3./2.*omega*((((f[D3Q27System::BW]+f[TE])-(f[BS]+f[TN]))+((f[TW]+f[BE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[S]+f[N]))-(vx1*vx1-vx2*vx2)); + kxxMzz = -3./2.*omega*((((f[NW]+f[SE])-(f[BS]+f[TN]))+((f[SW]+f[NE])-(f[TS]+f[BN])))+((f[W]+f[E])-(f[B]+f[T]))-(vx1*vx1-vx3*vx3)); +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyInterpolationProcessor::calcInterpolatedCoefficiets(const D3Q27ICell& icell, LBMReal omega, LBMReal eps_new, LBMReal x, LBMReal y, LBMReal z, LBMReal xs, LBMReal ys, LBMReal zs) +{ + LBMReal vx1_SWT,vx2_SWT,vx3_SWT; + LBMReal vx1_NWT,vx2_NWT,vx3_NWT; + LBMReal vx1_NET,vx2_NET,vx3_NET; + LBMReal vx1_SET,vx2_SET,vx3_SET; + LBMReal vx1_SWB,vx2_SWB,vx3_SWB; + LBMReal vx1_NWB,vx2_NWB,vx3_NWB; + LBMReal vx1_NEB,vx2_NEB,vx3_NEB; + LBMReal vx1_SEB,vx2_SEB,vx3_SEB; + + LBMReal kxyFromfcNEQ_SWT, kyzFromfcNEQ_SWT, kxzFromfcNEQ_SWT, kxxMyyFromfcNEQ_SWT, kxxMzzFromfcNEQ_SWT; + LBMReal kxyFromfcNEQ_NWT, kyzFromfcNEQ_NWT, kxzFromfcNEQ_NWT, kxxMyyFromfcNEQ_NWT, kxxMzzFromfcNEQ_NWT; + LBMReal kxyFromfcNEQ_NET, kyzFromfcNEQ_NET, kxzFromfcNEQ_NET, kxxMyyFromfcNEQ_NET, kxxMzzFromfcNEQ_NET; + LBMReal kxyFromfcNEQ_SET, kyzFromfcNEQ_SET, kxzFromfcNEQ_SET, kxxMyyFromfcNEQ_SET, kxxMzzFromfcNEQ_SET; + LBMReal kxyFromfcNEQ_SWB, kyzFromfcNEQ_SWB, kxzFromfcNEQ_SWB, kxxMyyFromfcNEQ_SWB, kxxMzzFromfcNEQ_SWB; + LBMReal kxyFromfcNEQ_NWB, kyzFromfcNEQ_NWB, kxzFromfcNEQ_NWB, kxxMyyFromfcNEQ_NWB, kxxMzzFromfcNEQ_NWB; + LBMReal kxyFromfcNEQ_NEB, kyzFromfcNEQ_NEB, kxzFromfcNEQ_NEB, kxxMyyFromfcNEQ_NEB, kxxMzzFromfcNEQ_NEB; + LBMReal kxyFromfcNEQ_SEB, kyzFromfcNEQ_SEB, kxzFromfcNEQ_SEB, kxxMyyFromfcNEQ_SEB, kxxMzzFromfcNEQ_SEB; + + calcMoments(icell.TSW,omega,press_SWT,vx1_SWT,vx2_SWT,vx3_SWT, kxyFromfcNEQ_SWT, kyzFromfcNEQ_SWT, kxzFromfcNEQ_SWT, kxxMyyFromfcNEQ_SWT, kxxMzzFromfcNEQ_SWT); + calcMoments(icell.TNW,omega,press_NWT,vx1_NWT,vx2_NWT,vx3_NWT, kxyFromfcNEQ_NWT, kyzFromfcNEQ_NWT, kxzFromfcNEQ_NWT, kxxMyyFromfcNEQ_NWT, kxxMzzFromfcNEQ_NWT); + calcMoments(icell.TNE,omega,press_NET,vx1_NET,vx2_NET,vx3_NET, kxyFromfcNEQ_NET, kyzFromfcNEQ_NET, kxzFromfcNEQ_NET, kxxMyyFromfcNEQ_NET, kxxMzzFromfcNEQ_NET); + calcMoments(icell.TSE,omega,press_SET,vx1_SET,vx2_SET,vx3_SET, kxyFromfcNEQ_SET, kyzFromfcNEQ_SET, kxzFromfcNEQ_SET, kxxMyyFromfcNEQ_SET, kxxMzzFromfcNEQ_SET); + calcMoments(icell.BSW,omega,press_SWB,vx1_SWB,vx2_SWB,vx3_SWB, kxyFromfcNEQ_SWB, kyzFromfcNEQ_SWB, kxzFromfcNEQ_SWB, kxxMyyFromfcNEQ_SWB, kxxMzzFromfcNEQ_SWB); + calcMoments(icell.BNW,omega,press_NWB,vx1_NWB,vx2_NWB,vx3_NWB, kxyFromfcNEQ_NWB, kyzFromfcNEQ_NWB, kxzFromfcNEQ_NWB, kxxMyyFromfcNEQ_NWB, kxxMzzFromfcNEQ_NWB); + calcMoments(icell.BNE,omega,press_NEB,vx1_NEB,vx2_NEB,vx3_NEB, kxyFromfcNEQ_NEB, kyzFromfcNEQ_NEB, kxzFromfcNEQ_NEB, kxxMyyFromfcNEQ_NEB, kxxMzzFromfcNEQ_NEB); + calcMoments(icell.BSE,omega,press_SEB,vx1_SEB,vx2_SEB,vx3_SEB, kxyFromfcNEQ_SEB, kyzFromfcNEQ_SEB, kxzFromfcNEQ_SEB, kxxMyyFromfcNEQ_SEB, kxxMzzFromfcNEQ_SEB); + + a0 = (-kxxMyyFromfcNEQ_NEB - kxxMyyFromfcNEQ_NET + kxxMyyFromfcNEQ_NWB + kxxMyyFromfcNEQ_NWT - + kxxMyyFromfcNEQ_SEB - kxxMyyFromfcNEQ_SET + kxxMyyFromfcNEQ_SWB + kxxMyyFromfcNEQ_SWT - + kxxMzzFromfcNEQ_NEB - kxxMzzFromfcNEQ_NET + kxxMzzFromfcNEQ_NWB + kxxMzzFromfcNEQ_NWT - + kxxMzzFromfcNEQ_SEB - kxxMzzFromfcNEQ_SET + kxxMzzFromfcNEQ_SWB + kxxMzzFromfcNEQ_SWT - + 2.*kxyFromfcNEQ_NEB - 2.*kxyFromfcNEQ_NET - 2.*kxyFromfcNEQ_NWB - 2.*kxyFromfcNEQ_NWT + + 2.*kxyFromfcNEQ_SEB + 2.*kxyFromfcNEQ_SET + 2.*kxyFromfcNEQ_SWB + 2.*kxyFromfcNEQ_SWT + + 2.*kxzFromfcNEQ_NEB - 2.*kxzFromfcNEQ_NET + 2.*kxzFromfcNEQ_NWB - 2.*kxzFromfcNEQ_NWT + + 2.*kxzFromfcNEQ_SEB - 2.*kxzFromfcNEQ_SET + 2.*kxzFromfcNEQ_SWB - 2.*kxzFromfcNEQ_SWT + + 8.*vx1_NEB + 8.*vx1_NET + 8.*vx1_NWB + 8.*vx1_NWT + 8.*vx1_SEB + + 8.*vx1_SET + 8.*vx1_SWB + 8.*vx1_SWT + 2.*vx2_NEB + 2.*vx2_NET - + 2.*vx2_NWB - 2.*vx2_NWT - 2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB + + 2.*vx2_SWT - 2.*vx3_NEB + 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT - + 2.*vx3_SEB + 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/64.; + b0 = (2.*kxxMyyFromfcNEQ_NEB + 2.*kxxMyyFromfcNEQ_NET + 2.*kxxMyyFromfcNEQ_NWB + 2.*kxxMyyFromfcNEQ_NWT - + 2.*kxxMyyFromfcNEQ_SEB - 2.*kxxMyyFromfcNEQ_SET - 2.*kxxMyyFromfcNEQ_SWB - 2.*kxxMyyFromfcNEQ_SWT - + kxxMzzFromfcNEQ_NEB - kxxMzzFromfcNEQ_NET - kxxMzzFromfcNEQ_NWB - kxxMzzFromfcNEQ_NWT + + kxxMzzFromfcNEQ_SEB + kxxMzzFromfcNEQ_SET + kxxMzzFromfcNEQ_SWB + kxxMzzFromfcNEQ_SWT - + 2.*kxyFromfcNEQ_NEB - 2.*kxyFromfcNEQ_NET + 2.*kxyFromfcNEQ_NWB + 2.*kxyFromfcNEQ_NWT - + 2.*kxyFromfcNEQ_SEB - 2.*kxyFromfcNEQ_SET + 2.*kxyFromfcNEQ_SWB + 2.*kxyFromfcNEQ_SWT + + 2.*kyzFromfcNEQ_NEB - 2.*kyzFromfcNEQ_NET + 2.*kyzFromfcNEQ_NWB - 2.*kyzFromfcNEQ_NWT + + 2.*kyzFromfcNEQ_SEB - 2.*kyzFromfcNEQ_SET + 2.*kyzFromfcNEQ_SWB - 2.*kyzFromfcNEQ_SWT + + 2.*vx1_NEB + 2.*vx1_NET - 2.*vx1_NWB - 2.*vx1_NWT - + 2.*vx1_SEB - 2.*vx1_SET + 2.*vx1_SWB + 2.*vx1_SWT + + 8.*vx2_NEB + 8.*vx2_NET + 8.*vx2_NWB + 8.*vx2_NWT + + 8.*vx2_SEB + 8.*vx2_SET + 8.*vx2_SWB + 8.*vx2_SWT - + 2.*vx3_NEB + 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT + + 2.*vx3_SEB - 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/64.; + c0 = (kxxMyyFromfcNEQ_NEB - kxxMyyFromfcNEQ_NET + kxxMyyFromfcNEQ_NWB - kxxMyyFromfcNEQ_NWT + + kxxMyyFromfcNEQ_SEB - kxxMyyFromfcNEQ_SET + kxxMyyFromfcNEQ_SWB - kxxMyyFromfcNEQ_SWT - + 2.*kxxMzzFromfcNEQ_NEB + 2.*kxxMzzFromfcNEQ_NET - 2.*kxxMzzFromfcNEQ_NWB + 2.*kxxMzzFromfcNEQ_NWT - + 2.*kxxMzzFromfcNEQ_SEB + 2.*kxxMzzFromfcNEQ_SET - 2.*kxxMzzFromfcNEQ_SWB + 2.*kxxMzzFromfcNEQ_SWT - + 2.*kxzFromfcNEQ_NEB - 2.*kxzFromfcNEQ_NET + 2.*kxzFromfcNEQ_NWB + 2.*kxzFromfcNEQ_NWT - + 2.*kxzFromfcNEQ_SEB - 2.*kxzFromfcNEQ_SET + 2.*kxzFromfcNEQ_SWB + 2.*kxzFromfcNEQ_SWT - + 2.*kyzFromfcNEQ_NEB - 2.*kyzFromfcNEQ_NET - 2.*kyzFromfcNEQ_NWB - 2.*kyzFromfcNEQ_NWT + + 2.*kyzFromfcNEQ_SEB + 2.*kyzFromfcNEQ_SET + 2.*kyzFromfcNEQ_SWB + 2.*kyzFromfcNEQ_SWT - + 2.*vx1_NEB + 2.*vx1_NET + 2.*vx1_NWB - 2.*vx1_NWT - + 2.*vx1_SEB + 2.*vx1_SET + 2.*vx1_SWB - 2.*vx1_SWT - + 2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB + 2.*vx2_NWT + + 2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB - 2.*vx2_SWT + + 8.*vx3_NEB + 8.*vx3_NET + 8.*vx3_NWB + 8.*vx3_NWT + + 8.*vx3_SEB + 8.*vx3_SET + 8.*vx3_SWB + 8.*vx3_SWT)/64.; + ax = (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT + vx1_SEB + vx1_SET - vx1_SWB - vx1_SWT)/4.; + bx = (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT + vx2_SEB + vx2_SET - vx2_SWB - vx2_SWT)/4.; + cx = (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT + vx3_SEB + vx3_SET - vx3_SWB - vx3_SWT)/4.; + axx= (kxxMyyFromfcNEQ_NEB + kxxMyyFromfcNEQ_NET - kxxMyyFromfcNEQ_NWB - kxxMyyFromfcNEQ_NWT + + kxxMyyFromfcNEQ_SEB + kxxMyyFromfcNEQ_SET - kxxMyyFromfcNEQ_SWB - kxxMyyFromfcNEQ_SWT + + kxxMzzFromfcNEQ_NEB + kxxMzzFromfcNEQ_NET - kxxMzzFromfcNEQ_NWB - kxxMzzFromfcNEQ_NWT + + kxxMzzFromfcNEQ_SEB + kxxMzzFromfcNEQ_SET - kxxMzzFromfcNEQ_SWB - kxxMzzFromfcNEQ_SWT + + 2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB - 2.*vx2_NWT - + 2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB + 2.*vx2_SWT - + 2.*vx3_NEB + 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT - + 2.*vx3_SEB + 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/16.; + bxx= (kxyFromfcNEQ_NEB + kxyFromfcNEQ_NET - kxyFromfcNEQ_NWB - kxyFromfcNEQ_NWT + + kxyFromfcNEQ_SEB + kxyFromfcNEQ_SET - kxyFromfcNEQ_SWB - kxyFromfcNEQ_SWT - + 2.*vx1_NEB - 2.*vx1_NET + 2.*vx1_NWB + 2.*vx1_NWT + + 2.*vx1_SEB + 2.*vx1_SET - 2.*vx1_SWB - 2.*vx1_SWT)/8.; + cxx= (kxzFromfcNEQ_NEB + kxzFromfcNEQ_NET - kxzFromfcNEQ_NWB - kxzFromfcNEQ_NWT + + kxzFromfcNEQ_SEB + kxzFromfcNEQ_SET - kxzFromfcNEQ_SWB - kxzFromfcNEQ_SWT + + 2.*vx1_NEB - 2.*vx1_NET - 2.*vx1_NWB + 2.*vx1_NWT + + 2.*vx1_SEB - 2.*vx1_SET - 2.*vx1_SWB + 2.*vx1_SWT)/8.; + ay = (vx1_NEB + vx1_NET + vx1_NWB + vx1_NWT - vx1_SEB - vx1_SET - vx1_SWB - vx1_SWT)/4.; + by = (vx2_NEB + vx2_NET + vx2_NWB + vx2_NWT - vx2_SEB - vx2_SET - vx2_SWB - vx2_SWT)/4.; + cy = (vx3_NEB + vx3_NET + vx3_NWB + vx3_NWT - vx3_SEB - vx3_SET - vx3_SWB - vx3_SWT)/4.; + ayy= (kxyFromfcNEQ_NEB + kxyFromfcNEQ_NET + kxyFromfcNEQ_NWB + kxyFromfcNEQ_NWT - + kxyFromfcNEQ_SEB - kxyFromfcNEQ_SET - kxyFromfcNEQ_SWB - kxyFromfcNEQ_SWT - + 2.*vx2_NEB - 2.*vx2_NET + 2.*vx2_NWB + 2.*vx2_NWT + + 2.*vx2_SEB + 2.*vx2_SET - 2.*vx2_SWB - 2.*vx2_SWT)/8.; + byy= (-2.*kxxMyyFromfcNEQ_NEB - 2.*kxxMyyFromfcNEQ_NET - 2.*kxxMyyFromfcNEQ_NWB - 2.*kxxMyyFromfcNEQ_NWT + + 2.*kxxMyyFromfcNEQ_SEB + 2.*kxxMyyFromfcNEQ_SET + 2.*kxxMyyFromfcNEQ_SWB + 2.*kxxMyyFromfcNEQ_SWT + + kxxMzzFromfcNEQ_NEB + kxxMzzFromfcNEQ_NET + kxxMzzFromfcNEQ_NWB + kxxMzzFromfcNEQ_NWT - + kxxMzzFromfcNEQ_SEB - kxxMzzFromfcNEQ_SET - kxxMzzFromfcNEQ_SWB - kxxMzzFromfcNEQ_SWT + + 2.*vx1_NEB + 2.*vx1_NET - 2.*vx1_NWB - 2.*vx1_NWT - + 2.*vx1_SEB - 2.*vx1_SET + 2.*vx1_SWB + 2.*vx1_SWT - + 2.*vx3_NEB + 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT + + 2.*vx3_SEB - 2.*vx3_SET + 2.*vx3_SWB - 2.*vx3_SWT)/16.; + cyy= (kyzFromfcNEQ_NEB + kyzFromfcNEQ_NET + kyzFromfcNEQ_NWB + kyzFromfcNEQ_NWT - + kyzFromfcNEQ_SEB - kyzFromfcNEQ_SET - kyzFromfcNEQ_SWB - kyzFromfcNEQ_SWT + + 2.*vx2_NEB - 2.*vx2_NET + 2.*vx2_NWB - 2.*vx2_NWT - + 2.*vx2_SEB + 2.*vx2_SET - 2.*vx2_SWB + 2.*vx2_SWT)/8.; + az = (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT - vx1_SEB + vx1_SET - vx1_SWB + vx1_SWT)/4.; + bz = (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT - vx2_SEB + vx2_SET - vx2_SWB + vx2_SWT)/4.; + cz = (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT - vx3_SEB + vx3_SET - vx3_SWB + vx3_SWT)/4.; + azz= (-kxzFromfcNEQ_NEB + kxzFromfcNEQ_NET - kxzFromfcNEQ_NWB + kxzFromfcNEQ_NWT - + kxzFromfcNEQ_SEB + kxzFromfcNEQ_SET - kxzFromfcNEQ_SWB + kxzFromfcNEQ_SWT + + 2.*vx3_NEB - 2.*vx3_NET - 2.*vx3_NWB + 2.*vx3_NWT + + 2.*vx3_SEB - 2.*vx3_SET - 2.*vx3_SWB + 2.*vx3_SWT)/8.; + bzz= (-kyzFromfcNEQ_NEB + kyzFromfcNEQ_NET - kyzFromfcNEQ_NWB + kyzFromfcNEQ_NWT - + kyzFromfcNEQ_SEB + kyzFromfcNEQ_SET - kyzFromfcNEQ_SWB + kyzFromfcNEQ_SWT + + 2.*vx3_NEB - 2.*vx3_NET + 2.*vx3_NWB - 2.*vx3_NWT - + 2.*vx3_SEB + 2.*vx3_SET - 2.*vx3_SWB + 2.*vx3_SWT)/8.; + czz= (-kxxMyyFromfcNEQ_NEB + kxxMyyFromfcNEQ_NET - kxxMyyFromfcNEQ_NWB + kxxMyyFromfcNEQ_NWT - + kxxMyyFromfcNEQ_SEB + kxxMyyFromfcNEQ_SET - kxxMyyFromfcNEQ_SWB + kxxMyyFromfcNEQ_SWT + + 2.*kxxMzzFromfcNEQ_NEB - 2.*kxxMzzFromfcNEQ_NET + 2.*kxxMzzFromfcNEQ_NWB - 2.*kxxMzzFromfcNEQ_NWT + + 2.*kxxMzzFromfcNEQ_SEB - 2.*kxxMzzFromfcNEQ_SET + 2.*kxxMzzFromfcNEQ_SWB - 2.*kxxMzzFromfcNEQ_SWT - + 2.*vx1_NEB + 2.*vx1_NET + 2.*vx1_NWB - 2.*vx1_NWT - + 2.*vx1_SEB + 2.*vx1_SET + 2.*vx1_SWB - 2.*vx1_SWT - + 2.*vx2_NEB + 2.*vx2_NET - 2.*vx2_NWB + 2.*vx2_NWT + + 2.*vx2_SEB - 2.*vx2_SET + 2.*vx2_SWB - 2.*vx2_SWT)/16.; + axy= (vx1_NEB + vx1_NET - vx1_NWB - vx1_NWT - vx1_SEB - vx1_SET + vx1_SWB + vx1_SWT)/2.; + bxy= (vx2_NEB + vx2_NET - vx2_NWB - vx2_NWT - vx2_SEB - vx2_SET + vx2_SWB + vx2_SWT)/2.; + cxy= (vx3_NEB + vx3_NET - vx3_NWB - vx3_NWT - vx3_SEB - vx3_SET + vx3_SWB + vx3_SWT)/2.; + axz= (-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT - vx1_SEB + vx1_SET + vx1_SWB - vx1_SWT)/2.; + bxz= (-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT - vx2_SEB + vx2_SET + vx2_SWB - vx2_SWT)/2.; + cxz= (-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT - vx3_SEB + vx3_SET + vx3_SWB - vx3_SWT)/2.; + ayz= (-vx1_NEB + vx1_NET - vx1_NWB + vx1_NWT + vx1_SEB - vx1_SET + vx1_SWB - vx1_SWT)/2.; + byz= (-vx2_NEB + vx2_NET - vx2_NWB + vx2_NWT + vx2_SEB - vx2_SET + vx2_SWB - vx2_SWT)/2.; + cyz= (-vx3_NEB + vx3_NET - vx3_NWB + vx3_NWT + vx3_SEB - vx3_SET + vx3_SWB - vx3_SWT)/2.; + axyz=-vx1_NEB + vx1_NET + vx1_NWB - vx1_NWT + vx1_SEB - vx1_SET - vx1_SWB + vx1_SWT; + bxyz=-vx2_NEB + vx2_NET + vx2_NWB - vx2_NWT + vx2_SEB - vx2_SET - vx2_SWB + vx2_SWT; + cxyz=-vx3_NEB + vx3_NET + vx3_NWB - vx3_NWT + vx3_SEB - vx3_SET - vx3_SWB + vx3_SWT; + + kxyAverage =0; + kyzAverage =0; + kxzAverage =0; + kxxMyyAverage =0; + kxxMzzAverage =0; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // + // Bernd das Brot + // + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + a0 = a0 + xoff * ax + yoff * ay + zoff * az + xoff_sq * axx + yoff_sq * ayy + zoff_sq * azz + xoff*yoff*axy + xoff*zoff*axz + yoff*zoff*ayz + xoff*yoff*zoff*axyz ; + ax = ax + 2. * xoff * axx + yoff * axy + zoff * axz + yoff*zoff*axyz; + ay = ay + 2. * yoff * ayy + xoff * axy + zoff * ayz + xoff*zoff*axyz; + az = az + 2. * zoff * azz + xoff * axz + yoff * ayz + xoff*yoff*axyz; + b0 = b0 + xoff * bx + yoff * by + zoff * bz + xoff_sq * bxx + yoff_sq * byy + zoff_sq * bzz + xoff*yoff*bxy + xoff*zoff*bxz + yoff*zoff*byz + xoff*yoff*zoff*bxyz; + bx = bx + 2. * xoff * bxx + yoff * bxy + zoff * bxz + yoff*zoff*bxyz; + by = by + 2. * yoff * byy + xoff * bxy + zoff * byz + xoff*zoff*bxyz; + bz = bz + 2. * zoff * bzz + xoff * bxz + yoff * byz + xoff*yoff*bxyz; + c0 = c0 + xoff * cx + yoff * cy + zoff * cz + xoff_sq * cxx + yoff_sq * cyy + zoff_sq * czz + xoff*yoff*cxy + xoff*zoff*cxz + yoff*zoff*cyz + xoff*yoff*zoff*cxyz; + cx = cx + 2. * xoff * cxx + yoff * cxy + zoff * cxz + yoff*zoff*cxyz; + cy = cy + 2. * yoff * cyy + xoff * cxy + zoff * cyz + xoff*zoff*cxyz; + cz = cz + 2. * zoff * czz + xoff * cxz + yoff * cyz + xoff*yoff*cxyz; + axy= axy + zoff*axyz; + axz= axz + yoff*axyz; + ayz= ayz + xoff*axyz; + bxy= bxy + zoff*bxyz; + bxz= bxz + yoff*bxyz; + byz= byz + xoff*bxyz; + cxy= cxy + zoff*cxyz; + cxz= cxz + yoff*cxyz; + cyz= cyz + xoff*cxyz; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + LBMReal dxux = ax + 0.5*axx*xs+ 0.25*(axy*ys+axz*zs)+0.0625*axyz*ys*zs; + LBMReal dyuy = by + 0.5 * byy * ys + 0.25 * (bxy * xs + byz * zs) + 0.0625 * bxyz * xs * zs; + LBMReal dzuz = cz + 0.5 * czz * zs + 0.25 * (cxz * xs + cyz * ys) + 0.0625 * cxyz * xs * ys; + + LBMReal Dxy = bx + 0.5 * bxx * xs + 0.25 * (bxy * ys + bxz * zs) + 0.0625 * bxyz * ys * zs + ay + 0.5 * ayy * ys + 0.25 * (axy * xs + ayz * zs) + 0.0625 * axyz * xs * zs; + LBMReal Dxz = cx + 0.5 * cxx * xs + 0.25 * (cxy * ys + cxz * zs) + 0.0625 * cxyz * ys * zs + az + 0.5 * azz * zs + 0.25 * (axz * xs + ayz * ys) + 0.0625 * axyz * xs * ys; + LBMReal Dyz = cy + 0.5 * cyy * ys + 0.25 * (cxy * xs + cyz * zs) + 0.0625 * cxyz * xs * zs + bz + 0.5 * bzz * zs + 0.25 * (bxz * xs + byz * ys) + 0.0625 * bxyz * xs * ys; + + shearRate = sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz); + + + LBMReal o = Thixotropy::getHerschelBulkleyCollFactorBackward(shearRate, rho); //omega; + + if (o < omegaMin) + o = omegaMin; + + f_E = eps_new*((2*(-2*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(27.*o)); + f_N = eps_new*((2*(ax - 2*by + cz+2*kxxMyyAverage-kxxMzzAverage))/(27.*o)); + f_T = eps_new*((2*(ax + by - 2*cz-kxxMyyAverage+2*kxxMzzAverage))/(27.*o)); + f_NE = eps_new*(-(ax + 3*ay + 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage+3*kxyAverage)/(54.*o)); + f_SE = eps_new*(-(ax - 3*ay - 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage-3*kxyAverage)/(54.*o)); + f_TE = eps_new*(-(ax + 3*az - 2*by + 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage+3*kxzAverage)/(54.*o)); + f_BE = eps_new*(-(ax - 3*az - 2*by - 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage-3*kxzAverage)/(54.*o)); + f_TN = eps_new*(-(-2*ax + by + 3*bz + 3*cy + cz-kxxMyyAverage-kxxMzzAverage+3*kyzAverage)/(54.*o)); + f_BN = eps_new*(-(-2*ax + by - 3*bz - 3*cy + cz-kxxMyyAverage-kxxMzzAverage-3*kyzAverage)/(54.*o)); + f_ZERO = 0.; + f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(72.*o)); + f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(72.*o)); + f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o)); + f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o)); + + x_E = 0.25*eps_new*((2*(-4*axx + bxy + cxz))/(27.*o)); + x_N = 0.25*eps_new*((2*(2*axx - 2*bxy + cxz))/(27.*o)); + x_T = 0.25*eps_new*((2*(2*axx + bxy - 2*cxz))/(27.*o)); + x_NE = 0.25*eps_new*(-((2*axx + 3*axy + 6*bxx + bxy - 2*cxz))/(54.*o)); + x_SE = 0.25*eps_new*(-((2*axx - 3*axy - 6*bxx + bxy - 2*cxz))/(54.*o)); + x_TE = 0.25*eps_new*(-((2*axx + 3*axz - 2*bxy + 6*cxx + cxz))/(54.*o)); + x_BE = 0.25*eps_new*(-((2*axx - 3*axz - 2*bxy - 6*cxx + cxz))/(54.*o)); + x_TN = 0.25*eps_new*(-((-4*axx + bxy + 3*bxz + 3*cxy + cxz))/(54.*o)); + x_BN = 0.25*eps_new*(-((-4*axx + bxy - 3*bxz - 3*cxy + cxz))/(54.*o)); + x_ZERO = 0.; + x_TNE = 0.25*eps_new*(-((axy + axz + 2*bxx + bxz + 2*cxx + cxy))/(72.*o)); + x_TSW = 0.25*eps_new*(((-axy + axz - 2*bxx + bxz + 2*cxx + cxy))/(72.*o)); + x_TSE = 0.25*eps_new*(((axy - axz + 2*bxx + bxz - 2*cxx + cxy))/(72.*o)); + x_TNW = 0.25*eps_new*(((axy + axz + 2*bxx - bxz + 2*cxx - cxy))/(72.*o)); + + y_E = 0.25*eps_new*(2*(-2*axy + 2*byy + cyz))/(27.*o); + y_N = 0.25*eps_new*(2*(axy - 4*byy + cyz))/(27.*o); + y_T = 0.25*eps_new*(2*(axy + 2*byy - 2*cyz))/(27.*o); + y_NE = 0.25*eps_new*(-((axy + 6*ayy + 3*bxy + 2*byy - 2*cyz))/(54.*o)); + y_SE = 0.25*eps_new*(-((axy - 6*ayy - 3*bxy + 2*byy - 2*cyz))/(54.*o)); + y_TE = 0.25*eps_new*(-((axy + 3*ayz - 4*byy + 3*cxy + cyz))/(54.*o)); + y_BE = 0.25*eps_new*(-((axy - 3*ayz - 4*byy - 3*cxy + cyz))/(54.*o)); + y_TN = 0.25*eps_new*(-((-2*axy + 2*byy + 3*byz + 6*cyy + cyz))/(54.*o)); + y_BN = 0.25*eps_new*(-((-2*axy + 2*byy - 3*byz - 6*cyy + cyz))/(54.*o)); + y_ZERO = 0.; + y_TNE = 0.25*eps_new*(-((2*ayy + ayz + bxy + byz + cxy + 2*cyy))/(72.*o)); + y_TSW = 0.25*eps_new*(((-2*ayy + ayz - bxy + byz + cxy + 2*cyy))/(72.*o)); + y_TSE = 0.25*eps_new*(((2*ayy - ayz + bxy + byz - cxy + 2*cyy))/(72.*o)); + y_TNW = 0.25*eps_new*(((2*ayy + ayz + bxy - byz + cxy - 2*cyy))/(72.*o)); + + z_E = 0.25*eps_new*((2*(-2*axz + byz + 2*czz))/(27.*o)); + z_N = 0.25*eps_new*((2*(axz - 2*byz + 2*czz))/(27.*o)); + z_T = 0.25*eps_new*((2*(axz + byz - 4*czz))/(27.*o)); + z_NE = 0.25*eps_new*(-((axz + 3*ayz + 3*bxz + byz - 4*czz))/(54.*o)); + z_SE = 0.25*eps_new*(-((axz - 3*ayz - 3*bxz + byz - 4*czz))/(54.*o)); + z_TE = 0.25*eps_new*(-((axz + 6*azz - 2*byz + 3*cxz + 2*czz))/(54.*o)); + z_BE = 0.25*eps_new*(-((axz - 6*azz - 2*byz - 3*cxz + 2*czz))/(54.*o)); + z_TN = 0.25*eps_new*(-((-2*axz + byz + 6*bzz + 3*cyz + 2*czz))/(54.*o)); + z_BN = 0.25*eps_new*(-((-2*axz + byz - 6*bzz - 3*cyz + 2*czz))/(54.*o)); + z_ZERO = 0.; + z_TNE = 0.25*eps_new*(-((ayz + 2*azz + bxz + 2*bzz + cxz + cyz))/(72.*o)); + z_TSW = 0.25*eps_new*(((-ayz + 2*azz - bxz + 2*bzz + cxz + cyz))/(72.*o)); + z_TSE = 0.25*eps_new*(((ayz - 2*azz + bxz + 2*bzz - cxz + cyz))/(72.*o)); + z_TNW = 0.25*eps_new*(((ayz + 2*azz + bxz - 2*bzz + cxz - cyz))/(72.*o)); + + xy_E = 0.0625*eps_new *(( 2.*cxyz)/(27.*o)); + xy_N = 0.0625*eps_new *(( 2.*cxyz)/(27.*o)); + xy_T = -(0.0625*eps_new *(( 4.*cxyz)/(27.*o))); + xy_NE = 0.0625*eps_new *( cxyz /(27.*o)); + xy_SE = 0.0625*eps_new *( cxyz /(27.*o)); + xy_TE = -(0.0625*eps_new *(( 3.*axyz + cxyz)/(54.*o))); + xy_BE = -(0.0625*eps_new *((-3.*axyz + cxyz)/(54.*o))); + xy_TN = -(0.0625*eps_new *(( 3.*bxyz + cxyz)/(54.*o))); + xy_BN = -(0.0625*eps_new *(( - 3.*bxyz + cxyz)/(54.*o))); + + xy_TNE = -(0.0625*eps_new *(( axyz + bxyz )/(72.*o))); + xy_TSW = 0.0625*eps_new *(( axyz + bxyz )/(72.*o)); + xy_TSE = 0.0625*eps_new *((- axyz + bxyz )/(72.*o)); + xy_TNW = 0.0625*eps_new *(( axyz - bxyz )/(72.*o)); + + xz_E = 0.0625*eps_new *(( 2.*bxyz )/(27.*o)); + xz_N = -(0.0625*eps_new *(( 4.*bxyz )/(27.*o))); + xz_T = 0.0625*eps_new *(( 2.*bxyz )/(27.*o)); + xz_NE = -(0.0625*eps_new *(( 3.*axyz + bxyz )/(54.*o))); + xz_SE = -(0.0625*eps_new *((-3.*axyz + bxyz )/(54.*o))); + xz_TE = 0.0625*eps_new *(( bxyz )/(27.*o)); + xz_BE = 0.0625*eps_new *(( bxyz )/(27.*o)); + xz_TN = -(0.0625*eps_new *(( bxyz + 3.*cxyz)/(54.*o))); + xz_BN = -(0.0625*eps_new *(( bxyz - 3.*cxyz)/(54.*o))); + + xz_TNE = -(0.0625*eps_new *(( axyz + cxyz)/(72.*o))); + xz_TSW = 0.0625*eps_new *((- axyz + cxyz)/(72.*o)); + xz_TSE = 0.0625*eps_new *(( axyz + cxyz)/(72.*o)); + xz_TNW = 0.0625*eps_new *(( axyz - cxyz)/(72.*o)); + + yz_E = -(0.0625*eps_new *(( 4.*axyz )/(27.*o))); + yz_N = 0.0625*eps_new *(( 2.*axyz )/(27.*o)); + yz_T = 0.0625*eps_new *(( 2.*axyz )/(27.*o)); + yz_NE = -(0.0625*eps_new *(( axyz + 3.*bxyz )/(54.*o))); + yz_SE = -(0.0625*eps_new *(( axyz - 3.*bxyz )/(54.*o))); + yz_TE = -(0.0625*eps_new *(( axyz + 3.*cxyz)/(54.*o))); + yz_BE = -(0.0625*eps_new *(( axyz - 3.*cxyz)/(54.*o))); + yz_TN = 0.0625*eps_new *(( axyz )/(27.*o)); + yz_BN = 0.0625*eps_new *(( axyz )/(27.*o)); + + yz_TNE = -(0.0625*eps_new *(( bxyz + cxyz)/(72.*o))); + yz_TSW = 0.0625*eps_new *(( - bxyz + cxyz)/(72.*o)); + yz_TSE = 0.0625*eps_new *(( bxyz - cxyz)/(72.*o)); + yz_TNW = 0.0625*eps_new *(( bxyz + cxyz)/(72.*o)); +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyInterpolationProcessor::calcInterpolatedNode(LBMReal* f, /*LBMReal omega,*/ LBMReal x, LBMReal y, LBMReal z, LBMReal press, LBMReal xs, LBMReal ys, LBMReal zs) +{ + using namespace D3Q27System; + + LBMReal rho = press ; + LBMReal vx1 = a0 + 0.25*( xs*ax + ys*ay + zs*az) + 0.0625*(axx + xs*ys*axy + xs*zs*axz + ayy + ys*zs*ayz + azz) + 0.015625*(xs*ys*zs*axyz); + LBMReal vx2 = b0 + 0.25*( xs*bx + ys*by + zs*bz) + 0.0625*(bxx + xs*ys*bxy + xs*zs*bxz + byy + ys*zs*byz + bzz) + 0.015625*(xs*ys*zs*bxyz); + LBMReal vx3 = c0 + 0.25*( xs*cx + ys*cy + zs*cz) + 0.0625*(cxx + xs*ys*cxy + xs*zs*cxz + cyy + ys*zs*cyz + czz) + 0.015625*(xs*ys*zs*cxyz); + + LBMReal feq[ENDF+1]; + D3Q27System::calcIncompFeq(feq,rho,vx1,vx2,vx3); + + f[E] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[E]; + f[W] = f_E + xs*x_E + ys*y_E + zs*z_E + xs*ys*xy_E + xs*zs*xz_E + ys*zs*yz_E + feq[W]; + f[N] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[N]; + f[S] = f_N + xs*x_N + ys*y_N + zs*z_N + xs*ys*xy_N + xs*zs*xz_N + ys*zs*yz_N + feq[S]; + f[T] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[T]; + f[B] = f_T + xs*x_T + ys*y_T + zs*z_T + xs*ys*xy_T + xs*zs*xz_T + ys*zs*yz_T + feq[B]; + f[NE] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[NE]; + f[SW] = f_NE + xs*x_NE + ys*y_NE + zs*z_NE + xs*ys*xy_NE + xs*zs*xz_NE + ys*zs*yz_NE + feq[SW]; + f[SE] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[SE]; + f[NW] = f_SE + xs*x_SE + ys*y_SE + zs*z_SE + xs*ys*xy_SE + xs*zs*xz_SE + ys*zs*yz_SE + feq[NW]; + f[TE] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[TE]; + f[BW] = f_TE + xs*x_TE + ys*y_TE + zs*z_TE + xs*ys*xy_TE + xs*zs*xz_TE + ys*zs*yz_TE + feq[BW]; + f[BE] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[BE]; + f[TW] = f_BE + xs*x_BE + ys*y_BE + zs*z_BE + xs*ys*xy_BE + xs*zs*xz_BE + ys*zs*yz_BE + feq[TW]; + f[TN] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[TN]; + f[BS] = f_TN + xs*x_TN + ys*y_TN + zs*z_TN + xs*ys*xy_TN + xs*zs*xz_TN + ys*zs*yz_TN + feq[BS]; + f[BN] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[BN]; + f[TS] = f_BN + xs*x_BN + ys*y_BN + zs*z_BN + xs*ys*xy_BN + xs*zs*xz_BN + ys*zs*yz_BN + feq[TS]; + f[TNE] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[TNE]; + f[TSW] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[TSW]; + f[TSE] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[TSE]; + f[TNW] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[TNW]; + f[BNE] = f_TSW + xs*x_TSW + ys*y_TSW + zs*z_TSW + xs*ys*xy_TSW + xs*zs*xz_TSW + ys*zs*yz_TSW + feq[BNE]; + f[BSW] = f_TNE + xs*x_TNE + ys*y_TNE + zs*z_TNE + xs*ys*xy_TNE + xs*zs*xz_TNE + ys*zs*yz_TNE + feq[BSW]; + f[BSE] = f_TNW + xs*x_TNW + ys*y_TNW + zs*z_TNW + xs*ys*xy_TNW + xs*zs*xz_TNW + ys*zs*yz_TNW + feq[BSE]; + f[BNW] = f_TSE + xs*x_TSE + ys*y_TSE + zs*z_TSE + xs*ys*xy_TSE + xs*zs*xz_TSE + ys*zs*yz_TSE + feq[BNW]; + f[ZERO] = f_ZERO + xs*x_ZERO + ys*y_ZERO + zs*z_ZERO + feq[ZERO]; +} +////////////////////////////////////////////////////////////////////////// +//Position SWB -0.25, -0.25, -0.25 +LBMReal ThixotropyInterpolationProcessor::calcPressBSW() +{ + return press_SWT * (0.140625 + 0.1875 * xoff + 0.1875 * yoff - 0.5625 * zoff) + + press_NWT * (0.046875 + 0.0625 * xoff - 0.1875 * yoff - 0.1875 * zoff) + + press_SET * (0.046875 - 0.1875 * xoff + 0.0625 * yoff - 0.1875 * zoff) + + press_NET * (0.015625 - 0.0625 * xoff - 0.0625 * yoff - 0.0625 * zoff) + + press_NEB * (0.046875 - 0.1875 * xoff - 0.1875 * yoff + 0.0625 * zoff) + + press_NWB * (0.140625 + 0.1875 * xoff - 0.5625 * yoff + 0.1875 * zoff) + + press_SEB * (0.140625 - 0.5625 * xoff + 0.1875 * yoff + 0.1875 * zoff) + + press_SWB * (0.421875 + 0.5625 * xoff + 0.5625 * yoff + 0.5625 * zoff); +} +////////////////////////////////////////////////////////////////////////// +//Position SWT -0.25, -0.25, 0.25 +LBMReal ThixotropyInterpolationProcessor::calcPressTSW() +{ + return press_SWT * (0.421875 + 0.5625 * xoff + 0.5625 * yoff - 0.5625 * zoff) + + press_NWT * (0.140625 + 0.1875 * xoff - 0.5625 * yoff - 0.1875 * zoff) + + press_SET * (0.140625 - 0.5625 * xoff + 0.1875 * yoff - 0.1875 * zoff) + + press_NET * (0.046875 - 0.1875 * xoff - 0.1875 * yoff - 0.0625 * zoff) + + press_NEB * (0.015625 - 0.0625 * xoff - 0.0625 * yoff + 0.0625 * zoff) + + press_NWB * (0.046875 + 0.0625 * xoff - 0.1875 * yoff + 0.1875 * zoff) + + press_SEB * (0.046875 - 0.1875 * xoff + 0.0625 * yoff + 0.1875 * zoff) + + press_SWB * (0.140625 + 0.1875 * xoff + 0.1875 * yoff + 0.5625 * zoff); +} +////////////////////////////////////////////////////////////////////////// +//Position SET 0.25, -0.25, 0.25 +LBMReal ThixotropyInterpolationProcessor::calcPressTSE() +{ + return press_SET * (0.421875 - 0.5625 * xoff + 0.5625 * yoff - 0.5625 * zoff) + + press_NET * (0.140625 - 0.1875 * xoff - 0.5625 * yoff - 0.1875 * zoff) + + press_SWT * (0.140625 + 0.5625 * xoff + 0.1875 * yoff - 0.1875 * zoff) + + press_NWT * (0.046875 + 0.1875 * xoff - 0.1875 * yoff - 0.0625 * zoff) + + press_NWB * (0.015625 + 0.0625 * xoff - 0.0625 * yoff + 0.0625 * zoff) + + press_NEB * (0.046875 - 0.0625 * xoff - 0.1875 * yoff + 0.1875 * zoff) + + press_SWB * (0.046875 + 0.1875 * xoff + 0.0625 * yoff + 0.1875 * zoff) + + press_SEB * (0.140625 - 0.1875 * xoff + 0.1875 * yoff + 0.5625 * zoff); +} +////////////////////////////////////////////////////////////////////////// +//Position SEB 0.25, -0.25, -0.25 +LBMReal ThixotropyInterpolationProcessor::calcPressBSE() +{ + return press_SET * (0.140625 - 0.1875 * xoff + 0.1875 * yoff - 0.5625 * zoff) + + press_NET * (0.046875 - 0.0625 * xoff - 0.1875 * yoff - 0.1875 * zoff) + + press_SWT * (0.046875 + 0.1875 * xoff + 0.0625 * yoff - 0.1875 * zoff) + + press_NWT * (0.015625 + 0.0625 * xoff - 0.0625 * yoff - 0.0625 * zoff) + + press_NWB * (0.046875 + 0.1875 * xoff - 0.1875 * yoff + 0.0625 * zoff) + + press_NEB * (0.140625 - 0.1875 * xoff - 0.5625 * yoff + 0.1875 * zoff) + + press_SWB * (0.140625 + 0.5625 * xoff + 0.1875 * yoff + 0.1875 * zoff) + + press_SEB * (0.421875 - 0.5625 * xoff + 0.5625 * yoff + 0.5625 * zoff); +} +////////////////////////////////////////////////////////////////////////// +//Position NWB -0.25, 0.25, -0.25 +LBMReal ThixotropyInterpolationProcessor::calcPressBNW() +{ + return press_NWT * (0.140625 + 0.1875 * xoff - 0.1875 * yoff - 0.5625 * zoff) + + press_NET * (0.046875 - 0.1875 * xoff - 0.0625 * yoff - 0.1875 * zoff) + + press_SWT * (0.046875 + 0.0625 * xoff + 0.1875 * yoff - 0.1875 * zoff) + + press_SET * (0.015625 - 0.0625 * xoff + 0.0625 * yoff - 0.0625 * zoff) + + press_SEB * (0.046875 - 0.1875 * xoff + 0.1875 * yoff + 0.0625 * zoff) + + press_NEB * (0.140625 - 0.5625 * xoff - 0.1875 * yoff + 0.1875 * zoff) + + press_SWB * (0.140625 + 0.1875 * xoff + 0.5625 * yoff + 0.1875 * zoff) + + press_NWB * (0.421875 + 0.5625 * xoff - 0.5625 * yoff + 0.5625 * zoff); +} +////////////////////////////////////////////////////////////////////////// +//Position NWT -0.25, 0.25, 0.25 +LBMReal ThixotropyInterpolationProcessor::calcPressTNW() +{ + return press_NWT * (0.421875 + 0.5625 * xoff - 0.5625 * yoff - 0.5625 * zoff) + + press_NET * (0.140625 - 0.5625 * xoff - 0.1875 * yoff - 0.1875 * zoff) + + press_SWT * (0.140625 + 0.1875 * xoff + 0.5625 * yoff - 0.1875 * zoff) + + press_SET * (0.046875 - 0.1875 * xoff + 0.1875 * yoff - 0.0625 * zoff) + + press_SEB * (0.015625 - 0.0625 * xoff + 0.0625 * yoff + 0.0625 * zoff) + + press_NEB * (0.046875 - 0.1875 * xoff - 0.0625 * yoff + 0.1875 * zoff) + + press_SWB * (0.046875 + 0.0625 * xoff + 0.1875 * yoff + 0.1875 * zoff) + + press_NWB * (0.140625 + 0.1875 * xoff - 0.1875 * yoff + 0.5625 * zoff); +} +////////////////////////////////////////////////////////////////////////// +//Position NET 0.25, 0.25, 0.25 +LBMReal ThixotropyInterpolationProcessor::calcPressTNE() +{ + return press_NET * (0.421875 - 0.5625 * xoff - 0.5625 * yoff - 0.5625 * zoff) + + press_NWT * (0.140625 + 0.5625 * xoff - 0.1875 * yoff - 0.1875 * zoff) + + press_SET * (0.140625 - 0.1875 * xoff + 0.5625 * yoff - 0.1875 * zoff) + + press_SWT * (0.046875 + 0.1875 * xoff + 0.1875 * yoff - 0.0625 * zoff) + + press_SWB * (0.015625 + 0.0625 * xoff + 0.0625 * yoff + 0.0625 * zoff) + + press_NWB * (0.046875 + 0.1875 * xoff - 0.0625 * yoff + 0.1875 * zoff) + + press_SEB * (0.046875 - 0.0625 * xoff + 0.1875 * yoff + 0.1875 * zoff) + + press_NEB * (0.140625 - 0.1875 * xoff - 0.1875 * yoff + 0.5625 * zoff); +} +////////////////////////////////////////////////////////////////////////// +//Position NEB 0.25, 0.25, -0.25 +LBMReal ThixotropyInterpolationProcessor::calcPressBNE() +{ + return press_NET * (0.140625 - 0.1875 * xoff - 0.1875 * yoff - 0.5625 * zoff) + + press_NWT * (0.046875 + 0.1875 * xoff - 0.0625 * yoff - 0.1875 * zoff) + + press_SET * (0.046875 - 0.0625 * xoff + 0.1875 * yoff - 0.1875 * zoff) + + press_SWT * (0.015625 + 0.0625 * xoff + 0.0625 * yoff - 0.0625 * zoff) + + press_SWB * (0.046875 + 0.1875 * xoff + 0.1875 * yoff + 0.0625 * zoff) + + press_NWB * (0.140625 + 0.5625 * xoff - 0.1875 * yoff + 0.1875 * zoff) + + press_SEB * (0.140625 - 0.1875 * xoff + 0.5625 * yoff + 0.1875 * zoff) + + press_NEB * (0.421875 - 0.5625 * xoff - 0.5625 * yoff + 0.5625 * zoff); +} +////////////////////////////////////////////////////////////////////////// +//Position C 0.0, 0.0, 0.0 +void ThixotropyInterpolationProcessor::calcInterpolatedNodeFC(LBMReal* f, LBMReal omega) +{ + using namespace D3Q27System; + + LBMReal press = press_NET * (0.125 - 0.25 * xoff - 0.25 * yoff - 0.25 * zoff) + + press_NWT * (0.125 + 0.25 * xoff - 0.25 * yoff - 0.25 * zoff) + + press_SET * (0.125 - 0.25 * xoff + 0.25 * yoff - 0.25 * zoff) + + press_SWT * (0.125 + 0.25 * xoff + 0.25 * yoff - 0.25 * zoff) + + press_NEB * (0.125 - 0.25 * xoff - 0.25 * yoff + 0.25 * zoff) + + press_NWB * (0.125 + 0.25 * xoff - 0.25 * yoff + 0.25 * zoff) + + press_SEB * (0.125 - 0.25 * xoff + 0.25 * yoff + 0.25 * zoff) + + press_SWB * (0.125 + 0.25 * xoff + 0.25 * yoff + 0.25 * zoff); + LBMReal vx1 = a0; + LBMReal vx2 = b0; + LBMReal vx3 = c0; + + LBMReal rho = press ; + + LBMReal feq[ENDF+1]; + D3Q27System::calcIncompFeq(feq,rho,vx1,vx2,vx3); + + LBMReal eps_new = 2.; + + + LBMReal dxux = ax; + LBMReal dyuy = by; + LBMReal dzuz = cz; + + LBMReal Dxy = bx + ay; + LBMReal Dxz = cx + az; + LBMReal Dyz = cy + bz; + + shearRate = sqrt(dxux * dxux + dyuy * dyuy + dzuz * dzuz + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz); + + + LBMReal o = Thixotropy::getHerschelBulkleyCollFactorBackward(shearRate, rho); //omega; + + if (o < omegaMin) + o = omegaMin; + + f_E = eps_new*((2*(-2*ax + by + cz-kxxMzzAverage-kxxMyyAverage))/(27.*o)); + f_N = eps_new*((2*(ax - 2*by + cz+2*kxxMyyAverage-kxxMzzAverage))/(27.*o)); + f_T = eps_new*((2*(ax + by - 2*cz-kxxMyyAverage+2*kxxMzzAverage))/(27.*o)); + f_NE = eps_new*(-(ax + 3*ay + 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage+3*kxyAverage)/(54.*o)); + f_SE = eps_new*(-(ax - 3*ay - 3*bx + by - 2*cz+2*kxxMyyAverage-kxxMyyAverage-3*kxyAverage)/(54.*o)); + f_TE = eps_new*(-(ax + 3*az - 2*by + 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage+3*kxzAverage)/(54.*o)); + f_BE = eps_new*(-(ax - 3*az - 2*by - 3*cx + cz+2*kxxMyyAverage-kxxMzzAverage-3*kxzAverage)/(54.*o)); + f_TN = eps_new*(-(-2*ax + by + 3*bz + 3*cy + cz-kxxMyyAverage-kxxMzzAverage+3*kyzAverage)/(54.*o)); + f_BN = eps_new*(-(-2*ax + by - 3*bz - 3*cy + cz-kxxMyyAverage-kxxMzzAverage-3*kyzAverage)/(54.*o)); + f_ZERO = 0.; + f_TNE = eps_new*(-(ay + az + bx + bz + cx + cy+kxyAverage+kxzAverage+kyzAverage)/(72.*o)); + f_TSW = eps_new*((-ay + az - bx + bz + cx + cy-kxyAverage+kxzAverage+kyzAverage)/(72.*o)); + f_TSE = eps_new*((ay - az + bx + bz - cx + cy+kxyAverage-kxzAverage+kyzAverage)/(72.*o)); + f_TNW = eps_new*((ay + az + bx - bz + cx - cy+kxyAverage+kxzAverage-kyzAverage)/(72.*o)); + + 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]; +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyInterpolationProcessor::calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3) +{ + vx1 = a0 + ax*x + ay*y + az*z + axx*x*x + ayy*y*y + azz*z*z + axy*x*y + axz*x*z + ayz*y*z+axyz*x*y*z; + vx2 = b0 + bx*x + by*y + bz*z + bxx*x*x + byy*y*y + bzz*z*z + bxy*x*y + bxz*x*z + byz*y*z+bxyz*x*y*z; + vx3 = c0 + cx*x + cy*y + cz*z + cxx*x*x + cyy*y*y + czz*z*z + cxy*x*y + cxz*x*z + cyz*y*z+cxyz*x*y*z; +} +////////////////////////////////////////////////////////////////////////// +void ThixotropyInterpolationProcessor::calcInterpolatedShearStress(LBMReal x, LBMReal y, LBMReal z,LBMReal& tauxx, LBMReal& tauyy, LBMReal& tauzz,LBMReal& tauxy, LBMReal& tauxz, LBMReal& tauyz) +{ + tauxx=ax+2*axx*x+axy*y+axz*z+axyz*y*z; + tauyy=by+2*byy*y+bxy*x+byz*z+bxyz*x*z; + tauzz=cz+2*czz*z+cxz*x+cyz*y+cxyz*x*y; + tauxy=0.5*((ay+2.0*ayy*y+axy*x+ayz*z+axyz*x*z)+(bx+2.0*bxx*x+bxy*y+bxz*z+bxyz*y*z)); + tauxz=0.5*((az+2.0*azz*z+axz*x+ayz*y+axyz*x*y)+(cx+2.0*cxx*x+cxy*y+cxz*z+cxyz*y*z)); + tauyz=0.5*((bz+2.0*bzz*z+bxz*x+byz*y+bxyz*x*y)+(cy+2.0*cyy*y+cxy*x+cyz*z+cxyz*x*z)); +} diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyInterpolationProcessor.h b/src/cpu/VirtualFluidsCore/LBM/ThixotropyInterpolationProcessor.h new file mode 100644 index 0000000000000000000000000000000000000000..9f55b8f5fec27ffa116f32f8b96df3c44e1dd77e --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyInterpolationProcessor.h @@ -0,0 +1,109 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 ThixotropyInterpolationProcessor.h +//! \ingroup BoundarConditions +//! \author Konstantin Kutscher +//======================================================================================= +#ifndef ThixotropyInterpolationProcessor_H_ +#define ThixotropyInterpolationProcessor_H_ + +#include "InterpolationProcessor.h" +#include "D3Q27System.h" + +//! \brief A class implements an interpolation function of grid refinement for thixotropic fluid. + +class ThixotropyInterpolationProcessor : public InterpolationProcessor +{ +public: + ThixotropyInterpolationProcessor(); + ThixotropyInterpolationProcessor(LBMReal omegaC, LBMReal omegaF, LBMReal omegaMin); + virtual ~ThixotropyInterpolationProcessor(); + InterpolationProcessorPtr clone(); + void setOmegas(LBMReal omegaC, LBMReal omegaF); + void setOmegaMin(LBMReal omegaMin); + void interpolateCoarseToFine(D3Q27ICell& icellC, D3Q27ICell& icellF); + void interpolateCoarseToFine(D3Q27ICell& icellC, D3Q27ICell& icellF, LBMReal xoff, LBMReal yoff, LBMReal zoff); + void interpolateFineToCoarse(D3Q27ICell& icellF, LBMReal* icellC); + void interpolateFineToCoarse(D3Q27ICell& icellF, LBMReal* icellC, LBMReal xoff, LBMReal yoff, LBMReal zoff); + //LBMReal forcingC, forcingF; +protected: +private: + LBMReal omegaC, omegaF; + LBMReal a0, ax, ay, az, axx, ayy, azz, axy, axz, ayz, b0, bx, by, bz, bxx, byy, bzz, bxy, bxz, byz, c0, cx, cy, cz, cxx, cyy, czz, cxy, cxz, cyz, axyz, bxyz, cxyz; + LBMReal xoff, yoff, zoff; + LBMReal xoff_sq, yoff_sq, zoff_sq; + LBMReal press_SWT, press_NWT, press_NET, press_SET, press_SWB, press_NWB, press_NEB, press_SEB; + + LBMReal f_E, f_N, f_T, f_NE, f_SE, f_BE, f_TE, f_TN, f_BN, f_TNE, f_TNW, f_TSE, f_TSW, f_ZERO; + LBMReal x_E, x_N, x_T, x_NE, x_SE, x_BE, x_TE, x_TN, x_BN, x_TNE, x_TNW, x_TSE, x_TSW, x_ZERO; + LBMReal y_E, y_N, y_T, y_NE, y_SE, y_BE, y_TE, y_TN, y_BN, y_TNE, y_TNW, y_TSE, y_TSW, y_ZERO; + LBMReal z_E, z_N, z_T, z_NE, z_SE, z_BE, z_TE, z_TN, z_BN, z_TNE, z_TNW, z_TSE, z_TSW, z_ZERO; + LBMReal xy_E, xy_N, xy_T, xy_NE, xy_SE, xy_BE, xy_TE, xy_TN, xy_BN, xy_TNE, xy_TNW, xy_TSE, xy_TSW/*, xy_ZERO*/; + LBMReal xz_E, xz_N, xz_T, xz_NE, xz_SE, xz_BE, xz_TE, xz_TN, xz_BN, xz_TNE, xz_TNW, xz_TSE, xz_TSW/*, xz_ZERO*/; + LBMReal yz_E, yz_N, yz_T, yz_NE, yz_SE, yz_BE, yz_TE, yz_TN, yz_BN, yz_TNE, yz_TNW, yz_TSE, yz_TSW/*, yz_ZERO*/; + + LBMReal kxyAverage, kyzAverage, kxzAverage, kxxMyyAverage, kxxMzzAverage; + + LBMReal a,b,c; + + LBMReal rho; + LBMReal shearRate; + + LBMReal omegaMin; + + void setOffsets(LBMReal xoff, LBMReal yoff, LBMReal zoff); + void calcMoments(const LBMReal* const f, LBMReal omegaInf, LBMReal& rho, LBMReal& vx1, LBMReal& vx2, LBMReal& vx3, + LBMReal& kxy, LBMReal& kyz, LBMReal& kxz, LBMReal& kxxMyy, LBMReal& kxxMzz); + void calcInterpolatedCoefficiets(const D3Q27ICell& icell, LBMReal omega, LBMReal eps_new, LBMReal x, LBMReal y, LBMReal z, LBMReal xs, LBMReal ys, LBMReal zs); + void calcInterpolatedNode(LBMReal* f, /*LBMReal omega,*/ LBMReal x, LBMReal y, LBMReal z, LBMReal press, LBMReal xs, LBMReal ys, LBMReal zs); + LBMReal calcPressBSW(); + LBMReal calcPressTSW(); + LBMReal calcPressTSE(); + LBMReal calcPressBSE(); + LBMReal calcPressBNW(); + LBMReal calcPressTNW(); + LBMReal calcPressTNE(); + LBMReal calcPressBNE(); + void calcInterpolatedNodeFC(LBMReal* f, LBMReal omega); + void calcInterpolatedVelocity(LBMReal x, LBMReal y, LBMReal z,LBMReal& vx1, LBMReal& vx2, LBMReal& vx3); + void calcInterpolatedShearStress(LBMReal x, LBMReal y, LBMReal z,LBMReal& tauxx, LBMReal& tauyy, LBMReal& tauzz,LBMReal& tauxy, LBMReal& tauxz, LBMReal& tauyz); +}; + +////////////////////////////////////////////////////////////////////////// +inline void ThixotropyInterpolationProcessor::interpolateCoarseToFine(D3Q27ICell& icellC, D3Q27ICell& icellF) +{ + this->interpolateCoarseToFine(icellC, icellF, 0.0, 0.0, 0.0); +} +////////////////////////////////////////////////////////////////////////// +inline void ThixotropyInterpolationProcessor::interpolateFineToCoarse(D3Q27ICell& icellF, LBMReal* icellC) +{ + this->interpolateFineToCoarse(icellF, icellC, 0.0, 0.0, 0.0); +} + +#endif diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/ThixotropyLBMKernel.cpp new file mode 100644 index 0000000000000000000000000000000000000000..949e7777d644c5b9051611fbcc4b8277b37d630d --- /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 0000000000000000000000000000000000000000..c74af1b1eead237c03c12ba612434a286ebfc656 --- /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 0000000000000000000000000000000000000000..d0d0542b63ba68136c0c23ec9cbc86bb37354ea5 --- /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(c2 * (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 0000000000000000000000000000000000000000..b0f492a170a886d23ab1f56d897ac9adf698d8d9 --- /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 Base class for model of thixotropy based on K16. Use Template Method design pattern for Implementation of different models. +//! \author K. Kutscher, M. Geier +class 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/LBM/ThixotropyModelLBMKernel2.cpp b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8839818a70892d30b57de2938360b0199af3e234 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.cpp @@ -0,0 +1,925 @@ +#include "ThixotropyModelLBMKernel2.h" +#include "D3Q27System.h" +#include "BCArray3D.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include <math.h> +#include "DataSet3D.h" +#include "LBMKernel.h" +#include "Thixotropy.h" + +#define PROOF_CORRECTNESS + +ThixotropyModelLBMKernel2::ThixotropyModelLBMKernel2() : forcingX1(0), forcingX2(0), forcingX3(0) +{ + compressible = false; + OxyyMxzz = 1.0; +} + +ThixotropyModelLBMKernel2::~ThixotropyModelLBMKernel2() +{ +} + +void ThixotropyModelLBMKernel2::calculate(int step) +{ + using namespace D3Q27System; + + //initializing of forcing stuff + if (withForcing) + { + muForcingX1.DefineVar("x1", &muX1); muForcingX1.DefineVar("x2", &muX2); muForcingX1.DefineVar("x3", &muX3); + muForcingX2.DefineVar("x1", &muX1); muForcingX2.DefineVar("x2", &muX2); muForcingX2.DefineVar("x3", &muX3); + muForcingX3.DefineVar("x1", &muX1); muForcingX3.DefineVar("x2", &muX2); muForcingX3.DefineVar("x3", &muX3); + + muDeltaT = deltaT; + + muForcingX1.DefineVar("dt", &muDeltaT); + muForcingX2.DefineVar("dt", &muDeltaT); + muForcingX3.DefineVar("dt", &muDeltaT); + + muNu = (1.0 / 3.0) * (1.0 / collFactor - 1.0 / 2.0); + + muForcingX1.DefineVar("nu", &muNu); + muForcingX2.DefineVar("nu", &muNu); + muForcingX3.DefineVar("nu", &muNu); + } + ///////////////////////////////////// + + localDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + zeroDistributionsF = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getZeroDistributions(); + + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); + + const int bcArrayMaxX1 = (int)bcArray->getNX1(); + const int bcArrayMaxX2 = (int)bcArray->getNX2(); + const int bcArrayMaxX3 = (int)bcArray->getNX3(); + + int minX1 = ghostLayerWidth; + int minX2 = ghostLayerWidth; + int minX3 = ghostLayerWidth; + int maxX1 = bcArrayMaxX1 - ghostLayerWidth; + int maxX2 = bcArrayMaxX2 - ghostLayerWidth; + int maxX3 = bcArrayMaxX3 - ghostLayerWidth; + + + { + for (int x3 = minX3; x3 < maxX3; x3++) + { + for (int x2 = minX2; x2 < maxX2; x2++) + { + for (int x1 = minX1; x1 < maxX1; x1++) + { + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) + { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + ////////////////////////////////////////////////////////////////////////// + //read distribution + // Cumulant (NSE part) + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + //E N T + //c c c + ////////// + //W S B + //a a a + + //Rest ist b + + //mfxyz + //a - negative + //b - null + //c - positive + + // a b c + //-1 0 1 + + LBMReal mfcbb = (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3); + LBMReal mfbcb = (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3); + LBMReal mfbbc = (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3); + LBMReal mfccb = (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3); + LBMReal mfacb = (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3); + LBMReal mfcbc = (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3); + LBMReal mfabc = (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3); + LBMReal mfbcc = (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3); + LBMReal mfbac = (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3); + LBMReal mfccc = (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3); + LBMReal mfacc = (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3); + LBMReal mfcac = (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3); + LBMReal mfaac = (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3); + + LBMReal mfabb = (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3); + LBMReal mfbab = (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3); + LBMReal mfbba = (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p); + LBMReal mfaab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3); + LBMReal mfcab = (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3); + LBMReal mfaba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p); + LBMReal mfcba = (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p); + LBMReal mfbaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p); + LBMReal mfbca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p); + LBMReal mfaaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p); + LBMReal mfcaa = (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p); + LBMReal mfaca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p); + LBMReal mfcca = (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p); + + LBMReal mfbbb = (*this->zeroDistributionsF)(x1, x2, x3); + + LBMReal m0, m1, m2; + + LBMReal rho = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + + LBMReal vvx = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfcaa - mfacc) + (mfcca - mfaac))) + + (((mfcba - mfabc) + (mfcbc - mfaba)) + ((mfcab - mfacb) + (mfccb - mfaab))) + + (mfcbb - mfabb)); + LBMReal vvy = ((((mfccc - mfaaa) + (mfaca - mfcac)) + ((mfacc - mfcaa) + (mfcca - mfaac))) + + (((mfbca - mfbac) + (mfbcc - mfbaa)) + ((mfacb - mfcab) + (mfccb - mfaab))) + + (mfbcb - mfbab)); + LBMReal vvz = ((((mfccc - mfaaa) + (mfcac - mfaca)) + ((mfacc - mfcaa) + (mfaac - mfcca))) + + (((mfbac - mfbca) + (mfbcc - mfbaa)) + ((mfabc - mfcba) + (mfcbc - mfaba))) + + (mfbbc - mfbba)); + + LBMReal collFactorF = collFactor; + + //forcing + /////////////////////////////////////////////////////////////////////////////////////////// + if (withForcing) + { + muX1 = static_cast<double>(x1 - 1 + ix1 * maxX1); + muX2 = static_cast<double>(x2 - 1 + ix2 * maxX2); + muX3 = static_cast<double>(x3 - 1 + ix3 * maxX3); + + forcingX1 = muForcingX1.Eval(); + forcingX2 = muForcingX2.Eval(); + forcingX3 = muForcingX3.Eval(); + + vvx += forcingX1 * deltaT * 0.5; // X + vvy += forcingX2 * deltaT * 0.5; // Y + vvz += forcingX3 * deltaT * 0.5; // Z + } + /////////////////////////////////////////////////////////////////////////////////////////// + LBMReal oMdrho; + + oMdrho = mfccc + mfaaa; + m0 = mfaca + mfcac; + m1 = mfacc + mfcaa; + m2 = mfaac + mfcca; + oMdrho += m0; + m1 += m2; + oMdrho += m1; + m0 = mfbac + mfbca; + m1 = mfbaa + mfbcc; + m0 += m1; + m1 = mfabc + mfcba; + m2 = mfaba + mfcbc; + m1 += m2; + m0 += m1; + m1 = mfacb + mfcab; + m2 = mfaab + mfccb; + m1 += m2; + m0 += m1; + oMdrho += m0; + m0 = mfabb + mfcbb; + m1 = mfbab + mfbcb; + m2 = mfbba + mfbbc; + m0 += m1 + m2; + m0 += mfbbb; //hat gefehlt + oMdrho = 1. - (oMdrho + m0); + + LBMReal vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx * vvx; + vy2 = vvy * vvy; + vz2 = vvz * vvz; + //////////////////////////////////////////////////////////////////////////////////// + LBMReal wadjust; + LBMReal qudricLimit = 0.01; + //////////////////////////////////////////////////////////////////////////////////// + //Hin + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m2 = mfaaa + mfaac; + m1 = mfaac - mfaaa; + m0 = m2 + mfaab; + mfaaa = m0; + m0 += c1o36 * oMdrho; + mfaab = m1 - m0 * vvz; + mfaac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfabc; + m1 = mfabc - mfaba; + m0 = m2 + mfabb; + mfaba = m0; + m0 += c1o9 * oMdrho; + mfabb = m1 - m0 * vvz; + mfabc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfacc; + m1 = mfacc - mfaca; + m0 = m2 + mfacb; + mfaca = m0; + m0 += c1o36 * oMdrho; + mfacb = m1 - m0 * vvz; + mfacc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbac; + m1 = mfbac - mfbaa; + m0 = m2 + mfbab; + mfbaa = m0; + m0 += c1o9 * oMdrho; + mfbab = m1 - m0 * vvz; + mfbac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbba + mfbbc; + m1 = mfbbc - mfbba; + m0 = m2 + mfbbb; + mfbba = m0; + m0 += c4o9 * oMdrho; + mfbbb = m1 - m0 * vvz; + mfbbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbca + mfbcc; + m1 = mfbcc - mfbca; + m0 = m2 + mfbcb; + mfbca = m0; + m0 += c1o9 * oMdrho; + mfbcb = m1 - m0 * vvz; + mfbcc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcac; + m1 = mfcac - mfcaa; + m0 = m2 + mfcab; + mfcaa = m0; + m0 += c1o36 * oMdrho; + mfcab = m1 - m0 * vvz; + mfcac = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcba + mfcbc; + m1 = mfcbc - mfcba; + m0 = m2 + mfcbb; + mfcba = m0; + m0 += c1o9 * oMdrho; + mfcbb = m1 - m0 * vvz; + mfcbc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcca + mfccc; + m1 = mfccc - mfcca; + m0 = m2 + mfccb; + mfcca = m0; + m0 += c1o36 * oMdrho; + mfccb = m1 - m0 * vvz; + mfccc = m2 - 2. * m1 * vvz + vz2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1/6, 0, 1/18, 2/3, 0, 2/9, 1/6, 0, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m2 = mfaaa + mfaca; + m1 = mfaca - mfaaa; + m0 = m2 + mfaba; + mfaaa = m0; + m0 += c1o6 * oMdrho; + mfaba = m1 - m0 * vvy; + mfaca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfacb; + m1 = mfacb - mfaab; + m0 = m2 + mfabb; + mfaab = m0; + mfabb = m1 - m0 * vvy; + mfacb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfacc; + m1 = mfacc - mfaac; + m0 = m2 + mfabc; + mfaac = m0; + m0 += c1o18 * oMdrho; + mfabc = m1 - m0 * vvy; + mfacc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbaa + mfbca; + m1 = mfbca - mfbaa; + m0 = m2 + mfbba; + mfbaa = m0; + m0 += c2o3 * oMdrho; + mfbba = m1 - m0 * vvy; + mfbca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbab + mfbcb; + m1 = mfbcb - mfbab; + m0 = m2 + mfbbb; + mfbab = m0; + mfbbb = m1 - m0 * vvy; + mfbcb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfbac + mfbcc; + m1 = mfbcc - mfbac; + m0 = m2 + mfbbc; + mfbac = m0; + m0 += c2o9 * oMdrho; + mfbbc = m1 - m0 * vvy; + mfbcc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcaa + mfcca; + m1 = mfcca - mfcaa; + m0 = m2 + mfcba; + mfcaa = m0; + m0 += c1o6 * oMdrho; + mfcba = m1 - m0 * vvy; + mfcca = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcab + mfccb; + m1 = mfccb - mfcab; + m0 = m2 + mfcbb; + mfcab = m0; + mfcbb = m1 - m0 * vvy; + mfccb = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfcac + mfccc; + m1 = mfccc - mfcac; + m0 = m2 + mfcbc; + mfcac = m0; + m0 += c1o18 * oMdrho; + mfcbc = m1 - m0 * vvy; + mfccc = m2 - 2. * m1 * vvy + vy2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + // mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m2 = mfaaa + mfcaa; + m1 = mfcaa - mfaaa; + m0 = m2 + mfbaa; + mfaaa = m0; + m0 += 1. * oMdrho; + mfbaa = m1 - m0 * vvx; + mfcaa = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaba + mfcba; + m1 = mfcba - mfaba; + m0 = m2 + mfbba; + mfaba = m0; + mfbba = m1 - m0 * vvx; + mfcba = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaca + mfcca; + m1 = mfcca - mfaca; + m0 = m2 + mfbca; + mfaca = m0; + m0 += c1o3 * oMdrho; + mfbca = m1 - m0 * vvx; + mfcca = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaab + mfcab; + m1 = mfcab - mfaab; + m0 = m2 + mfbab; + mfaab = m0; + mfbab = m1 - m0 * vvx; + mfcab = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabb + mfcbb; + m1 = mfcbb - mfabb; + m0 = m2 + mfbbb; + mfabb = m0; + mfbbb = m1 - m0 * vvx; + mfcbb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacb + mfccb; + m1 = mfccb - mfacb; + m0 = m2 + mfbcb; + mfacb = m0; + mfbcb = m1 - m0 * vvx; + mfccb = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfaac + mfcac; + m1 = mfcac - mfaac; + m0 = m2 + mfbac; + mfaac = m0; + m0 += c1o3 * oMdrho; + mfbac = m1 - m0 * vvx; + mfcac = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfabc + mfcbc; + m1 = mfcbc - mfabc; + m0 = m2 + mfbbc; + mfabc = m0; + mfbbc = m1 - m0 * vvx; + mfcbc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + m2 = mfacc + mfccc; + m1 = mfccc - mfacc; + m0 = m2 + mfbcc; + mfacc = m0; + m0 += c1o9 * oMdrho; + mfbcc = m1 - m0 * vvx; + mfccc = m2 - 2. * m1 * vvx + vx2 * m0; + //////////////////////////////////////////////////////////////////////////////////// + // Cumulants + //////////////////////////////////////////////////////////////////////////////////// + LBMReal OxxPyyPzz = 1.; //omega2 or bulk viscosity + LBMReal OxyyPxzz = 1.;//-s9;//2+s9;// + //LBMReal OxyyMxzz = 1.;//2+s9;// + LBMReal O4 = 1.; + LBMReal O5 = 1.; + LBMReal O6 = 1.; + + //Cum 4. + //LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //LBMReal CUMbcb = mfbcb - ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //LBMReal CUMbbc = mfbbc - ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); + LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); + LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho); + + //Cum 5. + LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - c1o3 * (mfbca + mfbac) * oMdrho; + LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - c1o3 * (mfcba + mfabc) * oMdrho; + LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - c1o3 * (mfacb + mfcab) * oMdrho; + + //Cum 6. + LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho; + + //2. + // linear combinations + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + LBMReal dxux = -c1o2 * collFactorF * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + LBMReal dyuy = dxux + collFactorF * c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorF * c3o2 * mxxMzz; + + LBMReal Dxy = -three * collFactorF * mfbba; + LBMReal Dxz = -three * collFactorF * mfbab; + LBMReal Dyz = -three * collFactorF * mfabb; + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + //non Newtonian fluid collision factor + LBMReal shearRate = sqrt(c2 * (dxux * dxux + dyuy * dyuy + dzuz * dzuz) + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + one); + + LBMReal shearFactor = sqrt(c1o2 * ((mfcaa - mfaaa * c1o3) * (mfcaa - mfaaa * c1o3) + (mfaca - mfaaa * c1o3) * (mfaca - mfaaa * c1o3) + (mfaac - mfaaa * c1o3) * (mfaac - mfaaa * c1o3)) + mfbba * mfbba + mfbab * mfbab + mfabb * mfabb) + UbMath::Epsilon<LBMReal>::val(); + + //collFactorF = getThyxotropyCollFactor(collFactorF, shearRate, rho); + //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + //relax + //mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + // + //LBMReal collFactorFyy = getThyxotropyCollFactor(collFactorF, std::sqrt(dxux*dxux + dyuy*dyuy) / (rho + one), rho); + //mxxMyy += collFactorFyy * (-mxxMyy) - 3. * (1. - c1o2 * collFactorFyy) * (vx2 * dxux - vy2 * dyuy); + // + //LBMReal collFactorFzz = getThyxotropyCollFactor(collFactorF, std::sqrt(dxux*dxux + dzuz*dzuz) / (rho + one), rho); + //mxxMzz += collFactorFzz * (-mxxMzz) - 3. * (1. - c1o2 * collFactorFzz) * (vx2 * dxux - vz2 * dzuz); + + //mfabb += getThyxotropyCollFactor(collFactorF, std::abs(Dyz) / (rho + one), rho) * (-mfabb); + //mfbab += getThyxotropyCollFactor(collFactorF, std::abs(Dxz) / (rho + one), rho) * (-mfbab); + //mfbba += getThyxotropyCollFactor(collFactorF, std::abs(Dxy) / (rho + one), rho) * (-mfbba); + + SPtr<Thixotropy> thix = Thixotropy::getInstance(); + LBMReal tau0 = thix->getYieldStress(); + + mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz /*+ ((mxxPyyPzz-mfaaa)/shearFactor*tau0)*/) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + //mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - 3. * (1. - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + //mxxMyy += collFactorF * (-mxxMyy + mxxMyy/shearFactor*tau0) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vy2 * dyuy); + //mxxMzz += collFactorF * (-mxxMzz + mxxMzz/shearFactor*tau0) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vz2 * dzuz); + + //mfabb += collFactorF * (-mfabb + mfabb/shearFactor*tau0); + //mfbab += collFactorF * (-mfbab + mfbab/shearFactor*tau0); + //mfbba += collFactorF * (-mfbba + mfbba/shearFactor*tau0); + + collFactorF = collFactor * (c1 - tau0 / shearFactor); + + mxxMyy += collFactorF * (-mxxMyy/* + mxxMyy / shearFactor * tau0*/) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += collFactorF * (-mxxMzz/* + mxxMzz / shearFactor * tau0*/) - 3. * (1. - c1o2 * collFactorF) * (vx2 * dxux - vz2 * dzuz); + + mfabb += collFactorF * (-mfabb/* + mfabb / shearFactor * tau0*/); + mfbab += collFactorF * (-mfbab/* + mfbab / shearFactor * tau0*/); + mfbba += collFactorF * (-mfbba/* + mfbba / shearFactor * tau0*/); + + + // linear combinations back + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-2. * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - 2. * mxxMzz + mxxPyyPzz); + + //3. + // linear combinations + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + //relax + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mfbbb) / (fabs(mfbbb) + qudricLimit); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxyPyzz) / (fabs(mxxyPyzz) + qudricLimit); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxyMyzz) / (fabs(mxxyMyzz) + qudricLimit); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxxzPyyz) / (fabs(mxxzPyyz) + qudricLimit); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxxzMyyz) / (fabs(mxxzMyyz) + qudricLimit); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (1. - OxyyPxzz) * fabs(mxyyPxzz) / (fabs(mxyyPxzz) + qudricLimit); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (1. - OxyyMxzz) * fabs(mxyyMxzz) / (fabs(mxyyMxzz) + qudricLimit); + mxyyMxzz += wadjust * (-mxyyMxzz); + + // linear combinations back + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + + //4. + CUMacc += O4 * (-CUMacc); + CUMcac += O4 * (-CUMcac); + CUMcca += O4 * (-CUMcca); + + CUMbbc += O4 * (-CUMbbc); + CUMbcb += O4 * (-CUMbcb); + CUMcbb += O4 * (-CUMcbb); + + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + //6. + CUMccc += O6 * (-CUMccc); + + //back cumulants to central moments + //4. + //mfcbb = CUMcbb + ((mfcaa + c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //mfbcb = CUMbcb + ((mfaca + c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //mfbbc = CUMbbc + ((mfaac + c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + + mfcbb = CUMcbb + ((mfcaa + c1o3) * mfabb + 2. * mfbba * mfbab); + mfbcb = CUMbcb + ((mfaca + c1o3) * mfbab + 2. * mfbba * mfabb); + mfbbc = CUMbbc + ((mfaac + c1o3) * mfbba + 2. * mfbab * mfabb); + + mfcca = CUMcca + (mfcaa * mfaca + 2. * mfbba * mfbba) + c1o3 * (mfcaa + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho; + mfcac = CUMcac + (mfcaa * mfaac + 2. * mfbab * mfbab) + c1o3 * (mfcaa + mfaac) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho; + mfacc = CUMacc + (mfaac * mfaca + 2. * mfabb * mfabb) + c1o3 * (mfaac + mfaca) * oMdrho + c1o9 * (oMdrho - 1) * oMdrho; + + //5. + mfbcc = CUMbcc + (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac) * oMdrho; + mfcbc = CUMcbc + (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc) * oMdrho; + mfccb = CUMccb + (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab) * oMdrho; + + //6. + mfccc = CUMccc - ((-4. * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - 4. * (mfabb * mfcbb + mfbac * mfbca + mfbba * mfbbc) + - 2. * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) + + (4. * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + 2. * (mfcaa * mfaca * mfaac) + + 16. * mfbba * mfbab * mfabb) + - c1o3 * (mfacc + mfcac + mfcca) * oMdrho - c1o9 * oMdrho * oMdrho + - c1o9 * (mfcaa + mfaca + mfaac) * oMdrho * (1. - 2. * oMdrho) - c1o27 * oMdrho * oMdrho * (-2. * oMdrho) + + (2. * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) - c1o27 * oMdrho; + + //////////////////////////////////////////////////////////////////////////////////// + //forcing + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + ////////////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////////// + //back + //////////////////////////////////////////////////////////////////////////////////// + //mit 1, 0, 1/3, 0, 0, 0, 1/3, 0, 1/9 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + m0 = mfaac * c1o2 + mfaab * (vvz - c1o2) + (mfaaa + 1. * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfaac - 2. * mfaab * vvz + mfaaa * (1. - vz2) - 1. * oMdrho * vz2; + m2 = mfaac * c1o2 + mfaab * (vvz + c1o2) + (mfaaa + 1. * oMdrho) * (vz2 + vvz) * c1o2; + mfaaa = m0; + mfaab = m1; + mfaac = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfabc * c1o2 + mfabb * (vvz - c1o2) + mfaba * (vz2 - vvz) * c1o2; + m1 = -mfabc - 2. * mfabb * vvz + mfaba * (1. - vz2); + m2 = mfabc * c1o2 + mfabb * (vvz + c1o2) + mfaba * (vz2 + vvz) * c1o2; + mfaba = m0; + mfabb = m1; + mfabc = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfacb * (vvz - c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfacc - 2. * mfacb * vvz + mfaca * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfacc * c1o2 + mfacb * (vvz + c1o2) + (mfaca + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfaca = m0; + mfacb = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbac * c1o2 + mfbab * (vvz - c1o2) + mfbaa * (vz2 - vvz) * c1o2; + m1 = -mfbac - 2. * mfbab * vvz + mfbaa * (1. - vz2); + m2 = mfbac * c1o2 + mfbab * (vvz + c1o2) + mfbaa * (vz2 + vvz) * c1o2; + mfbaa = m0; + mfbab = m1; + mfbac = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbbc * c1o2 + mfbbb * (vvz - c1o2) + mfbba * (vz2 - vvz) * c1o2; + m1 = -mfbbc - 2. * mfbbb * vvz + mfbba * (1. - vz2); + m2 = mfbbc * c1o2 + mfbbb * (vvz + c1o2) + mfbba * (vz2 + vvz) * c1o2; + mfbba = m0; + mfbbb = m1; + mfbbc = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbcb * (vvz - c1o2) + mfbca * (vz2 - vvz) * c1o2; + m1 = -mfbcc - 2. * mfbcb * vvz + mfbca * (1. - vz2); + m2 = mfbcc * c1o2 + mfbcb * (vvz + c1o2) + mfbca * (vz2 + vvz) * c1o2; + mfbca = m0; + mfbcb = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfcab * (vvz - c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfcac - 2. * mfcab * vvz + mfcaa * (1. - vz2) - c1o3 * oMdrho * vz2; + m2 = mfcac * c1o2 + mfcab * (vvz + c1o2) + (mfcaa + c1o3 * oMdrho) * (vz2 + vvz) * c1o2; + mfcaa = m0; + mfcab = m1; + mfcac = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfcbb * (vvz - c1o2) + mfcba * (vz2 - vvz) * c1o2; + m1 = -mfcbc - 2. * mfcbb * vvz + mfcba * (1. - vz2); + m2 = mfcbc * c1o2 + mfcbb * (vvz + c1o2) + mfcba * (vz2 + vvz) * c1o2; + mfcba = m0; + mfcbb = m1; + mfcbc = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfccb * (vvz - c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 - vvz) * c1o2; + m1 = -mfccc - 2. * mfccb * vvz + mfcca * (1. - vz2) - c1o9 * oMdrho * vz2; + m2 = mfccc * c1o2 + mfccb * (vvz + c1o2) + (mfcca + c1o9 * oMdrho) * (vz2 + vvz) * c1o2; + mfcca = m0; + mfccb = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/6, 2/3, 1/6, 0, 0, 0, 1/18, 2/9, 1/18 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + m0 = mfaca * c1o2 + mfaba * (vvy - c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfaca - 2. * mfaba * vvy + mfaaa * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfaca * c1o2 + mfaba * (vvy + c1o2) + (mfaaa + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaaa = m0; + mfaba = m1; + mfaca = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacb * c1o2 + mfabb * (vvy - c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacb - 2. * mfabb * vvy + mfaab * (1. - vy2) - c2o3 * oMdrho * vy2; + m2 = mfacb * c1o2 + mfabb * (vvy + c1o2) + (mfaab + c2o3 * oMdrho) * (vy2 + vvy) * c1o2; + mfaab = m0; + mfabb = m1; + mfacb = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfacc * c1o2 + mfabc * (vvy - c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfacc - 2. * mfabc * vvy + mfaac * (1. - vy2) - c1o6 * oMdrho * vy2; + m2 = mfacc * c1o2 + mfabc * (vvy + c1o2) + (mfaac + c1o6 * oMdrho) * (vy2 + vvy) * c1o2; + mfaac = m0; + mfabc = m1; + mfacc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfbca * c1o2 + mfbba * (vvy - c1o2) + mfbaa * (vy2 - vvy) * c1o2; + m1 = -mfbca - 2. * mfbba * vvy + mfbaa * (1. - vy2); + m2 = mfbca * c1o2 + mfbba * (vvy + c1o2) + mfbaa * (vy2 + vvy) * c1o2; + mfbaa = m0; + mfbba = m1; + mfbca = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcb * c1o2 + mfbbb * (vvy - c1o2) + mfbab * (vy2 - vvy) * c1o2; + m1 = -mfbcb - 2. * mfbbb * vvy + mfbab * (1. - vy2); + m2 = mfbcb * c1o2 + mfbbb * (vvy + c1o2) + mfbab * (vy2 + vvy) * c1o2; + mfbab = m0; + mfbbb = m1; + mfbcb = m2; + /////////b////////////////////////////////////////////////////////////////////////// + m0 = mfbcc * c1o2 + mfbbc * (vvy - c1o2) + mfbac * (vy2 - vvy) * c1o2; + m1 = -mfbcc - 2. * mfbbc * vvy + mfbac * (1. - vy2); + m2 = mfbcc * c1o2 + mfbbc * (vvy + c1o2) + mfbac * (vy2 + vvy) * c1o2; + mfbac = m0; + mfbbc = m1; + mfbcc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfcba * (vvy - c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfcca - 2. * mfcba * vvy + mfcaa * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfcca * c1o2 + mfcba * (vvy + c1o2) + (mfcaa + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcaa = m0; + mfcba = m1; + mfcca = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfcbb * (vvy - c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccb - 2. * mfcbb * vvy + mfcab * (1. - vy2) - c2o9 * oMdrho * vy2; + m2 = mfccb * c1o2 + mfcbb * (vvy + c1o2) + (mfcab + c2o9 * oMdrho) * (vy2 + vvy) * c1o2; + mfcab = m0; + mfcbb = m1; + mfccb = m2; + /////////c////////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfcbc * (vvy - c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 - vvy) * c1o2; + m1 = -mfccc - 2. * mfcbc * vvy + mfcac * (1. - vy2) - c1o18 * oMdrho * vy2; + m2 = mfccc * c1o2 + mfcbc * (vvy + c1o2) + (mfcac + c1o18 * oMdrho) * (vy2 + vvy) * c1o2; + mfcac = m0; + mfcbc = m1; + mfccc = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + //mit 1/36, 1/9, 1/36, 1/9, 4/9, 1/9, 1/36, 1/9, 1/36 Konditionieren + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + m0 = mfcaa * c1o2 + mfbaa * (vvx - c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcaa - 2. * mfbaa * vvx + mfaaa * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcaa * c1o2 + mfbaa * (vvx + c1o2) + (mfaaa + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaaa = m0; + mfbaa = m1; + mfcaa = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcba * c1o2 + mfbba * (vvx - c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcba - 2. * mfbba * vvx + mfaba * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcba * c1o2 + mfbba * (vvx + c1o2) + (mfaba + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaba = m0; + mfbba = m1; + mfcba = m2; + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcca * c1o2 + mfbca * (vvx - c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcca - 2. * mfbca * vvx + mfaca * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcca * c1o2 + mfbca * (vvx + c1o2) + (mfaca + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaca = m0; + mfbca = m1; + mfcca = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcab * c1o2 + mfbab * (vvx - c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcab - 2. * mfbab * vvx + mfaab * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcab * c1o2 + mfbab * (vvx + c1o2) + (mfaab + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfaab = m0; + mfbab = m1; + mfcab = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfcbb * c1o2 + mfbbb * (vvx - c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbb - 2. * mfbbb * vvx + mfabb * (1. - vx2) - c4o9 * oMdrho * vx2; + m2 = mfcbb * c1o2 + mfbbb * (vvx + c1o2) + (mfabb + c4o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabb = m0; + mfbbb = m1; + mfcbb = m2; + ///////////b//////////////////////////////////////////////////////////////////////// + m0 = mfccb * c1o2 + mfbcb * (vvx - c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccb - 2. * mfbcb * vvx + mfacb * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfccb * c1o2 + mfbcb * (vvx + c1o2) + (mfacb + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfacb = m0; + mfbcb = m1; + mfccb = m2; + //////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////// + m0 = mfcac * c1o2 + mfbac * (vvx - c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcac - 2. * mfbac * vvx + mfaac * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfcac * c1o2 + mfbac * (vvx + c1o2) + (mfaac + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfaac = m0; + mfbac = m1; + mfcac = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfcbc * c1o2 + mfbbc * (vvx - c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfcbc - 2. * mfbbc * vvx + mfabc * (1. - vx2) - c1o9 * oMdrho * vx2; + m2 = mfcbc * c1o2 + mfbbc * (vvx + c1o2) + (mfabc + c1o9 * oMdrho) * (vx2 + vvx) * c1o2; + mfabc = m0; + mfbbc = m1; + mfcbc = m2; + ///////////c//////////////////////////////////////////////////////////////////////// + m0 = mfccc * c1o2 + mfbcc * (vvx - c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 - vvx) * c1o2; + m1 = -mfccc - 2. * mfbcc * vvx + mfacc * (1. - vx2) - c1o36 * oMdrho * vx2; + m2 = mfccc * c1o2 + mfbcc * (vvx + c1o2) + (mfacc + c1o36 * oMdrho) * (vx2 + vvx) * c1o2; + mfacc = m0; + mfbcc = m1; + mfccc = m2; + + ////////////////////////////////////////////////////////////////////////// + //proof correctness + ////////////////////////////////////////////////////////////////////////// +#ifdef PROOF_CORRECTNESS + LBMReal rho_post = (mfaaa + mfaac + mfaca + mfcaa + mfacc + mfcac + mfccc + mfcca) + + (mfaab + mfacb + mfcab + mfccb) + (mfaba + mfabc + mfcba + mfcbc) + (mfbaa + mfbac + mfbca + mfbcc) + + (mfabb + mfcbb) + (mfbab + mfbcb) + (mfbba + mfbbc) + mfbbb; + //LBMReal dif = fabs(rho - rho_post); + LBMReal dif = rho - rho_post; +#ifdef SINGLEPRECISION + if (dif > 10.0E-7 || dif < -10.0E-7) +#else + if (dif > 10.0E-15 || dif < -10.0E-15) +#endif + { + UB_THROW(UbException(UB_EXARGS, "rho=" + UbSystem::toString(rho) + ", rho_post=" + UbSystem::toString(rho_post) + + " dif=" + UbSystem::toString(dif) + + " rho is not correct for node " + UbSystem::toString(x1) + "," + UbSystem::toString(x2) + "," + UbSystem::toString(x3))); + //UBLOG(logERROR,"LBMKernelETD3Q27CCLB::collideAll(): rho is not correct for node "+UbSystem::toString(x1)+","+UbSystem::toString(x2)+","+UbSystem::toString(x3)); + //exit(EXIT_FAILURE); + } +#endif + ////////////////////////////////////////////////////////////////////////// + //write distribution + ////////////////////////////////////////////////////////////////////////// + (*this->localDistributionsF)(D3Q27System::ET_E, x1, x2, x3) = mfabb; + (*this->localDistributionsF)(D3Q27System::ET_N, x1, x2, x3) = mfbab; + (*this->localDistributionsF)(D3Q27System::ET_T, x1, x2, x3) = mfbba; + (*this->localDistributionsF)(D3Q27System::ET_NE, x1, x2, x3) = mfaab; + (*this->localDistributionsF)(D3Q27System::ET_NW, x1p, x2, x3) = mfcab; + (*this->localDistributionsF)(D3Q27System::ET_TE, x1, x2, x3) = mfaba; + (*this->localDistributionsF)(D3Q27System::ET_TW, x1p, x2, x3) = mfcba; + (*this->localDistributionsF)(D3Q27System::ET_TN, x1, x2, x3) = mfbaa; + (*this->localDistributionsF)(D3Q27System::ET_TS, x1, x2p, x3) = mfbca; + (*this->localDistributionsF)(D3Q27System::ET_TNE, x1, x2, x3) = mfaaa; + (*this->localDistributionsF)(D3Q27System::ET_TNW, x1p, x2, x3) = mfcaa; + (*this->localDistributionsF)(D3Q27System::ET_TSE, x1, x2p, x3) = mfaca; + (*this->localDistributionsF)(D3Q27System::ET_TSW, x1p, x2p, x3) = mfcca; + + (*this->nonLocalDistributionsF)(D3Q27System::ET_W, x1p, x2, x3) = mfcbb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_S, x1, x2p, x3) = mfbcb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_B, x1, x2, x3p) = mfbbc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SW, x1p, x2p, x3) = mfccb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_SE, x1, x2p, x3) = mfacb; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BW, x1p, x2, x3p) = mfcbc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BE, x1, x2, x3p) = mfabc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BS, x1, x2p, x3p) = mfbcc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BN, x1, x2, x3p) = mfbac; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSW, x1p, x2p, x3p) = mfccc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BSE, x1, x2p, x3p) = mfacc; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNW, x1p, x2, x3p) = mfcac; + (*this->nonLocalDistributionsF)(D3Q27System::ET_BNE, x1, x2, x3p) = mfaac; + + (*this->zeroDistributionsF)(x1, x2, x3) = mfbbb; + } + } + } + } + + } +} + +//SPtr<LBMKernel> ThixotropyModelLBMKernel2::clone() +//{ +// SPtr<LBMKernel> kernel(new ThixotropyModelLBMKernel2()); +// kernel->setNX(nx); +// kernel->setCollisionFactor(collFactor); +// collFactorF = collFactor; +// dynamicPointerCast<ThixotropyModelLBMKernel2>(kernel)->initDataSet(); +// kernel->setBCProcessor(bcProcessor->clone(kernel)); +// kernel->setWithForcing(withForcing); +// kernel->setForcingX1(muForcingX1); +// kernel->setForcingX2(muForcingX2); +// kernel->setForcingX3(muForcingX3); +// kernel->setIndex(ix1, ix2, ix3); +// kernel->setDeltaT(deltaT); +// +// return kernel; +//} + +double ThixotropyModelLBMKernel2::getCalculationTime() +{ + return timer.getTotalTime(); +} + +void ThixotropyModelLBMKernel2::swapDistributions() +{ + LBMKernel::swapDistributions(); +} + +void ThixotropyModelLBMKernel2::initDataSet() +{ + SPtr<DistributionArray3D> df(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.0)); + dataSet->setFdistributions(df); +} diff --git a/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.h b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.h new file mode 100644 index 0000000000000000000000000000000000000000..17fa477977bdfa997c0be0ef2254b139bb1cc1fe --- /dev/null +++ b/src/cpu/VirtualFluidsCore/LBM/ThixotropyModelLBMKernel2.h @@ -0,0 +1,51 @@ +#ifndef ThixotropyModelLBMKernel2_H +#define ThixotropyModelLBMKernel2_H + +#include "LBMKernel.h" +#include "BCProcessor.h" +#include "D3Q27System.h" +#include "basics/utilities/UbTiming.h" +#include "basics/container/CbArray4D.h" +#include "basics/container/CbArray3D.h" + +class ThixotropyModelLBMKernel2; + +//! \brief Base class for model of thixotropy based on K16. Use Template Method design pattern for Implementation of different models. +//! \author K. Kutscher, M. Geier +class ThixotropyModelLBMKernel2 : public LBMKernel +{ +public: + ThixotropyModelLBMKernel2(); + virtual ~ThixotropyModelLBMKernel2(); + void calculate(int step); + virtual SPtr<LBMKernel> clone() { UB_THROW(UbException("SPtr<LBMKernel> clone() - belongs in the derived class")); }; + double getCalculationTime(); + + void swapDistributions(); + +protected: + void initDataSet(); + + virtual LBMReal getThyxotropyCollFactor(LBMReal omegaInf, LBMReal shearRate, LBMReal drho) const { UB_THROW(UbException("LBMReal getThyxotropyCollFactor() - belongs in the derived class")); } + + LBMReal f[D3Q27System::ENDF + 1]; + + UbTimer timer; + + LBMReal OxyyMxzz; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributionsF; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributionsF; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributionsF; + + mu::value_type muX1, muX2, muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; + + bool test; +}; + +#endif diff --git a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp index 49d945ceb9fca2f68960d8d0456347b34a400344..60e0b41cb666583e198bb692a189b734f4f11ab1 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/BoundaryConditionsBlockVisitor.cpp @@ -40,7 +40,17 @@ #include "DataSet3D.h" #include "Grid3D.h" #include "Grid3DSystem.h" -#include "LBMKernel.h" +#include "BCAdapter.h" +#include "Block3D.h" +#include "BCArray3D.h" +#include "ILBMKernel.h" + +#include "DensityAndThixotropyBCAlgorithm.h" +#include "VelocityAndThixotropyBCAlgorithm.h" +#include "NoSlipAndThixotropyBCAlgorithm.h" +#include "NonReflectingOutflowAndThixotropyBCAlgorithm.h" +#include "VelocityWithDensityAndThixotropyBCAlgorithm.h" + BoundaryConditionsBlockVisitor::BoundaryConditionsBlockVisitor() : Block3DVisitor(0, Grid3DSystem::MAXLEVEL) {} ////////////////////////////////////////////////////////////////////////// @@ -91,6 +101,23 @@ void BoundaryConditionsBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> bloc bca->setNodeIndex(x1, x2, x3); bca->setBcPointer(bcPtr); bca->addDistributions(distributions); + + 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); diff --git a/src/cpu/VirtualFluidsCore/Visitors/ConnectorBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/ConnectorBlockVisitor.cpp index df20a2de7eb9327ad732211cfa9023e892d29e8c..af78f95185f3f24bd669bd75aad656fe205fbc5c 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/ConnectorBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/ConnectorBlockVisitor.cpp @@ -1,3 +1,36 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 SetConnectorsBlockVisitor.cpp +//! \ingroup Visitors +//! \author Konstantin Kutscher +//======================================================================================= + #include "ConnectorBlockVisitor.h" #include "Communicator.h" #include "ConnectorFactory.h" @@ -29,18 +62,11 @@ void ConnectorBlockVisitor::visit(SPtr<Grid3D> grid, SPtr<Block3D> block) if (grid->getFinestInitializedLevel() > grid->getCoarsestInitializedLevel()) setInterpolationConnectors(grid, block); - if (block->getGlobalID() == 2234) { - UBLOG(logINFO, block->toString()); - } - UBLOG(logDEBUG5, "ConnectorBlockVisitor::visit() - end"); } ////////////////////////////////////////////////////////////////////////// void ConnectorBlockVisitor::setSameLevelConnectors(SPtr<Grid3D> grid, SPtr<Block3D> block) { - if (block->getGlobalID() == 2234) { - UBLOG(logINFO, block->toString()); - } UBLOG(logDEBUG5, "ConnectorBlockVisitor::setSameLevelConnectors() - start"); int blockRank = block->getRank(); if (gridRank == blockRank && block->isActive()) { @@ -67,9 +93,6 @@ void ConnectorBlockVisitor::setSameLevelConnectors(SPtr<Grid3D> grid, SPtr<Block } } UBLOG(logDEBUG5, "ConnectorBlockVisitor::setSameLevelConnectors() - end"); - if (block->getGlobalID() == 2234) { - UBLOG(logINFO, block->toString()); - } } ////////////////////////////////////////////////////////////////////////// void ConnectorBlockVisitor::setRemoteConnectors(SPtr<Block3D> sblock, SPtr<Block3D> tblock, int dir) @@ -88,9 +111,6 @@ void ConnectorBlockVisitor::setRemoteConnectors(SPtr<Block3D> sblock, SPtr<Block ////////////////////////////////////////////////////////////////////////// void ConnectorBlockVisitor::setInterpolationConnectors(SPtr<Grid3D> grid, SPtr<Block3D> block) { - if (block->getGlobalID() == 2234) { - UBLOG(logINFO, block->toString()); - } UBLOG(logDEBUG5, "ConnectorBlockVisitor::setInterpolationConnectors() - start"); // int blockRank = block->getRank(); diff --git a/src/cpu/VirtualFluidsCore/Visitors/ConnectorBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/ConnectorBlockVisitor.h index 97371655556b96917ee4dae1c80fac626c6aaba5..800b80604d7e7d67ab09441ad61c97ec28ca2ac8 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/ConnectorBlockVisitor.h +++ b/src/cpu/VirtualFluidsCore/Visitors/ConnectorBlockVisitor.h @@ -1,3 +1,36 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 SetConnectorsBlockVisitor.h +//! \ingroup Visitors +//! \author Konstantin Kutscher +//======================================================================================= + #ifndef ConnectorBlockVisitor_H #define ConnectorBlockVisitor_H diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp index c424a6376a62159da2e4b9f73ccf01858fbde521..c17d8f659546e3a9b2ceabbdd9397bdbb10a5075 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 0000000000000000000000000000000000000000..e63ad0e74d3a0c8f1ab2adb55e73c054399131e9 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.cpp @@ -0,0 +1,468 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 InitThixotropyBlockVisitor.h +//! \ingroup Visitors +//! \author Konstantin Kutscher +//======================================================================================= + +#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 0000000000000000000000000000000000000000..a026a227b972f49295b26dbbfb630bbf0c7d702e --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Visitors/InitThixotropyBlockVisitor.h @@ -0,0 +1,126 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 InitThixotropyBlockVisitor.h +//! \ingroup Visitors +//! \author Konstantin Kutscher +//======================================================================================= + +#ifndef InitThixotropyBlockVisitor_H +#define InitThixotropyBlockVisitor_H + +#include <PointerDefinitions.h> + +#include "Block3DVisitor.h" +#include "D3Q27System.h" + +#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 067b93bbaa19731e15587682bb057d6597211d85..9ea340b1618bcc2ad31a21a958424d2b256cf357 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.cpp @@ -32,484 +32,481 @@ //======================================================================================= #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(); + + 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); + } + } + } + } + + 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"); } +