CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

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

    OpenFOAM
    3
    8
    1700
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 我
      我是河滩 最后由 编辑

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

      动边界

      1 条回复 最后回复 回复 引用
      • 李东岳
        李东岳 管理员 最后由 编辑

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

        calculateMomentumSource

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

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

        CFD高性能服务器 http://dyfluid.com/servers.html
        2023年,线下CFD课,预热一下 http://dyfluid.com/class.html

        1 条回复 最后回复 回复 引用
        • 我
          我是河滩 最后由 编辑

          谢谢李老师。

          动边界

          1 条回复 最后回复 回复 引用
          • 我
            我是河滩 最后由 编辑

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

            动边界

            1 条回复 最后回复 回复 引用
            • 我
              我是河滩 最后由 编辑

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

              动边界

              1 条回复 最后回复 回复 引用
              • 马乔
                马乔 副教授 最后由 编辑

                因为像什么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 条回复 最后回复 回复 引用
                • 马乔
                  马乔 副教授 @马乔 最后由 编辑

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

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

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

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

                  1 条回复 最后回复 回复 引用
                  • 我
                    我是河滩 最后由 编辑

                    谢谢,谢谢。

                    动边界

                    1 条回复 最后回复 回复 引用
                    • First post
                      Last post