关于piso循环的二次修正的一个疑问
-
Jasah建议一般情况下不进行压力非矩形修正,因为本身SIMPLE,PISO算法就可以进行速度压力的修正计算。如果要进行这一部分修正,隐形的每一次新的计算都调用了新的非正交修正。并且是迭代进行的,see:
if ( corr == nCorr-1 && nonOrth == nNonOrthCorr ) { pEqn.solve(mesh.solver("pFinal")); } else { pEqn.solve(); }
这个代码实际上做的就是potentiaoFoam求解,然而细致的解析需要首先对非矩形修正做分析,目前并没有足够的添加内容。你可以运行
potentialFoam
算例看压力非矩形修正的效果。OpenFOAM编程指南里面有详细的对比。
-
@李东岳 在 关于piso循环的二次修正的一个疑问 中说:
Jasah建议一般情况下不进行压力非矩形修正,
http://www.cfd-china.com/topic/840/运行出错/5
好像这个帖子里面进行非正交修正解决问题了? -
@hongfu2233
非正交修正是这样的:- fvm::laplacian返回的是fvMatrix,fvMatrix既包含矩阵M,又包含源项b。
- fvc::laplacian返回的volScalarField,相当于只有b,没有M。
非正交修正是把laplacian算子分成正交部分和非正交部分
- 对于fvc而言,反正两部分最后要加在一起,无所谓啦,都一样;
- 而fvm只能对正交部分进行隐式离散,相关的系数进入矩阵M(并非不能对非正交部分进行隐式离散,而是这样的话M矩阵就不是和mesh对应的lduMatrix相同的稀疏结构了),非正交部分显式离散,进入源项b中。
- 这种伎俩叫延迟修正(deferred correction),我看来其实就是部分隐式部分显式的离散。
部分显式部分隐式的离散会带来信息滞后的问题,比如说$\Delta p^{(n)} = s$方程整成了$L_I(p^{(n)})=s - L_E(p^{(n-1)})$,虽然$\Delta p^{(n)} = L_I(p^{(n)})+L_E(p^{(n)})$,但是$\Delta p^{(n)} \ne L_I(p^{(n)})+L_E(p^{(n-1)})$,除非$p^{(n)}=p^{(n-1)}$,也就是$p$已经收敛
所以说对于fvc而言,这没有任何问题,但对于fvm而言,你一次求解只能求得:$p^{(n)}=L_I^{-1}(s - L_E(p^{(n-1)})) \ne \Delta^{-1}(s)$,这个误差只有靠不断地求解同样的方程(比如pEqn),也就是非正交修正(nonOrthogonalCorrection)中看似没有变化的那个pEqn来消除。在非正交修正的迭代过程中,其实每次解的方程不是不变的,只是其中的fvm::laplacian生成的隐式项系数没有变化,显式项是和你给的$p$有关的,是有变化的,所以实际上实现的是上述的$p^{(n-1)}$到$p^{(n)}$的迭代修正循环。
其实OpenFOAM中很多的延迟修正都是类似的部分隐式部分显式离散,比如High Resolution格式和High Order格式的差值也是这么搞的。
这种半隐式离散理论上必须达到最终收敛才是和全隐式离散是一样的解,但是只要显式部分远小于隐式部分,问题也不大,甚至收敛阶数和速度也不太受影响。不过对于压力方程还是解得准确点儿好。