Commit d68fb1cb authored by Axel Kohlmeyer's avatar Axel Kohlmeyer
Browse files

avoid repeated computation of deltaik and deltajk, calls to pow()

parent 060e3297
Loading
Loading
Loading
Loading
+416 −410
Original line number Diff line number Diff line
@@ -50,8 +50,8 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int
  //     Compute forces atom i

  elti = fmap[type[i]];
  if (elti < 0) return;

  if (elti >= 0) {
  xitmp = x[i][0];
  yitmp = x[i][1];
  zitmp = x[i][2];
@@ -132,19 +132,26 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int
          drhoa3j = drhoa3i;
        }

        const double t1mi = this->t1_meam[elti];
        const double t2mi = this->t2_meam[elti];
        const double t3mi = this->t3_meam[elti];
        const double t1mj = this->t1_meam[eltj];
        const double t2mj = this->t2_meam[eltj];
        const double t3mj = this->t3_meam[eltj];

        if (this->ialloy == 1) {
            rhoa1j = rhoa1j * this->t1_meam[eltj];
            rhoa2j = rhoa2j * this->t2_meam[eltj];
            rhoa3j = rhoa3j * this->t3_meam[eltj];
            rhoa1i = rhoa1i * this->t1_meam[elti];
            rhoa2i = rhoa2i * this->t2_meam[elti];
            rhoa3i = rhoa3i * this->t3_meam[elti];
            drhoa1j = drhoa1j * this->t1_meam[eltj];
            drhoa2j = drhoa2j * this->t2_meam[eltj];
            drhoa3j = drhoa3j * this->t3_meam[eltj];
            drhoa1i = drhoa1i * this->t1_meam[elti];
            drhoa2i = drhoa2i * this->t2_meam[elti];
            drhoa3i = drhoa3i * this->t3_meam[elti];
          rhoa1j  *= t1mj;
          rhoa2j  *= t2mj;
          rhoa3j  *= t3mj;
          rhoa1i  *= t1mi;
          rhoa2i  *= t2mi;
          rhoa3i  *= t3mi;
          drhoa1j *= t1mj;
          drhoa2j *= t2mj;
          drhoa3j *= t3mj;
          drhoa1i *= t1mi;
          drhoa2i *= t2mi;
          drhoa3i *= t3mi;
        }

        nv2 = 0;
@@ -259,12 +266,12 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int
          if (!iszero(tsq_ave[j][2]))
            a3j = drhoa0i * sij / tsq_ave[j][2];

            dt1dr1 = a1i * (this->t1_meam[eltj] - t1i * pow(this->t1_meam[eltj], 2));
            dt1dr2 = a1j * (this->t1_meam[elti] - t1j * pow(this->t1_meam[elti], 2));
            dt2dr1 = a2i * (this->t2_meam[eltj] - t2i * pow(this->t2_meam[eltj], 2));
            dt2dr2 = a2j * (this->t2_meam[elti] - t2j * pow(this->t2_meam[elti], 2));
            dt3dr1 = a3i * (this->t3_meam[eltj] - t3i * pow(this->t3_meam[eltj], 2));
            dt3dr2 = a3j * (this->t3_meam[elti] - t3j * pow(this->t3_meam[elti], 2));
          dt1dr1 = a1i * (t1mj - t1i * t1mj*t1mj);
          dt1dr2 = a1j * (t1mi - t1j * t1mi*t1mi);
          dt2dr1 = a2i * (t2mj - t2i * t2mj*t2mj);
          dt2dr2 = a2j * (t2mi - t2j * t2mi*t2mi);
          dt3dr1 = a3i * (t3mj - t3i * t3mj*t3mj);
          dt3dr2 = a3j * (t3mi - t3j * t3mi*t3mi);

        } else if (this->ialloy == 2) {

@@ -284,12 +291,12 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int
          if (!iszero(rho0[j]))
            aj = drhoa0i * sij / rho0[j];

            dt1dr1 = ai * (this->t1_meam[eltj] - t1i);
            dt1dr2 = aj * (this->t1_meam[elti] - t1j);
            dt2dr1 = ai * (this->t2_meam[eltj] - t2i);
            dt2dr2 = aj * (this->t2_meam[elti] - t2j);
            dt3dr1 = ai * (this->t3_meam[eltj] - t3i);
            dt3dr2 = aj * (this->t3_meam[elti] - t3j);
          dt1dr1 = ai * (t1mj - t1i);
          dt1dr2 = aj * (t1mi - t1j);
          dt2dr1 = ai * (t2mj - t2i);
          dt2dr2 = aj * (t2mi - t2j);
          dt3dr1 = ai * (t3mj - t3i);
          dt3dr2 = aj * (t3mi - t3j);
        }

        //     Compute derivatives of total density wrt rij, sij and rij(3)
