CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

    关于geometricOneField的理解

    OpenFOAM
    2
    4
    958
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • D
      dzsmoglai 最后由 李东岳 编辑

      大家好!这是我在CFD中文网的第一篇帖子,希望能得到大家的帮助。
      在OpenFOAM里,对于不可压流动,相分数Alpha的类型为geometricOneField。而对于可压缩流动alpha则为volScalarField.但是很奇怪的是,interFoam求解器使用了GeometricOneField这个类型来表示alpha。不难理解,interFOAM是一个采用VOF方法追踪液面的mixture模型,其alpha值在界面处肯定会取到0-1之间的值。这就带来了我的第一个问题:
      (1)interFoam为什么选择geometricOneField为alpha的数据类型?
      其次,我想对kEpsilon湍流模型进行些修改,然后在尝试进行一些基于alpha的加减乘除运算时,编译器就会报错。因为alpha的类型GeometricOneField类的定义里,似乎只定义了geometricOneField和自身的乘除法运算符,而没有它和常数scalar或者volScalarField类型数据的计算方法。所以根本无法通过编译。但是在构建epsilon和k方程的时候。又可以见到如下代码

         // Local references
          const alphaField& alpha = this->alpha_;
          const rhoField& rho = this->rho_;
          const surfaceScalarField& alphaRhoPhi = this->alphaRhoPhi_;
          const volVectorField& U = this->U_;
          volScalarField& nut = this->nut_;
          fv::options& fvOptions(fv::options::New(this->mesh_));
      
          eddyViscosity<RASModel<BasicTurbulenceModel>>::correct();
      
          volScalarField::Internal divU
          (
              fvc::div(fvc::absolute(this->phi(), U))().v()
          );
      
          tmp<volTensorField> tgradU = fvc::grad(U);
          volScalarField::Internal G
          (
              this->GName(),
              nut.v()*(dev(twoSymm(tgradU().v())) && tgradU().v())
          );
          tgradU.clear();
      
          // Update epsilon and G at the wall
          epsilon_.boundaryFieldRef().updateCoeffs();
      
          // Dissipation equation
          tmp<fvScalarMatrix> epsEqn
          (
              fvm::ddt(alpha, rho, epsilon_)
            + fvm::div(alphaRhoPhi, epsilon_)
            - fvm::laplacian(alpha*rho*DepsilonEff(), epsilon_)
           ==
              ***C1_*alpha()*rho()*G*epsilon_()/k_()***
            - fvm::SuSp(((2.0/3.0)*C1_ - C3_)*alpha()*rho()*divU, epsilon_)
            - fvm::Sp(C2_*alpha()*rho()*epsilon_()/k_(), epsilon_)
            + epsilonSource()
            + fvOptions(alpha, rho, epsilon_)
          );
      
          epsEqn.ref().relax();
          fvOptions.constrain(epsEqn.ref());
          epsEqn.ref().boundaryManipulate(epsilon_.boundaryFieldRef());
          solve(epsEqn);
          fvOptions.correct(epsilon_);
          bound(epsilon_, this->epsilonMin_);
      

      但是我自己写的alpha()*scalar(0.5)就无法通过编译。

      这就是我的第二个问题:
      (2) 如何对geometricOneField类型的变量进行和常数及volScalarField进行计算?

      以上两个问题,希望大神进行下解答!

      1 条回复 最后回复 回复 引用
      • 李东岳
        李东岳 管理员 最后由 李东岳 编辑

        @dzsmoglai 在 关于geometricOneField的理解 中说:

        interFoam为什么选择geometricOneField为alpha的数据类型?

        我没见到interFoam用geometricOneField

        :wolaile:

        MULES::correct
                    (
                        geometricOneField(),
                        alpha1, //这个是要求的
                        alphaPhi10,
                        talphaPhi1Corr0.ref(),
                        oneField(),
                        zeroField()
                    );
        

        我知道了,你可能说湍流模型里面为什么没有用 alpha?VOF是直接模拟,不能考虑alpha,对于你的相乘操作,并没有看见对相应的操作符重载,
        https://github.com/OpenFOAM/OpenFOAM-2.2.x/blob/master/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.H

        CFD高性能服务器 http://dyfluid.com/servers.html
        2023年,线下CFD课,预热一下 http://dyfluid.com/class.html

        1 条回复 最后回复 回复 引用
        • D
          dzsmoglai 最后由 编辑

          @东岳 感谢东岳老师的解答。我现在就是想修改interFoam使用的湍流模型。目前基于kEpsilon自己修改了一个,主要修改的就是把默认为0的Epsilon源项,修改为一个公式,这个公式涉及到alpha的一些运算,但是因为alpha时geometricOneField所以无法进行加减和求梯度。所以我就很困惑:
          (1)CMULES算法求解的alpha肯定是个volScalarField啊(从时间文件夹中存储的alpha值就可以知道)
          (2)从interFoam的Make/options里边也可以发现,它用的就是incompresibleTurbulenceModel这个库
          (3)在interFoam调用turbulence->correct命令时,湍流模型的具体实现过程中,从kEpsilon.C源代码中也可以发现它调用了alpha(),那这个alpha到底时volScalarField还是geometricOneField呢?
          再就是,我最想解答的
          (4)如果想在epsilon source term中加入基于volScalarField类型的alpha的一些计算,该如何实现?

          谢谢!

          1 条回复 最后回复 回复 引用
          • 李东岳
            李东岳 管理员 最后由 编辑

            湍流模型中的alpha是1,之所以调用,是为了节省代码复用,rho也是一样的,不可压缩里面也调用rho。但是在可压缩里面,rho就不是1了

            如果想在epsilon source term中加入基于volScalarField类型的alpha的一些计算,该如何实现?

            代码:

            const volScalarField& alphaField = mesh_.lookupObject<volScalarField>("alpha");
            
            

            然后你就可以调用alphaField了,上面代码没测试,你看看能不能用,不确定kEpsilon.C里面有没有mesh_成员,没有的话换一个别的

            CFD高性能服务器 http://dyfluid.com/servers.html
            2023年,线下CFD课,预热一下 http://dyfluid.com/class.html

            1 条回复 最后回复 回复 引用
            • First post
              Last post