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. pressureReference

pressureReference

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

    向各位老师请教一个问题,我的求解器里有两组速度压力场,压力分别是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 条回复 最后回复
  • evensunE 离线
    evensunE 离线
    evensun
    写于 最后由 编辑
    #2

    我暂时的解决方法是在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 离线
    W 离线
    wangfei9088 大神
    在 中回复了 evensun 最后由 wangfei9088 编辑
    #3

    @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,就没测试。

    evensunE 2 条回复 最后回复
  • evensunE 离线
    evensunE 离线
    evensun
    在 中回复了 wangfei9088 最后由 编辑
    #4

    @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 条回复 最后回复
  • evensunE 离线
    evensunE 离线
    evensun
    在 中回复了 wangfei9088 最后由 编辑
    #5

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

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

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

    W 1 条回复 最后回复
  • W 离线
    W 离线
    wangfei9088 大神
    在 中回复了 evensun 最后由 wangfei9088 编辑
    #6

    @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 条回复 最后回复

  • 登录

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