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. interFoam计算气泡槽道流时的压力问题

interFoam计算气泡槽道流时的压力问题

已定时 已固定 已锁定 已移动 OpenFOAM
20 帖子 3 发布者 16.4k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 学流体的小明学 离线
    学流体的小明学 离线
    学流体的小明 神
    写于 最后由 编辑
    #2

    fvSolution

    /*--------------------------------*- C++ -*----------------------------------*\
    | =========                 |                                                 |
    | \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
    |  \\    /   O peration     | Version:  v2012                                 |
    |   \\  /    A nd           | Website:  www.openfoam.com                      |
    |    \\/     M anipulation  |                                                 |
    \*---------------------------------------------------------------------------*/
    FoamFile
    {
        version     2.0;
        format      ascii;
        class       dictionary;
        location    "system";
        object      fvSolution;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    
    solvers
    {
        "alpha.water.*"
        {
            nAlphaCorr      2;
            nAlphaSubCycles 3;
            cAlpha          1.0;
    
            MULESCorr       yes;
            nLimiterIter    5;
    
            solver          smoothSolver;
            smoother        symGaussSeidel;
            tolerance       1e-8;
            relTol          0;
        }
    
        p_rgh
        {
            solver          GAMG;
            tolerance       1e-07;
            relTol          0.01;
            smoother        GaussSeidel;
        }
    
        "pcorr.*"
        {
            solver          GAMG;
            smoother        GaussSeidel;
            tolerance       1e-8;
            relTol          0;
        }
    
        ".*(rho|rhoFinal)"
        {
            solver          diagonal;
        }   
    
        p_rghFinal
        {
            $p_rgh;
            tolerance       1e-07;
            relTol          0;
        }
    
        U
        {
            solver          smoothSolver;
            smoother        GaussSeidel;
            tolerance       1e-08;
            relTol          0;
            nSweeps         1;
        }
    
        "(T|k|B|nuTilda).*"
        {
            solver          PBiCGStab;
            preconditioner  DILU;
            tolerance       1e-8;
            relTol          0;
        }
    }
    
    PIMPLE
    {
        momentumPredictor no;
        nOuterCorrectors 1;
        nCorrectors     3;
        nNonOrthogonalCorrectors 0;
        correctPhi     yes;
    
        pRefPoint      (0.0201 0.0101 0.0101);
        pRefValue      0;
    }
    
    
    // ************************************************************************* //
    
    

    fvScheme

    /*--------------------------------*- C++ -*----------------------------------*\
    | =========                 |                                                 |
    | \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
    |  \\    /   O peration     | Version:  v2012                                 |
    |   \\  /    A nd           | Website:  www.openfoam.com                      |
    |    \\/     M anipulation  |                                                 |
    \*---------------------------------------------------------------------------*/
    FoamFile
    {
        version     2.0;
        format      ascii;
        class       dictionary;
        location    "system";
        object      fvSchemes;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    
    ddtSchemes
    {
        default         Euler;
    }
    
    gradSchemes
    {
        default         Gauss linear;
    }
    
    divSchemes
    {
        default         none;
        div(phi,alpha)  Gauss vanLeer;
        div(phirb,alpha) Gauss linear;
    
        div(rhoPhi,U)  Gauss limitedLinearV 1;
        div(phi,p)      Gauss linearUpwind grad(p);//limitedLinear 1;
        div(phi,k)      Gauss linear;
        
        div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
    }
    
    laplacianSchemes
    {
        default         Gauss linear corrected;
    }
    
    interpolationSchemes
    {
        default         linear;
    }
    
    snGradSchemes
    {
        default         corrected;
    }
    
    // ************************************************************************* //
    
    

    dynamicMeshDict

    /*--------------------------------*- C++ -*----------------------------------*\
    | =========                 |                                                 |
    | \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
    |  \\    /   O peration     | Version:  v2012                                 |
    |   \\  /    A nd           | Website:  www.openfoam.com                      |
    |    \\/     M anipulation  |                                                 |
    \*---------------------------------------------------------------------------*/
    FoamFile
    {
        version     2.0;
        format      ascii;
        class       dictionary;
        location    "constant";
        object      dynamicMeshDict;
    }
    // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
    
    dynamicFvMesh   dynamicRefineFvMesh;
    
    // How often to refine
    refineInterval  5;
    
    // Field to be refinement on
    field           alpha.water;
    
    // Refine field inbetween lower..upper
    lowerRefineLevel 0.001;
    upperRefineLevel 0.999;
    
    // If value < unrefineLevel unrefine
    unrefineLevel   10;
    
    // Have slower than 2:1 refinement
    nBufferLayers   1;
    
    // Refine cells only up to maxRefinement levels
    maxRefinement   1;
    
    // Stop refinement if maxCells reached
    maxCells        36000000;
    
    // Flux field and corresponding velocity field. Fluxes on changed
    // faces get recalculated by interpolating the velocity. Use 'none'
    // on surfaceScalarFields that do not need to be reinterpolated.
    correctFluxes
    (
        (phi none)
        (nHatf none)
        (rhoPhi none)
        (alphaPhi0.water none)
        (ghf none)
        (alphaPhiUn none)
    );
    
    // Write the refinement level as a volScalarField
    dumpLevel       true;
    
    
    // ************************************************************************* //
    
    C 1 条回复 最后回复
  • C 离线
    C 离线
    coolhhh 神
    在 中回复了 学流体的小明 最后由 编辑
    #3

    @学流体的小明 我没算过多相流,按照算单向流设置压力参考点有些疑问:

    1. 我在模拟建筑绕流时候,用的速度入口。此时出口可以设置fixedValue=0或者zeroGradient。设置fixedValue=0,此时压力参考点没有调用。设置zeroGradient,此时压力参考点对结果影响就很大,需要设置在建筑物位置上方一定距离且要在建筑物影响范围外,此时建筑物位置附近就不受非物理压力脉动影响。
    2. 对不可压缩流体流体,速度入口不满足每个瞬时的质量通量平衡,会导致流场发生非物理压力脉动。直观理解就是整个流场每个时刻输入的流量不同,时多时少,就会造成额外的人为挤压或抽空,压力脉动就大。这个时候可以对入口做个简单的质量通量修正,来抑制非物理压力脉动。参考文章:《Kim, Y., I.P. Castro and Z. Xie, Divergence-free turbulence inflow conditions for large-eddy simulations with incompressible flow solvers. Computers & Fluids, 2013. 84: p. 56-68.》
    3. 当速度入口满足质量通量平衡,无论出口采用fixedValue=0或者zeroGradient,流场里都不会有压力脉动。当入口质量不平衡,采用fixedValue=0在出口边界压力恒为0,但流场中有压力脉动;采用zeroGradient,在参考点附近的压力接近与0,此处的建筑模拟结果就会合理,但流场其他地方仍然是存在压力脉动。
    4. 采用mapFields,可能会出现入口质量通量不平衡,但是用的周期边界似乎不存在这个问题。
    5. 流场中是否有气泡完全不经过的地方?压力参考点的设置的不受气泡影响的位置处
    6. 尝试入口如果只加平均速度剖面,出口设置fixedValue=0,这个时候流场肯定没有压力脉动。再同样测试下气泡槽道中的同样位置的监测点压力,看看是否也是压力脉动过大。如果是的话,那就说明气泡产生的影响不可忽略,就类似于流场中放了个建筑绕流一样,建筑周边就有大的压力波动。
    7. 原来的单向流槽道用meanVelocityForce驱动,因为边界没有指定压力值,应该也调用了压力参考点作用?查看算例是指定了pRefCell 1001; pRefValue 0;。整个流场应该是压力梯度驱动流动,但查看of自带的Channel395算例结果的压力均值,好像没有明显看到沿着X向的压力梯度?
      f23e1681-4e94-4c78-8a6a-e85c3f4f5c98-image.png
    学流体的小明学 1 条回复 最后回复
  • 学流体的小明学 离线
    学流体的小明学 离线
    学流体的小明 神
    在 中回复了 coolhhh 最后由 学流体的小明 编辑
    #4

    @coolhhh 感谢你的回复和讨论。

    1. 关于质量通量平衡这一点,确实就像你说的,我用周期边界应该不受这个影响。

    coolhhh 在 interFoam计算气泡槽道流时的压力问题 中说:
    需要设置在建筑物位置上方一定距离且要在建筑物影响范围外,此时建筑物位置附近就不受非物理压力脉动影响。

    参考点的位置确实会极大地影响到它附近的压力和流场周围的压力,比如下面这张图片,参考点附近的pPrime2Mean是很小的。
    3df80aa3-400d-4966-872b-3d2ceb8a9595-image.png
    Fig. t=0.45s,展向中间截面,pPrime2Mean

    coolhhh 在 interFoam计算气泡槽道流时的压力问题 中说:
    流场中是否有气泡完全不经过的地方?压力参考点的设置的不受气泡影响的位置处

    有的,从当前算出来的结果来看,气泡不会附着到壁面上,也很少靠近壁面,将参考点设置在壁面附近是一种选择,但这会带来另一个问题
    ——由于我的算例上下都是壁面,所以参考点设置在靠近壁面的地方会导致两个壁面上的结果不一致。下面图片是单相槽道流的壁面pPrime2Mean结果,参考点设置是pRefCell=0,pRefValue=0,可以看到下壁面的四个角附近的pPrime2Mean是蓝色的很小的值。由于我是要对壁面上的压力进行分析,所以发现这个问题之后,我重新算了参考点设置在计算域中心的的算例。
    db51fdd9-9692-4407-9729-951cb120cf62-image.png


    coolhhh 在 interFoam计算气泡槽道流时的压力问题 中说:
    尝试入口如果只加平均速度剖面,出口设置fixedValue=0,这个时候流场肯定没有压力脉动。再同样测试下气泡槽道中的同样位置的监测点压力,看看是否也是压力脉动过大。如果是的话,那就说明气泡产生的影响不可忽略,就类似于流场中放了个建筑绕流一样,建筑周边就有大的压力波动。

    感觉气泡产生的影响确实是不可忽略的。


    coolhhh 在 interFoam计算气泡槽道流时的压力问题 中说:
    原来的单向流槽道用meanVelocityForce驱动,因为边界没有指定压力值,应该也调用了压力参考点作用?查看算例是指定了pRefCell 1001; pRefValue 0;。整个流场应该是压力梯度驱动流动,但查看of自带的Channel395算例结果的压力均值,好像没有明显看到沿着X向的压力梯度?

    我计算的单相槽道流也是基于channel395的各种设置的,是调用了压力参考点,但是单相槽道流中,每次修正的值都非常小,压力数据是可以用的。下面的图是壁面上沿流向的一条线(y=0,z=0.01,x变化)的时间历程,pPrime=p-pMean都是直接从OpenFOAM的后处理结果处理出来的,这张图就很nice。
    a43e76f8-85b9-4823-bcb2-785adf01c53b-image.png
    因为是槽道流,设置的压力梯度是和壁面剪切力平衡了的,确实不会看到沿X向的压力梯度。meanVelocityForce相当于加了源项,和重力的表现不一样。

    C 1 条回复 最后回复
  • C 离线
    C 离线
    coolhhh 神
    在 中回复了 学流体的小明 最后由 编辑
    #5

    @学流体的小明 那如果流场中都是充满气泡,难以有合适的地方设置压力参考点,感觉就只能用速度入口加湍流的方式模拟。或者能否把单向槽道流某一个面的风速时程提取出来作为气泡槽道的速度入口加载。

    学流体的小明学 1 条回复 最后回复
  • 学流体的小明学 离线
    学流体的小明学 离线
    学流体的小明 神
    在 中回复了 coolhhh 最后由 编辑
    #6

    @coolhhh 但这样会导致很多问题,入口速度设置好之后,流场还要向下游发展,如何保证湍流没有被耗散掉——这个时候应该不能用meanVelocityForce了。
    我是要得到一个稳定的气泡输运过程,如果按照您的思路,气泡在上游初始化,之后得和湍流一起运动发展一段时间,到达计算域中游下游时候,我可以采集我需要的信息,这会造成我的计算域非常长。而且也很难保证最终是一个遍历态。
    还是先想想从求解压力的方面入手吧😂

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #7

    流场中一些监测点的压力会变成下面这样,可以看到很多点的压力基本是一样的

    为什么不同的网格点的压力是一样的?

    当槽道中仅有一个气泡时,每次修正的值并不大,还可以接受,流场中某点的压力随时间的变化(由于没有重力p=p_rgh)如下图,是可以接受的,由于有气泡经过,该点p会有几次峰。

    单气泡算例,p符合预期么(跟表面张力的关系)

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

    学流体的小明学 1 条回复 最后回复
  • 学流体的小明学 离线
    学流体的小明学 离线
    学流体的小明 神
    在 中回复了 李东岳 最后由 编辑
    #8

    李东岳 在 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也还是符合预期的。
    eddcf281-1d06-458c-bd6f-61f9f5c85a8a-image.png

    下面这张图,中间那个红点是压力参考点,p = 0 Pa,两侧的橘色的斑块是气泡。就可以看到在参考点之外,流场的液体的压力迅速就降低到-289 Pa了。这算是没收敛么
    6202b0ab-f729-4bf9-8ded-5bb8195962b5-image.png

    C 1 条回复 最后回复
  • C 离线
    C 离线
    coolhhh 神
    在 中回复了 学流体的小明 最后由 编辑
    #9

    @学流体的小明 因为这算的是多相流,压力参考点能够指定在water还是gas成分上吗?整个water的压力基本一致,如果压力参考点是以water为基准,那么整个water的压力应该都为0。会不会是默认的压力参考点以gas为准,而gas的压力很小接近于0,然后以这个值为参考点,water的压力值就变为-289?

    学流体的小明学 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #10

    这个看起来是算法的问题。

    1. 单核跑是否有问题?
    2. correctPhi如果变成no是否有问题?

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

    学流体的小明学 1 条回复 最后回复
  • 学流体的小明学 离线
    学流体的小明学 离线
    学流体的小明 神
    在 中回复了 coolhhh 最后由 编辑
    #11

    @coolhhh
    从pEqn.H的代码来看,并没有这种water / gas之分
    @李东岳

    1. 没试过单核跑,单核算得会非常慢,而且估计得算几步才能看结果,我试一下。
    2. correctPhi是必须要是yes的,改成no的话会造成自适应加密出问题,流场所有地方的alpha.water会变得不严格是1,比1小一些,然后流场的所有地方都会加密。
    1 条回复 最后回复
  • 学流体的小明学 离线
    学流体的小明学 离线
    学流体的小明 神
    在 中回复了 李东岳 最后由 编辑
    #12

    @李东岳 东岳老师,最近试了很多参数,发现了点规律。

    1. 应该是自适应网格的问题。如果使用自适应网格而不显式地指定correctPhi,程序会自动调用correctPhi。并且自适应网格必须correctPhi,否则会导致alpha.water出问题,全场都加密。
    bool correctPhi
    (
        pimple.dict().getOrDefault("correctPhi", mesh.dynamic())
    );
    
    1. 不使用自适应网格,但是correctPhi yes,流场的压力结果也正常。
    2. 单核跑,即使是自适应网格,自动调用correctPhi,流场也计算正常。

    应该是 并行 + 自适应网格 的问题?是不是要在dynamicMeshDict中进行correctFluxes操作呀?但我看Tutorial里面都没correctFluxes。

    学流体的小明学 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #13

    我看到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))是否有作用。

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

    学流体的小明学 1 条回复 最后回复
  • 学流体的小明学 离线
    学流体的小明学 离线
    学流体的小明 神
    在 中回复了 李东岳 最后由 编辑
    #14

    我按照您说的方法修改了代码,没有什么大的改变。虽然这行代码确实不太对。
    还有就是不太明白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之后就是自适应加密间隔调大的后果。
    0d82a382-8010-4a8e-bea5-f182143c9520-image.png

    学流体的小明学 1 条回复 最后回复
  • 学流体的小明学 离线
    学流体的小明学 离线
    学流体的小明 神
    在 中回复了 学流体的小明 最后由 编辑
    #15

    学流体的小明 在 interFoam计算气泡槽道流时的压力问题 中说:

    我按照您说的方法修改了代码,没有什么大的改变

    甚至导致结果更差了。
    933c0b16-2a57-4be7-aa2c-93b9204e23fe-image.png

    不进行这样的修改的话,相同的设置下,相同测点的压力如下图,可以看到紫色线有明显的台阶上升,这是气泡经过了这个测点,测到了气泡内部的压强。
    109e2b70-7820-46b4-81d5-195dff6dd753-image.png

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #16

    把方程中,RefCell位置的源项加上一个值,然后系数矩阵对角线上RefCell位置翻倍?

    信息量很大。我稍后回复你这个问题。不过圣诞节要放假了。明天没回复你就得月底了。

    这个看起来是个bug。不过要让官方debug测试,他们需要你提供一个小网格的算例他们复现一下。你这个原本的3D-LES他们debug不动。

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

    学流体的小明学 1 条回复 最后回复
  • 学流体的小明学 离线
    学流体的小明学 离线
    学流体的小明 神
    在 中回复了 李东岳 最后由 编辑
    #17

    我搞了一个125000网格的小算例,也可以复现流场整体异常压力跳跃的问题,不用跑完,跑几分钟就可以用里面的gnuplot脚本画图看到流场的压力。
    算例放上来了,李老师@李东岳 您有空帮我看看,非常感谢!
    singleBubbleChannel_debug.zip

    1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    写于 最后由 编辑
    #18

    把方程中,RefCell位置的源项加上一个值,然后系数矩阵对角线上RefCell位置翻倍?

    我在无痛苦ns方程笔记里面详细的写了这个,你看一下setReference()这一节。

    我下载看一下能不能跑动。感觉有点够呛,我这是单核虚拟机。

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

    学流体的小明学 1 条回复 最后回复
  • 学流体的小明学 离线
    学流体的小明学 离线
    学流体的小明 神
    在 中回复了 李东岳 最后由 编辑
    #19

    单核跑算出来的结果非常好,图中所有测点的压强降到-140左右是因为气泡经过了参考点,参考点(此时在气泡内部)的压强为0,外部的水的压强就应该是-144。这个算例的参考点、测点的设置和我上传的那个不一样。
    d4824375-b9f9-410d-854f-e81b6218addf-image.png

    1 条回复 最后回复
  • 学流体的小明学 离线
    学流体的小明学 离线
    学流体的小明 神
    在 中回复了 学流体的小明 最后由 编辑
    #20

    学流体的小明 在 interFoam计算气泡槽道流时的压力问题 中说:

    应该是 并行 + 自适应网格 的问题?

    更正一下,是 并行+自适应网格+压力参考点 三个要素的共同作用,去掉任何一个都可以算出来好的结果。

    一个新的发现是壁面上会有奇异点,如下图,着色是p_rgh,这些奇异点都处于并行分区的各个界面上。更奇怪的是,上壁面并没有这样的问题。Note:参考点放置在流场中间。
    01292e97-19c8-45be-889b-189c0ff6fe54-image.png

    现在暂时放弃自适应加密了,直接全场加密算,压力就是正确的。
    😂

    1 条回复 最后回复

  • 登录

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