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()派上用场的 ...
随机推荐
- spring注解(Component、依赖注入、生命周期、作用域)
1.注解 注解就是一个类,使用@加上注解名称,开发中可以使用注解取代配置文件 2.@Component 取代<bean class="">,@Component 取代 ...
- org.springframework.dao.InvalidDataAccessApiUsageException: The given id must not be null!; nested exception is java.lang.IllegalArgumentException: The given id must not be null
通过这个简单的案例,手把手教给你分析异常信息(适合初学者看) org.springframework.dao.InvalidDataAccessApiUsageException: The given ...
- 【性能监控-Perfmon工具】Perfmon工具使用教程
一.Perfmon工具简介 Perfmon是一款Windows自带的性能监控工具,提供了图表化的系统性能实时监视器.性能日志和警报管理.通过添加性能计数器可以实现对CPU.内存.网络.磁盘.进程等多类 ...
- java.lang.illegalArgumentException异常
今天在使用spring3.2的时候,配置好注解开发后,运行出现异常 java.lang.illegalArgumentException 经查为 JRE 版本域spring3.2不兼容所致, 将项目J ...
- HTML中限制input 输入框输入内容
限制 input 输入框只能输入纯数字1.onkeyup = "value=value.replace(/[^\d]/g,'')" 使用 onkeyup 事件,有 bug ,那就是 ...
- 071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法
071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法 本文知识点:综合案例-数组移位-显示数组当中所有元素 ...
- 如何确定芯片pin1的位置
来源:https://www.raviyp.com/embedded/150-identifying-pin-no-1-on-an-ic Identifying pin no 1 on an IC R ...
- 在java中使用SFTP协议安全的传输文件
本文介绍在Java中如何使用基于SSH的文件传输协议(SFTP)将文件从本地上传到远程服务器,或者将文件在两个服务器之间安全的传输.我们先来了解一下这几个协议 SSH 是较可靠,专为远程登录会话和其他 ...
- chattr 和 lsattr 命令详解
lsattr 命令 lsattr 命令用于查看文件的第二扩展文件系统属性. 语法: lsattr(选项)(参数) 选项: -E:可显示设备属性的当前值,但这个当前值是从用户设备数据库中获得的,而不是从 ...
- Python:MySQL数据库环境相关问题
系统环境 Ubuntu 16.04.2 LTS mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper P ...