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