Commit 022dd4a4 authored by Julien Guénolé's avatar Julien Guénolé
Browse files

special v evaluation to limite dtv each time v is zeroed

parent 27fdbfa8
Loading
Loading
Loading
Loading
+38 −13
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;
}

/* ----------------------------------------------------------------------
@@ -146,18 +147,6 @@ int MinFire::iterate(int maxiter)
        v[i][2] = dtfm * f[i][2];
      }
    }
    // limit timestep so no particle moves further than dmax

    dtvone = dt;

    for (int i = 0; i < nlocal; i++) {
      vmax = MAX(fabs(v[i][0]),fabs(v[i][1]));
      vmax = MAX(vmax,fabs(v[i][2]));
      if (dtvone*vmax > dmax) dtvone = dmax/vmax;
    }

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

  }

  for (int iter = 0; iter < maxiter; iter++) {
@@ -279,6 +268,31 @@ int MinFire::iterate(int maxiter)

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

    // 1st iter: evauates velocity
    // required to limit timestep in case of particles
    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
@@ -293,6 +307,13 @@ int MinFire::iterate(int maxiter)

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

    // 1st iter: velocities reset to 0

    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

@@ -450,6 +471,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;
};

}