最近看到了 Shi et al. [1] 的新文章很有意思: MesoFD 格式 —— 从平衡态就能去构建各种偏微分方程的有限差分LBM格式 (并包括其对应的源项和平衡态).

我这里主要是把自己感兴趣的 “Navier-Stokes 方程的构造” 部分内容摘录了出来, 并做分享 (没想到用Taylor展开来分析真的不难啊).

至于文章里的稳定性分析、DnQb构造等等, 还请各位阅读施保昌老师的原文.

[1] Shi B, Du R, Chai Z. Equilibrium-distribution-function-based mesoscopic finite-difference methods for partial differential equations: modeling and analysis. Physical Review E, 2026, 113(4):045305. DOI:10.1103/61zg-dmhh. [Also available at arXiv:2505.17057]
[2] Xinmeng Chen, Zhenhua Chai, Jinlong Shang, Baochang Shi. Multiple-relaxation-time finite-difference lattice Boltzmann model for the nonlinear convection-diffusion equation. Physical Review E, 2021, 104:035308. DOI:10.1103/physreve.104.035308

基本构型

Shi et al. [1] 提出了一个 MesoFD 格式, 核心在于将 cj\boldsymbol{c}_j 方向的离散分布函数 fjf_j 直接表示为邻近时空点处平衡分布函数 fjeqf_j^{eq} 的线性组合 (j=0,1,…b−1j=0,1, \dots b-1, 共b个离散速度矢量).

fj(x,t)=∑q∑k(akqfjeq(x+kcjδt,t+qδt)+bkqδtFj(x+kcjδt,t+qδt))(1)f_j (\boldsymbol{x},t)=\sum_{q} \sum_{k} \left( a_{kq} f_j^{eq}(\boldsymbol{x}+k\boldsymbol{c}_j \delta_t, t+q\delta_t) + b_{kq} \delta_t F_j (\boldsymbol{x}+k\boldsymbol{c}_j \delta_t, t+q\delta_t) \right) \tag{1}

其中 akq,bkqa_{kq}, b_{kq} 均为参数, FjF_j 为该方向的源项. −mq≤k≤mq-m_q \le k \le m_q 以及 −n≤q≤0-n \le q \le 0 均为整数. nn 和 mqm_q 均不小于1, 表明这一组合至少使用单层空间数据和 t−δtt-\delta_t 的时间数据.

为便于书写, Shi et al. 用了下面的简记符号

fjeq(x+kcjδt,t+qδt)=fjeq,[k,q],Fj(x+kcjδt,t+qδt)=Fj[k,q]f_j^{eq}(\boldsymbol{x}+k\boldsymbol{c}_j \delta_t, t+q\delta_t) = f_j^{eq,[k,q]} ,\quad F_j (\boldsymbol{x}+k\boldsymbol{c}_j \delta_t, t+q\delta_t) = F_j^{[k,q]}

所以式(1)写为: fj(x,t)=∑k,q[akqfjeq,[k,q]+bkqδtFj[k,q]]f_j (\boldsymbol{x},t)=\sum_{k,q} [ a_{kq} f_j^{eq,[k,q]} + b_{kq} \delta_t F_j^{[k,q]}] . 对于经典的Navier-Stokes Equations (NSEs), 依旧有:

ρ(x,t)=∑j∑k,q[akqfjeq,[k,q]+bkqδtFj[k,q]](2a)\rho(\boldsymbol{x},t) = \sum_{j} \sum_{k,q} \left[ a_{kq} f_j^{eq,[k,q]} + b_{kq} \delta_t F_j^{[k,q]} \right] \tag{2a}

以及

(ρu)(x,t)=∑j∑k,qcj[aˉkqfjeq,[k,q]+bˉkqδtFj[k,q]](2b)(\rho\boldsymbol{u})(\boldsymbol{x},t) = \sum_{j}\sum_{k,q} \boldsymbol{c}_j \left[ \bar{a}_{kq} f_j^{eq,[k,q]} + \bar{b}_{kq} \delta_t F_j^{[k,q]} \right] \tag{2b}

需要强调, 计算动量 ρu\rho\boldsymbol{u} 所用的系数 {aˉkq,bˉkq}\{\bar{a}_{kq}, \bar{b}_{kq}\} 和式(1)里所用的那套不一样.

式(1)和中心差分方法的联系

若对一个空间内的函数 g(x)g(\boldsymbol{x}) 沿着 cj\boldsymbol{c}_j 方向做差分 (记 cjˉ=−cj\boldsymbol{c}_{\bar{j}} = - \boldsymbol{c}_j), 则记:

  • 一阶空间中心差分算符: Δj,k(1)g(x)=g(x+kcjδt)−g(x−kcjδt)\Delta_{j,k}^{(1)} g(\boldsymbol{x}) = g(\boldsymbol{x} + k \boldsymbol{c}_j \delta_t) - g(\boldsymbol{x} - k \boldsymbol{c}_j \delta_t); 且 Δj(1)g(x)=Δj,1(1)g(x)\Delta_{j}^{(1)} g(\boldsymbol{x}) = \Delta_{j,1}^{(1)} g(\boldsymbol{x}).
  • 二阶空间中心差分算符: Δj,k(2)g(x)=g(x+kcjδt)−g(x)+g(x−kcjδt)\Delta_{j,k}^{(2)} g(\boldsymbol{x}) = g(\boldsymbol{x} + k \boldsymbol{c}_j \delta_t) - g(\boldsymbol{x}) + g(\boldsymbol{x} - k \boldsymbol{c}_j \delta_t); 且 Δj(2)g(x)=Δj,1(2)g(x)\Delta_{j}^{(2)} g(\boldsymbol{x}) = \Delta_{j,1}^{(2)} g(\boldsymbol{x}).

