Skip to content

Commit dd82d48

Browse files
Official implementation of the TOG paper "Implicit Surface Tension for SPH Fluid Simulation" (#291)
* start porting surface tension add scenes * add python bindings * bump version and fix other surface tension scenes * fix non-avx surface tension model * bump to next major version
1 parent 51706dd commit dd82d48

17 files changed

+2029
-8
lines changed

SPlisHSPlasH/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,15 @@ set(SURFACETENSION_HEADER_FILES
7575
SurfaceTension/SurfaceTension_Becker2007.h
7676
SurfaceTension/SurfaceTension_Akinci2013.h
7777
SurfaceTension/SurfaceTension_He2014.h
78+
SurfaceTension/SurfaceTension_Jeske2023.h
7879
)
7980

8081
set(SURFACETENSION_SOURCE_FILES
8182
SurfaceTension/SurfaceTensionBase.cpp
8283
SurfaceTension/SurfaceTension_Becker2007.cpp
8384
SurfaceTension/SurfaceTension_Akinci2013.cpp
8485
SurfaceTension/SurfaceTension_He2014.cpp
86+
SurfaceTension/SurfaceTension_Jeske2023.cpp
8587
)
8688

8789
set(VISCOSITY_HEADER_FILES

SPlisHSPlasH/NonPressureForceRegistration.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "SurfaceTension/SurfaceTension_Becker2007.h"
2121
#include "SurfaceTension/SurfaceTension_Akinci2013.h"
2222
#include "SurfaceTension/SurfaceTension_He2014.h"
23+
#include "SurfaceTension/SurfaceTension_Jeske2023.h"
2324
#ifdef USE_THIRD_PARTY_METHODS
2425
#include "SurfaceTension/SurfaceTension_ZorillaRitter2020.h"
2526
#endif
@@ -42,6 +43,7 @@ void Simulation::registerNonpressureForces()
4243
addSurfaceTensionMethod("Becker & Teschner 2007", SurfaceTension_Becker2007::creator);
4344
addSurfaceTensionMethod("Akinci et al. 2013", SurfaceTension_Akinci2013::creator);
4445
addSurfaceTensionMethod("He et al. 2014", SurfaceTension_He2014::creator);
46+
addSurfaceTensionMethod("Jeske et al. 2023", SurfaceTension_Jeske2023::creator);
4547
#ifdef USE_THIRD_PARTY_METHODS
4648
addSurfaceTensionMethod("Zorilla, Ritter, et al. 2020", SurfaceTension_ZorillaRitter2020::creator);
4749
#endif

SPlisHSPlasH/SurfaceTension/SurfaceTension_Jeske2023.cpp

Lines changed: 1329 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
#ifndef __SurfaceTension_Jeske2023_Surface_Tension_h__
2+
#define __SurfaceTension_Jeske2023_Surface_Tension_h__
3+
4+
#include "SPlisHSPlasH/Common.h"
5+
#include "SPlisHSPlasH/FluidModel.h"
6+
#include "SurfaceTensionBase.h"
7+
#include "SPlisHSPlasH/Utilities/MatrixFreeSolver.h"
8+
#include "Utilities/Logger.h"
9+
10+
namespace SPH
11+
{
12+
/** \brief This class implements the implicit surface tension method
13+
* by Jeske et al. 2023 [JWL+23].
14+
*
15+
* References:
16+
* - [JWL+23] Jeske, Stefan Rhys, Lukas Westhofen, Fabian Löschner, José Antonio Fernández-Fernández, and Jan Bender. “Implicit Surface Tension for SPH Fluid Simulation.” ACM Transactions on Graphics, November 7, 2023. URL: https://doi.org/10.1145/3631936.
17+
18+
*/
19+
class SurfaceTension_Jeske2023 : public SurfaceTensionBase
20+
{
21+
protected:
22+
Real m_viscosity;
23+
Real m_boundaryViscosity;
24+
25+
unsigned int m_maxIter;
26+
Real m_maxError;
27+
unsigned int m_iterations;
28+
std::vector<Vector3r> m_vDiff;
29+
std::vector<Real> m_gradRho;
30+
std::vector<Real> m_surfaceEnergy;
31+
std::vector<Real> m_color;
32+
std::vector<Vector3r> m_colorGrad;
33+
std::vector<Vector3r> m_nonlinearAcc;
34+
std::vector<Vector3r> m_nonlinearRes;
35+
std::vector<Vector3r> m_nonlinearGrad;
36+
37+
Real m_tangentialDistanceFactor;
38+
bool m_weakPhaseCoupling;
39+
Real m_xsph;
40+
41+
typedef Eigen::ConjugateGradient<MatrixReplacement, Eigen::Lower | Eigen::Upper, Eigen::IdentityPreconditioner> Solver;
42+
43+
Solver m_solver;
44+
45+
46+
virtual void initParameters();
47+
48+
public:
49+
static int ITERATIONS;
50+
static int MAX_ITERATIONS;
51+
static int MAX_ERROR;
52+
static int VISCOSITY_COEFFICIENT;
53+
static int VISCOSITY_COEFFICIENT_BOUNDARY;
54+
static int XSPH;
55+
56+
SurfaceTension_Jeske2023(FluidModel *model);
57+
virtual ~SurfaceTension_Jeske2023(void);
58+
59+
static NonPressureForceBase* creator(FluidModel* model) { return new SurfaceTension_Jeske2023(model); }
60+
61+
virtual void step();
62+
virtual void reset();
63+
64+
virtual void performNeighborhoodSearchSort();
65+
66+
static void matrixVecProd(const Real* vec, Real *result, void *userData);
67+
68+
FORCE_INLINE const Vector3r& getVDiff(const unsigned int i) const
69+
{
70+
return m_vDiff[i];
71+
}
72+
73+
FORCE_INLINE Vector3r& getVDiff(const unsigned int i)
74+
{
75+
return m_vDiff[i];
76+
}
77+
78+
FORCE_INLINE void setVDiff(const unsigned int i, const Vector3r& val)
79+
{
80+
m_vDiff[i] = val;
81+
}
82+
83+
FORCE_INLINE const Real& getDensityGrad(const unsigned int i) const
84+
{
85+
return m_gradRho[i];
86+
}
87+
88+
FORCE_INLINE Real& getDensityGrad(const unsigned int i)
89+
{
90+
return m_gradRho[i];
91+
}
92+
93+
FORCE_INLINE void setDensityGrad(const unsigned int i, const Real& val)
94+
{
95+
m_gradRho[i] = val;
96+
}
97+
98+
void computeRHS(VectorXr &b, VectorXr &g);
99+
100+
void applyForces(const VectorXr &x);
101+
102+
Real getMaxSolverError(){ return m_maxError; }
103+
void setMaxSolverError(Real error){ m_maxError = error; }
104+
105+
bool getWeakCoupling(){ return m_weakPhaseCoupling; }
106+
void setWeakCoupling(bool val){ m_weakPhaseCoupling = val; }
107+
108+
bool getViscosity(){ return m_viscosity; }
109+
void setViscosity(Real val){ m_viscosity = val; }
110+
111+
void computeDensityGradient();
112+
};
113+
}
114+
115+
#endif

SPlisHSPlasH/Utilities/AVX_math.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ static inline Scalarf8 operator >= (Scalarf8 const & a, Scalarf8 const & b) {
153153
return _mm256_cmp_ps(b.v, a.v, 2);
154154
}
155155

156+
static inline Scalarf8 min(Scalarf8 const & a, Scalarf8 const & b) {
157+
return _mm256_min_ps(a.v, b.v);
158+
}
159+
156160
static inline Scalarf8 max(Scalarf8 const & a, Scalarf8 const & b) {
157161
return _mm256_max_ps(a.v, b.v);
158162
}

data/Scenes/SurfaceTension_BoxHole_ZR2020.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
{
4040
"id": "Fluid",
4141
"surfaceTension": 0.15,
42-
"surfaceTensionMethod": 4,
42+
"surfaceTensionMethod": 5,
4343
"viscosity": 0.01,
4444
"viscosityMethod": 1,
4545
"surfTZRversion": 1,

data/Scenes/SurfaceTension_BreakDamZR2020.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
{
2525
"id": "Fluid",
2626
"surfaceTension": 0.1,
27-
"surfaceTensionMethod": 4,
27+
"surfaceTensionMethod": 5,
2828
"viscosity": 0.01,
2929
"viscosityMethod": 1,
3030
"surfTZRversion": 0,

0 commit comments

Comments
 (0)