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
11 帖子 5 发布者 10.5k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • 千 离线
    千 离线
    千里之行
    写于 最后由 编辑
    #1

    大家好,我的问题是在计算过程中,压力场的边界何时更新?因为我发现在 multiphase 类的求解器中,compressibleInterFoam 在 pEqn.H 中分别调用速度场和压力场的 corrrectBoundaryConditions 函数来更新与边界相关的值,即

    U.correctBoundaryConditions();
    
    p_rgh.correctBoundaryConditions();
    

    但是 interFoam 在 pEqn.H 中只会调用速度场的 correctBoundaryConditions 函数,不会调用压力场,其他地方也没有,只有

    U.correctBoundaryConditions();
    

    类似的,twoPhaseEulerFoam, reactingTwoPhaseEulerFoam, reactingMultiphaseEulerFoam, cavitatingFoam, compressibleMultiphaseInterFoam 这些求解器都会调用速度场和压力场的 correctBoundaryConditions 函数。但是 twoLiquidMixingFoam, driftFluxFoam, potentialFreeSurfaceFoam, multiphaseEulerFoam, interPhaseChangeFoam, MPPICInterFoam 只会调用速度场的 correctBoundaryConditions 函数,不会调用压力场的。

    我也查看了源代码,目前我掌握到的信息如下:
    GeometricField 类型的 correctBoundaryConditions 函数的定义是

    template<class Type, template<class> class PatchField, class GeoMesh>
    void Foam::GeometricField<Type, PatchField, GeoMesh>::
    correctBoundaryConditions()
    {
        this->setUpToDate();
        storeOldTimes();
        boundaryField_.evaluate();
    }
    

    可以看出具体的操作是交给成员 boundaryField_ 的 evaluate 函数执行的,boundaryField_ 声明如下:

            //- Boundary Type field containing boundary field values
            Boundary boundaryField_;
    

    Boundary 类型是各个边界块的集合。每一个边界块根据不同的边界条件类型对应有不同的边界条件类,比如 zeroGradient 类型的边界条件对应 zeroGradientFvPatchField 类,他们共同的基类是 fvPatchField,evaluate 函数是这个派生体系的虚函数,不同的边界条件派生类会重新定义自己的这个虚函数,实现了多态,从而实现不同的边界更新方式。而 boundaryField_ 的 evaluate 函数会遍历各个边界块,调用各自的 evaluate 函数实现更新。代码如下:

    template<class Type, template<class> class PatchField, class GeoMesh>
    void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::
    evaluate()
    {
    ......
            forAll(*this, patchi)
            {
                this->operator[](patchi).evaluate(Pstream::defaultCommsType);
            }
    ......
    }
    

    我想请教各位,如果没有调用压力场的 correctBoundaryConditions 函数,那么压力场是怎么更新边界的呢?我所指定的不同的压力边界条件,又是如何生效的呢?问题有点长,十分感谢您的耐心阅读与解答!!

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

    correctBoundaryConditions这个函数的作用非常简单。比如你通过下面的代码计算速度场:

    U=Ua+Ub;
    

    在这种情况下并没有计算U的边界条件,因此你需要

    U.correctBoundaryConditions()
    

    但是如果你通过UEqn.solve()的方式计算,solve()函数里面自动调用了correctBoundaryConditions。

    多相流求解器里面也一样,比如

    // Correct p_rgh for consistency with p and the updated densities
        p_rgh = p - rho*gh;
        p_rgh.correctBoundaryConditions();
    

    是因为前面存在赋值 p_rgh = p - rho*gh;

    因此,我的个人习惯是,如果是solve()出来的,不需要调用,如果是=赋值出来的,都需要correctBoundaryConditions。

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

    千 浪 2 条回复 最后回复
  • 千 离线
    千 离线
    千里之行
    在 中回复了 李东岳 最后由 编辑
    #3

    @李东岳 哦,明白了,谢谢东岳老师,我再去好好看看相关的代码。那 "calculated" 类型的边界条件对应的类是 calculatedFvPatchField ,但是并没有重新定义虚函数 evaluate,肯定是基类 fvPatchField 的 evaluate 函数被调用了,可是那个 evaluate 函数并没有做什么计算,所以即使调用了场对象的 correctBoundaryConditions 函数,在 calculated 类型的边界也没有发生计算,这样理解对吗?
    另外,经常会遇到这样的边界条件:

    inlet
    {
        type        fixedValue;
        value       $internalField;
    }
    

    这里的 $internalField 是什么意思呢,我认为是这块边界的值取邻近内场的值,但是一直也没有找到代码的依据,并且这样的边界条件和 zeroGradient 又有什么区别呢?

    D 1 条回复 最后回复
  • D 离线
    D 离线
    dzw05 超神
    在 中回复了 千里之行 最后由 编辑
    #4

    @千里之行 这是一个宏,意思是该处的value采用的是“internalField”这个变量的值。你在这个文件里开头的部分,会有类似internalfield uniform 100这样的语句。

    自主匠心,普惠仿真。

    千 1 条回复 最后回复
  • 千 离线
    千 离线
    千里之行
    在 中回复了 dzw05 最后由 编辑
    #5

    @dzw05 哦,懂了,原来如此,十分感谢!!

    1 条回复 最后回复
  • 浪 离线
    浪 离线
    浪迹天大
    在 中回复了 李东岳 最后由 编辑
    #6

    @东岳
    我也想了解关于 correctBoundaryConditions 使用的知识。
    但是我发现等于号操作符也更新了边界场呀:

    template<class Type, template<class> class PatchField, class GeoMesh>
    void Foam::GeometricField<Type, PatchField, GeoMesh>::operator=
    (
        const GeometricField<Type, PatchField, GeoMesh>& gf
    )
    {
        if (this == &gf)
        {
            FatalErrorInFunction
                << "attempted assignment to self"
                << abort(FatalError);
        }
    
        checkField(*this, gf, "=");
    
        // Only assign field contents not ID
    
        ref() = gf();
        boundaryFieldRef() = gf.boundaryField();
    }
    

    OpenFOAM 学习交流:https://openfoam.top

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

    执行下面的代码后,

    U = Ua+Ub;
    

    Ua+Ub的边界条件为calculated,然后U也为calculated,若需要更新U的边界条件,需要继续update

    类似讨论: http://www.cfd-china.com/topic/1620

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

    1 条回复 最后回复
  • 浪 离线
    浪 离线
    浪迹天大
    写于 最后由 编辑
    #8

    就是说,场进行加减乘除操作之后,边界场虽然也会更新数据,但是此时的值可能违反它本身边界条件的约束,所以需要 correct 约束一下,是这样吗?

    OpenFOAM 学习交流:https://openfoam.top

    李东岳李 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    在 中回复了 浪迹天大 最后由 编辑
    #9

    是这个意思

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

    evensunE 1 条回复 最后回复
  • evensunE 离线
    evensunE 离线
    evensun
    在 中回复了 李东岳 最后由 编辑
    #10

    @李东岳
    老师,请问对于定义在体心上的物理量,这里correct的边界场,是指边界上的一层网格吗

    李东岳李 1 条回复 最后回复
  • 李东岳李 离线
    李东岳李 离线
    李东岳 管理员
    在 中回复了 evensun 最后由 编辑
    #11

    @evensun 是boundary的patch上的值,不是边界第一层网格的值

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

    1 条回复 最后回复

  • 登录

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