自定义库文件中的函数如何获取流场单元的压力?
-
calculateMomentumSource函数计算源项,并加给动量方程,cells_为网格单元的ID表,其中通过vectorField& U=eqn.psi() 将流场的速度U传入函数中,这个eqn.psi()是什么意思?如何把流场压力p也传入calculateMomentumSource函数中?
-
@我是河滩 在 自定义库文件中的函数如何获取流场单元的压力? 中说:
calculateMomentumSource
如果不需要改压力,可以在.C的函数里面写
const volScalarField p = U.db().objectRegistry::lookupObject<volScalarField>("p");
-
谢谢李老师。
-
尝试了一下,编译出错,提示没有成员函数db(),该如何解决?
-
不知道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啦。
-
谢谢,谢谢。