不可压缩速度演化
平流搬运动量,黏性把速度差扩散开,喷口和流体刷提供外力,压力让流场保持不可压缩。
流体力学 · 能亲手推动的数值流场
在流体模拟里,平流、扩散和压力投影各起什么作用? 平流把染料和旋涡顺着流动带走,扩散把它们抹平。压力投影减去一个压力场的梯度,消掉散度,流体就不会在哪里堆积或变稀。这个压力场要迭代求解,迭代次数有限,就会剩下一点能测出来的散度。
透明流动室里,一个二维不可压缩速度场被拉出浅浅的纵深,画成发光粒子。调节黏度、染料扩散、压力迭代和涡量增强,看喷流绕过圆柱后怎样卷吸周围流体、留下尾迹。开启流体刷,在测试区拖动,就能同时注入染料和动量。
物理教程
背景速度和染料都存放在一张固定网格上。每个时间步交替做速度扩散、平流和压力投影,然后搬运染料。横向和纵向各用自己的实际网格间距;慢放只改变播放速度,读数的时间单位不变。
为什么值得理解把求解步骤一步步拆开,旋涡就不只是好看的特效。你能测出压力投影前后的散度,也能看到稳定性和数值耗散之间的取舍。
先抓重点
平流搬运动量,黏性把速度差扩散开,喷口和流体刷提供外力,压力让流场保持不可压缩。
从每个网格点逆着速度往回追,在落点插值取旧场的值。这一步很稳健,但反复插值会抹平细节。
程序存的是速度势,时间步和密度因子已经并在里面,所以它不是以帕斯卡计的压力。网格格子是矩形,Poisson 松弛在横向和纵向用不同的权重。迭代次数有限,投影后散度不一定严格为零。
当前值每次都从此刻的速度重新算。上次投影的前后两个值是一对历史快照,刷入动量或改动参数后会标为过期。速度场为零时,压缩比没有定义。
容易误解算法没爆掉,说明所有小旋涡都算对了。
正确理解半 Lagrangian 平流在较大时间步下也能保持稳定,但插值会带来数值耗散。涡量增强只是把视觉细节补回来,丢掉的真实尺度找不回来。
容易误解粒子分布有纵深,所以求解器已经解析了三维湍流。
正确理解所有粒子读的都是同一个二维速度截面。纵深只是让结构更容易看清,不会产生三维的涡拉伸。
选择“圆柱尾迹”,等染料绕过障碍。
你会看到: 喷流在圆柱前减速并分成两股;圆柱后方是一片低速尾迹,里面的涡旋转方向左右交替。暂停求解,开启流体刷,拖出一个扰动。打开“散度诊断”,点击“只做压力投影”。改变迭代次数后再投影一次。
你会看到: “上次投影前”的读数等于点击前的当前散度,“上次投影后”的读数等于新的当前散度。时间和染料都不前进。迭代次数加多,残余通常更小,但这仍不能证明流场严格不可压缩。开启流体刷,在尾迹里横向拖动;想旋转装置时再关掉刷子。
你会看到: 拖过的地方,染料和速度一起变化。新扰动随后被平流带走、扩散开,并再次经过压力投影。概念灵感:FluidMotion。模拟和图形都是原创,模型的适用范围见上文。