新旧版本编程差异问题
-
-
@fangyuanaza 用
k_()
试试? -
@李东岳 谢谢李老师一早就回复学生! 改成k_()还是报一样的错误:
-
@fangyuanaza 去掉
fvc::Susp
试试? -
@李东岳 李老师好~ 这样的话((2.0/3.0)*alpha()*rho()*divU, k_()) + (alpha()*rho()*epsilonByk(F1, F23), k_) 不报错啦,但是后面的ddt(alphat, rho, k_) 去掉fvc::,就不能用ddt来进行对时间的求导了,后面的div(alphaRhoPhi, k_)也会报错:
-
@fangyuanaza 后面保留fvc也会出现跟前面一样的错误 no matching function for call .....
还测试过仿照李老师之前的建议改成k_(), 也是不行 -
@fangyuanaza 你索性把::Internal去掉就不会有问题了 然后你在Internal出来内部场
-
@李东岳 李老师,不好意思,是我没有说清楚。我之前没有用internal,直接定义velScalarField residual = ..., 计算完之后我再update boundary的值。我在V 2.4.0也是这么做的,这里加Internal我也是测试看是不是加了能成功,但是没有,后来也没去掉了,上传图片上保留了。刚刚我也去掉测试了,还是同上面一样的错误。
-
@李东岳 这是我在V 2.4.0上的做法,思路是一样的,就是方程变显示,左右相减,只是V7中湍动能方程更复杂一点,以下是V2.4.0编译成功的写法:
-
@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
-
@李东岳 谢谢李老师的回复~ 但是学生不太理解,volScalarField是继承于GeometricField的类型,k_是volScalarField类型,应该不冲突把?而且为什么fvm中也是这样定义的,也是传入这三个变量就可以用呢?
-
@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_)
8/15