我们便可发现: g(x±kcjδt)=(Δj,k(2)±Δj,k(1)+g(x))/2g(\boldsymbol{x} \pm k \boldsymbol{c}_j \delta_t) = (\Delta_{j,k}^{(2)} \pm \Delta_{j,k}^{(1)} + g(\boldsymbol{x})) / 2

那么式(1)要进一步改写为:

fj(x,t)=∑k,qakq[1+(Δj,k(2)+Δj,k(1))/2]fjeq(x,t+qδt)+δt∑k,qbkq[1+(Δj,k(2)+Δj,k(1))/2]Fj(x,t+qδt)\begin{aligned} f_j (\boldsymbol{x}, t) =& \sum_{k,q} a_{kq} [1 + (\Delta_{j,k}^{(2)} + \Delta_{j,k}^{(1)})/2] f_j^{eq}(\boldsymbol{x}, t+q\delta_t) + \\& \delta_t \sum_{k,q} b_{kq} [1 + (\Delta_{j,k}^{(2)} + \Delta_{j,k}^{(1)})/2] F_j (\boldsymbol{x}, t+q\delta_t) \end{aligned}

算法框架

这个算法其实也比较容易. 假定已有 tt 时刻的数据, 需要前推到 t+δtt+\delta_t 时刻. 下面也就只简单介绍这个单步过程.

(1) 对网格点 x\boldsymbol{x}, 通过它的宏观物理量去计算平衡态 fjeq(x,t)f_j^{eq}(\boldsymbol{x}, t) 和 外力项 Fj(x,t)F_j(\boldsymbol{x}, t). [具体公式详见原文的第III.C节, 这里不做介绍]

(2) 用式(1)计算所有点的 fjf_j.

(3) 用式(2)更新宏观物理量.

(4) 施加边界条件.

MesoFD 的直接 Taylor 展开

单个分量的分析

下面讨论对式(1)直接 Taylor 展开的分析, 并最高展开至 N≥1N \geq 1 阶后做截断.

记 Taylor 展开算子

Dk,q=q∂t+k∇⋅cjD_{k,q} = q \partial_{t} + k \nabla \cdot \boldsymbol{c}_{j}

那么 fjeq,[k,q]f_j^{eq,[k,q]} 和 Fj[k,q]F_j^{[k,q]} 分别展开成

fjeq(x+kcjδt,t+qδt)=∑l=0N(δt)ll!Dk,qlfjeq(x,t)+O((δt)N+1)f_j^{eq}(\boldsymbol{x}+k\boldsymbol{c}_j \delta_t, t+q\delta_t) = \sum_{l=0}^{N} \frac{(\delta_{t})^l}{l!} D_{k,q}^l f_j^{eq}(\boldsymbol{x}, t) + O((\delta_{t})^{N+1})

和

Fj(x+kcjδt,t+qδt)=∑l=0N(δt)ll!Dk,qlFj(x,t)+O((δt)N+1)F_j(\boldsymbol{x}+k\boldsymbol{c}_j \delta_t, t+q\delta_t) = \sum_{l=0}^{N} \frac{(\delta_{t})^l}{l!} D_{k,q}^l F_j(\boldsymbol{x}, t) + O((\delta_{t})^{N+1})

考虑到算子 Dk,qD_{k,q} 高阶导表示为

Dk,ql=(q∂t+k∇⋅cj)l=∑m=0lClm (q∂t)l−m (k∇⋅cj)m,Clm=l!/(m!(l−m)!)\begin{aligned} D_{k,q}^{l} &= (q \partial_{t} + k \nabla \cdot \boldsymbol{c}_{j})^l = \sum_{m=0}^{l} C_l^m \, (q \partial_{t})^{l-m} \, (k\nabla \cdot \boldsymbol{c}_j)^m ,\\ C_l^m &= l! / (m! (l-m)!) \end{aligned}

那么, 我们把和空间、时间有关的系数部分提取出来

Alm=Clml!∑k,qakqql−mkm,Blm=Clml!∑k,qbkqql−mkmA_{lm} = \frac{C_l^m}{l!} \sum_{k,q} a_{kq} q^{l-m} k^{m} ,\quad B_{lm} = \frac{C_l^m}{l!} \sum_{k,q} b_{kq} q^{l-m} k^{m}

则式(1)的展开要写作:

fj(x,t)=∑l=0N(δt)l∑m=0l[Alm∂tl−m(∇⋅cj)mfjeq+δtBlm∂tl−m(∇⋅cj)mFj]+O((δt)N+1)(3)f_j (\boldsymbol{x},t) = \sum_{l=0}^{N} (\delta_t)^l \sum_{m=0}^{l} \left[ A_{lm} \partial_{t}^{l-m} (\nabla \cdot \boldsymbol{c}_j)^m f_j^{eq} + \delta_t B_{lm} \partial_{t}^{l-m} (\nabla \cdot \boldsymbol{c}_j)^m F_j \right] + O((\delta_{t})^{N+1}) \tag{3}

其中 fjeq=fjeq(x,t)f_j^{eq} = f_j^{eq}(\boldsymbol{x},t), Fj=Fj(x,t)F_j = F_j(\boldsymbol{x},t).

