有限体积法(5)——对流-扩散方程的离散

方程离散

关于变量 ϕ \phi ϕ的输运方程,
∂ ( ρ ϕ ) ∂ t + ∇ ⋅ ( ρ ϕ u ) = ∇ ⋅ ( Γ ∇ ϕ ) + S ϕ (1) \frac{\partial (\rho \phi)}{\partial t}+ \nabla \cdot (\rho \phi \bold u) = \nabla \cdot (\Gamma \nabla \phi) + S_\phi \tag{1} t(ρϕ)+(ρϕu)=(Γϕ)+Sϕ(1)

省略时间项就是稳态的对流扩散方程,
∇ ⋅ ( ρ ϕ u ) = ∇ ⋅ ( Γ ∇ ϕ ) + S ϕ (2) \nabla \cdot (\rho \phi \bold u) = \nabla \cdot (\Gamma \nabla \phi) + S_\phi \tag{2} (ρϕu)=(Γϕ)+Sϕ(2)

在控制体上积分,并根据奥-高公式,有
∫ C V ∇ ⋅ ( ρ ϕ u ) d V = ∫ C V ∇ ⋅ ( Γ ∇ ϕ ) d V + ∫ C V S ϕ d V ⇒ ∫ A n ⋅ ( ρ ϕ u ) d A = ∫ A n ⋅ ( Γ ∇ ϕ ) d A + ∫ C V S ϕ d V (3) \begin{aligned} \int_{CV} \nabla \cdot (\rho \phi \bold u) dV&= \int_{CV} \nabla \cdot (\Gamma \nabla \phi) dV + \int_{CV} S_\phi dV \\ \\ \Rightarrow \int_{A} \bold n \cdot (\rho \phi \bold u) dA &= \int_{A} \bold n \cdot (\Gamma \nabla \phi) dA + \int_{CV} S_\phi dV \tag{3} \end{aligned} CV(ρϕu)dVAn(ρϕu)dA=CV(Γϕ)dV+CVSϕdV=An(Γϕ)dA+CVSϕdV(3)
考虑一维稳态无源的情况,则对流扩散方程为
d d x ( ρ u ϕ ) = d d x ( Γ d ϕ d x ) (4) \frac{d}{dx} (\rho u \phi) = \frac{d}{dx} (\Gamma \frac{d \phi}{dx}) \tag{4} dxd(ρuϕ)=dxd(Γdxdϕ)(4)

流动同时也满足连续性方程
d d x ( ρ u ϕ ) = 0 (5) \frac{d}{dx} (\rho u \phi) = 0 \tag{5} dxd(ρuϕ)=0(5)
对流扩散方程在一维空间上的离散与扩散方程类似,公式 ( 1 ) (1) (1) ( 4 ) (4) (4)的对流项和扩散项都有散度,扩散项还有梯度,那么其离散也是包括散度离散和梯度离散。一维空间的网格如下,假设网格是均匀网格,网格间距的表示如图,速度 u u u的方向是从左往右的
有限体积法(5)——对流-扩散方程的离散_第1张图片
散度的离散即把 ρ ϕ u \rho \phi \bold u ρϕu的散度在控制体单元内的体积分转换为 ρ ϕ u \rho \phi \bold u ρϕu在边界上的面积分,
( ρ u A ϕ ) e − ( ρ u A ϕ ) w = ( Γ A d ϕ d x ) e − ( Γ A d ϕ d x ) w (6) (\rho u A \phi)_e-(\rho u A \phi)_w=\left( \Gamma A \frac{d \phi}{dx} \right)_e - \left( \Gamma A \frac{d \phi}{dx} \right)_w \tag{6} (ρuAϕ)e(ρuAϕ)w=(ΓAdxdϕ)e(ΓAdxdϕ)w(6)

