Navigation

    CFD中文网

    CFD中文网

    • Login
    • Search
    • 最新

    OF并行计算这个语句,与单核运行时有什么不同?

    OpenFOAM
    3
    13
    5571
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • A
      Aeronastro last edited by Aeronastro

      已经被搞疯~

      我的主程序.C的int main()中,调用了更新边界的语句,即:

      int main(int argc, char *argv[])
      {
      // 一些必要的#include "... .H"
      ..........
      ..........
      while(runTime,run())
      {
      ......
      ......
      U.correctBoundaryConditions();
      // Info << "breakPoint" << endl;
      // getchar(); 不会出现内存错误
      T.correctBoundaryConditions();
      // Info << "breakPoint" << endl;
      // getchar(); 出现内存错误
      p.correctBoundaryConditions();
      ......
      ......
      .......
      }
      }
      通过设置Info,发现在执行完第一个U.correctBoundaryConditions(),不会报错,如果执行T.correctBoundaryConditions()时,就会有一大堆的内存错误信息,其中包括
      Invalid free() / delete /delete[] /realloc() 这种空间申请/释放问题;
      N bytes in M blocks are still reachable in loss record X of Y,这里N M X Y都是整数。

      PS: 我是用mpirunDebug下的Xterm+valgrind模式下调试的,找错的时候也是在代码中设置info,其他地方都没问题,就是在T.correctBoundaryConditions()下面加调试信息的时候就出现了上述问题。

      请各位分析一下是什么原因?我已疯~~~~,谢谢!

      1 Reply Last reply Reply Quote
      • A
        Aeronastro last edited by

        附图
        0_1461292386958_11.png

        C 1 Reply Last reply Reply Quote
        • C
          CFD中文网 @Aeronastro last edited by CFD中文网

          @Aeronastro

          链接文本

          如果能参考这个帖子贴出一个测试代码最好了。另外,可以用pout来代替info测试并行。并且提供linux系统和openfoam版本?

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

          1 Reply Last reply Reply Quote
          • W
            wwzhao 教授 last edited by

            同意楼上,a minimal working example would be helpful :tongue_out:

            1 Reply Last reply Reply Quote
            • A
              Aeronastro last edited by Aeronastro

              首先感谢@cfd-china 和@wwzhao 的回复,我把我的问题描述重新说一下

              int main(int argc, char *argv[])
              {
                   // 一些必要的#include "... .H"
                    ..........
                    .........
              
              
                    while(runTime.run())
                    {
                         ......
                         ......
              
              
                         U.correctBoundaryConditions();
                         Info << "breakPoint" << endl;
                         getchar();     // 不会出现内存错误
                         T.correctBoundaryConditions();
                        // Info << "breakPoint" << endl;
                        // getchar();      出现内存错误
                         p.correctBoundaryConditions();
              
              
              
                       ......
                       ......
                      .......
                    }
              }
              

              用这个格式会直观一些,我的入口边界条件是自定义的,是通过计算得到的速度场,温度场等,将他们的value逐个赋给入口的faces,在每次循环求解之前,我要手动更新边界,让新算出来的速度场、温度场等赋值到新的时间步的边界上,上面的代码我执行U.correctBoundaryConditions(),没有问题,可以在屏幕上出现“breakPoint”的信息,如果写成

                        U.correctBoundaryConditions();
                        // Info << "breakPoint" << endl;
                         //getchar();     // 不会出现内存错误
                        T.correctBoundaryConditions();
                        Info << "breakPoint" << endl;
                        getchar();     // 出现内存错误
                        p.correctBoundaryConditions();
              

              就会出现我之前遇到的问题,不知道这个在并行的时候为什么会这样。
              PS:关于并行,之前@wwzhao 说过关于分布式内存,我想是不是问题出现在这儿。
              我的入口边界条件中经过计算得到的速度场,温度场没有使用new,而是直接用的全局变量(就是写在了主函数体外),即:在求解器的C文件中:

              #include "fvCFD.H"
              #include "....H"    // 一些必要的头文件
              .....
              
              #include "incl3d.H"    //一些定义的量,包括那个要计算的速度场,温度场等,我为了方便写成了.H文件
              
              int main()
              {
                   ......
              }
              

              不知道这样有什么问题?看之前的错误信息的附图(可能不是很清晰),里面有new, delete, delete[]的错误。

              C W 2 Replies Last reply Reply Quote
              • C
                CFD中文网 @Aeronastro last edited by

                在每次循环求解之前,我要手动更新边界,让新算出来的速度场、温度场等赋值到新的时间步的边界上,

                每个时间步都需要这么做?:big_mouth: :big_mouth: :big_mouth:

                在程序里面添加getchat()是为什么?

                也就是说你的程序是这样的:?

                           U.correctBoundaryConditions();
                           getchar();     
                           T.correctBoundaryConditions();
                           getchar();      //出错?
                           p.correctBoundaryConditions();
                

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

                A 1 Reply Last reply Reply Quote
                • A
                  Aeronastro @CFD中文网 last edited by Aeronastro

                  @cfd-china 我今天发现,在执行完U.correctBoundaryConditions()之后,执行T.correctBoundaryConditions()里面的boundaryField_.evaluate()就会出错,而且我定位到evaluate函数源码,好像都没有执行这个函数就报错了,也就是说evaluate函数一句都没执行过

                  但是单核运行,都没问题

                  1 Reply Last reply Reply Quote
                  • C
                    CFD中文网 last edited by

                    刚才误删了原贴。

                    你试过执行U.correct()两遍么?而不是第一遍U第二遍T

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

                    A 3 Replies Last reply Reply Quote
                    • W
                      wwzhao 教授 @Aeronastro last edited by

                      @Aeronastro 场量的声明一般放在 createFields.H 文件当中,而这个文件会在main函数中用 #include 语句包含进来。

                      A 1 Reply Last reply Reply Quote
                      • A
                        Aeronastro @CFD中文网 last edited by Aeronastro

                        @cfd-china 这个没有试过。可以具体一些么?我还不太清楚你的意思:confused:

                        1 Reply Last reply Reply Quote
                        • A
                          Aeronastro @CFD中文网 last edited by Aeronastro

                          @cfd-china

                          我在并行的时候,出现这样的信息,一直没管:

                          warning: the debug information found in "/usr/lib/debug//lib/x86_64-linux-gnu/libm-2.19.so" does not match "/lib/x86_64-linux-gnu/libm.so.6" (CRC mismatch).
                          
                          warning: the debug information found in "/usr/lib/debug/lib/x86_64-linux-gnu/libm-2.19.so" does not match "/lib/x86_64-linux-gnu/libm.so.6" (CRC mismatch).
                          
                          warning: the debug information found in "/usr/lib/debug//lib/x86_64-linux-gnu/libc-2.19.so" does not match "/lib/x86_64-linux-gnu/libc.so.6" (CRC mismatch).
                          
                          warning: the debug information found in "/usr/lib/debug/lib/x86_64-linux-gnu/libc-2.19.so" does not match "/lib/x86_64-linux-gnu/libc.so.6" (CRC mismatch).
                          
                          warning: the debug information found in "/usr/lib/debug//lib/x86_64-linux-gnu/libpthread-2.19.so" does not match "/lib/x86_64-linux-gnu/libpthread.so.0" (CRC mismatch).
                          
                          warning: the debug information found in "/usr/lib/debug/lib/x86_64-linux-gnu/libpthread-2.19.so" does not match "/lib/x86_64-linux-gnu/libpthread.so.0" (CRC mismatch).
                          

                          不知道这个是什么

                          1 Reply Last reply Reply Quote
                          • A
                            Aeronastro @wwzhao last edited by

                            @wwzhao 嗯嗯是的,我因为要在主函数中调用一个函数,而这个函数里要用到一些量,所以我把这些要用到的量定义成了全局变量,这样的话在执行完这个函数的时候,那些变量还在,供主函数继续操作。而别的量我已经在createField.H中定义了。

                            1 Reply Last reply Reply Quote
                            • A
                              Aeronastro @CFD中文网 last edited by

                              This post is deleted!
                              1 Reply Last reply Reply Quote
                              • First post
                                Last post

                              CFD中文网 | 东岳流体 | 京ICP备15017992号-2