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



  • 问题

    之前用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;
        }
    }
    


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



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



  • @东岳
    processor BC

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



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



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



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


Log in to reply
 

CFD中文网 2016 - 2020 | 京ICP备15017992号-2