修改湍流模型,定义表达式的问题
-
https://cfd-china.com/topic/4127/如何提取张量的某一个值/3
这个帖子可以参考。这里提到的
https://cpp.openfoam.org/v8/volFieldsFwd_8H_source.html
他用的变量在62行,你用的变量在61行 volSymmTensorField
61 和 62的区别就在 symmtensor 和 tensor 上,你的代码里是混用了 -
@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
应该是相容的 -
@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
类型 -
@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需要乘以狄拉克函数,实际计算中就是单位对角阵。
目前报错如下: