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. MPPICInterFoam 中如何通过alphac得到alpha1和alpha2?

MPPICInterFoam 中如何通过alphac得到alpha1和alpha2?

已定时 已固定 已锁定 已移动 OpenFOAM
45 帖子 5 发布者 29.9k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • T 离线
    T 离线
    Tens 神
    在 2022年4月29日 06:53 中回复了 Jasper 0 最后由 编辑
    #16

    @jasper-0 是的吧

    J 1 条回复 最后回复 2022年4月29日 07:27
  • J 离线
    J 离线
    Jasper 0
    在 2022年4月29日 07:27 中回复了 Tens 最后由 编辑
    #17

    @tens 多谢大佬!:146:

    1 条回复 最后回复
  • J 离线
    J 离线
    Jasper 0
    在 2022年4月29日 07:52 中回复了 Jasper 0 最后由 编辑
    #18

    @jasper-0 在 MPPICInterFoam 中如何通过alphac得到alpha1和alpha2? 中说:

    @tens 感谢大佬的解答!也就是说通过以下代码求得的alpha1是占连续相的体积分数?那最后结果跑出来后要想得到总的alpha1是不是要在paraview里面做计算alpha1*alphac?

     MULES::explicitSolve
    
                (
    
                    alphac,
    
                    alpha1,
    
                    phiCN,
    
                    alphaPhi10,
    
                    Sp,
    
                    (Su + divU*min(alpha1(), scalar(1)))(),
    
                    oneField(),
    
                    zeroField()
    
                );
    
            }
    

    我发现interFoam中alpha1(即alpha1)的求解对应下面这个公式,
    fc8b4830-ff2d-443a-963e-2296c8a0dd98-image.png
    而MPPICInterFoam中通过以上代码求得的alphan为
    02fcca20-ece1-40c3-887e-2300c61638e5-image.png
    公式右边第二项ca41a44d-3aca-4f4c-a1fa-fb6db0acee7d-image.png 是用alpha占连续相的体积分数算出来的,
    而2e01bf25-6b01-4028-bc0c-7ba891a59490-image.png 和d27bc105-6b30-492f-a60a-83197f4a6f52-image.png 都是总的相分数,

    所以此方程右边第二项是不是应该乘以个alphac呢?即
    c6f853e2-97b5-4810-ba56-dbd5f2ba9053-image.png
    还望大佬解答一下,万分感谢!

    T 1 条回复 最后回复 2022年4月29日 11:10
  • T 离线
    T 离线
    Tens 神
    在 2022年4月29日 11:10 中回复了 Jasper 0 最后由 Tens 编辑 2022年4月29日 19:19
    #19

    @jasper-0 这个公式是哪里看到的,字母对应的意义不理解,在程序中相体积分数应该是通过控制方程求的吧

    fvScalarMatrix alpha1Eqn
            (
                (
                    LTS
                  ? fv::localEulerDdtScheme<scalar>(mesh).fvmDdt(alphac, alpha1)
                  : fv::EulerDdtScheme<scalar>(mesh).fvmDdt(alpha1)
                )
              + fv::gaussConvectionScheme<scalar>
                (
                    mesh,
                    phiCN,
                    upwind<scalar>(mesh, phiCN)
                ).fvmDiv(phiCN, alpha1)
             - fvm::Sp(fvc::ddt(alphac) + fvc::div(phiCN), alpha1)
             ==
                Su + fvm::Sp(Sp + divU, alpha1)
            );
    
            alpha1Eqn.solve();
    

    c1a86900-c8cb-4725-8012-786156c338bc-image.png

    J 1 条回复 最后回复 2022年4月29日 11:27
  • J 离线
    J 离线
    Jasper 0
    在 2022年4月29日 11:27 中回复了 Tens 最后由 编辑
    #20

    @tens 这一步应该是用upwind格式求出来alpha1之后然后下面再通过MULES::correct进行修正。如果不进行修正的话,就是我之前提到的MULES::explicitSolve,在MULESTemplates.C里面定义了这个函数:

    template<class RdeltaTType, class RhoType, class SpType, class SuType>
    void Foam::MULES::explicitSolve
    (
    const RdeltaTType& rDeltaT,
    const RhoType& rho,
    volScalarField& psi,
    const surfaceScalarField& phiPsi,
    const SpType& Sp,
    const SuType& Su
    )
    {
    Info<< "MULES: Solving for " << psi.name() << endl;
    const fvMesh& mesh = psi.mesh();
    scalarField& psiIf = psi;
    const scalarField& psi0 = psi.oldTime();
    psiIf = 0.0;
    fvc::surfaceIntegrate(psiIf, phiPsi);
    if (mesh.moving())
    {
    psiIf =
    (
    mesh.Vsc0()().field()*rho.oldTime().field()
    *psi0*rDeltaT/mesh.Vsc()().field()
    + Su.field()
    - psiIf
    )/(rho.field()*rDeltaT - Sp.field());
    }
    else
    {
    psiIf =
    (
    rho.oldTime().field()*psi0*rDeltaT
    + Su.field()
    - psiIf
    )/(rho.field()*rDeltaT - Sp.field());
    }
    psi.correctBoundaryConditions();
    }

    其中

     psiIf =
         (
             rho.oldTime().field()*psi0*rDeltaT
           + Su.field()
           - psiIf
         )/(rho.field()*rDeltaT - Sp.field());
    

    就是我上面提到的方程f0e20d8f-9383-4c9d-b4e4-9b8533c8c69c-image.png
    alphan应该就是最终求得的新的时间步的体积分数

    T 1 条回复 最后回复 2022年4月29日 13:44
  • T 离线
    T 离线
    Tens 神
    在 2022年4月29日 13:44 中回复了 Jasper 0 最后由 Tens 编辑 2022年4月29日 21:47
    #21

    @jasper-0
    0e85dbdf-ee3c-449b-ac56-b0e366bf4679-image.png
    懂了,现在就是说是红色部分的问题对吧,我看了代码中这部分是通过下面代码求的

    fvc::surfaceIntegrate(psiIf, phiPsi)
    

    而里面的phiPsi则对应的这一部分
    87b34b23-8ec8-40f0-bb9e-001511b06be6-image.png
    通过追踪

    alphaPhi10 = talphaPhi1Un;
    
    //又查到
    
    tmp<surfaceScalarField> talphaPhi1Un
            (
                fvc::flux
                (
                    phiCN(),
                    cnCoeff*alpha1 + (1.0 - cnCoeff)*alpha1.oldTime(),
                    alphaScheme
                )
              + fvc::flux
                (
                   -fvc::flux(-phir, alpha2, alpharScheme),
                    alpha1,
                    alpharScheme
                )
            );
    

    而其中的phiCN则

    tmp<surfaceScalarField> phiCN(alphaPhic);
    // Calculate the Crank-Nicolson off-centred volumetric flux
    if (ocCoeff > 0)
    {
    phiCN = cnCoeff*alphaPhic + (1.0 - cnCoeff)*alphaPhic.oldTime();
    }

    如果不采用CN格式phiCN就等于alphaPhic,又查到

     alphacf = fvc::interpolate(alphac);
    alphaPhic = alphacf*phi;
    

    所以本质上图一中红色部分还是通过alphac*alpha1得到的

    J 2 条回复 最后回复 2022年4月29日 13:55
  • J 离线
    J 离线
    Jasper 0
    在 2022年4月29日 13:55 中回复了 Tens 最后由 编辑
    #22

    @tens 懂了懂了,大佬牛!:146:

    T Z 2 条回复 最后回复 2022年4月29日 14:11
  • T 离线
    T 离线
    Tens 神
    在 2022年4月29日 14:11 中回复了 Jasper 0 最后由 编辑
    #23

    @jasper-0
    互相交流,以前从没这么认真的看过这么底层的东西,这次也学到了很多:chitang:

    J 1 条回复 最后回复 2022年4月29日 14:15
  • J 离线
    J 离线
    Jasper 0
    在 2022年4月29日 14:15 中回复了 Tens 最后由 编辑
    #24

    @tens :chouchou:

    1 条回复 最后回复
  • Z 离线
    Z 离线
    zhe
    在 2022年5月13日 08:11 中回复了 Jasper 0 最后由 编辑
    #25

    @jasper-0 你好,看到你这个问题却是很有意思。解释的code与公式对应起来了。但我相问一下,那么最终为什么interFoam和MPPICInterFoam的公式还是不一样啊?

    J 1 条回复 最后回复 2022年5月13日 08:26
  • J 离线
    J 离线
    Jasper 0
    在 2022年5月13日 08:26 中回复了 zhe 最后由 编辑
    #26

    @zhe MPPICInterFoam 就是多了个alphac啊,考虑拉格朗日粒子对体积分数的影响

    Z 1 条回复 最后回复 2022年5月13日 08:30
  • Z 离线
    Z 离线
    zhe
    在 2022年5月13日 08:30 中回复了 Jasper 0 最后由 编辑
    #27

    @jasper-0 换句话说,alphac在interFoam里就是1,所以可以直接省略。谢谢。

    J 1 条回复 最后回复 2022年5月13日 08:34
  • J 离线
    J 离线
    Jasper 0
    在 2022年5月13日 08:34 中回复了 zhe 最后由 编辑
    #28

    @zhe 对

    1 条回复 最后回复
  • Z 离线
    Z 离线
    zhe
    写于2022年5月14日 14:16 最后由 编辑
    #29

    我测试了一下大家说的,在MPPICInterFoam里,加入粒子。但是alpha.water和alphac是不符合逻辑的。在最底部分,应该是只有水,那么alpha的值就该都是0.38。为什么在alpha.water却是0.62?

    alpha.png

    J 1 条回复 最后回复 2022年5月15日 04:04
  • J 离线
    J 离线
    Jasper 0
    在 2022年5月15日 04:04 中回复了 zhe 最后由 编辑
    #30

    @zhe alpha.water 是占连续相的体积分数,如果没有空气只有水的话,理论上应该alpha.water都是1吧,你看看是不是你alpha.water图例显示的问题?

    Z 1 条回复 最后回复 2022年5月15日 10:30
  • Z 离线
    Z 离线
    zhe
    在 2022年5月15日 10:30 中回复了 Jasper 0 最后由 编辑
    #31

    @jasper-0 理论上,是应该这样的。我有两个问题:第一,哪里提到alpha1和aloha2只是占连续相的比值?我们希望它只是占连续相比值,但code里并没有提过吧。我是怕先入为主了,因为确实对不上。第二,你对比的alpha1的求解公式,帮助很大。但从物理意义上来说,alpha1*alphac就是考虑了粒子影响后的求解方式?它俩相乘是啥意义啊?

    1 条回复 最后回复
  • J 离线
    J 离线
    Jasper 0
    在 2022年5月16日 02:48 中回复了 Tens 最后由 编辑
    #32

    @tens 在 MPPICInterFoam 中如何通过alphac得到alpha1和alpha2? 中说:

    @jasper-0
    0e85dbdf-ee3c-449b-ac56-b0e366bf4679-image.png
    懂了,现在就是说是红色部分的问题对吧,我看了代码中这部分是通过下面代码求的

    fvc::surfaceIntegrate(psiIf, phiPsi)
    

    而里面的phiPsi则对应的这一部分
    87b34b23-8ec8-40f0-bb9e-001511b06be6-image.png
    通过追踪

    alphaPhi10 = talphaPhi1Un;
    
    //又查到
    
    tmp<surfaceScalarField> talphaPhi1Un
            (
                fvc::flux
                (
                    phiCN(),
                    cnCoeff*alpha1 + (1.0 - cnCoeff)*alpha1.oldTime(),
                    alphaScheme
                )
              + fvc::flux
                (
                   -fvc::flux(-phir, alpha2, alpharScheme),
                    alpha1,
                    alpharScheme
                )
            );
    

    而其中的phiCN则

    tmp<surfaceScalarField> phiCN(alphaPhic);
    // Calculate the Crank-Nicolson off-centred volumetric flux
    if (ocCoeff > 0)
    {
    phiCN = cnCoeff*alphaPhic + (1.0 - cnCoeff)*alphaPhic.oldTime();
    }

    如果不采用CN格式phiCN就等于alphaPhic,又查到

     alphacf = fvc::interpolate(alphac);
    alphaPhic = alphacf*phi;
    

    所以本质上图一中红色部分还是通过alphac*alpha1得到的

    @zhe 看这条消息,code中就是按这个公式求的,alphan*alphac是真实的相体积分数,因此求得的alphan就是占连续相的体积分数

    Z 1 条回复 最后回复 2022年5月25日 15:46
  • Z 离线
    Z 离线
    zhe
    在 2022年5月25日 15:46 中回复了 Jasper 0 最后由 编辑
    #33

    @jasper-0 不好意思,最近没看到回复。如果像你说的alpha1*alphac就是真实的体积分数,那么alpha1才应该是整个cell里的alpha1啊,否则不需要再去乘以alphac.
    我之前怀疑过,MPPICInterFoam并不是像我们想象的那样,alpha1+alpha2+alpha_p = alphac + alpha_p = 1。而是按照interFoam的alpha1 + alpha2 = 1进行了两相流的计算。随后在动量方程和连续方程中,乘以alphac(这个值与lapha1和alpha2无关,而是用1-alpha_p来的)的效果,以保证真实流过的体积是考虑过粒子占比后的,也能解释方程右边加入的momentum transfer的力。所以可以说OpenFOAM目前做的三相流耦合,还是秉承了粒子在流体中不占体积来的(只是有相互作用力)。
    以上如果有不对的,希望可以多交流,感谢!

    J 1 条回复 最后回复 2022年5月25日 23:17
  • J 离线
    J 离线
    Jasper 0
    在 2022年5月25日 23:17 中回复了 zhe 最后由 编辑
    #34

    @zhe 在 MPPICInterFoam 中如何通过alphac得到alpha1和alpha2? 中说:

    那么alpha1才应该是整个cell里的alpha1啊

    没看懂这是什么意思。举个例子,比如alphac=1-theta=0.8, alpha1=0.5,那么phase1所占整个cell的体积分数就是0.8*0.5=0.4,phase2也是0.4,0.4+0.4+0.2=1,在MPPICInterFoam中粒子是考虑了体积分数的

    Z 1 条回复 最后回复 2022年5月26日 09:54
  • Z 离线
    Z 离线
    zhe
    在 2022年5月26日 09:54 中回复了 Jasper 0 最后由 编辑
    #35

    @jasper-0 MPPICInterFoam中考虑了体积分数是为了保证质量守恒。你举的例子,alpha1=0.5本身就是占据整个cell的体积分数。而乘以alphac后得到的是实际占据cell的体积分数(因为cell中被粒子占据了一部分)。所以,整个过程中,alpha1一直都是0.5(alpha2=1-alpha1=1-0.5=0.5)这样是符合算法的。而上述例子中最后的0.4+0.4+0.2=1。可是OpenFOAM对于alpha2的求解是通过1-alpha1. 0.4+0.4不等于1。
    考虑一个简单的例子,只有粒子和水。alphac=1-theta=0.8。那么如果考虑了粒子的占比,那么水在这里就该是alpha1=alphac=0.8.那么在根据alpha1alphac=0.64?这个值是什么?
    然而回到我说的没有考虑粒子占比,对于alpha1的值,一直是占据cell的,那么alpha1就该是等于1(alpha2=1-alpha1=1-1=0. 符合假设前提)。而在实际运动过程中,由于粒子占比,alpha1实际的流通量是alpha1
    alphac=1*0.8=0.8. 这里考虑了alphac的影响,但是跟alpha1本身的值没有任何关系。
    我做了个最简单的验证,上下一共5个网格,最下面的放了一颗粒子。下面3个网格是水,上面是空气。得到的数据是
    444.png

    希望能帮助大家。

    T 2 条回复 最后回复 2022年5月26日 10:36
2022年4月27日 09:32

25/45

2022年5月13日 08:11

2022年5月26日 12:25
  • 登录

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