扩散项中梯度的离散用中心差分格式,则对流扩散方程离散为
( ρ u A ϕ ) e − ( ρ u A ϕ ) w = ( Γ A ) e ϕ E − ϕ P δ x P E − ( Γ A ) w ϕ P − ϕ W δ x W P (\rho u A \phi)_e-(\rho u A \phi)_w=(\Gamma A)_e \frac{\phi_E-\phi_P}{\delta x_{PE}} - (\Gamma A)_w \frac{\phi_P-\phi_W}{\delta x_{WP}} (ρuAϕ)e(ρuAϕ)w=(ΓA)eδxPEϕEϕP(ΓA)wδxWPϕPϕW
为了表示简单,定义,
F = ρ u , D = Γ δ x (7) F=\rho u, D=\frac{\Gamma}{\delta x} \tag{7} F=ρu,D=δxΓ(7)
则各边界上,
F w = ( ρ u ) w F e = ( ρ u ) e D w = Γ w δ x W P D e = Γ e δ x P E (8) \begin{aligned} F_w=(\rho u)_w \qquad F_e=(\rho u)_e \\ \\ D_w=\frac{\Gamma_w}{\delta x_{WP}} \qquad D_e=\frac{\Gamma_e}{\delta x_{PE}} \tag{8} \end{aligned} Fw=(ρu)wFe=(ρu)eDw=δxWPΓwDe=δxPEΓe(8)
假设各边界面的面积相等,即 A w = A e = A A_w=A_e=A Aw=Ae=A,则离散方程为
F e ϕ e − F w ϕ w = D e ( ϕ E − ϕ P ) − D w ( ϕ P − ϕ W ) (9) F_e \phi_e - F_w \phi_w = D_e(\phi_E-\phi_P) - D_w(\phi_P-\phi_W) \tag{9} FeϕeFwϕw=De(ϕEϕP)Dw(ϕPϕW)(9)
同样连续性方程也可以离散为
( ϕ u A ) e − ( ϕ u A ) w = 0 ⇒ F e − F w = 0 (10) \begin{aligned} &(\phi u A)_e - (\phi u A)_w=0 \\ \\ \Rightarrow \quad &F_e -F_w = 0 \tag{10} \end{aligned} (ϕuA)e(ϕuA)w=0FeFw=0(10)

由于在数值计算中,变量的值一般是保存在节点上而不是界面上,即 ϕ W \phi_W ϕW ϕ P \phi_P ϕP ϕ E \phi_E ϕE是已知的,而边界值 ϕ e \phi_e ϕe ϕ w \phi_w ϕw是未知的,所以方程式 ( 9 ) (9) 9还不是完整的离散方程。既然扩散项中梯度离散用了中心差分格式,那对流项的边界值也不妨试试中心差分格式,在这里也就是线性插值。各边界值可以用两边的节点值来表示,
ϕ e = ϕ P + ϕ E 2 ϕ w = ϕ W + ϕ P 2 } (11) \left. \begin{aligned} \phi_e = \frac{\phi_P+\phi_E}{2} \\\\ \phi_w = \frac{\phi_W+\phi_P}{2} \end{aligned} \quad \right \} \tag{11} ϕe=2ϕP+ϕEϕw=2ϕW+ϕP(11)

