Skip to content

Commit eb93549

Browse files
committed
- added implicit viscosity computation of Peer and Teschner 2016
1 parent 6c8217a commit eb93549

11 files changed

Lines changed: 493 additions & 17 deletions

File tree

Changelog.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
1.3.1
2+
- added implicit viscosity computation of Peer and Teschner 2016
13
- fixed drag force computation of Gissler et al. 2017
24

35
1.3.0

Demos/Common/DemoBase.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "SPlisHSPlasH/Drag/DragForce_Gissler2017.h"
1919
#include "SPlisHSPlasH/Drag/DragForce_Macklin2014.h"
2020
#include "SPlisHSPlasH/Viscosity/Viscosity_Peer2015.h"
21+
#include "SPlisHSPlasH/Viscosity/Viscosity_Peer2016.h"
2122

2223

2324
using namespace SPH;
@@ -226,12 +227,13 @@ void DemoBase::initParameters()
226227
}
227228

228229
TwType enumTypeVisco = TwDefineEnum("ViscosityMethod", NULL, 0);
229-
m_parameters.push_back(Parameter(ParameterIDs::ViscosityMethod, "ViscosityMethod", enumTypeVisco, " label='Viscosity' enum='0 {None}, 1 {Standard}, 2 {XSPH}, 3 {Bender and Koschier 2017}, 4 {Peer et al. 2015}' group=Viscosity ", this));
230+
m_parameters.push_back(Parameter(ParameterIDs::ViscosityMethod, "ViscosityMethod", enumTypeVisco, " label='Viscosity' enum='0 {None}, 1 {Standard}, 2 {XSPH}, 3 {Bender and Koschier 2017}, 4 {Peer et al. 2015}, 5 {Peer et al. 2016}' group=Viscosity ", this));
230231
if (m_simulationMethod.simulation->getViscosityMethod() != ViscosityMethods::None)
231232
m_parameters.push_back(Parameter(ParameterIDs::Viscosity, "ViscosityCoeff", TW_TYPE_REAL, " label='Viscosity coefficient' min=0.0 step=0.001 precision=4 group=Viscosity ", this));
232233