取 N=2N=2 , 由于 FjF_j 部分在 l=2l=2 时直接到了 O(δt3)O(\delta_t^3) 量级, 我们得到

fj(x,t)=A00fjeq+δtB00Fj⏟l=0+δt(A10∂t+A11∇⋅cj)fjeq+δt2(B10∂t+B11∇⋅cj)Fj⏟l=1+δt2[A20∂t2+A21∂t (∇⋅cj)+A22(∇⋅cj)2]fjeq⏟l=2 (feq part)+O(δt3)\begin{aligned} f_j (\boldsymbol{x},t) =& \underbrace{A_{00} f_j^{eq} + \delta_t B_{00} F_j}_{l=0} \\& + \underbrace{\delta_t (A_{10} \partial_t + A_{11} \nabla \cdot \boldsymbol{c}_j) f_j^{eq} + \delta_t^2 (B_{10} \partial_t + B_{11} \nabla \cdot \boldsymbol{c}_j) F_j}_{l=1} \\& +\underbrace{\delta_t^2 [A_{20} \partial_t^2 + A_{21} \partial_t \, (\nabla \cdot \boldsymbol{c}_j) + A_{22} (\nabla \cdot \boldsymbol{c}_j)^2] f_j^{eq} }_{l=2 \,(f^{eq} \text{ part})} \\& + O(\delta_t^3) \end{aligned}

分布函数的速度矩

这里我们写列出 k 阶速度矩的表达式:

M0=∑jfjeq=∑jfj,M0F=∑jFj,M1=∑jcjfjeq,M1F=∑jcjFj,Mk=∑jcj…cj⏟kfjeq,MkF=∑jcj…cj⏟kFj,(k>1)\begin{aligned} M_0 &= \sum_j f_j^{eq} = \sum_j f_j ,& M_{0F} &= \sum_j F_j, \\ M_1 &= \sum_j \boldsymbol{c}_j f_j^{eq},& M_{1F} &= \sum_j \boldsymbol{c}_j F_j, \\ M_k &= \sum_j \underbrace{\boldsymbol{c}_j \dots \boldsymbol{c}_j}_{k} f_j^{eq},& M_{kF} &= \sum_j \underbrace{\boldsymbol{c}_j \dots \boldsymbol{c}_j}_{k} F_j, (k>1)\\ \end{aligned}

按理来说, 只要把这些速度矩也匹配上就能去还原宏观方程.

毕竟我们知道, 对于常用的正方形+对称 DnQb 模型, 如果是还原Navier-Stokes方程, 就有:

  • M0=ρM_0 = \rho.
  • M1=ρuM_1 = \rho \boldsymbol{u}.
  • M2=ρuu+pIM_2 = \rho \boldsymbol{u} \boldsymbol{u} + p \boldsymbol{I}.

不过, 先别急.

让我们注意一下式(3)中的 (∇⋅cj)mfjeq(\nabla \cdot \boldsymbol{c}_j)^m f_j^{eq} 部分 (暂不考虑前面的时间偏导), 如果我们对这部分对所有 jj 进行求和 (零阶速度矩), 就会发现

∑j(∇⋅cj)mfjeq=(∇…∇)⊗∑j(cj…cj⏟kfjeq)=∇m⊗Mm\begin{aligned} \sum_{j} (\nabla \cdot \boldsymbol{c}_j)^m f_j^{eq} &= (\nabla \dots \nabla) \otimes \sum_{j} (\underbrace{\boldsymbol{c}_j \dots \boldsymbol{c}_j}_{k} f_j^{eq}) \\ &= \nabla^{m} \otimes M_{m} \end{aligned}

也就是说, M0M_0 的内部就自然包含了更高的 m 阶矩 MmM_{m} (m=[0,1,..,l]m=[0,1,..,l], l=[0,1,...N]l=[0,1,...N], 且 N≥1N \geq 1). 这个情况对 MkM_k 以及源项部分的矩也是一样的.

将式(3)代入 M0M_0, 可得

M0=A00M0+∑l=1Nδtl∑m=0l[Alm ∂tl−m ∇m⊗Mm]+∑l=0N−1δtl+1∑m=0l[Blm ∂tl−m ∇m⊗MmF]+O(δtl+1)\begin{aligned} M_0 =& A_{00} M_0 + \sum_{l=1}^{N} \delta_{t}^l \sum_{m=0}^{l} [A_{lm} \, \partial_{t}^{l-m} \, \nabla^{m} \otimes M_{m}] \\ & + \sum_{l=0}^{N-1} \delta_{t}^{l+1} \sum_{m=0}^{l} [B_{lm} \, \partial_{t}^{l-m} \, \nabla^{m} \otimes M_{mF}] + O(\delta_{t}^{l+1}) \end{aligned}

令 A00=1A_{00}=1 以消去左右两侧的 M0M_0, 整理得到

∑l=1Nδtl−1∑m=0l[Alm ∂tl−m ∇m⊗Mm]+∑l=0N−1δtl∑m=0l[Blm ∂tl−m ∇m⊗MmF]=O(δtl)(4)\sum_{l=1}^{N} \delta_{t}^{l-1} \sum_{m=0}^{l} [A_{lm} \, \partial_{t}^{l-m} \, \nabla^{m} \otimes M_{m}] + \sum_{l=0}^{N-1} \delta_{t}^l \sum_{m=0}^{l} [B_{lm} \, \partial_{t}^{l-m} \, \nabla^{m} \otimes M_{mF}] = O(\delta_{t}^l) \tag{4}

同理, 将式(3)代入 M1M_1, 可得