将式 ( 11 ) (11) (11)代入到式 ( 9 ) (9) (9)中,有
F e 2 ( ϕ P + ϕ E ) − F w 2 ( ϕ W + ϕ P ) = D e ( ϕ E − ϕ P ) − D w ( ϕ P − ϕ W ) (12) \frac{F_e}{2} (\phi_P + \phi_E) - \frac{F_w}{2} (\phi_W + \phi_P) = D_e(\phi_E-\phi_P) - D_w(\phi_P-\phi_W) \tag{12} 2Fe(ϕP+ϕE)2Fw(ϕW+ϕP)=De(ϕEϕP)Dw(ϕPϕW)(12)
整理之,得
[ ( D w − F w 2 ) + ( D e + F e 2 ) ] ϕ P = ( D w + F w 2 ) ϕ W + ( D e − F e 2 ) ϕ E ⇒ [ ( D w + F w 2 ) + ( D e − F e 2 ) + ( F e − F w ) ] ϕ P = ( D w + F w 2 ) ϕ W + ( D e − F e 2 ) ϕ E (13) \begin{aligned} &\left [ \left( D_w-\frac{F_w}{2} \right) +\left( D_e + \frac{F_e}{2} \right) \right ] \phi_P = \left( D_w+\frac{F_w}{2} \right) \phi_W + \left( D_e-\frac{F_e}{2} \right) \phi_E \\ \\ \Rightarrow &\left [ \left( D_w+\frac{F_w}{2} \right) +\left( D_e - \frac{F_e}{2} \right) + (F_e - F_w) \right ] \phi_P = \\ \\ &\qquad \qquad \qquad \qquad \qquad \qquad \qquad \left( D_w+\frac{F_w}{2} \right) \phi_W + \left( D_e-\frac{F_e}{2} \right) \phi_E \end{aligned} \tag{13} [(Dw2Fw)+(De+2Fe)]ϕP=(Dw+2Fw)ϕW+(De2Fe)ϕE[(Dw+2Fw)+(De2Fe)+(FeFw)]ϕP=(Dw+2Fw)ϕW+(De2Fe)ϕE(13)
为了简化离散过程,这里假设边界值 F e F_e Fe F w F_w Fw D e D_e De D w D_w Dw是已知的。然后也写成扩散方程的那种形式,
a P ϕ P = a W ϕ W + a E ϕ E (14) a_P \phi_P = a_W \phi_W + a_E \phi_E \tag{14} aPϕP=aWϕW+aEϕE(14)
其中系数为,
a W = D w + F w 2 a E = D E − F e 2 a P = a W + a E + ( F e − F w ) } (15) \left. \begin{aligned} a_W = D_w + \frac{F_w}{2} \\ \\ a_E = D_E - \frac{F_e}{2} \\ \\ a_P =a_W + a_E + (F_e -F_w ) \end{aligned} \quad \right\} \tag{15} aW=Dw+2FwaE=DE2FeaP=aW+aE+(FeFw)(15)
式中的 F e − F w F_e-F_w FeFw有时候也写为 Δ F \Delta F ΔF

算例

工况 1

考虑简单的稳态一维对流扩散问题,如下图,输运量为 ϕ \phi ϕ,控制方程为式 ( 4 ) (4) (4)
边界条件为: ϕ 0 = 1 \phi_0 = 1 ϕ0=1 ϕ L = 0 \phi_L=0 ϕL=0
速度为 u = 0.1 m / s u=0.1 m/s u=0.1m/s
空间距离 L = 1.0 m L=1.0 m L=1.0m,密度 ρ = 1 k g / m 3 \rho=1 kg/m^3 ρ=1kg/m3,扩散系数 Γ = 0.1 k g / m . s \Gamma=0.1 kg/m.s Γ=0.1kg/m.s
计算输运量 ϕ \phi ϕ在流向上的分布。
在这里插入图片描述
该问题的解析解为,
ϕ − ϕ 0 ϕ L − ϕ 0 = exp ⁡ ( ρ u x / Γ ) − 1 exp ⁡ ( ρ u L / Γ ) − 1 (16) \frac{\phi-\phi_0}{\phi_L-\phi_0}=\frac{\exp(\rho u x/\Gamma)-1}{\exp(\rho uL/\Gamma)-1} \tag{16} ϕLϕ0ϕϕ0=exp(ρuL/Γ)1exp(ρux/Γ)1(16)
将计算域划分为5个均匀的网格单元,即 δ x = 0.2 m \delta x = 0.2 m δx=0.2m
在这里插入图片描述
根据前述定义, F = ρ u F=\rho u F=ρu D = Γ / δ x D=\Gamma / \delta x D=Γ/δx,则在计算域中各处有
F e = F w = F F_e = F_w=F Fe=Fw=F D e = D w = D D_e=D_w=D De=Dw=D
边界 x = 0 x=0 x=0 x = L x=L x=L分别用A和B表示,则 ϕ A = ϕ 0 = 1 , ϕ B = ϕ L = 0 \phi_A=\phi_0=1, \phi_B=\phi_L=0 ϕA=ϕ0=1,ϕB=ϕL=0
对于计算域内部的节点2,3,4来说,其离散方程就是方程式 ( 14 ) (14) (14) ( 15 ) (15) (15)。这里主要分析包含边界的节点1和节点5的方程离散。

