interFoam计算气泡槽道流时的压力问题
-
李东岳 在 interFoam计算气泡槽道流时的压力问题 中说:
为什么不同的网格点的压力是一样的?A点的值可能是100+0.1,B点的值可能是100+0.2,就是修正的量太大了,把它们本身的空间起伏都淹没了
李东岳 在 interFoam计算气泡槽道流时的压力问题 中说:
单气泡算例,p符合预期么(跟表面张力的关系)符合,多气泡算例的表面张力关系也是符合的。下面这个截面的图,
p_water = -289 Pa, p_gas = -165 Pa
,虽然气泡半径0.001 m,应该是差144 Pa,但考虑到变形,算出来的结果差124 Pa也还是符合预期的。
下面这张图,中间那个红点是压力参考点,
p = 0 Pa
,两侧的橘色的斑块是气泡。就可以看到在参考点之外,流场的液体的压力迅速就降低到-289 Pa
了。这算是没收敛么
-
@李东岳 东岳老师,最近试了很多参数,发现了点规律。
- 应该是自适应网格的问题。如果使用自适应网格而不显式地指定correctPhi,程序会自动调用correctPhi。并且自适应网格必须correctPhi,否则会导致alpha.water出问题,全场都加密。
bool correctPhi ( pimple.dict().getOrDefault("correctPhi", mesh.dynamic()) );
- 不使用自适应网格,但是correctPhi yes,流场的压力结果也正常。
- 单核跑,即使是自适应网格,自动调用correctPhi,流场也计算正常。
应该是 并行 + 自适应网格 的问题?是不是要在dynamicMeshDict中进行correctFluxes操作呀?但我看Tutorial里面都没correctFluxes。
-
我看到Correctphi代码里面:
while (pcorrControl.correctNonOrthogonal()) { // Solve for pcorr such that the divergence of the corrected flux // matches the divU provided (from previous iteration, time-step...) fvScalarMatrix pcorrEqn ( fvm::laplacian(rAUf, pcorr) == fvc::div(phi) - divU ); pcorrEqn.setReference(0, 0); pcorrEqn.solve(); if (pcorrControl.finalNonOrthogonalIter()) { phi -= pcorrEqn.flux(); } }
第10行是硬植入的,你看看把
pcorrEqn.setReference(0, 0)
改成p_rghEqn.setReference(pRefCell, getRefCellValue(p_rgh, pRefCell))
是否有作用。 -
我按照您说的方法修改了代码,没有什么大的改变。虽然这行代码确实不太对。
还有就是不太明白setRefrence()
这个函数template<class Type> void Foam::fvMatrix<Type>::setReference ( const label celli, const Type& value, const bool forceReference ) { if ((forceReference || psi_.needReference()) && celli >= 0) { source()[celli] += diag()[celli]*value; diag()[celli] += diag()[celli]; } }
把方程中,RefCell位置的源项加上一个值,然后系数矩阵对角线上RefCell位置翻倍?
还发现一点是自适应加密的间隔可以调小,改成1。每次都运行自适应这个模块,但不是每一步都会导致网格变化,所以调小一些也没事。可能需要
nBufferLayers
调大到2。
自适应加密间隔调小之后,流场也算得比较好了。自适应加密间隔再从1调整到5,压力马上就出问题了。下面图中0.09s之后就是自适应加密间隔调大的后果。