[gmx-developers] virial

Erik Lindahl lindahl at cbr.su.se
Wed Nov 22 00:57:20 CET 2006


Hi,

On Nov 22, 2006, at 12:26 AM, Jason de Joannis wrote:

> Quoting Erik Lindahl <lindahl at cbr.su.se>:
>
>> Hi Jason,
>>
> Hi.
>>> On Nov 21, 2006, at 9:41 PM, Jason de Joannis wrote:
>>>
>>> From the manual and the code, it looks like Gromacs uses the atomic
>>> virial. I think that is besides the point.
>>>
>>> Why does Gromacs use f[i] which (I think) contains all bonded  
>>> and  nonbonded forces? After all the derivative resp. volume  
>>> scaling  vanishes for some of the bonded forces.
>>
>> Forces are forces are forces, which give rise to pressure. There  
>> is  no fundamental physical difference between bonded and  
>> nonbonded  interactions.
> Hmm. I generally think from the partition function rather than  
> mechanically. Anyways, why do you have Appendix B.1.4 which treats
> the virial for harmonic bonds explicitely?

That could be an old remnant - currently all interactions are treated  
the same way.

There is one slight technical difference in how we treat bonded vs.  
nonbonded interactions, though, and this is the reason for the fshift  
term. For bonded interactions we make the molecule continuous and  
just calculate all forces without having to worry about periodicity.  
For nonbonded interactions the "shift" depends on the particle we're  
interacting with, so that's a bit more complicated. If you look at  
the JCC gromacs paper in 2005 we have a small figure there explaning  
it better than I can do in words here!

>>
>> Gromos (and some other codes) use whole-molecule-virials to  
>> reduce  the effect of some numerical errors, but there are other  
>> drawbacks  with this - primarily performance.
>>
>>>
>>> Also, the manual describes the SHAKE virial but what about LINCS?
>>
>> We use "Shake virial" as a generic name for virial contributions  
>> from  constraints, so it's identical for SHAKE and LINCS.
> Okay, thats true. I can see real numbers when I print out  
> shake_vir. That
> means I will have to go inside LINCS and somehow zero the unwanted
> virial terms.
>>
>>>
>>> Also, where can I find a little more info on the fr->fshift   
>>> contribution.
>>> On the mailing list archive someone explained that this comes  
>>> from  forces on the 27 unit cells. Is that explained in the  
>>> manual or  somewhere?
>>>
>>
>> It's mentioned in the manual where we derive the expression for   
>> single-sum-virial. The performance advantage of the single sum is   
>> also the reason why we prefer the atomic virial, btw!
> Well I must need a stronger prescription on my contact lenses because
> I have been looking closely at that section. It seems to me that
> Eq. B.11 is all calculated within the normal virial routine.

The first half of Eq. B11 is the "normal" virial sum, while the  
second is the fshift contribution.

Normally, when you calculate nonbonded interactions you have to check  
the x/y/z periodicity and select the minimum image every time you  
calculate the distance between the two atoms. This is extremely bad  
to have in the innermost kernels since modern CPUs just hate  
conditionals (it breaks the instruction pipeline).

In Gromacs we take care of this during neighborsearching. Instead of  
having one big list with e.g. 100 neighbors of "particle i", we split  
the list and essentially store it like:

(i particle translated one box to the left): 10 neighbors
(i particle not translated): 30 neighbors
(i particle translated one box to the right): 0 neighbors
... etc ...

The "translations" here are the shift indices, in this case -1,0,1 in  
the x dimension.

Now, in the nonbonded kernel the i particle coordinates are loaded in  
the _outer_ loop, where we correct it for the current shift. After  
this we know that the periodicity is correct, so we don't have to  
include any periodic boundary condition checks in the innermost loop,  
which is the time-critical part.

If we combined this with a molecular virial (which would need to be  
calculated in the innermost loop) all would be fine.

However, when we want to use the atomic virial and apply the single  
sum of Appendix B1 it turns out that we are making an error, since we  
modify the particle coordinates due to the shift in the nonbonded  
kernel (different for different nlists), but the single sum always  
use the coordinate in the central box. This error is the second term  
of Eq. B11.

Fortunately, it turns out to be easy and computationally cheap to  
correct for. That term can be calculated by simply summing all  
interaction forces for each shift vector (3*3*3=27), which we can do  
entirely in the outer nonbonded loop - after we have added the force  
to the i particle force array we also increment the fshift array  
corresponding to the shift used for this i particle.

It's perhaps not entirely obvious without a figure, but pretty neat:  
it completely removes all virial and PBC calculations from them  
nonbonded innerloop, and we only do PBC checks on neighborsearching.

Cheers,

Erik

PS: Unfortunately we also use the term "molecular shift" in Gromacs,  
when we create a graph of all bonded interactions in a molecule to  
move it between  the states where all atoms are in the central box or  
where the molecule is whole.  This is really entirely unrelated to  
the nonbonded shifts, apart from the fact that both deal with  
periodic boundary conditions. Sorry about the confusing naming ;-)











More information about the gromacs.org_gmx-developers mailing list