From 1f7ec97a56d8953b93993d81774b33c20cbe0259 Mon Sep 17 00:00:00 2001 From: kutscher <kutscher@irmb.tu-bs.de> Date: Mon, 2 Aug 2021 16:10:16 +0200 Subject: [PATCH] add pressure field to local connector for two phase fields velocity kernel --- apps/cpu/MultiphaseDropletTest/droplet.cpp | 4 +- .../WriteMultiphaseQuantitiesCoProcessor.cpp | 12 +- .../Connectors/FullDirectConnector.h | 2 +- .../Connectors/FullVectorConnector.h | 4 +- ...ThreeDistributionsFullDirectConnector2.cpp | 74 +++++ .../ThreeDistributionsFullDirectConnector2.h | 7 +- ...ThreeDistributionsFullVectorConnector2.cpp | 99 ++++++ .../ThreeDistributionsFullVectorConnector2.h | 293 ++++++++++++++++++ src/cpu/VirtualFluidsCore/Data/DataSet3D.h | 10 + ...oPhaseFieldsVelocityCumulantLBMKernel2.cpp | 11 +- ...TwoPhaseFieldsVelocityCumulantLBMKernel2.h | 5 +- 11 files changed, 504 insertions(+), 17 deletions(-) create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp create mode 100644 src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h diff --git a/apps/cpu/MultiphaseDropletTest/droplet.cpp b/apps/cpu/MultiphaseDropletTest/droplet.cpp index 06038f3be..9764094fc 100644 --- a/apps/cpu/MultiphaseDropletTest/droplet.cpp +++ b/apps/cpu/MultiphaseDropletTest/droplet.cpp @@ -266,13 +266,15 @@ void run(string configname) SPtr<UbScheduler> visSch(new UbScheduler(outTime)); SPtr<WriteMultiphaseQuantitiesCoProcessor> pp(new WriteMultiphaseQuantitiesCoProcessor( grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm)); - //pp->process(0); + pp->process(0); //SPtr<WriteMacroscopicQuantitiesCoProcessor> pp(new WriteMacroscopicQuantitiesCoProcessor( // grid, visSch, pathname, WbWriterVtkXmlBinary::getInstance(), conv, comm)); SPtr<UbScheduler> nupsSch(new UbScheduler(10, 30, 100)); SPtr<NUPSCounterCoProcessor> npr(new NUPSCounterCoProcessor(grid, nupsSch, numOfThreads, comm)); + omp_set_num_threads(numOfThreads); + SPtr<UbScheduler> stepGhostLayer(new UbScheduler(1)); SPtr<Calculator> calculator(new BasicCalculator(grid, stepGhostLayer, endTime)); calculator->addCoProcessor(npr); diff --git a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp index 1388f369d..42cec5c5e 100644 --- a/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp +++ b/src/cpu/VirtualFluidsCore/CoProcessors/WriteMultiphaseQuantitiesCoProcessor.cpp @@ -157,7 +157,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) datanames.push_back("Vz"); datanames.push_back("P1"); datanames.push_back("Phi2"); - if (dynamicPointerCast<MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2>(kernel)->pressure) datanames.push_back("Pressure"); + if (kernel->getDataSet()->getPressureField()) datanames.push_back("Pressure"); data.resize(datanames.size()); @@ -168,6 +168,9 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) SPtr<DistributionArray3D> distributionsH2 = kernel->getDataSet()->getH2distributions(); SPtr<PhaseFieldArray3D> divU = kernel->getDataSet()->getPhaseField(); + SPtr<PressureFieldArray3D> pressure; + if (kernel->getDataSet()->getPressureField()) pressure = kernel->getDataSet()->getPressureField(); + LBMReal f[D3Q27System::ENDF + 1]; LBMReal phi[D3Q27System::ENDF + 1]; LBMReal phi2[D3Q27System::ENDF + 1]; @@ -347,7 +350,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) // rho = phi[ZERO] + (1.0 - phi[ZERO])*1.0/densityRatio; rho = rhoH + rhoToPhi * (phi[REST] - phiH); - if (dynamicPointerCast<MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2>(kernel)->pressure) { + if (pressure) { 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])) ; @@ -429,10 +432,7 @@ void WriteMultiphaseQuantitiesCoProcessor::addDataMQ(SPtr<Block3D> block) data[index++].push_back(vx3); data[index++].push_back(p1); data[index++].push_back(phi2[REST]); - if (dynamicPointerCast<MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2>(kernel)->pressure) { - data[index++].push_back((*dynamicPointerCast<MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2>(kernel)->pressure)(ix1, ix2, ix3)); - } - // else { data[index++].push_back(999); } + if (pressure) data[index++].push_back((*pressure)(ix1, ix2, ix3)); } } } diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h index fb04de68a..81984eee9 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h +++ b/src/cpu/VirtualFluidsCore/Connectors/FullDirectConnector.h @@ -49,7 +49,7 @@ public: protected: virtual void updatePointers() = 0; - void exchangeData(); + virtual void exchangeData(); virtual void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) = 0; int maxX1; diff --git a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h index 39fc3d1af..802a91290 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h +++ b/src/cpu/VirtualFluidsCore/Connectors/FullVectorConnector.h @@ -56,8 +56,8 @@ public: protected: virtual void updatePointers() = 0; - void fillData(); - void distributeData(); + virtual void fillData(); + virtual void distributeData(); virtual void fillData(vector_type &sdata, int &index, int x1, int x2, int x3) = 0; virtual void distributeData(vector_type &rdata, int &index, int x1, int x2, int x3) = 0; diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.cpp index dd6ea50e2..78cc34f20 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.cpp +++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.cpp @@ -51,6 +51,8 @@ void ThreeDistributionsFullDirectConnector2::init() hTo = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getHdistributions()); hFrom2 = dynamicPointerCast<EsoTwist3D>(from.lock()->getKernel()->getDataSet()->getH2distributions()); hTo2 = dynamicPointerCast<EsoTwist3D>(to.lock()->getKernel()->getDataSet()->getH2distributions()); + pressureFrom = from.lock()->getKernel()->getDataSet()->getPressureField(); + pressureTo = to.lock()->getKernel()->getDataSet()->getPressureField(); } ////////////////////////////////////////////////////////////////////////// void ThreeDistributionsFullDirectConnector2::sendVectors() @@ -151,6 +153,8 @@ void ThreeDistributionsFullDirectConnector2::exchangeData() for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { exchangeData(maxX1m3, maxX2m3, x3, minX1, minX2, x3); exchangeData(maxX1m2, maxX2m2, x3, minX1p1, minX2p1, x3); + exchangeData(maxX1m3, maxX2m2, x3, minX1, minX2p1, x3); + exchangeData(maxX1m2, maxX2m3, x3, minX1p1, minX2, x3); } } // NORTHWEST @@ -158,6 +162,8 @@ void ThreeDistributionsFullDirectConnector2::exchangeData() for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { exchangeData(minX1p3, maxX2m3, x3, maxX1, minX2, x3); exchangeData(minX1p2, maxX2m2, x3, maxX1m1, minX2p1, x3); + exchangeData(minX1p3, maxX2m2, x3, maxX1, minX2p1, x3); + exchangeData(minX1p2, maxX2m3, x3, maxX1m1, minX2, x3); } } // SOUTHWEST @@ -165,6 +171,8 @@ void ThreeDistributionsFullDirectConnector2::exchangeData() for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { exchangeData(minX1p3, minX2p3, x3, maxX1, maxX2, x3); exchangeData(minX1p2, minX2p2, x3, maxX1m1, maxX2m1, x3); + exchangeData(minX1p3, minX2p2, x3, maxX1, maxX2m1, x3); + exchangeData(minX1p2, minX2p3, x3, maxX1m1, maxX2, x3); } } // SOUTHEAST @@ -172,71 +180,137 @@ void ThreeDistributionsFullDirectConnector2::exchangeData() for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { exchangeData(maxX1m3, minX2p3, x3, minX1, maxX2, x3); exchangeData(maxX1m2, minX2p2, x3, minX1p1, maxX2m1, x3); + exchangeData(maxX1m3, minX2p2, x3, minX1, maxX2m1, x3); + exchangeData(maxX1m2, minX2p3, x3, minX1p1, maxX2, x3); } } else if (sendDir == D3Q27System::TE) for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { exchangeData(maxX1m3, x2, maxX3m3, minX1, x2, minX3); exchangeData(maxX1m2, x2, maxX3m2, minX1p1, x2, minX3p1); + exchangeData(maxX1m3, x2, maxX3m2, minX1, x2, minX3p1); + exchangeData(maxX1m2, x2, maxX3m3, minX1p1, x2, minX3); } else if (sendDir == D3Q27System::BW) for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { exchangeData(minX1p3, x2, minX3p3, maxX1, x2, maxX3); exchangeData(minX1p2, x2, minX3p2, maxX1m1, x2, maxX3m1); + exchangeData(minX1p3, x2, minX3p2, maxX1, x2, maxX3m1); + exchangeData(minX1p2, x2, minX3p3, maxX1m1, x2, maxX3); } else if (sendDir == D3Q27System::BE) for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { exchangeData(maxX1m3, x2, minX3p3, minX1, x2, maxX3); exchangeData(maxX1m2, x2, minX3p2, minX1p1, x2, maxX3m1); + exchangeData(maxX1m3, x2, minX3p2, minX1, x2, maxX3m1); + exchangeData(maxX1m2, x2, minX3p3, minX1p1, x2, maxX3); } else if (sendDir == D3Q27System::TW) for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { exchangeData(minX1p3, x2, maxX3m3, maxX1, x2, minX3); exchangeData(minX1p2, x2, maxX3m2, maxX1m1, x2, minX3p1); + exchangeData(minX1p3, x2, maxX3m2, maxX1, x2, minX3p1); + exchangeData(minX1p2, x2, maxX3m3, maxX1m1, x2, minX3); } else if (sendDir == D3Q27System::TN) for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { exchangeData(x1, maxX2m3, maxX3m3, x1, minX2, minX3); exchangeData(x1, maxX2m2, maxX3m2, x1, minX2p1, minX3p1); + exchangeData(x1, maxX2m3, maxX3m2, x1, minX2, minX3p1); + exchangeData(x1, maxX2m2, maxX3m3, x1, minX2p1, minX3); } else if (sendDir == D3Q27System::BS) for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { exchangeData(x1, minX2p3, minX3p3, x1, maxX2, maxX3); exchangeData(x1, minX2p2, minX3p2, x1, maxX2m1, maxX3m1); + exchangeData(x1, minX2p3, minX3p2, x1, maxX2, maxX3m1); + exchangeData(x1, minX2p2, minX3p3, x1, maxX2m1, maxX3); } else if (sendDir == D3Q27System::BN) for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { exchangeData(x1, maxX2m3, minX3p3, x1, minX2, maxX3); exchangeData(x1, maxX2m2, minX3p2, x1, minX2p1, maxX3m1); + exchangeData(x1, maxX2m3, minX3p2, x1, minX2, maxX3m1); + exchangeData(x1, maxX2m2, minX3p3, x1, minX2p1, maxX3); } else if (sendDir == D3Q27System::TS) for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { exchangeData(x1, minX2p3, maxX3m3, x1, maxX2, minX3); exchangeData(x1, minX2p2, maxX3m2, x1, maxX2m1, minX3p1); + exchangeData(x1, minX2p3, maxX3m2, x1, maxX2, minX3p1); + exchangeData(x1, minX2p2, maxX3m3, x1, maxX2m1, minX3); } else if (sendDir == D3Q27System::TSW) { exchangeData(minX1p3, minX2p3, maxX3m3, maxX1, maxX2, minX3); exchangeData(minX1p2, minX2p2, maxX3m2, maxX1m1, maxX2m1, minX3p1); + exchangeData(minX1p3, minX2p2, maxX3m2, maxX1, maxX2m1, minX3p1); + exchangeData(minX1p2, minX2p3, maxX3m2, maxX1m1, maxX2, minX3p1); + exchangeData(minX1p2, minX2p2, maxX3m3, maxX1m1, maxX2m1, minX3); + exchangeData(minX1p3, minX2p3, maxX3m2, maxX1, maxX2, minX3p1); + exchangeData(minX1p3, minX2p2, maxX3m3, maxX1, maxX2m1, minX3); + exchangeData(minX1p2, minX2p3, maxX3m3, maxX1m1, maxX2, minX3); } else if (sendDir == D3Q27System::TSE) { exchangeData(maxX1m3, minX1p3, maxX3m3, minX1, maxX2, minX3); exchangeData(maxX1m2, minX1p2, maxX3m2, minX1p1, maxX2m1, minX3p1); + exchangeData(maxX1m3, minX1p2, maxX3m2, minX1, maxX2m1, minX3p1); + exchangeData(maxX1m2, minX1p3, maxX3m2, minX1p1, maxX2, minX3p1); + exchangeData(maxX1m2, minX1p2, maxX3m3, minX1p1, maxX2m1, minX3); + exchangeData(maxX1m3, minX1p3, maxX3m2, minX1, maxX2, minX3p1); + exchangeData(maxX1m3, minX1p2, maxX3m3, minX1, maxX2m1, minX3); + exchangeData(maxX1m2, minX1p3, maxX3m3, minX1p1, maxX2, minX3); } else if (sendDir == D3Q27System::TNW) { exchangeData(minX1p3, maxX2m3, maxX3m3, maxX1, minX2, minX3); exchangeData(minX1p2, maxX2m2, maxX3m2, maxX1m1, minX2p1, minX3p1); + exchangeData(minX1p3, maxX2m2, maxX3m2, maxX1, minX2p1, minX3p1); + exchangeData(minX1p2, maxX2m3, maxX3m2, maxX1m1, minX2, minX3p1); + exchangeData(minX1p2, maxX2m2, maxX3m3, maxX1m1, minX2p1, minX3); + exchangeData(minX1p3, maxX2m3, maxX3m2, maxX1, minX2, minX3p1); + exchangeData(minX1p3, maxX2m2, maxX3m3, maxX1, minX2p1, minX3); + exchangeData(minX1p2, maxX2m3, maxX3m3, maxX1m1, minX2, minX3); } else if (sendDir == D3Q27System::TNE) { exchangeData(maxX1m3, maxX2m3, maxX3m3, minX1, minX2, minX3); exchangeData(maxX1m2, maxX2m2, maxX3m2, minX1p1, minX2p1, minX3p1); + exchangeData(maxX1m3, maxX2m2, maxX3m2, minX1, minX2p1, minX3p1); + exchangeData(maxX1m2, maxX2m3, maxX3m2, minX1p1, minX2, minX3p1); + exchangeData(maxX1m2, maxX2m2, maxX3m3, minX1p1, minX2p1, minX3); + exchangeData(maxX1m3, maxX2m3, maxX3m2, minX1, minX2, minX3p1); + exchangeData(maxX1m3, maxX2m2, maxX3m3, minX1, minX2p1, minX3); + exchangeData(maxX1m2, maxX2m3, maxX3m3, minX1p1, minX2, minX3); } else if (sendDir == D3Q27System::BSW) { exchangeData(minX1p3, minX2p3, minX3p3, maxX1, maxX2, maxX3); exchangeData(minX1p2, minX2p2, minX3p2, maxX1m1, maxX2m1, maxX3m1); + exchangeData(minX1p3, minX2p2, minX3p2, maxX1, maxX2m1, maxX3m1); + exchangeData(minX1p2, minX2p3, minX3p2, maxX1m1, maxX2, maxX3m1); + exchangeData(minX1p2, minX2p2, minX3p3, maxX1m1, maxX2m1, maxX3); + exchangeData(minX1p3, minX2p3, minX3p2, maxX1, maxX2, maxX3m1); + exchangeData(minX1p3, minX2p2, minX3p3, maxX1, maxX2m1, maxX3); + exchangeData(minX1p2, minX2p3, minX3p3, maxX1m1, maxX2, maxX3); } else if (sendDir == D3Q27System::BSE) { exchangeData(maxX1m3, minX2p3, minX3p3, minX1, maxX2, maxX3); exchangeData(maxX1m2, minX2p2, minX3p2, minX1p1, maxX2m1, maxX3m1); + exchangeData(maxX1m3, minX2p2, minX3p2, minX1, maxX2m1, maxX3m1); + exchangeData(maxX1m2, minX2p3, minX3p2, minX1p1, maxX2, maxX3m1); + exchangeData(maxX1m2, minX2p2, minX3p3, minX1p1, maxX2m1, maxX3); + exchangeData(maxX1m3, minX2p3, minX3p2, minX1, maxX2, maxX3m1); + exchangeData(maxX1m3, minX2p2, minX3p3, minX1, maxX2m1, maxX3); + exchangeData(maxX1m2, minX2p3, minX3p3, minX1p1, maxX2, maxX3); } else if (sendDir == D3Q27System::BNW) { exchangeData(minX1p3, maxX2m3, minX3p3, maxX1, minX2, maxX3); exchangeData(minX1p2, maxX2m2, minX3p2, maxX1m1, minX2p1, maxX3m1); + exchangeData(minX1p3, maxX2m2, minX3p2, maxX1, minX2p1, maxX3m1); + exchangeData(minX1p2, maxX2m3, minX3p2, maxX1m1, minX2, maxX3m1); + exchangeData(minX1p2, maxX2m2, minX3p3, maxX1m1, minX2p1, maxX3); + exchangeData(minX1p3, maxX2m3, minX3p2, maxX1, minX2, maxX3m1); + exchangeData(minX1p3, maxX2m2, minX3p3, maxX1, minX2p1, maxX3); + exchangeData(minX1p2, maxX2m3, minX3p3, maxX1m1, minX2, maxX3); } else if (sendDir == D3Q27System::BNE) { exchangeData(maxX1m3, maxX2m3, minX3p3, minX1, minX2, maxX3); exchangeData(maxX1m2, maxX2m2, minX3p2, minX1p1, minX2p1, maxX3m1); + exchangeData(maxX1m3, maxX2m2, minX3p2, minX1, minX2p1, maxX3m1); + exchangeData(maxX1m2, maxX2m3, minX3p2, minX1p1, minX2, maxX3m1); + exchangeData(maxX1m2, maxX2m2, minX3p3, minX1p1, minX2p1, maxX3); + exchangeData(maxX1m3, maxX2m3, minX3p2, minX1, minX2, maxX3m1); + exchangeData(maxX1m3, maxX2m2, minX3p3, minX1, minX2p1, maxX3); + exchangeData(maxX1m2, maxX2m3, minX3p3, minX1p1, minX2, maxX3); } else UB_THROW(UbException(UB_EXARGS, "unknown dir")); diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.h b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.h index 1ced5129b..3375f570d 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.h +++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullDirectConnector2.h @@ -40,6 +40,7 @@ #include "D3Q27EsoTwist3DSplittedVector.h" #include "basics/container/CbArray3D.h" #include "basics/container/CbArray4D.h" +#include "DataSet3D.h" //! \brief Exchange data between blocks. //! \details Connector send and receive full distributions between two blocks in shared memory. @@ -53,7 +54,7 @@ public: protected: inline void updatePointers() override; - void exchangeData(); + void exchangeData() override; inline void exchangeData(int x1From, int x2From, int x3From, int x1To, int x2To, int x3To) override; private: @@ -83,6 +84,8 @@ private: SPtr<EsoTwist3D> fFrom, hFrom, hFrom2; SPtr<EsoTwist3D> fTo, hTo, hTo2; + + SPtr<PressureFieldArray3D> pressureFrom, pressureTo; }; ////////////////////////////////////////////////////////////////////////// inline void ThreeDistributionsFullDirectConnector2::updatePointers() @@ -230,5 +233,7 @@ inline void ThreeDistributionsFullDirectConnector2::exchangeData(int x1From, int (*this->nonLocalDistributionsFromh2)(D3Q27System::ET_BNE, x1From, x2From, x3From + 1); (*this->zeroDistributionsToh2)(x1To, x2To, x3To) = (*this->zeroDistributionsFromh2)(x1From, x2From, x3From); + + (*this->pressureTo)(x1To, x2To, x3To) = (*this->pressureFrom)(x1From, x2From, x3From); } #endif \ No newline at end of file diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp new file mode 100644 index 000000000..a9e3c7e74 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp @@ -0,0 +1,99 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 ThreeDistributionsFullVectorConnector2.cpp +//! \ingroup Connectors +//! \author Konstantin Kutscher +//======================================================================================= + +#include "ThreeDistributionsFullVectorConnector2.h" +#include "Block3D.h" +#include "LBMKernel.h" +#include "EsoTwist3D.h" +#include "DataSet3D.h" + +////////////////////////////////////////////////////////////////////////// +ThreeDistributionsFullVectorConnector2::ThreeDistributionsFullVectorConnector2(SPtr<Block3D> block, + VectorTransmitterPtr sender, + VectorTransmitterPtr receiver, int sendDir) + : FullVectorConnector(block, sender, receiver, sendDir) +{ + if (!block || !sender || !receiver) + UB_THROW(UbException(UB_EXARGS, "sender or receiver == NULL!!")); + +} +////////////////////////////////////////////////////////////////////////// +void ThreeDistributionsFullVectorConnector2::init() +{ + FullVectorConnector::init(); + + fDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getFdistributions()); + hDis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getHdistributions()); + h2Dis = dynamicPointerCast<EsoTwist3D>(block.lock()->getKernel()->getDataSet()->getH2distributions()); + + int anz = 3*27; + switch (sendDir) + { + case D3Q27System::REST: UB_THROW(UbException(UB_EXARGS, "ZERO not allowed")); break; + case D3Q27System::E: + case D3Q27System::W: sender->getData().resize(maxX2*maxX3*anz, 0.0); break; + case D3Q27System::N: + case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz, 0.0); break; + case D3Q27System::T: + case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz, 0.0); break; + + case D3Q27System::NE: + case D3Q27System::SW: + case D3Q27System::SE: + case D3Q27System::NW: sender->getData().resize(maxX3*anz, 0.0); break; + + case D3Q27System::TE: + case D3Q27System::BW: + case D3Q27System::BE: + case D3Q27System::TW: sender->getData().resize(maxX2*anz, 0.0); break; + + case D3Q27System::TN: + case D3Q27System::BS: + case D3Q27System::BN: + case D3Q27System::TS: sender->getData().resize(maxX1*anz, 0.0); break; + + case D3Q27System::TNE: + case D3Q27System::BSW: + case D3Q27System::BNE: + case D3Q27System::TSW: + case D3Q27System::TSE: + case D3Q27System::BNW: + case D3Q27System::BSE: + case D3Q27System::TNW: sender->getData().resize(anz, 0.0); break; + + default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir")); + } +} + + + diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h new file mode 100644 index 000000000..87448a414 --- /dev/null +++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h @@ -0,0 +1,293 @@ +//======================================================================================= +// ____ ____ __ ______ __________ __ __ __ __ +// \ \ | | | | | _ \ |___ ___| | | | | / \ | | +// \ \ | | | | | |_) | | | | | | | / \ | | +// \ \ | | | | | _ / | | | | | | / /\ \ | | +// \ \ | | | | | | \ \ | | | \__/ | / ____ \ | |____ +// \ \ | | |__| |__| \__\ |__| \________/ /__/ \__\ |_______| +// \ \ | | ________________________________________________________________ +// \ \ | | | ______________________________________________________________| +// \ \| | | | __ __ __ __ ______ _______ +// \ | | |_____ | | | | | | | | | _ \ / _____) +// \ | | _____| | | | | | | | | | | \ \ \_______ +// \ | | | | |_____ | \_/ | | | | |_/ / _____ | +// \ _____| |__| |________| \_______/ |__| |______/ (_______/ +// +// 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 ThreeDistributionsFullVectorConnector2.h +//! \ingroup Connectors +//! \author Konstantin Kutscher +//======================================================================================= + +#ifndef ThreeDistributionsFullVectorConnector2_H +#define ThreeDistributionsFullVectorConnector2_H + +#include <vector> + +#include "FullVectorConnector.h" +#include "D3Q27System.h" +#include "D3Q27EsoTwist3DSplittedVector.h" +#include "basics/container/CbArray3D.h" +#include "basics/container/CbArray4D.h" + +class EsoTwist3D; +class Block3D; + +//daten werden in einen vector (dieser befindet sich im transmitter) kopiert +//der vector wird via transmitter uebertragen +//transmitter kann ein lokal, MPI, RCG, CTL oder was auch immer fuer ein +//transmitter sein, der von Transmitter abgeleitet ist ;-) +class ThreeDistributionsFullVectorConnector2 : public FullVectorConnector +{ +public: + ThreeDistributionsFullVectorConnector2(SPtr<Block3D> block, VectorTransmitterPtr sender, VectorTransmitterPtr receiver, int sendDir); + + void init() override; + + void fillSendVectors() override; + void distributeReceiveVectors() override; + +protected: + inline void updatePointers() override; + inline void fillData(vector_type &sdata, int &index, int x1, int x2, int x3) override; + inline void distributeData(vector_type &rdata, int &index, int x1, int x2, int x3) override; + +private: + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localDistributions; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalDistributions; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroDistributions; + + SPtr<EsoTwist3D> fDis; + + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localHdistributions; + CbArray4D <LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalHdistributions; + CbArray3D <LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroHdistributions; + + SPtr<EsoTwist3D> hDis; + + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr localH2distributions; + CbArray4D<LBMReal, IndexerX4X3X2X1>::CbArray4DPtr nonLocalH2distributions; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr zeroH2distributions; + + SPtr<EsoTwist3D> h2Dis; + +}; +////////////////////////////////////////////////////////////////////////// +inline void ThreeDistributionsFullVectorConnector2::updatePointers() +{ + localDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getLocalDistributions(); + nonLocalDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getNonLocalDistributions(); + zeroDistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->fDis)->getZeroDistributions(); + + localHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getLocalDistributions(); + nonLocalHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getNonLocalDistributions(); + zeroHdistributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->hDis)->getZeroDistributions(); + + localH2distributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getLocalDistributions(); + nonLocalH2distributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getNonLocalDistributions(); + zeroH2distributions = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(this->h2Dis)->getZeroDistributions(); +} +////////////////////////////////////////////////////////////////////////// +inline void ThreeDistributionsFullVectorConnector2::fillData(vector_type& sdata, int& index, int x1, int x2, int x3) +{ + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + sdata[index++] = (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + + sdata[index++] = (*this->zeroDistributions)(x1, x2, x3); + + + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + sdata[index++] = (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + + sdata[index++] = (*this->zeroHdistributions)(x1, x2, x3); + + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_E, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_N, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_T, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_NE, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_NW, x1 + 1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TE, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TW, x1 + 1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TN, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TS, x1, x2 + 1, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TNE, x1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3); + sdata[index++] = (*this->localH2distributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3); + + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_W, x1 + 1, x2, x3); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_S, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_B, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_SE, x1, x2 + 1, x3); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BE, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BN, x1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1); + sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); + + sdata[index++] = (*this->zeroH2distributions)(x1, x2, x3); +} +////////////////////////////////////////////////////////////////////////// +inline void ThreeDistributionsFullVectorConnector2::distributeData(vector_type& rdata, int& index, int x1, int x2, int x3) +{ + (*this->localDistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++]; + (*this->localDistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++]; + + (*this->nonLocalDistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalDistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++]; + + (*this->zeroDistributions)(x1, x2, x3) = rdata[index++]; + + + (*this->localHdistributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++]; + (*this->localHdistributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++]; + + (*this->nonLocalHdistributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalHdistributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++]; + + (*this->zeroHdistributions)(x1, x2, x3) = rdata[index++]; + + (*this->localH2distributions)(D3Q27System::ET_E, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_N, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_T, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_NE, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_NW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TE, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TN, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TS, x1, x2 + 1, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TNE, x1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TNW, x1 + 1, x2, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TSE, x1, x2 + 1, x3) = rdata[index++]; + (*this->localH2distributions)(D3Q27System::ET_TSW, x1 + 1, x2 + 1, x3) = rdata[index++]; + + (*this->nonLocalH2distributions)(D3Q27System::ET_W, x1 + 1, x2, x3) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_S, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_B, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_SW, x1 + 1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_SE, x1, x2 + 1, x3) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BE, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BS, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BN, x1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BSW, x1 + 1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BSE, x1, x2 + 1, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BNW, x1 + 1, x2, x3 + 1) = rdata[index++]; + (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++]; + + (*this->zeroH2distributions)(x1, x2, x3) = rdata[index++]; +} + + +#endif + diff --git a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h index e53e38a74..6b858e6ec 100644 --- a/src/cpu/VirtualFluidsCore/Data/DataSet3D.h +++ b/src/cpu/VirtualFluidsCore/Data/DataSet3D.h @@ -44,6 +44,7 @@ using AverageValuesArray3D = CbArray4D<LBMReal, IndexerX4X3X2X1>; using ShearStressValuesArray3D = CbArray4D<LBMReal, IndexerX4X3X2X1>; using RelaxationFactorArray3D = CbArray3D<LBMReal, IndexerX3X2X1>; using PhaseFieldArray3D = CbArray3D<LBMReal, IndexerX3X2X1>; +using PressureFieldArray3D = CbArray3D<LBMReal, IndexerX3X2X1>; //! A class provides an interface for data structures in the kernel. class DataSet3D @@ -88,6 +89,9 @@ public: SPtr<PhaseFieldArray3D> getPhaseField2() const; void setPhaseField2(SPtr<PhaseFieldArray3D> values); + SPtr<PressureFieldArray3D> DataSet3D::getPressureField() const; + void DataSet3D::setPressureField(SPtr<PressureFieldArray3D> values); + protected: private: SPtr<DistributionArray3D> fdistributions; @@ -103,8 +107,10 @@ private: SPtr<ShearStressValuesArray3D> shearStressValues; SPtr<RelaxationFactorArray3D> relaxationFactor; + SPtr<PhaseFieldArray3D> phaseField; SPtr<PhaseFieldArray3D> phaseField2; + SPtr<PressureFieldArray3D> pressureField; }; inline SPtr<DistributionArray3D> DataSet3D::getFdistributions() const { return fdistributions; } @@ -162,4 +168,8 @@ inline SPtr<PhaseFieldArray3D> DataSet3D::getPhaseField2() const { return phaseF inline void DataSet3D::setPhaseField2(SPtr<PhaseFieldArray3D> values) { phaseField2 = values; } +inline SPtr<PressureFieldArray3D> DataSet3D::getPressureField() const { return pressureField; } + +inline void DataSet3D::setPressureField(SPtr<PressureFieldArray3D> values) { pressureField = values; } + #endif diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.cpp b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.cpp index 13f8ce77f..97a8196db 100644 --- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.cpp +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.cpp @@ -51,12 +51,13 @@ void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2::initDataSet() SPtr<DistributionArray3D> h(new D3Q27EsoTwist3DSplittedVector( nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field SPtr<DistributionArray3D> h2(new D3Q27EsoTwist3DSplittedVector(nx[0] + 4, nx[1] + 4, nx[2] + 4, -999.9)); // For phase-field SPtr<PhaseFieldArray3D> divU(new PhaseFieldArray3D( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); - pressure= CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure(new CbArray3D<LBMReal, IndexerX3X2X1>( nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); pressureOld = CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr(new CbArray3D<LBMReal, IndexerX3X2X1>(nx[0] + 4, nx[1] + 4, nx[2] + 4, 0.0)); dataSet->setFdistributions(f); dataSet->setHdistributions(h); // For phase-field dataSet->setH2distributions(h2); // For phase-field dataSet->setPhaseField(divU); + dataSet->setPressureField(pressure); } ////////////////////////////////////////////////////////////////////////// SPtr<LBMKernel> MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2::clone() @@ -153,6 +154,8 @@ void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2::calculate(int step) nonLocalDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getNonLocalDistributions(); zeroDistributionsH2 = dynamicPointerCast<D3Q27EsoTwist3DSplittedVector>(dataSet->getH2distributions())->getZeroDistributions(); + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure = dataSet->getPressureField(); + SPtr<BCArray3D> bcArray = this->getBCProcessor()->getBCArray(); const int bcArrayMaxX1 = (int)bcArray->getNX1(); @@ -176,9 +179,9 @@ void MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2::calculate(int step) new CbArray3D<LBMReal, IndexerX3X2X1>(bcArrayMaxX1, bcArrayMaxX2, bcArrayMaxX3, 0.0)); //#pragma omp parallel for - for (int x3 = minX3-1; x3 <= maxX3; x3++) { - for (int x2 = minX2-1; x2 <= maxX2; x2++) { - for (int x1 = minX1-1; x1 <= maxX1; x1++) { + for (int x3 = minX3-ghostLayerWidth; x3 < maxX3+ghostLayerWidth; x3++) { + for (int x2 = minX2-ghostLayerWidth; x2 < maxX2+ghostLayerWidth; x2++) { + for (int x1 = minX1-ghostLayerWidth; x1 < maxX1+ghostLayerWidth; x1++) { if (!bcArray->isSolid(x1, x2, x3) && !bcArray->isUndefined(x1, x2, x3)) { int x1p = x1 + 1; int x2p = x2 + 1; diff --git a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.h b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.h index 2b899d0ea..d3be0fa92 100644 --- a/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.h +++ b/src/cpu/VirtualFluidsCore/LBM/MultiphaseTwoPhaseFieldsVelocityCumulantLBMKernel2.h @@ -57,8 +57,8 @@ public: void backwardChimera(LBMReal& mfa, LBMReal& mfb, LBMReal& mfc, LBMReal vv, LBMReal v2); ///refactor - CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure; - CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld; + //CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressure; + double getCalculationTime() override { return .0; } protected: @@ -80,6 +80,7 @@ protected: //CbArray3D<LBMReal,IndexerX3X2X1>::CbArray3DPtr phaseField; + CbArray3D<LBMReal, IndexerX3X2X1>::CbArray3DPtr pressureOld; LBMReal h [D3Q27System::ENDF+1]; LBMReal h2[D3Q27System::ENDF + 1]; -- GitLab