我正在执行一些涉及数百万个原子系统的 MD 模拟。
我编写了一些代码来生成一个文件,该文件只是 XYZ 原子坐标的列表。现在我需要在原子之间产生键。如果两个原子彼此相距一定距离,则被认为是键。
示例 XYZ 文件:
1 0 0
2 0 0
7 0 0
10 0 0
9 0 0
所以我有五个原子。如果我的距离阈值为 2 个单位,那么我的债券列表将是:
1 2
3 5
4 5
(其中数字对应于 XYZ 文件中的坐标索引)。
生成此列表的简单方法是:
for i = 1:numAtoms
for j = i+1:numAtoms
if distance(atom[i], atom[j]) < 2
bonds.push [i, j]
然而,这很快就达到了算法限制,即使在针对数百万个原子的高度优化的 C 语言中也很慢,至少在我将执行此过程的频率上如此。
我曾经写过一次光子映射器时,对空间分区数据结构的唯一经验是使用 kd-trees,所以我真的不知道这个问题的最佳解决方案是什么。我敢肯定,那里可能有一些最适合这个的东西。
我还应该提到我的模拟框是周期性的,这意味着 (0.5, 0, 0) 处的原子将与 (boxWidth - 0.5, 0, 0) 处的原子结合,距离阈值为 2。