在大多数情况下,LAMMPS数值积分原子,分子或者宏观颗粒等粒子的牛顿运动方程。这些粒子通过短程或者长程(一般指库仑力)相互作用。为了计算效率,LAMMPS采用邻居列表的方法来追踪某个粒子周围对其产生相互作用的粒子。这些列表根据粒子靠近时的相互排斥的特点进行优化,从而保证系统的某处的局部密度不会过大。在多核并行计算时,LAMMPS采用基于空间分配技术将模拟区域分割为小的三维子区域,然后将每一个子区域分配给一个处理器进行计算。处理器之间通过MPI进行消息通信并且将跨越子区域边界的原子记录为ghost原子以备调用。当原子跨越子区域边界后就会被分配给新的处理器。为了计算某个处理器负责的原子所受的力,该处理仅需要掌握其周围附近原子的位置即可。因此空间分配算法处理器之间的通信是局部的,这与基于原子分配和受力分配算法不同(这两种算法的通信是全局的)。 此处仅介绍三维长方体模拟区域的情形。此时,分配给每个处理的子区域的大小和形状取决于原子数N和处理器个数P以及模拟区域的长宽比。模拟区域三个方向上设定的处理器个数应当使得每个处理器负责子区域的形状越接近正方体越好。这样可以使不同处理器之间的通信量最小。在空间配算法中,通信消耗的时间与模拟子区域的表面积成正比。在空间分配算法中,每个处理器负责两个数据结构,一个存储该处理负责子区域内的N/P个原子,另一个存储周围子区域的原子。在第一个数据结构中,每个处理器存储原子的完整信息,如位置,速度,邻居列表等。这个数据结构以链表的形式存储,这样就允许原子在相邻子区域交换时,可以插入或删除链表中的原子信息数据。第二个数据结构只存储原子的位置。处理器之间在每一时间步的通信可以确保其负责的原子信息是最新的。图1为处理器与其周围处理器之间的通信示意图。第一步每个处