CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

    pressureReference

    OpenFOAM
    2
    6
    625
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • evensun
      evensun 最后由 编辑

      向各位老师请教一个问题,我的求解器里有两组速度压力场,压力分别是p和pf,但是在求解器代码里我不知道怎么设置参考压力:zoule: ;

      在最新的OF9中,设置参考压力的代码如下(以simpleFoam为例):

      pressureReference pressureReference(p, simple.dict());
      
      mesh.setFluxRequired(p.name());
      

      —createFields.H

      pEqn.setReference
      (
          pressureReference.refCell(),
          pressureReference.refValue()
      );
      

      —pEqn.H
      如果我在createFields.H中再加一段

      pressureReference pressureReference(pf, simple.dict());
      
      mesh.setFluxRequired(pf.name());
      

      编译就会不通过,提示“ expected ';' before‘pressureReference’ ”:zoule:
      pressureReference的C文件我找到了,但读不太懂,想请教一下各位老师求解器代码里到底应该怎么设置:xiexie:

      class pressureReference
      {
          // Private Data
      
              //- Optional cell in which the reference pressure is set
              label refCell_;
      
              //- Optional pressure reference level
              scalar refValue_;
      
      
      public:
      
          // Constructors
      
              //- Construct from the simple/pimple sub-dictionary
              //  supporting the pressure and derived pressure fields (e.g. p_rgh)
              pressureReference
              (
                  const volScalarField& p,
                  const volScalarField& pRef,
                  const dictionary& dict,
                  const bool pRefRequired = true
              );
      
              //- Construct from the simple/pimple sub-dictionary
              pressureReference
              (
                  const volScalarField& p,
                  const dictionary& dict,
                  const bool pRefRequired = true
              );
      
      
          // Member Functions
      
              //- Return the cell in which the reference pressure is set
              inline label refCell() const;
      
              //- Return the pressure reference level
              inline scalar refValue() const;
      };
      
      
      1 条回复 最后回复 回复 引用
      • evensun
        evensun 最后由 编辑

        我暂时的解决方法是在createFields.H写

        pressureReference pressureReference(p,pf, simple.dict());
        mesh.setFluxRequired(p.name());
        mesh.setFluxRequired(pf.name());
        

        因为有在$FOAM_SRC中看到类似的操作,把pcorr还是rho与p放在一起。
        但还是恳求各位老师指点,若有相似经历或操作:xiezuoye:

        W 1 条回复 最后回复 回复 引用
        • W
          wangfei9088 @evensun 最后由 wangfei9088 编辑

          @evensun 二楼这种写法调用的是第一种构造函数,编译器肯定不会报错,但是应该不会实现一楼描述的目的,一楼默认的是调用第二种构造函数。
          我觉得可以这么改:

          1. 在createFields.H最下方加这段代码:
          volScalarField pf
          (
              IOobject
              (
                  "pf",
                  runTime.timeName(),
                  mesh,
                  IOobject::MUST_READ,
                  IOobject::AUTO_WRITE
              ),
              mesh
          );
          
          pressureReference PR(pf, simple.dict());//新的对象PR,用新的pf作为参数
          
          mesh.setFluxRequired(pf.name());
          
          1. 在pEqn.H中pEqn.setReference(pressureReference.refCell(), pressureReference.refValue())函数后面加一段
          ......
          pEqn.setReference
          (
              pressureReference.refCell(),
              pressureReference.refValue()
          );
          //原代码
          
          //add
          pEqn.setReference
          (
              PR.refCell(),
              PR.refValue()
          );
          //end
          
          ......
          

          可以试试看能不能实现。我这没装OpenFOAM-9,就没测试。

          evensun 2 条回复 最后回复 回复 引用
          • evensun
            evensun @wangfei9088 最后由 编辑

            @wangfei9088
            谢谢老师,实在是醍醐灌顶,编译也通过了;

            C++的类一直是一知半解,通过这次的改写理解进一步加深了;

            另外老师我补充一下,如果p在pressureReference类下的对象命名为pressureReference,那么pf的对象怎么命名都通过不了,比如PRf,pressureRenferencef之类的,后来我尝试了这样的形式:

            pressureReference PR(p, simple.dict());
            
            mesh.setFluxRequired(p.name());
            
            pressureReference PRf(pf, simple.dict());
            
            mesh.setFluxRequired(pf.name());
            

            即两个对象分别命名为PR和PRf,就能通过了,这是为什么:136:

            另外老师,还有一个问题想请教一下:

            如果我理解没错的话,我们这里命名的PR和PRf,是在pressureReference这个类下的两个对象对吗;
            那么,之前p在pressureReference类下的对象命名为pressureReference后,pf对象创建不通过的问题,是由于构造函数名称和类名称相同导致的错误吗:135:

            1 条回复 最后回复 回复 引用
            • evensun
              evensun @wangfei9088 最后由 编辑

              @wangfei9088
              请问老师,有没有可能,是因为我们将p在pressureReference类下的对象命名为pressureReference后,再写pf时:

              pressureReference pressureReference(pf, simple.dict());
              

              编译器会认为这行第一个pressureReference就是一个对象了,不再识别为一个类的名称进而创建新的对象呢
              :wocao:

              W 1 条回复 最后回复 回复 引用
              • W
                wangfei9088 @evensun 最后由 wangfei9088 编辑

                @evensun

                我猜你的疑问应该是,为什么类似下面这段代码编译器会报错?

                1 pressureReference pressureReference(p, simple.dict());
                
                2 pressureReference pressureReference(pf, simple.dict());
                

                这两条语句有4个pressureReference,我分别编号为1, 2, 3和4号。

                1. 编译器运行到第一行代码时,假设当前函数体内没有声明pressureReference,编译器就会首先去全局域(global )里寻找pressureReference是什么,当找到pressureReference的声明,发现是个类时,编译器把它(1号)解析为一个类(class)。
                2. 编译器继续运行,遇到2号pressureReference,编译器主动构造类型为pressureReference(1号)的对象pressureReference(2号)。
                  注意:这两个名称一样,编译器会怎么做?当前作用域里的pressureReference(2号)会把全局域(global)里的pressureReference(1号)隐藏掉,1号就发挥不了作用了。也就是说,在此后的作用域里pressureReference只是个对象,只发挥2号pressureReference的作用。
                3. 编译器继续运行,遇到第二行的3号pressureReference,此时编译器将这个pressureReference解析为一个对象(2号)。
                4. 编译器最后发现4号pressureReference,这是什么,3号对象后面一个4号对象,蜜汁操作,编译器理解不了,编译就失败了。

                那如果我一定要让3号pressureReference发挥类(class)的作用(像1号pressureReference一样),有没有办法?
                有的。在第二行代码的3号前加作用域解析运算符(::),编译器就会去找全局(global)的pressureReference声明了,像上面的第一步一样,然后把3号解析为类(class),再把4号理解为对象。编译就能通过了。
                有兴趣可以试试。

                1 pressureReference pressureReference(p, simple.dict());
                
                2 ::pressureReference pressureReference(pf, simple.dict());
                
                1 条回复 最后回复 回复 引用
                • First post
                  Last post