[gmx-developers] grand-canonical MC using gromacs

René Pool r.pool at vu.nl
Tue Dec 7 10:19:14 CET 2010

Dear all,

We're busy implementing grand-canonical Monte Carlo using gromacs. 
Particle translations accomplished by NVT MD, rendering this a hybrid MC 
MD method. Our approach is doing this by a python shell around gromacs 
in which we can insert/remove particles and perform MD NVT moves. For 
optimal efficiency, we use the ctypes module. This allows us to keep the 
gromacs data structures in memory during the MC run.

To this end we had to make minor modifications/additions to the gromacs 
src (ver 4.0.5 because we started this project with this version). Most 
importantly, we have split up mdrunner() into (1) mdrunner_initialize(), 
(2) mdrunner_integrate() and (3) mdrunner_finalize(). The first is for 
initializing the mecessary gromacs data structures in python and storing 
them in memory, The second performs NVT MD Monte Carlo moves and single 
point energy evaluations of a given state. The third is called after the 
MC loop for neatly finalizing the simulation.

For each number of particles N, we have the "tpr" in memory. In the case 
of a MC insertion or removal move, we copy the current state->x and 
state->v arrays into the trial state->x and state->v arrays. For 
insertion we add one molecule to these arrays in the case of insertion 
(i.e. replace state->x[last-1] and state->v[last-1] by a trial position 
and a velocity vector taken from the Maxwell-Boltzmann distribution). 
For removal we select a molecule at random and exclude this entry from 
the lists before copying it to the trial state. These "trial states" 
serve as input for mdrunner_integrate() that computes the single point 
energies (an md of nsteps=0).

So far so good, everything works, BUT...

The energies computed by mdrunner_integrate() do not correspond to the 
state and therefore screws up the MC sampling.

My question therefore is:
Are we overlooking some variable in the gromacs data structures that 
also needs to be set during insertion/removal, or is there some static 
(global) variable that stands in the way?

Thanks in advance for your help!

By the way, we're testing this on a simple LJ fluid system on a single 
CPU. So for now, no complicated stuff such as parallellization or charges.


René Pool
Vrije Universiteit Amsterdam
De Boelelaan 1081a
1081HV AMSTERDAM, the Netherlands
Room P120
E: r.pool at few.vu.nl
T: +31 20 59 83714
F: +31 20 59 87653

More information about the gromacs.org_gmx-developers mailing list