SPH流体模拟器 返回
流体力学

SPH流体模拟器

使用光滑粒子流体动力学(SPH)实时模拟二维流体。直观体验粘性、湍流和流体动力学。

参数设置
粒子数量
粘性系数
重力强度
计算结果
--
帧率
--
粒子数
--
平均动能
Sph

在画布上点击并拖动可添加粒子 | 圆形障碍物位于中央

理论与主要公式

密度估算(Poly6核函数):

$$W_{poly6}(r,h) = \frac{315}{64\pi h^9}(h^2-r^2)^3$$

压力梯度(Spiky核函数):

$$\nabla W_{spiky}(r,h) = -\frac{45}{\pi h^6}(h-r)^2 \hat{r}$$

$h$:光滑长度,$r$:粒子间距

什么是SPH流体模拟

🙋
SPH模拟器里这些跑来跑去的小点就是“粒子”吗?它们和动画片里的水滴有什么区别?
🎓
简单来说,这些粒子不只是动画,每个都像一个小小的“传感器”,带着自己的速度、密度和压力信息。它们通过一个叫“核函数”的规则,和周围一定范围内的邻居粒子“聊天”,互相传递力。你试着在画布上点击并拖动,添加一些粒子,它们会立刻开始和中央的圆形障碍物互动,这就是在实时计算粒子间的相互作用力。
🙋
诶,真的吗?那旁边的“粘性系数”滑块是干嘛的?我调大了会怎样?
🎓
在实际工程中,粘性就像流体的“内部摩擦力”。你试着把粘性系数滑块向右拉大,会发现流体粒子变得“粘稠”,流动变慢,像蜂蜜一样。如果调得很小,粒子就会像水一样快速流动,撞上障碍物后容易产生漂亮的湍流和漩涡。这个参数直接控制着模拟中平滑速度差异的那个力的大小。
🙋
那“重力强度”呢?我把它调到零,粒子是不是就飘起来了?这和现实中的流体模拟有什么关系?
🎓
没错!把重力强度调到零,你就能模拟太空中的微重力流体,比如空间站里的燃料晃动。试着调高重力,粒子会加速下落,撞击更猛烈。工程现场常见的是,比如模拟大坝泄洪,就需要强大的重力驱动水流。改变这些参数后你会看到,SPH方法非常适合这种有自由表面、大变形和飞溅的场景,这是传统网格方法很难处理的。

物理模型与关键公式

SPH法的核心是“核函数”,它决定了粒子如何影响其邻居。密度估算通常使用平滑的Poly6核函数:

$$W_{poly6}(r,h) = \frac{315}{64\pi h^9}(h^2-r^2)^3$$

这里,$r$是两个粒子间的距离,$h$是影响半径(光滑长度)。这个函数像一个“帽子”,在$r=h$时平滑地降为零,保证了计算的稳定性。

然而,计算压力梯度时,Poly6核函数在中心处梯度为零,会导致粒子非物理性地聚集。因此,压力计算采用Spiky核函数的梯度形式:

$$\nabla W_{spiky}(r,h) = -\frac{45}{\pi h^6}(h-r)^2 \hat{r}$$

$\hat{r}$是单位方向向量。这个公式在中心处梯度不为零,能产生有效的排斥力,防止粒子穿透,是保证流体体积不压缩的关键。

现实世界中的应用

汽车工程:用于模拟油箱或发动机油底壳内的液体晃动,分析液体对车辆操控稳定性的影响,避免在急转弯或刹车时产生不可控的力矩。

土木与地质灾害:模拟山体滑坡、泥石流和溃坝洪水。SPH能自然追踪土石和水的自由表面与大变形,帮助评估灾害影响范围和设计防护结构。

铸造与制造:模拟熔融金属注入模具的充型过程,预测可能因湍流或卷气导致的铸造缺陷,优化浇注系统设计,提高零件质量。

海洋与海岸工程:模拟船舶航行时的兴波阻力、甲板上浪,或海啸波冲击海岸结构物。SPH擅长处理流体与复杂刚体结构的剧烈相互作用。

常见误解与注意事项

初次接触SPH时,有几个容易踩坑的地方。首先是“粒子数越多精度一定越高”的误解。虽然增加粒子数确实能呈现更细致的现象,但计算负荷会以接近粒子数平方的幅度飙升。例如将粒子数从1000倍增至2000时,邻近搜索的计算量实际上可能增加近4倍。学习时建议先用较少粒子数(如2000~5000)掌握宏观行为特征,再逐步增加数量。

其次是参数设置的陷阱。虽然粘性系数和压力系数可独立调整,但要再现真实流体必须保持这些参数的平衡。例如要模拟水这类具有特定运动粘度($ν$)的流体,不能仅调整粘性系数,还需联动修正密度和压力系数。实际应用中需注意“无量纲数”的概念。若在本工具中调高重力导致粒子飞散?不妨尝试适当增加压力系数来增强粒子凝聚力。

最后要警惕“SPH是无所不能的计算魔法”的过度期待。SPH虽擅长自由表面和大变形模拟,但也有其局限。例如不适合模拟微小湍流或边界层精细行为。此外,像本演示这样可视化所有粒子的方式虽直观,但实际工程中更常评估粒子的“统计行为”或“区域平均值”。建议通过工具感知现象后,养成退一步思考“如何量化此处特征?”的习惯。

使用指南

  1. 在模拟器画布上点击并拖动鼠标添加流体粒子,每次拖动可生成指定数量的粒子
  2. 调整粒子数量参数(numParticles)设置单次生成的粒子个数,范围建议50-200粒
  3. 通过粘度滑块(viscosity)控制流体阻尼,范围0.01-0.1;重力强度(gravStrength)设定竖直加速度,默认9.8 m/s²
  4. 观察屏幕中央圆形障碍物与流体的相互作用,实时监测帧率、粒子总数和平均动能指标
  5. 按需重置模拟以清空粒子,重新开始新的实验

具体计算示例

以水流绕过圆形堰体为例:设定粒子数200个/次、粘度0.05、重力9.8 m/s²。粒子核函数采用Poly6进行密度估算(ρ=Σm_j·W_poly6),Spiky核函数计算压力梯度∇P。若单个粒子质量m=0.001 kg,支撑域h=0.1 m,则压力项与-∇P/ρ成正比。模拟5秒后,流体分流绕过障碍物形成涡旋,平均动能逐渐衰减至稳态。

实务注意事项

  1. 粘度过低(<0.01)导致粒子间作用弱,易产生数值不稳定;粘度过高(>0.15)会过度阻尼,流动缓慢不适合观察湍流
  2. 粒子总数超过5000时帧率下降明显,建议逐次添加200粒以保持60 FPS以上的交互体验
  3. 支撑域半径h通常取粒子间距的2-3倍,过小导致密度计算误差,过大增加计算负担
  4. 在模拟粘性流体(如油品)时,调高粘度系数至0.08-0.1;模拟低粘流体(水)则保持0.02-0.05