summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Kummerlaender2019-01-17 13:37:26 +0100
committerAdrian Kummerlaender2019-06-24 15:17:09 +0200
commitd900d8c794bb9d50f528bc8e72ceb594fbc292c8 (patch)
tree3e5852e239daae4086c3b9c1c7b70dbaf0cf5c53
parentac6ac9383dfcc3a688579dc1fb56874bc6ff392e (diff)
downloadgrid_refinement_openlb-d900d8c794bb9d50f528bc8e72ceb594fbc292c8.tar
grid_refinement_openlb-d900d8c794bb9d50f528bc8e72ceb594fbc292c8.tar.gz
grid_refinement_openlb-d900d8c794bb9d50f528bc8e72ceb594fbc292c8.tar.bz2
grid_refinement_openlb-d900d8c794bb9d50f528bc8e72ceb594fbc292c8.tar.xz
grid_refinement_openlb-d900d8c794bb9d50f528bc8e72ceb594fbc292c8.zip
Add named types to Grid2D constructor
This allows for readable differentiation between constructor overloads.
-rw-r--r--apps/adrian/cylinder2d/cylinder2d.cpp12
-rw-r--r--apps/adrian/poiseuille2d/poiseuille2d.cpp6
-rw-r--r--src/refinement/grid2D.h26
-rw-r--r--src/refinement/grid2D.hh44
4 files changed, 76 insertions, 12 deletions
diff --git a/apps/adrian/cylinder2d/cylinder2d.cpp b/apps/adrian/cylinder2d/cylinder2d.cpp
index cb0cfc6..739c02c 100644
--- a/apps/adrian/cylinder2d/cylinder2d.cpp
+++ b/apps/adrian/cylinder2d/cylinder2d.cpp
@@ -1,8 +1,8 @@
-/* Lattice Boltzmann sample, written in C++, using the OpenLB
- * library
+/*
+ * Lattice Boltzmann grid refinement sample, written in C++,
+ * using the OpenLB library
*
- * Copyright (C) 2007, 2012 Jonas Latt, Mathias J. Krause
- * Vojtech Cvrcek, Peter Weisbrod
+ * Copyright (C) 2019 Adrian Kummerländer
* E-mail contact: info@openlb.net
* The most recent release of OpenLB can be downloaded at
* <http://www.openlb.net/>
@@ -170,7 +170,7 @@ void getResults(const std::string& prefix,
vtmWriter.createMasterFile();
}
- if (iT%20==0) {
+ if (iT%100==0) {
vtmWriter.write(iT);
}
@@ -192,7 +192,7 @@ int main(int argc, char* argv[])
const Vector<T,2> coarseExtend {lx, ly};
IndicatorCuboid2D<T> coarseCuboid(coarseExtend, coarseOrigin);
- Grid2D<T,DESCRIPTOR> coarseGrid(coarseCuboid, N, baseTau, Re);
+ Grid2D<T,DESCRIPTOR> coarseGrid(coarseCuboid, N, RelaxationTime<T>(baseTau), Re);
prepareGeometry(coarseGrid);
const Vector<T,2> fineExtend {3.0, 1.5};
diff --git a/apps/adrian/poiseuille2d/poiseuille2d.cpp b/apps/adrian/poiseuille2d/poiseuille2d.cpp
index d92934b..19dc4d7 100644
--- a/apps/adrian/poiseuille2d/poiseuille2d.cpp
+++ b/apps/adrian/poiseuille2d/poiseuille2d.cpp
@@ -38,9 +38,9 @@ typedef double T;
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 int N = 50; // resolution of the model
const T Re = 100.; // Reynolds number
-const T baseTau = 0.8; // Relaxation time of coarsest grid
+const T uMax = 0.02; // Max lattice speed
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
@@ -184,7 +184,7 @@ int main(int argc, char* argv[])
const Vector<T,2> coarseExtend {lx/2, ly};
IndicatorCuboid2D<T> coarseCuboid(coarseExtend, coarseOrigin);
- Grid2D<T,DESCRIPTOR> coarseGrid(coarseCuboid, N, baseTau, Re);
+ Grid2D<T,DESCRIPTOR> coarseGrid(coarseCuboid, N, LatticeVelocity<T>(uMax), Re);
prepareGeometry(coarseGrid);
const T coarseDeltaX = coarseGrid.getConverter().getPhysDeltaX();
diff --git a/src/refinement/grid2D.h b/src/refinement/grid2D.h
index 9a20544..f58a4ea 100644
--- a/src/refinement/grid2D.h
+++ b/src/refinement/grid2D.h
@@ -43,6 +43,29 @@ template <typename T, template<typename> class DESCRIPTOR> class FineCoupler2D;
template <typename T, template<typename> class DESCRIPTOR> class CoarseCoupler2D;
template <typename T, template<typename> class DESCRIPTOR> class RefiningGrid2D;
+template <typename T, typename Identificator>
+class NamedType {
+private:
+ T _value;
+
+public:
+ explicit NamedType(const T& value):
+ _value(value) {}
+ explicit NamedType(T&& value):
+ _value(std::move(value)) {}
+
+ operator T() const
+ {
+ return _value;
+ }
+};
+
+template <typename T>
+using RelaxationTime = NamedType<T,struct NamedRelaxationTime>;
+
+template <typename T>
+using LatticeVelocity = NamedType<T,struct NamedLatticeVelocity>;
+
template <typename T, template<typename> class DESCRIPTOR>
class Grid2D {
protected:
@@ -60,7 +83,8 @@ protected:
std::vector<std::unique_ptr<CoarseCoupler2D<T,DESCRIPTOR>>> _coarseCouplers;
public:
- Grid2D(FunctorPtr<IndicatorF2D<T>>&& domainF, int resolution, T tau, int re);
+ Grid2D(FunctorPtr<IndicatorF2D<T>>&& domainF, int resolution, RelaxationTime<T> tau, int re);
+ Grid2D(FunctorPtr<IndicatorF2D<T>>&& domainF, int resolution, LatticeVelocity<T> uMax, int re);
UnitConverter<T,DESCRIPTOR>& getConverter();
CuboidGeometry2D<T>& getCuboidGeometry();
diff --git a/src/refinement/grid2D.hh b/src/refinement/grid2D.hh
index 02fe351..2bf2f7f 100644
--- a/src/refinement/grid2D.hh
+++ b/src/refinement/grid2D.hh
@@ -34,7 +34,11 @@ namespace olb {
template <typename T, template<typename> class DESCRIPTOR>
-Grid2D<T,DESCRIPTOR>::Grid2D(FunctorPtr<IndicatorF2D<T>>&& domainF, int resolution, T tau, int re):
+Grid2D<T,DESCRIPTOR>::Grid2D(
+ FunctorPtr<IndicatorF2D<T>>&& domainF,
+ int resolution,
+ RelaxationTime<T> tau,
+ int re):
_domainF(std::move(domainF)),
_converter(new UnitConverterFromResolutionAndRelaxationTime<T,DESCRIPTOR>(
resolution, // resolution: number of voxels per charPhysL
@@ -66,6 +70,42 @@ Grid2D<T,DESCRIPTOR>::Grid2D(FunctorPtr<IndicatorF2D<T>>&& domainF, int resoluti
}
template <typename T, template<typename> class DESCRIPTOR>
+Grid2D<T,DESCRIPTOR>::Grid2D(
+ FunctorPtr<IndicatorF2D<T>>&& domainF,
+ int resolution,
+ LatticeVelocity<T> velocity,
+ int re):
+ _domainF(std::move(domainF)),
+ _converter(new UnitConverterFromResolutionAndLatticeVelocity<T,DESCRIPTOR>(
+ resolution, // resolution: number of voxels per charPhysL
+ velocity, // maxLatticeVelocity
+ T{1}, // charPhysLength: reference length of simulation geometry
+ T{1}, // charPhysVelocity: maximal/highest expected velocity during simulation in __m / s__
+ T{1./re}, // physViscosity: physical kinematic viscosity in __m^2 / s__
+ T{1}, // physDensity: physical density in __kg / m^3__
+ T{1})),
+ _cuboids(new CuboidGeometry2D<T>(
+ *_domainF,
+ _converter->getConversionFactorLength(),
+#ifdef PARALLEL_MODE_MPI
+ singleton::mpi().getSize()
+#else
+ 1
+#endif
+ )),
+ _balancer(new HeuristicLoadBalancer<T>(
+ *_cuboids)),
+ _geometry(new SuperGeometry2D<T>(
+ *_cuboids,
+ *_balancer,
+ 2)),
+ _lattice(new SuperLattice2D<T,DESCRIPTOR>(
+ *_geometry))
+{
+ _converter->print();
+}
+
+template <typename T, template<typename> class DESCRIPTOR>
UnitConverter<T,DESCRIPTOR>& Grid2D<T,DESCRIPTOR>::getConverter()
{
return *_converter;
@@ -209,7 +249,7 @@ RefiningGrid2D<T,DESCRIPTOR>::RefiningGrid2D(
Grid2D<T,DESCRIPTOR>(
std::unique_ptr<IndicatorF2D<T>>(new IndicatorCuboid2D<T>(extend, origin)),
2*parentGrid.getConverter().getResolution(),
- 2*parentGrid.getConverter().getLatticeRelaxationTime() - 0.5,
+ RelaxationTime<T>(2*parentGrid.getConverter().getLatticeRelaxationTime() - 0.5),
parentGrid.getConverter().getReynoldsNumber()),
_origin(origin),
_extend(extend),