Skip to content

Commit

Permalink
- added implicit viscosity computation of Peer and Teschner 2016
Browse files Browse the repository at this point in the history
  • Loading branch information
janbender committed Sep 1, 2017
1 parent 6c8217a commit eb93549
Show file tree
Hide file tree
Showing 11 changed files with 493 additions and 17 deletions.
2 changes: 2 additions & 0 deletions Changelog.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
1.3.1
- added implicit viscosity computation of Peer and Teschner 2016
- fixed drag force computation of Gissler et al. 2017

1.3.0
Expand Down
24 changes: 22 additions & 2 deletions Demos/Common/DemoBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "SPlisHSPlasH/Drag/DragForce_Gissler2017.h"
#include "SPlisHSPlasH/Drag/DragForce_Macklin2014.h"
#include "SPlisHSPlasH/Viscosity/Viscosity_Peer2015.h"
#include "SPlisHSPlasH/Viscosity/Viscosity_Peer2016.h"


using namespace SPH;
Expand Down Expand Up @@ -226,12 +227,13 @@ void DemoBase::initParameters()
}

TwType enumTypeVisco = TwDefineEnum("ViscosityMethod", NULL, 0);
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));
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));
if (m_simulationMethod.simulation->getViscosityMethod() != ViscosityMethods::None)
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));

