如何根据残差判断是否收敛?



  • 我在使用buoyantSimpleFoam时,想要通过残差来判断是否收敛,得到如下的残差图,其中p_rgh在0.1左右就不变了,而k和epsilon也在0.001以上。
    为了减小残差,我调小了fvsolution中的tolerance和residualControl,另外也尝试了修改p_rgh的计算方法,但是都没有用,残差依旧如下图所示,请问这样收敛了吗?为什么残差这么大?谢谢!

    残差图:
    0_1512393903375_2017-12-04 21-21-48屏幕截图.png



  • buoyantSimpleFoam是个稳态求解器,有的时候稳态求解器残差一直会下降不下去的。



  • @李东岳 谢谢!我在几个点上放了probe,确实变化不大,应该是收敛了。
    但是苏军伟在博客中提到:

    外残差: 对于方程f(x,t)=0在t_0时刻有收敛解x_0, 则f(x_0,t=t_0)=0; 当用t0时刻的结果代入到t1时刻的方程时,通常并不能满足方程,即 f(x_0, t = t_1) = r !=0; 这里的残差r称为外残差。
    内残差:在cfd计算中通常将方程转化为代数方程Ax=b;当得到某个解A*x_0-b = r1; 这里的r1 ->0时,认为Ax=b收敛。 这里的r1为内残差。
    对于稳态问题:只有当r->0时,才被认为收敛,也就是(x_1 - x_0)->0. 也就是我们在cfd计算中通常见到的那个残差,fluent及其pyFoam输出残差图就是这个r。r常被作为收敛判据。

    如果稳态问题只有r -> 0时才收敛,那么为什么buoyantSimpleFoam收敛时的残差还降不下去?



  • 你好,问一下您是用什么监测残差的,是新版本的foamMonitor吗,还是自己写的gnuplot脚本?



  • @夜阑烟寒 我用的是OpenFOAM 5自带的foamMonitor



  • @izumi 嗯谢谢啦,我用的是3.0.1的,所以找了个gnuplot脚本看残差,但是感觉显示的略有问题。



  • @izumi 0_1516259759442_捕获.JPG
    我用的也是基于simple算法的求解器,就是压力因为加了非正交修正,所以压力方程会被求解多次,然后脚本就把压力曲线化成了一个条带状曲线。所以我把压力残差去掉了



  • 如果稳态问题只有r -> 0时才收敛

    我个人觉得有时候r不会趋向于0,会一直震荡



  • 个人理解。其实对于稳态求解,残差曲线平了基本就收敛了,所有变量残差下降到tolerance是很难的,尤其对于压力方程,从log的输出也能看出,U、k、epsilon、omega方程的迭代次数和压力方程的迭代次数相比,一个时间步,压力方程需要更多的迭代次数,这是基于simple算法本身的特性决定的,压力泊松方程是双曲型方程,比较难求解。@李东岳 有不对地方,希望东岳老师纠正



  • @李东岳 看《Computational Methods for Fluid Dynamics》126页说:

    根据经验内残差下降1到2个数量级就可以了,外残差则要下降3到5个数量级才行。

    结合书中给的例子:

    初值给0,初始误差大小和解相同,残差下降3到4个数量级,则误差可能下降到解的0.1%。

    这样看来,如果初值给的好,外残差很可能降不下来,r就不能趋向于0了



  • @东岳 那是下降呢?还是不下降呢?


Log in to reply