Navigation

    CFD中文网

    CFD中文网

    • Login
    • Search
    • 最新

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

    OpenFOAM
    5
    19
    2166
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • King_RVM
      King_RVM last edited by

      各位有经验的前辈们,想请教一个问题。我想修改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 Reply Last reply Reply Quote
      • bestucan
        bestucan 版主 副教授 last edited by

        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/blob/master/README-zh_CN.md

        King_RVM 1 Reply Last reply Reply Quote
        • King_RVM
          King_RVM @bestucan last edited by

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

          bestucan 1 Reply Last reply Reply Quote
          • bestucan
            bestucan 版主 副教授 @King_RVM last edited by

            @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/blob/master/README-zh_CN.md

            King_RVM 1 Reply Last reply Reply Quote
            • King_RVM
              King_RVM @bestucan last edited by

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

              C 1 Reply Last reply Reply Quote
              • C
                Cr @King_RVM last edited by

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

                King_RVM 1 Reply Last reply Reply Quote
                • King_RVM
                  King_RVM @Cr last edited by

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

                  C 3 Replies Last reply Reply Quote
                  • C
                    Cr @King_RVM last edited by

                    @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 Reply Last reply Reply Quote
                    • C
                      Cr @King_RVM last edited by

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

                      King_RVM 2 Replies Last reply Reply Quote
                      • King_RVM
                        King_RVM @Cr last edited by

                        @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 Reply Last reply Reply Quote
                        • King_RVM
                          King_RVM @Cr last edited by

                          @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 Reply Last reply Reply Quote
                          • C
                            Cr @King_RVM last edited by

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

                            King_RVM 1 Reply Last reply Reply Quote
                            • C
                              Cr @King_RVM last edited by Cr

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

                              King_RVM 1 Reply Last reply Reply Quote
                              • King_RVM
                                King_RVM @Cr last edited by

                                @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 Reply Last reply Reply Quote
                                • King_RVM
                                  King_RVM @Cr last edited by

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

                                  1 Reply Last reply Reply Quote
                                  • C
                                    Cr @King_RVM last edited by

                                    @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_RVM 1 Reply Last reply Reply Quote
                                    • King_RVM
                                      King_RVM @Cr last edited by

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

                                      1 Reply Last reply Reply Quote
                                      • C
                                        Chen_hao last edited by

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

                                        李东岳 1 Reply Last reply Reply Quote
                                        • 李东岳
                                          李东岳 管理员 @Chen_hao last edited by

                                          @chen_hao

                                          1. linearViscousStress.C

                                          2. UEqn不用动

                                          线上CFD课程 7月1日报名截止 http://dyfluid.com/class.html
                                          CFD高性能服务器 http://dyfluid.com/servers.html

                                          1 Reply Last reply Reply Quote
                                          • First post
                                            Last post

                                          CFD中文网 | 东岳流体 | 京ICP备15017992号-2
                                          论坛登录问题反馈可联系 li.dy@dyfluid.com