interFoam计算气泡槽道流时的压力问题
-
@李东岳 东岳老师,最近试了很多参数,发现了点规律。
- 应该是自适应网格的问题。如果使用自适应网格而不显式地指定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之后就是自适应加密间隔调大的后果。
-
学流体的小明 在 interFoam计算气泡槽道流时的压力问题 中说:
我按照您说的方法修改了代码,没有什么大的改变
不进行这样的修改的话,相同的设置下,相同测点的压力如下图,可以看到紫色线有明显的台阶上升,这是气泡经过了这个测点,测到了气泡内部的压强。
-
我搞了一个125000网格的小算例,也可以复现流场整体异常压力跳跃的问题,不用跑完,跑几分钟就可以用里面的gnuplot脚本画图看到流场的压力。
算例放上来了,李老师@李东岳 您有空帮我看看,非常感谢!
singleBubbleChannel_debug.zip -
学流体的小明 在 interFoam计算气泡槽道流时的压力问题 中说:
应该是 并行 + 自适应网格 的问题?
更正一下,是 并行+自适应网格+压力参考点 三个要素的共同作用,去掉任何一个都可以算出来好的结果。
一个新的发现是壁面上会有奇异点,如下图,着色是
p_rgh
,这些奇异点都处于并行分区的各个界面上。更奇怪的是,上壁面并没有这样的问题。Note:参考点放置在流场中间。
现在暂时放弃自适应加密了,直接全场加密算,压力就是正确的。
😂
20/20