233234
if ((m_simulationMethod.simulation->getViscosityMethod() == ViscosityMethods::Bender2017) ||
234-
(m_simulationMethod.simulation->getViscosityMethod() == ViscosityMethods::Peer2015))
235+
(m_simulationMethod.simulation->getViscosityMethod() == ViscosityMethods::Peer2015) ||
236+
(m_simulationMethod.simulation->getViscosityMethod() == ViscosityMethods::Peer2016))
235237
{
236238
m_parameters.push_back(Parameter(ParameterIDs::ViscoMaxIter, "ViscoMaxIterations", TW_TYPE_UINT32, " label='Max. iterations (visco)' group=Viscosity ", this));
237239
m_parameters.push_back(Parameter(ParameterIDs::ViscoMaxError, "ViscoMaxError", TW_TYPE_REAL, " label='Max. visco error' min=0.001 precision=3 group=Viscosity ", this));
@@ -400,6 +402,11 @@ void DemoBase::buildModel()
400402
((Viscosity_Peer2015*)m_simulationMethod.simulation->getViscosityBase())->setMaxError(m_scene.viscoMaxError);
401403
((Viscosity_Peer2015*)m_simulationMethod.simulation->getViscosityBase())->setMaxIter(m_scene.viscoMaxIter);
402404
}
405+
else if (m_simulationMethod.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
406+
{
407+
((Viscosity_Peer2016*)m_simulationMethod.simulation->getViscosityBase())->setMaxError(m_scene.viscoMaxError);
408+
((Viscosity_Peer2016*)m_simulationMethod.simulation->getViscosityBase())->setMaxIter(m_scene.viscoMaxIter);
409+
}
403410

404411
initParameters();
405412
}
@@ -575,6 +582,8 @@ void TW_CALL DemoBase::setParameter(const void *value, void *clientData)
575582
((Viscosity_Bender2017*)sm.simulation->getViscosityBase())->setMaxIter(val);
576583
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2015)
577584
((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->setMaxIter(val);
585+
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
586+
((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->setMaxIter(val);
578587
}
579588
else if (p->id == ParameterIDs::ViscoMaxError)
580589
{
@@ -583,6 +592,8 @@ void TW_CALL DemoBase::setParameter(const void *value, void *clientData)
583592
((Viscosity_Bender2017*)sm.simulation->getViscosityBase())->setMaxError(val);
584593
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2015)
585594
((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->setMaxError(val);
595+
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
596+
((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->setMaxError(val);
586597
}
587598
else if (p->id == ParameterIDs::SurfaceTension)
588599
{
@@ -610,6 +621,11 @@ void TW_CALL DemoBase::setParameter(const void *value, void *clientData)
610621
((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->setMaxIter(base->m_scene.viscoMaxIter);
611622
((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->setMaxError(base->m_scene.viscoMaxError);
612623
}
624+
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
625+
{
626+
((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->setMaxIter(base->m_scene.viscoMaxIter);
627+
((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->setMaxError(base->m_scene.viscoMaxError);
628+
}
613629
base->initParameters();
614630
}
615631
else if (p->id == ParameterIDs::DragMethod)
@@ -773,13 +789,17 @@ void TW_CALL DemoBase::getParameter(void *value, void *clientData)
773789
*(unsigned int *)(value) = ((Viscosity_Bender2017*)sm.simulation->getViscosityBase())->getMaxIter();
774790
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2015)
775791
*(unsigned int *)(value) = ((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->getMaxIter();
792+
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
793+
*(unsigned int *)(value) = ((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->getMaxIter();
776794
}
777795
else if (p->id == ParameterIDs::ViscoMaxError)
778796
{
779797
if (sm.simulation->getViscosityMethod() == ViscosityMethods::Bender2017)
780798
*(Real *)(value) = ((Viscosity_Bender2017*)sm.simulation->getViscosityBase())->getMaxError();
781799
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2015)
782800
*(Real *)(value) = ((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->getMaxError();
801+
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
802+
*(Real *)(value) = ((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->getMaxError();
783803
}
784804
else if (p->id == ParameterIDs::SurfaceTension)
785805
{

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ and the implicit methods of the following publications:
5858

5959
* Andreas Peer, Markus Ihmsen, Jens Cornelis, and Matthias Teschner. An Implicit Viscosity Formulation for SPH Fluids. ACM Trans. Graph., 34(4), 2015.
6060

61+
* Andreas Peer and Matthias Teschner. Prescribed Velocity Gradients for Highly Viscous SPH Fluids with Vorticity Diffusion. IEEE Transactions on Visualization and Computer Graphics, 2016.
62+
6163
## Surface Tension
6264

6365
The SPlisHSPlasH library implements the surface tension methods of the following publications:
@@ -136,6 +138,8 @@ The following videos were generated using the SPlisHSPlasH library:
136138

137139
* Andreas Peer, Markus Ihmsen, Jens Cornelis, and Matthias Teschner. An Implicit Viscosity Formulation for SPH Fluids. ACM Trans. Graph., 34(4), 2015.
138140

141+
* Andreas Peer and Matthias Teschner. Prescribed Velocity Gradients for Highly Viscous SPH Fluids with Vorticity Diffusion. IEEE Transactions on Visualization and Computer Graphics, 2016.
142+
139143
* Hagit Schechter and Robert Bridson. Ghost sph for animating water. ACM Trans. Graph., 31(4):61:1–61:8, July 2012.
140144

141145
* B. Solenthaler and R. Pajarola. Predictive-corrective incompressible SPH. ACM Trans. Graph., 28(3):40:1–40:6, July 2009.

SPlisHSPlasH/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ set(VISCOSITY_HEADER_FILES
8080
Viscosity/Viscosity_Standard.h
8181
Viscosity/Viscosity_Bender2017.h
8282
Viscosity/Viscosity_Peer2015.h
83+
Viscosity/Viscosity_Peer2016.h
8384
)
8485

8586
set(VISCOSITY_SOURCE_FILES
@@ -88,6 +89,7 @@ set(VISCOSITY_SOURCE_FILES
8889
Viscosity/Viscosity_Standard.cpp
8990
Viscosity/Viscosity_Bender2017.cpp
9091
Viscosity/Viscosity_Peer2015.cpp
92+
Viscosity/Viscosity_Peer2016.cpp
9193
)
9294

9395
set(VORTICITY_HEADER_FILES

SPlisHSPlasH/TimeStep.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include "Viscosity/Viscosity_Standard.h"
1111
#include "Viscosity/Viscosity_Bender2017.h"
1212
#include "Viscosity/Viscosity_Peer2015.h"
13+
#include "Viscosity/Viscosity_Peer2016.h"
1314
#include "Vorticity/VorticityConfinement.h"
1415
#include "EmitterSystem.h"
1516
#include "Drag/DragForce_Gissler2017.h"
@@ -267,7 +268,7 @@ void TimeStep::emittedParticles(const unsigned int startIndex)
267268

268269
void SPH::TimeStep::setViscosityMethod(ViscosityMethods val)
269270
{
270-
if ((val < ViscosityMethods::None) || (val > ViscosityMethods::Peer2015))
271+
if ((val < ViscosityMethods::None) || (val > ViscosityMethods::Peer2016))
271272
val = ViscosityMethods::XSPH;
272273

273274
if (val == m_viscosityMethod)
@@ -286,6 +287,8 @@ void SPH::TimeStep::setViscosityMethod(ViscosityMethods val)
286287
m_viscosity = new Viscosity_Bender2017(m_model);
287288
else if (m_viscosityMethod == ViscosityMethods::Peer2015)
288289
m_viscosity = new Viscosity_Peer2015(m_model);
290+
else if (m_viscosityMethod == ViscosityMethods::Peer2016)
291+
m_viscosity = new Viscosity_Peer2016(m_model);
289292
}
290293

291294
void TimeStep::setVorticityMethod(SPH::VorticityMethods val)

SPlisHSPlasH/TimeStep.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
namespace SPH
1414
{
1515
enum class SurfaceTensionMethods { None = 0, Becker2007, Akinci2013, He2014 };
16-
enum class ViscosityMethods { None = 0, Standard, XSPH, Bender2017, Peer2015 };
16+
enum class ViscosityMethods { None = 0, Standard, XSPH, Bender2017, Peer2015, Peer2016 };
1717
enum class VorticityMethods { None = 0, Micropolar, VorticityConfinement };
1818
enum class DragMethods { None = 0, Macklin2014, Gissler2017 };
1919

SPlisHSPlasH/Utilities/MatrixFreeSolver.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,7 @@ namespace Eigen
136136
{
137137
using namespace SPH;
138138

139-
/** Implementation of the matrix-free matrix vector product which is used for the
140-
* method of Peer et al. 2015 */
139+
/** Implementation of the matrix-free matrix vector product */
141140
template<typename Rhs>
142141
struct generic_product_impl<MatrixReplacement, Rhs, SparseShape, DenseShape, GemvProduct> // GEMV stands for generic matrix-vector
143142
: generic_product_impl_base<MatrixReplacement, Rhs, generic_product_impl<MatrixReplacement, Rhs> >

SPlisHSPlasH/Viscosity/Viscosity_Peer2015.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -194,10 +194,4 @@ void Viscosity_Peer2015::reset()
194194

195195
void Viscosity_Peer2015::performNeighborhoodSearchSort()
196196
{
197-
const unsigned int numPart = m_model->numActiveParticles();
198-
if (numPart == 0)
199-
return;
200-
201-
auto const& d = m_model->getNeighborhoodSearch()->point_set(0);
202-
d.sort_field(&m_targetNablaV[0]);
203197
}

0 commit comments

Comments
 (0)