自定义库文件中的函数如何获取流场单元的压力?



  • calculateMomentumSource函数计算源项,并加给动量方程,cells_为网格单元的ID表,其中通过vectorField& U=eqn.psi() 将流场的速度U传入函数中,这个eqn.psi()是什么意思?如何把流场压力p也传入calculateMomentumSource函数中?
    1.JPG



  • @我是河滩自定义库文件中的函数如何获取流场单元的压力? 中说:

    calculateMomentumSource

    如果不需要改压力,可以在.C的函数里面写

    const volScalarField p = U.db().objectRegistry::lookupObject<volScalarField>("p");
    


  • 谢谢李老师。



  • 尝试了一下,编译出错,提示没有成员函数db(),该如何解决?
    ERROR1.JPG



  • 不知道db()是什么问题,但换了如下的语句就可以获取压力了,如果有人能解释一下就好了。
    volScalarField& p=mesh_.lookupObject<scalarField>("p");


  • 离散相副教授

    因为像什么volScalarField都是GeometricField<>的typedef,而GeometricField->DimensionedField->regIOobject->IOobject(继承)。regIOobject的构造函数有

    if (registerObject())
    {
            checkIn();
    }
    

    registerObject()返回registerObject_,这个成员变量默认为true。因此会执行 checkIn(),

    registered_ = db().checkIn(*this);
    

    db()继承自ioObject,

    const objectRegistry& db() const;
    

    而objectRegistry的checkIn中

    return const_cast<objectRegistry&>(*this).insert(io.name(), &io);
    

    会把当前的场(p)插入自己的列表,进行注册了。所以以后只要通过objectRegistry就能lookupObject<>到。
    而mesh,也就是fvMesh,fvMesh->polyMesh->objectRegistry(继承)。可以看到fvMesh继承自objectRegistry,因此可以直接用lookupObject<>直接查找到p。
    到这里就会有个问题,objectRegistry是类名,可以生成多个对象,怎么确保大家都查找到同一个的objectRegistry呢?在同一个列表中查找到场呢?因此这里就需要使objectRegistry在整个程序中只生成一个独一无二的对象,这样大家都访问的是同一份列表了。因此,设计模式中的单例模式(Singleton Pattern)就发挥作用,至于怎么实现,那就看看设计模式吧。


  • 离散相副教授

    例如在当前环境下知道U场(volVectorField),而想得到p场,就可以这样

    const volScalarField p = U.db().objectRegistry::lookupObject<volScalarField>("p");
    

    当然也可以通过其他注册到objectRegistry的对象来lookupObject啦。:chigua:



  • 谢谢,谢谢。


Log in to reply
 

CFD中文网 2016 - 2020 | 京ICP备15017992号-2