Program Listing for File Viscosity_Peer2015.h

Return to documentation for file (SPlisHSPlasH/Viscosity/Viscosity_Peer2015.h)

#ifndef __Viscosity_Peer2015_h__
#define __Viscosity_Peer2015_h__

#include "SPlisHSPlasH/Common.h"
#include "SPlisHSPlasH/FluidModel.h"
#include "SPlisHSPlasH/NonPressureForceBase.h"
#include "SPlisHSPlasH/Utilities/MatrixFreeSolver.h"


namespace SPH
{
    class Viscosity_Peer2015 : public NonPressureForceBase
    {
    protected:
        std::vector<Real> m_density;
        std::vector<Matrix3r> m_targetNablaV;
        typedef Eigen::ConjugateGradient<MatrixReplacement, Eigen::Lower | Eigen::Upper, JacobiPreconditioner1D> Solver;
        Solver m_solver;
        Real m_viscosity;
        unsigned int m_iterations;
        unsigned int m_maxIter;
        Real m_maxError;

        virtual void initParameters();
        void computeDensities();

    public:
        static std::string METHOD_NAME;
        static int VISCOSITY_COEFFICIENT;
        static int ITERATIONS;
        static int MAX_ITERATIONS;
        static int MAX_ERROR;

        Viscosity_Peer2015(FluidModel *model);
        virtual ~Viscosity_Peer2015(void);

        static NonPressureForceBase* creator(FluidModel* model) { return new Viscosity_Peer2015(model); }
        virtual std::string getMethodName() { return METHOD_NAME; }

        virtual void step();
        virtual void reset();

        virtual void performNeighborhoodSearchSort();

        static void matrixVecProd(const Real* vec, Real *result, void *userData);
        FORCE_INLINE static void diagonalMatrixElement(const unsigned int row, Real &result, void *userData);

        FORCE_INLINE const Matrix3r& getTargetNablaV(const unsigned int i) const
        {
            return m_targetNablaV[i];
        }

        FORCE_INLINE Matrix3r& getTargetNablaV(const unsigned int i)
        {
            return m_targetNablaV[i];
        }

        FORCE_INLINE void setTargetNablaV(const unsigned int i, const Matrix3r &val)
        {
            m_targetNablaV[i] = val;
        }
    };
}

#endif