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; }}