压力基求解器在OpenFOAM中的植入问题
-
最近突然想到一点。对于基于压力的求解过程(包括可压和不可压),由于绝对压力本身数值很大,一般会采取将其拆解为一个很大的常量和真正求解的小量的和。否则压力梯度很难计算准确。
在不可压求解器中,这是一个很自然的处理,因为不可压问题本身也需要一个标定压力(比如1个大气压)。
对于可压的问题来说,以可压缩求解器rhoPimpleFoam甚至燃烧求解器reactingFoam为例,它们都是直接求解了绝对压力(并且等于热力学压力)。这样处理虽然物理上没有问题,但数值上是否会造成由于压力数值很大而带来梯度计算不精确的问题呢?我个人的观点是,尽管是可压问题,但如果是压力基的求解器,也应该可以把压力处理成一个很大的定常量和很小的量的求和,这样应该更准确吧? -
@东岳 恩恩,我的理解是这样,对于涉及到重力的物理问题,将压力处理成p_rgh加上静压是普适的。类似的,从数值角度讲,对于任何一个问题(即使不涉及重力),只要求解过程是基于压力的,那么将压力处理成一个很大的常量和一个相对很小的量的和,也是普适的。这个点我记得在很多CFD的书中都有提及,因为动量方程的源项是压力梯度,只有压力梯度计算准确了速度才会准确。
我以前用FLUENT,FLUENT会让设置一个所谓的operating pressure。我一般都是将其设置为1个大气压,然后在出口处设置压力为0。FLUENT实际计算的是总压减去operating pressure,是一个比较小的量。同样的算例(低马赫数流动,密度有变化,不涉及重力)我在openfoam里面就需要直接将出口的压力设置为1个大气压。或者极端一点,如果我的问题压力很高(比如10个大气压),那么在FLUENT里面我可以将operating pressure设置为10个大气压,然后出口压力依然为0。但在openfoam里面我必须要把出口的压力直接设置为10个大气压。这个压力数值上太大了,任何一个小的误差都会导致错误的速度,不容易算准吧。 -
@东岳 对。但是如果用总压,计算中任何微小的误差都会带来计算的不准确。比如出口是给定的100000,进口是计算出来的,但算成了100009或者100011,这时候压力梯度就不正确了。
其实就是数值计算中,在计算两个量之间的差的时候,如果这两个量本身数值很大,但它们的差别相对于其绝对值来说又非常小(比如10001-10000),这时候一般应该是避免直接去做这两个量的差。处理方法是找一个标定的数值,计算这两个量的绝对值减去标定值后的差别。假设标定值为10000,那么就是计算1-0,而不是10001-10000。印象中这个是数值方法里面一个普适的东西,还是说现在的数值计算精度已经足够高所以不用考虑这个了? -
我也刚好遇到了这个问题,我的理解是在程序计算的过程中,数值精度已经足够高了,可以保证计算正确。但是在将计算结果写到文件的时候,由于输出有效数字的位数,经常会丢失信息。如果断点续算,读文件输入程序的信息就可能产生问题。
举个例子,我计算一个槽道流,压力参考点生效。
区分一下两个算例:CaseA,pRef=0;CaseB,pRef=10000。
这两个Case都可以把壁湍流的速度剖面算得很好,两个Case的结果完全一致,曲线可以重合。但是两个Case输出的压力结果相差很大。CaseA中,paraview查看某个瞬时的流场数据或者surfaces取样输出某个平面的结果,压力p都是
0.XXXX
小数点后很多位。
CaseB中,同样的方法,压力p基本都是10000,或者有是9999.99,这和我限制了
writePrecision 6
有关系。