Unverified Commit b9ff623c authored by Axel Kohlmeyer's avatar Axel Kohlmeyer Committed by GitHub
Browse files

Merge pull request #1920 from jguenole/fire-debug

fire bug fix to avoid crashes due to lost atoms
parents 7b7ca000 ddc36973
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -182,4 +182,4 @@ Jonsson, Mills, Jacobsen.
.. _Guenole:

**(Guenole)** Guenole, Noehring, Vaid, Houlle, Xie, Prakash, Bitzek,
Comput Mater Sci, (2020), in press (arXiv:190802038).
Comput Mater Sci, 175, 109584 (2020).
+41 −3
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ void MinFire::setup_style()

  for (int i = 0; i < nlocal; i++)
    v[i][0] = v[i][1] = v[i][2] = 0.0;
  flagv0 = 1;
}

/* ----------------------------------------------------------------------
@@ -259,14 +260,40 @@ int MinFire::iterate(int maxiter)

      if (halfstepback_flag) {
        for (int i = 0; i < nlocal; i++) {
          x[i][0] -= 0.5 * dtv * v[i][0];
          x[i][1] -= 0.5 * dtv * v[i][1];
          x[i][2] -= 0.5 * dtv * v[i][2];
          x[i][0] -= 0.5 * dt * v[i][0];
          x[i][1] -= 0.5 * dt * v[i][1];
          x[i][2] -= 0.5 * dt * v[i][2];
        }
      }

      for (int i = 0; i < nlocal; i++)
        v[i][0] = v[i][1] = v[i][2] = 0.0;
      flagv0 = 1;
    }

    // evaluates velocties to estimate wether dtv has to be limited
    // required when v have been reset

    if (flagv0) {
      dtf = dt * force->ftm2v;
      energy_force(0);
      neval++;

      if (rmass) {
        for (int i = 0; i < nlocal; i++) {
          dtfm = dtf / rmass[i];
          v[i][0] = dtfm * f[i][0];
          v[i][1] = dtfm * f[i][1];
          v[i][2] = dtfm * f[i][2];
        }
      } else {
        for (int i = 0; i < nlocal; i++) {
          dtfm = dtf / mass[type[i]];
          v[i][0] = dtfm * f[i][0];
          v[i][1] = dtfm * f[i][1];
          v[i][2] = dtfm * f[i][2];
        }
      }
    }

    // limit timestep so no particle moves further than dmax
@@ -281,6 +308,13 @@ int MinFire::iterate(int maxiter)

    MPI_Allreduce(&dtvone,&dtv,1,MPI_DOUBLE,MPI_MIN,world);

    // reset velocities when necessary

    if (flagv0) {
      for (int i = 0; i < nlocal; i++)
        v[i][0] = v[i][1] = v[i][2] = 0.0;
    }
    
    // min dtv over replicas, if necessary
    // this communicator would be invalid for multiprocess replicas

@@ -438,6 +472,10 @@ int MinFire::iterate(int maxiter)
      neval++;
    }

    // velocities have been evaluated

    flagv0 = 0;

    // energy tolerance criterion
    // only check after delaystep elapsed since velocties reset to 0
    // sync across replicas if running multi-replica minimization
+1 −1
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ class MinFire : public Min {
  double dt,dtmax,dtmin;
  double alpha;
  bigint last_negative,ntimestep_start;
  int vdotf_negatif;
  int vdotf_negatif,flagv0;
};

}