FVM in CFD 学习笔记_第15章_流动计算:不可压缩流动_2_同位网格上的SIMPLE算法

学习自F. Moukalled, L. Mangani, M. Darwish所著The Finite Volume Method in Computational Fluid Dynamics - An Advanced Introduction with OpenFOAM and Matlab
Chapter 15 Fluid Flow Computation: Incompressible Flows

前面几章讲解的关于变量 ϕ \phi ϕ的一般输运方程的离散和求解流程,均是建立在事先已知速度场的前提下。但是一般情况下,速度场是未知的,且需要通过求解Navier-Stokes方程组来获取。对于不可压缩流动而言,该项工作尤为复杂,因为压力和速度是强烈耦合在一起的,而且压力并不以主变量的形式出现在动量或是连续方程中。本章的重点在于展示解决上述两个问题的方法,以及不可压缩流动问题的流场计算方法。先讲解一维交错网格,然后是一维同位网格,最后是同位三维非结构网格。除了阐明SIMPLE、SIMPLEC、PRIME和PISO算法的来龙去脉,还清晰阐明了Rhie-Chow插值方法,以及将其扩展到瞬态、松弛和体积力项的方法。最后,展现了一些常见边界条件的添加细节。

由于本章内容繁杂,篇幅较长,故分成了四部分来讲解,各部分主要内容分别为:交错网格、同位网格、边界条件、SIMPLE家族算法。

这里是第二部分,主要讲解交错网格的缺陷,以及如何不用交错网格,而直接在原来的同位网格(即最初的网格,且是三维非结构的复杂网格)上开展SIMPLE算法。

3 交错网格的缺陷

交错网格的使用对于SIMPLE算法的发展来说至关重要,然而采用交错网格架构也有其缺点。如前所述,在二维和三维情况下,分别需要三套和四套交错网格系统,来存放速度的两到三个不同分量和压力值。

这样一来,就需要对每个速度分量存储一套网格系统,对压力和其他变量再存储一套网格系统,内存开销是蛮大的。除此之外,对于非笛卡尔网格,交错网格系统会产生很多问题,更有甚者,对于非结构网格而言,交错网格系统基本上是无法构造出来的。

在这里插入图片描述

在曲线网格中,使用笛卡尔速度分量会导致的问题是,当一个或多个面和交错速度分量的方向平齐而非垂直的时候,比如上图中的最上端的两个单元中,由于每个面上的交错速度与面平齐,算得的质量流量都几乎是零,这样造成其错误地自动满足了连续方程,显然这是不符合物理意义的,会导致SIMPLE计算过程的失效。
在这里插入图片描述

因此,这种情况下较好的替代方法是使用协变的(covariant)或抗变(contra-variant)速度分量,如上图a和b所示。

使用抗变速度分量的交错网格例子如下图。

不幸的是,在曲线坐标系上离散动量方程时,复杂性大为提升,表现在对扩散项的处理上,因为方程中有非守恒项。
在这里插入图片描述

另一种处理方法是把在所有方向的笛卡尔速度分量全部做交错处理,这样在每个面上都含有所有的速度分量了,如下图。这样,待求解动量方程的数目将会是两倍(二维问题)或三倍(三维问题)。

在这里插入图片描述

对非结构网格情况来说,问题变得更加复杂了,因为此时并没有一个明显的交错方向,那么应用交错概念的唯一方法是通过改变压力和速度分量单元的大小,或者通过诉诸于在每个面上交错所有的速度分量,这无疑会急剧增加待求解变量的数目。最终,所存储的几何构型将远大于两倍,因为需要全新的非结构网格来存储速度分量。

结果是咱们还得回到最初的单元中心的同位网格系统上,如下图所示,所有的变量都存在相同的位置处(单元形心),使用这种同位网格系统才是最佳方法(兜兜转转饶了一大圈又转回来了哈)。值得注意的是,虽然速度分量是存储在单元形心处的,与压力和其他变量存储位置一样,然而质量流量(是个标量)在同位网格中是存储在面单元上的。质量流量实际上可以视作抗变(contra-variant)分量,只是此时质量流量的计算通常是用离散动量方程来插值计算的(不再像之前那样子用界面速度,而界面速度又用两侧单元值插值,从而出现了连续方程中用到的是交替单元的速度的情况,无法感知棋盘型的非均匀流场),这便是著名的Rhie-Chow插值,其正是下面章节的主题。
在这里插入图片描述

4 Rhie-Chow插值

前面展示的原始同位网格上的缺陷(即无法感知棋盘型压力场和速度场),究其原因,是由于采用了线性插值来计算单元面上的速度。该插值导致了在单元层次的压力和速度值的解耦(即,用到的是单元 C C C两侧单元 E E E W W W的值来计算压力梯度和连续方程中的通量,而并不是用的紧邻单元值),从而产生了棋盘型问题(对棋盘型的非均匀场将被错误地感知成均匀场)。1983年,Rhie和Chow发表了一种插值策略,其允许SIMPLE算法在同位网格上实现。如下图所示,在他们的方法中有个耗散项,其代表着两种预估单元面压力梯度的差值(即,后面要讲到的 D f u ‾ [ ( ∂ p / ∂ x ) f − ( ∂ p / ∂ x ) f ‾ ] \overline{D_f^u}\left[({\partial p}/{\partial x})_f-\overline{({\partial p}/{\partial x})_f}\right] Dfu[(p/x)f(p/x)f]项),该耗散项被添加进单元面速度 u f u_f uf的线性插值中。注意,这两个压力梯度的预估值 ( ∂ p / ∂ x ) f \left({\partial p}/{\partial x}\right)_f (p/x)f ( ∂ p / ∂ x ) f ‾ \overline{\left({\partial p}/{\partial x}\right)_f} (p/x)f是基于不同的网格框架的,后者是线性插值(用到四个单元形心点),前者则是Rhie-Chow插值(用到面邻近连续俩单元形心点)。

在这里插入图片描述

该流程等效于在单元面处构建一个伪动量方程,其系数是从该面两侧单元形心处的动量方程中的系数线性插值而来,而压力梯度的计算则使用最小网格框架(即 C C C F F F点的压力值来计算)。如此一来,Rhie-Chow插值轻易地模仿出了交错网格配置下的压力-速度耦合最小框架。

(说到这,连我都被绕晕了,没关系,接下来看看如何处理就会豁然开朗了)

由单元 C C C F F F的离散 x x x动量方程开始,即
u C + H C [ u ] = B C u − D C u ( ∂ p ∂ x ) C u F + H F [ u ] = B F u − D F u ( ∂ p ∂ x ) F u_C+H_C[u]=B_C^u-D_C^u\left(\frac{\partial p}{\partial x}\right)_C \\ u_F+H_F[u]=B_F^u-D_F^u\left(\frac{\partial p}{\partial x}\right)_F uC+HC[u]=BCuDCu(xp)CuF+HF[u]=BFuDFu(xp)F
u f u_f uf速度方程与上式类似,只是压力梯度是与局部邻近压力值相关的( f f f处压力梯度是用 C C C F F F压力值计算的,并非间隔了一个单元的交替值),如上图所示, u f u_f uf方程的形式为
u f + H f [ u ] = B f u − D f u ( ∂ p ∂ x ) f u_f+H_f[u]=B_f^u-D_f^u\left(\frac{\partial p}{\partial x}\right)_f uf+Hf[u]=BfuDfu(xp)f
既然在同位网格上,上式中的系数无法直接算得,那么就用邻近节点的系数插值来近似计算这些系数好了,即
H f [ u ] = 1 2 ( H C [ u ] + H F [ u ] ) = H f ‾ [ u ] B f u = 1 2 ( B C u + B F u ) = B f u ‾ D f u = 1 2 ( D C u + D F u ) = D f u ‾ \begin{aligned} H_f[u] &= \frac{1}{2}(H_C[u]+H_F[u])=\overline{H_f}[u] \\ B_f^u &= \frac{1}{2}(B_C^u+B_F^u)=\overline{B_f^u} \\ D_f^u &= \frac{1}{2}(D_C^u+D_F^u)=\overline{D_f^u} \end{aligned} Hf[u]BfuDfu=21(HC[u]+HF[u])=Hf[u]=21(BCu+BFu)=Bfu=21(DCu+DFu)=Dfu
使用这些插值算得的系数,单元面处的伪动量方程变为
u f + H f ‾ [ u ] = B f u ‾ − D f u ‾ ( ∂ p ∂ x ) f u_f+\overline{H_f}[u]=\overline{B_f^u} -\overline{D_f^u}\left(\frac{\partial p}{\partial x}\right)_f uf+Hf[u]=BfuDfu(xp)f
这实际上是使用同位网格上的动量方程系数来构建能感知“交错”网格的动量方程。

在上面的方程和后面的方程中,有上划线的值是由 C C C F F F的值做线性插值而得到的,即
□ ‾ f = g C □ ‾ C + g F □ ‾ F \overline{\square}_f=g_C\overline{\square}_C+g_F\overline{\square}_F f=gCC+gFF
其中 g C g_C gC g F g_F gF是几何插值系数,与单元面 f f f相对节点 C C C F F F的位置相关,这个在前几章已经详细讲过了。

