From e0e794de3621d01babcc9481403d6886f492320d Mon Sep 17 00:00:00 2001 From: kutscher <kutscher@irmb.tu-bs.de> Date: Mon, 2 Aug 2021 19:07:59 +0200 Subject: [PATCH] add remote connector for for two phase fields velocity kernel --- .../cpu/MultiphaseDropletTest/DropletTest.cfg | 2 +- apps/cpu/MultiphaseDropletTest/droplet.cpp | 12 +- ...ThreeDistributionsFullVectorConnector2.cpp | 544 +++++++++++++++++- .../ThreeDistributionsFullVectorConnector2.h | 9 + .../Interactors/InteractorsHelper.cpp | 2 +- .../Visitors/SetConnectorsBlockVisitor.h | 3 +- 6 files changed, 555 insertions(+), 17 deletions(-) diff --git a/apps/cpu/MultiphaseDropletTest/DropletTest.cfg b/apps/cpu/MultiphaseDropletTest/DropletTest.cfg index 8ab087bde..243e04299 100644 --- a/apps/cpu/MultiphaseDropletTest/DropletTest.cfg +++ b/apps/cpu/MultiphaseDropletTest/DropletTest.cfg @@ -1,7 +1,7 @@ #pathname = d:/temp/MultiphaseDropletTest pathname = E:/Multiphase/DropletTestSigma2 -numOfThreads = 4 +numOfThreads = 1 availMem = 10e9 #Grid diff --git a/apps/cpu/MultiphaseDropletTest/droplet.cpp b/apps/cpu/MultiphaseDropletTest/droplet.cpp index 9764094fc..01660db88 100644 --- a/apps/cpu/MultiphaseDropletTest/droplet.cpp +++ b/apps/cpu/MultiphaseDropletTest/droplet.cpp @@ -151,16 +151,16 @@ void run(string configname) SPtr<WriteBlocksCoProcessor> ppblocks(new WriteBlocksCoProcessor( grid, SPtr<UbScheduler>(new UbScheduler(1)), pathname, WbWriterVtkXmlBinary::getInstance(), comm)); - //SPtr<Grid3DVisitor> metisVisitor( - // new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW)); - //InteractorsHelper intHelper(grid, metisVisitor); - //intHelper.selectBlocks(); + SPtr<Grid3DVisitor> metisVisitor( + new MetisPartitioningGridVisitor(comm, MetisPartitioningGridVisitor::LevelBased, D3Q27System::BSW, MetisPartitioner::RECURSIVE)); + InteractorsHelper intHelper(grid, metisVisitor, true); + intHelper.selectBlocks(); ppblocks->process(0); ppblocks.reset(); unsigned long long numberOfBlocks = (unsigned long long)grid->getNumberOfBlocks(); - int ghostLayer = 3; + int ghostLayer = 5; unsigned long long numberOfNodesPerBlock = (unsigned long long)(blocknx[0]) * (unsigned long long)(blocknx[1]) * (unsigned long long)(blocknx[2]); unsigned long long numberOfNodes = numberOfBlocks * numberOfNodesPerBlock; @@ -196,7 +196,7 @@ void run(string configname) } - //intHelper.setBC(); + intHelper.setBC(); //grid->accept(bcVisitor); diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp index a9e3c7e74..c8528b1e7 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp +++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.cpp @@ -55,32 +55,33 @@ void ThreeDistributionsFullVectorConnector2::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()); + pressure = block.lock()->getKernel()->getDataSet()->getPressureField(); - int anz = 3*27; + int anz = 3*27+1; 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::W: sender->getData().resize(maxX2*maxX3*anz*2, 0.0); break; case D3Q27System::N: - case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz, 0.0); break; + case D3Q27System::S: sender->getData().resize(maxX1*maxX3*anz*2, 0.0); break; case D3Q27System::T: - case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz, 0.0); break; + case D3Q27System::B: sender->getData().resize(maxX1*maxX2*anz*2, 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::NW: sender->getData().resize(maxX3*anz*4, 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::TW: sender->getData().resize(maxX2*anz*4, 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::TS: sender->getData().resize(maxX1*anz*4, 0.0); break; case D3Q27System::TNE: case D3Q27System::BSW: @@ -89,11 +90,538 @@ void ThreeDistributionsFullVectorConnector2::init() case D3Q27System::TSE: case D3Q27System::BNW: case D3Q27System::BSE: - case D3Q27System::TNW: sender->getData().resize(anz, 0.0); break; + case D3Q27System::TNW: sender->getData().resize(anz*8, 0.0); break; default: UB_THROW(UbException(UB_EXARGS, "unknown sendDir")); } } +////////////////////////////////////////////////////////////////////////// +void ThreeDistributionsFullVectorConnector2::fillSendVectors() +{ + updatePointers(); + fillData(); +} +//////////////////////////////////////////////////////////////////////// +void ThreeDistributionsFullVectorConnector2::fillData() +{ + //////////////////////////////////////////////////////////// + // relation between ghost layer and regular nodes + // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes + // minX1 minX1p1 ... maxX1m1 maxX1 - ghost layer + //////////////////////////////////////////////////////////// + + int minX1 = 0; + int minX1p1 = minX1 + 1; + int minX1p2 = minX1 + 2; + int minX1p3 = minX1 + 3; + int maxX1m1 = maxX1 - 1; + int maxX1m2 = maxX1 - 2; + int maxX1m3 = maxX1 - 3; + + int minX2 = 0; + int minX2p1 = minX2 + 1; + int minX2p2 = minX2 + 2; + int minX2p3 = minX2 + 3; + int maxX2m1 = maxX2 - 1; + int maxX2m2 = maxX2 - 2; + int maxX2m3 = maxX2 - 3; + + int minX3 = 0; + int minX3p1 = minX3 + 1; + int minX3p2 = minX3 + 2; + int minX3p3 = minX3 + 3; + int maxX3m1 = maxX3 - 1; + int maxX3m2 = maxX3 - 2; + int maxX3m3 = maxX3 - 3; + vector_type &sdata = sender->getData(); + + int index = 0; + // EAST + if (sendDir == D3Q27System::E) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, maxX1m3, x2, x3); + fillData(sdata, index, maxX1m2, x2, x3); + } + } + } + // WEST + else if (sendDir == D3Q27System::W) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, minX1p3, x2, x3); + fillData(sdata, index, minX1p2, x2, x3); + } + } + } + // NORTH + else if (sendDir == D3Q27System::N) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, maxX2m3, x3); + fillData(sdata, index, x1, maxX2m2, x3); + } + } + } + // SOUTH + else if (sendDir == D3Q27System::S) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, minX2p3, x3); + fillData(sdata, index, x1, minX2p2, x3); + } + } + } + + // TOP + else if (sendDir == D3Q27System::T) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, x2, maxX3m3); + fillData(sdata, index, x1, x2, maxX3m2); + } + } + } + // BOTTOM + else if (sendDir == D3Q27System::B) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, x2, minX3p3); + fillData(sdata, index, x1, x2, minX3p2); + } + } + } + // NORTHEAST + else if (sendDir == D3Q27System::NE) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, maxX1m3, maxX2m3, x3); + fillData(sdata, index, maxX1m2, maxX2m2, x3); + fillData(sdata, index, maxX1m3, maxX2m2, x3); + fillData(sdata, index, maxX1m2, maxX2m3, x3); + } + } + // NORTHWEST + else if (sendDir == D3Q27System::NW) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, minX1p3, maxX2m3, x3); + fillData(sdata, index, minX1p2, maxX2m2, x3); + fillData(sdata, index, minX1p3, maxX2m2, x3); + fillData(sdata, index, minX1p2, maxX2m3, x3); + } + } + // SOUTHWEST + else if (sendDir == D3Q27System::SW) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, minX1p3, minX2p3, x3); + fillData(sdata, index, minX1p2, minX2p2, x3); + fillData(sdata, index, minX1p3, minX2p2, x3); + fillData(sdata, index, minX1p2, minX2p3, x3); + } + } + // SOUTHEAST + else if (sendDir == D3Q27System::SE) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + fillData(sdata, index, maxX1m3, minX2p3, x3); + fillData(sdata, index, maxX1m2, minX2p2, x3); + fillData(sdata, index, maxX1m3, minX2p2, x3); + fillData(sdata, index, maxX1m2, minX2p3, x3); + } + } else if (sendDir == D3Q27System::TE) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, maxX1m3, x2, maxX3m3); + fillData(sdata, index, maxX1m2, x2, maxX3m2); + fillData(sdata, index, maxX1m3, x2, maxX3m2); + fillData(sdata, index, maxX1m2, x2, maxX3m3); + } + else if (sendDir == D3Q27System::BW) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, minX1p3, x2, minX3p3); + fillData(sdata, index, minX1p2, x2, minX3p2); + fillData(sdata, index, minX1p3, x2, minX3p2); + fillData(sdata, index, minX1p2, x2, minX3p3); + } + else if (sendDir == D3Q27System::BE) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, maxX1m3, x2, minX3p3); + fillData(sdata, index, maxX1m2, x2, minX3p2); + fillData(sdata, index, maxX1m3, x2, minX3p2); + fillData(sdata, index, maxX1m2, x2, minX3p3); + } + else if (sendDir == D3Q27System::TW) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + fillData(sdata, index, minX1p3, x2, maxX3m3); + fillData(sdata, index, minX1p2, x2, maxX3m2); + fillData(sdata, index, minX1p3, x2, maxX3m2); + fillData(sdata, index, minX1p2, x2, maxX3m3); + } + else if (sendDir == D3Q27System::TN) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, maxX2m3, maxX3m3); + fillData(sdata, index, x1, maxX2m2, maxX3m2); + fillData(sdata, index, x1, maxX2m3, maxX3m2); + fillData(sdata, index, x1, maxX2m2, maxX3m3); + } + else if (sendDir == D3Q27System::BS) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, minX2p3, minX3p3); + fillData(sdata, index, x1, minX2p2, minX3p2); + fillData(sdata, index, x1, minX2p3, minX3p2); + fillData(sdata, index, x1, minX2p2, minX3p3); + } + else if (sendDir == D3Q27System::BN) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, maxX2m3, minX3p3); + fillData(sdata, index, x1, maxX2m2, minX3p2); + fillData(sdata, index, x1, maxX2m3, minX3p2); + fillData(sdata, index, x1, maxX2m2, minX3p3); + } + else if (sendDir == D3Q27System::TS) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + fillData(sdata, index, x1, minX2p3, maxX3m3); + fillData(sdata, index, x1, minX2p2, maxX3m2); + fillData(sdata, index, x1, minX2p3, maxX3m2); + fillData(sdata, index, x1, minX2p2, maxX3m3); + } + else if (sendDir == D3Q27System::TSW) { + fillData(sdata, index, minX1p3, minX2p3, maxX3m3); + fillData(sdata, index, minX1p2, minX2p2, maxX3m2); + fillData(sdata, index, minX1p3, minX2p2, maxX3m2); + fillData(sdata, index, minX1p2, minX2p3, maxX3m2); + fillData(sdata, index, minX1p2, minX2p2, maxX3m3); + fillData(sdata, index, minX1p3, minX2p3, maxX3m2); + fillData(sdata, index, minX1p3, minX2p2, maxX3m3); + fillData(sdata, index, minX1p2, minX2p3, maxX3m3); + } else if (sendDir == D3Q27System::TSE) { + fillData(sdata, index, maxX1m3, minX1p3, maxX3m3); + fillData(sdata, index, maxX1m2, minX1p2, maxX3m2); + fillData(sdata, index, maxX1m3, minX1p2, maxX3m2); + fillData(sdata, index, maxX1m2, minX1p3, maxX3m2); + fillData(sdata, index, maxX1m2, minX1p2, maxX3m3); + fillData(sdata, index, maxX1m3, minX1p3, maxX3m2); + fillData(sdata, index, maxX1m3, minX1p2, maxX3m3); + fillData(sdata, index, maxX1m2, minX1p3, maxX3m3); + } else if (sendDir == D3Q27System::TNW) { + fillData(sdata, index, minX1p3, maxX2m3, maxX3m3); + fillData(sdata, index, minX1p2, maxX2m2, maxX3m2); + fillData(sdata, index, minX1p3, maxX2m2, maxX3m2); + fillData(sdata, index, minX1p2, maxX2m3, maxX3m2); + fillData(sdata, index, minX1p2, maxX2m2, maxX3m3); + fillData(sdata, index, minX1p3, maxX2m3, maxX3m2); + fillData(sdata, index, minX1p3, maxX2m2, maxX3m3); + fillData(sdata, index, minX1p2, maxX2m3, maxX3m3); + } else if (sendDir == D3Q27System::TNE) { + fillData(sdata, index, maxX1m3, maxX2m3, maxX3m3); + fillData(sdata, index, maxX1m2, maxX2m2, maxX3m2); + fillData(sdata, index, maxX1m3, maxX2m2, maxX3m2); + fillData(sdata, index, maxX1m2, maxX2m3, maxX3m2); + fillData(sdata, index, maxX1m2, maxX2m2, maxX3m3); + fillData(sdata, index, maxX1m3, maxX2m3, maxX3m2); + fillData(sdata, index, maxX1m3, maxX2m2, maxX3m3); + fillData(sdata, index, maxX1m2, maxX2m3, maxX3m3); + } else if (sendDir == D3Q27System::BSW) { + fillData(sdata, index, minX1p3, minX2p3, minX3p3); + fillData(sdata, index, minX1p2, minX2p2, minX3p2); + fillData(sdata, index, minX1p3, minX2p2, minX3p2); + fillData(sdata, index, minX1p2, minX2p3, minX3p2); + fillData(sdata, index, minX1p2, minX2p2, minX3p3); + fillData(sdata, index, minX1p3, minX2p3, minX3p2); + fillData(sdata, index, minX1p3, minX2p2, minX3p3); + fillData(sdata, index, minX1p2, minX2p3, minX3p3); + } else if (sendDir == D3Q27System::BSE) { + fillData(sdata, index, maxX1m3, minX2p3, minX3p3); + fillData(sdata, index, maxX1m2, minX2p2, minX3p2); + fillData(sdata, index, maxX1m3, minX2p2, minX3p2); + fillData(sdata, index, maxX1m2, minX2p3, minX3p2); + fillData(sdata, index, maxX1m2, minX2p2, minX3p3); + fillData(sdata, index, maxX1m3, minX2p3, minX3p2); + fillData(sdata, index, maxX1m3, minX2p2, minX3p3); + fillData(sdata, index, maxX1m2, minX2p3, minX3p3); + } else if (sendDir == D3Q27System::BNW) { + fillData(sdata, index, minX1p3, maxX2m3, minX3p3); + fillData(sdata, index, minX1p2, maxX2m2, minX3p2); + fillData(sdata, index, minX1p3, maxX2m2, minX3p2); + fillData(sdata, index, minX1p2, maxX2m3, minX3p2); + fillData(sdata, index, minX1p2, maxX2m2, minX3p3); + fillData(sdata, index, minX1p3, maxX2m3, minX3p2); + fillData(sdata, index, minX1p3, maxX2m2, minX3p3); + fillData(sdata, index, minX1p2, maxX2m3, minX3p3); + } else if (sendDir == D3Q27System::BNE) { + fillData(sdata, index, maxX1m3, maxX2m3, minX3p3); + fillData(sdata, index, maxX1m2, maxX2m2, minX3p2); + fillData(sdata, index, maxX1m3, maxX2m2, minX3p2); + fillData(sdata, index, maxX1m2, maxX2m3, minX3p2); + fillData(sdata, index, maxX1m2, maxX2m2, minX3p3); + fillData(sdata, index, maxX1m3, maxX2m3, minX3p2); + fillData(sdata, index, maxX1m3, maxX2m2, minX3p3); + fillData(sdata, index, maxX1m2, maxX2m3, minX3p3); + } else + UB_THROW(UbException(UB_EXARGS, "unknown dir")); +} +//////////////////////////////////////////////////////////////////////// +void ThreeDistributionsFullVectorConnector2::distributeReceiveVectors() +{ + updatePointers(); + distributeData(); +} +//////////////////////////////////////////////////////////////////////// +void ThreeDistributionsFullVectorConnector2::distributeData() +{ + vector_type &rdata = receiver->getData(); + + int index = 0; + //////////////////////////////////////////////////////////// + // relation between ghost layer and regular nodes + // maxX1m3 maxX1m2 ... minX1p2 minX1p3 - regular nodes + // minX1 minX1p1 ... maxX1m1 maxX1 - ghost layer + //////////////////////////////////////////////////////////// + + int minX1 = 0; + int minX1p1 = minX1 + 1; + int minX1p2 = minX1 + 2; + int minX1p3 = minX1 + 3; + int maxX1m1 = maxX1 - 1; + int maxX1m2 = maxX1 - 2; + int maxX1m3 = maxX1 - 3; + + int minX2 = 0; + int minX2p1 = minX2 + 1; + int minX2p2 = minX2 + 2; + int minX2p3 = minX2 + 3; + int maxX2m1 = maxX2 - 1; + int maxX2m2 = maxX2 - 2; + int maxX2m3 = maxX2 - 3; + + int minX3 = 0; + int minX3p1 = minX3 + 1; + int minX3p2 = minX3 + 2; + int minX3p3 = minX3 + 3; + int maxX3m1 = maxX3 - 1; + int maxX3m2 = maxX3 - 2; + int maxX3m3 = maxX3 - 3; + + // EAST + if (sendDir == D3Q27System::W) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, minX1, x2, x3); + distributeData(rdata, index, minX1p1, x2, x3); + } + } + } + // WEST + else if (sendDir == D3Q27System::E) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, maxX1, x2, x3); + distributeData(rdata, index, maxX1m1, x2, x3); + } + } + } + // NORTH + else if (sendDir == D3Q27System::S) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, minX2, x3); + distributeData(rdata, index, x1, minX2p1, x3); + } + } + } + // SOUTH + else if (sendDir == D3Q27System::N) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, maxX2, x3); + distributeData(rdata, index, x1, maxX2m1, x3); + } + } + } + + // TOP + else if (sendDir == D3Q27System::B) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, x2, minX3); + distributeData(rdata, index, x1, x2, minX3p1); + } + } + } + // BOTTOM + else if (sendDir == D3Q27System::T) { + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, x2, maxX3); + distributeData(rdata, index, x1, x2, maxX3m1); + } + } + } + // NORTHEAST + else if (sendDir == D3Q27System::SW) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, minX1, minX2, x3); + distributeData(rdata, index, minX1p1, minX2p1, x3); + distributeData(rdata, index, minX1, minX2p1, x3); + distributeData(rdata, index, minX1p1, minX2, x3); + } + } + // NORTHWEST + else if (sendDir == D3Q27System::SE) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, maxX1, minX2, x3); + distributeData(rdata, index, maxX1m1, minX2p1, x3); + distributeData(rdata, index, maxX1, minX2p1, x3); + distributeData(rdata, index, maxX1m1, minX2, x3); + } + } + // SOUTHWEST + else if (sendDir == D3Q27System::NE) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, maxX1, maxX2, x3); + distributeData(rdata, index, maxX1m1, maxX2m1, x3); + distributeData(rdata, index, maxX1, maxX2m1, x3); + distributeData(rdata, index, maxX1m1, maxX2, x3); + } + } + // SOUTHEAST + else if (sendDir == D3Q27System::NW) { + for (int x3 = minX3p2; x3 <= maxX3m2; x3++) { + distributeData(rdata, index, minX1, maxX2, x3); + distributeData(rdata, index, minX1p1, maxX2m1, x3); + distributeData(rdata, index, minX1, maxX2m1, x3); + distributeData(rdata, index, minX1p1, maxX2, x3); + } + } else if (sendDir == D3Q27System::BW) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, minX1, x2, minX3); + distributeData(rdata, index, minX1p1, x2, minX3p1); + distributeData(rdata, index, minX1, x2, minX3p1); + distributeData(rdata, index, minX1p1, x2, minX3); + } + else if (sendDir == D3Q27System::TE) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, maxX1, x2, maxX3); + distributeData(rdata, index, maxX1m1, x2, maxX3m1); + distributeData(rdata, index, maxX1, x2, maxX3m1); + distributeData(rdata, index, maxX1m1, x2, maxX3); + } + else if (sendDir == D3Q27System::TW) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, minX1, x2, maxX3); + distributeData(rdata, index, minX1p1, x2, maxX3m1); + distributeData(rdata, index, minX1, x2, maxX3m1); + distributeData(rdata, index, minX1p1, x2, maxX3); + } + else if (sendDir == D3Q27System::BE) + for (int x2 = minX2p2; x2 <= maxX2m2; x2++) { + distributeData(rdata, index, maxX1, x2, minX3); + distributeData(rdata, index, maxX1m1, x2, minX3p1); + distributeData(rdata, index, maxX1, x2, minX3p1); + distributeData(rdata, index, maxX1m1, x2, minX3); + } + else if (sendDir == D3Q27System::BS) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, minX2, minX3); + distributeData(rdata, index, x1, minX2p1, minX3p1); + distributeData(rdata, index, x1, minX2, minX3p1); + distributeData(rdata, index, x1, minX2p1, minX3); + } + else if (sendDir == D3Q27System::TN) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, maxX2, maxX3); + distributeData(rdata, index, x1, maxX2m1, maxX3m1); + distributeData(rdata, index, x1, maxX2, maxX3m1); + distributeData(rdata, index, x1, maxX2m1, maxX3); + } + else if (sendDir == D3Q27System::TS) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, minX2, maxX3); + distributeData(rdata, index, x1, minX2p1, maxX3m1); + distributeData(rdata, index, x1, minX2, maxX3m1); + distributeData(rdata, index, x1, minX2p1, maxX3); + } + else if (sendDir == D3Q27System::BN) + for (int x1 = minX1p2; x1 <= maxX1m2; x1++) { + distributeData(rdata, index, x1, maxX2, minX3); + distributeData(rdata, index, x1, maxX2m1, minX3p1); + distributeData(rdata, index, x1, maxX2, minX3p1); + distributeData(rdata, index, x1, maxX2m1, minX3); + } + else if (sendDir == D3Q27System::BNE) { + distributeData(rdata, index, maxX1, maxX2, minX3); + distributeData(rdata, index, maxX1m1, maxX2m1, minX3p1); + distributeData(rdata, index, maxX1, maxX2m1, minX3p1); + distributeData(rdata, index, maxX1m1, maxX2, minX3p1); + distributeData(rdata, index, maxX1m1, maxX2m1, minX3); + distributeData(rdata, index, maxX1, maxX2, minX3p1); + distributeData(rdata, index, maxX1, maxX2m1, minX3); + distributeData(rdata, index, maxX1m1, maxX2, minX3); + } else if (sendDir == D3Q27System::BNW) { + distributeData(rdata, index, minX1, maxX2, minX3); + distributeData(rdata, index, minX1p1, maxX2m1, minX3p1); + distributeData(rdata, index, minX1, maxX2m1, minX3p1); + distributeData(rdata, index, minX1p1, maxX2, minX3p1); + distributeData(rdata, index, minX1p1, maxX2m1, minX3); + distributeData(rdata, index, minX1, maxX2, minX3p1); + distributeData(rdata, index, minX1, maxX2m1, minX3); + distributeData(rdata, index, minX1p1, maxX2, minX3); + } else if (sendDir == D3Q27System::BSE) { + distributeData(rdata, index, maxX1, minX2, minX3); + distributeData(rdata, index, maxX1m1, minX2p1, minX3p1); + distributeData(rdata, index, maxX1, minX2p1, minX3p1); + distributeData(rdata, index, maxX1m1, minX2, minX3p1); + distributeData(rdata, index, maxX1m1, minX2p1, minX3); + distributeData(rdata, index, maxX1, minX2, minX3p1); + distributeData(rdata, index, maxX1, minX2p1, minX3); + distributeData(rdata, index, maxX1m1, minX2, minX3); + } else if (sendDir == D3Q27System::BSW) { + distributeData(rdata, index, minX1, minX2, minX3); + distributeData(rdata, index, minX1p1, minX2p1, minX3p1); + distributeData(rdata, index, minX1, minX2p1, minX3p1); + distributeData(rdata, index, minX1p1, minX2, minX3p1); + distributeData(rdata, index, minX1p1, minX2p1, minX3); + distributeData(rdata, index, minX1, minX2, minX3p1); + distributeData(rdata, index, minX1, minX2p1, minX3); + distributeData(rdata, index, minX1p1, minX2, minX3); + } else if (sendDir == D3Q27System::TNE) { + distributeData(rdata, index, maxX1, maxX2, maxX3); + distributeData(rdata, index, maxX1m1, maxX2m1, maxX3m1); + distributeData(rdata, index, maxX1, maxX2m1, maxX3m1); + distributeData(rdata, index, maxX1m1, maxX2, maxX3m1); + distributeData(rdata, index, maxX1m1, maxX2m1, maxX3); + distributeData(rdata, index, maxX1, maxX2, maxX3m1); + distributeData(rdata, index, maxX1, maxX2m1, maxX3); + distributeData(rdata, index, maxX1m1, maxX2, maxX3); + } else if (sendDir == D3Q27System::TNW) { + distributeData(rdata, index, minX1, maxX2, maxX3); + distributeData(rdata, index, minX1p1, maxX2m1, maxX3m1); + distributeData(rdata, index, minX1, maxX2m1, maxX3m1); + distributeData(rdata, index, minX1p1, maxX2, maxX3m1); + distributeData(rdata, index, minX1p1, maxX2m1, maxX3); + distributeData(rdata, index, minX1, maxX2, maxX3m1); + distributeData(rdata, index, minX1, maxX2m1, maxX3); + distributeData(rdata, index, minX1p1, maxX2, maxX3); + } else if (sendDir == D3Q27System::TSE) { + distributeData(rdata, index, maxX1, minX2, maxX3); + distributeData(rdata, index, maxX1m1, minX2p1, maxX3m1); + distributeData(rdata, index, maxX1, minX2p1, maxX3m1); + distributeData(rdata, index, maxX1m1, minX2, maxX3m1); + distributeData(rdata, index, maxX1m1, minX2p1, maxX3); + distributeData(rdata, index, maxX1, minX2, maxX3m1); + distributeData(rdata, index, maxX1, minX2p1, maxX3); + distributeData(rdata, index, maxX1m1, minX2, maxX3); + } else if (sendDir == D3Q27System::TSW) { + distributeData(rdata, index, minX1, minX2, maxX3); + distributeData(rdata, index, minX1p1, minX2p1, maxX3m1); + distributeData(rdata, index, minX1, minX2p1, maxX3m1); + distributeData(rdata, index, minX1p1, minX2, maxX3m1); + distributeData(rdata, index, minX1p1, minX2p1, maxX3); + distributeData(rdata, index, minX1, minX2, maxX3m1); + distributeData(rdata, index, minX1, minX2p1, maxX3); + distributeData(rdata, index, minX1p1, minX2, maxX3); + } else + UB_THROW(UbException(UB_EXARGS, "unknown dir")); + +} +////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h index 87448a414..eb3c1e084 100644 --- a/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h +++ b/src/cpu/VirtualFluidsCore/Connectors/ThreeDistributionsFullVectorConnector2.h @@ -41,6 +41,7 @@ #include "D3Q27EsoTwist3DSplittedVector.h" #include "basics/container/CbArray3D.h" #include "basics/container/CbArray4D.h" +#include "DataSet3D.h" class EsoTwist3D; class Block3D; @@ -61,6 +62,8 @@ public: protected: inline void updatePointers() override; + void fillData() override; + void distributeData() 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; @@ -83,6 +86,8 @@ private: SPtr<EsoTwist3D> h2Dis; + SPtr<PressureFieldArray3D> pressure; + }; ////////////////////////////////////////////////////////////////////////// inline void ThreeDistributionsFullVectorConnector2::updatePointers() @@ -192,6 +197,8 @@ inline void ThreeDistributionsFullVectorConnector2::fillData(vector_type& sdata, sdata[index++] = (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1); sdata[index++] = (*this->zeroH2distributions)(x1, x2, x3); + + sdata[index++] = (*this->pressure)(x1, x2, x3); } ////////////////////////////////////////////////////////////////////////// inline void ThreeDistributionsFullVectorConnector2::distributeData(vector_type& rdata, int& index, int x1, int x2, int x3) @@ -286,6 +293,8 @@ inline void ThreeDistributionsFullVectorConnector2::distributeData(vector_type& (*this->nonLocalH2distributions)(D3Q27System::ET_BNE, x1, x2, x3 + 1) = rdata[index++]; (*this->zeroH2distributions)(x1, x2, x3) = rdata[index++]; + + (*this->pressure)(x1, x2, x3) = rdata[index++]; } diff --git a/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp b/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp index d8ee65934..6739e5599 100644 --- a/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp +++ b/src/cpu/VirtualFluidsCore/Interactors/InteractorsHelper.cpp @@ -80,7 +80,7 @@ void InteractorsHelper::deleteSolidBlocks() } } - if (deleteBlocks) + if (interactors.size() > 0 && deleteBlocks) updateGrid(); } ////////////////////////////////////////////////////////////////////////// diff --git a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h index 37a414515..57d61fced 100644 --- a/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h +++ b/src/cpu/VirtualFluidsCore/Visitors/SetConnectorsBlockVisitor.h @@ -49,6 +49,7 @@ #include "ThreeDistributionsFullDirectConnector.h" #include "ThreeDistributionsFullDirectConnector2.h" #include "ThreeDistributionsFullVectorConnector.h" +#include "ThreeDistributionsFullVectorConnector2.h" #include <basics/transmitter/TbTransmitterLocal.h> //! \brief A class sets connectors between blocks. @@ -159,6 +160,6 @@ void SetConnectorsBlockVisitor<T1, T2>::setRemoteConnectors(SPtr<Block3D> sblock using OneDistributionSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<OneDistributionFullDirectConnector, OneDistributionFullVectorConnector>; using TwoDistributionsSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<TwoDistributionsFullDirectConnector, TwoDistributionsFullVectorConnector>; using ThreeDistributionsSetConnectorsBlockVisitor = SetConnectorsBlockVisitor<ThreeDistributionsFullDirectConnector, ThreeDistributionsFullVectorConnector>; -using ThreeDistributionsSetConnectorsBlockVisitor2 = SetConnectorsBlockVisitor<ThreeDistributionsFullDirectConnector2, ThreeDistributionsFullVectorConnector>; +using ThreeDistributionsSetConnectorsBlockVisitor2 = SetConnectorsBlockVisitor<ThreeDistributionsFullDirectConnector2, ThreeDistributionsFullVectorConnector2>; #endif // SETCONNECTORSBLOCKVISITOR_H -- GitLab