Skip to content
Snippets Groups Projects
Commit 639fb6f4 authored by Axel Kohlmeyer's avatar Axel Kohlmeyer
Browse files

use local variables for more efficient force accumulation

parent b1567717
No related branches found
No related tags found
No related merge requests found
...@@ -106,6 +106,8 @@ void PairSW::compute(int eflag, int vflag) ...@@ -106,6 +106,8 @@ void PairSW::compute(int eflag, int vflag)
numneigh = list->numneigh; numneigh = list->numneigh;
firstneigh = list->firstneigh; firstneigh = list->firstneigh;
double fxtmp,fytmp,fztmp;
// loop over full neighbor list of my atoms // loop over full neighbor list of my atoms
for (ii = 0; ii < inum; ii++) { for (ii = 0; ii < inum; ii++) {
...@@ -115,6 +117,7 @@ void PairSW::compute(int eflag, int vflag) ...@@ -115,6 +117,7 @@ void PairSW::compute(int eflag, int vflag)
xtmp = x[i][0]; xtmp = x[i][0];
ytmp = x[i][1]; ytmp = x[i][1];
ztmp = x[i][2]; ztmp = x[i][2];
fxtmp = fytmp = fztmp = 0.0;
// two-body interactions, skip half of them // two-body interactions, skip half of them
...@@ -154,12 +157,11 @@ void PairSW::compute(int eflag, int vflag) ...@@ -154,12 +157,11 @@ void PairSW::compute(int eflag, int vflag)
if (x[j][2] == ztmp && x[j][1] == ytmp && x[j][0] < xtmp) continue; if (x[j][2] == ztmp && x[j][1] == ytmp && x[j][0] < xtmp) continue;
} }
twobody(&params[ijparam],rsq,fpair,eflag,evdwl); twobody(&params[ijparam],rsq,fpair,eflag,evdwl);
f[i][0] += delx*fpair; fxtmp += delx*fpair;
f[i][1] += dely*fpair; fytmp += dely*fpair;
f[i][2] += delz*fpair; fztmp += delz*fpair;
f[j][0] -= delx*fpair; f[j][0] -= delx*fpair;
f[j][1] -= dely*fpair; f[j][1] -= dely*fpair;
f[j][2] -= delz*fpair; f[j][2] -= delz*fpair;
...@@ -179,6 +181,9 @@ void PairSW::compute(int eflag, int vflag) ...@@ -179,6 +181,9 @@ void PairSW::compute(int eflag, int vflag)
delr1[2] = x[j][2] - ztmp; delr1[2] = x[j][2] - ztmp;
rsq1 = delr1[0]*delr1[0] + delr1[1]*delr1[1] + delr1[2]*delr1[2]; rsq1 = delr1[0]*delr1[0] + delr1[1]*delr1[1] + delr1[2]*delr1[2];
double fjxtmp,fjytmp,fjztmp;
fjxtmp = fjytmp = fjztmp = 0.0;
for (kk = jj+1; kk < numshort; kk++) { for (kk = jj+1; kk < numshort; kk++) {
k = neighshort[kk]; k = neighshort[kk];
ktype = map[type[k]]; ktype = map[type[k]];
...@@ -193,19 +198,25 @@ void PairSW::compute(int eflag, int vflag) ...@@ -193,19 +198,25 @@ void PairSW::compute(int eflag, int vflag)
threebody(&params[ijparam],&params[ikparam],&params[ijkparam], threebody(&params[ijparam],&params[ikparam],&params[ijkparam],
rsq1,rsq2,delr1,delr2,fj,fk,eflag,evdwl); rsq1,rsq2,delr1,delr2,fj,fk,eflag,evdwl);
f[i][0] -= fj[0] + fk[0]; fxtmp -= fj[0] + fk[0];
f[i][1] -= fj[1] + fk[1]; fytmp -= fj[1] + fk[1];
f[i][2] -= fj[2] + fk[2]; fztmp -= fj[2] + fk[2];
f[j][0] += fj[0]; fjxtmp += fj[0];
f[j][1] += fj[1]; fjytmp += fj[1];
f[j][2] += fj[2]; fjztmp += fj[2];
f[k][0] += fk[0]; f[k][0] += fk[0];
f[k][1] += fk[1]; f[k][1] += fk[1];
f[k][2] += fk[2]; f[k][2] += fk[2];
if (evflag) ev_tally3(i,j,k,evdwl,0.0,fj,fk,delr1,delr2); if (evflag) ev_tally3(i,j,k,evdwl,0.0,fj,fk,delr1,delr2);
} }
f[j][0] += fjxtmp;
f[j][1] += fjytmp;
f[j][2] += fjztmp;
} }
f[i][0] += fxtmp;
f[i][1] += fytmp;
f[i][2] += fztmp;
} }
if (vflag_fdotr) virial_fdotr_compute(); if (vflag_fdotr) virial_fdotr_compute();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment