有限体积法(12)——SIMPLE算法

承接上篇《交错网格》,本文介绍流动方程在交错网格上的离散以及SIMPLE算法。

方程离散

二维稳态的动量方程和连续性方程如下:
∂ ∂ x ( ρ u u ) + ∂ ∂ y ( ρ v u ) = ∂ ∂ x ( μ ∂ u ∂ x ) + ∂ ∂ y ( μ ∂ u ∂ y ) − ∂ p ∂ x + S u (1-a) \begin{aligned} \frac{\partial}{\partial x} (\rho u u) + \frac{\partial}{\partial y} (\rho vu) &= \frac{\partial}{\partial x} \left( \mu \frac{\partial u}{\partial x} \right) + \frac{\partial}{\partial y} \left( \mu \frac{\partial u}{\partial y} \right) - \frac{\partial p}{\partial x} + S_u \end{aligned} \tag{1-a} x(ρuu)+y(ρvu)=x(μxu)+y(μyu)xp+Su(1-a)

∂ ∂ x ( ρ u v ) + ∂ ∂ y ( ρ v v ) = ∂ ∂ x ( μ ∂ v ∂ x ) + ∂ ∂ y ( μ ∂ v ∂ y ) − ∂ p ∂ y + S v (1-b) \begin{aligned} \frac{\partial}{\partial x} (\rho u v) + \frac{\partial}{\partial y} (\rho vv) &= \frac{\partial}{\partial x} \left( \mu \frac{\partial v}{\partial x} \right) + \frac{\partial}{\partial y} \left( \mu \frac{\partial v}{\partial y} \right) - \frac{\partial p}{\partial y} + S_v \end{aligned} \tag{1-b} x(ρuv)+y(ρvv)=x(μxv)+y(μyv)yp+Sv(1-b)

∂ ∂ x ( ρ u ) + ∂ ∂ y ( ρ v ) = 0 (1-c) \begin{aligned} \frac{\partial}{\partial x}(\rho u) + \frac{\partial}{\partial y}(\rho v)&=0 \qquad \qquad \qquad \qquad\qquad\qquad\qquad\quad \end{aligned} \tag{1-c} x(ρu)+y(ρv)=0(1-c)
交错网格的编号如下图:
在这里插入图片描述

图1 交错网格

u u u动量方程离散

u u u 动量方程在 u u u 网格的离散方程可以写成如下形式:
a i , J u i , J = Σ a n b u n b − p I , J − p I − 1 , J δ x u Δ V u + S ˉ Δ V u (2-a) \begin{aligned} a_{i,J}u_{i,J} = \Sigma a_{nb}u_{nb} - \frac{p_{I,J} - p_{I-1,J}}{\delta x_u} \Delta V_u + \bar S \Delta V_u \end{aligned} \tag{2-a} ai,Jui,J=ΣanbunbδxupI,JpI1,JΔVu+SˉΔVu(2-a)


a i , J u i , J = Σ a n b u n b − ( p I , J − p I − 1 , J ) A i , J + b i , J (2-b) \begin{aligned} a_{i,J}u_{i,J} = \Sigma a_{nb}u_{nb} - (p_{I,J} - p_{I-1,J}) A_{i,J} + b_{i,J} \end{aligned} \tag{2-b} ai,Jui,J=Σanbunb(pI,JpI1,J)Ai,J+bi,J(2-b)

式中, Δ V u \Delta V_u ΔVu u u u网格单元的体积, b i , J = S ˉ Δ V u b_{i,J}=\bar S\Delta V_u bi,J=SˉΔVu是动量方程的源项, A i , J A_{i,J} Ai,J u u u网格单元的边界面积( w w w边界或 e e e边界)。压力梯度项使用了中心差分格式来近似,并使用了 u u u网格的边界压力值,即压力网格的节点值。
对于二维流场,方程的第二项 Σ a n b b n b \Sigma a_{nb}b_{nb} Σanbbnb包含了 E 、 W 、 N E、W、N EWN S S S四个方向上相邻单元的速度值,其网格下标分别为 ( i + 1 , J ) 、 ( i − 1 , J ) 、 ( i , J + 1 ) (i+1,J)、(i-1,J)、(i,J+1) (i+1,J)(i1,J)(i,J+1) ( i , J − 1 ) (i,J-1) (i,J1)。如下图所示,
在这里插入图片描述

图2 u控制体单元及相邻节点速度分量

公式中的系数 a i , J a_{i,J} ai,J a n b a_{nb} anb的计算对应不同的差分格式有不同的公式,事实上无论选用何种差分格式,方程系数 a i , J a_{i,J} ai,J a n b a_{nb} anb都是控制体单元边界处的单位面积对流量 F ( = ρ u ) F(=\rho u) F(=ρu)和单位面积扩散量 D ( = Γ / δ x ) D(=\Gamma/\delta x) D(=Γ/δx)的组合。在交错网格(二维均匀网格)的编号系统下, u u u网格单元 ( i , J ) (i,J) (i,J) e 、 w 、 n e、w、n ewn s s s边界处的 F F F值和 D D D值的计算公式为
F w = ( ρ u ) w = F i , J + F i − 1 , J 2 = 1 2 [ ( ρ I , J + ρ I − 1 , J 2 ) u i , J + ( ρ I − 1 , J + ρ I − 2 , J 2 ) u i − 1 , J ] (3-a) \begin{aligned} F_w &= (\rho u)_w = \frac{F_{i,J } + F_{i-1,J}}{2} \\ &=\frac{1}{2} \left[ \left( \frac{\rho_{I,J} + \rho_{I-1,J}}{2} \right) u_{i,J} + \left( \frac{\rho_{I-1,J} + \rho_{I-2,J}}{2} \right) u_{i-1,J}\right] \end{aligned} \tag{3-a} Fw=(ρu)w=2Fi,J+Fi1,J=21[(2ρI,J+ρI1,J)ui,J+(2ρI1,J+ρI2,J)ui1,J](3-a)

