/* 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 DESCRIPTOR> class FineCoupler2D; template class DESCRIPTOR> class CoarseCoupler2D; template class DESCRIPTOR> class RefiningGrid2D; 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 DESCRIPTOR> 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 DESCRIPTOR> 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