Commit 86422df6 authored by athomps's avatar athomps
Browse files

Added potential gradient columns

git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@5117 f3b2605a-c512-4ea7-a41b-209d697bcdaa
parent 3d4e086b
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -168,6 +168,17 @@ void FixNEB::min_post_force(int vflag)

  pe->addstep(update->ntimestep+1);

  // Compute norm of GradV for log output

  double **f = atom->f;
  double fsq = 0.0;
  for (int i = 0; i < nlocal; i++) {
    fsq += f[i][0]*f[i][0]+f[i][1]*f[i][1]+f[i][2]*f[i][2];
  }

  MPI_Allreduce(&fsq,&gradvnorm,1,MPI_DOUBLE,MPI_MAX,world);
  gradvnorm = sqrt(gradvnorm);

  // if this is first or last replica, no change to forces, just return

  if (ireplica == 0 || ireplica == nreplica-1) {
@@ -274,13 +285,12 @@ void FixNEB::min_post_force(int vflag)
  // see Henkelman & Jonsson 2000 paper, eqs 3,4,12
  // see Henkelman & Jonsson 2000a paper, eq 5

  double **f = atom->f;

  double dot = 0.0;
  for (int i = 0; i < nlocal; i++)
  for (int i = 0; i < nlocal; i++) {
    if (mask[i] & groupbit)
      dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + 
	f[i][2]*tangent[i][2];
  }

  double prefactor;
  if (ireplica == rclimber) prefactor = -2.0*dot;
+1 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ class FixNEB : public Fix {
 public:
  double veng,plen,nlen;
  int rclimber;
  double gradvnorm;

  FixNEB(class LAMMPS *, int, char **);
  ~FixNEB();
+39 −1
Original line number Diff line number Diff line
@@ -138,9 +138,11 @@ void NEB::command(int narg, char **arg)
  if (me_universe == 0) {
    if (universe->uscreen)
      fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce "
	      "GradV0 GradV1 GradVc "
	      "RD1 PE1 RD2 PE2 ... RDN PEN\n");
    if (universe->ulogfile)
      fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce "
	      "GradV0 GradV1 GradVc "
	      "RD1 PE1 RD2 PE2 ... RDN PEN\n");
  }
  print_status();
@@ -203,9 +205,11 @@ void NEB::command(int narg, char **arg)
  if (me_universe == 0) {
    if (universe->uscreen)
      fprintf(universe->uscreen,"Step MaxReplicaForce MaxAtomForce "
	      "GradV0 GradV1 GradVc "
	      "RD1 PE1 RD2 PE2 ... RDN PEN\n");
    if (universe->ulogfile)
      fprintf(universe->ulogfile,"Step MaxReplicaForce MaxAtomForce "
	      "GradV0 GradV1 GradVc "
	      "RD1 PE1 RD2 PE2 ... RDN PEN\n");
  }
  print_status();
@@ -382,10 +386,42 @@ void NEB::print_status()
  for (int i = 1; i < nreplica; i++)
    rdist[i] /= endpt;

  // look up GradV for the initial, final, and climbing replicas
  // These are identical to fnorm2, but better to be safe we
  // take them straight from fix_neb

  double gradvnorm0, gradvnorm1, gradvnormc;

  int irep;
  irep = 0;
  if (me_universe == irep) gradvnorm0 = fneb->gradvnorm;
  MPI_Bcast(&gradvnorm0,1,MPI_DOUBLE,irep,uworld);
  irep = nreplica-1;
  if (me_universe == irep) gradvnorm1 = fneb->gradvnorm;
  MPI_Bcast(&gradvnorm1,1,MPI_DOUBLE,irep,uworld);
  irep = fneb->rclimber;
  if (irep > -1) {
    if (me_universe == irep) gradvnormc = fneb->gradvnorm;
    MPI_Bcast(&gradvnormc,1,MPI_DOUBLE,irep,uworld);
  } else {
    double vmax = all[0][0];
    int top = 0;
    for (int m = 1; m < nreplica; m++)
      if (vmax < all[m][0]) {
	vmax = all[m][0];
	top = m;
      }
    irep = top;
    if (me_universe == irep) gradvnormc = fneb->gradvnorm;
    MPI_Bcast(&gradvnormc,1,MPI_DOUBLE,irep,uworld);
  }

  if (me_universe == 0) {
    if (universe->uscreen) {
      fprintf(universe->uscreen,"%d %g %g ",update->ntimestep,
	      fmaxreplica,fmaxatom);
      fprintf(universe->uscreen,"%g %g %g ",
	      gradvnorm0,gradvnorm1,gradvnormc);
      for (int i = 0; i < nreplica; i++) 
	fprintf(universe->uscreen,"%g %g ",rdist[i],all[i][0]);
      fprintf(universe->uscreen,"\n");
@@ -393,6 +429,8 @@ void NEB::print_status()
    if (universe->ulogfile) {
      fprintf(universe->ulogfile,"%d %g %g ",update->ntimestep,
	      fmaxreplica,fmaxatom);
      fprintf(universe->ulogfile,"%g %g %g ",
	      gradvnorm0,gradvnorm1,gradvnormc);
      for (int i = 0; i < nreplica; i++)
	fprintf(universe->ulogfile,"%g %g ",rdist[i],all[i][0]);
      fprintf(universe->ulogfile,"\n");