F e = ( ρ u ) e = F i + 1 , J + F i , J 2 = 1 2 [ ( ρ I + 1 , J + ρ I , J 2 ) u i + 1 , J + ( ρ I , J + ρ I − 1 , J 2 ) u i , J ] (3-b) \begin{aligned} F_e &= (\rho u)_e = \frac{F_{i+1,J } + F_{i,J}}{2} \\ &=\frac{1}{2} \left[ \left( \frac{\rho_{I+1,J} + \rho_{I,J}}{2} \right) u_{i+1,J} + \left( \frac{\rho_{I,J} + \rho_{I-1,J}}{2} \right) u_{i,J}\right] \end{aligned} \tag{3-b} Fe=(ρu)e=2Fi+1,J+Fi,J=21[(2ρI+1,J+ρI,J)ui+1,J+(2ρI,J+ρI1,J)ui,J](3-b)

F s = ( ρ v ) s = F I , j + F I − 1 , j 2 = 1 2 [ ( ρ I , J + ρ I , J − 1 2 ) v I , j + ( ρ I − 1 , J + ρ I − 1 , J − 1 2 ) v I − 1 , j ] (3-c) \begin{aligned} F_s &= (\rho v)_s = \frac{F_{I,j} + F_{I-1,j}}{2} \\ &=\frac{1}{2} \left[ \left( \frac{\rho_{I,J} + \rho_{I,J-1}}{2} \right) v_{I,j} + \left( \frac{\rho_{I-1,J} + \rho_{I-1,J-1}}{2} \right) v_{I-1,j}\right] \end{aligned} \tag{3-c} Fs=(ρv)s=2FI,j+FI1,j=21[(2ρI,J+ρI,J1)vI,j+(2ρI1,J+ρI1,J1)vI1,j](3-c)

F n = ( ρ v ) n = F I , j + 1 + F I − 1 , j + 1 2 = 1 2 [ ( ρ I , J + ρ I , J + 1 2 ) v I , j + 1 + ( ρ I − 1 , J + ρ I − 1 , J + 1 2 ) v I − 1 , j + 1 ] (3-d) \begin{aligned} F_n &= (\rho v)_n = \frac{F_{I,j+1} + F_{I-1,j+1}}{2} \\ &=\frac{1}{2} \left[ \left( \frac{\rho_{I,J} + \rho_{I,J+1}}{2} \right) v_{I,j+1} + \left( \frac{\rho_{I-1,J} + \rho_{I-1,J+1}}{2} \right) v_{I-1,j+1}\right] \end{aligned} \tag{3-d} Fn=(ρv)n=2FI,j+1+FI1,j+1=21[(2ρI,J+ρI,J+1)vI,j+1+(2ρI1,J+ρI1,J+1)vI1,j+1](3-d)
D w = Γ I − 1 , J x i − x i − 1 (3-e) \begin{aligned} D_w = \frac{\Gamma_{I-1,J}}{x_i - x_{i-1}} \end{aligned} \tag{3-e} Dw=xixi1ΓI1,J(3-e)

D e = Γ I , J x i + 1 − x i (3-f) \begin{aligned} D_e = \frac{\Gamma_{I,J}}{x_{i+1} - x_{i}} \end{aligned} \tag{3-f} De=xi+1xiΓI,J(3-f)

D s = Γ i , j y J − y J − 1 = Γ I − 1 , J + Γ I − 1 , J − 1 + Γ I , J − 1 + Γ I , J 4 ( y J − y J − 1 ) (3-g) \begin{aligned} D_s = \frac{\Gamma_{i,j}}{y_J - y_{J-1}} = \frac{\Gamma_{I-1,J} + \Gamma_{I-1,J-1} + \Gamma_{I,J-1} + \Gamma_{I,J}}{4(y_J - y_{J-1})} \end{aligned} \tag{3-g} Ds=yJyJ1Γi,j=4(yJyJ1)ΓI1,J+ΓI1,J1+ΓI,J1+ΓI,J(3-g)
D n = Γ i , j + 1 y J + 1 − y J = Γ I − 1 , J + 1 + Γ I − 1 , J + Γ I , J + Γ I , J + 1 4 ( y J + 1 − y J ) (3-h) \begin{aligned} D_n = \frac{\Gamma_{i,j+1}}{y_{J+1} - y_{J}} = \frac{\Gamma_{I-1,J+1} + \Gamma_{I-1,J} + \Gamma_{I,J} + \Gamma_{I,J+1}}{4(y_{J+1} - y_{J})} \end{aligned} \tag{3-h} Dn=yJ+1yJΓi,j+1=4(yJ+1yJ)ΓI1,J+1+ΓI1,J+ΓI,J+ΓI,J+1(3-h)
在交错网格中,密度 ρ \rho ρ和扩散系数 Γ \Gamma Γ和压力一样都是标量,因此这些标量值都保存在主网格节点(图中的黑色圆点)中,公式 ( 4 ) − ( 7 ) (4) - (7) (4)(7)中的边界密度值和公式 ( 10 ) (10) (10) ( 11 ) (11) (11)中的扩散系数都周围节点值的平均值来近似。

v v v动量方程离散

同理, v v v动量方程在 v v v网格上的离散方程可以写为如下形式:
a I , j v I , j = Σ a n b v n b + ( p I , J − 1 − p I , J ) A I , j + b I , j (4) \begin{aligned} a_{I,j}v_{I,j} = \Sigma a_{nb}v_{nb} + (p_{I,J-1} - p_{I,J}) A_{I,j} + b_{I,j} \end{aligned} \tag{4} aI,jvI,j=Σanbvnb+(pI,J1pI,J)AI,j+bI,j(4)
相邻单元的网格编号如下图
在这里插入图片描述

图3 v控制体单元及相邻节点速度分量

