OpenFOAM中动量方程扩散项的问题



  • 首先贴出动量方程,这张文章的截图引用自冶金领域公认SCI(MMTB)

    0_1523695986786_1.png

    0_1523696074361_2.png

    式中的有效黏度(effective viscosity)为层流黏度与湍流黏度之和,我平常对湍流黏度的理解即为论文中湍流黏度的公式定义。但是在openfoam中UEqn.H文件中对此项的编写为turbulence->divDevRhoReff(rho, U),对此我不是很理解,此项具体返回的是怎样的表达式呢?
    在OpenFOAM的算例constant文件中设置了层流黏度,湍流黏度的边界是在0文件中的nut中设置的吗?
    nut与turbulence->divDevRhoReff(rho, U)有怎样的联系吗?
    对于turbulence->divDevRhoReff(rho, U)这一项的理解我也查阅了一下,大家可以参考以下的链接中Tobi的解释,他的解释中表达式和我图片中贴的是一回事吗?
    网站链接如下:

    https://www.cfd-online.com/Forums/openfoam-solving/58214-calculating-divdevreff.html

    (可能要使劲往下翻一翻:chitang:
    问题有点多,我可能是个问题少年:mihu: :mihu: :mihu:


  • 网格教授 OpenFOAM教授 管理员

    @dingcyOpenFOAM中动量方程扩散项的问题 中说:

    turbulence->divDevRhoReff(rho, U),对此我不是很理解,

    长答案

    turbulence是一个指针,divDevRhoReff(rho, U)是函数名称。举例,如果你用的是simpleFoam,其在createFields.H中创建了

    autoPtr<incompressible::turbulenceModel> turbulence
    (
        incompressible::turbulenceModel::New(U, phi, laminarTransport)
    );
    

    其中``为OpenFOAM的智能指针,你可以理解为指针。这一句表示创建名称为turbulenceincompressible::turbulenceModel类型的智能指针autoPtr

    对于incompressible::turbulenceModelincompressible表示C++中类的名称空间,turbulenceModel在文件turbulentTransportModel.H中被改名,实际上他就是IncompressibleTurbulenceModel<transportModel>

    IncompressibleTurbulenceModel<transportModel>在文件IncompressibleTurbulenceModel.H,其为一个类模板。

    在求解器中,simpleFoam调用了turbulence->divDevReff(U)其对应IncompressibleTurbulenceModel.H文件中的函数

    virtual tmp<fvVectorMatrix> divDevReff(volVectorField& U) const;
    

    其返回

    divDevRhoReff(U);
    

    同时,IncompressibleTurbulenceModel继承了incompressibleTurbulenceModelincompressibleTurbulenceModel是一个虚基类,不能创建具体的类型,在它基础上,可以创建RAS, LES等类型。举例,在kEpsilon这个具体的类型里面,其建立在eddyViscosity类型上,eddyViscosity类型建立在linearViscousStress类型上,在linearViscousStress.C文件里,定义了

    template<class BasicTurbulenceModel>
    Foam::tmp<Foam::fvVectorMatrix>
    Foam::linearViscousStress<BasicTurbulenceModel>::divDevRhoReff
    (
        const volScalarField& rho,
        volVectorField& U
    ) const
    {
        return
        (
          - fvc::div((this->alpha_*rho*this->nuEff())*dev2(T(fvc::grad(U))))
          - fvm::laplacian(this->alpha_*rho*this->nuEff(), U)
        );
    }
    

    此项具体返回的是怎样的表达式呢?

    短答案:上面代码的最终形式就是这个表达式。

    式中的有效黏度(effective viscosity)为层流黏度与湍流黏度之和,

    见下面的代码,正是nut的定义,二者之和

    //- Return the effective viscosity
            virtual tmp<volScalarField> nuEff() const
            {
                return tmp<volScalarField>
                (
                    new volScalarField
                    (
                        IOobject::groupName("nuEff", this->alphaRhoPhi_.group()),
                        this->nut() + this->nu()
                    )
                );
            }
    

    湍流黏度的边界是在0文件中的nut中设置的吗?

    是的

    nut与turbulence->divDevRhoReff(rho, U)有怎样的联系吗?

    turbulence->divDevRhoReff(rho, U)见上文描述,nut只是湍流粘度。

    对于turbulence->divDevRhoReff(rho, U)这一项的理解我也查阅了一下,大家可以参考以下的链接中Tobi的解释,他的解释中表达式和我图片中贴的是一回事吗?
    网站链接如下:

    有点长,暂时先不看了。。不过Tobi这个人玩CFD理论很多年了,他贴出来的应该没问题。

    对了,OpenFOAM的Turbulence类型变得越来越复杂,但是目前还不是最复杂的,其中类的调用纷杂交错,看起来非常混乱。如果要学习,建议从粘度模型开始学习。湍流代码放后一些。