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文件用来设置涉及代数方程组求解和速度-压力耦合相关算法的参数,主要包括 代数方程组求解耦合算法欠松弛处理 三个部分,分别通过solversPISOSIMPLErelaxationFactors等子字典设置。


3. 代数方程组求解

在子字典solvers中,每个求解变量均要独立在以变量名命名的子字典(pU)中设置求解相关信息。这些信息包括代数方程组求解器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

欠松弛因子介于01之间,越接近0求解越稳定,但同时也会降低求解效率;提高的数值会提高求解效率,但同时也会降低稳定性。

欠松弛因子在子字典relaxationFactors下指定,通过子字典名equationsfields来设置不同的欠松弛方式,例如:

relaxationFactors{    fields    {        p 0.3;    }    equations    {        U 0.7;    }}