Navigation

    CFD中文网

    CFD中文网

    • Login
    • Search
    • 最新

    如何设置一个入口边界条件:入口边界值为出口平均值的一半

    OpenFOAM
    6
    25
    2852
    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.
    • D
      D.Benjamin last edited by

      各位大佬,请教一个问题:
        如果我想设置一个入口边界条件,该边界的值是出口边界平均值的一半,
      即phi_in = 0.5 * phi_out
      请问该如何实现,我想到了codedFixedValue边界条件,但是不知道该如何获取出口处的物理量,望各位大佬赐教!

      祝好!

      OpenFOAM初学者,希望和大家共同交流

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

        进来5,出去10,这不是不守恒么?

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

        D Y 3 Replies Last reply Reply Quote
        • D
          D.Benjamin @李东岳 last edited by

          @东岳 老师好,我只是打个比方。我需要设置一个入口边界条件,该边界条件与出口的物理量相关。不想扯大段的背景,所以就这样简答描述了。这种情况是存在守恒的,比如说,在某一容器中,有一释热源,流体从容器出口流出,经过外部冷却后再重新经入口流入容器。如此以来,入口值是有可能是出口的一半的

          OpenFOAM初学者,希望和大家共同交流

          1 Reply Last reply Reply Quote
          • D
            D.Benjamin @李东岳 last edited by

            @东岳 老师好,经过这几天的学习,我在网上一些博客中找到了一些答案,但是他们给出的代码有问题,编译不能通过。下面,我将给出两个不同帖子中关于如何修改入口处的x方向温度值的方案:

            方案一:

            label patchIndex = mesh.boundaryMesh().findPatchID("inlet");
            scalarField &patchField = T.boundaryField()[patchIndex];
            
            forAll(patchField, i) {
                patchField[i] = 10.0;
            }
            

            我发现,在进行wmake编译时,会出错。问题在于" &patchField "前面的取址符号&。虽然去掉上述代码中取址符号&,编译可以通过,但并不能改变入口处温度场的值(即入口处温度场的值仍是原来的值,这段代码便没有意义了),下面为编译报错情况:

            p1.png

            方案二:

            label patchIndex = mesh.boundaryMesh().findPatchID("inlet");
            scalarField patchField = T.boundaryField()[patchIndex];
            
            forAll(patchField, i) {
                T.boundaryField()[patchIndex][i] = 10.0;
            }
            

            然而,编译仍然不能通过,下面为报错情况:
            p2.png

            别人博文上的东西照理说应该是正确的呀,真不知道该怎么办了,跪求各位老师,大神,大佬指点!!

            OpenFOAM初学者,希望和大家共同交流

            1 Reply Last reply Reply Quote
            • D
              D.Benjamin last edited by

              上面说错了一点点,是:修改入口处的温度值的方案;不是:修改入口处x方向的温度值的方案。温度是标量,刚才不小心打错了

              OpenFOAM初学者,希望和大家共同交流

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

                @D-Benjamin 在 如何设置一个入口边界条件:入口边界值为出口平均值的一半 中说:

                scalarField &patchField = T.boundaryField()[patchIndex];

                单说这句应该改为

                scalarField& patchField = T.boundaryFieldRef()[patchIndex];
                

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

                D 2 Replies Last reply Reply Quote
                • D
                  D.Benjamin @李东岳 last edited by

                  @东岳 非常感谢

                  OpenFOAM初学者,希望和大家共同交流

                  1 Reply Last reply Reply Quote
                  • D
                    D.Benjamin @李东岳 last edited by

                    @东岳 老师,又来叨绕你了。以上问题已经解决,编译可以通过,FOAM也可以成功进行计算。然而,不能并行计算。似乎在求解器中修改边界条件,会对并行计算产生影响。我的猜测是,并行计算需要将网格分裂成许多块,这样它们就只能根据0字典下的边界条件进行计算。在求解器中强制对边界条件进行修改,使得入口温度是出口的一半,由于网格分块并行,在某些块中不能获取到出口的值,因而并行计算时就会报错。
                    所以,想请教一下,有没有什么解决的办法?使其可以并行计算呢?谢谢

                    OpenFOAM初学者,希望和大家共同交流

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

                      https://www.cfd-online.com/Forums/openfoam-solving/193543-codedfixedvalue-accessing-other-patch-causes-crash-parallel.html

                      你试试这个:xiezuoye:

                      // get patch ID on opposite side
                      label oPatchID = this->patch().boundaryMesh().
                                          findPatchID(oPatchName);
                      // get pressure on other side
                      const volScalarField& p = this->db().
                              objectRegistry::lookupObject<volScalarField>("p");
                      
                      // patch field on opposite side for single processor
                      const scalarField& fieldOSP = p.boundaryField()[oPatchID];
                      
                      // get patch field size from each processor
                      labelList fSizePerProc( Pstream::nProcs(), 0.0 );
                      label thisProcNo = Pstream::myProcNo();
                      fSizePerProc[thisProcNo] = fieldOSP.size();
                      
                      // combine field sizes from all processors
                      reduce( fSizePerProc, sumOp<labelList>() );
                      
                      // get field values from all processors
                      label totalFSize = sum( fSizePerProc );
                      
                      // get field from each processor
                      scalarField fieldOAP( totalFSize, 0.0 );
                      
                      // if patch is on current proc
                      if( fSizePerProc[thisProcNo] > 0 )
                      {
                          // get field size on previous processors
                          label prevFSize = 0;
                          for (label i = 0; i < thisProcNo; ++i)
                          {
                              prevFSize += fSizePerProc[i];
                          }
                          // write field from patch on current proc
                          for (label i = 0; i < fSizePerProc[thisProcNo]; ++i)
                          {
                              fieldOAP[i + prevFSize] = fieldOSP[i];
                          }
                      }
                      
                      // combine fields from all processors
                      reduce( fieldOAP, sumOp<scalarField>() );
                      
                      // get pressure gradient from caseDict
                      #include "readgradp.H"
                      
                      // write pressure from opposite side to this patch, add gradP
                      scalarField& pField = *this;
                      forAll(pField, faceI)
                      {
                          pField[faceI] = fieldOAP[faceI] + gradP;
                      }
                      

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

                      S 1 Reply Last reply Reply Quote
                      • Y
                        yuan_neu @李东岳 last edited by

                        @东岳 也不一定嘛,比如可压缩流呢。最后就是出入口都趋于零

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

                          进来5,出去10,这不是不守恒么?

                          这是不考虑源项的时候

                          :136:

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

                          D 1 Reply Last reply Reply Quote
                          • D
                            D.Benjamin @李东岳 last edited by

                            @东岳 @yuan_neu 两位老师好,我尝试了上面东岳老师推荐的并行方法,编译可以通过,且可以并行运行计算,但是,我发现计算结果与串行相比,具有较大偏差(初步估计大了3-5%)。

                            同样一行代码(如下所示):

                            // 串行
                            const scalarField C_outlet = C.boundaryField()[patchId];
                            Info << "C_outlet:" << C_outlet << endl;
                            
                            // 并行
                            const scalarField C_outlet_SP = T.boundaryField()[patchId];
                            Info << "C_outlet_SP:" << C_outlet_SP << endl;
                            

                            C_outlet与C_outlet_SP的结果相差较大(并行读取结果偏大),由于我的入口边界条件是对所有网格的C_outlet进行面平均的0.95倍:

                            C_inlet = 0.95 * C_outlet_avarage;
                            

                            由于并行读取结果偏大,最后导致了入口值反而大于出口值。这是不是并行的bug?

                            求解答,祝好!

                            OpenFOAM初学者,希望和大家共同交流

                            1 Reply Last reply Reply Quote
                            • 玉
                              玉玺 @D.Benjamin last edited by

                              @D-Benjamin 您好,我目前想要实现两相出口固相通量等于入口通量,能不能打扰您,向您咨询下这个怎么实现?

                              CFD小菜鸟一枚,万一遨游了

                              D 2 Replies Last reply Reply Quote
                              • D
                                D.Benjamin @玉玺 last edited by

                                @玉玺 你好,我目前不研究两相流,不能给你具体方案,从我们上述讨论中你应该可以找到思路,祝好

                                OpenFOAM初学者,希望和大家共同交流

                                1 Reply Last reply Reply Quote
                                • D
                                  D.Benjamin @玉玺 last edited by

                                  @玉玺 我不是做两相流的

                                  OpenFOAM初学者,希望和大家共同交流

                                  玉 2 Replies Last reply Reply Quote
                                  • 玉
                                    玉玺 @D.Benjamin last edited by

                                    @D-Benjamin 您好,我想咨询一下,我用codedFixedValue边界条件

                                    label patchIndex =this->patch(). boundary. findPatchID(”“outlet”);
                                    const volVector& U=this->db(). lookupObject<volVectorField>("U.particles");
                                    

                                    这两行读取的速度就是outlet的出口颗粒速度吧

                                    CFD小菜鸟一枚,万一遨游了

                                    1 Reply Last reply Reply Quote
                                    • 玉
                                      玉玺 @D.Benjamin last edited by

                                      @D-Benjamin 如果那两行是它的速度的话,然后我再U去获得它的x方向速度,令它等于入口x的速度,这样子就可以了吧?非常感谢

                                      CFD小菜鸟一枚,万一遨游了

                                      D 1 Reply Last reply Reply Quote
                                      • D
                                        D.Benjamin @玉玺 last edited by

                                        @玉玺 你好,你的第一行是对的,由于我不做颗粒,我研究的就是流体,所以我不清楚你的第二行那样获取颗粒速度是否正确。你可以先测试下。不过我觉得,获得出口速度值应该类似于这样的:

                                        const volVector& U=this->db(). lookupObject<volVectorField>("U.particles")[patchIndex];
                                        

                                        欢迎继续交流

                                        OpenFOAM初学者,希望和大家共同交流

                                        玉 2 Replies Last reply Reply Quote
                                        • 玉
                                          玉玺 @D.Benjamin last edited by

                                          @D-Benjamin 大佬,冒昧问一句可否加个联系方式交流交流,我看到您要实现的也是进出口的通量关系,论坛可能不方便qq1533317221

                                          CFD小菜鸟一枚,万一遨游了

                                          1 Reply Last reply Reply Quote
                                          • 玉
                                            玉玺 @D.Benjamin last edited by

                                            @D-Benjamin 刚才试了加上最后面那个面标号,运行好像出了点错误,待我明早去实验室确定一下。

                                            CFD小菜鸟一枚,万一遨游了

                                            D 1 Reply Last reply Reply Quote
                                            • D
                                              D.Benjamin @玉玺 last edited by

                                              @玉玺 好的,我也准备回宿舍休息了,明天再交流吧。还有,我不是大佬,我只是比你学得久一点点的初学者,东岳老师以及贴吧里一些讲师,教授们,他们才是大佬

                                              OpenFOAM初学者,希望和大家共同交流

                                              1 Reply Last reply Reply Quote
                                              • S
                                                Samuel-Tu @李东岳 last edited by

                                                @东岳 东岳老师,decomposed后的patch里面的face是否还是按分解前的顺序排列呢。例如分解前的patch中有6个face编号为0,1,2,3,4,5。分解的时候刚好从中间分开了,分解成两个processor里面,则processor1和processor2里的face编号都变成了 0,1,2。假如processor2里面的face是未分解时候的4,5,6,那么现在face 0,1,2一定对应的是4,5,6吗,也就是说这个顺序会不会改变,会不会0,1,2对应成原来的5,6,4了

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

                                                  这个问题应该可以通过对已有的边界条件进行简单的修改,形成新的边界条件,可以参考cyclic边界让入口获取出口的patchID,然后gsum求和再付给入口。并行的问题可能是在循环出口边界的时候,每个processor多计算了分界处的网格(这只是我的猜测,我没用试过代码)。推荐用g开头的openfoam自带的函数,这些函数都是支持并行的并会自动广播的,不需要你自己再考虑并行的问题,除非你要实现的功能没有。

                                                  D 1 Reply Last reply Reply Quote
                                                  • D
                                                    D.Benjamin @cxzhmg last edited by

                                                    @cxzhmg 谢谢您的回复!您的回复给了我很好地思路,我有几个问题:

                                                    1. 在gsum求和再付给入口之前需要进行面平均处理,所以可能正如您所说,在循环出口边界的时候,每个processor多计算了分界处的网格,才导致并行计算结果大于实际结果。您推荐用g开头的openfoam自带的函数给了我很好地思路,所以如果有一个g开头的取某个场面平均的函数就好了,然而gAverage()是算数平均,不是面平均。另一个思路是如果有一个g开头的函数可以得到某个场关于出口网格面的积分值,然后除以整个出口的面积,也可以得到面平均。

                                                    2. 所以,请问在哪里可以查到如gSum()这些g字开头的函数?并行计算我现在只知道gSum()和gAverage()两个函数,我想更多地了解一下,要是能够找到我上面所说的g开头求场面平均或者求场的面积分函数就好了。

                                                    期待回复,祝好!

                                                    OpenFOAM初学者,希望和大家共同交流

                                                    C 1 Reply Last reply Reply Quote
                                                    • C
                                                      cxzhmg @D.Benjamin last edited by

                                                      @D-Benjamin 具体一共都有哪些函数我也不是很清楚,具体函数和怎么用通常都是看看openfoam自带的边界或者求解器或者其它的应用有类似你想获得功能,就去翻源代码。gsum应该也可以对边界上的网格体积或者面进行求和,应该就能实现你说的功能。

                                                      1 Reply Last reply Reply Quote
                                                      • First post
                                                        Last post

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