M1=Aˉ00M1+∑l=1Nδtl∑m=0l[Aˉlm ∂tl−m ∇m⊗Mm]+∑l=0N−1δtl+1∑m=0l[Bˉlm ∂tl−m ∇m⊗MmF]+O(δtl+1)\begin{aligned} M_1 =& \bar{A}_{00} M_1 + \sum_{l=1}^{N} \delta_{t}^l \sum_{m=0}^{l} [\bar{A}_{lm} \, \partial_{t}^{l-m} \, \nabla^{m} \otimes M_{m}] \\ & + \sum_{l=0}^{N-1} \delta_{t}^{l+1} \sum_{m=0}^{l} [\bar{B}_{lm} \, \partial_{t}^{l-m} \, \nabla^{m} \otimes M_{mF}] + O(\delta_{t}^{l+1}) \end{aligned}

其中 Aˉlm,Bˉlm\bar{A}_{lm}, \bar{B}_{lm} 的定义仿照之前的写法:

Aˉlm=Clml!∑k,qaˉkqql−mkm,Bˉlm=Clml!∑k,qbˉkqql−mkm\bar{A}_{lm} = \frac{C_l^m}{l!} \sum_{k,q} \bar{a}_{kq} q^{l-m} k^{m} ,\quad \bar{B}_{lm} = \frac{C_l^m}{l!} \sum_{k,q} \bar{b}_{kq} q^{l-m} k^{m}

令 Aˉ00=1\bar{A}_{00}=1 以消去左右两侧的 M1M_1, 整理得到

∑l=1Nδtl−1∑m=0l[Aˉlm ∂tl−m ∇m⊗Mm+1]+∑l=0N−1δtl∑m=0l[Bˉlm ∂tl−m ∇m⊗M(m+1)F]=O(δtl)(5)\sum_{l=1}^{N} \delta_{t}^{l-1} \sum_{m=0}^{l} [\bar{A}_{lm} \, \partial_{t}^{l-m} \, \nabla^{m} \otimes M_{m+1}] + \sum_{l=0}^{N-1} \delta_{t}^l \sum_{m=0}^{l} [\bar{B}_{lm} \, \partial_{t}^{l-m} \, \nabla^{m} \otimes M_{(m+1)F}] = O(\delta_{t}^l) \tag{5}

【1】对于式(4), 当 N=1N=1 时, 则:

A10∂tM0+A11∇⋅M1=−B00M0F+O(δt)(6a)A_{10} \partial_{t} M_0 + A_{11} \nabla \cdot M_1 = - B_{00} M_{0F} + O(\delta_t) \tag{6a}

当 N=2N=2 时, 则:

(A10∂tM0+A11∇⋅M1)+δt[A20∂t2M0+A21∂t∇⋅M1+A22∇∇:M2]=−B00M0F−δt(B10∂tM0F+B11∇⋅M1F)+O(δt2)(6b)\begin{aligned} ( A_{10} \partial_{t} M_0 + A_{11} \nabla \cdot M_1 ) &+ \delta_t [ A_{20} \partial_{t}^2 M_0 + A_{21} \partial_{t} \nabla \cdot M_1 + A_{22} \nabla\nabla : M_2 ] \\ & = -B_{00} M_{0F} - \delta_t (B_{10} \partial_{t} M_{0F} + B_{11} \nabla \cdot M_{1F}) + O(\delta_t^2) \end{aligned} \tag{6b}

【2】对于式(5), 当 N=1N=1 时, 则:

Aˉ10∂tM1+Aˉ11∇⋅M2=−Bˉ00M1F+O(δt)(7a)\bar{A}_{10} \partial_{t} M_1 + \bar{A}_{11} \nabla \cdot M_2 = -\bar{B}_{00} M_{1F} + O(\delta_t) \tag{7a}

当 N=2N=2 时, 则:

(Aˉ10∂tM1+Aˉ11∇⋅M2)+δt[Aˉ20∂t2M1+Aˉ21∂t∇⋅M2+Aˉ22∇∇:M3]=−Bˉ00M1F−δt(Bˉ10∂tM1F+Bˉ11∇⋅M2F)+O(δt2)(7b)\begin{aligned} ( \bar{A}_{10} \partial_{t} M_1 + \bar{A}_{11} \nabla \cdot M_2 ) &+ \delta_t [ \bar{A}_{20} \partial_{t}^2 M_1 + \bar{A}_{21} \partial_{t} \nabla \cdot M_2 + \bar{A}_{22} \nabla\nabla : M_3 ] \\ & = -\bar{B}_{00} M_{1F} - \delta_t (\bar{B}_{10} \partial_{t} M_{1F} + \bar{B}_{11} \nabla \cdot M_{2F}) + O(\delta_t^2) \end{aligned} \tag{7b}

Shi et al. 做出下面代换来简化式(6-7), 这些代换在下文会用到:

  • A10=A11=−B00A_{10} = A_{11} = - B_{00},
  • Aˉ10=Aˉ11=−Bˉ00\bar{A}_{10} = \bar{A}_{11} = - \bar{B}_{00},
  • S=−B00A10M0F=M0F\displaystyle S = -\frac{B_{00}}{A_{10}} M_{0F} = M_{0F},
  • F=−Bˉ00Aˉ10M1F=M1F\displaystyle \boldsymbol{F} = -\frac{\bar{B}_{00}}{\bar{A}_{10}} M_{1F} = M_{1F}.

与非线性对流扩散方程的匹配 (式(6))

这里我们先把非线性对流扩散方程写出来, 作为参照:

