新旧版本编程差异问题
-
请教各位老师~学生想看看湍动能方程左右两边的差值,于是将fvm改为fvc,就不是隐式方程了,而是直接显式求差值。这种方法在openfoamV 2.4 0上成功了,但是在openfoamV7上会报错,代码如下:
报错如下,显示SuSp中(2.0/3.0)*alpha()*rho()*divU与 k_类型不一致?我开始以为是SuSp的问题,因为这个代表根据rho的正负决定用隐式还是显式,但是改成Sp, 还是同样的报错,请各位老师指点下迷津~
-
@fangyuanaza 用
k_()
试试? -
@fangyuanaza 去掉
fvc::Susp
试试? -
@fangyuanaza 后面保留fvc也会出现跟前面一样的错误 no matching function for call .....
还测试过仿照李老师之前的建议改成k_(), 也是不行 -
@fangyuanaza 你索性把::Internal去掉就不会有问题了 然后你在Internal出来内部场
-
@fangyuanaza 我知道什么原因了,以tke方程第一项为例,在OpenFOAM V240版本中,
fvc::SuSp(2.0/3.0*rho_*divU, k_)
这里面的量都是volScalarField, 定义rho_与divU的时候也是这样,但是在新版本V7中fvc::SuSp(2.0/3.0*alpha()*rho()*divU, k_)
中,这些量都是内部场的量,没有包含边界数据,改成fvc::SuSp(2.0/3.0*alpha*rho*divU, k_)
,并且divU的定义也从volScalarField::Internel 改成volScalarField, 就可以编译成功。但是这样太麻烦了吧,比如epsilonByk的传入变量也都是volScalarField::Internel形式的,要全部重新定义一边,这样感觉改起来太笨了,请教大家有什么好的改进方式么?从volScalarField::Internal的量,除了重新定义的方法,怎么能改成volScalarField,让显式离散fvc重新能用上,求tke方程残差呢? -
后续的故事一直在这里自问自答 把里面的量重新定义成带边界的量之后就可以用fvc了(除kSource()与fvOpetions(alpha, rho, k_)以外),现在还有一项没有搞定,请教下各位CFDer, 就是fvc::ddt(alpha, rho, k_)这一项,报错是
error: no matching function for call to ‘ddt(const alphaField&, const rhoField&, Foam::volScalarField&)’ + fvc::ddt(alpha, rho, k_) ~~~~~~~~^~~~~~~~~~~~~~~~
问题是fvc与fvm中此项定义是一样的,都是:
ddt ( const volScalarField& alpha, const volScalarField& rho, const GeometricField<Type, fvPatchField, volMesh>& vf ) { return fv::ddtScheme<Type>::New ( vf.mesh(), vf.mesh().ddtScheme ( "ddt(" + alpha.name() + ',' + rho.name() + ',' + vf.name() + ')' ) ).ref().fvmDdt(alpha, rho, vf); }
虽然说alphg的类型是const alphaField&, rho的类型是rhoField&, 它们俩是geometricOneField 不是 volScalarField,但是为什么fvm可以进行运算但是fvc不可以呢?
-
@fangyuanaza 在 新旧版本编程差异问题 中说:
error: no matching function for call to ‘ddt(const alphaField&, const rhoField&, Foam::volScalarField&)’
+ fvc::ddt(alpha, rho, k_)ddt ( const volScalarField& alpha, const volScalarField& rho, const GeometricField<Type, fvPatchField, volMesh>& vf )
单独从这一段错误来看,你的k_应该不是
const GeometricField<Type, fvPatchField, volMesh>& vf
-
@fangyuanaza 主要是那个
k_
不是const -
@李东岳 我重新定义了k_, 将其强制变成const,但是还是报错,错误如下:
error: no matching function for call to ‘ddt(const alphaField&, const rhoField&, const volScalarField&)’ + fvc::ddt(alpha, rho, k_) ~~~~~~~~^~~~~~~~~~~~~~~~
可见k_前面已经有const,但是还是不行,可见应该还是要修改alpha与rho的类型?但是我重新赋值定义alpha, rho为volScalarField, 会报初始化错误,不能直接这样改,修改方式如下:
const volScalarField alphat = this->alpha_; 再在fvc中调用fvc::ddt(alphat, rhot, k_)