SPH 密度求和
三次样条核只在有限的支撑半径内不为零。水体内部的粒子四周几乎都有邻居;自由表面上的粒子在空气一侧没有邻居,邻域被截掉了一块。
流体力学 · 用粒子模拟水花
只看附近邻居的粒子,怎样算出飞溅水体的密度和压强? 每个粒子用一个平滑的权重函数把附近邻居加起来,得到当地的密度;再由状态方程把密度换成压强。这里把水当成略微可压缩的流体:人为设定的声速越高,密度越接近不变,可时间步也得越小。
这是一个二维弱可压缩 SPH 模拟,用移动的粒子重建自由表面。六个场景里,粒子场、紧支撑核、压强随水深的分布,以及能量和密度误差的历史曲线,都在同一张画布上同步更新。
物理教程
背景光滑粒子流体动力学(SPH)把连续的流体拆成许多会移动的粒子,每颗粒子带着质量、位置和速度。粒子只看一定半径内的邻居,用加权求和估出密度,再在压强梯度、黏性和重力作用下运动。粒子分布的边缘,自然就成了自由表面。
为什么值得理解溃坝、晃荡和液滴撞击里,界面都在剧烈运动。固定网格要另想办法追踪界面;拉格朗日粒子本身就跟着流体走。代价是密度有噪声、边界有误差,显式推进的时间步也受到严格限制。
先抓重点
三次样条核只在有限的支撑半径内不为零。水体内部的粒子四周几乎都有邻居;自由表面上的粒子在空气一侧没有邻居,邻域被截掉了一块。
压强项对每一对粒子都是对称的,所以力总是成对出现。这里的黏性拉普拉斯项、壁面反弹和凝聚项,都是低阶的教学近似。
状态方程让水可以有限度地压缩,换来显式推进。提高数值声速能压低密度误差,允许的时间步也随之变小。
容易误解画面里的一颗蓝点就是一颗真实水分子。
正确理解每个 SPH 粒子代表一小块有限体积的流体,带着平滑后的质量、速度和热力学状态。它不是分子尺度的个体。
容易误解皇冠形的水花看起来像回事,求解器就算验证过了。
正确理解先检查总质量、内部密度误差、静水关系 、自由落体时质心的运动,以及改变粒子间距后结果是否稳定。看起来像,只能算最后一层证据。
暂停溃坝场景,先点一颗内部粒子,再点一颗自由表面上的粒子,比较 A 面板的支撑圆和 B 面板的邻居数。
你会看到: 内部粒子四周的邻居更齐全,各个方向几乎一样多;表面粒子缺了空气一侧的邻居,密度求和在边界处就偏小。选择“静水检验”,降低黏性后逐步推进,比较 C 面板的粒子压强点与静水直线。
你会看到: 越深压强总体越高,但粒子噪声、壁面处理和自由表面处偏小的密度,都会让散点偏离解析直线。在相同场景分别选择较低和较高数值声速,重置后比较体相密度 RMS 与声学时间步读数。
你会看到: 声速越高,密度波动通常越小,时间步却要更短。弱可压缩 SPH 的计算代价就在这里。依次改变粒子间距并重置溃坝,在相近模拟时刻比较前沿位置、密度误差与历史曲线。
你会看到: 粒子数、邻域采样和允许的时间步会一起变。如果结论随分辨率大幅变化,单次飞溅就不能当作可靠的预测。概念灵感:FluidMotion。模拟和图形都是原创,模型的适用范围见上文。