@@ -31,32 +31,45 @@ void dk_geom_group(real& restrict e, real& restrict vxx, real& restrict vyx, rea
31
31
int jb1 = igrp[ib][0 ];
32
32
int jb2 = igrp[ib][1 ];
33
33
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;
37
41
#pragma acc loop seq
38
- for (int j = ja1; j < ja2; ++j) {
42
+ for (int j = ja1 + 1 ; j < ja2; ++j) {
39
43
int k = kgrp[j];
40
44
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;
44
53
}
45
- real weigha = REAL_MAX ((real)1 , grpmass[ia]);
46
54
weigha = REAL_RECIP (weigha);
47
55
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;
51
60
#pragma acc loop seq
52
- for (int j = jb1; j < jb2; ++j) {
61
+ for (int j = jb1 + 1 ; j < jb2; ++j) {
53
62
int k = kgrp[j];
54
63
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;
58
72
}
59
- real weighb = REAL_MAX ((real)1 , grpmass[ib]);
60
73
weighb = REAL_RECIP (weighb);
61
74
62
75
real xr = xacm * weigha - xbcm * weighb;
0 commit comments