Program Listing for File Viscosity_Bender2017.h
↰ Return to documentation for file (SPlisHSPlasH/Viscosity/Viscosity_Bender2017.h)
#ifndef __Viscosity_Bender2017_h__
#define __Viscosity_Bender2017_h__
#include "SPlisHSPlasH/Common.h"
#include "SPlisHSPlasH/FluidModel.h"
#include "ViscosityBase.h"
namespace SPH
{
class Viscosity_Bender2017 : public ViscosityBase
{
protected:
std::vector<Vector6r> m_targetStrainRate;
std::vector<Matrix6r> m_viscosityFactor;
std::vector<Vector6r> m_viscosityLambda;
unsigned int m_iterations;
unsigned int m_maxIter;
Real m_maxError;
virtual void initParameters();
public:
static int ITERATIONS;
static int MAX_ITERATIONS;
static int MAX_ERROR;
Viscosity_Bender2017(FluidModel *model);
virtual ~Viscosity_Bender2017(void);
static NonPressureForceBase* creator(FluidModel* model) { return new Viscosity_Bender2017(model); }
virtual void step();
virtual void reset();
virtual void performNeighborhoodSearchSort();
void computeTargetStrainRate();
void computeViscosityFactor();
FORCE_INLINE void viscoGradientMultTransposeRightOpt(const Eigen::Matrix<Real, 6, 3>& a, const Eigen::Matrix<Real, 6, 3>& b, Matrix6r &c)
{
// a(0,1), a(0,2), a(1,0), a(1,2), a(2,0), a(2,1), a(3,2), a(4, 1), a(5, 0) = 0
c(0,0) = a(0,0) * b(0,0);
c(0,1) = 0.0;
c(0,2) = 0.0;
c(0,3) = a(0,0) * b(3,0);
c(0,4) = a(0,0) * b(4,0);
c(0,5) = 0.0;
c(1,0) = 0.0;
c(1,1) = a(1,1) * b(1,1);
c(1,2) = 0.0;
c(1,3) = a(1,1) * b(3,1);
c(1,4) = 0.0;
c(1,5) = a(1,1) * b(5,1);
c(2,0) = 0.0;
c(2,1) = 0.0;
c(2,2) = a(2,2) * b(2,2);
c(2,3) = 0.0;
c(2,4) = a(2,2) * b(4,2);
c(2,5) = a(2,2) * b(5,2);
c(3,0) = a(3,0) * b(0,0);
c(3,1) = a(3,1) * b(1,1);
c(3,2) = 0.0;
c(3,3) = a(3,0) * b(3,0) + a(3,1) * b(3,1);
c(3,4) = a(3,0) * b(4,0);
c(3,5) = a(3,1) * b(5,1);
c(4,0) = a(4,0) * b(0,0);
c(4,1) = 0.0;
c(4, 2) = a(4, 2) * b(2,2);
c(4, 3) = a(4, 0) * b(3,0);
c(4, 4) = a(4, 0) * b(4,0) + a(4,2) * b(4,2);
c(4, 5) = a(4, 2) * b(5,2);
c(5,0) = 0.0;
c(5,1) = a(5,1) * b(1,1);
c(5,2) = a(5,2) * b(2,2);
c(5,3) = a(5,1) * b(3,1);
c(5,4) = a(5,2) * b(4,2);
c(5,5) = a(5,1) * b(5,1) + a(5,2) * b(5,2);
}
FORCE_INLINE const Vector6r& getTargetStrainRate(const unsigned int i) const
{
return m_targetStrainRate[i];
}
FORCE_INLINE Vector6r& getTargetStrainRate(const unsigned int i)
{
return m_targetStrainRate[i];
}
FORCE_INLINE void setTargetStrainRate(const unsigned int i, const Vector6r &val)
{
m_targetStrainRate[i] = val;
}
FORCE_INLINE const Matrix6r& getViscosityFactor(const unsigned int i) const
{
return m_viscosityFactor[i];
}
FORCE_INLINE Matrix6r& getViscosityFactor(const unsigned int i)
{
return m_viscosityFactor[i];
}
FORCE_INLINE void setViscosityFactor(const unsigned int i, const Matrix6r &val)
{
m_viscosityFactor[i] = val;
}
FORCE_INLINE const Vector6r& getViscosityLambda(const unsigned int i) const
{
return m_viscosityLambda[i];
}
FORCE_INLINE Vector6r& getViscosityLambda(const unsigned int i)
{
return m_viscosityLambda[i];
}
FORCE_INLINE void setViscosityLambda(const unsigned int i, const Vector6r &val)
{
m_viscosityLambda[i] = val;
}
};
}
#endif