Skip to content

Commit b5ed4a9

Browse files
committed
apply image() to calculate the centroids
1 parent 98e2a59 commit b5ed4a9

File tree

1 file changed

+29
-16
lines changed

1 file changed

+29
-16
lines changed

include/seq/geom.h

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)