抱歉,本周的每周一行来晚了。
今天,我们要讲的是
solve(UEqn == -fvc::grad(p));
这一行程序来自于 icoFoam.C
,从字面上理解是求解方程组。
首先,来看一下括号里面各项的定义:
fvVectorMatrix UEqn
(
fvm::ddt(U)
+ fvm::div(phi, U)
- fvm::laplacian(nu, U)
);
以类 fvVectorMatrix
定义了一个以 UEqn 为名的变量,括号内的各项已经分别在 code of the week #1: \nabla(UU) div(phi, U), #2: \dfrac{\partial U}{\partial t} ddt(U), #3 \nabla\cdot(\nu\nabla U) laplacian(nu, U) 分别进行了解读,其分别代表了方程等号左边的各项
对方程左边部分离散化后可以得到以下矩阵方程。
其中 U^r_P 指待求网格的速度, U^n_N 指相邻网格已知速度值 (前一时间步), E_P^n 为根据该点已知速度计算所得的数。这一方程加上 \nabla p 就成为动量预测方程。
可简写为
该行程序双等号右边的 -fvc::grad(p)
是动量方程右边的部分,而使用 fvc:: 表示利用前一时间步的值来获得此梯度。
solve(UEqn == -fvc::grad(p))
这一行就是求解 U 方程获取预测速度,但不能满足连续性方程。因此,需要进行修正。
如果我们定义 \mathbf U_\mathrm{P}^{n+1} 为 PISO 循环后最终收敛的速度,那么,进行修正后的 \mathbf U_\mathrm{P}^{n+1} 就应当满足动量方程和连续性方程。
速度 \mathbf U_\mathrm{P}^{n+1} 符合动量方程,则有
其中, p^{n+1} 为 PISO 循环内最后求得的压力。
式中, \mathbf{U}^{*,n+1} 为预测速度值。速度满足连续性方程,只需要对 \mathbf U_\mathrm{P}^{n+1} 进行求散度操作。
离散后得
而此时,该网格面上的中心值也未求得,因此,需要另辟他法,Rhie-Chow 插值建议这样进行获取面上的 \mathbf U_{\mathrm{P,}f}^{n+1} :
将获取的面心上的速度 \mathbf U_{\mathrm{P,}f}^{n+1} 代入连续方程,
写成张量形式,有
PISO 循环
方程的解 \mathbf U_\mathrm{P}^{n+1} 和压力 p^{n+1} 应当满足连续性方程和动量方程。而到目前为止,仅有通过动量预测方程求出来的 \mathbf U_\mathrm{P}^r 。动量预测方程 和 替代速度连续性方程 无法自行求解。Issa 于 1986 年提出 PISO (Pressure Implicit with Splitting of Operators) 技术来解决这个问题,通过对当前时间步内的多次修正来获得最终的 \mathbf U_\mathrm{P}^{n+1} 和 p^{n+1} 。
icoFoam 使用 PISO 算法解 N-S 方程。其基本方法为
-
根据初始条件(压力场、速度场等)求解预测速度场 \mathbf U^r
-
根据预测速度 \mathbf U^r 或第 4 步求得的速度 \mathbf U^{n+1} ,计算出无压力梯度项的速度场 \mathbf U^n
-
根据无压力梯度项的速度场 \mathbf U^n ,求解压力(泊松)方程 (9) 或 (10),得到压力场 p^n
-
根据压力场 p^n ,使用方程 (8) 修正预测速度 \mathbf U^{n+1} 以满足连续性方程,获得一个新的速度 \mathbf U^{n+1}
-
接第 2 步