MFiX-DEM中的并行碰撞搜索
基于MFiX-19.2.2
DEM并行程序中的颗粒循环
在DEM并行程序中,每个进程只循环该进程包含的颗粒,并且每个进程还有一层ghost cell,用来存放另一个进程发送过来的颗粒信息。
下面添加一些代码进行实验。在calc_force_dem.f
这个文件里对颗粒做一次遍历,且输出颗粒的ID和位置坐标。需要注意的是,这里用的两个线程并行,且每个进程打开一个文本,将该进程的颗粒信息输出到自己的文本中,对于ghost cell内的颗粒,输出的时候多输出一句“is ghost:
”,并带上三个判断函数的输出值(IS_GHOST(LL), IS_ENTERING_GHOST(LL), IS_EXITING_GHOST(LL)
)来看看是否分别为ghost cell内的颗粒、是否正在进入ghost cell以及是否正在离开ghost cell。遍历完所有颗粒后,关闭文件并停止运行。代码如下:
0号进程输出的颗粒ID及位置坐标:
1号进程输出的颗粒ID和位置坐标:
可以看到每个进程的ID都是从1开始,下面对颗粒信息在Excel中进行显示。
通过对数据显示,可以看到,Proc 0(即0号进程)只包含位于左半边网格(红色实线)的颗粒,Proc 1只包含位于右半边网格(红色实线)的颗粒。并且它们都有一层ghost cell(红色虚线)用来存放另一个进程copy过来的颗粒信息。当涉及到进程边界碰撞的时候,会利用ghost cell内的颗粒信息进行碰撞计算,并行应该保证ghost cell内的颗粒与被copy的颗粒保持实时同步。
至此,大致分析了下MFiX-DEM代码并行的颗粒循环机制,即会循环该进程内内的real partcle和ghost particle,在做颗粒信息统计的时候,需要注意这些问题。例如在统计碰撞的时候,数据传输边界处的碰撞计算了两次。下面给出实际输出结果。单线程的碰撞搜索的流程可以参考这篇博客-MFiX-DEM中的碰撞搜索。
DEM并行碰撞搜索
参照上面参考的那篇博文的思路,添加如下代码,循环思路是一致的,都是两层循环,先循环每个颗粒,然后内层循环该颗粒的neighbor。不同的是这里用两个线程并行计算,输出的时候也分别输出两个进程各自的数据。代码如下:
得到0号进程的输出结果如下:
重点看最后几行。可以看到,0号进程的最后一个颗粒17与ghost cell中的第一个颗粒18进行了一次碰撞检索。
再看下面1号进程的输出结果。可以看到,1号进程的第一个颗粒1号除了和右边的2号颗粒进行了一次碰撞检索,还和左边ghost cell中的17号颗粒进行了一次检索。这两次碰撞实际上为同一个碰撞,只不过在两个进程都进行了计算。
代码:https://github.com/yinweijie/MFiX_lab/tree/master/1.neighbor_search_test