/* 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