节点1的左边界就是边界A,而运输量 ϕ A = 1 \phi_A =1 ϕA=1是已知的边界条件,则在对流项中左边界的通量 F w ϕ w = F A ϕ A F_w \phi_w=F_A \phi_A Fwϕw=FAϕA也是已知量。扩散项的梯度离散用单边差分格式,则离散方程为
F e 2 ( ϕ P + ϕ E ) − F A ϕ A = D e ( ϕ P − ϕ W ) − D A ( ϕ P − ϕ A ) (17) \frac{F_e}{2}(\phi_P + \phi_E) - F_A\phi_A=D_e(\phi_P - \phi_W) - D_A(\phi_P-\phi_A) \tag{17} 2Fe(ϕP+ϕE)FAϕA=De(ϕPϕW)DA(ϕPϕA)(17)
节点5与之类似,其离散方程为,
F B ϕ B − F w 2 ( ϕ P + ϕ W ) = D B ( ϕ B − ϕ P ) − D w ( ϕ P − ϕ W ) (18) F_B \phi_B - \frac{F_w}{2}(\phi_P+\phi_W)=D_B(\phi_B-\phi_P) -D_w (\phi_P -\phi_W) \tag{18} FBϕB2Fw(ϕP+ϕW)=DB(ϕBϕP)Dw(ϕPϕW)(18)

式中, D A = D B = 2 Γ / δ x = 2 D D_A=D_B=2\Gamma/\delta x=2D DA=DB=2Γ/δx=2D F A = F B = F F_A=F_B=F FA=FB=F
把边界条件作为源项,并将离散方程整理为
a P ϕ P = a W ϕ W + a E ϕ E + S u (19) a_P\phi_P=a_W \phi_W + a_E \phi_E + S_u \tag{19} aPϕP=aWϕW+aEϕE+Su(19)
系数,
a P = a W + a E + ( F e − F w ) − S P (20) a_P = a_W + a_E + (F_e -F_w) -S_P \tag{20} aP=aW+aE+(FeFw)SP(20)

表1 各节点系数计算公式
节点 a W a_W aW a E a_E aE S P S_P SP S u S_u Su
1 0 D − F / 2 D-F/2 DF/2 − ( 2 D + F ) -(2D+F) (2D+F) ( 2 D + F ) ϕ A (2D+F)\phi_A (2D+F)ϕA
2,3,4 D + F / 2 D+F/2 D+F/2 D − F / 2 D-F/2 DF/2 0 0
5 D + F / 2 D+F/2 D+F/2 0 − ( 2 D − F ) -(2D-F) (2DF) ( 2 D − F ) ϕ B (2D-F)\phi_B (2DF)ϕB

代入数值,则各节点的系数,

表2 工况1各节点系数值
节点 a W a_W aW a E a_E aE S u S_u Su S P S_P SP a P = a W + a E − S P a_P=a_W+a_E-S_P aP=aW+aESP
1 0 0.45 1.1 ϕ A \phi_A ϕA -1.1 1.55
2 0.55 0.45 0 0 1.0
3 0.55 0.45 0 0 1.0
4 0.55 0.45 0 0 1.0
5 0.55 0 0.9 ϕ B \phi_B ϕB -0.9 1.45

然后求解该线性方程组即可。数值解和解析解的对比如下图,可见数值解和解析解吻合良好。
有限体积法(5)——对流-扩散方程的离散_第2张图片

工况 2

更改速度值为 u = 2.5 m / s u=2.5 m/s u=2.5m/s,则 F = ρ u = 2.5 , D = Γ / δ x = 0.1 / 0.2 = 0.5 F=\rho u =2.5, D=\Gamma/\delta x=0.1/0.2=0.5 F=ρu=2.5,D=Γ/δx=0.1/0.2=0.5。保持网格数和其他参数不变,则各节点的系数变为

表3 工况2各节点系数值
节点 a W a_W aW a E a_E aE S u S_u Su S P S_P SP a P = a W + a E − S P a_P=a_W+a_E-S_P aP=aW+aESP
1 0 -0.75 3.5 ϕ A \phi_A ϕA -3.5 2.75
2 1.75 -0.75 0 0 1.0
3 1.75 -0.75 0 0 1.0
4 1.75 -0.75 0 0 1.0
5 1.75 0 -1.5 ϕ B \phi_B ϕB 1.5 0.25