@@ -346,12 +353,12 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int
            if (!iszero(tsq_ave[j][2]))
              a3j = rhoa0i / tsq_ave[j][2];

              dt1ds1 = a1i * (this->t1_meam[eltj] - t1i * pow(this->t1_meam[eltj], 2));
              dt1ds2 = a1j * (this->t1_meam[elti] - t1j * pow(this->t1_meam[elti], 2));
              dt2ds1 = a2i * (this->t2_meam[eltj] - t2i * pow(this->t2_meam[eltj], 2));
              dt2ds2 = a2j * (this->t2_meam[elti] - t2j * pow(this->t2_meam[elti], 2));
              dt3ds1 = a3i * (this->t3_meam[eltj] - t3i * pow(this->t3_meam[eltj], 2));
              dt3ds2 = a3j * (this->t3_meam[elti] - t3j * pow(this->t3_meam[elti], 2));
            dt1ds1 = a1i * (t1mj - t1i * pow(t1mj, 2));
            dt1ds2 = a1j * (t1mi - t1j * pow(t1mi, 2));
            dt2ds1 = a2i * (t2mj - t2i * pow(t2mj, 2));
            dt2ds2 = a2j * (t2mi - t2j * pow(t2mi, 2));
            dt3ds1 = a3i * (t3mj - t3i * pow(t3mj, 2));
            dt3ds2 = a3j * (t3mi - t3j * pow(t3mi, 2));

          } else if (this->ialloy == 2) {

@@ -371,12 +378,12 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int
            if (!iszero(rho0[j]))
              aj = rhoa0i / rho0[j];

              dt1ds1 = ai * (this->t1_meam[eltj] - t1i);
              dt1ds2 = aj * (this->t1_meam[elti] - t1j);
              dt2ds1 = ai * (this->t2_meam[eltj] - t2i);
              dt2ds2 = aj * (this->t2_meam[elti] - t2j);
              dt3ds1 = ai * (this->t3_meam[eltj] - t3i);
              dt3ds2 = aj * (this->t3_meam[elti] - t3j);
            dt1ds1 = ai * (t1mj - t1i);
            dt1ds2 = aj * (t1mi - t1j);
            dt2ds1 = ai * (t2mj - t2i);
            dt2ds2 = aj * (t2mi - t2j);
            dt3ds1 = ai * (t3mj - t3i);
            dt3ds2 = aj * (t3mi - t3j);
          }

          drhods1 = dgamma1[i] * drho0ds1 +
@@ -429,16 +436,17 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int

        //     Now compute forces on other atoms k due to change in sij

          if (iszero(sij) || iszero(sij - 1.0))
            continue; //: cont jn loop
        if (iszero(sij) || iszero(sij - 1.0)) continue; //: cont jn loop

        double dxik(0), dyik(0), dzik(0);
        double dxjk(0), dyjk(0), dzjk(0);

        for (kn = 0; kn < numneigh_full; kn++) {
          k = firstneigh_full[kn];
          eltk = fmap[type[k]];
          if (k != j && eltk >= 0) {
            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];
@@ -481,31 +489,32 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int
            if (!iszero(dsij1) || !iszero(dsij2)) {
              force1 = dUdsij * dsij1;
              force2 = dUdsij * dsij2;
                for (m = 0; m < 3; m++) {
                  delik[m] = x[k][m] - x[i][m];
                  deljk[m] = x[k][m] - x[j][m];
                }
                for (m = 0; m < 3; m++) {
                  f[i][m] = f[i][m] + force1 * delik[m];
                  f[j][m] = f[j][m] + force2 * deljk[m];
                  f[k][m] = f[k][m] - force1 * delik[m] - force2 * deljk[m];
                }

              f[i][0] += force1 * dxik;
              f[i][1] += force1 * dyik;
              f[i][2] += force1 * dzik;
              f[j][0] += force2 * dxjk;
              f[j][1] += force2 * dyjk;
              f[j][2] += force2 * dzjk;
              f[k][0] -= force1 * dxik + force2 * dxjk;
              f[k][1] -= force1 * dyik + force2 * dyjk;
              f[k][2] -= force1 * dzik + force2 * dzjk;

              //     Tabulate per-atom virial as symmetrized stress tensor

              if (vflag_atom != 0) {
                  fi[0] = force1 * delik[0];
                  fi[1] = force1 * delik[1];
                  fi[2] = force1 * delik[2];
                  fj[0] = force2 * deljk[0];
                  fj[1] = force2 * deljk[1];
                  fj[2] = force2 * deljk[2];
                  v[0] = -third * (delik[0] * fi[0] + deljk[0] * fj[0]);
                  v[1] = -third * (delik[1] * fi[1] + deljk[1] * fj[1]);
                  v[2] = -third * (delik[2] * fi[2] + deljk[2] * fj[2]);
                  v[3] = -sixth * (delik[0] * fi[1] + deljk[0] * fj[1] + delik[1] * fi[0] + deljk[1] * fj[0]);
                  v[4] = -sixth * (delik[0] * fi[2] + deljk[0] * fj[2] + delik[2] * fi[0] + deljk[2] * fj[0]);
                  v[5] = -sixth * (delik[1] * fi[2] + deljk[1] * fj[2] + delik[2] * fi[1] + deljk[2] * fj[1]);
                fi[0] = force1 * dxik;
                fi[1] = force1 * dyik;
                fi[2] = force1 * dzik;
                fj[0] = force2 * dxjk;
                fj[1] = force2 * dyjk;
                fj[2] = force2 * dzjk;
                v[0] = -third * (dxik * fi[0] + dxjk * fj[0]);
                v[1] = -third * (dyik * fi[1] + dyjk * fj[1]);
                v[2] = -third * (dzik * fi[2] + dzjk * fj[2]);
                v[3] = -sixth * (dxik * fi[1] + dxjk * fj[1] + dyik * fi[0] + dyjk * fj[0]);
                v[4] = -sixth * (dxik * fi[2] + dxjk * fj[2] + dzik * fi[0] + dzjk * fj[0]);
                v[5] = -sixth * (dyik * fi[2] + dyjk * fj[2] + dzik * fi[1] + dzjk * fj[1]);

                for (m = 0; m < 6; m++) {
                  vatom[i][m] = vatom[i][m] + v[m];
@@ -521,7 +530,4 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int
    }
    //     end of j loop
  }

    //     else if elti<0, this is not a meam atom
  }
}