修改湍流模型,定义表达式的问题
-
各位有经验的前辈们,想请教一个问题。我想修改komegaSST的boussnesiq approximation, 我增加了一项标量与张量的混合表达式,但是编译显示定义出问题了。修改部分的定义如下:
报错如下:
对于我的表达式,S是张量,定义出来sij也是张量啊,为什么会报错呢?请各位指点一下 -
https://cfd-china.com/topic/4127/如何提取张量的某一个值/3
这个帖子可以参考。这里提到的
https://cpp.openfoam.org/v8/volFieldsFwd_8H_source.html
他用的变量在62行,你用的变量在61行 volSymmTensorField
61 和 62的区别就在 symmtensor 和 tensor 上,你的代码里是混用了 -
@bestucan 非常感谢您的回复!定义S的时候,因为它是一个对称张量,所以我使用了volSymmtensorField,在编译过程中这一步也没有报错。我排除法尝试确定报错的位置,发现是 volTensorField sij中的divU使用错误,去除它就可以编译了,但是我不知道原因,因为我看其他程序源代码的计算表达式中有直接用divU进行运算的。
-
@King_RVM
不阔气 (´-ω-`)
你的图片的报错信息缩减一下(把foam::这类前缀去掉)geometricfield< tensor<double>, fvpatchfield, volmesh>:: geometricfield( tmp< dimensionedfield< tensor<double>, volmesh> >)
这个函数找不到。没有参数类型为
tmp< dimensionedfield< tensor<double>, volmesh> >
,名为geometricfield
的函数。在 https://cpp.openfoam.org/v8/volFieldsFwd_8H_source.html 确实找不到。加上 divU 就错,说明 divU 与 S 计算改变了结果的数据类型。这是隐式类型转换。就像
int S, z; float divU; z = S; //没问题 z = S + divU //报错,结果隐式转换为浮点数,
divU的类型不对,看看你的 divU 的定义在哪。按说应该是 volScalarField。而 volScalarField 的定义在这里57行
https://cpp.openfoam.org/v8/volFieldsFwd_8H_source.html
应该是相容的 -
@bestucan 谢谢跟我讨论!divU的定义是标量
S跟I 都是张量,我觉得应该可以相加减啊 -
@King_RVM 你好,我试了一下,由于
divU
是一个volScalarField::Internal
类型,运算S-(1.0/3.0)*divU*(1.0)/omega_
返回的也是volScalarField::Internal
类型。
你将sij声明成volTensorField::Internal
类型,编译一下试试。 -
@Cr 谢谢你的回复!我把跟sij的量都修改成了::Internal的形式,这几个量编译倒是没有报错,但是出现了新的错误,提示是openfoam里面源代码的错误,如下
这是怎么回事呢?DimensionedField是定义单位的,我定义的标量矢量I1 I2 V1 V2 V3都是无量纲的量,最后的量纲是乘以密度与湍动能决定的 -
@King_RVM
Foam::T()
是用来求张量场转置的全局函数。如果你的代码没有直接的调用该函数类似V1.T(),那就是在场运算的过程中间接调用了该函数。我试了一圈下来,下面是编译的情况tensor I(1, 0, 0, 0, 1, 0, 0, 0, 1); volScalarField::Internal divU(fvc::div(fvc::absolute(phi, U))()()); volTensorField::Internal sij(-0.33*I*divU); volTensorField ss(fvc::grad(U)); DimensionedField<tensor, volMesh> y(sij); DimensionedField<tensor, volMesh> yCopy(sij); Foam::T(yCopy,y); //OK //y.T(); //compiled Error, no matching function ss.T(); //OK //sij.T(); //compiled Error, no matching function
volTensorField::Internal
的类型实际就是DimensionedField<tensor, volMesh>
,不知道为什么他的成员函数T()编译无法通过(目前我没找到原因)。但volTensorField
的成员函数T()可以编译通过。
所以我建议你将你所有的场变量都声明称volTensorField
类型 -
@King_RVM 对了还有,你上面的场变量都是用拷贝构造的方式生成的,他们应该都是有量纲的。例如
S
的量纲来自于tgradU
。V1
的量纲来自于sij
来自于S
或divU
-
@Cr 是的,我定义I1 I2的时候调用了转置函数,但是我现在发现实际上我不需要,于是删去了转置计算。关于量纲的问题,你说的很对,虽然sij omegeij、标量I1 I2和张量V1 V2 V3没有量纲,但是定义过程中S 与 Omega有量纲,为了减少量纲的问题,我定义如下
sij 与 omegaij的无量纲化是通过除以omega_实现的。现在的报错是与定义的张量I 有关,在sij中,场离散的项symm(tgradU())不能直接与单位对角矩阵I相加减,该怎样把I转换成一样的类型呢?我想通过volTensorField定义I,但是报错。我定义单位对角阵是因为定义sij中1/3*partU/partx需要乘以狄拉克函数,实际计算中就是单位对角阵。
目前报错如下:
-
@Cr 我发现问题来自于单位矩阵的相乘,当我用更简洁的形式去表达sij来避免单位对角矩阵I的表达,sij没有报错,但是V3关于I 的部分报错了。其实我想添加的表达式是
其中sij为除以omega_来做到无量纲化,而图中omegeij为
除以omega_来做到无因次化
我现在修改后的定义为
V3中的I不可避免,因为需要将那一项从标量转为张量,现在的报错如下
-
@King_RVM 这个错误还是类型不统一,sij是
tmp<volTensorField>
类型, I1是一个volTensorField::Internal
或DimensionedField<tensor, volMesh>
类型,OpenFOAM没有定义两种类型的减法,我建议你将所有的vol##Type##Field::Internal
都换成vol##Type##Field
试试。 -
@King_RVM
这个编译错误是OpenFOAM本身源码上的bug,需要对DimensionField的源代码进行改动才可以使编译通过。OpenFOAM-v2006 bug Issues #1868
-
@Cr 我尝试过改成一样的类型,所有都改成vol##Type##Field,但是这样sij会报错
在这里 dev(symm(tgradU()()))是张量除以一个标量还是张量,还是报错。
dev(symm(tgradU()()))的灵感来自于李老师的东岳流体网站http://www.dyfluid.com/docs/tensor.html
-
@Cr 非常感谢这部分资料的提供,我没想过源代码会有问题
-
@King_RVM
dev(symm(tgradU()()))
改为dev(symm(tgradU()))
,同时将sij
的类型声明为tmp<volSymmTensorField>
。
原因:tgradU()
为tmp<T>
的operator()
重载返回T
类型的引用,在这里为GeometricField
类型,GeometricField
的operator()
的重载返回GeometricField::Internal
类型,即dimensionedField<Type, GeoMesh>
,所以类型不匹配,场运算报错。 -
@Cr 非常非常感谢你的分析和回复,我的编译通过了,编译通过之后运行算例有新的问题,原因是tmp这个内存管理小工具用得不好,我最新的通过编译的部分修改如下,供大家参考