CFD计算过程发散诸多原因分析【转载】
转载自:
http://blog.sina.com.cn/s/blog_5fdfa7e601010rkx.html
今天探讨引起CFD计算过程中发散的一些原因。cfd计算是将描述物理问题的偏微分方程转化为代数方程组求解,从而得到离散空间上指定点上的值,而其他位置的值通过插值来完成。这本质是将非线性方程线性化并求解的过程,我是这样理解的,对于物理问题真解随时间的变化是一条曲线,而求解过程中不断的求解曲线的斜率,并实现时间的上的步进(可以理解为1阶导数)。如果在指定的时间步长内斜率变化很小,这种步进是可以满足方程要求的,并可以得到将来任意时刻的近似解。然而,如果变化比较大时,实际的变化过程将不能通过线性化方法来处理,这时候再使用这种方法就会出现问题。随着时间的推移,数值解越来越偏离真解,最终引起发散。对于我们求解的流动问题,有下面几种可能会引起计算过程的发散
1)时间步长过大
这点很容易理解,时间步长过长可能会造成时间段内,斜率变化较大,从而会造成数值解偏离真解。一般而言,对于显式方法要求在指定的时间步长内流体流动不能超过一个网格(库朗数限制)。
2)压力修正次数太少
对于NS方程SIMPLE系列算法而言,需要通过压力来显式修正表面流率和速度,如果修正次数过少,通常会造成修正后的速度和真实速度偏离较大,下一时间步求解速度的时候会得到一个不真实的表面流率,从而影响下一个时刻的速度求解,进而影响压力,长期计算会影响造成误差积累设置发散。因此,压力修正次数要有一定的限制。一般而言对于2d问题,2~3次能够满足要求,而对于3d问题3~4次应该可以,但也和具体问题有关系,同一个问题3d的比2d的要求修正次数多。
3)非正交修正
在网格正交性比较差的情况下,直接利用正交网格导出的扩散项离散过程通常会引起误差,通常将离散过程分为正交和非正交两部分,正交部分隐式处理,非正交部分显示处理。非正交中压力值采用了上一层迭代的值,因此会影响收敛性。当网格质量较差时,可以指定一定量的非正交循环,不需要太多3次以内即可。
4)负扩散系数
扩散过程描述的是从物理量从高浓度向低浓度的传输过程,负扩散系数会造成低浓度向高浓度的传输,这和实际物理现象不符的,长期模拟下去会造成局部浓度过度增加,从而造成发散。引起负扩散系数原因很多,比如湍流模型求出来的湍流粘性为负值,或者你误将扩散项前面的-写成了+。
5)不适当的边界条件
边界条件不合理也会引起方程的发散,比如开口系统只有进口没有出口。对于不可压缩流而言,边界条件的设置方法见前面博文。需要指出的时,湍流k-e模型中入口通常需要根据经验关系式指定,而并非随意给值,这常常是初学者常见的问题。
6)不合适的代数方程求解器
对于一些问题,离散后的代数方程需要采用一些性能优越的代数方程求解器。特别是对于3d问题,网格单元数越多对代数方程求解器要求越高,如果采用传统的pcg(pbicg)+传统预条件有时候在指定的迭代步内(openfoam默认1001)很难收敛到你指定的精度。这时,可以选用GAMG或者pcg+GAMG等代数求解器,以确保较少时间步收敛到指定解。
7)过大的源项
源项过大是引起方程发散的一个重要原因,当自己写程序或者做耦合计算的时候,不妨检查一下你的源项。
8)对流项离散
对流项的离散格式对收敛性的影响很多cfd的书上都有介绍。 一般而言低阶格式较稳定,高阶稳定性则较差。
9)不合适的初始场
对于cfd计算初始场往往设置具有较大的随意性,特别是对于稳态问题更是如此。如果设置的初值偏离真实物理量太远会造成一开始就发散。对于稳态问题,可以采用势流的求解结果作为初始场进行进一步迭代,这样会大大改善收敛性。
10)求解过程中物理量越界
有些求解的物理量通常是有界的,比如体积分率应该在[0 1]之间,而k 和 e 应当是大于0的数目,而在求解过程中由于离散方程植入不慎,会造成求解变量不在其物理范围之内,从而造成发散。因此对于有界量跟踪方程植入过程应特别注意。
上面仅仅是个人浅见,仅供参考。