if ((m_simulationMethod.simulation->getViscosityMethod() == ViscosityMethods::Bender2017) ||
(m_simulationMethod.simulation->getViscosityMethod() == ViscosityMethods::Peer2015))
(m_simulationMethod.simulation->getViscosityMethod() == ViscosityMethods::Peer2015) ||
(m_simulationMethod.simulation->getViscosityMethod() == ViscosityMethods::Peer2016))
{
m_parameters.push_back(Parameter(ParameterIDs::ViscoMaxIter, "ViscoMaxIterations", TW_TYPE_UINT32, " label='Max. iterations (visco)' group=Viscosity ", this));
m_parameters.push_back(Parameter(ParameterIDs::ViscoMaxError, "ViscoMaxError", TW_TYPE_REAL, " label='Max. visco error' min=0.001 precision=3 group=Viscosity ", this));
Expand Down Expand Up @@ -400,6 +402,11 @@ void DemoBase::buildModel()
((Viscosity_Peer2015*)m_simulationMethod.simulation->getViscosityBase())->setMaxError(m_scene.viscoMaxError);
((Viscosity_Peer2015*)m_simulationMethod.simulation->getViscosityBase())->setMaxIter(m_scene.viscoMaxIter);
}
else if (m_simulationMethod.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
{
((Viscosity_Peer2016*)m_simulationMethod.simulation->getViscosityBase())->setMaxError(m_scene.viscoMaxError);
((Viscosity_Peer2016*)m_simulationMethod.simulation->getViscosityBase())->setMaxIter(m_scene.viscoMaxIter);
}

initParameters();
}
Expand Down Expand Up @@ -575,6 +582,8 @@ void TW_CALL DemoBase::setParameter(const void *value, void *clientData)
((Viscosity_Bender2017*)sm.simulation->getViscosityBase())->setMaxIter(val);
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2015)
((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->setMaxIter(val);
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->setMaxIter(val);
}
else if (p->id == ParameterIDs::ViscoMaxError)
{
Expand All @@ -583,6 +592,8 @@ void TW_CALL DemoBase::setParameter(const void *value, void *clientData)
((Viscosity_Bender2017*)sm.simulation->getViscosityBase())->setMaxError(val);
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2015)
((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->setMaxError(val);
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->setMaxError(val);
}
else if (p->id == ParameterIDs::SurfaceTension)
{
Expand Down Expand Up @@ -610,6 +621,11 @@ void TW_CALL DemoBase::setParameter(const void *value, void *clientData)
((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->setMaxIter(base->m_scene.viscoMaxIter);
((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->setMaxError(base->m_scene.viscoMaxError);
}
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
{
((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->setMaxIter(base->m_scene.viscoMaxIter);
((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->setMaxError(base->m_scene.viscoMaxError);
}
base->initParameters();
}
else if (p->id == ParameterIDs::DragMethod)
Expand Down Expand Up @@ -773,13 +789,17 @@ void TW_CALL DemoBase::getParameter(void *value, void *clientData)
*(unsigned int *)(value) = ((Viscosity_Bender2017*)sm.simulation->getViscosityBase())->getMaxIter();
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2015)
*(unsigned int *)(value) = ((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->getMaxIter();
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
*(unsigned int *)(value) = ((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->getMaxIter();
}
else if (p->id == ParameterIDs::ViscoMaxError)
{
if (sm.simulation->getViscosityMethod() == ViscosityMethods::Bender2017)
*(Real *)(value) = ((Viscosity_Bender2017*)sm.simulation->getViscosityBase())->getMaxError();
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2015)
*(Real *)(value) = ((Viscosity_Peer2015*)sm.simulation->getViscosityBase())->getMaxError();
else if (sm.simulation->getViscosityMethod() == ViscosityMethods::Peer2016)
*(Real *)(value) = ((Viscosity_Peer2016*)sm.simulation->getViscosityBase())->getMaxError();
}
else if (p->id == ParameterIDs::SurfaceTension)
{
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ and the implicit methods of the following publications:

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

* Andreas Peer and Matthias Teschner. Prescribed Velocity Gradients for Highly Viscous SPH Fluids with Vorticity Diffusion. IEEE Transactions on Visualization and Computer Graphics, 2016.

## Surface Tension

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

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

* Andreas Peer and Matthias Teschner. Prescribed Velocity Gradients for Highly Viscous SPH Fluids with Vorticity Diffusion. IEEE Transactions on Visualization and Computer Graphics, 2016.

* Hagit Schechter and Robert Bridson. Ghost sph for animating water. ACM Trans. Graph., 31(4):61:1–61:8, July 2012.

* B. Solenthaler and R. Pajarola. Predictive-corrective incompressible SPH. ACM Trans. Graph., 28(3):40:1–40:6, July 2009.
Expand Down
2 changes: 2 additions & 0 deletions SPlisHSPlasH/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ set(VISCOSITY_HEADER_FILES
Viscosity/Viscosity_Standard.h
Viscosity/Viscosity_Bender2017.h
Viscosity/Viscosity_Peer2015.h
Viscosity/Viscosity_Peer2016.h
)

set(VISCOSITY_SOURCE_FILES
Expand All @@ -88,6 +89,7 @@ set(VISCOSITY_SOURCE_FILES
Viscosity/Viscosity_Standard.cpp
Viscosity/Viscosity_Bender2017.cpp
Viscosity/Viscosity_Peer2015.cpp
Viscosity/Viscosity_Peer2016.cpp
)

set(VORTICITY_HEADER_FILES
Expand Down
5 changes: 4 additions & 1 deletion SPlisHSPlasH/TimeStep.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "Viscosity/Viscosity_Standard.h"
#include "Viscosity/Viscosity_Bender2017.h"
#include "Viscosity/Viscosity_Peer2015.h"
#include "Viscosity/Viscosity_Peer2016.h"
#include "Vorticity/VorticityConfinement.h"
#include "EmitterSystem.h"
#include "Drag/DragForce_Gissler2017.h"
Expand Down Expand Up @@ -267,7 +268,7 @@ void TimeStep::emittedParticles(const unsigned int startIndex)

void SPH::TimeStep::setViscosityMethod(ViscosityMethods val)
{
if ((val < ViscosityMethods::None) || (val > ViscosityMethods::Peer2015))
if ((val < ViscosityMethods::None) || (val > ViscosityMethods::Peer2016))
val = ViscosityMethods::XSPH;

if (val == m_viscosityMethod)
Expand All @@ -286,6 +287,8 @@ void SPH::TimeStep::setViscosityMethod(ViscosityMethods val)
m_viscosity = new Viscosity_Bender2017(m_model);
else if (m_viscosityMethod == ViscosityMethods::Peer2015)
m_viscosity = new Viscosity_Peer2015(m_model);
else if (m_viscosityMethod == ViscosityMethods::Peer2016)
m_viscosity = new Viscosity_Peer2016(m_model);
}

void TimeStep::setVorticityMethod(SPH::VorticityMethods val)
Expand Down
2 changes: 1 addition & 1 deletion SPlisHSPlasH/TimeStep.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
namespace SPH
{
enum class SurfaceTensionMethods { None = 0, Becker2007, Akinci2013, He2014 };
enum class ViscosityMethods { None = 0, Standard, XSPH, Bender2017, Peer2015 };
enum class ViscosityMethods { None = 0, Standard, XSPH, Bender2017, Peer2015, Peer2016 };
enum class VorticityMethods { None = 0, Micropolar, VorticityConfinement };
enum class DragMethods { None = 0, Macklin2014, Gissler2017 };

Expand Down
3 changes: 1 addition & 2 deletions SPlisHSPlasH/Utilities/MatrixFreeSolver.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,7 @@ namespace Eigen
{
using namespace SPH;

/** Implementation of the matrix-free matrix vector product which is used for the
* method of Peer et al. 2015 */
/** Implementation of the matrix-free matrix vector product */
template<typename Rhs>
struct generic_product_impl<MatrixReplacement, Rhs, SparseShape, DenseShape, GemvProduct> // GEMV stands for generic matrix-vector
: generic_product_impl_base<MatrixReplacement, Rhs, generic_product_impl<MatrixReplacement, Rhs> >
Expand Down
6 changes: 0 additions & 6 deletions SPlisHSPlasH/Viscosity/Viscosity_Peer2015.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -194,10 +194,4 @@ void Viscosity_Peer2015::reset()

void Viscosity_Peer2015::performNeighborhoodSearchSort()
{
const unsigned int numPart = m_model->numActiveParticles();
if (numPart == 0)
return;

auto const& d = m_model->getNeighborhoodSearch()->point_set(0);
d.sort_field(&m_targetNablaV[0]);
}
Loading

0 comments on commit eb93549

Please sign in to comment.