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

    终于把之前的并行出错的问题解决了,还是要感谢@wwzhao 和@cfd-china 的帮助。
    简单一点,我之前的代码,在主函数中是这样的:

    int main()
    {
             .......
             if( // condition )           
             {
                    .......
                    U.correctBoundaryConditions();
                    T.correctBoundaryConditions();
                    p.correctBoundaryConditions();
                    .......
             }
    }
    

    这里加if的作用是因为我的代码,在并行的时候,并不是每个语句对proccessor都通用,比如说一些量的定义和操作等,因此加了个if判断一下。

    也就是说,这个地方对于有的proccessor执行了更新边界的操作,而有的processor并没有更新,这样会导致processor之间的数据交换发生问题(我个人的理解),因此就会报错。为了使得每个processor的差别仅仅是一些量定义和运算的差异,而在其他地方都同等对待,比如边界场的更新(因为proccessor之间也是通过processor边界进行数据交流的),因此我将上述代码改成如下形式:

    int main()
    {
             .......
             if( // condition )           
             {
                    .......
                    
                    .......
             }
            U.correctBoundaryConditions();
            T.correctBoundaryConditions();
            p.correctBoundaryConditions();
    }
    

    这样,对于每个processor来说,都同时更新了边界,数据交换就没问题了。

    我的case比较特殊,INLET入口边界条件是自定义的,有一些量的运算和赋值,不能破坏INLET边界,所以我用的是simple分块方法,也就是说只有processor0才会有INLET的faces,因此我的求解器代码,不能针对所有的processor,要加一些判断语句来区别processor0,另外,由于每个processor都调用了boundaryConditions(),因此自定义的INLET边界条件代码根据不同的processor也要加判断,执行不同的代码。所以在并行的时候,既要考虑到每个processor的运行代码,还要考虑到他们之间的数据交换是否存在问题。

    以上是我个人的理解,大家有什么不同的看法可以讨论哈。

    现在我的case还在算着,不知道结果怎么样,还是祈祷吧~~

    C 1 条回复 最后回复
  • C 离线
    C 离线
    CFD中文网
    在 中回复了 Aeronastro 最后由 编辑
    #2

    @Aeronastro

    感谢反馈!恭喜解决问题!

    BTW,你这个算例如果要对处理器单处处理,是不是需要手动进行网格分块?

    CFD中国标准用户测试帐号
    目前由徐笑笑登录

    A 1 条回复 最后回复
  • A 离线
    A 离线
    Aeronastro
    在 中回复了 CFD中文网 最后由 编辑
    #3

    @cfd-china 没有必要手动进行分块,我只要保证有一个processor的INLET边界是完整的就好了,其他的怎么分块比较随意,实际手动分块的话也可以,我为了简单,就用了simple了。

    记得之前好像有关于手动分块的方法的帖子,我找找看:happy:

    1 条回复 最后回复

  • 登录

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