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
MFiX-DEM中的并行碰撞搜索的更多相关文章
- .Net中的并行编程-2.ConcurrentStack的实现与分析
在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现 ...
- .Net中的并行编程-3.ConcurrentQueue实现与分析
在上文<.Net中的并行编程-2.ConcurrentQueue的实现与分析> 中解释了无锁的相关概念,无独有偶BCL提供的ConcurrentQueue也是基于原子操作实现, 由于Con ...
- unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)
刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...
- .Net中的并行编程-6.常用优化策略
本文是.Net中的并行编程第六篇,今天就介绍一些我在实际项目中的一些常用优化策略. 一.避免线程之间共享数据 避免线程之间共享数据主要是因为锁的问题,无论什么粒度的锁 ...
- .Net中的并行编程-5.流水线模型实战
自己在Excel整理了很多想写的话题,但苦于最近比较忙(其实这是借口).... 上篇文章<.Net中的并行编程-4.实现高性能异步队列>介绍了异步队列的实现,本篇文章介绍我实际工作者遇到了 ...
- .Net中的并行编程-4.实现高性能异步队列
上文<.Net中的并行编程-3.ConcurrentQueue实现与分析>分析了ConcurrentQueue的实现,本章就基于ConcurrentQueue实现一个高性能的异步队列,该队 ...
- iOS中利用UISearchBar实现搜索
先把源码贴出来 https://github.com/losedMemory/ZSSearchBar 这是我在github上写的一个Demo,大家可以看看 在大多数app中都会用到搜索功能,那么搜 ...
- 对图片进行索引,存入数据库sqlite3中,实现快速搜索打开
对图片进行索引,存入数据库中,实现快速搜索打开 这个任务分为两步: 第一步:建立索引 import os import shutil import sqlite3 # 扫描函数,需扫描路径目录处 ...
- 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)
1.3.5 使用 search()在一个字符串中查找模式(搜索与匹配的对比) 其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率.这也就是 search()派上用场的 ...
随机推荐
- 2.Strom-入门案例
- (转载)什么是B+树?
本文转载自网络. 如有侵权,请联系处理!
- ThinkPHP 5 生命周期
前段时间用TP5开发了一个小程序,就熟悉了一下TP5.TP5是TP框架最新的一个版本,与以前的3还是有很大的区别,有人说和laravel比较靠近,其实也还好,每个人都有自己不同的看法,只要是选择一个自 ...
- 栈和队列数据结构的基本概念及其相关的Python实现
先来回顾一下栈和队列的基本概念: 相同点:从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同. 不同点:栈(Stack)是限定只能在表的一端进行插入和删除操作的线性 ...
- Intel HEX格式
来来 !! come baby ! 只强调一点这篇文章有checksum的算法,是我最喜欢地!! 参考:https://blog.csdn.net/extlife/article/details/ ...
- 下载 Oracle Database XE 11gR2
操作系统:Windows 10 x64 第一节:下载 Oracle Database XE 11gR2 第二节:安装.验证安装 Oracle Database XE 11gR2 第三节:Oracle ...
- shiro入门学习--授权(Authorization)|筑基初期
写在前面 经过前面的学习,我们了解了shiro中的认证流程,并且学会了如何通过自定义Realm实现应用程序的用户认证.在这篇文章当中,我们将学习shiro中的授权流程. 授权概述 这里的授权指的是授予 ...
- Prometheus第一篇:Prometheus架构解析
Prometheus是新一代的监控系统解决方案,原生支持云环境,和kubernetes无缝对接,的却是容器化监控解决方案的不二之选.当然对传统的监控方案也能够兼容,通过自定义或是用开源社区提供的各种e ...
- GML与KML的区别
1.GML是基于XML的地理信息的传输.存储编码,它包括空间的和非空间的地理特征和地理范畴.GML是空 间数据编码.传输.存储.发布的国际标准KML是一个OGC标准 2.GML专注于地理信息的结构与内 ...
- Linux_centOS_5.7_64下如何安装jdk1.8&mysql
本文主要介绍的是如何是Linux环境下安装JDK的,因为Linux环境下,很多时候也离不开Java的,下面笔者就和大家一起分享如何jdk1.8的过程吧. JDK安装 环境 操作系统:Centos7_6 ...