∂tϕ+∇⋅B=S+α∇∇:D+O(δt2)=S+∇⋅[α∇⋅D]+O(δt2)(8)\begin{aligned} \partial_{t} \phi + \nabla \cdot \bold{B} &= \boldsymbol{S} + \alpha \nabla\nabla:\bold{D} + O(\delta_t^2)\\ &= \boldsymbol{S} + \nabla \cdot [\alpha \nabla \cdot \bold{D}] + O(\delta_t^2) \end{aligned} \tag{8}

若我们只考虑 “各向同性”+“不可压缩流” 来降低心智负担, 则

  • ϕ\phi 为输运的守恒量;
  • u\boldsymbol{u} 为 ϕ\phi 的输运速度;
  • α\alpha 为扩散系数 (常数);
  • B=ϕ u\bold{B}=\phi \, \boldsymbol{u} (这里对不可压缩流有 ∇⋅u=0\nabla\cdot\boldsymbol{u}=0 , 所以 ∇⋅B=u⋅∇ϕ\nabla\cdot\bold{B}=\boldsymbol{u}\cdot\nabla\phi);
  • D=ϕ [I]\bold{D}=\phi \, [\bold{I}].
  • S\boldsymbol{S} 为源项向量.

式(6)可化简为

∂tM0+∇⋅M1=S+O(δt)(9a)\partial_{t} M_0 + \nabla \cdot M_1 = S + O(\delta_t) \tag{9a}

(∂tM0+∇⋅M1)+δtA10[A20∂t2M0+A21∂t∇⋅M1+A22∇∇:M2]=S−δtA10(B10∂tM0F+B11∇⋅M1F)+O(δt2)(9b)\begin{aligned} ( \partial_{t} M_0 + \nabla \cdot M_1 ) &+ \frac{\delta_t}{A_{10}} [ A_{20} \partial_{t}^2 M_0 + A_{21} \partial_{t} \nabla \cdot M_1 + A_{22} \nabla\nabla : M_2 ] \\ & = S - \frac{\delta_t}{A_{10}} (B_{10} \partial_{t} M_{0F} + B_{11} \nabla \cdot M_{1F}) + O(\delta_t^2) \end{aligned} \tag{9b}

而 ∂t2M0\partial_{t}^2 M_0 可以由式(9a)的时间偏导表示, 这就和 Chapman-Enskog 展开那套东西比较相似: 高阶矩的计算需要借用低阶矩的方程来化简.

∂t2M0=−∂t∇⋅M1+∂tS+O(δt)\partial_{t}^2 M_0 = - \partial_{t} \nabla \cdot M_1 + \partial_{t} S + O(\delta_t)

则式(9b)可以进一步化简为

(∂tM0+∇⋅M1)+δtA10(B10+A20)∂tS=S−δtA10[(A21−A20)∂t∇⋅M1+B11∇⋅M1F+A22∇∇:M2]+O(δt2)(9c)\begin{aligned} ( \partial_{t} M_0 + \nabla \cdot M_1 ) &+ \frac{\delta_t}{A_{10}} (B_{10} + A_{20}) \partial_{t}S \\ & = S - \frac{\delta_t}{A_{10}} [(A_{21} - A_{20}) \partial_{t} \nabla \cdot M_1 \\ &\quad + B_{11} \nabla \cdot M_{1F} + A_{22} \nabla\nabla : M_2] \\ &\quad + O(\delta_t^2) \end{aligned} \tag{9c}

令 (B10+A20)∂tS=0(B_{10} + A_{20}) \partial_{t}S = 0 , 对比式(9c)和非线性对流扩散方程(式(8)), 我们现在就可以开始做参数匹配了:

M0=ϕ, M1=B, M2=βcs2D+C, α=−A22A10δtβcs2,M1F=−[(A21−A20)∂tB+A22∇⋅C]\begin{aligned} M_0 = \phi, \, M_1 &= \bold{B}, \, M_2 = \beta c_s^2 \bold{D} + \bold{C}, \, \alpha = -\frac{A_{22}}{A_{10}} \delta_t \beta c_s^2 ,\\ M_{1F} &= -[(A_{21} - A_{20}) \partial_{t}\bold{B} + A_{22} \nabla\cdot\bold{C}] \end{aligned}

这里和 C\bold{C} 有关的部分用于消除式(8c)中的 A22∇∇:M2A_{22} \nabla\nabla : M_2 项.

与Navier-Stokes方程的匹配 (式(6) + 式(7))

首先, 式(6)的二阶结果即为式(9c). 这里只需要结合式(7)的二阶结果, 再和Navier-Stokes方程组进行参数匹配即可. 所以下面主要讨论式(7).

式(7)可化简为

∂tM1+∇⋅M2=F+O(δt)(10a)\partial_{t} M_1 +\nabla \cdot M_2 = \boldsymbol{F} + O(\delta_t) \tag{10a}

(∂tM1+∇⋅M2)+δtAˉ10[Aˉ20∂t2M1+Aˉ21∂t∇⋅M2+Aˉ22∇∇:M3]=F−δtAˉ10(Bˉ10∂tF+Bˉ11∇⋅M2F)+O(δt2)(10b)\begin{aligned} ( \partial_{t} M_1 + \nabla \cdot M_2 ) &+ \frac{\delta_t}{\bar{A}_{10}} [ \bar{A}_{20} \partial_{t}^2 M_1 + \bar{A}_{21} \partial_{t} \nabla \cdot M_2 + \bar{A}_{22} \nabla\nabla : M_3 ] \\ & = \boldsymbol{F} - \frac{\delta_t}{\bar{A}_{10}} (\bar{B}_{10} \partial_{t} \boldsymbol{F} + \bar{B}_{11} \nabla \cdot M_{2F}) + O(\delta_t^2) \end{aligned} \tag{10b}

