Skip to content
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
CFD中文网

CFD中文网

  1. CFD中文网
  2. OpenFOAM
  3. 修改湍流模型,定义表达式的问题

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

已定时 已固定 已锁定 已移动 OpenFOAM
19 帖子 5 发布者 12.5k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • King_RVMK 离线
    King_RVMK 离线
    King_RVM
    写于 最后由 编辑
    #1

    各位有经验的前辈们,想请教一个问题。我想修改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也是张量啊,为什么会报错呢?请各位指点一下

    1 条回复 最后回复
  • bestucanB 离线
    bestucanB 离线
    bestucan 版主 大神
    写于 最后由 编辑
    #2

    https://cfd-china.com/topic/4127/如何提取张量的某一个值/3

    这个帖子可以参考。这里提到的
    https://cpp.openfoam.org/v8/volFieldsFwd_8H_source.html
    他用的变量在62行,你用的变量在61行 volSymmTensorField
    61 和 62的区别就在 symmtensor 和 tensor 上,你的代码里是混用了

    滚来滚去……~(~o ̄▽ ̄)~o 滚来滚去都不能让大家看出来我不是老师么 O_o

    异步沟通方式(《posting style》from wiki)(下载后打开):
    https://www.jianguoyun.com/p/Dc52X2sQsLv2BRiqnKYD
    提问的智慧(github在gitee的镜像):
    https://gitee.com/bestucan/How-To-Ask-Questions-The-Smart-Way

    King_RVMK 1 条回复 最后回复
  • King_RVMK 离线
    King_RVMK 离线
    King_RVM
    在 中回复了 bestucan 最后由 编辑
    #3

    @bestucan 非常感谢您的回复!定义S的时候,因为它是一个对称张量,所以我使用了volSymmtensorField,在编译过程中这一步也没有报错。我排除法尝试确定报错的位置,发现是 volTensorField sij中的divU使用错误,去除它就可以编译了,但是我不知道原因,因为我看其他程序源代码的计算表达式中有直接用divU进行运算的。

    bestucanB 1 条回复 最后回复
  • bestucanB 离线
    bestucanB 离线
    bestucan 版主 大神
    在 中回复了 King_RVM 最后由 编辑
    #4

    @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:

    滚来滚去……~(~o ̄▽ ̄)~o 滚来滚去都不能让大家看出来我不是老师么 O_o

    异步沟通方式(《posting style》from wiki)(下载后打开):
    https://www.jianguoyun.com/p/Dc52X2sQsLv2BRiqnKYD
    提问的智慧(github在gitee的镜像):
    https://gitee.com/bestucan/How-To-Ask-Questions-The-Smart-Way

    King_RVMK 1 条回复 最后回复
  • King_RVMK 离线
    King_RVMK 离线
    King_RVM
    在 中回复了 bestucan 最后由 编辑
    #5

    @bestucan 谢谢跟我讨论!divU的定义是标量
    1b81bc54-66ff-47b3-a4ce-23aaf0154c94-image.png
    S跟I 都是张量,我觉得应该可以相加减啊

    C 1 条回复 最后回复
  • C 离线
    C 离线
    Cr
    在 中回复了 King_RVM 最后由 编辑
    #6

    @King_RVM 你好,我试了一下,由于divU是一个volScalarField::Internal类型,运算S-(1.0/3.0)*divU*(1.0)/omega_返回的也是volScalarField::Internal类型。
    你将sij声明成volTensorField::Internal类型,编译一下试试。

    King_RVMK 1 条回复 最后回复
  • King_RVMK 离线
    King_RVMK 离线
    King_RVM
    在 中回复了 Cr 最后由 编辑
    #7

    @Cr 谢谢你的回复!我把跟sij的量都修改成了::Internal的形式,这几个量编译倒是没有报错,但是出现了新的错误,提示是openfoam里面源代码的错误,如下
    c980370d-c445-4946-a28a-e6a264918362-image.png
    这是怎么回事呢?DimensionedField是定义单位的,我定义的标量矢量I1 I2 V1 V2 V3都是无量纲的量,最后的量纲是乘以密度与湍动能决定的

    C 3 条回复 最后回复
  • C 离线
    C 离线
    Cr
    在 中回复了 King_RVM 最后由 编辑
    #8

    @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类型

    1 条回复 最后回复
  • C 离线
    C 离线
    Cr
    在 中回复了 King_RVM 最后由 编辑
    #9

    @King_RVM 对了还有,你上面的场变量都是用拷贝构造的方式生成的,他们应该都是有量纲的。例如S的量纲来自于tgradU。V1的量纲来自于sij来自于S或divU

    King_RVMK 2 条回复 最后回复
  • King_RVMK 离线
    King_RVMK 离线
    King_RVM
    在 中回复了 Cr 最后由 编辑
    #10

    @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

    1 条回复 最后回复
  • King_RVMK 离线
    King_RVMK 离线
    King_RVM
    在 中回复了 Cr 最后由 编辑
    #11

    @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

    C 1 条回复 最后回复
  • C 离线
    C 离线
    Cr
    在 中回复了 King_RVM 最后由 编辑
    #12

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

    King_RVMK 1 条回复 最后回复
  • C 离线
    C 离线
    Cr
    在 中回复了 King_RVM 最后由 Cr 编辑
    #13

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

    King_RVMK 1 条回复 最后回复
  • King_RVMK 离线
    King_RVMK 离线
    King_RVM
    在 中回复了 Cr 最后由 编辑
    #14

    @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

    C 1 条回复 最后回复
  • King_RVMK 离线
    King_RVMK 离线
    King_RVM
    在 中回复了 Cr 最后由 编辑
    #15

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

    1 条回复 最后回复
  • C 离线
    C 离线
    Cr
    在 中回复了 King_RVM 最后由 编辑
    #16

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

    King_RVMK 1 条回复 最后回复
  • King_RVMK 离线
    King_RVMK 离线
    King_RVM
    在 中回复了 Cr 最后由 编辑
    #17

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

    1 条回复 最后回复
  • C 离线
    C 离线
    Chen_hao
    写于 最后由 编辑
    #18

    你好,请问你修改湍流模型的雷诺应力项(跟你一样修改boussnesiq 假设)是在哪修改的?是在相应的komegaSST.C中,还是我看他们说的linearViscousStress.C?还有一直有个疑惑,相应的动量方程中这个雷诺应力项用修改吗? 不好意思打扰你了,希望能不吝赐教。

    李东岳李 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    在 中回复了 Chen_hao 最后由 编辑
    #19

    @chen_hao

    1. linearViscousStress.C

    2. UEqn不用动

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复

  • 登录

  • 登录或注册以进行搜索。
  • 第一个帖子
    最后一个帖子
0
  • 最新
  • 版块
  • 东岳流体
  • 随机看[请狂点我]