基于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中的并行碰撞搜索的更多相关文章

  1. .Net中的并行编程-2.ConcurrentStack的实现与分析

    在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现 ...

  2. .Net中的并行编程-3.ConcurrentQueue实现与分析

    在上文<.Net中的并行编程-2.ConcurrentQueue的实现与分析> 中解释了无锁的相关概念,无独有偶BCL提供的ConcurrentQueue也是基于原子操作实现, 由于Con ...

  3. unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)

      刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...

  4. .Net中的并行编程-6.常用优化策略

                本文是.Net中的并行编程第六篇,今天就介绍一些我在实际项目中的一些常用优化策略.      一.避免线程之间共享数据 避免线程之间共享数据主要是因为锁的问题,无论什么粒度的锁 ...

  5. .Net中的并行编程-5.流水线模型实战

    自己在Excel整理了很多想写的话题,但苦于最近比较忙(其实这是借口).... 上篇文章<.Net中的并行编程-4.实现高性能异步队列>介绍了异步队列的实现,本篇文章介绍我实际工作者遇到了 ...

  6. .Net中的并行编程-4.实现高性能异步队列

    上文<.Net中的并行编程-3.ConcurrentQueue实现与分析>分析了ConcurrentQueue的实现,本章就基于ConcurrentQueue实现一个高性能的异步队列,该队 ...

  7. iOS中利用UISearchBar实现搜索

    先把源码贴出来 https://github.com/losedMemory/ZSSearchBar   这是我在github上写的一个Demo,大家可以看看 在大多数app中都会用到搜索功能,那么搜 ...

  8. 对图片进行索引,存入数据库sqlite3中,实现快速搜索打开

    对图片进行索引,存入数据库中,实现快速搜索打开    这个任务分为两步: 第一步:建立索引 import os import shutil import sqlite3 # 扫描函数,需扫描路径目录处 ...

  9. 1.3 正则表达式和Python语言-1.3.5使用 search()在一个字符串中查找模式(搜索与匹配 的对比)

    1.3.5 使用 search()在一个字符串中查找模式(搜索与匹配的对比) 其实,想要搜索的模式出现在一个字符串中间部分的概率,远大于出现在字符串起始部分的概率.这也就是 search()派上用场的 ...

随机推荐

  1. spring注解(Component、依赖注入、生命周期、作用域)

    1.注解 注解就是一个类,使用@加上注解名称,开发中可以使用注解取代配置文件 2.@Component 取代<bean  class="">,@Component 取代 ...

  2. 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 ...

  3. 【性能监控-Perfmon工具】Perfmon工具使用教程

    一.Perfmon工具简介 Perfmon是一款Windows自带的性能监控工具,提供了图表化的系统性能实时监视器.性能日志和警报管理.通过添加性能计数器可以实现对CPU.内存.网络.磁盘.进程等多类 ...

  4. java.lang.illegalArgumentException异常

    今天在使用spring3.2的时候,配置好注解开发后,运行出现异常 java.lang.illegalArgumentException 经查为 JRE 版本域spring3.2不兼容所致, 将项目J ...

  5. HTML中限制input 输入框输入内容

    限制 input 输入框只能输入纯数字1.onkeyup = "value=value.replace(/[^\d]/g,'')" 使用 onkeyup 事件,有 bug ,那就是 ...

  6. 071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法

    071 01 Android 零基础入门 01 Java基础语法 09 综合案例-数组移位 03 综合案例-数组移位-显示数组当中所有元素的的方法 本文知识点:综合案例-数组移位-显示数组当中所有元素 ...

  7. 如何确定芯片pin1的位置

    来源:https://www.raviyp.com/embedded/150-identifying-pin-no-1-on-an-ic Identifying pin no 1 on an IC R ...

  8. 在java中使用SFTP协议安全的传输文件

    本文介绍在Java中如何使用基于SSH的文件传输协议(SFTP)将文件从本地上传到远程服务器,或者将文件在两个服务器之间安全的传输.我们先来了解一下这几个协议 SSH 是较可靠,专为远程登录会话和其他 ...

  9. chattr 和 lsattr 命令详解

    lsattr 命令 lsattr 命令用于查看文件的第二扩展文件系统属性. 语法: lsattr(选项)(参数) 选项: -E:可显示设备属性的当前值,但这个当前值是从用户设备数据库中获得的,而不是从 ...

  10. Python:MySQL数据库环境相关问题

    系统环境 Ubuntu 16.04.2 LTS mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using  EditLine wrapper P ...