压力基求解器在OpenFOAM中的植入问题
-
最近突然想到一点。对于基于压力的求解过程(包括可压和不可压),由于绝对压力本身数值很大,一般会采取将其拆解为一个很大的常量和真正求解的小量的和。否则压力梯度很难计算准确。
在不可压求解器中,这是一个很自然的处理,因为不可压问题本身也需要一个标定压力(比如1个大气压)。
对于可压的问题来说,以可压缩求解器rhoPimpleFoam甚至燃烧求解器reactingFoam为例,它们都是直接求解了绝对压力(并且等于热力学压力)。这样处理虽然物理上没有问题,但数值上是否会造成由于压力数值很大而带来梯度计算不精确的问题呢?我个人的观点是,尽管是可压问题,但如果是压力基的求解器,也应该可以把压力处理成一个很大的定常量和很小的量的求和,这样应该更准确吧? -
但如果是压力基的求解器,也应该可以把压力处理成一个很大的定常量和很小的量的求和,这样应该更准确吧?
你说的就是openfoam中p_rgh,压力一般和重力互相制约
-
@东岳 东岳老师,p_rgh这个我也注意到了。比如燃烧求解器fireFoam,它的总压有三个部分,p = p_rgh + rho*gh + pRef。如果设置重力加速度为0,那么p = p_rgh + pRef。在fireFoam的tutorial算例里面,也确实能看到pRef被设置为一个很大的值(1个大气压)。问题是,为什么不是所有的可压缩/燃烧求解器都这样处理?我看到用p_rgh的好像更多的是与多相流相关的求解器。
-
fireFoam那面的p = p_rgh + rho*gh + pRef应该不具备普适性,具体我没看。不过将p处理成p_rgh和静水压力非常普适性,所有的带重力源项的都可以这样设置,比如可压缩、传热、拉格朗日都可以
-
@东岳 恩恩,我的理解是这样,对于涉及到重力的物理问题,将压力处理成p_rgh加上静压是普适的。类似的,从数值角度讲,对于任何一个问题(即使不涉及重力),只要求解过程是基于压力的,那么将压力处理成一个很大的常量和一个相对很小的量的和,也是普适的。这个点我记得在很多CFD的书中都有提及,因为动量方程的源项是压力梯度,只有压力梯度计算准确了速度才会准确。
我以前用FLUENT,FLUENT会让设置一个所谓的operating pressure。我一般都是将其设置为1个大气压,然后在出口处设置压力为0。FLUENT实际计算的是总压减去operating pressure,是一个比较小的量。同样的算例(低马赫数流动,密度有变化,不涉及重力)我在openfoam里面就需要直接将出口的压力设置为1个大气压。或者极端一点,如果我的问题压力很高(比如10个大气压),那么在FLUENT里面我可以将operating pressure设置为10个大气压,然后出口压力依然为0。但在openfoam里面我必须要把出口的压力直接设置为10个大气压。这个压力数值上太大了,任何一个小的误差都会导致错误的速度,不容易算准吧。 -
只要求解过程是基于压力的,那么将压力处理成一个很大的常量和一个相对很小的量的和,也是普适的。这个点我记得在很多CFD的书中都有提及,因为动量方程的源项是压力梯度,只有压力梯度计算准确了速度才会准确。
考虑x方向管道,进出口压力,进口压力10,出口压力0,和进口压力100010,出口压力100000,压力梯度不是一样么?
-
@东岳 对。但是如果用总压,计算中任何微小的误差都会带来计算的不准确。比如出口是给定的100000,进口是计算出来的,但算成了100009或者100011,这时候压力梯度就不正确了。
其实就是数值计算中,在计算两个量之间的差的时候,如果这两个量本身数值很大,但它们的差别相对于其绝对值来说又非常小(比如10001-10000),这时候一般应该是避免直接去做这两个量的差。处理方法是找一个标定的数值,计算这两个量的绝对值减去标定值后的差别。假设标定值为10000,那么就是计算1-0,而不是10001-10000。印象中这个是数值方法里面一个普适的东西,还是说现在的数值计算精度已经足够高所以不用考虑这个了?