在计算颗粒碰撞的时候,需要进行neighbor颗粒的搜寻,只知道大概是基于网格与颗粒绑定的方式,但是具体的实现方式还是比较模糊。搜寻部分代码如下 (mfix-19.2.2):

可以直接观察到的是,这里用到了两层do循环,外层循环是遍历所有颗粒的ID,LL,这个ID是每个颗粒的全局标记。内层循环用来遍历颗粒LL周围的颗粒,ID为I。主要问题就在于上图红色方框的内容的含义。
通过借助mfix-16.1版这部分代码debug内容的输出可以大概理解上面的内容。16版代码如下:

在这里,外层循环输出了三个变量,LLCC_STARTCC_END,内层循环输出了I。输出结果为:

从上面的输出可以看到NEIGHBOR_INDEX(MAX_PIP-1)返回的是总的neighbor数量,从下面的输出可以看出CC_START = NEIGHBOR_INDEX(LL-1)CC_END = NEIGHBOR_INDEX(LL)分别代表颗粒LL的neighbor遍历区间,下面说明一下这里的逻辑。

通过观察输出最后可以得到结论,首先程序会得到所有neighbor颗粒的数量,然后用数组NEIGHBOR_INDEX(:)来给所有neighbor颗粒编号,例如这个算例中一共有2400个颗粒,neighbor颗粒一共有6924个,因此编号从1~6924。

颗粒LL的neighbor颗粒编号则是从NEIGHBOR_INDEX(LL-1)NEIGHBOR_INDEX(LL) - 1,这个编号是连续的,然后用这个编号又可以获取到neighbor颗粒的ID,如I = NEIGHBORS(CC)

需要注意的是,这里在遍历neighbor的时候,没有出现重复计数的情况,用上面的图来举例:
47号颗粒的neighbor编号为75~77(CC = CC_START, CC_END-1),也就是说它有三个neighbor,对应的ID为48,78,79。48号颗粒的neighbor编号为78~80,对应的ID为49,79,80。可以看到48号颗粒的neighbor不再包含47号,因为47号颗粒遍历neighbor的时候已经将48号包含进去了,这样避免了重复循环带来的额外开销。

因此NEIGHBOR_INDEX(MAX_PIP-1)返回的是总的neighbor数量,因为最后一个颗粒MAX_PIP的neighbor编号一定是最大的编号,后面不再有未被遍历的neighbor了,如下图所示:

MFiX-DEM中的串行碰撞搜索的更多相关文章

  1. java面试一日一题:再谈垃圾回收器中的串行、并行、并发

    问题:请讲下java中垃圾回收器的串行.并行.并发 分析:该问题主要考察在垃圾回收过程中垃圾回收线程和用户线程的关系 回答要点: 主要从以下几点去考虑, 1.串行.并行.并发的概念 2.如何考虑串行. ...

  2. 从DataReader中手动串行化JSON

    void WriteDataReader(StringBuilder sb, IDataReader reader) { ) { sb.Append("null"); return ...

  3. iOS:对GCD中 同步、异步、并行、串行的见解

    1.GCD-同步执行多线程时          GCD中不管向什么类型的队列加同步任务,实际上都会加到当前线程中(一般为主线程). 2.GCD-异步执行多线程时          GCD中不管向什么类 ...

  4. 基于51的串行通讯原理及协议详解(uart)

    串行与并行通讯方式并行:控制简单,传输速度快.线多,长距离成本较高且同时接受困难.串行:将数据字节分成一位一位的行驶在一条传输线上进行传输.如图:   同步与异步串行通讯方式同步串行通讯方式:同步通讯 ...

  5. ios--进程/多线程/同步任务/异步任务/串行队列/并行队列(对比分析)

    现在先说两个基本的概念,啥是进程,啥是线程,啥又是多线程;先把这两个总是给弄清再讲下面的 进程:正在进行的程序,我们就叫它进程. 线程:线程就是进程中的一个独立的执行路径.这句话怎么理解呢! 一个程序 ...

  6. IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别(附代码)

    进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程 队列 dispa ...

  7. IOS多线程知识总结/队列概念/GCD/串行/并行/同步/异步

    进程:正在进行中的程序被称为进程,负责程序运行的内存分配;每一个进程都有自己独立的虚拟内存空间: 线程:线程是进程中一个独立的执行路径(控制单元);一个进程中至少包含一条线程,即主线程. 队列:dis ...

  8. QDataStream类参考(串行化数据,可设置低位高位,以及版本号),还有一个例子

    QDataStream类提供了二进制数据到QIODevice的串行化. #include 所 有成员函数的列表. 公有成员 QDataStream () QDataStream ( QIODevice ...

  9. MFC如何生成一个可串行化的类

    一.MFC允许对象在程序运行的整个过程中持久化的串行化机制 (1)串行化是指向持久化存储媒介(如一个磁盘文件)读或写对象的过程. (2)串行化用于在程序运行过程时或之后修复结构化数据(如C++类或结构 ...

随机推荐

  1. Jakartase_IO流_ — Commons IO_(IO流终极篇)

    一.前言 Apache Commons IO是Apache基金会创建并维护的Java函数库. 它提供了许多类使得开发者的常见任务变得简单,同时减少重复代码 二.Commons IO 类库 2.1 Fi ...

  2. 搭建ssm整合

    一.导入依赖 二.新建java和resources目录 1.在java目录新建cn.itcat.domain包,继续添加controller,service,dao,的包 2.在domain里面创建A ...

  3. python库之argparse

    先运行一个干净的argparse 由于没有添加任何参数,所以只能用自带的 -h(--help)参数 现在来加一个参数 所以echo为必填项 描述在-h时会出现 type=int指定参数只能是数字,否则 ...

  4. linux 重启服务器命令

    Linux有如下的关机和重启命令:shutdown, reboot,poweroff, halt shutdown shutdown命令是大家都推荐的一个安全的命令,通过参数-h或-r的配合来完成关机 ...

  5. Linux设置主机名称与host映射

    uname -n :查看host对应的域名 2.在 /etc/hostname 删除原来的重新配置需要的域名   3.在 /etc/hosts 中添加域名和映射ip   4.重启系统   5.其他主机 ...

  6. sqli-labs第二关 详解

    学会了第一关,时隔多天来到了第二关,怎么说了没有看wp就给做出来了. 首先,我是自己先判断了下,这个是什么注入 ?id=1' 不行 ?id=1' or '1'='1--+ 也不行 然后又尝试了下 ?i ...

  7. python排序算法总结和实现

    ------------------希尔排序------------- 一直没搞懂希尔排序怎么搞得 def Shell_sort(L): step = len(L)/2 while step > ...

  8. 关于继承、封装、多态、抽象和接口(Java)

    1.继承:    通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类.已有的称为父类,新的类称为子类(父类派生子类,子类继承父类). (1)继承的优点:①代码的可重用性: ②父类的属性的方 ...

  9. CSG:清华大学提出通过分化类特定卷积核来训练可解释的卷积网络 | ECCV 2020 Oral

    论文提出类特定控制门CSG来引导网络学习类特定的卷积核,并且加入正则化方法来稀疏化CSG矩阵,进一步保证类特定.从实验结果来看,CSG的稀疏性能够引导卷积核与类别的强关联,在卷积核层面产生高度类相关的 ...

  10. ✅Vue选择图像

    下载 Vue选择图像Vue选择图像 Vue 2.用于从列表中选择图像的组件 演示 https://mazipan.github.io/vue-select-image/ 安装 #纱 纱添加vue-se ...