同理, 用式(10a)表示 ∂t2M1\partial_{t}^2 M_1, 即:

∂t2M1=−∂t∇⋅M2+∂tF+O(δt)\partial_{t}^2 M_1 = -\partial_{t} \nabla \cdot M_2 + \partial_{t}\boldsymbol{F} + O(\delta_t)

再次代入式(10b)进行化简, 得到:

(∂tM1+∇⋅M2)+δtAˉ10(Bˉ10∂tF+Aˉ20∂tF)=F−δtAˉ10[(Aˉ21−Aˉ20)∂t∇⋅M2+Bˉ11∇⋅M2F+Aˉ22∇∇:M3]+O(δt2)(10c)\begin{aligned} ( \partial_{t} M_1 + \nabla \cdot M_2 ) &+ \frac{\delta_t}{\bar{A}_{10}} (\bar{B}_{10} \partial_{t}\boldsymbol{F} + \bar{A}_{20} \partial_{t}\boldsymbol{F}) \\ & = \boldsymbol{F} - \frac{\delta_t}{\bar{A}_{10}} [(\bar{A}_{21} - \bar{A}_{20}) \partial_{t} \nabla \cdot M_2 \\ &\quad + \bar{B}_{11} \nabla \cdot M_{2F} + \bar{A}_{22} \nabla\nabla : M_3] \\ &\quad + O(\delta_t^2) \end{aligned} \tag{10c}

【1】对于式(6)的二阶结果(即式(9c)), 再次利用式(10a), 可得

∂t∇⋅M1=−∇∇:M2+∇⋅F+O(δt)\partial_{t} \nabla \cdot M_1 = -\nabla \nabla : M_2 + \nabla \cdot \boldsymbol{F} + O(\delta_t)

再令 −B11F=(A21−A20)F-B_{11} \boldsymbol{F} = (A_{21} - A_{20}) \boldsymbol{F} 和 (B10+A20)∂tS=0(B_{10} + A_{20}) \partial_{t}S = 0, 全部代入到式(9c)中, 得到

∂tM0+∇⋅M1=S−δtA10[(A22−(A21−A20))∇∇:M2]+O(δt2)(11a)\partial_{t} M_0 + \nabla\cdot M_1 = S - \frac{\delta_t}{A_{10}} [(A_{22} - (A_{21} - A_{20}))\nabla \nabla : M_2] + O(\delta_t^2) \tag{11a}

式(11a)将用于匹配连续性方程.

【2】对于式(7)的二阶结果(即式(10c))

令 (Bˉ10∂tF+Aˉ20∂tF)=0(\bar{B}_{10} \partial_{t}\boldsymbol{F} + \bar{A}_{20} \partial_{t}\boldsymbol{F}) = 0, 得到

(∂tM1+∇⋅M2)=F−δtAˉ10[(Aˉ21−Aˉ20)∂t∇⋅M2+Bˉ11∇⋅M2F+Aˉ22∇∇:M3]+O(δt2)(11b)\begin{aligned} ( \partial_{t} M_1 + \nabla \cdot M_2 ) & = \boldsymbol{F} - \frac{\delta_t}{\bar{A}_{10}} [(\bar{A}_{21} - \bar{A}_{20}) \partial_{t} \nabla \cdot M_2 \\ &\quad + \bar{B}_{11} \nabla \cdot M_{2F} + \bar{A}_{22} \nabla\nabla : M_3] \\ &\quad + O(\delta_t^2) \end{aligned} \tag{11b}

式(11a)将用于匹配Navier-Stokes方程.

【3】 针对式(11a)和式(11b), 我们需要给出如下参数匹配

M0=ρ,M1=ρu,M2=ρuu+pI,M3=cs2ρuI+M30,M2F=−1Bˉ11[(Aˉ21−Aˉ20)∂tM2+Aˉ22(∇⋅M30+(∇⋅ρuI+u∇ρ+(u∇ρ)T)cs2 )]\begin{aligned} M_0 &= \rho , \\ M_1 &= \rho \bold{u} , \\ M_2 &= \rho \bold{u} \bold{u} + p \bold{I} , \\ M_3 &= c_s^2 \rho \bold{u} \bold{I} + M_{30} , \\ M_{2F} &= \frac{-1}{\bar{B}_{11}} [(\bar{A}_{21} - \bar{A}_{20}) \partial_{t} M_2 + \bar{A}_{22} ( \nabla \cdot M_{30} + \\&\quad (\nabla \cdot \rho \bold{u} \bold{I} + \bold{u} \nabla\rho + (\bold{u} \nabla\rho)^{T}) c_s^2 \, )] \\ \end{aligned}

且运动粘度 ν=Aˉ22Aˉ10δtcs2\nu = \frac{\bar{A}_{22}}{\bar{A}_{10}} \delta_t c_s^2. 则式(11a)和式(11b)被转化为Navier-Stokes方程组