再来看系数 H f ‾ [ u ] \overline{H_f}[u] Hf[u],其是速度的函数,想办法把它用其它量来表示,即
H f ‾ [ u ] = 1 2 ( H C [ u ] + H F [ u ] ) = 1 2 [ − u C + B C u − D C u ( ∂ p ∂ x ) C − u F + B F u − D F u ( ∂ p ∂ x ) F ] = − u f ‾ − D f u ‾ ( ∂ p ∂ x ) f ‾ + B f u ‾ \begin{aligned} \overline{H_f}[u] &= \frac{1}{2}(H_C[u]+H_F[u]) \\ &= \frac{1}{2}\left[ -u_C+B_C^u-D_C^u\left(\frac{\partial p}{\partial x}\right)_C -u_F+B_F^u-D_F^u\left(\frac{\partial p}{\partial x}\right)_F \right] \\ &= -\overline{u_f}-\overline{D_f^u}\overline{\left(\frac{\partial p}{\partial x}\right)_f}+\overline{B_f^u} \end{aligned} Hf[u]=21(HC[u]+HF[u])=21[uC+BCuDCu(xp)CuF+BFuDFu(xp)F]=ufDfu(xp)f+Bfu
其中用到了系数的近似
1 2 [ D C u ( ∂ p ∂ x ) C + D F u ( ∂ p ∂ x ) F ] = D f u ( ∂ p ∂ x ) f ‾ ≈ D f u ‾ ( ∂ p ∂ x ) f ‾ \frac{1}{2}\left[ D_C^u\left(\frac{\partial p}{\partial x}\right)_C+ D_F^u\left(\frac{\partial p}{\partial x}\right)_F \right] =\overline{D_f^u\left(\frac{\partial p}{\partial x}\right)_f} \approx \overline{D_f^u}\overline{\left(\frac{\partial p}{\partial x}\right)_f} 21[DCu(xp)C+DFu(xp)F]=Dfu(xp)fDfu(xp)f
该系数近似有两阶精度,即
D f u ( ∂ p ∂ x ) f ‾ − D f u ‾ ( ∂ p ∂ x ) f ‾ = 1 2 [ D C u ( ∂ p ∂ x ) C + D F u ( ∂ p ∂ x ) F ] − 1 2 ( D C u + D F u ) × 1 2 [ ( ∂ p ∂ x ) C + ( ∂ p ∂ x ) F ] = 1 4 D C u [ ( ∂ p ∂ x ) C − ( ∂ p ∂ x ) F ] + 1 4 D F u [ ( ∂ p ∂ x ) F − ( ∂ p ∂ x ) C ] ≈ O ( Δ x 2 ) \begin{aligned} \overline{D_f^u\left(\frac{\partial p}{\partial x}\right)_f}- \overline{D_f^u}\overline{\left(\frac{\partial p}{\partial x}\right)_f} = & \frac{1}{2}\left[ D_C^u\left(\frac{\partial p}{\partial x}\right)_C+ D_F^u\left(\frac{\partial p}{\partial x}\right)_F \right] \\ &-\frac{1}{2}(D_C^u+D_F^u)\times\frac{1}{2} \left[\left(\frac{\partial p}{\partial x}\right)_C+\left(\frac{\partial p}{\partial x}\right)_F\right] \\ =& \frac{1}{4}D_C^u \left[\left(\frac{\partial p}{\partial x}\right)_C-\left(\frac{\partial p}{\partial x}\right)_F\right] +\frac{1}{4}D_F^u \left[\left(\frac{\partial p}{\partial x}\right)_F-\left(\frac{\partial p}{\partial x}\right)_C\right] \\ \approx & O(\Delta x^2) \end{aligned} Dfu(xp)fDfu(xp)f==21[DCu(xp)C+DFu(xp)F]21(DCu+DFu)×21[(xp)C+(xp)F]41DCu[(xp)C(xp)F]+41DFu[(xp)F(xp)C]O(Δx2)
H f ‾ [ u ] \overline{H_f}[u] Hf[u]的表达式代入到单元面 f f f处的伪动量方程中,可求得以Rhie-Chow插值方法表示的单元面处的速度 u f u_f uf
u f = − H f ‾ [ u ] + B f u ‾ − D f u ‾ ( ∂ p ∂ x ) f = − [ − u f ‾ − D f u ‾ ( ∂ p ∂ x ) f ‾ + B f u ‾ ] + B f u ‾ − D f u ‾ ( ∂ p ∂ x ) f = u f ‾ ⏟ a v e r a g e   v e l o c i t y − D f u ‾ [ ( ∂ p ∂ x ) f − ( ∂ p ∂ x ) f ‾ ] ⏟ c o r r e c t i o n   t e r m \begin{aligned} u_f &= -\overline{H_f}[u]+\overline{B_f^u} -\overline{D_f^u}\left(\frac{\partial p}{\partial x}\right)_f \\ &= -\left[ -\overline{u_f}-\overline{D_f^u}\overline{\left(\frac{\partial p}{\partial x}\right)_f}+\overline{B_f^u} \right] +\overline{B_f^u} -\overline{D_f^u}\left(\frac{\partial p}{\partial x}\right)_f \\ &= \underbrace{\overline{u_f}}_{average~velocity}- \underbrace{\overline{D_f^u}\left[ \left(\frac{\partial p}{\partial x}\right)_f-\overline{\left(\frac{\partial p}{\partial x}\right)_f} \right]}_{correction~term} \end{aligned} uf=Hf[u]+BfuDfu(xp)f=[ufDfu(xp)f+Bfu]+BfuDfu(xp)f=average velocity ufcorrection term Dfu[(xp)f(xp)f]

注意,对于一维均匀网格而言,以 e e e界面为例,上式中
u e ‾ = 0.5 ( u C + u E ) \overline{u_e}=0.5(u_C+u_E) ue=0.5(uC+uE)
这并没有什么特殊的,而
( ∂ p ∂ x ) e ‾ = 0.5 [ ( ∂ p ∂ x ) C + ( ∂ p ∂ x ) E ] = 0.5 [ p E − p W 2 Δ x + p E E − p C 2 Δ x ] \overline{\left(\frac{\partial p}{\partial x}\right)_e}=0.5\left[\left(\frac{\partial p}{\partial x}\right)_C+\left(\frac{\partial p}{\partial x}\right)_E\right]=0.5\left[\frac{p_E-p_W}{2\Delta x}+\frac{p_{EE}-p_C}{2\Delta x}\right] (xp)e=0.5[(xp)C+(xp)E]=0.5[2ΔxpEpW+2ΔxpEEpC]
用的依旧是交替单元节点值,然而
( ∂ p ∂ x ) e = p E − p C Δ x \left(\frac{\partial p}{\partial x}\right)_e=\frac{p_E-p_C}{\Delta x} (xp)e=ΔxpEpC
则用到了面两侧的邻近连续单元节点的压力值,从而有效避免了棋盘压力场的出现!

对于多维问题,也可对 y y y z z z速度分量推导出相似的插值公式,即
v f = v f ‾ − D f v ‾ [ ( ∂ p ∂ y ) f − ( ∂ p ∂ y ) f ‾ ] w f = w f ‾ − D f w ‾ [ ( ∂ p ∂ z ) f − ( ∂ p ∂ z ) f ‾ ] \begin{aligned} v_f &= \overline{v_f}-\overline{D_f^v}\left[ \left(\frac{\partial p}{\partial y}\right)_f-\overline{\left(\frac{\partial p}{\partial y}\right)_f} \right] \\ w_f &= \overline{w_f}-\overline{D_f^w}\left[ \left(\frac{\partial p}{\partial z}\right)_f-\overline{\left(\frac{\partial p}{\partial z}\right)_f} \right] \end{aligned} vfwf=vfDfv[(yp)f(yp)f]=wfDfw[(zp)f(zp)f]
上面仨式子可写成矢量形式,更适用于多维压力修正方程的推导,即
v f = v f ‾ − D f v ‾ ( ∇ p f − ∇ p f ‾ ) \bold v_f = \overline{\bold v_f}-\overline{\bold D_f^{\bold v}}( \nabla p_f-\overline{\nabla p_f} ) vf=vfDfv(pfpf)
其中
D f v ‾ = [ D f u ‾ 0 0 0 D f v ‾ 0 0 0 D f w ‾ ] \overline{\bold D_f^{\bold v}}= \begin{bmatrix} \overline{D_f^u} & 0 & 0 \\ 0 & \overline{D_f^v} & 0 \\ 0 & 0 & \overline{D_f^w} \end{bmatrix} Dfv=Dfu000Dfv000Dfw
其中 ∇ p f \nabla p_f pf的计算,见第9章第4节,即
∇ p f = ∇ p f ‾ + [ p F − p C d C F − ( ∇ p f ‾ ⋅ e C F ) ] e C F ⏟ C o r r e c t i o n   t o   i n t e r p o l a t e d   f a c e   g r a d i e n t \nabla p_f=\overline{\nabla p_f}+\underbrace{\left[\frac{p_F-p_C}{d_{CF}}-(\overline{\nabla p_f}\cdot\bold e_{CF})\right]\bold e_{CF}}_{Correction~to~interpolated~face~gradient} pf=pf+Correction to interpolated face gradient [dCFpFpC(pfeCF)]eCF
其中
∇ p f ‾ = g C ∇ p C + g F ∇ p F \overline{\nabla p_f}=g_C\nabla p_C+g_F\nabla p_F pf=gCpC+gFpF
这样,可推导出在 C F CF CF方向上的架构仅由邻近单元值 p F p_F pF p C p_C pC给出
∇ p f ⋅ e C F = ∇ p f ‾ ⋅ e C F + [ p F − p C d C F − ( ∇ p f ‾ ⋅ e C F ) ] e C F ⋅ e C F = p F − p C d C F \begin{aligned} \nabla p_f \cdot \bold e_{CF}&=\overline{\nabla p_f} \cdot \bold e_{CF}+ \left[\frac{p_F-p_C}{d_{CF}}-(\overline{\nabla p_f}\cdot\bold e_{CF})\right]\bold e_{CF} \cdot \bold e_{CF}\\ &=\frac{p_F-p_C}{d_{CF}} \end{aligned} pfeCF=pfeCF+[dCFpFpC(pfeCF)]eCFeCF=dCFpFpC
由于面速度是与其邻近连续单元(而非交替单元)的压力密切相关的,所以棋盘型变量场将会被算法很好地感知,即便在同位网格上也不会出现不符合物理意义的棋盘场了。

5 一般推导

在继续讲解多维同位网格上的压力修正方程之前,首先讲解多维动量方程的离散。

5.1 动量方程离散

将动量方程
∂ ∂ t ( ρ v ) + ∇ ⋅ ( ρ v v ) = − ∇ p + ∇ ⋅ { μ [ ∇ v + ( ∇ v ) T ] } + f b \frac{\partial}{\partial t}(\rho \bold v)+\nabla\cdot(\rho\bold v\bold v)= -\nabla p+\nabla\cdot\left\{ \mu\left[ \nabla\bold v+(\nabla\bold v)^\text{T} \right] \right\} + \bold f_b t(ρv)+(ρvv)=p+{μ[v+(v)T]}+fb
略作修改,写为下述形式
∂ ∂ t ( ρ v ) ‾ + ∇ ⋅ ( ρ v v ) ‾ = − ∇ p + ∇ ⋅ ( μ ∇ v ) ‾ + ∇ ⋅ [ μ ( ∇ v ) T ] + f b \underline{\frac{\partial}{\partial t}(\rho \bold v)}+\underline{\nabla\cdot(\rho\bold v\bold v)}= -\nabla p+\underline{\nabla\cdot (\mu \nabla\bold v)}+\nabla\cdot [\mu(\nabla\bold v)^\text{T}] + \bold f_b t(ρv)+(ρvv)=p+(μv)+[μ(v)T]+fb
上式的离散形式将在时间区间 [ t − Δ t / 2 , t + Δ t / 2 ] [t-\Delta t/2, t+\Delta t/2] [tΔt/2,t+Δt/2]和单元 C C C上寻找,如下图所示。

在这里插入图片描述

