Commit dadd1c8b authored by Sebastian Hütter's avatar Sebastian Hütter
Browse files

Remove neigh_f2c/c2f, related cleanup

- neighbour lists now use C indexing
- removed many arr*v() macros
- removed some unneccessary pointers
- minor reformatting
parent f092da80
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -141,20 +141,24 @@ public:
  void interpolate_meam(int);
  double compute_phi(double, int, int);
 public:
  void meam_setup_global(int, lattice_t*, double*, int*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, double*, int*);
  void meam_setup_param(int, double, int, int*, int*);
  void meam_setup_done(double*);
  void meam_dens_setup(int, int, int);
  void meam_dens_init(int* i, int* ntype, int* type, int* fmap, double** x,
                int* numneigh, int* firstneigh, int* numneigh_full,
  void meam_setup_global(int nelt, lattice_t* lat, double* z, int* ielement, double* atwt,
                   double* alpha, double* b0, double* b1, double* b2,
                   double* b3, double* alat, double* esub, double* asub,
                   double* t0, double* t1, double* t2, double* t3,
                   double* rozero, int* ibar);
  void meam_setup_param(int which, double value, int nindex, int* index /*index(3)*/, int* errorflag);
  void meam_setup_done(double* cutmax);
  void meam_dens_setup(int atom_nmax, int nall, int n_neigh);
  void meam_dens_init(int i, int ntype, int* type, int* fmap, double** x,
                int numneigh, int* firstneigh, int numneigh_full,
                int* firstneigh_full, int fnoffset, int* errorflag);
  void meam_dens_final(int* nlocal, int* eflag_either, int* eflag_global,
                 int* eflag_atom, double* eng_vdwl, double* eatom, int* ntype,
  void meam_dens_final(int nlocal, int eflag_either, int eflag_global,
                 int eflag_atom, double* eng_vdwl, double* eatom, int ntype,
                 int* type, int* fmap, int* errorflag);
  void meam_force(int* iptr, int* eflag_either, int* eflag_global,
            int* eflag_atom, int* vflag_atom, double* eng_vdwl, double* eatom,
            int* ntype, int* type, int* fmap, double** x, int* numneigh,
            int* firstneigh, int* numneigh_full, int* firstneigh_full,
  void meam_force(int i, int eflag_either, int eflag_global,
            int eflag_atom, int vflag_atom, double* eng_vdwl, double* eatom,
            int ntype, int* type, int* fmap, double** x, int numneigh,
            int* firstneigh, int numneigh_full, int* firstneigh_full,
            int fnoffset, double** f, double** vatom,
            int* errorflag);
};
+53 −55
Original line number Diff line number Diff line
@@ -21,8 +21,8 @@ using namespace LAMMPS_NS;
//

void
MEAM::meam_dens_final(int* nlocal, int* eflag_either, int* eflag_global,
                 int* eflag_atom, double* eng_vdwl, double* eatom, int* ntype,
MEAM::meam_dens_final(int nlocal, int eflag_either, int eflag_global,
                 int eflag_atom, double* eng_vdwl, double* eatom, int ntype,
                 int* type, int* fmap, int* errorflag)
{
  int i, elti;
@@ -32,56 +32,54 @@ MEAM::meam_dens_final(int* nlocal, int* eflag_either, int* eflag_global,

  //     Complete the calculation of density

  for (i = 1; i <= *nlocal; i++) {
    elti = fmap[arr1v(type, i)];
  for (i = 0; i < nlocal; i++) {
    elti = fmap[type[i]];
    if (elti >= 0) {
      arr1v(rho1, i) = 0.0;
      arr1v(rho2, i) = -1.0 / 3.0 * arr1v(arho2b, i) * arr1v(arho2b, i);
      arr1v(rho3, i) = 0.0;
      rho1[i] = 0.0;
      rho2[i] = -1.0 / 3.0 * arho2b[i] * arho2b[i];
      rho3[i] = 0.0;
      for (m = 1; m <= 3; m++) {
        arr1v(rho1, i) =
          arr1v(rho1, i) + arr2v(arho1, m, i) * arr2v(arho1, m, i);
        arr1v(rho3, i) = arr1v(rho3, i) -
                         3.0 / 5.0 * arr2v(arho3b, m, i) * arr2v(arho3b, m, i);
        rho1[i] = rho1[i] + arr2v(arho1, m, i+1) * arr2v(arho1, m, i+1);
        rho3[i] = rho3[i] - 3.0 / 5.0 * arr2v(arho3b, m, i+1) * arr2v(arho3b, m, i+1);
      }
      for (m = 1; m <= 6; m++) {
        arr1v(rho2, i) =
          arr1v(rho2, i) +
          this->v2D[m] * arr2v(arho2, m, i) * arr2v(arho2, m, i);
        rho2[i] =
          rho2[i] +
          this->v2D[m] * arr2v(arho2, m, i+1) * arr2v(arho2, m, i+1);
      }
      for (m = 1; m <= 10; m++) {
        arr1v(rho3, i) =
          arr1v(rho3, i) +
          this->v3D[m] * arr2v(arho3, m, i) * arr2v(arho3, m, i);
        rho3[i] =
          rho3[i] +
          this->v3D[m] * arr2v(arho3, m, i+1) * arr2v(arho3, m, i+1);
      }

      if (arr1v(rho0, i) > 0.0) {
      if (rho0[i] > 0.0) {
        if (this->ialloy == 1) {
          arr2v(t_ave, 1, i) = arr2v(t_ave, 1, i) / arr2v(tsq_ave, 1, i);
          arr2v(t_ave, 2, i) = arr2v(t_ave, 2, i) / arr2v(tsq_ave, 2, i);
          arr2v(t_ave, 3, i) = arr2v(t_ave, 3, i) / arr2v(tsq_ave, 3, i);
          t_ave[i][0] = t_ave[i][0] / tsq_ave[i][0];
          t_ave[i][1] = t_ave[i][1] / tsq_ave[i][1];
          t_ave[i][2] = t_ave[i][2] / tsq_ave[i][2];
        } else if (this->ialloy == 2) {
          arr2v(t_ave, 1, i) = this->t1_meam[elti];
          arr2v(t_ave, 2, i) = this->t2_meam[elti];
          arr2v(t_ave, 3, i) = this->t3_meam[elti];
          t_ave[i][0] = this->t1_meam[elti];
          t_ave[i][1] = this->t2_meam[elti];
          t_ave[i][2] = this->t3_meam[elti];
        } else {
          arr2v(t_ave, 1, i) = arr2v(t_ave, 1, i) / arr1v(rho0, i);
          arr2v(t_ave, 2, i) = arr2v(t_ave, 2, i) / arr1v(rho0, i);
          arr2v(t_ave, 3, i) = arr2v(t_ave, 3, i) / arr1v(rho0, i);
          t_ave[i][0] = t_ave[i][0] / rho0[i];
          t_ave[i][1] = t_ave[i][1] / rho0[i];
          t_ave[i][2] = t_ave[i][2] / rho0[i];
        }
      }

      arr1v(gamma, i) = arr2v(t_ave, 1, i) * arr1v(rho1, i) +
                        arr2v(t_ave, 2, i) * arr1v(rho2, i) +
                        arr2v(t_ave, 3, i) * arr1v(rho3, i);
      gamma[i] = t_ave[i][0] * rho1[i] +
                 t_ave[i][1] * rho2[i] +
                 t_ave[i][2] * rho3[i];

      if (arr1v(rho0, i) > 0.0) {
        arr1v(gamma, i) = arr1v(gamma, i) / (arr1v(rho0, i) * arr1v(rho0, i));
      if (rho0[i] > 0.0) {
        gamma[i] = gamma[i] / (rho0[i] * rho0[i]);
      }

      Z = this->Z_meam[elti];

      G_gam(arr1v(gamma, i), this->ibar_meam[elti], &G, errorflag);
      G_gam(gamma[i], this->ibar_meam[elti], &G, errorflag);
      if (*errorflag != 0)
        return;
      get_shpfcn(shp, this->lattce_meam[elti][elti]);
@@ -90,8 +88,8 @@ MEAM::meam_dens_final(int* nlocal, int* eflag_either, int* eflag_global,
        dGbar = 0.0;
      } else {
        if (this->mix_ref_t == 1) {
          gam = (arr2v(t_ave, 1, i) * shp[1] + arr2v(t_ave, 2, i) * shp[2] +
                 arr2v(t_ave, 3, i) * shp[3]) /
          gam = (t_ave[i][0] * shp[1] + t_ave[i][1] * shp[2] +
                 t_ave[i][2] * shp[3]) /
                (Z * Z);
        } else {
          gam = (this->t1_meam[elti] * shp[1] +
@@ -101,15 +99,15 @@ MEAM::meam_dens_final(int* nlocal, int* eflag_either, int* eflag_global,
        }
        G_gam(gam, this->ibar_meam[elti], &Gbar, errorflag);
      }
      arr1v(rho, i) = arr1v(rho0, i) * G;
      rho[i] = rho0[i] * G;

      if (this->mix_ref_t == 1) {
        if (this->ibar_meam[elti] <= 0) {
          Gbar = 1.0;
          dGbar = 0.0;
        } else {
          gam = (arr2v(t_ave, 1, i) * shp[1] + arr2v(t_ave, 2, i) * shp[2] +
                 arr2v(t_ave, 3, i) * shp[3]) /
          gam = (t_ave[i][0] * shp[1] + t_ave[i][1] * shp[2] +
                 t_ave[i][2] * shp[3]) /
                (Z * Z);
          dG_gam(gam, this->ibar_meam[elti], &Gbar, &dGbar);
        }
@@ -121,57 +119,57 @@ MEAM::meam_dens_final(int* nlocal, int* eflag_either, int* eflag_global,
          rho_bkgd = this->rho_ref_meam[elti];
        }
      }
      rhob = arr1v(rho, i) / rho_bkgd;
      rhob = rho[i] / rho_bkgd;
      denom = 1.0 / rho_bkgd;

      dG_gam(arr1v(gamma, i), this->ibar_meam[elti], &G, &dG);
      dG_gam(gamma[i], this->ibar_meam[elti], &G, &dG);

      arr1v(dgamma1, i) = (G - 2 * dG * arr1v(gamma, i)) * denom;
      dgamma1[i] = (G - 2 * dG * gamma[i]) * denom;

      if (!iszero(arr1v(rho0, i))) {
        arr1v(dgamma2, i) = (dG / arr1v(rho0, i)) * denom;
      if (!iszero(rho0[i])) {
        dgamma2[i] = (dG / rho0[i]) * denom;
      } else {
        arr1v(dgamma2, i) = 0.0;
        dgamma2[i] = 0.0;
      }

      //     dgamma3 is nonzero only if we are using the "mixed" rule for
      //     computing t in the reference system (which is not correct, but
      //     included for backward compatibility
      if (this->mix_ref_t == 1) {
        arr1v(dgamma3, i) = arr1v(rho0, i) * G * dGbar / (Gbar * Z * Z) * denom;
        dgamma3[i] = rho0[i] * G * dGbar / (Gbar * Z * Z) * denom;
      } else {
        arr1v(dgamma3, i) = 0.0;
        dgamma3[i] = 0.0;
      }

      B = this->A_meam[elti] * this->Ec_meam[elti][elti];

      if (!iszero(rhob)) {
        if (this->emb_lin_neg == 1 && rhob <= 0) {
          arr1v(frhop, i) = -B;
          frhop[i] = -B;
        } else {
          arr1v(frhop, i) = B * (log(rhob) + 1.0);
          frhop[i] = B * (log(rhob) + 1.0);
        }
        if (*eflag_either != 0) {
          if (*eflag_global != 0) {
        if (eflag_either != 0) {
          if (eflag_global != 0) {
            if (this->emb_lin_neg == 1 && rhob <= 0) {
              *eng_vdwl = *eng_vdwl - B * rhob;
            } else {
              *eng_vdwl = *eng_vdwl + B * rhob * log(rhob);
            }
          }
          if (*eflag_atom != 0) {
          if (eflag_atom != 0) {
            if (this->emb_lin_neg == 1 && rhob <= 0) {
              arr1v(eatom, i) = arr1v(eatom, i) - B * rhob;
              eatom[i] = eatom[i] - B * rhob;
            } else {
              arr1v(eatom, i) = arr1v(eatom, i) + B * rhob * log(rhob);
              eatom[i] = eatom[i] + B * rhob * log(rhob);
            }
          }
        }
      } else {
        if (this->emb_lin_neg == 1) {
          arr1v(frhop, i) = -B;
          frhop[i] = -B;
        } else {
          arr1v(frhop, i) = B;
          frhop[i] = B;
        }
      }
    }
+87 −105
Original line number Diff line number Diff line
@@ -101,18 +101,18 @@ MEAM::meam_dens_setup(int atom_nmax, int nall, int n_neigh)
//

void
MEAM::meam_dens_init(int* i, int* ntype, int* type, int* fmap, double** x,
                int* numneigh, int* firstneigh, int* numneigh_full,
MEAM::meam_dens_init(int i, int ntype, int* type, int* fmap, double** x,
                int numneigh, int* firstneigh, int numneigh_full,
                int* firstneigh_full, int fnoffset, int* errorflag)
{
  *errorflag = 0;

  //     Compute screening function and derivatives
  getscreen(*i, &scrfcn[fnoffset], &dscrfcn[fnoffset], &fcpair[fnoffset], x, *numneigh, firstneigh,
            *numneigh_full, firstneigh_full, *ntype, type, fmap);
  getscreen(i, &scrfcn[fnoffset], &dscrfcn[fnoffset], &fcpair[fnoffset], x, numneigh, firstneigh,
            numneigh_full, firstneigh_full, ntype, type, fmap);

  //     Calculate intermediate density terms to be communicated
  calc_rho1(*i, *ntype, type, fmap, x, *numneigh, firstneigh, &scrfcn[fnoffset], &fcpair[fnoffset]);
  calc_rho1(i, ntype, type, fmap, x, numneigh, firstneigh, &scrfcn[fnoffset], &fcpair[fnoffset]);
}

// ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
@@ -135,24 +135,24 @@ MEAM::getscreen(int i, double* scrfcn, double* dscrfcn, double* fcpair,
  double rnorm, fc, dfc, drinv;

  drinv = 1.0 / this->delr_meam;
  elti = fmap[arr1v(type, i)];
  elti = fmap[type[i]];

  if (elti >= 0) {

    xitmp = arr2v(x, 1, i);
    yitmp = arr2v(x, 2, i);
    zitmp = arr2v(x, 3, i);
    xitmp = x[i][0];
    yitmp = x[i][1];
    zitmp = x[i][2];

    for (jn = 1; jn <= numneigh; jn++) {
      j = arr1v(firstneigh, jn);
    for (jn = 0; jn < numneigh; jn++) {
      j = firstneigh[jn];

      eltj = fmap[arr1v(type, j)];
      eltj = fmap[type[j]];
      if (eltj >= 0) {

        //     First compute screening function itself, sij
        xjtmp = arr2v(x, 1, j);
        yjtmp = arr2v(x, 2, j);
        zjtmp = arr2v(x, 3, j);
        xjtmp = x[j][0];
        yjtmp = x[j][1];
        zjtmp = x[j][2];
        delxij = xjtmp - xitmp;
        delyij = yjtmp - yitmp;
        delzij = zjtmp - zitmp;
@@ -171,21 +171,21 @@ MEAM::getscreen(int i, double* scrfcn, double* dscrfcn, double* fcpair,
        }

        //     Now compute derivatives
        arr1v(dscrfcn, jn) = 0.0;
        dscrfcn[jn] = 0.0;
        sfcij = sij * fcij;
        if (iszero(sfcij) || iszero(sfcij - 1.0))
          goto LABEL_100;
        rbound = this->ebound_meam[elti][eltj] * rij2;
        for (kn = 1; kn <= numneigh_full; kn++) {
          k = arr1v(firstneigh_full, kn);
        for (kn = 0; kn < numneigh_full; kn++) {
          k = firstneigh_full[kn];
          if (k == j)
            continue;
          eltk = fmap[arr1v(type, k)];
          eltk = fmap[type[k]];
          if (eltk < 0)
            continue;
          xktmp = arr2v(x, 1, k);
          yktmp = arr2v(x, 2, k);
          zktmp = arr2v(x, 3, k);
          xktmp = x[k][0];
          yktmp = x[k][1];
          zktmp = x[k][2];
          delxjk = xktmp - xjtmp;
          delyjk = yktmp - yjtmp;
          delzjk = zktmp - zjtmp;
@@ -223,16 +223,16 @@ MEAM::getscreen(int i, double* scrfcn, double* dscrfcn, double* fcpair,
            dfcut(cikj, &sikj, &dfikj);
            coef1 = dfikj / (delc * sikj);
            dCfunc(rij2, rik2, rjk2, &dCikj);
            arr1v(dscrfcn, jn) = arr1v(dscrfcn, jn) + coef1 * dCikj;
            dscrfcn[jn] = dscrfcn[jn] + coef1 * dCikj;
          }
        }
        coef1 = sfcij;
        coef2 = sij * dfcij / rij;
        arr1v(dscrfcn, jn) = arr1v(dscrfcn, jn) * coef1 - coef2;
        dscrfcn[jn] = dscrfcn[jn] * coef1 - coef2;

      LABEL_100:
        arr1v(scrfcn, jn) = sij;
        arr1v(fcpair, jn) = fcij;
        scrfcn[jn] = sij;
        fcpair[jn] = fcij;
      }
    }
  }
@@ -252,20 +252,20 @@ MEAM::calc_rho1(int i, int ntype, int* type, int* fmap, double** x,
  double ro0i, ro0j;
  double rhoa0i, rhoa1i, rhoa2i, rhoa3i, A1i, A2i, A3i;

  elti = fmap[arr1v(type, i)];
  xtmp = arr2v(x, 1, i);
  ytmp = arr2v(x, 2, i);
  ztmp = arr2v(x, 3, i);
  for (jn = 1; jn <= numneigh; jn++) {
    if (!iszero(arr1v(scrfcn, jn))) {
      j = arr1v(firstneigh, jn);
      sij = arr1v(scrfcn, jn) * arr1v(fcpair, jn);
      delij[1] = arr2v(x, 1, j) - xtmp;
      delij[2] = arr2v(x, 2, j) - ytmp;
      delij[3] = arr2v(x, 3, j) - ztmp;
  elti = fmap[type[i]];
  xtmp = x[i][0];
  ytmp = x[i][1];
  ztmp = x[i][2];
  for (jn = 0; jn < numneigh; jn++) {
    if (!iszero(scrfcn[jn])) {
      j = firstneigh[jn];
      sij = scrfcn[jn] * fcpair[jn];
      delij[1] = x[j][0] - xtmp;
      delij[2] = x[j][1] - ytmp;
      delij[3] = x[j][2] - ztmp;
      rij2 = delij[1] * delij[1] + delij[2] * delij[2] + delij[3] * delij[3];
      if (rij2 < this->cutforcesq) {
        eltj = fmap[arr1v(type, j)];
        eltj = fmap[type[j]];
        rij = sqrt(rij2);
        ai = rij / this->re_meam[elti][elti] - 1.0;
        aj = rij / this->re_meam[eltj][eltj] - 1.0;
@@ -287,45 +287,27 @@ MEAM::calc_rho1(int i, int ntype, int* type, int* fmap, double** x,
          rhoa2i = rhoa2i * this->t2_meam[elti];
          rhoa3i = rhoa3i * this->t3_meam[elti];
        }
        arr1v(rho0, i) = arr1v(rho0, i) + rhoa0j;
        arr1v(rho0, j) = arr1v(rho0, j) + rhoa0i;
        rho0[i] = rho0[i] + rhoa0j;
        rho0[j] = rho0[j] + rhoa0i;
        // For ialloy = 2, use single-element value (not average)
        if (this->ialloy != 2) {
          arr2v(t_ave, 1, i) =
            arr2v(t_ave, 1, i) + this->t1_meam[eltj] * rhoa0j;
          arr2v(t_ave, 2, i) =
            arr2v(t_ave, 2, i) + this->t2_meam[eltj] * rhoa0j;
          arr2v(t_ave, 3, i) =
            arr2v(t_ave, 3, i) + this->t3_meam[eltj] * rhoa0j;
          arr2v(t_ave, 1, j) =
            arr2v(t_ave, 1, j) + this->t1_meam[elti] * rhoa0i;
          arr2v(t_ave, 2, j) =
            arr2v(t_ave, 2, j) + this->t2_meam[elti] * rhoa0i;
          arr2v(t_ave, 3, j) =
            arr2v(t_ave, 3, j) + this->t3_meam[elti] * rhoa0i;
          t_ave[i][0] = t_ave[i][0] + this->t1_meam[eltj] * rhoa0j;
          t_ave[i][1] = t_ave[i][1] + this->t2_meam[eltj] * rhoa0j;
          t_ave[i][2] = t_ave[i][2] + this->t3_meam[eltj] * rhoa0j;
          t_ave[j][0] = t_ave[j][0] + this->t1_meam[elti] * rhoa0i;
          t_ave[j][1] = t_ave[j][1] + this->t2_meam[elti] * rhoa0i;
          t_ave[j][2] = t_ave[j][2] + this->t3_meam[elti] * rhoa0i;
        }
        if (this->ialloy == 1) {
          arr2v(tsq_ave, 1, i) =
            arr2v(tsq_ave, 1, i) +
            this->t1_meam[eltj] * this->t1_meam[eltj] * rhoa0j;
          arr2v(tsq_ave, 2, i) =
            arr2v(tsq_ave, 2, i) +
            this->t2_meam[eltj] * this->t2_meam[eltj] * rhoa0j;
          arr2v(tsq_ave, 3, i) =
            arr2v(tsq_ave, 3, i) +
            this->t3_meam[eltj] * this->t3_meam[eltj] * rhoa0j;
          arr2v(tsq_ave, 1, j) =
            arr2v(tsq_ave, 1, j) +
            this->t1_meam[elti] * this->t1_meam[elti] * rhoa0i;
          arr2v(tsq_ave, 2, j) =
            arr2v(tsq_ave, 2, j) +
            this->t2_meam[elti] * this->t2_meam[elti] * rhoa0i;
          arr2v(tsq_ave, 3, j) =
            arr2v(tsq_ave, 3, j) +
            this->t3_meam[elti] * this->t3_meam[elti] * rhoa0i;
        }
        arr1v(arho2b, i) = arr1v(arho2b, i) + rhoa2j;
        arr1v(arho2b, j) = arr1v(arho2b, j) + rhoa2i;
          tsq_ave[i][0] = tsq_ave[i][0] + this->t1_meam[eltj] * this->t1_meam[eltj] * rhoa0j;
          tsq_ave[i][1] = tsq_ave[i][1] + this->t2_meam[eltj] * this->t2_meam[eltj] * rhoa0j;
          tsq_ave[i][2] = tsq_ave[i][2] + this->t3_meam[eltj] * this->t3_meam[eltj] * rhoa0j;
          tsq_ave[j][0] = tsq_ave[j][0] + this->t1_meam[elti] * this->t1_meam[elti] * rhoa0i;
          tsq_ave[j][1] = tsq_ave[j][1] + this->t2_meam[elti] * this->t2_meam[elti] * rhoa0i;
          tsq_ave[j][2] = tsq_ave[j][2] + this->t3_meam[elti] * this->t3_meam[elti] * rhoa0i;
        }
        arho2b[i] = arho2b[i] + rhoa2j;
        arho2b[j] = arho2b[j] + rhoa2i;

        A1j = rhoa1j / rij;
        A2j = rhoa2j / rij2;
@@ -336,21 +318,21 @@ MEAM::calc_rho1(int i, int ntype, int* type, int* fmap, double** x,
        nv2 = 1;
        nv3 = 1;
        for (m = 1; m <= 3; m++) {
          arr2v(arho1, m, i) = arr2v(arho1, m, i) + A1j * delij[m];
          arr2v(arho1, m, j) = arr2v(arho1, m, j) - A1i * delij[m];
          arr2v(arho3b, m, i) = arr2v(arho3b, m, i) + rhoa3j * delij[m] / rij;
          arr2v(arho3b, m, j) = arr2v(arho3b, m, j) - rhoa3i * delij[m] / rij;
          arr2v(arho1, m, i+1) = arr2v(arho1, m, i+1) + A1j * delij[m];
          arr2v(arho1, m, j+1) = arr2v(arho1, m, j+1) - A1i * delij[m];
          arr2v(arho3b, m, i+1) = arr2v(arho3b, m, i+1) + rhoa3j * delij[m] / rij;
          arr2v(arho3b, m, j+1) = arr2v(arho3b, m, j+1) - rhoa3i * delij[m] / rij;
          for (n = m; n <= 3; n++) {
            arr2v(arho2, nv2, i) =
              arr2v(arho2, nv2, i) + A2j * delij[m] * delij[n];
            arr2v(arho2, nv2, j) =
              arr2v(arho2, nv2, j) + A2i * delij[m] * delij[n];
            arr2v(arho2, nv2, i+1) =
              arr2v(arho2, nv2, i+1) + A2j * delij[m] * delij[n];
            arr2v(arho2, nv2, j+1) =
              arr2v(arho2, nv2, j+1) + A2i * delij[m] * delij[n];
            nv2 = nv2 + 1;
            for (p = n; p <= 3; p++) {
              arr2v(arho3, nv3, i) =
                arr2v(arho3, nv3, i) + A3j * delij[m] * delij[n] * delij[p];
              arr2v(arho3, nv3, j) =
                arr2v(arho3, nv3, j) - A3i * delij[m] * delij[n] * delij[p];
              arr2v(arho3, nv3, i+1) =
                arr2v(arho3, nv3, i+1) + A3j * delij[m] * delij[n] * delij[p];
              arr2v(arho3, nv3, j+1) =
                arr2v(arho3, nv3, j+1) - A3i * delij[m] * delij[n] * delij[p];
              nv3 = nv3 + 1;
            }
          }
@@ -379,26 +361,26 @@ MEAM::screen(int i, int j, double** x, double rijsq, double* sij,
  double Cmax, Cmin, rbound;

  *sij = 1.0;
  elti = fmap[arr1v(type, i)];
  eltj = fmap[arr1v(type, j)];
  elti = fmap[type[i]];
  eltj = fmap[type[j]];

  //     if rjksq > ebound*rijsq, atom k is definitely outside the ellipse
  rbound = this->ebound_meam[elti][eltj] * rijsq;

  for (nk = 1; nk <= numneigh_full; nk++) {
    k = arr1v(firstneigh_full, nk);
    eltk = fmap[arr1v(type, k)];
  for (nk = 0; nk < numneigh_full; nk++) {
    k = firstneigh_full[nk];
    eltk = fmap[type[k]];
    if (k == j)
      continue;
    delxjk = arr2v(x, 1, k) - arr2v(x, 1, j);
    delyjk = arr2v(x, 2, k) - arr2v(x, 2, j);
    delzjk = arr2v(x, 3, k) - arr2v(x, 3, j);
    delxjk = x[k][0] - x[j][0];
    delyjk = x[k][1] - x[j][1];
    delzjk = x[k][2] - x[j][2];
    rjksq = delxjk * delxjk + delyjk * delyjk + delzjk * delzjk;
    if (rjksq > rbound)
      continue;
    delxik = arr2v(x, 1, k) - arr2v(x, 1, i);
    delyik = arr2v(x, 2, k) - arr2v(x, 2, i);
    delzik = arr2v(x, 3, k) - arr2v(x, 3, i);
    delxik = x[k][0] - x[i][0];
    delyik = x[k][1] - x[i][1];
    delzik = x[k][2] - x[i][2];
    riksq = delxik * delxik + delyik * delyik + delzik * delzik;
    if (riksq > rbound)
      continue;
@@ -450,10 +432,10 @@ MEAM::dsij(int i, int j, int k, int jn, int numneigh, double rij2,
  double rbound, delc, sij, xik, xjk, cikj, sikj, dfc, a;
  double Cmax, Cmin, dCikj1, dCikj2;

  sij = arr1v(scrfcn, jn) * arr1v(fcpair, jn);
  elti = fmap[arr1v(type, i)];
  eltj = fmap[arr1v(type, j)];
  eltk = fmap[arr1v(type, k)];
  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];

@@ -462,14 +444,14 @@ MEAM::dsij(int i, int j, int k, int jn, int numneigh, double rij2,
  if (!iszero(sij) && !iszero(sij - 1.0)) {
    rbound = rij2 * this->ebound_meam[elti][eltj];
    delc = Cmax - Cmin;
    dxjk = arr2v(x, 1, k) - arr2v(x, 1, j);
    dyjk = arr2v(x, 2, k) - arr2v(x, 2, j);
    dzjk = arr2v(x, 3, k) - arr2v(x, 3, j);
    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 = arr2v(x, 1, k) - arr2v(x, 1, i);
      dyik = arr2v(x, 2, k) - arr2v(x, 2, i);
      dzik = arr2v(x, 3, k) - arr2v(x, 3, i);
      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;
+145 −155

File changed.

Preview size limit exceeded, changes collapsed.

+9 −53
Original line number Diff line number Diff line
@@ -129,24 +129,17 @@ void PairMEAMC::compute(int eflag, int vflag)
  int *type = atom->type;
  int ntype = atom->ntypes;

  // change neighbor list indices to Fortran indexing

  neigh_c2f(inum_half,ilist_half,numneigh_half,firstneigh_half);
  neigh_c2f(inum_half,ilist_half,numneigh_full,firstneigh_full);

  // 3 stages of MEAM calculation
  // loop over my atoms followed by communication

  int ifort;
  int offset = 0;
  errorflag = 0;

  for (ii = 0; ii < inum_half; ii++) {
    i = ilist_half[ii];
    ifort = i+1;
    meam_inst->meam_dens_init(&ifort,&ntype,type,map,x,
                    &numneigh_half[i],firstneigh_half[i],
                    &numneigh_full[i],firstneigh_full[i],
    meam_inst->meam_dens_init(i,ntype,type,map,x,
                    numneigh_half[i],firstneigh_half[i],
                    numneigh_full[i],firstneigh_full[i],
                    offset,
                    &errorflag);
    if (errorflag) {
@@ -159,8 +152,8 @@ void PairMEAMC::compute(int eflag, int vflag)

  comm->reverse_comm_pair(this);

  meam_inst->meam_dens_final(&nlocal,&eflag_either,&eflag_global,&eflag_atom,
                   &eng_vdwl,eatom,&ntype,type,map,
  meam_inst->meam_dens_final(nlocal,eflag_either,eflag_global,eflag_atom,
                   &eng_vdwl,eatom,ntype,type,map,
                   &errorflag);
  if (errorflag) {
    char str[128];
@@ -181,11 +174,10 @@ void PairMEAMC::compute(int eflag, int vflag)

  for (ii = 0; ii < inum_half; ii++) {
    i = ilist_half[ii];
    ifort = i+1;
    meam_inst->meam_force(&ifort,&eflag_either,&eflag_global,&eflag_atom,
                &vflag_atom,&eng_vdwl,eatom,&ntype,type,map,x,
                &numneigh_half[i],firstneigh_half[i],
                &numneigh_full[i],firstneigh_full[i],
    meam_inst->meam_force(i,eflag_either,eflag_global,eflag_atom,
                vflag_atom,&eng_vdwl,eatom,ntype,type,map,x,
                numneigh_half[i],firstneigh_half[i],
                numneigh_full[i],firstneigh_full[i],
                offset,
                f,vptr,&errorflag);
    if (errorflag) {
@@ -196,11 +188,6 @@ void PairMEAMC::compute(int eflag, int vflag)
    offset += numneigh_half[i];
  }

  // change neighbor list indices back to C indexing

  neigh_f2c(inum_half,ilist_half,numneigh_half,firstneigh_half);
  neigh_f2c(inum_half,ilist_half,numneigh_full,firstneigh_full);

  if (vflag_fdotr) virial_fdotr_compute();
}

@@ -806,34 +793,3 @@ void PairMEAMC::neigh_strip(int inum, int *ilist,
    for (j = 0; j < jnum; j++) jlist[j] &= NEIGHMASK;
  }
}

/* ----------------------------------------------------------------------
   toggle neighbor list indices between zero- and one-based values
   needed for access by MEAM Fortran library
------------------------------------------------------------------------- */

void PairMEAMC::neigh_f2c(int inum, int *ilist, int *numneigh, int **firstneigh)
{
  int i,j,ii,jnum;
  int *jlist;

  for (ii = 0; ii < inum; ii++) {
    i = ilist[ii];
    jlist = firstneigh[i];
    jnum = numneigh[i];
    for (j = 0; j < jnum; j++) jlist[j]--;
  }
}

void PairMEAMC::neigh_c2f(int inum, int *ilist, int *numneigh, int **firstneigh)
{
  int i,j,ii,jnum;
  int *jlist;

  for (ii = 0; ii < inum; ii++) {
    i = ilist[ii];
    jlist = firstneigh[i];
    jnum = numneigh[i];
    for (j = 0; j < jnum; j++) jlist[j]++;
  }
}
Loading