同样, v v v离散方程中的 a I , j a_{I,j} aI,j a n b a_{nb} anb也是 F F F D D D的组合,其在 v v v网格上的计算公式如下
F w = ( ρ u ) w = F i , J + F i , J − 1 2 = 1 2 [ ( ρ I , J + ρ I − 1 , J 2 ) u i , J + ( ρ I − 1 , J − 1 + ρ I , J − 1 2 ) u i , J − 1 ] (5-a) \begin{aligned} F_w &= (\rho u)_w = \frac{F_{i,J } + F_{i,J-1}}{2} \\ &=\frac{1}{2} \left[ \left( \frac{\rho_{I,J} + \rho_{I-1,J}}{2} \right) u_{i,J} + \left( \frac{\rho_{I-1,J-1} + \rho_{I,J-1}}{2} \right) u_{i,J-1}\right] \end{aligned} \tag{5-a} Fw=(ρu)w=2Fi,J+Fi,J1=21[(2ρI,J+ρI1,J)ui,J+(2ρI1,J1+ρI,J1)ui,J1](5-a)

F e = ( ρ u ) e = F i + 1 , J + F i + 1 , J − 1 2 = 1 2 [ ( ρ I , J + ρ I + 1 , J 2 ) u i + 1 , J + ( ρ I , J − 1 + ρ I + 1 , J − 1 2 ) u i + 1 , J − 1 ] (5-b) \begin{aligned} F_e &= (\rho u)_e = \frac{F_{i+1,J } + F_{i+1,J-1}}{2} \\ &=\frac{1}{2} \left[ \left( \frac{\rho_{I,J} + \rho_{I+1,J}}{2} \right) u_{i+1,J} + \left( \frac{\rho_{I,J-1} + \rho_{I+1,J-1}}{2} \right) u_{i+1,J-1}\right] \end{aligned} \tag{5-b} Fe=(ρu)e=2Fi+1,J+Fi+1,J1=21[(2ρI,J+ρI+1,J)ui+1,J+(2ρI,J1+ρI+1,J1)ui+1,J1](5-b)

F s = ( ρ v ) s = F I , j + F I , j − 1 2 = 1 2 [ ( ρ I , J + ρ I , J − 1 2 ) v I , j + ( ρ I , J − 1 + ρ I , J − 2 2 ) v I , j − 1 ] (5-c) \begin{aligned} F_s &= (\rho v)_s = \frac{F_{I,j } + F_{I,j-1}}{2} \\ &=\frac{1}{2} \left[ \left( \frac{\rho_{I,J} + \rho_{I,J-1}}{2} \right) v_{I,j} + \left( \frac{\rho_{I,J-1} + \rho_{I,J-2}}{2} \right) v_{I,j-1}\right] \end{aligned} \tag{5-c} Fs=(ρv)s=2FI,j+FI,j1=21[(2ρI,J+ρI,J1)vI,j+(2ρI,J1+ρI,J2)vI,j1](5-c)

F n = ( ρ v ) n = F I , j + 1 + F I , j 2 = 1 2 [ ( ρ I , J + ρ I , J + 1 2 ) v I , j + 1 + ( ρ I , J − 1 + ρ I , J 2 ) v I , j ] (5-d) \begin{aligned} F_n &= (\rho v)_n = \frac{F_{I,j+1} + F_{I,j}}{2} \\ &=\frac{1}{2} \left[ \left( \frac{\rho_{I,J} + \rho_{I,J+1}}{2} \right) v_{I,j+1} + \left( \frac{\rho_{I,J-1} + \rho_{I,J}}{2} \right) v_{I,j}\right] \end{aligned} \tag{5-d} Fn=(ρv)n=2FI,j+1+FI,j=21[(2ρI,J+ρI,J+1)vI,j+1+(2ρI,J1+ρI,J)vI,j](5-d)
D w = Γ I − 1 , J + Γ I − 1 , J − 1 + Γ I , J − 1 + Γ I , J 4 ( x I − x I − 1 ) (5-e) \begin{aligned} D_w = \frac{\Gamma_{I-1,J} + \Gamma_{I-1,J-1} + \Gamma_{I,J-1} + \Gamma_{I,J}}{4(x_{I}-x_{I-1})} \end{aligned} \tag{5-e} Dw=4(xIxI1)ΓI1,J+ΓI1,J1+ΓI,J1+ΓI,J(5-e)

D e = Γ I + 1 , J + Γ I + 1 , J − 1 + Γ I , J − 1 + Γ I , J 4 ( x I + 1 − x I ) (5-f) \begin{aligned} D_e = \frac{\Gamma_{I+1,J} + \Gamma_{I+1,J-1} + \Gamma_{I,J-1} + \Gamma_{I,J}}{4(x_{I+1}-x_{I})} \end{aligned} \tag{5-f} De=4(xI+1xI)ΓI+1,J+ΓI+1,J1+ΓI,J1+ΓI,J(5-f)

D s = Γ I , J − 1 y j − y j − 1 (5-g) \begin{aligned} D_s = \frac{\Gamma_{I,J-1}}{y_{j} - y_{j-1}} \end{aligned} \tag{5-g} Ds=yjyj1ΓI,J1(5-g)

D n = Γ I , J y j + 1 − y j (5-h) \begin{aligned} D_n = \frac{\Gamma_{I,J}}{y_{j+1} - y_{j}} \end{aligned} \tag{5-h} Dn=yj+1yjΓI,J(5-h)

连续性方程离散

连续性方程是在主网格上进行离散的,即在标量 p 、 ρ 、 Γ p、\rho、\Gamma pρΓ的网格上,网格单元及相邻节点如图1 P P P单元所示。连续性方程的离散过程与动量方程类似,其离散后的方程为
[ ( ρ u A ) i + 1 , J − ( ρ u A ) i , J ] + [ ( ρ v A ) I , j + 1 − ( ρ v A ) I , j ] = 0 (6-a) \begin{aligned} [(\rho u A)_{i+1,J} - (\rho u A)_{i,J}] + [(\rho v A)_{I,j+1} - (\rho v A)_{I,j}] = 0 \end{aligned} \tag{6-a} [(ρuA)i+1,J(ρuA)i,J]+[(ρvA)I,j+1(ρvA)I,j]=0(6-a)

