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. 自定义库文件中的函数如何获取流场单元的压力?

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

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

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

    动边界

    1 条回复 最后回复
  • 李东岳李 在线
    李东岳李 在线
    李东岳 管理员
    写于 最后由 编辑
    #2

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

    calculateMomentumSource

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

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

    http://dyfluid.com/index.html
    需要帮助debug算例的看这个 https://cfd-china.com/topic/8018

    1 条回复 最后回复
  • 我 离线
    我 离线
    我是河滩
    写于 最后由 编辑
    #3

    谢谢李老师。

    动边界

    1 条回复 最后回复
  • 我 离线
    我 离线
    我是河滩
    写于 最后由 编辑
    #4

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

    动边界

    1 条回复 最后回复
  • 我 离线
    我 离线
    我是河滩
    写于 最后由 编辑
    #5

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

    动边界

    1 条回复 最后回复
  • 马乔马 离线
    马乔马 离线
    马乔 大神
    写于 最后由 编辑
    #6

    因为像什么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)就发挥作用,至于怎么实现,那就看看设计模式吧。

    装逼没输过,吵架没赢过!

    马乔马 1 条回复 最后回复
  • 马乔马 离线
    马乔马 离线
    马乔 大神
    在 中回复了 马乔 最后由 编辑
    #7

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

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

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

    装逼没输过,吵架没赢过!

    1 条回复 最后回复
  • 我 离线
    我 离线
    我是河滩
    写于 最后由 编辑
    #8

    谢谢,谢谢。

    动边界

    1 条回复 最后回复

  • 登录

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