diff --git a/src/USER-MEAMC/meam.h b/src/USER-MEAMC/meam.h index 33a250d31294516451ceb657a868d33732631e07..df5c3f33fd27c3bdac1db4f88efa4d5e92b1ad64 100644 --- a/src/USER-MEAMC/meam.h +++ b/src/USER-MEAMC/meam.h @@ -198,8 +198,6 @@ protected: int* firstneigh, int numneigh_full, int* firstneigh_full, int ntype, int* type, int* fmap); void calc_rho1(int i, int ntype, int* type, int* fmap, double** x, int numneigh, int* firstneigh, double* scrfcn, double* fcpair); - void dsij(int i, int j, int k, int jn, int numneigh, double rij2, double* dsij1, double* dsij2, int ntype, - int* type, int* fmap, double** x, double* scrfcn, double* fcpair); void alloyparams(); void compute_pair_meam(); diff --git a/src/USER-MEAMC/meam_dens_init.cpp b/src/USER-MEAMC/meam_dens_init.cpp index ccfb17a98a8423ce821e7e7eb9d165451eef6643..77d399ab200b922cf4753897d418e05aaf26d5f6 100644 --- a/src/USER-MEAMC/meam_dens_init.cpp +++ b/src/USER-MEAMC/meam_dens_init.cpp @@ -354,63 +354,3 @@ MEAM::calc_rho1(int i, int ntype, int* type, int* fmap, double** x, int numneigh } } -// ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc - -void -MEAM::dsij(int i, int j, int k, int jn, int numneigh, double rij2, double* dsij1, double* dsij2, int ntype, - int* type, int* fmap, double** x, double* scrfcn, double* fcpair) -{ - // Inputs: i,j,k = id's of 3 atom triplet - // jn = id of i-j pair - // rij2 = squared distance between i and j - // Outputs: dsij1 = deriv. of sij w.r.t. rik - // dsij2 = deriv. of sij w.r.t. rjk - - int elti, eltj, eltk; - double rik2, rjk2; - - double dxik, dyik, dzik; - double dxjk, dyjk, dzjk; - double rbound, delc, sij, xik, xjk, cikj, sikj, dfc, a; - double Cmax, Cmin, dCikj1, dCikj2; - - sij = scrfcn[jn] * fcpair[jn]; - elti = fmap[type[i]]; - eltj = fmap[type[j]]; - eltk = fmap[type[k]]; - Cmax = this->Cmax_meam[elti][eltj][eltk]; - Cmin = this->Cmin_meam[elti][eltj][eltk]; - - *dsij1 = 0.0; - *dsij2 = 0.0; - if (!iszero(sij) && !iszero(sij - 1.0)) { - rbound = rij2 * this->ebound_meam[elti][eltj]; - delc = Cmax - Cmin; - dxjk = x[k][0] - x[j][0]; - dyjk = x[k][1] - x[j][1]; - dzjk = x[k][2] - x[j][2]; - rjk2 = dxjk * dxjk + dyjk * dyjk + dzjk * dzjk; - if (rjk2 <= rbound) { - dxik = x[k][0] - x[i][0]; - dyik = x[k][1] - x[i][1]; - dzik = x[k][2] - x[i][2]; - rik2 = dxik * dxik + dyik * dyik + dzik * dzik; - if (rik2 <= rbound) { - xik = rik2 / rij2; - xjk = rjk2 / rij2; - a = 1 - (xik - xjk) * (xik - xjk); - if (!iszero(a)) { - cikj = (2.0 * (xik + xjk) + a - 2.0) / a; - if (cikj >= Cmin && cikj <= Cmax) { - cikj = (cikj - Cmin) / delc; - sikj = dfcut(cikj, dfc); - dCfunc2(rij2, rik2, rjk2, dCikj1, dCikj2); - a = sij / delc * dfc / sikj; - *dsij1 = a * dCikj1; - *dsij2 = a * dCikj2; - } - } - } - } - } -} diff --git a/src/USER-MEAMC/meam_force.cpp b/src/USER-MEAMC/meam_force.cpp index 45470217e192d459dfb9bb413984a8e2ade9e30a..da608724e369251a2ac4cba7f5cd8dfa4874a8cb 100644 --- a/src/USER-MEAMC/meam_force.cpp +++ b/src/USER-MEAMC/meam_force.cpp @@ -80,7 +80,7 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int pp = pp - kk; pp = std::min(pp, 1.0); phi = ((this->phirar3[ind][kk] * pp + this->phirar2[ind][kk]) * pp + this->phirar1[ind][kk]) * pp + - this->phirar[ind][kk]; + this->phirar[ind][kk]; phip = (this->phirar6[ind][kk] * pp + this->phirar5[ind][kk]) * pp + this->phirar4[ind][kk]; recip = 1.0 / r; @@ -296,13 +296,13 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int get_shpfcn(this->lattce_meam[elti][elti], shpi); get_shpfcn(this->lattce_meam[eltj][eltj], shpj); drhodr1 = dgamma1[i] * drho0dr1 + - dgamma2[i] * (dt1dr1 * rho1[i] + t1i * drho1dr1 + dt2dr1 * rho2[i] + t2i * drho2dr1 + - dt3dr1 * rho3[i] + t3i * drho3dr1) - - dgamma3[i] * (shpi[0] * dt1dr1 + shpi[1] * dt2dr1 + shpi[2] * dt3dr1); + dgamma2[i] * (dt1dr1 * rho1[i] + t1i * drho1dr1 + dt2dr1 * rho2[i] + t2i * drho2dr1 + + dt3dr1 * rho3[i] + t3i * drho3dr1) - + dgamma3[i] * (shpi[0] * dt1dr1 + shpi[1] * dt2dr1 + shpi[2] * dt3dr1); drhodr2 = dgamma1[j] * drho0dr2 + - dgamma2[j] * (dt1dr2 * rho1[j] + t1j * drho1dr2 + dt2dr2 * rho2[j] + t2j * drho2dr2 + - dt3dr2 * rho3[j] + t3j * drho3dr2) - - dgamma3[j] * (shpj[0] * dt1dr2 + shpj[1] * dt2dr2 + shpj[2] * dt3dr2); + dgamma2[j] * (dt1dr2 * rho1[j] + t1j * drho1dr2 + dt2dr2 * rho2[j] + t2j * drho2dr2 + + dt3dr2 * rho3[j] + t3j * drho3dr2) - + dgamma3[j] * (shpj[0] * dt1dr2 + shpj[1] * dt2dr2 + shpj[2] * dt3dr2); for (m = 0; m < 3; m++) { drhodrm1[m] = 0.0; drhodrm2[m] = 0.0; @@ -380,13 +380,13 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int } drhods1 = dgamma1[i] * drho0ds1 + - dgamma2[i] * (dt1ds1 * rho1[i] + t1i * drho1ds1 + dt2ds1 * rho2[i] + t2i * drho2ds1 + - dt3ds1 * rho3[i] + t3i * drho3ds1) - - dgamma3[i] * (shpi[0] * dt1ds1 + shpi[1] * dt2ds1 + shpi[2] * dt3ds1); + dgamma2[i] * (dt1ds1 * rho1[i] + t1i * drho1ds1 + dt2ds1 * rho2[i] + t2i * drho2ds1 + + dt3ds1 * rho3[i] + t3i * drho3ds1) - + dgamma3[i] * (shpi[0] * dt1ds1 + shpi[1] * dt2ds1 + shpi[2] * dt3ds1); drhods2 = dgamma1[j] * drho0ds2 + - dgamma2[j] * (dt1ds2 * rho1[j] + t1j * drho1ds2 + dt2ds2 * rho2[j] + t2j * drho2ds2 + - dt3ds2 * rho3[j] + t3j * drho3ds2) - - dgamma3[j] * (shpj[0] * dt1ds2 + shpj[1] * dt2ds2 + shpj[2] * dt3ds2); + dgamma2[j] * (dt1ds2 * rho1[j] + t1j * drho1ds2 + dt2ds2 * rho2[j] + t2j * drho2ds2 + + dt3ds2 * rho3[j] + t3j * drho3ds2) - + dgamma3[j] * (shpj[0] * dt1ds2 + shpj[1] * dt2ds2 + shpj[2] * dt3ds2); } // Compute derivatives of energy wrt rij, sij and rij[3] @@ -435,8 +435,49 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int k = firstneigh_full[kn]; eltk = fmap[type[k]]; if (k != j && eltk >= 0) { - dsij(i, j, k, jn, numneigh, rij2, &dsij1, &dsij2, ntype, type, fmap, x, &scrfcn[fnoffset], - &fcpair[fnoffset]); + double xik, xjk, cikj, sikj, dfc, a; + double dCikj1, dCikj2; + double dxik, dyik, dzik; + double dxjk, dyjk, dzjk; + double delc, rik2, rjk2; + + sij = scrfcn[jn+fnoffset] * fcpair[jn+fnoffset]; + const double Cmax = this->Cmax_meam[elti][eltj][eltk]; + const double Cmin = this->Cmin_meam[elti][eltj][eltk]; + + dsij1 = 0.0; + dsij2 = 0.0; + if (!iszero(sij) && !iszero(sij - 1.0)) { + const double rbound = rij2 * this->ebound_meam[elti][eltj]; + delc = Cmax - Cmin; + dxjk = x[k][0] - x[j][0]; + dyjk = x[k][1] - x[j][1]; + dzjk = x[k][2] - x[j][2]; + rjk2 = dxjk * dxjk + dyjk * dyjk + dzjk * dzjk; + if (rjk2 <= rbound) { + dxik = x[k][0] - x[i][0]; + dyik = x[k][1] - x[i][1]; + dzik = x[k][2] - x[i][2]; + rik2 = dxik * dxik + dyik * dyik + dzik * dzik; + if (rik2 <= rbound) { + xik = rik2 / rij2; + xjk = rjk2 / rij2; + a = 1 - (xik - xjk) * (xik - xjk); + if (!iszero(a)) { + cikj = (2.0 * (xik + xjk) + a - 2.0) / a; + if (cikj >= Cmin && cikj <= Cmax) { + cikj = (cikj - Cmin) / delc; + sikj = dfcut(cikj, dfc); + dCfunc2(rij2, rik2, rjk2, dCikj1, dCikj2); + a = sij / delc * dfc / sikj; + dsij1 = a * dCikj1; + dsij2 = a * dCikj2; + } + } + } + } + } + if (!iszero(dsij1) || !iszero(dsij2)) { force1 = dUdsij * dsij1; force2 = dUdsij * dsij2;