From 62fa2f8b5d21520b352c7421d4d027dd3a5a7abc Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Sat, 29 Dec 2018 16:17:55 +0100 Subject: Bidirectional coupling without regard for correctness Looks surprisingly well from a purely visual perspective. --- apps/adrian/poiseuille2d/poiseuille2d.cpp | 72 +++++++++++++++++++------------ 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/apps/adrian/poiseuille2d/poiseuille2d.cpp b/apps/adrian/poiseuille2d/poiseuille2d.cpp index 9415359..43f8631 100644 --- a/apps/adrian/poiseuille2d/poiseuille2d.cpp +++ b/apps/adrian/poiseuille2d/poiseuille2d.cpp @@ -43,9 +43,9 @@ typedef double T; const T lx = 2.; // length of the channel const T ly = 1.; // height of the channel -int N = 20; // resolution of the model +const int N = 20; // resolution of the model const T Re = 10.; // Reynolds number -const T maxPhysT = 20.; // max. simulation time in s, SI unit +const T maxPhysT = 40.; // max. simulation time in s, SI unit const T physInterval = 0.25; // interval for the convergence check in s const T residuum = 1e-5; // residuum for the convergence check const T tuner = 0.99; // for partialSlip only: 0->bounceBack, 1->freeSlip @@ -187,14 +187,13 @@ void getResults(const std::string& prefix, vtmWriter.addFunctor(velocity); vtmWriter.addFunctor(pressure); - const int vtmIter = converter.getLatticeTime(maxPhysT/100.); const int statIter = converter.getLatticeTime(maxPhysT/10.); - if ( iT==0 ) { + if (iT==0) { vtmWriter.createMasterFile(); } - if (iT%vtmIter==0 || hasConverged) { + if (iT%50==0) { vtmWriter.write(iT); } @@ -266,6 +265,39 @@ public: } }; +template class DESCRIPTOR> +void coupleC2F(Grid& coarse, Grid& fine) +{ + auto& coarseLattice = coarse.getSuperLattice().getBlockLattice(0); + auto& fineLattice = fine.getSuperLattice().getBlockLattice(0); + + const int x = coarseLattice.getNx()-2; + for (int y=0; y < coarseLattice.getNy(); ++y) { + for (int i=0; i < DESCRIPTOR::q; ++i) { + fineLattice.get(0, 2*y)[i] = coarseLattice.get(x,y)[i]; + } + } + for (int y=0; y < coarseLattice.getNy()-1; ++y) { + for (int i=0; i < DESCRIPTOR::q; ++i) { + fineLattice.get(0,1+2*y)[i] = 0.5 * (coarseLattice.get(x,y)[i] + coarseLattice.get(x,y+1)[i]); + } + } +} + +template class DESCRIPTOR> +void coupleF2C(Grid& coarse, Grid& fine) +{ + auto& coarseLattice = coarse.getSuperLattice().getBlockLattice(0); + auto& fineLattice = fine.getSuperLattice().getBlockLattice(0); + + const int x = coarseLattice.getNx()-1; + for (int y=0; y < coarseLattice.getNy(); ++y) { + for (int i=0; i < DESCRIPTOR::q; ++i) { + coarseLattice.get(x,y)[i] = fineLattice.get(2,2*y)[i]; + } + } +} + int main(int argc, char* argv[]) { olbInit(&argc, &argv); @@ -293,7 +325,6 @@ int main(int argc, char* argv[]) Re); prepareGeometry(coarseGrid.getConverter(), coarseGrid.getSuperGeometry()); - prepareGeometry(fineGrid.getConverter(), fineGrid.getSuperGeometry()); Dynamics* coarseBulkDynamics; @@ -335,31 +366,27 @@ int main(int argc, char* argv[]) residuum); timer.start(); - for (int iT = 0; iT < coarseGrid.getConverter().getLatticeTime(maxPhysT); iT += 2) { + for (int iT = 0; iT < coarseGrid.getConverter().getLatticeTime(maxPhysT); ++iT) { if (converge.hasConverged()) { clout << "Simulation converged." << endl; - getResults( - "coarse_", - coarseGrid.getSuperLattice(), - coarseGrid.getConverter(), - iT, - coarseGrid.getSuperGeometry(), - timer, - converge.hasConverged()); break; } coarseGrid.getSuperLattice().collideAndStream(); + fineGrid.getSuperLattice().collideAndStream(); + coupleC2F(coarseGrid, fineGrid); + fineGrid.getSuperLattice().collideAndStream(); + coupleC2F(coarseGrid, fineGrid); + coupleF2C(coarseGrid, fineGrid); + getResults( "coarse_", coarseGrid.getSuperLattice(), coarseGrid.getConverter(), - iT / 2, + iT, coarseGrid.getSuperGeometry(), timer, converge.hasConverged()); - - fineGrid.getSuperLattice().collideAndStream(); getResults( "fine_", fineGrid.getSuperLattice(), @@ -368,15 +395,6 @@ int main(int argc, char* argv[]) fineGrid.getSuperGeometry(), timer, converge.hasConverged()); - fineGrid.getSuperLattice().collideAndStream(); - getResults( - "fine_", - fineGrid.getSuperLattice(), - fineGrid.getConverter(), - iT+1, - fineGrid.getSuperGeometry(), - timer, - converge.hasConverged()); converge.takeValue(coarseGrid.getSuperLattice().getStatistics().getAverageEnergy(), true); } -- cgit v1.2.3