上式中,三个用下划线标记的项,从左到右分别是非定常项、对流项和扩散项。这些项的离散在前面章节已经讲过了。剩下的那些项将显式估算并作为源项来对待。对于剪切应力项的第二项的体积分将使用散度定理转化为面积分,并写成面通量加和的形式,即
∫ V C ∇ ⋅ [ μ ( ∇ v ) T ] d V = ∫ ∂ V C [ μ ( ∇ v ) T ] ⋅ d S = ∑ f ∼ n b ( C ) μ ( ∇ v ) T ⋅ S f \int_{V_C}\nabla\cdot [\mu(\nabla\bold v)^\text{T}] dV=\int_{\partial V_C}[\mu(\nabla\bold v)^\text{T}]\cdot d\bold S= \sum_{f\sim nb(C)}\mu(\nabla\bold v)^\text{T}\cdot \bold S_f VC[μ(v)T]dV=VC[μ(v)T]dS=fnb(C)μ(v)TSf
其中 ( ∇ v ) T ⋅ S f (\nabla\bold v)^\text{T}\cdot \bold S_f (v)TSf在三维坐标系统中的展开形式为
( ∇ v ) T ⋅ S f = [ ∂ u ∂ x S f x + ∂ u ∂ y S f y + ∂ u ∂ z S f z ∂ v ∂ x S f x + ∂ v ∂ y S f y + ∂ v ∂ z S f z ∂ w ∂ x S f x + ∂ w ∂ y S f y + ∂ w ∂ z S f z ] (\nabla\bold v)^\text{T}\cdot \bold S_f= \begin{bmatrix} \dfrac{\partial u}{\partial x}S_f^x+\dfrac{\partial u}{\partial y}S_f^y+\dfrac{\partial u}{\partial z}S_f^z \\ \dfrac{\partial v}{\partial x}S_f^x+\dfrac{\partial v}{\partial y}S_f^y+\dfrac{\partial v}{\partial z}S_f^z \\ \dfrac{\partial w}{\partial x}S_f^x+\dfrac{\partial w}{\partial y}S_f^y+\dfrac{\partial w}{\partial z}S_f^z \\ \end{bmatrix} (v)TSf=xuSfx+yuSfy+zuSfzxvSfx+yvSfy+zvSfzxwSfx+ywSfy+zwSfz
压力梯度的体积分也同样作为源项处理并显式估算,即
∫ V C ∇ p d V = ( ∇ p ) C V C \int_{V_C} \nabla p dV=(\nabla p)_C V_C VCpdV=(p)CVC
或者转化成面积分来处理,即
∫ V C ∇ p d V = ∫ ∂ V C p d S = ∑ f ∼ n b ( C ) p f S f \int_{V_C} \nabla p dV=\int_{\partial V_C}p d\bold S=\sum_{f\sim nb(C)}p_f\bold S_f VCpdV=VCpdS=fnb(C)pfSf
体积力项直接在控制体上积分,得
∫ V C f b d V = ( f b ) C V C \int_{V_C} \bold f_b dV= (\bold f_b)_C V_C VCfbdV=(fb)CVC
使用一阶Euler格式来离散非定常项,使用高分辨率格式来离散对流项并通过延迟修正方法来将其实现,至于扩散通量,则将其分解为与网格平齐的隐式部分和显式的交叉扩散部分,这样的离散动量方程写成矢量形式为
a C v v C + ∑ F ∼ N B ( C ) a F v v F = b C v a_C^{\bold v}\bold v_C+\sum_{F\sim NB(C)}a_F^{\bold v}\bold v_F=\bold b_C^{\bold v} aCvvC+FNB(C)aFvvF=bCv
其中的系数为
a C v = F l u x C C + ∑ f ∼ n b ( C ) F l u x C f a F v = F l u x F f b C v = − F l u x V C − ∑ f ∼ n b ( C ) F l u x V f + ∑ f ∼ n b ( C ) μ f ( ∇ v ) f T ⋅ S f ⏟ f r o m   t h e   2 n d   p a r t   o f   t h e   s h e a r   s t r e s s   t e r m − ( ∇ p ) C V C ⏟ f r o m   t h e p r e s s u r e   g r a d i e n t \begin{aligned} a_C^{\bold v} &= FluxC_C+\sum_{f\sim nb(C)}FluxC_f \\ a_F^{\bold v} &= FluxF_f \\ \bold b_C^{\bold v} &= -FluxV_C-\sum_{f\sim nb(C)} FluxV_f \\ &+ \underbrace{\sum_{f\sim nb(C)}\mu_f(\nabla\bold v)_f^\text{T}\cdot \bold S_f} _{\footnotesize{\begin{matrix}from~the~2nd~part~of\\~the~shear~stress~term\end{matrix}}} - \underbrace{(\nabla p)_C V_C}_ {\footnotesize{\begin{matrix}from~the\\pressure~gradient\end{matrix}}} \end{aligned} aCvaFvbCv=FluxCC+fnb(C)FluxCf=FluxFf=FluxVCfnb(C)FluxVf+from the 2nd part of the shear stress term fnb(C)μf(v)fTSffrom thepressure gradient (p)CVC
其中的面通量用下式计算
F l u x C f = ∣ ∣ m ˙ f , 0 ∣ ∣ ⏟ c o n v e c t i o n c o n t r i b u t i o n + μ f E f d C F ⏟ d i f f u s i o n c o n t r i b u t i o n F l u x F f = − ∣ ∣ − m ˙ f , 0 ∣ ∣ ⏟ c o n v e c t i o n c o n t r i b u t i o n − μ f E f d C F ⏟ d i f f u s i o n c o n t r i b u t i o n F l u x V f = − μ f ( ∇ v ) f ⋅ T f ⏟ c r o s s   d i f f u s i o n c o n t r i b u t i o n + m ˙ f ( v f H R − v f U ) ⏟ h i g h   r e s o l u t i o n c o n v e c t i o n   s c h e m e c o n t r i b u t i o n \begin{aligned} FluxC_f &= \underbrace{||\dot m_f, 0||}_{\footnotesize{\begin{matrix}convection \\ contribution\end{matrix}}} + \underbrace{\mu_f \frac{E_f}{d_{CF}}}_{\footnotesize{\begin{matrix}diffusion\\contribution\end{matrix}}} \\ FluxF_f &= -\underbrace{||-\dot m_f, 0||}_{\footnotesize{\begin{matrix}convection \\ contribution\end{matrix}}} - \underbrace{\mu_f \frac{E_f}{d_{CF}}}_{\footnotesize{\begin{matrix}diffusion\\contribution\end{matrix}}} \\ FluxV_f &= \underbrace{-\mu_f(\nabla\bold v)_f\cdot \bold T_f}_{\footnotesize{\begin{matrix}cross~diffusion\\contribution\end{matrix}}} + \underbrace{\dot m_f(\bold v_f^{HR}-\bold v_f^U)}_{\footnotesize{\begin{matrix}high~resolution\\convection~scheme\\contribution\end{matrix}}} \end{aligned} FluxCfFluxFfFluxVf=convectioncontribution m˙f,0+diffusioncontribution μfdCFEf=convectioncontribution m˙f,0diffusioncontribution μfdCFEf=cross diffusioncontribution μf(v)fTf+high resolutionconvection schemecontribution m˙f(vfHRvfU)
单元通量则用下式计算
F l u x C C = ρ C V C Δ t F l u x V C = − ρ C ∘ V C Δ t v C ∘ ⏟ t r a n s i e n t c o n t r i b u t i o n − ( f b ) C V C ⏟ s o u r c e   t e r m c o n t r i b u t i o n \begin{aligned} FluxC_C &= \frac{\rho_C V_C}{\Delta t} \\ FluxV_C &= \underbrace{-\frac{\rho_C^\circ V_C}{\Delta t}\bold v_C^\circ}_ {\footnotesize{\begin{matrix}transient \\ contribution\end{matrix}}}- \underbrace{(\bold f_b)_C V_C}_{\footnotesize{\begin{matrix}source~term\\contribution\end{matrix}}} \end{aligned} FluxCCFluxVC=ΔtρCVC=transientcontribution ΔtρCVCvCsource termcontribution (fb)CVC
尽管动量方程的离散代数方程是线性的,然而其系数是依赖于速度和压力场的。该非线性是要通过迭代过程来处理的,即,在每次迭代开始时,系数是基于前次迭代所获得的因变量的值而计算的。这些系数值的变化会引起 v \bold v v的巨大变化,从而影响收敛速率,甚至会导致发散。为了减慢变化,可应用欠松弛方法,尤其是所用的瞬态时间步长较大时。将欠松弛因子定义为 λ v \lambda^{\bold v} λv,并采用Patankar隐式欠松弛手法,则欠松弛动量方程可写为
a C v λ v v C + ∑ F ∼ N B ( C ) a F v v F = b C v + 1 − λ v λ v a C v v C ( n ) \frac{a_C^{\bold v}}{\lambda^{\bold v}}\bold v_C+\sum_{F\sim NB(C)}a_F^{\bold v}\bold v_F=\bold b_C^{\bold v}+ \frac{1-\lambda^{\bold v}}{\lambda^{\bold v}}a_C^{\bold v}\bold v_C^{(n)} λvaCvvC+FNB(C)aFvvF=bCv+λv1λvaCvvC(n)
通过重新定义 a C v a_C^{\bold v} aCv b C v b_C^{\bold v} bCv,即
a C v ← a C v λ v b C v ← b C v + 1 − λ v λ v a C v v C ( n ) \begin{aligned} a_C^{\bold v} &\leftarrow \frac{a_C^{\bold v}}{\lambda^{\bold v}} \\ \bold b_C^{\bold v} &\leftarrow \bold b_C^{\bold v}+ \frac{1-\lambda^{\bold v}}{\lambda^{\bold v}}a_C^{\bold v}\bold v_C^{(n)} \end{aligned} aCvbCvλvaCvbCv+λv1λvaCvvC(n)
欠松弛动量方程可重新写为其原来的样子
a C v v C + ∑ F ∼ N B ( C ) a F v v F = b C v a_C^{\bold v}\bold v_C+\sum_{F\sim NB(C)}a_F^{\bold v}\bold v_F=\bold b_C^{\bold v} aCvvC+FNB(C)aFvvF=bCv
为了推导出同位网格上的压力修正方程,将压力梯度从源项 b C v \bold b_C^{\bold v} bCv中剥离出来,并显式计算,即
b C v = − V C ( ∇ p ) C + b ^ C v \bold b_C^{\bold v}=-V_C(\nabla p)_C+\hat{\bold b}_C^{\bold v} bCv=VC(p)C+b^Cv
于是,动量方程最终变成了下式
v C + ∑ F ∼ N B ( C ) a F v a C v v F = − V C a C v ( ∇ p ) C + b ^ C v a C v \bold v_C+\sum_{F\sim NB(C)}\frac{a_F^{\bold v}}{a_C^{\bold v}}\bold v_F= -\frac{V_C}{a_C^{\bold v}}(\nabla p)_C+\frac{\hat{\bold b}_C^{\bold v}}{a_C^{\bold v}} vC+FNB(C)aCvaFvvF=aCvVC(p)C+aCvb^Cv
定义如下矢量算子
H C [ v ] = ∑ F ∼ N B ( C ) a F v a C v v F B C v = b ^ C v a C v D C v = V C a C v \begin{aligned} \bold H_C[\bold v] &= \sum_{F\sim NB(C)}\frac{a_F^{\bold v}}{a_C^{\bold v}}\bold v_F \\ \bold B_C^{\bold v} &= \frac{\hat{\bold b}_C^{\bold v}}{a_C^{\bold v}} \\ \bold D_C^{\bold v} &= \frac{V_C}{a_C^{\bold v}} \end{aligned} HC[v]BCvDCv=FNB(C)aCvaFvvF=aCvb^Cv=aCvVC
动量方程整理为
v C + H C [ v ] = − D C v ( ∇ p ) C + B C v \bold v_C+\bold H_C[\bold v] = -\bold D_C^{\bold v}(\nabla p)_C + \bold B_C^{\bold v} vC+HC[v]=DCv(p)C+BCv
该形式将用于后续的推导中。