或者写成
[ F e A i + 1 , J − F w A i , J ] + [ F n A I , j + 1 − F s A I , j ] = 0 (6-b) \begin{aligned} [F_e A_{i+1,J} - F_w A_{i,J}] + [F_n A_{I,j+1} - F_s A_{I,j}] = 0 \end{aligned} \tag{6-b} [FeAi+1,JFwAi,J]+[FnAI,j+1FsAI,j]=0(6-b)
边界处 F F F值计算公式如下
F e = ( ρ u ) e = ( ρ I , J + ρ I + 1 , J 2 ) u i + 1 , J (7-a) \begin{aligned} F_e = (\rho u)_e = \left( \frac{\rho_{I,J} + \rho_{I+1,J}}{2} \right )u_{i+1,J} \end{aligned} \tag{7-a} Fe=(ρu)e=(2ρI,J+ρI+1,J)ui+1,J(7-a)

F w = ( ρ u ) w = ( ρ I , J + ρ I − 1 , J 2 ) u i , J (7-b) \begin{aligned} F_w = (\rho u)_w = \left( \frac{\rho_{I,J} + \rho_{I-1,J}}{2} \right )u_{i,J} \end{aligned} \tag{7-b} Fw=(ρu)w=(2ρI,J+ρI1,J)ui,J(7-b)

F n = ( ρ v ) n = ( ρ I , J + ρ I , J + 1 2 ) v I , j + 1 (7-c) \begin{aligned} F_n = (\rho v)_n = \left( \frac{\rho_{I,J} + \rho_{I,J+1}}{2} \right )v_{I,j+1} \end{aligned} \tag{7-c} Fn=(ρv)n=(2ρI,J+ρI,J+1)vI,j+1(7-c)

F s = ( ρ v ) s = ( ρ I , J + ρ I , J − 1 2 ) v I , j (7-d) \begin{aligned} F_s = (\rho v)_s = \left( \frac{\rho_{I,J} + \rho_{I,J-1}}{2} \right )v_{I,j} \end{aligned} \tag{7-d} Fs=(ρv)s=(2ρI,J+ρI,J1)vI,j(7-d)

现在我们得到了交错网格下二维压力速度耦合问题的有限体积法离散方程组,即公式 ( 2 ) 、 ( 4 ) (2)、(4) (2)(4) ( 6 ) (6) (6)的组合,有
{ a i , J u i , J = Σ a n b u n b − ( p I , J − p I − 1 , J ) A i , J + b i , J a I , j v I , j = Σ a n b v n b + ( p I , J − 1 − p I , J ) A I , j + b I , j [ ( ρ u A ) i + 1 , J − ( ρ u A ) i , J ] + [ ( ρ v A ) I , j + 1 − ( ρ v A ) I , j ] = 0 (8) \left \{ \begin{aligned} a_{i,J}u_{i,J} = \Sigma a_{nb}u_{nb} - (p_{I,J} - p_{I-1,J}) A_{i,J} + b_{i,J} \\\\ a_{I,j}v_{I,j} = \Sigma a_{nb}v_{nb} + (p_{I,J-1} - p_{I,J}) A_{I,j} + b_{I,j} \\\\ [(\rho u A)_{i+1,J} - (\rho u A)_{i,J}] + [(\rho v A)_{I,j+1} - (\rho v A)_{I,j}] = 0 \end{aligned} \right. \tag{8} ai,Jui,J=Σanbunb(pI,JpI1,J)Ai,J+bi,JaI,jvI,j=Σanbvnb+(pI,J1pI,J)AI,j+bI,j[(ρuA)i+1,J(ρuA)i,J]+[(ρvA)I,j+1(ρvA)I,j]=0(8)

两个关键问题

为降低问题的复杂度,我们先考虑不可压缩流体的流动情况,即方程组 ( 8 ) (8) (8)中的密度 ρ \rho ρ是已知量。省去求解密度后,需要求解的变量还有三个,速度 u 、 v u、v uv p p p,然而要求解这个离散方程组我们还需要解决两个关键问题:

问题1

方程组中,未知量 u 、 v u、v uv p p p是耦合的,且动量方程是非线性的。
非线性问题的解决方法是通过假设系数中的速度场 u u u v v v是已知的,给定一组初始值然后进行迭代。
虽然方程组是耦合的,但理论上是可以直接求解的,如果采用同时求解 u 、 v 、 p u、v、p uvp的直接方法,计算过程大概如下:

  1. 先假设一组流场的初始值,由流场初始值计算出系数的初始值;
  2. 在给定的系数下,方程组联合求解各节点上 u 、 v u、v uv p p p的值;
  3. 根据所得的 u 、 v u、v uv p p p的新值更新系数,再在新系数下计算各节点的变量值,如此反复迭代,直至计算收敛。

这种在全计算域范围内同时求解 u 、 v 、 p u、v、p uvp的方法(耦合求解法)对计算资源的要求较高,在解决工程问题中不够经济,因此实际中大多采用所谓的分离式求解法(顺序求解法),即将 u 、 v 、 p u、v、p uvp分别独立求解:

  • 求解 u u u速度场时认为 v v v p p p的分布是已知的;
  • 求解 v v v场时,认为 u u u p p p的分布是已知的;
  • 求解 p p p场时认为 u u u v v v的分布是已知的。
    分离式求解法的计算过程与耦合法大致类似,不同的是第二步。耦合法是联合求解方程组,同时计算出 u 、 v 、 p u、v、p uvp,每个方程中除了系数是用的初始值或上一步迭代结果外,其他 u 、 v 、 p u、v、p uvp都是要求解的量;而分离法是在计算 u u u时,系数和所有的 v 、 p v、p vp都认为是已知量(初始值或上一步迭代值),然后求解 u u u,计算 v v v时也类似。

问题2

虽然分离求解法可以解决流动方程组耦合的问题,但从动量方程可见,速度场的变化会影响到压力场的分布,而压力场的变化反过来也会影响速度场的分布。那么在进行求解过程中,动量方程可以根据速度场和压力场的初始值更新速度场,速度场得到了更新,那下一步就应该是根据更新后的速度场来更新压力场。然而,方程组 ( 8 ) (8) (8)中没有关于描述压力 p p p的独立方程,压力是作为动量源项出现在动量方程中的,而压力和速度的耦合关系隐含在连续性方程中。因此,压力场如何单独求解,如何根据当前更新后的速度场来更新压力场就是方程组求解过程中的一个关键问题。解决这个问题的办法就是SIMPLE算法。

SIMPLE算法

SIMPLE的全称是“Semi-Implicit Method for Pressure-Linked Equations”,即求解压力耦合方程的半隐式方法,“Semi-Implicit”翻译过来就是半隐式,其指代含义后面会提到。SIMPLE算法由Patankar和Spalding(1972)提出来,是在交错网格上计算压力的一个guess-and-correct的过程。下面以笛卡尔坐标系下二维稳态不可压流体的层流流动为例来介绍SIMPLE算法的具体推导过程。
SIMPLE算法首先需要假设一个压力场( p ∗ p^* p)和一个流场( u u u v v v),然后动量方程就可以在初始压力场和初始流场上计算速度分量 u u u v v v
a i , J u i , J ∗ = Σ a n b u n b ∗ + ( p I − 1 , J ∗ − p I , J ∗ ) A i , J + b i , J a I , j v I , j ∗ = Σ a n b v n b ∗ + ( p I , J − 1 ∗ − p I , J ∗ ) A I , j + b I , j } (9) \left. \begin{aligned} a_{i,J}u^*_{i,J} = \Sigma a_{nb} u^*_{nb} + (p^*_{I-1,J} - p^*_{I,J})A_{i,J} + b_{i,J} \\\\ a_{I,j} v^*_{I,j} = \Sigma a_{nb} v^*_{nb} + (p^*_{I,J-1} - p^*_{I,J})A_{I,j} + b_{I,j} \end{aligned} \right \} \tag{9} ai,Jui,J=Σanbunb+(pI1,JpI,J)Ai,J+bi,JaI,jvI,j=Σanbvnb+(pI,J1pI,J)AI,j+bI,j(9)
上式中,等号右边的 u ∗ 、 v ∗ 、 p ∗ u^*、v^*、p^* uvp都是假设的初始值,等号左边的 u ∗ 、 v ∗ u^*、v^* uv是计算的初始速度分量,需要指出的是,系数 a i , J 、 a I , j 、 a n b a_{i,J}、a_{I,j}、a_{nb} ai,JaI,janb的计算公式中也有 u ∗ u^* u v ∗ v^* v,也是使用假设值计算。然而,一般情况下,这样计算得到的速度分量 u u u v v v是不满足连续性方程的,因为假设的压力和速度分布一般是与真实情况是不符的。因此,为了得到合理的计算结果,就需要对压力场 p ∗ p^* p和速度场 u ∗ 、 v ∗ u^*、v^* uv进行修正。定义压力的修正量和修正后的正确性分别为 p ′ p^\prime p p p p,速度的修正量和修正后的正确值分别为 u ′ 、 v ′ u^\prime 、v^\prime uv u 、 v u、v uv,则其之间的关系为
p = p ∗ + p ′ (10-a) \begin{aligned} p=p^* + p^\prime \end{aligned} \tag{10-a} p=p+p(10-a)

