# Dealing neighbor list in NVT Monte Carlo (MC) simulation

I'm making a NVT Monte Carlo (MC) simulation code with only short range interaction.

I found many MC tutorial codes (usually Lennard-Jones system) in online. However, most of them are doing energy calculation without using neighbor list. I want to see how and when neighbor list is built and updated during MC simulation. I have a few questions on it.

1) I'm using neighbor list with cell-list method. At each trial move, I should update it. In Molecular Dynamics, I should update whole neighbor list (and cell list). In MC, however, there are a number of moves in a cycle. the number of moves is equal to that of particles. It would be computationally expensive to do many neighbor buildings. So I think there would be a method something like partial neighbor list updating. But I cannot find reference for it. Is this idea correct or should I update whole neighbor list every move?

2) Is it good idea to build N-by-N array which stores between any i and j particle (i=1,2,...,N)? the array, from which the distance is referred, can give distance which can be used to calculate interaction energy. I think it's good idea to use but, in junction with 1), it should be updated with neighbor list. I'm afraid it would slow down the simulation if I bring such huge array.

## 2 Answers

For 1), both of Verlet list and cell list can be used. For Verlet list, you needn't update the list in each particle move until after several Monte Carlo move that the particle moves out of the Verlet sphere. For the cell list, you can use the doubly linked list method to update the cell list.

For 2) The complexity of $$N \times N$$ matrix is $$O(N^2)$$ which is unacceptable.

You can refer to the following paper for the details about Verlet list and Cell list method.

S Y Wang, C H Tong. Cell Lists Method Based on Doubly Linked Lists for Monte Carlo Simulation. arXiv:2003.0558

With "neighbor list" you mean a Verlet list? In that case, from my experience it is usually better to use cell lists, keeping them always updated: after each move, you check whether the particle you moved has crossed a cell boundary. If the answer is yes, you update your data structures, which should be linked lists.

About 2), no that would not be good, performance wise. The memory required to store such a matrix would grow quadratically in the number of particles, while you usually want a memory consumption that increases linearly with the number of particles. In addition, updating such a matrix would most likely be a slow operation as well.