summaryrefslogtreecommitdiff
path: root/apps/adrian/poiseuille2d
diff options
context:
space:
mode:
authorAdrian Kummerlaender2019-01-08 14:44:44 +0100
committerAdrian Kummerlaender2019-06-24 15:16:01 +0200
commite1626f2eb19215482aa6f17966f5e54e3a0c4faa (patch)
treed4ce5ef842bffc3e73875cd9f32711464371a817 /apps/adrian/poiseuille2d
parentae4f808b51329a236dcbd7671ceb8c85c3906b6f (diff)
downloadgrid_refinement_openlb-e1626f2eb19215482aa6f17966f5e54e3a0c4faa.tar
grid_refinement_openlb-e1626f2eb19215482aa6f17966f5e54e3a0c4faa.tar.gz
grid_refinement_openlb-e1626f2eb19215482aa6f17966f5e54e3a0c4faa.tar.bz2
grid_refinement_openlb-e1626f2eb19215482aa6f17966f5e54e3a0c4faa.tar.lz
grid_refinement_openlb-e1626f2eb19215482aa6f17966f5e54e3a0c4faa.tar.xz
grid_refinement_openlb-e1626f2eb19215482aa6f17966f5e54e3a0c4faa.tar.zst
grid_refinement_openlb-e1626f2eb19215482aa6f17966f5e54e3a0c4faa.zip
Further indicatorize geometry setup
Grid refinement is at its easiest when discrete materials are set using analytical - i.e. resolution independent - indicators.
Diffstat (limited to 'apps/adrian/poiseuille2d')
-rw-r--r--apps/adrian/poiseuille2d/poiseuille2d.cpp75
1 files changed, 43 insertions, 32 deletions
diff --git a/apps/adrian/poiseuille2d/poiseuille2d.cpp b/apps/adrian/poiseuille2d/poiseuille2d.cpp
index f30e9b4..c8a4659 100644
--- a/apps/adrian/poiseuille2d/poiseuille2d.cpp
+++ b/apps/adrian/poiseuille2d/poiseuille2d.cpp
@@ -35,8 +35,8 @@ typedef double T;
#define DESCRIPTOR D2Q9Descriptor
-const T lx = 4.; // length of the channel
-const T ly = 1.; // height of the channel
+const T lx = 4.0; // length of the channel
+const T ly = 1.0; // height of the channel
const int N = 30; // resolution of the model
const T Re = 100.; // Reynolds number
const T maxPhysT = 60.; // max. simulation time in s, SI unit
@@ -51,32 +51,45 @@ void prepareGeometry(UnitConverter<T,DESCRIPTOR> const& converter,
OstreamManager clout(std::cout,"prepareGeometry");
clout << "Prepare Geometry ..." << std::endl;
- superGeometry.rename(0,2);
+ superGeometry.rename(0,1);
+
+ const T physSpacing = converter.getPhysDeltaX();
+
// Set material number for bounce back boundaries
- superGeometry.rename(2,1,0,1);
+ {
+ const Vector<T,2> wallExtend {lx+physSpacing, physSpacing/2};
+ const Vector<T,2> wallOrigin {-physSpacing/4, -physSpacing/4};
+
+ IndicatorCuboid2D<T> lowerWall(wallExtend, wallOrigin);
+ superGeometry.rename(1,2,lowerWall);
- T physSpacing = converter.getPhysDeltaX();
- Vector<T,2> extend{ physSpacing / 2, ly };
- Vector<T,2> origin{ -physSpacing / 4, 0 };
+ IndicatorCuboid2D<T> upperWall(wallExtend, wallOrigin + Vector<T,2> {0,ly});
+ superGeometry.rename(1,2,upperWall);
+ }
+
+ // Set material number for inflow and outflow
+ {
+ const Vector<T,2> extend { physSpacing/2, ly};
+ const Vector<T,2> origin {-physSpacing/4, -physSpacing/4};
- // Set material number for inflow
- IndicatorCuboid2D<T> inflow(extend, origin);
- superGeometry.rename(1,3,1,inflow);
+ IndicatorCuboid2D<T> inflow(extend, origin);
+ superGeometry.rename(1,3,inflow);
- // Set material number for outflow
- origin[0] = lx - physSpacing / 4;
- IndicatorCuboid2D<T> outflow(extend, origin);
- superGeometry.rename(1,4,1,outflow);
+ IndicatorCuboid2D<T> outflow(extend, origin + Vector<T,2> {lx,0});
+ superGeometry.rename(1,4,outflow);
+ }
- IndicatorCuboid2D<T> obstacle(Vector<T,2> {0.2,0.1}, Vector<T,2> {1.25,0.45});
- superGeometry.rename(1,5,obstacle);
+ // Set material number for vertically centered obstacle
+ {
+ const Vector<T,2> extend {0.1, 0.1};
+ const Vector<T,2> origin {1.25, (ly-extend[1])/2};
+ IndicatorCuboid2D<T> obstacle(extend, origin);
+ superGeometry.rename(1,2,obstacle);
+ }
- // Removes all not needed boundary voxels outside the surface
superGeometry.clean();
- // Removes all not needed boundary voxels inside the surface
superGeometry.innerClean();
superGeometry.checkForErrors();
-
superGeometry.print();
clout << "Prepare Geometry ... OK" << std::endl;
@@ -203,27 +216,25 @@ int main(int argc, char* argv[])
singleton::directories().setOutputDir("./tmp/");
OstreamManager clout(std::cout,"main");
- Vector<T,2> coarseOrigin { 0.0, 0.0 };
- Vector<T,2> coarseExtend { lx, ly };
+ const Vector<T,2> coarseOrigin {0.0, 0.0};
+ const Vector<T,2> coarseExtend {lx, ly};
IndicatorCuboid2D<T> coarseCuboid(coarseExtend, coarseOrigin);
- Vector<T,2> fineOrigin { 0.25 * lx, 0.2 };
- Vector<T,2> fineExtend { 0.6 * lx, 0.6 };
-
auto coarseGrid = Grid2D<T,DESCRIPTOR>::make(coarseCuboid, N, 0.8, Re);
- auto fineGrid = &coarseGrid->refine(fineOrigin, fineExtend);
-
prepareGeometry(coarseGrid->getConverter(), coarseGrid->getSuperGeometry());
+
+ const Vector<T,2> wantedFineExtend {2.0, 0.75};
+ const Vector<T,2> fineOrigin = coarseGrid->alignToGrid({0.8, (ly-wantedFineExtend[1])/2});
+ const Vector<T,2> fineExtend = coarseGrid->alignToGrid(fineOrigin + wantedFineExtend) - fineOrigin;
+
+ auto fineGrid = &coarseGrid->refine(fineOrigin, fineExtend);
prepareGeometry(fineGrid->getConverter(), fineGrid->getSuperGeometry());
const T coarseDeltaX = coarseGrid->getConverter().getPhysDeltaX();
- fineGrid->getSuperGeometry().rename(2,1);
- fineGrid->getSuperGeometry().rename(5,2);
- IndicatorCuboid2D<T> 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);
+ IndicatorCuboid2D<T> refinedOverlap(fineExtend - 4*coarseDeltaX, fineOrigin + 2*coarseDeltaX);
+ coarseGrid->getSuperGeometry().rename(1,0,refinedOverlap);
+ coarseGrid->getSuperGeometry().rename(2,0,refinedOverlap);
Dynamics<T, DESCRIPTOR>* coarseBulkDynamics;
coarseBulkDynamics = new BGKdynamics<T, DESCRIPTOR>(