Simple算法中通量phi的计算
-
多数求解器都采用的是simple类方法,以icoFoam为例,压力方程求解过程中更新phi的语句为 phi = phiHbyA - pEqn.flux(),然后又用 U = HbyA - rAU*fvc::grad(p)更新了速度;速度更新之后,又用U.correctBoundaryConditions()修正速度的边界条件。
但问题是,自始至终程序也没有对通量phi进行修正,也就是说在边界处phi是不正确的。不知道是我没有找到phi边界修正,还是程序中就是没有这项?@东岳
-
也就是说在边界处phi是不正确的。不知道是我没有找到phi边界修正,
边界处的
phi
不需要计算,是用户给的。加入速度1m/s,乘以网格边界面积,就是phi
啊,并且不变。
-
@东岳 边界条件只是给了变量本身,并没有计算通量吧。
-
给了速度,通量补救顺其自然的确定了么
-
@东岳 代码中用 phi = phiHbyA - pEqn.flux()求通量,而不是通过U求通量。在边界条件中并没有找到显式通过U修正边界通量的语句。
-
phi = phiHbyA - pEqn.flux()
是对phi
内部面的赋值,phi
的边界面给定U
,phi
边界面自动确定
-
@东岳 额,我现在的问题,就是不知道Phi的边界面在哪里自动确定的:(,在进行哪一步操作的时候确定的呢?
-
@dzw05
phi
是surfaceScalarField
,是没有boundary face的。
-
surfaceScalarField phi ( IOobject ( "phi", runTime.timeName(), mesh, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), linearInterpolate(U) & mesh.Sf() );
-
@wwzhao 其实也是有boundaryface的,在phi文件中,是会出现boundaryField的。
-
@dzw05
surfaceScalarField
的boundary field总是calculated或empty,所以相当于没有。此外,surfaceScalarField
的嵌套类Boundary没有initEvaluate
和evaluate
两个函数,所以调用surfaceScalarField
的correctBoundaryConditions
时会编译报错不通过。
-
@wwzhao 对于boundary field这里明白了,多谢。但回到我帖子的问题,也就是说phi的boundary field没有进行显式的更新,那么以icoFoam为例,压力方程求解过程中更新phi的语句为 phi = phiHbyA - pEqn.flux(),这里求得的通量phi的边界是怎么保证正确的呢?尤其是对于wall边界条件,通量应该是零。
-
对流项的离散需要用到通量,internal face上的通量即为phi,而boundary face上的通量则通过U计算得到。
用PISO/SIMPLE算法得到的速度场是天然守恒的,所以boundary face上的通量肯定没有问题。
-
-
我同样有个问题就是通量是用phi = phiHbyA - pEqn.flux()修正 ,为什么不直接在下面这条语句的后面直接用phi = fvc::flux(U)来更新呢,这样直接顺带把边界也更新了?
U = HbyA - rAU*fvc::grad(p); U.correctBoundaryConditions();