∂tρ+∇⋅(ρu)=S−δtA10[(A22−(A21−A20))∇∇:M2]+O(δt2)∂t(ρu)+∇⋅(ρuu+pI)=F+ν∇⋅ρ[∇u+(∇u)T]+O(δt2)\begin{aligned} \partial_t \rho + \nabla \cdot (\rho \boldsymbol{u}) &= S - \frac{\delta_t}{A_{10}} [(A_{22} - (A_{21} - A_{20}))\nabla \nabla : M_2] + O(\delta_t^2) \\ \partial_t (\rho \boldsymbol{u}) + \nabla \cdot (\rho \boldsymbol{u}\boldsymbol{u} + p \bold{I}) &= \boldsymbol{F} + \nu \nabla \cdot \rho [\nabla\boldsymbol{u} + (\nabla\boldsymbol{u})^T] + O(\delta_t^2) \\ \end{aligned}

注:

  1. Shi et al. 原文式(61a)写的 M3=cs2Δ⋅ρu+M30M_3 = c_s^2 \Delta \cdot \rho \bold{u} + M_{30} 表达式有误 —— 拉普拉斯算子 Δ\Delta 没法点乘在一个矢量 ρu\rho \boldsymbol{u} 上.
  2. 这里的 uI\bold{u} \bold{I} 展开后应该是 uαδβγ+uβδαγ+uγδαβu_{\alpha} \delta_{\beta\gamma} + u_{\beta} \delta_{\alpha\gamma} + u_{\gamma} \delta_{\alpha\beta}.
  3. p=cs2ρp = c_s^2 \rho.

最近在网上刷到了这篇 arxiv 预印本,

Zhou J G. Single MRT-featured Lattice Boltzmann Method (SmrtLBM)[PP/OL]. arXiv(2024-09-02). http://arxiv.org/abs/2409.01076.

加上休息时间有空,就简单看了这篇文章并做了笔记。

基本原理

这篇文章以 D2Q9 离散速度模型为例,对其多松弛形式进行了简化。

多松弛模型 (MRT) 的简单介绍

定义:

  • f=[f0(x,t),...,f8(x,t)]T\boldsymbol{f} = [f_0(\boldsymbol{x}, t), ..., f_8(\boldsymbol{x}, t)]^\mathrm{T} 分布函数向量;
  • f(pc)=[f0(pc)(x,t),...,f8(pc)(x,t)]T\boldsymbol{f}^{(\mathrm{pc})} = [f_0^{(\mathrm{pc})}(\boldsymbol{x}, t), ..., f_8^{(\mathrm{pc})}(\boldsymbol{x}, t)]^\mathrm{T} 碰撞后的分布函数向量;
  • f(eq)=[f0(eq)(x,t),...,f8(eq)(x,t)]T\boldsymbol{f}^{(\mathrm{eq})} = [f_0^{(\mathrm{eq})}(\boldsymbol{x}, t), ..., f_8^{(\mathrm{eq})}(\boldsymbol{x}, t)]^\mathrm{T} 平衡态分布函数向量。

这里的平衡态用的仍旧是 LBGK 模型的形式

fi(eq)=wiρ[1+ci⋅ucs2+(ci⋅u)22cs4−u22cs2]f^{(\mathrm{eq})}_i = w_i \rho \left[ 1 + \frac{\boldsymbol{c}_i \cdot \boldsymbol{u}}{c_s^2} + \frac{(\boldsymbol{c}_i \cdot \boldsymbol{u})^2}{2 c_s^4} - \frac{u^2}{2 c_s^2} \right]

其中 ci\boldsymbol{c}_i 为离散速度方向, wiw_i 为 ci\boldsymbol{c}_i 方向的权重系数, csc_s 为格子声速。 ρ\rho 和 u\boldsymbol{u} 分别为流场密度和速度。

在 D2Q9 模型中,cs=1/3c_s=1/\sqrt{3},

