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

Avoid more div by zero in meam/c

parent ac97c215
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -248,5 +248,13 @@ static inline void setall3d(TYPE (&arr)[maxi][maxj][maxk], const TYPE v) {
        arr[i][j][k] = v;
}

// Helper functions

static inline double fdiv_zero(const double n, const double d) {
  if (iszero(d))
    return 0.0;
  return n / d;
}

};
#endif
+3 −3
Original line number Diff line number Diff line
@@ -33,9 +33,9 @@ MEAM::meam_dens_final(int nlocal, int eflag_either, int eflag_global, int eflag_

      if (rho0[i] > 0.0) {
        if (this->ialloy == 1) {
          t_ave[i][0] = (tsq_ave[i][0] != 0.0 ) ? t_ave[i][0] / tsq_ave[i][0] : 0.0;
          t_ave[i][1] = (tsq_ave[i][1] != 0.0 ) ? t_ave[i][1] / tsq_ave[i][1] : 0.0;
          t_ave[i][0] = (tsq_ave[i][2] != 0.0 ) ? t_ave[i][2] / tsq_ave[i][2] : 0.0;
          t_ave[i][0] = fdiv_zero(t_ave[i][0], tsq_ave[i][0]);
          t_ave[i][1] = fdiv_zero(t_ave[i][1], tsq_ave[i][1]);
          t_ave[i][2] = fdiv_zero(t_ave[i][2], tsq_ave[i][2]);
        } else if (this->ialloy == 2) {
          t_ave[i][0] = this->t1_meam[elti];
          t_ave[i][1] = this->t2_meam[elti];
+19 −44
Original line number Diff line number Diff line
@@ -245,31 +245,19 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int

        if (this->ialloy == 1) {

          a1i = 0.0;
          a1j = 0.0;
          a2i = 0.0;
          a2j = 0.0;
          a3i = 0.0;
          a3j = 0.0;
          if (!iszero(tsq_ave[i][0]))
            a1i = drhoa0j * sij / tsq_ave[i][0];
          if (!iszero(tsq_ave[j][0]))
            a1j = drhoa0i * sij / tsq_ave[j][0];
          if (!iszero(tsq_ave[i][1]))
            a2i = drhoa0j * sij / tsq_ave[i][1];
          if (!iszero(tsq_ave[j][1]))
            a2j = drhoa0i * sij / tsq_ave[j][1];
          if (!iszero(tsq_ave[i][2]))
            a3i = drhoa0j * sij / tsq_ave[i][2];
          if (!iszero(tsq_ave[j][2]))
            a3j = drhoa0i * sij / tsq_ave[j][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);
          a1i = fdiv_zero(drhoa0j * sij, tsq_ave[i][0]);
          a1j = fdiv_zero(drhoa0i * sij, tsq_ave[j][0]);
          a2i = fdiv_zero(drhoa0j * sij, tsq_ave[i][1]);
          a2j = fdiv_zero(drhoa0i * sij, tsq_ave[j][1]);
          a3i = fdiv_zero(drhoa0j * sij, tsq_ave[i][2]);
          a3j = fdiv_zero(drhoa0i * sij, tsq_ave[j][2]);

          dt1dr1 = a1i * (t1mj - t1i * MathSpecial::square(t1mj));
          dt1dr2 = a1j * (t1mi - t1j * MathSpecial::square(t1mi));
          dt2dr1 = a2i * (t2mj - t2i * MathSpecial::square(t2mj));
          dt2dr2 = a2j * (t2mi - t2j * MathSpecial::square(t2mi));
          dt3dr1 = a3i * (t3mj - t3i * MathSpecial::square(t3mj));
          dt3dr2 = a3j * (t3mi - t3j * MathSpecial::square(t3mi));

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

@@ -331,25 +319,12 @@ MEAM::meam_force(int i, int eflag_either, int eflag_global, int eflag_atom, int
          drho3ds2 = a3 * rhoa3i * arg1j3 - a3a * rhoa3i * arg3j3;

          if (this->ialloy == 1) {

            a1i = 0.0;
            a1j = 0.0;
            a2i = 0.0;
            a2j = 0.0;
            a3i = 0.0;
            a3j = 0.0;
            if (!iszero(tsq_ave[i][0]))
              a1i = rhoa0j / tsq_ave[i][0];
            if (!iszero(tsq_ave[j][0]))
              a1j = rhoa0i / tsq_ave[j][0];
            if (!iszero(tsq_ave[i][1]))
              a2i = rhoa0j / tsq_ave[i][1];
            if (!iszero(tsq_ave[j][1]))
              a2j = rhoa0i / tsq_ave[j][1];
            if (!iszero(tsq_ave[i][2]))
              a3i = rhoa0j / tsq_ave[i][2];
            if (!iszero(tsq_ave[j][2]))
              a3j = rhoa0i / tsq_ave[j][2];
            a1i = fdiv_zero(rhoa0j, tsq_ave[i][0]);
            a1j = fdiv_zero(rhoa0i, tsq_ave[j][0]);
            a2i = fdiv_zero(rhoa0j, tsq_ave[i][1]);
            a2j = fdiv_zero(rhoa0i, tsq_ave[j][1]);
            a3i = fdiv_zero(rhoa0j, tsq_ave[i][2]);
            a3j = fdiv_zero(rhoa0i, tsq_ave[j][2]);

            dt1ds1 = a1i * (t1mj - t1i * MathSpecial::square(t1mj));
            dt1ds2 = a1j * (t1mi - t1j * MathSpecial::square(t1mi));