瑞利-贝纳德对流

瑞利-贝纳德问题将不可压缩流体流动与热输运耦合在一起:一个底部加热、顶部冷却的水平腔体,一旦浮力超过黏性与热扩散的耗散效应,便会发展出对流卷。脚本 examples/fluid/rayleigh_benard/rayleigh_benard.py 在长宽比为 2:1 的矩形腔体中、以可配置的瑞利数求解稳态布西内斯克近似。

这是 流体力学 中唯一涉及多物理场耦合的算例——将动量、连续性与能量纳入一个整体系统。

问题

布西内斯克方程组,

\[ \begin{align}\begin{aligned}\rho\, (\mathbf{u} \cdot \nabla)\mathbf{u} \;=\; -\nabla p + \mu\, \Delta \mathbf{u} - \rho\, g\, \beta\, T\, \hat{\mathbf{e}}_y, \qquad \nabla \cdot \mathbf{u} = 0,\\\rho\, c_p\, (\mathbf{u} \cdot \nabla T) \;=\; \kappa\, \Delta T,\end{aligned}\end{align} \]

定义在 \(\Omega = [0, 2] \times [0, 1]\) 上,其中

  • 速度:所有壁面均为无滑移,

  • 温度:底部(\(y = 0\))为 \(T = 1\),顶部(\(y = 1\))为 \(T = 0\),侧壁为无通量。

瑞利数

\[\mathrm{Ra} \;=\; \frac{g\, \beta\, \Delta T\, L^3}{\nu\, \alpha}\]

决定了流动所处的区间:低于 \(\mathrm{Ra}_c \approx 1708\) 时传热纯粹靠传导;高于此值则出现对流卷;在更高的 \(\mathrm{Ra}\) 下,卷会变得非定常并最终走向混沌。脚本默认取 \(\mathrm{Ra} = 10^4\),稳稳地处于稳态对流区间。

耦合装配器

每个节点上的未知量为 \((u, v, p, T)\)——每个节点 4 个自由度——装配器在每个求积点返回一个 \(4 \times 4\) 的块:

列表 18 examples/fluid/rayleigh_benard/rayleigh_benard.py(核心部分)
class RayleighBenardAssembler(ElementAssembler):
    def __post_init__(self, rho=1.0, mu=0.01, kappa=0.01,
                      g=9.81, beta=0.1, tau=0.1):
        self.rho, self.mu, self.kappa = rho, mu, kappa
        self.g, self.beta, self.tau   = g, beta, tau

    def forward(self, u, v, gradu, gradv, w_prev, T_prev):
        # row 0: x-momentum    [convection+diffusion, 0,    -dxp,   0   ]
        # row 1: y-momentum    [0,    convection+diffusion, -dyp,   buoyancy ]
        # row 2: continuity    [dxv,    dyv,                 PSPG,    0   ]
        # row 3: energy        [0,      0,                     0,    convection+diffusion]
        ...

位于第 1 行 / 第 3 列的浮力块正是将温度反耦合进动量方程的部分:

\[K_{1,3} \;=\; -\rho\, g\, \beta\, v\, u,\]

这里的 \(u\)\(v\) 是试探形函数与测试形函数的值(请注意它们与速度分量 \(v\) 不幸的命名冲突——分发约定参见 形式)。温度方程(第 3 行)复用了对流 / 扩散块,只是用热导率 \(\kappa\) 取代了黏度 \(\mu\)

上一迭代步的速度 w_prev 与温度 T_prevpoint_data 关键字参数的形式传入,模式与单物理场的方腔算例完全一致。

稳定化

脚本仅使用 PSPG(不含 SUPG),并取常数 \(\tau = 0.05 / n_\text{grid}\)。在 \(\mathrm{Ra} = 10^4\) 下,速度足够温和,SUPG 并非严格必需;对于更高的瑞利数,可换用 圆柱绕流(涡脱落) 中的自适应 \(\tau\)

Picard 迭代

顶盖驱动方腔 相同的不动点循环。每次迭代:

  1. 由当前解向量计算 \(\mathbf{w}^n, T^n\)

  2. 用新的 point_data 重新装配 \(K\)

  3. 对速度与温度的狄利克雷边界条件应用 Condenser(每个分量使用不同的掩码!)并求解。

  4. 与上一迭代步比较以检查收敛性。

典型收敛情况:在 \(\mathrm{Ra} = 10^4\) 下约需 30 次迭代。

瑞利-贝纳德对流的温度与速度大小

图 48 rayleigh_benard.py 的输出。左:温度场——温暖的底壁沿中心线送出一股上升羽流,在寒冷的顶部分裂为沿两侧壁面下沉的两股冷羽流。右:速度大小——两个反向旋转的对流卷,峰值速度出现在上升 / 下沉的流柱沿线,而卷心处则为滞止区。

输出

rayleigh_benard.png 显示两个面板:温度(带有特征性的温暖上升羽流 / 寒冷下沉羽流)以及速度大小(带有双卷结构)。对于中等 \(\mathrm{Ra}\) 下的 2:1 腔体,稳态解呈现为两个反向旋转的卷。

运行方式

cd examples/fluid/rayleigh_benard
python rayleigh_benard.py     # writes rayleigh_benard.png

修改脚本中的 ra= 参数以扫描瑞利数;远高于 \(10^5\) 的取值将需要更细的网格,并很可能需要一个瞬态驱动器。

下一步