厨房水槽里每天都有的激波 — 弗劳德数与水跃
明渠流的比能、临界水深,以及浅水与可压缩流的相似
打开水龙头,让水落到平坦的水槽底部。水冲击点周围铺开一层薄而快的水膜,然后在某个半径处水突然堆起,形成一圈厚厚的环。这个环就是水跃(hydraulic jump)。厨房里每天发生的这个现象,令人惊讶的是竟遵循与超声速喷管中诞生的激波相同的方程。本文用一段小小的 Python 代码和两个仿真,讲清楚支配明渠(open channel)流动的弗劳德数是什么、为什么水深会在瞬间跃升、以及浅水如何模仿可压缩气体。读到最后,你会明白水槽里的环与拉瓦尔喷管中的激波为何是表亲。
不填满管道的流动#
明渠是顶部向大气敞开的水道。河流、排水沟、灌溉渠都属于这一类。充满封闭管道流动的水,靠进出口的压差被推动。明渠里的水不同。渠底坡度和重力驱动流动。
关键在于自由表面可以自由起伏。波沿着这个自由表面传播。在浅水中,小的表面波传播速度只由水深决定。
其中 是浅水波(shallow-water wave)的传播速度, 是重力加速度, 是水深。水越深,波越快。
比能与临界水深#
以渠底为基准、把流动所具有的能量用水头(head,长度单位的能量)表示出来,就是比能(specific energy)。在宽度 恒定的矩形渠道中,把单位宽度流量记为 ,则
第一项 是位能(水深),第二项是动能。固定 而把 画成 的函数,会出现一条有趣的曲线。水深太浅则流速变大、动能剧增;太深则位能变大。在两者之间的某处, 取得最小值。
求解 就得到该点的水深。
这个 就是临界水深(critical depth)。在此点 ,而流速恰好等于波速:。
在下面的图中亲手操作一下。改变 和水深 ,看看你落在曲线的哪一支上。
请注意,同一个 对应两个水深:上支(深而慢的流动)和下支(浅而快的流动)。越过临界水深 的鼻尖,两个世界就分开了。
弗劳德数:缓流与急流#
流速与波速之比决定流动的性格。这个无量纲数就是弗劳德数(惯性力与重力波速度之比)。
当 时,流速比波慢。下游障碍物造成的水面变化能够逆流而上传回上游。这种深而平缓的流动称为缓流(subcritical flow)。当 时,流速超过波速。下游的信号到不了上游。这种浅而快的流动是急流(supercritical flow)。 是临界状态,此时水深恰为 。
你大概已经有感觉了。弗劳德数扮演着与气体动力学中马赫数(流速与声速之比)完全相同的角色。就像声音在可压缩气体中传递信息一样,在明渠中浅水波传递信息。急流对应超声速,缓流对应亚声速。
水跃:水变厚的瞬间#
当急流必须变为缓流时,麻烦出现了。在比能曲线上,从下支平滑地过渡到上支没有路可走。自然用一个不连续来解决:浅而快的水突然跃升为厚而慢的水。这就是水跃。
联系水跃前后的关系,不来自能量,而来自动量守恒,因为水跃内部的湍流滚轴(roller)会毫不留情地吞噬能量。在水跃两侧配平动量通量和静水压力,就在跃前水深 与跃后水深 之间得到共轭水深(conjugate depth)关系。
是水跃之前(急流)的弗劳德数。水跃中损失的比能可以干净地求出。
这个损失正是工程师在大坝溢洪道和消力池中故意制造水跃的原因。他们把快水破坏性的动能散入湍流,保护下游河床免受冲刷。
在下面的仿真中改变上游侧的 。这是从侧面看,薄薄的急流经过水跃变为厚厚的缓流的图。
把 降到 1.5 附近,水跃减弱,水面平缓地隆起。升到 5 以上, 超过 6 倍,白色泡沫滚轴变得剧烈。
用代码再现#
我们直接计算共轭水深和能量损失。取单位宽度流量 ,跃前水深 。
import numpy as np
g = 9.81 # m/s^2
def froude(u, h):
"""弗劳德数 = 流速 / 浅水波速度。"""
return u / np.sqrt(g * h)
def critical_depth(q):
"""单位宽度流量 q 对应的临界水深(比能最小)。"""
return (q**2 / g) ** (1.0 / 3.0)
def specific_energy(h, q):
"""比能 E = h + q^2 / (2 g h^2)。"""
return h + q**2 / (2.0 * g * h**2)
def conjugate_depth(h1, q):
"""对跃前水深 h1(急流)求跃后水深 h2。"""
u1 = q / h1
fr1 = froude(u1, h1)
return 0.5 * h1 * (np.sqrt(1.0 + 8.0 * fr1**2) - 1.0)
def jump_dissipation(h1, h2):
"""水跃中损失的比能(湍流耗散)。"""
return (h2 - h1)**3 / (4.0 * h1 * h2)
q, h1 = 0.8, 0.2
u1 = q / h1
h2 = conjugate_depth(h1, q)
u2 = q / h2
print(f"上游(急流) u1={u1:.2f} m/s Fr1={froude(u1,h1):.2f}")
print(f"水跃后 h2={h2:.3f} m u2={u2:.2f} m/s Fr2={froude(u2,h2):.2f}")
print(f"临界水深 hc={critical_depth(q):.3f} m")
print(f"能量损失 dE={jump_dissipation(h1,h2):.3f} m")输出如下。
上游(急流) u1=4.00 m/s Fr1=2.86
水跃后 h2=0.714 m u2=1.12 m/s Fr2=0.42
临界水深 hc=0.403 m
能量损失 dE=0.238 m的急流经过水跃变成了 的缓流。水深变厚 3.6 倍,流速以同样的倍率变慢(连续方程 )。代价是 0.238 m 的比能散入湍流。跃后水深 m 大于临界水深 m,这证实了流动现在是缓流。
当浅水冒充气体#
这里是本文的精华。宽度恒定的浅水槽中定常流的连续方程是 。截面恒定的管道中可压缩气体定常流的连续方程是 。水深 与气体密度 精确对应。
对浅水能量方程 求微分得到 ,代入波速 ,就会发现浅水波占据着与气体中声波相同的位置。汇总起来就得到下面的相似。
| 浅水 | 可压缩气体 |
|---|---|
| 水深 | 密度 |
| 浅水波速度 | 声速 |
| 弗劳德数 | 马赫数 |
| 急流 / 缓流 | 超声速 / 亚声速 |
| 水跃 | 激波 |
这个相似对应于 的假想气体(,)。所以早期的航空研究者不用昂贵的超声速风洞,而是把物体放进"浅水水槽(shallow water table)",通过观察水面的水跃来定性研究激波形态。水槽里的环之所以像二维物体前的弓形激波(bow shock),正是因为这个原因。
值得记住的几点#
- 弗劳德数 是明渠流的马赫数。 为缓流(平缓), 为急流, 为临界。
- 水跃是急流变为缓流的不连续。共轭水深 来自动量守恒而非能量守恒,剩余的能量耗散为湍流。
- 浅水与可压缩流的相似把水深对应到密度、浅水波对应到声波、水跃对应到激波。你厨房水槽里的水环,是你每天都在做的激波实验。
如果对您有帮助,请分享。