/* This file is part of the OpenLB library * * Copyright (C) 2014-2016 Cyril Masquelier, Mathias J. Krause, Benjamin Förster * 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 SMOOTH_INDICATOR_BASE_F_2D_H #define SMOOTH_INDICATOR_BASE_F_2D_H #include #include "core/vector.h" #include "functors/genericF.h" #include "functors/analytical/analyticalBaseF.h" namespace olb { template class SmoothIndicatorF2D; /** SmoothIndicatorF2D is an application from \f$ \Omega \subset R^3 \to [0,1] \f$. * \param _myMin holds minimal(component wise) vector of the domain \f$ \Omega \f$. * \param _myMax holds maximal(component wise) vector of the domain \f$ \Omega \f$. * \param _center * \param _diam */ template class SmoothIndicatorF2D : public AnalyticalF2D { protected: SmoothIndicatorF2D(); Vector _myMin; Vector _myMax; Vector _pos; Vector _rotMat; //saved values of rotation matrix S _circumRadius; S _theta; S _epsilon; std::string _name = "smoothIndicator2D"; public: void init(T theta, Vector vel, T mass, T mofi); const Vector& getMin() const; const Vector& getMax() const; const Vector& getPos() const; const Vector& getRotationMatrix() const; const S& getCircumRadius() const; const S& getTheta() const; const S& getEpsilon() const; std::string name(); void setRotationMatrix(Vector rotMat); void setTheta(S theta); void setEpsilon(S epsilon); SmoothIndicatorF2D& operator+(SmoothIndicatorF2D& rhs); }; template class SmoothIndicatorIdentity2D : public SmoothIndicatorF2D { protected: SmoothIndicatorF2D& _f; public: SmoothIndicatorIdentity2D(SmoothIndicatorF2D& f); bool operator() (T output[], const S input[]) override; }; /** SmoothIndicatorF2D is an application from \f$ \Omega \subset R^3 \to [0,1] \f$. * Base class for specific SmoothIndicator implementation providing common data. */ template class SmoothIndicatorF2D : public AnalyticalF2D { protected: SmoothIndicatorF2D(); Vector _myMin; Vector _myMax; Vector _pos; Vector _vel; Vector _acc; Vector _acc2; Vector _force; Vector _rotMat; //saved values of rotation matrix S _circumRadius; S _theta; S _omega; S _alpha; S _alpha2; S _mass; S _mofi; //Moment of Inertia S _epsilon; std::string _name = "HLBMobject2D"; public: void init(T theta, Vector vel, T mass, T mofi); const Vector& getMin() const; const Vector& getMax() const; const Vector& getPos() const; const Vector& getVel() const; const Vector& getAcc() const; const Vector& getAcc2() const; const Vector& getForce() const; const Vector& getRotationMatrix() const; const S& getCircumRadius() const; const S& getTheta() const; const S& getOmega() const; const S& getAlpha() const; const S& getAlpha2() const; const S& getMass() const; const S& getMofi() const; const S& getEpsilon() const; std::string name(); void setPos(Vector pos); void setVel(Vector vel); void setAcc(Vector acc); void setAcc2(Vector acc2); void setForce(Vector force); void setRotationMatrix(Vector rotMat); void setTheta(S theta); void setOmega(S omega); void setAlpha(S alpha); void setAlpha2(S alpha2); void setMass(S mass); void setMofi(S mofi); void setEpsilon(S epsilon); }; } #endif