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
25 帖子 6 发布者 16.6k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • D 离线
    D 离线
    D.Benjamin
    在 中回复了 李东岳 最后由 编辑
    #3

    @东岳 老师好,我只是打个比方。我需要设置一个入口边界条件,该边界条件与出口的物理量相关。不想扯大段的背景,所以就这样简答描述了。这种情况是存在守恒的,比如说,在某一容器中,有一释热源,流体从容器出口流出,经过外部冷却后再重新经入口流入容器。如此以来,入口值是有可能是出口的一半的

    OpenFOAM初学者,希望和大家共同交流

    1 条回复 最后回复
  • D 离线
    D 离线
    D.Benjamin
    在 中回复了 李东岳 最后由 编辑
    #4

    @东岳 老师好,经过这几天的学习,我在网上一些博客中找到了一些答案,但是他们给出的代码有问题,编译不能通过。下面,我将给出两个不同帖子中关于如何修改入口处的x方向温度值的方案:

    方案一:

    label patchIndex = mesh.boundaryMesh().findPatchID("inlet");
    scalarField &patchField = T.boundaryField()[patchIndex];
    
    forAll(patchField, i) {
        patchField[i] = 10.0;
    }
    

    我发现,在进行wmake编译时,会出错。问题在于" &patchField "前面的取址符号&。虽然去掉上述代码中取址符号&,编译可以通过,但并不能改变入口处温度场的值(即入口处温度场的值仍是原来的值,这段代码便没有意义了),下面为编译报错情况:

    p1.png

    方案二:

    label patchIndex = mesh.boundaryMesh().findPatchID("inlet");
    scalarField patchField = T.boundaryField()[patchIndex];
    
    forAll(patchField, i) {
        T.boundaryField()[patchIndex][i] = 10.0;
    }
    

    然而,编译仍然不能通过,下面为报错情况:
    p2.png

    别人博文上的东西照理说应该是正确的呀,真不知道该怎么办了,跪求各位老师,大神,大佬指点!!

    OpenFOAM初学者,希望和大家共同交流

    1 条回复 最后回复
  • D 离线
    D 离线
    D.Benjamin
    写于 最后由 编辑
    #5

    上面说错了一点点,是:修改入口处的温度值的方案;不是:修改入口处x方向的温度值的方案。温度是标量,刚才不小心打错了

    OpenFOAM初学者,希望和大家共同交流

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

    @D-Benjamin 在 如何设置一个入口边界条件:入口边界值为出口平均值的一半 中说:

    scalarField &patchField = T.boundaryField()[patchIndex];

    单说这句应该改为

    scalarField& patchField = T.boundaryFieldRef()[patchIndex];
    

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

    D 2 条回复 最后回复
  • D 离线
    D 离线
    D.Benjamin
    在 中回复了 李东岳 最后由 编辑
    #7

    @东岳 非常感谢

    OpenFOAM初学者,希望和大家共同交流

    1 条回复 最后回复
  • D 离线
    D 离线
    D.Benjamin
    在 中回复了 李东岳 最后由 编辑
    #8

    @东岳 老师,又来叨绕你了。以上问题已经解决,编译可以通过,FOAM也可以成功进行计算。然而,不能并行计算。似乎在求解器中修改边界条件,会对并行计算产生影响。我的猜测是,并行计算需要将网格分裂成许多块,这样它们就只能根据0字典下的边界条件进行计算。在求解器中强制对边界条件进行修改,使得入口温度是出口的一半,由于网格分块并行,在某些块中不能获取到出口的值,因而并行计算时就会报错。
    所以,想请教一下,有没有什么解决的办法?使其可以并行计算呢?谢谢

    OpenFOAM初学者,希望和大家共同交流

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

    https://www.cfd-online.com/Forums/openfoam-solving/193543-codedfixedvalue-accessing-other-patch-causes-crash-parallel.html

    你试试这个:xiezuoye:

    // get patch ID on opposite side
    label oPatchID = this->patch().boundaryMesh().
                        findPatchID(oPatchName);
    // get pressure on other side
    const volScalarField& p = this->db().
            objectRegistry::lookupObject<volScalarField>("p");
    
    // patch field on opposite side for single processor
    const scalarField& fieldOSP = p.boundaryField()[oPatchID];
    
    // get patch field size from each processor
    labelList fSizePerProc( Pstream::nProcs(), 0.0 );
    label thisProcNo = Pstream::myProcNo();
    fSizePerProc[thisProcNo] = fieldOSP.size();
    
    // combine field sizes from all processors
    reduce( fSizePerProc, sumOp<labelList>() );
    
    // get field values from all processors
    label totalFSize = sum( fSizePerProc );
    
    // get field from each processor
    scalarField fieldOAP( totalFSize, 0.0 );
    
    // if patch is on current proc
    if( fSizePerProc[thisProcNo] > 0 )
    {
        // get field size on previous processors
        label prevFSize = 0;
        for (label i = 0; i < thisProcNo; ++i)
        {
            prevFSize += fSizePerProc[i];
        }
        // write field from patch on current proc
        for (label i = 0; i < fSizePerProc[thisProcNo]; ++i)
        {
            fieldOAP[i + prevFSize] = fieldOSP[i];
        }
    }
    
    // combine fields from all processors
    reduce( fieldOAP, sumOp<scalarField>() );
    
    // get pressure gradient from caseDict
    #include "readgradp.H"
    
    // write pressure from opposite side to this patch, add gradP
    scalarField& pField = *this;
    forAll(pField, faceI)
    {
        pField[faceI] = fieldOAP[faceI] + gradP;
    }
    

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

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

    @东岳 也不一定嘛,比如可压缩流呢。最后就是出入口都趋于零

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

    进来5,出去10,这不是不守恒么?

    这是不考虑源项的时候

    :136:

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

    D 1 条回复 最后回复
  • D 离线
    D 离线
    D.Benjamin
    在 中回复了 李东岳 最后由 编辑
    #12

    @东岳 @yuan_neu 两位老师好,我尝试了上面东岳老师推荐的并行方法,编译可以通过,且可以并行运行计算,但是,我发现计算结果与串行相比,具有较大偏差(初步估计大了3-5%)。

    同样一行代码(如下所示):

    // 串行
    const scalarField C_outlet = C.boundaryField()[patchId];
    Info << "C_outlet:" << C_outlet << endl;
    
    // 并行
    const scalarField C_outlet_SP = T.boundaryField()[patchId];
    Info << "C_outlet_SP:" << C_outlet_SP << endl;
    

    C_outlet与C_outlet_SP的结果相差较大(并行读取结果偏大),由于我的入口边界条件是对所有网格的C_outlet进行面平均的0.95倍:

    C_inlet = 0.95 * C_outlet_avarage;
    

    由于并行读取结果偏大,最后导致了入口值反而大于出口值。这是不是并行的bug?

    求解答,祝好!

    OpenFOAM初学者,希望和大家共同交流

    1 条回复 最后回复
  • 玉 离线
    玉 离线
    玉玺
    在 中回复了 D.Benjamin 最后由 编辑
    #13

    @D-Benjamin 您好,我目前想要实现两相出口固相通量等于入口通量,能不能打扰您,向您咨询下这个怎么实现?

    CFD小菜鸟一枚,万一遨游了

    D 2 条回复 最后回复
  • D 离线
    D 离线
    D.Benjamin
    在 中回复了 玉玺 最后由 编辑
    #14

    @玉玺 你好,我目前不研究两相流,不能给你具体方案,从我们上述讨论中你应该可以找到思路,祝好

    OpenFOAM初学者,希望和大家共同交流

    1 条回复 最后回复
  • D 离线
    D 离线
    D.Benjamin
    在 中回复了 玉玺 最后由 编辑
    #15

    @玉玺 我不是做两相流的

    OpenFOAM初学者,希望和大家共同交流

    玉 2 条回复 最后回复
  • 玉 离线
    玉 离线
    玉玺
    在 中回复了 D.Benjamin 最后由 编辑
    #16

    @D-Benjamin 您好,我想咨询一下,我用codedFixedValue边界条件

    label patchIndex =this->patch(). boundary. findPatchID(”“outlet”);
    const volVector& U=this->db(). lookupObject<volVectorField>("U.particles");
    

    这两行读取的速度就是outlet的出口颗粒速度吧

    CFD小菜鸟一枚,万一遨游了

    1 条回复 最后回复
  • 玉 离线
    玉 离线
    玉玺
    在 中回复了 D.Benjamin 最后由 编辑
    #17

    @D-Benjamin 如果那两行是它的速度的话,然后我再U去获得它的x方向速度,令它等于入口x的速度,这样子就可以了吧?非常感谢

    CFD小菜鸟一枚,万一遨游了

    D 1 条回复 最后回复
  • D 离线
    D 离线
    D.Benjamin
    在 中回复了 玉玺 最后由 编辑
    #18

    @玉玺 你好,你的第一行是对的,由于我不做颗粒,我研究的就是流体,所以我不清楚你的第二行那样获取颗粒速度是否正确。你可以先测试下。不过我觉得,获得出口速度值应该类似于这样的:

    const volVector& U=this->db(). lookupObject<volVectorField>("U.particles")[patchIndex];
    

    欢迎继续交流

    OpenFOAM初学者,希望和大家共同交流

    玉 2 条回复 最后回复
  • 玉 离线
    玉 离线
    玉玺
    在 中回复了 D.Benjamin 最后由 编辑
    #19

    @D-Benjamin 大佬,冒昧问一句可否加个联系方式交流交流,我看到您要实现的也是进出口的通量关系,论坛可能不方便qq1533317221

    CFD小菜鸟一枚,万一遨游了

    1 条回复 最后回复
  • 玉 离线
    玉 离线
    玉玺
    在 中回复了 D.Benjamin 最后由 编辑
    #20

    @D-Benjamin 刚才试了加上最后面那个面标号,运行好像出了点错误,待我明早去实验室确定一下。

    CFD小菜鸟一枚,万一遨游了

    D 1 条回复 最后回复
  • D 离线
    D 离线
    D.Benjamin
    在 中回复了 玉玺 最后由 编辑
    #21

    @玉玺 好的,我也准备回宿舍休息了,明天再交流吧。还有,我不是大佬,我只是比你学得久一点点的初学者,东岳老师以及贴吧里一些讲师,教授们,他们才是大佬

    OpenFOAM初学者,希望和大家共同交流

    1 条回复 最后回复
  • S 离线
    S 离线
    Samuel-Tu
    在 中回复了 李东岳 最后由 编辑
    #22

    @东岳 东岳老师,decomposed后的patch里面的face是否还是按分解前的顺序排列呢。例如分解前的patch中有6个face编号为0,1,2,3,4,5。分解的时候刚好从中间分开了,分解成两个processor里面,则processor1和processor2里的face编号都变成了 0,1,2。假如processor2里面的face是未分解时候的4,5,6,那么现在face 0,1,2一定对应的是4,5,6吗,也就是说这个顺序会不会改变,会不会0,1,2对应成原来的5,6,4了

    1 条回复 最后回复

  • 登录

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