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) ...