u = u ∗ + u ′ (10-b) \begin{aligned} u=u^* + u^\prime \end{aligned} \tag{10-b} u=u+u(10-b)

v = v ∗ + v ′ (10-c) \begin{aligned} v=v^* + v^\prime \end{aligned} \tag{10-c} v=v+v(10-c)
将压力场的正确值 p p p带入到动量方程 ( 2 − b ) (2-b) (2b) ( 4 ) (4) (4)就能计算出正确的速度场 ( u , v ) (u,v) (u,v),如果用方程 ( 2 − b ) (2-b) (2b) ( 4 ) (4) (4)减去公式 ( 9 ) (9) (9)的方程,则得到
a i , J ( u i , J − u i , J ∗ ) = Σ a n b ( u n b − u n b ∗ ) + [ ( p I − 1 , J − p I − 1 , J ∗ ) − ( p I , J − p I , J ∗ ) ] A i , J (11-a) \begin{aligned} a_{i,J} (u_{i,J} - u^*_{i,J}) = \Sigma a_{nb}(u_{nb} - u^*_{nb}) + [(p_{I-1,J}-p^*_{I-1,J}) - (p_{I,J}-p^*_{I,J})]A_{i,J} \end{aligned} \tag{11-a} ai,J(ui,Jui,J)=Σanb(unbunb)+[(pI1,JpI1,J)(pI,JpI,J)]Ai,J(11-a)

a I , j ( v I , j − v I , j ∗ ) = Σ a n b ( v n b − v n b ∗ ) + [ ( p I , J − 1 − p I , J − 1 ∗ ) − ( p I , J − p I , J ∗ ) ] A I , j (11-a) \begin{aligned} a_{I,j} (v_{I,j} - v^*_{I,j}) = \Sigma a_{nb}(v_{nb} - v^*_{nb}) + [(p_{I,J-1}-p^*_{I,J-1}) - (p_{I,J}-p^*_{I,J})]A_{I,j} \end{aligned} \tag{11-a} aI,j(vI,jvI,j)=Σanb(vnbvnb)+[(pI,J1pI,J1)(pI,JpI,J)]AI,j(11-a)

注:这里其实做了假设,即假设离散动量方程是线性的,实际上系数中都是包含速度的。

