10 #include "imstkLogger.h"    24 using VecXd = Eigen::Matrix<double, N, 1>;
    29         static_assert(N == 2 || N == 3, 
"Invalid kernel dimension");
    42 #pragma warning(disable:4127)    49             m_k = 4.0 / (PI * std::pow(m_radius, 8));
    50             m_l = -24.0 / (PI * std::pow(m_radius, 8));
    54             m_k = 315.0 / (64.0 * PI * std::pow(m_radius, 9));
    55             m_l = -945.0 / (32.0 * PI * std::pow(m_radius, 9));
    58         m_W0 = 
W(VecXd::Zero());
    65     double W(
const double r)
 const    67         const double r2 = r * r;
    76     double W(
const VecXd& r)
 const    78         const double r2 = r.squaredNorm();
    92     VecXd 
gradW(
const VecXd& r)
 const    94         VecXd        res = VecXd::Zero();
    95         const double r2  = r.squaredNorm();
    96         if (r2 <= m_radiusSquared && r2 > 1.0e-12)
    99             res = 
m_l * tmp * tmp * r;
   112         const double r2  = r.squaredNorm();
   117             res = 
m_m * tmp * tmp2;
   140 using VecXd = Eigen::Matrix<double, N, 1>;
   145         static_assert(N == 2 || N == 3, 
"Invalid kernel dimension");
   157 #pragma warning(push)   158 #pragma warning(disable:4127)   165             const double radius5 = std::pow(m_radius, 5);
   166             m_k = 10.0 / (PI * radius5);
   167             m_l = -30.0 / (PI * radius5);
   171             const double radius6 = std::pow(m_radius, 6);
   172             m_k = 15.0 / (PI * radius6);
   173             m_l = -45.0 / (PI * radius6);
   175         m_W0 = 
W(VecXd::Zero());
   182     double W(
const double r)
 const   192     double W(
const VecXd& r)
 const   194         const double r2 = r.squaredNorm();
   195         const double rd = 
m_radius - std::sqrt(r2);
   210         VecXd      res = VecXd::Zero();
   211         const auto r2  = r.squaredNorm();
   212         if (r2 <= m_radiusSquared && r2 > 1.0e-12)
   214             const double rl  = std::sqrt(r2);
   216             const double hr2 = hr * hr;
   217             res = 
m_l * hr2 * (r / rl);
   239 using VecXd = Eigen::Matrix<double, N, 1>;
   244         static_assert(N == 3, 
"Invalid kernel dimension");
   256 #pragma warning(push)   257 #pragma warning(disable:4127)   259         CHECK(N != 2) << 
"Unimplemented function";
   264         m_k  = 32.0 / (PI * std::pow(m_radius, 9));
   265         m_c  = std::pow(m_radius, 6) / 64.0;
   266         m_W0 = 
W(VecXd::Zero());
   273     double W(
const double r)
 const   276         const double r2  = r * r;
   279             const double r1 = std::sqrt(r2);
   280             const double r3 = r2 * r1;
   284                 res = 
m_k * rd * rd * rd * r3;
   289                 res = 
m_k * 2.0 * rd * rd * rd * r3 - m_c;
   299     double W(
const VecXd& r)
 const   302         const double r2  = r.squaredNorm();
   305             const double r1 = std::sqrt(r2);
   306             const double r3 = r2 * r1;
   310                 res = 
m_k * rd * rd * rd * r3;
   315                 res = 
m_k * 2.0 * rd * rd * rd * r3 - m_c;
   342 using VecXd = Eigen::Matrix<double, N, 1>;
   347         static_assert(N == 3, 
"Invalid kernel dimension");
   358         CHECK(N != 2) << 
"Unimplemented function";
   360         m_k  = 0.007 / std::pow(m_radius, 3.25);
   361         m_W0 = 
W(VecXd::Zero());
   368     double W(
const double r)
 const   371         const double r2  = r * r;
   374             const double r = std::sqrt(r2);
   387     double W(
const VecXd& r)
 const   390         const double r2  = r.squaredNorm();
   393             const double r = std::sqrt(r2);
   422 using VecXd = Eigen::Matrix<double, N, 1>;
   427         static_assert(N == 2 || N == 3, 
"Invalid kernel dimension");
   447         const double r2  = r.squaredNorm();
   450             const double d = std::sqrt(r2);
   477         m_poly6.setRadius(kernelRadius);
   478         m_spiky.setRadius(kernelRadius);
   479         m_viscosity.setRadius(kernelRadius);
   480         m_cohesion.setRadius(kernelRadius);
   486     double W0()
 const { 
return m_poly6.W0(); }
   491     double W(
const Vec3d& r)
 const { 
return m_poly6.W(r); }
   496     Vec3d 
