/* This file is part of the OpenLB library * * Copyright (C) 2012 Lukas Baron, Tim Dornieden, Mathias J. Krause, Albert Mink * 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 ANALYTICAL_F_H #define ANALYTICAL_F_H #include #include "analyticalBaseF.h" #include "indicator/smoothIndicatorF2D.h" #include "indicator/smoothIndicatorF3D.h" /** * The functor dimensions are given by F: S^m -> T^n (S=source, T=target) * and are implemented via GenericF(n,m). * Don't get confused by the flipped order of source and target. */ namespace olb { template class SmoothIndicatorSphere3D; template class RadiativeUnitConverter; //////////////////////////////////////////////////////////////////////////////// ////////implementation of several 1d,2d,3d functors (analyticalFXD)///////////// //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////1D//////////////////////////////////////////// /// AnalyticalConst1D: 1D -> XD, where XD is defined by value.size() template class AnalyticalConst1D : public AnalyticalF1D { private: // is constant return value of operator() std::vector _c; public: AnalyticalConst1D(T value); AnalyticalConst1D(const std::vector& value); bool operator() (T output[], const S x[]) override; }; /// AnalyticalLinear1D: 1D -> 1D troughout given points (x0,v0) and (x1,v1) // Punktsteigungsform template class AnalyticalLinear1D : public AnalyticalF1D { private: T _a; T _b; public: AnalyticalLinear1D(T a, T b); AnalyticalLinear1D(S x0, T v0, S x1, T v1); bool operator() (T output[], const S x[]) override; ///< returns line _a*x + _b }; /// AnalyticalRandom1D: 1D -> 1D with random image in (0,1) template class AnalyticalRandom1D : public AnalyticalF1D { public: AnalyticalRandom1D(); bool operator() (T output[], const S x[]) override; }; /// represents an inverse parabola profile like it is used in Poiseuille inflow /// note: output depends only on first parameter, maps 1D,2D,3D->1D template class AnalyticalSquare1D : public AnalyticalF1D { private: S _cp; S _r; T _maxi; public: AnalyticalSquare1D(S cp, S r, T maxi); bool operator() (T output[], const S x[]) override; }; /// SinusStartScale: 1D -> 1D a start curve based on sinus for a continuous transition at 0 and 1 template class SinusStartScale : public AnalyticalF1D { protected: S _numTimeSteps; T _maxValue; T _pi; public: SinusStartScale(int numTimeSteps=1, T maxValue=1); bool operator() (T output[], const S x[]) override; }; /// PolynomialStartScale: 1D -> 1D a start curve based on a polynomial fifth order for a continuous transition at 0 and 1: maxValue*(6*y^5-15*y^4+10*y^3) template class PolynomialStartScale : public AnalyticalF1D { protected: S _numTimeSteps; T _maxValue; public: PolynomialStartScale(S numTimeSteps=S(1), T maxValue=T(1)); bool operator() (T output[], const S x[]) override; }; /// Derivative of a given 1D functor computed with a finite difference template class AnalyticalDiffFD1D : public AnalyticalF1D { protected: AnalyticalF1D& _f; T _eps; public: AnalyticalDiffFD1D(AnalyticalF1D& f, T eps = 1.e-10); bool operator() (T output[], const T input[]) override; }; //////////////////////////////////2D//////////////////////////////////////////// template class AnalyticalComposed2D final : public AnalyticalF2D { private: AnalyticalF2D& _f0; AnalyticalF2D& _f1; public: AnalyticalComposed2D(AnalyticalF2D& f0, AnalyticalF2D& f1); bool operator() (T output[], const S x[]) override; }; /// AnalyticalConst2D: 2D -> XD, where XD is defined by value.size() template class AnalyticalConst2D final : public AnalyticalF2D { private: // is constant return value of operator() std::vector _c; public: AnalyticalConst2D(T value); AnalyticalConst2D(T value0, T value1); AnalyticalConst2D(T value0, T value1, T value2); AnalyticalConst2D(const std::vector& value); bool operator() (T output[], const S x[]) override; }; /// AnalyticalLinear2D: 2D -> 1D troughout given points (x0,y0,v0), (x1,y1,v1), (x2,y2,v2) template class AnalyticalLinear2D final : public AnalyticalF2D { protected: T _a; T _b; T _c; public: AnalyticalLinear2D(T a, T b, T c); AnalyticalLinear2D(S x0, S y0, T v0, S x1, S y1, T v1, S x2, S y2, T v2); bool operator() (T output[], const S x[]) override; }; /// AnalyticalRandom2D: 2D -> 1D with random image in (0,1) template class AnalyticalRandom2D final : public AnalyticalF2D { public: AnalyticalRandom2D(); bool operator() (T output[], const S x[]) override; }; /// AnalyticalRandom2D: 2D -> 1D with maxValue in the center decreasing linearly with the distrance to the center to zero at the radius and zero outside template class AnalyticalParticleAdsorptionLinear2D final : public AnalyticalF2D { protected: T _center[2]; T _radius; T _maxValue; public: AnalyticalParticleAdsorptionLinear2D(T center[], T radius, T maxValue); bool operator() (T output[], const S x[]); }; /** Computes resulting velocity of an object from translational and rotational velocity. * \param indicator Class defining the object (needs to be a SmoothIndicatorF2D) * \param u translational velocity of the object - expected in lattice units * \param omega rotational velocity of the object - expected in lattice units */ template class ParticleU2D : public AnalyticalF2D { protected: SmoothIndicatorF2D& _indicator; UnitConverter const& _converter; public: ParticleU2D(SmoothIndicatorF2D& indicator, UnitConverter const& converter); bool operator()(T output[], const S input[]); }; //////////////////////////////////3D//////////////////////////////////////////// template class AnalyticalComposed3D final : public AnalyticalF3D { private: AnalyticalF3D& _f0; AnalyticalF3D& _f1; AnalyticalF3D& _f2; public: AnalyticalComposed3D(AnalyticalF3D& f0, AnalyticalF3D& f1, AnalyticalF3D& f2); bool operator() (T output[], const S x[]) override; }; /// AnalyticalConst3D: 3D -> XD, where XD is defined by value.size() template class AnalyticalConst3D final : public AnalyticalF3D { private: // is constant return value of operator() std::vector _c; public: AnalyticalConst3D(T value); AnalyticalConst3D(T value0, T value1); AnalyticalConst3D(T value0, T value1, T value2); AnalyticalConst3D(const std::vector& value); AnalyticalConst3D(const Vector& value); bool operator() (T output[], const S x[]) override; }; /// AnalyticalLinear3D: 3D -> 1D troughout given points (x0,y0,z0,v0), (x1,y1,z1,v1), (x2,y2,z2,v2), (x3,y3,z3,v3) template class AnalyticalLinear3D final : public AnalyticalF3D { protected: T _a; T _b; T _c; T _d; public: AnalyticalLinear3D(T a, T b, T c, T d); AnalyticalLinear3D(S x0, S y0, S z0, T v0, S x1, S y1, S z1, T v1, S x2, S y2, S z2, T v2, S x3, S y3, S z3, T v3); bool operator() (T output[], const S x[]) override; }; /// AnalyticalRandom3D: 3D -> 1D with random image in (0,1) template class AnalyticalRandom3D final : public AnalyticalF3D { public: AnalyticalRandom3D(); bool operator() (T output[], const S x[]) override; }; /// AnalyticalScaled3D: 3D -> Image(AnalyticalF) scales AnalyticalF by _scale template class AnalyticalScaled3D final : public AnalyticalF3D { private: AnalyticalF3D& _f; T _scale; public: AnalyticalScaled3D(AnalyticalF3D& f, T scale); bool operator() (T output[], const S x[]) override; }; /// see Mink et al. 2016 in Sec.3.1. template class PLSsolution3D : public AnalyticalF3D { private: T _physSigmaEff; T _physDiffusionCoefficient; public: PLSsolution3D(RadiativeUnitConverter const& converter); bool operator()(T output[1], const S x[3]) override; }; /// light source as a cylinder along z-axis template class LightSourceCylindrical3D : public AnalyticalF3D { private: T _physSigmaEff; T _physDiffusionCoefficient; Vector _center; public: LightSourceCylindrical3D(RadiativeUnitConverter const& converter, Vector center = {T(0), T(0), T(0)}); bool operator()(T output[1], const S x[3]) override; }; /** * \param _position of light source * \param _orientation direction of light source (normalized) * \param _falloff is power of the cosine */ template class Spotlight : public AnalyticalF3D { private: Vector const _position; Vector const _orientation; T const _falloff; public: Spotlight(Vector position, Vector direction, T falloff); bool operator()(T output[1], const S x[3]) override; }; /// 8.6.1 Gauss Hill inital values template class GaussianHill2D : public AnalyticalF2D { private: T _sigma; Vector _x0; T _c0; public: GaussianHill2D(T sigma, Vector x0, T c0); bool operator()(T output[1], const S x[2]) override; }; /// 8.6.1 Gauss Hill time evolution template class GaussianHillTimeEvolution2D : public AnalyticalF2D { private: T _sigma02; T _D; T _t; Vector _x0; Vector _u; T _c0; public: GaussianHillTimeEvolution2D(T sigma0, T D, T t, Vector x0, Vector u, T c0); bool operator()(T output[1], const S x[2]) override; }; /** Computes resulting velocity of an object from translational and rotational velocity. * \param indicator Class defining the object (needs to be a SmoothIndicatorF3D) * \param u translational velocity of the object - expected in lattice units * \param omega rotational velocity of the object - expected in lattice units */ template class ParticleU3D : public AnalyticalF3D { protected: SmoothIndicatorF3D& _indicator; UnitConverter const& _converter; public: ParticleU3D(SmoothIndicatorF3D& indicator, UnitConverter const& converter); bool operator()(T output[], const S input[]); }; } // end namespace olb #endif