Program Listing for File SurfaceTension_Jeske2023.h
↰ Return to documentation for file (SPlisHSPlasH/SurfaceTension/SurfaceTension_Jeske2023.h)
#ifndef __SurfaceTension_Jeske2023_Surface_Tension_h__
#define __SurfaceTension_Jeske2023_Surface_Tension_h__
#include "SPlisHSPlasH/Common.h"
#include "SPlisHSPlasH/FluidModel.h"
#include "SPlisHSPlasH/NonPressureForceBase.h"
#include "SPlisHSPlasH/Utilities/MatrixFreeSolver.h"
#include "Utilities/Logger.h"
namespace SPH
{
class SurfaceTension_Jeske2023 : public NonPressureForceBase
{
protected:
Real m_surfaceTension;
Real m_surfaceTensionBoundary;
Real m_viscosity;
Real m_boundaryViscosity;
unsigned int m_maxIter;
Real m_maxError;
unsigned int m_iterations;
std::vector<Vector3r> m_vDiff;
std::vector<Real> m_gradRho;
std::vector<Real> m_surfaceEnergy;
std::vector<Real> m_color;
std::vector<Vector3r> m_colorGrad;
std::vector<Vector3r> m_nonlinearAcc;
std::vector<Vector3r> m_nonlinearRes;
std::vector<Vector3r> m_nonlinearGrad;
Real m_tangentialDistanceFactor;
bool m_weakPhaseCoupling;
Real m_xsph;
typedef Eigen::ConjugateGradient<MatrixReplacement, Eigen::Lower | Eigen::Upper, Eigen::IdentityPreconditioner> Solver;
Solver m_solver;
virtual void initParameters();
public:
static std::string METHOD_NAME;
static int SURFACE_TENSION;
static int SURFACE_TENSION_BOUNDARY;
static int ITERATIONS;
static int MAX_ITERATIONS;
static int MAX_ERROR;
static int VISCOSITY_COEFFICIENT;
static int VISCOSITY_COEFFICIENT_BOUNDARY;
static int XSPH;
SurfaceTension_Jeske2023(FluidModel *model);
virtual ~SurfaceTension_Jeske2023(void);
static NonPressureForceBase* creator(FluidModel* model) { return new SurfaceTension_Jeske2023(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 const Vector3r& getVDiff(const unsigned int i) const
{
return m_vDiff[i];
}
FORCE_INLINE Vector3r& getVDiff(const unsigned int i)
{
return m_vDiff[i];
}
FORCE_INLINE void setVDiff(const unsigned int i, const Vector3r& val)
{
m_vDiff[i] = val;
}
FORCE_INLINE const Real& getDensityGrad(const unsigned int i) const
{
return m_gradRho[i];
}
FORCE_INLINE Real& getDensityGrad(const unsigned int i)
{
return m_gradRho[i];
}
FORCE_INLINE void setDensityGrad(const unsigned int i, const Real& val)
{
m_gradRho[i] = val;
}
void computeRHS(VectorXr &b, VectorXr &g);
void applyForces(const VectorXr &x);
Real getMaxSolverError(){ return m_maxError; }
void setMaxSolverError(Real error){ m_maxError = error; }
bool getWeakCoupling(){ return m_weakPhaseCoupling; }
void setWeakCoupling(bool val){ m_weakPhaseCoupling = val; }
bool getViscosity(){ return m_viscosity; }
void setViscosity(Real val){ m_viscosity = val; }
void computeDensityGradient();
};
}
#endif