Commit 885c0bbd authored by Julien Guénolé's avatar Julien Guénolé
Browse files

work-in-progress version of adaptglok

parent 0be11eb8
Loading
Loading
Loading
Loading

.vscode/settings.json

0 → 100644
+6 −0
Changes for .vscode/settings.json: 6 added lines, 0 removed lines.
Original line number Diff line number Diff line
{
    "files.associations": {
        "cmath": "cpp",
        "complex": "cpp"
    }
}
 No newline at end of file
+54 −17
Changes for src/min_adaptglok.cpp: 54 added lines, 17 removed lines.
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ using namespace LAMMPS_NS;
#define ALPHA0 0.25
#define ALPHA_SHRINK 0.99
#define TMAX 2.0
#define TMIN 0.02           // as harcoded in IMD: 1/50


/* ---------------------------------------------------------------------- */
@@ -46,9 +47,15 @@ void MinAdaptGlok::init()
  Min::init();

  dt = update->dt;

  // GUENOLE - save the global timestep
  dtdef = dt;

  dtmax = TMAX * dt;
  dtmin = TMIN * dt;
  alpha = ALPHA0;
  last_negative = update->ntimestep;
  ntimestep_start = update->ntimestep;
}

/* ---------------------------------------------------------------------- */
@@ -101,6 +108,9 @@ int MinAdaptGlok::iterate(int maxiter)
    double **v = atom->v;
    double **f = atom->f;
    int nlocal = atom->nlocal;
    double *rmass = atom->rmass;
    double *mass = atom->mass;
    int *type = atom->type;

    vdotf = 0.0;
    for (int i = 0; i < nlocal; i++)
@@ -149,13 +159,13 @@ int MinAdaptGlok::iterate(int maxiter)
      }

      scale1 = 1.0 - alpha;
      if (fdotfall == 0.0) scale2 = 0.0;
      if (fdotfall == 0.0) scale2 = alpha;
      else scale2 = alpha * sqrt(vdotvall/fdotfall);
      for (int i = 0; i < nlocal; i++) {
        v[i][0] = scale1*v[i][0] + scale2*f[i][0];
        v[i][1] = scale1*v[i][1] + scale2*f[i][1];
        v[i][2] = scale1*v[i][2] + scale2*f[i][2];
      }
      //for (int i = 0; i < nlocal; i++) {
      //  v[i][0] = scale1*v[i][0] + scale2*f[i][0];
       // v[i][1] = scale1*v[i][1] + scale2*f[i][1];
      //  v[i][2] = scale1*v[i][2] + scale2*f[i][2];
      //}

      if (ntimestep - last_negative > DELAYSTEP) {
        dt = MIN(dt*DT_GROW,dtmax);
@@ -167,31 +177,38 @@ int MinAdaptGlok::iterate(int maxiter)

    } else {
      // Limit decrease of timestep
      if (ntimestep - last_negative > DELAYSTEP) {
      if (ntimestep - ntimestep_start > DELAYSTEP) {
        if (dt > dtmin) dt *= DT_SHRINK;
        alpha = ALPHA0;
        if (dt > dtmax / 50.0) {
          dt *= DT_SHRINK;
        }
      }
      last_negative = ntimestep;
      double **x = atom->x;
      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];
      }
      for (int i = 0; i < nlocal; i++)
        v[i][0] = v[i][1] = v[i][2] = 0.0;
    }

    // limit timestep so no particle moves further than dmax

    double *rmass = atom->rmass;
    double *mass = atom->mass;
    int *type = atom->type;

    dtvone = dt;

    ke = 0.0;
    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;
      ke += mass[type[i]] *
      (v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]);
    }
    MPI_Allreduce(&dtvone,&dtv,1,MPI_DOUBLE,MPI_MIN,world);
    MPI_Allreduce(&ke,&keall,1,MPI_DOUBLE,MPI_SUM,world);

    fprintf(screen,"vdotfall %f %f\n",vdotfall,keall);

    // min dtv over replicas, if necessary
    // this communicator would be invalid for multiprocess replicas
@@ -220,12 +237,19 @@ int MinAdaptGlok::iterate(int maxiter)
    } else {
        for (int i = 0; i < nlocal; i++) {
          dtfm = dtf / mass[type[i]];
        x[i][0] += dtv * v[i][0];
        x[i][1] += dtv * v[i][1];
        x[i][2] += dtv * v[i][2];
          //fprintf(screen,"mass %f\n",mass[type[i]]);
          v[i][0] += dtfm * f[i][0];
          v[i][1] += dtfm * f[i][1];
          v[i][2] += dtfm * f[i][2];
          if (vdotfall > 0.0) {
            // we perform the mixing AFTER the timeintegration
            v[i][0] = scale1*v[i][0] + scale2*f[i][0];
            v[i][1] = scale1*v[i][1] + scale2*f[i][1];
            v[i][2] = scale1*v[i][2] + scale2*f[i][2];
          }
          x[i][0] += dtv * v[i][0];
          x[i][1] += dtv * v[i][1];
          x[i][2] += dtv * v[i][2];
        }
    }

@@ -258,7 +282,13 @@ int MinAdaptGlok::iterate(int maxiter)
    if (update->ftol > 0.0) {
      fdotf = fnorm_sqr();
      if (update->multireplica == 0) {
        if (fdotf < update->ftol*update->ftol) return FTOL;
        if (fdotf < update->ftol*update->ftol) {
          
          // GUENOLE - reset the global timestep to the default value
          //update->dt = dtdef;

          return FTOL;
        }
      } else {
        if (fdotf < update->ftol*update->ftol) flag = 0;
        else flag = 1;
@@ -270,11 +300,18 @@ int MinAdaptGlok::iterate(int maxiter)
    // output for thermo, dump, restart files

    if (output->next == ntimestep) {
      
      // GUENOLE - update of the global timestep for thermo output
      update->dt = dt;

      timer->stamp();
      output->write(ntimestep);
      timer->stamp(Timer::OUTPUT);
    }
  }

  // GUENOLE - reset the global timestep to the default value
  //update->dt = dtdef;

  return MAXITER;
}
+2 −2
Changes for src/min_adaptglok.h: 2 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -34,9 +34,9 @@ class MinAdaptGlok : public Min {
  int iterate(int);

 private:
  double dt,dtmax;
  double dt,dtmax,dtmin,dtdef,ke,keall;
  double alpha;
  bigint last_negative;
  bigint last_negative,ntimestep_start;
};

}

test/fdotfall.txt

0 → 100644
+616 −0
Changes for test/fdotfall.txt: 616 added lines, 0 removed lines.
Original line number Diff line number Diff line
0.000000
0.000000
0.000010
0.000010
0.000010
0.000010
0.000010
0.000010
0.000009
0.000009
0.000009
0.000009
0.000009
0.000009
0.000009
0.000009
0.000008
0.000008
0.000008
0.000008
0.000008
0.000008
0.000007
0.000007
0.000007
0.000007
0.000006
0.000006
0.000006
0.000006
0.000006
0.000006
0.000005
0.000005
0.000005
0.000005
0.000005
0.000005
0.000004
0.000004
0.000004
0.000004
0.000004
0.000004
0.000004
0.000004
0.000004
0.000004
0.000003
0.000003
0.000003
0.000003
0.000003
0.000003
0.000003
0.000003
0.000003
0.000003
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000002
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000001
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000

test/lmp_mpi

0 → 100755
+22.2 MiB

File added.

No diff preview for this file type.

Loading