残差问题探讨
(2011-04-14 20:53:42)
标签:
openfoam研究教育 |
分类: OpenFOAM使用 |
在实际的流体模拟中通常以残差作为收敛的判据,有时候为什么残差永远降不下来呢?到底求得的数据是否可信呢?今天我们聊聊残差问题。
在CFD计算过程中有两种残差一种是外残差一种是内残差。残差是当前时刻的时刻的收敛数据带入到下一个时刻的方程中而引起的残差,而内残差是求解代数方程中引起的残差。
外残差: 对于方程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并不是很小,对于特定的问题,这个r永远不可能很小(因为是非稳态问题),所以对于非稳态问题外残差r不能作为收敛判据。
无论是稳态还是非稳态,都必须是代数方程Ax=b收敛,r1->0 时,是必须满足的。但是在稳态计算中,由于某一个迭代的结构没有意义,这时候为了减少计算量通常给定一定的迭代次数,而并不是设定r1必须满足一定的限制。这是fluent采用的一种手段。而对于非稳态问题,由于我们关心某一个时刻的值,这时候必须是r1->0,使得求解的代数方程收敛,因此r1才是作为非稳态问题的收敛判据。
在openfoam中两个残差都有,外残差就是你在迭代过程中的输出屏幕上看到的那个initial residual,而内残差就是求解某一个方程迭代一定后的那个残差,内残差r1,可以通过在fvSolution里面的代数方程求解器中设定,relTol(相对残差)tol(绝对残差)。两者的区别不用说了吧。
Simple
{
}
当所有方程残差外残差小于1e-6时,认为收敛,求解器停止计算。