diff --git a/CMake/cmake_config_files/PHOENIX.config.cmake b/CMake/cmake_config_files/PHOENIX.config.cmake index 14fe65bc950f29347c30f413b46ad599f91ebcdb..2f576538c106a6a4d83509a49a1408a8d63efbdb 100644 --- a/CMake/cmake_config_files/PHOENIX.config.cmake +++ b/CMake/cmake_config_files/PHOENIX.config.cmake @@ -44,5 +44,4 @@ SET(BOOST_LIBRARYDIR "/cluster/lib/boost/1.63.0/gcc/lib" CACHE PATH "BOOST_LIB #SET(VTK_DIR "/home/stelenz/software/vtk/VTK-8.1.0/build" CACHE PATH "VTK directory override" FORCE) ## nvidia -set(NVCUDASAMPLES_ROOT "/cluster/cuda/11.0/samples") set(CMAKE_CUDA_ARCHITECTURES 60) # NVIDIA Tesla P100 \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp index 8737b8c04d9c2546c30cc6657e6f17d295bd542f..61b427e323dce214240f439eb0ff45c62029e05f 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.cpp @@ -36,12 +36,7 @@ #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 3adbed44871d82ef896fabd7834b6fb16e35b285..734aa9342df011846ce345ba7c37a181383e8828 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BCAlgorithm.h @@ -47,50 +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 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; + 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(); - 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;}; + 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; + bool getThixotropy(){ return thixotropy; }; protected: - bool compressible; - char type; - bool preCollision; - bool thixotropy; + bool compressible { false }; + char type; + bool preCollision; + bool thixotropy { false }; SPtr<BoundaryConditions> bcPtr; SPtr<DistributionArray3D> distributions; diff --git a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h index 9539139ed77841218695f0ae687e3a13ec7758f9..84ba7a6041d38546da03323f35a23f7084df9809 100644 --- a/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h +++ b/src/cpu/VirtualFluidsCore/BoundaryConditions/BoundaryConditions.h @@ -46,28 +46,16 @@ //! 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() {} + virtual ~BoundaryConditions() = default; virtual bool isEmpty() { @@ -94,9 +82,9 @@ protected: if ((secOpt + 1) > maxOptionVal) throw UbException(UB_EXARGS, "error: option > " + UbSystem::toString(maxOptionVal - 1)); - // alle digits an den betreffenden postionen auf "0" + // all digits at the respective positions to "0" flag &= ~(maxOptionVal << (direction * optionDigits)); - // alle digitsan den betreffenden postionen entsprechend der marke setzen + // set all digits according to the flag at the respective positions flag |= ((long long)(secOpt + 1) << (direction * optionDigits)); } @@ -344,35 +332,33 @@ public: char getBcAlgorithmType() { return algorithmType; } public: - static const int optionDigits = - 2; //--> 3 bits fr secondary Option --> maxOptionVal = 7, da man mit drei Digits max die 7 darstellen kann + static const int optionDigits = 2; //--> 2 bits for secondary Option --> maxOptionVal = 7 static const long long maxOptionVal; // = ( 1<<optionDigits ) - 1; //2^3-1 -> 7 protected: float q[D3Q27System::FENDDIR + 1]; - // float q[D3Q27System::STARTF+1]; - long long noslipBoundaryFlags; - long long slipBoundaryFlags; - long long velocityBoundaryFlags; - long long densityBoundaryFlags; - long long wallModelBoundaryFlags; + long long noslipBoundaryFlags{ 0 }; + long long slipBoundaryFlags{ 0 }; + long long velocityBoundaryFlags{ 0 }; + long long densityBoundaryFlags{ 0 }; + long long wallModelBoundaryFlags{ 0 }; - float bcVelocityX1; - float bcVelocityX2; - float bcVelocityX3; - float bcDensity; - // float bcThixotropy; + float bcVelocityX1{ 0.0f }; + float bcVelocityX2{ 0.0f }; + float bcVelocityX3{ 0.0f }; + float bcDensity{ 0.0f }; + // float bcThixotropy{ 0.0f }; - float bcLodiDensity; - float bcLodiVelocityX1; - float bcLodiVelocityX2; - float bcLodiVelocityX3; - float bcLodiLentgh; + float bcLodiDensity{ 0.0f }; + float bcLodiVelocityX1{ 0.0f }; + float bcLodiVelocityX2{ 0.0f }; + float bcLodiVelocityX3{ 0.0f }; + float bcLodiLentgh{ 0.0f }; - float nx1, nx2, nx3; + float nx1{ 0.0f }, nx2{ 0.0f }, nx3{ 0.0f }; - char algorithmType; + char algorithmType { -1 }; private: friend class MPIIORestartCoProcessor; @@ -380,5 +366,4 @@ private: friend class MPIIOMigrationBECoProcessor; }; - #endif diff --git a/src/cpu/VirtualFluidsCore/CMakeLists.txt b/src/cpu/VirtualFluidsCore/CMakeLists.txt index 3506f0b76399043cbe546ea44ef4b57bd2d794c3..09766e266935ed1c7d89223c0713363f4df5edcf 100644 --- a/src/cpu/VirtualFluidsCore/CMakeLists.txt +++ b/src/cpu/VirtualFluidsCore/CMakeLists.txt @@ -1,21 +1,19 @@ +set(VF_LIBRARIES) + IF(${USE_METIS} AND METIS_RELEASE_LIBRARY AND METIS_DEBUG_LIBRARY) - SET(LINK_LIBRARY optimized ${METIS_RELEASE_LIBRARY} debug ${METIS_DEBUG_LIBRARY}) - SET(CAB_ADDITIONAL_LINK_LIBRARIES ${CAB_ADDITIONAL_LINK_LIBRARIES} ${LINK_LIBRARY}) + list(APPEND VF_LIBRARIES optimized ${METIS_RELEASE_LIBRARY} debug ${METIS_DEBUG_LIBRARY}) ELSE() - SET(CAB_ADDITIONAL_LINK_LIBRARIES ${CAB_ADDITIONAL_LINK_LIBRARIES} metis) + list(APPEND VF_LIBRARIES metis) ENDIF() IF(${USE_VTK}) - SET(LINK_LIBRARY optimized ${VTK_LIBRARIES} debug ${VTK_LIBRARIES}) - SET(CAB_ADDITIONAL_LINK_LIBRARIES ${CAB_ADDITIONAL_LINK_LIBRARIES} ${LINK_LIBRARY}) + list(APPEND VF_LIBRARIES optimized ${VTK_LIBRARIES} debug ${VTK_LIBRARIES}) ENDIF() IF(${USE_CATALYST}) - SET(LINK_LIBRARY optimized vtkPVPythonCatalyst debug vtkPVPythonCatalyst ) - SET(CAB_ADDITIONAL_LINK_LIBRARIES ${CAB_ADDITIONAL_LINK_LIBRARIES} ${LINK_LIBRARY}) - SET(LINK_LIBRARY optimized vtkParallelMPI debug vtkParallelMPI ) - SET(CAB_ADDITIONAL_LINK_LIBRARIES ${CAB_ADDITIONAL_LINK_LIBRARIES} ${LINK_LIBRARY}) + list(APPEND VF_LIBRARIES optimized vtkPVPythonCatalyst debug vtkPVPythonCatalyst) + list(APPEND VF_LIBRARIES optimized vtkParallelMPI debug vtkParallelMPI ) ENDIF() @@ -24,10 +22,10 @@ IF(${USE_DEM_COUPLING}) ENDIF() if(BUILD_USE_OPENMP) - list(APPEND CAB_ADDITIONAL_LINK_LIBRARIES OpenMP::OpenMP_CXX) + list(APPEND VF_LIBRARIES OpenMP::OpenMP_CXX) endif() -vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser MPI::MPI_CXX ${CAB_ADDITIONAL_LINK_LIBRARIES}) +vf_add_library(BUILDTYPE static PUBLIC_LINK basics muparser MPI::MPI_CXX ${VF_LIBRARIES}) vf_get_library_name(library_name) diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp index e1f45387908b33e0cf9a8dd887f3382304e6c1b4..117088f67aa0e832608d96480e15bde2fb5dec3b 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteBoundaryConditionsCoProcessor.cpp @@ -147,8 +147,6 @@ void WriteBoundaryConditionsCoProcessor::addDataGeo(SPtr<Block3D> block) SPtr<ILBMKernel> kernel = block->getKernel(); SPtr<BCArray3D> bcArray = kernel->getBCProcessor()->getBCArray(); - // knotennummerierung faengt immer bei 0 an! - int SWB = 0, SEB = 0, NEB = 0, NWB = 0, SWT = 0, SET = 0, NET = 0, NWT = 0; int minX1 = 0; int minX2 = 0; @@ -206,6 +204,9 @@ void WriteBoundaryConditionsCoProcessor::addDataGeo(SPtr<Block3D> block) maxX2 -= 1; maxX3 -= 1; + // knotennummerierung faengt immer bei 0 an! + int SWB = 0, SEB = 0, NEB = 0, NWB = 0, SWT = 0, SET = 0, NET = 0, NWT = 0; + // cell vector erstellen for (int ix3 = minX3; ix3 <= maxX3; ix3++) { for (int ix2 = minX2; ix2 <= maxX2; ix2++) { diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp index 04191a9927f34d8616ae5bcb1d9670432e5ddb0e..f12023be05f6fdabf694f7508e0c46aca96d8e15 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMacroscopicQuantitiesCoProcessor.cpp @@ -47,7 +47,6 @@ #include "basics/writer/WbWriterVtkXmlASCII.h" WriteMacroscopicQuantitiesCoProcessor::WriteMacroscopicQuantitiesCoProcessor() = default; - ////////////////////////////////////////////////////////////////////////// WriteMacroscopicQuantitiesCoProcessor::WriteMacroscopicQuantitiesCoProcessor(SPtr<Grid3D> grid, SPtr<UbScheduler> s, const std::string &path, @@ -111,8 +110,7 @@ void WriteMacroscopicQuantitiesCoProcessor::collectData(double step) std::vector<std::string> cellDataNames; std::vector<std::string> pieces = comm->gather(piece); - if (comm->getProcessID() == comm->getRoot()) - { + if (comm->getProcessID() == comm->getRoot()) { std::string pname = WbWriterVtkXmlASCII::getInstance()->writeParallelFile(pfilePath, pieces, datanames, cellDataNames); found = pname.find_last_of("/"); diff --git a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h index e869c39cdf1f305c5adaee1d1c803c9902c301ee..4930beeab491caf541c436a2e60b326b7cd54c64 100644 --- a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h +++ b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h @@ -36,149 +36,150 @@ #include <PointerDefinitions.h> -#include "basics/container/CbArray4D.h" -#include "basics/container/CbArray3D.h" #include "DistributionArray3D.h" +#include "basics/container/CbArray3D.h" +#include "basics/container/CbArray4D.h" -typedef CbArray4D<LBMReal,IndexerX4X3X2X1> AverageValuesArray3D; -typedef CbArray4D<LBMReal,IndexerX4X3X2X1> ShearStressValuesArray3D; -typedef CbArray3D<LBMReal, IndexerX3X2X1> RelaxationFactorArray3D; +using AverageValuesArray3D = CbArray4D<LBMReal, IndexerX4X3X2X1>; +using ShearStressValuesArray3D = CbArray4D<LBMReal, IndexerX4X3X2X1>; +using RelaxationFactorArray3D = CbArray3D<LBMReal, IndexerX3X2X1>; +//! A class provides an interface for data structures in the kernel. class DataSet3D { public: - SPtr<DistributionArray3D> getFdistributions() const; - void setFdistributions(SPtr<DistributionArray3D> distributions); + SPtr<DistributionArray3D> getFdistributions() const; + void setFdistributions(SPtr<DistributionArray3D> distributions); + + SPtr<DistributionArray3D> getHdistributions() const; + void setHdistributions(SPtr<DistributionArray3D> distributions); + + SPtr<AverageValuesArray3D> getAverageDensity() const; + void setAverageDensity(SPtr<AverageValuesArray3D> values); - SPtr<DistributionArray3D> getHdistributions() const; - void setHdistributions(SPtr<DistributionArray3D> distributions); + SPtr<AverageValuesArray3D> getAverageVelocity() const; + void setAverageVelocity(SPtr<AverageValuesArray3D> values); - SPtr<AverageValuesArray3D> getAverageDensity() const; - void setAverageDensity(SPtr<AverageValuesArray3D> values); + SPtr<AverageValuesArray3D> getAverageFluctuations() const; + void setAverageFluctuations(SPtr<AverageValuesArray3D> values); - SPtr<AverageValuesArray3D> getAverageVelocity() const; - void setAverageVelocity(SPtr<AverageValuesArray3D> values); + SPtr<AverageValuesArray3D> getAverageTriplecorrelations() const; + void setAverageTriplecorrelations(SPtr<AverageValuesArray3D> values); - SPtr<AverageValuesArray3D> getAverageFluctuations() const; - void setAverageFluctuations(SPtr<AverageValuesArray3D> values); + SPtr<AverageValuesArray3D> getAverageValues() const; + void setAverageValues(SPtr<AverageValuesArray3D> values); - SPtr<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<ShearStressValuesArray3D> getShearStressValues() const; + void setShearStressValues(SPtr<ShearStressValuesArray3D> values); - SPtr<RelaxationFactorArray3D> getRelaxationFactor() const; - void setRelaxationFactor(SPtr<RelaxationFactorArray3D> values); + SPtr<RelaxationFactorArray3D> getRelaxationFactor() const; + void setRelaxationFactor(SPtr<RelaxationFactorArray3D> values); protected: private: - SPtr<DistributionArray3D> fdistributions; + SPtr<DistributionArray3D> fdistributions; - SPtr<DistributionArray3D> hdistributions; + SPtr<DistributionArray3D> hdistributions; - SPtr<AverageValuesArray3D> averageValues; + 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; +{ + return fdistributions; } inline void DataSet3D::setFdistributions(SPtr<DistributionArray3D> distributions) -{ - fdistributions = distributions; +{ + fdistributions = distributions; } inline SPtr<DistributionArray3D> DataSet3D::getHdistributions() const { - return hdistributions; + return hdistributions; } inline void DataSet3D::setHdistributions(SPtr<DistributionArray3D> distributions) { - hdistributions = distributions; + hdistributions = distributions; } inline SPtr<AverageValuesArray3D> DataSet3D::getAverageValues() const -{ - return averageValues; +{ + return averageValues; } inline void DataSet3D::setAverageValues(SPtr<AverageValuesArray3D> values) -{ - averageValues = values; +{ + averageValues = values; } inline SPtr<AverageValuesArray3D> DataSet3D::getAverageDensity() const { - return averageDensity; + return averageDensity; } inline void DataSet3D::setAverageDensity(SPtr<AverageValuesArray3D> values) { - averageDensity = values; + averageDensity = values; } inline SPtr<AverageValuesArray3D> DataSet3D::getAverageVelocity() const { - return averageVelocity; + return averageVelocity; } inline void DataSet3D::setAverageVelocity(SPtr<AverageValuesArray3D> values) { - averageVelocity = values; + averageVelocity = values; } inline SPtr<AverageValuesArray3D> DataSet3D::getAverageFluctuations() const { - return averageFluktuations; + return averageFluktuations; } inline void DataSet3D::setAverageFluctuations(SPtr<AverageValuesArray3D> values) { - averageFluktuations = values; + averageFluktuations = values; } inline SPtr<AverageValuesArray3D> DataSet3D::getAverageTriplecorrelations() const { - return averageTriplecorrelations; + return averageTriplecorrelations; } inline void DataSet3D::setAverageTriplecorrelations(SPtr<AverageValuesArray3D> values) { - averageTriplecorrelations = values; + averageTriplecorrelations = values; } inline SPtr<ShearStressValuesArray3D> DataSet3D::getShearStressValues() const -{ - return shearStressValues; +{ + return shearStressValues; } inline void DataSet3D::setShearStressValues(SPtr<ShearStressValuesArray3D> values) -{ - shearStressValues = values; +{ + shearStressValues = values; } inline SPtr<RelaxationFactorArray3D> DataSet3D::getRelaxationFactor() const { - return relaxationFactor; + return relaxationFactor; } inline void DataSet3D::setRelaxationFactor(SPtr<RelaxationFactorArray3D> values) { - relaxationFactor = values; + relaxationFactor = values; } #endif diff --git a/src/cpu/VirtualFluidsCore/Data/DistributionArray3D.h b/src/cpu/VirtualFluidsCore/Data/DistributionArray3D.h index fc1c67ad129d6cd7e7f5f9c9cd50ec4c76bfe714..8fe4dccea1b53da0513a093e8a741cd0071caf48 100644 --- a/src/cpu/VirtualFluidsCore/Data/DistributionArray3D.h +++ b/src/cpu/VirtualFluidsCore/Data/DistributionArray3D.h @@ -1,8 +1,42 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 DistributionArray3D.h +//! \ingroup Data +//! \author Konstantin Kutscher +//======================================================================================= + #ifndef DistributionArray3D_H #define DistributionArray3D_H #include <LBMSystem.h> +//! \brief Abstract class of data structure for LBM class DistributionArray3D { public: @@ -10,14 +44,41 @@ public: virtual ~DistributionArray3D() = default; - - virtual size_t getNX1() const = 0; - virtual size_t getNX2() const = 0; - virtual size_t getNX3() const = 0; - virtual void getDistribution(LBMReal *const f, size_t x1, size_t x2, size_t x3) = 0; - virtual void setDistribution(const LBMReal *const f, size_t x1, size_t x2, size_t x3) = 0; - virtual void getDistributionInv(LBMReal *const f, size_t x1, size_t x2, size_t x3) = 0; - virtual void setDistributionInv(const LBMReal *const f, size_t x1, size_t x2, size_t x3) = 0; + //! get number of nodes for x1 direction + virtual size_t getNX1() const = 0; + //! get number of nodes for x2 direction + virtual size_t getNX2() const = 0; + //! get number of nodes for x3 direction + virtual size_t getNX3() const = 0; + //! get distribution + //! \param f distribution + //! \param x1 coordinate x1 + //! \param x2 coordinate x2 + //! \param x3 coordinate x3 + virtual void getDistribution(LBMReal *const f, size_t x1, size_t x2, size_t x3) = 0; + //! set distribution + //! \param f distribution + //! \param x1 coordinate x1 + //! \param x2 coordinate x2 + //! \param x3 coordinate x3 + virtual void setDistribution(const LBMReal *const f, size_t x1, size_t x2, size_t x3) = 0; + //! get distribution in inverse order + //! \param f distribution + //! \param x1 coordinate x1 + //! \param x2 coordinate x2 + //! \param x3 coordinate x3 + virtual void getDistributionInv(LBMReal *const f, size_t x1, size_t x2, size_t x3) = 0; + //! set distribution in inverse order + //! \param f distribution + //! \param x1 coordinate x1 + //! \param x1 coordinate x2 + //! \param x1 coordinate x3 + virtual void setDistributionInv(const LBMReal *const f, size_t x1, size_t x2, size_t x3) = 0; + //! set distribution in inverse order + //! \param f distribution + //! \param x1 coordinate x1 + //! \param x1 coordinate x2 + //! \param x1 coordinate x3 virtual void setDistributionForDirection(const LBMReal *const f, size_t x1, size_t x2, size_t x3, unsigned long int direction) = 0; virtual void setDistributionForDirection(LBMReal f, size_t x1, size_t x2, size_t x3, int direction) = 0; diff --git a/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.cpp b/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.cpp index d55a59b58b026ec46b7cdc3e48aa796ec24d181a..d2a7baee86607f7c99a30cf59910fa831ae4a7a9 100644 --- a/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.cpp +++ b/src/cpu/VirtualFluidsCore/Grid/BasicCalculator.cpp @@ -33,12 +33,12 @@ #include "BasicCalculator.h" -#include "Block3D.h" #include "BCProcessor.h" -#include "LBMKernel.h" +#include "Block3D.h" #include "Block3DConnector.h" -#include "UbScheduler.h" +#include "LBMKernel.h" #include "UbLogger.h" +#include "UbScheduler.h" #ifdef _OPENMP #include <omp.h> @@ -48,34 +48,32 @@ //#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 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 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 ////////////////////////////////////////////////////////////////////////// @@ -87,95 +85,86 @@ void BasicCalculator::calculate() 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) @@ -183,50 +172,45 @@ 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); + 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); + } } - 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) @@ -234,192 +218,156 @@ 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/Grid/Grid3D.cpp b/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp index 520da83f6f7048ad2ff019051bd7cee8d188c60a..199d2cf87851160a4fc36e9a90ae2b199f1fce7e 100644 --- a/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp +++ b/src/cpu/VirtualFluidsCore/Grid/Grid3D.cpp @@ -55,7 +55,7 @@ Grid3D::Grid3D(SPtr<Communicator> comm) { levelSet.resize(Grid3DSystem::MAXLEVEL + 1); bundle = comm->getBundleID(); - rank = comm->getProcessID(); + rank = comm->getProcessID(); } ////////////////////////////////////////////////////////////////////////// Grid3D::Grid3D(SPtr<Communicator> comm, int blockNx1, int blockNx2, int blockNx3, int gridNx1, int gridNx2, int gridNx3) @@ -65,8 +65,8 @@ Grid3D::Grid3D(SPtr<Communicator> comm, int blockNx1, int blockNx2, int blockNx3 { levelSet.resize(Grid3DSystem::MAXLEVEL + 1); bundle = comm->getBundleID(); - rank = comm->getProcessID(); - trafo = std::make_shared<CoordinateTransformation3D>(0.0, 0.0, 0.0, (double)blockNx1, (double)blockNx2, + rank = comm->getProcessID(); + trafo = std::make_shared<CoordinateTransformation3D>(0.0, 0.0, 0.0, (double)blockNx1, (double)blockNx2, (double)blockNx3); UbTupleInt3 minInd(0, 0, 0); UbTupleInt3 maxInd(gridNx1, gridNx2, gridNx3); @@ -218,11 +218,6 @@ SPtr<Block3D> Grid3D::getBlock(int id) const return it->second; } ////////////////////////////////////////////////////////////////////////// -// const Grid3D::Block3DMap& Grid3D::getBlocks(int level) -//{ -// return levelSet[level]; -//} -////////////////////////////////////////////////////////////////////////// Grid3D::BlockIDMap &Grid3D::getBlockIDs() { return blockIdMap; } ////////////////////////////////////////////////////////////////////////// SPtr<Block3D> Grid3D::getSuperBlock(SPtr<Block3D> block) @@ -298,8 +293,6 @@ bool Grid3D::expandBlock(int ix1, int ix2, int ix3, int level) throw UbException(UB_EXARGS, "block(x1=" + UbSystem::toString(ix1) + ", x2=" + UbSystem::toString(ix2) + ", x3=" + UbSystem::toString(ix3) + ", l=" + UbSystem::toString(level) + ") is not exist"); - // if(!block->isActive()) throw UbException(UB_EXARGS,"block(x1="+UbSystem::toString(ix1)+", - // x2="+UbSystem::toString(ix2)+", x3="+UbSystem::toString(ix3)+", l="+UbSystem::toString(level)+") is not active"); // da bei periodic der eigentliche block andere indizes hat: ix1 = block->getX1(); @@ -415,7 +408,6 @@ void Grid3D::deleteConnectors() for (Block3DMap::value_type b : blockMap) { SPtr<Block3D> block = b.second; block->deleteConnectors(); - // block->deleteInterpolationConnectors(); } } } @@ -2305,6 +2297,7 @@ void Grid3D::renumberBlockIDs() } } + ////////////////////////////////////////////////////////////////////////// void Grid3D::updateDistributedBlocks(SPtr<Communicator> comm) { diff --git a/src/cpu/VirtualFluidsCore/Grid/Grid3D.h b/src/cpu/VirtualFluidsCore/Grid/Grid3D.h index b954a4361df5b97b91d111e80c30b413a0b9ed05..f3aa968316fcc74f77584ad58ae7114dcab0840c 100644 --- a/src/cpu/VirtualFluidsCore/Grid/Grid3D.h +++ b/src/cpu/VirtualFluidsCore/Grid/Grid3D.h @@ -50,10 +50,10 @@ class CoordinateTransformation3D; class Communicator; class Block3D; class Interactor3D; -// class Grid3DVisitor; #define OFFSET 0.5 +//! A class implements block grid ////////////////////////////////////////////////////////////////////////// class Grid3D : public enableSharedFromThis<Grid3D> { @@ -93,7 +93,6 @@ public: void getBlocks(int level, int rank, bool active, std::vector<SPtr<Block3D>> &blockVector); int getNumberOfBlocks(); int getNumberOfBlocks(int level); - // const Block3DMap& getBlocks(int level); BlockIDMap &getBlockIDs(); void deleteBlockIDs(); void renumberBlockIDs(); diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp index 1f647e73d434c9b19f2133dea34588bf201eef11..daed493b9cc1afddbd92acabcd551da0f463ea26 100644 --- a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.cpp @@ -1,28 +1,28 @@ //======================================================================================= -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ // \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ // -// This file is part of VirtualFluids. VirtualFluids is free software: you can +// 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 +// 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 +// +// 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/>. // @@ -30,7 +30,6 @@ //! \ingroup LBM //! \author Konstantin Kutscher, Martin Geier //======================================================================================= - #include "CumulantK17LBMKernel.h" #include "D3Q27System.h" #include "D3Q27EsoTwist3DSplittedVector.h" @@ -47,593 +46,590 @@ using namespace UbMath; ////////////////////////////////////////////////////////////////////////// CumulantK17LBMKernel::CumulantK17LBMKernel() { - this->compressible = true; + this->compressible = true; } ////////////////////////////////////////////////////////////////////////// -CumulantK17LBMKernel::~CumulantK17LBMKernel(void) -= default; -////////////////////////////////////////////////////////////////////////// void CumulantK17LBMKernel::initDataSet() { - SPtr<DistributionArray3D> d(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9)); - dataSet->setFdistributions(d); + SPtr<DistributionArray3D> d(new D3Q27EsoTwist3DSplittedVector(nx[0] + 2, nx[1] + 2, nx[2] + 2, -999.9)); + dataSet->setFdistributions(d); } ////////////////////////////////////////////////////////////////////////// SPtr<LBMKernel> CumulantK17LBMKernel::clone() { - SPtr<LBMKernel> kernel(new CumulantK17LBMKernel()); - kernel->setNX(nx); - std::dynamic_pointer_cast<CumulantK17LBMKernel>(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()); - - return kernel; + SPtr<LBMKernel> kernel(new CumulantK17LBMKernel()); + kernel->setNX(nx); + std::dynamic_pointer_cast<CumulantK17LBMKernel>(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()); + + return kernel; } ////////////////////////////////////////////////////////////////////////// void CumulantK17LBMKernel::calculate(int step) { - ////////////////////////////////////////////////////////////////////////// - //! Cumulant K17 Kernel is based on - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! and - //! <a href="https://doi.org/10.1016/j.jcp.2017.07.004"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.07.004 ]</b></a> - //! - //! The cumulant kernel is executed in the following steps - //! - //////////////////////////////////////////////////////////////////////////////// - //! - Get node index coordinates from thredIdx, blockIdx, blockDim and gridDim. - //! - - using namespace std; - - //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); - } - ///////////////////////////////////// - - localDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); - nonLocalDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); - restDistributions = dynamic_pointer_cast<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; - - 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)) + ////////////////////////////////////////////////////////////////////////// + //! Cumulant K17 Kernel is based on + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! and + //! <a href="https://doi.org/10.1016/j.jcp.2017.07.004"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.07.004 ]</b></a> + //! + //! The cumulant kernel is executed in the following steps + //! + //////////////////////////////////////////////////////////////////////////////// + //! - Get node index coordinates from thredIdx, blockIdx, blockDim and gridDim. + //! + + using namespace std; + + //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); + } + ///////////////////////////////////// + + localDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getLocalDistributions(); + nonLocalDistributions = dynamic_pointer_cast<D3Q27EsoTwist3DSplittedVector>(dataSet->getFdistributions())->getNonLocalDistributions(); + restDistributions = dynamic_pointer_cast<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; + + for (int x3 = minX3; x3 < maxX3; x3++) + { + for (int x2 = minX2; x2 < maxX2; x2++) + { + for (int x1 = minX1; x1 < maxX1; x1++) { - int x1p = x1 + 1; - int x2p = x2 + 1; - int x3p = x3 + 1; - ////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// - //! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm - //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a> - //! - //////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// - - //E N T - //c c c - ////////// - //W S B - //a a a - - //Rest is 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->restDistributions)(x1, x2, x3); - - //////////////////////////////////////////////////////////////////////////////////// - //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) - //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> - //! - 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 = c1 + drho; - LBMReal OOrho = c1 / rho; - //////////////////////////////////////////////////////////////////////////////////// - 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(); - - //////////////////////////////////////////////////////////////////////////////////// - //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) - //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> - //! - vvx += forcingX1 * deltaT * c1o2; // X - vvy += forcingX2 * deltaT * c1o2; // Y - vvz += forcingX3 * deltaT * c1o2; // Z - } - //////////////////////////////////////////////////////////////////////////////////// - // calculate the square of velocities for this lattice node - LBMReal vx2 = vvx * vvx; - LBMReal vy2 = vvy * vvy; - LBMReal vz2 = vvz * vvz; - //////////////////////////////////////////////////////////////////////////////////// - //! - Set relaxation limiters for third order cumulants to default value \f$ \lambda=0.001 \f$ according to section 6 in - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! - LBMReal wadjust; - LBMReal qudricLimitP = c1o100; - LBMReal qudricLimitM = c1o100; - LBMReal qudricLimitD = c1o100; - //////////////////////////////////////////////////////////////////////////////////// - //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in - //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> - //! see also Eq. (6)-(14) in - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! - //////////////////////////////////////////////////////////////////////////////////// - // Z - Dir - forwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36, c1o36); - forwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9, c1o9); - forwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36, c1o36); - forwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9, c1o9); - forwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9); - forwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9, c1o9); - forwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36, c1o36); - forwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9, c1o9); - forwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36, c1o36); - - //////////////////////////////////////////////////////////////////////////////////// - // Y - Dir - forwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6, c1o6); - forwardChimera(mfaab, mfabb, mfacb, vvy, vy2); - forwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18, c1o18); - forwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3); - forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); - forwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9); - forwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6, c1o6); - forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); - forwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18, c1o18); - - //////////////////////////////////////////////////////////////////////////////////// - // X - Dir - forwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1, c1); - forwardChimera(mfaba, mfbba, mfcba, vvx, vx2); - forwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3, c1o3); - forwardChimera(mfaab, mfbab, mfcab, vvx, vx2); - forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); - forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); - forwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3, c1o3); - forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); - forwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c9, c1o9); - - //////////////////////////////////////////////////////////////////////////////////// - //! - Setting relaxation rates for non-hydrodynamic cumulants (default values). Variable names and equations according to - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! => [NAME IN PAPER]=[NAME IN CODE]=[DEFAULT VALUE]. - //! - Trace of second order cumulants \f$ C_{200}+C_{020}+C_{002} \f$ used to adjust bulk viscosity:\f$\omega_2=OxxPyyPzz=1.0 \f$. - //! - Third order cumulants \f$ C_{120}+C_{102} \f$, \f$ C_{210}+C_{012} \f$, \f$ C_{201}+C_{021} \f$: \f$\omega_3=OxyyPxzz\f$ set according to Eq. (111) with simplifications assuming \f$\omega_2=1.0\f$. - //! - Third order cumulants \f$ C_{120}-C_{102} \f$, \f$ C_{210}-C_{012} \f$, \f$ C_{201}-C_{021} \f$: \f$\omega_4 = OxyyMxzz\f$ set according to Eq. (112) with simplifications assuming \f$\omega_2 = 1.0\f$. - //! - Third order cumulants \f$ C_{111} \f$: \f$\omega_5 = Oxyz\f$ set according to Eq. (113) with simplifications assuming \f$\omega_2 = 1.0\f$ (modify for different bulk viscosity). - //! - Fourth order cumulants \f$ C_{220} \f$, \f$ C_{202} \f$, \f$ C_{022} \f$, \f$ C_{211} \f$, \f$ C_{121} \f$, \f$ C_{112} \f$: for simplification all set to the same default value \f$ \omega_6=\omega_7=\omega_8=O4=1.0 \f$. - //! - Fifth order cumulants \f$ C_{221}\f$, \f$C_{212}\f$, \f$C_{122}\f$: \f$\omega_9=O5=1.0\f$. - //! - Sixth order cumulant \f$ C_{222}\f$: \f$\omega_{10}=O6=1.0\f$. - //! - //////////////////////////////////////////////////////////// - //2. - LBMReal OxxPyyPzz = c1; - //////////////////////////////////////////////////////////// - //3. - LBMReal OxyyPxzz = c8 * (-c2 + omega) * ( c1 + c2*omega) / (-c8 - c14*omega + c7*omega*omega); - LBMReal OxyyMxzz = c8 * (-c2 + omega) * (-c7 + c4*omega) / (c56 - c50*omega + c9*omega*omega); - LBMReal Oxyz = c24 * (-c2 + omega) * (-c2 - c7*omega + c3*omega*omega) / (c48 + c152*omega - c130*omega*omega + c29*omega*omega*omega); - //////////////////////////////////////////////////////////// - //4. - LBMReal O4 = c1; - //////////////////////////////////////////////////////////// - //5. - LBMReal O5 = c1; - //////////////////////////////////////////////////////////// - //6. - LBMReal O6 = c1; - - //////////////////////////////////////////////////////////////////////////////////// - //! - A and B: parameters for fourth order convergence of the diffusion term according to Eq. (114) and (115) - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! with simplifications assuming \f$\omega_2 = 1.0\f$ (modify for different bulk viscosity). - //! - LBMReal A = (c4 + c2*omega - c3*omega*omega) / (c2 - c7*omega + c5*omega*omega); - LBMReal B = (c4 + c28*omega - c14*omega*omega) / (c6 - c21*omega + c15*omega*omega); - - //////////////////////////////////////////////////////////////////////////////////// - //! - Compute cumulants from central moments according to Eq. (20)-(23) in - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! - //////////////////////////////////////////////////////////// - //4. - LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2 * mfbba * mfbab) * OOrho; - LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2 * mfbba * mfabb) * OOrho; - LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2 * mfbab * mfabb) * OOrho; - - LBMReal CUMcca = mfcca - (((mfcaa * mfaca + c2 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) * OOrho - c1o9 * (drho * OOrho)); - LBMReal CUMcac = mfcac - (((mfcaa * mfaac + c2 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) * OOrho - c1o9 * (drho * OOrho)); - LBMReal CUMacc = mfacc - (((mfaac * mfaca + c2 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) * OOrho - c1o9 * (drho * OOrho)); - //////////////////////////////////////////////////////////// - //5. - LBMReal CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4 * mfabb * mfbbb + c2 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) * OOrho; - LBMReal CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4 * mfbab * mfbbb + c2 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) * OOrho; - LBMReal CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4 * mfbba * mfbbb + c2 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) * OOrho; - //////////////////////////////////////////////////////////// - //6. - LBMReal CUMccc = mfccc + ((-c4 * mfbbb * mfbbb - - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - - c4 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - - c2 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho - + (c4 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) - + c2 * (mfcaa * mfaca * mfaac) - + c16 * mfbba * mfbab * mfabb) * OOrho * OOrho - - c1o3 * (mfacc + mfcac + mfcca) * OOrho - - c1o9 * (mfcaa + mfaca + mfaac) * OOrho - + (c2 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) - + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 - + c1o27 * ((drho * drho - drho) * OOrho * OOrho)); - - //////////////////////////////////////////////////////////////////////////////////// - //! - Compute linear combinations of second and third order cumulants - //! - //////////////////////////////////////////////////////////// - //2. - LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; - LBMReal mxxMyy = mfcaa - mfaca; - LBMReal mxxMzz = mfcaa - mfaac; - //////////////////////////////////////////////////////////// - //3. - LBMReal mxxyPyzz = mfcba + mfabc; - LBMReal mxxyMyzz = mfcba - mfabc; - - LBMReal mxxzPyyz = mfcab + mfacb; - LBMReal mxxzMyyz = mfcab - mfacb; - - LBMReal mxyyPxzz = mfbca + mfbac; - LBMReal mxyyMxzz = mfbca - mfbac; - - //////////////////////////////////////////////////////////////////////////////////// - //incl. correction - //////////////////////////////////////////////////////////// - //! - Compute velocity gradients from second order cumulants according to Eq. (27)-(32) - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! Further explanations of the correction in viscosity in Appendix H of - //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> - //! Note that the division by rho is omitted here as we need rho times the gradients later. - //! - LBMReal Dxy = -c3 * omega * mfbba; - LBMReal Dxz = -c3 * omega * mfbab; - LBMReal Dyz = -c3 * omega * mfabb; - LBMReal dxux = c1o2 * (-omega) * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); - LBMReal dyuy = dxux + omega * c3o2 * mxxMyy; - LBMReal dzuz = dxux + omega * c3o2 * mxxMzz; - //////////////////////////////////////////////////////////// - //! - Relaxation of second order cumulants with correction terms according to Eq. (33)-(35) in - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! - mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - c3 * (c1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); - mxxMyy += omega * (-mxxMyy) - c3 * (c1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); - mxxMzz += omega * (-mxxMzz) - c3 * (c1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); - - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - ////no correction - //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz); - //mxxMyy += -(-omega) * (-mxxMyy); - //mxxMzz += -(-omega) * (-mxxMzz); - ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - mfabb += omega * (-mfabb); - mfbab += omega * (-mfbab); - mfbba += omega * (-mfbba); - - //////////////////////////////////////////////////////////////////////////////////// - //relax - ////////////////////////////////////////////////////////////////////////// - // incl. limiter - //! - Relaxation of third order cumulants including limiter according to Eq. (116)-(123) - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! - wadjust = Oxyz + (c1 - Oxyz) * abs(mfbbb) / (abs(mfbbb) + qudricLimitD); - mfbbb += wadjust * (-mfbbb); - wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxxyPyzz) / (abs(mxxyPyzz) + qudricLimitP); - mxxyPyzz += wadjust * (-mxxyPyzz); - wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxxyMyzz) / (abs(mxxyMyzz) + qudricLimitM); - mxxyMyzz += wadjust * (-mxxyMyzz); - wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxxzPyyz) / (abs(mxxzPyyz) + qudricLimitP); - mxxzPyyz += wadjust * (-mxxzPyyz); - wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxxzMyyz) / (abs(mxxzMyyz) + qudricLimitM); - mxxzMyyz += wadjust * (-mxxzMyyz); - wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxyyPxzz) / (abs(mxyyPxzz) + qudricLimitP); - mxyyPxzz += wadjust * (-mxyyPxzz); - wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxyyMxzz) / (abs(mxyyMxzz) + qudricLimitM); - mxyyMxzz += wadjust * (-mxyyMxzz); - ////////////////////////////////////////////////////////////////////////// - // no limiter - //mfbbb += OxyyMxzz * (-mfbbb); - //mxxyPyzz += OxyyPxzz * (-mxxyPyzz); - //mxxyMyzz += OxyyMxzz * (-mxxyMyzz); - //mxxzPyyz += OxyyPxzz * (-mxxzPyyz); - //mxxzMyyz += OxyyMxzz * (-mxxzMyyz); - //mxyyPxzz += OxyyPxzz * (-mxyyPxzz); - //mxyyMxzz += OxyyMxzz * (-mxyyMxzz); - - //////////////////////////////////////////////////////////////////////////////////// - //! - Compute inverse linear combinations of second and third order cumulants - //! - mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); - mfaca = c1o3 * (-c2 * mxxMyy + mxxMzz + mxxPyyPzz); - mfaac = c1o3 * (mxxMyy - c2 * mxxMzz + mxxPyyPzz); - - mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; - mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; - mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; - mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; - mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; - mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; - ////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - //4. - // no limiter - //! - Relax fourth order cumulants to modified equilibrium for fourth order convergence of diffusion according to Eq. (43)-(48) - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! - CUMacc = -O4 * (c1 / omega - c1o2) * (dyuy + dzuz) * c2o3 * A + (c1 - O4) * (CUMacc); - CUMcac = -O4 * (c1 / omega - c1o2) * (dxux + dzuz) * c2o3 * A + (c1 - O4) * (CUMcac); - CUMcca = -O4 * (c1 / omega - c1o2) * (dyuy + dxux) * c2o3 * A + (c1 - O4) * (CUMcca); - CUMbbc = -O4 * (c1 / omega - c1o2) * Dxy * c1o3 * B + (c1 - O4) * (CUMbbc); - CUMbcb = -O4 * (c1 / omega - c1o2) * Dxz * c1o3 * B + (c1 - O4) * (CUMbcb); - CUMcbb = -O4 * (c1 / omega - c1o2) * Dyz * c1o3 * B + (c1 - O4) * (CUMcbb); - - ////////////////////////////////////////////////////////////////////////// - //5. - CUMbcc += O5 * (-CUMbcc); - CUMcbc += O5 * (-CUMcbc); - CUMccb += O5 * (-CUMccb); - - ////////////////////////////////////////////////////////////////////////// - //6. - CUMccc += O6 * (-CUMccc); - - //////////////////////////////////////////////////////////////////////////////////// - //! - Compute central moments from post collision cumulants according to Eq. (53)-(56) in - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! - - ////////////////////////////////////////////////////////////////////////// - //4. - mfcbb = CUMcbb + c1o3 * ((c3 * mfcaa + c1) * mfabb + c6 * mfbba * mfbab) * OOrho; - mfbcb = CUMbcb + c1o3 * ((c3 * mfaca + c1) * mfbab + c6 * mfbba * mfabb) * OOrho; - mfbbc = CUMbbc + c1o3 * ((c3 * mfaac + c1) * mfbba + c6 * mfbab * mfabb) * OOrho; - - mfcca = CUMcca + (((mfcaa * mfaca + c2 * mfbba * mfbba) * c9 + c3 * (mfcaa + mfaca)) * OOrho - (drho * OOrho)) * c1o9; - mfcac = CUMcac + (((mfcaa * mfaac + c2 * mfbab * mfbab) * c9 + c3 * (mfcaa + mfaac)) * OOrho - (drho * OOrho)) * c1o9; - mfacc = CUMacc + (((mfaac * mfaca + c2 * mfabb * mfabb) * c9 + c3 * (mfaac + mfaca)) * OOrho - (drho * OOrho)) * c1o9; - - ////////////////////////////////////////////////////////////////////////// - //5. - mfbcc = CUMbcc + c1o3 * (c3 * (mfaac * mfbca + mfaca * mfbac + c4 * mfabb * mfbbb + c2 * (mfbab * mfacb + mfbba * mfabc)) + (mfbca + mfbac)) * OOrho; - mfcbc = CUMcbc + c1o3 * (c3 * (mfaac * mfcba + mfcaa * mfabc + c4 * mfbab * mfbbb + c2 * (mfabb * mfcab + mfbba * mfbac)) + (mfcba + mfabc)) * OOrho; - mfccb = CUMccb + c1o3 * (c3 * (mfcaa * mfacb + mfaca * mfcab + c4 * mfbba * mfbbb + c2 * (mfbab * mfbca + mfabb * mfcba)) + (mfacb + mfcab)) * OOrho; - - ////////////////////////////////////////////////////////////////////////// - //6. - mfccc = CUMccc - ((-c4 * mfbbb * mfbbb - - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) - - c4 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) - - c2 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho - + (c4 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) - + c2 * (mfcaa * mfaca * mfaac) - + c16 * mfbba * mfbab * mfabb) * OOrho * OOrho - - c1o3 * (mfacc + mfcac + mfcca) * OOrho - - c1o9 * (mfcaa + mfaca + mfaac) * OOrho - + (c2 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) - + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 - + c1o27 * ((drho * drho - drho) * OOrho * OOrho)); - - - //////////////////////////////////////////////////////////////////////////////////// - //! - Add acceleration (body force) to first order cumulants according to Eq. (85)-(87) in - //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> - //! - mfbaa = -mfbaa; - mfaba = -mfaba; - mfaab = -mfaab; - //////////////////////////////////////////////////////////////////////////////////// - - //////////////////////////////////////////////////////////////////////////////////// - //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in - //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> - //! see also Eq. (88)-(96) in - //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> - //! - //////////////////////////////////////////////////////////////////////////////////// - // X - Dir - backwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1, c1); - backwardChimera(mfaba, mfbba, mfcba, vvx, vx2); - backwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3, c1o3); - backwardChimera(mfaab, mfbab, mfcab, vvx, vx2); - backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); - backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); - backwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3, c1o3); - backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); - backwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c9, c1o9); - - //////////////////////////////////////////////////////////////////////////////////// - // Y - Dir - backwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6, c1o6); - backwardChimera(mfaab, mfabb, mfacb, vvy, vy2); - backwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18, c1o18); - backwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3); - backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); - backwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9); - backwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6, c1o6); - backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); - backwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18, c1o18); - - //////////////////////////////////////////////////////////////////////////////////// - // Z - Dir - backwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36, c1o36); - backwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9, c1o9); - backwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36, c1o36); - backwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9, c1o9); - backwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9); - backwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9, c1o9); - backwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36, c1o36); - backwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9, c1o9); - backwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36, c1o36); - //////////////////////////////////////////////////////////////////////////////////// - - ////////////////////////////////////////////////////////////////////////// - //proof correctness - ////////////////////////////////////////////////////////////////////////// + if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) + { + int x1p = x1 + 1; + int x2p = x2 + 1; + int x3p = x3 + 1; + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //! - Read distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm + //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + + //E N T + //c c c + ////////// + //W S B + //a a a + + //Rest is 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->restDistributions)(x1, x2, x3); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Calculate density and velocity using pyramid summation for low round-off errors as in Eq. (J1)-(J3) + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + 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 = c1 + drho; + LBMReal OOrho = c1 / rho; + //////////////////////////////////////////////////////////////////////////////////// + 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(); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Add half of the acceleration (body force) to the velocity as in Eq. (42) + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + vvx += forcingX1 * deltaT * c1o2; // X + vvy += forcingX2 * deltaT * c1o2; // Y + vvz += forcingX3 * deltaT * c1o2; // Z + } + //////////////////////////////////////////////////////////////////////////////////// + // calculate the square of velocities for this lattice node + LBMReal vx2 = vvx * vvx; + LBMReal vy2 = vvy * vvy; + LBMReal vz2 = vvz * vvz; + //////////////////////////////////////////////////////////////////////////////////// + //! - Set relaxation limiters for third order cumulants to default value \f$ \lambda=0.001 \f$ according to section 6 in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + LBMReal wadjust; + LBMReal qudricLimitP = c1o100; + LBMReal qudricLimitM = c1o100; + LBMReal qudricLimitD = c1o100; + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from well conditioned distributions to central moments as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (6)-(14) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + forwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36, c1o36); + forwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9, c1o9); + forwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36, c1o36); + forwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9, c1o9); + forwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9); + forwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9, c1o9); + forwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36, c1o36); + forwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9, c1o9); + forwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36, c1o36); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + forwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6, c1o6); + forwardChimera(mfaab, mfabb, mfacb, vvy, vy2); + forwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18, c1o18); + forwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3); + forwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); + forwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9); + forwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6, c1o6); + forwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); + forwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18, c1o18); + + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + forwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1, c1); + forwardChimera(mfaba, mfbba, mfcba, vvx, vx2); + forwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3, c1o3); + forwardChimera(mfaab, mfbab, mfcab, vvx, vx2); + forwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); + forwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); + forwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3, c1o3); + forwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); + forwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c9, c1o9); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Setting relaxation rates for non-hydrodynamic cumulants (default values). Variable names and equations according to + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! => [NAME IN PAPER]=[NAME IN CODE]=[DEFAULT VALUE]. + //! - Trace of second order cumulants \f$ C_{200}+C_{020}+C_{002} \f$ used to adjust bulk viscosity:\f$\omega_2=OxxPyyPzz=1.0 \f$. + //! - Third order cumulants \f$ C_{120}+C_{102} \f$, \f$ C_{210}+C_{012} \f$, \f$ C_{201}+C_{021} \f$: \f$\omega_3=OxyyPxzz\f$ set according to Eq. (111) with simplifications assuming \f$\omega_2=1.0\f$. + //! - Third order cumulants \f$ C_{120}-C_{102} \f$, \f$ C_{210}-C_{012} \f$, \f$ C_{201}-C_{021} \f$: \f$\omega_4 = OxyyMxzz\f$ set according to Eq. (112) with simplifications assuming \f$\omega_2 = 1.0\f$. + //! - Third order cumulants \f$ C_{111} \f$: \f$\omega_5 = Oxyz\f$ set according to Eq. (113) with simplifications assuming \f$\omega_2 = 1.0\f$ (modify for different bulk viscosity). + //! - Fourth order cumulants \f$ C_{220} \f$, \f$ C_{202} \f$, \f$ C_{022} \f$, \f$ C_{211} \f$, \f$ C_{121} \f$, \f$ C_{112} \f$: for simplification all set to the same default value \f$ \omega_6=\omega_7=\omega_8=O4=1.0 \f$. + //! - Fifth order cumulants \f$ C_{221}\f$, \f$C_{212}\f$, \f$C_{122}\f$: \f$\omega_9=O5=1.0\f$. + //! - Sixth order cumulant \f$ C_{222}\f$: \f$\omega_{10}=O6=1.0\f$. + //! + //////////////////////////////////////////////////////////// + //2. + LBMReal OxxPyyPzz = c1; + //////////////////////////////////////////////////////////// + //3. + LBMReal OxyyPxzz = c8 * (-c2 + omega) * ( c1 + c2*omega) / (-c8 - c14*omega + c7*omega*omega); + LBMReal OxyyMxzz = c8 * (-c2 + omega) * (-c7 + c4*omega) / (c56 - c50*omega + c9*omega*omega); + LBMReal Oxyz = c24 * (-c2 + omega) * (-c2 - c7*omega + c3*omega*omega) / (c48 + c152*omega - c130*omega*omega + c29*omega*omega*omega); + //////////////////////////////////////////////////////////// + //4. + LBMReal O4 = c1; + //////////////////////////////////////////////////////////// + //5. + LBMReal O5 = c1; + //////////////////////////////////////////////////////////// + //6. + LBMReal O6 = c1; + + //////////////////////////////////////////////////////////////////////////////////// + //! - A and B: parameters for fourth order convergence of the diffusion term according to Eq. (114) and (115) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! with simplifications assuming \f$\omega_2 = 1.0\f$ (modify for different bulk viscosity). + //! + LBMReal A = (c4 + c2*omega - c3*omega*omega) / (c2 - c7*omega + c5*omega*omega); + LBMReal B = (c4 + c28*omega - c14*omega*omega) / (c6 - c21*omega + c15*omega*omega); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute cumulants from central moments according to Eq. (20)-(23) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////// + //4. + LBMReal CUMcbb = mfcbb - ((mfcaa + c1o3) * mfabb + c2 * mfbba * mfbab) * OOrho; + LBMReal CUMbcb = mfbcb - ((mfaca + c1o3) * mfbab + c2 * mfbba * mfabb) * OOrho; + LBMReal CUMbbc = mfbbc - ((mfaac + c1o3) * mfbba + c2 * mfbab * mfabb) * OOrho; + + LBMReal CUMcca = mfcca - (((mfcaa * mfaca + c2 * mfbba * mfbba) + c1o3 * (mfcaa + mfaca)) * OOrho - c1o9 * (drho * OOrho)); + LBMReal CUMcac = mfcac - (((mfcaa * mfaac + c2 * mfbab * mfbab) + c1o3 * (mfcaa + mfaac)) * OOrho - c1o9 * (drho * OOrho)); + LBMReal CUMacc = mfacc - (((mfaac * mfaca + c2 * mfabb * mfabb) + c1o3 * (mfaac + mfaca)) * OOrho - c1o9 * (drho * OOrho)); + //////////////////////////////////////////////////////////// + //5. + LBMReal CUMbcc = mfbcc - ((mfaac * mfbca + mfaca * mfbac + c4 * mfabb * mfbbb + c2 * (mfbab * mfacb + mfbba * mfabc)) + c1o3 * (mfbca + mfbac)) * OOrho; + LBMReal CUMcbc = mfcbc - ((mfaac * mfcba + mfcaa * mfabc + c4 * mfbab * mfbbb + c2 * (mfabb * mfcab + mfbba * mfbac)) + c1o3 * (mfcba + mfabc)) * OOrho; + LBMReal CUMccb = mfccb - ((mfcaa * mfacb + mfaca * mfcab + c4 * mfbba * mfbbb + c2 * (mfbab * mfbca + mfabb * mfcba)) + c1o3 * (mfacb + mfcab)) * OOrho; + //////////////////////////////////////////////////////////// + //6. + LBMReal CUMccc = mfccc + ((-c4 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho + + (c4 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2 * (mfcaa * mfaca * mfaac) + + c16 * mfbba * mfbab * mfabb) * OOrho * OOrho + - c1o3 * (mfacc + mfcac + mfcca) * OOrho + - c1o9 * (mfcaa + mfaca + mfaac) * OOrho + + (c2 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 + + c1o27 * ((drho * drho - drho) * OOrho * OOrho)); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute linear combinations of second and third order cumulants + //! + //////////////////////////////////////////////////////////// + //2. + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + //////////////////////////////////////////////////////////// + //3. + LBMReal mxxyPyzz = mfcba + mfabc; + LBMReal mxxyMyzz = mfcba - mfabc; + + LBMReal mxxzPyyz = mfcab + mfacb; + LBMReal mxxzMyyz = mfcab - mfacb; + + LBMReal mxyyPxzz = mfbca + mfbac; + LBMReal mxyyMxzz = mfbca - mfbac; + + //////////////////////////////////////////////////////////////////////////////////// + //incl. correction + //////////////////////////////////////////////////////////// + //! - Compute velocity gradients from second order cumulants according to Eq. (27)-(32) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! Further explanations of the correction in viscosity in Appendix H of + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! Note that the division by rho is omitted here as we need rho times the gradients later. + //! + LBMReal Dxy = -c3 * omega * mfbba; + LBMReal Dxz = -c3 * omega * mfbab; + LBMReal Dyz = -c3 * omega * mfabb; + LBMReal dxux = c1o2 * (-omega) * (mxxMyy + mxxMzz) + c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + LBMReal dyuy = dxux + omega * c3o2 * mxxMyy; + LBMReal dzuz = dxux + omega * c3o2 * mxxMzz; + //////////////////////////////////////////////////////////// + //! - Relaxation of second order cumulants with correction terms according to Eq. (33)-(35) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + mxxPyyPzz += OxxPyyPzz * (mfaaa - mxxPyyPzz) - c3 * (c1 - c1o2 * OxxPyyPzz) * (vx2 * dxux + vy2 * dyuy + vz2 * dzuz); + mxxMyy += omega * (-mxxMyy) - c3 * (c1 + c1o2 * (-omega)) * (vx2 * dxux - vy2 * dyuy); + mxxMzz += omega * (-mxxMzz) - c3 * (c1 + c1o2 * (-omega)) * (vx2 * dxux - vz2 * dzuz); + + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + ////no correction + //mxxPyyPzz += OxxPyyPzz*(mfaaa - mxxPyyPzz); + //mxxMyy += -(-omega) * (-mxxMyy); + //mxxMzz += -(-omega) * (-mxxMzz); + ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + mfabb += omega * (-mfabb); + mfbab += omega * (-mfbab); + mfbba += omega * (-mfbba); + + //////////////////////////////////////////////////////////////////////////////////// + //relax + ////////////////////////////////////////////////////////////////////////// + // incl. limiter + //! - Relaxation of third order cumulants including limiter according to Eq. (116)-(123) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + wadjust = Oxyz + (c1 - Oxyz) * abs(mfbbb) / (abs(mfbbb) + qudricLimitD); + mfbbb += wadjust * (-mfbbb); + wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxxyPyzz) / (abs(mxxyPyzz) + qudricLimitP); + mxxyPyzz += wadjust * (-mxxyPyzz); + wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxxyMyzz) / (abs(mxxyMyzz) + qudricLimitM); + mxxyMyzz += wadjust * (-mxxyMyzz); + wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxxzPyyz) / (abs(mxxzPyyz) + qudricLimitP); + mxxzPyyz += wadjust * (-mxxzPyyz); + wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxxzMyyz) / (abs(mxxzMyyz) + qudricLimitM); + mxxzMyyz += wadjust * (-mxxzMyyz); + wadjust = OxyyPxzz + (c1 - OxyyPxzz) * abs(mxyyPxzz) / (abs(mxyyPxzz) + qudricLimitP); + mxyyPxzz += wadjust * (-mxyyPxzz); + wadjust = OxyyMxzz + (c1 - OxyyMxzz) * abs(mxyyMxzz) / (abs(mxyyMxzz) + qudricLimitM); + mxyyMxzz += wadjust * (-mxyyMxzz); + ////////////////////////////////////////////////////////////////////////// + // no limiter + //mfbbb += OxyyMxzz * (-mfbbb); + //mxxyPyzz += OxyyPxzz * (-mxxyPyzz); + //mxxyMyzz += OxyyMxzz * (-mxxyMyzz); + //mxxzPyyz += OxyyPxzz * (-mxxzPyyz); + //mxxzMyyz += OxyyMxzz * (-mxxzMyyz); + //mxyyPxzz += OxyyPxzz * (-mxyyPxzz); + //mxyyMxzz += OxyyMxzz * (-mxyyMxzz); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute inverse linear combinations of second and third order cumulants + //! + mfcaa = c1o3 * (mxxMyy + mxxMzz + mxxPyyPzz); + mfaca = c1o3 * (-c2 * mxxMyy + mxxMzz + mxxPyyPzz); + mfaac = c1o3 * (mxxMyy - c2 * mxxMzz + mxxPyyPzz); + + mfcba = (mxxyMyzz + mxxyPyzz) * c1o2; + mfabc = (-mxxyMyzz + mxxyPyzz) * c1o2; + mfcab = (mxxzMyyz + mxxzPyyz) * c1o2; + mfacb = (-mxxzMyyz + mxxzPyyz) * c1o2; + mfbca = (mxyyMxzz + mxyyPxzz) * c1o2; + mfbac = (-mxyyMxzz + mxyyPxzz) * c1o2; + ////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + //4. + // no limiter + //! - Relax fourth order cumulants to modified equilibrium for fourth order convergence of diffusion according to Eq. (43)-(48) + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + CUMacc = -O4 * (c1 / omega - c1o2) * (dyuy + dzuz) * c2o3 * A + (c1 - O4) * (CUMacc); + CUMcac = -O4 * (c1 / omega - c1o2) * (dxux + dzuz) * c2o3 * A + (c1 - O4) * (CUMcac); + CUMcca = -O4 * (c1 / omega - c1o2) * (dyuy + dxux) * c2o3 * A + (c1 - O4) * (CUMcca); + CUMbbc = -O4 * (c1 / omega - c1o2) * Dxy * c1o3 * B + (c1 - O4) * (CUMbbc); + CUMbcb = -O4 * (c1 / omega - c1o2) * Dxz * c1o3 * B + (c1 - O4) * (CUMbcb); + CUMcbb = -O4 * (c1 / omega - c1o2) * Dyz * c1o3 * B + (c1 - O4) * (CUMcbb); + + ////////////////////////////////////////////////////////////////////////// + //5. + CUMbcc += O5 * (-CUMbcc); + CUMcbc += O5 * (-CUMcbc); + CUMccb += O5 * (-CUMccb); + + ////////////////////////////////////////////////////////////////////////// + //6. + CUMccc += O6 * (-CUMccc); + + //////////////////////////////////////////////////////////////////////////////////// + //! - Compute central moments from post collision cumulants according to Eq. (53)-(56) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + + ////////////////////////////////////////////////////////////////////////// + //4. + mfcbb = CUMcbb + c1o3 * ((c3 * mfcaa + c1) * mfabb + c6 * mfbba * mfbab) * OOrho; + mfbcb = CUMbcb + c1o3 * ((c3 * mfaca + c1) * mfbab + c6 * mfbba * mfabb) * OOrho; + mfbbc = CUMbbc + c1o3 * ((c3 * mfaac + c1) * mfbba + c6 * mfbab * mfabb) * OOrho; + + mfcca = CUMcca + (((mfcaa * mfaca + c2 * mfbba * mfbba) * c9 + c3 * (mfcaa + mfaca)) * OOrho - (drho * OOrho)) * c1o9; + mfcac = CUMcac + (((mfcaa * mfaac + c2 * mfbab * mfbab) * c9 + c3 * (mfcaa + mfaac)) * OOrho - (drho * OOrho)) * c1o9; + mfacc = CUMacc + (((mfaac * mfaca + c2 * mfabb * mfabb) * c9 + c3 * (mfaac + mfaca)) * OOrho - (drho * OOrho)) * c1o9; + + ////////////////////////////////////////////////////////////////////////// + //5. + mfbcc = CUMbcc + c1o3 * (c3 * (mfaac * mfbca + mfaca * mfbac + c4 * mfabb * mfbbb + c2 * (mfbab * mfacb + mfbba * mfabc)) + (mfbca + mfbac)) * OOrho; + mfcbc = CUMcbc + c1o3 * (c3 * (mfaac * mfcba + mfcaa * mfabc + c4 * mfbab * mfbbb + c2 * (mfabb * mfcab + mfbba * mfbac)) + (mfcba + mfabc)) * OOrho; + mfccb = CUMccb + c1o3 * (c3 * (mfcaa * mfacb + mfaca * mfcab + c4 * mfbba * mfbbb + c2 * (mfbab * mfbca + mfabb * mfcba)) + (mfacb + mfcab)) * OOrho; + + ////////////////////////////////////////////////////////////////////////// + //6. + mfccc = CUMccc - ((-c4 * mfbbb * mfbbb + - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) + - c4 * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) + - c2 * (mfbca * mfbac + mfcba * mfabc + mfcab * mfacb)) * OOrho + + (c4 * (mfbab * mfbab * mfaca + mfabb * mfabb * mfcaa + mfbba * mfbba * mfaac) + + c2 * (mfcaa * mfaca * mfaac) + + c16 * mfbba * mfbab * mfabb) * OOrho * OOrho + - c1o3 * (mfacc + mfcac + mfcca) * OOrho + - c1o9 * (mfcaa + mfaca + mfaac) * OOrho + + (c2 * (mfbab * mfbab + mfabb * mfabb + mfbba * mfbba) + + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa) + c1o3 * (mfaac + mfaca + mfcaa)) * OOrho * OOrho * c2o3 + + c1o27 * ((drho * drho - drho) * OOrho * OOrho)); + + + //////////////////////////////////////////////////////////////////////////////////// + //! - Add acceleration (body force) to first order cumulants according to Eq. (85)-(87) in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! + mfbaa = -mfbaa; + mfaba = -mfaba; + mfaab = -mfaab; + //////////////////////////////////////////////////////////////////////////////////// + + //////////////////////////////////////////////////////////////////////////////////// + //! - Chimera transform from central moments to well conditioned distributions as defined in Appendix J in + //! <a href="https://doi.org/10.1016/j.camwa.2015.05.001"><b>[ M. Geier et al. (2015), DOI:10.1016/j.camwa.2015.05.001 ]</b></a> + //! see also Eq. (88)-(96) in + //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> + //! + //////////////////////////////////////////////////////////////////////////////////// + // X - Dir + backwardInverseChimeraWithK(mfaaa, mfbaa, mfcaa, vvx, vx2, c1, c1); + backwardChimera(mfaba, mfbba, mfcba, vvx, vx2); + backwardInverseChimeraWithK(mfaca, mfbca, mfcca, vvx, vx2, c3, c1o3); + backwardChimera(mfaab, mfbab, mfcab, vvx, vx2); + backwardChimera(mfabb, mfbbb, mfcbb, vvx, vx2); + backwardChimera(mfacb, mfbcb, mfccb, vvx, vx2); + backwardInverseChimeraWithK(mfaac, mfbac, mfcac, vvx, vx2, c3, c1o3); + backwardChimera(mfabc, mfbbc, mfcbc, vvx, vx2); + backwardInverseChimeraWithK(mfacc, mfbcc, mfccc, vvx, vx2, c9, c1o9); + + //////////////////////////////////////////////////////////////////////////////////// + // Y - Dir + backwardInverseChimeraWithK(mfaaa, mfaba, mfaca, vvy, vy2, c6, c1o6); + backwardChimera(mfaab, mfabb, mfacb, vvy, vy2); + backwardInverseChimeraWithK(mfaac, mfabc, mfacc, vvy, vy2, c18, c1o18); + backwardInverseChimeraWithK(mfbaa, mfbba, mfbca, vvy, vy2, c3o2, c2o3); + backwardChimera(mfbab, mfbbb, mfbcb, vvy, vy2); + backwardInverseChimeraWithK(mfbac, mfbbc, mfbcc, vvy, vy2, c9o2, c2o9); + backwardInverseChimeraWithK(mfcaa, mfcba, mfcca, vvy, vy2, c6, c1o6); + backwardChimera(mfcab, mfcbb, mfccb, vvy, vy2); + backwardInverseChimeraWithK(mfcac, mfcbc, mfccc, vvy, vy2, c18, c1o18); + + //////////////////////////////////////////////////////////////////////////////////// + // Z - Dir + backwardInverseChimeraWithK(mfaaa, mfaab, mfaac, vvz, vz2, c36, c1o36); + backwardInverseChimeraWithK(mfaba, mfabb, mfabc, vvz, vz2, c9, c1o9); + backwardInverseChimeraWithK(mfaca, mfacb, mfacc, vvz, vz2, c36, c1o36); + backwardInverseChimeraWithK(mfbaa, mfbab, mfbac, vvz, vz2, c9, c1o9); + backwardInverseChimeraWithK(mfbba, mfbbb, mfbbc, vvz, vz2, c9o4, c4o9); + backwardInverseChimeraWithK(mfbca, mfbcb, mfbcc, vvz, vz2, c9, c1o9); + backwardInverseChimeraWithK(mfcaa, mfcab, mfcac, vvz, vz2, c36, c1o36); + backwardInverseChimeraWithK(mfcba, mfcbb, mfcbc, vvz, vz2, c9, c1o9); + backwardInverseChimeraWithK(mfcca, mfccb, mfccc, vvz, vz2, c36, c1o36); + //////////////////////////////////////////////////////////////////////////////////// + + ////////////////////////////////////////////////////////////////////////// + //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 = drho - drho_post; + 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 = drho - drho_post; #ifdef SINGLEPRECISION - if (dif > 10.0E-7 || dif < -10.0E-7) + if (dif > 10.0E-7 || dif < -10.0E-7) #else - if (dif > 10.0E-15 || dif < -10.0E-15) + 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))); - } + { + 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 distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm - //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a> - //! - (*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->restDistributions)(x1, x2, x3) = mfbbb; - ////////////////////////////////////////////////////////////////////////// - + //////////////////////////////////////////////////////////////////////////////////// + //! - Write distributions: style of reading and writing the distributions from/to stored arrays dependent on timestep is based on the esoteric twist algorithm + //! <a href="https://doi.org/10.3390/computation5020019"><b>[ M. Geier et al. (2017), DOI:10.3390/computation5020019 ]</b></a> + //! + (*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->restDistributions)(x1, x2, x3) = mfbbb; + ////////////////////////////////////////////////////////////////////////// + + } } - } - } - } + } + } } ////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h index 4444213c046873bd3dca44525f85d1be69b12fa1..10cfd49264bb829eac1fc6b9bedeee3b6eace265 100644 --- a/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h +++ b/src/cpu/VirtualFluidsCore/LBM/CumulantK17LBMKernel.h @@ -1,28 +1,28 @@ //======================================================================================= -// ____ ____ __ ______ __________ __ __ __ __ -// \ \ | | | | | _ \ |___ ___| | | | | / \ | | -// \ \ | | | | | |_) | | | | | | | / \ | | -// \ \ | | | | | _ / | | | | | | / /\ \ | | -// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ -// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| -// \ \ | | ________________________________________________________________ -// \ \ | | | ______________________________________________________________| -// \ \| | | | __ __ __ __ ______ _______ -// \ | | |_____ | | | | | | | | | _ \ / _____) -// \ | | _____| | | | | | | | | | | \ \ \_______ +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ // \ | | | | |_____ | \_/ | | | | |_/ / _____ | -// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ // -// This file is part of VirtualFluids. VirtualFluids is free software: you can +// 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 +// 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 +// +// 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/>. // @@ -41,41 +41,41 @@ #include "basics/container/CbArray4D.h" #include "basics/container/CbArray3D.h" -//! \brief Compressible cumulant LBM kernel. +//! \brief Compressible cumulant LBM kernel. //! \details LBM implementation that use Cascaded Cumulant Lattice Boltzmann method for D3Q27 model //! //! The model is publisched in //! <a href="http://dx.doi.org/10.1016/j.jcp.2017.05.040"><b>[ Geier et al., (2017), 10.1016/j.jcp.2017.05.040]</b></a>, -//! <a href="http://dx.doi.org/10.1016/j.jcp.2017.07.004"><b>[ Geier et al., (2017), 10.1016/j.jcp.2017.07.004]</b></a> -//! +//! <a href="http://dx.doi.org/10.1016/j.jcp.2017.07.004"><b>[ Geier et al., (2017), 10.1016/j.jcp.2017.07.004]</b></a> +//! class CumulantK17LBMKernel : public LBMKernel { public: - CumulantK17LBMKernel(); - ~CumulantK17LBMKernel() override; - void calculate(int step) override; - SPtr<LBMKernel> clone() override; - double getCalculationTime() override { return .0; } + CumulantK17LBMKernel(); + ~CumulantK17LBMKernel() = default; + void calculate(int step) override; + SPtr<LBMKernel> clone() override; + double getCalculationTime() override { return .0; } protected: - inline void forwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K); - inline void backwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K); - inline void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); - inline void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + inline void forwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K); + inline void backwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K); + inline void forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); + inline void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); - virtual void initDataSet(); - LBMReal f[D3Q27System::ENDF + 1]; + virtual void initDataSet(); + LBMReal f[D3Q27System::ENDF + 1]; - CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions; - CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions; - CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr restDistributions; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr restDistributions; - mu::value_type muX1, muX2, muX3; - mu::value_type muDeltaT; - mu::value_type muNu; - LBMReal forcingX1; - LBMReal forcingX2; - LBMReal forcingX3; + mu::value_type muX1, muX2, muX3; + mu::value_type muDeltaT; + mu::value_type muNu; + LBMReal forcingX1; + LBMReal forcingX2; + LBMReal forcingX3; }; //////////////////////////////////////////////////////////////////////////////// @@ -86,30 +86,30 @@ protected: //////////////////////////////////////////////////////////////////////////////// inline void CumulantK17LBMKernel::forwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K) { - using namespace UbMath; - LBMReal m2 = mfa + mfc; - LBMReal m1 = mfc - mfa; - LBMReal m0 = m2 + mfb; - mfa = m0; - m0 *= Kinverse; - m0 += c1; - mfb = (m1 * Kinverse - m0 * vv) * K; - mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K; + using namespace UbMath; + LBMReal m2 = mfa + mfc; + LBMReal m1 = mfc - mfa; + LBMReal m0 = m2 + mfb; + mfa = m0; + m0 *= Kinverse; + m0 += c1; + mfb = (m1 * Kinverse - m0 * vv) * K; + mfc = ((m2 - c2 * m1 * vv) * Kinverse + v2 * m0) * K; } //////////////////////////////////////////////////////////////////////////////// -//! \brief backward chimera transformation \ref backwardInverseChimeraWithK +//! \brief backward chimera transformation \ref backwardInverseChimeraWithK //! Transformation from central moments to distributions according to Eq. (57)-(65) in //! <a href="https://doi.org/10.1016/j.jcp.2017.05.040"><b>[ M. Geier et al. (2017), DOI:10.1016/j.jcp.2017.05.040 ]</b></a> -//! Modified for lower round-off errors. +//! ] Modified for lower round-off errors. //////////////////////////////////////////////////////////////////////////////// inline void CumulantK17LBMKernel::backwardInverseChimeraWithK(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2, LBMReal Kinverse, LBMReal K) { - using namespace UbMath; - LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (v2 - vv) * c1o2) * K; - LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (-v2)) * K; - mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (v2 + vv) * c1o2) * K; - mfa = m0; - mfb = m1; + using namespace UbMath; + LBMReal m0 = (((mfc - mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (v2 - vv) * c1o2) * K; + LBMReal m1 = (((mfa - mfc) - c2 * mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (-v2)) * K; + mfc = (((mfc + mfb) * c1o2 + mfb * vv) * Kinverse + (mfa * Kinverse + c1) * (v2 + vv) * c1o2) * K; + mfa = m0; + mfb = m1; } //////////////////////////////////////////////////////////////////////////////// //! \brief forward chimera transformation \ref forwardChimera @@ -120,12 +120,12 @@ inline void CumulantK17LBMKernel::backwardInverseChimeraWithK(LBMReal& mfa, LBMR //////////////////////////////////////////////////////////////////////////////// inline void CumulantK17LBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { - using namespace UbMath; - LBMReal m1 = (mfa + mfc) + mfb; - LBMReal m2 = mfc - mfa; - mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2); - mfb = m2 - vv * m1; - mfa = m1; + using namespace UbMath; + LBMReal m1 = (mfa + mfc) + mfb; + LBMReal m2 = mfc - mfa; + mfc = (mfc + mfa) + (v2 * m1 - c2 * vv * m2); + mfb = m2 - vv * m1; + mfa = m1; } //////////////////////////////////////////////////////////////////////////////// //! \brief backward chimera transformation \ref backwardChimera @@ -136,12 +136,12 @@ inline void CumulantK17LBMKernel::forwardChimera(LBMReal& mfa, LBMReal& mfb, LBM //////////////////////////////////////////////////////////////////////////////// inline void CumulantK17LBMKernel::backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2) { - using namespace UbMath; - LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2); - LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv; - mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2); - mfb = mb; - mfa = ma; + using namespace UbMath; + LBMReal ma = (mfc + mfa * (v2 - vv)) * c1o2 + mfb * (vv - c1o2); + LBMReal mb = ((mfa - mfc) - mfa * v2) - c2 * mfb * vv; + mfc = (mfc + mfa * (v2 + vv)) * c1o2 + mfb * (vv + c1o2); + mfb = mb; + mfa = ma; } #endif // CumulantK17LBMKernel_h__ \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h index 7cd494823ca9d5335a3029609f5c3a83fd60b523..7b3e1e4ccbab55ba088bc8d6b3c4d62f56a6cc03 100644 --- a/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h +++ b/src/cpu/VirtualFluidsCore/LBM/D3Q27System.h @@ -38,21 +38,13 @@ #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" - + /*=========================================================================*/ /* D3Q27System */ /* */ @@ -61,1052 +53,1052 @@ 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: ... */ - 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 +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); - ///*=====================================================================*/ + ///*=====================================================================*/ + //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; + ///*=====================================================================*/ + //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; + // 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; + // 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"); + // } + //} + //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"); - // } - //} + // default: throw UbException(UB_EXARGS,"unknown model"); + // } + //} - ////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////// - //DIRECTION STUFF - static const int FSTARTDIR = 0; - static const int FENDDIR = 25; //D3Q27 + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //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 FSTARTDIR = 1; + //static const int FENDDIR = 26; //D3Q27 - static const int STARTF = 0; - static const int ENDF = 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]; + //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 + 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 int DX1[ENDDIR + 1]; + extern const int DX2[ENDDIR + 1]; + extern const int DX3[ENDDIR + 1]; + extern const double WEIGTH[ENDDIR + 1]; - //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 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 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; + 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]; + 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 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; - ////////////////////////////////////////////////////////////////////////// - //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(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]; + ////////////////////////////////////////////////////////////////////////// + //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(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 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::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); + /*=====================================================================*/ + 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::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( UbMath::c8o27*rho*(1.0-cu_sq)); - // case E : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*( vx1 )+UbMath::c9o2*( vx1 )*( vx1 )-cu_sq)); - // case W : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*(-vx1 )+UbMath::c9o2*(-vx1 )*(-vx1 )-cu_sq)); - // case N : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*( vx2)+UbMath::c9o2*( vx2)*( vx2)-cu_sq)); - // case S : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*( -vx2)+UbMath::c9o2*( -vx2)*( -vx2)-cu_sq)); - // case T : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*( vx3 )+UbMath::c9o2*( vx3)*( vx3)-cu_sq)); - // case B : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*( -vx3)+UbMath::c9o2*( -vx3)*( -vx3)-cu_sq)); - // case NE : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx1+vx2)+UbMath::c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq)); - // case SW : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx1-vx2)+UbMath::c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq)); - // case SE : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx1-vx2)+UbMath::c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq)); - // case NW : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx1+vx2)+UbMath::c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq)); - // case TE : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx1+vx3)+UbMath::c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq)); - // case BW : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx1-vx3)+UbMath::c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq)); - // case BE : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx1-vx3)+UbMath::c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq)); - // case TW : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx1+vx3)+UbMath::c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq)); - // case TN : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx2+vx3)+UbMath::c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq)); - // case BS : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx2-vx3)+UbMath::c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq)); - // case BN : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx2-vx3)+UbMath::c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq)); - // case TS : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx2+vx3)+UbMath::c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq)); - // case TNE : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*( vx1+vx2+vx3)+UbMath::c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq)); - // case BSW : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*(-vx1-vx2-vx3)+UbMath::c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq)); - // case BNE : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*( vx1+vx2-vx3)+UbMath::c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq)); - // case TSW : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*(-vx1-vx2+vx3)+UbMath::c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq)); - // case TSE : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*( vx1-vx2+vx3)+UbMath::c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq)); - // case BNW : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*(-vx1+vx2-vx3)+UbMath::c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq)); - // case BSE : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*( vx1-vx2-vx3)+UbMath::c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq)); - // case TNW : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*(-vx1+vx2+vx3)+UbMath::c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq)); - // default: throw UbException(UB_EXARGS,"unknown dir"); - //} + //switch(direction) + //{ + // case ZERO : return REAL_CAST( UbMath::c8o27*rho*(1.0-cu_sq)); + // case E : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*( vx1 )+UbMath::c9o2*( vx1 )*( vx1 )-cu_sq)); + // case W : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*(-vx1 )+UbMath::c9o2*(-vx1 )*(-vx1 )-cu_sq)); + // case N : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*( vx2)+UbMath::c9o2*( vx2)*( vx2)-cu_sq)); + // case S : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*( -vx2)+UbMath::c9o2*( -vx2)*( -vx2)-cu_sq)); + // case T : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*( vx3 )+UbMath::c9o2*( vx3)*( vx3)-cu_sq)); + // case B : return REAL_CAST( UbMath::c2o27*rho*(1.0+3.0*( -vx3)+UbMath::c9o2*( -vx3)*( -vx3)-cu_sq)); + // case NE : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx1+vx2)+UbMath::c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq)); + // case SW : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx1-vx2)+UbMath::c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq)); + // case SE : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx1-vx2)+UbMath::c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq)); + // case NW : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx1+vx2)+UbMath::c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq)); + // case TE : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx1+vx3)+UbMath::c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq)); + // case BW : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx1-vx3)+UbMath::c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq)); + // case BE : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx1-vx3)+UbMath::c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq)); + // case TW : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx1+vx3)+UbMath::c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq)); + // case TN : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx2+vx3)+UbMath::c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq)); + // case BS : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx2-vx3)+UbMath::c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq)); + // case BN : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*( vx2-vx3)+UbMath::c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq)); + // case TS : return REAL_CAST( UbMath::c1o54*rho*(1.0+3.0*(-vx2+vx3)+UbMath::c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq)); + // case TNE : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*( vx1+vx2+vx3)+UbMath::c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq)); + // case BSW : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*(-vx1-vx2-vx3)+UbMath::c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq)); + // case BNE : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*( vx1+vx2-vx3)+UbMath::c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq)); + // case TSW : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*(-vx1-vx2+vx3)+UbMath::c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq)); + // case TSE : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*( vx1-vx2+vx3)+UbMath::c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq)); + // case BNW : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*(-vx1+vx2-vx3)+UbMath::c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq)); + // case BSE : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*( vx1-vx2-vx3)+UbMath::c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq)); + // case TNW : return REAL_CAST(UbMath::c1o216*rho*(1.0+3.0*(-vx1+vx2+vx3)+UbMath::c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq)); + // default: throw UbException(UB_EXARGS,"unknown dir"); + //} - ////----- - LBMReal rho = drho + UbMath::one; - switch (direction) - { - case ZERO: return REAL_CAST(UbMath::c8o27 * (drho + rho * (-cu_sq))); - case E: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx1)+UbMath::c9o2 * (vx1) * (vx1)-cu_sq))); - case W: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq))); - case N: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx2)+UbMath::c9o2 * (vx2) * (vx2)-cu_sq))); - case S: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq))); - case T: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx3)+UbMath::c9o2 * (vx3) * (vx3)-cu_sq))); - case B: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq))); - case NE: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq))); - case SW: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq))); - case SE: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq))); - case NW: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq))); - case TE: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq))); - case BW: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq))); - case BE: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq))); - case TW: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq))); - case TN: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq))); - case BS: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq))); - case BN: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq))); - case TS: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq))); - case TNE: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq))); - case BSW: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq))); - case BNE: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq))); - case TSW: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq))); - case TSE: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq))); - case BNW: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq))); - case BSE: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq))); - case TNW: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + UbMath::c9o2 * (-vx1 + vx2 + vx3) * (-vx1 + vx2 + vx3) - cu_sq))); - default: throw UbException(UB_EXARGS, "unknown dir"); - } + ////----- + LBMReal rho = drho + UbMath::one; + switch (direction) + { + case ZERO: return REAL_CAST(UbMath::c8o27 * (drho + rho * (-cu_sq))); + case E: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx1)+UbMath::c9o2 * (vx1) * (vx1)-cu_sq))); + case W: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq))); + case N: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx2)+UbMath::c9o2 * (vx2) * (vx2)-cu_sq))); + case S: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq))); + case T: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (vx3)+UbMath::c9o2 * (vx3) * (vx3)-cu_sq))); + case B: return REAL_CAST(UbMath::c2o27 * (drho + rho * (3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq))); + case NE: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq))); + case SW: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq))); + case SE: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq))); + case NW: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq))); + case TE: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq))); + case BW: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq))); + case BE: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq))); + case TW: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq))); + case TN: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq))); + case BS: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq))); + case BN: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq))); + case TS: return REAL_CAST(UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq))); + case TNE: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq))); + case BSW: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq))); + case BNE: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq))); + case TSW: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq))); + case TSE: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq))); + case BNW: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq))); + case BSE: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq))); + case TNW: return REAL_CAST(UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + UbMath::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); + } + ////////////////////////////////////////////////////////////////////////// + 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] = UbMath::c8o27*rho*(1.0-cu_sq); - //feq[E] = UbMath::c2o27*rho*(1.0+3.0*( vx1 )+UbMath::c9o2*( vx1 )*( vx1 )-cu_sq); - //feq[W] = UbMath::c2o27*rho*(1.0+3.0*(-vx1 )+UbMath::c9o2*(-vx1 )*(-vx1 )-cu_sq); - //feq[N] = UbMath::c2o27*rho*(1.0+3.0*( vx2)+UbMath::c9o2*( vx2)*( vx2)-cu_sq); - //feq[S] = UbMath::c2o27*rho*(1.0+3.0*( -vx2)+UbMath::c9o2*( -vx2)*( -vx2)-cu_sq); - //feq[T] = UbMath::c2o27*rho*(1.0+3.0*( vx3 )+UbMath::c9o2*( vx3)*( vx3)-cu_sq); - //feq[B] = UbMath::c2o27*rho*(1.0+3.0*( -vx3)+UbMath::c9o2*( -vx3)*( -vx3)-cu_sq); - //feq[NE] = UbMath::c1o54*rho*(1.0+3.0*( vx1+vx2)+UbMath::c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq); - //feq[SW] = UbMath::c1o54*rho*(1.0+3.0*(-vx1-vx2)+UbMath::c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq); - //feq[SE] = UbMath::c1o54*rho*(1.0+3.0*( vx1-vx2)+UbMath::c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq); - //feq[NW] = UbMath::c1o54*rho*(1.0+3.0*(-vx1+vx2)+UbMath::c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq); - //feq[TE] = UbMath::c1o54*rho*(1.0+3.0*( vx1+vx3)+UbMath::c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq); - //feq[BW] = UbMath::c1o54*rho*(1.0+3.0*(-vx1-vx3)+UbMath::c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq); - //feq[BE] = UbMath::c1o54*rho*(1.0+3.0*( vx1-vx3)+UbMath::c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq); - //feq[TW] = UbMath::c1o54*rho*(1.0+3.0*(-vx1+vx3)+UbMath::c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq); - //feq[TN] = UbMath::c1o54*rho*(1.0+3.0*( vx2+vx3)+UbMath::c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq); - //feq[BS] = UbMath::c1o54*rho*(1.0+3.0*(-vx2-vx3)+UbMath::c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq); - //feq[BN] = UbMath::c1o54*rho*(1.0+3.0*( vx2-vx3)+UbMath::c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq); - //feq[TS] = UbMath::c1o54*rho*(1.0+3.0*(-vx2+vx3)+UbMath::c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq); - //feq[TNE] = UbMath::c1o216*rho*(1.0+3.0*( vx1+vx2+vx3)+UbMath::c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); - //feq[BSW] = UbMath::c1o216*rho*(1.0+3.0*(-vx1-vx2-vx3)+UbMath::c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); - //feq[BNE] = UbMath::c1o216*rho*(1.0+3.0*( vx1+vx2-vx3)+UbMath::c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); - //feq[TSW] = UbMath::c1o216*rho*(1.0+3.0*(-vx1-vx2+vx3)+UbMath::c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); - //feq[TSE] = UbMath::c1o216*rho*(1.0+3.0*( vx1-vx2+vx3)+UbMath::c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); - //feq[BNW] = UbMath::c1o216*rho*(1.0+3.0*(-vx1+vx2-vx3)+UbMath::c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); - //feq[BSE] = UbMath::c1o216*rho*(1.0+3.0*( vx1-vx2-vx3)+UbMath::c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); - //feq[TNW] = UbMath::c1o216*rho*(1.0+3.0*(-vx1+vx2+vx3)+UbMath::c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); + //feq[ZERO] = UbMath::c8o27*rho*(1.0-cu_sq); + //feq[E] = UbMath::c2o27*rho*(1.0+3.0*( vx1 )+UbMath::c9o2*( vx1 )*( vx1 )-cu_sq); + //feq[W] = UbMath::c2o27*rho*(1.0+3.0*(-vx1 )+UbMath::c9o2*(-vx1 )*(-vx1 )-cu_sq); + //feq[N] = UbMath::c2o27*rho*(1.0+3.0*( vx2)+UbMath::c9o2*( vx2)*( vx2)-cu_sq); + //feq[S] = UbMath::c2o27*rho*(1.0+3.0*( -vx2)+UbMath::c9o2*( -vx2)*( -vx2)-cu_sq); + //feq[T] = UbMath::c2o27*rho*(1.0+3.0*( vx3 )+UbMath::c9o2*( vx3)*( vx3)-cu_sq); + //feq[B] = UbMath::c2o27*rho*(1.0+3.0*( -vx3)+UbMath::c9o2*( -vx3)*( -vx3)-cu_sq); + //feq[NE] = UbMath::c1o54*rho*(1.0+3.0*( vx1+vx2)+UbMath::c9o2*( vx1+vx2)*( vx1+vx2)-cu_sq); + //feq[SW] = UbMath::c1o54*rho*(1.0+3.0*(-vx1-vx2)+UbMath::c9o2*(-vx1-vx2)*(-vx1-vx2)-cu_sq); + //feq[SE] = UbMath::c1o54*rho*(1.0+3.0*( vx1-vx2)+UbMath::c9o2*( vx1-vx2)*( vx1-vx2)-cu_sq); + //feq[NW] = UbMath::c1o54*rho*(1.0+3.0*(-vx1+vx2)+UbMath::c9o2*(-vx1+vx2)*(-vx1+vx2)-cu_sq); + //feq[TE] = UbMath::c1o54*rho*(1.0+3.0*( vx1+vx3)+UbMath::c9o2*( vx1+vx3)*( vx1+vx3)-cu_sq); + //feq[BW] = UbMath::c1o54*rho*(1.0+3.0*(-vx1-vx3)+UbMath::c9o2*(-vx1-vx3)*(-vx1-vx3)-cu_sq); + //feq[BE] = UbMath::c1o54*rho*(1.0+3.0*( vx1-vx3)+UbMath::c9o2*( vx1-vx3)*( vx1-vx3)-cu_sq); + //feq[TW] = UbMath::c1o54*rho*(1.0+3.0*(-vx1+vx3)+UbMath::c9o2*(-vx1+vx3)*(-vx1+vx3)-cu_sq); + //feq[TN] = UbMath::c1o54*rho*(1.0+3.0*( vx2+vx3)+UbMath::c9o2*( vx2+vx3)*( vx2+vx3)-cu_sq); + //feq[BS] = UbMath::c1o54*rho*(1.0+3.0*(-vx2-vx3)+UbMath::c9o2*(-vx2-vx3)*(-vx2-vx3)-cu_sq); + //feq[BN] = UbMath::c1o54*rho*(1.0+3.0*( vx2-vx3)+UbMath::c9o2*( vx2-vx3)*( vx2-vx3)-cu_sq); + //feq[TS] = UbMath::c1o54*rho*(1.0+3.0*(-vx2+vx3)+UbMath::c9o2*(-vx2+vx3)*(-vx2+vx3)-cu_sq); + //feq[TNE] = UbMath::c1o216*rho*(1.0+3.0*( vx1+vx2+vx3)+UbMath::c9o2*( vx1+vx2+vx3)*( vx1+vx2+vx3)-cu_sq); + //feq[BSW] = UbMath::c1o216*rho*(1.0+3.0*(-vx1-vx2-vx3)+UbMath::c9o2*(-vx1-vx2-vx3)*(-vx1-vx2-vx3)-cu_sq); + //feq[BNE] = UbMath::c1o216*rho*(1.0+3.0*( vx1+vx2-vx3)+UbMath::c9o2*( vx1+vx2-vx3)*( vx1+vx2-vx3)-cu_sq); + //feq[TSW] = UbMath::c1o216*rho*(1.0+3.0*(-vx1-vx2+vx3)+UbMath::c9o2*(-vx1-vx2+vx3)*(-vx1-vx2+vx3)-cu_sq); + //feq[TSE] = UbMath::c1o216*rho*(1.0+3.0*( vx1-vx2+vx3)+UbMath::c9o2*( vx1-vx2+vx3)*( vx1-vx2+vx3)-cu_sq); + //feq[BNW] = UbMath::c1o216*rho*(1.0+3.0*(-vx1+vx2-vx3)+UbMath::c9o2*(-vx1+vx2-vx3)*(-vx1+vx2-vx3)-cu_sq); + //feq[BSE] = UbMath::c1o216*rho*(1.0+3.0*( vx1-vx2-vx3)+UbMath::c9o2*( vx1-vx2-vx3)*( vx1-vx2-vx3)-cu_sq); + //feq[TNW] = UbMath::c1o216*rho*(1.0+3.0*(-vx1+vx2+vx3)+UbMath::c9o2*(-vx1+vx2+vx3)*(-vx1+vx2+vx3)-cu_sq); - ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// - LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); - LBMReal rho = drho + UbMath::one; + LBMReal cu_sq = 1.5 * (vx1 * vx1 + vx2 * vx2 + vx3 * vx3); + LBMReal rho = drho + UbMath::one; - feq[ZERO] = UbMath::c8o27 * (drho + rho * (-cu_sq)); - feq[E] = UbMath::c2o27 * (drho + rho * (3.0 * (vx1)+UbMath::c9o2 * (vx1) * (vx1)-cu_sq)); - feq[W] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq)); - feq[N] = UbMath::c2o27 * (drho + rho * (3.0 * (vx2)+UbMath::c9o2 * (vx2) * (vx2)-cu_sq)); - feq[S] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq)); - feq[T] = UbMath::c2o27 * (drho + rho * (3.0 * (vx3)+UbMath::c9o2 * (vx3) * (vx3)-cu_sq)); - feq[B] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq)); - feq[NE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); - feq[SW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); - feq[SE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); - feq[NW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); - feq[TE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); - feq[BW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); - feq[BE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); - feq[TW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); - feq[TN] = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); - feq[BS] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); - feq[BN] = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); - feq[TS] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); - feq[TNE] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); - feq[BSW] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); - feq[BNE] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); - feq[TSW] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); - feq[TSE] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); - feq[BNW] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); - feq[BSE] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); - feq[TNW] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + UbMath::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); + feq[ZERO] = UbMath::c8o27 * (drho + rho * (-cu_sq)); + feq[E] = UbMath::c2o27 * (drho + rho * (3.0 * (vx1)+UbMath::c9o2 * (vx1) * (vx1)-cu_sq)); + feq[W] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq)); + feq[N] = UbMath::c2o27 * (drho + rho * (3.0 * (vx2)+UbMath::c9o2 * (vx2) * (vx2)-cu_sq)); + feq[S] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq)); + feq[T] = UbMath::c2o27 * (drho + rho * (3.0 * (vx3)+UbMath::c9o2 * (vx3) * (vx3)-cu_sq)); + feq[B] = UbMath::c2o27 * (drho + rho * (3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq)); + feq[NE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); + feq[SW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); + feq[SE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); + feq[NW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); + feq[TE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); + feq[BW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); + feq[BE] = UbMath::c1o54 * (drho + rho * (3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); + feq[TW] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); + feq[TN] = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); + feq[BS] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); + feq[BN] = UbMath::c1o54 * (drho + rho * (3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); + feq[TS] = UbMath::c1o54 * (drho + rho * (3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); + feq[TNE] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); + feq[BSW] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); + feq[BNE] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); + feq[TSW] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); + feq[TSE] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); + feq[BNW] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); + feq[BSE] = UbMath::c1o216 * (drho + rho * (3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); + feq[TNW] = UbMath::c1o216 * (drho + rho * (3.0 * (-vx1 + vx2 + vx3) + UbMath::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(UbMath::c8o27 * (drho - cu_sq)); - case E: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx1)+UbMath::c9o2 * (vx1) * (vx1)-cu_sq)); - case W: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq)); - case N: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx2)+UbMath::c9o2 * (vx2) * (vx2)-cu_sq)); - case S: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq)); - case T: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx3)+UbMath::c9o2 * (vx3) * (vx3)-cu_sq)); - case B: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq)); - case NE: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); - case SW: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); - case SE: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); - case NW: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); - case TE: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); - case BW: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); - case BE: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); - case TW: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); - case TN: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); - case BS: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); - case BN: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); - case TS: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); - case TNE: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); - case BSW: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); - case BNE: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); - case TSW: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); - case TSE: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); - case BNW: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); - case BSE: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); - case TNW: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + UbMath::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); + switch (direction) + { + case ZERO: return REAL_CAST(UbMath::c8o27 * (drho - cu_sq)); + case E: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx1)+UbMath::c9o2 * (vx1) * (vx1)-cu_sq)); + case W: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq)); + case N: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx2)+UbMath::c9o2 * (vx2) * (vx2)-cu_sq)); + case S: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq)); + case T: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (vx3)+UbMath::c9o2 * (vx3) * (vx3)-cu_sq)); + case B: return REAL_CAST(UbMath::c2o27 * (drho + 3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq)); + case NE: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq)); + case SW: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq)); + case SE: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq)); + case NW: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq)); + case TE: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq)); + case BW: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq)); + case BE: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq)); + case TW: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq)); + case TN: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq)); + case BS: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq)); + case BN: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq)); + case TS: return REAL_CAST(UbMath::c1o54 * (drho + 3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq)); + case TNE: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq)); + case BSW: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq)); + case BNE: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq)); + case TSW: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq)); + case TSE: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq)); + case BNW: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq)); + case BSE: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq)); + case TNW: return REAL_CAST(UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + UbMath::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] = UbMath::c8o27 * (drho - cu_sq); - feq[E] = UbMath::c2o27 * (drho + 3.0 * (vx1)+UbMath::c9o2 * (vx1) * (vx1)-cu_sq); - feq[W] = UbMath::c2o27 * (drho + 3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq); - feq[N] = UbMath::c2o27 * (drho + 3.0 * (vx2)+UbMath::c9o2 * (vx2) * (vx2)-cu_sq); - feq[S] = UbMath::c2o27 * (drho + 3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq); - feq[T] = UbMath::c2o27 * (drho + 3.0 * (vx3)+UbMath::c9o2 * (vx3) * (vx3)-cu_sq); - feq[B] = UbMath::c2o27 * (drho + 3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq); - feq[NE] = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq); - feq[SW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq); - feq[SE] = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq); - feq[NW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq); - feq[TE] = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq); - feq[BW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq); - feq[BE] = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq); - feq[TW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq); - feq[TN] = UbMath::c1o54 * (drho + 3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq); - feq[BS] = UbMath::c1o54 * (drho + 3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq); - feq[BN] = UbMath::c1o54 * (drho + 3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq); - feq[TS] = UbMath::c1o54 * (drho + 3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq); - feq[TNE] = UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq); - feq[BSW] = UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq); - feq[BNE] = UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq); - feq[TSW] = UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq); - feq[TSE] = UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq); - feq[BNW] = UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq); - feq[BSE] = UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq); - feq[TNW] = UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + UbMath::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) - { + feq[ZERO] = UbMath::c8o27 * (drho - cu_sq); + feq[E] = UbMath::c2o27 * (drho + 3.0 * (vx1)+UbMath::c9o2 * (vx1) * (vx1)-cu_sq); + feq[W] = UbMath::c2o27 * (drho + 3.0 * (-vx1) + UbMath::c9o2 * (-vx1) * (-vx1) - cu_sq); + feq[N] = UbMath::c2o27 * (drho + 3.0 * (vx2)+UbMath::c9o2 * (vx2) * (vx2)-cu_sq); + feq[S] = UbMath::c2o27 * (drho + 3.0 * (-vx2) + UbMath::c9o2 * (-vx2) * (-vx2) - cu_sq); + feq[T] = UbMath::c2o27 * (drho + 3.0 * (vx3)+UbMath::c9o2 * (vx3) * (vx3)-cu_sq); + feq[B] = UbMath::c2o27 * (drho + 3.0 * (-vx3) + UbMath::c9o2 * (-vx3) * (-vx3) - cu_sq); + feq[NE] = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx2) + UbMath::c9o2 * (vx1 + vx2) * (vx1 + vx2) - cu_sq); + feq[SW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx2) + UbMath::c9o2 * (-vx1 - vx2) * (-vx1 - vx2) - cu_sq); + feq[SE] = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx2) + UbMath::c9o2 * (vx1 - vx2) * (vx1 - vx2) - cu_sq); + feq[NW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx2) + UbMath::c9o2 * (-vx1 + vx2) * (-vx1 + vx2) - cu_sq); + feq[TE] = UbMath::c1o54 * (drho + 3.0 * (vx1 + vx3) + UbMath::c9o2 * (vx1 + vx3) * (vx1 + vx3) - cu_sq); + feq[BW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 - vx3) + UbMath::c9o2 * (-vx1 - vx3) * (-vx1 - vx3) - cu_sq); + feq[BE] = UbMath::c1o54 * (drho + 3.0 * (vx1 - vx3) + UbMath::c9o2 * (vx1 - vx3) * (vx1 - vx3) - cu_sq); + feq[TW] = UbMath::c1o54 * (drho + 3.0 * (-vx1 + vx3) + UbMath::c9o2 * (-vx1 + vx3) * (-vx1 + vx3) - cu_sq); + feq[TN] = UbMath::c1o54 * (drho + 3.0 * (vx2 + vx3) + UbMath::c9o2 * (vx2 + vx3) * (vx2 + vx3) - cu_sq); + feq[BS] = UbMath::c1o54 * (drho + 3.0 * (-vx2 - vx3) + UbMath::c9o2 * (-vx2 - vx3) * (-vx2 - vx3) - cu_sq); + feq[BN] = UbMath::c1o54 * (drho + 3.0 * (vx2 - vx3) + UbMath::c9o2 * (vx2 - vx3) * (vx2 - vx3) - cu_sq); + feq[TS] = UbMath::c1o54 * (drho + 3.0 * (-vx2 + vx3) + UbMath::c9o2 * (-vx2 + vx3) * (-vx2 + vx3) - cu_sq); + feq[TNE] = UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 + vx3) + UbMath::c9o2 * (vx1 + vx2 + vx3) * (vx1 + vx2 + vx3) - cu_sq); + feq[BSW] = UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 - vx3) + UbMath::c9o2 * (-vx1 - vx2 - vx3) * (-vx1 - vx2 - vx3) - cu_sq); + feq[BNE] = UbMath::c1o216 * (drho + 3.0 * (vx1 + vx2 - vx3) + UbMath::c9o2 * (vx1 + vx2 - vx3) * (vx1 + vx2 - vx3) - cu_sq); + feq[TSW] = UbMath::c1o216 * (drho + 3.0 * (-vx1 - vx2 + vx3) + UbMath::c9o2 * (-vx1 - vx2 + vx3) * (-vx1 - vx2 + vx3) - cu_sq); + feq[TSE] = UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 + vx3) + UbMath::c9o2 * (vx1 - vx2 + vx3) * (vx1 - vx2 + vx3) - cu_sq); + feq[BNW] = UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 - vx3) + UbMath::c9o2 * (-vx1 + vx2 - vx3) * (-vx1 + vx2 - vx3) - cu_sq); + feq[BSE] = UbMath::c1o216 * (drho + 3.0 * (vx1 - vx2 - vx3) + UbMath::c9o2 * (vx1 - vx2 - vx3) * (vx1 - vx2 - vx3) - cu_sq); + feq[TNW] = UbMath::c1o216 * (drho + 3.0 * (-vx1 + vx2 + vx3) + UbMath::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: - for (int dir = STARTDIR; dir < ENDDIR; ++dir) - ex[dir] = DX1[dir]; - break; - case 2: - for (int dir = STARTDIR; dir < ENDDIR; ++dir) - ex[dir] = DX2[dir]; - break; - case 3: - for (int dir = STARTDIR; dir < ENDDIR; ++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); + 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]; + break; + case 2: + for (int dir = STARTDIR; dir < ENDDIR; ++dir) + ex[dir] = DX2[dir]; + break; + case 3: + for (int dir = STARTDIR; dir < ENDDIR; ++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); - distNeigh[E] = distNeigh[W] = distNeigh[N] = deltaX1; - distNeigh[S] = distNeigh[T] = distNeigh[B] = deltaX1; - distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = UbMath::sqrt2 * deltaX1; - distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = UbMath::sqrt2 * deltaX1; - distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = UbMath::sqrt2 * deltaX1; - distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = UbMath::sqrt3 * deltaX1; - distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = UbMath::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) - { - 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)) * UbMath::c1o3; + distNeigh[E] = distNeigh[W] = distNeigh[N] = deltaX1; + distNeigh[S] = distNeigh[T] = distNeigh[B] = deltaX1; + distNeigh[NE] = distNeigh[NW] = distNeigh[SW] = distNeigh[SE] = UbMath::sqrt2 * deltaX1; + distNeigh[TE] = distNeigh[TN] = distNeigh[TW] = distNeigh[TS] = UbMath::sqrt2 * deltaX1; + distNeigh[BE] = distNeigh[BN] = distNeigh[BW] = distNeigh[BS] = UbMath::sqrt2 * deltaX1; + distNeigh[TNE] = distNeigh[TNW] = distNeigh[TSE] = distNeigh[TSW] = UbMath::sqrt3 * deltaX1; + distNeigh[BNE] = distNeigh[BNW] = distNeigh[BSE] = distNeigh[BSW] = UbMath::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) + { + 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)) * UbMath::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]; + } + ////////////////////////////////////////////////////////////////////////// + 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 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 mfbbb = f[ZERO]; - LBMReal m0, m1, m2; + 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 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 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 OxxPyyPzz = 1.; - LBMReal oMdrho; + 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); + 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; - //////////////////////////////////////////////////////////////////////////////////// - //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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 vx2; + LBMReal vy2; + LBMReal vz2; + vx2 = vvx * vvx; + vy2 = vvy * vvy; + vz2 = vvz * vvz; + //////////////////////////////////////////////////////////////////////////////////// + //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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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 += UbMath::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;// - //Cum 4. - //LBMReal CUMcbb = mfcbb - ((mfcaa + UbMath::c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 - //LBMReal CUMbcb = mfbcb - ((mfaca + UbMath::c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 - //LBMReal CUMbbc = mfbbc - ((mfaac + UbMath::c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 + //Cum 4. + //LBMReal CUMcbb = mfcbb - ((mfcaa + UbMath::c1o3 * oMdrho) * mfabb + 2. * mfbba * mfbab); // till 18.05.2015 + //LBMReal CUMbcb = mfbcb - ((mfaca + UbMath::c1o3 * oMdrho) * mfbab + 2. * mfbba * mfabb); // till 18.05.2015 + //LBMReal CUMbbc = mfbbc - ((mfaac + UbMath::c1o3 * oMdrho) * mfbba + 2. * mfbab * mfabb); // till 18.05.2015 - // LBMReal CUMcbb = mfcbb - ((mfcaa + UbMath::c1o3) * mfabb + 2. * mfbba * mfbab); - // LBMReal CUMbcb = mfbcb - ((mfaca + UbMath::c1o3) * mfbab + 2. * mfbba * mfabb); - // LBMReal CUMbbc = mfbbc - ((mfaac + UbMath::c1o3) * mfbba + 2. * mfbab * mfabb); + // LBMReal CUMcbb = mfcbb - ((mfcaa + UbMath::c1o3) * mfabb + 2. * mfbba * mfbab); + // LBMReal CUMbcb = mfbcb - ((mfaca + UbMath::c1o3) * mfbab + 2. * mfbba * mfabb); + // LBMReal CUMbbc = mfbbc - ((mfaac + UbMath::c1o3) * mfbba + 2. * mfbab * mfabb); - // LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + UbMath::c1o3 * (mfcaa + mfaca) * oMdrho + UbMath::c1o9 * (oMdrho - 1) * oMdrho); - // LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + UbMath::c1o3 * (mfcaa + mfaac) * oMdrho + UbMath::c1o9 * (oMdrho - 1) * oMdrho); - // LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + UbMath::c1o3 * (mfaac + mfaca) * oMdrho + UbMath::c1o9 * (oMdrho - 1) * oMdrho); + // LBMReal CUMcca = mfcca - ((mfcaa * mfaca + 2. * mfbba * mfbba) + UbMath::c1o3 * (mfcaa + mfaca) * oMdrho + UbMath::c1o9 * (oMdrho - 1) * oMdrho); + // LBMReal CUMcac = mfcac - ((mfcaa * mfaac + 2. * mfbab * mfbab) + UbMath::c1o3 * (mfcaa + mfaac) * oMdrho + UbMath::c1o9 * (oMdrho - 1) * oMdrho); + // LBMReal CUMacc = mfacc - ((mfaac * mfaca + 2. * mfabb * mfabb) + UbMath::c1o3 * (mfaac + mfaca) * oMdrho + UbMath::c1o9 * (oMdrho - 1) * oMdrho); - //Cum 5. - // LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - UbMath::c1o3 * (mfbca + mfbac) * oMdrho; - // LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - UbMath::c1o3 * (mfcba + mfabc) * oMdrho; - // LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - UbMath::c1o3 * (mfacb + mfcab) * oMdrho; + //Cum 5. + // LBMReal CUMbcc = mfbcc - (mfaac * mfbca + mfaca * mfbac + 4. * mfabb * mfbbb + 2. * (mfbab * mfacb + mfbba * mfabc)) - UbMath::c1o3 * (mfbca + mfbac) * oMdrho; + // LBMReal CUMcbc = mfcbc - (mfaac * mfcba + mfcaa * mfabc + 4. * mfbab * mfbbb + 2. * (mfabb * mfcab + mfbba * mfbac)) - UbMath::c1o3 * (mfcba + mfabc) * oMdrho; + // LBMReal CUMccb = mfccb - (mfcaa * mfacb + mfaca * mfcab + 4. * mfbba * mfbbb + 2. * (mfbab * mfbca + mfabb * mfcba)) - UbMath::c1o3 * (mfacb + mfcab) * oMdrho; - //Cum 6. + //Cum 6. // LBMReal CUMccc = mfccc + ((-4. * mfbbb * mfbbb // - (mfcaa * mfacc + mfaca * mfcac + mfaac * mfcca) // - 4. * (mfabb * mfcbb + mfbab * mfbcb + mfbba * mfbbc) @@ -1120,23 +1112,23 @@ usage: ... // + (mfaac * mfaca + mfaac * mfcaa + mfaca * mfcaa)) * c2o3 * oMdrho) + c1o27 * oMdrho; - LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; - LBMReal mxxMyy = mfcaa - mfaca; - LBMReal mxxMzz = mfcaa - mfaac; + LBMReal mxxPyyPzz = mfcaa + mfaca + mfaac; + LBMReal mxxMyy = mfcaa - mfaca; + LBMReal mxxMzz = mfcaa - mfaac; + + LBMReal dxux = -UbMath::c1o2 * collFactorF * (mxxMyy + mxxMzz) + UbMath::c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); + LBMReal dyuy = dxux + collFactorF * UbMath::c3o2 * mxxMyy; + LBMReal dzuz = dxux + collFactorF * UbMath::c3o2 * mxxMzz; - LBMReal dxux = -UbMath::c1o2 * collFactorF * (mxxMyy + mxxMzz) + UbMath::c1o2 * OxxPyyPzz * (mfaaa - mxxPyyPzz); - LBMReal dyuy = dxux + collFactorF * UbMath::c3o2 * mxxMyy; - LBMReal dzuz = dxux + collFactorF * UbMath::c3o2 * mxxMzz; + LBMReal Dxy = -UbMath::three * collFactorF * mfbba; + LBMReal Dxz = -UbMath::three * collFactorF * mfbab; + LBMReal Dyz = -UbMath::three * collFactorF * mfabb; - LBMReal Dxy = -UbMath::three * collFactorF * mfbba; - LBMReal Dxz = -UbMath::three * collFactorF * mfbab; - LBMReal Dyz = -UbMath::three * collFactorF * mfabb; - - //TODO: may be factor 2 - return sqrt(UbMath::c2 * (dxux * dxux + dyuy * dyuy + dzuz * dzuz) + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + UbMath::one); - } - } + //TODO: may be factor 2 + return sqrt(UbMath::c2 * (dxux * dxux + dyuy * dyuy + dzuz * dzuz) + Dxy * Dxy + Dxz * Dxz + Dyz * Dyz) / (rho + UbMath::one); + } +} #endif diff --git a/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.h b/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.h index 3059fd3831d3daf1bc05254c67b3d671a0d81cb7..40570cc3847f71a1942791afa7e95145daafb53b 100644 --- a/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.h +++ b/src/cpu/VirtualFluidsCore/LBM/LBMUnitConverter.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 LBMUnitConverter.h +//! \ingroup LBM +//! \author Soeren Freudiger +//======================================================================================= + #ifndef LBMUNITCONVERTER_H #define LBMUNITCONVERTER_H @@ -7,24 +40,25 @@ #include <sstream> #include <string> -//#include "LBMUnitConverter.h" - #include <basics/utilities/UbException.h> -#include <basics/utilities/UbFileInput.h> -#include <basics/utilities/UbFileOutput.h> -// LBMUnitConverter conv( 100 /*L_World*/, 1484/*cs_water*/ , 1000/*rho_water*/ -// , 1000/*L_LB*/ , 1./srqt(3.)/*cs_Lb*/, 1/*rho_Lb*/ ); -// cout<<conv.toString()<<endl; -// -// cout<<"100m = "<< 100 * conv.getFactorLentghWToLb() << "dx " << std::endl; -// cout<<"1000dx = "<< 1000 * conv.getFactorLentghLbToW() << "m " << std::endl; -// -// cout<<"25m/s = "<< 25 * conv.getFactorVelocityWToLb() << "dx/dt " << std::endl; -// cout<<"0.04 dx/dt = "<< 0.04 * conv.getFactorVelocityLbToW() << "m/s " << std::endl; -// -// alternativ -// LBMUnitConverter conv(, 100 /*L_World*/, LBMUnitConverter::WATER, 1000/*L_LB*/ ); +//! \brief A class provides converter for LB units <-> SI units +//! \details +//! \code +//! LBMUnitConverter conv( 100 /*L_World*/, 1484/*cs_water*/ , 1000/*rho_water*/ +//! , 1000/*L_LB*/ , 1./srqt(3.)/*cs_Lb*/, 1/*rho_Lb*/ ); +//! cout<<conv.toString()<<endl; +//! +//! cout<<"100m = "<< 100 * conv.getFactorLentghWToLb() << "dx " << std::endl; +//! cout<<"1000dx = "<< 1000 * conv.getFactorLentghLbToW() << "m " << std::endl; +//! +//! cout<<"25m/s = "<< 25 * conv.getFactorVelocityWToLb() << "dx/dt " << std::endl; +//! cout<<"0.04 dx/dt = "<< 0.04 * conv.getFactorVelocityLbToW() << "m/s " << std::endl; +//! \endcode +//! alternative +//! \code +//! LBMUnitConverter conv(, 100 /*L_World*/, LBMUnitConverter::WATER, 1000/*L_LB*/ ); +//! \endcode class LBMUnitConverter { @@ -161,20 +195,6 @@ public: return out.str(); } - /*==========================================================*/ - virtual void write(UbFileOutput *out) - { - out->writeDouble(factorLengthLbToW); - out->writeDouble(factorTimeLbToW); - out->writeDouble(factorMassLbToW); - } - /*==========================================================*/ - virtual void read(UbFileInput *in) - { - factorLengthLbToW = in->readDouble(); - factorTimeLbToW = in->readDouble(); - factorMassLbToW = in->readDouble(); - } void init(const double &refLengthWorld, const double & /*csWorld*/, const double &rhoWorld, const double &vWorld, const double &refLengthLb, const double &rhoLb, const double &vLb) diff --git a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp index 7ebdfa85e85200a6bd8adf760f13d6742b7e2b2d..bc1e7d11defc33ade7a1aeb33377dff213efe3a0 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp +++ b/src/cpu/VirtualFluidsCore/Visitors/InitDistributionsBlockVisitor.cpp @@ -136,11 +136,11 @@ void InitDistributionsBlockVisitor::visit(const SPtr<Grid3D> grid, SPtr<Block3D> 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; + 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; + LBMReal vx1, vx2, vx3, rho; int gridRank = grid->getRank(); int blockRank = block->getRank(); diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h index 6eb8f6577e0c467df469667900d43e1a38ea15b1..51cbc256cfeac03b2d51acf8ebe8fca12a3f33ed 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h +++ b/src/cpu/VirtualFluidsCore/Visitors/SetKernelBlockVisitor.h @@ -49,10 +49,6 @@ class SetKernelBlockVisitor : public Block3DVisitor public: enum Action { NewKernel, ChangeKernel, ChangeKernelWithData }; - // SetKernelBlockVisitor(LBMKernel3DPtr kernel, LBMReal nue); - - // SetKernelBlockVisitor(LBMKernel3DPtr kernel, LBMReal nue, double availMem, double needMem); - SetKernelBlockVisitor(SPtr<LBMKernel> kernel, LBMReal nue, double availMem, double needMem, SetKernelBlockVisitor::Action action = SetKernelBlockVisitor::NewKernel); diff --git a/src/gpu/GksGpu/CMakeLists.txt b/src/gpu/GksGpu/CMakeLists.txt index b6e91a2cb6dbfabd61adf4fc20dd8dab5aa82e0c..da404e0209ed2c9f36ae323d2e6bd234fb6dfb96 100644 --- a/src/gpu/GksGpu/CMakeLists.txt +++ b/src/gpu/GksGpu/CMakeLists.txt @@ -1,3 +1,3 @@ project(GksGpu LANGUAGES CUDA CXX) -vf_add_library(BUILDTYPE shared PRIVATE_LINK basics GksMeshAdapter OpenMP::OpenMP_CXX MPI::MPI_CXX) +vf_add_library(PRIVATE_LINK basics GksMeshAdapter OpenMP::OpenMP_CXX MPI::MPI_CXX) diff --git a/src/gpu/GksMeshAdapter/CMakeLists.txt b/src/gpu/GksMeshAdapter/CMakeLists.txt index 3e47fe4abb10c9b9165d9e795bfcf034f607fd22..cb00b3c016786c41ef5640eb362322bb0a3768f8 100644 --- a/src/gpu/GksMeshAdapter/CMakeLists.txt +++ b/src/gpu/GksMeshAdapter/CMakeLists.txt @@ -1,3 +1,3 @@ +project(GksMeshAdapter LANGUAGES CUDA CXX) - -vf_add_library(BUILDTYPE shared PRIVATE_LINK basics GridGenerator) +vf_add_library(PRIVATE_LINK basics GridGenerator)