CFD为啥需要试算,就是因为经常会发散,算着算着崩溃了,这对程序猿是常事情,要抗住,自己先不要崩溃!下面根据自己的经验谈几点,抛砖引玉!
引起CFD计算过程中发散的一些原因很多。所谓cfd计算是将描述物理问题的偏微分方程转化为代数方程组求解,从而得到离散空间上指定点上的值,而其他位置的值通过插值来完成。所谓迭代,本质是将非线性方程线性化并求解的过程,这都是把一个和时间甚至无关的问题变成随着迭代步奏也就是虚拟时间变化的问题。
1)时间步长过大,
我们的计算都是依赖网格建立的有限单元体进行计算的,每一个时间步,每个单元体都是做着单元体内各通量(质量、动量、能量)的平衡计算,时间步过长,就有可能某一个边上通量过大,就如同一下子把单元体内的质量、能量都流光了一样,最极端的情况就是使得单元体内变成负质量,能量,计算就进行不下去了。
一般来说时间步长对于显式方法要求在指定的时间步长内流体流动不能超过一个网格(库朗数限制)。从物理意义上来说,不允许一个步长就把一个网格里面的,质量,动量,能量流光了。显然这是最小的限制,实际问题上,实在收敛不下去,要把步长成倍,成十倍,成百倍的缩小,越是糟糕的计算网格,缩小倍数越多。
也就是说,对于物理问题真解随时间的变化是一条曲线,而求解过程中不断的求解曲线的斜率,并实现时间的上的步进(可以理解为1阶导数)。如果在指定的时间步长内斜率变化很小,这种步进是可以满足方程要求的,并可以得到将来任意时刻的近似解。然而,如果变化比较大时,实际的变化过程将不能通过线性化方法来处理,这时候再使用这种方法就会出现问题。随着时间的推移,数值解越来越偏离真解,最终引起发散。对于我们求解的流动问题,有可能会引起计算过程的发散多在于库朗数太大。
本来在star ccm 软件中求解低马赫数流动、不可压缩流动 应选用分离式求解器;但是有些问题,梯度变化很大,热传导和流动之间并不是完全可以分离明显应当选择耦合求解器进行计算。对于高速可压缩流动,除了采用耦合求解方法外,还必须在速度梯度变化迅速的流动区域划分较细的网格,才能较快的得到收敛解。这种方法所唯一的缺点是需要较高配置的计算机以及较长的迭代时间,大概是分离求解方法迭代时间的 1.5~2 倍。 在选择耦合求解器的同时还应注意,由于计算容易发散,可以通过调节库朗数 (Courant number )来保证计算的收敛。Courant number 实际上是指时间步长和空间步长的相对关系。发散的情况情况一般出现在存在尖锐外形的计算域,当局部的流速过大或者压差过大时容易出错。用 courant number 可以调节计算的稳定性与收敛性的原理:一般来说,当库朗数变大时,会逐渐加快收敛的速度,但是其稳定性也相应的降低,即可能出现计算发散的情况。因此针对具体的求解问题,在计算的初始状态,应当把库朗数设置为一个较小的数值,观察残差替代的曲线图,待其残差值逐渐降低稳定时,再适当增大库朗数,以加快收敛,最终找出一个合适的库朗数,使计算达到一种既稳定,收敛速度又快的状态。比如计算蒸汽喷射器的计算开始迭代时可以设置库朗数为 1,否则容易导致迭代发散,待计算一定步长之后再逐渐加大,最后调回默认值 5,继续计算直到最终计算收敛。对于毫无计算经验的物体的流场,试算中间老是发散,不如狠心一些,把库朗数缩小几倍,十几倍,几十倍,也不是不可以。
2)压力修正次数太少
对于NS方程SIMPLE系列算法而言,需要通过压力来显式修正表面流率和速度,如果修正次数过少,通常会造成修正后的速度和真实速度偏离较大,下一时间步求解速度的时候会得到一个不真实的表面流率,从而影响下一个时刻的速度求解,进而影响压力,长期计算会影响造成误差积累设置发散。因此,压力修正次数要有一定的限制。一般而言对于2d问题,2~3次能够满足要求,而对于3d问题3~4次应该可以,但也和具体问题有关系,同一个问题3d的比2d的要求修正次数多。
3)初始条件不模糊
很多计算者喜欢把粗网格的结果,分配到细网格上,但是算不下去,这主要的原因是,湍流和热传导,甚至激波是个强非线性问题,就好像在崇山峻岭的沟里面一样,这种沟豁,有的时候还是分维的结构,沟里面还有沟,套很多层,所以用插值分配的办**把沟插值到梁上,计算机所谓松弛迭代,也是一种渐进的爬山过程,如果都从模模糊糊的低处爬横竖可以爬上去,但是你把初始值放到一个岭上面,他就爬不过去了,华山上从北峰到西峰,一般的过渡都是行不通的,迭代过程实际就是一个过渡找路的过程,结果往往找到深沟里面去了,这就是发散,除非你找到苍龙岭那条路,但是谁知道苍龙岭那条窄路在哪里,所以一般都采用干脆从平地爬起,也就是初值都赋一个看起来不靠谱的平均值反而好爬上去。
网格的结果,分配到细网格上,对于强非线性问题,最好不要用粗网格收敛太好的值,迭代几次,有那么点意思了就行,不要迭代太深了反而好。
4)网格不适当
其实这是数值计算的最主要问题,很多发散或者不良的计算结果都源发于此,
我们建立网格时要避免,过于狭长的网格,也要避免锐角和锋利的缘口,这些锐角都会给流动数值计算带来很大的困难,如果背风面有个分离区,越是好的计算格式,越是把非稳态效应表现的淋漓尽致,对我们最苦恼的就是非但不收敛,而且让计算挂了,这时候最好能够试算的时候就保留一些计算结果,看看各种通量的云图,对那些肇事者做定点清除,也就是把那些尖角,缝隙,适当处理,让他既偏开我们所计算的物形差值不大,流体受的影响不大,又能保证收敛速度。
5)问题本身不是定常问题,却按照定常问题来求解,
其实在流体和热传导问题里面,有很多是属于复杂流动现象,尤其是雷诺数比较小的时候,发生了分离漩涡,或者在转捩发生之前层流边界层微小扰动被逐渐放大的时候,流动都是物理上不稳定的,比如在雷诺数超过一定数值的时候,流体的底层已经不仅是非定常,而且是不稳定的了,底层的漩涡发生了抖动,甚至被拉长成为发卡涡,最后出现了猝发和溅射,而我们的数值计算把这一切都按照稳定来处理了,就会出现这种现象。这就是硬要用定常流来计算物理上已经非定常的结果。
有时候我们计算收敛过程伴随着平稳收敛过程中间的一跳一跳的震荡,也多是这种原因。但是这还要说明一点的是,在机翼周围稳定的有环量或者升力的流场没有建立起来之前,也有这种现象,如果我们把涡矢量的云图打出来,就会发现,在开始计算流场的时候,随着迭代次数增加,升力会逐渐增加,在后缘处会排出一个一个的小漩涡,这些小漩涡一个一个的随着流动被拖到下游无穷远处,这些小漩涡是数值粘性所形成的,他每脱下一个,数值计算的残差就跳动一下,一直到最后完全收敛了,后缘也不再产生小的漩涡了。收敛的残差因为它产生的跳动也消失了了。
用数值粘性,或者网格粘性的增加可以压制这些现象产生,我们现在的计算网格越来越细,这个问题将越来越明显。这就是为什么粗网格有时候比细网格反而算的要皮实,收敛的还要好。
6)网格正交修正
在网格正交性比较差的情况下,直接利用正交网格导出的扩散项离散过程通常会引起误差,通常将离散过程分为正交和非正交两部分,正交部分隐式处理,非正交部分显示处理。非正交中压力值采用了上一层迭代的值,因此会影响收敛性。当网格质量较差时,可以指定一定量的非正交循环,不需要太多3次以内即可。
7)负扩散系数
扩散过程描述的是从物理量从高浓度向低浓度的传输过程,负扩散系数会造成低浓度向高浓度的传输,这和实际物理现象不符的,长期模拟下去会造成局部浓度过度增加,从而造成发散。引起负扩散系数原因很多,比如湍流模型求出来的湍流粘性为负值,或者你误将扩散项前面的-写成了 。
8)不适当的边界条件
边界条件不合理也会引起方程的发散,比如开口系统只有进口没有出口。对于不可压缩流而言,边界条件的设置方法见前面博文。需要指出的时,湍流k-e模型中入口通常需要根据经验关系式指定,而并非随意给值,这常常是初学者常见的问题。