在 NVT 蒙特卡罗 (MC) 模拟中处理邻居列表

计算科学 算法 蒙特卡洛
2021-12-12 02:59:58

我正在制作一个只有短程交互的 NVT Monte Carlo (MC) 模拟代码。

我在网上找到了很多 MC 教程代码(通常是 Lennard-Jones 系统)。然而,他们中的大多数是在不使用邻居列表的情况下进行能量计算。我想看看在 MC 模拟期间如何以及何时构建和更新邻居列表。我有几个问题。

1)我正在使用带有单元列表方法的邻居列表。在每次尝试移动时,我都应该更新它。在分子动力学中,我应该更新整个邻居列表(和细胞列表)。然而,在 MC 中,一个循环中有许多移动。移动的次数等于粒子的移动次数。做许多相邻的建筑物在计算上会很昂贵。所以我认为会有一种类似于部分邻居列表更新的方法。但我找不到它的参考。这个想法是正确的还是我应该每一步都更新整个邻居列表?

2) 构建存储在任何 i 和 j 粒子 (i=1,2,...,N) 之间的 N×N 数组是个好主意吗?参考距离的阵列可以给出可用于计算相互作用能量的距离。我认为使用它是个好主意,但是与 1) 结合使用,它应该使用邻居列表进行更新。如果我带这么大的数组,恐怕会减慢模拟速度。

2个回答

对于 1),可以使用 Verlet 列表和单元列表。对于 Verlet 列表,您无需在每个粒子移动中更新列表,直到经过几次 Monte Carlo 移动后,粒子移出 Verlet 球体。对于单元格列表,可以使用双向链表的方法来更新单元格列表。

对于 2)矩阵的复杂度为,这是不可接受的。N×NO(N2)

关于 Verlet 列表和 Cell 列表方法的详细信息,您可以参考以下论文。

SY Wang, CH Tong. 基于双向链表的单元列表方法用于蒙特卡罗模拟arXiv:2003.0558

“邻居列表”是指Verlet 列表在这种情况下,根据我的经验,通常最好使用单元格列表,让它们始终保持更新:每次移动后,检查您移动的粒子是否跨越了单元格边界。如果答案是肯定的,你更新你的数据结构,应该是链表

大约 2),不,那不会很好,性能明智。存储这样一个矩阵所需的内存将随着粒子数量的二次方增长,而您通常希望内存消耗随粒子数量线性增加。此外,更新这样的矩阵也很可能是一个缓慢的操作。