在画布上点击并拖动可添加粒子 | 圆形障碍物位于中央
密度估算(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)实时模拟二维流体。直观体验粘性、湍流和流体动力学。
在画布上点击并拖动可添加粒子 | 圆形障碍物位于中央
密度估算(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法的核心是“核函数”,它决定了粒子如何影响其邻居。密度估算通常使用平滑的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虽擅长自由表面和大变形模拟,但也有其局限。例如不适合模拟微小湍流或边界层精细行为。此外,像本演示这样可视化所有粒子的方式虽直观,但实际工程中更常评估粒子的“统计行为”或“区域平均值”。建议通过工具感知现象后,养成退一步思考“如何量化此处特征?”的习惯。
以水流绕过圆形堰体为例:设定粒子数200个/次、粘度0.05、重力9.8 m/s²。粒子核函数采用Poly6进行密度估算(ρ=Σm_j·W_poly6),Spiky核函数计算压力梯度∇P。若单个粒子质量m=0.001 kg,支撑域h=0.1 m,则压力项与-∇P/ρ成正比。模拟5秒后,流体分流绕过障碍物形成涡旋,平均动能逐渐衰减至稳态。