把公式 ( 10 ) (10) (10)的关系带入到公式 ( 11 ) (11) (11)中,将得到修正值的方程:
a i , J u i , J ′ = Σ a n b u n b ′ + ( p I − 1 , J ′ − p I , J ′ ) A i , J (12-a) \begin{aligned} a_{i,J} u^\prime_{i,J} = \Sigma a_{nb} u^\prime_{nb} + (p^\prime_{I-1,J}-p^\prime_{I,J})A_{i,J} \end{aligned} \tag{12-a} ai,Jui,J=Σanbunb+(pI1,JpI,J)Ai,J(12-a)

a I , j v I , j ′ = Σ a n b v n b ′ + ( p I , J − 1 ′ − p I , J ′ ) A I , j (12-b) \begin{aligned} a_{I,j} v^\prime_{I,j} = \Sigma a_{nb} v^\prime_{nb} + (p^\prime_{I,J-1}-p^\prime_{I,J})A_{I,j} \end{aligned} \tag{12-b} aI,jvI,j=Σanbvnb+(pI,J1pI,J)AI,j(12-b)
这里引入一个近似:将 Σ a n b u n b ′ \Sigma a_{nb}u^\prime_{nb} Σanbunb Σ a n b v n b ′ \Sigma a_{nb}v^\prime_{nb} Σanbvnb两项省略掉。这两项的省略是SIMPLE算法中主要的近似操作。然后,我们就得到
u i , J ′ = d i , J ( p I − 1 , J ′ − p I , J ′ ) (13-a) \begin{aligned} u^\prime_{i,J} = d_{i,J} (p^\prime_{I-1,J} - p^\prime_{I,J}) \end{aligned} \tag{13-a} ui,J=di,J(pI1,JpI,J)(13-a)

v I , j ′ = d I , j ( p I , J − 1 ′ − p I , J ′ ) (13-b) \begin{aligned} v^\prime_{I,j} = d_{I,j} (p^\prime_{I,J-1} - p^\prime_{I,J}) \end{aligned} \tag{13-b} vI,j=dI,j(pI,J1pI,J)(13-b)
其中, d i , J = A i , J a i , J d_{i,J}=\frac{A_{i,J}}{a_{i,J}} di,J=ai,JAi,J d I , j = A I , j a I , j d_{I,j}=\frac{A_{I,j}}{a_{I,j}} dI,j=aI,jAI,j.

把公式 ( 13 − a ) (13-a) (13a) ( 13 − b ) (13-b) (13b)代入到公式 ( 10 − b ) (10-b) (10b) ( 10 − c ) (10-c) (10c)中,有
u i , J = u i , J ∗ + d i , J ( p I − 1 , J ′ − p I , J ′ ) (14-a) \begin{aligned} u_{i,J}=u^*_{i,J} + d_{i,J} (p^\prime_{I-1,J} - p^\prime_{I,J}) \end{aligned} \tag{14-a} ui,J=ui,J+di,J(pI1,JpI,J)(14-a)

v I , j = v I , j ∗ + d I , j ( p I , J − 1 ′ − p I , J ′ ) (14-b) \begin{aligned} v_{I,j} = v^*_{I,j} + d_{I,j} (p^\prime_{I,J-1} - p^\prime_{I,J}) \end{aligned} \tag{14-b} vI,j=vI,j+dI,j(pI,J1pI,J)(14-b)
同样对于 u i + 1 , J u_{i+1,J} ui+1,J v I , j + 1 v_{I,j+1} vI,j+1
u i + 1 , J = u i + 1 , J ∗ + d i + 1 , J ( p I , J ′ − p I + 1 , J ′ ) (15-a) \begin{aligned} u_{i+1,J}=u^*_{i+1,J} + d_{i+1,J} (p^\prime_{I,J} - p^\prime_{I+1,J}) \end{aligned} \tag{15-a} ui+1,J=ui+1,J+di+1,J(pI,JpI+1,J)(15-a)

v I , j + 1 = v I , j + 1 ∗ + d I , j + 1 ( p I , J ′ − p I , J + 1 ′ ) (15-b) \begin{aligned} v_{I,j+1} = v^*_{I,j+1} + d_{I,j+1} (p^\prime_{I,J} - p^\prime_{I,J+1}) \end{aligned} \tag{15-b} vI,j+1=vI,j+1+dI,j+1(pI,JpI,J+1)(15-b)
其中, d i + 1 , J = A i + 1 , J a i + 1 , J d_{i+1,J}=\frac{A_{i+1,J}}{a_{i+1,J}} di+1,J=ai+1,JAi+1,J d I , j + 1 = A I , j + 1 a I , j + 1 d_{I,j+1}=\frac{A_{I,j+1}}{a_{I,j+1}} dI,j+1=aI,j+1AI,j+1.

