/* This file is part of the OpenLB library
*
* Copyright (C) 2019 Adrian Kummerländer
* E-mail contact: info@openlb.net
* The most recent release of OpenLB can be downloaded at
*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef REFINEMENT_GRID_2D_H
#define REFINEMENT_GRID_2D_H
#include
#include
#include
#include
#include "core/unitConverter.h"
#include "core/superLattice2D.h"
#include "geometry/superGeometry2D.h"
#include "geometry/cuboidGeometry2D.h"
#include "geometry/superGeometry2D.h"
#include "communication/loadBalancer.h"
#include "functors/analytical/indicator/indicatorF2D.h"
#include "utilities/functorPtr.h"
#include "utilities/namedType.h"
namespace olb {
template class FineCoupler2D;
template class CoarseCoupler2D;
template class RefiningGrid2D;
template class sOnLatticeBoundaryCondition2D;
template class sOffLatticeBoundaryCondition2D;
template
using RelaxationTime = utilities::NamedType;
template
using LatticeVelocity = utilities::NamedType;
template
struct Characteristics {
Characteristics(T l, T u, T nu, T rho):
length(l),
velocity(u),
viscosity(nu),
density(rho) { }
Characteristics(int Re):
Characteristics(1.0, 1.0, 1.0/Re, 1.0) { }
const T length;
const T velocity;
const T viscosity;
const T density;
};
template
class Grid2D {
protected:
FunctorPtr> _domainF;
const Characteristics _characteristics;
std::unique_ptr> _converter;
std::unique_ptr> _cuboids;
std::unique_ptr> _balancer;
std::unique_ptr> _geometry;
std::unique_ptr> _lattice;
std::vector>> _dynamics;
std::vector>> _onLatticeBoundaryConditions;
std::vector>> _offLatticeBoundaryConditions;
std::vector>> _fineGrids;
std::vector>> _fineCouplers;
std::vector>> _coarseCouplers;
public:
Grid2D(FunctorPtr>&& domainF,
RelaxationTime tau,
int resolution,
Characteristics characteristics);
Grid2D(FunctorPtr>&& domainF,
LatticeVelocity latticeVelocity,
int resolution,
Characteristics characteristics);
Grid2D(FunctorPtr>&& domainF, RelaxationTime tau, int resolution, int re);
Grid2D(FunctorPtr>&& domainF, LatticeVelocity uMax, int resolution, int re);
Characteristics getCharacteristics() const;
UnitConverter& getConverter();
CuboidGeometry2D& getCuboidGeometry();
LoadBalancer& getLoadBalancer();
SuperGeometry2D& getSuperGeometry();
SuperLattice2D& getSuperLattice();
Dynamics& addDynamics(std::unique_ptr>&& dynamics);
sOnLatticeBoundaryCondition2D& getOnLatticeBoundaryCondition();
sOffLatticeBoundaryCondition2D& getOffLatticeBoundaryCondition();
void collideAndStream();
FineCoupler2D& addFineCoupling(
Grid2D& fineGrid, Vector origin, Vector extend);
CoarseCoupler2D& addCoarseCoupling(
Grid2D& fineGrid, Vector origin, Vector extend);
Vector alignOriginToGrid(Vector physR) const;
Vector alignExtendToGrid(Vector physR) const;
RefiningGrid2D& refine(Vector origin, Vector extend, bool addCouplers=true);
void forEachGrid(std::function&)>&& f);
void forEachGrid(const std::string& id, std::function&,const std::string&)>&& f);
/// Returns the finest grid representing a physical position
/**
* Only works if pos is actually contained in a node of the refinement tree.
**/
Grid2D& locate(Vector pos);
std::size_t getActiveVoxelN() const;
};
template
class RefiningGrid2D : public Grid2D {
private:
const Vector _origin;
const Vector _extend;
Grid2D& _parentGrid;
public:
RefiningGrid2D(Grid2D& parentGrid, Vector origin, Vector extend);
Vector getOrigin() const;
Vector getExtend() const;
/// Indicates the subdomain of the coarse grid rendered moot by refinement
std::unique_ptr> getRefinedOverlap() const;
};
}
#endif