新旧版本编程差异问题
- 
							
							
							
							
请教各位老师~学生想看看湍动能方程左右两边的差值,于是将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_)这一项,报错是 把里面的量重新定义成带边界的量之后就可以用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_)
 
			



