OpenFOAM中动量方程扩散项的问题
-
首先贴出动量方程,这张文章的截图引用自冶金领域公认SCI(MMTB)
式中的有效黏度(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
(可能要使劲往下翻一翻 )
问题有点多,我可能是个问题少年 -
@dingcy 在 OpenFOAM中动量方程扩散项的问题 中说:
turbulence->divDevRhoReff(rho, U),对此我不是很理解,
长答案
turbulence
是一个指针,divDevRhoReff(rho, U)
是函数名称。举例,如果你用的是simpleFoam
,其在createFields.H
中创建了autoPtr<incompressible::turbulenceModel> turbulence ( incompressible::turbulenceModel::New(U, phi, laminarTransport) );
其中``为OpenFOAM的智能指针,你可以理解为指针。这一句表示创建名称为
turbulence
的incompressible::turbulenceModel
类型的智能指针autoPtr
。对于
incompressible::turbulenceModel
,incompressible
表示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
继承了incompressibleTurbulenceModel
,incompressibleTurbulenceModel
是一个虚基类,不能创建具体的类型,在它基础上,可以创建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类型变得越来越复杂,但是目前还不是最复杂的,其中类的调用纷杂交错,看起来非常混乱。如果要学习,建议从粘度模型开始学习。湍流代码放后一些。