5.2 同位网格上的压力修正方程

与交错网格的时候一样,最开始用猜测值或者前次迭代值 ( v ( n ) , m ˙ ( n ) , p ( n ) ) (\bold v^{(n)},\dot m^{(n)},p^{(n)}) (v(n),m˙(n),p(n)),求解动量方程(上节最后推出的式子)
v C + H C [ v ] = − D C v ( ∇ p ) C + B C v \bold v_C+\bold H_C[\bold v] = -\bold D_C^{\bold v}(\nabla p)_C + \bold B_C^{\bold v} vC+HC[v]=DCv(p)C+BCv
来获得满足动量方程的速度场 v ∗ \bold v^* v,这样所得解满足
v C ∗ + H C [ v ∗ ] = − D C v ( ∇ p ( n ) ) C + B C v \bold v_C^*+\bold H_C[\bold v^*] = -\bold D_C^{\bold v}(\nabla p^{(n)})_C + \bold B_C^{\bold v} vC+HC[v]=DCv(p(n))C+BCv
最终的解是要满足上上式的,那么这两个方程(上式和上上式)的差别在于,满足上上式的速度场既满足动量方程又满足连续方程,而满足上式的速度场则只满足动量方程而未必满足连续方程,因为上式做了线性化处理,其计算系数和压力梯度项所用的压力和速度是基于前次迭代的值。因此,需要对速度、压力、质量流量场进行修正,以使它们满足质量守恒。将这些修正量用 ( v ′ , p ′ , m ˙ ′ ) (\bold v',p',\dot m') (v,p,m˙)表示,则精确解和计算值之间的关系可写为
v = v ∗ + v ′ p = p ( n ) + p ′ m ˙ = m ˙ ∗ + m ˙ ′ \begin{aligned} \bold v &= \bold v^* + \bold v' \\ p &= p^{(n)} + p' \\ \dot m &= \dot m^* + \dot m' \end{aligned} vpm˙=v+v=p(n)+p=m˙+m˙
将质量流量的修正方程代入到连续方程中,得
∑ f ∼ n b ( C ) m ˙ f ′ = − ∑ f ∼ n b ( C ) m ˙ f ∗ m ˙ f ∗ = ρ f v f ∗ ⋅ S f \sum_{f\sim nb(C)}\dot m_f' = -\sum_{f\sim nb(C)} \dot m_f^* \quad\quad \dot m_f^* = \rho_f \bold v_f^* \cdot \bold S_f fnb(C)m˙f=fnb(C)m˙fm˙f=ρfvfSf
速度 v f ∗ \bold v_f^* vf使用Rhie-Chow插值计算,即
v f ∗ = v f ∗ ‾ − D f v ‾ ( ∇ p f ( n ) − ∇ p f ( n ) ‾ ) \bold v_f^* = \overline{\bold v_f^*}-\overline{\bold D_f^{\bold v}}( \nabla p_f^{(n)}-\overline{\nabla p_f^{(n)}} ) vf=vfDfv(pf(n)pf(n))
当算得的质量流量场满足守恒时, ∑ f ∼ n b ( C ) m ˙ f ′ = − ∑ f ∼ n b ( C ) m ˙ f ∗ \sum_{f\sim nb(C)}\dot m_f' = -\sum_{f\sim nb(C)} \dot m_f^* fnb(C)m˙f=fnb(C)m˙f的右端项为零,表明无需修正流场。另一方面,若速度场不正确的话将会产生不平衡的质量流量,并使得该式右端项非零,表明需要修正流场以使其满足质量守恒条件。

质量流量修正项可写成速度修正项的形式,先用精确解的动量方程 v C + H C [ v ] = − D C v ( ∇ p ) C + B C v \bold v_C+\bold H_C[\bold v] = -\bold D_C^{\bold v}(\nabla p)_C + \bold B_C^{\bold v} vC+HC[v]=DCv(p)C+BCv减去计算值的动量方程 v C ∗ + H C [ v ∗ ] = − D C v ( ∇ p ( n ) ) C + B C v \bold v_C^*+\bold H_C[\bold v^*] = -\bold D_C^{\bold v}(\nabla p^{(n)})_C + \bold B_C^{\bold v} vC+HC[v]=DCv(p(n))C+BCv,即可
v C ′ + H C [ v ′ ] = − D C v ( ∇ p ′ ) C \bold v_C'+\bold H_C[\bold v'] = -\bold D_C^{\bold v}(\nabla p')_C vC+HC[v]=DCv(p)C
同样也可推导出 F F F单元的速度修正值动量方程
v F ′ + H F [ v ′ ] = − D F v ( ∇ p ′ ) F \bold v_F'+\bold H_F[\bold v'] = -\bold D_F^{\bold v}(\nabla p')_F vF+HF[v]=DFv(p)F
单元面上的质量流量修正可写为
m ˙ f ′ = ρ f v f ′ ⋅ S f \dot m_f'=\rho_f \bold v_f' \cdot \bold S_f m˙f=ρfvfSf
其中面速度修正是由 v f = v f ‾ − D f v ‾ ( ∇ p f − ∇ p f ‾ ) \bold v_f = \overline{\bold v_f}-\overline{\bold D_f^{\bold v}}( \nabla p_f-\overline{\nabla p_f} ) vf=vfDfv(pfpf)减去 v f ∗ = v f ∗ ‾ − D f v ‾ ( ∇ p f ( n ) − ∇ p f ( n ) ‾ ) \bold v_f^*=\overline{\bold v_f^*}-\overline{\bold D_f^{\bold v}}( \nabla p_f^{(n)}-\overline{\nabla p_f^{(n)}}) vf=vfDfv(pf(n)pf(n))而得到的
v f ′ = v f ′ ‾ − D f v ‾ ( ( ∇ p ′ ) f − ∇ p f ′ ‾ ) \bold v_f' = \overline{\bold v_f'}-\overline{\bold D_f^{\bold v}}( (\nabla p')_f-\overline{\nabla p_f'}) vf=vfDfv((p)fpf)
把上式和上上式代入到连续方程 ∑ f ∼ n b ( C ) m ˙ f ′ = − ∑ f ∼ n b ( C ) m ˙ f ∗ \sum_{f\sim nb(C)}\dot m_f' = -\sum_{f\sim nb(C)} \dot m_f^* fnb(C)m˙f=fnb(C)m˙f中,推导出如下的压力修正方程
∑ f ∼ n b ( C ) ( ρ f v f ′ ‾ ⋅ S f ) + ∑ f ∼ n b ( C ) ( ρ f D f v ‾   ∇ p f ′ ‾ ⋅ S f ) ‾ − ∑ f ∼ n b ( C ) ( ρ f D f v ‾ ( ∇ p ′ ) f ⋅ S f ) = − ∑ f ∼ n b ( C ) m ˙ f ∗ \begin{aligned} \underline{ \sum_{f\sim nb(C)}\left(\rho_f \overline{\bold v_f'} \cdot \bold S_f \right) +\sum_{f\sim nb(C)}\left(\rho_f \overline{\bold D_f^{\bold v}}~\overline{\nabla p_f'} \cdot \bold S_f\right) } -\sum_{f\sim nb(C)}\left(\rho_f \overline{\bold D_f^{\bold v}} (\nabla p')_f \cdot \bold S_f\right) \\ = -\sum_{f\sim nb(C)} \dot m_f^* \end{aligned} fnb(C)(ρfvfSf)+fnb(C)(ρfDfv pfSf)fnb(C)(ρfDfv(p)fSf)=fnb(C)m˙f
在该方程中,下划线部分代表了邻近速度对于所考虑单元的速度修正的影响。为更清晰地理解该影响,可通过将前面的单元速度修正方程式 v C ′ + H C [ v ′ ] = − D C v ( ∇ p ′ ) C \bold v_C'+\bold H_C[\bold v'] = -\bold D_C^{\bold v}(\nabla p')_C vC+HC[v]=DCv(p)C和式 v F ′ + H F [ v ′ ] = − D F v ( ∇ p ′ ) F \bold v_F'+\bold H_F[\bold v'] = -\bold D_F^{\bold v}(\nabla p')_F vF+HF[v]=DFv(p)F两者插值到面上去,推出上式下划线部分的如下的等效表达式。
v f ′ ‾ + H f ‾ [ v ′ ] = − D f v ‾   ( ∇ p ′ ) f ‾ ⇒ v f ′ ‾ + D f v ‾   ( ∇ p ′ ) f ‾ = − H f ‾ [ v ′ ] \begin{aligned} & \overline{\bold v_f'}+\overline{\bold H_f}[\bold v'] = -\overline{\bold D_f^{\bold v}}~\overline{({\nabla p'})_f} \\ \Rightarrow & \overline{\bold v_f'}+\overline{\bold D_f^{\bold v}}~\overline{({\nabla p'})_f}=-\overline{\bold H_f}[\bold v'] \end{aligned} vf+Hf[v]=Dfv (p)fvf+Dfv (p)f=Hf[v]
将上式代入到上上式中,得
∑ f ∼ n b ( C ) ( − ρ f D f v ‾ ( ∇ p ′ ) f ⋅ S f ) = − ∑ f ∼ n b ( C ) m ˙ f ∗ + ∑ f ∼ n b ( C ) ( ρ f H f ‾ [ v ′ ] ⋅ S f ) ‾ \sum_{f\sim nb(C)}\left(-\rho_f \overline{\bold D_f^{\bold v}} (\nabla p')_f \cdot \bold S_f\right) = -\sum_{f\sim nb(C)} \dot m_f^*+ \underline{\sum_{f\sim nb(C)}\left(\rho_f \overline{\bold H_f}[\bold v'] \cdot \bold S_f\right) } fnb(C)(ρfDfv(p)fSf)=fnb(C)m˙f+fnb(C)(ρfHf[v]Sf)
或者写成更加显式的形式
∑ f ∼ n b ( C ) ( − ρ f D f v ‾ ( ∇ p ′ ) f ⋅ S f ) = − ∑ f ∼ n b ( C ) m ˙ f ∗ + ∑ f ∼ n b ( C ) ( ρ f ( ∑ F ∼ N B ( C ) a F v a C v v F ′ ‾ ) ⋅ S f ) ‾ \sum_{f\sim nb(C)}\left(-\rho_f \overline{\bold D_f^{\bold v}} (\nabla p')_f \cdot \bold S_f\right) = -\sum_{f\sim nb(C)} \dot m_f^*+ \underline{\sum_{f\sim nb(C)}\left(\rho_f \left(\overline{\sum_{F\sim NB(C)}\frac{a_F^{\bold v}}{a_C^{\bold v}}\bold v'_F} \right) \cdot \bold S_f\right) }\\ fnb(C)(ρfDfv(p)fSf)=fnb(C)m˙f+fnb(C)ρfFNB(C)aCvaFvvFSf
在上式或上上式中,对于下划线部分的处理至关重要,其决定着方程可解与否。在最初的SIMPLE算法中,是直接把该项忽略掉的,即,认为在某点处的速度修正是只跟压力相关,而跟周围的速度毫不相干。由于这只是个修正方程,所以对其中的某些项作以修改甚至是直接扔掉也不会影响到最终的解,因为在收敛情况下修正会变成零的(可以这么来理解,对于某点速度(压力)的修正,一方面来自于压力,一方面来自于邻近速度,那么如果认为周围速度的影响是零(如果收敛的话的确如此),只考虑压力的影响,相当于只考虑了部分修正,一样可以到达最终的收敛状态(此时压力和邻近速度的影响都是零了))。这么个近似虽然对最终收敛解没有影响,但是它会影响到收敛的速度哈,因为在每步迭代中,忽略的项越大,那么带来的近似误差就越高了。

上式和上上式中,剩余项的处理就很简单了,压力修正方程的系数,是按照第8章中所讲的扩散项的离散方法来获得的,具体来说,是非各向同性(各向异性)扩散的处理方法。

可以把左端项修改成梯度点积形式
( D f v ‾ ( ∇ p ′ ) f ) ⋅ S f = ( ( ∇ p ′ ) f D f v ‾ T ) ⋅ S f = ( ∇ p ′ ) f ⋅ ( D f v ‾ T S f ) = ( ∇ p ′ ) f ⋅ S f ′ \begin{aligned} \left( \overline{\bold D_f^{\bold v}} (\nabla p')_f\right) \cdot \bold S_f &= \left( (\nabla p')_f \overline{\bold D_f^{\bold v}}^T \right) \cdot \bold S_f \\ &= (\nabla p')_f \cdot \left( \overline{\bold D_f^{\bold v}}^T \bold S_f \right)\\ &= (\nabla p')_f \cdot \bold S'_f \end{aligned} (Dfv(p)f)Sf=((p)fDfvT)Sf=(p)f(DfvTSf)=(p)fSf
其中 S f ′ \bold S'_f Sf的展开形式为
S f ′ = D f v ‾ T S f = [ D f u ‾ 0 0 0 D f v ‾ 0 0 0 D f w ‾ ] [ S f x S f y S f z ] = [ D f u ‾ S f x D f v ‾ S f y D f w ‾ S f z ] \bold S'_f=\overline{\bold D_f^{\bold v}}^T \bold S_f= \begin{bmatrix} \overline{D_f^u} & 0 & 0 \\ 0 & \overline{D_f^v} & 0 \\ 0 & 0 & \overline{D_f^w} \end{bmatrix} \begin{bmatrix} S_f^x \\ S_f^y \\ S_f^z \end{bmatrix}= \begin{bmatrix} \overline{D_f^u}S_f^x \\ \overline{D_f^v}S_f^y \\ \overline{D_f^w}S_f^z \end{bmatrix} Sf=DfvTSf=Dfu000Dfv000DfwSfxSfySfz=DfuSfxDfvSfyDfwSfz
使用 S f ′ \bold S'_f Sf,压力修正梯度项的离散过程和之前一样,得到
( ∇ p ′ ) f ⋅ S f ′ = ( ∇ p ′ ) f ⋅ E f + ( ∇ p ′ ) f ⋅ T f = E f d C F ( p F ′ − p C ′ ) + ( ∇ p ′ ) f ⋅ T f ‾ \begin{aligned} (\nabla p')_f \cdot \bold S'_f &= (\nabla p')_f \cdot \bold E_f + (\nabla p')_f \cdot \bold T_f \\ &= \frac{E_f}{d_{CF}}(p'_F-p'_C)+\underline{ (\nabla p')_f\cdot\bold T_f} \end{aligned} (p)fSf=(p)fEf+(p)fTf=dCFEf(pFpC)+(p)fTf
其中用到了对 S f ′ \bold S'_f Sf如下分解
S f ′ = E f + T f \bold S'_f=\bold E_f+\bold T_f Sf=Ef+Tf
分解的类型在第8章中已经讲过(三种类型:最小修正、正交修正、过松弛修正方法)。下划线项是由网格非正交特性所引起的,可以选择忽略或保留。如果忽略,其不会影响最终解,因为这只是修正项。如果保留,其将会在内循环中显式处理(OpenFOAM中的非正交循环)。由于每次迭代的求解都是从零压力修正场开始的,在求解方程时该项需要迭代更新。

忽略掉非正交项的作用,压力修正方程的线性化形式为
( ∇ p ′ ) f ⋅ S f ′ = E f d C F ( p F ′ − p C ′ ) = D f ( p F ′ − p C ′ ) \begin{aligned} (\nabla p')_f \cdot \bold S'_f &= \frac{E_f}{d_{CF}}(p'_F-p'_C) \\ &= \mathcal D_f(p'_F-p'_C) \end{aligned} (p)fSf=dCFEf(pFpC)=Df(pFpC)
代回到压力修正方程 ∑ f ∼ n b ( C ) ( − ρ f D f v ‾ ( ∇ p ′ ) f ⋅ S f ) = − ∑ f ∼ n b ( C ) m ˙ f ∗ + ∑ f ∼ n b ( C ) ( ρ f H f ‾ [ v ′ ] ⋅ S f ) ‾ \displaystyle\sum_{f\sim nb(C)}\left(-\rho_f \overline{\bold D_f^{\bold v}} (\nabla p')_f \cdot \bold S_f\right) = -\sum_{f\sim nb(C)} \dot m_f^*+\underline{\sum_{f\sim nb(C)}\left(\rho_f \overline{\bold H_f}[\bold v'] \cdot \bold S_f\right) } fnb(C)(ρfDfv(p)fSf)=fnb(C)m˙f+fnb(C)(ρfHf[v]Sf)中,可得其离散代数形式
a C p ′ p C ′ + ∑ F ∼ N B ( C ) a F p ′ p F ′ = b C p ′ a_C^{p'}p'_C+\sum_{F\sim NB(C)}a_F^{p'}p'_F=b_C^{p'} aCppC+FNB(C)aFppF=bCp
其中的系数为
a F p ′ = F l u x F f = − ρ f D f a C p ′ = − ∑ f ∼ n b ( c ) F l u x F f = − ∑ F ∼ N B ( C ) a F p ′ b C p ′ = − ∑ f ∼ n b ( C ) F l u x V f + ∑ f ∼ n b ( C ) ( ρ f H f ‾ [ v ′ ] ⋅ S f ) ‾ = − ∑ f ∼ n b ( C ) m ˙ f ∗ + ∑ f ∼ n b ( C ) ( ρ f H f ‾ [ v ′ ] ⋅ S f ) ‾ \begin{aligned} a_F^{p'} &= FluxF_f = -\rho_f \mathcal D_f \\ a_C^{p'} &= -\sum_{f\sim nb(c)}FluxF_f=-\sum_{F\sim NB(C)}a_F^{p'} \\ b_C^{p'} &= -\sum_{f\sim nb(C)} FluxV_f+\underline{\sum_{f\sim nb(C)}\left(\rho_f \overline{\bold H_f}[\bold v'] \cdot \bold S_f\right) } \\ &= -\sum_{f\sim nb(C)} \dot m_f^*+\underline{\sum_{f\sim nb(C)}\left(\rho_f \overline{\bold H_f}[\bold v'] \cdot \bold S_f\right) } \end{aligned} aFpaCpbCp=FluxFf=ρfDf=fnb(c)FluxFf=FNB(C)aFp=fnb(C)FluxVf+fnb(C)(ρfHf[v]Sf)=fnb(C)m˙f+fnb(C)(ρfHf[v]Sf)
注意,对下划线项的不同近似将产生不同的算法,在最初的SIMPLE算法中是把这些项直接给刨掉了。

最后,上式中的质量流量 m ˙ f ∗ \dot m_f^* m˙f,是在求解完动量方程之后,基于最新的速度场(动量方程求得的速度场),采用惯常的Rhie-Chow插值技术算出的,即
m ˙ f ∗ = ρ f v f ∗ ⋅ S f = ρ f v f ∗ ‾ ⋅ S f − ρ f D f v ‾ ( ∇ p f ( n ) − ∇ p f ( n ) ‾ ) ⋅ S f \dot m_f^* = \rho_f \bold v_f^* \cdot \bold S_f = \rho_f \overline{\bold v_f^*} \cdot \bold S_f - \rho_f\overline{\bold D_f^{\bold v}}\left( \nabla p_f^{(n)}-\overline{\nabla p_f^{(n)}} \right) \cdot \bold S_f m˙f=ρfvfSf=ρfvfSfρfDfv(pf(n)pf(n))Sf
基于算得的压力和速度修正场,单元形心处的压力和速度 以及 单元面处的质量流量都可以修正了。如前所述,在上上式中,下划线项在SIMPLE算法中的忽略处理 会 产生较大的压力修正值,其会减慢收敛速度或是造成发散。为了增加健壮性和提高收敛性,上上式所获得的压力修正值可做显式松弛处理。而更新速度场和质量流量场则无需欠松弛处理,因为压力修正是要来保证速度场与质量流量场的质量守恒的(如果再做欠松弛的话,就无法保证守恒特性了)。把欠松弛因子定义为 λ p \lambda^p λp,使用如下修正方程
v C ∗ ∗ = v C ∗ + v C ′ v C ′ = − D C v ( ∇ p ′ ) C m ˙ f ∗ ∗ = m ˙ f ∗ + m ˙ f ′ m ˙ f ′ = − ρ f D f v ‾ ∇ p f ′ ⋅ S f p C ∗ = p C ( n ) + λ p p C ′ \begin{aligned} \bold v_C^{**} &= \bold v_C^* + \bold v'_C & \bold v'_C &= -\bold D_C^{\bold v}(\nabla p')_C \\ \dot m_f^{**} &= \dot m_f^* + \dot m'_f & \dot m'_f &= -\rho_f \overline{\bold D_f^{\bold v}}\nabla p'_f \cdot \bold S_f \\ p_C^* &= p_C^{(n)}+\lambda^p p'_C \end{aligned} vCm˙fpC=vC+vC=m˙f+m˙f=pC(n)+λppCvCm˙f=DCv(p)C=ρfDfvpfSf

5.3 D f \mathcal{D}_f Df项的计算

上一小节讲到 S f ′ = E f + T f \bold S'_f=\bold E_f+\bold T_f Sf=Ef+Tf的分解方法可以是第8章中讲到的任何一个,那么不同的分解方法会产生不同的 D f \mathcal{D}_f Df表达式,如下。

5.3.1 最小修正方法 Minimum Correction Approach

该方法中, E f \bold E_f Ef T f \bold T_f Tf正交,从而使得修正量最小,即
E f = ( e C F ⋅ S f ′ ) e C F \bold E_f=(\bold e_{CF}\cdot \bold S'_f)\bold e_{CF} Ef=(eCFSf)eCF
其中 e C F \bold e_{CF} eCF C F CF CF方向的单位矢量,结合上节 S f ′ \bold S'_f Sf的表达式 S f ′ = [ D f u ‾ S f x D f v ‾ S f y D f w ‾ S f z ] T \bold S'_f=\begin{bmatrix}\overline{D_f^u}S_f^x & \overline{D_f^v}S_f^y & \overline{D_f^w}S_f^z\end{bmatrix}^T Sf=[DfuSfxDfvSfyDfwSfz]T,算得 E f \bold E_f Ef
E f = d C F x D f u ‾ S f x + d C F y D f v ‾ S f y + d C F z D f w ‾ S f z d C F 2 d C F \bold E_f=\frac{d_{CF}^x\overline{D_f^u}S_f^x+d_{CF}^y\overline{D_f^v}S_f^y+d_{CF}^z\overline{D_f^w}S_f^z}{d_{CF}^2}\bold d_{CF} Ef=dCF2dCFxDfuSfx+dCFyDfvSfy+dCFzDfwSfzdCF
使用上式,推得 D f \mathcal{D}_f Df的表达式为
D f = E f d C F = d C F x D f u ‾ S f x + d C F y D f v ‾ S f y + d C F z D f w ‾ S f z ( d C F x ) 2 + ( d C F y ) 2 + ( d C F z ) 2 \mathcal{D}_f=\frac{E_f}{d_{CF}}=\frac{d_{CF}^x\overline{D_f^u}S_f^x+d_{CF}^y\overline{D_f^v}S_f^y+d_{CF}^z\overline{D_f^w}S_f^z} {(d_{CF}^x)^2+(d_{CF}^y)^2+(d_{CF}^z)^2} Df=dCFEf=(dCFx)2+(dCFy)2+(dCFz)2dCFxDfuSfx+dCFyDfvSfy+dCFzDfwSfz

5.3.2 正交修正方法 Orthogonal Correction Approach

这个修正方法是让 E f \bold E_f Ef S f ′ \bold S'_f Sf的幅值相同,即
E f = S f ′ e C F \bold E_f=\bold S'_f \bold e_{CF} Ef=SfeCF
这样一来, D f \mathcal{D}_f Df的表达式为
D f = E f d C F = ( D f u ‾ S f x ) 2 + ( D f v ‾ S f y ) 2 + ( D f w ‾ S f z ) 2 ( d C F x ) 2 + ( d C F y ) 2 + ( d C F z ) 2 \mathcal{D}_f=\frac{E_f}{d_{CF}}= \sqrt{\frac{(\overline{D_f^u}S_f^x)^2+(\overline{D_f^v}S_f^y)^2+(\overline{D_f^w}S_f^z)^2} {(d_{CF}^x)^2+(d_{CF}^y)^2+(d_{CF}^z)^2}} Df=dCFEf=(dCFx)2+(dCFy)2+(dCFz)2(DfuSfx)2+(DfvSfy)2+(DfwSfz)2

5.3.3 过松弛方法 Over-Relaxed Approach

这个方法是让 T f \bold T_f Tf和和 S f ′ \bold S'_f Sf垂直,那么 E f \bold E_f Ef
E f = S f ′ ⋅ S f ′ d C F ⋅ S f ′ d C F \bold E_f = \frac{\bold S'_f \cdot \bold S'_f}{\bold d_{CF} \cdot \bold S'_f} \bold d_{CF} Ef=dCFSfSfSfdCF
推得 D f \mathcal{D}_f Df的表达式为
D f = E f d C F = ( D f u ‾ S f x ) 2 + ( D f v ‾ S f y ) 2 + ( D f w ‾ S f z ) 2 d C F x D f u ‾ S f x + d C F y D f v ‾ S f y + d C F z D f w ‾ S f z \mathcal{D}_f=\frac{E_f}{d_{CF}}= \frac{(\overline{D_f^u}S_f^x)^2+(\overline{D_f^v}S_f^y)^2+(\overline{D_f^w}S_f^z)^2} {d_{CF}^x\overline{D_f^u}S_f^x+d_{CF}^y\overline{D_f^v}S_f^y+d_{CF}^z\overline{D_f^w}S_f^z} Df=dCFEf=dCFxDfuSfx+dCFyDfvSfy+dCFzDfwSfz(DfuSfx)2+(DfvSfy)2+(DfwSfz)2
上述方法中的任何一个皆可用于计算 D f \mathcal{D}_f Df的值。

5.4 同位(网格)SIMPLE算法

将同位网格上SIMPLE算法的流程汇总如下:

  1. 为计算时刻 t + Δ t t+\Delta t t+Δt的解,用时刻 t t t的压力、速度和质量流量场 p C t p_C^{t} pCt v C t \bold v_C^{t} vCt m ˙ f t \dot m_f^{t} m˙ft作为初始猜测值 p C ( n ) p_C^{(n)} pC(n) v C ( n ) \bold v_C^{(n)} vC(n) m ˙ f ( n ) \dot m_f^{(n)} m˙f(n)
  2. 组装并求解动量方程以获得新速度场 v C ∗ \bold v_C^* vC
    v C ∗ + H C [ v ∗ ] = − D C v ( ∇ p ( n ) ) C + B C v \bold v_C^*+\bold H_C[\bold v^*] = -\bold D_C^{\bold v}(\nabla p^{(n)})_C + \bold B_C^{\bold v} vC+HC[v]=DCv(p(n))C+BCv
  3. 基于新速度场 v C ∗ \bold v_C^* vC,使用Rhie-Chow插值来更新单元面处的质量流量,算得满足动量方程的质量流量场 m ˙ f ∗ \dot m_f^* m˙f
    m ˙ f ∗ = ρ f v f ∗ ⋅ S f = ρ f v f ∗ ‾ ⋅ S f − ρ f D f v ‾ ( ∇ p f ( n ) − ∇ p f ( n ) ‾ ) ⋅ S f \dot m_f^* = \rho_f \bold v_f^* \cdot \bold S_f = \rho_f \overline{\bold v_f^*} \cdot \bold S_f - \rho_f\overline{\bold D_f^{\bold v}}\left( \nabla p_f^{(n)}-\overline{\nabla p_f^{(n)}} \right) \cdot \bold S_f m˙f=ρfvfSf=ρfvfSfρfDfv(pf(n)pf(n))Sf
  4. 使用新的质量流量 m ˙ f ∗ \dot m_f^* m˙f组装压力修正方程,并求解该方程以获得压力修正场 p C ′ p_C' pC
    a C p ′ p C ′ + ∑ F ∼ N B ( C ) a F p ′ p F ′ = b C p ′ a_C^{p'}p'_C+\sum_{F\sim NB(C)}a_F^{p'}p'_F=b_C^{p'} aCppC+FNB(C)aFppF=bCp
    其中
    a F p ′ = F l u x F f = − ρ f D f a C p ′ = − ∑ f ∼ n b ( c ) F l u x F f = − ∑ F ∼ N B ( C ) a F p ′ b C p ′ = − ∑ f ∼ n b ( C ) F l u x V f + ∑ f ∼ n b ( C ) ( ρ f H f ‾ [ v ′ ] ⋅ S f ) ‾ = − ∑ f ∼ n b ( C ) m ˙ f ∗ + ∑ f ∼ n b ( C ) ( ρ f H f ‾ [ v ′ ] ⋅ S f ) ‾ \begin{aligned} a_F^{p'} &= FluxF_f = -\rho_f \mathcal D_f \\ a_C^{p'} &= -\sum_{f\sim nb(c)}FluxF_f=-\sum_{F\sim NB(C)}a_F^{p'} \\ b_C^{p'} &= -\sum_{f\sim nb(C)} FluxV_f+\underline{\sum_{f\sim nb(C)}\left(\rho_f \overline{\bold H_f}[\bold v'] \cdot \bold S_f\right) } \\ &= -\sum_{f\sim nb(C)} \dot m_f^*+\underline{\sum_{f\sim nb(C)}\left(\rho_f \overline{\bold H_f}[\bold v'] \cdot \bold S_f\right) } \end{aligned} aFpaCpbCp=FluxFf=ρfDf=fnb(c)FluxFf=FNB(C)aFp=fnb(C)FluxVf+fnb(C)(ρfHf[v]Sf)=fnb(C)m˙f+fnb(C)(ρfHf[v]Sf)
  5. 基于压力修正场,更新单元形心处的压力和速度场,以及单元面处的质量流量场,以获得满足连续方程的场,这些场分别用 p C ∗ p_C^* pC v C ∗ ∗ \bold v_C^{**} vC m ˙ f ∗ ∗ \dot m_f^{**} m˙f表示;
    v C ∗ ∗ = v C ∗ + v C ′ v C ′ = − D C v ( ∇ p ′ ) C m ˙ f ∗ ∗ = m ˙ f ∗ + m ˙ f ′ m ˙ f ′ = − ρ f D f v ‾ ∇ p f ′ ⋅ S f p C ∗ = p C ( n ) + λ p p C ′ \begin{aligned} \bold v_C^{**} &= \bold v_C^* + \bold v'_C & \bold v'_C &= -\bold D_C^{\bold v}(\nabla p')_C \\ \dot m_f^{**} &= \dot m_f^* + \dot m'_f & \dot m'_f &= -\rho_f \overline{\bold D_f^{\bold v}}\nabla p'_f \cdot \bold S_f \\ p_C^* &= p_C^{(n)}+\lambda^p p'_C \end{aligned} vCm˙fpC=vC+vC=m˙f+m˙f=pC(n)+λppCvCm˙f=DCv(p)C=ρfDfvpfSf
  6. 将所得解作为新的初始值,返回第2步,继续该流程直到收敛;
    p C ( n ) = p C ∗ , v C ( n ) = v C ∗ ∗ , m ˙ f ( n ) = m ˙ f ∗ ∗ p_C^{(n)}=p_C^*, \quad\quad \bold v_C^{(n)}=\bold v_C^{**}, \quad\quad \dot m_f^{(n)}=\dot m_f^{**} pC(n)=pC,vC(n)=vC,m˙f(n)=m˙f
  7. 将所得收敛解作为 t + Δ t t+\Delta t t+Δt时刻的解;
    p C t + Δ t = p C ( n ) = p C ∗ , v C t + Δ t = v C ( n ) = v C ∗ ∗ , m ˙ C t + Δ t = m ˙ f ( n ) = m ˙ f ∗ ∗ p_C^{t+\Delta t}=p_C^{(n)}=p_C^*, \quad\quad \bold v_C^{t+\Delta t}=\bold v_C^{(n)}=\bold v_C^{**}, \quad\quad \dot m_C^{t+\Delta t}=\dot m_f^{(n)}=\dot m_f^{**} pCt+Δt=pC(n)=pC,vCt+Δt=vC(n)=vC,m˙Ct+Δt=m˙f(n)=m˙f
  8. 推进到下一个时间步;
    t = t + Δ t t=t+\Delta t t=t+Δt
  9. 返回第1步并重复该流程直至到达最终时间步。

其流程图为:

在这里插入图片描述

此时需要一个小例子来让算法更容易理解。


例3

如图,二维问题如下所示,给定 p W = 100 p_W=100 pW=100 p N = 20 p_N=20 pN=20 p E = 50 p_E=50 pE=50,面 s s s处的进口条件为 v s = 20 v_s=20 vs=20和零压力梯度。

流动是稳态的,且密度是均匀的,密度值为1。 u C u_C uC v C v_C vC的动量方程为(这里只是个简单的小例子,所以忽略了瞬态项、扩散项、对流项,只保留了压力梯度项)
u C = − d x ( p e − p w ) v C = − d y ( p n − p s ) \begin{aligned} u_C &= -d_x(p_e-p_w) \\ v_C &= -d_y(p_n-p_s) \end{aligned} uCvC=dx(pepw)=dy(pnps)
其中常数 d x = 1 d_x=1 dx=1 d y = 0.25 d_y=0.25 dy=0.25,单元有 Δ x = Δ y = 1 \Delta x=\Delta y=1 Δx=Δy=1。使用同位SIMPLE算法,推导压力修正方程并求解方程以找到单元 C C C的压力值。以 p C ( n ) = 70 p_C^{(n)}=70 pC(n)=70作为 C C C处压力的初始猜测值。

在这里插入图片描述


进口的零压力梯度条件可用于计算
p s = P C = P C ( n ) = 70 p_s=P_C=P_C^{(n)}=70 ps=PC=PC(n)=70
计算 u C ( n ) u_C^{(n)} uC(n) v C ( n ) v_C^{(n)} vC(n)
u C ∗ = − d x ( p e ( n ) − p w ( n ) ) = − 1 ( 60 − 85 ) = 25 v C ∗ = − d y ( p n ( n ) − p s ( n ) ) = − 0.25 ( 45 − 70 ) = 6.25 \begin{aligned} u_C^* &= -d_x(p^{(n)}_e-p^{(n)}_w)=-1(60-85)=25 \\ v_C^* &= -d_y(p^{(n)}_n-p^{(n)}_s)=-0.25(45-70)=6.25 \end{aligned} uCvC=dx(pe(n)pw(n))=1(6085)=25=dy(pn(n)ps(n))=0.25(4570)=6.25
计算中用到了 p e ( n ) = 0.5 ( p E ( n ) + p C ( n ) ) p_e^{(n)}=0.5(p_E^{(n)}+p_C^{(n)}) pe(n)=0.5(pE(n)+pC(n)) p n ( n ) = 0.5 ( p C ( n ) + p N ( n ) ) p_n^{(n)}=0.5(p_C^{(n)}+p_N^{(n)}) pn(n)=0.5(pC(n)+pN(n)) p w ( n ) = 0.5 ( p C ( n ) + p W ( n ) ) p_w^{(n)}=0.5(p_C^{(n)}+p_W^{(n)}) pw(n)=0.5(pC(n)+pW(n))

现在要构建压力修正方程,通过把质量通量和其修正代入到质量守恒方程来实现。使用Rhie-Chow插值,算得面质量通量为
m ˙ e ∗ = ρ u e ∗ Δ y = u e ∗ = u e ∗ ‾ − d x [ ( p E ( n ) − p C ( n ) ) ⏟ p r e s s u r e   d i f f e r e n c e a c r o s s   f a c e − 0.5 ( p e e ( n ) − p e ( n ) + p e ( n ) − p w ( n ) ) ] ⏟ a v e r a g e   p r e s s u r e   d i f f e r e n c e a c r o s s   f a c e = 0.5 ( u C ∗ + u E ∗ ) − d x [ ( p E ( n ) − p C ( n ) ) − 0.5 ( p e e ( n ) − p e ( n ) + p e ( n ) − p w ( n ) ) ] = − 0.5 [ d x ( p e ( n ) − p w ( n ) ) + d x ( p e e ( n ) − p e ( n ) ) ] − d x [ ( p E ( n ) − p C ( n ) ) − 0.5 ( p e e ( n ) − p e ( n ) + p e ( n ) − p w ( n ) ) ] = − d x ( p E ( n ) − p C ( n ) ) = − 1 ( 50 − 70 ) = 20 \begin{aligned} \dot m_e^* =& \rho u_e^*\Delta y=u_e^*\\ =&\overline{u_e^*}-d_x \underbrace{\left[\left(p_E^{(n)}-p_C^{(n)}\right)\right.}_{\footnotesize{\begin{matrix}pressure~difference\\across~face\end{matrix}}}- \underbrace{\left.0.5\left(p_{ee}^{(n)}-p_e^{(n)}+p_e^{(n)}-p_w^{(n)}\right)\right]}_{\footnotesize{\begin{matrix}average~pressure~difference\\across~face\end{matrix}}} \\ =& 0.5(u_C^*+u_E^*)-d_x\left[ \left(p_E^{(n)}-p_C^{(n)}\right)-0.5\left(p_{ee}^{(n)}-p_e^{(n)}+p_e^{(n)}-p_w^{(n)}\right) \right] \\ =& -0.5\left[d_x\left(p_e^{(n)}-p_w^{(n)}\right)+d_x\left(p_{ee}^{(n)}-p_e^{(n)}\right)\right]\\ &-d_x\left[ \left(p_E^{(n)}-p_C^{(n)}\right)-0.5\left(p_{ee}^{(n)}-p_e^{(n)}+p_e^{(n)}-p_w^{(n)}\right) \right] \\ =&-d_x\left(p_E^{(n)}-p_C^{(n)}\right) \\ =&-1(50-70) \\ =&20 \end{aligned} m˙e=======ρueΔy=ueuedxpressure differenceacross face [(pE(n)pC(n))average pressure differenceacross face 0.5(pee(n)pe(n)+pe(n)pw(n))]0.5(uC+uE)dx[(pE(n)pC(n))0.5(pee(n)pe(n)+pe(n)pw(n))]0.5[dx(pe(n)pw(n))+dx(pee(n)pe(n))]dx[(pE(n)pC(n))0.5(pee(n)pe(n)+pe(n)pw(n))]dx(pE(n)pC(n))1(5070)20
同样可以算得 n n n界面的质量通量
m ˙ n ∗ = ρ v n ∗ Δ x = v n ∗ = v n ∗ ‾ − d y [ ( p N ( n ) − p C ( n ) ) − 0.5 ( p n n ( n ) − p n ( n ) + p n ( n ) − p s ( n ) ) ] = 0.5 ( v C ∗ + v N ∗ ) − d y [ ( p N ( n ) − p C ( n ) ) − 0.5 ( p n n ( n ) − p n ( n ) + p n ( n ) − p s ( n ) ) ] = − 0.5 [ d y ( p n ( n ) − p s ( n ) ) + d y ( p n n ( n ) − p n ( n ) ) ] − d y [ ( p N ( n ) − p C ( n ) ) − 0.5 ( p n n ( n ) − p n ( n ) + p n ( n ) − p s ( n ) ) ] = − d y ( p N ( n ) − p C ( n ) ) = − 0.25 ( 20 − 70 ) = − 12.5 \begin{aligned} \dot m_n^* =& \rho v_n^*\Delta x=v_n^*\\ =&\overline{v_n^*}-d_y\left[ \left(p_N^{(n)}-p_C^{(n)}\right)-0.5\left(p_{nn}^{(n)}-p_{n}^{(n)}+p_n^{(n)}-p_s^{(n)}\right)\right] \\ =& 0.5(v_C^*+v_N^*)-d_y\left[ \left(p_N^{(n)}-p_C^{(n)}\right)-0.5\left(p_{nn}^{(n)}-p_{n}^{(n)}+p_n^{(n)}-p_s^{(n)}\right)\right] \\ =& -0.5\left[d_y\left(p_n^{(n)}-p_s^{(n)}\right)+d_y\left(p_{nn}^{(n)}-p_n^{(n)}\right)\right] \\ & -d_y\left[ \left(p_N^{(n)}-p_C^{(n)}\right)-0.5\left(p_{nn}^{(n)}-p_{n}^{(n)}+p_n^{(n)}-p_s^{(n)}\right)\right] \\ =& -d_y \left(p_N^{(n)}-p_C^{(n)}\right) \\ =& -0.25(20-70)\\ =&-12.5 \end{aligned} m˙n=======ρvnΔx=vnvndy[(pN(n)pC(n))0.5(pnn(n)pn(n)+pn(n)ps(n))]0.5(vC+vN)dy[(pN(n)pC(n))0.5(pnn(n)pn(n)+pn(n)ps(n))]0.5[dy(pn(n)ps(n))+dy(pnn(n)pn(n))]dy[(pN(n)pC(n))0.5(pnn(n)pn(n)+pn(n)ps(n))]dy(pN(n)pC(n))0.25(2070)12.5
还有 w w w界面的质量通量
m ˙ w ∗ = − ρ u w ∗ Δ y = − u w ∗ = − u w ∗ ‾ + d x [ ( p C ( n ) − p W ( n ) ) − 0.5 ( p w ( n ) − p w w ( n ) + p e ( n ) − p w ( n ) ) ] = − 0.5 ( u C ∗ + u W ∗ ) + d x [ ( p C ( n ) − p W ( n ) ) − 0.5 ( p w ( n ) − p w w ( n ) + p e ( n ) − p w ( n ) ) ] = − 0.5 [ − d x ( p e ( n ) − p w ( n ) ) − d x ( p w ( n ) − p w w ( n ) ) ] + d x [ ( p C ( n ) − p W ( n ) ) − 0.5 ( p w ( n ) − p w w ( n ) + p e ( n ) − p w ( n ) ) ] = d x ( p C ( n ) − p W ( n ) ) = 1 ( 70 − 100 ) = − 30 \begin{aligned} \dot m_w^* =& -\rho u_w^*\Delta y=-u_w^*\\ =&-\overline{u_w^*}+d_x\left[\left(p_C^{(n)}-p_W^{(n)}\right)-0.5\left(p_{w}^{(n)}-p_{ww}^{(n)}+p_e^{(n)}-p_w^{(n)}\right)\right] \\ = & -0.5(u_C^*+u_W^*)+d_x\left[\left(p_C^{(n)}-p_W^{(n)}\right)-0.5\left(p_{w}^{(n)}-p_{ww}^{(n)}+p_e^{(n)}-p_w^{(n)}\right)\right] \\ =& -0.5\left[-d_x\left(p_e^{(n)}-p_w^{(n)}\right)-d_x\left(p_{w}^{(n)}-p_{ww}^{(n)}\right)\right]\\ &+d_x\left[\left(p_C^{(n)}-p_W^{(n)}\right)-0.5\left(p_{w}^{(n)}-p_{ww}^{(n)}+p_e^{(n)}-p_w^{(n)}\right)\right] \\ =&d_x\left(p_C^{(n)}-p_W^{(n)}\right) \\ =&1(70-100) \\ =&-30 \end{aligned} m˙w=======ρuwΔy=uwuw+dx[(pC(n)pW(n))0.5(pw(n)pww(n)+pe(n)pw(n))]0.5(uC+uW)+dx[(pC(n)pW(n))0.5(pw(n)pww(n)+pe(n)pw(n))]0.5[dx(pe(n)pw(n))dx(pw(n)pww(n))]+dx[(pC(n)pW(n))0.5(pw(n)pww(n)+pe(n)pw(n))]dx(pC(n)pW(n))1(70100)30
在速度进口面 s s s处的质量流量为
m ˙ s = − ρ v s Δ x = − 1 ∗ 20 ∗ 1 = − 20 \dot m_s=-\rho v_s \Delta x=-1*20*1=-20 m˙s=ρvsΔx=1201=20
压力修正方程将从连续方程中构建,即
( m ˙ e ∗ + m ˙ e ′ ) + ( m ˙ n ∗ + m ˙ n ′ ) + ( m ˙ w ∗ + m ˙ w ′ ) + m ˙ s = 0 (\dot m_e^*+\dot m_e')+(\dot m_n^*+\dot m_n')+(\dot m_w^*+\dot m_w')+\dot m_s=0 (m˙e+m˙e)+(m˙n+m˙n)+(m˙w+m˙w)+m˙s=0

m ˙ e ′ + m ˙ n ′ + m ˙ w ′ = − ( m ˙ e ∗ + m ˙ n ∗ + m ˙ w ∗ + m ˙ s ) = − ( 20 + 12.5 − 30 − 20 ) = 17.5 \begin{aligned} \dot m_e'+\dot m_n'+\dot m_w'=&-(\dot m_e^*+\dot m_n^*+\dot m_w^*+\dot m_s) \\ =&-(20+12.5-30-20) \\ =&17.5 \end{aligned} m˙e+m˙n+m˙w===(m˙e+m˙n+m˙w+m˙s)(20+12.53020)17.5
根据前面推导,有
m ˙ e ′ = − d x ( p E ′ − p C ′ ) m ˙ n ′ = − d y ( p N ′ − p C ′ ) m ˙ w ′ = d x ( p C ′ − p W ′ ) \begin{aligned} \dot m_e' &= -d_x(p'_E-p'_C) \\ \dot m_n' &= -d_y(p'_N-p'_C) \\ \dot m_w' &= d_x(p'_C-p'_W) \end{aligned} m˙em˙nm˙w=dx(pEpC)=dy(pNpC)=dx(pCpW)
于是有
− ( p E ′ − p C ′ ) − 0.25 ( p N ′ − p C ′ ) + ( p C ′ − p W ′ ) = 17.5 -(p'_E-p'_C)-0.25(p'_N-p'_C)+(p'_C-p'_W)=17.5 (pEpC)0.25(pNpC)+(pCpW)=17.5

2.25 p C ′ − p E ′ − 0.25 p N ′ − p W ′ = 17.5 2.25p'_C-p'_E-0.25p'_N-p'_W=17.5 2.25pCpE0.25pNpW=17.5
由于 E 、 W 、 N E、W、N EWN的值都为精确解,所以其修正量为零,故
2.25 p C ′ = 17.5 ⇒ p C ′ = 70 9 ≈ 7.78 2.25p'_C=17.5 \Rightarrow p'_C=\frac{70}{9}\approx7.78 2.25pC=17.5pC=9707.78
基于该修正量,接下来修正单元 C C C形心处的压力和速度分量
p C ∗ = p C ( n ) + p C ′ = 70 + 7.78 = 77.78 u C ′ = − d x ( p e ′ − p w ′ ) = − d x [ 0.5 ( p E ′ + p C ′ ) − 0.5 ( p W ′ + p C ′ ) ] = 0 u C ∗ ∗ = u C ∗ + u C ′ = u C ∗ = 25 v C ′ = − d y ( p n ′ − p s ′ ) = − d y [ 0.5 ( p N ′ + p C ′ ) − p C ′ ] = − d y [ − 0.5 p C ′ ] = − 0.25 ∗ ( − 0.5 ) ∗ 7.78 = 0.9725 v C ∗ ∗ = v C ∗ + v C ′ = 6.25 + 0.9725 = 7.2225 \begin{aligned} p_C^* &= p_C^{(n)}+p_C'=70+7.78=77.78 \\ u'_C &= -d_x(p'_e-p'_w)=-d_x[0.5(p'_E+p'_C)-0.5(p'_W+p'_C)]=0 \\ u_C^{**} &= u_C^{*}+u'_C=u_C^*=25 \\ v'_C &= -d_y(p'_n-p'_s)=-d_y[0.5(p'_N+p'_C)-p'_C]=-d_y[-0.5p'_C] \\ &=-0.25*(-0.5)*7.78=0.9725 \\ v_C^{**} &= v_C^{*}+v'_C=6.25+0.9725=7.2225 \end{aligned} pCuCuCvCvC=pC(n)+pC=70+7.78=77.78=dx(pepw)=dx[0.5(pE+pC)0.5(pW+pC)]=0=uC+uC=uC=25=dy(pnps)=dy[0.5(pN+pC)pC]=dy[0.5pC]=0.25(0.5)7.78=0.9725=vC+vC=6.25+0.9725=7.2225
由于这个例子较为简单,动量方程中并不包含非线性项,所以迭代一步即可获得收敛解,无需再进行后续迭代了。


  • 13
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要用 Python 做导热问题的数值计算,可以使用有限元方法(FEM)或有限体积法(FVM)等数值方法。 首先,需要将导热问题建模为偏微分方程,例如热传导方程。然后,将偏微分方程离散化,得到一个代数方程组。最后,用数值方法求解代数方程组,得到导热问题的数值解。 下面以 FEM 为例,介绍 Python 实现导热问题的数值计算。 1. 建立网格 首先,需要建立网格。可以使用 Python 的第三方库如 meshpy、gmsh 等来生成网格。这里以 gmsh 为例: ```python import gmsh import numpy as np gmsh.initialize() gmsh.model.add("heat_transfer") lc = 0.1 # 网格大小 L = 1.0 # 区域长度 W = 1.0 # 区域宽度 p1 = gmsh.model.geo.addPoint(0, 0, 0, lc) p2 = gmsh.model.geo.addPoint(L, 0, 0, lc) p3 = gmsh.model.geo.addPoint(L, W, 0, lc) p4 = gmsh.model.geo.addPoint(0, W, 0, lc) l1 = gmsh.model.geo.addLine(p1, p2) l2 = gmsh.model.geo.addLine(p2, p3) l3 = gmsh.model.geo.addLine(p3, p4) l4 = gmsh.model.geo.addLine(p4, p1) ll = [l1, l2, l3, l4] pl = gmsh.model.geo.addCurveLoop(ll) ps = [pl] s = gmsh.model.geo.addPlaneSurface(ps) gmsh.model.geo.synchronize() # 生成网格 gmsh.model.mesh.generate(2) # 获取网格节点坐标和拓扑关系 nodes, elems = gmsh_to_mesh(gmsh) gmsh.finalize() ``` 2. 离散化 接着,需要将偏微分方程离散化。这里以有限元法为例,使用 Python 的第三方库 FEniCS 实现: ```python from dolfin import * mesh = Mesh(MPI.comm_world, nodes, elems, 2) V = FunctionSpace(mesh, "P", 1) u = TrialFunction(V) v = TestFunction(V) k = Constant(1.0) # 热导率 f = Constant(0.0) # 热源 a = k*dot(grad(u), grad(v))*dx L = f*v*dx bc = DirichletBC(V, Constant(0.0), "on_boundary") u = Function(V) solve(a == L, u, bc) ``` 3. 可视化 最后,可以使用 Python 的第三方库 matplotlib、mayavi 等来可视化数值解。 ```python import matplotlib.pyplot as plt plot(u, cmap="coolwarm") plt.colorbar() plt.show() ``` 以上就是用 Python 做导热问题的数值计算的基本步骤,具体实现可以根据具体问题进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值