【CG物理模拟系列】流体模拟--粒子法之SPH法的加权函数计算

SPH法中的加权函数


Poly6 kernel[1]


用于密度计算等。由于r只存在于2次项中,可以省去平方根的计算。
eq_poly6.gif

梯度为,
eq_poly6_gradient.gif

拉普拉斯算子为,
eq_poly6_laplacian.gif

如图所示,

kernel_poly6.png

右侧坐标为拉普拉斯值

Code Sample

  /*!
 * Poly6 kernel函数值的计算
 * @param[in] r 距离
 * @param[in] h 有效半径
 * @return 函数值
 */
inline double RxKernelPoly6(const double &r, const double &h)
{
    if(r >= 0.0 && r < h){
        double q = h*h-r*r;
        return 315.0/(64.0*RX_PI*pow(h, 9))*q*q*q;
    }
    else{
        return 0.0;
    }
}
 
/*!
 * Poly6 kernel梯度值的计算
 * @param[in] r 距离
 * @param[in] rij 相对位置
 * @param[in] h 有效半径
 * @return 梯度值
 */
inline Vec3 RxKernelPoly6G(const double &r, const Vec3 &rij, const double &h)
{
    if(r >= 0.0 && r < h){
        double q = h*h-r*r;
        return -945.0/(32.0*RX_PI*pow(h, 9))*q*q*rij;
    }
    else{
        return Vec3(0.0);
    }
}
 
/*!
 * Poly6 kernel函数拉普拉斯算子的计算
 * @param[in] r 距离
 * @param[in] h 有效半径
 * @return 拉普拉斯值
 */ inline  double RxKernelPoly6L( const  double &r,  const  double &h)
{
    if(r >= 0.0 && r < h){
        double q = h*h-r*r;
        return -945.0/(32.0*RX_PI*pow(h, 9))*(3*q*q-4*r*r*q);
    }
    else{
        return 0.0;
    }
}

h为定值的时候,上式的α部分作为全局变量计算即可。

Spiky kernel[1,2] 


用于计算圧力项。当Poly6 kernel的r=0时,其梯度也为0,把粒子当作是由cluster构成的问题求解即可。
eq_spiky.gif

梯度为,

eq_spiky_gradient.gif

拉普拉斯值为,
eq_spiky_laplacian.gif

[2]的定义为,
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值