gradW(
const Vec3d& r)
 const { 
return m_spiky.gradW(r); }
   501     double laplace(
const Vec3d& r)
 const { 
return m_viscosity.laplace(r); }
   506     double cohesionW(
const Vec3d& r)
 const { 
return m_cohesion.W(r); }
 double m_k
Kernel coefficient for W() 
 
double m_k
Kernel coefficient for W() 
 
void setRadius(const double radius)
Set the kernel radius. 
 
double m_k
Kernel coefficient for laplacian() 
 
double W(const VecXd &r) const
Compute weight value W(r,h) = (32/(PI h^9))(h-r)^3*r^3 if h/2 < r <= h, (32/(PI h^9))(2*(h-r)^3*r^3 -...
 
double m_radiusSquared
Kernel radius squared. 
 
double m_radius
Kernel radius. 
 
double W(const VecXd &r) const
Compute weight value W(r,h) = 15/(PI*h^6) * (h-r)^3. 
 
double W(const Vec3d &r) const
Compute weight W using poly6 kernel. 
 
double W0() const
Get W(0) 
 
double m_l
Kernel coefficient for gradW() 
 
double laplace(const VecXd &r) const
Compute laplacian Laplace(r) = (45/PI/h^6) * (h - |r|) 
 
double m_radiusSquared
Kernel radius squared. 
 
double m_W0
Precomputed W(0) 
 
double m_radiusSquared
Kernel radius squared. 
 
VecXd gradW(const VecXd &r) const
Compute weight gradient grad(W(r,h)) = r(-945/(32 PI h^9))(h^2-|r|^2)^2. 
 
void initialize(const double kernelRadius)
Initialize with kernel radius kernelRadius. 
 
double m_k
Kernel coefficient for W() 
 
Vec3d gradW(const Vec3d &r) const
Compute gradW using spiky kernel. 
 
double cohesionW(const Vec3d &r) const
Compute cohesion W using cohesion kernel. 
 
double W(const double r) const
Compute weight value W(r,h) = (32/(PI h^9))(h-r)^3*r^3 if h/2 < r <= h, (32/(PI h^9))(2*(h-r)^3*r^3 -...
 
double W(const VecXd &r) const
Compute weight value W(r,h) = (0.007/h^3.25)(-4r^2/h + 6r -2h)^0.25 if h/2 < r <= h...
 
double W0() const
Compute weight W(0) using poly6 kernel. 
 
double m_radius
Kernel radius. 
 
double m_radiusSquared
Kernel radius squared. 
 
void setRadius(const double radius)
Set the kernel radius. 
 
double W(const double r) const
Compute weight value W(r,h) = (0.007/h^3.25)(-4r^2/h + 6r -2h)^0.25 if h/2 < r <= h...
 
double m_W0
Precomputed W(0) 
 
double W0() const
Get W(0) 
 
double m_radius
Kernel radius. 
 
double laplace(const Vec3d &r) const
Compute laplacian using viscosity kernel. 
 
double m_k
Kernel coefficient for W() 
 
double m_W0
Precomputed W(0) 
 
double W(const VecXd &r) const
Compute weight value W(r,h) = (315/(64 PI h^9))(h^2-|r|^2)^3. 
 
Class contains SPH kernels for time integration, using different kernel for different purposes...
 
double m_l
Kernel coefficient for gradW() 
 
double W(const double r) const
Compute weight value W(r,h) = 15/(PI*h^6) * (h-r)^3. 
 
VecXd gradW(const VecXd &r) const
Compute weight gradient grad(W(r,h)) = -r(45/(PI*h^6) * (h-r)^2) 
 
double m_m
Kernel coefficient for laplacian() 
 
double W0() const
Get W(0) 
 
void setRadius(const double radius)
Set the kernel radius. 
 
double W(const double r) const
Compute weight value W(r,h) = (315/(64 PI h^9))(h^2-|r|^2)^3. 
 
double W0() const
Get W(0) 
 
double m_radius
Kernel radius. 
 
double m_radius
Kernel radius. 
 
double m_c
Kernel coefficient for W() 
 
double m_radiusSquared
Kernel radius squared. 
 
double m_W0
Precomputed W(0) 
 
void setRadius(const double radius)
Set the kernel radius. 
 
void setRadius(const double radius)
Set the kernel radius. 
 
double laplacian(const VecXd &r) const
Compute laplacian laplacian(W(r,h)) = (-945/(32 PI h^9))(h^2-|r|^2)(-7|r|^2+3h^2) ...