我推荐 DC Rapaport 的“分子动力学模拟艺术”。代码示例是用 C 编写的。我不是这本书的编程风格的忠实粉丝,但至少它不是 FORTRAN。话虽如此,我的建议是使用任何解释邻居列表的书(例如 Frenkel & Smit 的书,我想这就是你现在正在使用的书),然后执行通常用伪代码编写的算法.
如果你想要一个 TL;DR,有几种类型的邻居列表。所有这些都依赖于你的交互潜力在一定范围之外为 0rc.
- Verlet 列表(O(N2)-O(N3/2)但有一个小的前置因子):
- 做一个N2扫描每个粒子的位置,您填充的邻居数组比rc+rv, 在哪里rv是一个参数并保存每个粒子的当前位置(我们称之为r⃗ i(t0).
- 通过使用邻居列表计算力来改进您的模拟。
- 在每个积分步骤之后,检查是否对于任何粒子i,|r⃗ i(t)−r⃗ i(t0)|≥rv/2. 如果是,则更新所有列表(参见步骤 1)。
- 单元格列表(O(N)):
- 将您的模拟框划分为线性大小的单元格l>rc.
- 使用链接列表将粒子分配给单元格。
- 对于每个粒子i, 邻居列表由所有在i的单元格和每个(2D 中的 8 个和 3D 中的 26 个)相邻单元格中的一个。计算之间的力i及其邻居。
- 在每个集成步骤之后,检查粒子是否跨越单元边界并相应地更新数据结构
- 使用单元列表构建的 Verlet 列表(通常是最佳选择,O(N)使用比仅使用单元更小的前置因子):
- “Verlet 列表”部分的第 1 步是通过使用单元格列表来执行的。存储单元数据结构的链表在整个模拟过程中保持更新
使用 Verlet 列表而不是单元列表(在 MD 模拟中)更好的原因是前者的平均邻居数小于后者。不同之处在于,对于每个粒子,单元列表都会为您提供一个体积中的邻居列表(3l)3, 其中, 如果rv明智地选择,远大于 Verlet 球体的体积 (4/3π(rc+rv)3)。因此,平均而言,您使用 Verlet 列表计算的距离要少得多。