我正在尝试在我的 MD 代码中实现以下形式的单元格/邻居列表方法。我已将我的模拟框划分为固定数量的单元格,并根据其位置,将每个原子正确分配到相应的单元格中。我为每个单独的单元格构建邻居列表. 在进行计算时,我只考虑相邻单元格内的原子;此外,在这个子集上,我执行 Verlet 搜索,我只考虑半径内的原子原子的. 这个更小的原子子集将相互作用。我想实现的算法在这篇论文中找到,算法 C 1。算法 1 是它的伪代码。
我的问题是关于邻居列表的建立。上图是以 3 层表示的模拟框(将它们相互叠加以形成 3D 框)。
- 我知道我们不应该考虑所有相邻的单元格,因为这会导致重复计算相互作用。只考虑我绘制的 L 形单元格是否正确?在图中,我们正在考虑单元格 14 中的原子,并对它的邻居感兴趣。
- 目前,如果我使用 A LOT
if/else语句来正确获取所有边界条件,我可以制作邻居列表。我一直在考虑通过检测模式来更有效/更简洁的算法,但我想不出任何东西。有没有比做一堆if语句更有效的算法?也许也可以自动考虑周期性边界条件?
本质上,我在问如何建立邻居列表。对于这部分,我希望有类似的东西,单元格的数量int neighbors[N_c][26]在哪里,每个单元格有多少个邻居N_c26已。数据类型是int因为单元格由int. neighbors[1]返回单元格 1 的邻居数组。
