一些类似的报错:
Differences between serial and parallel runs -- CFD Online Discussion Forums
Parallel run diverges, serial does not -- CFD Online Discussion Forums
Unexpected step-to-step divergence? -- CFD Online Discussion Forums
影响CFD计算量的因素分析及在OpenFOAM中的参数调整
这篇文章写的非常易懂,各种因素,都有可能影响。
GAMG和PCG
GAMG vs. PCG in fvSolution -- CFD Online Discussion Forums
代数方程求解器
“共轭梯度求解器+多重网格求解器”
p //求解变量
{
solver PCG; //共轭梯度求解器(使用对称矩阵,否则 PBICG)
preconditioner
{
preconditioner GAMG; //代数网格预条件器
tolerance 1e-05; //预条件器绝对残差
relTol 0; //预条件器相对残差
smoother DICGaussSeidel;
nPreSweeps 0;
nPostSweeps 2;
nFinestSweeps 2;
cacheAgglomeration false; //可以改为 true,用内存换时间
nCellsInCoarsestLevel 10;
agglomerator faceAreaPair;
mergeLevels 1;
}
tolerance 1e-05; //绝对残差
relTol 0; //相对残差
maxIter 100; //最大迭代数目,一般而言,该求解器可以保证在100步以内收敛
}
“多重网格求解器”
p //求解变量
{
solver GAMG; //代数多重网格求解器
tolerance 1e-07; //绝对误差
relTol 0.01; //相对误差
smoother DIC; //光滑器
nPreSweeps 0;
nPostSweeps 2;
nFinestSweeps 2;
cacheAgglomeration true;
nCellsInCoarsestLevel 10;
agglomerator faceAreaPair;
mergeLevels 1;
}
“共轭梯度求解器” (非对称矩阵)
"(U|k)Final"
{
solver PBiCG;
preconditioner DILU;
tolerance 1e-08;
relTol 0;
}
“共轭梯度求解器”(对称矩阵)
p
{
solver PCG;
preconditioner DIC;
tolerance 1e-8;
relTol 0.01;
}
我的不收敛原因
1. 进口气速密度设置错了,从而气速过小而使得颗粒一直堆积。
2. 串并行程序的设置文件,configure.h文件里面的宏定义内容其实存在不同。但具体是怎么个不同法,我还没搞懂。感觉串并行的设置没有太大差异,按理说应该不会影响收敛问题。
3. 初始固分率给的过大了,但是在串行是可以一直运行的,并行就是会自己terminated,p出现nan的情况,所以我还是怀疑跟configue.h文件串并行的不同有关。好像没啥问题。
4. 另外,可以用continue.sh从另外一个时间点继续算,重新初始化Ksl和rho和p和U和Us。不然我就怀疑是边界条件给的问题了。因为这个初始化的时候没考虑分布板,而是直接让分布板那的速度定位定值0。师姐说一开始不收敛是很正常的现象,可以从某个时刻续算试试。
5. 我知道最大的问题出在哪里了,在init/parameter.ini文件里面pstar的定义串并行我的设置不一样,串行是10,并行是100。这对solid stress的计算好像有很大的影响。
6. 好像又找到一个问题,进口气速是设了,但是全床没有给一个初始速度,使得颗粒一开始堆积在分布板。有可能这也是使得不收敛的原因。
7. 粗粒化也有影响,可能125000000太大了,我换了一个8000000计算,并且初始化0.05而不是0.086.。。
8. PISO求解有问题,有可能是模型网格大小过大,使得计算不收敛。需要修改模型,另外,需要检查并行颗粒传递和循环的判断条件是否符合本模型。
程序被kill的根本原因基本都是:
速度不够大或者初始颗粒太多,使得颗粒堆积出不去;串并行计算代码是不一样的,并行貌似update.cpp文件不一样,mpi得传输信息更新信息,这一步可能就导致了并行计算结果和串行不一样;另外,计算可以采用进口按时间步长放进催化剂的方法(这个比较接近现实),也可以采用循环的方法(我感觉这个方法是后面知道稳态全床平均孔隙率的时候再可以设为初始孔隙率,用于加快计算速度)。matlab计算按步长加入的颗粒量_imastrid的博客-CSDN博客