|
|
|
|
@ -123,238 +123,236 @@ void PairLJCutCoulLongTIP4P::compute(int eflag, int vflag)
|
|
|
|
|
delz = ztmp - x[j][2];
|
|
|
|
|
rsq = delx*delx + dely*dely + delz*delz;
|
|
|
|
|
jtype = type[j];
|
|
|
|
|
|
|
|
|
|
if (rsq < cutsq[itype][jtype]) {
|
|
|
|
|
|
|
|
|
|
// LJ interation based on true rsq
|
|
|
|
|
|
|
|
|
|
if (rsq < cut_ljsq[itype][jtype]) {
|
|
|
|
|
r2inv = 1.0/rsq;
|
|
|
|
|
r6inv = r2inv*r2inv*r2inv;
|
|
|
|
|
forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]);
|
|
|
|
|
forcelj *= factor_lj * r2inv;
|
|
|
|
|
|
|
|
|
|
f[i][0] += delx*forcelj;
|
|
|
|
|
f[i][1] += dely*forcelj;
|
|
|
|
|
f[i][2] += delz*forcelj;
|
|
|
|
|
f[j][0] -= delx*forcelj;
|
|
|
|
|
f[j][1] -= dely*forcelj;
|
|
|
|
|
f[j][2] -= delz*forcelj;
|
|
|
|
|
|
|
|
|
|
if (eflag) {
|
|
|
|
|
evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) -
|
|
|
|
|
offset[itype][jtype];
|
|
|
|
|
evdwl *= factor_lj;
|
|
|
|
|
} else evdwl = 0.0;
|
|
|
|
|
|
|
|
|
|
if (evflag) ev_tally(i,j,nlocal,newton_pair,
|
|
|
|
|
evdwl,0.0,forcelj,delx,dely,delz);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (rsq < cut_ljsq[itype][jtype]) {
|
|
|
|
|
r6inv = r2inv*r2inv*r2inv;
|
|
|
|
|
forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]);
|
|
|
|
|
forcelj *= factor_lj * r2inv;
|
|
|
|
|
// adjust rsq and delxyz for off-site O charge(s) if necessary
|
|
|
|
|
|
|
|
|
|
f[i][0] += delx*forcelj;
|
|
|
|
|
f[i][1] += dely*forcelj;
|
|
|
|
|
f[i][2] += delz*forcelj;
|
|
|
|
|
f[j][0] -= delx*forcelj;
|
|
|
|
|
f[j][1] -= dely*forcelj;
|
|
|
|
|
f[j][2] -= delz*forcelj;
|
|
|
|
|
if (itype == typeO || jtype == typeO) {
|
|
|
|
|
if (jtype == typeO) {
|
|
|
|
|
find_M(j,jH1,jH2,xjM);
|
|
|
|
|
x2 = xjM;
|
|
|
|
|
} else x2 = x[j];
|
|
|
|
|
delx = x1[0] - x2[0];
|
|
|
|
|
dely = x1[1] - x2[1];
|
|
|
|
|
delz = x1[2] - x2[2];
|
|
|
|
|
rsq = delx*delx + dely*dely + delz*delz;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (eflag) {
|
|
|
|
|
evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) -
|
|
|
|
|
offset[itype][jtype];
|
|
|
|
|
evdwl *= factor_lj;
|
|
|
|
|
} else evdwl = 0.0;
|
|
|
|
|
// Coulombic interaction based on modified rsq
|
|
|
|
|
|
|
|
|
|
if (evflag) ev_tally(i,j,nlocal,newton_pair,
|
|
|
|
|
evdwl,0.0,forcelj,delx,dely,delz);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// adjust rsq and delxyz for off-site O charge(s)
|
|
|
|
|
|
|
|
|
|
if (itype == typeO || jtype == typeO) {
|
|
|
|
|
if (jtype == typeO) {
|
|
|
|
|
find_M(j,jH1,jH2,xjM);
|
|
|
|
|
x2 = xjM;
|
|
|
|
|
} else x2 = x[j];
|
|
|
|
|
delx = x1[0] - x2[0];
|
|
|
|
|
dely = x1[1] - x2[1];
|
|
|
|
|
delz = x1[2] - x2[2];
|
|
|
|
|
rsq = delx*delx + dely*dely + delz*delz;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// test current rsq against cutoff and compute Coulombic force
|
|
|
|
|
|
|
|
|
|
if (rsq < cut_coulsq) {
|
|
|
|
|
r2inv = 1 / rsq;
|
|
|
|
|
if (!ncoultablebits || rsq <= tabinnersq) {
|
|
|
|
|
r = sqrt(rsq);
|
|
|
|
|
grij = g_ewald * r;
|
|
|
|
|
expm2 = exp(-grij*grij);
|
|
|
|
|
t = 1.0 / (1.0 + EWALD_P*grij);
|
|
|
|
|
erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2;
|
|
|
|
|
prefactor = qqrd2e * qtmp*q[j]/r;
|
|
|
|
|
forcecoul = prefactor * (erfc + EWALD_F*grij*expm2);
|
|
|
|
|
if (factor_coul < 1.0) {
|
|
|
|
|
forcecoul -= (1.0-factor_coul)*prefactor;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
union_int_float_t rsq_lookup;
|
|
|
|
|
rsq_lookup.f = rsq;
|
|
|
|
|
itable = rsq_lookup.i & ncoulmask;
|
|
|
|
|
itable >>= ncoulshiftbits;
|
|
|
|
|
fraction = (rsq_lookup.f - rtable[itable]) * drtable[itable];
|
|
|
|
|
table = ftable[itable] + fraction*dftable[itable];
|
|
|
|
|
forcecoul = qtmp*q[j] * table;
|
|
|
|
|
if (factor_coul < 1.0) {
|
|
|
|
|
table = ctable[itable] + fraction*dctable[itable];
|
|
|
|
|
prefactor = qtmp*q[j] * table;
|
|
|
|
|
forcecoul -= (1.0-factor_coul)*prefactor;
|
|
|
|
|
}
|
|
|
|
|
if (rsq < cut_coulsq) {
|
|
|
|
|
r2inv = 1 / rsq;
|
|
|
|
|
if (!ncoultablebits || rsq <= tabinnersq) {
|
|
|
|
|
r = sqrt(rsq);
|
|
|
|
|
grij = g_ewald * r;
|
|
|
|
|
expm2 = exp(-grij*grij);
|
|
|
|
|
t = 1.0 / (1.0 + EWALD_P*grij);
|
|
|
|
|
erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2;
|
|
|
|
|
prefactor = qqrd2e * qtmp*q[j]/r;
|
|
|
|
|
forcecoul = prefactor * (erfc + EWALD_F*grij*expm2);
|
|
|
|
|
if (factor_coul < 1.0) {
|
|
|
|
|
forcecoul -= (1.0-factor_coul)*prefactor;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
union_int_float_t rsq_lookup;
|
|
|
|
|
rsq_lookup.f = rsq;
|
|
|
|
|
itable = rsq_lookup.i & ncoulmask;
|
|
|
|
|
itable >>= ncoulshiftbits;
|
|
|
|
|
fraction = (rsq_lookup.f - rtable[itable]) * drtable[itable];
|
|
|
|
|
table = ftable[itable] + fraction*dftable[itable];
|
|
|
|
|
forcecoul = qtmp*q[j] * table;
|
|
|
|
|
if (factor_coul < 1.0) {
|
|
|
|
|
table = ctable[itable] + fraction*dctable[itable];
|
|
|
|
|
prefactor = qtmp*q[j] * table;
|
|
|
|
|
forcecoul -= (1.0-factor_coul)*prefactor;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cforce = forcecoul * r2inv;
|
|
|
|
|
|
|
|
|
|
cforce = forcecoul * r2inv;
|
|
|
|
|
// if i,j are not O atoms, force is applied directly
|
|
|
|
|
// if i or j are O atoms, force is on fictitious atom & partitioned
|
|
|
|
|
// force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999)
|
|
|
|
|
// f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f
|
|
|
|
|
// preserves total force and torque on water molecule
|
|
|
|
|
// virial = sum(r x F) where each water's atoms are near xi and xj
|
|
|
|
|
// vlist stores 2,4,6 atoms whose forces contribute to virial
|
|
|
|
|
|
|
|
|
|
n = 0;
|
|
|
|
|
|
|
|
|
|
if (itype != typeO) {
|
|
|
|
|
f[i][0] += delx * cforce;
|
|
|
|
|
f[i][1] += dely * cforce;
|
|
|
|
|
f[i][2] += delz * cforce;
|
|
|
|
|
|
|
|
|
|
if (vflag) {
|
|
|
|
|
v[0] = x[i][0] * delx * cforce;
|
|
|
|
|
v[1] = x[i][1] * dely * cforce;
|
|
|
|
|
v[2] = x[i][2] * delz * cforce;
|
|
|
|
|
v[3] = x[i][0] * dely * cforce;
|
|
|
|
|
v[4] = x[i][0] * delz * cforce;
|
|
|
|
|
v[5] = x[i][1] * delz * cforce;
|
|
|
|
|
vlist[n++] = i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
// if i,j are not O atoms, force is applied directly
|
|
|
|
|
// if i or j are O atoms, force is on fictitious atom & partitioned
|
|
|
|
|
// force partitioning due to Feenstra, J Comp Chem, 20, 786 (1999)
|
|
|
|
|
// f_f = fictitious force, fO = f_f (1 - 2 alpha), fH = alpha f_f
|
|
|
|
|
// preserves total force and torque on water molecule
|
|
|
|
|
// virial = sum(r x F) where each water's atoms are near xi and xj
|
|
|
|
|
// vlist stores 2,4,6 atoms whose forces contribute to virial
|
|
|
|
|
fd[0] = delx*cforce;
|
|
|
|
|
fd[1] = dely*cforce;
|
|
|
|
|
fd[2] = delz*cforce;
|
|
|
|
|
|
|
|
|
|
n = 0;
|
|
|
|
|
delxOM = x[i][0] - x1[0];
|
|
|
|
|
delyOM = x[i][1] - x1[1];
|
|
|
|
|
delzOM = x[i][2] - x1[2];
|
|
|
|
|
|
|
|
|
|
if (itype != typeO) {
|
|
|
|
|
f[i][0] += delx * cforce;
|
|
|
|
|
f[i][1] += dely * cforce;
|
|
|
|
|
f[i][2] += delz * cforce;
|
|
|
|
|
|
|
|
|
|
if (vflag) {
|
|
|
|
|
v[0] = x[i][0] * delx * cforce;
|
|
|
|
|
v[1] = x[i][1] * dely * cforce;
|
|
|
|
|
v[2] = x[i][2] * delz * cforce;
|
|
|
|
|
v[3] = x[i][0] * dely * cforce;
|
|
|
|
|
v[4] = x[i][0] * delz * cforce;
|
|
|
|
|
v[5] = x[i][1] * delz * cforce;
|
|
|
|
|
vlist[n++] = i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
fd[0] = delx*cforce;
|
|
|
|
|
fd[1] = dely*cforce;
|
|
|
|
|
fd[2] = delz*cforce;
|
|
|
|
|
|
|
|
|
|
delxOM = x[i][0] - x1[0];
|
|
|
|
|
delyOM = x[i][1] - x1[1];
|
|
|
|
|
delzOM = x[i][2] - x1[2];
|
|
|
|
|
|
|
|
|
|
ddotf = (delxOM * fd[0] + delyOM * fd[1] + delzOM * fd[2]) /
|
|
|
|
|
ddotf = (delxOM * fd[0] + delyOM * fd[1] + delzOM * fd[2]) /
|
|
|
|
|
(qdist*qdist);
|
|
|
|
|
|
|
|
|
|
f1[0] = ddotf * delxOM;
|
|
|
|
|
f1[1] = ddotf * delyOM;
|
|
|
|
|
f1[2] = ddotf * delzOM;
|
|
|
|
|
|
|
|
|
|
fO[0] = fd[0] - alpha * (fd[0] - f1[0]);
|
|
|
|
|
fO[1] = fd[1] - alpha * (fd[1] - f1[1]);
|
|
|
|
|
fO[2] = fd[2] - alpha * (fd[2] - f1[2]);
|
|
|
|
|
|
|
|
|
|
fH[0] = 0.5 * alpha * (fd[0] - f1[0]);
|
|
|
|
|
fH[1] = 0.5 * alpha * (fd[1] - f1[1]);
|
|
|
|
|
fH[2] = 0.5 * alpha * (fd[2] - f1[2]);
|
|
|
|
|
|
|
|
|
|
f[i][0] += fO[0];
|
|
|
|
|
f[i][1] += fO[1];
|
|
|
|
|
f[i][2] += fO[2];
|
|
|
|
|
|
|
|
|
|
f[iH1][0] += fH[0];
|
|
|
|
|
f[iH1][1] += fH[1];
|
|
|
|
|
f[iH1][2] += fH[2];
|
|
|
|
|
|
|
|
|
|
f[iH2][0] += fH[0];
|
|
|
|
|
f[iH2][1] += fH[1];
|
|
|
|
|
f[iH2][2] += fH[2];
|
|
|
|
|
|
|
|
|
|
if (vflag) {
|
|
|
|
|
domain->closest_image(x[i],x[iH1],xH1);
|
|
|
|
|
domain->closest_image(x[i],x[iH2],xH2);
|
|
|
|
|
|
|
|
|
|
v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0];
|
|
|
|
|
v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1];
|
|
|
|
|
v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2];
|
|
|
|
|
v[3] = x[i][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1];
|
|
|
|
|
v[4] = x[i][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2];
|
|
|
|
|
v[5] = x[i][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2];
|
|
|
|
|
|
|
|
|
|
vlist[n++] = i;
|
|
|
|
|
vlist[n++] = iH1;
|
|
|
|
|
vlist[n++] = iH2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
f1[0] = ddotf * delxOM;
|
|
|
|
|
f1[1] = ddotf * delyOM;
|
|
|
|
|
f1[2] = ddotf * delzOM;
|
|
|
|
|
|
|
|
|
|
fO[0] = fd[0] - alpha * (fd[0] - f1[0]);
|
|
|
|
|
fO[1] = fd[1] - alpha * (fd[1] - f1[1]);
|
|
|
|
|
fO[2] = fd[2] - alpha * (fd[2] - f1[2]);
|
|
|
|
|
|
|
|
|
|
fH[0] = 0.5 * alpha * (fd[0] - f1[0]);
|
|
|
|
|
fH[1] = 0.5 * alpha * (fd[1] - f1[1]);
|
|
|
|
|
fH[2] = 0.5 * alpha * (fd[2] - f1[2]);
|
|
|
|
|
|
|
|
|
|
f[i][0] += fO[0];
|
|
|
|
|
f[i][1] += fO[1];
|
|
|
|
|
f[i][2] += fO[2];
|
|
|
|
|
|
|
|
|
|
f[iH1][0] += fH[0];
|
|
|
|
|
f[iH1][1] += fH[1];
|
|
|
|
|
f[iH1][2] += fH[2];
|
|
|
|
|
|
|
|
|
|
f[iH2][0] += fH[0];
|
|
|
|
|
f[iH2][1] += fH[1];
|
|
|
|
|
f[iH2][2] += fH[2];
|
|
|
|
|
|
|
|
|
|
if (vflag) {
|
|
|
|
|
domain->closest_image(x[i],x[iH1],xH1);
|
|
|
|
|
domain->closest_image(x[i],x[iH2],xH2);
|
|
|
|
|
|
|
|
|
|
v[0] = x[i][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0];
|
|
|
|
|
v[1] = x[i][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1];
|
|
|
|
|
v[2] = x[i][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2];
|
|
|
|
|
v[3] = x[i][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1];
|
|
|
|
|
v[4] = x[i][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2];
|
|
|
|
|
v[5] = x[i][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2];
|
|
|
|
|
|
|
|
|
|
vlist[n++] = i;
|
|
|
|
|
vlist[n++] = iH1;
|
|
|
|
|
vlist[n++] = iH2;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (jtype != typeO) {
|
|
|
|
|
f[j][0] -= delx * cforce;
|
|
|
|
|
f[j][1] -= dely * cforce;
|
|
|
|
|
f[j][2] -= delz * cforce;
|
|
|
|
|
|
|
|
|
|
if (vflag) {
|
|
|
|
|
v[0] -= x[j][0] * delx * cforce;
|
|
|
|
|
v[1] -= x[j][1] * dely * cforce;
|
|
|
|
|
v[2] -= x[j][2] * delz * cforce;
|
|
|
|
|
v[3] -= x[j][0] * dely * cforce;
|
|
|
|
|
v[4] -= x[j][0] * delz * cforce;
|
|
|
|
|
v[5] -= x[j][1] * delz * cforce;
|
|
|
|
|
vlist[n++] = j;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
fd[0] = -delx*cforce;
|
|
|
|
|
fd[1] = -dely*cforce;
|
|
|
|
|
fd[2] = -delz*cforce;
|
|
|
|
|
|
|
|
|
|
delxOM = x[j][0] - x2[0];
|
|
|
|
|
delyOM = x[j][1] - x2[1];
|
|
|
|
|
delzOM = x[j][2] - x2[2];
|
|
|
|
|
|
|
|
|
|
ddotf = (delxOM * fd[0] + delyOM * fd[1] + delzOM * fd[2]) /
|
|
|
|
|
(qdist*qdist);
|
|
|
|
|
|
|
|
|
|
f1[0] = ddotf * delxOM;
|
|
|
|
|
f1[1] = ddotf * delyOM;
|
|
|
|
|
f1[2] = ddotf * delzOM;
|
|
|
|
|
|
|
|
|
|
fO[0] = fd[0] - alpha * (fd[0] - f1[0]);
|
|
|
|
|
fO[1] = fd[1] - alpha * (fd[1] - f1[1]);
|
|
|
|
|
fO[2] = fd[2] - alpha * (fd[2] - f1[2]);
|
|
|
|
|
|
|
|
|
|
fH[0] = 0.5 * alpha * (fd[0] - f1[0]);
|
|
|
|
|
fH[1] = 0.5 * alpha * (fd[1] - f1[1]);
|
|
|
|
|
fH[2] = 0.5 * alpha * (fd[2] - f1[2]);
|
|
|
|
|
|
|
|
|
|
f[j][0] += fO[0];
|
|
|
|
|
f[j][1] += fO[1];
|
|
|
|
|
f[j][2] += fO[2];
|
|
|
|
|
|
|
|
|
|
f[jH1][0] += fH[0];
|
|
|
|
|
f[jH1][1] += fH[1];
|
|
|
|
|
f[jH1][2] += fH[2];
|
|
|
|
|
|
|
|
|
|
f[jH2][0] += fH[0];
|
|
|
|
|
f[jH2][1] += fH[1];
|
|
|
|
|
f[jH2][2] += fH[2];
|
|
|
|
|
|
|
|
|
|
if (vflag) {
|
|
|
|
|
domain->closest_image(x[j],x[jH1],xH1);
|
|
|
|
|
domain->closest_image(x[j],x[jH2],xH2);
|
|
|
|
|
|
|
|
|
|
v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0];
|
|
|
|
|
v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1];
|
|
|
|
|
v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2];
|
|
|
|
|
v[3] += x[j][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1];
|
|
|
|
|
v[4] += x[j][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2];
|
|
|
|
|
v[5] += x[j][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2];
|
|
|
|
|
|
|
|
|
|
vlist[n++] = j;
|
|
|
|
|
vlist[n++] = jH1;
|
|
|
|
|
vlist[n++] = jH2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (eflag) {
|
|
|
|
|
if (!ncoultablebits || rsq <= tabinnersq)
|
|
|
|
|
ecoul = prefactor*erfc;
|
|
|
|
|
else {
|
|
|
|
|
table = etable[itable] + fraction*detable[itable];
|
|
|
|
|
ecoul = qtmp*q[j] * table;
|
|
|
|
|
}
|
|
|
|
|
if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor;
|
|
|
|
|
} else ecoul = 0.0;
|
|
|
|
|
|
|
|
|
|
if (evflag) ev_tally_list(n,vlist,ecoul,v);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (jtype != typeO) {
|
|
|
|
|
f[j][0] -= delx * cforce;
|
|
|
|
|
f[j][1] -= dely * cforce;
|
|
|
|
|
f[j][2] -= delz * cforce;
|
|
|
|
|
|
|
|
|
|
if (vflag) {
|
|
|
|
|
v[0] -= x[j][0] * delx * cforce;
|
|
|
|
|
v[1] -= x[j][1] * dely * cforce;
|
|
|
|
|
v[2] -= x[j][2] * delz * cforce;
|
|
|
|
|
v[3] -= x[j][0] * dely * cforce;
|
|
|
|
|
v[4] -= x[j][0] * delz * cforce;
|
|
|
|
|
v[5] -= x[j][1] * delz * cforce;
|
|
|
|
|
vlist[n++] = j;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
fd[0] = -delx*cforce;
|
|
|
|
|
fd[1] = -dely*cforce;
|
|
|
|
|
fd[2] = -delz*cforce;
|
|
|
|
|
|
|
|
|
|
delxOM = x[j][0] - x2[0];
|
|
|
|
|
delyOM = x[j][1] - x2[1];
|
|
|
|
|
delzOM = x[j][2] - x2[2];
|
|
|
|
|
|
|
|
|
|
ddotf = (delxOM * fd[0] + delyOM * fd[1] + delzOM * fd[2]) /
|
|
|
|
|
(qdist*qdist);
|
|
|
|
|
|
|
|
|
|
f1[0] = ddotf * delxOM;
|
|
|
|
|
f1[1] = ddotf * delyOM;
|
|
|
|
|
f1[2] = ddotf * delzOM;
|
|
|
|
|
|
|
|
|
|
fO[0] = fd[0] - alpha * (fd[0] - f1[0]);
|
|
|
|
|
fO[1] = fd[1] - alpha * (fd[1] - f1[1]);
|
|
|
|
|
fO[2] = fd[2] - alpha * (fd[2] - f1[2]);
|
|
|
|
|
|
|
|
|
|
fH[0] = 0.5 * alpha * (fd[0] - f1[0]);
|
|
|
|
|
fH[1] = 0.5 * alpha * (fd[1] - f1[1]);
|
|
|
|
|
fH[2] = 0.5 * alpha * (fd[2] - f1[2]);
|
|
|
|
|
|
|
|
|
|
f[j][0] += fO[0];
|
|
|
|
|
f[j][1] += fO[1];
|
|
|
|
|
f[j][2] += fO[2];
|
|
|
|
|
|
|
|
|
|
f[jH1][0] += fH[0];
|
|
|
|
|
f[jH1][1] += fH[1];
|
|
|
|
|
f[jH1][2] += fH[2];
|
|
|
|
|
|
|
|
|
|
f[jH2][0] += fH[0];
|
|
|
|
|
f[jH2][1] += fH[1];
|
|
|
|
|
f[jH2][2] += fH[2];
|
|
|
|
|
|
|
|
|
|
if (vflag) {
|
|
|
|
|
domain->closest_image(x[j],x[jH1],xH1);
|
|
|
|
|
domain->closest_image(x[j],x[jH2],xH2);
|
|
|
|
|
|
|
|
|
|
v[0] += x[j][0]*fO[0] + xH1[0]*fH[0] + xH2[0]*fH[0];
|
|
|
|
|
v[1] += x[j][1]*fO[1] + xH1[1]*fH[1] + xH2[1]*fH[1];
|
|
|
|
|
v[2] += x[j][2]*fO[2] + xH1[2]*fH[2] + xH2[2]*fH[2];
|
|
|
|
|
v[3] += x[j][0]*fO[1] + xH1[0]*fH[1] + xH2[0]*fH[1];
|
|
|
|
|
v[4] += x[j][0]*fO[2] + xH1[0]*fH[2] + xH2[0]*fH[2];
|
|
|
|
|
v[5] += x[j][1]*fO[2] + xH1[1]*fH[2] + xH2[1]*fH[2];
|
|
|
|
|
|
|
|
|
|
vlist[n++] = j;
|
|
|
|
|
vlist[n++] = jH1;
|
|
|
|
|
vlist[n++] = jH2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (eflag) {
|
|
|
|
|
if (!ncoultablebits || rsq <= tabinnersq)
|
|
|
|
|
ecoul = prefactor*erfc;
|
|
|
|
|
else {
|
|
|
|
|
table = etable[itable] + fraction*detable[itable];
|
|
|
|
|
ecoul = qtmp*q[j] * table;
|
|
|
|
|
}
|
|
|
|
|
if (factor_coul < 1.0) ecoul -= (1.0-factor_coul)*prefactor;
|
|
|
|
|
} else ecoul = 0.0;
|
|
|
|
|
|
|
|
|
|
if (evflag) ev_tally_list(n,vlist,ecoul,v);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -397,9 +395,11 @@ void PairLJCutCoulLongTIP4P::init_style()
|
|
|
|
|
if (atom->tag_enable == 0)
|
|
|
|
|
error->all(FLERR,"Pair style lj/cut/coul/long/tip4p requires atom IDs");
|
|
|
|
|
if (!force->newton_pair)
|
|
|
|
|
error->all(FLERR,"Pair style lj/cut/coul/long/tip4p requires newton pair on");
|
|
|
|
|
error->all(FLERR,
|
|
|
|
|
"Pair style lj/cut/coul/long/tip4p requires newton pair on");
|
|
|
|
|
if (!atom->q_flag)
|
|
|
|
|
error->all(FLERR,"Pair style lj/cut/coul/long/tip4p requires atom attribute q");
|
|
|
|
|
error->all(FLERR,
|
|
|
|
|
"Pair style lj/cut/coul/long/tip4p requires atom attribute q");
|
|
|
|
|
if ( (strcmp(force->kspace_style,"pppm/tip4p") != 0) &&
|
|
|
|
|
(strcmp(force->kspace_style,"pppm/tip4p/proxy") != 0) )
|
|
|
|
|
error->all(FLERR,"Pair style is incompatible with KSpace style");
|
|
|
|
|
|