Program Listing for File TimeStepPF.h

Return to documentation for file (SPlisHSPlasH/PF/TimeStepPF.h)

#ifndef __TimeStepPF_h__
#define __TimeStepPF_h__

#include "SimulationDataPF.h"
#include "SPlisHSPlasH/Common.h"
#include "SPlisHSPlasH/TimeStep.h"
#include "SPlisHSPlasH/SPHKernels.h"
#include "SPlisHSPlasH/Utilities/MatrixFreeSolver.h"

// since all diagonal blocks are 3x3 diagonal matrices, a diagonal preconditioner does suffice
#define PD_USE_DIAGONAL_PRECONDITIONER

namespace SPH
{
    class TimeStepPF : public TimeStep
    {
    protected:
        using VectorXr = Eigen::Matrix<Real, -1, 1>;
        using VectorXrMap = Eigen::Map<VectorXr>;

#ifdef PD_USE_DIAGONAL_PRECONDITIONER
        using Solver = Eigen::ConjugateGradient<MatrixReplacement, Eigen::Lower | Eigen::Upper, JacobiPreconditioner3D>;
        FORCE_INLINE static void diagonalMatrixElement(const unsigned int row, Vector3r &result, void *userData);
        void preparePreconditioner();
#else
        using Solver = Eigen::ConjugateGradient<MatrixReplacement, Eigen::Lower | Eigen::Upper, Eigen::IdentityPreconditioner>;
#endif

        SimulationDataPF m_simulationData;
        Solver m_solver;
        unsigned int m_iterations;
        Real m_maxError;
        unsigned int m_minIterations;
        unsigned int m_maxIterations;
        Real m_stiffness;
        unsigned int m_numActiveParticlesTotal;

        void initialGuessForPositions(const unsigned int fluidModelIndex);
        void solvePDConstraints();
        void updatePositionsAndVelocity(const VectorXr & x);
        void addAccellerationToVelocity();

        void matrixFreeRHS(const VectorXr & x, VectorXr & result);

        virtual void performNeighborhoodSearchSort();
        virtual void emittedParticles(FluidModel *model, const unsigned int startIndex) override;

        virtual void initParameters() override;

    public:
        static std::string METHOD_NAME;
        static int SOLVER_ITERATIONS;
        static int MIN_ITERATIONS;
        static int MAX_ITERATIONS;
        static int MAX_ERROR;
        static int STIFFNESS;

        TimeStepPF();
        virtual ~TimeStepPF(void);

        virtual void step()   override;
        virtual void reset()  override;
        virtual void resize() override;
        virtual std::string getMethodName() { return METHOD_NAME; }
        virtual int getNumIterations() { return m_iterations; }

        static void matrixVecProd(const Real* vec, Real *result, void *userData);
    };
}

#endif