修改湍流模型,定义表达式的问题



  • 各位有经验的前辈们,想请教一个问题。我想修改komegaSST的boussnesiq approximation, 我增加了一项标量与张量的混合表达式,但是编译显示定义出问题了。修改部分的定义如下:
    0d0eaddc-7b8b-41a5-a1ec-98ba7ab97bf3-image.png
    报错如下:
    610fe244-cf1b-4023-b54d-bb6912f36867-image.png
    915f14ec-75cf-4791-a374-3e5f53b2d74c-image.png
    对于我的表达式,S是张量,定义出来sij也是张量啊,为什么会报错呢?请各位指点一下


  • Linux讲师 OpenFOAM讲师

    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进行运算的。


  • Linux讲师 OpenFOAM讲师

    @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
    应该是相容的

    :jingya:



  • @bestucan 谢谢跟我讨论!divU的定义是标量
    1b81bc54-66ff-47b3-a4ce-23aaf0154c94-image.png
    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里面源代码的错误,如下
    c980370d-c445-4946-a28a-e6a264918362-image.png
    这是怎么回事呢?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的量纲来自于tgradUV1的量纲来自于sij来自于SdivU



  • @Cr 是的,我定义I1 I2的时候调用了转置函数,但是我现在发现实际上我不需要,于是删去了转置计算。关于量纲的问题,你说的很对,虽然sij omegeij、标量I1 I2和张量V1 V2 V3没有量纲,但是定义过程中S 与 Omega有量纲,为了减少量纲的问题,我定义如下
    28185789-d193-475a-9011-1f0f1f1cfb4f-image.png
    sij 与 omegaij的无量纲化是通过除以omega_实现的。现在的报错是与定义的张量I 有关,在sij中,场离散的项symm(tgradU())不能直接与单位对角矩阵I相加减,该怎样把I转换成一样的类型呢?我想通过volTensorField定义I,但是报错。我定义单位对角阵是因为定义sij中1/3*partU/partx需要乘以狄拉克函数,实际计算中就是单位对角阵。
    目前报错如下:
    828449f3-bb44-40c0-bbb1-6ae642e2d24d-image.png



  • @Cr 我发现问题来自于单位矩阵的相乘,当我用更简洁的形式去表达sij来避免单位对角矩阵I的表达,sij没有报错,但是V3关于I 的部分报错了。其实我想添加的表达式是
    25757ede-1d35-4623-8d10-2788e0d6075b-image.png
    其中sij为cec40daf-13d9-44d3-bf7e-61a92acf8065-image.png除以omega_来做到无量纲化,而图中omegeij为
    ee306b56-06c9-438f-ac03-902bf67a13ee-image.png 除以omega_来做到无因次化
    我现在修改后的定义为
    3d87bad7-075c-4bbb-b533-06fb22d1fe17-image.png
    V3中的I不可避免,因为需要将那一项从标量转为张量,现在的报错如下
    3193455d-088b-4d1f-9255-70ebadab8382-image.png
    3d2949a0-ef49-44d9-a089-defaa3a21b8e-image.png



  • @King_RVM 这个错误还是类型不统一,sij是tmp<volTensorField>类型, I1是一个volTensorField::InternalDimensionedField<tensor, volMesh>类型,OpenFOAM没有定义两种类型的减法,我建议你将所有的vol##Type##Field::Internal都换成vol##Type##Field试试。



  • @King_RVM bb4e5bc1-39a3-4fbc-943d-1019cb40c7b6-image.png 这个编译错误是OpenFOAM本身源码上的bug,需要对DimensionField的源代码进行改动才可以使编译通过。OpenFOAM-v2006 bug Issues #1868



  • @Cr 我尝试过改成一样的类型,所有都改成vol##Type##Field,但是这样sij会报错
    e3c888ce-86c4-47a4-9ed8-bb676780024c-image.png

    在这里 dev(symm(tgradU()()))是张量除以一个标量还是张量,还是报错。
    dev(symm(tgradU()()))的灵感来自于李老师的东岳流体网站http://www.dyfluid.com/docs/tensor.html
    f748e291-26af-466e-9885-35506ed5d1c4-image.png



  • @Cr 非常感谢这部分资料的提供,我没想过源代码会有问题



  • @King_RVM dev(symm(tgradU()()))改为 dev(symm(tgradU())),同时将sij的类型声明为tmp<volSymmTensorField>
    原因:tgradU()tmp<T>operator()重载返回T类型的引用,在这里为GeometricField类型,GeometricFieldoperator()的重载返回GeometricField::Internal类型,即dimensionedField<Type, GeoMesh>,所以类型不匹配,场运算报错。



  • @Cr 非常非常感谢你的分析和回复,我的编译通过了,编译通过之后运行算例有新的问题,原因是tmp这个内存管理小工具用得不好,我最新的通过编译的部分修改如下,供大家参考
    71970107-5d69-49f0-bca7-a3c7871a60e9-image.png


Log in to reply
 

CFD中文网 2016 - 2020 | 京ICP备15017992号-2