粒子法将流体或固体离散为称为粒子的计算单元。对于固体,几何信息由不同尺寸的三角形面元表示。每个与粒子发生相互作用的面元被转换为一个虚拟壁面粒子,从而使固体边界与流体区域均以粒子形式统一表达。这种统一表达方式使数值计算能够专注于粒子间的相互作用。
在粒子法中,每个粒子在有限影响半径 范围内与周围环境发生相互作用。以粒子为球心、半径为 的球体定义了其影响区域。位于该球体内的所有粒子称为邻近粒子,位于该球体内的所有三角形面元称为邻近三角形面元。
问题描述
若干粒子和三角形面元随机分布于三维空间中,粒子与面元之间的相互作用影响范围为 。以给定粒子为球心、半径为 定义一个球体,该球体内的三角形面元即为该粒子的邻近三角形面元。任务是为每个粒子识别出所有邻近三角形面元。

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

网格单元的边长取为粒子的影响半径 。在确定某粒子的邻近面元时,只需检索该粒子所在网格单元及三维空间中周围 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)。
