SPH算法的基本设想,就是将连续的流体想象成一个个相互作用的微粒,这些例子相互影响,共同形成了复杂的流体运动,对于每个单独的流体微粒,依旧遵循最基本的牛顿第二定律。
\begin{equation}
m\vec{a}=\vec{F}\tag{2.1}
\end{equation} 这是我们分析的基础,在SPH算法里,流体的质量是由流体单元的密度决定的,所以一般用密度代替质量
\begin{equation}
\rho\vec{a}=\vec{F}\tag{2.2}
\end{equation} 这里的的作用力F的量纲发生变化,正常情况下,“力”的量纲\(dim F=MT^{-2}L\),而在这里\(dim F=MT^{-2}L^{-2}\),后面的分析都是用这个量纲的“作用力”,这一点一定要注意。作用在一个微粒上的作用力由三部分组成
\begin{equation}
\vec{F}=\vec{F}^{external}+\vec{F}^{pressure}+\vec{F}^{viscosity}\tag{2.3}
\end{equation} 其中\(\vec{F}^{external}\ \)称为外部力,一般就是重力
\begin{equation}
\vec{F}^{external}=\rho\vec{g}\tag{2.4}
\end{equation} \(\vec{F}^{pressure}\ \)是由流体内部的压力差产生的作用力,试想一下在水管中流动的液体,进水口区域的压力一定会比出水口区域大,所以液体才会源源不断的流动,数值上,它等于压力场的梯度,方向由压力高的区域指向压力低的区域。
\begin{equation}
\vec{F}^{pressure}=-\nabla{p}\tag{2.5}
\end{equation} \(\vec{F}^{viscosity}\ \)是由粒子之间的速度差引起的,设想在流动的液体内部,快速流动的部分会施加类似于剪切力的作用力到速度慢的部分,这个力的大小跟流体的粘度系数μ以及速度差有关
\begin{equation}
\vec{F}^{viscosity}=\mu\nabla^2\vec{u}\tag{2.6}
\end{equation} 带入公式2.2,可以得到
\begin{equation}
\rho\vec{a}=\rho\vec{g}-\nabla p+\mu\nabla^2\vec{u}\tag{2.7}
\end{equation} 加速度形式:
\begin{equation}
\vec{a}=\vec{g}-\frac{\nabla{p}}{\rho}+\frac{\mu\nabla^2\vec{u}}{\rho}\tag{2.8}
\end{equation} 如果你学习过流体力学,一定会发现上面这个公式就是Navier-Stokes方程的一个简单形式,但N-S方程有更严格的形式和推导过程,感兴趣的朋友可以从流体力学相关的书中找到,这里有一篇比较比较浅显的文档可以参考,经过联系作者flysea,拿到这篇文档的原始文件放在这里,再次感谢flysea的帮助。
实际运算过程中,有时还要考虑表面张力的影响,所谓表面张力大家应该并不陌生,肥皂泡、毛细管等有趣的物理现象都跟表面张力有关,这个力可以简单理解为流体试图减小表面而产生的力。
表面张力是由于界面层流体分子受力不均衡产生的
由于表面张力只涉及到表层的粒子,所以计算方法和上面的有所不同,这部分会在以后的章节介绍。
经过上面的分析,我们基本上搞清楚了SPH粒子的运动计算方法,下节我们将正式开始介绍SPH算法的关键部分,如何通过光滑核函数计算粒子运动规律。
公式2.2中的F改成f可能更合适些?
你好作者,我已经反复阅读过很多次您关于流体的这五篇文章了。收益颇多,并且也阅读了您的源码。关于GPU加速的部分,想请教一下您,我并不是很理解,如何对这个求解过程进行拆分,从而能让GPU并行处理?是将N-S简化形式的方程中每个部分拆分开,然后每个部分求解过程独立并且并行于其他部分吗?
请问博主,SPH 能实现对复杂几何模型的建模吗? 我想模拟一些沟槽,围观几何结构对水流的影响。
当然可以,实现粒子和刚体的碰撞就行
博主你好,非常感谢你的SPH系列博文。我是一名研三的学生,我的毕业论文参考了您的源代码,我想向你表达谢意,我也会在致谢中单独提到您,可不知道如何署名。
谢谢,写上引用链接就行了
我想问下,这个SPH和空间插值的双线性插值有什么关系吗?