ci={(0,0)i=0(±1,0),(0,±1)ci=1−4(±1,±1)ci=5−8\boldsymbol{c}_{i} = \begin{cases} (0,0) & i=0 \\ (\pm 1, 0), (0, \pm 1) c & i=1-4 \\ (\pm 1, \pm 1) c & i=5-8 \end{cases}

权重系数 w0=4/9w_0 = 4/9 , w1−4=1/9w_{1-4} = 1/9 , w5−8=1/36w_{5-8} = 1/36 .

MRT 方程的碰撞步在D2Q9模型下的矩阵形式为:

f(pc)=[M−1][S][M](f−f(eq))(1)\boldsymbol{f}^{(\mathrm{pc})} = [\bold{M}^{-1}][\bold{S}][\bold{M}] (\boldsymbol{f} - \boldsymbol{f}^{(\mathrm{eq})}) \tag{1}

松弛步则写作:

fi(x+ciδt,t+δt)=fi(pc)(x,t+δt)(2)f_i (\boldsymbol{x}+\boldsymbol{c}_i \delta_t, t + \delta_t) = f_i^{(\mathrm{pc})} (\boldsymbol{x}, t + \delta_t) \tag{2}

其中 δt\delta_t 为时间步长, [S][\bold{S}] 为松弛系数的对角矩阵。变换矩阵 [M][\bold{M}] 为:

[M]=[111111111−4−1−1−1−122224−2−2−2−21111010−101−1−110−20201−1−110010−111−1−100−20211−1−101−11−10000000001−11−1][\bold{M}] = \begin{bmatrix} 1&1&1&1&1&1&1&1&1\\ -4&-1&-1&-1&-1&2&2&2&2\\ 4&-2&-2&-2&-2&1&1&1&1\\ 0&1&0&-1&0&1&-1&-1&1\\ 0&-2&0&2&0&1&-1&-1&1\\ 0&0&1&0&-1&1&1&-1&-1\\ 0&0&-2&0&2&1&1&-1&-1\\ 0&1&-1&1&-1&0&0&0&0\\ 0&0&0&0&0&1&-1&1&-1 \end{bmatrix}

流场密度 ρ\rho 和速度 u\boldsymbol{u} 分别为

ρ=∑ifi,ρu=∑icifi\rho = \sum_i f_i , \quad \rho\boldsymbol{u} = \sum_i \boldsymbol{c}_i f_i

郭照立等[1]记松弛时间的对角矩阵为:

[S]=diag(0,se,sε,0,sq,0,sq,sν,sν)[\bold{S}] = \text{diag}(0, s_e, s_{\varepsilon}, 0, s_q, 0, s_q, s_{\nu}, s_{\nu})

则运动粘度 ν=cs2(1sν−12)δt\nu = c_s^2 (\frac{1}{s_{\nu}} - \frac{1}{2}) \delta_t ,以及体黏性系数 ζ=cs2(1se−12)δt\zeta = c_s^2 (\frac{1}{s_e} - \frac{1}{2}) \delta_t 。

Zhou 的简化

Zhou[2]将矩阵 [S][\bold{S}] 改写成

[S]=[S0]+[St]=diag(1/τs,1/τs,1/τs,1/τs,1/τs,1/τs,1/τs,1/τ,1/τ),(3)\begin{aligned} [\bold{S}] &= [\bold{S}_0] + [\bold{S}_t] \\ &= \text{diag}( 1/\tau_s, 1/\tau_s, 1/\tau_s, 1/\tau_s, 1/\tau_s, 1/\tau_s, 1/\tau_s, 1/\tau, 1/\tau ), \end{aligned} \tag{3}

其中:

[S0]=(1τ−1τs)diag(0,0,0,0,0,0,0,1,1),[St]=1τs diag(1,1,1,1,1,1,1,1,1).\begin{aligned} [\bold{S}_0] &= \left( \frac{1}{\tau} - \frac{1}{\tau_s} \right) \text{diag}(0, 0, 0, 0, 0, 0, 0, 1, 1), \\ [\bold{S}_t] &= \frac{1}{\tau_s} \, \text{diag}(1, 1, 1, 1, 1, 1, 1, 1, 1). \end{aligned}

可见在这种构造形式下,τ=1/sν\tau= 1 / s_{\nu},与LBGK模型一致。

为了实现化简,Zhou[2]令 τs=1\tau_s=1,并把式(3)代入式(1)中展开,整理得:

fi(pc)(x,t)=fi(eq)(x,t)+(−1)i(1−1τ)×∑k=18(−1)k4[1[1,2,3,4](i,k)+1[5,6,7,8](i,k)][fk(x,t)−fk(eq)(x,t)](4)\begin{aligned} f_i^{(\mathrm{pc})}(\boldsymbol{x},t) &= f_{i}^{(\mathrm{eq})}(\boldsymbol{x},t) + (-1)^i \left( 1 - \frac{1}{\tau} \right) \times \\ & \sum_{k=1}^{8} \frac{(-1)^k}{4} \left[ \boldsymbol{1}_{[1,2,3,4]}(i,k) + \boldsymbol{1}_{[5,6,7,8]}(i,k) \right] \left[ f_{k}(\boldsymbol{x},t) - f_{k}^{(\mathrm{eq})}(\boldsymbol{x},t) \right] \end{aligned} \tag{4}

式(4)中的函数 1[a,b,c,d](i,k)\boldsymbol{1}_{[a,b,c,d]}(i,k) 定义为

1[a,b,c,d](i,k)={1,if i in [a,b,c,d], and k in [a,b,c,d]0,otherwise\boldsymbol{1}_{[a,b,c,d]}(i,k) = \begin{cases} 1, & \text{if i in [a,b,c,d], and k in [a,b,c,d]}\\ 0, & \text{otherwise} \end{cases}

实例代码

这里顺手做了个双周期剪切流的简单算例(拿上次双松弛LBM的代码改的),设置如下。

  • 计算域: [0,L]×[0,L][0,L] \times [0,L],其中 L=2πL=2\pi。
  • 雷诺数: Re=1/ν=1000Re = 1 / \nu = 1000。 其中 ν\nu 为流体运动粘度 (Physical)。
  • 初始速度场

{ux=U0tanh⁡(σ (14−∣yL−12∣))uy=U0δsin⁡(2π (xL+12))\begin{cases} u_x =& U_0 \tanh (\sigma\, (\frac{1}{4} - |\frac{y}{L} - \frac{1}{2}| )) \\ u_y =& U_0 \delta \sin (2 \pi \, (\frac{x}{L} + \frac{1}{2}) ) \end{cases}

  • 压强场 pp : 用伪谱法求解压力泊松方程。
  • LBM松弛时间 τ\tau: 0.515
  • 网格大小: δx=L/N\delta_x = L/N (N=200N=200)。
  • 时间步 δt\delta_t : 用 LBM 中 τ\tau 的关系反推。
  • 初始速度场参数: U0=1U_0 = 1, σ=30\sigma=30, δ=0.05\delta=0.05

代码我放在了Github Gist上,计算结果如下图所示

Reference

[1] 郭照立,郑楚光. 格子Boltzmann方法的原理及应用[M]. 科学出版社,2009.

[2] Zhou J G. Single MRT-featured Lattice Boltzmann Method (SmrtLBM)[PP/OL]. arXiv(2024-09-02). http://arxiv.org/abs/2409.01076.

0%