pressureReference
-
向各位老师请教一个问题,我的求解器里有两组速度压力场,压力分别是p和pf,但是在求解器代码里我不知道怎么设置参考压力 ;
在最新的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’ ”
pressureReference的C文件我找到了,但读不太懂,想请教一下各位老师求解器代码里到底应该怎么设置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; };
-
@evensun 二楼这种写法调用的是第一种构造函数,编译器肯定不会报错,但是应该不会实现一楼描述的目的,一楼默认的是调用第二种构造函数。
我觉得可以这么改:- 在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());
- 在pEqn.H中pEqn.setReference(pressureReference.refCell(), pressureReference.refValue())函数后面加一段
...... pEqn.setReference ( pressureReference.refCell(), pressureReference.refValue() ); //原代码 //add pEqn.setReference ( PR.refCell(), PR.refValue() ); //end ......
可以试试看能不能实现。我这没装OpenFOAM-9,就没测试。
-
@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,就能通过了,这是为什么
另外老师,还有一个问题想请教一下:
如果我理解没错的话,我们这里命名的PR和PRf,是在pressureReference这个类下的两个对象对吗;
那么,之前p在pressureReference类下的对象命名为pressureReference后,pf对象创建不通过的问题,是由于构造函数名称和类名称相同导致的错误吗 -
@wangfei9088
请问老师,有没有可能,是因为我们将p在pressureReference类下的对象命名为pressureReference后,再写pf时:pressureReference pressureReference(pf, simple.dict());
编译器会认为这行第一个pressureReference就是一个对象了,不再识别为一个类的名称进而创建新的对象呢
-
我猜你的疑问应该是,为什么类似下面这段代码编译器会报错?
1 pressureReference pressureReference(p, simple.dict()); 2 pressureReference pressureReference(pf, simple.dict());
这两条语句有4个pressureReference,我分别编号为1, 2, 3和4号。
- 编译器运行到第一行代码时,假设当前函数体内没有声明pressureReference,编译器就会首先去全局域(global )里寻找pressureReference是什么,当找到pressureReference的声明,发现是个类时,编译器把它(1号)解析为一个类(class)。
- 编译器继续运行,遇到2号pressureReference,编译器主动构造类型为pressureReference(1号)的对象pressureReference(2号)。
注意:这两个名称一样,编译器会怎么做?当前作用域里的pressureReference(2号)会把全局域(global)里的pressureReference(1号)隐藏掉,1号就发挥不了作用了。也就是说,在此后的作用域里pressureReference只是个对象,只发挥2号pressureReference的作用。 - 编译器继续运行,遇到第二行的3号pressureReference,此时编译器将这个pressureReference解析为一个对象(2号)。
- 编译器最后发现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());