最近在网上刷到了这篇 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 = [ f 0 ( x , t ) , . . . , f 8 ( x , t ) ] T \boldsymbol{f} = [f_0(\boldsymbol{x}, t), ..., f_8(\boldsymbol{x}, t)]^\mathrm{T} f = [ f 0 ( x , t ) , . . . , f 8 ( x , t ) ] T 分布函数向量;
f ( p c ) = [ f 0 ( p c ) ( x , t ) , . . . , f 8 ( p c ) ( x , t ) ] T \boldsymbol{f}^{(\mathrm{pc})} = [f_0^{(\mathrm{pc})}(\boldsymbol{x}, t), ..., f_8^{(\mathrm{pc})}(\boldsymbol{x}, t)]^\mathrm{T} f ( p c ) = [ f 0 ( p c ) ( x , t ) , . . . , f 8 ( p c ) ( x , t ) ] T 碰撞后的分布函数向量;
f ( e q ) = [ f 0 ( e q ) ( x , t ) , . . . , f 8 ( e q ) ( x , t ) ] T \boldsymbol{f}^{(\mathrm{eq})} = [f_0^{(\mathrm{eq})}(\boldsymbol{x}, t), ..., f_8^{(\mathrm{eq})}(\boldsymbol{x}, t)]^\mathrm{T} f ( e q ) = [ f 0 ( e q ) ( x , t ) , . . . , f 8 ( e q ) ( x , t ) ] T 平衡态分布函数向量。
这里的平衡态用的仍旧是 LBGK 模型的形式
f i ( e q ) = w i ρ [ 1 + c i ⋅ u c s 2 + ( c i ⋅ u ) 2 2 c s 4 − u 2 2 c s 2 ] 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]
f i ( e q ) = w i ρ [ 1 + c s 2 c i ⋅ u + 2 c s 4 ( c i ⋅ u ) 2 − 2 c s 2 u 2 ]
其中 c i \boldsymbol{c}_i c i 为离散速度方向, w i w_i w i 为 c i \boldsymbol{c}_i c i 方向的权重系数, c s c_s c s 为格子声速。 ρ \rho ρ 和 u \boldsymbol{u} u 分别为流场密度和速度。
在 D2Q9 模型中,c s = 1 / 3 c_s=1/\sqrt{3} c s = 1 / 3 ,
c i = { ( 0 , 0 ) i = 0 ( ± 1 , 0 ) , ( 0 , ± 1 ) c i = 1 − 4 ( ± 1 , ± 1 ) c i = 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}
c i = ⎩ ⎪ ⎪ ⎨ ⎪ ⎪ ⎧ ( 0 , 0 ) ( ± 1 , 0 ) , ( 0 , ± 1 ) c ( ± 1 , ± 1 ) c i = 0 i = 1 − 4 i = 5 − 8
权重系数 w 0 = 4 / 9 w_0 = 4/9 w 0 = 4 / 9 , w 1 − 4 = 1 / 9 w_{1-4} = 1/9 w 1 − 4 = 1 / 9 , w 5 − 8 = 1 / 36 w_{5-8} = 1/36 w 5 − 8 = 1 / 3 6 .
MRT 方程的碰撞步在D2Q9模型下的矩阵形式为:
f ( p c ) = [ M − 1 ] [ S ] [ M ] ( f − f ( e q ) ) (1) \boldsymbol{f}^{(\mathrm{pc})} = [\bold{M}^{-1}][\bold{S}][\bold{M}] (\boldsymbol{f} - \boldsymbol{f}^{(\mathrm{eq})})
\tag{1}
f ( p c ) = [ M − 1 ] [ S ] [ M ] ( f − f ( e q ) ) ( 1 )
松弛步则写作:
f i ( x + c i δ t , t + δ t ) = f i ( p c ) ( 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}
f i ( x + c i δ t , t + δ t ) = f i ( p c ) ( x , t + δ t ) ( 2 )
其中 δ t \delta_t δ t 为时间步长, [ S ] [\bold{S}] [ S ] 为松弛系数的对角矩阵。变换矩阵 [ M ] [\bold{M}] [ M ] 为:
[ M ] = [ 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 ] [\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}
[ M ] = ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎡ 1 − 4 4 0 0 0 0 0 0 1 − 1 − 2 1 − 2 0 0 1 0 1 − 1 − 2 0 0 1 − 2 − 1 0 1 − 1 − 2 − 1 2 0 0 1 0 1 − 1 − 2 0 0 − 1 2 − 1 0 1 2 1 1 1 1 1 0 1 1 2 1 − 1 − 1 1 1 0 − 1 1 2 1 − 1 − 1 − 1 − 1 0 1 1 2 1 1 1 − 1 − 1 0 − 1 ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎤
流场密度 ρ \rho ρ 和速度 u \boldsymbol{u} u 分别为
ρ = ∑ i f i , ρ u = ∑ i c i f i \rho = \sum_i f_i , \quad \rho\boldsymbol{u} = \sum_i \boldsymbol{c}_i f_i
ρ = i ∑ f i , ρ u = i ∑ c i f i
郭照立等[1]记松弛时间的对角矩阵为:
[ S ] = diag ( 0 , s e , s ε , 0 , s q , 0 , s q , s ν , s ν ) [\bold{S}] = \text{diag}(0, s_e, s_{\varepsilon}, 0, s_q, 0, s_q, s_{\nu}, s_{\nu})
[ S ] = diag ( 0 , s e , s ε , 0 , s q , 0 , s q , s ν , s ν )
则运动粘度 ν = c s 2 ( 1 s ν − 1 2 ) δ t \nu = c_s^2 (\frac{1}{s_{\nu}} - \frac{1}{2}) \delta_t ν = c s 2 ( s ν 1 − 2 1 ) δ t ,以及体黏性系数 ζ = c s 2 ( 1 s e − 1 2 ) δ t \zeta = c_s^2 (\frac{1}{s_e} - \frac{1}{2}) \delta_t ζ = c s 2 ( s e 1 − 2 1 ) δ t 。
Zhou 的简化
Zhou[2]将矩阵 [ S ] [\bold{S}] [ S ] 改写成
[ S ] = [ S 0 ] + [ S t ] = 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}
[ S ] = [ S 0 ] + [ S t ] = diag ( 1 / τ s , 1 / τ s , 1 / τ s , 1 / τ s , 1 / τ s , 1 / τ s , 1 / τ s , 1 / τ , 1 / τ ) , ( 3 )
其中:
[ S 0 ] = ( 1 τ − 1 τ s ) diag ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 ) , [ S t ] = 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}
[ S 0 ] [ S t ] = ( τ 1 − τ s 1 ) diag ( 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 ) , = τ s 1 diag ( 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ) .
可见在这种构造形式下,τ = 1 / s ν \tau= 1 / s_{\nu} τ = 1 / s ν ,与LBGK模型一致。
为了实现化简,Zhou[2]令 τ s = 1 \tau_s=1 τ s = 1 ,并把式(3)代入式(1)中展开,整理得:
f i ( p c ) ( x , t ) = f i ( e q ) ( x , t ) + ( − 1 ) i ( 1 − 1 τ ) × ∑ k = 1 8 ( − 1 ) k 4 [ 1 [ 1 , 2 , 3 , 4 ] ( i , k ) + 1 [ 5 , 6 , 7 , 8 ] ( i , k ) ] [ f k ( x , t ) − f k ( e q ) ( 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}
f i ( p c ) ( x , t ) = f i ( e q ) ( x , t ) + ( − 1 ) i ( 1 − τ 1 ) × k = 1 ∑ 8 4 ( − 1 ) k [ 1 [ 1 , 2 , 3 , 4 ] ( i , k ) + 1 [ 5 , 6 , 7 , 8 ] ( i , k ) ] [ f k ( x , t ) − f k ( e q ) ( x , t ) ] ( 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 [ 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}
1 [ a , b , c , d ] ( i , k ) = { 1 , 0 , if i in [a,b,c,d], and k in [a,b,c,d] otherwise
实例代码
这里顺手做了个双周期剪切流的简单算例(拿上次双松弛LBM的代码改的),设置如下。
计算域: [ 0 , L ] × [ 0 , L ] [0,L] \times [0,L] [ 0 , L ] × [ 0 , L ] ,其中 L = 2 π L=2\pi L = 2 π 。
雷诺数: R e = 1 / ν = 1000 Re = 1 / \nu = 1000 R e = 1 / ν = 1 0 0 0 。 其中 ν \nu ν 为流体运动粘度 (Physical)。
初始速度场
{ u x = U 0 tanh ( σ ( 1 4 − ∣ y L − 1 2 ∣ ) ) u y = U 0 δ sin ( 2 π ( x L + 1 2 ) ) \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}
{ u x = u y = U 0 tanh ( σ ( 4 1 − ∣ L y − 2 1 ∣ ) ) U 0 δ sin ( 2 π ( L x + 2 1 ) )
压强场 p p p : 用伪谱法求解压力泊松方程。
LBM松弛时间 τ \tau τ : 0.515
网格大小: δ x = L / N \delta_x = L/N δ x = L / N (N = 200 N=200 N = 2 0 0 )。
时间步 δ t \delta_t δ t : 用 LBM 中 τ \tau τ 的关系反推。
初始速度场参数: U 0 = 1 U_0 = 1 U 0 = 1 , σ = 30 \sigma=30 σ = 3 0 , δ = 0.05 \delta=0.05 δ = 0 . 0 5
代码我放在了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 .