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.6k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • J 离线
    J 离线
    Jasper 0
    写于 最后由 编辑
    #1

    大家好,本人最近在研究MPPICInterFoam中的代码,在createFields中,有如下代码。对alphac进行定义之后,最后两行通过 alphac=1-theta 对alphac进行了更新,但是我好奇alpha1和alpha2是如何更新的呢?请大佬帮忙解答一下,谢谢。

     volScalarField alphac
     (
         IOobject
         (
             "alphac",
             runTime.timeName(),
             mesh,
             IOobject::READ_IF_PRESENT,
             IOobject::AUTO_WRITE
         ),
         mesh,
         dimensionedScalar(dimless, Zero),
         zeroGradientFvPatchScalarField::typeName
     );
     alphac.oldTime();
     
     volScalarField alphacRho(alphac*rho);
     alphacRho.oldTime();
     
     Info<< "Constructing kinematicCloud " << endl;
     basicKinematicMPPICCloud kinematicCloud
     (
         "kinematicCloud",
         rho,
         U,
         mu,
         g
     );
     
     // Particle fraction upper limit
     scalar alphacMin
     (
         1.0
       - (
             kinematicCloud.particleProperties().subDict("constantProperties")
            .get<scalar>("alphaMax")
         )
     );
     
     // Update alphac from the particle locations
     alphac = max(1.0 - kinematicCloud.theta(), alphacMin);
     alphac.correctBoundaryConditions();
    
    1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    写于 最后由 编辑
    #2

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

    MPPICInterFoam

    你这个看起来不是openfoam.org 原生的solver吧?
    如果是下面的这个solver的话,alpha1 和 alpha2 会自动更新

    https://github.com/TonkomoLLC/MPPICInterDyMFoam/blob/master/MPPICInterDyMFoam/createFields.H

    volScalarField& alpha1(mixture.alpha1());
    volScalarField& alpha2(mixture.alpha2());
    

    游荡

    J 1 条回复 最后回复
  • J 离线
    J 离线
    Jasper 0
    在 中回复了 星星星星晴 最后由 编辑
    #3

    @星星星星晴 哦我跟您的是一样的,我只是选取了一部分代码。您给出的这两行在alphac的定义上面,我认为作为代码层面,是不是不会返回去求alpha1和2了?

    星 1 条回复 最后回复
  • 星 离线
    星 离线
    星星星星晴
    在 中回复了 Jasper 0 最后由 编辑
    #4

    @jasper-0 不好意思,这部分我不懂, 我不做VOF的,只说是在createfield.H里面,alpha1和alpha2是这么定义的,而且会随着mixture.alpha1 和mixture.alpha2 的变化更新,至于具体怎么算的,你这个还要看你的solver 还有后续的过程, 这只是初始化,肯定后续有计算和更新的

    游荡

    J 1 条回复 最后回复
  • J 离线
    J 离线
    Jasper 0
    在 中回复了 星星星星晴 最后由 编辑
    #5

    @星星星星晴 谢谢大佬了,我再继续研究一下

    T 1 条回复 最后回复
  • T 离线
    T 离线
    Tens 神
    在 中回复了 Jasper 0 最后由 编辑
    #6

    @jasper-0 我个人理解是这样的,createFields.H只是创建初始场,所以没必要这么准确,而在循环中的alpha1是在alphaEqn.H里直接求,alpha2=1-alpha1。

    J 1 条回复 最后回复
  • J 离线
    J 离线
    Jasper 0
    在 中回复了 Tens 最后由 编辑
    #7

    @tens 谢谢您的回复,通过alphaEqn.H 发现有alphac和alpha1的关系

    T 1 条回复 最后回复
  • T 离线
    T 离线
    Tens 神
    在 中回复了 Jasper 0 最后由 编辑
    #8

    @jasper-0
    af5c534b-0c5f-4d64-9725-d95899822d6a-image.png

    J 1 条回复 最后回复
  • J 离线
    J 离线
    Jasper 0
    在 中回复了 Tens 最后由 编辑
    #9

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

    @jasper-0
    af5c534b-0c5f-4d64-9725-d95899822d6a-image.png

    通过alphaEqn.H中的206-226行有如下代码,这几行代码应该是求解出来了乘以alphac之后的alpha1,那alpha2怎么是1-alpha1呢?不是应该alphac-alpha1吗?还望高手解答一下啊

    else
            {
                alphaPhi10 = talphaPhi1Un;
    
                MULES::explicitSolve
                (
                    alphac,
                    alpha1,
                    phiCN,
                    alphaPhi10,
                    Sp,
                    (Su + divU*min(alpha1(), scalar(1)))(),
                    oneField(),
                    zeroField()
                );
            }
    
            alpha2 = 1.0 - alpha1;
    
            mixture.correct();
        }
    
    T 1 条回复 最后回复
  • T 离线
    T 离线
    Tens 神
    在 中回复了 Jasper 0 最后由 Tens 编辑
    #10

    @jasper-0
    我的理解,alphac是颗粒的体积分数,1-alphac是连续相的体积分数,alpha1是连续相中液相占连续相的体积分数,alpha2是连续相中气相占连续相的体积分数。

    T 1 条回复 最后回复
  • T 离线
    T 离线
    Tens 神
    在 中回复了 Tens 最后由 Tens 编辑
    #11

    @tens 睡觉前发现说反了,alphac是连续相的,1-alphac是液滴的,总之我理解的是alpha1和alpha2是占连续相的而不是总的

    Z 1 条回复 最后回复
  • J 离线
    J 离线
    Jasper 0
    写于 最后由 编辑
    #12

    @tens 对,所以我好奇怎么在程序中alpha2 = 1.0 - alpha1?而不是alpha2 = alphac - alpha1?

    T 1 条回复 最后回复
  • Z 离线
    Z 离线
    zhouxu
    在 中回复了 Tens 最后由 编辑
    #13

    @tens 膜拜大佬的作息

    1 条回复 最后回复
  • T 离线
    T 离线
    Tens 神
    在 中回复了 Jasper 0 最后由 编辑
    #14

    @jasper-0 难道讲的不好理解吗:135:
    因为alpha1和alpha2是占连续相的而不是总的,连续相中只有液相或者气相,所以除了液相(alpha1)就是气相(alpha2=1-alpha1),这个1不是总体积,而是总的连续相。
    换个意思说,如果全部是占总体积的分数,颗粒为1-alphac,连续液相为alpha1*alphac,连续气相为alpha2 * alphac

    1 条回复 最后回复
  • J 离线
    J 离线
    Jasper 0
    写于 最后由 编辑
    #15

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

     MULES::explicitSolve
    
                (
    
                    alphac,
    
                    alpha1,
    
                    phiCN,
    
                    alphaPhi10,
    
                    Sp,
    
                    (Su + divU*min(alpha1(), scalar(1)))(),
    
                    oneField(),
    
                    zeroField()
    
                );
    
            }
    
    T J 2 条回复 最后回复
  • T 离线
    T 离线
    Tens 神
    在 中回复了 Jasper 0 最后由 编辑
    #16

    @jasper-0 是的吧

    J 1 条回复 最后回复
  • J 离线
    J 离线
    Jasper 0
    在 中回复了 Tens 最后由 编辑
    #17

    @tens 多谢大佬!:146:

    1 条回复 最后回复
  • J 离线
    J 离线
    Jasper 0
    在 中回复了 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 条回复 最后回复
  • T 离线
    T 离线
    Tens 神
    在 中回复了 Jasper 0 最后由 Tens 编辑
    #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 条回复 最后回复
  • J 离线
    J 离线
    Jasper 0
    在 中回复了 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 条回复 最后回复

  • 登录

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