Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. VOF添加斥力模型

VOF添加斥力模型

已定时 已固定 已锁定 已移动 OpenFOAM
27 帖子 2 发布者 17.8k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 学 离线
    学 离线
    学流体的小明 神
    写于2024年2月29日 13:49 最后由 李东岳 编辑 2024年2月29日 21:51
    #1

    更新一下,顺便就新的问题求助。
    我现在全场加密之后算气泡,然后添加了气泡间斥力,是添加在了phig当中。

    pEqn.H
    surfaceScalarField phig
        (
            (
                mixture.surfaceTensionForce()
              + repulsion // 防止气泡融合的斥力
              - ghf*fvc::snGrad(rho)
            )*rAUf*mesh.magSf()
        );
    

    然后发现当斥力生效的时候,监测的压强出现了我上面帖子中同样的情况,流场中的压力同步地增大或减小,如下图3.5s、4.5s附近的压力曲线。
    a1570118-b008-4d69-a22a-a8fc81f9f444-image.png
    Fig1. 多个probe的p_rgh随时间的变化

    流场如下图,这是一个二维的算例(三维的一样有这个问题,所以拿二维的debug),三个泡在槽道中流动,无重力,上下边界是周期边界,左右是slip的wall,有压力参考点,位置就在左边图的左侧边界附近的“小气泡”的旁边。时间是3.5s,对应Fig1.压力曲线剧烈波动的那一阶段。
    左边的图是alpha.water,中间图是p_rgh,右边图是我添加的斥力。
    斥力仅在两个气泡接近到一定程度时,加在气泡边界上,就是右图中的两个小竖条。问题在于斥力生效的时候,压力参考点附近很奇怪的冒出了气体,这些气体似乎是从1号气泡上抽出来的,由于压力参考点附近有了气体,相当于有了一个气泡,所以由于表面张力,流场中的液体的压强就会下降,可以看到中间图中流场大部分p_rgh是负的几十帕,压力参考点附近有个红点。
    这是Fig1.中流场压力同步地减小的直接原因。
    f0b881aa-ccb0-437d-8fc0-b46239dae3fb-image.png
    Fig2. 流场图像。左,alpha.water;中,p_rgh;右,我添加的斥力源项。

    除了上述的“抽离气体”行为之外,还有可能凭空生成一些气体,表现为全场积分得到的气体体积超过初始生成的气体体积。
    还可能是压力参考点附近出现alpha.water>1的网格,也会导致有grad(alpha.water),然后导致流场其它地方的压力下降。我之前采用自适应加密时候,看到的监测点压力曲线同步增大减小的直接原因就是这种alpha.water>1的现象。

    所以直接原因是压力参考点附近出现了气体,更深层次的原因我感觉是和流场的连续性有关。看计算的log文件,发现出现问题的这一个时间步,time step continuity errors明显大一些。下面是log文件,第一个时间步是没有斥力生效,第二个时间步时候斥力生效了,time step continuity errors也比第一个时间步大了两个数量级。

    Courant Number mean: 0.062496661 max: 0.49675831
    Interface Courant Number mean: 0.00012625052 max: 0.3551864
    deltaT = 5.565631e-06
    Time = 0.02073116103
    
    PIMPLE: iteration 1
    smoothSolver:  Solving for alpha.water, Initial residual = 0.0006698861, Final residual = 2.4349078e-13, No Iterations 3
    Phase-1 volume fraction = 0.99579311  Min(alpha.water) = 1.2926026e-11  Max(alpha.water) = 1.0000346
    MULES: Correcting alpha.water
    Phase-1 volume fraction = 0.99579311  Min(alpha.water) = -0.0043784079  Max(alpha.water) = 1.0000346
    smoothSolver:  Solving for alpha.water, Initial residual = 0.00066896527, Final residual = 2.4380054e-13, No Iterations 3
    Phase-1 volume fraction = 0.99579311  Min(alpha.water) = 1.2926035e-11  Max(alpha.water) = 1.0000345
    MULES: Correcting alpha.water
    Phase-1 volume fraction = 0.99579311  Min(alpha.water) = -0.0043784079  Max(alpha.water) = 1.0000345
    GAMG:  Solving for p_rgh, Initial residual = 0.055540806, Final residual = 7.6812173e-05, No Iterations 3
    Pressure gradient source: uncorrected Ubar = 1.0363001, pressure gradient = 333.76278
    ~~time step continuity errors : sum local = 5.1237013e-08, global = -3.751065e-20, cumulative = -4.8212224e-09
    The pressure at the reference cell is corrected from 0.13807379 to 0~~
    GAMG:  Solving for p_rgh, Initial residual = 0.0012770611, Final residual = 1.733568e-06, No Iterations 5
    Pressure gradient source: uncorrected Ubar = 1.0363001, pressure gradient = 335.51285
    time step continuity errors : sum local = 1.1477203e-09, global = -3.6709073e-20, cumulative = -4.8212224e-09
    The pressure at the reference cell is corrected from 0.0099254384 to 0
    GAMG:  Solving for p_rgh, Initial residual = 0.00012244276, Final residual = 9.5463703e-09, No Iterations 43
    Pressure gradient source: uncorrected Ubar = 1.0363001, pressure gradient = 334.6004
    time step continuity errors : sum local = 6.3417109e-12, global = -3.7236763e-20, cumulative = -4.8212224e-09
    The pressure at the reference cell is corrected from 0.018604574 to 0
    ExecutionTime = 112420.57 s  ClockTime = 112564 s
    
    fieldAverage fieldAverage write:
        Calculating averages
    
    volFieldValue gas_in_domain write:
        volIntegrate(region0) of alpha.air = 6.7310313e-08
    
    Courant Number mean: 0.062903353 max: 0.50213272
    Interface Courant Number mean: 0.00012710096 max: 0.37880418
    deltaT = 5.5439467e-06
    Time = 0.02073670498
    
    PIMPLE: iteration 1
    smoothSolver:  Solving for alpha.water, Initial residual = 0.00066738165, Final residual = 2.5095471e-13, No Iterations 3
    Phase-1 volume fraction = 0.99579311  Min(alpha.water) = 1.292604e-11  Max(alpha.water) = 1.0000345
    MULES: Correcting alpha.water
    Phase-1 volume fraction = 0.99579311  Min(alpha.water) = -0.0043784079  Max(alpha.water) = 1.0000345
    smoothSolver:  Solving for alpha.water, Initial residual = 0.00066646251, Final residual = 2.5131431e-13, No Iterations 3
    Phase-1 volume fraction = 0.99579311  Min(alpha.water) = 1.2926051e-11  Max(alpha.water) = 1.0000345
    MULES: Correcting alpha.water
    Phase-1 volume fraction = 0.99579311  Min(alpha.water) = -0.0043784079  Max(alpha.water) = 1.0000345
    GAMG:  Solving for p_rgh, Initial residual = 0.75668049, Final residual = 0.00077440161, No Iterations 4
    Pressure gradient source: uncorrected Ubar = 1.0362943, pressure gradient = 669.91266
    ~~time step continuity errors : sum local = 1.9935763e-06, global = -6.2120888e-09, cumulative = -1.1033311e-08
    The pressure at the reference cell is corrected from 5523.05 to 0~~
    GAMG:  Solving for p_rgh, Initial residual = 0.0010213942, Final residual = 2.0013854e-06, No Iterations 69
    Pressure gradient source: uncorrected Ubar = 1.036315, pressure gradient = -548.48592
    time step continuity errors : sum local = 1.5198456e-08, global = -6.2120888e-09, cumulative = -1.72454e-08
    The pressure at the reference cell is corrected from 5341.8877 to 0
    GAMG:  Solving for p_rgh, Initial residual = 7.1997514e-05, Final residual = 8.5095615e-09, No Iterations 86
    Pressure gradient source: uncorrected Ubar = 1.036315, pressure gradient = -549.38251
    time step continuity errors : sum local = 6.2499269e-09, global = -6.2120888e-09, cumulative = -2.3457489e-08
    The pressure at the reference cell is corrected from 5299.7144 to 0
    ExecutionTime = 112459.83 s  ClockTime = 112604 s
    
    fieldAverage fieldAverage write:
        Calculating averages
    

    所以有大佬遇到过相同的问题吗?求指点,救救孩子吧,卡在压力这个问题上大半年了🥺🥺🥺🙏🙏🙏

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年2月29日 07:19 最后由 编辑
    #2

    如果确定是斥力的问题的话,为何不这样:找个1万网格的算例,弄两个气泡进去,单核跑,专门debug你添加的斥力。

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    学 1 条回复 最后回复 2024年2月29日 09:23
  • 学 离线
    学 离线
    学流体的小明 神
    在 2024年2月29日 09:23 中回复了 李东岳 最后由 编辑
    #3

    在用二维算例debug了,应该是斥力加得太突兀的原因,也许
    继续求指点

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年2月29日 09:47 最后由 编辑
    #4

    斥力方程写一下,或者sci发一下

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    学 1 条回复 最后回复 2024年2月29日 11:56
  • 学 离线
    学 离线
    学流体的小明 神
    在 2024年2月29日 11:56 中回复了 李东岳 最后由 编辑
    #5

    Short-range repulsive force model for near-contact interactions of bubbles
    Lingxin Zhang, Kai Peng, Xueming Shao, and Jian Deng
    Phys. Rev. E 106, 045110 – Published 25 October 2022
    https://doi.org/10.1103/PhysRevE.106.045110

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年2月29日 13:29 最后由 李东岳 编辑 2024年2月29日 23:58
    #6
    1. 遍历所有相分数在0-1直接的网格,并做标记;
    2. 在标记的网格上,通过方程10判断是要遍历的网格,取第i个网格,算Frep,i=∑NKhij3n;
    3. 对i遍历,有做标记网格上的所有的Frep,i,加到动量方程或压力方程

    你这样debug一下:

    用你的2D算例,网格搞到几千,然后算一下,

    1. 把你的相分数、斥力的云图弄出来,
    2. 显示斥力矢量图,类似下面这个图(显示的是网格上的表面张力)

    首先要把气泡往外推开的过程复现

    捕获.JPG


    他们挺有意思,之前还用多相VOF来算这个,一个气泡一哥相,暴力!

    Direct numerical simulation of deformable rising bubbles at low Reynolds numbers

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 学 离线
    学 离线
    学流体的小明 神
    写于2024年2月29日 16:22 最后由 学流体的小明 编辑 2024年3月1日 00:23
    #7

    斥力矢量图我晚些再搞一下。


    气泡往外推开是复现了的。
    现在发现压力参考点附近的异常是结果,原因还是斥力有些突兀。不使用压力参考点也会出现这种压力振荡。
    下面是不使用压力参考点的一次模拟。压力振荡是存在的,而且是和斥力的出现是同步的。
    8a4c8898-3505-472f-9d18-852baa3ba4e6-Screenshot from 2024-03-01 00-13-58.png

    最开始的时候气泡弹开了,如果不加斥力,上面两个气泡是会融合的。
    3bbsNoReferencevideo1.avi

    压力振荡最厉害的一段时间:3-4s。
    3bbsNoReferencevideo2.avi

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年2月29日 17:24 最后由 编辑
    #8

    一楼从你的描述来看有2个问题:1)空泡发生,2)压力不稳。视频算的可以啊,没看到空泡的发生,第一个问题解决了是吧?

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    学 1 条回复 最后回复 2024年3月1日 03:10
  • 学 离线
    学 离线
    学流体的小明 神
    在 2024年3月1日 03:10 中回复了 李东岳 最后由 编辑
    #9

    也不算是空泡,其实第二个视频中也可以看到有斥力的那对泡,左边的泡变小了,反正又是一个很奇怪的问题,只是在有压力参考点的时候,缺少的那部分气体跑到了压力参考点附近。
    压力不稳是最关键的问题,感觉解决它之后,第一个问题应该也能解决。

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年3月1日 08:37 最后由 编辑
    #10

    压力那个不太好搞。就像你上次发那个帖子一样。我记得你说3者选2就没问题,3者都开启就不行。我初步只能感觉是那个方向的问题,至于咋处理现在也没啥头绪。

    至于相分数变小,倒是可以继续debug一下。

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 学 离线
    学 离线
    学流体的小明 神
    写于2024年3月2日 08:35 最后由 编辑
    #11

    网格上的表面张力是一个surfaceScalarField,要显示的话,看其他人的方法是使用foamToVTK先转化,再用paraview看,感觉有点麻烦。李老师您有什么快速便捷的方法吗?

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年3月3日 07:31 最后由 编辑
    #12

    surfaceScalarField是看不了,不过他那个表面张力是从体场插值过去的,你把体场输出就好了

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 学 离线
    学 离线
    学流体的小明 神
    写于2024年3月3日 07:50 最后由 编辑
    #13

    现在大致上解决了,确实是添加的斥力太大的问题,之前代码写得不太对,写成了K/h3∇α,而正确的表达式应该是Kh3∇α|∇α|,导致某些情况下两个气泡接近时候,由于界面上某些网格的梯度特别大,导致实际添加的斥力会非常非常大。
    现在修改了代码,之前的问题很大程度上解决了,还有一点问题是还是会出现添加斥力比较大的时候,因为总会有气泡不断接近到比较近的时候,从而产生一个比较大的斥力,也会导致全局的压力振荡。就比如下图中这些上下跳的曲线。
    f397b511-1230-4506-9a18-d34690048b6d-image.png


    表面张力是σκ∇α,和斥力的表达式还不一样,我再都算一下volScalarField,不往面上插值什么的,比较一下它俩。

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年3月3日 07:59 最后由 李东岳 编辑 2024年3月3日 16:01
    #14

    还有一点问题是还是会出现添加斥力比较大的时候,因为总会有气泡不断接近到比较近的时候,从而产生一个比较大的斥力

    是的,在最开始最开始你在讨论这个问题的时候,我就想到了可能会有这个问题。所以就跟你讨论了一下。因为我最近从OpenFOAM学习到一个方法来处理这个问题。

    你这个添加斥力的模型,从另外一种角度,可以近似的看做添加一种分散力。同理的一个现象,在气固流动那面,存在一个相压力模型,在相分数超过设定值的时候,添加一个分散力,将alpha打散。正常的算法就是在压力方程中,比如你得处理方式,把这个分散力加进去。但是OpenFOAM那面把这个问题在alpha方程中也处理了。我测试过,如果仅仅是压力方程处理,可能会导致发散(alpha越界)。如果压力方程+相方程同时处理,就非常稳定。

    我觉得你可以借鉴这个方法。

    http://dyfluid.com/reactingTwoPhaseEulerFoam.html

    PS 你这个斥力是1/h3,那面的力是exp指数级别的函数(最终是一个非常陡暴增,力会突然变得高几十个数量级)

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    学 1 条回复 最后回复 2024年3月3日 11:41
  • 学 离线
    学 离线
    学流体的小明 神
    在 2024年3月3日 11:41 中回复了 李东岳 最后由 编辑
    #15

    谢谢李老师提供的思路。我的理解是有两种方法:

    1. 处理相方程,粗略看了一下,感觉这个方法挺复杂。
    2. 可以改一改斥力的表达式,让它不那么大。

    我在输出两个volVectorField,用来比较斥力和表面张力的大小,具体编程上也想请教一下,控制体体心的alpha的单位梯度怎么写。我目前是这样的,单位梯度必须加一个1e-300防止发散。

    // Cell gradient of alpha
    const volVectorField gradAlpha(fvc::grad(alpha1));
    repulsion_Compare = repulsion_Sum*gradAlpha/(mag(gradAlpha)+dimensionedScalar(dimensionSet(0,-1,0,0,0,0,0), 1e-300));
    surfaceTensionMy=mixture.sigmaK()*gradAlpha;

    OpenFOAM在算表面张力的时候,算曲率 κ 的时候用到了面心的alpha单位梯度,也分享一下代码。

    const surfaceVectorField& Sf = mesh.Sf();
    // Cell gradient of alpha
    const volVectorField gradAlpha(fvc::grad(alpha1_, "nHat"));
    // Interpolated face-gradient of alpha
    surfaceVectorField gradAlphaf(fvc::interpolate(gradAlpha));
    // Face unit interface normal
    surfaceVectorField nHatfv(gradAlphaf/(mag(gradAlphaf) + deltaN_));
    correctContactAngle(nHatfv.boundaryFieldRef(), gradAlphaf.boundaryField());
    // Face unit interface normal flux
    nHatf_ = nHatfv & Sf;
    // Simple expression for curvature
    K_ = -fvc::div(nHatf_);
    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年3月4日 06:56 最后由 编辑
    #16

    可以改一改斥力的表达式,让它不那么大

    你直接调节那个K的值不就好了? 反正也是个经验参数。

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 学 离线
    学 离线
    学流体的小明 神
    写于2024年3月4日 09:19 最后由 编辑
    #17

    K调太小的话,气泡间斥力无法弹开气泡,两个气泡会融合。
    现在还挺混乱下面这张图,左侧轴是压力测点的压力,右侧轴是volScalarField repulsion_Sum的最大值。

    1. 有的时候没有斥力,也有全局的压力下降,比如下面的椭圆圈出来的。
    2. 有的时候斥力生效,但是压力没问题。方框中基本水平的蓝色和橙色线。
    3. 总体来说斥力生效会极大地增加压力出问题的风险。

    image.png

    红色箭头是斥力,白色箭头是表面张力,斥力还是比表面张力大一些。
    92d06eaf-5c00-426d-8862-7dd4778420c0-image.png

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年3月5日 10:42 最后由 编辑
    #18

    才想起来,你这个还是周期性网格,所以需要给定压力参考点,我自己简单算了个纯粹的气泡上升,压力还没啥问题。

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    学 1 条回复 最后回复 2024年3月6日 09:27
  • 学 离线
    学 离线
    学流体的小明 神
    在 2024年3月6日 09:27 中回复了 李东岳 最后由 编辑
    #19

    之前试算了很多,发现压力参考点不是最根本的原因,最根本的原因还是添加了这个斥力源项导致的流场压力不稳定。不用压力参考点也算出来了这种压力振荡。
    应该是和具体的代码有关系,和SIMPLE算法里面预测方程有关系。
    我没有往UEqn中加这个斥力项,仅加在了phig里面,也就是在压力泊松方程里面加了,后面速度修正那一行代码中,斥力也是体现在phig当中。
    李老师您怎么写的代码?

    1 条回复 最后回复
  • 李 在线
    李 在线
    李东岳 管理员
    写于2024年3月6日 10:13 最后由 编辑
    #20

    我没有写全,就在function里面测试了一下这个力的大小(很多参数都是拍脑袋硬植入):

    functions
    {
    setDeltaT
    {
    type coded;
    libs ("libutilityFunctionObjects.so");
    writeControl writeTime;
    executeControl timeStep;
    code
    #{
    #};
    codeExecute
    #{
    const volScalarField& alpha
    (
    mesh().lookupObject<volScalarField>("alpha.air")
    );
    const surfaceVectorField& Sf = mesh().Sf();
    const volVectorField gradAlpha("gradAlpha", fvc::grad(alpha));
    surfaceVectorField gradAlphaf(fvc::interpolate(gradAlpha));
    const dimensionedScalar deltaN_
    (
    "deltaN",
    1e-8/pow(average(mesh().V()), 1.0/3.0)
    );
    surfaceVectorField nHatfv(gradAlphaf/(mag(gradAlphaf) + deltaN_));
    volVectorField nHatv("nHatv", gradAlpha/(mag(gradAlpha) + deltaN_));
    surfaceScalarField nHatf = nHatfv & Sf;
    volScalarField K("K", -fvc::div(nHatf));
    volScalarField interface("interface", alpha);
    volVectorField force("force", nHatv);
    List<label> markedCell;
    forAll(mesh().C(), i)
    {
    force[i] = Zero;
    if (alpha[i] < 0.99 && alpha[i] > 0.01)
    {
    interface[i] = 1.0;
    markedCell.append(i);
    }
    else
    {
    interface[i] = 0.0;
    }
    }
    forAll(markedCell, i)
    {
    label celli = markedCell[i];
    forAll(markedCell, j)
    {
    label cellj = markedCell[j];
    scalar dij = mag(mesh().C()[celli] - mesh().C()[cellj]);
    scalar posneg = nHatv[celli] & nHatv[cellj];
    if (posneg < 0.0)
    {
    if (dij < 0.15)
    {
    scalar K = 1e-2;
    force[celli] += K*nHatv[celli]/pow3(dij);
    }
    }
    }
    }
    markedCell.clear();
    K.write();
    nHatv.write();
    gradAlpha.write();
    force.write();
    interface.write();
    #};
    }
    }

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
2024年2月29日 13:49

2/27

2024年2月29日 07:19

未读 25
2024年9月11日 11:10
  • 登录

  • 登录或注册以进行搜索。
2 / 27
  • 第一个帖子
    2/27
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]