openFOAM 编程日志
单相不可压缩流动
How to Write CFD Codes with OpenFOAM
Section1: Perform an Incompressible Singe Phase Flow Simulation
CloudBird
2020 第Ⅱ版
Second Edition in 2020
故
幾
於
道
處
眾
人
之
所
惡
上
善
若
水
水
善
利
萬
物
而
不
爭
东摘西采 初学者的笔记
勘误请联系:cloudbird7@foxmail.com
获取最新修订版请访问我的 CSDN 博客:https://blog.csdn.net/CloudBird07
目录
一 控制方程与离散..................................................................................................................... - 1 -
1. 控制方程及计算难点......................................................................................................- 1 -
2. 动量方程的有限体积离散..............................................................................................- 2 -
3. 压力泊松方程的构建......................................................................................................- 5 -
二 压力速度耦合算法................................................................................................................. - 8 -
1. 压力速度耦合算法概述..................................................................................................- 8 -
2. PISO 算法......................................................................................................................... - 8 -
1. SIMPLE/SIMPLEC 算法与 simpleFoam........................................................................- 11 -
1. SIMPLE 算法........................................................................................................... - 11 -
2. SIMPLEC 算法.........................................................................................................- 13 -
3. PIMPLE 算法与 pimpleFoam........................................................................................ - 15 -
1. PISO 算法和 SIMPLE 算法的讨论.........................................................................- 15 -
2. PIMPLE 算法...........................................................................................................- 17 -
附录..............................................................................................................................................- 19 -
附录 1 icoFoam 代码解析.................................................................................................- 19 -
附录 2 simpleFoam 代码解析.......................................................................................... - 23 -
附录 3 pimpleFoam 代码解析..........................................................................................- 25 -
附录 4 压力震荡与 Rhie-Chow 插值...............................................................................- 29 -
1. 离散的一维压力泊松方程................................................................................... - 29 -
2. 压力的数值震荡....................................................................................................- 31 -
3. Rhie-Chow 插值与其 openFOAM 实现............................................................... - 32 -
4. 梯度计算引起的数值震荡................................................................................... - 34 -
附录 5 icoFoam 与 pisoFoam 的区别..............................................................................- 35 -
附录 6 附加显式体积力源项的耦合算法........................................................................- 36 -
附录 7. UEqn.A(),UEqn.H()与 pEqn.flux()?...............................................................- 40 -
待补充内容................................................................................................................................. - 42 -
参考资料..................................................................................................................................... - 43 -
更新日志..................................................................................................................................... - 44 -
How to Write CFD Codes with OpenFOAM
CLoudBird
一 控制方程与离散
注:本章内容整理自李东岳老师的 icoFoam 解析[1],大部分符号与东岳老师的解析内容相
通,但部分推导过程有所不同。
1. 控制方程及计算难点
对于单相不可压缩流体的流动,系统的能量方程与动量方程不存在耦合关系,当不需要
计算温度等能量参数时,可以无需求解能量方程。此时流动的控制方程为与连续性方程与动
量方程(N-S 方程):
∇∙U =0 ⋯⋯(1)
U + ∙(U U )− ∙( ∇U )=− ⋯⋯(2)
注意,对于不可压缩流动,密度可以提出到各算符之外,因此,为了简化表达,上述方
程中 p 的单位为压力除以密度的单位,即 m2⋅s−2,若不单独指出,下文中出现的各类方程
均作此处理。
方程二中等号右侧各项从左往右依次是瞬态项,对流项,和扩散项(拉普拉斯项),其
中的对流项的处理是 CFD 计算的难点。对于这一项,当速度待求时,U U 是两个未知量的
积(注意,此处的求积是张量积,向量的张量积运算结果为一张量),存在强烈的非线性耦
合,难以求解。
通常可以选用非线性求解器对对流项进行求解,但 CFD 中往往使用线性化的方式进行
处理。若记上标 n 为当前步的已知量,n+1 为下一步中待求的未知量,线性化即是将原来需
要计算的 ∙(
+1
+1)处理为 ∙(
+1),这样做的缺点是速度信息会有一定的滞
后。
CFD 中的另一个计算难点是压力的求解。方程 1 是一个限制性方程,其无法直接求出速
- 1 -
How to Write CFD Codes with OpenFOAM
CLoudBird
度,必须根据方程 2 才可以得到速度的计算结果。即方程 1 和 2 虽然是含有两个未知数的
两个方程,但其显然缺乏求解压力的方程。如何构建关于压力的方程并与速度耦合求解是流
动计算的关键。
本文后面的所有内容基本上都是在处理这两个问题。
2. 动量方程的有限体积离散
在本节中,将推导最基本的动量方程有限体积离散过程。本部分是理解 openFOAM 中
离散格式具体设置内容的前提,其推导的结果也是下面推导各类压力速度耦合算法的基础。
对于动量方程 2,将其线性化,并对瞬态项采用欧拉离散格式有:
左右对有限体积(计算网格)和时间积分,各项为:
+1−
∆
∙(
+1)=− +1 ⋯⋯(3)
) ⋯⋯(4)
(
+1
)
∆
)− ∙( ∇
+ ∙(
+1
+1−
(
+1−
=
∆
) =
) =
+1
(
+1
(
+1∙ )
⋯⋯(5)
=∆
+1) =
+1) =
( ∇
(
∇
+1)
⋯⋯(6)
=∆
∙( ∇
其中,V 为计算网格的体积,下标 f 表示网格面上的值, 为已知时间步的速度通量。
+1)
∆
( ∇
式 4,5 使用高斯定理得到,式 6 使用高斯定理的推论得到。压力项暂不进行有限体积离散
处理,这是因为对压力梯度的离散可能会导致严重的数值震荡,实际上,动量方程右侧所有
的梯度求解都有可能导致数值震荡,这部分内容将在附录中进行阐述。
- 2 -
How to Write CFD Codes with OpenFOAM
CLoudBird
将式 4-6 带回式 3 可得:
∇
(
+1)
(
+1−
) +∆
(
+1 )
−∆
在式 6 和式 7 中,
∇
+1为面法向梯度,对于正交网格,其值为:
+1−
+1
+1=
∇
⋯⋯(8)
=−∆ +1 ⋯⋯(7)
其中下标 N 表示相邻网格的值,下标 p 表示当前网格的值。注意,上式仅对于正交网
格成立,对于非正交网格并不成立。面法向梯度在 openFOAM 里的算符为 snGrad,对于
snGrad 项,需要指定其离散格式,对于非正交网格,必须指定非正交的离散格式。
方程 5 中的
+1为面上的值,需要通过体心的值插值得到。假设采用中心离散的格式
则有:
+1=
+1+
+1
2
⋯⋯(9)
关于空间插值格式的更多内容,可以参考附录。
将 8,9 式带入 7 可得:
(
+1−
) +∆
+1+
(
+1
2
=−∆ +1 ⋯⋯(10)
)
−∆
+1−
+1
(
)
整理可得:
( ∆ + 2 +
+1 +( 2 −
)
= ∆
− +1 ⋯⋯(11)
, = ∆
, =
令 = ∆ +
2 −
2 +
+1= −
+1+
+1 ⋯⋯(12)
)
+1
,则 10 式可化为:
- 3 -
How to Write CFD Codes with OpenFOAM
CLoudBird
显然,在给定时间步内, , , 均是已知的值。
以上过程虽然是通过将各项进行最简单的线性离散得到的,但其结论是普适的。无论采
用何种离散格式,动量方程最终总可以写为式 12 的形式。
如果待求解的问题是稳态问题,也可以得到类似的结果,只是方程中的系数 =0,
会变为:
= 2 +
+1 =
∆
+1= +1+ +1
2
+1 =
( +1
) ⋯⋯(14)
方程 14 中 +1也为面上的值,可按下面的式子计算:
⋯⋯(15)
为了之后讨论方便,我们将 openFOAM 中压力项的有限体积离散结果写在这里:
⋯⋯(13)
接下来,我们简单对有限体积离散过程中涉及到的离散格式及其 openFOAM 设置进行
说明:
我们将瞬态项 U 处理为
+1−
∆ ,可以在 fvSchemes 文件中指定其他的时间离散格式。
求解梯度时,最终转化为求解面上的物理量的值,例如式 15,对压力的梯度操作最终落实
在了求解面上压力,这是求解梯度的高斯方法(即通过插值实现面值计算以求解梯度)。除
了高斯法,还有其他方法可以求解梯度,可以在 fvSchemes 文件中设定。openFOAM 在
fvSchemes 文 件 中 指 定 拉 普 拉 斯 项 通 常 采 用 的 形 式 为 Gauss
。在式 6 中我们可以清楚的看到,拉普拉斯项最后的计算中其实为一个
系数的面值(如 )与一个面法向梯度(如
∇
+1)的计算。interpolationScheme 指
定了系数的插值方式,snGradScheme 指定了面法向梯度的插值方式。对流项离散格式通
常采用的指定格式为 Gauss , 从式 5 可以看出,对于对流项的计算,
最后落到了面上值的计算,这里的 interpolationScheme 就是指定了面上值离散的方法。另
- 4 -