到此为止,我们只考虑了动量方程,如上所述,如果压力修正 p ′ p^\prime p已知,速度场就可以更新了,那么现在就剩下最后一个问题:如何利用连续性方程来计算压力修正 p ′ p^\prime p
把更新的速度值代入到离散的连续性方程
[ ( ρ u A ) i + 1 , J − ( ρ u A ) i , J ] + [ ( ρ v A ) I , j + 1 − ( ρ v A ) I , j ] = 0 (16) [(\rho u A)_{i+1,J} - (\rho u A)_{i,J}] + [(\rho v A)_{I,j+1} - (\rho v A)_{I,j}] = 0 \tag{16} [(ρuA)i+1,J(ρuA)i,J]+[(ρvA)I,j+1(ρvA)I,j]=0(16)
在这里插入图片描述
按上图的网格标号,离散的连续性方程则成为
[ ρ i + 1 , J A i + 1 , J ( u i + 1 , J ∗ + d i + 1 , J ( p I , J ′ − p I + 1 , J ′ ) ) − ρ i , J A i , J ( u i , J ∗ + d i , J ( p I − 1 , J ′ − p I , J ′ ) ) ] + [ ρ I , j + 1 A I , j + 1 ( v I , j + 1 ∗ + d I , j + 1 ( p I , J ′ − p I , J + 1 ′ ) ) − ρ I , j A I , j ( v I , j ∗ + d I , j ( p I , J − 1 ′ − p I , J ′ ) ) ] = 0 (17) \begin{aligned} [\rho_{i+1,J} & A_{i+1,J}(u^*_{i+1,J}+d_{i+1,J}(p^\prime_{I,J}-p^\prime_{I+1,J})) - \rho_{i,J}A_{i,J}(u^*_{i,J} + \\\\ &d_{i,J}(p^\prime_{I-1,J}-p^\prime_{I,J})) ] + [\rho_{I,j+1}A_{I,j+1}(v^*_{I,j+1} + d_{I,j+1}(p^\prime_{I,J} - p^\prime_{I,J+1})) \\\\ &-\rho_{I,j}A_{I,j}(v^*_{I,j} + d_{I,j}(p^\prime_{I,J-1} - p^\prime_{I,J}))] =0 \end{aligned} \tag{17} [ρi+1,JAi+1,J(ui+1,J+di+1,J(pI,JpI+1,J))ρi,JAi,J(ui,J+di,J(pI1,JpI,J))]+[ρI,j+1AI,j+1(vI,j+1+dI,j+1(pI,JpI,J+1))ρI,jAI,j(vI,j+dI,j(pI,J1pI,J))]=0(17)
p ′ p^\prime p看作未知变量,重新整理一下,就变成
[ ( ρ d A ) i + 1 , J + ( ρ d A ) i , J + ( ρ d A ) I , j + 1 + ( ρ d A ) I , J ] p I , J ′ = ( ρ d A ) i + 1 , J p I + 1 , J ′ + ( ρ d A ) i , J p I − 1 , J ′ + ( ρ d A ) I , J + 1 p I , J + 1 ′ + ( ρ d A ) I , j p I , J − 1 ′ + [ ( ρ u ∗ A ) i , J − ( ρ u ∗ A ) i + 1 , J + ( ρ v ∗ A ) I , j − ( ρ v ∗ A ) I , j + 1 ] (18) \begin{aligned} [(\rho d A)_{i+1,J} &+ (\rho d A)_{i,J} + (\rho d A)_{I,j+1} + (\rho d A)_{I,J} ] p^\prime_{I,J} = \\\\&(\rho d A)_{i+1,J} p^\prime_{I+1,J} + (\rho d A)_{i,J} p^\prime_{I-1,J} + (\rho d A)_{I,J+1} p^\prime_{I,J+1} + (\rho d A)_{I,j} p^\prime_{I,J-1} \\\\ &+[(\rho u^*A)_{i,J} - (\rho u^*A)_{i+1,J} + (\rho v^*A)_{I,j} - (\rho v^*A)_{I,j+1}] \end{aligned} \tag{18} [(ρdA)i+1,J+(ρdA)i,J+(ρdA)I,j+1+(ρdA)I,J]pI,J=(ρdA)i+1,JpI+1,J+(ρdA)i,JpI1,J+(ρdA)I,J+1pI,J+1+(ρdA)I,jpI,J1+[(ρuA)i,J(ρuA)i+1,J+(ρvA)I,j(ρvA)I,j+1](18)
写出熟悉的样子就是
a I , J p I , J ′ = a I + 1 , J p I + 1 , J ′ + a I − 1 , J p I − 1 , J ′ + a I , J + 1 p I , J + 1 ′ + a I , J − 1 p I , J − 1 ′ + b I , J ′ (19) \begin{aligned} a_{I,J} p^\prime_{I,J} = a_{I+1,J} p^\prime_{I+1,J} + a_{I-1,J} p^\prime_{I-1,J} +a_{I,J+1} p^\prime_{I,J+1} + a_{I,J-1} p^\prime_{I,J-1} + b^\prime_{I,J} \end{aligned} \tag{19} aI,JpI,J=aI+1,JpI+1,J+aI1,JpI1,J+aI,J+1pI,J+1+aI,J1pI,J1+bI,J(19)
其中系数为

a I + 1 , J a_{I+1,J} aI+1,J ( ρ d A ) i + 1 , J (\rho d A)_{i+1,J} (ρdA)i+1,J
a I − 1 , J a_{I-1,J} aI1,J ( ρ d A ) i , J (\rho d A)_{i,J} (ρdA)i,J
a I , J + 1 a_{I,J+1} aI,J+1 ( ρ d A ) I , j + 1 (\rho d A)_{I,j+1} (ρdA)I,j+1
a I , J − 1 a_{I,J-1} aI,J1 ( ρ d A ) I , j (\rho d A)_{I,j} (ρdA)I,j
b I , J b_{I,J} bI,J ( ρ u ∗ A ) i , J − ( ρ u ∗ A ) i + 1 , J + ( ρ v ∗ A ) I , j − ( ρ v ∗ A ) I , j + 1 (\rho u^* A)_{i,J}-(\rho u^* A)_{i+1,J} +(\rho v^* A)_{I,j} - (\rho v^* A)_{I,j+1} (ρuA)i,J(ρuA)i+1,J+(ρvA)I,j(ρvA)I,j+1
a I , J a_{I,J} aI,J a I + 1 , J + a I − 1 , J + a I , J + 1 + a I , J − 1 a_{I+1,J} + a_{I-1,J} + a_{I,J+1} + a_{I,J-1} aI+1,J+aI1,J+aI,J+1+aI,J1

方程式 ( 19 ) (19) (19)是用压力修正 p ′ p^\prime p描述的离散连续性方程,其中源项 b ′ b^\prime b代表的是由于不准确的 u ∗ 、 v ∗ u^*、v^* uv导致的不守恒流量,多次迭代修正后 b ′ b^\prime b会趋于零,因此 b ′ b^\prime b可以作为判断迭代收敛过程是否满足要求的判据。
根据假设的初始速度场,通过求解压力修正方程 ( 19 ) (19) (19)可以得出计算域所有网格节点的压力修正 p ′ p^\prime p,一旦压力修正值知道了,那么压力场和速度场就可以根据公式 ( 14 ) (14) (14)进一步更新了,然后按照这个过程不断迭代计算,压力修正值和速度修正值会越来越小,最终速度场和压力场会收敛于真实值。最后,SIMPLE算法的计算流程如下图所示。
在这里插入图片描述