数值解和解析解的对比如下图,可见数值解在解析解周围出现振荡(wiggles),这样的数值解是很糟糕的,该计算精度是无法接受的。因此必须采取措施提高数值解的计算精度,最直接的办法就是加密网格。
有限体积法(5)——对流-扩散方程的离散_第3张图片

工况 3

速度值 u = 2.5 m / s u=2.5m/s u=2.5m/s,计算域划分为20个网格单元,则 δ x = 0.05 , F = 2.5 , D = Γ / δ x = 0.1 / 0.05 = 2.0 \delta x=0.05, F=2.5, D=\Gamma/\delta x=0.1/0.05=2.0 δx=0.05,F=2.5,D=Γ/δx=0.1/0.05=2.0。其他系数不变,则各节点的系数值为

表4 工况3各节点系数值
节点 a W a_W aW a E a_E aE S u S_u Su S P S_P SP a P = a W + a E − S P a_P=a_W+a_E-S_P aP=aW+aESP
1 0 0.75 6.5 ϕ A \phi_A ϕA -6.5 7.25
2-19 3.25 0.75 0 0 4.00
10 3.25 0 1.5 ϕ B \phi_B ϕB -1.5 4.75

数值解和解析解的对比如下图,可见加密网格后数值解和解析解吻合的就好多了。
有限体积法(5)——对流-扩散方程的离散_第4张图片

总结

在推导扩散问题和对流扩散问题的有限体积法离散方程时,控制体网格界面处的变量值均采用近似计算公式。如扩散方程需要计算界面上的梯度 ( ∂ ϕ ∂ x ) w \left( \frac{\partial \phi}{\partial x}\right)_w (xϕ)w ( ∂ ϕ ∂ x ) e \left( \frac{\partial \phi}{\partial x}\right)_e (xϕ)e对流项需要计算界面上的输运量 ϕ e \phi_e ϕe ϕ w \phi_w ϕw。离散扩散项时采用的近似计算公式为
( ∂ ϕ ∂ x ) e ≈ ( Δ ϕ Δ x ) e = ϕ E − ϕ P δ x P E ( ∂ ϕ ∂ x ) w ≈ ( Δ ϕ Δ x ) w = ϕ P − ϕ W δ x W P } (21) \left. \begin{aligned} \left( \frac{\partial \phi}{\partial x} \right)_e \approx \left( \frac{\Delta \phi}{\Delta x} \right)_e = \frac{\phi_E - \phi_P}{\delta x_{PE}} \\ \\ \left( \frac{\partial \phi}{\partial x} \right)_w \approx \left( \frac{\Delta \phi}{\Delta x} \right)_w = \frac{\phi_P - \phi_W}{\delta x_{WP}} \end{aligned} \right \} \tag{21} (xϕ)e(ΔxΔϕ)e=δxPEϕEϕP(xϕ)w(ΔxΔϕ)w=δxWPϕPϕW(21)

对流项离散时采用的近似计算公式为
ϕ e ≈ ϕ E − ϕ P 2 ϕ w ≈ ϕ P − ϕ W 2 } (22) \left. \begin{aligned} \phi_e \approx \frac{\phi_E-\phi_P}{2} \\ \\ \phi_w \approx \frac{\phi_P-\phi_W}{2} \end{aligned}\right \} \tag{22} ϕe2ϕEϕPϕw2ϕPϕW(22)

其他参数如 Γ \Gamma Γ ρ \rho ρ在界面上的值也是类似计算的。这是由于场变量一般保存在节点位置,我们无法给出界面处的准确值,从而就利用相邻节点的值来近似表示。

从差分法的观点,上述用到的近似计算公式是一种中心差分格式,就是利用两侧节点的值来作线性近似表示。公式 ( 21 ) (21) (21)可以看作是过界面两侧的节点作一直线,即代表参数 ϕ \phi ϕ的线性函数,然后用该直线的导数来表示界面处的导数,而公式 ( 22 ) (22) (22)可以看作是用该线性函数的中点函数值来表示界面上的参数值。

