所有博客文章
技术背景

并行邻近粒子搜索——技术深析

Rui Duan 2026年1月14日
并行邻近粒子搜索——技术深析

粒子法将流体或固体离散为称为粒子的计算单元。对于固体,几何信息由不同尺寸的三角形面元表示。每个与粒子发生相互作用的面元被转换为一个虚拟壁面粒子,从而使固体边界与流体区域均以粒子形式统一表达。这种统一表达方式使数值计算能够专注于粒子间的相互作用

在粒子法中,每个粒子在有限影响半径 r r 范围内与周围环境发生相互作用。以粒子为球心、半径为 r r 的球体定义了其影响区域。位于该球体内的所有粒子称为邻近粒子,位于该球体内的所有三角形面元称为邻近三角形面元

问题描述

若干粒子和三角形面元随机分布于三维空间中,粒子与面元之间的相互作用影响范围为 r r 。以给定粒子为球心、半径为 r r 定义一个球体,该球体内的三角形面元即为该粒子的邻近三角形面元。任务是为每个粒子识别出所有邻近三角形面元。

二维邻近粒子示例
示例:在二维情形下,粒子 4 的邻近三角形面元 ID 为 4、10、12、16 和 17。

实现方法

在三维空间中划定网格,将环境中的每个三角形面元映射到网格上。一个或多个网格单元对每个三角形面元进行分割,从而将粒子与面元之间的位置关系转化为网格单元之间的关系

二维邻近网格示例
如二维场景所示,每个三角形面元 ID 和每个粒子 ID 均对应各自的网格 ID。

网格单元的边长取为粒子的影响半径 r r 。在确定某粒子的邻近面元时,只需检索该粒子所在网格单元及三维空间中周围 26 个相邻单元内的面元。通过比较粒子与这些三角形面元之间的实际距离与影响半径 r,即可高效识别出所有有效的邻近三角形面元。

二维邻近网格示例

在二维场景中,定位粒子 4 的邻近三角形面元时,搜索范围仅需考虑位于网格 9 及其相邻网格(3、4、5、8、9、10、13、14、15)中的面元(4、5、10、12、13、15、16、17)。这种局部化搜索大幅缩小了计算域,降低了时间复杂度。

并行搜索

该算法采用混合并行策略,将数据并行与任务并行相结合。所有粒子数据分布于多个 MPI 进程,每个进程包含完整的刚体数据。网格信息以并行方式遍历,计算粒子与相邻网格中面元之间的距离。

由于每次操作相互独立、无需通信,因此是并行处理的理想场景

优化要点

对相邻网格中三角形 ID 进行简单搜索时,可能会出现重复 ID。例如,当粒子 4 搜索邻近面元时,面元 ID 10 可能同时出现在网格 4、9 和 10 中,从而导致冗余计算。因此,必须实施去重过滤,以确保每个三角形面元在每个粒子的搜索过程中仅被计入一次。

扩展内容

固体信息存储

  • nodes:所有三角形面元的顶点坐标。
  • triangles:每个面元的顶点连接关系。

面元信息的存储
面元信息的存储

网格信息(zValue)

该算法采用 Hilbert 曲线将三维网格坐标映射为一维标识符。三维网格数据(x, y, z)通过 Hilbert 曲线降维为一维表示。每个网格点(x, y, z)记录为一个长整型数(zValue)。Morton 编码将网格坐标(x, y, z)转换为长整型数(zValue),反之,也可通过 Morton 编码从 zValue 还原网格信息(x, y, z)。

申请试用

将这些方法应用于您自己的案例

三周试用期,由工程师全程指导安装及首次配置。我们通常在24小时内回复。