From 531c88ab94a11087f41dd07be5fc6c16b7ddad2d Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Sun, 6 Jan 2019 22:26:50 +0100 Subject: Test refinement around obstacle Coupler construction is to be wrapped by `Grid::refine` for refinement areas that are fully inside the coarse domain. --- apps/adrian/poiseuille2d/poiseuille2d.cpp | 50 +++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 16 deletions(-) (limited to 'apps') diff --git a/apps/adrian/poiseuille2d/poiseuille2d.cpp b/apps/adrian/poiseuille2d/poiseuille2d.cpp index 6c50339..f160135 100644 --- a/apps/adrian/poiseuille2d/poiseuille2d.cpp +++ b/apps/adrian/poiseuille2d/poiseuille2d.cpp @@ -38,7 +38,7 @@ typedef double T; const T lx = 4.; // length of the channel const T ly = 1.; // height of the channel const int N = 30; // resolution of the model -const T Re = 100.; // Reynolds number +const T Re = 100.; // Reynolds number const T maxPhysT = 60.; // 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 @@ -68,8 +68,8 @@ void prepareGeometry(UnitConverter const& converter, IndicatorCuboid2D outflow(extend, origin); superGeometry.rename(1,4,1,outflow); - //IndicatorCuboid2D obstacle(Vector{0.5,0.2}, Vector{1.75,0.4}); - //superGeometry.rename(1,2,obstacle); + IndicatorCuboid2D obstacle(Vector{0.2,0.1}, Vector{1.25,0.45}); + superGeometry.rename(1,5,obstacle); // Removes all not needed boundary voxels outside the surface superGeometry.clean(); @@ -365,8 +365,11 @@ public: { OLB_ASSERT(util::nearZero(extend[0]) || util::nearZero(extend[1]), "Coupling is only implemented alongside unit vectors"); - _coarse.getCuboidGeometry().getFloorLatticeR(_origin, _coarseOrigin); - _fine.getCuboidGeometry().getFloorLatticeR(_origin, _fineOrigin); + std::vector tmp(3,0); + _coarse.getCuboidGeometry().getLatticeR(_origin.toStdVector(), tmp); + _coarseOrigin = tmp; + _fine.getCuboidGeometry().getLatticeR(_origin.toStdVector(), tmp); + _fineOrigin = tmp; } }; @@ -611,8 +614,8 @@ int main(int argc, char* argv[]) Vector coarseExtend { lx, ly }; IndicatorCuboid2D coarseCuboid(coarseExtend, coarseOrigin); - Vector fineOrigin { 0.25 * lx, 0.0 }; - Vector fineExtend { 0.5 * lx, ly }; + Vector fineOrigin { 0.25 * lx, 0.3 }; + Vector fineExtend { 0.5 * lx, 0.4 }; IndicatorCuboid2D fineCuboid(fineExtend, fineOrigin); auto coarseGrid = Grid::make(coarseCuboid, N, 0.8, Re); @@ -621,9 +624,12 @@ int main(int argc, char* argv[]) prepareGeometry(coarseGrid->getConverter(), coarseGrid->getSuperGeometry()); prepareGeometry(fineGrid->getConverter(), fineGrid->getSuperGeometry()); - IndicatorCuboid2D overlapCuboid(Vector{fineExtend[0]-2*coarseDeltaX, fineExtend[1]}, Vector{fineOrigin[0]+coarseDeltaX, fineOrigin[1]}); + fineGrid->getSuperGeometry().rename(2,1); + fineGrid->getSuperGeometry().rename(5,2); + IndicatorCuboid2D overlapCuboid(fineExtend - 4*coarseDeltaX, fineOrigin + 2*coarseDeltaX); coarseGrid->getSuperGeometry().rename(1,0,overlapCuboid); coarseGrid->getSuperGeometry().rename(2,0,overlapCuboid); + coarseGrid->getSuperGeometry().rename(5,0,overlapCuboid); Dynamics* coarseBulkDynamics; coarseBulkDynamics = new BGKdynamics( @@ -664,15 +670,15 @@ int main(int argc, char* argv[]) residuum); timer.start(); - const Vector originC2F = fineOrigin; - const Vector extendC2F { 0, fineExtend[1] }; - FineCoupler fineCoupler0(*coarseGrid, *fineGrid, fineOrigin, extendC2F); - FineCoupler fineCoupler1(*coarseGrid, *fineGrid, fineOrigin + Vector(fineExtend[0],0), extendC2F); + FineCoupler fineCoupler0(*coarseGrid, *fineGrid, fineOrigin, Vector{0,fineExtend[1]+coarseDeltaX}); + FineCoupler fineCoupler1(*coarseGrid, *fineGrid, fineOrigin + Vector{fineExtend[0],0}, Vector{0,fineExtend[1]+coarseDeltaX}); + FineCoupler fineCoupler2(*coarseGrid, *fineGrid, fineOrigin + Vector(0,fineExtend[1]), Vector{fineExtend[0]+coarseDeltaX,0}); + FineCoupler fineCoupler3(*coarseGrid, *fineGrid, fineOrigin, Vector{fineExtend[0]+coarseDeltaX,0}); - const Vector originF2C { fineOrigin[0] + coarseDeltaX, fineOrigin[1] }; - const Vector extendF2C { 0, fineExtend[1] }; - CoarseCoupler coarseCoupler0(*coarseGrid, *fineGrid, originF2C, extendF2C); - CoarseCoupler coarseCoupler1(*coarseGrid, *fineGrid, fineOrigin + Vector(fineExtend[0]-coarseDeltaX,0), extendF2C); + CoarseCoupler coarseCoupler0(*coarseGrid, *fineGrid, fineOrigin + coarseDeltaX, Vector{0,fineExtend[1]-2*coarseDeltaX}); + CoarseCoupler coarseCoupler1(*coarseGrid, *fineGrid, fineOrigin + Vector(fineExtend[0]-coarseDeltaX,coarseDeltaX), Vector{0,fineExtend[1]-2*coarseDeltaX}); + CoarseCoupler coarseCoupler2(*coarseGrid, *fineGrid, fineOrigin + Vector{coarseDeltaX,fineExtend[1]-coarseDeltaX}, Vector{fineExtend[0]-2*coarseDeltaX,0}); + CoarseCoupler coarseCoupler3(*coarseGrid, *fineGrid, fineOrigin + coarseDeltaX, Vector{fineExtend[0]-2*coarseDeltaX,0}); for (int iT = 0; iT < coarseGrid->getConverter().getLatticeTime(maxPhysT); ++iT) { if (converge.hasConverged()) { @@ -682,6 +688,8 @@ int main(int argc, char* argv[]) fineCoupler0.store(); fineCoupler1.store(); + fineCoupler2.store(); + fineCoupler3.store(); coarseGrid->getSuperLattice().collideAndStream(); fineGrid->getSuperLattice().collideAndStream(); @@ -689,15 +697,25 @@ int main(int argc, char* argv[]) fineCoupler0.couple(); fineCoupler1.interpolate(); fineCoupler1.couple(); + fineCoupler2.interpolate(); + fineCoupler2.couple(); + fineCoupler3.interpolate(); + fineCoupler3.couple(); fineGrid->getSuperLattice().collideAndStream(); fineCoupler0.store(); fineCoupler0.couple(); fineCoupler1.store(); fineCoupler1.couple(); + fineCoupler2.store(); + fineCoupler2.couple(); + fineCoupler3.store(); + fineCoupler3.couple(); coarseCoupler0.couple(); coarseCoupler1.couple(); + coarseCoupler2.couple(); + coarseCoupler3.couple(); getResults( "coarse_", -- cgit v1.2.3