在扩散方程的推导和算例计算过程中,采用中心差分格式来表示界面上的参数值并没导致数值解和解析解之间很大的差异,即使才采用很粗糙的网格时也没有。然而,在包含对流项的对流扩散离散方程的计算中,这种中心差分格式使得数值解在某些情况下与解析解相差很大,像工况2中出现了数值解的强烈振荡。像上面的算例,虽然在加密网格后工况2中的振荡现象消失了,数值解和解析解也吻合很好了。但在实际应用中,网格是不能无限加密的,或者说网格的加密会使计算成本急剧地增加,这种情况下,我们就不得不使用较粗糙的网格进行计算。

为了在较粗糙的网格上得到可以足够精确的数值解,我们需要深入的分析方程中的离散格式,这涉及到离散格式的一些重要特性,后面继续讨论。

参考资料

Versteeg H K , Malalasekera W . An introduction to computational fluid dynamics : the finite volume method = 计算流体动力学导论[M]. 世界图书出版公司, 2010.

计算程序

import numpy as np 
import matplotlib.pyplot as plt
import math

#== parameters ===
nx = 20  # 网格单元数
nndoes = nx + 2 # 节点数,含边界

L = 1.0 # 长度,m
gamma = 0.1  #扩散系数 , kg/m.s
phi_a = 1 # 边界A的温度值 
phi_b = 0 # 边界B的温度值 
rho = 1.0 # 密度, kg/m^3
u = 2.5 # 速度,m/s # 0.1 , 2.5
# =========================


#==  x grid ==
dx = L/nx  # 网格间距
print('dx = ',dx)
x = np.zeros(nndoes)  # x网格
x[1:nndoes-1] = np.linspace(dx/2, L-dx/2, nx) # 以边界A为原点创建网格点的坐标值
x[-1] = x[-2] + dx/2 #边界B的坐标值
print('x grid = ', x, '\n')

#==  solution array ==
phi = np.zeros(nndoes)  # 解向量
phi[0] = phi_a # 边界值
phi[-1] = phi_b

DD = gamma / dx  # D
FF = rho * u     # F
Pe = rho * u * dx / gamma      # Peclet number
#== matrix ==
A = np.zeros((nx, nx)) 
b = np.zeros(nx)

#### 内部网格节点  #########
su = 0.0
sp = 0.0
for i in range(1, nx-1):    
    A[i][i-1] = -(DD + FF/2)
    A[i][i+1] = -(DD - FF/2)
    A[i][i] = -(A[i][i-1] + A[i][i+1]) - sp
    b[i] = su

# for boundary A
i = 0  
A[i][i+1] = -(DD - FF/2)
su = (2*DD + FF) * phi_a
sp = -(2*DD + FF)
A[i][i] = -A[i][i+1] - sp
b[i] = su

# for boundary B
i = nx-1  
A[i][i-1] = -(DD + FF/2)
su = (2*DD - FF) * phi_b
sp = -(2*DD - FF)
A[i][i] = -A[i][i-1] - sp
b[i] = su

print('A = \n', A, '\n')
print('b = \n', np.matrix(b).T ,'\n')

phi_temp = np.linalg.solve(A, b)
print('solution = \n', np.matrix(phi_temp).T, '\n')
phi[1:nndoes-1] = phi_temp

#===== for exact solution ======
xx = np.linspace(0, L, 50, endpoint=True)
exact_solution = np.zeros(50)
for i in range(50):
    exact_solution[i] = (math.exp(rho*u*xx[i] / gamma) -1) / (math.exp(rho*u*L / gamma) -1) * (phi_b - phi_a) + phi_a
    
#==== for showing result =======
plt.xlabel('Distance (m)')
plt.ylabel('Phi (C)')
plt.plot(x,phi ,'bs--', label='Numerical (CD)')
plt.plot(xx,exact_solution,'k', label='Exact')
title = 'u= '+str(u)+',  Pe= %.3f'% Pe
plt.title(title.rstrip('0'))
plt.legend()
plt.show()

你可能感兴趣的:(CFD)