summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Kummerlaender2018-12-29 16:17:55 +0100
committerAdrian Kummerlaender2019-06-24 15:13:44 +0200
commit62fa2f8b5d21520b352c7421d4d027dd3a5a7abc (patch)
treeccba7a168c24c3583ffce1a34282f8bb5c0184de
parent5cb634a0c8bf7549322168225bbe65b478a4ad8f (diff)
downloadgrid_refinement_openlb-62fa2f8b5d21520b352c7421d4d027dd3a5a7abc.tar
grid_refinement_openlb-62fa2f8b5d21520b352c7421d4d027dd3a5a7abc.tar.gz
grid_refinement_openlb-62fa2f8b5d21520b352c7421d4d027dd3a5a7abc.tar.bz2
grid_refinement_openlb-62fa2f8b5d21520b352c7421d4d027dd3a5a7abc.tar.lz
grid_refinement_openlb-62fa2f8b5d21520b352c7421d4d027dd3a5a7abc.tar.xz
grid_refinement_openlb-62fa2f8b5d21520b352c7421d4d027dd3a5a7abc.tar.zst
grid_refinement_openlb-62fa2f8b5d21520b352c7421d4d027dd3a5a7abc.zip
Bidirectional coupling without regard for correctness
Looks surprisingly well from a purely visual perspective.
-rw-r--r--apps/adrian/poiseuille2d/poiseuille2d.cpp72
1 files 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 <typename T, template<typename> class DESCRIPTOR>
+void coupleC2F(Grid<T,DESCRIPTOR>& coarse, Grid<T,DESCRIPTOR>& 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<T>::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<T>::q; ++i) {
+ fineLattice.get(0,1+2*y)[i] = 0.5 * (coarseLattice.get(x,y)[i] + coarseLattice.get(x,y+1)[i]);
+ }
+ }
+}
+
+template <typename T, template<typename> class DESCRIPTOR>
+void coupleF2C(Grid<T,DESCRIPTOR>& coarse, Grid<T,DESCRIPTOR>& 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<T>::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<T, DESCRIPTOR>* 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);
}