1. 实例
下面是fvSolution
文件的一个典型例子(应用于icoFoam
求解器),其内容(略去文件头部注释):
//文件说明
FoamFile
{
version 2.0; //版本号
format ascii; //文本格式
class dictionary; //类型为字典文件
location "system"; //所在目录
object fvSolution; //对象名
}
//代数方程组求解设置
solvers
{
//压力场p
p
{
solver PCG; //求解器
preconditioner DIC; //预处理器
tolerance 1e-06; //预定残值
relTol 0; //预定相对残值
}
//速度场U
U
{
solver smoothSolver; //光滑求解器
smoother symGaussSeidel; //光滑器
tolerance 1e-05; //预定残值
relTol 0; //预定相对残值
}
}
//PISO算法设置
PISO
{
nCorrectors 2; //PISO修正次数
nNonOrthogonalCorrectors 0; //非正交修正次数
pRefCell 0; //压力参考单元
pRefValue 0; //压力参考值
}
2. fvSolution 文件分析
system
目录下的fvSolution
文件用来设置涉及代数方程组求解和速度-压力耦合相关算法的参数,主要包括 代数方程组求解,耦合算法 和 欠松弛处理 三个部分,分别通过solvers
,PISO
或SIMPLE
和relaxationFactors
等子字典设置。
3. 代数方程组求解
在子字典solvers
中,每个求解变量均要独立在以变量名命名的子字典(p
,U
)中设置求解相关信息。这些信息包括代数方程组求解器solver
,预处理器preconditioner
,光滑器smoother
,残值tolerance
和相对残值relTol
。
3.1 solver 代数方程组求解器
OpenFOAM
中的代数方程组求解器均为迭代求解器:
solver | 说明 |
---|---|
PCG/PBiCG |
预处理共轭梯度(对称)/稳定双共轭梯度(非对称)求解器 |
smoothSolver |
光滑求解器 |
GAMG |
几何-代数多重网格求解器 |
diagonal |
对角求解器(显式离散) |
3.2 preconditioner 预处理器
预处理器本质上为一个改变原先系数矩阵条件数的左乘矩阵,PCG/PBiCG
求解器可以使用的预处理器有:
preconditioner | 说明 |
---|---|
DIC |
不完全的对角Cholesky预处理器(对称矩阵) |
FDIC |
不完全的快速对角Cholesky预处理器(带缓存的DIC ) |
DILU |
对角不完全LU预处理器(非对称) |
diagonal |
对角预处理器 |
GAMG |
几何-代数多重网格预处理器 |
none |
不进行预处理 |
3.3 smoothSolver 光滑求解器
使用光滑求解器smoothSolver
需要指定所使用的光滑器smoother
,可用的smoother
有:
preconditioner | 说明 |
---|---|
GaussSeidel |
高斯赛德尔光顺器 |
DIC |
不完全的对角Cholesky光顺器(对称矩阵) |
DICGaussSeidel |
不完全的对角Cholesky-高斯赛德尔光顺器(对称矩阵) |
一般情况下GaussSeidel
是最可靠的选择,但对于有些条件数不好的矩阵,DIC
的收敛性可能更好。另外,在某些情况下,使用GaussSeidel
进行光顺强化是非常有效的,例如DICGaussSeidel
。此外,在重新计算残值之前需要通过为关键字nSweeps
来指定sweep
数。
3.4 收敛准则
OpenFOAM
中的代数方程组求解器在达到下列三个条件中的 任何 一个后即停止迭代:
- 残值达到预定值
tolerance
; - 相对残值(当前残值与初始残值之比)达到预定值
relTol
; - 迭代次数达到最大迭代次数
maxIter
。
4. 耦合算法
耦合算法用于处理速度-压力
的耦合问题。大多数OpenFOAM
的CFD求解器使用PISO
或者SIMPLE
算法。这些算法采用迭代技术来求解速度和压力场。PISO
算法用来处理非稳态问题,SIMPLE
算法用来处理稳态问题。
5. 欠松弛处理
欠松弛处理主要有两种不同的使用方式:
- 在迭代之前提高系数矩阵主对角元素数值,并且降低源项来保证系数矩阵对角占优,比如速度场
U
; - 限制变量在迭代后改变的大小,比如压力场
p
。
欠松弛因子介于0
和1
之间,越接近0
求解越稳定,但同时也会降低求解效率;提高的数值会提高求解效率,但同时也会降低稳定性。
欠松弛因子在子字典relaxationFactors
下指定,通过子字典名equations
和fields
来设置不同的欠松弛方式,例如:
relaxationFactors{ fields { p 0.3; } equations { U 0.7; }}