关于SIMPLE算法的几点说明

【1】 公式 ( 12 ) (12) (12) ( 13 ) (13) (13)的过程引入了近似处理,即省略掉了 Σ a n b u n b ′ \Sigma a_{nb}u^\prime_{nb} Σanbunb Σ a n b v n b ′ \Sigma a_{nb}v^\prime_{nb} Σanbvnb。这一近似处理并不会影响最终的计算结果,因为压力修正和速度修正最终都趋向于零,即最终 p ∗ = p , u ∗ = u , v ∗ = v p^*=p,u^*=u,v^*=v p=p,u=u,v=v

【2】 从物理意义上讲, ( p I − 1 , J ′ − p I , J ′ ) (p^\prime_{I-1,J}-p^\prime_{I,J}) (pI1,JpI,J)代表了压力修正对 u i , J ′ u^\prime_{i,J} ui,J的直接影响,而 Σ a n b u n b ′ \Sigma a_{nb}u^\prime_{nb} Σanbunb则反映了压力修正对 u i , J ′ u^\prime_{i,J} ui,J的间接的或隐含的影响(压力修正通过影响周围节点的 u n b ′ u^\prime_{nb} unb进而影响中心节点的 u i , J ′ u^\prime_{i,J} ui,J)。去掉了 Σ a n b u n b ′ \Sigma a_{nb}u^\prime_{nb} Σanbunb这一项就称为半隐(Semi-Implicit),若保留这一部分, u ′ u^\prime u方程就是一个全隐的代数方程,即网格点上的 u ′ u^\prime u就是耦合的,必须同时计算出,不像SIMPLE算法中那样可以在每个节点上独立计算。

【3】 一般情况下,如果按公式 ( 10 ) (10) (10)直接用压力修正值来更新压力场往往会导致迭代发散。使用亚松弛迭代方法可以解决这一问题,压力修正方程就成为
p n e w = p ∗ + α p p ′ (20) \begin{aligned} p^{new} = p^* + \alpha_p p^\prime \end{aligned} \tag{20} pnew=p+αpp(20)

式中, α p \alpha_p αp是亚松弛因子。因为修正量随着迭代计算会区域零,所以亚松弛因子的大小并不会影响最终计算的结果。
α p = 1 \alpha_p=1 αp=1时,实际上就是直接用压力修正值 p ′ p^\prime p来修正压力初始值 p ∗ p^* p。然而,当压力初始值与真实值相差较大时,这样计算出来的压力修正值 p ′ p^\prime p会是很大的数,如果直接用 p ′ p^\prime p来修正 p ∗ p^* p,即使 p ′ p^\prime p的修正方向是正确的,那也会导致矫枉过正,造成计算的不稳定。
α p \alpha_p αp取0~1之间的值时,即人为控制压力修正的幅度。每次迭代压缩了修正的幅度,控制了压力变动的幅度,从而保证计算的稳定性。然而, α p \alpha_p αp的值也并不是越小越好,过小的松弛因子虽然可以保证收敛稳定,但要迭代到最后的收敛解就需要更多次的迭代计算,这样会导致收敛速度很慢。计算中所希望的 α p \alpha_p αp值是尽可能大(以加快收敛)但又不引起计算发散。
速度的修正也需要采用亚松弛迭代,
u n e w = u ( n − 1 ) + α u u ′ = u ( n − 1 ) + α u ( u ( n ) − u ( n − 1 ) ) = α u u ( n ) + ( 1 − α u ) u ( n − 1 ) (21-a) \begin{aligned} u^{new} = u^{(n-1)} + \alpha_u u^\prime = u^{(n-1)} + \alpha_u(u^{(n)}-u^{(n-1)}) = \alpha_u u^{(n)} + (1-\alpha_u)u^{(n-1)} \end{aligned} \tag{21-a} unew=u(n1)+αuu=u(n1)+αu(u(n)u(n1))=αuu(n)+(1αu)u(n1)(21-a)
v n e w = v ( n − 1 ) + α v v ′ = v ( n − 1 ) + α v ( v ( n ) − v ( n − 1 ) ) = α v v ( n ) + ( 1 − α v ) v ( n − 1 ) (21-b) \begin{aligned} v^{new} = v^{(n-1)} + \alpha_v v^\prime = v^{(n-1)} + \alpha_v(v^{(n)}-v^{(n-1)}) = \alpha_v v^{(n)} + (1-\alpha_v)v^{(n-1)} \end{aligned} \tag{21-b} vnew=v(n1)+αvv=v(n1)+αv(v(n)v(n1))=αvv(n)+(1αv)v(n1)(21-b)
其中, α u \alpha_u αu α v \alpha_v αv是速度 u u u v v v修正的亚松弛因子,取值也是在 0 0 0~ 1 1 1之间, u ( n − 1 ) u^{(n-1)} u(n1) v ( n − 1 ) v^{(n-1)} v(n1)是上一次迭代计算的结果, u ( n ) u^{(n)} u(n) v ( n ) v^{(n)} v(n)是本次迭代以 p ′ p^\prime p直接修正后的值。

【4】 最后需要指出的是,虽然亚松弛因子存在一个最优值,使得计算能够保证收敛且收敛最快,但并没有一个通用的最优亚松弛因子,不同计算的最优值是不同的。此外,在计算之前也没有很有效的方法来确定松弛因子的最优值,只能是在计算中试验性地取值,反复调整最终确定松弛因子的最优值。

参考资料

  1. Versteeg H K , Malalasekera W . An introduction to computational fluid dynamics : the finite volume method = 计算流体动力学导论[M]. 世界图书出版公司, 2010.
  2. 陶文铨. 数值传热学(第2版)[M]. 西安交通大学出版社, 2001.
  3. 李人宪. 有限体积法基础-第2版[M]. 国防工业出版社, 2008.
  • 13
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值