并行计算结果与串行结果差异很大的问题
-
问题
之前用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边界需要自己在求解器里面处理吗?我没有处理过这个,我看OF自带的求解器里面好像也没有做处理,比如
buoyantPimpleFoam
。东岳老师您可以稍微给我点这方面的例子或者资料吗?多谢多谢! -
@东岳
这是不是就是问题的所在,这个
procBoundary1to0
和procBoundary0to1
的value是不是应该相等才对? -
检查了一下damBreak算例的并行,这个
procBoundary1to0
和procBoundary0to1
的value确实是不相等的,应该不是这个的问题。而且damBreak的并行和串行结果基本一致,说明肯定是我的solver或者边界条件的问题,可是我查了好久的资料都没有找到问题关键在哪。