CFD中文网

    CFD中文网

    • 登录
    • 搜索
    • 最新

    并行计算结果与串行结果差异很大的问题

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

      问题

      之前用OpenFOAM分块并行计算,并没有注意结果是否有问题。但是最近用并行计算三维模拟的时候出现了很大的问题,这才回头看看二维的情况。发现二维的串行与并行结果差异也是巨大。模拟结果中这个上升的plume结构都不一样了,如果probe某个节点再对比二者的演化值,肯定也是没法接受。下面两个图是并行和串行在1000 year的结果。

      串行计算已经与别人的程序做过benchmark对比了,是完全没有问题的。这个并行与串行的差异问题希望有大佬分享一下经验,多谢!

      • 串行结果

      串行结果

      • 并行结果

      并行结果

      算例说明

      算例使用的求解器是自己写的见docker HydrothermalFoam。

      串行和并行的所有设置都是一样的,下面贴上并行参数设置字典

      FoamFile
      {
          version     2.0;
          format      ascii;
          class       dictionary;
          location    "system";
          object      decomposeParDict;
      }
      // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
      
      numberOfSubdomains 4;
      
      method          scotch;
      
      simpleCoeffs
      {
          n               (2 2 1);
          delta           0.001;
      }
      
      hierarchicalCoeffs
      {
          n               (1 1 1);
          delta           0.001;
          order           xyz;
      }
      
      manualCoeffs
      {
          dataFile        "";
      }
      
      distributed     no;
      
      roots           ( );
      
      
      // ************************************************************************* //
      
      

      边界条件

      其中压力中的noFlux边界条件是自己定义的,其实与fixedFluxPressure边界条件(U==0)的情况是一样的。

      FoamFile
      {
          version     2.0;
          format      ascii;
          class       volScalarField;
          object      T;
      }
      // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
      
      dimensions      [0 0 0 1 0 0 0];
      
      internalField   uniform 278.15;     //278.15 K = 5 C
      
      boundaryField
      {
          top
          {
              type            inletOutlet;
              phi                     phi;
              inletValue      uniform 278.15;
          }
          bottom
          {
              type fixedValue;
              value   uniform 773.15; //placeholder
          }
          sidewalls
          {
              type            zeroGradient;
          }
      }
      
      // ************************************************************************* //
      
      FoamFile
      {
          version     2.0;
          format      ascii;
          class       volScalarField;
          object      p;
      }
      // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
      
      dimensions      [1 -1 -2 0 0 0 0];
      
      internalField   uniform 250e5;
      
      boundaryField
      {
          top
          {
              type            fixedValue;
              value           uniform 250e5; 
          }
          bottom
          {
              type            noFlux;
          }
          sidewalls
          {
              type            noFlux;
          }
      }
      
      1 条回复 最后回复 回复 引用
      • 李东岳
        李东岳 管理员 最后由 编辑

        很难判断别人的代码问题在哪里。并行与串行的区别,如果差别明显,主要是由于processor边界造成的,你看你的求解器里面的processor边界是否合理

        线上CFD课程开始报名:http://www.dyfluid.com/class.html

        CFD高性能服务器 http://dyfluid.com/servers.html

        1 条回复 最后回复 回复 引用
        • C
          ChimneyFoam 最后由 编辑

          @东岳 我猜也是边界条件的问题,这个processor边界需要自己在求解器里面处理吗?我没有处理过这个,我看OF自带的求解器里面好像也没有做处理,比如buoyantPimpleFoam。东岳老师您可以稍微给我点这方面的例子或者资料吗?多谢多谢!

          1 条回复 最后回复 回复 引用
          • C
            ChimneyFoam 最后由 编辑

            @东岳
            processor BC

            这是不是就是问题的所在,这个procBoundary1to0和procBoundary0to1 的value是不是应该相等才对?

            1 条回复 最后回复 回复 引用
            • C
              ChimneyFoam 最后由 编辑

              检查了一下damBreak算例的并行,这个procBoundary1to0和procBoundary0to1 的value确实是不相等的,应该不是这个的问题。而且damBreak的并行和串行结果基本一致,说明肯定是我的solver或者边界条件的问题,可是我查了好久的资料都没有找到问题关键在哪。

              1 条回复 最后回复 回复 引用
              • 浪
                浪迹天大 最后由 编辑

                最近帮一个同事解决了类似问题,因为他对一个默认边界条件(calculated)的volScalarField量进行了fvc::grad操作,一个解决办法是fvc::grad之前先对这个量执行一下correctBoundaryConditions()。希望可以给你一个参考。

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

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

                  buoyantPimpleFoam大体上可以参考rhoPimpleFoam 不过既然你们都说要buoyantPimpleFoam 我可以写一写 http://dyfluid.com/rhoPimpleFoam.html 网上也有一些其他的资料应该,不过自从我自己写自己的推导之后,就没看过别人的 :qichuang: 这个求解器只不过就是可压缩求解器+传热,没啥大的特殊

                  线上CFD课程开始报名:http://www.dyfluid.com/class.html

                  CFD高性能服务器 http://dyfluid.com/servers.html

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