@@ -31,32 +31,45 @@ void dk_geom_group(real& restrict e, real& restrict vxx, real& restrict vyx, rea
3131 int jb1 = igrp[ib][0 ];
3232 int jb2 = igrp[ib][1 ];
3333
34- real xacm = 0 ;
35- real yacm = 0 ;
36- real zacm = 0 ;
34+ // image() calls are necessary here because atoms in the same group
35+ // do not necessarily belong to the same molecule
36+
37+ real weigha = REAL_MAX ((real)1 , grpmass[ia]);
38+ int ka1 = kgrp[ja1];
39+ real xa1 = x[ka1], ya1 = y[ka1], za1 = z[ka1];
40+ real xacm = xa1 * weigha, yacm = ya1 * weigha, zacm = za1 * weigha;
3741 #pragma acc loop seq
38- for (int j = ja1; j < ja2; ++j) {
42+ for (int j = ja1 + 1 ; j < ja2; ++j) {
3943 int k = kgrp[j];
4044 real weigh = mass[k];
41- xacm += x[k] * weigh;
42- yacm += y[k] * weigh;
43- zacm += z[k] * weigh;
45+ real xr = x[k] - xa1;
46+ real yr = y[k] - ya1;
47+ real zr = z[k] - za1;
48+ if (molec[ka1] != molec[k])
49+ image (xr, yr, zr);
50+ xacm += xr * weigh;
51+ yacm += yr * weigh;
52+ zacm += zr * weigh;
4453 }
45- real weigha = REAL_MAX ((real)1 , grpmass[ia]);
4654 weigha = REAL_RECIP (weigha);
4755
48- real xbcm = 0 ;
49- real ybcm = 0 ;
50- real zbcm = 0 ;
56+ real weighb = REAL_MAX ((real)1 , grpmass[ib]);
57+ int kb1 = kgrp[jb1];
58+ real xb1 = x[kb1], yb1 = y[kb1], zb1 = z[kb1];
59+ real xbcm = xb1 * weighb, ybcm = yb1 * weighb, zbcm = zb1 * weighb;
5160 #pragma acc loop seq
52- for (int j = jb1; j < jb2; ++j) {
61+ for (int j = jb1 + 1 ; j < jb2; ++j) {
5362 int k = kgrp[j];
5463 real weigh = mass[k];
55- xbcm += x[k] * weigh;
56- ybcm += y[k] * weigh;
57- zbcm += z[k] * weigh;
64+ real xr = x[k] - xb1;
65+ real yr = y[k] - yb1;
66+ real zr = z[k] - zb1;
67+ if (molec[kb1] != molec[k])
68+ image (xr, yr, zr);
69+ xbcm += xr * weigh;
70+ ybcm += yr * weigh;
71+ zbcm += zr * weigh;
5872 }
59- real weighb = REAL_MAX ((real)1 , grpmass[ib]);
6073 weighb = REAL_RECIP (weighb);
6174
6275 real xr = xacm * weigha - xbcm * weighb;
0 commit comments