如何根据残差判断是否收敛?
-
我在使用buoyantSimpleFoam时,想要通过残差来判断是否收敛,得到如下的残差图,其中p_rgh在0.1左右就不变了,而k和epsilon也在0.001以上。
为了减小残差,我调小了fvsolution中的tolerance和residualControl,另外也尝试了修改p_rgh的计算方法,但是都没有用,残差依旧如下图所示,请问这样收敛了吗?为什么残差这么大?谢谢!残差图:
-
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
我用的也是基于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了
-
@东岳 那是下降呢?还是不下降呢?
-
看论文发现有作者说fluent稳态计算残差降到1e-7则认为收敛停止计算,但是我用of的simpleFoam的时候发现残差根本降不到那么低,连降到1e-6都已经是极限了。我都不敢在论文里写残差判断标准了,一般你们怎么说收敛标准呢