From 588cce7e7e7b280f6f93b401a46626db83ba0799 Mon Sep 17 00:00:00 2001 From: alxvov Date: Thu, 27 Jun 2019 09:30:10 +0000 Subject: [PATCH 001/418] add min_spin_oso (just a copy of min_spin) --- src/min_spin_oso.cpp | 333 +++++++++++++++++++++++++++++++++++++++++++ src/min_spin_oso.h | 59 ++++++++ 2 files changed, 392 insertions(+) create mode 100644 src/min_spin_oso.cpp create mode 100644 src/min_spin_oso.h diff --git a/src/min_spin_oso.cpp b/src/min_spin_oso.cpp new file mode 100644 index 0000000000..a97d7b40a1 --- /dev/null +++ b/src/min_spin_oso.cpp @@ -0,0 +1,333 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------------ + Contributing authors: Julien Tranchida (SNL) + + Please cite the related publication: +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "min_spin_oso.h" +#include "universe.h" +#include "atom.h" +#include "force.h" +#include "update.h" +#include "output.h" +#include "timer.h" +#include "error.h" +#include "modify.h" +#include "math_special.h" +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +// EPS_ENERGY = minimum normalization for energy tolerance + +#define EPS_ENERGY 1.0e-8 + +#define DELAYSTEP 5 + +/* ---------------------------------------------------------------------- */ + +MinSpinOSO::MinSpinOSO(LAMMPS *lmp) : Min(lmp) {} + +/* ---------------------------------------------------------------------- */ + +void MinSpinOSO::init() +{ + alpha_damp = 1.0; + discrete_factor = 10.0; + + Min::init(); + + dts = dt = update->dt; + last_negative = update->ntimestep; +} + +/* ---------------------------------------------------------------------- */ + +void MinSpinOSO::setup_style() +{ + double **v = atom->v; + int nlocal = atom->nlocal; + + // check if the atom/spin style is defined + + if (!atom->sp_flag) + error->all(FLERR,"min/spin_oso requires atom/spin style"); + + for (int i = 0; i < nlocal; i++) + v[i][0] = v[i][1] = v[i][2] = 0.0; +} + +/* ---------------------------------------------------------------------- */ + +int MinSpinOSO::modify_param(int narg, char **arg) +{ + if (strcmp(arg[0],"alpha_damp") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + alpha_damp = force->numeric(FLERR,arg[1]); + return 2; + } + if (strcmp(arg[0],"discrete_factor") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + discrete_factor = force->numeric(FLERR,arg[1]); + return 2; + } + return 0; +} + +/* ---------------------------------------------------------------------- + set current vector lengths and pointers + called after atoms have migrated +------------------------------------------------------------------------- */ + +void MinSpinOSO::reset_vectors() +{ + // atomic dof + + // size sp is 4N vector + nvec = 4 * atom->nlocal; + if (nvec) spvec = atom->sp[0]; + + nvec = 3 * atom->nlocal; + if (nvec) fmvec = atom->fm[0]; + + if (nvec) xvec = atom->x[0]; + if (nvec) fvec = atom->f[0]; +} + +/* ---------------------------------------------------------------------- + minimization via damped spin dynamics +------------------------------------------------------------------------- */ + +int MinSpinOSO::iterate(int maxiter) +{ + bigint ntimestep; + double fmdotfm; + int flag, flagall; + + for (int iter = 0; iter < maxiter; iter++) { + + if (timer->check_timeout(niter)) + return TIMEOUT; + + ntimestep = ++update->ntimestep; + niter++; + + // optimize timestep accross processes / replicas + // need a force calculation for timestep optimization + + energy_force(0); + dts = evaluate_dt(); + + // apply damped precessional dynamics to the spins + + advance_spins(dts); + + eprevious = ecurrent; + ecurrent = energy_force(0); + neval++; + + //// energy tolerance criterion + //// only check after DELAYSTEP elapsed since velocties reset to 0 + //// sync across replicas if running multi-replica minimization + + if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { + if (update->multireplica == 0) { + if (fabs(ecurrent-eprevious) < + update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) + return ETOL; + } else { + if (fabs(ecurrent-eprevious) < + update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) + flag = 0; + else flag = 1; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); + if (flagall == 0) return ETOL; + } + } + + // magnetic torque tolerance criterion + // sync across replicas if running multi-replica minimization + + if (update->ftol > 0.0) { + fmdotfm = fmnorm_sqr(); + if (update->multireplica == 0) { + if (fmdotfm < update->ftol*update->ftol) return FTOL; + } else { + if (fmdotfm < update->ftol*update->ftol) flag = 0; + else flag = 1; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); + if (flagall == 0) return FTOL; + } + } + + // output for thermo, dump, restart files + + if (output->next == ntimestep) { + timer->stamp(); + output->write(ntimestep); + timer->stamp(Timer::OUTPUT); + } + } + + return MAXITER; +} + +/* ---------------------------------------------------------------------- + evaluate max timestep +---------------------------------------------------------------------- */ + +double MinSpinOSO::evaluate_dt() +{ + double dtmax; + double fmsq; + double fmaxsqone,fmaxsqloc,fmaxsqall; + int nlocal = atom->nlocal; + double **fm = atom->fm; + + // finding max fm on this proc. + + fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; + for (int i = 0; i < nlocal; i++) { + fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; + fmaxsqone = MAX(fmaxsqone,fmsq); + } + + // finding max fm on this replica + + fmaxsqloc = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); + + // finding max fm over all replicas, if necessary + // this communicator would be invalid for multiprocess replicas + + fmaxsqall = fmaxsqloc; + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + if (fmaxsqall == 0.0) + error->all(FLERR,"Incorrect fmaxsqall calculation"); + + // define max timestep by dividing by the + // inverse of max frequency by discrete_factor + + dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); + + return dtmax; +} + +/* ---------------------------------------------------------------------- + geometric damped advance of spins +---------------------------------------------------------------------- */ + +void MinSpinOSO::advance_spins(double dts) +{ + int nlocal = atom->nlocal; + double **sp = atom->sp; + double **fm = atom->fm; + double tdampx,tdampy,tdampz; + double msq, scale, fm2, energy, dts2; + double cp[3], g[3]; + + dts2 = dts*dts; + + // loop on all spins on proc. + + for (int i = 0; i < nlocal; i++) { + + // calc. damping torque + + tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + + // apply advance algorithm (geometric, norm preserving) + + fm2 = (tdampx*tdampx+tdampy*tdampy+tdampz*tdampz); + energy = (sp[i][0]*tdampx)+(sp[i][1]*tdampy)+(sp[i][2]*tdampz); + + cp[0] = tdampy*sp[i][2]-tdampz*sp[i][1]; + cp[1] = tdampz*sp[i][0]-tdampx*sp[i][2]; + cp[2] = tdampx*sp[i][1]-tdampy*sp[i][0]; + + g[0] = sp[i][0]+cp[0]*dts; + g[1] = sp[i][1]+cp[1]*dts; + g[2] = sp[i][2]+cp[2]*dts; + + g[0] += (tdampx*energy-0.5*sp[i][0]*fm2)*0.5*dts2; + g[1] += (tdampy*energy-0.5*sp[i][1]*fm2)*0.5*dts2; + g[2] += (tdampz*energy-0.5*sp[i][2]*fm2)*0.5*dts2; + + g[0] /= (1+0.25*fm2*dts2); + g[1] /= (1+0.25*fm2*dts2); + g[2] /= (1+0.25*fm2*dts2); + + sp[i][0] = g[0]; + sp[i][1] = g[1]; + sp[i][2] = g[2]; + + // renormalization (check if necessary) + + msq = g[0]*g[0] + g[1]*g[1] + g[2]*g[2]; + scale = 1.0/sqrt(msq); + sp[i][0] *= scale; + sp[i][1] *= scale; + sp[i][2] *= scale; + + // no comm. to atoms with same tag + // because no need for simplecticity + } +} + +/* ---------------------------------------------------------------------- + compute and return ||mag. torque||_2^2 +------------------------------------------------------------------------- */ + +double MinSpinOSO::fmnorm_sqr() +{ + int nlocal = atom->nlocal; + double tx,ty,tz; + double **sp = atom->sp; + double **fm = atom->fm; + + // calc. magnetic torques + + double local_norm2_sqr = 0.0; + for (int i = 0; i < nlocal; i++) { + tx = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + ty = (fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tz = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + + local_norm2_sqr += tx*tx + ty*ty + tz*tz; + } + + // no extra atom calc. for spins + + if (nextra_atom) + error->all(FLERR,"extra atom option not available yet"); + + double norm2_sqr = 0.0; + MPI_Allreduce(&local_norm2_sqr,&norm2_sqr,1,MPI_DOUBLE,MPI_SUM,world); + + return norm2_sqr; +} + diff --git a/src/min_spin_oso.h b/src/min_spin_oso.h new file mode 100644 index 0000000000..81ad812e5c --- /dev/null +++ b/src/min_spin_oso.h @@ -0,0 +1,59 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef MINIMIZE_CLASS + +MinimizeStyle(spin_oso, MinSpinOSO) + +#else + +#ifndef LMP_MIN_SPIN_OSO_H +#define LMP_MIN_SPIN_OSO_H + +#include "min.h" + +namespace LAMMPS_NS { + +class MinSpinOSO : public Min { + public: + MinSpinOSO(class LAMMPS *); //? + ~MinSpinOSO() {} //? + void init(); + void setup_style(); + int modify_param(int, char **); + void reset_vectors(); + int iterate(int); + double evaluate_dt(); + void advance_spins(double); + double fmnorm_sqr(); + + private: + + // global and spin timesteps + + double dt; + double dts; + + double alpha_damp; // damping for spin minimization + double discrete_factor; // factor for spin timestep evaluation + + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + + bigint last_negative; +}; + +} + +#endif +#endif From 1eb83136c4a86ad8d65e1d46284d8dc69a4a7858 Mon Sep 17 00:00:00 2001 From: alxvov Date: Thu, 27 Jun 2019 10:59:15 +0000 Subject: [PATCH 002/418] add gradient descent with rotation matrices with adaptive time step (as before) --- src/min_spin_oso.cpp | 149 ++++++++++++++++++++++++++++++------------- 1 file changed, 105 insertions(+), 44 deletions(-) diff --git a/src/min_spin_oso.cpp b/src/min_spin_oso.cpp index a97d7b40a1..c20096ae1c 100644 --- a/src/min_spin_oso.cpp +++ b/src/min_spin_oso.cpp @@ -42,6 +42,9 @@ using namespace MathConst; #define DELAYSTEP 5 +void vm3(const double *m, const double *v, double *out); +void rodrigues_rotation(const double *upp_tr, double *out); + /* ---------------------------------------------------------------------- */ MinSpinOSO::MinSpinOSO(LAMMPS *lmp) : Min(lmp) {} @@ -244,58 +247,33 @@ void MinSpinOSO::advance_spins(double dts) int nlocal = atom->nlocal; double **sp = atom->sp; double **fm = atom->fm; - double tdampx,tdampy,tdampz; - double msq, scale, fm2, energy, dts2; - double cp[3], g[3]; - - dts2 = dts*dts; + double tdampx, tdampy, tdampz; + double f[3]; // upper triag. part of skew-symm. matr. to be exponented + double rot_mat[9]; // exponential of a + double s_new[3]; // loop on all spins on proc. for (int i = 0; i < nlocal; i++) { - // calc. damping torque + // calc. damping torque + tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + // calculate rotation matrix + f[0] = tdampz * dts; + f[1] = -tdampy * dts; + f[2] = tdampx * dts; + rodrigues_rotation(f, rot_mat); - // apply advance algorithm (geometric, norm preserving) - - fm2 = (tdampx*tdampx+tdampy*tdampy+tdampz*tdampz); - energy = (sp[i][0]*tdampx)+(sp[i][1]*tdampy)+(sp[i][2]*tdampz); - - cp[0] = tdampy*sp[i][2]-tdampz*sp[i][1]; - cp[1] = tdampz*sp[i][0]-tdampx*sp[i][2]; - cp[2] = tdampx*sp[i][1]-tdampy*sp[i][0]; - - g[0] = sp[i][0]+cp[0]*dts; - g[1] = sp[i][1]+cp[1]*dts; - g[2] = sp[i][2]+cp[2]*dts; - - g[0] += (tdampx*energy-0.5*sp[i][0]*fm2)*0.5*dts2; - g[1] += (tdampy*energy-0.5*sp[i][1]*fm2)*0.5*dts2; - g[2] += (tdampz*energy-0.5*sp[i][2]*fm2)*0.5*dts2; - - g[0] /= (1+0.25*fm2*dts2); - g[1] /= (1+0.25*fm2*dts2); - g[2] /= (1+0.25*fm2*dts2); - - sp[i][0] = g[0]; - sp[i][1] = g[1]; - sp[i][2] = g[2]; - - // renormalization (check if necessary) - - msq = g[0]*g[0] + g[1]*g[1] + g[2]*g[2]; - scale = 1.0/sqrt(msq); - sp[i][0] *= scale; - sp[i][1] *= scale; - sp[i][2] *= scale; - - // no comm. to atoms with same tag - // because no need for simplecticity + // rotate spins + vm3(rot_mat, sp[i], s_new); + sp[i][0] = s_new[0]; + sp[i][1] = s_new[1]; + sp[i][2] = s_new[2]; } + } /* ---------------------------------------------------------------------- @@ -331,3 +309,86 @@ double MinSpinOSO::fmnorm_sqr() return norm2_sqr; } + +void rodrigues_rotation(const double *upp_tr, double *out){ + + /*** + * calculate 3x3 matrix exponential using Rodrigues' formula + * (R. Murray, Z. Li, and S. Shankar Sastry, + * A Mathematical Introduction to + * Robotic Manipulation (1994), p. 28 and 30). + * + * upp_tr - vector x, y, z so that one calculate + * U = exp(A) with A= [[0, x, y], + * [-x, 0, z], + * [-y, -z, 0]] + ***/ + + + if (fabs(upp_tr[0]) < 1.0e-40 && + fabs(upp_tr[1]) < 1.0e-40 && + fabs(upp_tr[2]) < 1.0e-40){ + // if upp_tr is zero, return unity matrix + int k; + int m; + for(k = 0; k < 3; k++){ + for(m = 0; m < 3; m++){ + if (m == k) out[3 * k + m] = 1.0; + else out[3 * k + m] = 0.0; + } + } + return; + } + + double theta = sqrt(upp_tr[0] * upp_tr[0] + + upp_tr[1] * upp_tr[1] + + upp_tr[2] * upp_tr[2]); + + double A = cos(theta); + double B = sin(theta); + double D = 1 - A; + double x = upp_tr[0]/theta; + double y = upp_tr[1]/theta; + double z = upp_tr[2]/theta; + + // diagonal elements of U + out[0] = A + z * z * D; + out[4] = A + y * y * D; + out[8] = A + x * x * D; + + // off diagonal of U + double s1 = -y * z *D; + double s2 = x * z * D; + double s3 = -x * y * D; + + double a1 = x * B; + double a2 = y * B; + double a3 = z * B; + + out[1] = s1 + a1; + out[3] = s1 - a1; + out[2] = s2 + a2; + out[6] = s2 - a2; + out[5] = s3 + a3; + out[7] = s3 - a3; + +} + + +void vm3(const double *m, const double *v, double *out){ + /*** + * out = vector^T x m, + * m -- 3x3 matrix , v -- 3-d vector + ***/ + + int i; + int j; + + for(i = 0; i < 3; i++){ + out[i] *= 0.0; + for(j = 0; j < 3; j++){ + out[i] += *(m + 3 * j + i) * v[j]; + } + } + +} From f7ddf433ef03dc94fcf5e5e50a3d61018abe8e06 Mon Sep 17 00:00:00 2001 From: alxvov Date: Thu, 27 Jun 2019 13:14:27 +0000 Subject: [PATCH 003/418] modify comment --- src/min_spin_oso.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/min_spin_oso.cpp b/src/min_spin_oso.cpp index c20096ae1c..d26a7ffc39 100644 --- a/src/min_spin_oso.cpp +++ b/src/min_spin_oso.cpp @@ -239,7 +239,7 @@ double MinSpinOSO::evaluate_dt() } /* ---------------------------------------------------------------------- - geometric damped advance of spins + rotation of spins along the search direction ---------------------------------------------------------------------- */ void MinSpinOSO::advance_spins(double dts) From 56e1032c1d0fcb7d47e8c46a5aed9e4feef5af7f Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 27 Jun 2019 17:50:45 +0200 Subject: [PATCH 004/418] Update gcmc to have a max and min --- src/MC/fix_gcmc.cpp | 24 ++++++++++++++++++++---- src/MC/fix_gcmc.h | 2 ++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index 7ab0879335..5cf655b1de 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -391,6 +391,14 @@ void FixGCMC::options(int narg, char **arg) overlap_cutoffsq = rtmp*rtmp; overlap_flag = 1; iarg += 2; + } else if (strcmp(arg[iarg],"min") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix gcmc command"); + min_ngas = force->numeric(FLERR,arg[iarg+1]); + iarg += 2; + } else if (strcmp(arg[iarg],"max") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix gcmc command"); + max_ngas = force->numeric(FLERR,arg[iarg+1]); + iarg += 2; } else error->all(FLERR,"Illegal fix gcmc command"); } } @@ -897,7 +905,7 @@ void FixGCMC::attempt_atomic_deletion() { ndeletion_attempts += 1.0; - if (ngas == 0) return; + if (ngas == 0 || ngas == min_ngas) return; int i = pick_random_gas_atom(); @@ -938,6 +946,8 @@ void FixGCMC::attempt_atomic_insertion() ninsertion_attempts += 1.0; + if (ngas == max_ngas) return; + // pick coordinates for insertion point double coord[3]; @@ -1252,7 +1262,7 @@ void FixGCMC::attempt_molecule_deletion() { ndeletion_attempts += 1.0; - if (ngas == 0) return; + if (ngas == 0 || ngas == min_ngas) return; // work-around to avoid n=0 problem with fix rigid/nvt/small @@ -1291,6 +1301,8 @@ void FixGCMC::attempt_molecule_insertion() double lamda[3]; ninsertion_attempts += 1.0; + if (ngas == max_ngas) return; + double com_coord[3]; if (regionflag) { int region_attempt = 0; @@ -1574,7 +1586,7 @@ void FixGCMC::attempt_atomic_deletion_full() ndeletion_attempts += 1.0; - if (ngas == 0) return; + if (ngas == 0 || ngas == min_ngas) return; double energy_before = energy_stored; @@ -1623,6 +1635,8 @@ void FixGCMC::attempt_atomic_insertion_full() double lamda[3]; ninsertion_attempts += 1.0; + if (ngas == max_ngas) return; + double energy_before = energy_stored; double coord[3]; @@ -1918,7 +1932,7 @@ void FixGCMC::attempt_molecule_deletion_full() { ndeletion_attempts += 1.0; - if (ngas == 0) return; + if (ngas == 0 || ngas == min_ngas) return; // work-around to avoid n=0 problem with fix rigid/nvt/small @@ -2001,6 +2015,8 @@ void FixGCMC::attempt_molecule_insertion_full() double lamda[3]; ninsertion_attempts += 1.0; + if (ngas == max_ngas) return; + double energy_before = energy_stored; tagint maxmol = 0; diff --git a/src/MC/fix_gcmc.h b/src/MC/fix_gcmc.h index 5d0b7aab8f..e19a42ef73 100644 --- a/src/MC/fix_gcmc.h +++ b/src/MC/fix_gcmc.h @@ -120,6 +120,8 @@ class FixGCMC : public Fix { imageint imagezero; double overlap_cutoffsq; // square distance cutoff for overlap int overlap_flag; + int max_ngas; + int min_ngas; double energy_intra; From 589d0e2a6a53c760937b2b9b19c28f41c90db341 Mon Sep 17 00:00:00 2001 From: alxvov Date: Thu, 27 Jun 2019 16:26:24 +0000 Subject: [PATCH 005/418] add conjugate gradients with OSO --- .../min_spin_oso_cg.cpp} | 148 +++++++++++++----- src/SPIN/min_spin_oso_cg.h | 65 ++++++++ src/min_spin_oso.h | 59 ------- 3 files changed, 177 insertions(+), 95 deletions(-) rename src/{min_spin_oso.cpp => SPIN/min_spin_oso_cg.cpp} (72%) create mode 100644 src/SPIN/min_spin_oso_cg.h delete mode 100644 src/min_spin_oso.h diff --git a/src/min_spin_oso.cpp b/src/SPIN/min_spin_oso_cg.cpp similarity index 72% rename from src/min_spin_oso.cpp rename to src/SPIN/min_spin_oso_cg.cpp index d26a7ffc39..9f43442e27 100644 --- a/src/min_spin_oso.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -21,7 +21,7 @@ #include #include #include -#include "min_spin_oso.h" +#include "min_spin_oso_cg.h" #include "universe.h" #include "atom.h" #include "force.h" @@ -47,24 +47,24 @@ void rodrigues_rotation(const double *upp_tr, double *out); /* ---------------------------------------------------------------------- */ -MinSpinOSO::MinSpinOSO(LAMMPS *lmp) : Min(lmp) {} +MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : Min(lmp) {} /* ---------------------------------------------------------------------- */ -void MinSpinOSO::init() +void MinSpinOSO_CG::init() { - alpha_damp = 1.0; - discrete_factor = 10.0; + alpha_damp = 1.0; + discrete_factor = 10.0; - Min::init(); + Min::init(); - dts = dt = update->dt; - last_negative = update->ntimestep; + dts = dt = update->dt; + last_negative = update->ntimestep; } /* ---------------------------------------------------------------------- */ -void MinSpinOSO::setup_style() +void MinSpinOSO_CG::setup_style() { double **v = atom->v; int nlocal = atom->nlocal; @@ -72,7 +72,7 @@ void MinSpinOSO::setup_style() // check if the atom/spin style is defined if (!atom->sp_flag) - error->all(FLERR,"min/spin_oso requires atom/spin style"); + error->all(FLERR,"min/spin_oso_cg requires atom/spin style"); for (int i = 0; i < nlocal; i++) v[i][0] = v[i][1] = v[i][2] = 0.0; @@ -80,7 +80,7 @@ void MinSpinOSO::setup_style() /* ---------------------------------------------------------------------- */ -int MinSpinOSO::modify_param(int narg, char **arg) +int MinSpinOSO_CG::modify_param(int narg, char **arg) { if (strcmp(arg[0],"alpha_damp") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); @@ -100,7 +100,7 @@ int MinSpinOSO::modify_param(int narg, char **arg) called after atoms have migrated ------------------------------------------------------------------------- */ -void MinSpinOSO::reset_vectors() +void MinSpinOSO_CG::reset_vectors() { // atomic dof @@ -119,13 +119,19 @@ void MinSpinOSO::reset_vectors() minimization via damped spin dynamics ------------------------------------------------------------------------- */ -int MinSpinOSO::iterate(int maxiter) +int MinSpinOSO_CG::iterate(int maxiter) { - bigint ntimestep; - double fmdotfm; - int flag, flagall; + bigint ntimestep; + double fmdotfm; + int flag, flagall; - for (int iter = 0; iter < maxiter; iter++) { + // not sure it is best place to allocate memory + int nlocal = atom->nlocal; + g = (double *) calloc(3*nlocal, sizeof(double)); + p = (double *) calloc(3*nlocal, sizeof(double)); + g_old = (double *) calloc(3*nlocal, sizeof(double)); + + for (int iter = 0; iter < maxiter; iter++) { if (timer->check_timeout(niter)) return TIMEOUT; @@ -139,9 +145,9 @@ int MinSpinOSO::iterate(int maxiter) energy_force(0); dts = evaluate_dt(); - // apply damped precessional dynamics to the spins - - advance_spins(dts); + calc_gradients(dts); + calc_search_direction(iter); + advance_spins(); eprevious = ecurrent; ecurrent = energy_force(0); @@ -190,6 +196,10 @@ int MinSpinOSO::iterate(int maxiter) } } + free(p); + free(g); + free(g_old); + return MAXITER; } @@ -197,7 +207,7 @@ int MinSpinOSO::iterate(int maxiter) evaluate max timestep ---------------------------------------------------------------------- */ -double MinSpinOSO::evaluate_dt() +double MinSpinOSO_CG::evaluate_dt() { double dtmax; double fmsq; @@ -238,35 +248,101 @@ double MinSpinOSO::evaluate_dt() return dtmax; } +/* ---------------------------------------------------------------------- + calculate gradients +---------------------------------------------------------------------- */ + +void MinSpinOSO_CG::calc_gradients(double dts) +{ + int nlocal = atom->nlocal; + double **sp = atom->sp; + double **fm = atom->fm; + double tdampx, tdampy, tdampz; + // loop on all spins on proc. + + for (int i = 0; i < nlocal; i++) { + + // calc. damping torque + tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + + // calculate rotation matrix + g[3 * i + 0] = -tdampz * dts; + g[3 * i + 1] = tdampy * dts; + g[3 * i + 2] = -tdampx * dts; + } +} + +void MinSpinOSO_CG::calc_search_direction(int iter) +{ + int nlocal = atom->nlocal; + double g2old = 0.0; + double g2 = 0.0; + double beta = 0.0; + + double g2_global= 0.0; + double g2old_global= 0.0; + + // for some reason on a second iteration g_old = 0 + // so we make to iterations as steepest descent + if (iter <= 2 || iter % 5 == 0){ + // steepest descent direction + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++){ + p[3 * i + j] = -g[3 * i + j]; + g_old[3 * i + j] = g[3 * i + j]; + } + } + } else{ + // conjugate direction + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++){ + g2old += g_old[3 * i + j] * g_old[3 * i + j]; + g2 += g[3 * i + j] * g[3 * i + j]; + + } + } + + // now we need to collect/broadcast beta on this replica + // different replica can have different beta for now. + // need to check what is beta for GNEB + MPI_Allreduce(&g2, &g2_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&g2old, &g2old_global, 1, MPI_DOUBLE, MPI_SUM, world); + + beta = g2_global / g2old_global; + + //calculate conjugate direction + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++){ + p[3 * i + j] = beta * p[3 * i + j] - g[3 * i + j]; + g_old[3 * i + j] = g[3 * i + j]; + } + } + + } + +} + + /* ---------------------------------------------------------------------- rotation of spins along the search direction ---------------------------------------------------------------------- */ -void MinSpinOSO::advance_spins(double dts) +void MinSpinOSO_CG::advance_spins() { int nlocal = atom->nlocal; double **sp = atom->sp; double **fm = atom->fm; double tdampx, tdampy, tdampz; - double f[3]; // upper triag. part of skew-symm. matr. to be exponented + // double f[3]; // upper triag. part of skew-symm. matr. to be exponented double rot_mat[9]; // exponential of a double s_new[3]; // loop on all spins on proc. for (int i = 0; i < nlocal; i++) { - - // calc. damping torque - tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - - // calculate rotation matrix - f[0] = tdampz * dts; - f[1] = -tdampy * dts; - f[2] = tdampx * dts; - rodrigues_rotation(f, rot_mat); - + rodrigues_rotation(p + 3 * i, rot_mat); // rotate spins vm3(rot_mat, sp[i], s_new); sp[i][0] = s_new[0]; @@ -280,7 +356,7 @@ void MinSpinOSO::advance_spins(double dts) compute and return ||mag. torque||_2^2 ------------------------------------------------------------------------- */ -double MinSpinOSO::fmnorm_sqr() +double MinSpinOSO_CG::fmnorm_sqr() { int nlocal = atom->nlocal; double tx,ty,tz; diff --git a/src/SPIN/min_spin_oso_cg.h b/src/SPIN/min_spin_oso_cg.h new file mode 100644 index 0000000000..fa0b591c21 --- /dev/null +++ b/src/SPIN/min_spin_oso_cg.h @@ -0,0 +1,65 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef MINIMIZE_CLASS + +MinimizeStyle(spin_oso_cg, MinSpinOSO_CG) + +#else + +#ifndef LMP_MIN_SPIN_OSO_CG_H +#define LMP_MIN_SPIN_OSO_CG_H + +#include "min.h" + +namespace LAMMPS_NS { + +class MinSpinOSO_CG : public Min { + +public: + MinSpinOSO_CG(class LAMMPS *); //? + ~MinSpinOSO_CG() {} //? + void init(); + void setup_style(); + int modify_param(int, char **); + void reset_vectors(); + int iterate(int); + double evaluate_dt(); + void advance_spins(); + double fmnorm_sqr(); + void calc_gradients(double); + void calc_search_direction(int); + +private: + // global and spin timesteps + + double dt; + double dts; + + double alpha_damp; // damping for spin minimization + double discrete_factor; // factor for spin timestep evaluation + + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + + double *g_old; // gradient vector + double *g; // gradient vector + double *p; // search direction vector + + bigint last_negative; +}; + +} + +#endif +#endif diff --git a/src/min_spin_oso.h b/src/min_spin_oso.h deleted file mode 100644 index 81ad812e5c..0000000000 --- a/src/min_spin_oso.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef MINIMIZE_CLASS - -MinimizeStyle(spin_oso, MinSpinOSO) - -#else - -#ifndef LMP_MIN_SPIN_OSO_H -#define LMP_MIN_SPIN_OSO_H - -#include "min.h" - -namespace LAMMPS_NS { - -class MinSpinOSO : public Min { - public: - MinSpinOSO(class LAMMPS *); //? - ~MinSpinOSO() {} //? - void init(); - void setup_style(); - int modify_param(int, char **); - void reset_vectors(); - int iterate(int); - double evaluate_dt(); - void advance_spins(double); - double fmnorm_sqr(); - - private: - - // global and spin timesteps - - double dt; - double dts; - - double alpha_damp; // damping for spin minimization - double discrete_factor; // factor for spin timestep evaluation - - double *spvec; // variables for atomic dof, as 1d vector - double *fmvec; // variables for atomic dof, as 1d vector - - bigint last_negative; -}; - -} - -#endif -#endif From 630ce7b96247b3d8bf23f54c83c04fef8da79c61 Mon Sep 17 00:00:00 2001 From: alxvov Date: Thu, 27 Jun 2019 16:31:24 +0000 Subject: [PATCH 006/418] add contributing authors --- src/SPIN/min_spin_oso_cg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 9f43442e27..b36e5f280f 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -12,7 +12,7 @@ ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------ - Contributing authors: Julien Tranchida (SNL) + Contributing authors: Julien Tranchida (SNL), Aleksei Ivanov (UI) Please cite the related publication: ------------------------------------------------------------------------- */ From 2520eab46d844bda3e30111d1c8f06d94a009a82 Mon Sep 17 00:00:00 2001 From: alxvov Date: Thu, 27 Jun 2019 16:41:19 +0000 Subject: [PATCH 007/418] small typo --- src/SPIN/min_spin_oso_cg.cpp | 13 ++++++------- src/SPIN/min_spin_oso_cg.h | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index b36e5f280f..9c084d9684 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -145,7 +145,7 @@ int MinSpinOSO_CG::iterate(int maxiter) energy_force(0); dts = evaluate_dt(); - calc_gradients(dts); + calc_gradient(dts); calc_search_direction(iter); advance_spins(); @@ -252,7 +252,7 @@ double MinSpinOSO_CG::evaluate_dt() calculate gradients ---------------------------------------------------------------------- */ -void MinSpinOSO_CG::calc_gradients(double dts) +void MinSpinOSO_CG::calc_gradient(double dts) { int nlocal = atom->nlocal; double **sp = atom->sp; @@ -267,7 +267,7 @@ void MinSpinOSO_CG::calc_gradients(double dts) tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - // calculate rotation matrix + // calculate gradients g[3 * i + 0] = -tdampz * dts; g[3 * i + 1] = tdampy * dts; g[3 * i + 2] = -tdampx * dts; @@ -285,7 +285,7 @@ void MinSpinOSO_CG::calc_search_direction(int iter) double g2old_global= 0.0; // for some reason on a second iteration g_old = 0 - // so we make to iterations as steepest descent + // so we make two iterations as steepest descent if (iter <= 2 || iter % 5 == 0){ // steepest descent direction for (int i = 0; i < nlocal; i++) { @@ -312,7 +312,7 @@ void MinSpinOSO_CG::calc_search_direction(int iter) beta = g2_global / g2old_global; - //calculate conjugate direction + // calculate conjugate direction for (int i = 0; i < nlocal; i++) { for (int j = 0; j < 3; j++){ p[3 * i + j] = beta * p[3 * i + j] - g[3 * i + j]; @@ -335,8 +335,7 @@ void MinSpinOSO_CG::advance_spins() double **sp = atom->sp; double **fm = atom->fm; double tdampx, tdampy, tdampz; - // double f[3]; // upper triag. part of skew-symm. matr. to be exponented - double rot_mat[9]; // exponential of a + double rot_mat[9]; // exponential of matrix made of search direction double s_new[3]; // loop on all spins on proc. diff --git a/src/SPIN/min_spin_oso_cg.h b/src/SPIN/min_spin_oso_cg.h index fa0b591c21..a2ecf53e55 100644 --- a/src/SPIN/min_spin_oso_cg.h +++ b/src/SPIN/min_spin_oso_cg.h @@ -37,7 +37,7 @@ public: double evaluate_dt(); void advance_spins(); double fmnorm_sqr(); - void calc_gradients(double); + void calc_gradient(double); void calc_search_direction(int); private: @@ -52,7 +52,7 @@ private: double *spvec; // variables for atomic dof, as 1d vector double *fmvec; // variables for atomic dof, as 1d vector - double *g_old; // gradient vector + double *g_old; // gradient vector at previous iteration double *g; // gradient vector double *p; // search direction vector From 3e8ab7cbb00f42745794afa5205ed4cafbea24f6 Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 27 Jun 2019 15:15:57 -0600 Subject: [PATCH 008/418] Commit JT 062719 - cleaned code and setup LAMMPS format and indentation - added src/min_spin_oso_cg.h/cpp to .gitignore --- src/.gitignore | 2 + src/SPIN/min_spin_oso_cg.cpp | 340 ++++++++++++++++++----------------- src/SPIN/min_spin_oso_cg.h | 23 +-- 3 files changed, 193 insertions(+), 172 deletions(-) diff --git a/src/.gitignore b/src/.gitignore index c79c958e6d..0d802981f9 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -161,6 +161,8 @@ /fix_setforce_spin.h /min_spin.cpp /min_spin.h +/min_spin_oso_cg.cpp +/min_spin_oso_cg.h /neb_spin.cpp /neb_spin.h /pair_spin.cpp diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 9c084d9684..c09d12dbc8 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -12,9 +12,13 @@ ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------ - Contributing authors: Julien Tranchida (SNL), Aleksei Ivanov (UI) + Contributing authors: Aleksei Ivanov (UI) + Julien Tranchida (SNL) Please cite the related publication: + Ivanov, A. V., Uzdin, V. M., & Jónsson, H. (2019). Fast and Robust + Algorithm for the Minimisation of the Energy of Spin Systems. arXiv + preprint arXiv:1904.02669. ------------------------------------------------------------------------- */ #include @@ -24,6 +28,7 @@ #include "min_spin_oso_cg.h" #include "universe.h" #include "atom.h" +#include "citeme.h" #include "force.h" #include "update.h" #include "output.h" @@ -36,30 +41,40 @@ using namespace LAMMPS_NS; using namespace MathConst; +static const char cite_minstyle_spin_oso_cg[] = + "min_style spin/oso_cg command:\n\n" + "@article{ivanov2019fast,\n" + "title={Fast and Robust Algorithm for the Minimisation of the Energy of " + "Spin Systems},\n" + "author={Ivanov, A. V and Uzdin, V. M. and J{\'o}nsson, H.},\n" + "journal={arXiv preprint arXiv:1904.02669},\n" + "year={2019}\n" + "}\n\n"; + // EPS_ENERGY = minimum normalization for energy tolerance #define EPS_ENERGY 1.0e-8 #define DELAYSTEP 5 -void vm3(const double *m, const double *v, double *out); -void rodrigues_rotation(const double *upp_tr, double *out); /* ---------------------------------------------------------------------- */ -MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : Min(lmp) {} +MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : Min(lmp) { + if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_cg); +} /* ---------------------------------------------------------------------- */ void MinSpinOSO_CG::init() { - alpha_damp = 1.0; - discrete_factor = 10.0; + alpha_damp = 1.0; + discrete_factor = 10.0; - Min::init(); + Min::init(); - dts = dt = update->dt; - last_negative = update->ntimestep; + dts = dt = update->dt; + last_negative = update->ntimestep; } /* ---------------------------------------------------------------------- */ @@ -121,34 +136,34 @@ void MinSpinOSO_CG::reset_vectors() int MinSpinOSO_CG::iterate(int maxiter) { - bigint ntimestep; - double fmdotfm; - int flag, flagall; + bigint ntimestep; + double fmdotfm; + int flag, flagall; - // not sure it is best place to allocate memory - int nlocal = atom->nlocal; - g = (double *) calloc(3*nlocal, sizeof(double)); - p = (double *) calloc(3*nlocal, sizeof(double)); - g_old = (double *) calloc(3*nlocal, sizeof(double)); - - for (int iter = 0; iter < maxiter; iter++) { + // not sure it is best place to allocate memory + int nlocal = atom->nlocal; + g = (double *) calloc(3*nlocal, sizeof(double)); + p = (double *) calloc(3*nlocal, sizeof(double)); + g_old = (double *) calloc(3*nlocal, sizeof(double)); + for (int iter = 0; iter < maxiter; iter++) { + if (timer->check_timeout(niter)) return TIMEOUT; - + ntimestep = ++update->ntimestep; niter++; - + // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - + energy_force(0); dts = evaluate_dt(); - + calc_gradient(dts); calc_search_direction(iter); advance_spins(); - + eprevious = ecurrent; ecurrent = energy_force(0); neval++; @@ -156,7 +171,7 @@ int MinSpinOSO_CG::iterate(int maxiter) //// energy tolerance criterion //// only check after DELAYSTEP elapsed since velocties reset to 0 //// sync across replicas if running multi-replica minimization - + if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { if (update->multireplica == 0) { if (fabs(ecurrent-eprevious) < @@ -196,9 +211,9 @@ int MinSpinOSO_CG::iterate(int maxiter) } } - free(p); - free(g); - free(g_old); + free(p); + free(g); + free(g_old); return MAXITER; } @@ -254,76 +269,80 @@ double MinSpinOSO_CG::evaluate_dt() void MinSpinOSO_CG::calc_gradient(double dts) { - int nlocal = atom->nlocal; - double **sp = atom->sp; - double **fm = atom->fm; - double tdampx, tdampy, tdampz; - // loop on all spins on proc. + int nlocal = atom->nlocal; + double **sp = atom->sp; + double **fm = atom->fm; + double tdampx, tdampy, tdampz; + + // loop on all spins on proc. - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < nlocal; i++) { + + // calc. damping torque + + tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - // calc. damping torque - tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - - // calculate gradients - g[3 * i + 0] = -tdampz * dts; - g[3 * i + 1] = tdampy * dts; - g[3 * i + 2] = -tdampx * dts; - } + // calculate gradients + + g[3 * i + 0] = -tdampz * dts; + g[3 * i + 1] = tdampy * dts; + g[3 * i + 2] = -tdampx * dts; + } } +/* ---------------------------------------------------------------------- + search direction +---------------------------------------------------------------------- */ + void MinSpinOSO_CG::calc_search_direction(int iter) { - int nlocal = atom->nlocal; - double g2old = 0.0; - double g2 = 0.0; - double beta = 0.0; + int nlocal = atom->nlocal; + double g2old = 0.0; + double g2 = 0.0; + double beta = 0.0; - double g2_global= 0.0; - double g2old_global= 0.0; - - // for some reason on a second iteration g_old = 0 - // so we make two iterations as steepest descent - if (iter <= 2 || iter % 5 == 0){ - // steepest descent direction - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++){ - p[3 * i + j] = -g[3 * i + j]; - g_old[3 * i + j] = g[3 * i + j]; - } - } - } else{ - // conjugate direction - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++){ - g2old += g_old[3 * i + j] * g_old[3 * i + j]; - g2 += g[3 * i + j] * g[3 * i + j]; - - } - } - - // now we need to collect/broadcast beta on this replica - // different replica can have different beta for now. - // need to check what is beta for GNEB - MPI_Allreduce(&g2, &g2_global, 1, MPI_DOUBLE, MPI_SUM, world); - MPI_Allreduce(&g2old, &g2old_global, 1, MPI_DOUBLE, MPI_SUM, world); - - beta = g2_global / g2old_global; - - // calculate conjugate direction - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++){ - p[3 * i + j] = beta * p[3 * i + j] - g[3 * i + j]; - g_old[3 * i + j] = g[3 * i + j]; - } - } + double g2_global= 0.0; + double g2old_global= 0.0; + // for some reason on a second iteration g_old = 0 + // so we make two iterations as steepest descent + + if (iter <= 2 || iter % 5 == 0){ // steepest descent direction + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++){ + p[3 * i + j] = -g[3 * i + j]; + g_old[3 * i + j] = g[3 * i + j]; + } + } + } else { // conjugate direction + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++){ + g2old += g_old[3 * i + j] * g_old[3 * i + j]; + g2 += g[3 * i + j] * g[3 * i + j]; + } } -} + // now we need to collect/broadcast beta on this replica + // different replica can have different beta for now. + // need to check what is beta for GNEB + + MPI_Allreduce(&g2, &g2_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&g2old, &g2old_global, 1, MPI_DOUBLE, MPI_SUM, world); + beta = g2_global / g2old_global; + + // calculate conjugate direction + + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++){ + p[3 * i + j] = beta * p[3 * i + j] - g[3 * i + j]; + g_old[3 * i + j] = g[3 * i + j]; + } + } + } +} /* ---------------------------------------------------------------------- rotation of spins along the search direction @@ -341,14 +360,15 @@ void MinSpinOSO_CG::advance_spins() // loop on all spins on proc. for (int i = 0; i < nlocal; i++) { - rodrigues_rotation(p + 3 * i, rot_mat); - // rotate spins - vm3(rot_mat, sp[i], s_new); - sp[i][0] = s_new[0]; - sp[i][1] = s_new[1]; - sp[i][2] = s_new[2]; + rodrigues_rotation(p + 3 * i, rot_mat); + + // rotate spins + + vm3(rot_mat, sp[i], s_new); + sp[i][0] = s_new[0]; + sp[i][1] = s_new[1]; + sp[i][2] = s_new[2]; } - } /* ---------------------------------------------------------------------- @@ -384,86 +404,82 @@ double MinSpinOSO_CG::fmnorm_sqr() return norm2_sqr; } +/* ---------------------------------------------------------------------- + calculate 3x3 matrix exponential using Rodrigues' formula + (R. Murray, Z. Li, and S. Shankar Sastry, + A Mathematical Introduction to + Robotic Manipulation (1994), p. 28 and 30). + + upp_tr - vector x, y, z so that one calculate + U = exp(A) with A= [[0, x, y], + [-x, 0, z], + [-y, -z, 0]] +------------------------------------------------------------------------- */ -void rodrigues_rotation(const double *upp_tr, double *out){ +void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) +{ - /*** - * calculate 3x3 matrix exponential using Rodrigues' formula - * (R. Murray, Z. Li, and S. Shankar Sastry, - * A Mathematical Introduction to - * Robotic Manipulation (1994), p. 28 and 30). - * - * upp_tr - vector x, y, z so that one calculate - * U = exp(A) with A= [[0, x, y], - * [-x, 0, z], - * [-y, -z, 0]] - ***/ - - - if (fabs(upp_tr[0]) < 1.0e-40 && - fabs(upp_tr[1]) < 1.0e-40 && - fabs(upp_tr[2]) < 1.0e-40){ - // if upp_tr is zero, return unity matrix - int k; - int m; - for(k = 0; k < 3; k++){ - for(m = 0; m < 3; m++){ - if (m == k) out[3 * k + m] = 1.0; - else out[3 * k + m] = 0.0; - } - } - return; + if (fabs(upp_tr[0]) < 1.0e-40 && + fabs(upp_tr[1]) < 1.0e-40 && + fabs(upp_tr[2]) < 1.0e-40){ + + // if upp_tr is zero, return unity matrix + for(int k = 0; k < 3; k++){ + for(int m = 0; m < 3; m++){ + if (m == k) out[3 * k + m] = 1.0; + else out[3 * k + m] = 0.0; + } } + return; + } - double theta = sqrt(upp_tr[0] * upp_tr[0] + - upp_tr[1] * upp_tr[1] + - upp_tr[2] * upp_tr[2]); + double theta = sqrt(upp_tr[0] * upp_tr[0] + + upp_tr[1] * upp_tr[1] + + upp_tr[2] * upp_tr[2]); - double A = cos(theta); - double B = sin(theta); - double D = 1 - A; - double x = upp_tr[0]/theta; - double y = upp_tr[1]/theta; - double z = upp_tr[2]/theta; + double A = cos(theta); + double B = sin(theta); + double D = 1 - A; + double x = upp_tr[0]/theta; + double y = upp_tr[1]/theta; + double z = upp_tr[2]/theta; - // diagonal elements of U - out[0] = A + z * z * D; - out[4] = A + y * y * D; - out[8] = A + x * x * D; + // diagonal elements of U + + out[0] = A + z * z * D; + out[4] = A + y * y * D; + out[8] = A + x * x * D; - // off diagonal of U - double s1 = -y * z *D; - double s2 = x * z * D; - double s3 = -x * y * D; + // off diagonal of U + + double s1 = -y * z *D; + double s2 = x * z * D; + double s3 = -x * y * D; - double a1 = x * B; - double a2 = y * B; - double a3 = z * B; + double a1 = x * B; + double a2 = y * B; + double a3 = z * B; - out[1] = s1 + a1; - out[3] = s1 - a1; - out[2] = s2 + a2; - out[6] = s2 - a2; - out[5] = s3 + a3; - out[7] = s3 - a3; + out[1] = s1 + a1; + out[3] = s1 - a1; + out[2] = s2 + a2; + out[6] = s2 - a2; + out[5] = s3 + a3; + out[7] = s3 - a3; } +/* ---------------------------------------------------------------------- + out = vector^T x m, + m -- 3x3 matrix , v -- 3-d vector +------------------------------------------------------------------------- */ -void vm3(const double *m, const double *v, double *out){ - /*** - * out = vector^T x m, - * m -- 3x3 matrix , v -- 3-d vector - ***/ - - int i; - int j; - - for(i = 0; i < 3; i++){ - out[i] *= 0.0; - for(j = 0; j < 3; j++){ - out[i] += *(m + 3 * j + i) * v[j]; - } +void MinSpinOSO_CG::vm3(const double *m, const double *v, double *out) +{ + for(int i = 0; i < 3; i++){ + out[i] *= 0.0; + for(int j = 0; j < 3; j++){ + out[i] += *(m + 3 * j + i) * v[j]; } - + } } diff --git a/src/SPIN/min_spin_oso_cg.h b/src/SPIN/min_spin_oso_cg.h index a2ecf53e55..8cff52431c 100644 --- a/src/SPIN/min_spin_oso_cg.h +++ b/src/SPIN/min_spin_oso_cg.h @@ -13,7 +13,7 @@ #ifdef MINIMIZE_CLASS -MinimizeStyle(spin_oso_cg, MinSpinOSO_CG) +MinimizeStyle(spin/oso_cg, MinSpinOSO_CG) #else @@ -27,8 +27,8 @@ namespace LAMMPS_NS { class MinSpinOSO_CG : public Min { public: - MinSpinOSO_CG(class LAMMPS *); //? - ~MinSpinOSO_CG() {} //? + MinSpinOSO_CG(class LAMMPS *); + ~MinSpinOSO_CG() {} void init(); void setup_style(); int modify_param(int, char **); @@ -46,15 +46,18 @@ private: double dt; double dts; - double alpha_damp; // damping for spin minimization - double discrete_factor; // factor for spin timestep evaluation + double alpha_damp; // damping for spin minimization + double discrete_factor; // factor for spin timestep evaluation - double *spvec; // variables for atomic dof, as 1d vector - double *fmvec; // variables for atomic dof, as 1d vector + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector - double *g_old; // gradient vector at previous iteration - double *g; // gradient vector - double *p; // search direction vector + double *g_old; // gradient vector at previous iteration + double *g; // gradient vector + double *p; // search direction vector + + void vm3(const double *m, const double *v, double *out); + void rodrigues_rotation(const double *upp_tr, double *out); bigint last_negative; }; From 5c8e81241aba49399ef221bc841ccdc249cc08c1 Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 28 Jun 2019 10:49:21 -0600 Subject: [PATCH 009/418] Commit JT 062819 - modified memory allocation --- src/SPIN/fix_nve_spin.h | 2 +- src/SPIN/min_spin_oso_cg.cpp | 90 ++++++++++++++++++++++-------------- src/SPIN/min_spin_oso_cg.h | 11 +++-- 3 files changed, 63 insertions(+), 40 deletions(-) diff --git a/src/SPIN/fix_nve_spin.h b/src/SPIN/fix_nve_spin.h index 4800575c06..89cd617e0b 100644 --- a/src/SPIN/fix_nve_spin.h +++ b/src/SPIN/fix_nve_spin.h @@ -54,7 +54,7 @@ friend class PairSpin; double dtv, dtf, dts; // velocity, force, and spin timesteps - int nlocal_max; // max value of nlocal (for lists size) + int nlocal_max; // max value of nlocal (for size of lists) int pair_spin_flag; // magnetic pair flags int long_spin_flag; // magnetic long-range flag diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index c09d12dbc8..d6bca32a40 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -34,6 +34,7 @@ #include "output.h" #include "timer.h" #include "error.h" +#include "memory.h" #include "modify.h" #include "math_special.h" #include "math_const.h" @@ -60,8 +61,20 @@ static const char cite_minstyle_spin_oso_cg[] = /* ---------------------------------------------------------------------- */ -MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : Min(lmp) { +MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : + Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL) +{ if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_cg); + nlocal_max = 0; +} + +/* ---------------------------------------------------------------------- */ + +MinSpinOSO_CG::~MinSpinOSO_CG() +{ + memory->destroy(g_old); + memory->destroy(g_cur); + memory->destroy(p_s); } /* ---------------------------------------------------------------------- */ @@ -75,6 +88,13 @@ void MinSpinOSO_CG::init() dts = dt = update->dt; last_negative = update->ntimestep; + + // allocate tables + + nlocal_max = atom->nlocal; + memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg:p_s"); } /* ---------------------------------------------------------------------- */ @@ -134,17 +154,21 @@ void MinSpinOSO_CG::reset_vectors() minimization via damped spin dynamics ------------------------------------------------------------------------- */ +// g_old g_cur p_s + int MinSpinOSO_CG::iterate(int maxiter) { + int nlocal = atom->nlocal; bigint ntimestep; double fmdotfm; int flag, flagall; - // not sure it is best place to allocate memory - int nlocal = atom->nlocal; - g = (double *) calloc(3*nlocal, sizeof(double)); - p = (double *) calloc(3*nlocal, sizeof(double)); - g_old = (double *) calloc(3*nlocal, sizeof(double)); + if (nlocal_max < nlocal) { + nlocal_max = nlocal; + memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg:p_s"); + } for (int iter = 0; iter < maxiter; iter++) { @@ -211,10 +235,6 @@ int MinSpinOSO_CG::iterate(int maxiter) } } - free(p); - free(g); - free(g_old); - return MAXITER; } @@ -286,9 +306,9 @@ void MinSpinOSO_CG::calc_gradient(double dts) // calculate gradients - g[3 * i + 0] = -tdampz * dts; - g[3 * i + 1] = tdampy * dts; - g[3 * i + 2] = -tdampx * dts; + g_cur[3 * i + 0] = -tdampz * dts; + g_cur[3 * i + 1] = tdampy * dts; + g_cur[3 * i + 2] = -tdampx * dts; } } @@ -312,15 +332,15 @@ void MinSpinOSO_CG::calc_search_direction(int iter) if (iter <= 2 || iter % 5 == 0){ // steepest descent direction for (int i = 0; i < nlocal; i++) { for (int j = 0; j < 3; j++){ - p[3 * i + j] = -g[3 * i + j]; - g_old[3 * i + j] = g[3 * i + j]; + p_s[3 * i + j] = -g_cur[3 * i + j]; + g_old[3 * i + j] = g_cur[3 * i + j]; } } } else { // conjugate direction for (int i = 0; i < nlocal; i++) { for (int j = 0; j < 3; j++){ g2old += g_old[3 * i + j] * g_old[3 * i + j]; - g2 += g[3 * i + j] * g[3 * i + j]; + g2 += g_cur[3 * i + j] * g_cur[3 * i + j]; } } @@ -337,8 +357,8 @@ void MinSpinOSO_CG::calc_search_direction(int iter) for (int i = 0; i < nlocal; i++) { for (int j = 0; j < 3; j++){ - p[3 * i + j] = beta * p[3 * i + j] - g[3 * i + j]; - g_old[3 * i + j] = g[3 * i + j]; + p_s[3 * i + j] = beta * p_s[3 * i + j] - g_cur[3 * i + j]; + g_old[3 * i + j] = g_cur[3 * i + j]; } } } @@ -360,7 +380,7 @@ void MinSpinOSO_CG::advance_spins() // loop on all spins on proc. for (int i = 0; i < nlocal; i++) { - rodrigues_rotation(p + 3 * i, rot_mat); + rodrigues_rotation(p_s + 3 * i, rot_mat); // rotate spins @@ -418,6 +438,8 @@ double MinSpinOSO_CG::fmnorm_sqr() void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) { + double theta,A,B,D,x,y,z; + double s1,s2,s3,a1,a2,a3; if (fabs(upp_tr[0]) < 1.0e-40 && fabs(upp_tr[1]) < 1.0e-40 && @@ -433,16 +455,16 @@ void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) return; } - double theta = sqrt(upp_tr[0] * upp_tr[0] + - upp_tr[1] * upp_tr[1] + - upp_tr[2] * upp_tr[2]); + theta = sqrt(upp_tr[0] * upp_tr[0] + + upp_tr[1] * upp_tr[1] + + upp_tr[2] * upp_tr[2]); - double A = cos(theta); - double B = sin(theta); - double D = 1 - A; - double x = upp_tr[0]/theta; - double y = upp_tr[1]/theta; - double z = upp_tr[2]/theta; + A = cos(theta); + B = sin(theta); + D = 1 - A; + x = upp_tr[0]/theta; + y = upp_tr[1]/theta; + z = upp_tr[2]/theta; // diagonal elements of U @@ -452,13 +474,13 @@ void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) // off diagonal of U - double s1 = -y * z *D; - double s2 = x * z * D; - double s3 = -x * y * D; + s1 = -y * z *D; + s2 = x * z * D; + s3 = -x * y * D; - double a1 = x * B; - double a2 = y * B; - double a3 = z * B; + a1 = x * B; + a2 = y * B; + a3 = z * B; out[1] = s1 + a1; out[3] = s1 - a1; diff --git a/src/SPIN/min_spin_oso_cg.h b/src/SPIN/min_spin_oso_cg.h index 8cff52431c..a791754836 100644 --- a/src/SPIN/min_spin_oso_cg.h +++ b/src/SPIN/min_spin_oso_cg.h @@ -28,7 +28,7 @@ class MinSpinOSO_CG : public Min { public: MinSpinOSO_CG(class LAMMPS *); - ~MinSpinOSO_CG() {} + virtual ~MinSpinOSO_CG(); void init(); void setup_style(); int modify_param(int, char **); @@ -43,6 +43,7 @@ public: private: // global and spin timesteps + int nlocal_max; // max value of nlocal (for size of lists) double dt; double dts; @@ -53,11 +54,11 @@ private: double *fmvec; // variables for atomic dof, as 1d vector double *g_old; // gradient vector at previous iteration - double *g; // gradient vector - double *p; // search direction vector + double *g_cur; // current gradient vector + double *p_s; // search direction vector - void vm3(const double *m, const double *v, double *out); - void rodrigues_rotation(const double *upp_tr, double *out); + void vm3(const double *, const double *, double *); + void rodrigues_rotation(const double *, double *); bigint last_negative; }; From 61b12a09f2c3f81e520aa788721985f762d50ced Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 1 Jul 2019 08:01:11 +0000 Subject: [PATCH 010/418] added lbfgs --- src/SPIN/min_spin_oso_lbfgs.cpp | 577 ++++++++++++++++++++++++++++++++ src/SPIN/min_spin_oso_lbfgs.h | 73 ++++ 2 files changed, 650 insertions(+) create mode 100644 src/SPIN/min_spin_oso_lbfgs.cpp create mode 100644 src/SPIN/min_spin_oso_lbfgs.h diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp new file mode 100644 index 0000000000..f0a4fcbd87 --- /dev/null +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -0,0 +1,577 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------------ + Contributing authors: Aleksei Ivanov (UI) + Julien Tranchida (SNL) + + Please cite the related publication: + Ivanov, A. V., Uzdin, V. M., & Jónsson, H. (2019). Fast and Robust + Algorithm for the Minimisation of the Energy of Spin Systems. arXiv + preprint arXiv:1904.02669. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "min_spin_oso_lbfgs.h" +#include "universe.h" +#include "atom.h" +#include "citeme.h" +#include "force.h" +#include "update.h" +#include "output.h" +#include "timer.h" +#include "error.h" +#include "modify.h" +#include "math_special.h" +#include "math_const.h" + +#include +using namespace std; + +using namespace LAMMPS_NS; +using namespace MathConst; + +static const char cite_minstyle_spin_oso_lbfgs[] = + "min_style spin/oso_lbfgs command:\n\n" + "@article{ivanov2019fast,\n" + "title={Fast and Robust Algorithm for the Minimisation of the Energy of " + "Spin Systems},\n" + "author={Ivanov, A. V and Uzdin, V. M. and J{\'o}nsson, H.},\n" + "journal={arXiv preprint arXiv:1904.02669},\n" + "year={2019}\n" + "}\n\n"; + +// EPS_ENERGY = minimum normalization for energy tolerance + +#define EPS_ENERGY 1.0e-8 + +#define DELAYSTEP 5 + + +/* ---------------------------------------------------------------------- */ + +MinSpinOSO_LBFGS::MinSpinOSO_LBFGS(LAMMPS *lmp) : Min(lmp) { + if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_lbfgs); +} + +/* ---------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS::init() +{ + alpha_damp = 1.0; + discrete_factor = 10.0; + num_mem = 3; + + Min::init(); + + dts = dt = update->dt; + last_negative = update->ntimestep; +} + +/* ---------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS::setup_style() +{ + double **v = atom->v; + int nlocal = atom->nlocal; + + // check if the atom/spin style is defined + + if (!atom->sp_flag) + error->all(FLERR,"min/spin_oso_lbfgs requires atom/spin style"); + + for (int i = 0; i < nlocal; i++) + v[i][0] = v[i][1] = v[i][2] = 0.0; +} + +/* ---------------------------------------------------------------------- */ + +int MinSpinOSO_LBFGS::modify_param(int narg, char **arg) +{ + if (strcmp(arg[0],"alpha_damp") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + alpha_damp = force->numeric(FLERR,arg[1]); + return 2; + } + if (strcmp(arg[0],"discrete_factor") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + discrete_factor = force->numeric(FLERR,arg[1]); + return 2; + } + return 0; +} + +/* ---------------------------------------------------------------------- + set current vector lengths and pointers + called after atoms have migrated +------------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS::reset_vectors() +{ + // atomic dof + + // size sp is 4N vector + nvec = 4 * atom->nlocal; + if (nvec) spvec = atom->sp[0]; + + nvec = 3 * atom->nlocal; + if (nvec) fmvec = atom->fm[0]; + + if (nvec) xvec = atom->x[0]; + if (nvec) fvec = atom->f[0]; +} + +/* ---------------------------------------------------------------------- + minimization via damped spin dynamics +------------------------------------------------------------------------- */ + +int MinSpinOSO_LBFGS::iterate(int maxiter) +{ + bigint ntimestep; + double fmdotfm; + int flag, flagall; + + // not sure it is best place to allocate memory + int nlocal = atom->nlocal; + g = (double *) calloc(3*nlocal, sizeof(double)); + p = (double *) calloc(3*nlocal, sizeof(double)); + g_old = (double *) calloc(3*nlocal, sizeof(double)); + rho = (double *) calloc(num_mem, sizeof(double)); + ds = (double **) calloc(num_mem, sizeof(double *)); + dy = (double **) calloc(num_mem, sizeof(double *)); + for (int k = 0; k < num_mem; k++){ + ds[k] = (double *) calloc(3*nlocal, sizeof(double)); + dy[k] = (double *) calloc(3*nlocal, sizeof(double)); + } + + for (int iter = 0; iter < maxiter; iter++) { + + if (timer->check_timeout(niter)) + return TIMEOUT; + + ntimestep = ++update->ntimestep; + niter++; + + // optimize timestep accross processes / replicas + // need a force calculation for timestep optimization + + energy_force(0); + // dts = evaluate_dt(); + // dts = 1.0; + calc_gradient(1.0); + calc_search_direction(iter); + advance_spins(); + + eprevious = ecurrent; + ecurrent = energy_force(0); + neval++; + + //// energy tolerance criterion + //// only check after DELAYSTEP elapsed since velocties reset to 0 + //// sync across replicas if running multi-replica minimization + + if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { + if (update->multireplica == 0) { + if (fabs(ecurrent-eprevious) < + update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) + return ETOL; + } else { + if (fabs(ecurrent-eprevious) < + update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) + flag = 0; + else flag = 1; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); + if (flagall == 0) return ETOL; + } + } + + // magnetic torque tolerance criterion + // sync across replicas if running multi-replica minimization + + if (update->ftol > 0.0) { + fmdotfm = fmnorm_sqr(); + if (update->multireplica == 0) { + if (fmdotfm < update->ftol*update->ftol) return FTOL; + } else { + if (fmdotfm < update->ftol*update->ftol) flag = 0; + else flag = 1; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); + if (flagall == 0) return FTOL; + } + } + + // output for thermo, dump, restart files + + if (output->next == ntimestep) { + timer->stamp(); + output->write(ntimestep); + timer->stamp(Timer::OUTPUT); + } + } + + free(p); + free(g); + free(g_old); + for (int k = 0; k < num_mem; k++){ + free(ds[k]); + free(dy[k]); + } + free(ds); + free(dy); + free(rho); + + return MAXITER; +} + +/* ---------------------------------------------------------------------- + evaluate max timestep +---------------------------------------------------------------------- */ + +double MinSpinOSO_LBFGS::evaluate_dt() +{ + double dtmax; + double fmsq; + double fmaxsqone,fmaxsqloc,fmaxsqall; + int nlocal = atom->nlocal; + double **fm = atom->fm; + + // finding max fm on this proc. + + fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; + for (int i = 0; i < nlocal; i++) { + fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; + fmaxsqone = MAX(fmaxsqone,fmsq); + } + + // finding max fm on this replica + + fmaxsqloc = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); + + // finding max fm over all replicas, if necessary + // this communicator would be invalid for multiprocess replicas + + fmaxsqall = fmaxsqloc; + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + if (fmaxsqall == 0.0) + error->all(FLERR,"Incorrect fmaxsqall calculation"); + + // define max timestep by dividing by the + // inverse of max frequency by discrete_factor + + dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); + + return dtmax; +} + +/* ---------------------------------------------------------------------- + calculate gradients +---------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS::calc_gradient(double dts) +{ + int nlocal = atom->nlocal; + double **sp = atom->sp; + double **fm = atom->fm; + double tdampx, tdampy, tdampz; + + // loop on all spins on proc. + + for (int i = 0; i < nlocal; i++) { + + // calc. damping torque + + tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + + // calculate gradients + + g[3 * i + 0] = -tdampz * dts; + g[3 * i + 1] = tdampy * dts; + g[3 * i + 2] = -tdampx * dts; + } +} + +/* ---------------------------------------------------------------------- + search direction +---------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS::calc_search_direction(int iter) +{ + int nlocal = atom->nlocal; + + double dyds = 0.0; + double sq = 0.0; + double yy = 0.0; + double yr = 0.0; + double beta = 0.0; + + double dyds_global = 0.0; + double sq_global = 0.0; + double yy_global = 0.0; + double yr_global = 0.0; + double beta_global = 0.0; + + int m_index = iter % num_mem; // memory index + int c_ind = 0; + double *q; + double *alpha; + + q = (double *) calloc(3*nlocal, sizeof(double)); + alpha = (double *) calloc(num_mem, sizeof(double)); + + // for some reason on a second iteration g_old = 0 + // so we make two iterations as steepest descent + + if (iter == 0){ // steepest descent direction + for (int i = 0; i < 3 * nlocal; i++) { + p[i] = -g[i]; + g_old[i] = g[i]; + ds[m_index][i] = 0.0; + dy[m_index][i] = 0.0; + + } + } else { + dyds = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + ds[m_index][i] = p[i]; + dy[m_index][i] = g[i] - g_old[i]; + dyds += ds[m_index][i] * dy[m_index][i]; + } +// MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); + if (fabs(dyds) > 1.0e-60) rho[m_index] = 1.0 / dyds; + else rho[m_index] = 1.0e60; + + // set the q vector + + for (int i = 0; i < 3 * nlocal; i++) { + q[i] = g[i]; + } + + // loop over last m indecies + for(int k = num_mem - 1; k > -1; k--) { + // this loop should run from the newest memory to the oldest one. + + c_ind = (k + m_index + 1) % num_mem; + + // dot product between dg and q + + sq = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + sq += ds[c_ind][i] * q[i]; + } + + // update alpha + + alpha[c_ind] = rho[c_ind] * sq; + + // update q + + for (int i = 0; i < 3 * nlocal; i++) { + q[i] -= alpha[c_ind] * dy[c_ind][i]; + } + } + + // dot product between dg with itself + yy = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + yy += dy[m_index][i] * dy[m_index][i]; + } + + // calculate now search direction + + if (fabs(yy) > 1.0e-60) { + for (int i = 0; i < 3 * nlocal; i++) { + p[i] = q[i] / (rho[m_index] * yy); + } + }else{ + for (int i = 0; i < 3 * nlocal; i++) { + p[i] = q[i] * 1.0e60; + } + } + + for (int k = 0; k < num_mem; k++){ + // this loop should run from the oldest memory to the newest one. + + if (iter < num_mem) c_ind = k; + else c_ind = (k + m_index + 1) % num_mem; + + // dot product between p and da + yr = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + yr += dy[c_ind][i] * p[i]; + } + + beta = rho[c_ind] * yr; + for (int i = 0; i < 3 * nlocal; i++) { + p[i] += ds[c_ind][i] * (alpha[c_ind] - beta); + } + } + for (int i = 0; i < 3 * nlocal; i++) { + p[i] = -1.0 * p[i]; + g_old[i] = g[i]; + } + } + + free(q); + free(alpha); + +} + +/* ---------------------------------------------------------------------- + rotation of spins along the search direction +---------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS::advance_spins() +{ + int nlocal = atom->nlocal; + double **sp = atom->sp; + double **fm = atom->fm; + double tdampx, tdampy, tdampz; + double rot_mat[9]; // exponential of matrix made of search direction + double s_new[3]; + + // loop on all spins on proc. + + for (int i = 0; i < nlocal; i++) { + rodrigues_rotation(p + 3 * i, rot_mat); + + // rotate spins + + vm3(rot_mat, sp[i], s_new); + sp[i][0] = s_new[0]; + sp[i][1] = s_new[1]; + sp[i][2] = s_new[2]; + } +} + +/* ---------------------------------------------------------------------- + compute and return ||mag. torque||_2^2 +------------------------------------------------------------------------- */ + +double MinSpinOSO_LBFGS::fmnorm_sqr() +{ + int nlocal = atom->nlocal; + double tx,ty,tz; + double **sp = atom->sp; + double **fm = atom->fm; + + // calc. magnetic torques + + double local_norm2_sqr = 0.0; + for (int i = 0; i < nlocal; i++) { + tx = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + ty = (fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tz = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + + local_norm2_sqr += tx*tx + ty*ty + tz*tz; + } + + // no extra atom calc. for spins + + if (nextra_atom) + error->all(FLERR,"extra atom option not available yet"); + + double norm2_sqr = 0.0; + MPI_Allreduce(&local_norm2_sqr,&norm2_sqr,1,MPI_DOUBLE,MPI_SUM,world); + + return norm2_sqr; +} + +/* ---------------------------------------------------------------------- + calculate 3x3 matrix exponential using Rodrigues' formula + (R. Murray, Z. Li, and S. Shankar Sastry, + A Mathematical Introduction to + Robotic Manipulation (1994), p. 28 and 30). + + upp_tr - vector x, y, z so that one calculate + U = exp(A) with A= [[0, x, y], + [-x, 0, z], + [-y, -z, 0]] +------------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS::rodrigues_rotation(const double *upp_tr, double *out) +{ + + if (fabs(upp_tr[0]) < 1.0e-40 && + fabs(upp_tr[1]) < 1.0e-40 && + fabs(upp_tr[2]) < 1.0e-40){ + + // if upp_tr is zero, return unity matrix + for(int k = 0; k < 3; k++){ + for(int m = 0; m < 3; m++){ + if (m == k) out[3 * k + m] = 1.0; + else out[3 * k + m] = 0.0; + } + } + return; + } + + double theta = sqrt(upp_tr[0] * upp_tr[0] + + upp_tr[1] * upp_tr[1] + + upp_tr[2] * upp_tr[2]); + + double A = cos(theta); + double B = sin(theta); + double D = 1 - A; + double x = upp_tr[0]/theta; + double y = upp_tr[1]/theta; + double z = upp_tr[2]/theta; + + // diagonal elements of U + + out[0] = A + z * z * D; + out[4] = A + y * y * D; + out[8] = A + x * x * D; + + // off diagonal of U + + double s1 = -y * z *D; + double s2 = x * z * D; + double s3 = -x * y * D; + + double a1 = x * B; + double a2 = y * B; + double a3 = z * B; + + out[1] = s1 + a1; + out[3] = s1 - a1; + out[2] = s2 + a2; + out[6] = s2 - a2; + out[5] = s3 + a3; + out[7] = s3 - a3; + +} + +/* ---------------------------------------------------------------------- + out = vector^T x m, + m -- 3x3 matrix , v -- 3-d vector +------------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS::vm3(const double *m, const double *v, double *out) +{ + for(int i = 0; i < 3; i++){ + out[i] *= 0.0; + for(int j = 0; j < 3; j++){ + out[i] += *(m + 3 * j + i) * v[j]; + } + } +} diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h new file mode 100644 index 0000000000..0a06824382 --- /dev/null +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -0,0 +1,73 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef MINIMIZE_CLASS + +MinimizeStyle(spin/oso_lbfgs, MinSpinOSO_LBFGS) + +#else + +#ifndef LMP_MIN_SPIN_OSO_LBFGS_H +#define LMP_MIN_SPIN_OSO_LBFGS_H + +#include "min.h" + +namespace LAMMPS_NS { + +class MinSpinOSO_LBFGS : public Min { + +public: + MinSpinOSO_LBFGS(class LAMMPS *); + ~MinSpinOSO_LBFGS() {} + void init(); + void setup_style(); + int modify_param(int, char **); + void reset_vectors(); + int iterate(int); + double evaluate_dt(); + void advance_spins(); + double fmnorm_sqr(); + void calc_gradient(double); + void calc_search_direction(int); + +private: + // global and spin timesteps + + double dt; + double dts; + + double alpha_damp; // damping for spin minimization + double discrete_factor; // factor for spin timestep evaluation + + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + + double *g; // gradient vector + double *g_old; // gradient vector at previous step + double *p; // search direction vector + double **ds; // change in rotation matrix between two iterations, da + double **dy; // change in gradients between two iterations, dg + double *rho; // estimation of curvature + int num_mem; // number of stored steps + + + void vm3(const double *m, const double *v, double *out); + void rodrigues_rotation(const double *upp_tr, double *out); + + bigint last_negative; +}; + +} + +#endif +#endif From 89ecd5d9f9e3daa9fb62430a883e896c3c5235e1 Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 1 Jul 2019 08:35:41 +0000 Subject: [PATCH 011/418] get rid off double loops in cg --- src/SPIN/min_spin_oso_cg.cpp | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index d6bca32a40..0c628f7567 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -329,19 +329,15 @@ void MinSpinOSO_CG::calc_search_direction(int iter) // for some reason on a second iteration g_old = 0 // so we make two iterations as steepest descent - if (iter <= 2 || iter % 5 == 0){ // steepest descent direction - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++){ - p_s[3 * i + j] = -g_cur[3 * i + j]; - g_old[3 * i + j] = g_cur[3 * i + j]; - } + if (iter == 0 || iter % 5 == 0){ // steepest descent direction + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = -g_cur[i]; + g_old[i] = g_cur[i]; } } else { // conjugate direction - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++){ - g2old += g_old[3 * i + j] * g_old[3 * i + j]; - g2 += g_cur[3 * i + j] * g_cur[3 * i + j]; - } + for (int i = 0; i < 3 * nlocal; i++) { + g2old += g_old[i] * g_old[i]; + g2 += g_cur[i] * g_cur[i]; } // now we need to collect/broadcast beta on this replica @@ -355,11 +351,9 @@ void MinSpinOSO_CG::calc_search_direction(int iter) // calculate conjugate direction - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++){ - p_s[3 * i + j] = beta * p_s[3 * i + j] - g_cur[3 * i + j]; - g_old[3 * i + j] = g_cur[3 * i + j]; - } + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = beta * p_s[i] - g_cur[i]; + g_old[i] = g_cur[i]; } } } @@ -385,9 +379,7 @@ void MinSpinOSO_CG::advance_spins() // rotate spins vm3(rot_mat, sp[i], s_new); - sp[i][0] = s_new[0]; - sp[i][1] = s_new[1]; - sp[i][2] = s_new[2]; + for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; } } From 0f2997533a258ca0869c57ca3c67b309b1d538d7 Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 1 Jul 2019 08:36:44 +0000 Subject: [PATCH 012/418] get rid off double loops in cg --- src/SPIN/min_spin_oso_cg.cpp | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index d6bca32a40..5ea5ad8b6d 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -326,22 +326,15 @@ void MinSpinOSO_CG::calc_search_direction(int iter) double g2_global= 0.0; double g2old_global= 0.0; - // for some reason on a second iteration g_old = 0 - // so we make two iterations as steepest descent - - if (iter <= 2 || iter % 5 == 0){ // steepest descent direction - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++){ - p_s[3 * i + j] = -g_cur[3 * i + j]; - g_old[3 * i + j] = g_cur[3 * i + j]; - } + if (iter == 0 || iter % 5 == 0){ // steepest descent direction + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = -g_cur[i]; + g_old[i] = g_cur[i]; } } else { // conjugate direction - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++){ - g2old += g_old[3 * i + j] * g_old[3 * i + j]; - g2 += g_cur[3 * i + j] * g_cur[3 * i + j]; - } + for (int i = 0; i < 3 * nlocal; i++) { + g2old += g_old[i] * g_old[i]; + g2 += g_cur[i] * g_cur[i]; } // now we need to collect/broadcast beta on this replica @@ -355,11 +348,9 @@ void MinSpinOSO_CG::calc_search_direction(int iter) // calculate conjugate direction - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++){ - p_s[3 * i + j] = beta * p_s[3 * i + j] - g_cur[3 * i + j]; - g_old[3 * i + j] = g_cur[3 * i + j]; - } + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = beta * p_s[i] - g_cur[i]; + g_old[i] = g_cur[i]; } } } From 5f74f6ddfa9aac318a00c17e1afd59f5d3438f15 Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 1 Jul 2019 08:38:44 +0000 Subject: [PATCH 013/418] delete irrelevant comment --- src/SPIN/min_spin_oso_cg.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 0c628f7567..4449832f54 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -326,9 +326,6 @@ void MinSpinOSO_CG::calc_search_direction(int iter) double g2_global= 0.0; double g2old_global= 0.0; - // for some reason on a second iteration g_old = 0 - // so we make two iterations as steepest descent - if (iter == 0 || iter % 5 == 0){ // steepest descent direction for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = -g_cur[i]; From 6a2a4d5cfb00c51de71e4f59288a73b739cb2da9 Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 1 Jul 2019 08:58:31 +0000 Subject: [PATCH 014/418] parallelisation of lbfgs --- src/SPIN/min_spin_oso_lbfgs.cpp | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index f0a4fcbd87..f21245899b 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -356,8 +356,8 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) dy[m_index][i] = g[i] - g_old[i]; dyds += ds[m_index][i] * dy[m_index][i]; } -// MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); - if (fabs(dyds) > 1.0e-60) rho[m_index] = 1.0 / dyds; + MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); + if (fabs(dyds) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; else rho[m_index] = 1.0e60; // set the q vector @@ -378,10 +378,11 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) for (int i = 0; i < 3 * nlocal; i++) { sq += ds[c_ind][i] * q[i]; } + MPI_Allreduce(&sq, &sq_global, 1, MPI_DOUBLE, MPI_SUM, world); // update alpha - alpha[c_ind] = rho[c_ind] * sq; + alpha[c_ind] = rho[c_ind] * sq_global; // update q @@ -395,12 +396,13 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) for (int i = 0; i < 3 * nlocal; i++) { yy += dy[m_index][i] * dy[m_index][i]; } + MPI_Allreduce(&yy, &yy_global, 1, MPI_DOUBLE, MPI_SUM, world); - // calculate now search direction + // calculate now search direction - if (fabs(yy) > 1.0e-60) { + if (fabs(yy_global) > 1.0e-60) { for (int i = 0; i < 3 * nlocal; i++) { - p[i] = q[i] / (rho[m_index] * yy); + p[i] = q[i] / (rho[m_index] * yy_global); } }else{ for (int i = 0; i < 3 * nlocal; i++) { @@ -419,8 +421,9 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) for (int i = 0; i < 3 * nlocal; i++) { yr += dy[c_ind][i] * p[i]; } + MPI_Allreduce(&yr, &yr_global, 1, MPI_DOUBLE, MPI_SUM, world); - beta = rho[c_ind] * yr; + beta = rho[c_ind] * yr_global; for (int i = 0; i < 3 * nlocal; i++) { p[i] += ds[c_ind][i] * (alpha[c_ind] - beta); } @@ -514,7 +517,7 @@ void MinSpinOSO_LBFGS::rodrigues_rotation(const double *upp_tr, double *out) if (fabs(upp_tr[0]) < 1.0e-40 && fabs(upp_tr[1]) < 1.0e-40 && fabs(upp_tr[2]) < 1.0e-40){ - + // if upp_tr is zero, return unity matrix for(int k = 0; k < 3; k++){ for(int m = 0; m < 3; m++){ @@ -537,13 +540,13 @@ void MinSpinOSO_LBFGS::rodrigues_rotation(const double *upp_tr, double *out) double z = upp_tr[2]/theta; // diagonal elements of U - + out[0] = A + z * z * D; out[4] = A + y * y * D; out[8] = A + x * x * D; // off diagonal of U - + double s1 = -y * z *D; double s2 = x * z * D; double s3 = -x * y * D; From 0a0e85ac46b335e0df5242ee1b635a39adddc1a1 Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 1 Jul 2019 09:03:17 +0000 Subject: [PATCH 015/418] rodr. rot. as in cg --- src/SPIN/min_spin_oso_lbfgs.cpp | 38 +++++++++++++++++---------------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index f21245899b..d200e07f4a 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -513,6 +513,8 @@ double MinSpinOSO_LBFGS::fmnorm_sqr() void MinSpinOSO_LBFGS::rodrigues_rotation(const double *upp_tr, double *out) { + double theta,A,B,D,x,y,z; + double s1,s2,s3,a1,a2,a3; if (fabs(upp_tr[0]) < 1.0e-40 && fabs(upp_tr[1]) < 1.0e-40 && @@ -521,23 +523,23 @@ void MinSpinOSO_LBFGS::rodrigues_rotation(const double *upp_tr, double *out) // if upp_tr is zero, return unity matrix for(int k = 0; k < 3; k++){ for(int m = 0; m < 3; m++){ - if (m == k) out[3 * k + m] = 1.0; - else out[3 * k + m] = 0.0; - } + if (m == k) out[3 * k + m] = 1.0; + else out[3 * k + m] = 0.0; + } } return; } - double theta = sqrt(upp_tr[0] * upp_tr[0] + - upp_tr[1] * upp_tr[1] + - upp_tr[2] * upp_tr[2]); + theta = sqrt(upp_tr[0] * upp_tr[0] + + upp_tr[1] * upp_tr[1] + + upp_tr[2] * upp_tr[2]); - double A = cos(theta); - double B = sin(theta); - double D = 1 - A; - double x = upp_tr[0]/theta; - double y = upp_tr[1]/theta; - double z = upp_tr[2]/theta; + A = cos(theta); + B = sin(theta); + D = 1 - A; + x = upp_tr[0]/theta; + y = upp_tr[1]/theta; + z = upp_tr[2]/theta; // diagonal elements of U @@ -547,13 +549,13 @@ void MinSpinOSO_LBFGS::rodrigues_rotation(const double *upp_tr, double *out) // off diagonal of U - double s1 = -y * z *D; - double s2 = x * z * D; - double s3 = -x * y * D; + s1 = -y * z *D; + s2 = x * z * D; + s3 = -x * y * D; - double a1 = x * B; - double a2 = y * B; - double a3 = z * B; + a1 = x * B; + a2 = y * B; + a3 = z * B; out[1] = s1 + a1; out[3] = s1 - a1; From 1d64d78f240b3bc8a26872ba1cb78b5a83772b45 Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 1 Jul 2019 09:40:14 +0000 Subject: [PATCH 016/418] handle memory in a right way --- src/SPIN/min_spin_oso_lbfgs.cpp | 93 ++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 41 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index d200e07f4a..1143786d73 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -34,13 +34,11 @@ #include "output.h" #include "timer.h" #include "error.h" +#include "memory.h" #include "modify.h" #include "math_special.h" #include "math_const.h" -#include -using namespace std; - using namespace LAMMPS_NS; using namespace MathConst; @@ -63,8 +61,23 @@ static const char cite_minstyle_spin_oso_lbfgs[] = /* ---------------------------------------------------------------------- */ -MinSpinOSO_LBFGS::MinSpinOSO_LBFGS(LAMMPS *lmp) : Min(lmp) { +MinSpinOSO_LBFGS::MinSpinOSO_LBFGS(LAMMPS *lmp) : + Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), ds(NULL), dy(NULL), rho(NULL) +{ if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_lbfgs); + nlocal_max = 0; +} + +/* ---------------------------------------------------------------------- */ + +MinSpinOSO_LBFGS::~MinSpinOSO_LBFGS() +{ + memory->destroy(g_old); + memory->destroy(g_cur); + memory->destroy(p_s); + memory->destroy(ds); + memory->destroy(dy); + memory->destroy(rho); } /* ---------------------------------------------------------------------- */ @@ -79,6 +92,17 @@ void MinSpinOSO_LBFGS::init() dts = dt = update->dt; last_negative = update->ntimestep; + + // allocate tables + + nlocal_max = atom->nlocal; + memory->grow(g_old,3*nlocal_max,"min/spin/oso/lbfgs:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/oso/lbfgs:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/oso/lbfgs:p_s"); + memory->grow(rho,num_mem,"min/spin/oso/lbfgs:rho"); + memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:ds"); + memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:dy"); + } /* ---------------------------------------------------------------------- */ @@ -140,21 +164,19 @@ void MinSpinOSO_LBFGS::reset_vectors() int MinSpinOSO_LBFGS::iterate(int maxiter) { + int nlocal = atom->nlocal; bigint ntimestep; double fmdotfm; int flag, flagall; - // not sure it is best place to allocate memory - int nlocal = atom->nlocal; - g = (double *) calloc(3*nlocal, sizeof(double)); - p = (double *) calloc(3*nlocal, sizeof(double)); - g_old = (double *) calloc(3*nlocal, sizeof(double)); - rho = (double *) calloc(num_mem, sizeof(double)); - ds = (double **) calloc(num_mem, sizeof(double *)); - dy = (double **) calloc(num_mem, sizeof(double *)); - for (int k = 0; k < num_mem; k++){ - ds[k] = (double *) calloc(3*nlocal, sizeof(double)); - dy[k] = (double *) calloc(3*nlocal, sizeof(double)); + if (nlocal_max < nlocal) { + nlocal_max = nlocal; + memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg:p_s"); + memory->grow(rho,num_mem,"min/spin/oso/lbfgs:rho"); + memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:ds"); + memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:dy"); } for (int iter = 0; iter < maxiter; iter++) { @@ -222,17 +244,6 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) } } - free(p); - free(g); - free(g_old); - for (int k = 0; k < num_mem; k++){ - free(ds[k]); - free(dy[k]); - } - free(ds); - free(dy); - free(rho); - return MAXITER; } @@ -304,9 +315,9 @@ void MinSpinOSO_LBFGS::calc_gradient(double dts) // calculate gradients - g[3 * i + 0] = -tdampz * dts; - g[3 * i + 1] = tdampy * dts; - g[3 * i + 2] = -tdampx * dts; + g_cur[3 * i + 0] = -tdampz * dts; + g_cur[3 * i + 1] = tdampy * dts; + g_cur[3 * i + 2] = -tdampx * dts; } } @@ -343,8 +354,8 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) if (iter == 0){ // steepest descent direction for (int i = 0; i < 3 * nlocal; i++) { - p[i] = -g[i]; - g_old[i] = g[i]; + p_s[i] = -g_cur[i]; + g_old[i] = g_cur[i]; ds[m_index][i] = 0.0; dy[m_index][i] = 0.0; @@ -352,8 +363,8 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) } else { dyds = 0.0; for (int i = 0; i < 3 * nlocal; i++) { - ds[m_index][i] = p[i]; - dy[m_index][i] = g[i] - g_old[i]; + ds[m_index][i] = p_s[i]; + dy[m_index][i] = g_cur[i] - g_old[i]; dyds += ds[m_index][i] * dy[m_index][i]; } MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); @@ -363,7 +374,7 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) // set the q vector for (int i = 0; i < 3 * nlocal; i++) { - q[i] = g[i]; + q[i] = g_cur[i]; } // loop over last m indecies @@ -402,11 +413,11 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) if (fabs(yy_global) > 1.0e-60) { for (int i = 0; i < 3 * nlocal; i++) { - p[i] = q[i] / (rho[m_index] * yy_global); + p_s[i] = q[i] / (rho[m_index] * yy_global); } }else{ for (int i = 0; i < 3 * nlocal; i++) { - p[i] = q[i] * 1.0e60; + p_s[i] = q[i] * 1.0e60; } } @@ -419,18 +430,18 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) // dot product between p and da yr = 0.0; for (int i = 0; i < 3 * nlocal; i++) { - yr += dy[c_ind][i] * p[i]; + yr += dy[c_ind][i] * p_s[i]; } MPI_Allreduce(&yr, &yr_global, 1, MPI_DOUBLE, MPI_SUM, world); beta = rho[c_ind] * yr_global; for (int i = 0; i < 3 * nlocal; i++) { - p[i] += ds[c_ind][i] * (alpha[c_ind] - beta); + p_s[i] += ds[c_ind][i] * (alpha[c_ind] - beta); } } for (int i = 0; i < 3 * nlocal; i++) { - p[i] = -1.0 * p[i]; - g_old[i] = g[i]; + p_s[i] = -1.0 * p_s[i]; + g_old[i] = g_cur[i]; } } @@ -455,7 +466,7 @@ void MinSpinOSO_LBFGS::advance_spins() // loop on all spins on proc. for (int i = 0; i < nlocal; i++) { - rodrigues_rotation(p + 3 * i, rot_mat); + rodrigues_rotation(p_s + 3 * i, rot_mat); // rotate spins From 56c34e42670b7b2c079d462e480f17afe4508cb1 Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 1 Jul 2019 09:41:34 +0000 Subject: [PATCH 017/418] merge memory alloc for lbfgs --- src/SPIN/min_spin_oso_lbfgs.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h index 0a06824382..3aa326142c 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -28,7 +28,7 @@ class MinSpinOSO_LBFGS : public Min { public: MinSpinOSO_LBFGS(class LAMMPS *); - ~MinSpinOSO_LBFGS() {} + virtual ~MinSpinOSO_LBFGS(); void init(); void setup_style(); int modify_param(int, char **); @@ -43,6 +43,7 @@ public: private: // global and spin timesteps + int nlocal_max; // max value of nlocal (for size of lists) double dt; double dts; @@ -52,9 +53,9 @@ private: double *spvec; // variables for atomic dof, as 1d vector double *fmvec; // variables for atomic dof, as 1d vector - double *g; // gradient vector + double *g_cur; // current gradient vector double *g_old; // gradient vector at previous step - double *p; // search direction vector + double *p_s; // search direction vector double **ds; // change in rotation matrix between two iterations, da double **dy; // change in gradients between two iterations, dg double *rho; // estimation of curvature From 924c610ebe69ae10656cd9ba70cc05f2723c900f Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 1 Jul 2019 09:45:05 +0000 Subject: [PATCH 018/418] use for loop --- src/SPIN/min_spin_oso_lbfgs.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index 1143786d73..f3643168a4 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -471,9 +471,7 @@ void MinSpinOSO_LBFGS::advance_spins() // rotate spins vm3(rot_mat, sp[i], s_new); - sp[i][0] = s_new[0]; - sp[i][1] = s_new[1]; - sp[i][2] = s_new[2]; + for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; } } From 398f33d4072576e9237744f95709982c1e6c895a Mon Sep 17 00:00:00 2001 From: alxvov Date: Tue, 2 Jul 2019 16:36:06 +0000 Subject: [PATCH 019/418] added cubic line search --- src/SPIN/min_spin_oso_lbfgs_ls.cpp | 717 +++++++++++++++++++++++++++++ src/SPIN/min_spin_oso_lbfgs_ls.h | 84 ++++ 2 files changed, 801 insertions(+) create mode 100644 src/SPIN/min_spin_oso_lbfgs_ls.cpp create mode 100644 src/SPIN/min_spin_oso_lbfgs_ls.h diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.cpp b/src/SPIN/min_spin_oso_lbfgs_ls.cpp new file mode 100644 index 0000000000..f054755129 --- /dev/null +++ b/src/SPIN/min_spin_oso_lbfgs_ls.cpp @@ -0,0 +1,717 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------------ + Contributing authors: Aleksei Ivanov (UI) + Julien Tranchida (SNL) + + Please cite the related publication: + Ivanov, A. V., Uzdin, V. M., & Jónsson, H. (2019). Fast and Robust + Algorithm for the Minimisation of the Energy of Spin Systems. arXiv + preprint arXiv:1904.02669. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "min_spin_oso_lbfgs_ls.h" +#include "universe.h" +#include "atom.h" +#include "citeme.h" +#include "force.h" +#include "update.h" +#include "output.h" +#include "timer.h" +#include "error.h" +#include "memory.h" +#include "modify.h" +#include "math_special.h" +#include "math_const.h" +#include + + +using namespace LAMMPS_NS; +using namespace MathConst; + +static const char cite_minstyle_spin_oso_lbfgs_ls[] = + "min_style spin/oso_lbfgs_ls command:\n\n" + "@article{ivanov2019fast,\n" + "title={Fast and Robust Algorithm for the Minimisation of the Energy of " + "Spin Systems},\n" + "author={Ivanov, A. V and Uzdin, V. M. and J{\'o}nsson, H.},\n" + "journal={arXiv preprint arXiv:1904.02669},\n" + "year={2019}\n" + "}\n\n"; + +// EPS_ENERGY = minimum normalization for energy tolerance + +#define EPS_ENERGY 1.0e-8 + +#define DELAYSTEP 5 + + +/* ---------------------------------------------------------------------- */ + +MinSpinOSO_LBFGS_LS::MinSpinOSO_LBFGS_LS(LAMMPS *lmp) : + Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), ds(NULL), dy(NULL), rho(NULL) +{ + if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_lbfgs_ls); + nlocal_max = 0; +} + +/* ---------------------------------------------------------------------- */ + +MinSpinOSO_LBFGS_LS::~MinSpinOSO_LBFGS_LS() +{ + memory->destroy(g_old); + memory->destroy(g_cur); + memory->destroy(p_s); + memory->destroy(ds); + memory->destroy(dy); + memory->destroy(rho); + memory->destroy(sp_copy); +} + +/* ---------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS_LS::init() +{ + alpha_damp = 1.0; + discrete_factor = 10.0; + num_mem = 3; + der_e_cur = 0.0; + der_e_pr = 0.0; + use_line_search = 1; + + Min::init(); + + dts = dt = update->dt; + last_negative = update->ntimestep; + + // allocate tables + + nlocal_max = atom->nlocal; + memory->grow(g_old,3*nlocal_max,"min/spin/oso/lbfgs_ls:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/oso/lbfgs_ls:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/oso/lbfgs_ls:p_s"); + memory->grow(rho,num_mem,"min/spin/oso/lbfgs_ls:rho"); + memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:ds"); + memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:dy"); + memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs_ls:sp_copy"); + +} + +/* ---------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS_LS::setup_style() +{ + double **v = atom->v; + int nlocal = atom->nlocal; + + // check if the atom/spin style is defined + + if (!atom->sp_flag) + error->all(FLERR,"min/spin_oso_lbfgs_ls requires atom/spin style"); + + for (int i = 0; i < nlocal; i++) + v[i][0] = v[i][1] = v[i][2] = 0.0; +} + +/* ---------------------------------------------------------------------- */ + +int MinSpinOSO_LBFGS_LS::modify_param(int narg, char **arg) +{ + if (strcmp(arg[0],"alpha_damp") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + alpha_damp = force->numeric(FLERR,arg[1]); + return 2; + } + if (strcmp(arg[0],"discrete_factor") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + discrete_factor = force->numeric(FLERR,arg[1]); + return 2; + } + return 0; +} + +/* ---------------------------------------------------------------------- + set current vector lengths and pointers + called after atoms have migrated +------------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS_LS::reset_vectors() +{ + // atomic dof + + // size sp is 4N vector + nvec = 4 * atom->nlocal; + if (nvec) spvec = atom->sp[0]; + + nvec = 3 * atom->nlocal; + if (nvec) fmvec = atom->fm[0]; + + if (nvec) xvec = atom->x[0]; + if (nvec) fvec = atom->f[0]; +} + +/* ---------------------------------------------------------------------- + minimization via damped spin dynamics +------------------------------------------------------------------------- */ + +int MinSpinOSO_LBFGS_LS::iterate(int maxiter) +{ + int nlocal = atom->nlocal; + bigint ntimestep; + double fmdotfm; + int flag, flagall; + double **sp = atom->sp; + + if (nlocal_max < nlocal) { + nlocal_max = nlocal; + memory->grow(g_old,3*nlocal_max,"min/spin/oso/lbfgs_ls:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/oso/lbfgs_ls:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/oso/lbfgs_ls:p_s"); + memory->grow(rho,num_mem,"min/spin/oso/lbfgs_ls:rho"); + memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:ds"); + memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:dy"); + memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs_ls:sp_copy"); + } + + + for (int iter = 0; iter < maxiter; iter++) { + + if (timer->check_timeout(niter)) + return TIMEOUT; + + ntimestep = ++update->ntimestep; + niter++; + + // optimize timestep accross processes / replicas + // need a force calculation for timestep optimization + + if (iter == 0){ + ecurrent = energy_force(0); + calc_gradient(1.0); + neval++; + }else{ + } + calc_search_direction(iter); + + if (use_line_search) { + der_e_cur = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + der_e_cur += g_cur[i] * p_s[i]; + } + } + + if (use_line_search){ + // here we need to do line search + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++) sp_copy[i][j] = sp[i][j]; + } + eprevious = ecurrent; + der_e_pr = der_e_cur; + + calc_and_make_step(0.0, 1.0, 0); + } + else{ + advance_spins(); + eprevious = ecurrent; + ecurrent = energy_force(0); + neval++; + } + + //// energy tolerance criterion + //// only check after DELAYSTEP elapsed since velocties reset to 0 + //// sync across replicas if running multi-replica minimization + + if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { + if (update->multireplica == 0) { + if (fabs(ecurrent-eprevious) < + update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) + return ETOL; + } else { + if (fabs(ecurrent-eprevious) < + update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) + flag = 0; + else flag = 1; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); + if (flagall == 0) return ETOL; + } + } + + // magnetic torque tolerance criterion + // sync across replicas if running multi-replica minimization + + if (update->ftol > 0.0) { + fmdotfm = fmnorm_sqr(); + if (update->multireplica == 0) { + if (fmdotfm < update->ftol*update->ftol) return FTOL; + } else { + if (fmdotfm < update->ftol*update->ftol) flag = 0; + else flag = 1; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); + if (flagall == 0) return FTOL; + } + } + + // output for thermo, dump, restart files + + if (output->next == ntimestep) { + timer->stamp(); + output->write(ntimestep); + timer->stamp(Timer::OUTPUT); + } + } + + return MAXITER; +} + +/* ---------------------------------------------------------------------- + evaluate max timestep +---------------------------------------------------------------------- */ + +double MinSpinOSO_LBFGS_LS::evaluate_dt() +{ + double dtmax; + double fmsq; + double fmaxsqone,fmaxsqloc,fmaxsqall; + int nlocal = atom->nlocal; + double **fm = atom->fm; + + // finding max fm on this proc. + + fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; + for (int i = 0; i < nlocal; i++) { + fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; + fmaxsqone = MAX(fmaxsqone,fmsq); + } + + // finding max fm on this replica + + fmaxsqloc = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); + + // finding max fm over all replicas, if necessary + // this communicator would be invalid for multiprocess replicas + + fmaxsqall = fmaxsqloc; + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + if (fmaxsqall == 0.0) + error->all(FLERR,"Incorrect fmaxsqall calculation"); + + // define max timestep by dividing by the + // inverse of max frequency by discrete_factor + + dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); + + return dtmax; +} + +/* ---------------------------------------------------------------------- + calculate gradients +---------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS_LS::calc_gradient(double dts) +{ + int nlocal = atom->nlocal; + double **sp = atom->sp; + double **fm = atom->fm; + double tdampx, tdampy, tdampz; + + // loop on all spins on proc. + + for (int i = 0; i < nlocal; i++) { + + // calc. damping torque + + tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + + // calculate gradients + + g_cur[3 * i + 0] = -tdampz * dts; + g_cur[3 * i + 1] = tdampy * dts; + g_cur[3 * i + 2] = -tdampx * dts; + } +} + +/* ---------------------------------------------------------------------- + search direction +---------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) +{ + int nlocal = atom->nlocal; + + double dyds = 0.0; + double sq = 0.0; + double yy = 0.0; + double yr = 0.0; + double beta = 0.0; + + double dyds_global = 0.0; + double sq_global = 0.0; + double yy_global = 0.0; + double yr_global = 0.0; + double beta_global = 0.0; + + int m_index = iter % num_mem; // memory index + int c_ind = 0; + double *q; + double *alpha; + + q = (double *) calloc(3*nlocal, sizeof(double)); + alpha = (double *) calloc(num_mem, sizeof(double)); + + // for some reason on a second iteration g_old = 0 + // so we make two iterations as steepest descent + + if (iter == 0){ // steepest descent direction + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = -g_cur[i]; + g_old[i] = g_cur[i]; + ds[m_index][i] = 0.0; + dy[m_index][i] = 0.0; + + } + } else { + dyds = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + ds[m_index][i] = p_s[i]; + dy[m_index][i] = g_cur[i] - g_old[i]; + dyds += ds[m_index][i] * dy[m_index][i]; + } + MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); + if (fabs(dyds) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; + else rho[m_index] = 1.0e60; + + // set the q vector + + for (int i = 0; i < 3 * nlocal; i++) { + q[i] = g_cur[i]; + } + + // loop over last m indecies + for(int k = num_mem - 1; k > -1; k--) { + // this loop should run from the newest memory to the oldest one. + + c_ind = (k + m_index + 1) % num_mem; + + // dot product between dg and q + + sq = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + sq += ds[c_ind][i] * q[i]; + } + MPI_Allreduce(&sq, &sq_global, 1, MPI_DOUBLE, MPI_SUM, world); + + // update alpha + + alpha[c_ind] = rho[c_ind] * sq_global; + + // update q + + for (int i = 0; i < 3 * nlocal; i++) { + q[i] -= alpha[c_ind] * dy[c_ind][i]; + } + } + + // dot product between dg with itself + yy = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + yy += dy[m_index][i] * dy[m_index][i]; + } + MPI_Allreduce(&yy, &yy_global, 1, MPI_DOUBLE, MPI_SUM, world); + + // calculate now search direction + + if (fabs(yy_global) > 1.0e-60) { + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = q[i] / (rho[m_index] * yy_global); + } + }else{ + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = q[i] * 1.0e60; + } + } + + for (int k = 0; k < num_mem; k++){ + // this loop should run from the oldest memory to the newest one. + + if (iter < num_mem) c_ind = k; + else c_ind = (k + m_index + 1) % num_mem; + + // dot product between p and da + yr = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + yr += dy[c_ind][i] * p_s[i]; + } + MPI_Allreduce(&yr, &yr_global, 1, MPI_DOUBLE, MPI_SUM, world); + + beta = rho[c_ind] * yr_global; + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] += ds[c_ind][i] * (alpha[c_ind] - beta); + } + } + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = -1.0 * p_s[i]; + g_old[i] = g_cur[i]; + } + } + + free(q); + free(alpha); + +} + +/* ---------------------------------------------------------------------- + rotation of spins along the search direction +---------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS_LS::advance_spins() +{ + int nlocal = atom->nlocal; + double **sp = atom->sp; + double **fm = atom->fm; + double tdampx, tdampy, tdampz; + double rot_mat[9]; // exponential of matrix made of search direction + double s_new[3]; + + // loop on all spins on proc. + + for (int i = 0; i < nlocal; i++) { + rodrigues_rotation(p_s + 3 * i, rot_mat); + + // rotate spins + + vm3(rot_mat, sp[i], s_new); + for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; + } +} + +/* ---------------------------------------------------------------------- + compute and return ||mag. torque||_2^2 +------------------------------------------------------------------------- */ + +double MinSpinOSO_LBFGS_LS::fmnorm_sqr() +{ + int nlocal = atom->nlocal; + double tx,ty,tz; + double **sp = atom->sp; + double **fm = atom->fm; + + // calc. magnetic torques + + double local_norm2_sqr = 0.0; + for (int i = 0; i < nlocal; i++) { + tx = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + ty = (fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tz = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + + local_norm2_sqr += tx*tx + ty*ty + tz*tz; + } + + // no extra atom calc. for spins + + if (nextra_atom) + error->all(FLERR,"extra atom option not available yet"); + + double norm2_sqr = 0.0; + MPI_Allreduce(&local_norm2_sqr,&norm2_sqr,1,MPI_DOUBLE,MPI_SUM,world); + + return norm2_sqr; +} + +/* ---------------------------------------------------------------------- + calculate 3x3 matrix exponential using Rodrigues' formula + (R. Murray, Z. Li, and S. Shankar Sastry, + A Mathematical Introduction to + Robotic Manipulation (1994), p. 28 and 30). + + upp_tr - vector x, y, z so that one calculate + U = exp(A) with A= [[0, x, y], + [-x, 0, z], + [-y, -z, 0]] +------------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS_LS::rodrigues_rotation(const double *upp_tr, double *out) +{ + double theta,A,B,D,x,y,z; + double s1,s2,s3,a1,a2,a3; + + if (fabs(upp_tr[0]) < 1.0e-40 && + fabs(upp_tr[1]) < 1.0e-40 && + fabs(upp_tr[2]) < 1.0e-40){ + + // if upp_tr is zero, return unity matrix + for(int k = 0; k < 3; k++){ + for(int m = 0; m < 3; m++){ + if (m == k) out[3 * k + m] = 1.0; + else out[3 * k + m] = 0.0; + } + } + return; + } + + theta = sqrt(upp_tr[0] * upp_tr[0] + + upp_tr[1] * upp_tr[1] + + upp_tr[2] * upp_tr[2]); + + A = cos(theta); + B = sin(theta); + D = 1 - A; + x = upp_tr[0]/theta; + y = upp_tr[1]/theta; + z = upp_tr[2]/theta; + + // diagonal elements of U + + out[0] = A + z * z * D; + out[4] = A + y * y * D; + out[8] = A + x * x * D; + + // off diagonal of U + + s1 = -y * z *D; + s2 = x * z * D; + s3 = -x * y * D; + + a1 = x * B; + a2 = y * B; + a3 = z * B; + + out[1] = s1 + a1; + out[3] = s1 - a1; + out[2] = s2 + a2; + out[6] = s2 - a2; + out[5] = s3 + a3; + out[7] = s3 - a3; + +} + +/* ---------------------------------------------------------------------- + out = vector^T x m, + m -- 3x3 matrix , v -- 3-d vector +------------------------------------------------------------------------- */ + +void MinSpinOSO_LBFGS_LS::vm3(const double *m, const double *v, double *out) +{ + for(int i = 0; i < 3; i++){ + out[i] *= 0.0; + for(int j = 0; j < 3; j++){ + out[i] += *(m + 3 * j + i) * v[j]; + } + } +} + + +void MinSpinOSO_LBFGS_LS::make_step(double c, double *energy_and_der) +{ + double p_scaled[3]; + int nlocal = atom->nlocal; + double rot_mat[9]; // exponential of matrix made of search direction + double s_new[3]; + double **sp = atom->sp; + + for (int i = 0; i < nlocal; i++) { + + // scale the search direction + + for (int j = 0; j < 3; j++) p_scaled[j] = c * p_s[3 * i + j]; + + // calculate rotation matrix + + rodrigues_rotation(p_scaled, rot_mat); + + // rotate spins + + vm3(rot_mat, sp[i], s_new); + for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; + } + + ecurrent = energy_force(0); + calc_gradient(1.0); + neval++; + der_e_cur = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + der_e_cur += g_cur[i] * p_s[i]; + } + energy_and_der[0] = ecurrent; + energy_and_der[1] = der_e_cur; +} + + +int MinSpinOSO_LBFGS_LS::calc_and_make_step(double a, double b, int index) +{ + double e_and_d[2] = {0.0, 0.0}; + double alpha, c1, c2, c3; + double **sp = atom->sp; + int nlocal = atom->nlocal; + + make_step(b, e_and_d); + ecurrent = e_and_d[0]; + der_e_cur = e_and_d[1]; + index++; + + if (awc(der_e_pr, eprevious, e_and_d[1], e_and_d[0]) || index == 3){ + + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = b * p_s[i]; + } + return 1; + } + else{ + double r, f0, f1, df0, df1; + r = b - a; + f0 = eprevious; + f1 = ecurrent; + df0 = der_e_pr; + df1 = der_e_cur; + + c1 = -2.0*(f1-f0)/(r*r*r)+(df1+df0)/(r*r); + c2 = 3.0*(f1-f0)/(r*r)-(df1+2.0*df0)/(r); + c3 = df0; + + alpha = (-c2 + sqrt(c2*c2 - 3.0*c1*c3))/(3.0*c1); + if (alpha < 0.0) alpha = r/2.0; + + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++) sp[i][j] = sp_copy[i][j]; + } + calc_and_make_step(0.0, alpha, index); + } + + return 0; + +} + + +int MinSpinOSO_LBFGS_LS::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){ + + double eps = 1.0e-6; + double delta = 0.1; + double sigma = 0.9; + + if ((phi_j <= phi_0 + eps * fabs(phi_0)) && + ((2.0*delta - 1.0) * der_phi_0 >= der_phi_j >= sigma * der_phi_0)) + return 1; + else + return 0; +} diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.h b/src/SPIN/min_spin_oso_lbfgs_ls.h new file mode 100644 index 0000000000..3e0e608ecb --- /dev/null +++ b/src/SPIN/min_spin_oso_lbfgs_ls.h @@ -0,0 +1,84 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef MINIMIZE_CLASS + +MinimizeStyle(spin/oso_lbfgs_ls, MinSpinOSO_LBFGS_LS) + +#else + +#ifndef LMP_MIN_SPIN_OSO_LBFGS_LS_H +#define LMP_MIN_SPIN_OSO_LBFGS_LS_H + +#include "min.h" + +namespace LAMMPS_NS { + +class MinSpinOSO_LBFGS_LS : public Min { + +public: + MinSpinOSO_LBFGS_LS(class LAMMPS *); + virtual ~MinSpinOSO_LBFGS_LS(); + void init(); + void setup_style(); + int modify_param(int, char **); + void reset_vectors(); + int iterate(int); + double evaluate_dt(); + void advance_spins(); + double fmnorm_sqr(); + void calc_gradient(double); + void calc_search_direction(int); + +private: + // global and spin timesteps + + int nlocal_max; // max value of nlocal (for size of lists) + double dt; + double dts; + + double alpha_damp; // damping for spin minimization + double discrete_factor; // factor for spin timestep evaluation + + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + + double *g_cur; // current gradient vector + double *g_old; // gradient vector at previous step + double *p_s; // search direction vector + double **ds; // change in rotation matrix between two iterations, da + double **dy; // change in gradients between two iterations, dg + double *rho; // estimation of curvature + double **sp_copy; // copy of the spins + + int num_mem; // number of stored steps + + double der_e_cur; // current derivative along search dir. + double der_e_pr; // previous derivative along search dir. + + int use_line_search; // use line search or not. + + + void vm3(const double *, const double *, double *); + void rodrigues_rotation(const double *, double *); + int calc_and_make_step(double, double, int); + int awc(double, double, double, double); + void make_step(double, double *); + + bigint last_negative; +}; + +} + +#endif +#endif From ee8d3ced31fb88bc0356fd55e52053106495ad0a Mon Sep 17 00:00:00 2001 From: alxvov Date: Tue, 2 Jul 2019 16:39:27 +0000 Subject: [PATCH 020/418] change cg to lbfgs in oso_lbfgs --- src/SPIN/min_spin_oso_lbfgs.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index f3643168a4..2283a55e51 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -171,9 +171,9 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) if (nlocal_max < nlocal) { nlocal_max = nlocal; - memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg:g_old"); - memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg:g_cur"); - memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg:p_s"); + memory->grow(g_old,3*nlocal_max,"min/spin/oso/lbfgs:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/oso/lbfgs:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/oso/lbfgs:p_s"); memory->grow(rho,num_mem,"min/spin/oso/lbfgs:rho"); memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:ds"); memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:dy"); From fd5bc857b24f3d62944c45f0d55542deba473aeb Mon Sep 17 00:00:00 2001 From: alxvov Date: Tue, 2 Jul 2019 17:03:15 +0000 Subject: [PATCH 021/418] calculate energy in the beginning only once --- src/SPIN/min_spin.cpp | 2 +- src/SPIN/min_spin_oso_cg.cpp | 4 ++-- src/SPIN/min_spin_oso_lbfgs.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp index 2bddc110e7..2277281e80 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -133,7 +133,7 @@ int MinSpin::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - energy_force(0); + if (iter == 0) energy_force(0); dts = evaluate_dt(); // apply damped precessional dynamics to the spins diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 4449832f54..9ed2cb96ea 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -180,8 +180,8 @@ int MinSpinOSO_CG::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - - energy_force(0); + + if (iter == 0) energy_force(0); dts = evaluate_dt(); calc_gradient(dts); diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index 2283a55e51..b54c42ebfd 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -190,7 +190,7 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - energy_force(0); + if (iter == 0) energy_force(0); // dts = evaluate_dt(); // dts = 1.0; calc_gradient(1.0); From 44ca54fa25cc90f772c352ee0bfa75bad687a16e Mon Sep 17 00:00:00 2001 From: alxvov Date: Tue, 2 Jul 2019 17:06:53 +0000 Subject: [PATCH 022/418] a bit more comments --- src/SPIN/min_spin_oso_cg.cpp | 7 +++++-- src/SPIN/min_spin_oso_lbfgs.cpp | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 9ed2cb96ea..8d03ada45d 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -12,7 +12,7 @@ ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------ - Contributing authors: Aleksei Ivanov (UI) + Contributing authors: Aleksei Ivanov (University of Iceland) Julien Tranchida (SNL) Please cite the related publication: @@ -313,7 +313,10 @@ void MinSpinOSO_CG::calc_gradient(double dts) } /* ---------------------------------------------------------------------- - search direction + search direction: + The Fletcher-Reeves conj. grad. method + See Jorge Nocedal and Stephen J. Wright 'Numerical + Optimization' Second Edition, 2006 (p. 121) ---------------------------------------------------------------------- */ void MinSpinOSO_CG::calc_search_direction(int iter) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index b54c42ebfd..81c36d5e32 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -12,7 +12,7 @@ ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------ - Contributing authors: Aleksei Ivanov (UI) + Contributing authors: Aleksei Ivanov (University of Iceland) Julien Tranchida (SNL) Please cite the related publication: @@ -322,7 +322,10 @@ void MinSpinOSO_LBFGS::calc_gradient(double dts) } /* ---------------------------------------------------------------------- - search direction + search direction: + Limited-memory BFGS. + See Jorge Nocedal and Stephen J. Wright 'Numerical + Optimization' Second Edition, 2006 (p. 177) ---------------------------------------------------------------------- */ void MinSpinOSO_LBFGS::calc_search_direction(int iter) From e3ed8d856209b3f7116f82b3077660ad4c2893ba Mon Sep 17 00:00:00 2001 From: alxvov Date: Tue, 2 Jul 2019 18:02:22 +0000 Subject: [PATCH 023/418] parallelisation of lbfgs, change indentation, more comments --- src/SPIN/min_spin_oso_lbfgs_ls.cpp | 140 ++++++++++++++++------------- 1 file changed, 79 insertions(+), 61 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.cpp b/src/SPIN/min_spin_oso_lbfgs_ls.cpp index f054755129..38a557266e 100644 --- a/src/SPIN/min_spin_oso_lbfgs_ls.cpp +++ b/src/SPIN/min_spin_oso_lbfgs_ls.cpp @@ -12,7 +12,7 @@ ------------------------------------------------------------------------- */ /* ------------------------------------------------------------------------ - Contributing authors: Aleksei Ivanov (UI) + Contributing authors: Aleksei Ivanov (University of Iceland) Julien Tranchida (SNL) Please cite the related publication: @@ -176,6 +176,7 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) double fmdotfm; int flag, flagall; double **sp = atom->sp; + double der_e_cur_global = 0.0; if (nlocal_max < nlocal) { nlocal_max = nlocal; @@ -213,6 +214,8 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) for (int i = 0; i < 3 * nlocal; i++) { der_e_cur += g_cur[i] * p_s[i]; } + MPI_Allreduce(&der_e_cur, &der_e_cur_global, 1, MPI_DOUBLE, MPI_SUM, world); + der_e_cur = der_e_cur_global; } if (use_line_search){ @@ -353,7 +356,10 @@ void MinSpinOSO_LBFGS_LS::calc_gradient(double dts) } /* ---------------------------------------------------------------------- - search direction + search direction: + Limited-memory BFGS. + See Jorge Nocedal and Stephen J. Wright 'Numerical + Optimization' Second Edition, 2006 (p. 177) ---------------------------------------------------------------------- */ void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) @@ -624,26 +630,26 @@ void MinSpinOSO_LBFGS_LS::vm3(const double *m, const double *v, double *out) void MinSpinOSO_LBFGS_LS::make_step(double c, double *energy_and_der) { - double p_scaled[3]; - int nlocal = atom->nlocal; - double rot_mat[9]; // exponential of matrix made of search direction - double s_new[3]; - double **sp = atom->sp; + double p_scaled[3]; + int nlocal = atom->nlocal; + double rot_mat[9]; // exponential of matrix made of search direction + double s_new[3]; + double **sp = atom->sp; + double der_e_cur_global = 0.0;; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < nlocal; i++) { + // scale the search direction - // scale the search direction + for (int j = 0; j < 3; j++) p_scaled[j] = c * p_s[3 * i + j]; - for (int j = 0; j < 3; j++) p_scaled[j] = c * p_s[3 * i + j]; + // calculate rotation matrix - // calculate rotation matrix + rodrigues_rotation(p_scaled, rot_mat); - rodrigues_rotation(p_scaled, rot_mat); + // rotate spins - // rotate spins - - vm3(rot_mat, sp[i], s_new); - for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; + vm3(rot_mat, sp[i], s_new); + for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; } ecurrent = energy_force(0); @@ -653,65 +659,77 @@ void MinSpinOSO_LBFGS_LS::make_step(double c, double *energy_and_der) for (int i = 0; i < 3 * nlocal; i++) { der_e_cur += g_cur[i] * p_s[i]; } + MPI_Allreduce(&der_e_cur, &der_e_cur_global, 1, MPI_DOUBLE, MPI_SUM, world); + der_e_cur = der_e_cur_global; + energy_and_der[0] = ecurrent; energy_and_der[1] = der_e_cur; } +/* ---------------------------------------------------------------------- + Calculate step length which satisfies approximate Wolfe conditions + using the cubic interpolation +------------------------------------------------------------------------- */ int MinSpinOSO_LBFGS_LS::calc_and_make_step(double a, double b, int index) { - double e_and_d[2] = {0.0, 0.0}; - double alpha, c1, c2, c3; - double **sp = atom->sp; - int nlocal = atom->nlocal; + double e_and_d[2] = {0.0, 0.0}; + double alpha, c1, c2, c3; + double **sp = atom->sp; + int nlocal = atom->nlocal; - make_step(b, e_and_d); - ecurrent = e_and_d[0]; - der_e_cur = e_and_d[1]; - index++; + make_step(b, e_and_d); + ecurrent = e_and_d[0]; + der_e_cur = e_and_d[1]; + index++; - if (awc(der_e_pr, eprevious, e_and_d[1], e_and_d[0]) || index == 3){ + if (awc(der_e_pr, eprevious, e_and_d[1], e_and_d[0]) || index == 3){ + MPI_Bcast(&b,1,MPI_DOUBLE,0,world); - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = b * p_s[i]; - } - return 1; + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = b * p_s[i]; + } + return 1; + } + else{ + double r, f0, f1, df0, df1; + r = b - a; + f0 = eprevious; + f1 = ecurrent; + df0 = der_e_pr; + df1 = der_e_cur; + + c1 = -2.0*(f1-f0)/(r*r*r)+(df1+df0)/(r*r); + c2 = 3.0*(f1-f0)/(r*r)-(df1+2.0*df0)/(r); + c3 = df0; + + // f(x) = c1 x^3 + c2 x^2 + c3 x^1 + c4 + // has minimum at alpha below. We do not check boundaries. + + alpha = (-c2 + sqrt(c2*c2 - 3.0*c1*c3))/(3.0*c1); + if (alpha < 0.0) alpha = r/2.0; + + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++) sp[i][j] = sp_copy[i][j]; } - else{ - double r, f0, f1, df0, df1; - r = b - a; - f0 = eprevious; - f1 = ecurrent; - df0 = der_e_pr; - df1 = der_e_cur; - - c1 = -2.0*(f1-f0)/(r*r*r)+(df1+df0)/(r*r); - c2 = 3.0*(f1-f0)/(r*r)-(df1+2.0*df0)/(r); - c3 = df0; - - alpha = (-c2 + sqrt(c2*c2 - 3.0*c1*c3))/(3.0*c1); - if (alpha < 0.0) alpha = r/2.0; - - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++) sp[i][j] = sp_copy[i][j]; - } - calc_and_make_step(0.0, alpha, index); - } - - return 0; + calc_and_make_step(0.0, alpha, index); + } + return 0; } - - +/* ---------------------------------------------------------------------- + Approximate Wolfe conditions: + William W. Hager and Hongchao Zhang + SIAM J. optim., 16(1), 170-192. (23 pages) +------------------------------------------------------------------------- */ int MinSpinOSO_LBFGS_LS::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){ - double eps = 1.0e-6; - double delta = 0.1; - double sigma = 0.9; + double eps = 1.0e-6; + double delta = 0.1; + double sigma = 0.9; - if ((phi_j <= phi_0 + eps * fabs(phi_0)) && - ((2.0*delta - 1.0) * der_phi_0 >= der_phi_j >= sigma * der_phi_0)) - return 1; - else - return 0; + if ((phi_j <= phi_0 + eps * fabs(phi_0)) && ((2.0*delta - 1.0) * der_phi_0 >= der_phi_j >= sigma * der_phi_0)) + return 1; + else + return 0; } From 66a50419734d343a246ab5ce5a91ea327c4f8ab8 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 2 Jul 2019 16:02:36 -0600 Subject: [PATCH 024/418] Commit1 JT 060219 - added all min/spin tests in src/SPIN/neb_spin.cpp - added lbfgs to .gitignore - commit before pull/merge --- src/.gitignore | 2 ++ src/SPIN/min_spin_oso_lbfgs.cpp | 14 +++++++------- src/SPIN/neb_spin.cpp | 5 +++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/.gitignore b/src/.gitignore index 0d802981f9..f0ac3a1ff9 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -163,6 +163,8 @@ /min_spin.h /min_spin_oso_cg.cpp /min_spin_oso_cg.h +/min_spin_oso_lbfgs.cpp +/min_spin_oso_lbfgs.h /neb_spin.cpp /neb_spin.h /pair_spin.cpp diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index f3643168a4..23cb3718c8 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -361,12 +361,12 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) } } else { - dyds = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { - ds[m_index][i] = p_s[i]; - dy[m_index][i] = g_cur[i] - g_old[i]; - dyds += ds[m_index][i] * dy[m_index][i]; - } + dyds = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + ds[m_index][i] = p_s[i]; + dy[m_index][i] = g_cur[i] - g_old[i]; + dyds += ds[m_index][i] * dy[m_index][i]; + } MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); if (fabs(dyds) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; else rho[m_index] = 1.0e60; @@ -409,7 +409,7 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) } MPI_Allreduce(&yy, &yy_global, 1, MPI_DOUBLE, MPI_SUM, world); - // calculate now search direction + // calculate now search direction if (fabs(yy_global) > 1.0e-60) { for (int i = 0; i < 3 * nlocal; i++) { diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index 126cfb09e3..9ab461cbe6 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -50,6 +50,7 @@ #include "memory.h" #include "error.h" #include "math_const.h" +#include "utils.h" using namespace LAMMPS_NS; using namespace MathConst; @@ -194,8 +195,8 @@ void NEBSpin::run() if (update->minimize->searchflag) error->all(FLERR,"NEBSpin requires damped dynamics minimizer"); - if (strcmp(update->minimize_style,"spin") != 0) - error->all(FLERR,"NEBSpin requires spin minimizer"); + if (!utils::strmatch(update->minimize_style,"^spin")) + error->all(FLERR,"NEBSpin requires a spin minimizer"); // setup regular NEBSpin minimization From 8452afb5120c03dfe941afa6a484b98b7e1c5347 Mon Sep 17 00:00:00 2001 From: alxvov Date: Wed, 3 Jul 2019 11:38:31 +0000 Subject: [PATCH 025/418] compare dyds_global instead --- src/SPIN/min_spin_oso_lbfgs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index 83d537030c..e8ac915d8b 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -371,7 +371,7 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) dyds += ds[m_index][i] * dy[m_index][i]; } MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); - if (fabs(dyds) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; + if (fabs(dyds_global) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; else rho[m_index] = 1.0e60; // set the q vector From eaa542b6e78c828756fd83ff82aba113ea36504a Mon Sep 17 00:00:00 2001 From: alxvov Date: Wed, 3 Jul 2019 11:59:54 +0000 Subject: [PATCH 026/418] scale initial gradients with adaptive time step in the beggining, try to use global parameters for lbfgs --- src/SPIN/min_spin_oso_lbfgs.cpp | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index e8ac915d8b..a598601532 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -190,10 +190,13 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - if (iter == 0) energy_force(0); - // dts = evaluate_dt(); - // dts = 1.0; - calc_gradient(1.0); + if (iter == 0){ + energy_force(0); + dts = evaluate_dt(); + } + else dts = 1.0; + + calc_gradient(dts); calc_search_direction(iter); advance_spins(); @@ -371,6 +374,11 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) dyds += ds[m_index][i] * dy[m_index][i]; } MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); + if (update->multireplica == 1) { + dyds = dyds_global; + MPI_Allreduce(&dyds_global,&dyds,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + if (fabs(dyds_global) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; else rho[m_index] = 1.0e60; @@ -393,6 +401,10 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) sq += ds[c_ind][i] * q[i]; } MPI_Allreduce(&sq, &sq_global, 1, MPI_DOUBLE, MPI_SUM, world); + if (update->multireplica == 1) { + sq = sq_global; + MPI_Allreduce(&sq_global,&sq,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } // update alpha @@ -411,6 +423,10 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) yy += dy[m_index][i] * dy[m_index][i]; } MPI_Allreduce(&yy, &yy_global, 1, MPI_DOUBLE, MPI_SUM, world); + if (update->multireplica == 1) { + yy = yy_global; + MPI_Allreduce(&yy_global,&yy,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } // calculate now search direction @@ -435,7 +451,12 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) for (int i = 0; i < 3 * nlocal; i++) { yr += dy[c_ind][i] * p_s[i]; } + MPI_Allreduce(&yr, &yr_global, 1, MPI_DOUBLE, MPI_SUM, world); + if (update->multireplica == 1) { + yr = yr_global; + MPI_Allreduce(&yr_global,&yr,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } beta = rho[c_ind] * yr_global; for (int i = 0; i < 3 * nlocal; i++) { From 48cc0293ffe7129370163ac8c0aa4c3e5c953e3d Mon Sep 17 00:00:00 2001 From: alxvov Date: Wed, 3 Jul 2019 12:01:21 +0000 Subject: [PATCH 027/418] if g2 zero then beta is also zero --- src/SPIN/min_spin_oso_cg.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 8d03ada45d..52bf48d228 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -326,9 +326,8 @@ void MinSpinOSO_CG::calc_search_direction(int iter) double g2 = 0.0; double beta = 0.0; - double g2_global= 0.0; - double g2old_global= 0.0; - + double g2_global = 0.0; + double g2old_global = 0.0; if (iter == 0 || iter % 5 == 0){ // steepest descent direction for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = -g_cur[i]; @@ -347,8 +346,16 @@ void MinSpinOSO_CG::calc_search_direction(int iter) MPI_Allreduce(&g2, &g2_global, 1, MPI_DOUBLE, MPI_SUM, world); MPI_Allreduce(&g2old, &g2old_global, 1, MPI_DOUBLE, MPI_SUM, world); - beta = g2_global / g2old_global; + // we don't know yet if we need this. Needs to be tested with multiple replica. + // if (update->multireplica == 1) { + // g2 = g2_global; + // g2old = g2old_global; + // MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + // MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + // } + if (fabs(g2_global) < 1.0e-40) beta = 0.0; + else beta = g2_global / g2old_global; // calculate conjugate direction for (int i = 0; i < 3 * nlocal; i++) { From 87fd17a4d2ce411cfbcff15d1cdd2bc41550570d Mon Sep 17 00:00:00 2001 From: alxvov Date: Wed, 3 Jul 2019 14:54:02 +0000 Subject: [PATCH 028/418] global dot products --- src/SPIN/min_spin_oso_lbfgs_ls.cpp | 37 +++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.cpp b/src/SPIN/min_spin_oso_lbfgs_ls.cpp index 38a557266e..2e124466ac 100644 --- a/src/SPIN/min_spin_oso_lbfgs_ls.cpp +++ b/src/SPIN/min_spin_oso_lbfgs_ls.cpp @@ -216,6 +216,9 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) } MPI_Allreduce(&der_e_cur, &der_e_cur_global, 1, MPI_DOUBLE, MPI_SUM, world); der_e_cur = der_e_cur_global; + if (update->multireplica == 1) { + MPI_Allreduce(&der_e_cur_global,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } } if (use_line_search){ @@ -388,7 +391,7 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) // for some reason on a second iteration g_old = 0 // so we make two iterations as steepest descent - + if (iter == 0){ // steepest descent direction for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = -g_cur[i]; @@ -405,7 +408,12 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) dyds += ds[m_index][i] * dy[m_index][i]; } MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); - if (fabs(dyds) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; + if (update->multireplica == 1) { + dyds = dyds_global; + MPI_Allreduce(&dyds_global,&dyds,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + + if (fabs(dyds_global) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; else rho[m_index] = 1.0e60; // set the q vector @@ -427,7 +435,10 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) sq += ds[c_ind][i] * q[i]; } MPI_Allreduce(&sq, &sq_global, 1, MPI_DOUBLE, MPI_SUM, world); - + if (update->multireplica == 1) { + sq = sq_global; + MPI_Allreduce(&sq_global,&sq,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } // update alpha alpha[c_ind] = rho[c_ind] * sq_global; @@ -445,8 +456,12 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) yy += dy[m_index][i] * dy[m_index][i]; } MPI_Allreduce(&yy, &yy_global, 1, MPI_DOUBLE, MPI_SUM, world); + if (update->multireplica == 1) { + yy = yy_global; + MPI_Allreduce(&yy_global,&yy,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } - // calculate now search direction + // calculate now search direction if (fabs(yy_global) > 1.0e-60) { for (int i = 0; i < 3 * nlocal; i++) { @@ -470,6 +485,10 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) yr += dy[c_ind][i] * p_s[i]; } MPI_Allreduce(&yr, &yr_global, 1, MPI_DOUBLE, MPI_SUM, world); + if (update->multireplica == 1) { + yr = yr_global; + MPI_Allreduce(&yr_global,&yr,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } beta = rho[c_ind] * yr_global; for (int i = 0; i < 3 * nlocal; i++) { @@ -661,6 +680,9 @@ void MinSpinOSO_LBFGS_LS::make_step(double c, double *energy_and_der) } MPI_Allreduce(&der_e_cur, &der_e_cur_global, 1, MPI_DOUBLE, MPI_SUM, world); der_e_cur = der_e_cur_global; + if (update->multireplica == 1) { + MPI_Allreduce(&der_e_cur_global,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } energy_and_der[0] = ecurrent; energy_and_der[1] = der_e_cur; @@ -685,10 +707,9 @@ int MinSpinOSO_LBFGS_LS::calc_and_make_step(double a, double b, int index) if (awc(der_e_pr, eprevious, e_and_d[1], e_and_d[0]) || index == 3){ MPI_Bcast(&b,1,MPI_DOUBLE,0,world); - - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = b * p_s[i]; - } + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = b * p_s[i]; + } return 1; } else{ From 747245ee907151deb6cd691f9d53b43972f033d3 Mon Sep 17 00:00:00 2001 From: alxvov Date: Wed, 3 Jul 2019 15:06:53 +0000 Subject: [PATCH 029/418] sum beta over all replicas in cg. Good for GNEB --- src/SPIN/min_spin_oso_cg.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 52bf48d228..1b4e33ace3 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -346,13 +346,13 @@ void MinSpinOSO_CG::calc_search_direction(int iter) MPI_Allreduce(&g2, &g2_global, 1, MPI_DOUBLE, MPI_SUM, world); MPI_Allreduce(&g2old, &g2old_global, 1, MPI_DOUBLE, MPI_SUM, world); - // we don't know yet if we need this. Needs to be tested with multiple replica. - // if (update->multireplica == 1) { - // g2 = g2_global; - // g2old = g2old_global; - // MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - // MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - // } + // Sum over all replicas. Good for GNEB. + if (update->multireplica == 1) { + g2 = g2_global; + g2old = g2old_global; + MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } if (fabs(g2_global) < 1.0e-40) beta = 0.0; else beta = g2_global / g2old_global; From eb9f5cf1286ece343803217c573a72961d5d1cc3 Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 27 Jun 2019 17:50:45 +0200 Subject: [PATCH 030/418] Update gcmc to have a max and min --- src/MC/fix_gcmc.cpp | 26 ++++++++++++++++++++++---- src/MC/fix_gcmc.h | 2 ++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index 7ab0879335..51f781e4d9 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -272,6 +272,8 @@ void FixGCMC::options(int narg, char **arg) tfac_insert = 1.0; overlap_cutoffsq = 0.0; overlap_flag = 0; + min_ngas = -1; + max_ngas = -1; int iarg = 0; while (iarg < narg) { @@ -391,6 +393,14 @@ void FixGCMC::options(int narg, char **arg) overlap_cutoffsq = rtmp*rtmp; overlap_flag = 1; iarg += 2; + } else if (strcmp(arg[iarg],"min") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix gcmc command"); + min_ngas = force->numeric(FLERR,arg[iarg+1]); + iarg += 2; + } else if (strcmp(arg[iarg],"max") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix gcmc command"); + max_ngas = force->numeric(FLERR,arg[iarg+1]); + iarg += 2; } else error->all(FLERR,"Illegal fix gcmc command"); } } @@ -897,7 +907,7 @@ void FixGCMC::attempt_atomic_deletion() { ndeletion_attempts += 1.0; - if (ngas == 0) return; + if (ngas == 0 || ngas == min_ngas) return; int i = pick_random_gas_atom(); @@ -938,6 +948,8 @@ void FixGCMC::attempt_atomic_insertion() ninsertion_attempts += 1.0; + if (ngas == max_ngas) return; + // pick coordinates for insertion point double coord[3]; @@ -1252,7 +1264,7 @@ void FixGCMC::attempt_molecule_deletion() { ndeletion_attempts += 1.0; - if (ngas == 0) return; + if (ngas == 0 || ngas == min_ngas) return; // work-around to avoid n=0 problem with fix rigid/nvt/small @@ -1291,6 +1303,8 @@ void FixGCMC::attempt_molecule_insertion() double lamda[3]; ninsertion_attempts += 1.0; + if (ngas == max_ngas) return; + double com_coord[3]; if (regionflag) { int region_attempt = 0; @@ -1574,7 +1588,7 @@ void FixGCMC::attempt_atomic_deletion_full() ndeletion_attempts += 1.0; - if (ngas == 0) return; + if (ngas == 0 || ngas == min_ngas) return; double energy_before = energy_stored; @@ -1623,6 +1637,8 @@ void FixGCMC::attempt_atomic_insertion_full() double lamda[3]; ninsertion_attempts += 1.0; + if (ngas == max_ngas) return; + double energy_before = energy_stored; double coord[3]; @@ -1918,7 +1934,7 @@ void FixGCMC::attempt_molecule_deletion_full() { ndeletion_attempts += 1.0; - if (ngas == 0) return; + if (ngas == 0 || ngas == min_ngas) return; // work-around to avoid n=0 problem with fix rigid/nvt/small @@ -2001,6 +2017,8 @@ void FixGCMC::attempt_molecule_insertion_full() double lamda[3]; ninsertion_attempts += 1.0; + if (ngas == max_ngas) return; + double energy_before = energy_stored; tagint maxmol = 0; diff --git a/src/MC/fix_gcmc.h b/src/MC/fix_gcmc.h index 5d0b7aab8f..e19a42ef73 100644 --- a/src/MC/fix_gcmc.h +++ b/src/MC/fix_gcmc.h @@ -120,6 +120,8 @@ class FixGCMC : public Fix { imageint imagezero; double overlap_cutoffsq; // square distance cutoff for overlap int overlap_flag; + int max_ngas; + int min_ngas; double energy_intra; From fb63c5a7085f3f5d6362f4cf3515bcd9666e469d Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 3 Jul 2019 09:37:43 -0600 Subject: [PATCH 031/418] Commit1 JT 070319 - commit before pull --- src/SPIN/min_spin_oso_cg.cpp | 8 ++++---- src/SPIN/neb_spin.cpp | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 52bf48d228..094ae376aa 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -154,8 +154,6 @@ void MinSpinOSO_CG::reset_vectors() minimization via damped spin dynamics ------------------------------------------------------------------------- */ -// g_old g_cur p_s - int MinSpinOSO_CG::iterate(int maxiter) { int nlocal = atom->nlocal; @@ -163,6 +161,8 @@ int MinSpinOSO_CG::iterate(int maxiter) double fmdotfm; int flag, flagall; + // grow tables if nlocal increased + if (nlocal_max < nlocal) { nlocal_max = nlocal; memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg:g_old"); @@ -354,8 +354,8 @@ void MinSpinOSO_CG::calc_search_direction(int iter) // MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); // } - if (fabs(g2_global) < 1.0e-40) beta = 0.0; - else beta = g2_global / g2old_global; + //if (fabs(g2_global) < 1.0e-40) beta = 0.0; + //else beta = g2_global / g2old_global; // calculate conjugate direction for (int i = 0; i < 3 * nlocal; i++) { diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index 9ab461cbe6..12d1d2a956 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -252,6 +252,8 @@ void NEBSpin::run() timer->init(); timer->barrier_start(); + // if(ireplica != 0 && ireplica != nreplica -1) + while (update->minimize->niter < n1steps) { update->minimize->run(nevery); print_status(); From 526e0da0a90bdd55458892a959b1bf1c60ce6204 Mon Sep 17 00:00:00 2001 From: alxvov Date: Wed, 3 Jul 2019 15:41:29 +0000 Subject: [PATCH 032/418] reduce correctly over the universe --- src/SPIN/min_spin_oso_lbfgs.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index a598601532..5604f99752 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -376,7 +376,7 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); if (update->multireplica == 1) { dyds = dyds_global; - MPI_Allreduce(&dyds_global,&dyds,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&dyds, &dyds_global, 1,MPI_DOUBLE,MPI_SUM,universe->uworld); } if (fabs(dyds_global) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; @@ -403,7 +403,7 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) MPI_Allreduce(&sq, &sq_global, 1, MPI_DOUBLE, MPI_SUM, world); if (update->multireplica == 1) { sq = sq_global; - MPI_Allreduce(&sq_global,&sq,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&sq,&sq_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } // update alpha @@ -425,7 +425,7 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) MPI_Allreduce(&yy, &yy_global, 1, MPI_DOUBLE, MPI_SUM, world); if (update->multireplica == 1) { yy = yy_global; - MPI_Allreduce(&yy_global,&yy,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&yy,&yy_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } // calculate now search direction @@ -455,7 +455,7 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) MPI_Allreduce(&yr, &yr_global, 1, MPI_DOUBLE, MPI_SUM, world); if (update->multireplica == 1) { yr = yr_global; - MPI_Allreduce(&yr_global,&yr,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&yr,&yr_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } beta = rho[c_ind] * yr_global; From 99e58d889cdf3ba9794cd97b5315b891120b165b Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 3 Jul 2019 10:48:11 -0600 Subject: [PATCH 033/418] Commit2 JT 070319 - fixing first and last images in oso_lbfgs.cpp --- src/SPIN/min_spin_oso_lbfgs.cpp | 20 +++++++++++++++++++- src/SPIN/min_spin_oso_lbfgs.h | 5 +++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index 5604f99752..a14bf7c4fd 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -39,6 +39,8 @@ #include "math_special.h" #include "math_const.h" +#include "universe.h" + using namespace LAMMPS_NS; using namespace MathConst; @@ -66,6 +68,13 @@ MinSpinOSO_LBFGS::MinSpinOSO_LBFGS(LAMMPS *lmp) : { if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_lbfgs); nlocal_max = 0; + + // nreplica = number of partitions + // ireplica = which world I am in universe + + nreplica = universe->nworlds; + ireplica = universe->iworld; + } /* ---------------------------------------------------------------------- */ @@ -198,7 +207,16 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) calc_gradient(dts); calc_search_direction(iter); - advance_spins(); + + // to be checked + // if gneb calc., nreplica > 0 + // then advance spins only if intermediate replica + // otherwise (simple minimization), advance spins + + if (nreplica > 0) { + if(ireplica != 0 && ireplica != nreplica-1) + advance_spins(); + } else advance_spins(); eprevious = ecurrent; ecurrent = energy_force(0); diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h index 3aa326142c..3fc1d625dd 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -41,6 +41,11 @@ public: void calc_search_direction(int); private: + + + // test + int ireplica,nreplica; + // global and spin timesteps int nlocal_max; // max value of nlocal (for size of lists) From 3c3c7899b4fdceb378c206870ee4e93ff76711df Mon Sep 17 00:00:00 2001 From: alxvov Date: Wed, 3 Jul 2019 19:33:24 +0000 Subject: [PATCH 034/418] use local iteration counter, needed for neb --- src/SPIN/min_spin_oso_cg.cpp | 13 ++++++++----- src/SPIN/min_spin_oso_cg.h | 3 ++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 1b4e33ace3..8f2ba0623b 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -83,7 +83,7 @@ void MinSpinOSO_CG::init() { alpha_damp = 1.0; discrete_factor = 10.0; - + local_iter = 0; Min::init(); dts = dt = update->dt; @@ -164,6 +164,7 @@ int MinSpinOSO_CG::iterate(int maxiter) int flag, flagall; if (nlocal_max < nlocal) { + local_iter = 0; nlocal_max = nlocal; memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg:g_old"); memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg:g_cur"); @@ -181,11 +182,11 @@ int MinSpinOSO_CG::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - if (iter == 0) energy_force(0); + if (local_iter == 0) energy_force(0); dts = evaluate_dt(); calc_gradient(dts); - calc_search_direction(iter); + calc_search_direction(); advance_spins(); eprevious = ecurrent; @@ -319,7 +320,7 @@ void MinSpinOSO_CG::calc_gradient(double dts) Optimization' Second Edition, 2006 (p. 121) ---------------------------------------------------------------------- */ -void MinSpinOSO_CG::calc_search_direction(int iter) +void MinSpinOSO_CG::calc_search_direction() { int nlocal = atom->nlocal; double g2old = 0.0; @@ -328,7 +329,7 @@ void MinSpinOSO_CG::calc_search_direction(int iter) double g2_global = 0.0; double g2old_global = 0.0; - if (iter == 0 || iter % 5 == 0){ // steepest descent direction + if (local_iter == 0 || local_iter % 5 == 0){ // steepest descent direction for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = -g_cur[i]; g_old[i] = g_cur[i]; @@ -363,6 +364,8 @@ void MinSpinOSO_CG::calc_search_direction(int iter) g_old[i] = g_cur[i]; } } + + local_iter++; } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/min_spin_oso_cg.h b/src/SPIN/min_spin_oso_cg.h index a791754836..3a3d24f078 100644 --- a/src/SPIN/min_spin_oso_cg.h +++ b/src/SPIN/min_spin_oso_cg.h @@ -38,7 +38,7 @@ public: void advance_spins(); double fmnorm_sqr(); void calc_gradient(double); - void calc_search_direction(int); + void calc_search_direction(); private: // global and spin timesteps @@ -56,6 +56,7 @@ private: double *g_old; // gradient vector at previous iteration double *g_cur; // current gradient vector double *p_s; // search direction vector + int local_iter; // number of times we call search_direction void vm3(const double *, const double *, double *); void rodrigues_rotation(const double *, double *); From 95cf85f1b932acc983ab826c90cdcc78e3991751 Mon Sep 17 00:00:00 2001 From: alxvov Date: Wed, 3 Jul 2019 21:12:04 +0000 Subject: [PATCH 035/418] bug: forget to calculate beta.. --- src/SPIN/min_spin_oso_cg.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 6ae2518986..d8535b19c4 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -355,10 +355,9 @@ void MinSpinOSO_CG::calc_search_direction() MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } - //if (fabs(g2_global) < 1.0e-40) beta = 0.0; - //else beta = g2_global / g2old_global; + if (fabs(g2_global) < 1.0e-60) beta = 0.0; + else beta = g2_global / g2old_global; // calculate conjugate direction - for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = beta * p_s[i] - g_cur[i]; g_old[i] = g_cur[i]; From e85bdd17d3a2980f1987f2770c1958c8bbcd8015 Mon Sep 17 00:00:00 2001 From: alxvov Date: Thu, 4 Jul 2019 15:31:18 +0000 Subject: [PATCH 036/418] introduce cutoff step. make lbfgs stable --- src/SPIN/min_spin_oso_lbfgs.cpp | 107 +++++++++++++++++++++++++------- src/SPIN/min_spin_oso_lbfgs.h | 12 ++-- 2 files changed, 92 insertions(+), 27 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index a14bf7c4fd..09948ac3e5 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -38,7 +38,6 @@ #include "modify.h" #include "math_special.h" #include "math_const.h" - #include "universe.h" using namespace LAMMPS_NS; @@ -96,6 +95,8 @@ void MinSpinOSO_LBFGS::init() alpha_damp = 1.0; discrete_factor = 10.0; num_mem = 3; + local_iter = 0; + maxepsrot = MY_2PI / (200.0); Min::init(); @@ -180,6 +181,7 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) if (nlocal_max < nlocal) { nlocal_max = nlocal; + local_iter = 0; memory->grow(g_old,3*nlocal_max,"min/spin/oso/lbfgs:g_old"); memory->grow(g_cur,3*nlocal_max,"min/spin/oso/lbfgs:g_cur"); memory->grow(p_s,3*nlocal_max,"min/spin/oso/lbfgs:p_s"); @@ -198,26 +200,26 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - - if (iter == 0){ - energy_force(0); - dts = evaluate_dt(); - } - else dts = 1.0; + if (local_iter == 0) energy_force(0); + // to be checked + // if gneb calc., nreplica > 1 + // then calculate gradients of intermediate replicas - calc_gradient(dts); + if (nreplica > 1) { + if(ireplica != 0 && ireplica != nreplica-1) + calc_gradient(1.0); + } else calc_gradient(1.0); calc_search_direction(iter); // to be checked - // if gneb calc., nreplica > 0 + // if gneb calc., nreplica > 1 // then advance spins only if intermediate replica // otherwise (simple minimization), advance spins - if (nreplica > 0) { + if (nreplica > 1) { if(ireplica != 0 && ireplica != nreplica-1) advance_spins(); } else advance_spins(); - eprevious = ecurrent; ecurrent = energy_force(0); neval++; @@ -307,7 +309,7 @@ double MinSpinOSO_LBFGS::evaluate_dt() // define max timestep by dividing by the // inverse of max frequency by discrete_factor - + // std::cout << fmaxsqall << "\n"; dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); return dtmax; @@ -365,20 +367,31 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) double yr_global = 0.0; double beta_global = 0.0; - int m_index = iter % num_mem; // memory index + int m_index = local_iter % num_mem; // memory index int c_ind = 0; double *q; double *alpha; + double factor; + double scaling; + + if (nreplica > 1) { + if (ireplica == 0 || ireplica == nreplica - 1) { + factor = 0.0; + } + else factor = 1.0; + }else{ + factor = 1.0; + } + q = (double *) calloc(3*nlocal, sizeof(double)); alpha = (double *) calloc(num_mem, sizeof(double)); - // for some reason on a second iteration g_old = 0 - // so we make two iterations as steepest descent - - if (iter == 0){ // steepest descent direction + if (local_iter == 0){ // steepest descent direction + + scaling = maximum_rotation(g_cur); for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = -g_cur[i]; + p_s[i] = - g_cur[i] * factor * scaling; g_old[i] = g_cur[i]; ds[m_index][i] = 0.0; dy[m_index][i] = 0.0; @@ -392,7 +405,9 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) dyds += ds[m_index][i] * dy[m_index][i]; } MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); + if (update->multireplica == 1) { + dyds_global *= factor; dyds = dyds_global; MPI_Allreduce(&dyds, &dyds_global, 1,MPI_DOUBLE,MPI_SUM,universe->uworld); } @@ -400,6 +415,17 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) if (fabs(dyds_global) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; else rho[m_index] = 1.0e60; + if (rho[m_index] < 0.0){ + local_iter = 0; + for (int k = 0; k < num_mem; k++){ + for (int i = 0; i < nlocal; i ++){ + ds[k][i] = 0.0; + dy[k][i] = 0.0; + } + } + return calc_search_direction(0); + } + // set the q vector for (int i = 0; i < 3 * nlocal; i++) { @@ -420,6 +446,7 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) } MPI_Allreduce(&sq, &sq_global, 1, MPI_DOUBLE, MPI_SUM, world); if (update->multireplica == 1) { + sq_global *= factor; sq = sq_global; MPI_Allreduce(&sq,&sq_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } @@ -442,19 +469,22 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) } MPI_Allreduce(&yy, &yy_global, 1, MPI_DOUBLE, MPI_SUM, world); if (update->multireplica == 1) { + yy_global *= factor; yy = yy_global; MPI_Allreduce(&yy,&yy_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } // calculate now search direction - if (fabs(yy_global) > 1.0e-60) { + double devis = rho[m_index] * yy_global; + + if (fabs(devis) > 1.0e-60) { for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = q[i] / (rho[m_index] * yy_global); + p_s[i] = factor * q[i] / devis; } }else{ for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = q[i] * 1.0e60; + p_s[i] = factor * q[i] * 1.0e60; } } @@ -472,6 +502,7 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) MPI_Allreduce(&yr, &yr_global, 1, MPI_DOUBLE, MPI_SUM, world); if (update->multireplica == 1) { + yr_global *= factor; yr = yr_global; MPI_Allreduce(&yr,&yr_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } @@ -481,12 +512,14 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) p_s[i] += ds[c_ind][i] * (alpha[c_ind] - beta); } } + scaling = maximum_rotation(p_s); for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = -1.0 * p_s[i]; + p_s[i] = - factor * p_s[i] * scaling; g_old[i] = g_cur[i]; } } + local_iter++; free(q); free(alpha); @@ -631,3 +664,33 @@ void MinSpinOSO_LBFGS::vm3(const double *m, const double *v, double *out) } } } + +double MinSpinOSO_LBFGS::maximum_rotation(double *p) +{ + double norm, norm_global, scaling, alpha; + int nlocal = atom->nlocal; + int ntotal = 0; + + norm = 0.0; + for (int i = 0; i < 3 * nlocal; i++) norm += p[i] * p[i]; + + MPI_Allreduce(&norm,&norm_global,1,MPI_DOUBLE,MPI_SUM,world); + if (update->multireplica == 1) { + norm = norm_global; + MPI_Allreduce(&norm,&norm_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + + MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,world); + if (update->multireplica == 1) { + nlocal = ntotal; + MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,universe->uworld); + } + + scaling = (maxepsrot * sqrt((double) ntotal / norm_global)); + + if (scaling < 1.0) alpha = scaling; + else alpha = 1.0; + + return alpha; +} + diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h index 3fc1d625dd..dfc4ec06ff 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -38,8 +38,8 @@ public: void advance_spins(); double fmnorm_sqr(); void calc_gradient(double); - void calc_search_direction(int); - + void calc_search_direction(int); + double maximum_rotation(double *); private: @@ -64,11 +64,13 @@ private: double **ds; // change in rotation matrix between two iterations, da double **dy; // change in gradients between two iterations, dg double *rho; // estimation of curvature - int num_mem; // number of stored steps + int num_mem; // number of stored steps + int local_iter; // number of times we call search_direction + double maxepsrot; - void vm3(const double *m, const double *v, double *out); - void rodrigues_rotation(const double *upp_tr, double *out); + void vm3(const double *, const double *, double *); + void rodrigues_rotation(const double *, double *); bigint last_negative; }; From f3985c853edace460556d87ff22ed81de884cb25 Mon Sep 17 00:00:00 2001 From: alxvov Date: Thu, 4 Jul 2019 18:19:57 +0000 Subject: [PATCH 037/418] local iter instead of iter --- src/SPIN/min_spin_oso_lbfgs.cpp | 12 ++++++------ src/SPIN/min_spin_oso_lbfgs.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index 09948ac3e5..9687f2f64d 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -96,7 +96,7 @@ void MinSpinOSO_LBFGS::init() discrete_factor = 10.0; num_mem = 3; local_iter = 0; - maxepsrot = MY_2PI / (200.0); + maxepsrot = MY_2PI / (100.0); Min::init(); @@ -209,7 +209,7 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) if(ireplica != 0 && ireplica != nreplica-1) calc_gradient(1.0); } else calc_gradient(1.0); - calc_search_direction(iter); + calc_search_direction(); // to be checked // if gneb calc., nreplica > 1 @@ -351,7 +351,7 @@ void MinSpinOSO_LBFGS::calc_gradient(double dts) Optimization' Second Edition, 2006 (p. 177) ---------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS::calc_search_direction(int iter) +void MinSpinOSO_LBFGS::calc_search_direction() { int nlocal = atom->nlocal; @@ -418,12 +418,12 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) if (rho[m_index] < 0.0){ local_iter = 0; for (int k = 0; k < num_mem; k++){ - for (int i = 0; i < nlocal; i ++){ + for (int i = 0; i < nlocal; i ++){ ds[k][i] = 0.0; dy[k][i] = 0.0; } } - return calc_search_direction(0); + return calc_search_direction(); } // set the q vector @@ -491,7 +491,7 @@ void MinSpinOSO_LBFGS::calc_search_direction(int iter) for (int k = 0; k < num_mem; k++){ // this loop should run from the oldest memory to the newest one. - if (iter < num_mem) c_ind = k; + if (local_iter < num_mem) c_ind = k; else c_ind = (k + m_index + 1) % num_mem; // dot product between p and da diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h index dfc4ec06ff..c0f8dc484d 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -38,7 +38,7 @@ public: void advance_spins(); double fmnorm_sqr(); void calc_gradient(double); - void calc_search_direction(int); + void calc_search_direction(); double maximum_rotation(double *); private: From 79f8e422f9f8ee044db5b9e5cb7cee6b637e3dff Mon Sep 17 00:00:00 2001 From: alxvov Date: Thu, 4 Jul 2019 18:21:07 +0000 Subject: [PATCH 038/418] indentation --- src/SPIN/min_spin_oso_lbfgs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index 9687f2f64d..fd83e7b460 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -418,7 +418,7 @@ void MinSpinOSO_LBFGS::calc_search_direction() if (rho[m_index] < 0.0){ local_iter = 0; for (int k = 0; k < num_mem; k++){ - for (int i = 0; i < nlocal; i ++){ + for (int i = 0; i < nlocal; i ++){ ds[k][i] = 0.0; dy[k][i] = 0.0; } From bb325a335ed3c8a8e612142aff2547461a3c35d3 Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 10 Jul 2019 09:52:39 -0600 Subject: [PATCH 039/418] Commit1 JT 070919 - test energy/torque modif with etotal --- src/SPIN/pair_spin_dmi.cpp | 8 ++++---- src/SPIN/pair_spin_exchange.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index 41430d230f..817d933698 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -317,7 +317,7 @@ void PairSpinDmi::compute(int eflag, int vflag) if (eflag) { evdwl -= (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); - evdwl *= hbar; + evdwl *= 0.5*hbar; } else evdwl = 0.0; if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, @@ -431,9 +431,9 @@ void PairSpinDmi::compute_dmi(int i, int j, double eij[3], double fmi[3], double dmiy = eij[2]*v_dmx[itype][jtype] - eij[0]*v_dmz[itype][jtype]; dmiz = eij[0]*v_dmy[itype][jtype] - eij[1]*v_dmx[itype][jtype]; - fmi[0] -= (dmiy*spj[2] - dmiz*spj[1]); - fmi[1] -= (dmiz*spj[0] - dmix*spj[2]); - fmi[2] -= (dmix*spj[1] - dmiy*spj[0]); + fmi[0] -= 2.0*(dmiy*spj[2] - dmiz*spj[1]); + fmi[1] -= 2.0*(dmiz*spj[0] - dmix*spj[2]); + fmi[2] -= 2.0*(dmix*spj[1] - dmiy*spj[0]); } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index 93b6d9501e..721002acba 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -300,7 +300,7 @@ void PairSpinExchange::compute(int eflag, int vflag) if (eflag) { evdwl -= (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); - evdwl *= hbar; + evdwl *= 0.5*hbar; } else evdwl = 0.0; if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, @@ -409,9 +409,9 @@ void PairSpinExchange::compute_exchange(int i, int j, double rsq, double fmi[3], Jex *= (1.0-J2[itype][jtype]*ra); Jex *= exp(-ra); - fmi[0] += Jex*spj[0]; - fmi[1] += Jex*spj[1]; - fmi[2] += Jex*spj[2]; + fmi[0] += 2.0*Jex*spj[0]; + fmi[1] += 2.0*Jex*spj[1]; + fmi[2] += 2.0*Jex*spj[2]; } /* ---------------------------------------------------------------------- From 2b2a9e775eed2d8991d776e3f50afd9f678f130c Mon Sep 17 00:00:00 2001 From: alxvov Date: Thu, 11 Jul 2019 08:24:28 +0000 Subject: [PATCH 040/418] fix memory, add sp_copy --- src/SPIN/min_spin_oso_lbfgs_ls.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.cpp b/src/SPIN/min_spin_oso_lbfgs_ls.cpp index 2e124466ac..0d9c2d7c51 100644 --- a/src/SPIN/min_spin_oso_lbfgs_ls.cpp +++ b/src/SPIN/min_spin_oso_lbfgs_ls.cpp @@ -64,7 +64,7 @@ static const char cite_minstyle_spin_oso_lbfgs_ls[] = /* ---------------------------------------------------------------------- */ MinSpinOSO_LBFGS_LS::MinSpinOSO_LBFGS_LS(LAMMPS *lmp) : - Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), ds(NULL), dy(NULL), rho(NULL) + Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), ds(NULL), dy(NULL), rho(NULL), sp_copy(NULL) { if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_lbfgs_ls); nlocal_max = 0; From 6238ad321228ef4320dc0f006b30f6e150ed7890 Mon Sep 17 00:00:00 2001 From: alxvov Date: Thu, 11 Jul 2019 14:18:42 +0000 Subject: [PATCH 041/418] local iterator, broadcast more --- src/SPIN/min_spin_oso_lbfgs_ls.cpp | 100 ++++++++++++++++++++--------- src/SPIN/min_spin_oso_lbfgs_ls.h | 6 +- 2 files changed, 75 insertions(+), 31 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.cpp b/src/SPIN/min_spin_oso_lbfgs_ls.cpp index 0d9c2d7c51..e1a6ae99d5 100644 --- a/src/SPIN/min_spin_oso_lbfgs_ls.cpp +++ b/src/SPIN/min_spin_oso_lbfgs_ls.cpp @@ -38,6 +38,7 @@ #include "modify.h" #include "math_special.h" #include "math_const.h" +#include "universe.h" #include @@ -68,6 +69,13 @@ MinSpinOSO_LBFGS_LS::MinSpinOSO_LBFGS_LS(LAMMPS *lmp) : { if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_lbfgs_ls); nlocal_max = 0; + + // nreplica = number of partitions + // ireplica = which world I am in universe + + nreplica = universe->nworlds; + ireplica = universe->iworld; + } /* ---------------------------------------------------------------------- */ @@ -90,6 +98,7 @@ void MinSpinOSO_LBFGS_LS::init() alpha_damp = 1.0; discrete_factor = 10.0; num_mem = 3; + local_iter = 0; der_e_cur = 0.0; der_e_pr = 0.0; use_line_search = 1; @@ -189,7 +198,6 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs_ls:sp_copy"); } - for (int iter = 0; iter < maxiter; iter++) { if (timer->check_timeout(niter)) @@ -201,13 +209,12 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - if (iter == 0){ + if (local_iter == 0){ ecurrent = energy_force(0); calc_gradient(1.0); neval++; - }else{ } - calc_search_direction(iter); + calc_search_direction(); if (use_line_search) { der_e_cur = 0.0; @@ -365,7 +372,7 @@ void MinSpinOSO_LBFGS_LS::calc_gradient(double dts) Optimization' Second Edition, 2006 (p. 177) ---------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) +void MinSpinOSO_LBFGS_LS::calc_search_direction() { int nlocal = atom->nlocal; @@ -381,41 +388,64 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) double yr_global = 0.0; double beta_global = 0.0; - int m_index = iter % num_mem; // memory index + int m_index = local_iter % num_mem; // memory index int c_ind = 0; double *q; double *alpha; + double factor; + + if (nreplica > 1) { + if (ireplica == 0 || ireplica == nreplica - 1) { + factor = 0.0; + } + else factor = 1.0; + }else{ + factor = 1.0; + } + q = (double *) calloc(3*nlocal, sizeof(double)); alpha = (double *) calloc(num_mem, sizeof(double)); - // for some reason on a second iteration g_old = 0 - // so we make two iterations as steepest descent - - if (iter == 0){ // steepest descent direction + if (local_iter == 0){ // steepest descent direction for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = -g_cur[i]; g_old[i] = g_cur[i]; - ds[m_index][i] = 0.0; - dy[m_index][i] = 0.0; - + for (int k = 0; k < num_mem; k++){ + ds[k][i] = 0.0; + dy[k][i] = 0.0; + rho[k] = 0.0; + } } } else { - dyds = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { - ds[m_index][i] = p_s[i]; - dy[m_index][i] = g_cur[i] - g_old[i]; - dyds += ds[m_index][i] * dy[m_index][i]; - } + dyds = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + ds[m_index][i] = p_s[i]; + dy[m_index][i] = g_cur[i] - g_old[i]; + dyds += ds[m_index][i] * dy[m_index][i]; + } MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); + if (update->multireplica == 1) { + dyds_global *= factor; dyds = dyds_global; - MPI_Allreduce(&dyds_global,&dyds,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&dyds, &dyds_global, 1,MPI_DOUBLE,MPI_SUM,universe->uworld); } - if (fabs(dyds_global) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; + if (fabs(dyds_global) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; else rho[m_index] = 1.0e60; + if (rho[m_index] < 0.0){ + local_iter = 0; + for (int k = 0; k < num_mem; k++){ + for (int i = 0; i < nlocal; i ++){ + ds[k][i] = 0.0; + dy[k][i] = 0.0; + } + } + return calc_search_direction(); + } + // set the q vector for (int i = 0; i < 3 * nlocal; i++) { @@ -436,9 +466,11 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) } MPI_Allreduce(&sq, &sq_global, 1, MPI_DOUBLE, MPI_SUM, world); if (update->multireplica == 1) { + sq_global *= factor; sq = sq_global; - MPI_Allreduce(&sq_global,&sq,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&sq,&sq_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } + // update alpha alpha[c_ind] = rho[c_ind] * sq_global; @@ -457,26 +489,29 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) } MPI_Allreduce(&yy, &yy_global, 1, MPI_DOUBLE, MPI_SUM, world); if (update->multireplica == 1) { + yy_global *= factor; yy = yy_global; - MPI_Allreduce(&yy_global,&yy,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&yy,&yy_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } // calculate now search direction - if (fabs(yy_global) > 1.0e-60) { + double devis = rho[m_index] * yy_global; + + if (fabs(devis) > 1.0e-60) { for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = q[i] / (rho[m_index] * yy_global); + p_s[i] = factor * q[i] / devis; } }else{ for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = q[i] * 1.0e60; + p_s[i] = factor * q[i] * 1.0e60; } } for (int k = 0; k < num_mem; k++){ // this loop should run from the oldest memory to the newest one. - if (iter < num_mem) c_ind = k; + if (local_iter < num_mem) c_ind = k; else c_ind = (k + m_index + 1) % num_mem; // dot product between p and da @@ -484,10 +519,12 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) for (int i = 0; i < 3 * nlocal; i++) { yr += dy[c_ind][i] * p_s[i]; } + MPI_Allreduce(&yr, &yr_global, 1, MPI_DOUBLE, MPI_SUM, world); if (update->multireplica == 1) { + yr_global *= factor; yr = yr_global; - MPI_Allreduce(&yr_global,&yr,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&yr,&yr_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } beta = rho[c_ind] * yr_global; @@ -496,11 +533,12 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction(int iter) } } for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = -1.0 * p_s[i]; + p_s[i] = - factor * p_s[i]; g_old[i] = g_cur[i]; } } + local_iter++; free(q); free(alpha); @@ -705,7 +743,7 @@ int MinSpinOSO_LBFGS_LS::calc_and_make_step(double a, double b, int index) der_e_cur = e_and_d[1]; index++; - if (awc(der_e_pr, eprevious, e_and_d[1], e_and_d[0]) || index == 3){ + if (awc(der_e_pr, eprevious, e_and_d[1], e_and_d[0]) || index == 5){ MPI_Bcast(&b,1,MPI_DOUBLE,0,world); for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = b * p_s[i]; @@ -728,6 +766,8 @@ int MinSpinOSO_LBFGS_LS::calc_and_make_step(double a, double b, int index) // has minimum at alpha below. We do not check boundaries. alpha = (-c2 + sqrt(c2*c2 - 3.0*c1*c3))/(3.0*c1); + MPI_Bcast(&alpha,1,MPI_DOUBLE,0,world); + if (alpha < 0.0) alpha = r/2.0; for (int i = 0; i < nlocal; i++) { diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.h b/src/SPIN/min_spin_oso_lbfgs_ls.h index 3e0e608ecb..eeaf20adf4 100644 --- a/src/SPIN/min_spin_oso_lbfgs_ls.h +++ b/src/SPIN/min_spin_oso_lbfgs_ls.h @@ -38,9 +38,12 @@ public: void advance_spins(); double fmnorm_sqr(); void calc_gradient(double); - void calc_search_direction(int); + void calc_search_direction(); private: + // test + int ireplica,nreplica; + // global and spin timesteps int nlocal_max; // max value of nlocal (for size of lists) @@ -62,6 +65,7 @@ private: double **sp_copy; // copy of the spins int num_mem; // number of stored steps + int local_iter; double der_e_cur; // current derivative along search dir. double der_e_pr; // previous derivative along search dir. From 095b4f11d8960893c1cf59858edc73812c2d059a Mon Sep 17 00:00:00 2001 From: Jun-Chieh Wang Date: Wed, 17 Jul 2019 19:04:06 -0700 Subject: [PATCH 042/418] throw away random numbers --- src/fix_deposit.cpp | 880 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 880 insertions(+) create mode 100644 src/fix_deposit.cpp diff --git a/src/fix_deposit.cpp b/src/fix_deposit.cpp new file mode 100644 index 0000000000..ca841b49bd --- /dev/null +++ b/src/fix_deposit.cpp @@ -0,0 +1,880 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "fix_deposit.h" +#include "atom.h" +#include "atom_vec.h" +#include "molecule.h" +#include "force.h" +#include "update.h" +#include "modify.h" +#include "fix.h" +#include "comm.h" +#include "domain.h" +#include "lattice.h" +#include "region.h" +#include "random_park.h" +#include "math_extra.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace FixConst; +using namespace MathConst; + +enum{ATOM,MOLECULE}; +enum{DIST_UNIFORM,DIST_GAUSSIAN}; + +#define EPSILON 1.0e6 + +/* ---------------------------------------------------------------------- */ + +FixDeposit::FixDeposit(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), idregion(NULL), idrigid(NULL), + idshake(NULL), onemols(NULL), molfrac(NULL), coords(NULL), imageflags(NULL), + fixrigid(NULL), fixshake(NULL), random(NULL) +{ + if (narg < 7) error->all(FLERR,"Illegal fix deposit command"); + + restart_global = 1; + time_depend = 1; + + // required args + + ninsert = force->inumeric(FLERR,arg[3]); + ntype = force->inumeric(FLERR,arg[4]); + nfreq = force->inumeric(FLERR,arg[5]); + seed = force->inumeric(FLERR,arg[6]); + + if (seed <= 0) error->all(FLERR,"Illegal fix deposit command"); + + // read options from end of input line + + options(narg-7,&arg[7]); + + // error check on type + + if (mode == ATOM && (ntype <= 0 || ntype > atom->ntypes)) + error->all(FLERR,"Invalid atom type in fix deposit command"); + + // error checks on region and its extent being inside simulation box + + if (iregion == -1) error->all(FLERR,"Must specify a region in fix deposit"); + if (domain->regions[iregion]->bboxflag == 0) + error->all(FLERR,"Fix deposit region does not support a bounding box"); + if (domain->regions[iregion]->dynamic_check()) + error->all(FLERR,"Fix deposit region cannot be dynamic"); + + xlo = domain->regions[iregion]->extent_xlo; + xhi = domain->regions[iregion]->extent_xhi; + ylo = domain->regions[iregion]->extent_ylo; + yhi = domain->regions[iregion]->extent_yhi; + zlo = domain->regions[iregion]->extent_zlo; + zhi = domain->regions[iregion]->extent_zhi; + + if (domain->triclinic == 0) { + if (xlo < domain->boxlo[0] || xhi > domain->boxhi[0] || + ylo < domain->boxlo[1] || yhi > domain->boxhi[1] || + zlo < domain->boxlo[2] || zhi > domain->boxhi[2]) + error->all(FLERR,"Deposition region extends outside simulation box"); + } else { + if (xlo < domain->boxlo_bound[0] || xhi > domain->boxhi_bound[0] || + ylo < domain->boxlo_bound[1] || yhi > domain->boxhi_bound[1] || + zlo < domain->boxlo_bound[2] || zhi > domain->boxhi_bound[2]) + error->all(FLERR,"Deposition region extends outside simulation box"); + } + + // error check and further setup for mode = MOLECULE + + if (atom->tag_enable == 0) + error->all(FLERR,"Cannot use fix_deposit unless atoms have IDs"); + + if (mode == MOLECULE) { + for (int i = 0; i < nmol; i++) { + if (onemols[i]->xflag == 0) + error->all(FLERR,"Fix deposit molecule must have coordinates"); + if (onemols[i]->typeflag == 0) + error->all(FLERR,"Fix deposit molecule must have atom types"); + if (ntype+onemols[i]->ntypes <= 0 || + ntype+onemols[i]->ntypes > atom->ntypes) + error->all(FLERR,"Invalid atom type in fix deposit mol command"); + + if (atom->molecular == 2 && onemols != atom->avec->onemols) + error->all(FLERR,"Fix deposit molecule template ID must be same " + "as atom_style template ID"); + onemols[i]->check_attributes(0); + + // fix deposit uses geoemetric center of molecule for insertion + + onemols[i]->compute_center(); + } + } + + if (rigidflag && mode == ATOM) + error->all(FLERR,"Cannot use fix deposit rigid and not molecule"); + if (shakeflag && mode == ATOM) + error->all(FLERR,"Cannot use fix deposit shake and not molecule"); + if (rigidflag && shakeflag) + error->all(FLERR,"Cannot use fix deposit rigid and shake"); + + // setup of coords and imageflags array + + if (mode == ATOM) natom_max = 1; + else { + natom_max = 0; + for (int i = 0; i < nmol; i++) + natom_max = MAX(natom_max,onemols[i]->natoms); + } + memory->create(coords,natom_max,3,"deposit:coords"); + memory->create(imageflags,natom_max,"deposit:imageflags"); + + // setup scaling + + double xscale,yscale,zscale; + if (scaleflag) { + xscale = domain->lattice->xlattice; + yscale = domain->lattice->ylattice; + zscale = domain->lattice->zlattice; + } + else xscale = yscale = zscale = 1.0; + + // apply scaling to all input parameters with dist/vel units + + if (domain->dimension == 2) { + lo *= yscale; + hi *= yscale; + rate *= yscale; + } else { + lo *= zscale; + hi *= zscale; + rate *= zscale; + } + deltasq *= xscale*xscale; + nearsq *= xscale*xscale; + vxlo *= xscale; + vxhi *= xscale; + vylo *= yscale; + vyhi *= yscale; + vzlo *= zscale; + vzhi *= zscale; + xmid *= xscale; + ymid *= yscale; + zmid *= zscale; + sigma *= xscale; // same as in region sphere + tx *= xscale; + ty *= yscale; + tz *= zscale; + + // find current max atom and molecule IDs if necessary + + if (idnext) find_maxid(); + + // random number generator, same for all procs + + random = new RanPark(lmp,seed); + + // set up reneighboring + + force_reneighbor = 1; + next_reneighbor = update->ntimestep + 1; + nfirst = next_reneighbor; + ninserted = 0; +} + +/* ---------------------------------------------------------------------- */ + +FixDeposit::~FixDeposit() +{ + delete random; + delete [] molfrac; + delete [] idrigid; + delete [] idshake; + delete [] idregion; + memory->destroy(coords); + memory->destroy(imageflags); +} + +/* ---------------------------------------------------------------------- */ + +int FixDeposit::setmask() +{ + int mask = 0; + mask |= PRE_EXCHANGE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixDeposit::init() +{ + // set index and check validity of region + + iregion = domain->find_region(idregion); + if (iregion == -1) + error->all(FLERR,"Region ID for fix deposit does not exist"); + + // if rigidflag defined, check for rigid/small fix + // its molecule template must be same as this one + + fixrigid = NULL; + if (rigidflag) { + int ifix = modify->find_fix(idrigid); + if (ifix < 0) error->all(FLERR,"Fix deposit rigid fix does not exist"); + fixrigid = modify->fix[ifix]; + int tmp; + if (onemols != (Molecule **) fixrigid->extract("onemol",tmp)) + error->all(FLERR, + "Fix deposit and fix rigid/small not using " + "same molecule template ID"); + } + + // if shakeflag defined, check for SHAKE fix + // its molecule template must be same as this one + + fixshake = NULL; + if (shakeflag) { + int ifix = modify->find_fix(idshake); + if (ifix < 0) error->all(FLERR,"Fix deposit shake fix does not exist"); + fixshake = modify->fix[ifix]; + int tmp; + if (onemols != (Molecule **) fixshake->extract("onemol",tmp)) + error->all(FLERR,"Fix deposit and fix shake not using " + "same molecule template ID"); + } + + // for finite size spherical particles: + // warn if near < 2 * maxrad of existing and inserted particles + // since may lead to overlaps + // if inserted molecule does not define diameters, + // use AtomVecSphere::create_atom() default radius = 0.5 + + if (atom->radius_flag) { + double *radius = atom->radius; + int nlocal = atom->nlocal; + + double maxrad = 0.0; + for (int i = 0; i < nlocal; i++) + maxrad = MAX(maxrad,radius[i]); + + double maxradall; + MPI_Allreduce(&maxrad,&maxradall,1,MPI_DOUBLE,MPI_MAX,world); + + double maxradinsert = 0.0; + if (mode == MOLECULE) { + for (int i = 0; i < nmol; i++) { + if (onemols[i]->radiusflag) + maxradinsert = MAX(maxradinsert,onemols[i]->maxradius); + else maxradinsert = MAX(maxradinsert,0.5); + } + } else maxradinsert = 0.5; + + double separation = MAX(2.0*maxradinsert,maxradall+maxradinsert); + if (sqrt(nearsq) < separation && comm->me == 0) { + char str[128]; + sprintf(str,"Fix deposit near setting < possible overlap separation %g", + separation); + error->warning(FLERR,str); + } + } +} + +/* ---------------------------------------------------------------------- + perform particle insertion +------------------------------------------------------------------------- */ + +void FixDeposit::pre_exchange() +{ + int i,m,n,nlocalprev,imol,natom,flag,flagall; + double coord[3],lamda[3],delx,dely,delz,rsq; + double r[3],vnew[3],rotmat[3][3],quat[4]; + double *newcoord; + + // just return if should not be called on this timestep + + if (next_reneighbor != update->ntimestep) return; + + // clear ghost count and any ghost bonus data internal to AtomVec + // same logic as beginning of Comm::exchange() + // do it now b/c inserting atoms will overwrite ghost atoms + + atom->nghost = 0; + atom->avec->clear_bonus(); + + // compute current offset = bottom of insertion volume + + double offset = 0.0; + if (rateflag) offset = (update->ntimestep - nfirst) * update->dt * rate; + + double *sublo,*subhi; + if (domain->triclinic == 0) { + sublo = domain->sublo; + subhi = domain->subhi; + } else { + sublo = domain->sublo_lamda; + subhi = domain->subhi_lamda; + } + + // find current max atom and molecule IDs if necessary + + if (!idnext) find_maxid(); + + // attempt an insertion until successful + + int dimension = domain->dimension; + + int success = 0; + int attempt = 0; + while (attempt < maxattempt) { + attempt++; + + // choose random position for new particle within region + if (distflag == DIST_UNIFORM) { + // throw away the first few numbers to avoid the unexpected correlations + double tmp_rand; + for (int ii=0; ii < 30; ii++) { + tmp_rand = random->uniform(); + } + do { + coord[0] = xlo + random->uniform() * (xhi-xlo); + coord[1] = ylo + random->uniform() * (yhi-ylo); + coord[2] = zlo + random->uniform() * (zhi-zlo); + } while (domain->regions[iregion]->match(coord[0],coord[1],coord[2]) == 0); + } else if (distflag == DIST_GAUSSIAN) { + do { + coord[0] = xmid + random->gaussian() * sigma; + coord[1] = ymid + random->gaussian() * sigma; + coord[2] = zmid + random->gaussian() * sigma; + } while (domain->regions[iregion]->match(coord[0],coord[1],coord[2]) == 0); + } else error->all(FLERR,"Unknown particle distribution in fix deposit"); + + // adjust vertical coord by offset + + if (dimension == 2) coord[1] += offset; + else coord[2] += offset; + + // if global, reset vertical coord to be lo-hi above highest atom + // if local, reset vertical coord to be lo-hi above highest "nearby" atom + // local computation computes lateral distance between 2 particles w/ PBC + // when done, have final coord of atom or center pt of molecule + + if (globalflag || localflag) { + int dim; + double max,maxall,delx,dely,delz,rsq; + + if (dimension == 2) { + dim = 1; + max = domain->boxlo[1]; + } else { + dim = 2; + max = domain->boxlo[2]; + } + + double **x = atom->x; + int nlocal = atom->nlocal; + for (i = 0; i < nlocal; i++) { + if (localflag) { + delx = coord[0] - x[i][0]; + dely = coord[1] - x[i][1]; + delz = 0.0; + domain->minimum_image(delx,dely,delz); + if (dimension == 2) rsq = delx*delx; + else rsq = delx*delx + dely*dely; + if (rsq > deltasq) continue; + } + if (x[i][dim] > max) max = x[i][dim]; + } + + MPI_Allreduce(&max,&maxall,1,MPI_DOUBLE,MPI_MAX,world); + if (dimension == 2) + coord[1] = maxall + lo + random->uniform()*(hi-lo); + else + coord[2] = maxall + lo + random->uniform()*(hi-lo); + } + + // coords = coords of all atoms + // for molecule, perform random rotation around center pt + // apply PBC so final coords are inside box + // also modify image flags due to PBC + + if (mode == ATOM) { + natom = 1; + coords[0][0] = coord[0]; + coords[0][1] = coord[1]; + coords[0][2] = coord[2]; + imageflags[0] = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + } else { + double rng = random->uniform(); + imol = 0; + while (rng > molfrac[imol]) imol++; + natom = onemols[imol]->natoms; + if (dimension == 3) { + r[0] = random->uniform() - 0.5; + r[1] = random->uniform() - 0.5; + r[2] = random->uniform() - 0.5; + } else { + r[0] = r[1] = 0.0; + r[2] = 1.0; + } + double theta = random->uniform() * MY_2PI; + MathExtra::norm3(r); + MathExtra::axisangle_to_quat(r,theta,quat); + MathExtra::quat_to_mat(quat,rotmat); + for (i = 0; i < natom; i++) { + MathExtra::matvec(rotmat,onemols[imol]->dx[i],coords[i]); + coords[i][0] += coord[0]; + coords[i][1] += coord[1]; + coords[i][2] += coord[2]; + + imageflags[i] = ((imageint) IMGMAX << IMG2BITS) | + ((imageint) IMGMAX << IMGBITS) | IMGMAX; + domain->remap(coords[i],imageflags[i]); + } + } + + // check distance between any existing atom and any inserted atom + // if less than near, try again + // use minimum_image() to account for PBC + + double **x = atom->x; + int nlocal = atom->nlocal; + + flag = 0; + for (m = 0; m < natom; m++) { + for (i = 0; i < nlocal; i++) { + delx = coords[m][0] - x[i][0]; + dely = coords[m][1] - x[i][1]; + delz = coords[m][2] - x[i][2]; + domain->minimum_image(delx,dely,delz); + rsq = delx*delx + dely*dely + delz*delz; + if (rsq < nearsq) flag = 1; + } + } + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_MAX,world); + if (flagall) continue; + + // proceed with insertion + + nlocalprev = atom->nlocal; + + // choose random velocity for new particle + // used for every atom in molecule + + vnew[0] = vxlo + random->uniform() * (vxhi-vxlo); + vnew[1] = vylo + random->uniform() * (vyhi-vylo); + vnew[2] = vzlo + random->uniform() * (vzhi-vzlo); + + // if target specified, change velocity vector accordingly + + if (targetflag) { + double vel = sqrt(vnew[0]*vnew[0] + vnew[1]*vnew[1] + vnew[2]*vnew[2]); + delx = tx - coord[0]; + dely = ty - coord[1]; + delz = tz - coord[2]; + double rsq = delx*delx + dely*dely + delz*delz; + if (rsq > 0.0) { + double rinv = sqrt(1.0/rsq); + vnew[0] = delx*rinv*vel; + vnew[1] = dely*rinv*vel; + vnew[2] = delz*rinv*vel; + } + } + + // check if new atoms are in my sub-box or above it if I am highest proc + // if so, add atom to my list via create_atom() + // initialize additional info about the atoms + // set group mask to "all" plus fix group + + for (m = 0; m < natom; m++) { + if (domain->triclinic) { + domain->x2lamda(coords[m],lamda); + newcoord = lamda; + } else newcoord = coords[m]; + + flag = 0; + if (newcoord[0] >= sublo[0] && newcoord[0] < subhi[0] && + newcoord[1] >= sublo[1] && newcoord[1] < subhi[1] && + newcoord[2] >= sublo[2] && newcoord[2] < subhi[2]) flag = 1; + else if (dimension == 3 && newcoord[2] >= domain->boxhi[2]) { + if (comm->layout != Comm::LAYOUT_TILED) { + if (comm->myloc[2] == comm->procgrid[2]-1 && + newcoord[0] >= sublo[0] && newcoord[0] < subhi[0] && + newcoord[1] >= sublo[1] && newcoord[1] < subhi[1]) flag = 1; + } else { + if (comm->mysplit[2][1] == 1.0 && + newcoord[0] >= sublo[0] && newcoord[0] < subhi[0] && + newcoord[1] >= sublo[1] && newcoord[1] < subhi[1]) flag = 1; + } + } else if (dimension == 2 && newcoord[1] >= domain->boxhi[1]) { + if (comm->layout != Comm::LAYOUT_TILED) { + if (comm->myloc[1] == comm->procgrid[1]-1 && + newcoord[0] >= sublo[0] && newcoord[0] < subhi[0]) flag = 1; + } else { + if (comm->mysplit[1][1] == 1.0 && + newcoord[0] >= sublo[0] && newcoord[0] < subhi[0]) flag = 1; + } + } + + if (flag) { + if (mode == ATOM) atom->avec->create_atom(ntype,coords[m]); + else atom->avec->create_atom(ntype+onemols[imol]->type[m],coords[m]); + n = atom->nlocal - 1; + atom->tag[n] = maxtag_all + m+1; + if (mode == MOLECULE) { + if (atom->molecule_flag) atom->molecule[n] = maxmol_all+1; + if (atom->molecular == 2) { + atom->molindex[n] = 0; + atom->molatom[n] = m; + } + } + atom->mask[n] = 1 | groupbit; + atom->image[n] = imageflags[m]; + atom->v[n][0] = vnew[0]; + atom->v[n][1] = vnew[1]; + atom->v[n][2] = vnew[2]; + if (mode == MOLECULE) { + onemols[imol]->quat_external = quat; + atom->add_molecule_atom(onemols[imol],m,n,maxtag_all); + } + modify->create_attribute(n); + } + } + + // FixRigidSmall::set_molecule stores rigid body attributes + // coord is new position of geometric center of mol, not COM + // FixShake::set_molecule stores shake info for molecule + + if (rigidflag) + fixrigid->set_molecule(nlocalprev,maxtag_all,imol,coord,vnew,quat); + else if (shakeflag) + fixshake->set_molecule(nlocalprev,maxtag_all,imol,coord,vnew,quat); + + // old code: unsuccessful if no proc performed insertion of an atom + // don't think that check is necessary + // if get this far, should always be succesful + // would be hard to undo partial insertion for a molecule + // better to check how many atoms could be inserted (w/out inserting) + // then sum to insure all are inserted, before doing actual insertion + // MPI_Allreduce(&flag,&success,1,MPI_INT,MPI_MAX,world); + + success = 1; + break; + } + + // warn if not successful b/c too many attempts + + if (!success && comm->me == 0) + error->warning(FLERR,"Particle deposition was unsuccessful",0); + + // reset global natoms,nbonds,etc + // increment maxtag_all and maxmol_all if necessary + // if global map exists, reset it now instead of waiting for comm + // since other pre-exchange fixes may use it + // invoke map_init() b/c atom count has grown + + if (success) { + atom->natoms += natom; + if (atom->natoms < 0) + error->all(FLERR,"Too many total atoms"); + if (mode == MOLECULE) { + atom->nbonds += onemols[imol]->nbonds; + atom->nangles += onemols[imol]->nangles; + atom->ndihedrals += onemols[imol]->ndihedrals; + atom->nimpropers += onemols[imol]->nimpropers; + } + maxtag_all += natom; + if (maxtag_all >= MAXTAGINT) + error->all(FLERR,"New atom IDs exceed maximum allowed ID"); + if (mode == MOLECULE && atom->molecule_flag) maxmol_all++; + if (atom->map_style) { + atom->map_init(); + atom->map_set(); + } + } + + // next timestep to insert + // next_reneighbor = 0 if done + + if (success) ninserted++; + if (ninserted < ninsert) next_reneighbor += nfreq; + else next_reneighbor = 0; +} + +/* ---------------------------------------------------------------------- + maxtag_all = current max atom ID for all atoms + maxmol_all = current max molecule ID for all atoms +------------------------------------------------------------------------- */ + +void FixDeposit::find_maxid() +{ + tagint *tag = atom->tag; + tagint *molecule = atom->molecule; + int nlocal = atom->nlocal; + + tagint max = 0; + for (int i = 0; i < nlocal; i++) max = MAX(max,tag[i]); + MPI_Allreduce(&max,&maxtag_all,1,MPI_LMP_TAGINT,MPI_MAX,world); + + if (mode == MOLECULE && molecule) { + max = 0; + for (int i = 0; i < nlocal; i++) max = MAX(max,molecule[i]); + MPI_Allreduce(&max,&maxmol_all,1,MPI_LMP_TAGINT,MPI_MAX,world); + } +} + +/* ---------------------------------------------------------------------- + parse optional parameters at end of input line +------------------------------------------------------------------------- */ + +void FixDeposit::options(int narg, char **arg) +{ + // defaults + + iregion = -1; + idregion = NULL; + mode = ATOM; + molfrac = NULL; + rigidflag = 0; + idrigid = NULL; + shakeflag = 0; + idshake = NULL; + idnext = 0; + globalflag = localflag = 0; + lo = hi = deltasq = 0.0; + nearsq = 0.0; + maxattempt = 10; + rateflag = 0; + vxlo = vxhi = vylo = vyhi = vzlo = vzhi = 0.0; + distflag = DIST_UNIFORM; + sigma = 1.0; + xmid = ymid = zmid = 0.0; + scaleflag = 1; + targetflag = 0; + + int iarg = 0; + while (iarg < narg) { + if (strcmp(arg[iarg],"region") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); + iregion = domain->find_region(arg[iarg+1]); + if (iregion == -1) + error->all(FLERR,"Region ID for fix deposit does not exist"); + int n = strlen(arg[iarg+1]) + 1; + idregion = new char[n]; + strcpy(idregion,arg[iarg+1]); + iarg += 2; + + } else if (strcmp(arg[iarg],"mol") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); + int imol = atom->find_molecule(arg[iarg+1]); + if (imol == -1) + error->all(FLERR,"Molecule template ID for fix deposit does not exist"); + mode = MOLECULE; + onemols = &atom->molecules[imol]; + nmol = onemols[0]->nset; + delete [] molfrac; + molfrac = new double[nmol]; + molfrac[0] = 1.0/nmol; + for (int i = 1; i < nmol-1; i++) molfrac[i] = molfrac[i-1] + 1.0/nmol; + molfrac[nmol-1] = 1.0; + iarg += 2; + } else if (strcmp(arg[iarg],"molfrac") == 0) { + if (mode != MOLECULE) error->all(FLERR,"Illegal fix deposit command"); + if (iarg+nmol+1 > narg) error->all(FLERR,"Illegal fix deposit command"); + molfrac[0] = force->numeric(FLERR,arg[iarg+1]); + for (int i = 1; i < nmol; i++) + molfrac[i] = molfrac[i-1] + force->numeric(FLERR,arg[iarg+i+1]); + if (molfrac[nmol-1] < 1.0-EPSILON || molfrac[nmol-1] > 1.0+EPSILON) + error->all(FLERR,"Illegal fix deposit command"); + molfrac[nmol-1] = 1.0; + iarg += nmol+1; + + } else if (strcmp(arg[iarg],"rigid") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); + int n = strlen(arg[iarg+1]) + 1; + delete [] idrigid; + idrigid = new char[n]; + strcpy(idrigid,arg[iarg+1]); + rigidflag = 1; + iarg += 2; + } else if (strcmp(arg[iarg],"shake") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); + int n = strlen(arg[iarg+1]) + 1; + delete [] idshake; + idshake = new char[n]; + strcpy(idshake,arg[iarg+1]); + shakeflag = 1; + iarg += 2; + + } else if (strcmp(arg[iarg],"id") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); + if (strcmp(arg[iarg+1],"max") == 0) idnext = 0; + else if (strcmp(arg[iarg+1],"next") == 0) idnext = 1; + else error->all(FLERR,"Illegal fix deposit command"); + iarg += 2; + } else if (strcmp(arg[iarg],"global") == 0) { + if (iarg+3 > narg) error->all(FLERR,"Illegal fix deposit command"); + globalflag = 1; + localflag = 0; + lo = force->numeric(FLERR,arg[iarg+1]); + hi = force->numeric(FLERR,arg[iarg+2]); + iarg += 3; + } else if (strcmp(arg[iarg],"local") == 0) { + if (iarg+4 > narg) error->all(FLERR,"Illegal fix deposit command"); + localflag = 1; + globalflag = 0; + lo = force->numeric(FLERR,arg[iarg+1]); + hi = force->numeric(FLERR,arg[iarg+2]); + deltasq = force->numeric(FLERR,arg[iarg+3]) * + force->numeric(FLERR,arg[iarg+3]); + iarg += 4; + + } else if (strcmp(arg[iarg],"near") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); + nearsq = force->numeric(FLERR,arg[iarg+1]) * + force->numeric(FLERR,arg[iarg+1]); + iarg += 2; + } else if (strcmp(arg[iarg],"attempt") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); + maxattempt = force->inumeric(FLERR,arg[iarg+1]); + iarg += 2; + } else if (strcmp(arg[iarg],"rate") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); + rateflag = 1; + rate = force->numeric(FLERR,arg[iarg+1]); + iarg += 2; + } else if (strcmp(arg[iarg],"vx") == 0) { + if (iarg+3 > narg) error->all(FLERR,"Illegal fix deposit command"); + vxlo = force->numeric(FLERR,arg[iarg+1]); + vxhi = force->numeric(FLERR,arg[iarg+2]); + iarg += 3; + } else if (strcmp(arg[iarg],"vy") == 0) { + if (iarg+3 > narg) error->all(FLERR,"Illegal fix deposit command"); + vylo = force->numeric(FLERR,arg[iarg+1]); + vyhi = force->numeric(FLERR,arg[iarg+2]); + iarg += 3; + } else if (strcmp(arg[iarg],"vz") == 0) { + if (iarg+3 > narg) error->all(FLERR,"Illegal fix deposit command"); + vzlo = force->numeric(FLERR,arg[iarg+1]); + vzhi = force->numeric(FLERR,arg[iarg+2]); + iarg += 3; + } else if (strcmp(arg[iarg],"units") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); + if (strcmp(arg[iarg+1],"box") == 0) scaleflag = 0; + else if (strcmp(arg[iarg+1],"lattice") == 0) scaleflag = 1; + else error->all(FLERR,"Illegal fix deposit command"); + iarg += 2; + } else if (strcmp(arg[iarg],"gaussian") == 0) { + if (iarg+5 > narg) error->all(FLERR,"Illegal fix deposit command"); + xmid = force->numeric(FLERR,arg[iarg+1]); + ymid = force->numeric(FLERR,arg[iarg+2]); + zmid = force->numeric(FLERR,arg[iarg+3]); + sigma = force->numeric(FLERR,arg[iarg+4]); + distflag = DIST_GAUSSIAN; + iarg += 5; + } else if (strcmp(arg[iarg],"target") == 0) { + if (iarg+4 > narg) error->all(FLERR,"Illegal fix deposit command"); + tx = force->numeric(FLERR,arg[iarg+1]); + ty = force->numeric(FLERR,arg[iarg+2]); + tz = force->numeric(FLERR,arg[iarg+3]); + targetflag = 1; + iarg += 4; + } else error->all(FLERR,"Illegal fix deposit command"); + } +} + +/* ---------------------------------------------------------------------- + pack entire state of Fix into one write +------------------------------------------------------------------------- */ + +void FixDeposit::write_restart(FILE *fp) +{ + int n = 0; + double list[5]; + list[n++] = random->state(); + list[n++] = ninserted; + list[n++] = nfirst; + list[n++] = ubuf(next_reneighbor).d; + list[n++] = ubuf(update->ntimestep).d; + + if (comm->me == 0) { + int size = n * sizeof(double); + fwrite(&size,sizeof(int),1,fp); + fwrite(list,sizeof(double),n,fp); + } +} + +/* ---------------------------------------------------------------------- + use state info from restart file to restart the Fix +------------------------------------------------------------------------- */ + +void FixDeposit::restart(char *buf) +{ + int n = 0; + double *list = (double *) buf; + + seed = static_cast (list[n++]); + ninserted = static_cast (list[n++]); + nfirst = static_cast (list[n++]); + next_reneighbor = (bigint) ubuf(list[n++]).i; + + bigint ntimestep_restart = (bigint) ubuf(list[n++]).i; + if (ntimestep_restart != update->ntimestep) + error->all(FLERR,"Must not reset timestep when restarting this fix"); + + random->reset(seed); +} + +/* ---------------------------------------------------------------------- + extract particle radius for atom type = itype +------------------------------------------------------------------------- */ + +void *FixDeposit::extract(const char *str, int &itype) +{ + if (strcmp(str,"radius") == 0) { + if (mode == ATOM) { + if (itype == ntype) oneradius = 0.5; + else oneradius = 0.0; + + } else { + + // loop over onemols molecules + // skip a molecule with no atoms as large as itype + + oneradius = 0.0; + for (int i = 0; i < nmol; i++) { + if (itype > ntype+onemols[i]->ntypes) continue; + double *radius = onemols[i]->radius; + int *type = onemols[i]->type; + int natoms = onemols[i]->natoms; + + // check radii of atoms in Molecule with matching types + // default to 0.5, if radii not defined in Molecule + // same as atom->avec->create_atom(), invoked in pre_exchange() + + for (int i = 0; i < natoms; i++) + if (type[i]+ntype == itype) { + if (radius) oneradius = MAX(oneradius,radius[i]); + else oneradius = MAX(oneradius,0.5); + } + } + } + itype = 0; + return &oneradius; + } + + return NULL; +} From 19d7cd6364964daeb4564991f78c27a9cce575d1 Mon Sep 17 00:00:00 2001 From: Jun-Chieh Wang Date: Thu, 18 Jul 2019 09:00:30 -0700 Subject: [PATCH 043/418] git rm fix_deposit.cpp from /src --- src/fix_deposit.cpp | 880 -------------------------------------------- 1 file changed, 880 deletions(-) delete mode 100644 src/fix_deposit.cpp diff --git a/src/fix_deposit.cpp b/src/fix_deposit.cpp deleted file mode 100644 index ca841b49bd..0000000000 --- a/src/fix_deposit.cpp +++ /dev/null @@ -1,880 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#include -#include -#include -#include "fix_deposit.h" -#include "atom.h" -#include "atom_vec.h" -#include "molecule.h" -#include "force.h" -#include "update.h" -#include "modify.h" -#include "fix.h" -#include "comm.h" -#include "domain.h" -#include "lattice.h" -#include "region.h" -#include "random_park.h" -#include "math_extra.h" -#include "math_const.h" -#include "memory.h" -#include "error.h" - -using namespace LAMMPS_NS; -using namespace FixConst; -using namespace MathConst; - -enum{ATOM,MOLECULE}; -enum{DIST_UNIFORM,DIST_GAUSSIAN}; - -#define EPSILON 1.0e6 - -/* ---------------------------------------------------------------------- */ - -FixDeposit::FixDeposit(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), idregion(NULL), idrigid(NULL), - idshake(NULL), onemols(NULL), molfrac(NULL), coords(NULL), imageflags(NULL), - fixrigid(NULL), fixshake(NULL), random(NULL) -{ - if (narg < 7) error->all(FLERR,"Illegal fix deposit command"); - - restart_global = 1; - time_depend = 1; - - // required args - - ninsert = force->inumeric(FLERR,arg[3]); - ntype = force->inumeric(FLERR,arg[4]); - nfreq = force->inumeric(FLERR,arg[5]); - seed = force->inumeric(FLERR,arg[6]); - - if (seed <= 0) error->all(FLERR,"Illegal fix deposit command"); - - // read options from end of input line - - options(narg-7,&arg[7]); - - // error check on type - - if (mode == ATOM && (ntype <= 0 || ntype > atom->ntypes)) - error->all(FLERR,"Invalid atom type in fix deposit command"); - - // error checks on region and its extent being inside simulation box - - if (iregion == -1) error->all(FLERR,"Must specify a region in fix deposit"); - if (domain->regions[iregion]->bboxflag == 0) - error->all(FLERR,"Fix deposit region does not support a bounding box"); - if (domain->regions[iregion]->dynamic_check()) - error->all(FLERR,"Fix deposit region cannot be dynamic"); - - xlo = domain->regions[iregion]->extent_xlo; - xhi = domain->regions[iregion]->extent_xhi; - ylo = domain->regions[iregion]->extent_ylo; - yhi = domain->regions[iregion]->extent_yhi; - zlo = domain->regions[iregion]->extent_zlo; - zhi = domain->regions[iregion]->extent_zhi; - - if (domain->triclinic == 0) { - if (xlo < domain->boxlo[0] || xhi > domain->boxhi[0] || - ylo < domain->boxlo[1] || yhi > domain->boxhi[1] || - zlo < domain->boxlo[2] || zhi > domain->boxhi[2]) - error->all(FLERR,"Deposition region extends outside simulation box"); - } else { - if (xlo < domain->boxlo_bound[0] || xhi > domain->boxhi_bound[0] || - ylo < domain->boxlo_bound[1] || yhi > domain->boxhi_bound[1] || - zlo < domain->boxlo_bound[2] || zhi > domain->boxhi_bound[2]) - error->all(FLERR,"Deposition region extends outside simulation box"); - } - - // error check and further setup for mode = MOLECULE - - if (atom->tag_enable == 0) - error->all(FLERR,"Cannot use fix_deposit unless atoms have IDs"); - - if (mode == MOLECULE) { - for (int i = 0; i < nmol; i++) { - if (onemols[i]->xflag == 0) - error->all(FLERR,"Fix deposit molecule must have coordinates"); - if (onemols[i]->typeflag == 0) - error->all(FLERR,"Fix deposit molecule must have atom types"); - if (ntype+onemols[i]->ntypes <= 0 || - ntype+onemols[i]->ntypes > atom->ntypes) - error->all(FLERR,"Invalid atom type in fix deposit mol command"); - - if (atom->molecular == 2 && onemols != atom->avec->onemols) - error->all(FLERR,"Fix deposit molecule template ID must be same " - "as atom_style template ID"); - onemols[i]->check_attributes(0); - - // fix deposit uses geoemetric center of molecule for insertion - - onemols[i]->compute_center(); - } - } - - if (rigidflag && mode == ATOM) - error->all(FLERR,"Cannot use fix deposit rigid and not molecule"); - if (shakeflag && mode == ATOM) - error->all(FLERR,"Cannot use fix deposit shake and not molecule"); - if (rigidflag && shakeflag) - error->all(FLERR,"Cannot use fix deposit rigid and shake"); - - // setup of coords and imageflags array - - if (mode == ATOM) natom_max = 1; - else { - natom_max = 0; - for (int i = 0; i < nmol; i++) - natom_max = MAX(natom_max,onemols[i]->natoms); - } - memory->create(coords,natom_max,3,"deposit:coords"); - memory->create(imageflags,natom_max,"deposit:imageflags"); - - // setup scaling - - double xscale,yscale,zscale; - if (scaleflag) { - xscale = domain->lattice->xlattice; - yscale = domain->lattice->ylattice; - zscale = domain->lattice->zlattice; - } - else xscale = yscale = zscale = 1.0; - - // apply scaling to all input parameters with dist/vel units - - if (domain->dimension == 2) { - lo *= yscale; - hi *= yscale; - rate *= yscale; - } else { - lo *= zscale; - hi *= zscale; - rate *= zscale; - } - deltasq *= xscale*xscale; - nearsq *= xscale*xscale; - vxlo *= xscale; - vxhi *= xscale; - vylo *= yscale; - vyhi *= yscale; - vzlo *= zscale; - vzhi *= zscale; - xmid *= xscale; - ymid *= yscale; - zmid *= zscale; - sigma *= xscale; // same as in region sphere - tx *= xscale; - ty *= yscale; - tz *= zscale; - - // find current max atom and molecule IDs if necessary - - if (idnext) find_maxid(); - - // random number generator, same for all procs - - random = new RanPark(lmp,seed); - - // set up reneighboring - - force_reneighbor = 1; - next_reneighbor = update->ntimestep + 1; - nfirst = next_reneighbor; - ninserted = 0; -} - -/* ---------------------------------------------------------------------- */ - -FixDeposit::~FixDeposit() -{ - delete random; - delete [] molfrac; - delete [] idrigid; - delete [] idshake; - delete [] idregion; - memory->destroy(coords); - memory->destroy(imageflags); -} - -/* ---------------------------------------------------------------------- */ - -int FixDeposit::setmask() -{ - int mask = 0; - mask |= PRE_EXCHANGE; - return mask; -} - -/* ---------------------------------------------------------------------- */ - -void FixDeposit::init() -{ - // set index and check validity of region - - iregion = domain->find_region(idregion); - if (iregion == -1) - error->all(FLERR,"Region ID for fix deposit does not exist"); - - // if rigidflag defined, check for rigid/small fix - // its molecule template must be same as this one - - fixrigid = NULL; - if (rigidflag) { - int ifix = modify->find_fix(idrigid); - if (ifix < 0) error->all(FLERR,"Fix deposit rigid fix does not exist"); - fixrigid = modify->fix[ifix]; - int tmp; - if (onemols != (Molecule **) fixrigid->extract("onemol",tmp)) - error->all(FLERR, - "Fix deposit and fix rigid/small not using " - "same molecule template ID"); - } - - // if shakeflag defined, check for SHAKE fix - // its molecule template must be same as this one - - fixshake = NULL; - if (shakeflag) { - int ifix = modify->find_fix(idshake); - if (ifix < 0) error->all(FLERR,"Fix deposit shake fix does not exist"); - fixshake = modify->fix[ifix]; - int tmp; - if (onemols != (Molecule **) fixshake->extract("onemol",tmp)) - error->all(FLERR,"Fix deposit and fix shake not using " - "same molecule template ID"); - } - - // for finite size spherical particles: - // warn if near < 2 * maxrad of existing and inserted particles - // since may lead to overlaps - // if inserted molecule does not define diameters, - // use AtomVecSphere::create_atom() default radius = 0.5 - - if (atom->radius_flag) { - double *radius = atom->radius; - int nlocal = atom->nlocal; - - double maxrad = 0.0; - for (int i = 0; i < nlocal; i++) - maxrad = MAX(maxrad,radius[i]); - - double maxradall; - MPI_Allreduce(&maxrad,&maxradall,1,MPI_DOUBLE,MPI_MAX,world); - - double maxradinsert = 0.0; - if (mode == MOLECULE) { - for (int i = 0; i < nmol; i++) { - if (onemols[i]->radiusflag) - maxradinsert = MAX(maxradinsert,onemols[i]->maxradius); - else maxradinsert = MAX(maxradinsert,0.5); - } - } else maxradinsert = 0.5; - - double separation = MAX(2.0*maxradinsert,maxradall+maxradinsert); - if (sqrt(nearsq) < separation && comm->me == 0) { - char str[128]; - sprintf(str,"Fix deposit near setting < possible overlap separation %g", - separation); - error->warning(FLERR,str); - } - } -} - -/* ---------------------------------------------------------------------- - perform particle insertion -------------------------------------------------------------------------- */ - -void FixDeposit::pre_exchange() -{ - int i,m,n,nlocalprev,imol,natom,flag,flagall; - double coord[3],lamda[3],delx,dely,delz,rsq; - double r[3],vnew[3],rotmat[3][3],quat[4]; - double *newcoord; - - // just return if should not be called on this timestep - - if (next_reneighbor != update->ntimestep) return; - - // clear ghost count and any ghost bonus data internal to AtomVec - // same logic as beginning of Comm::exchange() - // do it now b/c inserting atoms will overwrite ghost atoms - - atom->nghost = 0; - atom->avec->clear_bonus(); - - // compute current offset = bottom of insertion volume - - double offset = 0.0; - if (rateflag) offset = (update->ntimestep - nfirst) * update->dt * rate; - - double *sublo,*subhi; - if (domain->triclinic == 0) { - sublo = domain->sublo; - subhi = domain->subhi; - } else { - sublo = domain->sublo_lamda; - subhi = domain->subhi_lamda; - } - - // find current max atom and molecule IDs if necessary - - if (!idnext) find_maxid(); - - // attempt an insertion until successful - - int dimension = domain->dimension; - - int success = 0; - int attempt = 0; - while (attempt < maxattempt) { - attempt++; - - // choose random position for new particle within region - if (distflag == DIST_UNIFORM) { - // throw away the first few numbers to avoid the unexpected correlations - double tmp_rand; - for (int ii=0; ii < 30; ii++) { - tmp_rand = random->uniform(); - } - do { - coord[0] = xlo + random->uniform() * (xhi-xlo); - coord[1] = ylo + random->uniform() * (yhi-ylo); - coord[2] = zlo + random->uniform() * (zhi-zlo); - } while (domain->regions[iregion]->match(coord[0],coord[1],coord[2]) == 0); - } else if (distflag == DIST_GAUSSIAN) { - do { - coord[0] = xmid + random->gaussian() * sigma; - coord[1] = ymid + random->gaussian() * sigma; - coord[2] = zmid + random->gaussian() * sigma; - } while (domain->regions[iregion]->match(coord[0],coord[1],coord[2]) == 0); - } else error->all(FLERR,"Unknown particle distribution in fix deposit"); - - // adjust vertical coord by offset - - if (dimension == 2) coord[1] += offset; - else coord[2] += offset; - - // if global, reset vertical coord to be lo-hi above highest atom - // if local, reset vertical coord to be lo-hi above highest "nearby" atom - // local computation computes lateral distance between 2 particles w/ PBC - // when done, have final coord of atom or center pt of molecule - - if (globalflag || localflag) { - int dim; - double max,maxall,delx,dely,delz,rsq; - - if (dimension == 2) { - dim = 1; - max = domain->boxlo[1]; - } else { - dim = 2; - max = domain->boxlo[2]; - } - - double **x = atom->x; - int nlocal = atom->nlocal; - for (i = 0; i < nlocal; i++) { - if (localflag) { - delx = coord[0] - x[i][0]; - dely = coord[1] - x[i][1]; - delz = 0.0; - domain->minimum_image(delx,dely,delz); - if (dimension == 2) rsq = delx*delx; - else rsq = delx*delx + dely*dely; - if (rsq > deltasq) continue; - } - if (x[i][dim] > max) max = x[i][dim]; - } - - MPI_Allreduce(&max,&maxall,1,MPI_DOUBLE,MPI_MAX,world); - if (dimension == 2) - coord[1] = maxall + lo + random->uniform()*(hi-lo); - else - coord[2] = maxall + lo + random->uniform()*(hi-lo); - } - - // coords = coords of all atoms - // for molecule, perform random rotation around center pt - // apply PBC so final coords are inside box - // also modify image flags due to PBC - - if (mode == ATOM) { - natom = 1; - coords[0][0] = coord[0]; - coords[0][1] = coord[1]; - coords[0][2] = coord[2]; - imageflags[0] = ((imageint) IMGMAX << IMG2BITS) | - ((imageint) IMGMAX << IMGBITS) | IMGMAX; - } else { - double rng = random->uniform(); - imol = 0; - while (rng > molfrac[imol]) imol++; - natom = onemols[imol]->natoms; - if (dimension == 3) { - r[0] = random->uniform() - 0.5; - r[1] = random->uniform() - 0.5; - r[2] = random->uniform() - 0.5; - } else { - r[0] = r[1] = 0.0; - r[2] = 1.0; - } - double theta = random->uniform() * MY_2PI; - MathExtra::norm3(r); - MathExtra::axisangle_to_quat(r,theta,quat); - MathExtra::quat_to_mat(quat,rotmat); - for (i = 0; i < natom; i++) { - MathExtra::matvec(rotmat,onemols[imol]->dx[i],coords[i]); - coords[i][0] += coord[0]; - coords[i][1] += coord[1]; - coords[i][2] += coord[2]; - - imageflags[i] = ((imageint) IMGMAX << IMG2BITS) | - ((imageint) IMGMAX << IMGBITS) | IMGMAX; - domain->remap(coords[i],imageflags[i]); - } - } - - // check distance between any existing atom and any inserted atom - // if less than near, try again - // use minimum_image() to account for PBC - - double **x = atom->x; - int nlocal = atom->nlocal; - - flag = 0; - for (m = 0; m < natom; m++) { - for (i = 0; i < nlocal; i++) { - delx = coords[m][0] - x[i][0]; - dely = coords[m][1] - x[i][1]; - delz = coords[m][2] - x[i][2]; - domain->minimum_image(delx,dely,delz); - rsq = delx*delx + dely*dely + delz*delz; - if (rsq < nearsq) flag = 1; - } - } - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_MAX,world); - if (flagall) continue; - - // proceed with insertion - - nlocalprev = atom->nlocal; - - // choose random velocity for new particle - // used for every atom in molecule - - vnew[0] = vxlo + random->uniform() * (vxhi-vxlo); - vnew[1] = vylo + random->uniform() * (vyhi-vylo); - vnew[2] = vzlo + random->uniform() * (vzhi-vzlo); - - // if target specified, change velocity vector accordingly - - if (targetflag) { - double vel = sqrt(vnew[0]*vnew[0] + vnew[1]*vnew[1] + vnew[2]*vnew[2]); - delx = tx - coord[0]; - dely = ty - coord[1]; - delz = tz - coord[2]; - double rsq = delx*delx + dely*dely + delz*delz; - if (rsq > 0.0) { - double rinv = sqrt(1.0/rsq); - vnew[0] = delx*rinv*vel; - vnew[1] = dely*rinv*vel; - vnew[2] = delz*rinv*vel; - } - } - - // check if new atoms are in my sub-box or above it if I am highest proc - // if so, add atom to my list via create_atom() - // initialize additional info about the atoms - // set group mask to "all" plus fix group - - for (m = 0; m < natom; m++) { - if (domain->triclinic) { - domain->x2lamda(coords[m],lamda); - newcoord = lamda; - } else newcoord = coords[m]; - - flag = 0; - if (newcoord[0] >= sublo[0] && newcoord[0] < subhi[0] && - newcoord[1] >= sublo[1] && newcoord[1] < subhi[1] && - newcoord[2] >= sublo[2] && newcoord[2] < subhi[2]) flag = 1; - else if (dimension == 3 && newcoord[2] >= domain->boxhi[2]) { - if (comm->layout != Comm::LAYOUT_TILED) { - if (comm->myloc[2] == comm->procgrid[2]-1 && - newcoord[0] >= sublo[0] && newcoord[0] < subhi[0] && - newcoord[1] >= sublo[1] && newcoord[1] < subhi[1]) flag = 1; - } else { - if (comm->mysplit[2][1] == 1.0 && - newcoord[0] >= sublo[0] && newcoord[0] < subhi[0] && - newcoord[1] >= sublo[1] && newcoord[1] < subhi[1]) flag = 1; - } - } else if (dimension == 2 && newcoord[1] >= domain->boxhi[1]) { - if (comm->layout != Comm::LAYOUT_TILED) { - if (comm->myloc[1] == comm->procgrid[1]-1 && - newcoord[0] >= sublo[0] && newcoord[0] < subhi[0]) flag = 1; - } else { - if (comm->mysplit[1][1] == 1.0 && - newcoord[0] >= sublo[0] && newcoord[0] < subhi[0]) flag = 1; - } - } - - if (flag) { - if (mode == ATOM) atom->avec->create_atom(ntype,coords[m]); - else atom->avec->create_atom(ntype+onemols[imol]->type[m],coords[m]); - n = atom->nlocal - 1; - atom->tag[n] = maxtag_all + m+1; - if (mode == MOLECULE) { - if (atom->molecule_flag) atom->molecule[n] = maxmol_all+1; - if (atom->molecular == 2) { - atom->molindex[n] = 0; - atom->molatom[n] = m; - } - } - atom->mask[n] = 1 | groupbit; - atom->image[n] = imageflags[m]; - atom->v[n][0] = vnew[0]; - atom->v[n][1] = vnew[1]; - atom->v[n][2] = vnew[2]; - if (mode == MOLECULE) { - onemols[imol]->quat_external = quat; - atom->add_molecule_atom(onemols[imol],m,n,maxtag_all); - } - modify->create_attribute(n); - } - } - - // FixRigidSmall::set_molecule stores rigid body attributes - // coord is new position of geometric center of mol, not COM - // FixShake::set_molecule stores shake info for molecule - - if (rigidflag) - fixrigid->set_molecule(nlocalprev,maxtag_all,imol,coord,vnew,quat); - else if (shakeflag) - fixshake->set_molecule(nlocalprev,maxtag_all,imol,coord,vnew,quat); - - // old code: unsuccessful if no proc performed insertion of an atom - // don't think that check is necessary - // if get this far, should always be succesful - // would be hard to undo partial insertion for a molecule - // better to check how many atoms could be inserted (w/out inserting) - // then sum to insure all are inserted, before doing actual insertion - // MPI_Allreduce(&flag,&success,1,MPI_INT,MPI_MAX,world); - - success = 1; - break; - } - - // warn if not successful b/c too many attempts - - if (!success && comm->me == 0) - error->warning(FLERR,"Particle deposition was unsuccessful",0); - - // reset global natoms,nbonds,etc - // increment maxtag_all and maxmol_all if necessary - // if global map exists, reset it now instead of waiting for comm - // since other pre-exchange fixes may use it - // invoke map_init() b/c atom count has grown - - if (success) { - atom->natoms += natom; - if (atom->natoms < 0) - error->all(FLERR,"Too many total atoms"); - if (mode == MOLECULE) { - atom->nbonds += onemols[imol]->nbonds; - atom->nangles += onemols[imol]->nangles; - atom->ndihedrals += onemols[imol]->ndihedrals; - atom->nimpropers += onemols[imol]->nimpropers; - } - maxtag_all += natom; - if (maxtag_all >= MAXTAGINT) - error->all(FLERR,"New atom IDs exceed maximum allowed ID"); - if (mode == MOLECULE && atom->molecule_flag) maxmol_all++; - if (atom->map_style) { - atom->map_init(); - atom->map_set(); - } - } - - // next timestep to insert - // next_reneighbor = 0 if done - - if (success) ninserted++; - if (ninserted < ninsert) next_reneighbor += nfreq; - else next_reneighbor = 0; -} - -/* ---------------------------------------------------------------------- - maxtag_all = current max atom ID for all atoms - maxmol_all = current max molecule ID for all atoms -------------------------------------------------------------------------- */ - -void FixDeposit::find_maxid() -{ - tagint *tag = atom->tag; - tagint *molecule = atom->molecule; - int nlocal = atom->nlocal; - - tagint max = 0; - for (int i = 0; i < nlocal; i++) max = MAX(max,tag[i]); - MPI_Allreduce(&max,&maxtag_all,1,MPI_LMP_TAGINT,MPI_MAX,world); - - if (mode == MOLECULE && molecule) { - max = 0; - for (int i = 0; i < nlocal; i++) max = MAX(max,molecule[i]); - MPI_Allreduce(&max,&maxmol_all,1,MPI_LMP_TAGINT,MPI_MAX,world); - } -} - -/* ---------------------------------------------------------------------- - parse optional parameters at end of input line -------------------------------------------------------------------------- */ - -void FixDeposit::options(int narg, char **arg) -{ - // defaults - - iregion = -1; - idregion = NULL; - mode = ATOM; - molfrac = NULL; - rigidflag = 0; - idrigid = NULL; - shakeflag = 0; - idshake = NULL; - idnext = 0; - globalflag = localflag = 0; - lo = hi = deltasq = 0.0; - nearsq = 0.0; - maxattempt = 10; - rateflag = 0; - vxlo = vxhi = vylo = vyhi = vzlo = vzhi = 0.0; - distflag = DIST_UNIFORM; - sigma = 1.0; - xmid = ymid = zmid = 0.0; - scaleflag = 1; - targetflag = 0; - - int iarg = 0; - while (iarg < narg) { - if (strcmp(arg[iarg],"region") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); - iregion = domain->find_region(arg[iarg+1]); - if (iregion == -1) - error->all(FLERR,"Region ID for fix deposit does not exist"); - int n = strlen(arg[iarg+1]) + 1; - idregion = new char[n]; - strcpy(idregion,arg[iarg+1]); - iarg += 2; - - } else if (strcmp(arg[iarg],"mol") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); - int imol = atom->find_molecule(arg[iarg+1]); - if (imol == -1) - error->all(FLERR,"Molecule template ID for fix deposit does not exist"); - mode = MOLECULE; - onemols = &atom->molecules[imol]; - nmol = onemols[0]->nset; - delete [] molfrac; - molfrac = new double[nmol]; - molfrac[0] = 1.0/nmol; - for (int i = 1; i < nmol-1; i++) molfrac[i] = molfrac[i-1] + 1.0/nmol; - molfrac[nmol-1] = 1.0; - iarg += 2; - } else if (strcmp(arg[iarg],"molfrac") == 0) { - if (mode != MOLECULE) error->all(FLERR,"Illegal fix deposit command"); - if (iarg+nmol+1 > narg) error->all(FLERR,"Illegal fix deposit command"); - molfrac[0] = force->numeric(FLERR,arg[iarg+1]); - for (int i = 1; i < nmol; i++) - molfrac[i] = molfrac[i-1] + force->numeric(FLERR,arg[iarg+i+1]); - if (molfrac[nmol-1] < 1.0-EPSILON || molfrac[nmol-1] > 1.0+EPSILON) - error->all(FLERR,"Illegal fix deposit command"); - molfrac[nmol-1] = 1.0; - iarg += nmol+1; - - } else if (strcmp(arg[iarg],"rigid") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); - int n = strlen(arg[iarg+1]) + 1; - delete [] idrigid; - idrigid = new char[n]; - strcpy(idrigid,arg[iarg+1]); - rigidflag = 1; - iarg += 2; - } else if (strcmp(arg[iarg],"shake") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); - int n = strlen(arg[iarg+1]) + 1; - delete [] idshake; - idshake = new char[n]; - strcpy(idshake,arg[iarg+1]); - shakeflag = 1; - iarg += 2; - - } else if (strcmp(arg[iarg],"id") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); - if (strcmp(arg[iarg+1],"max") == 0) idnext = 0; - else if (strcmp(arg[iarg+1],"next") == 0) idnext = 1; - else error->all(FLERR,"Illegal fix deposit command"); - iarg += 2; - } else if (strcmp(arg[iarg],"global") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal fix deposit command"); - globalflag = 1; - localflag = 0; - lo = force->numeric(FLERR,arg[iarg+1]); - hi = force->numeric(FLERR,arg[iarg+2]); - iarg += 3; - } else if (strcmp(arg[iarg],"local") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix deposit command"); - localflag = 1; - globalflag = 0; - lo = force->numeric(FLERR,arg[iarg+1]); - hi = force->numeric(FLERR,arg[iarg+2]); - deltasq = force->numeric(FLERR,arg[iarg+3]) * - force->numeric(FLERR,arg[iarg+3]); - iarg += 4; - - } else if (strcmp(arg[iarg],"near") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); - nearsq = force->numeric(FLERR,arg[iarg+1]) * - force->numeric(FLERR,arg[iarg+1]); - iarg += 2; - } else if (strcmp(arg[iarg],"attempt") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); - maxattempt = force->inumeric(FLERR,arg[iarg+1]); - iarg += 2; - } else if (strcmp(arg[iarg],"rate") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); - rateflag = 1; - rate = force->numeric(FLERR,arg[iarg+1]); - iarg += 2; - } else if (strcmp(arg[iarg],"vx") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal fix deposit command"); - vxlo = force->numeric(FLERR,arg[iarg+1]); - vxhi = force->numeric(FLERR,arg[iarg+2]); - iarg += 3; - } else if (strcmp(arg[iarg],"vy") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal fix deposit command"); - vylo = force->numeric(FLERR,arg[iarg+1]); - vyhi = force->numeric(FLERR,arg[iarg+2]); - iarg += 3; - } else if (strcmp(arg[iarg],"vz") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal fix deposit command"); - vzlo = force->numeric(FLERR,arg[iarg+1]); - vzhi = force->numeric(FLERR,arg[iarg+2]); - iarg += 3; - } else if (strcmp(arg[iarg],"units") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix deposit command"); - if (strcmp(arg[iarg+1],"box") == 0) scaleflag = 0; - else if (strcmp(arg[iarg+1],"lattice") == 0) scaleflag = 1; - else error->all(FLERR,"Illegal fix deposit command"); - iarg += 2; - } else if (strcmp(arg[iarg],"gaussian") == 0) { - if (iarg+5 > narg) error->all(FLERR,"Illegal fix deposit command"); - xmid = force->numeric(FLERR,arg[iarg+1]); - ymid = force->numeric(FLERR,arg[iarg+2]); - zmid = force->numeric(FLERR,arg[iarg+3]); - sigma = force->numeric(FLERR,arg[iarg+4]); - distflag = DIST_GAUSSIAN; - iarg += 5; - } else if (strcmp(arg[iarg],"target") == 0) { - if (iarg+4 > narg) error->all(FLERR,"Illegal fix deposit command"); - tx = force->numeric(FLERR,arg[iarg+1]); - ty = force->numeric(FLERR,arg[iarg+2]); - tz = force->numeric(FLERR,arg[iarg+3]); - targetflag = 1; - iarg += 4; - } else error->all(FLERR,"Illegal fix deposit command"); - } -} - -/* ---------------------------------------------------------------------- - pack entire state of Fix into one write -------------------------------------------------------------------------- */ - -void FixDeposit::write_restart(FILE *fp) -{ - int n = 0; - double list[5]; - list[n++] = random->state(); - list[n++] = ninserted; - list[n++] = nfirst; - list[n++] = ubuf(next_reneighbor).d; - list[n++] = ubuf(update->ntimestep).d; - - if (comm->me == 0) { - int size = n * sizeof(double); - fwrite(&size,sizeof(int),1,fp); - fwrite(list,sizeof(double),n,fp); - } -} - -/* ---------------------------------------------------------------------- - use state info from restart file to restart the Fix -------------------------------------------------------------------------- */ - -void FixDeposit::restart(char *buf) -{ - int n = 0; - double *list = (double *) buf; - - seed = static_cast (list[n++]); - ninserted = static_cast (list[n++]); - nfirst = static_cast (list[n++]); - next_reneighbor = (bigint) ubuf(list[n++]).i; - - bigint ntimestep_restart = (bigint) ubuf(list[n++]).i; - if (ntimestep_restart != update->ntimestep) - error->all(FLERR,"Must not reset timestep when restarting this fix"); - - random->reset(seed); -} - -/* ---------------------------------------------------------------------- - extract particle radius for atom type = itype -------------------------------------------------------------------------- */ - -void *FixDeposit::extract(const char *str, int &itype) -{ - if (strcmp(str,"radius") == 0) { - if (mode == ATOM) { - if (itype == ntype) oneradius = 0.5; - else oneradius = 0.0; - - } else { - - // loop over onemols molecules - // skip a molecule with no atoms as large as itype - - oneradius = 0.0; - for (int i = 0; i < nmol; i++) { - if (itype > ntype+onemols[i]->ntypes) continue; - double *radius = onemols[i]->radius; - int *type = onemols[i]->type; - int natoms = onemols[i]->natoms; - - // check radii of atoms in Molecule with matching types - // default to 0.5, if radii not defined in Molecule - // same as atom->avec->create_atom(), invoked in pre_exchange() - - for (int i = 0; i < natoms; i++) - if (type[i]+ntype == itype) { - if (radius) oneradius = MAX(oneradius,radius[i]); - else oneradius = MAX(oneradius,0.5); - } - } - } - itype = 0; - return &oneradius; - } - - return NULL; -} From 3bc2a5504b7f43991d241ad839c5f668c58b7221 Mon Sep 17 00:00:00 2001 From: Jun-Chieh Wang Date: Thu, 18 Jul 2019 09:04:44 -0700 Subject: [PATCH 044/418] throw away random numbers in /src/MISC/fix_deposit.cpp --- src/MISC/fix_deposit.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/MISC/fix_deposit.cpp b/src/MISC/fix_deposit.cpp index 66aed34846..ca841b49bd 100644 --- a/src/MISC/fix_deposit.cpp +++ b/src/MISC/fix_deposit.cpp @@ -343,6 +343,11 @@ void FixDeposit::pre_exchange() // choose random position for new particle within region if (distflag == DIST_UNIFORM) { + // throw away the first few numbers to avoid the unexpected correlations + double tmp_rand; + for (int ii=0; ii < 30; ii++) { + tmp_rand = random->uniform(); + } do { coord[0] = xlo + random->uniform() * (xhi-xlo); coord[1] = ylo + random->uniform() * (yhi-ylo); From 45516e329eaa69686823b26394541c077068f9f2 Mon Sep 17 00:00:00 2001 From: alxvov Date: Fri, 19 Jul 2019 09:30:02 +0000 Subject: [PATCH 045/418] delete unused variables and function --- src/SPIN/min_spin_oso_lbfgs_ls.cpp | 174 ++++++++++------------------- src/SPIN/min_spin_oso_lbfgs_ls.h | 15 +-- 2 files changed, 62 insertions(+), 127 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.cpp b/src/SPIN/min_spin_oso_lbfgs_ls.cpp index e1a6ae99d5..5896ba9a9f 100644 --- a/src/SPIN/min_spin_oso_lbfgs_ls.cpp +++ b/src/SPIN/min_spin_oso_lbfgs_ls.cpp @@ -75,6 +75,7 @@ MinSpinOSO_LBFGS_LS::MinSpinOSO_LBFGS_LS(LAMMPS *lmp) : nreplica = universe->nworlds; ireplica = universe->iworld; + use_line_search = 1; } @@ -88,24 +89,21 @@ MinSpinOSO_LBFGS_LS::~MinSpinOSO_LBFGS_LS() memory->destroy(ds); memory->destroy(dy); memory->destroy(rho); - memory->destroy(sp_copy); + if (use_line_search) + memory->destroy(sp_copy); } /* ---------------------------------------------------------------------- */ void MinSpinOSO_LBFGS_LS::init() { - alpha_damp = 1.0; - discrete_factor = 10.0; num_mem = 3; local_iter = 0; der_e_cur = 0.0; der_e_pr = 0.0; - use_line_search = 1; Min::init(); - dts = dt = update->dt; last_negative = update->ntimestep; // allocate tables @@ -117,7 +115,8 @@ void MinSpinOSO_LBFGS_LS::init() memory->grow(rho,num_mem,"min/spin/oso/lbfgs_ls:rho"); memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:ds"); memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:dy"); - memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs_ls:sp_copy"); + if (use_line_search) + memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs_ls:sp_copy"); } @@ -141,14 +140,10 @@ void MinSpinOSO_LBFGS_LS::setup_style() int MinSpinOSO_LBFGS_LS::modify_param(int narg, char **arg) { - if (strcmp(arg[0],"alpha_damp") == 0) { + + if (strcmp(arg[0],"line_search") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - alpha_damp = force->numeric(FLERR,arg[1]); - return 2; - } - if (strcmp(arg[0],"discrete_factor") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - discrete_factor = force->numeric(FLERR,arg[1]); + use_line_search = force->numeric(FLERR,arg[1]); return 2; } return 0; @@ -185,7 +180,7 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) double fmdotfm; int flag, flagall; double **sp = atom->sp; - double der_e_cur_global = 0.0; + double der_e_cur_tmp = 0.0; if (nlocal_max < nlocal) { nlocal_max = nlocal; @@ -195,7 +190,8 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) memory->grow(rho,num_mem,"min/spin/oso/lbfgs_ls:rho"); memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:ds"); memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:dy"); - memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs_ls:sp_copy"); + if (use_line_search) + memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs_ls:sp_copy"); } for (int iter = 0; iter < maxiter; iter++) { @@ -211,34 +207,35 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) if (local_iter == 0){ ecurrent = energy_force(0); - calc_gradient(1.0); + calc_gradient(); neval++; } calc_search_direction(); if (use_line_search) { + + // here we need to do line search + der_e_cur = 0.0; for (int i = 0; i < 3 * nlocal; i++) { der_e_cur += g_cur[i] * p_s[i]; } - MPI_Allreduce(&der_e_cur, &der_e_cur_global, 1, MPI_DOUBLE, MPI_SUM, world); - der_e_cur = der_e_cur_global; + MPI_Allreduce(&der_e_cur,&der_e_cur_tmp,1,MPI_DOUBLE,MPI_SUM,world); + der_e_cur = der_e_cur_tmp; if (update->multireplica == 1) { - MPI_Allreduce(&der_e_cur_global,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } - } - - if (use_line_search){ - // here we need to do line search for (int i = 0; i < nlocal; i++) { for (int j = 0; j < 3; j++) sp_copy[i][j] = sp[i][j]; } eprevious = ecurrent; der_e_pr = der_e_cur; - calc_and_make_step(0.0, 1.0, 0); } else{ + + // here we don't do line search + advance_spins(); eprevious = ecurrent; ecurrent = energy_force(0); @@ -291,56 +288,11 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) return MAXITER; } -/* ---------------------------------------------------------------------- - evaluate max timestep ----------------------------------------------------------------------- */ - -double MinSpinOSO_LBFGS_LS::evaluate_dt() -{ - double dtmax; - double fmsq; - double fmaxsqone,fmaxsqloc,fmaxsqall; - int nlocal = atom->nlocal; - double **fm = atom->fm; - - // finding max fm on this proc. - - fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; - for (int i = 0; i < nlocal; i++) { - fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; - fmaxsqone = MAX(fmaxsqone,fmsq); - } - - // finding max fm on this replica - - fmaxsqloc = fmaxsqone; - MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - - // finding max fm over all replicas, if necessary - // this communicator would be invalid for multiprocess replicas - - fmaxsqall = fmaxsqloc; - if (update->multireplica == 1) { - fmaxsqall = fmaxsqloc; - MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); - } - - if (fmaxsqall == 0.0) - error->all(FLERR,"Incorrect fmaxsqall calculation"); - - // define max timestep by dividing by the - // inverse of max frequency by discrete_factor - - dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); - - return dtmax; -} - /* ---------------------------------------------------------------------- calculate gradients ---------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS_LS::calc_gradient(double dts) +void MinSpinOSO_LBFGS_LS::calc_gradient() { int nlocal = atom->nlocal; double **sp = atom->sp; @@ -351,17 +303,11 @@ void MinSpinOSO_LBFGS_LS::calc_gradient(double dts) for (int i = 0; i < nlocal; i++) { - // calc. damping torque - - tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - // calculate gradients - g_cur[3 * i + 0] = -tdampz * dts; - g_cur[3 * i + 1] = tdampy * dts; - g_cur[3 * i + 2] = -tdampx * dts; + g_cur[3 * i + 0] = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + g_cur[3 * i + 1] = -(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + g_cur[3 * i + 2] = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); } } @@ -438,7 +384,7 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction() if (rho[m_index] < 0.0){ local_iter = 0; for (int k = 0; k < num_mem; k++){ - for (int i = 0; i < nlocal; i ++){ + for (int i = 0; i < nlocal; i ++){ ds[k][i] = 0.0; dy[k][i] = 0.0; } @@ -464,7 +410,7 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction() for (int i = 0; i < 3 * nlocal; i++) { sq += ds[c_ind][i] * q[i]; } - MPI_Allreduce(&sq, &sq_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&sq,&sq_global,1,MPI_DOUBLE,MPI_SUM,world); if (update->multireplica == 1) { sq_global *= factor; sq = sq_global; @@ -487,7 +433,7 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction() for (int i = 0; i < 3 * nlocal; i++) { yy += dy[m_index][i] * dy[m_index][i]; } - MPI_Allreduce(&yy, &yy_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&yy,&yy_global,1,MPI_DOUBLE,MPI_SUM,world); if (update->multireplica == 1) { yy_global *= factor; yy = yy_global; @@ -520,7 +466,7 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction() yr += dy[c_ind][i] * p_s[i]; } - MPI_Allreduce(&yr, &yr_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&yr,&yr_global,1,MPI_DOUBLE,MPI_SUM,world); if (update->multireplica == 1) { yr_global *= factor; yr = yr_global; @@ -580,15 +526,11 @@ double MinSpinOSO_LBFGS_LS::fmnorm_sqr() double **sp = atom->sp; double **fm = atom->fm; - // calc. magnetic torques + // calc. magnetic torques norm double local_norm2_sqr = 0.0; - for (int i = 0; i < nlocal; i++) { - tx = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - ty = (fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - tz = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - - local_norm2_sqr += tx*tx + ty*ty + tz*tz; + for (int i = 0; i < 3 * nlocal; i++) { + local_norm2_sqr += g_cur[i]*g_cur[i]; } // no extra atom calc. for spins @@ -678,9 +620,8 @@ void MinSpinOSO_LBFGS_LS::vm3(const double *m, const double *v, double *out) { for(int i = 0; i < 3; i++){ out[i] *= 0.0; - for(int j = 0; j < 3; j++){ - out[i] += *(m + 3 * j + i) * v[j]; - } + for(int j = 0; j < 3; j++) + out[i] += *(m + 3 * j + i) * v[j]; } } @@ -692,9 +633,10 @@ void MinSpinOSO_LBFGS_LS::make_step(double c, double *energy_and_der) double rot_mat[9]; // exponential of matrix made of search direction double s_new[3]; double **sp = atom->sp; - double der_e_cur_global = 0.0;; + double der_e_cur_tmp = 0.0;; for (int i = 0; i < nlocal; i++) { + // scale the search direction for (int j = 0; j < 3; j++) p_scaled[j] = c * p_s[3 * i + j]; @@ -707,23 +649,23 @@ void MinSpinOSO_LBFGS_LS::make_step(double c, double *energy_and_der) vm3(rot_mat, sp[i], s_new); for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; - } + } - ecurrent = energy_force(0); - calc_gradient(1.0); - neval++; - der_e_cur = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { - der_e_cur += g_cur[i] * p_s[i]; - } - MPI_Allreduce(&der_e_cur, &der_e_cur_global, 1, MPI_DOUBLE, MPI_SUM, world); - der_e_cur = der_e_cur_global; - if (update->multireplica == 1) { - MPI_Allreduce(&der_e_cur_global,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } + ecurrent = energy_force(0); + calc_gradient(); + neval++; + der_e_cur = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + der_e_cur += g_cur[i] * p_s[i]; + } + MPI_Allreduce(&der_e_cur,&der_e_cur_tmp, 1, MPI_DOUBLE, MPI_SUM, world); + der_e_cur = der_e_cur_tmp; + if (update->multireplica == 1) { + MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } - energy_and_der[0] = ecurrent; - energy_and_der[1] = der_e_cur; + energy_and_der[0] = ecurrent; + energy_and_der[1] = der_e_cur; } /* ---------------------------------------------------------------------- @@ -733,17 +675,17 @@ void MinSpinOSO_LBFGS_LS::make_step(double c, double *energy_and_der) int MinSpinOSO_LBFGS_LS::calc_and_make_step(double a, double b, int index) { - double e_and_d[2] = {0.0, 0.0}; - double alpha, c1, c2, c3; + double e_and_d[2] = {0.0,0.0}; + double alpha,c1,c2,c3; double **sp = atom->sp; int nlocal = atom->nlocal; - make_step(b, e_and_d); + make_step(b,e_and_d); ecurrent = e_and_d[0]; der_e_cur = e_and_d[1]; index++; - if (awc(der_e_pr, eprevious, e_and_d[1], e_and_d[0]) || index == 5){ + if (awc(der_e_pr,eprevious,e_and_d[1],e_and_d[0]) || index == 5){ MPI_Bcast(&b,1,MPI_DOUBLE,0,world); for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = b * p_s[i]; @@ -751,7 +693,7 @@ int MinSpinOSO_LBFGS_LS::calc_and_make_step(double a, double b, int index) return 1; } else{ - double r, f0, f1, df0, df1; + double r,f0,f1,df0,df1; r = b - a; f0 = eprevious; f1 = ecurrent; @@ -778,18 +720,20 @@ int MinSpinOSO_LBFGS_LS::calc_and_make_step(double a, double b, int index) return 0; } + /* ---------------------------------------------------------------------- Approximate Wolfe conditions: William W. Hager and Hongchao Zhang SIAM J. optim., 16(1), 170-192. (23 pages) ------------------------------------------------------------------------- */ + int MinSpinOSO_LBFGS_LS::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){ double eps = 1.0e-6; double delta = 0.1; double sigma = 0.9; - if ((phi_j <= phi_0 + eps * fabs(phi_0)) && ((2.0*delta - 1.0) * der_phi_0 >= der_phi_j >= sigma * der_phi_0)) + if ((phi_j<=phi_0+eps*fabs(phi_0)) && ((2.0*delta-1.0) * der_phi_0>=der_phi_j>=sigma*der_phi_0)) return 1; else return 0; diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.h b/src/SPIN/min_spin_oso_lbfgs_ls.h index eeaf20adf4..876e34f9c9 100644 --- a/src/SPIN/min_spin_oso_lbfgs_ls.h +++ b/src/SPIN/min_spin_oso_lbfgs_ls.h @@ -34,24 +34,15 @@ public: int modify_param(int, char **); void reset_vectors(); int iterate(int); - double evaluate_dt(); void advance_spins(); double fmnorm_sqr(); - void calc_gradient(double); + void calc_gradient(); void calc_search_direction(); private: - // test - int ireplica,nreplica; - - // global and spin timesteps + int ireplica,nreplica; // for neb int nlocal_max; // max value of nlocal (for size of lists) - double dt; - double dts; - - double alpha_damp; // damping for spin minimization - double discrete_factor; // factor for spin timestep evaluation double *spvec; // variables for atomic dof, as 1d vector double *fmvec; // variables for atomic dof, as 1d vector @@ -65,7 +56,7 @@ private: double **sp_copy; // copy of the spins int num_mem; // number of stored steps - int local_iter; + int local_iter; // for neb double der_e_cur; // current derivative along search dir. double der_e_pr; // previous derivative along search dir. From 7514eea9a7112a3962ff208178570125e4d9bb4c Mon Sep 17 00:00:00 2001 From: alxvov Date: Fri, 19 Jul 2019 11:47:24 +0000 Subject: [PATCH 046/418] no line search option too --- src/SPIN/min_spin_oso_lbfgs_ls.cpp | 115 ++++++++++++++++++++--------- src/SPIN/min_spin_oso_lbfgs_ls.h | 6 +- 2 files changed, 83 insertions(+), 38 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.cpp b/src/SPIN/min_spin_oso_lbfgs_ls.cpp index 5896ba9a9f..ddacd3e207 100644 --- a/src/SPIN/min_spin_oso_lbfgs_ls.cpp +++ b/src/SPIN/min_spin_oso_lbfgs_ls.cpp @@ -76,6 +76,7 @@ MinSpinOSO_LBFGS_LS::MinSpinOSO_LBFGS_LS(LAMMPS *lmp) : nreplica = universe->nworlds; ireplica = universe->iworld; use_line_search = 1; + maxepsrot = MY_2PI / (100.0); } @@ -146,6 +147,13 @@ int MinSpinOSO_LBFGS_LS::modify_param(int narg, char **arg) use_line_search = force->numeric(FLERR,arg[1]); return 2; } + if (strcmp(arg[0],"discrete_factor") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + double discrete_factor; + discrete_factor = force->numeric(FLERR,arg[1]); + maxepsrot = MY_2PI / discrete_factor; + return 2; + } return 0; } @@ -184,6 +192,7 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) if (nlocal_max < nlocal) { nlocal_max = nlocal; + local_iter = 0; memory->grow(g_old,3*nlocal_max,"min/spin/oso/lbfgs_ls:g_old"); memory->grow(g_cur,3*nlocal_max,"min/spin/oso/lbfgs_ls:g_cur"); memory->grow(p_s,3*nlocal_max,"min/spin/oso/lbfgs_ls:p_s"); @@ -195,7 +204,7 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) } for (int iter = 0; iter < maxiter; iter++) { - + if (timer->check_timeout(niter)) return TIMEOUT; @@ -205,17 +214,13 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - if (local_iter == 0){ - ecurrent = energy_force(0); - calc_gradient(); - neval++; - } - calc_search_direction(); + if (local_iter == 0) + ecurrent = energy_force(0); if (use_line_search) { // here we need to do line search - + calc_search_direction(); der_e_cur = 0.0; for (int i = 0; i < 3 * nlocal; i++) { der_e_cur += g_cur[i] * p_s[i]; @@ -235,8 +240,22 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) else{ // here we don't do line search + // but use cutoff rotation angle + // if gneb calc., nreplica > 1 + // then calculate gradients and advance spins + // of intermediate replicas only + if (nreplica > 1) { + if(ireplica != 0 && ireplica != nreplica-1) + calc_gradient(); + calc_search_direction(); advance_spins(); + } else{ + calc_gradient(); + calc_search_direction(); + advance_spins(); + } + neval++; eprevious = ecurrent; ecurrent = energy_force(0); neval++; @@ -265,7 +284,7 @@ int MinSpinOSO_LBFGS_LS::iterate(int maxiter) // sync across replicas if running multi-replica minimization if (update->ftol > 0.0) { - fmdotfm = fmnorm_sqr(); + fmdotfm = fmnorm2(); if (update->multireplica == 0) { if (fmdotfm < update->ftol*update->ftol) return FTOL; } else { @@ -340,7 +359,9 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction() double *alpha; double factor; + double scaling = 1.0; + // for multiple replica do not move end points if (nreplica > 1) { if (ireplica == 0 || ireplica == nreplica - 1) { factor = 0.0; @@ -354,9 +375,14 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction() alpha = (double *) calloc(num_mem, sizeof(double)); if (local_iter == 0){ // steepest descent direction + + //if no line search then calculate maximum rotation + if (use_line_search == 0) + scaling = maximum_rotation(g_cur); + for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = -g_cur[i]; - g_old[i] = g_cur[i]; + p_s[i] = -g_cur[i] * factor * scaling;; + g_old[i] = g_cur[i] * factor; for (int k = 0; k < num_mem; k++){ ds[k][i] = 0.0; dy[k][i] = 0.0; @@ -478,9 +504,11 @@ void MinSpinOSO_LBFGS_LS::calc_search_direction() p_s[i] += ds[c_ind][i] * (alpha[c_ind] - beta); } } + if (use_line_search == 0) + scaling = maximum_rotation(p_s); for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = - factor * p_s[i]; - g_old[i] = g_cur[i]; + p_s[i] = - factor * p_s[i] * scaling; + g_old[i] = g_cur[i] * factor; } } @@ -516,32 +544,21 @@ void MinSpinOSO_LBFGS_LS::advance_spins() } /* ---------------------------------------------------------------------- - compute and return ||mag. torque||_2^2 + compute and return ||mag. torque||_2^2 / N ------------------------------------------------------------------------- */ -double MinSpinOSO_LBFGS_LS::fmnorm_sqr() -{ +double MinSpinOSO_LBFGS_LS::fmnorm2() { + double norm2, norm2_global; int nlocal = atom->nlocal; - double tx,ty,tz; - double **sp = atom->sp; - double **fm = atom->fm; + int ntotal = 0; - // calc. magnetic torques norm - - double local_norm2_sqr = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { - local_norm2_sqr += g_cur[i]*g_cur[i]; - } - - // no extra atom calc. for spins - - if (nextra_atom) - error->all(FLERR,"extra atom option not available yet"); - - double norm2_sqr = 0.0; - MPI_Allreduce(&local_norm2_sqr,&norm2_sqr,1,MPI_DOUBLE,MPI_SUM,world); - - return norm2_sqr; + norm2 = 0.0; + for (int i = 0; i < 3 * nlocal; i++) norm2 += g_cur[i] * g_cur[i]; + MPI_Allreduce(&norm2, &norm2_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&nlocal, &ntotal, 1, MPI_INT, MPI_SUM, world); + double ans = norm2_global / (double) ntotal; + MPI_Bcast(&ans, 1, MPI_DOUBLE, 0, world); + return ans; } /* ---------------------------------------------------------------------- @@ -738,3 +755,31 @@ int MinSpinOSO_LBFGS_LS::awc(double der_phi_0, double phi_0, double der_phi_j, d else return 0; } + +double MinSpinOSO_LBFGS_LS::maximum_rotation(double *p) +{ + double norm2,norm2_global,scaling,alpha; + int nlocal = atom->nlocal; + int ntotal = 0; + + norm2 = 0.0; + for (int i = 0; i < 3 * nlocal; i++) norm2 += p[i] * p[i]; + + MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,world); + if (update->multireplica == 1) { + norm2 = norm2_global; + MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,world); + if (update->multireplica == 1) { + nlocal = ntotal; + MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,universe->uworld); + } + + scaling = (maxepsrot * sqrt((double) ntotal / norm2_global)); + + if (scaling < 1.0) alpha = scaling; + else alpha = 1.0; + + return alpha; +} \ No newline at end of file diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.h b/src/SPIN/min_spin_oso_lbfgs_ls.h index 876e34f9c9..a253808923 100644 --- a/src/SPIN/min_spin_oso_lbfgs_ls.h +++ b/src/SPIN/min_spin_oso_lbfgs_ls.h @@ -35,10 +35,10 @@ public: void reset_vectors(); int iterate(int); void advance_spins(); - double fmnorm_sqr(); + double fmnorm2(); void calc_gradient(); void calc_search_direction(); - + double maximum_rotation(double *); private: int ireplica,nreplica; // for neb @@ -62,7 +62,7 @@ private: double der_e_pr; // previous derivative along search dir. int use_line_search; // use line search or not. - + double maxepsrot; void vm3(const double *, const double *, double *); void rodrigues_rotation(const double *, double *); From ad713d39a41107601c7337ac281627057c2c451c Mon Sep 17 00:00:00 2001 From: alxvov Date: Fri, 19 Jul 2019 11:58:39 +0000 Subject: [PATCH 047/418] rename min_spin_oso_lbfgs_ls -> min_spin_oso_lbfgs --- src/SPIN/min_spin_oso_lbfgs.cpp | 365 +++++++++----- src/SPIN/min_spin_oso_lbfgs.h | 32 +- src/SPIN/min_spin_oso_lbfgs_ls.cpp | 785 ----------------------------- src/SPIN/min_spin_oso_lbfgs_ls.h | 79 --- 4 files changed, 241 insertions(+), 1020 deletions(-) delete mode 100644 src/SPIN/min_spin_oso_lbfgs_ls.cpp delete mode 100644 src/SPIN/min_spin_oso_lbfgs_ls.h diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index fd83e7b460..7f716da63d 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -63,16 +63,18 @@ static const char cite_minstyle_spin_oso_lbfgs[] = /* ---------------------------------------------------------------------- */ MinSpinOSO_LBFGS::MinSpinOSO_LBFGS(LAMMPS *lmp) : - Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), ds(NULL), dy(NULL), rho(NULL) + Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), ds(NULL), dy(NULL), rho(NULL), sp_copy(NULL) { if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_lbfgs); nlocal_max = 0; - + // nreplica = number of partitions // ireplica = which world I am in universe nreplica = universe->nworlds; ireplica = universe->iworld; + use_line_search = 1; + maxepsrot = MY_2PI / (100.0); } @@ -86,21 +88,21 @@ MinSpinOSO_LBFGS::~MinSpinOSO_LBFGS() memory->destroy(ds); memory->destroy(dy); memory->destroy(rho); + if (use_line_search) + memory->destroy(sp_copy); } /* ---------------------------------------------------------------------- */ void MinSpinOSO_LBFGS::init() { - alpha_damp = 1.0; - discrete_factor = 10.0; num_mem = 3; local_iter = 0; - maxepsrot = MY_2PI / (100.0); + der_e_cur = 0.0; + der_e_pr = 0.0; Min::init(); - dts = dt = update->dt; last_negative = update->ntimestep; // allocate tables @@ -112,6 +114,8 @@ void MinSpinOSO_LBFGS::init() memory->grow(rho,num_mem,"min/spin/oso/lbfgs:rho"); memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:ds"); memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:dy"); + if (use_line_search) + memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs:sp_copy"); } @@ -135,14 +139,17 @@ void MinSpinOSO_LBFGS::setup_style() int MinSpinOSO_LBFGS::modify_param(int narg, char **arg) { - if (strcmp(arg[0],"alpha_damp") == 0) { + + if (strcmp(arg[0],"line_search") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - alpha_damp = force->numeric(FLERR,arg[1]); + use_line_search = force->numeric(FLERR,arg[1]); return 2; } if (strcmp(arg[0],"discrete_factor") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + double discrete_factor; discrete_factor = force->numeric(FLERR,arg[1]); + maxepsrot = MY_2PI / discrete_factor; return 2; } return 0; @@ -178,6 +185,8 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) bigint ntimestep; double fmdotfm; int flag, flagall; + double **sp = atom->sp; + double der_e_cur_tmp = 0.0; if (nlocal_max < nlocal) { nlocal_max = nlocal; @@ -188,10 +197,12 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) memory->grow(rho,num_mem,"min/spin/oso/lbfgs:rho"); memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:ds"); memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:dy"); + if (use_line_search) + memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs:sp_copy"); } for (int iter = 0; iter < maxiter; iter++) { - + if (timer->check_timeout(niter)) return TIMEOUT; @@ -200,29 +211,53 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - if (local_iter == 0) energy_force(0); - // to be checked - // if gneb calc., nreplica > 1 - // then calculate gradients of intermediate replicas - if (nreplica > 1) { + if (local_iter == 0) + ecurrent = energy_force(0); + + if (use_line_search) { + + // here we need to do line search + calc_search_direction(); + der_e_cur = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + der_e_cur += g_cur[i] * p_s[i]; + } + MPI_Allreduce(&der_e_cur,&der_e_cur_tmp,1,MPI_DOUBLE,MPI_SUM,world); + der_e_cur = der_e_cur_tmp; + if (update->multireplica == 1) { + MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++) sp_copy[i][j] = sp[i][j]; + } + eprevious = ecurrent; + der_e_pr = der_e_cur; + calc_and_make_step(0.0, 1.0, 0); + } + else{ + + // here we don't do line search + // but use cutoff rotation angle + // if gneb calc., nreplica > 1 + // then calculate gradients and advance spins + // of intermediate replicas only + + if (nreplica > 1) { if(ireplica != 0 && ireplica != nreplica-1) - calc_gradient(1.0); - } else calc_gradient(1.0); - calc_search_direction(); - - // to be checked - // if gneb calc., nreplica > 1 - // then advance spins only if intermediate replica - // otherwise (simple minimization), advance spins - - if (nreplica > 1) { - if(ireplica != 0 && ireplica != nreplica-1) - advance_spins(); - } else advance_spins(); - eprevious = ecurrent; - ecurrent = energy_force(0); - neval++; + calc_gradient(); + calc_search_direction(); + advance_spins(); + } else{ + calc_gradient(); + calc_search_direction(); + advance_spins(); + } + neval++; + eprevious = ecurrent; + ecurrent = energy_force(0); + neval++; + } //// energy tolerance criterion //// only check after DELAYSTEP elapsed since velocties reset to 0 @@ -247,7 +282,7 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) // sync across replicas if running multi-replica minimization if (update->ftol > 0.0) { - fmdotfm = fmnorm_sqr(); + fmdotfm = fmnorm2(); if (update->multireplica == 0) { if (fmdotfm < update->ftol*update->ftol) return FTOL; } else { @@ -270,56 +305,11 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) return MAXITER; } -/* ---------------------------------------------------------------------- - evaluate max timestep ----------------------------------------------------------------------- */ - -double MinSpinOSO_LBFGS::evaluate_dt() -{ - double dtmax; - double fmsq; - double fmaxsqone,fmaxsqloc,fmaxsqall; - int nlocal = atom->nlocal; - double **fm = atom->fm; - - // finding max fm on this proc. - - fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; - for (int i = 0; i < nlocal; i++) { - fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; - fmaxsqone = MAX(fmaxsqone,fmsq); - } - - // finding max fm on this replica - - fmaxsqloc = fmaxsqone; - MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - - // finding max fm over all replicas, if necessary - // this communicator would be invalid for multiprocess replicas - - fmaxsqall = fmaxsqloc; - if (update->multireplica == 1) { - fmaxsqall = fmaxsqloc; - MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); - } - - if (fmaxsqall == 0.0) - error->all(FLERR,"Incorrect fmaxsqall calculation"); - - // define max timestep by dividing by the - // inverse of max frequency by discrete_factor - // std::cout << fmaxsqall << "\n"; - dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); - - return dtmax; -} - /* ---------------------------------------------------------------------- calculate gradients ---------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS::calc_gradient(double dts) +void MinSpinOSO_LBFGS::calc_gradient() { int nlocal = atom->nlocal; double **sp = atom->sp; @@ -330,17 +320,11 @@ void MinSpinOSO_LBFGS::calc_gradient(double dts) for (int i = 0; i < nlocal; i++) { - // calc. damping torque - - tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - // calculate gradients - g_cur[3 * i + 0] = -tdampz * dts; - g_cur[3 * i + 1] = tdampy * dts; - g_cur[3 * i + 2] = -tdampx * dts; + g_cur[3 * i + 0] = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + g_cur[3 * i + 1] = -(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + g_cur[3 * i + 2] = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); } } @@ -373,8 +357,9 @@ void MinSpinOSO_LBFGS::calc_search_direction() double *alpha; double factor; - double scaling; + double scaling = 1.0; + // for multiple replica do not move end points if (nreplica > 1) { if (ireplica == 0 || ireplica == nreplica - 1) { factor = 0.0; @@ -388,14 +373,19 @@ void MinSpinOSO_LBFGS::calc_search_direction() alpha = (double *) calloc(num_mem, sizeof(double)); if (local_iter == 0){ // steepest descent direction - - scaling = maximum_rotation(g_cur); - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = - g_cur[i] * factor * scaling; - g_old[i] = g_cur[i]; - ds[m_index][i] = 0.0; - dy[m_index][i] = 0.0; + //if no line search then calculate maximum rotation + if (use_line_search == 0) + scaling = maximum_rotation(g_cur); + + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = -g_cur[i] * factor * scaling;; + g_old[i] = g_cur[i] * factor; + for (int k = 0; k < num_mem; k++){ + ds[k][i] = 0.0; + dy[k][i] = 0.0; + rho[k] = 0.0; + } } } else { dyds = 0.0; @@ -418,7 +408,7 @@ void MinSpinOSO_LBFGS::calc_search_direction() if (rho[m_index] < 0.0){ local_iter = 0; for (int k = 0; k < num_mem; k++){ - for (int i = 0; i < nlocal; i ++){ + for (int i = 0; i < nlocal; i ++){ ds[k][i] = 0.0; dy[k][i] = 0.0; } @@ -444,7 +434,7 @@ void MinSpinOSO_LBFGS::calc_search_direction() for (int i = 0; i < 3 * nlocal; i++) { sq += ds[c_ind][i] * q[i]; } - MPI_Allreduce(&sq, &sq_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&sq,&sq_global,1,MPI_DOUBLE,MPI_SUM,world); if (update->multireplica == 1) { sq_global *= factor; sq = sq_global; @@ -467,7 +457,7 @@ void MinSpinOSO_LBFGS::calc_search_direction() for (int i = 0; i < 3 * nlocal; i++) { yy += dy[m_index][i] * dy[m_index][i]; } - MPI_Allreduce(&yy, &yy_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&yy,&yy_global,1,MPI_DOUBLE,MPI_SUM,world); if (update->multireplica == 1) { yy_global *= factor; yy = yy_global; @@ -500,7 +490,7 @@ void MinSpinOSO_LBFGS::calc_search_direction() yr += dy[c_ind][i] * p_s[i]; } - MPI_Allreduce(&yr, &yr_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&yr,&yr_global,1,MPI_DOUBLE,MPI_SUM,world); if (update->multireplica == 1) { yr_global *= factor; yr = yr_global; @@ -512,10 +502,11 @@ void MinSpinOSO_LBFGS::calc_search_direction() p_s[i] += ds[c_ind][i] * (alpha[c_ind] - beta); } } - scaling = maximum_rotation(p_s); + if (use_line_search == 0) + scaling = maximum_rotation(p_s); for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = - factor * p_s[i] * scaling; - g_old[i] = g_cur[i]; + g_old[i] = g_cur[i] * factor; } } @@ -551,36 +542,21 @@ void MinSpinOSO_LBFGS::advance_spins() } /* ---------------------------------------------------------------------- - compute and return ||mag. torque||_2^2 + compute and return ||mag. torque||_2^2 / N ------------------------------------------------------------------------- */ -double MinSpinOSO_LBFGS::fmnorm_sqr() -{ +double MinSpinOSO_LBFGS::fmnorm2() { + double norm2, norm2_global; int nlocal = atom->nlocal; - double tx,ty,tz; - double **sp = atom->sp; - double **fm = atom->fm; + int ntotal = 0; - // calc. magnetic torques - - double local_norm2_sqr = 0.0; - for (int i = 0; i < nlocal; i++) { - tx = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - ty = (fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - tz = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - - local_norm2_sqr += tx*tx + ty*ty + tz*tz; - } - - // no extra atom calc. for spins - - if (nextra_atom) - error->all(FLERR,"extra atom option not available yet"); - - double norm2_sqr = 0.0; - MPI_Allreduce(&local_norm2_sqr,&norm2_sqr,1,MPI_DOUBLE,MPI_SUM,world); - - return norm2_sqr; + norm2 = 0.0; + for (int i = 0; i < 3 * nlocal; i++) norm2 += g_cur[i] * g_cur[i]; + MPI_Allreduce(&norm2, &norm2_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&nlocal, &ntotal, 1, MPI_INT, MPI_SUM, world); + double ans = norm2_global / (double) ntotal; + MPI_Bcast(&ans, 1, MPI_DOUBLE, 0, world); + return ans; } /* ---------------------------------------------------------------------- @@ -659,38 +635,149 @@ void MinSpinOSO_LBFGS::vm3(const double *m, const double *v, double *out) { for(int i = 0; i < 3; i++){ out[i] *= 0.0; - for(int j = 0; j < 3; j++){ - out[i] += *(m + 3 * j + i) * v[j]; - } + for(int j = 0; j < 3; j++) + out[i] += *(m + 3 * j + i) * v[j]; } } + +void MinSpinOSO_LBFGS::make_step(double c, double *energy_and_der) +{ + double p_scaled[3]; + int nlocal = atom->nlocal; + double rot_mat[9]; // exponential of matrix made of search direction + double s_new[3]; + double **sp = atom->sp; + double der_e_cur_tmp = 0.0;; + + for (int i = 0; i < nlocal; i++) { + + // scale the search direction + + for (int j = 0; j < 3; j++) p_scaled[j] = c * p_s[3 * i + j]; + + // calculate rotation matrix + + rodrigues_rotation(p_scaled, rot_mat); + + // rotate spins + + vm3(rot_mat, sp[i], s_new); + for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; + } + + ecurrent = energy_force(0); + calc_gradient(); + neval++; + der_e_cur = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + der_e_cur += g_cur[i] * p_s[i]; + } + MPI_Allreduce(&der_e_cur,&der_e_cur_tmp, 1, MPI_DOUBLE, MPI_SUM, world); + der_e_cur = der_e_cur_tmp; + if (update->multireplica == 1) { + MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + + energy_and_der[0] = ecurrent; + energy_and_der[1] = der_e_cur; +} + +/* ---------------------------------------------------------------------- + Calculate step length which satisfies approximate Wolfe conditions + using the cubic interpolation +------------------------------------------------------------------------- */ + +int MinSpinOSO_LBFGS::calc_and_make_step(double a, double b, int index) +{ + double e_and_d[2] = {0.0,0.0}; + double alpha,c1,c2,c3; + double **sp = atom->sp; + int nlocal = atom->nlocal; + + make_step(b,e_and_d); + ecurrent = e_and_d[0]; + der_e_cur = e_and_d[1]; + index++; + + if (awc(der_e_pr,eprevious,e_and_d[1],e_and_d[0]) || index == 5){ + MPI_Bcast(&b,1,MPI_DOUBLE,0,world); + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = b * p_s[i]; + } + return 1; + } + else{ + double r,f0,f1,df0,df1; + r = b - a; + f0 = eprevious; + f1 = ecurrent; + df0 = der_e_pr; + df1 = der_e_cur; + + c1 = -2.0*(f1-f0)/(r*r*r)+(df1+df0)/(r*r); + c2 = 3.0*(f1-f0)/(r*r)-(df1+2.0*df0)/(r); + c3 = df0; + + // f(x) = c1 x^3 + c2 x^2 + c3 x^1 + c4 + // has minimum at alpha below. We do not check boundaries. + + alpha = (-c2 + sqrt(c2*c2 - 3.0*c1*c3))/(3.0*c1); + MPI_Bcast(&alpha,1,MPI_DOUBLE,0,world); + + if (alpha < 0.0) alpha = r/2.0; + + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++) sp[i][j] = sp_copy[i][j]; + } + calc_and_make_step(0.0, alpha, index); + } + + return 0; +} + +/* ---------------------------------------------------------------------- + Approximate Wolfe conditions: + William W. Hager and Hongchao Zhang + SIAM J. optim., 16(1), 170-192. (23 pages) +------------------------------------------------------------------------- */ + +int MinSpinOSO_LBFGS::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){ + + double eps = 1.0e-6; + double delta = 0.1; + double sigma = 0.9; + + if ((phi_j<=phi_0+eps*fabs(phi_0)) && ((2.0*delta-1.0) * der_phi_0>=der_phi_j>=sigma*der_phi_0)) + return 1; + else + return 0; +} + double MinSpinOSO_LBFGS::maximum_rotation(double *p) { - double norm, norm_global, scaling, alpha; + double norm2,norm2_global,scaling,alpha; int nlocal = atom->nlocal; int ntotal = 0; - norm = 0.0; - for (int i = 0; i < 3 * nlocal; i++) norm += p[i] * p[i]; + norm2 = 0.0; + for (int i = 0; i < 3 * nlocal; i++) norm2 += p[i] * p[i]; - MPI_Allreduce(&norm,&norm_global,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,world); if (update->multireplica == 1) { - norm = norm_global; - MPI_Allreduce(&norm,&norm_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + norm2 = norm2_global; + MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } - MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,world); if (update->multireplica == 1) { nlocal = ntotal; MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,universe->uworld); } - scaling = (maxepsrot * sqrt((double) ntotal / norm_global)); + scaling = (maxepsrot * sqrt((double) ntotal / norm2_global)); if (scaling < 1.0) alpha = scaling; else alpha = 1.0; return alpha; -} - +} \ No newline at end of file diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h index c0f8dc484d..91c900f244 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -24,7 +24,7 @@ MinimizeStyle(spin/oso_lbfgs, MinSpinOSO_LBFGS) namespace LAMMPS_NS { -class MinSpinOSO_LBFGS : public Min { +class MinSpinOSO_LBFGS: public Min { public: MinSpinOSO_LBFGS(class LAMMPS *); @@ -34,26 +34,15 @@ public: int modify_param(int, char **); void reset_vectors(); int iterate(int); - double evaluate_dt(); void advance_spins(); - double fmnorm_sqr(); - void calc_gradient(double); + double fmnorm2(); + void calc_gradient(); void calc_search_direction(); double maximum_rotation(double *); private: - - - // test - int ireplica,nreplica; - - // global and spin timesteps + int ireplica,nreplica; // for neb int nlocal_max; // max value of nlocal (for size of lists) - double dt; - double dts; - - double alpha_damp; // damping for spin minimization - double discrete_factor; // factor for spin timestep evaluation double *spvec; // variables for atomic dof, as 1d vector double *fmvec; // variables for atomic dof, as 1d vector @@ -64,13 +53,22 @@ private: double **ds; // change in rotation matrix between two iterations, da double **dy; // change in gradients between two iterations, dg double *rho; // estimation of curvature - int num_mem; // number of stored steps - int local_iter; // number of times we call search_direction + double **sp_copy; // copy of the spins + int num_mem; // number of stored steps + int local_iter; // for neb + + double der_e_cur; // current derivative along search dir. + double der_e_pr; // previous derivative along search dir. + + int use_line_search; // use line search or not. double maxepsrot; void vm3(const double *, const double *, double *); void rodrigues_rotation(const double *, double *); + int calc_and_make_step(double, double, int); + int awc(double, double, double, double); + void make_step(double, double *); bigint last_negative; }; diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.cpp b/src/SPIN/min_spin_oso_lbfgs_ls.cpp deleted file mode 100644 index ddacd3e207..0000000000 --- a/src/SPIN/min_spin_oso_lbfgs_ls.cpp +++ /dev/null @@ -1,785 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------ - Contributing authors: Aleksei Ivanov (University of Iceland) - Julien Tranchida (SNL) - - Please cite the related publication: - Ivanov, A. V., Uzdin, V. M., & Jónsson, H. (2019). Fast and Robust - Algorithm for the Minimisation of the Energy of Spin Systems. arXiv - preprint arXiv:1904.02669. -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include "min_spin_oso_lbfgs_ls.h" -#include "universe.h" -#include "atom.h" -#include "citeme.h" -#include "force.h" -#include "update.h" -#include "output.h" -#include "timer.h" -#include "error.h" -#include "memory.h" -#include "modify.h" -#include "math_special.h" -#include "math_const.h" -#include "universe.h" -#include - - -using namespace LAMMPS_NS; -using namespace MathConst; - -static const char cite_minstyle_spin_oso_lbfgs_ls[] = - "min_style spin/oso_lbfgs_ls command:\n\n" - "@article{ivanov2019fast,\n" - "title={Fast and Robust Algorithm for the Minimisation of the Energy of " - "Spin Systems},\n" - "author={Ivanov, A. V and Uzdin, V. M. and J{\'o}nsson, H.},\n" - "journal={arXiv preprint arXiv:1904.02669},\n" - "year={2019}\n" - "}\n\n"; - -// EPS_ENERGY = minimum normalization for energy tolerance - -#define EPS_ENERGY 1.0e-8 - -#define DELAYSTEP 5 - - -/* ---------------------------------------------------------------------- */ - -MinSpinOSO_LBFGS_LS::MinSpinOSO_LBFGS_LS(LAMMPS *lmp) : - Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), ds(NULL), dy(NULL), rho(NULL), sp_copy(NULL) -{ - if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_lbfgs_ls); - nlocal_max = 0; - - // nreplica = number of partitions - // ireplica = which world I am in universe - - nreplica = universe->nworlds; - ireplica = universe->iworld; - use_line_search = 1; - maxepsrot = MY_2PI / (100.0); - -} - -/* ---------------------------------------------------------------------- */ - -MinSpinOSO_LBFGS_LS::~MinSpinOSO_LBFGS_LS() -{ - memory->destroy(g_old); - memory->destroy(g_cur); - memory->destroy(p_s); - memory->destroy(ds); - memory->destroy(dy); - memory->destroy(rho); - if (use_line_search) - memory->destroy(sp_copy); -} - -/* ---------------------------------------------------------------------- */ - -void MinSpinOSO_LBFGS_LS::init() -{ - num_mem = 3; - local_iter = 0; - der_e_cur = 0.0; - der_e_pr = 0.0; - - Min::init(); - - last_negative = update->ntimestep; - - // allocate tables - - nlocal_max = atom->nlocal; - memory->grow(g_old,3*nlocal_max,"min/spin/oso/lbfgs_ls:g_old"); - memory->grow(g_cur,3*nlocal_max,"min/spin/oso/lbfgs_ls:g_cur"); - memory->grow(p_s,3*nlocal_max,"min/spin/oso/lbfgs_ls:p_s"); - memory->grow(rho,num_mem,"min/spin/oso/lbfgs_ls:rho"); - memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:ds"); - memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:dy"); - if (use_line_search) - memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs_ls:sp_copy"); - -} - -/* ---------------------------------------------------------------------- */ - -void MinSpinOSO_LBFGS_LS::setup_style() -{ - double **v = atom->v; - int nlocal = atom->nlocal; - - // check if the atom/spin style is defined - - if (!atom->sp_flag) - error->all(FLERR,"min/spin_oso_lbfgs_ls requires atom/spin style"); - - for (int i = 0; i < nlocal; i++) - v[i][0] = v[i][1] = v[i][2] = 0.0; -} - -/* ---------------------------------------------------------------------- */ - -int MinSpinOSO_LBFGS_LS::modify_param(int narg, char **arg) -{ - - if (strcmp(arg[0],"line_search") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - use_line_search = force->numeric(FLERR,arg[1]); - return 2; - } - if (strcmp(arg[0],"discrete_factor") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - double discrete_factor; - discrete_factor = force->numeric(FLERR,arg[1]); - maxepsrot = MY_2PI / discrete_factor; - return 2; - } - return 0; -} - -/* ---------------------------------------------------------------------- - set current vector lengths and pointers - called after atoms have migrated -------------------------------------------------------------------------- */ - -void MinSpinOSO_LBFGS_LS::reset_vectors() -{ - // atomic dof - - // size sp is 4N vector - nvec = 4 * atom->nlocal; - if (nvec) spvec = atom->sp[0]; - - nvec = 3 * atom->nlocal; - if (nvec) fmvec = atom->fm[0]; - - if (nvec) xvec = atom->x[0]; - if (nvec) fvec = atom->f[0]; -} - -/* ---------------------------------------------------------------------- - minimization via damped spin dynamics -------------------------------------------------------------------------- */ - -int MinSpinOSO_LBFGS_LS::iterate(int maxiter) -{ - int nlocal = atom->nlocal; - bigint ntimestep; - double fmdotfm; - int flag, flagall; - double **sp = atom->sp; - double der_e_cur_tmp = 0.0; - - if (nlocal_max < nlocal) { - nlocal_max = nlocal; - local_iter = 0; - memory->grow(g_old,3*nlocal_max,"min/spin/oso/lbfgs_ls:g_old"); - memory->grow(g_cur,3*nlocal_max,"min/spin/oso/lbfgs_ls:g_cur"); - memory->grow(p_s,3*nlocal_max,"min/spin/oso/lbfgs_ls:p_s"); - memory->grow(rho,num_mem,"min/spin/oso/lbfgs_ls:rho"); - memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:ds"); - memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs_ls:dy"); - if (use_line_search) - memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs_ls:sp_copy"); - } - - for (int iter = 0; iter < maxiter; iter++) { - - if (timer->check_timeout(niter)) - return TIMEOUT; - - ntimestep = ++update->ntimestep; - niter++; - - // optimize timestep accross processes / replicas - // need a force calculation for timestep optimization - - if (local_iter == 0) - ecurrent = energy_force(0); - - if (use_line_search) { - - // here we need to do line search - calc_search_direction(); - der_e_cur = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { - der_e_cur += g_cur[i] * p_s[i]; - } - MPI_Allreduce(&der_e_cur,&der_e_cur_tmp,1,MPI_DOUBLE,MPI_SUM,world); - der_e_cur = der_e_cur_tmp; - if (update->multireplica == 1) { - MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++) sp_copy[i][j] = sp[i][j]; - } - eprevious = ecurrent; - der_e_pr = der_e_cur; - calc_and_make_step(0.0, 1.0, 0); - } - else{ - - // here we don't do line search - // but use cutoff rotation angle - // if gneb calc., nreplica > 1 - // then calculate gradients and advance spins - // of intermediate replicas only - - if (nreplica > 1) { - if(ireplica != 0 && ireplica != nreplica-1) - calc_gradient(); - calc_search_direction(); - advance_spins(); - } else{ - calc_gradient(); - calc_search_direction(); - advance_spins(); - } - neval++; - eprevious = ecurrent; - ecurrent = energy_force(0); - neval++; - } - - //// energy tolerance criterion - //// only check after DELAYSTEP elapsed since velocties reset to 0 - //// sync across replicas if running multi-replica minimization - - if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { - if (update->multireplica == 0) { - if (fabs(ecurrent-eprevious) < - update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) - return ETOL; - } else { - if (fabs(ecurrent-eprevious) < - update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) - flag = 0; - else flag = 1; - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); - if (flagall == 0) return ETOL; - } - } - - // magnetic torque tolerance criterion - // sync across replicas if running multi-replica minimization - - if (update->ftol > 0.0) { - fmdotfm = fmnorm2(); - if (update->multireplica == 0) { - if (fmdotfm < update->ftol*update->ftol) return FTOL; - } else { - if (fmdotfm < update->ftol*update->ftol) flag = 0; - else flag = 1; - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); - if (flagall == 0) return FTOL; - } - } - - // output for thermo, dump, restart files - - if (output->next == ntimestep) { - timer->stamp(); - output->write(ntimestep); - timer->stamp(Timer::OUTPUT); - } - } - - return MAXITER; -} - -/* ---------------------------------------------------------------------- - calculate gradients ----------------------------------------------------------------------- */ - -void MinSpinOSO_LBFGS_LS::calc_gradient() -{ - int nlocal = atom->nlocal; - double **sp = atom->sp; - double **fm = atom->fm; - double tdampx, tdampy, tdampz; - - // loop on all spins on proc. - - for (int i = 0; i < nlocal; i++) { - - // calculate gradients - - g_cur[3 * i + 0] = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - g_cur[3 * i + 1] = -(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - g_cur[3 * i + 2] = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - } -} - -/* ---------------------------------------------------------------------- - search direction: - Limited-memory BFGS. - See Jorge Nocedal and Stephen J. Wright 'Numerical - Optimization' Second Edition, 2006 (p. 177) ----------------------------------------------------------------------- */ - -void MinSpinOSO_LBFGS_LS::calc_search_direction() -{ - int nlocal = atom->nlocal; - - double dyds = 0.0; - double sq = 0.0; - double yy = 0.0; - double yr = 0.0; - double beta = 0.0; - - double dyds_global = 0.0; - double sq_global = 0.0; - double yy_global = 0.0; - double yr_global = 0.0; - double beta_global = 0.0; - - int m_index = local_iter % num_mem; // memory index - int c_ind = 0; - double *q; - double *alpha; - - double factor; - double scaling = 1.0; - - // for multiple replica do not move end points - if (nreplica > 1) { - if (ireplica == 0 || ireplica == nreplica - 1) { - factor = 0.0; - } - else factor = 1.0; - }else{ - factor = 1.0; - } - - q = (double *) calloc(3*nlocal, sizeof(double)); - alpha = (double *) calloc(num_mem, sizeof(double)); - - if (local_iter == 0){ // steepest descent direction - - //if no line search then calculate maximum rotation - if (use_line_search == 0) - scaling = maximum_rotation(g_cur); - - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = -g_cur[i] * factor * scaling;; - g_old[i] = g_cur[i] * factor; - for (int k = 0; k < num_mem; k++){ - ds[k][i] = 0.0; - dy[k][i] = 0.0; - rho[k] = 0.0; - } - } - } else { - dyds = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { - ds[m_index][i] = p_s[i]; - dy[m_index][i] = g_cur[i] - g_old[i]; - dyds += ds[m_index][i] * dy[m_index][i]; - } - MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); - - if (update->multireplica == 1) { - dyds_global *= factor; - dyds = dyds_global; - MPI_Allreduce(&dyds, &dyds_global, 1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - - if (fabs(dyds_global) > 1.0e-60) rho[m_index] = 1.0 / dyds_global; - else rho[m_index] = 1.0e60; - - if (rho[m_index] < 0.0){ - local_iter = 0; - for (int k = 0; k < num_mem; k++){ - for (int i = 0; i < nlocal; i ++){ - ds[k][i] = 0.0; - dy[k][i] = 0.0; - } - } - return calc_search_direction(); - } - - // set the q vector - - for (int i = 0; i < 3 * nlocal; i++) { - q[i] = g_cur[i]; - } - - // loop over last m indecies - for(int k = num_mem - 1; k > -1; k--) { - // this loop should run from the newest memory to the oldest one. - - c_ind = (k + m_index + 1) % num_mem; - - // dot product between dg and q - - sq = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { - sq += ds[c_ind][i] * q[i]; - } - MPI_Allreduce(&sq,&sq_global,1,MPI_DOUBLE,MPI_SUM,world); - if (update->multireplica == 1) { - sq_global *= factor; - sq = sq_global; - MPI_Allreduce(&sq,&sq_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - - // update alpha - - alpha[c_ind] = rho[c_ind] * sq_global; - - // update q - - for (int i = 0; i < 3 * nlocal; i++) { - q[i] -= alpha[c_ind] * dy[c_ind][i]; - } - } - - // dot product between dg with itself - yy = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { - yy += dy[m_index][i] * dy[m_index][i]; - } - MPI_Allreduce(&yy,&yy_global,1,MPI_DOUBLE,MPI_SUM,world); - if (update->multireplica == 1) { - yy_global *= factor; - yy = yy_global; - MPI_Allreduce(&yy,&yy_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - - // calculate now search direction - - double devis = rho[m_index] * yy_global; - - if (fabs(devis) > 1.0e-60) { - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = factor * q[i] / devis; - } - }else{ - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = factor * q[i] * 1.0e60; - } - } - - for (int k = 0; k < num_mem; k++){ - // this loop should run from the oldest memory to the newest one. - - if (local_iter < num_mem) c_ind = k; - else c_ind = (k + m_index + 1) % num_mem; - - // dot product between p and da - yr = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { - yr += dy[c_ind][i] * p_s[i]; - } - - MPI_Allreduce(&yr,&yr_global,1,MPI_DOUBLE,MPI_SUM,world); - if (update->multireplica == 1) { - yr_global *= factor; - yr = yr_global; - MPI_Allreduce(&yr,&yr_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - - beta = rho[c_ind] * yr_global; - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] += ds[c_ind][i] * (alpha[c_ind] - beta); - } - } - if (use_line_search == 0) - scaling = maximum_rotation(p_s); - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = - factor * p_s[i] * scaling; - g_old[i] = g_cur[i] * factor; - } - } - - local_iter++; - free(q); - free(alpha); - -} - -/* ---------------------------------------------------------------------- - rotation of spins along the search direction ----------------------------------------------------------------------- */ - -void MinSpinOSO_LBFGS_LS::advance_spins() -{ - int nlocal = atom->nlocal; - double **sp = atom->sp; - double **fm = atom->fm; - double tdampx, tdampy, tdampz; - double rot_mat[9]; // exponential of matrix made of search direction - double s_new[3]; - - // loop on all spins on proc. - - for (int i = 0; i < nlocal; i++) { - rodrigues_rotation(p_s + 3 * i, rot_mat); - - // rotate spins - - vm3(rot_mat, sp[i], s_new); - for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; - } -} - -/* ---------------------------------------------------------------------- - compute and return ||mag. torque||_2^2 / N -------------------------------------------------------------------------- */ - -double MinSpinOSO_LBFGS_LS::fmnorm2() { - double norm2, norm2_global; - int nlocal = atom->nlocal; - int ntotal = 0; - - norm2 = 0.0; - for (int i = 0; i < 3 * nlocal; i++) norm2 += g_cur[i] * g_cur[i]; - MPI_Allreduce(&norm2, &norm2_global, 1, MPI_DOUBLE, MPI_SUM, world); - MPI_Allreduce(&nlocal, &ntotal, 1, MPI_INT, MPI_SUM, world); - double ans = norm2_global / (double) ntotal; - MPI_Bcast(&ans, 1, MPI_DOUBLE, 0, world); - return ans; -} - -/* ---------------------------------------------------------------------- - calculate 3x3 matrix exponential using Rodrigues' formula - (R. Murray, Z. Li, and S. Shankar Sastry, - A Mathematical Introduction to - Robotic Manipulation (1994), p. 28 and 30). - - upp_tr - vector x, y, z so that one calculate - U = exp(A) with A= [[0, x, y], - [-x, 0, z], - [-y, -z, 0]] -------------------------------------------------------------------------- */ - -void MinSpinOSO_LBFGS_LS::rodrigues_rotation(const double *upp_tr, double *out) -{ - double theta,A,B,D,x,y,z; - double s1,s2,s3,a1,a2,a3; - - if (fabs(upp_tr[0]) < 1.0e-40 && - fabs(upp_tr[1]) < 1.0e-40 && - fabs(upp_tr[2]) < 1.0e-40){ - - // if upp_tr is zero, return unity matrix - for(int k = 0; k < 3; k++){ - for(int m = 0; m < 3; m++){ - if (m == k) out[3 * k + m] = 1.0; - else out[3 * k + m] = 0.0; - } - } - return; - } - - theta = sqrt(upp_tr[0] * upp_tr[0] + - upp_tr[1] * upp_tr[1] + - upp_tr[2] * upp_tr[2]); - - A = cos(theta); - B = sin(theta); - D = 1 - A; - x = upp_tr[0]/theta; - y = upp_tr[1]/theta; - z = upp_tr[2]/theta; - - // diagonal elements of U - - out[0] = A + z * z * D; - out[4] = A + y * y * D; - out[8] = A + x * x * D; - - // off diagonal of U - - s1 = -y * z *D; - s2 = x * z * D; - s3 = -x * y * D; - - a1 = x * B; - a2 = y * B; - a3 = z * B; - - out[1] = s1 + a1; - out[3] = s1 - a1; - out[2] = s2 + a2; - out[6] = s2 - a2; - out[5] = s3 + a3; - out[7] = s3 - a3; - -} - -/* ---------------------------------------------------------------------- - out = vector^T x m, - m -- 3x3 matrix , v -- 3-d vector -------------------------------------------------------------------------- */ - -void MinSpinOSO_LBFGS_LS::vm3(const double *m, const double *v, double *out) -{ - for(int i = 0; i < 3; i++){ - out[i] *= 0.0; - for(int j = 0; j < 3; j++) - out[i] += *(m + 3 * j + i) * v[j]; - } -} - - -void MinSpinOSO_LBFGS_LS::make_step(double c, double *energy_and_der) -{ - double p_scaled[3]; - int nlocal = atom->nlocal; - double rot_mat[9]; // exponential of matrix made of search direction - double s_new[3]; - double **sp = atom->sp; - double der_e_cur_tmp = 0.0;; - - for (int i = 0; i < nlocal; i++) { - - // scale the search direction - - for (int j = 0; j < 3; j++) p_scaled[j] = c * p_s[3 * i + j]; - - // calculate rotation matrix - - rodrigues_rotation(p_scaled, rot_mat); - - // rotate spins - - vm3(rot_mat, sp[i], s_new); - for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; - } - - ecurrent = energy_force(0); - calc_gradient(); - neval++; - der_e_cur = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { - der_e_cur += g_cur[i] * p_s[i]; - } - MPI_Allreduce(&der_e_cur,&der_e_cur_tmp, 1, MPI_DOUBLE, MPI_SUM, world); - der_e_cur = der_e_cur_tmp; - if (update->multireplica == 1) { - MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - - energy_and_der[0] = ecurrent; - energy_and_der[1] = der_e_cur; -} - -/* ---------------------------------------------------------------------- - Calculate step length which satisfies approximate Wolfe conditions - using the cubic interpolation -------------------------------------------------------------------------- */ - -int MinSpinOSO_LBFGS_LS::calc_and_make_step(double a, double b, int index) -{ - double e_and_d[2] = {0.0,0.0}; - double alpha,c1,c2,c3; - double **sp = atom->sp; - int nlocal = atom->nlocal; - - make_step(b,e_and_d); - ecurrent = e_and_d[0]; - der_e_cur = e_and_d[1]; - index++; - - if (awc(der_e_pr,eprevious,e_and_d[1],e_and_d[0]) || index == 5){ - MPI_Bcast(&b,1,MPI_DOUBLE,0,world); - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = b * p_s[i]; - } - return 1; - } - else{ - double r,f0,f1,df0,df1; - r = b - a; - f0 = eprevious; - f1 = ecurrent; - df0 = der_e_pr; - df1 = der_e_cur; - - c1 = -2.0*(f1-f0)/(r*r*r)+(df1+df0)/(r*r); - c2 = 3.0*(f1-f0)/(r*r)-(df1+2.0*df0)/(r); - c3 = df0; - - // f(x) = c1 x^3 + c2 x^2 + c3 x^1 + c4 - // has minimum at alpha below. We do not check boundaries. - - alpha = (-c2 + sqrt(c2*c2 - 3.0*c1*c3))/(3.0*c1); - MPI_Bcast(&alpha,1,MPI_DOUBLE,0,world); - - if (alpha < 0.0) alpha = r/2.0; - - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++) sp[i][j] = sp_copy[i][j]; - } - calc_and_make_step(0.0, alpha, index); - } - - return 0; -} - -/* ---------------------------------------------------------------------- - Approximate Wolfe conditions: - William W. Hager and Hongchao Zhang - SIAM J. optim., 16(1), 170-192. (23 pages) -------------------------------------------------------------------------- */ - -int MinSpinOSO_LBFGS_LS::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){ - - double eps = 1.0e-6; - double delta = 0.1; - double sigma = 0.9; - - if ((phi_j<=phi_0+eps*fabs(phi_0)) && ((2.0*delta-1.0) * der_phi_0>=der_phi_j>=sigma*der_phi_0)) - return 1; - else - return 0; -} - -double MinSpinOSO_LBFGS_LS::maximum_rotation(double *p) -{ - double norm2,norm2_global,scaling,alpha; - int nlocal = atom->nlocal; - int ntotal = 0; - - norm2 = 0.0; - for (int i = 0; i < 3 * nlocal; i++) norm2 += p[i] * p[i]; - - MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,world); - if (update->multireplica == 1) { - norm2 = norm2_global; - MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,world); - if (update->multireplica == 1) { - nlocal = ntotal; - MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,universe->uworld); - } - - scaling = (maxepsrot * sqrt((double) ntotal / norm2_global)); - - if (scaling < 1.0) alpha = scaling; - else alpha = 1.0; - - return alpha; -} \ No newline at end of file diff --git a/src/SPIN/min_spin_oso_lbfgs_ls.h b/src/SPIN/min_spin_oso_lbfgs_ls.h deleted file mode 100644 index a253808923..0000000000 --- a/src/SPIN/min_spin_oso_lbfgs_ls.h +++ /dev/null @@ -1,79 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef MINIMIZE_CLASS - -MinimizeStyle(spin/oso_lbfgs_ls, MinSpinOSO_LBFGS_LS) - -#else - -#ifndef LMP_MIN_SPIN_OSO_LBFGS_LS_H -#define LMP_MIN_SPIN_OSO_LBFGS_LS_H - -#include "min.h" - -namespace LAMMPS_NS { - -class MinSpinOSO_LBFGS_LS : public Min { - -public: - MinSpinOSO_LBFGS_LS(class LAMMPS *); - virtual ~MinSpinOSO_LBFGS_LS(); - void init(); - void setup_style(); - int modify_param(int, char **); - void reset_vectors(); - int iterate(int); - void advance_spins(); - double fmnorm2(); - void calc_gradient(); - void calc_search_direction(); - double maximum_rotation(double *); -private: - int ireplica,nreplica; // for neb - - int nlocal_max; // max value of nlocal (for size of lists) - - double *spvec; // variables for atomic dof, as 1d vector - double *fmvec; // variables for atomic dof, as 1d vector - - double *g_cur; // current gradient vector - double *g_old; // gradient vector at previous step - double *p_s; // search direction vector - double **ds; // change in rotation matrix between two iterations, da - double **dy; // change in gradients between two iterations, dg - double *rho; // estimation of curvature - double **sp_copy; // copy of the spins - - int num_mem; // number of stored steps - int local_iter; // for neb - - double der_e_cur; // current derivative along search dir. - double der_e_pr; // previous derivative along search dir. - - int use_line_search; // use line search or not. - double maxepsrot; - - void vm3(const double *, const double *, double *); - void rodrigues_rotation(const double *, double *); - int calc_and_make_step(double, double, int); - int awc(double, double, double, double); - void make_step(double, double *); - - bigint last_negative; -}; - -} - -#endif -#endif From aa5263f729d6cfb996e7b0033c6737b1a6e5d8c9 Mon Sep 17 00:00:00 2001 From: alxvov Date: Fri, 19 Jul 2019 13:46:26 +0000 Subject: [PATCH 048/418] restructure a bit --- src/SPIN/min_spin_oso_lbfgs.h | 47 +++++++++++++++-------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h index 91c900f244..48d1b47837 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -25,8 +25,7 @@ MinimizeStyle(spin/oso_lbfgs, MinSpinOSO_LBFGS) namespace LAMMPS_NS { class MinSpinOSO_LBFGS: public Min { - -public: + public: MinSpinOSO_LBFGS(class LAMMPS *); virtual ~MinSpinOSO_LBFGS(); void init(); @@ -34,42 +33,36 @@ public: int modify_param(int, char **); void reset_vectors(); int iterate(int); + private: + int ireplica,nreplica; // for neb + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + double *g_cur; // current gradient vector + double *g_old; // gradient vector at previous step + double *p_s; // search direction vector + double **sp_copy; // copy of the spins + int local_iter; // for neb + int nlocal_max; // max value of nlocal (for size of lists) + void advance_spins(); double fmnorm2(); void calc_gradient(); void calc_search_direction(); double maximum_rotation(double *); -private: - int ireplica,nreplica; // for neb - - int nlocal_max; // max value of nlocal (for size of lists) - - double *spvec; // variables for atomic dof, as 1d vector - double *fmvec; // variables for atomic dof, as 1d vector - - double *g_cur; // current gradient vector - double *g_old; // gradient vector at previous step - double *p_s; // search direction vector - double **ds; // change in rotation matrix between two iterations, da - double **dy; // change in gradients between two iterations, dg - double *rho; // estimation of curvature - double **sp_copy; // copy of the spins - - int num_mem; // number of stored steps - int local_iter; // for neb - - double der_e_cur; // current derivative along search dir. - double der_e_pr; // previous derivative along search dir. - - int use_line_search; // use line search or not. - double maxepsrot; - void vm3(const double *, const double *, double *); void rodrigues_rotation(const double *, double *); int calc_and_make_step(double, double, int); int awc(double, double, double, double); void make_step(double, double *); + double der_e_cur; // current derivative along search dir. + double der_e_pr; // previous derivative along search dir. + int use_line_search; // use line search or not. + double maxepsrot; + double **ds; // change in rotation matrix between two iterations, da + double **dy; // change in gradients between two iterations, dg + double *rho; // estimation of curvature + int num_mem; // number of stored steps bigint last_negative; }; From b31548df2e84ded3b50ebbbd53ae94b2cf912e35 Mon Sep 17 00:00:00 2001 From: alxvov Date: Fri, 19 Jul 2019 16:00:08 +0000 Subject: [PATCH 049/418] convergence criterion based on maximum toque at atom. Minor changes --- src/SPIN/min_spin_oso_lbfgs.cpp | 62 +++++++++++++++++++++------------ src/SPIN/min_spin_oso_lbfgs.h | 2 +- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index 7f716da63d..8d05ea63d8 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -212,25 +212,25 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - if (local_iter == 0) - ecurrent = energy_force(0); - if (use_line_search) { // here we need to do line search + if (local_iter == 0) + calc_gradient(); + calc_search_direction(); der_e_cur = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { + for (int i = 0; i < 3 * nlocal; i++) der_e_cur += g_cur[i] * p_s[i]; - } MPI_Allreduce(&der_e_cur,&der_e_cur_tmp,1,MPI_DOUBLE,MPI_SUM,world); der_e_cur = der_e_cur_tmp; if (update->multireplica == 1) { MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++) sp_copy[i][j] = sp[i][j]; - } + for (int i = 0; i < nlocal; i++) + for (int j = 0; j < 3; j++) + sp_copy[i][j] = sp[i][j]; + eprevious = ecurrent; der_e_pr = der_e_cur; calc_and_make_step(0.0, 1.0, 0); @@ -253,7 +253,6 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) calc_search_direction(); advance_spins(); } - neval++; eprevious = ecurrent; ecurrent = energy_force(0); neval++; @@ -282,7 +281,7 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) // sync across replicas if running multi-replica minimization if (update->ftol > 0.0) { - fmdotfm = fmnorm2(); + fmdotfm = max_torque(); if (update->multireplica == 0) { if (fmdotfm < update->ftol*update->ftol) return FTOL; } else { @@ -314,8 +313,7 @@ void MinSpinOSO_LBFGS::calc_gradient() int nlocal = atom->nlocal; double **sp = atom->sp; double **fm = atom->fm; - double tdampx, tdampy, tdampz; - + // loop on all spins on proc. for (int i = 0; i < nlocal; i++) { @@ -542,21 +540,39 @@ void MinSpinOSO_LBFGS::advance_spins() } /* ---------------------------------------------------------------------- - compute and return ||mag. torque||_2^2 / N + compute and return max_i||mag. torque_i||_2 ------------------------------------------------------------------------- */ -double MinSpinOSO_LBFGS::fmnorm2() { - double norm2, norm2_global; +double MinSpinOSO_LBFGS::max_torque() +{ + double fmsq,fmaxsqone,fmaxsqloc,fmaxsqall; int nlocal = atom->nlocal; - int ntotal = 0; - norm2 = 0.0; - for (int i = 0; i < 3 * nlocal; i++) norm2 += g_cur[i] * g_cur[i]; - MPI_Allreduce(&norm2, &norm2_global, 1, MPI_DOUBLE, MPI_SUM, world); - MPI_Allreduce(&nlocal, &ntotal, 1, MPI_INT, MPI_SUM, world); - double ans = norm2_global / (double) ntotal; - MPI_Bcast(&ans, 1, MPI_DOUBLE, 0, world); - return ans; + // finding max fm on this proc. + + fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; + for (int i = 0; i < nlocal; i++) { + fmsq = 0.0; + for (int j = 0; j < 3; j++) + fmsq += g_cur[3 * i + j] * g_cur[3 * i + j]; + fmaxsqone = MAX(fmaxsqone,fmsq); + } + + // finding max fm on this replica + + fmaxsqloc = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); + + // finding max fm over all replicas, if necessary + // this communicator would be invalid for multiprocess replicas + + fmaxsqall = fmaxsqloc; + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + return sqrt(fmaxsqall); } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h index 48d1b47837..d74898aa8c 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -45,7 +45,6 @@ class MinSpinOSO_LBFGS: public Min { int nlocal_max; // max value of nlocal (for size of lists) void advance_spins(); - double fmnorm2(); void calc_gradient(); void calc_search_direction(); double maximum_rotation(double *); @@ -54,6 +53,7 @@ class MinSpinOSO_LBFGS: public Min { int calc_and_make_step(double, double, int); int awc(double, double, double, double); void make_step(double, double *); + double max_torque(); double der_e_cur; // current derivative along search dir. double der_e_pr; // previous derivative along search dir. int use_line_search; // use line search or not. From 3b7bb668aecc3f32d32c1eb4061a112e07536e5b Mon Sep 17 00:00:00 2001 From: alxvov Date: Fri, 19 Jul 2019 16:41:51 +0000 Subject: [PATCH 050/418] conjugate gradients with line search --- src/SPIN/min_spin_oso_cg2.cpp | 665 ++++++++++++++++++++++++++++++++++ src/SPIN/min_spin_oso_cg2.h | 68 ++++ 2 files changed, 733 insertions(+) create mode 100644 src/SPIN/min_spin_oso_cg2.cpp create mode 100644 src/SPIN/min_spin_oso_cg2.h diff --git a/src/SPIN/min_spin_oso_cg2.cpp b/src/SPIN/min_spin_oso_cg2.cpp new file mode 100644 index 0000000000..23873e24f2 --- /dev/null +++ b/src/SPIN/min_spin_oso_cg2.cpp @@ -0,0 +1,665 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------------ + Contributing authors: Aleksei Ivanov (University of Iceland) + Julien Tranchida (SNL) + + Please cite the related publication: + Ivanov, A. V., Uzdin, V. M., & Jónsson, H. (2019). Fast and Robust + Algorithm for the Minimisation of the Energy of Spin Systems. arXiv + preprint arXiv:1904.02669. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "min_spin_oso_cg2.h" +#include "universe.h" +#include "atom.h" +#include "citeme.h" +#include "force.h" +#include "update.h" +#include "output.h" +#include "timer.h" +#include "error.h" +#include "memory.h" +#include "modify.h" +#include "math_special.h" +#include "math_const.h" +#include "universe.h" +#include + +using namespace LAMMPS_NS; +using namespace MathConst; + +static const char cite_minstyle_spin_oso_cg2[] = + "min_style spin/oso_cg2 command:\n\n" + "@article{ivanov2019fast,\n" + "title={Fast and Robust Algorithm for the Minimisation of the Energy of " + "Spin Systems},\n" + "author={Ivanov, A. V and Uzdin, V. M. and J{\'o}nsson, H.},\n" + "journal={arXiv preprint arXiv:1904.02669},\n" + "year={2019}\n" + "}\n\n"; + +// EPS_ENERGY = minimum normalization for energy tolerance + +#define EPS_ENERGY 1.0e-8 + +#define DELAYSTEP 5 + + +/* ---------------------------------------------------------------------- */ + +MinSpinOSO_CG2::MinSpinOSO_CG2(LAMMPS *lmp) : + Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL) +{ + if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_cg2); + nlocal_max = 0; + + // nreplica = number of partitions + // ireplica = which world I am in universe + + nreplica = universe->nworlds; + ireplica = universe->iworld; + use_line_search = 1; + maxepsrot = MY_2PI / (100.0); + +} + +/* ---------------------------------------------------------------------- */ + +MinSpinOSO_CG2::~MinSpinOSO_CG2() +{ + memory->destroy(g_old); + memory->destroy(g_cur); + memory->destroy(p_s); + if (use_line_search) + memory->destroy(sp_copy); +} + +/* ---------------------------------------------------------------------- */ + +void MinSpinOSO_CG2::init() +{ + local_iter = 0; + der_e_cur = 0.0; + der_e_pr = 0.0; + + Min::init(); + + last_negative = update->ntimestep; + + // allocate tables + + nlocal_max = atom->nlocal; + memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg2:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg2:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg2:p_s"); + if (use_line_search) + memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/cg2:sp_copy"); +} + +/* ---------------------------------------------------------------------- */ + +void MinSpinOSO_CG2::setup_style() +{ + double **v = atom->v; + int nlocal = atom->nlocal; + + // check if the atom/spin style is defined + + if (!atom->sp_flag) + error->all(FLERR,"min/spin_oso_cg2 requires atom/spin style"); + + for (int i = 0; i < nlocal; i++) + v[i][0] = v[i][1] = v[i][2] = 0.0; +} + +/* ---------------------------------------------------------------------- */ + +int MinSpinOSO_CG2::modify_param(int narg, char **arg) +{ + + if (strcmp(arg[0],"line_search") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + use_line_search = force->numeric(FLERR,arg[1]); + return 2; + } + if (strcmp(arg[0],"discrete_factor") == 0) { + if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + double discrete_factor; + discrete_factor = force->numeric(FLERR,arg[1]); + maxepsrot = MY_2PI / discrete_factor; + return 2; + } + return 0; +} + +/* ---------------------------------------------------------------------- + set current vector lengths and pointers + called after atoms have migrated +------------------------------------------------------------------------- */ + +void MinSpinOSO_CG2::reset_vectors() +{ + // atomic dof + + // size sp is 4N vector + nvec = 4 * atom->nlocal; + if (nvec) spvec = atom->sp[0]; + + nvec = 3 * atom->nlocal; + if (nvec) fmvec = atom->fm[0]; + + if (nvec) xvec = atom->x[0]; + if (nvec) fvec = atom->f[0]; +} + +/* ---------------------------------------------------------------------- + minimization via damped spin dynamics +------------------------------------------------------------------------- */ + +int MinSpinOSO_CG2::iterate(int maxiter) +{ + int nlocal = atom->nlocal; + bigint ntimestep; + double fmdotfm; + int flag, flagall; + double **sp = atom->sp; + double der_e_cur_tmp = 0.0; + + if (nlocal_max < nlocal) { + nlocal_max = nlocal; + local_iter = 0; + nlocal_max = nlocal; + memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg2:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg2:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg2:p_s"); + if (use_line_search) + memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/cg2:sp_copy"); + } + + for (int iter = 0; iter < maxiter; iter++) { + + if (timer->check_timeout(niter)) + return TIMEOUT; + + ntimestep = ++update->ntimestep; + niter++; + + // optimize timestep accross processes / replicas + // need a force calculation for timestep optimization + + if (use_line_search) { + + // here we need to do line search + if (local_iter == 0) + calc_gradient(); + + calc_search_direction(); + der_e_cur = 0.0; + for (int i = 0; i < 3 * nlocal; i++) + der_e_cur += g_cur[i] * p_s[i]; + MPI_Allreduce(&der_e_cur,&der_e_cur_tmp,1,MPI_DOUBLE,MPI_SUM,world); + der_e_cur = der_e_cur_tmp; + if (update->multireplica == 1) { + MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + for (int i = 0; i < nlocal; i++) + for (int j = 0; j < 3; j++) + sp_copy[i][j] = sp[i][j]; + + eprevious = ecurrent; + der_e_pr = der_e_cur; + calc_and_make_step(0.0, 1.0, 0); + } + else{ + + // here we don't do line search + // but use cutoff rotation angle + // if gneb calc., nreplica > 1 + // then calculate gradients and advance spins + // of intermediate replicas only + + if (nreplica > 1) { + if(ireplica != 0 && ireplica != nreplica-1) + calc_gradient(); + calc_search_direction(); + advance_spins(); + } else{ + calc_gradient(); + calc_search_direction(); + advance_spins(); + } + eprevious = ecurrent; + ecurrent = energy_force(0); + neval++; + } + + //// energy tolerance criterion + //// only check after DELAYSTEP elapsed since velocties reset to 0 + //// sync across replicas if running multi-replica minimization + + if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { + if (update->multireplica == 0) { + if (fabs(ecurrent-eprevious) < + update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) + return ETOL; + } else { + if (fabs(ecurrent-eprevious) < + update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) + flag = 0; + else flag = 1; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); + if (flagall == 0) return ETOL; + } + } + + // magnetic torque tolerance criterion + // sync across replicas if running multi-replica minimization + + if (update->ftol > 0.0) { + fmdotfm = max_torque(); + if (update->multireplica == 0) { + if (fmdotfm < update->ftol*update->ftol) return FTOL; + } else { + if (fmdotfm < update->ftol*update->ftol) flag = 0; + else flag = 1; + MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); + if (flagall == 0) return FTOL; + } + } + + // output for thermo, dump, restart files + + if (output->next == ntimestep) { + timer->stamp(); + output->write(ntimestep); + timer->stamp(Timer::OUTPUT); + } + } + + return MAXITER; +} + +/* ---------------------------------------------------------------------- + calculate gradients +---------------------------------------------------------------------- */ + +void MinSpinOSO_CG2::calc_gradient() +{ + int nlocal = atom->nlocal; + double **sp = atom->sp; + double **fm = atom->fm; + double hbar = force->hplanck/MY_2PI; + + // loop on all spins on proc. + + for (int i = 0; i < nlocal; i++) { + + // calculate gradients + + g_cur[3 * i + 0] = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]) * hbar; + g_cur[3 * i + 1] = -(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]) * hbar; + g_cur[3 * i + 2] = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]) * hbar; + } +} + + +/* ---------------------------------------------------------------------- + search direction: + The Fletcher-Reeves conj. grad. method + See Jorge Nocedal and Stephen J. Wright 'Numerical + Optimization' Second Edition, 2006 (p. 121) +---------------------------------------------------------------------- */ + +void MinSpinOSO_CG2::calc_search_direction() +{ + int nlocal = atom->nlocal; + double g2old = 0.0; + double g2 = 0.0; + double beta = 0.0; + + double g2_global = 0.0; + double g2old_global = 0.0; + double scaling = 1.0; + + if (use_line_search == 0) + scaling = maximum_rotation(g_cur); + + if (local_iter == 0 || local_iter % 5 == 0){ // steepest descent direction + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = -g_cur[i] * scaling; + g_old[i] = g_cur[i]; + } + } else { // conjugate direction + for (int i = 0; i < 3 * nlocal; i++) { + g2old += g_old[i] * g_old[i]; + g2 += g_cur[i] * g_cur[i]; + } + + // now we need to collect/broadcast beta on this replica + // different replica can have different beta for now. + // need to check what is beta for GNEB + + MPI_Allreduce(&g2, &g2_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&g2old, &g2old_global, 1, MPI_DOUBLE, MPI_SUM, world); + + // Sum over all replicas. Good for GNEB. + if (update->multireplica == 1) { + g2 = g2_global; + g2old = g2old_global; + MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + + if (fabs(g2_global) < 1.0e-60) beta = 0.0; + else beta = g2_global / g2old_global; + // calculate conjugate direction + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = (beta * p_s[i] - g_cur[i])*scaling; + g_old[i] = g_cur[i]; + } + } + + local_iter++; +} + +/* ---------------------------------------------------------------------- + rotation of spins along the search direction +---------------------------------------------------------------------- */ + +void MinSpinOSO_CG2::advance_spins() +{ + int nlocal = atom->nlocal; + double **sp = atom->sp; + double **fm = atom->fm; + double tdampx, tdampy, tdampz; + double rot_mat[9]; // exponential of matrix made of search direction + double s_new[3]; + + // loop on all spins on proc. + + for (int i = 0; i < nlocal; i++) { + rodrigues_rotation(p_s + 3 * i, rot_mat); + + // rotate spins + + vm3(rot_mat, sp[i], s_new); + for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; + } +} + +/* ---------------------------------------------------------------------- + compute and return max_i||mag. torque_i||_2 +------------------------------------------------------------------------- */ + +double MinSpinOSO_CG2::max_torque() +{ + double fmsq,fmaxsqone,fmaxsqloc,fmaxsqall; + int nlocal = atom->nlocal; + + // finding max fm on this proc. + + fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; + for (int i = 0; i < nlocal; i++) { + fmsq = 0.0; + for (int j = 0; j < 3; j++) + fmsq += g_cur[3 * i + j] * g_cur[3 * i + j]; + fmaxsqone = MAX(fmaxsqone,fmsq); + } + + // finding max fm on this replica + + fmaxsqloc = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); + + // finding max fm over all replicas, if necessary + // this communicator would be invalid for multiprocess replicas + + fmaxsqall = fmaxsqloc; + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + return sqrt(fmaxsqall); +} + +/* ---------------------------------------------------------------------- + calculate 3x3 matrix exponential using Rodrigues' formula + (R. Murray, Z. Li, and S. Shankar Sastry, + A Mathematical Introduction to + Robotic Manipulation (1994), p. 28 and 30). + + upp_tr - vector x, y, z so that one calculate + U = exp(A) with A= [[0, x, y], + [-x, 0, z], + [-y, -z, 0]] +------------------------------------------------------------------------- */ + +void MinSpinOSO_CG2::rodrigues_rotation(const double *upp_tr, double *out) +{ + double theta,A,B,D,x,y,z; + double s1,s2,s3,a1,a2,a3; + + if (fabs(upp_tr[0]) < 1.0e-40 && + fabs(upp_tr[1]) < 1.0e-40 && + fabs(upp_tr[2]) < 1.0e-40){ + + // if upp_tr is zero, return unity matrix + for(int k = 0; k < 3; k++){ + for(int m = 0; m < 3; m++){ + if (m == k) out[3 * k + m] = 1.0; + else out[3 * k + m] = 0.0; + } + } + return; + } + + theta = sqrt(upp_tr[0] * upp_tr[0] + + upp_tr[1] * upp_tr[1] + + upp_tr[2] * upp_tr[2]); + + A = cos(theta); + B = sin(theta); + D = 1 - A; + x = upp_tr[0]/theta; + y = upp_tr[1]/theta; + z = upp_tr[2]/theta; + + // diagonal elements of U + + out[0] = A + z * z * D; + out[4] = A + y * y * D; + out[8] = A + x * x * D; + + // off diagonal of U + + s1 = -y * z *D; + s2 = x * z * D; + s3 = -x * y * D; + + a1 = x * B; + a2 = y * B; + a3 = z * B; + + out[1] = s1 + a1; + out[3] = s1 - a1; + out[2] = s2 + a2; + out[6] = s2 - a2; + out[5] = s3 + a3; + out[7] = s3 - a3; + +} + +/* ---------------------------------------------------------------------- + out = vector^T x m, + m -- 3x3 matrix , v -- 3-d vector +------------------------------------------------------------------------- */ + +void MinSpinOSO_CG2::vm3(const double *m, const double *v, double *out) +{ + for(int i = 0; i < 3; i++){ + out[i] *= 0.0; + for(int j = 0; j < 3; j++) + out[i] += *(m + 3 * j + i) * v[j]; + } +} + + +void MinSpinOSO_CG2::make_step(double c, double *energy_and_der) +{ + double p_scaled[3]; + int nlocal = atom->nlocal; + double rot_mat[9]; // exponential of matrix made of search direction + double s_new[3]; + double **sp = atom->sp; + double der_e_cur_tmp = 0.0;; + + for (int i = 0; i < nlocal; i++) { + + // scale the search direction + + for (int j = 0; j < 3; j++) p_scaled[j] = c * p_s[3 * i + j]; + + // calculate rotation matrix + + rodrigues_rotation(p_scaled, rot_mat); + + // rotate spins + + vm3(rot_mat, sp[i], s_new); + for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; + } + + ecurrent = energy_force(0); + calc_gradient(); + neval++; + der_e_cur = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + der_e_cur += g_cur[i] * p_s[i]; + } + MPI_Allreduce(&der_e_cur,&der_e_cur_tmp,1,MPI_DOUBLE,MPI_SUM,world); + der_e_cur = der_e_cur_tmp; + if (update->multireplica == 1) { + MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + + energy_and_der[0] = ecurrent; + energy_and_der[1] = der_e_cur; +} + +/* ---------------------------------------------------------------------- + Calculate step length which satisfies approximate Wolfe conditions + using the cubic interpolation +------------------------------------------------------------------------- */ + +int MinSpinOSO_CG2::calc_and_make_step(double a, double b, int index) +{ + double e_and_d[2] = {0.0,0.0}; + double alpha,c1,c2,c3; + double **sp = atom->sp; + int nlocal = atom->nlocal; + + make_step(b,e_and_d); + ecurrent = e_and_d[0]; + der_e_cur = e_and_d[1]; + index++; + + if (awc(der_e_pr,eprevious,e_and_d[1],e_and_d[0]) || index == 10){ + MPI_Bcast(&b,1,MPI_DOUBLE,0,world); + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = b * p_s[i]; + } + return 1; + } + else{ + double r,f0,f1,df0,df1; + r = b - a; + f0 = eprevious; + f1 = ecurrent; + df0 = der_e_pr; + df1 = der_e_cur; + + c1 = -2.0*(f1-f0)/(r*r*r)+(df1+df0)/(r*r); + c2 = 3.0*(f1-f0)/(r*r)-(df1+2.0*df0)/(r); + c3 = df0; + + // f(x) = c1 x^3 + c2 x^2 + c3 x^1 + c4 + // has minimum at alpha below. We do not check boundaries. + + alpha = (-c2 + sqrt(c2*c2 - 3.0*c1*c3))/(3.0*c1); + MPI_Bcast(&alpha,1,MPI_DOUBLE,0,world); + + if (alpha < 0.0) alpha = r/2.0; + + std::cout << alpha << "\n"; + + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++) sp[i][j] = sp_copy[i][j]; + } + calc_and_make_step(0.0, alpha, index); + } + + return 0; +} + +/* ---------------------------------------------------------------------- + Approximate Wolfe conditions: + William W. Hager and Hongchao Zhang + SIAM J. optim., 16(1), 170-192. (23 pages) +------------------------------------------------------------------------- */ + +int MinSpinOSO_CG2::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){ + + double eps = 1.0e-6; + double delta = 0.1; + double sigma = 0.9; + + if ((phi_j<=phi_0+eps*fabs(phi_0)) && ((2.0*delta-1.0) * der_phi_0>=der_phi_j>=sigma*der_phi_0)) + return 1; + else + return 0; +} + +double MinSpinOSO_CG2::maximum_rotation(double *p) +{ + double norm2,norm2_global,scaling,alpha; + int nlocal = atom->nlocal; + int ntotal = 0; + + norm2 = 0.0; + for (int i = 0; i < 3 * nlocal; i++) norm2 += p[i] * p[i]; + + MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,world); + if (update->multireplica == 1) { + norm2 = norm2_global; + MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,world); + if (update->multireplica == 1) { + nlocal = ntotal; + MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,universe->uworld); + } + + scaling = (maxepsrot * sqrt((double) ntotal / norm2_global)); + + if (scaling < 1.0) alpha = scaling; + else alpha = 1.0; + + return alpha; +} \ No newline at end of file diff --git a/src/SPIN/min_spin_oso_cg2.h b/src/SPIN/min_spin_oso_cg2.h new file mode 100644 index 0000000000..c96e82ca8e --- /dev/null +++ b/src/SPIN/min_spin_oso_cg2.h @@ -0,0 +1,68 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + http://lammps.sandia.gov, Sandia National Laboratories + Steve Plimpton, sjplimp@sandia.gov + + Copyright (2003) Sandia Corporation. Under the terms of Contract + DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains + certain rights in this software. This software is distributed under + the GNU General Public License. + + See the README file in the top-level LAMMPS directory. +------------------------------------------------------------------------- */ + +#ifdef MINIMIZE_CLASS + +MinimizeStyle(spin/oso_cg2, MinSpinOSO_CG2) + +#else + +#ifndef LMP_MIN_SPIN_OSO_CG2_H +#define LMP_MIN_SPIN_OSO_CG2_H + +#include "min.h" + +namespace LAMMPS_NS { + +class MinSpinOSO_CG2: public Min { + public: + MinSpinOSO_CG2(class LAMMPS *); + virtual ~MinSpinOSO_CG2(); + void init(); + void setup_style(); + int modify_param(int, char **); + void reset_vectors(); + int iterate(int); + private: + int ireplica,nreplica; // for neb + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + double *g_cur; // current gradient vector + double *g_old; // gradient vector at previous step + double *p_s; // search direction vector + double **sp_copy; // copy of the spins + int local_iter; // for neb + int nlocal_max; // max value of nlocal (for size of lists) + + void advance_spins(); + void calc_gradient(); + void calc_search_direction(); + double maximum_rotation(double *); + void vm3(const double *, const double *, double *); + void rodrigues_rotation(const double *, double *); + int calc_and_make_step(double, double, int); + int awc(double, double, double, double); + void make_step(double, double *); + double max_torque(); + double der_e_cur; // current derivative along search dir. + double der_e_pr; // previous derivative along search dir. + int use_line_search; // use line search or not. + double maxepsrot; + + bigint last_negative; +}; + +} + +#endif +#endif From a96e6f220a9dcf26221121a969ee690f06ae2212 Mon Sep 17 00:00:00 2001 From: casievers Date: Fri, 19 Jul 2019 13:36:57 -0700 Subject: [PATCH 051/418] updated fix_langevin and made example --- examples/gjf/argon.lmp | 886 ++++++++++++++++++++++++++++++++++ examples/gjf/ff-argon.lmp | 20 + examples/gjf/in.argon | 162 +++++++ examples/gjf/out.argon | 249 ++++++++++ examples/gjf/trajectory.0.dcd | Bin 0 -> 439092 bytes src/fix_langevin.cpp | 272 +++++++++-- src/fix_langevin.h | 7 +- 7 files changed, 1550 insertions(+), 46 deletions(-) create mode 100644 examples/gjf/argon.lmp create mode 100644 examples/gjf/ff-argon.lmp create mode 100644 examples/gjf/in.argon create mode 100644 examples/gjf/out.argon create mode 100644 examples/gjf/trajectory.0.dcd diff --git a/examples/gjf/argon.lmp b/examples/gjf/argon.lmp new file mode 100644 index 0000000000..00214b4c54 --- /dev/null +++ b/examples/gjf/argon.lmp @@ -0,0 +1,886 @@ +LAMMPS description + + 864 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 32.146000 xlo xhi + 0.0000000 32.146000 ylo yhi + 0.0000000 32.146000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 2.6790000 2.6790000 + 2 2 1 0.0000000 0.0000000 2.6790000 8.0360000 + 3 3 1 0.0000000 0.0000000 2.6790000 13.3940000 + 4 4 1 0.0000000 0.0000000 2.6790000 18.7520000 + 5 5 1 0.0000000 0.0000000 2.6790000 24.1090000 + 6 6 1 0.0000000 0.0000000 2.6790000 29.4670000 + 7 7 1 0.0000000 0.0000000 8.0360000 2.6790000 + 8 8 1 0.0000000 0.0000000 8.0360000 8.0360000 + 9 9 1 0.0000000 0.0000000 8.0360000 13.3940000 + 10 10 1 0.0000000 0.0000000 8.0360000 18.7520000 + 11 11 1 0.0000000 0.0000000 8.0360000 24.1090000 + 12 12 1 0.0000000 0.0000000 8.0360000 29.4670000 + 13 13 1 0.0000000 0.0000000 13.3940000 2.6790000 + 14 14 1 0.0000000 0.0000000 13.3940000 8.0360000 + 15 15 1 0.0000000 0.0000000 13.3940000 13.3940000 + 16 16 1 0.0000000 0.0000000 13.3940000 18.7520000 + 17 17 1 0.0000000 0.0000000 13.3940000 24.1090000 + 18 18 1 0.0000000 0.0000000 13.3940000 29.4670000 + 19 19 1 0.0000000 0.0000000 18.7520000 2.6790000 + 20 20 1 0.0000000 0.0000000 18.7520000 8.0360000 + 21 21 1 0.0000000 0.0000000 18.7520000 13.3940000 + 22 22 1 0.0000000 0.0000000 18.7520000 18.7520000 + 23 23 1 0.0000000 0.0000000 18.7520000 24.1090000 + 24 24 1 0.0000000 0.0000000 18.7520000 29.4670000 + 25 25 1 0.0000000 0.0000000 24.1090000 2.6790000 + 26 26 1 0.0000000 0.0000000 24.1090000 8.0360000 + 27 27 1 0.0000000 0.0000000 24.1090000 13.3940000 + 28 28 1 0.0000000 0.0000000 24.1090000 18.7520000 + 29 29 1 0.0000000 0.0000000 24.1090000 24.1090000 + 30 30 1 0.0000000 0.0000000 24.1090000 29.4670000 + 31 31 1 0.0000000 0.0000000 29.4670000 2.6790000 + 32 32 1 0.0000000 0.0000000 29.4670000 8.0360000 + 33 33 1 0.0000000 0.0000000 29.4670000 13.3940000 + 34 34 1 0.0000000 0.0000000 29.4670000 18.7520000 + 35 35 1 0.0000000 0.0000000 29.4670000 24.1090000 + 36 36 1 0.0000000 0.0000000 29.4670000 29.4670000 + 37 37 1 0.0000000 5.3580000 2.6790000 2.6790000 + 38 38 1 0.0000000 5.3580000 2.6790000 8.0360000 + 39 39 1 0.0000000 5.3580000 2.6790000 13.3940000 + 40 40 1 0.0000000 5.3580000 2.6790000 18.7520000 + 41 41 1 0.0000000 5.3580000 2.6790000 24.1090000 + 42 42 1 0.0000000 5.3580000 2.6790000 29.4670000 + 43 43 1 0.0000000 5.3580000 8.0360000 2.6790000 + 44 44 1 0.0000000 5.3580000 8.0360000 8.0360000 + 45 45 1 0.0000000 5.3580000 8.0360000 13.3940000 + 46 46 1 0.0000000 5.3580000 8.0360000 18.7520000 + 47 47 1 0.0000000 5.3580000 8.0360000 24.1090000 + 48 48 1 0.0000000 5.3580000 8.0360000 29.4670000 + 49 49 1 0.0000000 5.3580000 13.3940000 2.6790000 + 50 50 1 0.0000000 5.3580000 13.3940000 8.0360000 + 51 51 1 0.0000000 5.3580000 13.3940000 13.3940000 + 52 52 1 0.0000000 5.3580000 13.3940000 18.7520000 + 53 53 1 0.0000000 5.3580000 13.3940000 24.1090000 + 54 54 1 0.0000000 5.3580000 13.3940000 29.4670000 + 55 55 1 0.0000000 5.3580000 18.7520000 2.6790000 + 56 56 1 0.0000000 5.3580000 18.7520000 8.0360000 + 57 57 1 0.0000000 5.3580000 18.7520000 13.3940000 + 58 58 1 0.0000000 5.3580000 18.7520000 18.7520000 + 59 59 1 0.0000000 5.3580000 18.7520000 24.1090000 + 60 60 1 0.0000000 5.3580000 18.7520000 29.4670000 + 61 61 1 0.0000000 5.3580000 24.1090000 2.6790000 + 62 62 1 0.0000000 5.3580000 24.1090000 8.0360000 + 63 63 1 0.0000000 5.3580000 24.1090000 13.3940000 + 64 64 1 0.0000000 5.3580000 24.1090000 18.7520000 + 65 65 1 0.0000000 5.3580000 24.1090000 24.1090000 + 66 66 1 0.0000000 5.3580000 24.1090000 29.4670000 + 67 67 1 0.0000000 5.3580000 29.4670000 2.6790000 + 68 68 1 0.0000000 5.3580000 29.4670000 8.0360000 + 69 69 1 0.0000000 5.3580000 29.4670000 13.3940000 + 70 70 1 0.0000000 5.3580000 29.4670000 18.7520000 + 71 71 1 0.0000000 5.3580000 29.4670000 24.1090000 + 72 72 1 0.0000000 5.3580000 29.4670000 29.4670000 + 73 73 1 0.0000000 10.7150000 2.6790000 2.6790000 + 74 74 1 0.0000000 10.7150000 2.6790000 8.0360000 + 75 75 1 0.0000000 10.7150000 2.6790000 13.3940000 + 76 76 1 0.0000000 10.7150000 2.6790000 18.7520000 + 77 77 1 0.0000000 10.7150000 2.6790000 24.1090000 + 78 78 1 0.0000000 10.7150000 2.6790000 29.4670000 + 79 79 1 0.0000000 10.7150000 8.0360000 2.6790000 + 80 80 1 0.0000000 10.7150000 8.0360000 8.0360000 + 81 81 1 0.0000000 10.7150000 8.0360000 13.3940000 + 82 82 1 0.0000000 10.7150000 8.0360000 18.7520000 + 83 83 1 0.0000000 10.7150000 8.0360000 24.1090000 + 84 84 1 0.0000000 10.7150000 8.0360000 29.4670000 + 85 85 1 0.0000000 10.7150000 13.3940000 2.6790000 + 86 86 1 0.0000000 10.7150000 13.3940000 8.0360000 + 87 87 1 0.0000000 10.7150000 13.3940000 13.3940000 + 88 88 1 0.0000000 10.7150000 13.3940000 18.7520000 + 89 89 1 0.0000000 10.7150000 13.3940000 24.1090000 + 90 90 1 0.0000000 10.7150000 13.3940000 29.4670000 + 91 91 1 0.0000000 10.7150000 18.7520000 2.6790000 + 92 92 1 0.0000000 10.7150000 18.7520000 8.0360000 + 93 93 1 0.0000000 10.7150000 18.7520000 13.3940000 + 94 94 1 0.0000000 10.7150000 18.7520000 18.7520000 + 95 95 1 0.0000000 10.7150000 18.7520000 24.1090000 + 96 96 1 0.0000000 10.7150000 18.7520000 29.4670000 + 97 97 1 0.0000000 10.7150000 24.1090000 2.6790000 + 98 98 1 0.0000000 10.7150000 24.1090000 8.0360000 + 99 99 1 0.0000000 10.7150000 24.1090000 13.3940000 + 100 100 1 0.0000000 10.7150000 24.1090000 18.7520000 + 101 101 1 0.0000000 10.7150000 24.1090000 24.1090000 + 102 102 1 0.0000000 10.7150000 24.1090000 29.4670000 + 103 103 1 0.0000000 10.7150000 29.4670000 2.6790000 + 104 104 1 0.0000000 10.7150000 29.4670000 8.0360000 + 105 105 1 0.0000000 10.7150000 29.4670000 13.3940000 + 106 106 1 0.0000000 10.7150000 29.4670000 18.7520000 + 107 107 1 0.0000000 10.7150000 29.4670000 24.1090000 + 108 108 1 0.0000000 10.7150000 29.4670000 29.4670000 + 109 109 1 0.0000000 16.0730000 2.6790000 2.6790000 + 110 110 1 0.0000000 16.0730000 2.6790000 8.0360000 + 111 111 1 0.0000000 16.0730000 2.6790000 13.3940000 + 112 112 1 0.0000000 16.0730000 2.6790000 18.7520000 + 113 113 1 0.0000000 16.0730000 2.6790000 24.1090000 + 114 114 1 0.0000000 16.0730000 2.6790000 29.4670000 + 115 115 1 0.0000000 16.0730000 8.0360000 2.6790000 + 116 116 1 0.0000000 16.0730000 8.0360000 8.0360000 + 117 117 1 0.0000000 16.0730000 8.0360000 13.3940000 + 118 118 1 0.0000000 16.0730000 8.0360000 18.7520000 + 119 119 1 0.0000000 16.0730000 8.0360000 24.1090000 + 120 120 1 0.0000000 16.0730000 8.0360000 29.4670000 + 121 121 1 0.0000000 16.0730000 13.3940000 2.6790000 + 122 122 1 0.0000000 16.0730000 13.3940000 8.0360000 + 123 123 1 0.0000000 16.0730000 13.3940000 13.3940000 + 124 124 1 0.0000000 16.0730000 13.3940000 18.7520000 + 125 125 1 0.0000000 16.0730000 13.3940000 24.1090000 + 126 126 1 0.0000000 16.0730000 13.3940000 29.4670000 + 127 127 1 0.0000000 16.0730000 18.7520000 2.6790000 + 128 128 1 0.0000000 16.0730000 18.7520000 8.0360000 + 129 129 1 0.0000000 16.0730000 18.7520000 13.3940000 + 130 130 1 0.0000000 16.0730000 18.7520000 18.7520000 + 131 131 1 0.0000000 16.0730000 18.7520000 24.1090000 + 132 132 1 0.0000000 16.0730000 18.7520000 29.4670000 + 133 133 1 0.0000000 16.0730000 24.1090000 2.6790000 + 134 134 1 0.0000000 16.0730000 24.1090000 8.0360000 + 135 135 1 0.0000000 16.0730000 24.1090000 13.3940000 + 136 136 1 0.0000000 16.0730000 24.1090000 18.7520000 + 137 137 1 0.0000000 16.0730000 24.1090000 24.1090000 + 138 138 1 0.0000000 16.0730000 24.1090000 29.4670000 + 139 139 1 0.0000000 16.0730000 29.4670000 2.6790000 + 140 140 1 0.0000000 16.0730000 29.4670000 8.0360000 + 141 141 1 0.0000000 16.0730000 29.4670000 13.3940000 + 142 142 1 0.0000000 16.0730000 29.4670000 18.7520000 + 143 143 1 0.0000000 16.0730000 29.4670000 24.1090000 + 144 144 1 0.0000000 16.0730000 29.4670000 29.4670000 + 145 145 1 0.0000000 21.4310000 2.6790000 2.6790000 + 146 146 1 0.0000000 21.4310000 2.6790000 8.0360000 + 147 147 1 0.0000000 21.4310000 2.6790000 13.3940000 + 148 148 1 0.0000000 21.4310000 2.6790000 18.7520000 + 149 149 1 0.0000000 21.4310000 2.6790000 24.1090000 + 150 150 1 0.0000000 21.4310000 2.6790000 29.4670000 + 151 151 1 0.0000000 21.4310000 8.0360000 2.6790000 + 152 152 1 0.0000000 21.4310000 8.0360000 8.0360000 + 153 153 1 0.0000000 21.4310000 8.0360000 13.3940000 + 154 154 1 0.0000000 21.4310000 8.0360000 18.7520000 + 155 155 1 0.0000000 21.4310000 8.0360000 24.1090000 + 156 156 1 0.0000000 21.4310000 8.0360000 29.4670000 + 157 157 1 0.0000000 21.4310000 13.3940000 2.6790000 + 158 158 1 0.0000000 21.4310000 13.3940000 8.0360000 + 159 159 1 0.0000000 21.4310000 13.3940000 13.3940000 + 160 160 1 0.0000000 21.4310000 13.3940000 18.7520000 + 161 161 1 0.0000000 21.4310000 13.3940000 24.1090000 + 162 162 1 0.0000000 21.4310000 13.3940000 29.4670000 + 163 163 1 0.0000000 21.4310000 18.7520000 2.6790000 + 164 164 1 0.0000000 21.4310000 18.7520000 8.0360000 + 165 165 1 0.0000000 21.4310000 18.7520000 13.3940000 + 166 166 1 0.0000000 21.4310000 18.7520000 18.7520000 + 167 167 1 0.0000000 21.4310000 18.7520000 24.1090000 + 168 168 1 0.0000000 21.4310000 18.7520000 29.4670000 + 169 169 1 0.0000000 21.4310000 24.1090000 2.6790000 + 170 170 1 0.0000000 21.4310000 24.1090000 8.0360000 + 171 171 1 0.0000000 21.4310000 24.1090000 13.3940000 + 172 172 1 0.0000000 21.4310000 24.1090000 18.7520000 + 173 173 1 0.0000000 21.4310000 24.1090000 24.1090000 + 174 174 1 0.0000000 21.4310000 24.1090000 29.4670000 + 175 175 1 0.0000000 21.4310000 29.4670000 2.6790000 + 176 176 1 0.0000000 21.4310000 29.4670000 8.0360000 + 177 177 1 0.0000000 21.4310000 29.4670000 13.3940000 + 178 178 1 0.0000000 21.4310000 29.4670000 18.7520000 + 179 179 1 0.0000000 21.4310000 29.4670000 24.1090000 + 180 180 1 0.0000000 21.4310000 29.4670000 29.4670000 + 181 181 1 0.0000000 26.7880000 2.6790000 2.6790000 + 182 182 1 0.0000000 26.7880000 2.6790000 8.0360000 + 183 183 1 0.0000000 26.7880000 2.6790000 13.3940000 + 184 184 1 0.0000000 26.7880000 2.6790000 18.7520000 + 185 185 1 0.0000000 26.7880000 2.6790000 24.1090000 + 186 186 1 0.0000000 26.7880000 2.6790000 29.4670000 + 187 187 1 0.0000000 26.7880000 8.0360000 2.6790000 + 188 188 1 0.0000000 26.7880000 8.0360000 8.0360000 + 189 189 1 0.0000000 26.7880000 8.0360000 13.3940000 + 190 190 1 0.0000000 26.7880000 8.0360000 18.7520000 + 191 191 1 0.0000000 26.7880000 8.0360000 24.1090000 + 192 192 1 0.0000000 26.7880000 8.0360000 29.4670000 + 193 193 1 0.0000000 26.7880000 13.3940000 2.6790000 + 194 194 1 0.0000000 26.7880000 13.3940000 8.0360000 + 195 195 1 0.0000000 26.7880000 13.3940000 13.3940000 + 196 196 1 0.0000000 26.7880000 13.3940000 18.7520000 + 197 197 1 0.0000000 26.7880000 13.3940000 24.1090000 + 198 198 1 0.0000000 26.7880000 13.3940000 29.4670000 + 199 199 1 0.0000000 26.7880000 18.7520000 2.6790000 + 200 200 1 0.0000000 26.7880000 18.7520000 8.0360000 + 201 201 1 0.0000000 26.7880000 18.7520000 13.3940000 + 202 202 1 0.0000000 26.7880000 18.7520000 18.7520000 + 203 203 1 0.0000000 26.7880000 18.7520000 24.1090000 + 204 204 1 0.0000000 26.7880000 18.7520000 29.4670000 + 205 205 1 0.0000000 26.7880000 24.1090000 2.6790000 + 206 206 1 0.0000000 26.7880000 24.1090000 8.0360000 + 207 207 1 0.0000000 26.7880000 24.1090000 13.3940000 + 208 208 1 0.0000000 26.7880000 24.1090000 18.7520000 + 209 209 1 0.0000000 26.7880000 24.1090000 24.1090000 + 210 210 1 0.0000000 26.7880000 24.1090000 29.4670000 + 211 211 1 0.0000000 26.7880000 29.4670000 2.6790000 + 212 212 1 0.0000000 26.7880000 29.4670000 8.0360000 + 213 213 1 0.0000000 26.7880000 29.4670000 13.3940000 + 214 214 1 0.0000000 26.7880000 29.4670000 18.7520000 + 215 215 1 0.0000000 26.7880000 29.4670000 24.1090000 + 216 216 1 0.0000000 26.7880000 29.4670000 29.4670000 + 217 217 1 0.0000000 2.6790000 5.3580000 2.6790000 + 218 218 1 0.0000000 2.6790000 5.3580000 8.0360000 + 219 219 1 0.0000000 2.6790000 5.3580000 13.3940000 + 220 220 1 0.0000000 2.6790000 5.3580000 18.7520000 + 221 221 1 0.0000000 2.6790000 5.3580000 24.1090000 + 222 222 1 0.0000000 2.6790000 5.3580000 29.4670000 + 223 223 1 0.0000000 2.6790000 10.7150000 2.6790000 + 224 224 1 0.0000000 2.6790000 10.7150000 8.0360000 + 225 225 1 0.0000000 2.6790000 10.7150000 13.3940000 + 226 226 1 0.0000000 2.6790000 10.7150000 18.7520000 + 227 227 1 0.0000000 2.6790000 10.7150000 24.1090000 + 228 228 1 0.0000000 2.6790000 10.7150000 29.4670000 + 229 229 1 0.0000000 2.6790000 16.0730000 2.6790000 + 230 230 1 0.0000000 2.6790000 16.0730000 8.0360000 + 231 231 1 0.0000000 2.6790000 16.0730000 13.3940000 + 232 232 1 0.0000000 2.6790000 16.0730000 18.7520000 + 233 233 1 0.0000000 2.6790000 16.0730000 24.1090000 + 234 234 1 0.0000000 2.6790000 16.0730000 29.4670000 + 235 235 1 0.0000000 2.6790000 21.4310000 2.6790000 + 236 236 1 0.0000000 2.6790000 21.4310000 8.0360000 + 237 237 1 0.0000000 2.6790000 21.4310000 13.3940000 + 238 238 1 0.0000000 2.6790000 21.4310000 18.7520000 + 239 239 1 0.0000000 2.6790000 21.4310000 24.1090000 + 240 240 1 0.0000000 2.6790000 21.4310000 29.4670000 + 241 241 1 0.0000000 2.6790000 26.7880000 2.6790000 + 242 242 1 0.0000000 2.6790000 26.7880000 8.0360000 + 243 243 1 0.0000000 2.6790000 26.7880000 13.3940000 + 244 244 1 0.0000000 2.6790000 26.7880000 18.7520000 + 245 245 1 0.0000000 2.6790000 26.7880000 24.1090000 + 246 246 1 0.0000000 2.6790000 26.7880000 29.4670000 + 247 247 1 0.0000000 2.6790000 32.1460000 2.6790000 + 248 248 1 0.0000000 2.6790000 32.1460000 8.0360000 + 249 249 1 0.0000000 2.6790000 32.1460000 13.3940000 + 250 250 1 0.0000000 2.6790000 32.1460000 18.7520000 + 251 251 1 0.0000000 2.6790000 32.1460000 24.1090000 + 252 252 1 0.0000000 2.6790000 32.1460000 29.4670000 + 253 253 1 0.0000000 8.0360000 5.3580000 2.6790000 + 254 254 1 0.0000000 8.0360000 5.3580000 8.0360000 + 255 255 1 0.0000000 8.0360000 5.3580000 13.3940000 + 256 256 1 0.0000000 8.0360000 5.3580000 18.7520000 + 257 257 1 0.0000000 8.0360000 5.3580000 24.1090000 + 258 258 1 0.0000000 8.0360000 5.3580000 29.4670000 + 259 259 1 0.0000000 8.0360000 10.7150000 2.6790000 + 260 260 1 0.0000000 8.0360000 10.7150000 8.0360000 + 261 261 1 0.0000000 8.0360000 10.7150000 13.3940000 + 262 262 1 0.0000000 8.0360000 10.7150000 18.7520000 + 263 263 1 0.0000000 8.0360000 10.7150000 24.1090000 + 264 264 1 0.0000000 8.0360000 10.7150000 29.4670000 + 265 265 1 0.0000000 8.0360000 16.0730000 2.6790000 + 266 266 1 0.0000000 8.0360000 16.0730000 8.0360000 + 267 267 1 0.0000000 8.0360000 16.0730000 13.3940000 + 268 268 1 0.0000000 8.0360000 16.0730000 18.7520000 + 269 269 1 0.0000000 8.0360000 16.0730000 24.1090000 + 270 270 1 0.0000000 8.0360000 16.0730000 29.4670000 + 271 271 1 0.0000000 8.0360000 21.4310000 2.6790000 + 272 272 1 0.0000000 8.0360000 21.4310000 8.0360000 + 273 273 1 0.0000000 8.0360000 21.4310000 13.3940000 + 274 274 1 0.0000000 8.0360000 21.4310000 18.7520000 + 275 275 1 0.0000000 8.0360000 21.4310000 24.1090000 + 276 276 1 0.0000000 8.0360000 21.4310000 29.4670000 + 277 277 1 0.0000000 8.0360000 26.7880000 2.6790000 + 278 278 1 0.0000000 8.0360000 26.7880000 8.0360000 + 279 279 1 0.0000000 8.0360000 26.7880000 13.3940000 + 280 280 1 0.0000000 8.0360000 26.7880000 18.7520000 + 281 281 1 0.0000000 8.0360000 26.7880000 24.1090000 + 282 282 1 0.0000000 8.0360000 26.7880000 29.4670000 + 283 283 1 0.0000000 8.0360000 32.1460000 2.6790000 + 284 284 1 0.0000000 8.0360000 32.1460000 8.0360000 + 285 285 1 0.0000000 8.0360000 32.1460000 13.3940000 + 286 286 1 0.0000000 8.0360000 32.1460000 18.7520000 + 287 287 1 0.0000000 8.0360000 32.1460000 24.1090000 + 288 288 1 0.0000000 8.0360000 32.1460000 29.4670000 + 289 289 1 0.0000000 13.3940000 5.3580000 2.6790000 + 290 290 1 0.0000000 13.3940000 5.3580000 8.0360000 + 291 291 1 0.0000000 13.3940000 5.3580000 13.3940000 + 292 292 1 0.0000000 13.3940000 5.3580000 18.7520000 + 293 293 1 0.0000000 13.3940000 5.3580000 24.1090000 + 294 294 1 0.0000000 13.3940000 5.3580000 29.4670000 + 295 295 1 0.0000000 13.3940000 10.7150000 2.6790000 + 296 296 1 0.0000000 13.3940000 10.7150000 8.0360000 + 297 297 1 0.0000000 13.3940000 10.7150000 13.3940000 + 298 298 1 0.0000000 13.3940000 10.7150000 18.7520000 + 299 299 1 0.0000000 13.3940000 10.7150000 24.1090000 + 300 300 1 0.0000000 13.3940000 10.7150000 29.4670000 + 301 301 1 0.0000000 13.3940000 16.0730000 2.6790000 + 302 302 1 0.0000000 13.3940000 16.0730000 8.0360000 + 303 303 1 0.0000000 13.3940000 16.0730000 13.3940000 + 304 304 1 0.0000000 13.3940000 16.0730000 18.7520000 + 305 305 1 0.0000000 13.3940000 16.0730000 24.1090000 + 306 306 1 0.0000000 13.3940000 16.0730000 29.4670000 + 307 307 1 0.0000000 13.3940000 21.4310000 2.6790000 + 308 308 1 0.0000000 13.3940000 21.4310000 8.0360000 + 309 309 1 0.0000000 13.3940000 21.4310000 13.3940000 + 310 310 1 0.0000000 13.3940000 21.4310000 18.7520000 + 311 311 1 0.0000000 13.3940000 21.4310000 24.1090000 + 312 312 1 0.0000000 13.3940000 21.4310000 29.4670000 + 313 313 1 0.0000000 13.3940000 26.7880000 2.6790000 + 314 314 1 0.0000000 13.3940000 26.7880000 8.0360000 + 315 315 1 0.0000000 13.3940000 26.7880000 13.3940000 + 316 316 1 0.0000000 13.3940000 26.7880000 18.7520000 + 317 317 1 0.0000000 13.3940000 26.7880000 24.1090000 + 318 318 1 0.0000000 13.3940000 26.7880000 29.4670000 + 319 319 1 0.0000000 13.3940000 32.1460000 2.6790000 + 320 320 1 0.0000000 13.3940000 32.1460000 8.0360000 + 321 321 1 0.0000000 13.3940000 32.1460000 13.3940000 + 322 322 1 0.0000000 13.3940000 32.1460000 18.7520000 + 323 323 1 0.0000000 13.3940000 32.1460000 24.1090000 + 324 324 1 0.0000000 13.3940000 32.1460000 29.4670000 + 325 325 1 0.0000000 18.7520000 5.3580000 2.6790000 + 326 326 1 0.0000000 18.7520000 5.3580000 8.0360000 + 327 327 1 0.0000000 18.7520000 5.3580000 13.3940000 + 328 328 1 0.0000000 18.7520000 5.3580000 18.7520000 + 329 329 1 0.0000000 18.7520000 5.3580000 24.1090000 + 330 330 1 0.0000000 18.7520000 5.3580000 29.4670000 + 331 331 1 0.0000000 18.7520000 10.7150000 2.6790000 + 332 332 1 0.0000000 18.7520000 10.7150000 8.0360000 + 333 333 1 0.0000000 18.7520000 10.7150000 13.3940000 + 334 334 1 0.0000000 18.7520000 10.7150000 18.7520000 + 335 335 1 0.0000000 18.7520000 10.7150000 24.1090000 + 336 336 1 0.0000000 18.7520000 10.7150000 29.4670000 + 337 337 1 0.0000000 18.7520000 16.0730000 2.6790000 + 338 338 1 0.0000000 18.7520000 16.0730000 8.0360000 + 339 339 1 0.0000000 18.7520000 16.0730000 13.3940000 + 340 340 1 0.0000000 18.7520000 16.0730000 18.7520000 + 341 341 1 0.0000000 18.7520000 16.0730000 24.1090000 + 342 342 1 0.0000000 18.7520000 16.0730000 29.4670000 + 343 343 1 0.0000000 18.7520000 21.4310000 2.6790000 + 344 344 1 0.0000000 18.7520000 21.4310000 8.0360000 + 345 345 1 0.0000000 18.7520000 21.4310000 13.3940000 + 346 346 1 0.0000000 18.7520000 21.4310000 18.7520000 + 347 347 1 0.0000000 18.7520000 21.4310000 24.1090000 + 348 348 1 0.0000000 18.7520000 21.4310000 29.4670000 + 349 349 1 0.0000000 18.7520000 26.7880000 2.6790000 + 350 350 1 0.0000000 18.7520000 26.7880000 8.0360000 + 351 351 1 0.0000000 18.7520000 26.7880000 13.3940000 + 352 352 1 0.0000000 18.7520000 26.7880000 18.7520000 + 353 353 1 0.0000000 18.7520000 26.7880000 24.1090000 + 354 354 1 0.0000000 18.7520000 26.7880000 29.4670000 + 355 355 1 0.0000000 18.7520000 32.1460000 2.6790000 + 356 356 1 0.0000000 18.7520000 32.1460000 8.0360000 + 357 357 1 0.0000000 18.7520000 32.1460000 13.3940000 + 358 358 1 0.0000000 18.7520000 32.1460000 18.7520000 + 359 359 1 0.0000000 18.7520000 32.1460000 24.1090000 + 360 360 1 0.0000000 18.7520000 32.1460000 29.4670000 + 361 361 1 0.0000000 24.1090000 5.3580000 2.6790000 + 362 362 1 0.0000000 24.1090000 5.3580000 8.0360000 + 363 363 1 0.0000000 24.1090000 5.3580000 13.3940000 + 364 364 1 0.0000000 24.1090000 5.3580000 18.7520000 + 365 365 1 0.0000000 24.1090000 5.3580000 24.1090000 + 366 366 1 0.0000000 24.1090000 5.3580000 29.4670000 + 367 367 1 0.0000000 24.1090000 10.7150000 2.6790000 + 368 368 1 0.0000000 24.1090000 10.7150000 8.0360000 + 369 369 1 0.0000000 24.1090000 10.7150000 13.3940000 + 370 370 1 0.0000000 24.1090000 10.7150000 18.7520000 + 371 371 1 0.0000000 24.1090000 10.7150000 24.1090000 + 372 372 1 0.0000000 24.1090000 10.7150000 29.4670000 + 373 373 1 0.0000000 24.1090000 16.0730000 2.6790000 + 374 374 1 0.0000000 24.1090000 16.0730000 8.0360000 + 375 375 1 0.0000000 24.1090000 16.0730000 13.3940000 + 376 376 1 0.0000000 24.1090000 16.0730000 18.7520000 + 377 377 1 0.0000000 24.1090000 16.0730000 24.1090000 + 378 378 1 0.0000000 24.1090000 16.0730000 29.4670000 + 379 379 1 0.0000000 24.1090000 21.4310000 2.6790000 + 380 380 1 0.0000000 24.1090000 21.4310000 8.0360000 + 381 381 1 0.0000000 24.1090000 21.4310000 13.3940000 + 382 382 1 0.0000000 24.1090000 21.4310000 18.7520000 + 383 383 1 0.0000000 24.1090000 21.4310000 24.1090000 + 384 384 1 0.0000000 24.1090000 21.4310000 29.4670000 + 385 385 1 0.0000000 24.1090000 26.7880000 2.6790000 + 386 386 1 0.0000000 24.1090000 26.7880000 8.0360000 + 387 387 1 0.0000000 24.1090000 26.7880000 13.3940000 + 388 388 1 0.0000000 24.1090000 26.7880000 18.7520000 + 389 389 1 0.0000000 24.1090000 26.7880000 24.1090000 + 390 390 1 0.0000000 24.1090000 26.7880000 29.4670000 + 391 391 1 0.0000000 24.1090000 32.1460000 2.6790000 + 392 392 1 0.0000000 24.1090000 32.1460000 8.0360000 + 393 393 1 0.0000000 24.1090000 32.1460000 13.3940000 + 394 394 1 0.0000000 24.1090000 32.1460000 18.7520000 + 395 395 1 0.0000000 24.1090000 32.1460000 24.1090000 + 396 396 1 0.0000000 24.1090000 32.1460000 29.4670000 + 397 397 1 0.0000000 29.4670000 5.3580000 2.6790000 + 398 398 1 0.0000000 29.4670000 5.3580000 8.0360000 + 399 399 1 0.0000000 29.4670000 5.3580000 13.3940000 + 400 400 1 0.0000000 29.4670000 5.3580000 18.7520000 + 401 401 1 0.0000000 29.4670000 5.3580000 24.1090000 + 402 402 1 0.0000000 29.4670000 5.3580000 29.4670000 + 403 403 1 0.0000000 29.4670000 10.7150000 2.6790000 + 404 404 1 0.0000000 29.4670000 10.7150000 8.0360000 + 405 405 1 0.0000000 29.4670000 10.7150000 13.3940000 + 406 406 1 0.0000000 29.4670000 10.7150000 18.7520000 + 407 407 1 0.0000000 29.4670000 10.7150000 24.1090000 + 408 408 1 0.0000000 29.4670000 10.7150000 29.4670000 + 409 409 1 0.0000000 29.4670000 16.0730000 2.6790000 + 410 410 1 0.0000000 29.4670000 16.0730000 8.0360000 + 411 411 1 0.0000000 29.4670000 16.0730000 13.3940000 + 412 412 1 0.0000000 29.4670000 16.0730000 18.7520000 + 413 413 1 0.0000000 29.4670000 16.0730000 24.1090000 + 414 414 1 0.0000000 29.4670000 16.0730000 29.4670000 + 415 415 1 0.0000000 29.4670000 21.4310000 2.6790000 + 416 416 1 0.0000000 29.4670000 21.4310000 8.0360000 + 417 417 1 0.0000000 29.4670000 21.4310000 13.3940000 + 418 418 1 0.0000000 29.4670000 21.4310000 18.7520000 + 419 419 1 0.0000000 29.4670000 21.4310000 24.1090000 + 420 420 1 0.0000000 29.4670000 21.4310000 29.4670000 + 421 421 1 0.0000000 29.4670000 26.7880000 2.6790000 + 422 422 1 0.0000000 29.4670000 26.7880000 8.0360000 + 423 423 1 0.0000000 29.4670000 26.7880000 13.3940000 + 424 424 1 0.0000000 29.4670000 26.7880000 18.7520000 + 425 425 1 0.0000000 29.4670000 26.7880000 24.1090000 + 426 426 1 0.0000000 29.4670000 26.7880000 29.4670000 + 427 427 1 0.0000000 29.4670000 32.1460000 2.6790000 + 428 428 1 0.0000000 29.4670000 32.1460000 8.0360000 + 429 429 1 0.0000000 29.4670000 32.1460000 13.3940000 + 430 430 1 0.0000000 29.4670000 32.1460000 18.7520000 + 431 431 1 0.0000000 29.4670000 32.1460000 24.1090000 + 432 432 1 0.0000000 29.4670000 32.1460000 29.4670000 + 433 433 1 0.0000000 2.6790000 2.6790000 5.3580000 + 434 434 1 0.0000000 2.6790000 2.6790000 10.7150000 + 435 435 1 0.0000000 2.6790000 2.6790000 16.0730000 + 436 436 1 0.0000000 2.6790000 2.6790000 21.4310000 + 437 437 1 0.0000000 2.6790000 2.6790000 26.7880000 + 438 438 1 0.0000000 2.6790000 2.6790000 32.1460000 + 439 439 1 0.0000000 2.6790000 8.0360000 5.3580000 + 440 440 1 0.0000000 2.6790000 8.0360000 10.7150000 + 441 441 1 0.0000000 2.6790000 8.0360000 16.0730000 + 442 442 1 0.0000000 2.6790000 8.0360000 21.4310000 + 443 443 1 0.0000000 2.6790000 8.0360000 26.7880000 + 444 444 1 0.0000000 2.6790000 8.0360000 32.1460000 + 445 445 1 0.0000000 2.6790000 13.3940000 5.3580000 + 446 446 1 0.0000000 2.6790000 13.3940000 10.7150000 + 447 447 1 0.0000000 2.6790000 13.3940000 16.0730000 + 448 448 1 0.0000000 2.6790000 13.3940000 21.4310000 + 449 449 1 0.0000000 2.6790000 13.3940000 26.7880000 + 450 450 1 0.0000000 2.6790000 13.3940000 32.1460000 + 451 451 1 0.0000000 2.6790000 18.7520000 5.3580000 + 452 452 1 0.0000000 2.6790000 18.7520000 10.7150000 + 453 453 1 0.0000000 2.6790000 18.7520000 16.0730000 + 454 454 1 0.0000000 2.6790000 18.7520000 21.4310000 + 455 455 1 0.0000000 2.6790000 18.7520000 26.7880000 + 456 456 1 0.0000000 2.6790000 18.7520000 32.1460000 + 457 457 1 0.0000000 2.6790000 24.1090000 5.3580000 + 458 458 1 0.0000000 2.6790000 24.1090000 10.7150000 + 459 459 1 0.0000000 2.6790000 24.1090000 16.0730000 + 460 460 1 0.0000000 2.6790000 24.1090000 21.4310000 + 461 461 1 0.0000000 2.6790000 24.1090000 26.7880000 + 462 462 1 0.0000000 2.6790000 24.1090000 32.1460000 + 463 463 1 0.0000000 2.6790000 29.4670000 5.3580000 + 464 464 1 0.0000000 2.6790000 29.4670000 10.7150000 + 465 465 1 0.0000000 2.6790000 29.4670000 16.0730000 + 466 466 1 0.0000000 2.6790000 29.4670000 21.4310000 + 467 467 1 0.0000000 2.6790000 29.4670000 26.7880000 + 468 468 1 0.0000000 2.6790000 29.4670000 32.1460000 + 469 469 1 0.0000000 8.0360000 2.6790000 5.3580000 + 470 470 1 0.0000000 8.0360000 2.6790000 10.7150000 + 471 471 1 0.0000000 8.0360000 2.6790000 16.0730000 + 472 472 1 0.0000000 8.0360000 2.6790000 21.4310000 + 473 473 1 0.0000000 8.0360000 2.6790000 26.7880000 + 474 474 1 0.0000000 8.0360000 2.6790000 32.1460000 + 475 475 1 0.0000000 8.0360000 8.0360000 5.3580000 + 476 476 1 0.0000000 8.0360000 8.0360000 10.7150000 + 477 477 1 0.0000000 8.0360000 8.0360000 16.0730000 + 478 478 1 0.0000000 8.0360000 8.0360000 21.4310000 + 479 479 1 0.0000000 8.0360000 8.0360000 26.7880000 + 480 480 1 0.0000000 8.0360000 8.0360000 32.1460000 + 481 481 1 0.0000000 8.0360000 13.3940000 5.3580000 + 482 482 1 0.0000000 8.0360000 13.3940000 10.7150000 + 483 483 1 0.0000000 8.0360000 13.3940000 16.0730000 + 484 484 1 0.0000000 8.0360000 13.3940000 21.4310000 + 485 485 1 0.0000000 8.0360000 13.3940000 26.7880000 + 486 486 1 0.0000000 8.0360000 13.3940000 32.1460000 + 487 487 1 0.0000000 8.0360000 18.7520000 5.3580000 + 488 488 1 0.0000000 8.0360000 18.7520000 10.7150000 + 489 489 1 0.0000000 8.0360000 18.7520000 16.0730000 + 490 490 1 0.0000000 8.0360000 18.7520000 21.4310000 + 491 491 1 0.0000000 8.0360000 18.7520000 26.7880000 + 492 492 1 0.0000000 8.0360000 18.7520000 32.1460000 + 493 493 1 0.0000000 8.0360000 24.1090000 5.3580000 + 494 494 1 0.0000000 8.0360000 24.1090000 10.7150000 + 495 495 1 0.0000000 8.0360000 24.1090000 16.0730000 + 496 496 1 0.0000000 8.0360000 24.1090000 21.4310000 + 497 497 1 0.0000000 8.0360000 24.1090000 26.7880000 + 498 498 1 0.0000000 8.0360000 24.1090000 32.1460000 + 499 499 1 0.0000000 8.0360000 29.4670000 5.3580000 + 500 500 1 0.0000000 8.0360000 29.4670000 10.7150000 + 501 501 1 0.0000000 8.0360000 29.4670000 16.0730000 + 502 502 1 0.0000000 8.0360000 29.4670000 21.4310000 + 503 503 1 0.0000000 8.0360000 29.4670000 26.7880000 + 504 504 1 0.0000000 8.0360000 29.4670000 32.1460000 + 505 505 1 0.0000000 13.3940000 2.6790000 5.3580000 + 506 506 1 0.0000000 13.3940000 2.6790000 10.7150000 + 507 507 1 0.0000000 13.3940000 2.6790000 16.0730000 + 508 508 1 0.0000000 13.3940000 2.6790000 21.4310000 + 509 509 1 0.0000000 13.3940000 2.6790000 26.7880000 + 510 510 1 0.0000000 13.3940000 2.6790000 32.1460000 + 511 511 1 0.0000000 13.3940000 8.0360000 5.3580000 + 512 512 1 0.0000000 13.3940000 8.0360000 10.7150000 + 513 513 1 0.0000000 13.3940000 8.0360000 16.0730000 + 514 514 1 0.0000000 13.3940000 8.0360000 21.4310000 + 515 515 1 0.0000000 13.3940000 8.0360000 26.7880000 + 516 516 1 0.0000000 13.3940000 8.0360000 32.1460000 + 517 517 1 0.0000000 13.3940000 13.3940000 5.3580000 + 518 518 1 0.0000000 13.3940000 13.3940000 10.7150000 + 519 519 1 0.0000000 13.3940000 13.3940000 16.0730000 + 520 520 1 0.0000000 13.3940000 13.3940000 21.4310000 + 521 521 1 0.0000000 13.3940000 13.3940000 26.7880000 + 522 522 1 0.0000000 13.3940000 13.3940000 32.1460000 + 523 523 1 0.0000000 13.3940000 18.7520000 5.3580000 + 524 524 1 0.0000000 13.3940000 18.7520000 10.7150000 + 525 525 1 0.0000000 13.3940000 18.7520000 16.0730000 + 526 526 1 0.0000000 13.3940000 18.7520000 21.4310000 + 527 527 1 0.0000000 13.3940000 18.7520000 26.7880000 + 528 528 1 0.0000000 13.3940000 18.7520000 32.1460000 + 529 529 1 0.0000000 13.3940000 24.1090000 5.3580000 + 530 530 1 0.0000000 13.3940000 24.1090000 10.7150000 + 531 531 1 0.0000000 13.3940000 24.1090000 16.0730000 + 532 532 1 0.0000000 13.3940000 24.1090000 21.4310000 + 533 533 1 0.0000000 13.3940000 24.1090000 26.7880000 + 534 534 1 0.0000000 13.3940000 24.1090000 32.1460000 + 535 535 1 0.0000000 13.3940000 29.4670000 5.3580000 + 536 536 1 0.0000000 13.3940000 29.4670000 10.7150000 + 537 537 1 0.0000000 13.3940000 29.4670000 16.0730000 + 538 538 1 0.0000000 13.3940000 29.4670000 21.4310000 + 539 539 1 0.0000000 13.3940000 29.4670000 26.7880000 + 540 540 1 0.0000000 13.3940000 29.4670000 32.1460000 + 541 541 1 0.0000000 18.7520000 2.6790000 5.3580000 + 542 542 1 0.0000000 18.7520000 2.6790000 10.7150000 + 543 543 1 0.0000000 18.7520000 2.6790000 16.0730000 + 544 544 1 0.0000000 18.7520000 2.6790000 21.4310000 + 545 545 1 0.0000000 18.7520000 2.6790000 26.7880000 + 546 546 1 0.0000000 18.7520000 2.6790000 32.1460000 + 547 547 1 0.0000000 18.7520000 8.0360000 5.3580000 + 548 548 1 0.0000000 18.7520000 8.0360000 10.7150000 + 549 549 1 0.0000000 18.7520000 8.0360000 16.0730000 + 550 550 1 0.0000000 18.7520000 8.0360000 21.4310000 + 551 551 1 0.0000000 18.7520000 8.0360000 26.7880000 + 552 552 1 0.0000000 18.7520000 8.0360000 32.1460000 + 553 553 1 0.0000000 18.7520000 13.3940000 5.3580000 + 554 554 1 0.0000000 18.7520000 13.3940000 10.7150000 + 555 555 1 0.0000000 18.7520000 13.3940000 16.0730000 + 556 556 1 0.0000000 18.7520000 13.3940000 21.4310000 + 557 557 1 0.0000000 18.7520000 13.3940000 26.7880000 + 558 558 1 0.0000000 18.7520000 13.3940000 32.1460000 + 559 559 1 0.0000000 18.7520000 18.7520000 5.3580000 + 560 560 1 0.0000000 18.7520000 18.7520000 10.7150000 + 561 561 1 0.0000000 18.7520000 18.7520000 16.0730000 + 562 562 1 0.0000000 18.7520000 18.7520000 21.4310000 + 563 563 1 0.0000000 18.7520000 18.7520000 26.7880000 + 564 564 1 0.0000000 18.7520000 18.7520000 32.1460000 + 565 565 1 0.0000000 18.7520000 24.1090000 5.3580000 + 566 566 1 0.0000000 18.7520000 24.1090000 10.7150000 + 567 567 1 0.0000000 18.7520000 24.1090000 16.0730000 + 568 568 1 0.0000000 18.7520000 24.1090000 21.4310000 + 569 569 1 0.0000000 18.7520000 24.1090000 26.7880000 + 570 570 1 0.0000000 18.7520000 24.1090000 32.1460000 + 571 571 1 0.0000000 18.7520000 29.4670000 5.3580000 + 572 572 1 0.0000000 18.7520000 29.4670000 10.7150000 + 573 573 1 0.0000000 18.7520000 29.4670000 16.0730000 + 574 574 1 0.0000000 18.7520000 29.4670000 21.4310000 + 575 575 1 0.0000000 18.7520000 29.4670000 26.7880000 + 576 576 1 0.0000000 18.7520000 29.4670000 32.1460000 + 577 577 1 0.0000000 24.1090000 2.6790000 5.3580000 + 578 578 1 0.0000000 24.1090000 2.6790000 10.7150000 + 579 579 1 0.0000000 24.1090000 2.6790000 16.0730000 + 580 580 1 0.0000000 24.1090000 2.6790000 21.4310000 + 581 581 1 0.0000000 24.1090000 2.6790000 26.7880000 + 582 582 1 0.0000000 24.1090000 2.6790000 32.1460000 + 583 583 1 0.0000000 24.1090000 8.0360000 5.3580000 + 584 584 1 0.0000000 24.1090000 8.0360000 10.7150000 + 585 585 1 0.0000000 24.1090000 8.0360000 16.0730000 + 586 586 1 0.0000000 24.1090000 8.0360000 21.4310000 + 587 587 1 0.0000000 24.1090000 8.0360000 26.7880000 + 588 588 1 0.0000000 24.1090000 8.0360000 32.1460000 + 589 589 1 0.0000000 24.1090000 13.3940000 5.3580000 + 590 590 1 0.0000000 24.1090000 13.3940000 10.7150000 + 591 591 1 0.0000000 24.1090000 13.3940000 16.0730000 + 592 592 1 0.0000000 24.1090000 13.3940000 21.4310000 + 593 593 1 0.0000000 24.1090000 13.3940000 26.7880000 + 594 594 1 0.0000000 24.1090000 13.3940000 32.1460000 + 595 595 1 0.0000000 24.1090000 18.7520000 5.3580000 + 596 596 1 0.0000000 24.1090000 18.7520000 10.7150000 + 597 597 1 0.0000000 24.1090000 18.7520000 16.0730000 + 598 598 1 0.0000000 24.1090000 18.7520000 21.4310000 + 599 599 1 0.0000000 24.1090000 18.7520000 26.7880000 + 600 600 1 0.0000000 24.1090000 18.7520000 32.1460000 + 601 601 1 0.0000000 24.1090000 24.1090000 5.3580000 + 602 602 1 0.0000000 24.1090000 24.1090000 10.7150000 + 603 603 1 0.0000000 24.1090000 24.1090000 16.0730000 + 604 604 1 0.0000000 24.1090000 24.1090000 21.4310000 + 605 605 1 0.0000000 24.1090000 24.1090000 26.7880000 + 606 606 1 0.0000000 24.1090000 24.1090000 32.1460000 + 607 607 1 0.0000000 24.1090000 29.4670000 5.3580000 + 608 608 1 0.0000000 24.1090000 29.4670000 10.7150000 + 609 609 1 0.0000000 24.1090000 29.4670000 16.0730000 + 610 610 1 0.0000000 24.1090000 29.4670000 21.4310000 + 611 611 1 0.0000000 24.1090000 29.4670000 26.7880000 + 612 612 1 0.0000000 24.1090000 29.4670000 32.1460000 + 613 613 1 0.0000000 29.4670000 2.6790000 5.3580000 + 614 614 1 0.0000000 29.4670000 2.6790000 10.7150000 + 615 615 1 0.0000000 29.4670000 2.6790000 16.0730000 + 616 616 1 0.0000000 29.4670000 2.6790000 21.4310000 + 617 617 1 0.0000000 29.4670000 2.6790000 26.7880000 + 618 618 1 0.0000000 29.4670000 2.6790000 32.1460000 + 619 619 1 0.0000000 29.4670000 8.0360000 5.3580000 + 620 620 1 0.0000000 29.4670000 8.0360000 10.7150000 + 621 621 1 0.0000000 29.4670000 8.0360000 16.0730000 + 622 622 1 0.0000000 29.4670000 8.0360000 21.4310000 + 623 623 1 0.0000000 29.4670000 8.0360000 26.7880000 + 624 624 1 0.0000000 29.4670000 8.0360000 32.1460000 + 625 625 1 0.0000000 29.4670000 13.3940000 5.3580000 + 626 626 1 0.0000000 29.4670000 13.3940000 10.7150000 + 627 627 1 0.0000000 29.4670000 13.3940000 16.0730000 + 628 628 1 0.0000000 29.4670000 13.3940000 21.4310000 + 629 629 1 0.0000000 29.4670000 13.3940000 26.7880000 + 630 630 1 0.0000000 29.4670000 13.3940000 32.1460000 + 631 631 1 0.0000000 29.4670000 18.7520000 5.3580000 + 632 632 1 0.0000000 29.4670000 18.7520000 10.7150000 + 633 633 1 0.0000000 29.4670000 18.7520000 16.0730000 + 634 634 1 0.0000000 29.4670000 18.7520000 21.4310000 + 635 635 1 0.0000000 29.4670000 18.7520000 26.7880000 + 636 636 1 0.0000000 29.4670000 18.7520000 32.1460000 + 637 637 1 0.0000000 29.4670000 24.1090000 5.3580000 + 638 638 1 0.0000000 29.4670000 24.1090000 10.7150000 + 639 639 1 0.0000000 29.4670000 24.1090000 16.0730000 + 640 640 1 0.0000000 29.4670000 24.1090000 21.4310000 + 641 641 1 0.0000000 29.4670000 24.1090000 26.7880000 + 642 642 1 0.0000000 29.4670000 24.1090000 32.1460000 + 643 643 1 0.0000000 29.4670000 29.4670000 5.3580000 + 644 644 1 0.0000000 29.4670000 29.4670000 10.7150000 + 645 645 1 0.0000000 29.4670000 29.4670000 16.0730000 + 646 646 1 0.0000000 29.4670000 29.4670000 21.4310000 + 647 647 1 0.0000000 29.4670000 29.4670000 26.7880000 + 648 648 1 0.0000000 29.4670000 29.4670000 32.1460000 + 649 649 1 0.0000000 0.0000000 5.3580000 5.3580000 + 650 650 1 0.0000000 0.0000000 5.3580000 10.7150000 + 651 651 1 0.0000000 0.0000000 5.3580000 16.0730000 + 652 652 1 0.0000000 0.0000000 5.3580000 21.4310000 + 653 653 1 0.0000000 0.0000000 5.3580000 26.7880000 + 654 654 1 0.0000000 0.0000000 5.3580000 32.1460000 + 655 655 1 0.0000000 0.0000000 10.7150000 5.3580000 + 656 656 1 0.0000000 0.0000000 10.7150000 10.7150000 + 657 657 1 0.0000000 0.0000000 10.7150000 16.0730000 + 658 658 1 0.0000000 0.0000000 10.7150000 21.4310000 + 659 659 1 0.0000000 0.0000000 10.7150000 26.7880000 + 660 660 1 0.0000000 0.0000000 10.7150000 32.1460000 + 661 661 1 0.0000000 0.0000000 16.0730000 5.3580000 + 662 662 1 0.0000000 0.0000000 16.0730000 10.7150000 + 663 663 1 0.0000000 0.0000000 16.0730000 16.0730000 + 664 664 1 0.0000000 0.0000000 16.0730000 21.4310000 + 665 665 1 0.0000000 0.0000000 16.0730000 26.7880000 + 666 666 1 0.0000000 0.0000000 16.0730000 32.1460000 + 667 667 1 0.0000000 0.0000000 21.4310000 5.3580000 + 668 668 1 0.0000000 0.0000000 21.4310000 10.7150000 + 669 669 1 0.0000000 0.0000000 21.4310000 16.0730000 + 670 670 1 0.0000000 0.0000000 21.4310000 21.4310000 + 671 671 1 0.0000000 0.0000000 21.4310000 26.7880000 + 672 672 1 0.0000000 0.0000000 21.4310000 32.1460000 + 673 673 1 0.0000000 0.0000000 26.7880000 5.3580000 + 674 674 1 0.0000000 0.0000000 26.7880000 10.7150000 + 675 675 1 0.0000000 0.0000000 26.7880000 16.0730000 + 676 676 1 0.0000000 0.0000000 26.7880000 21.4310000 + 677 677 1 0.0000000 0.0000000 26.7880000 26.7880000 + 678 678 1 0.0000000 0.0000000 26.7880000 32.1460000 + 679 679 1 0.0000000 0.0000000 32.1460000 5.3580000 + 680 680 1 0.0000000 0.0000000 32.1460000 10.7150000 + 681 681 1 0.0000000 0.0000000 32.1460000 16.0730000 + 682 682 1 0.0000000 0.0000000 32.1460000 21.4310000 + 683 683 1 0.0000000 0.0000000 32.1460000 26.7880000 + 684 684 1 0.0000000 0.0000000 32.1460000 32.1460000 + 685 685 1 0.0000000 5.3580000 5.3580000 5.3580000 + 686 686 1 0.0000000 5.3580000 5.3580000 10.7150000 + 687 687 1 0.0000000 5.3580000 5.3580000 16.0730000 + 688 688 1 0.0000000 5.3580000 5.3580000 21.4310000 + 689 689 1 0.0000000 5.3580000 5.3580000 26.7880000 + 690 690 1 0.0000000 5.3580000 5.3580000 32.1460000 + 691 691 1 0.0000000 5.3580000 10.7150000 5.3580000 + 692 692 1 0.0000000 5.3580000 10.7150000 10.7150000 + 693 693 1 0.0000000 5.3580000 10.7150000 16.0730000 + 694 694 1 0.0000000 5.3580000 10.7150000 21.4310000 + 695 695 1 0.0000000 5.3580000 10.7150000 26.7880000 + 696 696 1 0.0000000 5.3580000 10.7150000 32.1460000 + 697 697 1 0.0000000 5.3580000 16.0730000 5.3580000 + 698 698 1 0.0000000 5.3580000 16.0730000 10.7150000 + 699 699 1 0.0000000 5.3580000 16.0730000 16.0730000 + 700 700 1 0.0000000 5.3580000 16.0730000 21.4310000 + 701 701 1 0.0000000 5.3580000 16.0730000 26.7880000 + 702 702 1 0.0000000 5.3580000 16.0730000 32.1460000 + 703 703 1 0.0000000 5.3580000 21.4310000 5.3580000 + 704 704 1 0.0000000 5.3580000 21.4310000 10.7150000 + 705 705 1 0.0000000 5.3580000 21.4310000 16.0730000 + 706 706 1 0.0000000 5.3580000 21.4310000 21.4310000 + 707 707 1 0.0000000 5.3580000 21.4310000 26.7880000 + 708 708 1 0.0000000 5.3580000 21.4310000 32.1460000 + 709 709 1 0.0000000 5.3580000 26.7880000 5.3580000 + 710 710 1 0.0000000 5.3580000 26.7880000 10.7150000 + 711 711 1 0.0000000 5.3580000 26.7880000 16.0730000 + 712 712 1 0.0000000 5.3580000 26.7880000 21.4310000 + 713 713 1 0.0000000 5.3580000 26.7880000 26.7880000 + 714 714 1 0.0000000 5.3580000 26.7880000 32.1460000 + 715 715 1 0.0000000 5.3580000 32.1460000 5.3580000 + 716 716 1 0.0000000 5.3580000 32.1460000 10.7150000 + 717 717 1 0.0000000 5.3580000 32.1460000 16.0730000 + 718 718 1 0.0000000 5.3580000 32.1460000 21.4310000 + 719 719 1 0.0000000 5.3580000 32.1460000 26.7880000 + 720 720 1 0.0000000 5.3580000 32.1460000 32.1460000 + 721 721 1 0.0000000 10.7150000 5.3580000 5.3580000 + 722 722 1 0.0000000 10.7150000 5.3580000 10.7150000 + 723 723 1 0.0000000 10.7150000 5.3580000 16.0730000 + 724 724 1 0.0000000 10.7150000 5.3580000 21.4310000 + 725 725 1 0.0000000 10.7150000 5.3580000 26.7880000 + 726 726 1 0.0000000 10.7150000 5.3580000 32.1460000 + 727 727 1 0.0000000 10.7150000 10.7150000 5.3580000 + 728 728 1 0.0000000 10.7150000 10.7150000 10.7150000 + 729 729 1 0.0000000 10.7150000 10.7150000 16.0730000 + 730 730 1 0.0000000 10.7150000 10.7150000 21.4310000 + 731 731 1 0.0000000 10.7150000 10.7150000 26.7880000 + 732 732 1 0.0000000 10.7150000 10.7150000 32.1460000 + 733 733 1 0.0000000 10.7150000 16.0730000 5.3580000 + 734 734 1 0.0000000 10.7150000 16.0730000 10.7150000 + 735 735 1 0.0000000 10.7150000 16.0730000 16.0730000 + 736 736 1 0.0000000 10.7150000 16.0730000 21.4310000 + 737 737 1 0.0000000 10.7150000 16.0730000 26.7880000 + 738 738 1 0.0000000 10.7150000 16.0730000 32.1460000 + 739 739 1 0.0000000 10.7150000 21.4310000 5.3580000 + 740 740 1 0.0000000 10.7150000 21.4310000 10.7150000 + 741 741 1 0.0000000 10.7150000 21.4310000 16.0730000 + 742 742 1 0.0000000 10.7150000 21.4310000 21.4310000 + 743 743 1 0.0000000 10.7150000 21.4310000 26.7880000 + 744 744 1 0.0000000 10.7150000 21.4310000 32.1460000 + 745 745 1 0.0000000 10.7150000 26.7880000 5.3580000 + 746 746 1 0.0000000 10.7150000 26.7880000 10.7150000 + 747 747 1 0.0000000 10.7150000 26.7880000 16.0730000 + 748 748 1 0.0000000 10.7150000 26.7880000 21.4310000 + 749 749 1 0.0000000 10.7150000 26.7880000 26.7880000 + 750 750 1 0.0000000 10.7150000 26.7880000 32.1460000 + 751 751 1 0.0000000 10.7150000 32.1460000 5.3580000 + 752 752 1 0.0000000 10.7150000 32.1460000 10.7150000 + 753 753 1 0.0000000 10.7150000 32.1460000 16.0730000 + 754 754 1 0.0000000 10.7150000 32.1460000 21.4310000 + 755 755 1 0.0000000 10.7150000 32.1460000 26.7880000 + 756 756 1 0.0000000 10.7150000 32.1460000 32.1460000 + 757 757 1 0.0000000 16.0730000 5.3580000 5.3580000 + 758 758 1 0.0000000 16.0730000 5.3580000 10.7150000 + 759 759 1 0.0000000 16.0730000 5.3580000 16.0730000 + 760 760 1 0.0000000 16.0730000 5.3580000 21.4310000 + 761 761 1 0.0000000 16.0730000 5.3580000 26.7880000 + 762 762 1 0.0000000 16.0730000 5.3580000 32.1460000 + 763 763 1 0.0000000 16.0730000 10.7150000 5.3580000 + 764 764 1 0.0000000 16.0730000 10.7150000 10.7150000 + 765 765 1 0.0000000 16.0730000 10.7150000 16.0730000 + 766 766 1 0.0000000 16.0730000 10.7150000 21.4310000 + 767 767 1 0.0000000 16.0730000 10.7150000 26.7880000 + 768 768 1 0.0000000 16.0730000 10.7150000 32.1460000 + 769 769 1 0.0000000 16.0730000 16.0730000 5.3580000 + 770 770 1 0.0000000 16.0730000 16.0730000 10.7150000 + 771 771 1 0.0000000 16.0730000 16.0730000 16.0730000 + 772 772 1 0.0000000 16.0730000 16.0730000 21.4310000 + 773 773 1 0.0000000 16.0730000 16.0730000 26.7880000 + 774 774 1 0.0000000 16.0730000 16.0730000 32.1460000 + 775 775 1 0.0000000 16.0730000 21.4310000 5.3580000 + 776 776 1 0.0000000 16.0730000 21.4310000 10.7150000 + 777 777 1 0.0000000 16.0730000 21.4310000 16.0730000 + 778 778 1 0.0000000 16.0730000 21.4310000 21.4310000 + 779 779 1 0.0000000 16.0730000 21.4310000 26.7880000 + 780 780 1 0.0000000 16.0730000 21.4310000 32.1460000 + 781 781 1 0.0000000 16.0730000 26.7880000 5.3580000 + 782 782 1 0.0000000 16.0730000 26.7880000 10.7150000 + 783 783 1 0.0000000 16.0730000 26.7880000 16.0730000 + 784 784 1 0.0000000 16.0730000 26.7880000 21.4310000 + 785 785 1 0.0000000 16.0730000 26.7880000 26.7880000 + 786 786 1 0.0000000 16.0730000 26.7880000 32.1460000 + 787 787 1 0.0000000 16.0730000 32.1460000 5.3580000 + 788 788 1 0.0000000 16.0730000 32.1460000 10.7150000 + 789 789 1 0.0000000 16.0730000 32.1460000 16.0730000 + 790 790 1 0.0000000 16.0730000 32.1460000 21.4310000 + 791 791 1 0.0000000 16.0730000 32.1460000 26.7880000 + 792 792 1 0.0000000 16.0730000 32.1460000 32.1460000 + 793 793 1 0.0000000 21.4310000 5.3580000 5.3580000 + 794 794 1 0.0000000 21.4310000 5.3580000 10.7150000 + 795 795 1 0.0000000 21.4310000 5.3580000 16.0730000 + 796 796 1 0.0000000 21.4310000 5.3580000 21.4310000 + 797 797 1 0.0000000 21.4310000 5.3580000 26.7880000 + 798 798 1 0.0000000 21.4310000 5.3580000 32.1460000 + 799 799 1 0.0000000 21.4310000 10.7150000 5.3580000 + 800 800 1 0.0000000 21.4310000 10.7150000 10.7150000 + 801 801 1 0.0000000 21.4310000 10.7150000 16.0730000 + 802 802 1 0.0000000 21.4310000 10.7150000 21.4310000 + 803 803 1 0.0000000 21.4310000 10.7150000 26.7880000 + 804 804 1 0.0000000 21.4310000 10.7150000 32.1460000 + 805 805 1 0.0000000 21.4310000 16.0730000 5.3580000 + 806 806 1 0.0000000 21.4310000 16.0730000 10.7150000 + 807 807 1 0.0000000 21.4310000 16.0730000 16.0730000 + 808 808 1 0.0000000 21.4310000 16.0730000 21.4310000 + 809 809 1 0.0000000 21.4310000 16.0730000 26.7880000 + 810 810 1 0.0000000 21.4310000 16.0730000 32.1460000 + 811 811 1 0.0000000 21.4310000 21.4310000 5.3580000 + 812 812 1 0.0000000 21.4310000 21.4310000 10.7150000 + 813 813 1 0.0000000 21.4310000 21.4310000 16.0730000 + 814 814 1 0.0000000 21.4310000 21.4310000 21.4310000 + 815 815 1 0.0000000 21.4310000 21.4310000 26.7880000 + 816 816 1 0.0000000 21.4310000 21.4310000 32.1460000 + 817 817 1 0.0000000 21.4310000 26.7880000 5.3580000 + 818 818 1 0.0000000 21.4310000 26.7880000 10.7150000 + 819 819 1 0.0000000 21.4310000 26.7880000 16.0730000 + 820 820 1 0.0000000 21.4310000 26.7880000 21.4310000 + 821 821 1 0.0000000 21.4310000 26.7880000 26.7880000 + 822 822 1 0.0000000 21.4310000 26.7880000 32.1460000 + 823 823 1 0.0000000 21.4310000 32.1460000 5.3580000 + 824 824 1 0.0000000 21.4310000 32.1460000 10.7150000 + 825 825 1 0.0000000 21.4310000 32.1460000 16.0730000 + 826 826 1 0.0000000 21.4310000 32.1460000 21.4310000 + 827 827 1 0.0000000 21.4310000 32.1460000 26.7880000 + 828 828 1 0.0000000 21.4310000 32.1460000 32.1460000 + 829 829 1 0.0000000 26.7880000 5.3580000 5.3580000 + 830 830 1 0.0000000 26.7880000 5.3580000 10.7150000 + 831 831 1 0.0000000 26.7880000 5.3580000 16.0730000 + 832 832 1 0.0000000 26.7880000 5.3580000 21.4310000 + 833 833 1 0.0000000 26.7880000 5.3580000 26.7880000 + 834 834 1 0.0000000 26.7880000 5.3580000 32.1460000 + 835 835 1 0.0000000 26.7880000 10.7150000 5.3580000 + 836 836 1 0.0000000 26.7880000 10.7150000 10.7150000 + 837 837 1 0.0000000 26.7880000 10.7150000 16.0730000 + 838 838 1 0.0000000 26.7880000 10.7150000 21.4310000 + 839 839 1 0.0000000 26.7880000 10.7150000 26.7880000 + 840 840 1 0.0000000 26.7880000 10.7150000 32.1460000 + 841 841 1 0.0000000 26.7880000 16.0730000 5.3580000 + 842 842 1 0.0000000 26.7880000 16.0730000 10.7150000 + 843 843 1 0.0000000 26.7880000 16.0730000 16.0730000 + 844 844 1 0.0000000 26.7880000 16.0730000 21.4310000 + 845 845 1 0.0000000 26.7880000 16.0730000 26.7880000 + 846 846 1 0.0000000 26.7880000 16.0730000 32.1460000 + 847 847 1 0.0000000 26.7880000 21.4310000 5.3580000 + 848 848 1 0.0000000 26.7880000 21.4310000 10.7150000 + 849 849 1 0.0000000 26.7880000 21.4310000 16.0730000 + 850 850 1 0.0000000 26.7880000 21.4310000 21.4310000 + 851 851 1 0.0000000 26.7880000 21.4310000 26.7880000 + 852 852 1 0.0000000 26.7880000 21.4310000 32.1460000 + 853 853 1 0.0000000 26.7880000 26.7880000 5.3580000 + 854 854 1 0.0000000 26.7880000 26.7880000 10.7150000 + 855 855 1 0.0000000 26.7880000 26.7880000 16.0730000 + 856 856 1 0.0000000 26.7880000 26.7880000 21.4310000 + 857 857 1 0.0000000 26.7880000 26.7880000 26.7880000 + 858 858 1 0.0000000 26.7880000 26.7880000 32.1460000 + 859 859 1 0.0000000 26.7880000 32.1460000 5.3580000 + 860 860 1 0.0000000 26.7880000 32.1460000 10.7150000 + 861 861 1 0.0000000 26.7880000 32.1460000 16.0730000 + 862 862 1 0.0000000 26.7880000 32.1460000 21.4310000 + 863 863 1 0.0000000 26.7880000 32.1460000 26.7880000 + 864 864 1 0.0000000 26.7880000 32.1460000 32.1460000 + diff --git a/examples/gjf/ff-argon.lmp b/examples/gjf/ff-argon.lmp new file mode 100644 index 0000000000..b6f7bc931a --- /dev/null +++ b/examples/gjf/ff-argon.lmp @@ -0,0 +1,20 @@ +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + diff --git a/examples/gjf/in.argon b/examples/gjf/in.argon new file mode 100644 index 0000000000..271882c665 --- /dev/null +++ b/examples/gjf/in.argon @@ -0,0 +1,162 @@ +###############################mm +# Atom style - charge/vdw/bonded# +################################# +atom_style full + +############################################## +#Units Metal : eV - ps - angstrom - bar# +# Real : kcal/mol - fs - angstrom - atm# +############################################## +units metal + +############ +#Run number# +############ +variable run_no equal 0 # is it a restart? +variable res_no equal ${run_no}-1 # restart file number + +####################################### +#Random Seeds and Domain Decomposition# +####################################### +variable iseed0 equal 2357 +variable iseed1 equal 26488 +variable iseed2 equal 10669 +processors * * * + +########### +#Data File# +########### +variable inpfile string argon.lmp +variable resfile string final_restart.${res_no} +variable ff_file string ff-argon.lmp + +########## +#Run Type# +########## +variable minimise equal 0 #Energy Minimization +variable md equal 1 #Plain MD + +############################### +#Molecular Dynamics Parameters# +############################### +variable run_no equal 0 # is it a restart? + +variable ens equal 9 # ensemble (0=nve, 1=nvt, 2=npt, 3=ber, 4=lang, 5=stoc, 6=vres, 7=stoch, 8=gjf) +variable ts equal 0.120 # simulation timestep (time units) +variable nequil equal 0 # number of equilibration steps +variable nsteps equal 200000 # number of MD steps +#variable nsteps equal 20 # number of MD steps + +variable temp_s equal 10 # starting temperature +variable temp_f equal 10 # final simulation temperature +variable trel equal 1 # thermostat relaxation time +variable tscale equal 1 # thermostat relaxation freq - vel rescaling only +variable deltat equal 1 # maximum temperature change - vel rescaling only + +variable npttype string iso # type of NPT (iso, aniso, tri, z...) +variable pres equal 1.01325 # pressure (NPT runs only) +variable prel equal 1.0 # barostat relaxation time + +neighbor 1 bin + +################### +#Output Parameters# +################### +variable ntraj equal 1000 # trajectory output frequency - all system +variable ntraj_s equal -100 # trajectory output frequency - solute only +variable nthermo equal 200 # thermodynamic data output frequency + +################################ +#Energy Minimization Parameters# +################################ +variable mtraj equal 1 # trajectory output frequency - all system +variable etol equal 1e-5 # % change in energy +variable ftol equal 1e-5 # max force threshold (force units) +variable maxiter equal 10000 # max # of iterations + +######################## +#3D Periodic Simulation# +######################## +boundary p p p + +############################# +#Reading the input structure# +############################# +if "${run_no} == 0" then "read_data ${inpfile}" else "read_restart ${resfile}" + +############# +#Force Field# +############# +include ${ff_file} + +###################### +#Thermodynamic Output# +###################### +variable str_basic string 'step time pe temp press' + +#MD ensemble (0=nve, 1=nvt, 2=npt, 3=ber, 4=lang, 5=stoc, 6=vres) +variable str_ens string ' ' +if "${ens} == 0" then "variable str_ens string 'etotal'" +if "${ens} == 2" then "variable str_ens string 'vol pxx pyy pzz cella cellb cellc cellakpha cellbeta cellgamma'" + +#Variable for a gulp friend output +if "${ens} >= 0" then "thermo_style custom time temp pe etotal press vol cpu" & + "thermo ${nthermo}" & + "thermo_modify flush yes" + +##################### +#Energy Minimization# +##################### +if "${minimise} <= 0 || ${run_no} > 0" then "jump SELF end_minimise" + print "Doing CG minimisation" + dump mdcd all dcd ${mtraj} min.dcd + dump_modify mdcd unwrap yes + min_style cg + min_modify line quadratic + minimize ${etol} ${ftol} ${maxiter} ${maxiter} + reset_timestep 0 + undump mdcd +label end_minimise + +################ +#Timestep in ps# +################ +timestep ${ts} + +############## +#Restart file# +############## +restart 100000 restart.1 restart.2 + +################### +#Trajectory output# +################### +#dump xyz all atom 1000 silicon.lammpstrj + +if "${ntraj} > 0" then & + "dump 1 all dcd ${ntraj} trajectory.${run_no}.dcd" & + "dump_modify 1 unwrap yes" + +fix mom all momentum 1 linear 1 1 1 + +############################################################### +#Ensembles (0=nve,1=nvt, 2=npt, 3=ber, 4=lang, 5=stoc, 6=vres)# +############################################################### +if "${md} > 0" then 'print "Setting up the ensembles"' & + 'if "${run_no} == 0" then "velocity all create ${temp_s} ${iseed0} mom yes dist gaussian"' & + 'if "${ens} == 0" then "fix nve all nve"' & + 'if "${ens} == 1" then "fix nvt all nvt temp ${temp_s} ${temp_f} ${trel} tchain 5"' & + 'if "${ens} == 2" then "fix npt all npt temp ${temp_s} ${temp_f} ${trel} ${npttype} ${pres} ${pres} ${prel} tchain 5 pchain 5 mtk yes"' & + 'if "${ens} == 3" then "fix nve all nve" "fix ber all temp/berendsen ${temp_s} ${temp_f} ${trel}"' & + 'if "${ens} == 4" then "fix nve all nve" "fix lang all langevin ${temp_s} ${temp_f} ${trel} ${iseed1} tally yes zero yes"' & + 'if "${ens} == 5" then "fix nve all nve" "fix stoch all temp/csvr ${temp_s} ${temp_f} ${trel} ${iseed1}"' & + 'if "${ens} == 6" then "fix nve all nve" "fix stoch all temp/csld ${temp_s} ${temp_f} ${trel} ${iseed1}"' & + 'if "${ens} == 7" then "fix nve all nve" "fix vres all temp/rescale ${tscale} ${temp_s} ${temp_f} ${tmin} ${tmax}"' & + 'if "${ens} == 8" then "fix nve all nve" "fix lang all langevin ${temp_s} ${temp_f} ${trel} ${iseed1} gjf yes"' & + 'if "${ens} == 9" then "fix nve all nve" "fix lang all langevin ${temp_s} ${temp_f} ${trel} ${iseed1} gjf yes halfstep yes"' + +if "${md} > 0" then "print 'Doing Molecular dynamics'" & + "run ${nsteps}" & + "write_restart final_restart.${run_no}" + + diff --git a/examples/gjf/out.argon b/examples/gjf/out.argon new file mode 100644 index 0000000000..8dda569157 --- /dev/null +++ b/examples/gjf/out.argon @@ -0,0 +1,249 @@ +LAMMPS (1 Feb 2019) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +Reading data file ... + orthogonal box = (0 0 0) to (32.146 32.146 32.146) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 864 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors +Setting up the ensembles +WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) +WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) +WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) +WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) +Doing Molecular dynamics +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.94072 + ghost atom cutoff = 6.94072 + binsize = 3.47036, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cubic, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.12 +Per MPI rank memory allocation (min/avg/max) = 6.847 | 6.847 | 6.847 Mbytes +Time Temp PotEng TotEng Press Volume CPU + 0 10 -56.207655 -55.09214 33.340921 33218.561 0 + 24 10.156356 -55.092888 -53.959932 339.40964 33218.561 0.082175482 + 48 9.6121006 -55.07262 -54.000376 344.56765 33218.561 0.19529325 + 72 9.8187467 -55.16687 -54.071574 318.85979 33218.561 0.29643488 + 96 9.5421385 -55.151229 -54.086789 322.8842 33218.561 0.38801357 + 120 10.295035 -55.12919 -53.980763 332.00171 33218.561 0.47607262 + 144 10.331608 -55.09907 -53.946563 339.28896 33218.561 0.57389224 + 168 10.154698 -55.058246 -53.925475 349.03253 33218.561 0.65481471 + 192 9.858198 -55.127583 -54.027886 330.09298 33218.561 0.74437734 + 216 9.6658918 -55.10812 -54.029875 334.28383 33218.561 0.8278495 + 240 9.6801591 -55.102386 -54.02255 336.27242 33218.561 0.91167379 + 264 10.685658 -55.046238 -53.854237 355.0448 33218.561 1.0023789 + 288 10.387727 -55.08427 -53.925504 343.87247 33218.561 1.0960371 + 312 10.231132 -55.120428 -53.97913 333.22463 33218.561 1.2382998 + 336 10.20896 -55.075142 -53.936317 344.88438 33218.561 1.3420489 + 360 9.7876538 -55.165008 -54.07318 319.14962 33218.561 1.42782 + 384 9.9872551 -55.13881 -54.024717 327.82471 33218.561 1.5417666 + 408 9.5362734 -55.063733 -53.999947 346.50545 33218.561 1.6328366 + 432 10.262638 -55.126608 -53.981796 332.16342 33218.561 1.7242996 + 456 9.9228239 -55.122119 -54.015214 332.26261 33218.561 1.8124888 + 480 9.7026324 -55.17057 -54.088227 317.84818 33218.561 1.900233 + 504 10.028762 -55.082465 -53.963741 343.04257 33218.561 1.989605 + 528 9.8227851 -55.121222 -54.025476 332.42857 33218.561 2.0708802 + 552 10.208672 -55.100242 -53.961449 338.68109 33218.561 2.1527217 + 576 10.180849 -55.124065 -53.988376 331.29516 33218.561 2.238126 + 600 9.6467252 -55.119533 -54.043427 332.43109 33218.561 2.323443 + 624 10.041885 -55.173802 -54.053614 318.48579 33218.561 2.4046151 + 648 10.151597 -55.111725 -53.979299 334.66227 33218.561 2.4902161 + 672 9.7719111 -55.060111 -53.970039 348.55249 33218.561 2.5800372 + 696 10.476688 -55.088109 -53.919419 342.94922 33218.561 2.6731395 + 720 10.517805 -55.113604 -53.940327 335.47342 33218.561 2.760651 + 744 10.006466 -55.045085 -53.928848 353.53813 33218.561 2.8537894 + 768 10.201492 -55.081598 -53.943606 343.3206 33218.561 2.9404115 + 792 10.117738 -55.077806 -53.949157 345.31093 33218.561 3.030765 + 816 10.362288 -55.11635 -53.960421 333.9045 33218.561 3.1177356 + 840 10.204164 -55.097619 -53.959329 338.82717 33218.561 3.2091886 + 864 10.147722 -55.101372 -53.969378 338.19682 33218.561 3.3003742 + 888 9.9265037 -55.111394 -54.004077 334.08116 33218.561 3.395341 + 912 10.206403 -55.132181 -53.993642 328.89904 33218.561 3.4882881 + 936 10.28639 -55.093317 -53.945855 340.61244 33218.561 3.5764735 + 960 9.8028822 -55.078802 -53.985276 343.5904 33218.561 3.7056267 + 984 10.492755 -55.121321 -53.950839 334.62697 33218.561 3.8055611 + 1008 10.621569 -55.088588 -53.903736 343.33166 33218.561 3.9144807 + 1032 10.006729 -55.113459 -53.997193 334.43025 33218.561 4.0189888 + 1056 10.099853 -55.068035 -53.941381 347.42158 33218.561 4.1391664 + 1080 10.254232 -55.066685 -53.92281 347.15777 33218.561 4.2443953 + 1104 9.9495142 -55.13686 -54.026977 327.63107 33218.561 4.3368342 + 1128 10.377108 -55.08846 -53.930878 344.13083 33218.561 4.4287748 + 1152 10.036981 -55.114643 -53.995003 334.88053 33218.561 4.526868 + 1176 10.144779 -55.097125 -53.965459 339.698 33218.561 4.6614049 + 1200 10.075844 -55.14695 -54.022974 326.05911 33218.561 4.799835 + 1224 10.183695 -55.121716 -53.98571 332.75772 33218.561 4.8908897 + 1248 10.581369 -55.027954 -53.847587 359.06251 33218.561 4.9839788 + 1272 10.158269 -55.105173 -53.972003 337.52964 33218.561 5.0918646 + 1296 9.8776072 -55.064085 -53.962223 347.15648 33218.561 5.2291209 + 1320 10.38161 -55.118366 -53.960282 335.17767 33218.561 5.3570446 + 1344 9.9528146 -55.141937 -54.031685 326.27117 33218.561 5.4584705 + 1368 9.8024326 -55.117808 -54.024332 332.99835 33218.561 5.5557818 + 1392 10.35447 -55.110235 -53.955179 336.80412 33218.561 5.6467392 + 1416 10.199061 -55.105641 -53.96792 337.36785 33218.561 5.7476527 + 1440 9.6868779 -55.087316 -54.00673 340.9166 33218.561 5.8432207 + 1464 10.093238 -55.049436 -53.92352 352.27563 33218.561 5.9471521 + 1488 9.7578808 -55.123935 -54.035429 329.93926 33218.561 6.0495014 + 1512 10.099979 -55.205426 -54.078758 309.26166 33218.561 6.1612976 + 1536 10.172944 -55.087106 -53.952299 342.93395 33218.561 6.2506202 + 1560 10.51771 -55.107635 -53.934369 340.1967 33218.561 6.3379856 + 1584 10.044994 -55.101362 -53.980828 339.03163 33218.561 6.4362567 + 1608 9.624758 -55.146246 -54.07259 324.32486 33218.561 6.5385845 + 1632 9.9135215 -55.097278 -53.99141 338.69162 33218.561 6.6452786 + 1656 9.863681 -55.070523 -53.970214 345.84608 33218.561 6.7518212 + 1680 10.138513 -55.127065 -53.996099 330.40757 33218.561 6.8775188 + 1704 10.382237 -55.070572 -53.912417 347.074 33218.561 7.0126448 + 1728 10.72487 -55.081147 -53.884771 345.83623 33218.561 7.1384216 + 1752 9.829431 -55.131041 -54.034553 328.57652 33218.561 7.2616419 + 1776 9.9135662 -55.100556 -53.994682 336.52238 33218.561 7.4193201 + 1800 10.41873 -55.097116 -53.934891 340.24798 33218.561 7.5570544 + 1824 10.151782 -55.03231 -53.899864 357.3654 33218.561 7.6872905 + 1848 10.42307 -55.043808 -53.881099 355.71677 33218.561 7.7933885 + 1872 10.276862 -55.085016 -53.938616 344.46273 33218.561 7.8887472 + 1896 9.7681373 -55.146507 -54.056857 324.84323 33218.561 7.9977923 + 1920 9.6624824 -55.103214 -54.025349 336.06397 33218.561 8.090235 + 1944 10.153504 -55.049175 -53.916536 352.36339 33218.561 8.1923703 + 1968 10.191954 -55.098741 -53.961813 338.8667 33218.561 8.3320906 + 1992 9.92167 -55.117079 -54.010302 332.96497 33218.561 8.4774437 + 2016 9.5737281 -55.091141 -54.023178 339.41837 33218.561 8.6149527 + 2040 10.600908 -55.092717 -53.91017 342.71852 33218.561 8.7639523 + 2064 9.9214513 -55.099904 -53.993151 337.46799 33218.561 8.898087 + 2088 9.9256258 -55.082224 -53.975005 342.85042 33218.561 9.0130784 + 2112 10.345379 -55.112923 -53.95888 335.81471 33218.561 9.1422766 + 2136 9.8876649 -55.079254 -53.97627 343.05764 33218.561 9.2885707 + 2160 10.04492 -55.074876 -53.95435 344.82419 33218.561 9.3876103 + 2184 10.028705 -55.063961 -53.945244 347.70549 33218.561 9.500967 + 2208 10.412572 -55.136316 -53.974778 329.8188 33218.561 9.5900362 + 2232 10.404205 -55.09913 -53.938525 339.77542 33218.561 9.7048353 + 2256 9.5694135 -55.139021 -54.071538 326.37473 33218.561 9.8045958 + 2280 10.244745 -55.134529 -53.991713 329.19392 33218.561 9.8968908 + 2304 9.9129922 -55.116192 -54.010382 333.14326 33218.561 9.9818651 + 2328 10.167027 -55.08241 -53.948263 343.08135 33218.561 10.068683 + 2352 10.262045 -55.144327 -53.999581 327.40876 33218.561 10.155937 + 2376 10.520934 -55.073147 -53.899521 347.6998 33218.561 10.246316 + 2400 9.9628692 -55.122001 -54.010628 331.25369 33218.561 10.336833 + 2424 10.565531 -55.157113 -53.978512 325.14897 33218.561 10.452039 + 2448 10.03709 -55.096409 -53.976756 338.29607 33218.561 10.537936 + 2472 9.384311 -55.141821 -54.094987 324.23247 33218.561 10.628689 + 2496 9.8019362 -55.105685 -54.012264 335.97239 33218.561 10.717287 + 2520 10.31114 -55.078831 -53.928608 345.42395 33218.561 10.818756 + 2544 10.407237 -55.148382 -53.987439 325.94421 33218.561 10.910801 + 2568 10.257967 -55.041348 -53.897056 355.73261 33218.561 11.004221 + 2592 9.8425807 -55.139428 -54.041474 328.28096 33218.561 11.101295 + 2616 10.140697 -55.100238 -53.969028 338.76319 33218.561 11.192211 + 2640 9.7102818 -55.136288 -54.053091 326.7053 33218.561 11.280277 + 2664 10.120372 -55.128779 -53.999836 330.71707 33218.561 11.369001 + 2688 10.232537 -55.120614 -53.979159 333.35087 33218.561 11.464652 + 2712 10.032526 -55.094761 -53.975618 339.97984 33218.561 11.559387 + 2736 9.8791 -55.121998 -54.01997 332.32556 33218.561 11.649679 + 2760 9.891483 -55.120919 -54.017509 331.32614 33218.561 11.742604 + 2784 10.201053 -55.165525 -54.027582 320.39272 33218.561 11.85274 + 2808 10.238648 -55.096449 -53.954312 340.06316 33218.561 11.939782 + 2832 9.8692851 -55.068632 -53.967699 346.77535 33218.561 12.036655 + 2856 10.179976 -55.128413 -53.992822 331.5662 33218.561 12.123227 + 2880 9.7656315 -55.1468 -54.057429 324.02612 33218.561 12.213117 + 2904 9.7991628 -55.049191 -53.95608 352.45738 33218.561 12.326761 + 2928 10.581767 -55.093293 -53.912881 341.37292 33218.561 12.417633 + 2952 10.546144 -55.07452 -53.898081 347.02025 33218.561 12.52701 + 2976 9.8306008 -55.14762 -54.051002 323.45715 33218.561 12.633522 + 3000 10.033532 -55.076433 -53.957178 345.36812 33218.561 12.72627 + 3024 10.046266 -55.085775 -53.965099 342.47786 33218.561 12.816242 + 3048 10.176777 -55.133013 -53.997778 329.04144 33218.561 12.903175 + 3072 9.9778064 -55.143787 -54.030748 326.75284 33218.561 13.014329 + 3096 10.516223 -55.110144 -53.937043 336.802 33218.561 13.104673 + 3120 9.6561157 -55.138699 -54.061544 325.6652 33218.561 13.207371 + 3144 10.237043 -55.060968 -53.91901 349.44011 33218.561 13.303442 + 3168 9.9704264 -55.123073 -54.010857 332.19725 33218.561 13.391877 + 3192 10.493307 -55.144402 -53.973858 327.15485 33218.561 13.482857 + 3216 10.022171 -55.141782 -54.023794 326.08249 33218.561 13.574484 + 3240 9.6957248 -55.137865 -54.056292 326.04858 33218.561 13.671408 + 3264 9.9685299 -55.124301 -54.012297 331.9015 33218.561 13.760186 + 3288 10.413707 -55.153604 -53.99194 324.32939 33218.561 13.877604 + 3312 10.022953 -55.103422 -53.985346 337.52066 33218.561 13.977562 + 3336 10.044478 -55.110297 -53.98982 334.48379 33218.561 14.065563 + 3360 9.8593734 -55.130623 -54.030795 327.71748 33218.561 14.15952 + 3384 9.9269422 -55.107979 -54.000613 335.18173 33218.561 14.258064 + 3408 10.288049 -55.092276 -53.944629 340.71484 33218.561 14.36211 + 3432 9.9702156 -55.08732 -53.975128 341.72171 33218.561 14.452123 + 3456 10.246178 -55.091669 -53.948692 341.62844 33218.561 14.555775 + 3480 10.559292 -55.086917 -53.909012 343.70626 33218.561 14.645718 + 3504 10.652207 -55.050897 -53.862628 354.46979 33218.561 14.797422 + 3528 9.9835266 -55.0557 -53.942023 350.74747 33218.561 14.895716 + 3552 10.240934 -55.123217 -53.980825 332.26434 33218.561 15.023796 + 3576 10.406519 -55.093536 -53.932674 341.54029 33218.561 15.203252 + 3600 10.406733 -55.095168 -53.934282 341.22192 33218.561 15.303986 + 3624 9.9877484 -55.154231 -54.040083 323.55633 33218.561 15.398883 + 3648 10.391829 -55.110208 -53.950984 337.09219 33218.561 15.49042 + 3672 10.368995 -55.069591 -53.912914 346.82649 33218.561 15.582259 + 3696 10.362939 -55.109012 -53.953011 337.32216 33218.561 15.679316 + 3720 10.465254 -55.136214 -53.968799 331.22288 33218.561 15.773303 + 3744 9.8238226 -55.10114 -54.005278 338.12616 33218.561 15.86905 + 3768 10.205504 -55.101263 -53.962824 339.04196 33218.561 15.960072 + 3792 9.9589987 -55.118883 -54.007942 332.84318 33218.561 16.047055 + 3816 10.253382 -55.117513 -53.973732 334.42101 33218.561 16.148412 + 3840 10.262393 -55.069549 -53.924764 349.084 33218.561 16.235391 + 3864 9.7367167 -55.078288 -53.992142 342.48207 33218.561 16.329112 + 3888 10.171202 -55.134701 -54.000088 329.5847 33218.561 16.415353 + 3912 10.01925 -55.145139 -54.027477 326.65074 33218.561 16.526334 + 3936 10.053638 -55.038151 -53.916653 355.74893 33218.561 16.618524 + 3960 10.044055 -55.058382 -53.937953 349.01834 33218.561 16.712577 + 3984 10.382422 -55.099216 -53.941041 339.28099 33218.561 16.79941 + 4008 9.97927 -55.09284 -53.979637 339.07225 33218.561 16.904198 + 4032 9.6782319 -55.126143 -54.046522 329.0201 33218.561 16.991454 + 4056 9.6593809 -55.123677 -54.046159 329.89833 33218.561 17.097172 + 4080 10.442896 -55.141149 -53.976229 327.9899 33218.561 17.189364 + 4104 9.9571109 -55.08588 -53.975149 341.3746 33218.561 17.294147 + 4128 10.44943 -55.087946 -53.922296 343.09435 33218.561 17.387357 + 4152 10.040581 -55.171939 -54.051897 317.85348 33218.561 17.500905 + 4176 10.089442 -55.128713 -54.00322 330.29121 33218.561 17.588891 + 4200 10.316156 -55.123219 -53.972436 333.59382 33218.561 17.679254 + 4224 10.177245 -55.095671 -53.960384 339.34498 33218.561 17.770569 + 4248 9.7129183 -55.135335 -54.051844 328.25125 33218.561 17.857728 + 4272 10.231838 -55.099554 -53.958177 339.64015 33218.561 17.944226 + 4296 9.9737677 -55.117885 -54.005297 333.07248 33218.561 18.034105 + 4320 10.004955 -55.116155 -54.000088 333.52271 33218.561 18.129644 + 4344 9.5938901 -55.133824 -54.063612 327.84171 33218.561 18.215476 + 4368 9.8954562 -55.131603 -54.02775 329.0813 33218.561 18.306539 + 4392 10.439732 -55.100379 -53.935812 339.81679 33218.561 18.395651 + 4416 9.934513 -55.08449 -53.97628 341.74441 33218.561 18.484506 + 4440 10.025998 -55.136771 -54.018356 327.73718 33218.561 18.593946 + 4464 9.9304451 -55.101817 -53.994061 338.1801 33218.561 18.684011 + 4488 10.344371 -55.085856 -53.931926 342.91721 33218.561 18.782399 + 4512 10.033193 -55.091778 -53.972561 339.85728 33218.561 18.879666 + 4536 9.2361614 -55.169375 -54.139067 316.67597 33218.561 18.983667 + 4560 9.5786289 -55.179976 -54.111465 314.76415 33218.561 19.079009 + 4584 10.071651 -55.107218 -53.98371 336.10364 33218.561 19.163975 + 4608 9.9873098 -55.109348 -53.995249 336.03665 33218.561 19.25635 + 4632 10.143888 -55.119423 -53.987857 333.74978 33218.561 19.346658 + 4656 9.7506264 -55.114772 -54.027075 332.98271 33218.561 19.435425 + 4680 9.9616769 -55.096054 -53.984814 339.20499 33218.561 19.55562 + 4704 10.271313 -55.074522 -53.928742 345.87397 33218.561 19.642652 + 4728 9.9172336 -55.098805 -53.992523 338.06318 33218.561 19.734557 + 4752 9.9556222 -55.12128 -54.010716 332.66408 33218.561 19.83859 + 4776 10.197593 -55.095293 -53.957736 339.50067 33218.561 19.947471 + 4800 10.145085 -55.108467 -53.976768 336.05115 33218.561 20.044183 + 4824 10.205523 -55.147376 -54.008934 325.56559 33218.561 20.144393 + 4848 9.8900281 -55.121598 -54.01835 331.17401 33218.561 20.243197 + 4872 10.03655 -55.100936 -53.981343 337.6777 33218.561 20.336043 + 4896 9.8120635 -55.087507 -53.992957 341.42438 33218.561 20.425498 + 4920 10.615354 -55.093335 -53.909176 342.30776 33218.561 20.519318 + 4944 10.374366 -55.06455 -53.907274 351.10607 33218.561 20.612312 + 4968 10.677474 -55.147807 -53.956718 327.85703 33218.561 20.719371 + 4992 10.558882 -55.145253 -53.967393 327.427 33218.561 20.818726 + 5016 9.4097946 -55.150835 -54.101158 321.62641 33218.561 20.914472 diff --git a/examples/gjf/trajectory.0.dcd b/examples/gjf/trajectory.0.dcd new file mode 100644 index 0000000000000000000000000000000000000000..47927e9909cfcfc86ceb2568ba1660efed5834f2 GIT binary patch literal 439092 zcmeEubx>P-)a?m%rApmsu_RbsfbNyL3nZbgw72dqgu2rf66!*Wph-<^4HzCT{SnRe#fz`5b@<0pHsz1G?Z5d@)KufFZ2{QB$P>mq{S zx$A#^`5*ohne`=5@*nR0#~ao8RtR5v`Eue*J$20V>0uM=51&)NJ9_l!9nAOsEC2d- z=z+f7g6p@N8a8Zt*vR_+t?GB3F@BD`u^)dmY(-ooB;CH&xri%ET zuA4oq_?@ow=`!BWzt1%zO2F@Q-Rz;__4<9T8bx*Zovt>IO!%FyvFSGaPS@{rwtkJ} zcRE|Y#_~IztzTpLozB*;vHVVF>(^L*r?d5IEWZyj{Cgz76E^%cmfr~*{u;~ggbja< z<#)n{zsB-AVZ&cz`Bj7cy8bPX{aZfyx48aq@%7*0+`q+}KjZlucm0{4zwz*Y|NZly z^9uhKzyB?c{#!izx406a6%_y3^>2CX&v^cxuRrtiH;?h3?VVrue!uzo&pD1i`Rng` z`AwmAq{^8C3;fH?J0RM1%|8Q9Ua5aDK z|IJzbnTJ2~@aMez&A0!Vhd=Z1|1Tc?%}M{mz5bJf|KY0t-2XE_|L_O@=mr1q;(zY{ ztq=T}hd=Z1CrXpm(Y^Am!1@=C8=JhlmhR%a#ke$om+@u8W5&4T8^#Y` zoijr9a{~siOAZXaC=2*xhzXqXBRk#p$|e0-?qXx>Dl?56{Er64F4+~BwoYq&xMO{w z-?^fJx+UR(`$BvIr>{>Ae7df6z_=CF(^p>$HokaVGH}(bqv>1RPa2~ZA5ZTX*|<%& zw+Y6ge!Bvve|i-7zar8sq2G8`u^Xug3{n85=5-DollSAt##j;B>3>qcJ`&LpsnJ>fDZBm>Llp!UVy_6lL_&8jO zOD*M)?2;kOKLVMEz@2~yTzjR##UdJvpRB=kYmM&@~kE2TVQBvfvnJiz78t}b+cl!s};M{RtS@=2>)(@ z`Mw2Dy72oV`E`i}m#$mk+0KH`v#nU9v|_8t0!MQzKJ3ZH#urvZTP<)sW5v#4R$PB( zL9tH0)X*-cjVpZU&~Z;{V09(0=1s`?jwhA)+K_%u^`^v{Ze$$jP8~+esq;Z8#gF%< zBQCy_(a?*2UTaQaUd^fTTwf|$LQdU}HK6IwdRlm}Z{6D+V z?j16!e_Bpube_~_mIpQN=tdJ}xYGP8a+)#Pk8-mMsdGC4g{=#zl#_t0>xDF`xddwucTlxd2PM~+VEy?} z+`rrpYnS!I&^jSVa8g0nUX8o0RTwc*3F~t;BBrX)y@nD!SB2nuloB=Ph9ES~; zimy>YdQ^q4$3l@cQw>+O3Om;X<3)f9p@k}hPg0@xLN#8VP@;=G1T{;kvAKj2i&m>) z<>&7AP~kxN5EQMa!u*#iOzN-2fnz!}?HL2@LmfsO*J5rj9hxU;vFU&gmlZlRiq_#% z10Cj;(jl?54(9^3i1XFLRU3_%3R)cY(V_8kEo?P)XfacV_K{jVpQA;sfm$q|sfFLK z=QPn_$zd%@6>2f8l@3z=9iQ&$kbF~z{RKLd=o^EeTrG~4FvGFjgarposI}XSEsxDO z^3#L^uT3ztF`?X66TVh4A^cq?R8vi;KGTf1rOjx2)`VkS&4^l(iD&0BK_ktm`6v@b z@0c*Aml*~Z6NC!)2%)O$;_%cw|Gp+IFPP%7JNt4Ks_` z(QByooK_hoE*3{vq9x-$6u4|c-h>JaxpfNBS2qDg4;8GlI@xV z?t=u3kC31QpPNs$1(eS#q$xoH+-?fE(b+*MLLm)XQb?uS7Sh@1-|R09?ItWaV=MS!OR1U$7}H%1q_&wOZuA(ZO|`4xdkG z(e{BBg%$YcqqTUmUk9(TI?R}%#oj?$M4r~-r(O%y2_0fP#UQL=48D5n;9}I`VJbgY zn}y!dCXDN3hIXeJ>lT`Dkk8!K875pYW}?keGae^o;qnPSLoZDb4w+DIxCxWyn31*A zghp}vvzeJZPbTDEG$H%32@9v05MwgIZ?g&G`MjO3YR1*=CKP-#!DW&e&)S-?rg9d} z$;=!}%xF>Bj8wG=8#N}pt6;;vB{mdpx1o7k8>*DEq1*>EYz4n4mf8g9c}y$v@UIS6lJ zgTBy)obfg^`Iv(x={776%99&9|++B?19+AyQa`IfQd)pEw^ zD}MykKD8#`_4(QXVV(m5;&+ZUmP-f=+&k;@iT97+rN3+RDLt()<;2s0D+A-d8v{2M z>ze+odX$`KXH~Lm3ANN+whG@yZKpt7k+G`m$2J-nVs&5P;DxZgmdoDylt z?L=C1Gm&$iNJXyb>GkY1YHv)Y1G;1yo^GJ^u8EYSHBkBaNfdc1nfhJR(|UOlZ7wcS z&>cP9SeHzZIzmbBYBRsETwdCS|O6pnq=y|IGJ*T4HSG? zibFqSc-}{bB3r%SS4#^03ON?+_r@NH96!IxaBiFo@88H!r7Qalo67OIryR@r%iujm z3Xd6HxLrYppsF(1S9!s8ycA_i%3$>OM&qk8ge>wzpIb7_GDzWCSBk@sggRwA}Aeyhd!F0_~dy`M1#93*1!C_NlyL>zv`IFg_B@-Smb zlOEJvMCw`*9W)|JToSRGzdp*iFp-~On9jJ<*MNm<40yIpM5loU^y1&wzm^D9pam|= zEht&aigPovQ6t!jF}tl;UEhLXdACq!niYYSt;j#cSg@xB1DjY;ow20xwiRWZtVmsK z#hxe&&iY!hILv~h@fJ+DVSyk2zc>8e3qP$GcisXF%frYE^WwfcOH&se^&^^XhTSgR+Uke9` z!4ArD7LdZ;@GbAvDCMU{SQ{1IWQV}1w-VWBwWyk=#T1Jc5sWibjkVY|Fb1t_n9-zx z2}X?>@`6k(Ich@Hsb)0bIB*&^)Gn}LK^+_RF6S7K%V*zHN_ZzD*SY>QQ^)!7rZ>Hf zlv0hF1vFw#0X^IzU~E7k>5~N1>mWgtnd5u~HTI2DLH&*M%;gYt@KR&+869Gd=org$ z9M052J6ns`k~%D(WyaL`CS2WQf-J^_E8-4NoNlQWm%zrPz=+zQD@^DaH#;QAg`{B)JC05=J zL1o5~_8w}8ob&4SkKvr8L%E(h%x3JBR8@yl={ls|HsL*wq46LyigTQw*xif^pG+t{ z!HyanV@t2%I2mNaF2*&Ub8Kkz)Qvi~_oU4AGTNQwLt|$7(&|o4=mq27LG2}&A{S83 zPy}=@{<;oCfSR^f|>8mhKxBwN4J)pX4BE zr457L%4qfyciPykDQ#`slsZ3hBUu?A8g7+fd0k$w0Y#7zEWyC@PIx1A;u=r|d6y8p zAFsr)bTx)IQ(^D{HT*e$uRj}&p3gYvkJqAE865_3{x8>>=V!19yRMo*3KLAvP3Uhl z;REB--4An+=4XTAnhom295lPfzWik(-SRY$=4%Qa_fMk0N_uKh#z5{)9D8?oVLr#= z`PJp9+FFY0XQimnm%Z4>G`PMu97A$7_&QjFJ)<;m_7u@=j~-9Y=ppN>hxomMn&WJR+`D_Y8}comq9xZ#4rHbqcWlt~mXCkl$#k`jgI89{NeOcH&+sHfOr zDWpkGpz^y!GOLm({;m{0O}*gJObSS)xYtXD_=9phB>ubLGbs#+oPxV~Ms;L9zpgEv~y?w+6+-$PLJ_$ep` z$R&z1vjxTe6hX18auPMXmq^ZgQz&q3DoyKUpo=f`w7I+tBWKAmH(CZ8&sF?68Agp} zKEx{mpEER=+L-f1)d)oY2*=GG5pYY@BQ-$861@S_jd}z-889#?8PnHVF^OyMvXipm zQXw1F`ekEG2P-l~K`|&*P@LmAn*B{s7&-}x>URW1dELgqPo zda3k=?Vb!-52bK=zr!Mli-4JVmc^gL z;jvnSTAWwAAJt%POBh-R(d#yN=#J{`1fi1jNyQ2j~mQ_$ZYb_|AY?M-k{vLFEvy@tN zbEirHo-{F3N_DsfscvxmYP3d0u3xPCxaP65-sz`Aoi-uZd{~W2AC*Xdri9Kr6s1zM z8233ECpcF`*3)4!*U75SIvnEqvjSuE<;zUi!1-&x#0<9;X54#YL(%zm7zf)?cc%^2 zAKEY>g6qkZKJ;OQCymT$N@dn~)1;~%lyXB(Z9)oZ#=b(DKdg{!oGT9W6wq*<1VU34 zTs=cjuqFgyJf7wWYLp+X#@1mvv|Oact@~OuPt;*;dmZl9)nQaEGbYHhuxxrJsx!t9 z|6qo2g)#nZ8>aI(#&@wp%(ub+tqu7FHmq`Ur&0BNsmX&T^w+_rw4_i*&j&Rm=VB5Z zt}KB$$wA(nQ$JR5P>oGLX(PvCLwOZmomPUbD`D%UMhQtMrcKtN%v~KKIiC*C(qb0J z>zkEhkmb)jKtD6iyJlfndoxT$*zp3K$k<2tpK6CPx#P`;5GQs!GyGgTP%NQH_j z6=H{IQP!E~$c=OQel6a%)1iZJ40E9-Y;w=Sz1Jq}m-0HbG-JSh6Gn3_lmC_TC+GFc zoJ;48wPQh`9pN7v(qBRT^mw%|Y2Ub!S9^cjztfvaxp7|K>V$Dx2~Ho9pgz~q-I@uw z_gw|g`AQ`9<9T_k!m9ad%$&^iXOI>Zm{*y>S6i+J144AD)JKP}%%2=AYewH!nb>sC zgeqL~EjVIA7U!#4)wvGZU_;AV%v1O?{^9Q%>*Z8=tS?E<`_Y>VGCDp|PPx70l$apF zh&DwaOXAvI?SxBlMbLT^*V%a?cziGzUoWXpwyGKd^O(EZq(oj79e#2?eKw2d<$N@5 z9pJijlolt~WMUkTq4Taxp5kVv(gNpH>M%)9rL{8L8X`sCI^HO&mm-tvjY^-q5G^qFo)V4`jU#a05sv0x zHF&i?0uck4V@+dB%yIGg+ay>^8sHowq9$YCCUvbCFvNnC0t*uAGhY2@!CQl%n7Tqx zTrvrYv;KnO`X)g!ier*yTmrS*BvS0qM4InsAblSLedHSJ$8ISC;=FL`iWEN=b1l<@ zIqRu%eB)T$YP|-z91H!F8pw?rG&rHb>v5b%n}~?K#u$E}i2k`EauY=KZkCOk9#+h$ zlMR1!gLf<#E=UxwKL`prkE3avpy<9*P(0ruD4H!#qAiz`Y16h;a&MPH3pOND zkTchcDlb$Ik>mCmFMLRm!}XgCj$k=9; z&U`zMNf;Y}fIK}iq6|3nUc|v@JuD^>ZAiq8^;XPlm5nfWD`p}a3olu4ylpnRa*lX0 zSy22u!E2N*C@wq_6z_QrzdT5xr!5RLym>NR*)P%u_e8o;-#`lsvc4XEW~Me93O zsE1n6lrd0zCo7IK?s&98P{b_YaXb|iR~Y{k%j5mTxphXqNVd2X8t9Qs*+)eRu9iy6 zqeLn_P>MO*Wmv>mV|G7ptT--1g{eMJ9M|C3t%az~`&wBd9M1=9@HSF|9dD8l+k*GA zj~?fEZZbKyFYLp)_1i6k@Z5Avfvqcr;CW08>a{YV zq?-*m=0iQtNpNYq8Yi#oaPXT6Kl<2k(M3+FOPMb}7J{cjWOrS7FGbXk;;_-dMs8*EKS_9Oi@(ZfXR-(Ly|H#*Hy{)Qk0`!9yfiwLcg` zuWB(=W5Tq{oO_L~w7YU4xx8T>akUnSW6aF!b6uGurwLCSRFwI|qD6Js!|(4kI0ue! zKYBRd39UWVn0!HtO4m#{Q`U|IVFvOQ`x0K*pwi0^I zeTAcWe&*RR)n86yo;cx9t`bAmYf-v{2{kx=N9B0123SamZIo!wIr9#4dOarQARx?@ z7R3Ift`k&f8>&TzluW!}?yF4`DLu<`(1LMFjF9UvI@N^qQa1D`*@#ZH65#wqiNGT~ zZ;ee*)wkj4Vkt?SB?!H$f=gd5c3sIt+gEapvq1>Z^Wn6U%bbILcFcv#bp{P&Hh zjrfydoz-Z;CH(Z1~W&Astmq@Ogm>x9Y|~w=4@e$GLvXa;5y!4l<2ZV_j$FSDnpx z$uvUhCAo9;m_YaR6cuMnJSrbF#btdFeZ+Hg*N`o+<13m;}53kFrs%CUxEO*`6i=t2R{JVr=*IUM^i%sas zwQnb7BidY1f}TTEaChS0+dC88m)o$Sg*W9^74W#G3O#>BBP>1>uOj)J#`;mkC#*5> zd2iU0apmMp9C(|9$}1T+*K<&UZwS(OeLaIsI6TjW;!WMiBf>#4=A4LeU*%IKL@8}J z9@Bs-%N;a)w-S~b96uYG5LCyG_$M;@YpQ^YrPUac5RDHmCM5BG(*=1_r633CE~_w} z*U_vqA#F2r*1f!GMK1vzSU;%7^Ru~rCW4v!IPKv^LiYly;;X{;8Zmf(oN-)t){VM& zQQSxYJFIFvHEZF-T>OB>{C<@uZC)kdD?g_m^ZskwG1i*Tm~T@Ps<@H0$wg{BzQ+8E znYoQ+{P)iHAn}-k4%H6Dq`^8|FVA`#YfiT-x>IIT)?*@7=)mzI*~bLeNjALqkWp`c z2`U7uG5fL(o;OWsKaRQjK_2wpA>dj|HST}bVoQJ-b*I^J@n|E8$rtebg9;6%>9D%E z8J8;C;1uOW?k-N)^Enu2Pw7}|&P4P1HVm)oL&M%M2NwWzE(Pre#%Rz}|UNpG8 z6DEOqK>m9bWlh+;#D-bJlIVUvDXO&4U|~DPRm?eFm@X(JUlVD6TQBq-!1Zyk9tT{l zNZBVS!p`X_aIGimc8|dIED@8RS&+z>YTt<@YSPpjuTE$Xvx;lf##W5Y78DjSg(~&t zdYgIP2A&3tQ)eTqi=g;k$w0B`-Vg_AaCZ@NB(iJ-_Z1Z9$0gJE<6cR;14q6mDx1=+z!i$R3BozDdNpZWaWLWsV?IB(Jw# zxOXWWPgaXK!kF-)Mo`>+ucx~r^W=>*cr;CfUSfqjR!|I=rqcI4jE$M&F7Rhe$DHqY z{(GOcOQtW7!@%|U66SD(4;H-NEhwVzi=-C4kaj2>$38F)9b-kE5J90kqNias<>)w5 zgRDqBG&a`$8w-k4PRVrUvJ4c@n06NP$_*@7%v{E)+KE)^xfJ{V(!kn-@!BE_z*tpX zN>9-|Z?#)%P{WvnIgF3azY!G6w&9BU#pF#KR1q&M^M^96-@mYxR9m0}U&-sN-j_{P8Y zR98VEP7=vC#2e<1;V}0RF@1s+O|A-x6GaX5&cQhGp$6ABifF)i{E@$)7*RQ%Qe|>< zn;n6xLqxd5G7dEhilkA=^u|?&vk4mPZZ6_(t_4@O3JOmcsJ^olA*aJJll>{h7h0iv zA}F*iQfTHiITkL}z?d)MyVZi$%-cydX85y9G}C97p>k+WOfGIebpH-qGXbCo5JmkF~g?ft;SnaD_Cux>}EL?`&NE$b8^> z109fhV{t|}igOKCvJ2}Te+dfvz+`GxC`H3W4U$i=CbOS?FU=*2!Ab*7<61^}K!d_r zdc;3qZfG#i&j&qq@|9wfgx7Zh$ANOJo9uPq(c45iv{!})-8GoRf7gjhR&37{6y^IF z=oHsMpIJMSeiso?J{z~^alGnmpwqG5P@fD(!v?(WT#p_ZEK$IaLYov`%oi-gD!U$a zCt5KyNTOKuIGHv^d0|W**O$liD4$_L^mswh@)&c6UFE1aUjv0R^MB`Vq0bOO@hwVE zzVEzn>G?t=*A&rWo)yj?9jG}kiFPlQA^VaBk3B_H$+Mt11jVC^i8Qc<3|)t7@I$S~ zj9wO;Ud?s!W03}~^@6`O91%72khizsS|veIN@1XSC48_$9f36$li+aT`fRPBsPH<0 z6wf>naaDtLkJ-nRmW|#=ne!YFPf<5yc*JpLcx@3im~*>RPEd5-&-=5M3?IH|(4FhQ zp6M2BE5B5)#B&ov!$!pVXnHztwfeWX}>mdC^AT06&za*G7TD=~qVAM!@SKn*JL{-1x@ zio<;b#bQP6qqTWwIA@Dp@KPKbc%JFlCh)2%ZXw2*NU-dJlA3d4gq1buj)yNTn^FsyW z;i>!Ew5~QaaQ36>K|{+f2$-Lpi6qo9 zP-ou5jsT9c3uMquWbdL?j)N)Qu)dWds*MbJd~d>R&QpD**t}SVz$r4EIK**Z!5kCo zBXKvScx02I`g|E`ob@ag(1}v6~bR z&&wdaD1+&k9OwD_-dp7edJv9q-UD-XuqUxq1d_wp)99l?_Bi%6#%WO1s=YatXuo(_+IyLtQ)IAAU|hA z`3O|)7J-<${G7CfSkqO56MP11TnNW1_Dp8*{*SrHnh$Fh3;3KJKgu!lnFw`H_BX!J zBdnjEIb0DDr45jc(Btk5JsQUH{%5}Y8G9b@))2Ay6X*NmBANwo9{HLCmzS(tGsl0j zI&0P8dd#23-o-=_o5%8d`!j!Xm7iaef7fU|+-%HU7(_hTF2doiN9PNyF?kr^y5EAa z35?bF9JkoXJp3Eh1qNF&coOFej#*}BD^9?Q2ahc1r{dhT-h!3GvZ3eqFWJG`_DKtB z-?iZGCkqA}Ecja7ib9U18_X7r^R(c>1PksLvKGCOwP}tR1DtS>e%# zaS-!4XPMvWIm3$0vl>xkHFrAU;!jBhQhHn6ovIG;AZafjO3rISWk-5a`EhbeW*nW) ze#h1|Wt3K#Ie;Htw6>L;Dn>V^8v|wJpC_Y$u1zR-yp*L5{&~xalM@y#b<_Ke>oKfo>1d<8Lq`< zg<|F%CGI>9L19xBW+_#eX;5KB0rSbCMp8a2Jx6LpBa06TQ3wnv8zd@V1~VtQ?^d8X@NSs#N< zo0(79t%cO2MZ-xtjI5x;iCtQ(tgeN#zZNt>i!RLbPw%Y*`skp4AICn+d3u|O1@|Zh&&h@uT1@3%7muVO@JF~AyZB0I){0&VrD#*n~=}7R_-R&u1~W+E7ydl zmCX3OnmHSP8}>)r(6gEiy1q8{gykSEn>matcC;U8L)-o~Tpw#gs<#~{zvSReGp;MI zu@1k~2In9fiul-YIFM`5LpC_9HhA4)52MzGIj3@PvXKp6OERCfmbLoBcBIN}T*Krb zurLSNk8-f@9KZiW4#x`iHny|Fy3Lb57IUS71MJ;pA8@GwUUaaWj6TH3sn{uRQdIG! zI>)@IVMBj zRbQIF(1%`R%BUXmCqE~6({elWSoOSU|7Tx{8_nEadskZCPDbwA+1s#GPG58m>dySd z>z)$y-sFVCkpjwcy}OkCio-o5=zPvWBhNc%%oz4Ke3D?)6bZ(g1YG_sAdU64ydDDc zvI3?bl)%V*R@W!&F_sA^w#Nyh>Nseunf;E99hBxQLG!2rYF$Nw*@K;!1LpTUmLTD# zfMGui>DUwp-DoVpzL`A%%q_fI#-7E|N-VjiLX)>4=)-5FyIqOrBh(0Ouf`}Z6`nOy z!#-Apvw9WudsNuXe#YR%O4PllL~3$Bls%wAdK>0#OREr<6N2LfN{lP1MArQf6dT0n z=U6a^HJnR(l;}`IjXCZ3=L`Alo#wOoF$A5Lsc&U$jbUCgJrkw)`!`QaSazBHFJa7iCh$30 zZGs}hgrYUfILkV#W-ogzx|wj2pSNP72>}n7Gp)&fqVN232TV9JG7~qL*FEIIoN`4o zdQW1ljnDUf*0{Fla!_=R9bJy(pvD9nx-POIG|z@Uxi+-EYeV;aIhfzfj%mwtFl|5k zgAdv9I>UyIeD4~cxg9(BTwbzagxUsavK`K~+2_c7o>ppu#n*;nzIH6?WP{HG_Mi0R zGpDm*c2PST@VRZpuidZPU^FrhdY`$(mUisxvBsD-;iWNlk0j&Gmz!<&)N~JQv@tp` zZ;2+ba@kdZXOcWKT5PFkEZt&rz^%~Y#@w)*>Fu`d2=ot5H&zZv4(#78FL2bD2xEWW zJAv`a8i6B1o*JWS>`uQ@w~Mj+>7Ie9&9?<+M7jo6tk%cqbhfoocXW=i%&sMY&+c_P zacXx#o34%D8~cS8Zk-~W)YcuWTNWU$|%0L-P=6YdB4R0J> zBS+s!QnX|Ic$M`)|2LjUjF#e6QyHGUlVR&1DY{0=klUF3izB57@9c#(wb^GPN-_SW z4CCiAMr|v@nq-Or4a7w|tPXi4?!!^iX5`hl8HTXDQgBe`k=^k(& z%pMIoT+m=K%gm)SYOJF^2xdwXX6mGTFBc!*8jYC9SV84yDsR*CRB34Zi z5p!FQEmK8&J;5GDFaDfw_9J>T-aFjM00m>nr}y<(b5)P=Jz2{eZNPy_?0aPY&_X{E z?U{SHa3=|E-Wag2Bl9=!^r*5t3E|9{GzV;TGm3tjN2_JuJl-BhI!!%e>6)6;|{Z!#Iw(Kc$ToSJeFd39fH9 zSn+VR$P8|3(f9WaKI%S zjV@WSaI6(^Tnqm5xge{Sd(w_}a_Y6nkG>~KN%-PLFKhVFwfYiNyi-62ck`={1Px{t z#e_!!G|CX9aIF4tk$F*>8nKgE&ktctq-DR}BQ2^B`vzZY;cMeKcZK;;j!DLTW+b!z zaiKkX2-%Z1vmW<79OloDx@kvg3-=W)vZJf(TMS_RWny1fTI=Uc8_Rpspx2z&)KXgf zMou~1zSF54tdETPNw?XTFHI_-{6kKtVW` z!`;P)F7ezPpCl)1o;O`)%v(Rqm)t%Tke)sMGRBqeYYXY|O75fiAfR>!_7jAKV%S$D zj+RrRVGAX~t|@UbOot;cbr3?dSoedya`8HJe!^d~=i-+yZh(&&or{{ee}v~M+l&uS zIX;f&-U){d>v}UEz1fDOnXKQjZ*W0eHa(n^EpdS>Y5%j_K`33-YBCJ zPa4oPiJU?%2r!H(pzbdP%x3K0LsdwNc~7E+1xc09pcq!yet$suUMN1 z)uBl>9oBI!&b-an8^*dNO}NOKku&G4PLXCbUuH(DLuL$iZ^wUZrB zy0Xtc%7@$!%IVuSe>$;?eXy&&skPmmicI7_s?$ygU&j3yj9H=<^Y|t^=s}hey_>L> zIFNP539L!nRbh%s4gK+GJgcPxF(xQHqeF^b3x6Z`5N&1sB;SmVBTcwj-h|h;&4`(A zLO;sEraC$3!J6{0%pA1c%l?p1_JoW#(CPADBR0Q6x-MX@mZQg{>}6hzb=L5 z>`A7wvQ#p&KYsRRPxOkDq2mSi7OdlV-araJ^2VDN9JlvGV0;Y?pDzu2fi>8l#vJ&5 z?hlk0Q1P{h&Ri3FpD|!2^GV$bve7Mt{ny=@uUu)x)d^O}dN6kuD=2z)6BI+23JU+) z5=HM8f})9?_5INXqRdn}(;%7JbDn!RJC$%fnf4gHpdT;AxWn9g87IY&P#K(S$l;e6 zfzfj~M;z1O@@5V8E{VXH^~?`^6=Ap~q7Do=7sdQ)on+*2oxU!TJ>#hyD~EHxV1Fy# zdfmo~hPTn&!Ja|(>xC5viiNBzTp7dTVt#wZoCG@hYkoXas8eJ-ZQZM@(?sZ=>e0ZJ zb5W`R!|!v9ceY}>*@{YQt#Ie~U%xT0*9<|CJ&<{2=D-gXlPJpaTBY;4-Q1W$*GeUm zY^O+j&WfZ}BvXDHJ*9n4;vU_MCJ`G3hv#e%mf0rMv-Y51Idr+^UupM)!i5F@J5ji z;mFtX9%divLH0N;%wU~C7lHS+4d|*cp!5j#$von9;{1F2frudH=}U5+E4GJyDt$Ot z^4|Gc$XsVz)@-`)e&IcByvAOlg@U5-EkRLZvtzU)ol8tig5_i}FF8f~Ej{kXm=zkz!kD{y_|8478p5*eeo z_v$=*E}ybzBaQ3+lUnTI`l0R@_NK+@@Tf=@N)#}jk72*XB(Bd(vhQ4BMsy)-$VU+-jN37j|vZr;tgYZ-eR z`wG}}f%`d`2l>)ciLIs7*j7!6Qo%|DNOXAKh2!91EhhZ(#ZA^>_+A~RjbXoFu`EQk zGGkhQGj@D2BXAbyvQ>8Y9nHbP{W;ipg7c{VTe#|MsO08FwOaU4{7z3QXyQR5GyJH{ zZaIzGUPu)ybHA#O6Rw8~2+#@e<2o|cQ;F4#F%o*JF?cKUGdxEIhY~-Iu?Hhc3(E>E z=6&OujB{$!mt3FCV|}%$89h_E&RN2Igr6DZ7H~eDY(v!m&RdaOr_|%Tm10L+T^lq{ z{b}M@A8I&NPHQ%JQ;n-$q-xi^80T9%Sg-J%kxJ)KaN$Fuah zfVp|xTf+0zC0GTIiJZSUcloH8gSr|Dr|)XS^kS}OmlmV#TD-o+K75{^)}>+)9?SlP z;U-usm|^|IHKLapho3Vpi{L)AYrH;rHi(RYYBN4N!~BVDxcPHtmC-jrpHLD z9&}GkQ@g*S@#lIV|Q@f zu!wu+%SPbmBMsWJcKqY12n%z%%acSr9-WMhXSw%@^XG>S+34c1z|_@>rPUcPKjNIq zvG~Cw_Q+M2D31QpT{tc_f5|a%QzDgRjm>&6nJS!2qmXp|+=F-n6)7vlf?jgeZNeOW zJ1HV6%8{2Qg^}}n{ZRH*_KZN@!Emg9wh+b?u5(yh^a*A^_Z&SYT{j?qqX82yh}h|! z%|2c3YvTM>(uwD4DElkz*=WsqtJwn9yJoZYbWl*d<-Adzb-;IAM|Mm$(BSw)s@FP^ zKD|mNduKg0$mSYu1NQ{f<9@d4-dNU4hD4heK3CGf?#BK>Gy4q&u$ERBj*sPd&V1N2 zkjMJaDiNjjvflmF02O18+a;~&)RF6m%2upTWR29uz57zm@lOTCj+267I%}Y>PVriC zzE5i=Cmt?y{j@LwP9aCmK?ICtaGG?V;|Rk zA1-S!+!}$vXbogh5$Lj;`_7odPviP+MMDuE=NOQ!Y_*{5 zR_^KNxk1GVk%GB*VRLsGYhm6f zJyQl>55^mBWVpLrhN!XOSmdHX5bxvp>-e)6ShvjUslmH5to2Xjo(`U$!=Jd0OyO~{ z4$!zebMKr(!v`jRC`ddf)Rg1M4?M|>Z!Rbvp# zJW!<=R#ULFc^`IIo{vTgx;ThNnP2`(t&#fDk*WJ9($xe zWgwL~(KoML$*;VCipx=;KBe*5+za_dNHt8*N+<`%vw4 z0pi3^oSecv`3=o*-Dk(KvhL)PDWD(waY}n~F5a4nu)#Ul5hkUlMhBf*)EC?5N2AJm zj$LzeptX5WmCp`}e6ED^yJ$F4GvSh!gYv~>^pmxNj6O>EFV~`RYtENvYzPTzOlc|s zb=ZG&vXl-9?C(>&3D#w5%qGk8EH=!vNu?X+{NtwdThdt3pR8Kai_@QPRPH=TxV4tKl{agcH{aw)`t!r{z0A# z)QCHy#TBmWuB^zxy(BqZdGV93$FdKOYny!*6B;o0)-T7KdQLB(#kZ7bbu${X&v38x zt{l9W*pRx;WeumJ8e=!>u#fBcPbGPrBm602qrg4QTvsxm`ieD!Z3nnEoYH`Ly~(Gq zFO_(~IeG%ul26Lpu=sK#GWHcP^okOfhiOr>r3p*-Ft1)wMrEuHDi#~cHMtfeyK)|X zk%PYRo^;T;kb4P3u(zlVo12?3q@NAdp46ks#~DYp4nf`q{w#~Zj`Snpz;es;Jud57oVeb zn{x1Vl$5#-{Z35^g3+NF_qx2!#CFyS${PJ?ty}_$TL>mH|ND6q*T{Cxo4@>G2?B%# zO0053qtScz7nir=9ryZ0bt$A)KL=!hfEG$6KDx6;6Pt;NTx)M>A*WMK1aul7f{)eNH@7wu$?i4`jr62}asi3V zHH<96_Zbtu>0^U?XICnWaDv|tHTvnaC^E!^vrlvQGiJQ#Qau5_H9`<`Rg0AFnON~4 z2iMknQ{=}&iX5WE?Fl-ZY-&PbSw8QjJ*a9g)&+Vg(Xq7-)vf&ZhH&3H`!rh)WxnGY z_eYM^Vfzsi7H_a2rJN6Koy(d-Llu5LV?QSQY6p+7qhpMmy7Ffo6l<@NXgAmNbQy=A??GxGhCk2$Yk>nSIA?d45D491XGXz_@7hlq3=W*w7~>Y0FvUAQl_ zvTNPFwQruR2|e8cYULZ!BmcA@t*y8{N;eZ+1(dK8A; z$*^02ZG_!}&F*Aicd}W>MquCTyuXjnm5o(h;=Mi;Wd`#6)LK!9?@Oz}9?~;HfdU9cPoCQ?&!rGm^8r-2`EV|poT2V!xgFDW3atn6f$=UiB6~)|cbplES#x}0->&zkr|u8Yg#|@R2pw%s_>wYtXoT3}&`rjhaYp1Z%y8)Je4|p+?a^(b#>T`2#oUtKF>7 z-g73)zOnRNnWZC5Yu(!&7>Eo}#g~EKE4(v(R+i@YDy1Z%$(xapg#`FC; z+|i7&{Q3v0E3`M?@0Hm}8oVtZ4eK-$zWGw0p;l-&k28weR}EV}F`%y0>rt2CzKxiY z+AOC=_@Ec-NYCfY)@n@e=mM_ine^10R$;-EXebL2BbsAJT0QDO1B~+iCN()nqwui} zIfzB9A6eu7vo~J0UR9%rEgH)QnUK&s16$9#(4c6dB(SCrkJe*jwh@us7m1!OoX?Jz zhFw(H%lEz395al3&X!lG&pnnT<43D-h3nHjJP9*Lk_%|apLc*!e)Lx3_6}xF5U={T zDf1AB0d+r4ozp$$q)p^L+Q+Z|PbU86dY&@dB>#3)L0wyq3f#YWhskH~eNTOoAPXzf zQ$`JtC-pIJSK2Xy-rS!P5(PU{$QclYrZFZ|<30@zRcNcz-<{u3gZkcu88KuxxG?~SZzPZQD#@MMfA=5ttZ`<;9OG*~=ST!oN zjl#ffCZylVz)9j)FO!p{O=IS6G~oLlVZ!}~nXuQVetAoRG+scg>b@TLD<@%_yB$KE zW^3x8-R5baHS*ujoAKeh9fxmoJ#+n6u(3Bd7L7rDO*s71j#AW7hB?ggVW}FosE-Pz zpDC5+Si6=AZD_+}$@FHw)sj7Dq8a%<#QWAOw5unx_Zj7f$o0`E*Vzoq@Jw{!zAk&& zEE6hG=j%nx_o*4bcy6RLV;^-RMU;i8zuFpucAw4g_+W?sH-)zLextn1Bj?9HyZdnV zAgk%yHY>E&=kfAxvj!Ww>#?|-8C_;m&%2tvp^CXFF6zYib9G-sP1FSHj*2O?_vabK z`+}M{EpzBbCE@BtJG^-=we6iK6R&8Hqt|0Lf8OaYs88?3^L&s=`cZ>6!-tx!2jtes zMGc|;*S$%y48EYj!wGuGCvslrnC;e?p0<@n(M9le=Dl!*=R>hFnaF#=^}lkTZ0@f@ z#|7m1CYn(7nH>$5@cb;kS8fGp(6mVmCRR0b9r62e{nv{$OZ8J~)NB)jo!3nWV&54{ z%rx9-mLoUR=+RY=)Cl^s7u)gYlS132BXRd##AgRf8jyL@f1W#=i2=LJ}@n$9`tW?gOBsh?%JoHZ(V>D;I0j^iLaaaot}LoIkUc#j8MO@WqVImWpvDTm3VkuqE-)!&BymzG+8( z6bLTSqoAeT`8dlC;XeGFAakl3W&h?R$=I`3?DRFZVOGvtdJGyJ;JICzp3r&BZ!DH1 zlP@I8wC-jZyWJ?K0?iWUXO?qo$y+Q<5RWrS(t}^G9`{D4HfFj1-Y6aWo8;o*1R4ID zxjysEGB-6@UN=sb((TPMyh5VPPfnE5#AizMN|Y%&ql9PCtN2rcu}#(Z+pfY2-VN0n zsj<7W2JJrj;-!`T)1~yIHX$Z)P=jG}e9>H^#>|R-SaV5(I)NIzU#mvfIn>&(Q{z4V zp0-|t`!9U4gMaQpKAeCmRt0J3iPb<~LxcPBWqxWR4k50^K-06+ZJX@I=1|b%m zcA2=)9X%TS(nE2Tf3`CpCqmC0Ha+^CipESwG&U?`KEW70Mvv8FS#kPuePU2tsC)bo zg$dL3SkaKW$PUypwxLILtsar-(Rf6RyWu%<*0cC^J8^yU{}1OxBO^N+VFUGO+KU`U zMl>QD^6o9D$16TVG}q!c-sg)4n{k9(PwzAn-s!lnXPNPm=k!1yu5H#s+0=HoZ%STy zvKga>F^@6BjPZS#3oz8otVU)_oHe8B0De5b)|0YHm}fF!>~bUI0)3ZD=@02f9b^$R z4C9QL$b0Il-N-Y7y7r00!<;7SK9Ya~JkRIa(QUgOXTN43zcFjAX_+ux&BQ(8EV>$Y z3>0E5ywe}AU=9z@k}KTr7uIKx^UOrq51Cj@op8_2c9?ihwyl?mbG)}75;rPGtmbZ- z9d#m@b8*#l?2W$T0n(oN$by)Uxoc@-ee z`JOUrtXghG(Hr)K+N?svd3}AQ^gusZ;qVdVfjScK-b)^bYouXgjSO2HD4*$1Y$G1h z;-9*5VzF9kTkA=?OiyVYtHib%?1!Tic-+z@ElVh2eBqM40SfpiawP9Qv6j90Qsz>w z^lGbs@AZ7y_ECxCA}(U^3aq-JgwGf17Y+HME=w$TTE6T#qd=WVC5jUR|4~SEJf#=0DeLxu zW*t_rZ(d1$qd~QB;=d6X*iVOwo5G;lMNQVoP!u~Cj)!qNDA%%{KORa?pbn>qnG~22 zj$NB{c(_If%T@9L8R5)wVOHGRFg)uYhKKugIJ-O)S?_glvG=)4&a@wUg4BY{WKcz* z?SnX;_v}mftN%87``JTmxNX4C9n4lFelWj@0n1byun6oy%TYH)uD%v|j^#%U7&eoc zKV=O#IL!dfWdkl=HDF%rIMlCC4mLLyDdi2gLT}o(%FLZu5{HUr1KJTw&@y*sOSS?2 zH8Fkzk*4L(`%voNy{9#CTy zWW&34?A^y%@rKz9UT!v|CDZdt?&t3-=@|FUie-nacox8{#j50ft6A}PW;)6~p}z4V zySIZb_*j}@su(otuh72fZuYdl5`WhEQh{Y{ML6?Iic>ZhXKqbYHtnz0Vt zyyQR-dF>xr#Jj3Eux~5-%a=}^tn9?MYzOitIM}CWBZeR2=H|qo_sm;jPyb~TKaPL5 z4tAjK3J1<~bfPN%FE!bTXY4K0lui^K$A9~q*>e64OgZu%PpEA?)|0%ur{ax~gktY1~q zX4{17xa=}{sD5pElBDz(F?0X4wYI)x!{f(}j9VQAnW{?=KC=?kfgRB}%fCz|QhVL$cA zub)yc@tmGkPxkRn>J)Hhh!79%v8i$RKAKv^Nz6p~6o*1j;tS3DuF;lA$b5yy1zH_fA_Q&FVdMt*_=ALRmeQ_yjXlgMNBPtf{Ul=fS zumP_9)IE+jpjom3%R3PRsBM7Pj&uy&$_&NFR&37U9++lD!);bfDqzFG_1tq~=pRnw zei~uLf)7@#J#NLSYt&D0@4Xyh!zk`O$0aMCa*vvO+UQT<{_&*lIFcI22KxjqtJ#Jaag)E}xpCUG(o4ClB|F*{GTHjGtou;&umWbYR9KxOcceONBVm zi2HR2_vi`kt+C~qr`q3vwZv*WuXf@|Q)*9+I`H8bb4e!gYw-JKt#e|M&H<7naM;|^ z>K`qc);qY`>9q^nT8?e4A6$F!!P8G~CR(I$pH`{G-dZGjw`KR3BEh}imkHi!7}P2v z@80R#-L|)=-`sS%U|Y52srOLJmJ=FF@2F5qDYgXhHM$3ns1ns`*{H9r`h96 zSyFFo@YGfNEkjggEYn)tu@oFrDXnY#9?ST%H7#p;rw1Q(BwN~)8GqWfCP8{yljPOU zcxgaBf6XV8c%&I+8T~#1XU%eZZi1wE8pZi6LE_ueLpC-=w!co2*k(o? zO=1MGNpcpL<=J7Q^jeuLn-f#yk9U%6qj%;>Gn4djH_C5%HlHjpOS9D}^1ZK77Sv;g z6*DA8MjGW4{i`{?Ch@A|htV~OQ;hS4;-?Q@cl1R)_Aw>;X^X#8`48k`_A zMkKOETyMtT9n2`DWrpH&)@!UAO+}M1@hY=4MzD_^NN&|^!sOy+ayDkf^W)l&Wv%F9 zCiiaUd{v;1v@_Km~lcs+MICuRf-We8)e7J!*=YA&qSX@_ND7G zv5|f2z;W~@FU!Q_0-5B0=!a>>T$W5b=BCr*)-n?(_<64CcHF&5%xnp3%`kf6JhSlp zGO-%sHEmC`US!R9No&V2elK(3EchB(j~4#F^QMz*4Mq3RU)EF#lKt&{CE%2=`1jFB zW^6&+`9t0NJ7xvwa%InL1v<}Rj>pk3Y@wHag(Cuom<4f}dbBU+!|*$nHOUO>#k;b; zm>h>CJTo7VL+`c7iY6zl^j_F-vapp|T;$P85o4vk!BXJ^PHlEzfQh*FY6mv;cOvn= zhqMdzkzHPX;<3YD))iLC{Kh`=X{G|XpB3oCd#wQPoBXBBOFE@M+>tOeHbvmpL;6QX zl9O8;j-%tlaHS$^qtsYtz#4Gbo!Y$>aky88HBkxXAhMq5a@Y#PL!P64^so1|;^Z_Z zjxNeZ^FdDd`I0wU#7vXV)N1ch$)f~~+@zPst5;$*4cRG^UphMXz`3*_)$)TA9pfqkFU);J{$EH2Oc}IwveARiC~^Oc}4$9~h3DUSW96Y{YJR4d~aJ z8vn0+jtKf!F7ocnXPwCRYFcj_#$Beil3JB&W2yVx$Xwq5V)PB1n4aUnibyA75}22* zXV#U6O6Gj`lMOmwnc^ELo2?CH$1`Ti{GdMOsuBlEGjD4fdCnOMw0!M`*goOV4(f|8 zws0Ko9L|iAa9lEl!8MP1BJx95bLr{fUEQck9CQK9Nb|74y^jqymNL`(r4`wCY^cHe z^2MEO9Bt^ph&xV{=WCNQlG!wTwu|Efq(Y8b>aFpWBj?zg82n^_GEjo}9`$s0$<#GU zjOY3(wc8DcCn=e69)`lcI$#;sG3yB%^AUs`V(J>M-B9vpgEt`eeH^@9%xH{?Ls8zh zalALD6|>=1mK8D7gJcywL+p+|nYP*Z#k=b(*YVyj)Q4QA2GuiJO3@o0Fg;oRq3&zg zO|$HXNRgK8wbKv#VN6XwO!=rm+hAXGP9>*aDF!KHc?K$CaD1E|X*c!gQjL8y&zOUw z>DNnT4&q_4>-`nV09_5RbZp5kQ#h`K_ zp64Fq@%daOoq9ZfPOZuV6SJQ=qhJrQ*gP|C%w<+UmKiNlvyfxRM3wc_Ve`3Op1+50 zJdb|zdsn2^A#RvL+wl=`r4VAw)T_MmH_2jCioCyTltauU@ZFXwK01?BPUdWhTwiQ+ zYH+4@IzWBHSA{n1utK|$*m>JwN^RV_WSLw)S*kZr zk>p~j^5{&mcKw9nGAm$7G~U^W zhq#%s;*S}%d7oUqXo3$pfFJG6@XN5HSWG6mj?Y5c6y5PxZ98B;Hsk;yf*kvO)}+wWV(~&Wx>3sZA+OoTa20 z4nEJ1LgYhMXX1N&yV7CiXlznN6z{S`+WBfcpLt zLOp`nD^UJg=r0f0f2}@C-Pb8M9B-_^ig z%=}Bs#*XH!U)Pf-9nXB&7lGm^5-4j%)5m#4Ee9(G%FI+|=RRcqO>hBpXU|oZoZ#KZ z3bf4#!}3?uz;_@&9utN)55h2UHRn1s=l6cdISh;9kbfc$E8a2NeHZ`Sm9;)K20iy! zG4iYx@%wF<&VRd9i5Z9msDCfa-jvVr^{5kP8hk*Z%bcgNBtX)A17!DNmH3tOllV2w=K()0_QCej{#5o%@Wo$5&=Gm+~gADdn8#>w$*N@&T z_8_fSI$=ERB)8#&YdL+7Wi|4qpGF=#g2at85n}1*xHP4)Z2C`g%4gW*<%WLaU2=h1 z_~(1wQ1x;c!cK-WcPt#%65)8eow?9I*^e4HAA=Z9gGO;^#Tw{~&4AmL9rK;|Y$oNHIEdymQSqfsS;z((R(C&S9o-G&L&SxPAr_<1ttfZcfMbD9*0v<3#(t4xG)-#@^rA(78LX zpnQrnW~NF(_B+i!n&r^=REc{??H)5Aa?{DT_S9ffDmB%InZ?4KgsKzBqqNoIBz1$m zCdJ^GgIH~IYQ6t9A*@{zvbUHqjy3q!-{gdNf9UH|dp4im9itsrt#+(YtwaV z2k)9?^c0?bG2|0@Ps9vVY6UY;a?vperEFO&S$Jw?h)GfU?lDe_p&e8wi!y_fLC zb*`bnA8K^YWbRFI=DHYS;9ffh_p+HQ%zESa2YS~&vd=of{Gy*`oS8?jz#(SoPv zcqaTxWZ~o4Oln9nu`Jt;iV?)fjeMU*DztOIkjrbP)SjKE&^}-d;!!9h62s4{-oci9)WmTS;(mmZyV$DoKl1|MI?piMF6o}8nf zW1|^6Ba*Ph$hxBwy&b{KT5&RO^at}k<6e|%+5PY)?MnKkNq9kvl8YO~aezz6h>CV7adu@XuB=(F!ZjdTh1?j}M25ky zFl+37R;UWmBX0JS?N9UMz|c@gngM^$w_<2D>c!X#+TZ+<)?a#~mLnEZUJ*;$l#O!l zJ>)fW%1T@f!SnCTechXmnx!3R8|^L&O6ADX<6)>YFBZ$A({cP(HX^or%BC^-5;u>2 z<7UL0&sp(!3BOKVZ}B;oCu3&o@Qrxe)^AoEzfBDHiLWfCuIlOne*GD-ICPSkw)d%b zJLoBS8}gY$ABvFD^gSK7!gDMA>>oVkK<#`vQ$&YZr(>~hGjZe14isssmg3>LQjD1W z&8@MxGLe|rUe4@!QCDVM`YkP*ha>a@{lyCU>fh0aRM10ecFvV%<`Crb3H@wn^_Yc5*d*v_W2>O4Wr(tB(b*|>_2|^N)h6xUt^ig z&%P?3-?yHMzIkY*f1na6g+g(OXYo64dh{C+U!EHv>$D0SEJNIrSfRZXvGF3zd)`ma zTtL258xaa~QD)YENkO+NV#A1rmtgO-gEW6JUwXf^`y`e=E{}O;qt$+(3Z2J<3(b8oFSArPl18SVHnnuwa%Y(EH`9h5&OB? z5iXgTPW)73fcvv_EbYqYY{k5b0M;+OdsqKsz##UC=amlT+-PK7&L6q_JRHZy#G!&S z9jcRDS7YnQ)MtMrH-a+(co#M*cLsM0FfW=sQol~WrN)XdRPW36M*ZoQD%n`|xQ6)O zaEURD+Wb&@1E~9ZT#7xOvaZ}FFLdEC^B;B_@Q`==Top3~j(CaN5Cz`#)gieKvmH8G zQHr{)+9T^r-Cy}~erp(RM6x!RX~lt3e4fqpn4Ha*=GNZmH=H@jrRf9d^Yn+{A$(80?LokLo@8A#{8qw>r>5h-=JM5AP!~;&9h@}^d@5@sMl7?y|g!}7c z1sw)8;OoQM;0k-k@<%;oH}RHsX(6~BM~u2N_w_CMRQ7txf0@-a=j*WkW-LxDq7KfF z`Iz^;WLixH+!}>qaW4aQF63+nVg^e_F*o5{uADW|4>FOtu9J!R?r>n?bx$#F%9SzB z5KJTnzNaO1&}XSLec&St)#TH9QfKGGybE1AyvK0C9Qm z#>F~*QpPV|!aGx^Ol*AT9?sy}LvF-TTf$qoq*Xy3^u)yrY$vxf)Pcs-$-Z`1z`bq= z%J7`I&iZU)ayH7ItReT;=1I$DI&5xhz?dRdto+JZ83WZ)_hG&iTq9K@vyjq{vRJ%Q%*ttnb{;&c;1E*k1t0L|JqvOm76R6KSHqe zt^rX|%pKtRA9~PR{+Y@3Nv!Hm73!A)U_<-hOWE1f&5(QL3DcW0U~>J|BG59=D9@NV;NE9Zp(yLB?!7S#cwPl7+Fnjo^MtSB*?7AxR4GWuL zy+nPYRiVwR6fY^mRB#LD^8^!@c*Hy))*~TZlcZa=H&$+pLa#PvJRWPuJ?bTAO-YbV zZYu0)!o0kx%q}WNUpaf=Z%q?rQ6^_vj?&{q6#LUJ%o_4y{@ROulFeBJ{`BA{ji&D4 z5dXad^ULTRxn}f1+2_p5TWG@SqjoH&kJCl%N3@EXiivv6Xl_QKiOfTssnCw8W0dM` z>1FM%M{a}($7+%1XB~As)-3C(BYV-282LT=SEKEiO+DR$%|VPpI~tzu7pXdb@oBV zBx2>ms9%^*y-AyRS*K-PApSHtU*EVN<<>)Bnd^Td#C+d%= zUn|E9@cALE+x})QRjvtlJ7%Cby&4Z~%>24T4=VeBlts*nBA%UTP-qhmF|(_J3QbRP zPSYzBrsZWoz0-xE4UF=!pavbsM*|g;@a$P8svUJ<+^v1`CD#u(=IHT^_|Dc|)KKhm z;a(MLXPz?q+#Zd;*jv2M$-pW<7v{8%m*COVg;k>t^qL7%b~D$KI;P(p_lbFp2DNH( z-pF?9r_wW!Nd0VDtWkDcQDJ9_9^0rBw5=xYK1QJ}$eAJc%cwbPjl9BgW~HCCqY>Yi znOrA^k}8z07mdwLsK-pSBlNQie?pB?;*Jmg1VuqhU0Vxc^Q!GGxF1fG&9hV}V%KA6 zFX~dM1JRyzA!k>D?4iD|>Rvs5M4FKGE&~gwU;EI~C`tV|bMkg-iT-4|5;&_GVW3aD}##d7lJRr#A0tG)ztt zTF2V4-iPbJCPO!UF|VRLcup_zCX*JlA@Sby!2m2=c^FT<>giPRA% zX274dw`wQ#aZQ=G7Rz;#Lfs!Rp7IM_SitA;kMu#aEzC;GBd^km97iRE_SVlt8U0#? zSFh*dS!Z%BTbbp+_0zAKNnS?#Fo$w3<~KGWcoO|f^xDqm`nkrO4$t?|__~GM&Q|;X za$0Y1-7Cv-RY;X+Tp<_px(M+luID~&jZ$)v8v6^=d-t!2S-f^Uq2CC5;wAYBHB&st zzGibj#@lgvAp5=ciL#13+9c|!&lfXeNI%XJxI!#5D_)Af_90%y^WiD=l^v+pW?kQ# zz4F%P%uiHsee&mBMU1W5D}`2b(j>L^@!V*`eN9X^yrmtNJ1Dfpa#E#V8_q&2LhTga zufpBg1Alj66m@xB8~Gq&aTL~2Kiju4UxzrJlPk=uKRHw9bredSFmXm7^U=5-LWjqT zVt@u$?@+(2Gof6a4CvJKY*$K@!f$-IAE{&AXF}QIe0|uH#11q{lZEW#mq%l7xEXF! zIirR8?!MF`KYOggpmv-O^vHx+Ettp8btU}xZ(JugcSNJ!CKEd9Ie#{gxaF02xx1PA z?$*&Lbkl^-I-c`|724pQd*$j}uAlaL6nA5u9P!3QHK;eNpD2Hpdn1tjUSqDGIW4G1 z=Ig)WSAvu(!EC+CoV{aYo?~VP993O-);L~*R6bbRfj)LSc{)D7=j(jjpkC6#^SO8{ zJ#M~azQ_t+@%6uKf|dKRI@jC( ztDdn>=;`2$ibGDX%+0Wz{I{!Rb410E5r|9TT=SvcyHrP{_u zryA`z-0H{dVyzDq85vym*Lus8;6s+srv*=+y5W5~r`q4G>@TiZRNl4I99~7!&fS|A zJc{dVO3P%ae90_GiI?(w66NJplawhyZrYe62dbIn3+L=K>y;$t8%C+}Bt=}4O;Tj8 zS$eGU&1W=UYg`{+XOMsG0A|d$r5|oB)5N><=E?ZIk(;LEWLb!XXrR$RW3c2@qQZYLC$(QIpsCfAP(jXK@D;257doAk5#9mkzAU0eJhqaGqL3 zsF<^JhnzJ(_hd!Z73s|AO(oCm;mFB%MY65c* z?o-eF-H!4N>_~2x30Eldb*MjVLi|HP{J!iUW^80;V#H*g>j!yf@jhPGh+MY9j!m`i zVNSa&bO^CyPq$2LnnmpII?t1Z{IkQ3Vi*SJZJDU@R00pL1OL3d3Mx8 zmRsO2C5zXW=D$2-Zq2$fw6DKBJE)QYV>HrYgolj2Qb+u3?$R;VU*^_oBpts7%Gfzx z()68|T$|}BJ-QP+S15qCE~z-uCAt5SYh@;5i+wJcmE)3=Nz_cu{Uas%B9|a2b$(N1Yb7kaaa-^KE@M8B5v3e_T;7hLbDXl=}JOy47 zfA(Zg)i=r|SA*zn4OXJ^d4B)J3M4oEBX?WnNe=te3CvEMxmmD%if_L3uR5{^IBLU4RnDE#?(dx*8f zq|j$pIuw=0>yR&;UEv5pk1g~HPT}mPOdaOd2*d4H)IClM#oGJqmEW;%I?Oq_bLd$k zr=qSFhtu7ujam_l3x^CS4bDJ_X6|A>y_MI#W{KrGWabQiMY6v!(qq~r!iu5njV6s}CSy)IG4*uxTV};^ea|Jpxk8zcQvy2>YXMcP3c{avR zVdlaE2j;Y=UU7>9$3JCrUKZzFRiy4Qin$pd-lKqq9?f+Q;9NFwbtlZZ)L>a1u$`q| zaTd8}FXlyUaG*VBn|ul)M-@m-)nNy&hdc0_eX9@g{&`Iu=s(Yar&}GE&YXTr0gVK_ zt}p&$RPv{)kDSo^NZVYER6FY@Pa4z}Be@Y*DV3C}?=AiF0|hTMGN87%SeALnlotM? z9_uYt26L9BkFPA<;wg)kxJ%AtAGtSx8pqv@By@ncJe{YO-$!doV0lkz*~D9}3{uP7 zjs9Zu^OEY*>PvLETK4ZFR&Z5;i;WbV$B`$M9e?Com>cQ`a83vReZ(&2BW2{ttJVr^ zE1oY?xtH2@cgav{6sIyX5D>+yo8x&eJfAJfwq-I9eU=P;BOWj<;*+Ro@kY`rSg2 z`CA9io18fvti!mBP&_FbibKUC5YUDHJ~0GALv;x7(_!=q;#=>jp)AP#_KsL4ap0i7 z%z>;!tieM6@Gt|iB8Zz5-T+5`=922;aD)46|5@r9xervw$k(kS{&U=bx}&Hi*2cj) zkn=8@8t{XA^f9raL7faZaWxj*>lyIiTr3*YU>*nm@An#JtcGyzm^Z(Nj#|k91`I1i z9b*`^8B?hxZb_c&EA=dm4Cq4*O_ym_>UnI;-?k!@8B`yqrepOzD>}8}><*O`GjvuQ z4P+K0F_j5Lx$lNsvEv*0r^8lU3r@$`p*HI6IXBwIeeyURZ=PE5*SB<(e#d>A&bc`J z+>XDj=-!WW@+PID!HINCpGzFOCV90ZHVpk~#fez@re|?aZgQY9@zQ^*anJniKstXn z7>L&dIB|DdHk_%%{wxmM{X-q%nQWYNIPm4BgBY&^y57t(nk7 z*Xdv>U;Uw_(%e3la^q?S&stkKt;VNSr|XREE$ z(bQ67Q8~-~$EM)x3#+8vsB_V>(|9BJ^D5t9@8wrdEZhFrGWLp(rA_|}mg#>VY}KYh zx8N!h@3pEnqIFvH_BoaczauPBktHmx21HoK54y_8jGvYo!4q3vEjj(f$q!#GjS@}r zh5Sc!+e9h|bm zd-!609deBcYG{Y5k=ISdj6G&}J6SJMAJVZUJ#AiUoKULqHC=^GyXcSM{EH3j^}J0Q zoXb;V?GhivrTM_?AoUyW)O5@wesO|WQJjicCbJ-yQA=sjW96|J*r-+b%v!NVb3Gac zMZ@ig9{ze}Sbd2`hrnnQzpF?65Mmkg$W@hz!K|xMxKfxpnT>i>b8-%K2lKaGFC%KtxOM#=9cY%6ER ziN(x$cJ`Bvkq+eojF<;sZk8%oRY(wnUG9PVqZHVn($*9+0o-J^SxOoHlAZg zEvp?v3T2{hiA?Nf4VpSE6T66W;JF<=Ggv$FExzTX=9LR7X`@0 zm;TI^Du_}m6xbZ7z!qj`&wZ>w3^gLJT5&iJ_GF&jhje5%W=4_1hDc)lk$0JQObyy~pAUFflyf_GI&me! zL2RX=Ox)@(@5u{2{^=*%TKLJ_c0MxXOrE$!6hNItZuq$(U*07vP`Ma05)XzmCng-7 z{^+o2QW*Ll2*a4c%;ex%+&wrBA6N64A`KYc+yHM6p7q%_c=Nn9Eg&!Q-HL?yXK?Kj zXHai;!go98Lsg~Ln$KZ+PfjV#iKO}Dp?-Nw_1pe3ZvtmZO>H3gW7P7tBr~KsC{UQ0 zCtZ0DUS=k;UnS~Pp6JkM9`7^eZQbn|2ImLfQ}Qy(O z)+Oc-_M~3VXodTebcF7s9;D3~6#nZ2_D~mBpSsVwC8z~iMt#b12Le8MOHY@VY#-q- z_m=xf_7{zebp*)oCQ1xFPVYjL8&FLNY3v4tn;ZJ_^%*lc98Z>#*VquoS(IT&_N8v` zAT|9(;?V6AIikk~jN|WD?oxX%)Ks2lJ(ohhA=ZYz)DK=~Z5P&wdW(b10Nc-*;H{k) zaf5osNb)Izn@CUhK$$IZ#nDDKUy$i5q&yN%@)@ylKsOlq-Dk`I;}@USUuFN5%OhoPV%Tk5W^aYu7pkZp8oA zGkL$Xb~j5$>MmxKW=&5Rw>ldvx?3yR{L1@$Ns zhPRn`yD^;2bCM;y8g-w?sFx{lK&qVQ zT{zB{xr>}{)J%har)W^UJbj$J>x!px?&BPKafy>hjEcc8HSwygdRPycP`N)}lit*; z4DbteCDkQoG*`Alia(v^CYCP&P2){A*$Zu_NeA7YKvo{rk(hp)ZWIP#PD z@d;nteeZ{aRrHKLqJHN)^OAX&E;*&ggiA5hsU^WmT=K#|&J694gxi`V{QH64PVxgy z-|-m^Q&;~o6L*GC^GSV(atFURwXm7p>0n-=5`iwTe~I6kboo^ z=a($aJ{Tq8JawKa8eA$uy^JU4a;LI(2xH#Xcs;<{VAN7Q+RbA2=r=v~YnkEEDhYRv zGMjM%v1;Nh0UgY^UN8ysPf*)*kZXrJ)byKntZGH?=iix}O`_0F;F=kuQ)-pO*{AZg z>9Udfrbb@U{gW5D;l{FOn!of6R>?AQjKkdMpFCa=4Hvm2u(}eHiYe*iQzE?$^@AI9 z2#yNFttnx|sW|JtS{Oe6LvD8j=Os=yAaH9OJoA`!!+YZp&%tl=t?=c!_^s3#H1M!t z@I4#$4B;$Z=Kb}o&kV#6C$^iN@XXCdy;P0djn~MD!a>qJvXR`r)IhFLL%60lXIA!f z$;1!^-k%_@(at45ausOf3P)PB4sUrT7E0G)=ocNbsUd9sgr29p%!hv$3tMXgjvq2G zqaqIafmT!xw;|}J6$3g^``(To!5U|<{~ERCiyauZ#)%))ci;2>fMz_ScmMJiMUe*5 z(uvgdr(El3{p3zQxO>38GYy8~~TIk=FyRBM!2dRc+IJ=6*^>knPSG4edKeaUZs zHR$jp!+;f~+3(m5c+Q?ExlJ4~IrdS(Htg=ga~U?Y+Ga(Ci@eVQIJ4n0XWxZ!rt>5x zmTl(T%cV{{EKJ?`jRsOp=_^Yj8Zc)$K-}YkWa--gxk8^phPx62uJAQkszm)uO5|7- zs5v77|MKpt^N{|xEZ*@edDk<$YvPJH3|!58n;yhVyyM_sYXfe2Y{1$wHu&}7>2b_Y4hnO9Tkwt_tC78$ z0`U6fhVA`wWsOzIxwvkq?ctJJT_WIBoY~Zmbo9LG_+CcfR3*M%tbc;?nAem*O~)SQ z+KW}V?r{a~Vv8E-a7vJC@TI8eRj2M95U+g+R}#GYsNXJQl`{G@mP z0QoeqvD9UT<*9Vep8lqi8w*&A{o;G1;S7_LoRM(PCEL>#_}7y-({~+qRqTtSX1-sS zId7zq4v$a7q51~uhsf0@w%LGAe6Osl<4`V@IhxetHtuV~#7WHd8e)UJsf}1L^ZAQ@ zKqBvWtB(_F3exY{p7RKoCrQsZ>dpHckod8wqWzpGeOjkT&089bIix|q8_d?IPtD#Z zHBg8+HTU*CBeP33QHvi+ogB}j%#%D9EoQt>GT*!yXA$PnXMTx3^eW7VC7#*-KDB7a ziGOnMFUn%JuRH5xa?VK7&P1xjq5weF%Q$jc!B-JAm*-LH$#_8 zt@+#}ESf{@po@8X8fNB>Cr7+76U}*7RC424xP@5|M&=8z=lnHlEEk+6k9e2bv@B}V zID>n~O_MAc!Z}XNXp}=Ka)+5Roos5%U+M>Ejt1R2Q$JXhnEFTN5N1Z>RKaMJtQLbs zo-tTilR1q&^*Ftf**3432TweC`7QeG6OwS@uOw8?&BT_c%=a6S31bgx_c~{xgenv7 zcqaFvUN4Qlg+q;aF7iy=yIP^$m7FYHW+Zc#;C?yu(Ihu^BuSPzSyFAj_*jO0+CJ7D zi!`9O7Jb>< zD|dsLCw!keLF#T2UT5QbO)ojzfqK1Wq3Cj*o}@_PLY~=Z8tW~SYyFXH8$7MiiW@vMq)BsiOwGvRL7EpBRmgzbsGs zBN^92q1#J+pNAD|Ts$N8SLa-b9BDm7hZn5bPj;hDuz~}{!|KSV?=ItflD1o+ zzRPp8VSOt$7l`k3T<&8T#uCADC{W%t@%>FawzWb zj&E#8$56g6`V>V^dA0` zeWjJROR_pLuk8%`ZaaI)OAcfVV}8FjN4}Gj*f^0`rmq!t{=E7?Pgy+8C3RCnnc2wR zW?ni1r}OzU)G}dGzU<=rvb{C=2I|yO*<-~#@E1L~n@ykT|DaASlHYgZe?M<~m5j>F zlfm6WFq!#!x5xzyWIr~1ho^)wL!wAl2ux$CJFCw=j`#1K7HT=OGDrIE48^Wv1{j-J zG0u>U8w=`*W{pe6aa}EM9gCIysR#T?zw~;wd zd5t(5#=V|gsG2LoRu5SUglFSUa$Q-k z&6Q=*p*WC6j)nc;*&*3@YW0<}2I>ua^@gq^ed}B&_DFga`npT4qPg<&Z|YrtWu zeHO$*3w`#H+{{1ns4IW2=JaB4{k$c9`aZR`{Ho7+mn5QRm8(vr$e!TwTG{_l)A{?IF{Mdh{f%boD0P7+c2u0EFY6A z)3$`7wY%Yexvphq5(A#(Ek{1)$$~Lq*w3FgOlL*8ZtrpLL0!4PeY%Quq~{*yY!0(x ztdsiXNN)*#>5@-HIUm`VIgh8Us2b?NDekY0e4dIq%#D3b48W9*bspI`J&ZN<>U^n0 z-T)O?d$wc>Lv}W1p7jtV`3j9M^{rD`pYKaY(>I(8)UJ+9oRKSuA30wkpZdNtX*ff? zde8zdF;fqCS(qadPmJD+oYPctM$|Q5OI2WyS15*Tj)jqY)-qzy#s15on8H~OJwoxL zya5Bkt(fw6Hn|~hnK#NMkvSpopFj>EF&zc&WW(CcQ_Oq+NGs+qOpY-id?9mG#}MBx z;v?>VawUFdC?00<^6Y*~j5D@#v*XX-BJ=ElWSRZG6Zjo2At-48&i|BJHFMEdwiV}9`?cJ^~^XaYK7~C1OFte zWrOpl{7MVOJcR+Cb*zYZL7j4NU2*u6JAEF4E!C*YEr!iUlskC`J5{)LUb_RVU|N_8?L@2S5Ple zI&ASlSNCY@1E^~YWnMD%GRw#BlPP;tC`nBC^)vG1Ui4Sjqdv~DPoC9Rq1Qa(wXAto zf6TzjUJ7jidKrD0s~D6_ofqqmCnf0FzU{(@-NY?6s4?k$6h>4}LU=3Y&`~#6b7i9J z{N;nwv!hUdv=Nnta9%Kb!&;$cIX%W3joRqRvvLkWIqKSmu|C0Gaqd>3jyVd)Y$jZ< zO@AZxL^CsuvSyYKzPw^?+68(w-`Ej#IUfzuiQl(jPTYGvI;zd6+a&|%D%00ToZdi8 zB8;`bP4=!ysTn9xRG|$^Is#gZK zEps8pmMG);tMP9adNddR=drgVsJlXYr=n5xPubfSkHJztf7e$TXg)!q^`&kuU?j7t zD(dlJzlnDV^JSG&rE{nW+0m_Qw+ zE(XQI>CxXxk0JG>1!tN>(_D?Q9reg7L!HqS>iE)Jxb)sAGwP{PXmm8zyNF$N$Y54A zJvc3rMAcV~CxxT2lJ8^ta68^5x#01MKkt1X)OXPL8UAFS9O&+Yzzb1`szfa80dqnl7223w zK0o!jtD~dg_+vsZu7}yIMT=#|%ZD5vY@_bQtuJ%AhEey*{$@fS@Tu3r ziOS?$5bF4lAcGsI5tsP?k@nS5ZEoAQNvXTLAVrb@73wYRnyI@$fO<=N>h1=Fx+_w5 zBm#9O5U9Hms8F}lK;4VIdGBw$_r`etzB>k^=LSeZzWwdJ)?8CUaf>}v{ASjdvzc=p z7cafLyJIZpBzYT+2=b(#AbDOck+EW&=!O%EsjsbR!lla8ijC#<3OOKO$fHco3B|(Y z#H40%{f8;E4=%*Xt9vR;xl4ZB7J7nJBIdn7_jCB!_;Bi|L=ZkUUwX zkva(v_>eDLsS5Q)lWmxrLBGhj{W6^E*{5R|n)7vsFC-t3yx<$=SXp05jp_Cf zJue-LE*GL#>Otuk#TgWPpiX<}A5nyUg^>klt}@A*01x^*g`rt7os=)Miz%_Fyo;f4Ps5$GTVkx6&2cluNY)~ zt{PT7^-Y}rG%rYpofz5hs5qJ3Mumn)nRg#e-$@7Zb#4~IG(AS1Tp?!pA(Wm3MqItl z-0-sGrPhj-Pj^(<8L!7k^64h=zSFUf8;Kaf3=PJfPw{g8gt~6Bf@Q1{tl;9#+T62G(%JaE5t7)Ei%cCi8d6SaJw#(0@%r_b+cdgHk> zpM4$kqsjBF&gZZCh~9b~!mvz5e-cmTCX`lah2f(|MMBM7Phst=`zl@%8JaS zj6^3(?-LK&wSU~xGUU=BU!6W7sr-W9mY~RimWFk&`+lrZKY68YMAF{THp{{y|0ZR2 z?$mZ+>4la{chW5<%O7a}`+lb7Rmpef7Jo06{A%?|%hWf;+OIoO#Ztfh#-zc2KUm(T zeYGTJQ4gN+xlmN9yNBvC_Y%S!(jWd%{eG@imNcal1(t%r?>5 zFJ9(vBF}v&XWT6ea_4Kj^b6tr_KBXiX|a;aGcv3~jASmOuj3wrgwHU@h2us!aw=AK z4Pd5V1*44Js(~x_otE@ozQ0P1>NPa5s>v(u;|b$-dNG1oRg1}AoK6qj0&)|ZF)z@E zKD#`7gD>#Dvk^}Y^}r5#&i-^DC$T3rke|s}+(E8>kOpDA*Ivz`=MMdOKKCV$UZ+8E z-mk73=-*g^{Kg~9oPOeo(YrMG_a*C*iD3xYM2zaCo_;&@RxQnWGS4vYXg!oa>A_k{ z56`#s*m2h5dL=!1P+|B`QIE98p%``{47pBv{HPR;0w-o{kdHW}kshNr5Z_+FS@xVz z>X<{}QH)skV?D8ya9mkOjc8C9HZRko25X*g#ODv3U}m*T7&>@x?;yT%^ST)a!p(4d zVZ@dx^u$?WgnLC3f->n}y~u=RW+RrW%}8#@d_m$M9fQqCy~_;hIVQa6!;Jb?oMZ3e ztebVytyAPEcIWrFm!CXkLNb5eV;p&rZTWN2FdMa zJLGJJS8xVgezKO@OFwESa<13fP^ToZvAdifbH+62cLq*rZOG^S`I~!2-y@muq24yV zQwElBj^K1L6X%Jcg^&~JXkjhFb8;7Js@x|wL=WNInvXp%%lxGZ8HnD*z3VyokvmvZ z9LM0BBxk<&FUZQE`D)mF0C6l_Q0VDaCu25Pk71)zh zAf1_wd#*hF;(8Uxp03njO)8Z1NCozT$vRZ4+eBc7}*tHgjE z`O^MWp#-&~4y%O%*NZ6VZBiiL+9?sapIj~CyKWu|45`g|0X1K7#h5MkvOvP=Be!t4 z0xlgDSeVRNxFa9S^hdAdoTvJ-54_`t=;QwA97K(qRfnvjoN+42XWUG0w-|q%=|dkl z_BRQC{INw9z?>R?be}=aRDVCr*~koP3-h9O2H@&hdi4i0Yub%IK^4i%Ivm zB(f?;VZplyc+RGGTr&Ib<@|m2&)p;nKb^?m>JovVYEg)p!nr_s>gHfS%Ck4sxh`Fz^qRmX^)jp@*t~q%S3hEe_=3wYVJF*IyO^{75h%7!y?6uez8;Jew z$;P&HJNl_|FqgmAOr4Fy_u07cm)|>J$H<%6a8YQ888?y=i7J^tL@jfBc*&DdF5;nV zD$}nulzVr`<#lA%GqyM4xYkvAK2u2;^P{sb zxXSiYE^;ujsjOVtyB60=_9OY=R%bM`2(ZXENw{wz!%~H-#c%Rze7Krct0ttRnAk7x$$+cev^671% zY+R?rpjQPlQO6m}LIr%26fh1fkhj|un8^D{(JKJIj|bojHHyXW1fXP)4v8ZIunGQ{ z)WaVmeRU|Z${(di^06w+i{WF>#s@H;YQTRzr2_Wp;8fEe1AY8apSa1tXsC%45k5vc0wuKoh`NUm`p%m6(ZnQQUKE!et z^Pcf^j70mR?B82a%Q-I!x!%MQiQ76|CGVwuB(|O>wo;ECB=4Ca7DR5tFlJJmBj5L1 zB!c<%dltP=|D_jWF>-{5ko!0-5|~KbqFogJ)pHg(h@Kb;^ustyj$=pac!hlAIlMP} z@G;_S6UV0_ZFwqZ_SDZSQ&Hj*^CE~*g_Y)7C!ggYJx+=f8$7s>-Xd8ks8cQ#7fX`I zQDBAFJuA|WrDDl3em~g?3`s>XM=P@GlNZyQcwZmR@Q4?UqjtDFRgJeUrC>kr%@>^U z%_dIh#~Iek7vxTsOu>NVydP&Udn}F`R~z{Wej;`{!lOS?&Rms-{>m}&WQ`&V1ij+kUB*PK%0J9w>E58%8Baz$vq|Z)TJODe*F@NP^7R zL~S4Ivo<<{3k`BFMT z6v1Zc??G=ybDUgQl|W6QS&lle2G5U`lw)yHE1&wYal{bz#))6E1euyn-^L|IF(eq} z#G_c^!5;X1fwMASdTwX4_B%k#!jCzjuQ)TSqDDg(HOhFaVCVOoXAyU?s8D988eKkX zQ0uxH<)^ARYw#eqUWIol)VP$T7Z&k{rQV!L{_6?#W;N1RYjAIYhWvOH&M)NGIt_*| z_QVS(4f)GnC{@oB&8efw=f6eRPt3YY53eSAYW_lq(Xt*SmSml$M|0MSk(a^{Uzc8r zC8>3ZptmAtW-ZOk#&qC(@jP`e)Wa?2?`rt-M_ZB4Q#Kquy_g+f3q@;U7FUUfseA7odJO#(isZa-M6rKs!yY|hZzz604#V!_Cd}qc?#BZI?rtNl#G0>1 zJiWDJsdX)5hUJVArnZ->n=tab5iz&e*A6$L z*gkqTR$?zj+-dC{YU}=`pUYPxvNjp9ygB`*nv)+nlyk^56MDKB@w^E2q`Qqc#@C8g z5V!Fom*#l}ihpI6W(@N*I?&IXe8fT9nQM1A16NqvZ8*p}l0BbYn}KJgGBJ;jB@Sjy zxSM&hi!*U>mJJQtW?L9J; zO8zF^V585soqWg5w*SLt-0a*~jO&=qo8~SjS81dLxrDbk<8mpjM4dnd`h_SkG`CR7 zv;OjV!hGfUK=ip5fQ~f>p@w@9o@WN)^^QP#Ek-eOjeB1<{TYc@7v&87YjbkOf3k*{ zlL~X6RP_48nNLHW@sEi?tFlpPbq>;3@=WHLedjzq2z+x8V!-(5AZsJ#&Gp_?-*ftO=Ytzeja}=fy zi^AzGQLHVZi0yF?e@AZl0oE3$xi8jC!>7Ymq`9Y}OdWbhbKiUXhV!)6InWXxkFC!7 zU<|!vQ=7={d~eBcQAuU;2m5qU%dbh!@^Fw6qcZYjB+c)_1$3la0fH@XigMbex!chF%@q(gEM8Ok~dFo$PLy@ zZp5rFvhKJ{PB?3tiX(C`s0DMdi+{j^>OSK8Q6nF}X{0SPqQ(V#${CeLes@>k&3yVM zFIJ-G>LLh_D3BV{ieT!RKosrG45l9e7)Rf&J1qmLsU_d?F}GPAi|I3jW zVdB|$i}hS1aveNVvF>atM&$5JnMG`UI{Az5=-XS!4AB?ai1sEnpFv-TJB{RLq?`13 z>LtUkwve%op0fD8r#M|Jlol=M5lIe)jl7U~2@d$#NP#Eefmp2%z*yG4l{N-plR5x< z4+SEgHR;qR}>o(*xF;ompQx(kpuu`LCVG zCvqc4h1crUJDxRDG;-sim+T+wAvagK$>c98@%Y(ThO$R+%2#5=a|Jy0N(9@K7`Z@+ zedhw;dy*bkr-JZrgMs+HjC0pgIyB}CF?eefZgLGZ=@x}gzLBV#5QT}0Q_+eX&*o23 zQH`I?kiltqTa7jHnrz%F!+a|>J&ZX=IY*w;zJ2sTsbP}S^slSkJYKrHnWe}JgD8nB z)NHQ7OYXUqlF2vk>`6~?Z)huM;8Cc@r!aE9bII=xq`%dgaEvO#d;;!48@c}^wlHJk zUV6!%p#SR*;)Ud2Eb+?3(mBLsT4!Jy@A)@xnHfxuUeoWy@5wV5--~ksYM8qbFMaCD z*KZgv-Dby&+Se#W4;UppJ6^u`@Pvzn8phsU_@HfsSqGTy+){;RzTtQr9ge5d=}WXZ z47Q%kRcN4xGkf973rz5{(l?3yZ{9ENncPD|8*p#)WiLBC6E*nWTK6M2C5=5Vu`|m) zg|;Ozx^;D#14AtN^Ct2vi_mLur&)%O>lx&nAg3-fM`gZID!G$S5TM57isa&_d&2RB z26r4aP;k$mF+Utb?$MudgC5mdhocwqg~1cZIX`T~fy4A1{A0$)T4wzIX@cuaa=giL zSe9%eU{ds5;=S9vhXO=ftz%B1gVG2Uc;@I5yvx`zE&PX!*tDbe7p0?B_BNdKHC>l1Vc z$_qpTatOmz1IhUgfIf^l*!huoKA(QIwWCm)=hjYs9Un|T_=~9+$^E$wJz=*vq+v`m z_RSxdJAEM=<#qHPd`0aM_v&@5(OnGmM!f7Tt6dsN`R<;Qo9-gF?l+Pa``zVNav?PW zg>s&}y{*JsYSmKWN^qgPcMHVgvjOO_mp+j{1IRZB!1!-|2qu3qn`hX-B=$8AqwuXN z_vg`(_|lJ`N8eQJV6W2UBE6!7y+tQ#1#0AA$TRu@mB_&xZ4Npf&&J*y?$0;9#rGd? z=|JDXUF4shF=_-c9#UMVL^tls-oJ`qNi6Xn_LnJ}c%~KT;CxSqokN1Km^m5?%LQV^ zd1mPqaDV2$+&zLGSpB0ghv)s1_B`kRNuw4a6;D}fj6KY=b!{r1g;FC{B?nH$$Z2ew zgUs2?YPe1=!`2)u+TkWk70fJ&R*U=TmXi8jEnA`+OVfJPz}};`r?V0{(F*n}_MeYf_gthl;0^1bH<1`$k3Nn4s9|7^;r#h&DF4}t z3*-$hKE$=t-imp|7OL>P>P9`+RweTodA^srN1vWI?oyn7qvsxLuY)J49F7}vn4#R?4DD9xg*aClUDCwb-G~Xb=v&@|Gmd}^?(fX5QDtHa@Aq=2 zcy3*%pK!WDTScMNR^b01Xj5plKFqsHV}@J%1bLz2?0W-q)h@?M%~PK6{pbbL4-Jm5 zrLS-=HBPZ7+HR+}-^y?_Js6HL)55Xwsh%3GP_)sR(T_F!tSCp5w33mgHV-exT51D(GMG*eEmim}JfugE+NJ zkP2Fp40BAB>YTl-9m7^)g}onF;rOnK;V5@KPzIR!LstPx`~y z=kmRHDYQ4mET={qC03mv_iM7B{F@+q=v{JcswY;jQ)3%zjQ{xQbUo*V=XaThy<3mh zoB8_MaBNA}qtO68h6L-OElscEh2#??^56dSJa#2F|GW`8>J?s%rY65`1}5`bMO@`s z+9Lzy3KZHi{izM$Os(2)h4upYUZ_`C<(w$9=O&1aJp3B34$02*N9em^mbXhe)7Ywk z!yZr6W&U;5ZJak$_C!zmA3o0x$DT{{_3RXmHYs6vG?jCKWeFH&qeg8IeT6H~55FOM zDb0)5+Gx6mJXI2w3@u?_#p1qv)9#m-0l~!t>-BoDSJTLx|hq}DKNhTCE zN~uZ)sYUPOErsOfIvtg-56G!3O+IC|28E$qKV!JQ*OJdjzUP{~dh9tBjyj*{H~%qGfhmu5=vABy?rK?Htw3ayAAXl$Uh~ov zRJp*6nf2snaew-@$PX2_MbN7(1*eFImKx(MEx5POZb>cv03uV)yIBHXxNutVlN01`l~UT!D=| zLzeS>J{(AV%EgX1Yn-I*0rCVhh~XLNOE@qEUnbd6ceArJwB*b7mCRb%#Qx}3GL8~| z`eRVZ+A9U(bV7$p{`7@>k&MgF?1)WkC})}#%8-tJ*cVJZk9+;|p4rH{;wm0B@}2k$f@k;|EtoVB>b;V?4tx$JEk$PJwu{XRDVLfuY>5cl@+t zS`X$?5mPPmi~a*e$WsgEURg66_~9nIcI8UYYJW^1Ca)*IugMDHUi%%T)~Et;-RO^w zha!;MGX*EF65l%GD7g&^#Iw9VYVV9hpY6%04r0+c&N8nUan`QPWuDLHaZJU^q-=cV z9A)>_LMhXbe91HH&6-jd$mYqeB5n5nmeXASTPrhndlGrRSL|qhl-?b|3iKJl=h+g8Rijfdmd`U`XFX}_ zu0ZE%0qDTl$FpDbqYTVOlG0616Kj}e^@Fu8d-j$on3qJ{GT%wcJ^w37vzXDw%K_li(Pw|ko4e4unnfINJJl4CsFV53nuajE5evrp^Mh6Xfb|a@# z|H%8R{WZQW^Mbd`q^^|f(~}r-cVenp)f>vhx%6Fq=7+QVyYlia&i{I$9gNZ-bw z2(BM^VOEop`wsGvStpl?_K=FFa^-}L z-UhtB=a!M5ILD4Y+tl)UwE`^~_~YtrUSH0JN=Mk~tL`R!p5;nwXXc5M4`^A=nUgE| zq?;ScB=Qq`^weR~NaF9im=Au|j<)uOGN&E0rB?c*WK+(%dXpbIJR9}-J{K*_7w6Od zDC9n)Ab#-vAFkWs&QfGqzC12Uo-#iluOn9U@67eNTO&1Z{FO6#0r)YO{KslmG~)g+ zk~0_&)?0Hc1`!93fZb%p=o!p+-t8_1KLwU8VxE+qx>;x9U26Jux~Qe+pWpI?`^=`> zynpA?>tii-j_eJ(uP^_$-*2Dhr;k@n$Ys9Ha_7#K3 ztJU(p-WGtr?vZ%l!#aDmow^3{XVZSm^l%-@_KC!uF{~*=ImbHQP$m?ie}#^9a|vcl zJWWCMlkaijzLTVJKM$#@L+GRkD0u(=-9_Fm_p1ea^TgGK{<$l;Z*W~XwaUiB9o3}& z^gNl)^TMwTXNmsw9Z9z1rK_`;PvlGT2|x7Yb+1{8vj(Fb`-zKht*6FYtsc2kr~{vz zj@{(%RA#N_9z@?pdLjL~WW+`f8;W-#Kjnx~dR|c@@=z!qk1h8Rg8FT%-*zHjx(znj7tI(a~zn3EpPk&F6XDm;F6) z>#Ns|_`#n)w7U>psu|_^UKOg>qvmA2i8X-@{ofbjT5h}y>O%iJCG#P&jo4b7xrpqS z>qZ;p_YW1m(#P$786#G&q9(5@`EF&*vaYd)wH|$-4jQ0{r*|{|t}YMgldx3<-^t7u zE>A82aoWFC6xy0K<0ZJVJI)*mLz5BY6&AB$?~+39Pciagg&Hr&wWvbwLFXd$E1aRw z-YsvIn5QcI`)XXa>cx8Y$WK0Y*7j`(?CvorY= zHI3*}k=c-}O?33?ioB{qy(4;<8yRuJi+Qg-iPQMdSCLtuUA8k<+Qo!9rRmSe8gIa% zIMMXuyum#bwTKCo_{Qhisn8z1YLuK;9`qlfKV44~yj?P|cep}ppx0N>EDb&7=z&#_ z{0Z=V?jnzAkU>;;HTVoYdc8E_MQ0ljtI+0LjTgs24X(M+FDrz4%;`2%n6J=w@`#o3 zMm4?OsAo+vQP;`b3u0cf%^<%A(a(!BfZY8?=7=!&i0f_X<5+1sONDBwp~Nrg7kSsl z+&6`G-jX;u=B`H0Aw71tB>phZMjlup+N_I{p=(sQdM^wkZjo1VEFHIby`Jo+&tNYP zOfrR`Kur&Xem1;f-P?uv-Kj2WoZJ?Q6+3x-HDod}Ka?nHVo#Rr zP}H{?;Xj%A6}-N$Ud2g|95q5JQ1g7(fNM$V7}1aZm0|Hxa=Qv2t1_Qs81sTB+we|R z$V?rh1e9Y|*E#Zt`x`OQNPcKHg?4h(L3#g7gV;CpDC@>`m~VsQ;X;H~HA#`<9?;d& zGaH9<4;A?=e7w7o`Px|;9QqiFuFDK?IFOFfj|wrcb(|C|Rbd7_%hJ3#JK?&Geo%;% zvIe=gjq9YE9+PU3Z+OUt&ZBs}Hphs9pU;3PeQu8jS7QX zHTs3zRkwaVPYk5jfzi0Z8Zb-*SvqD>& zJmp@zFBbFu-B-?tgtqBWu2pDL+Q&)mN_SM@{BW8umpq0%cRo+j)L2~ zZ5D~s?y|NFoH_y7ODkN@X){?o&itZ>w_XXcRP;*Z*#dswZvZ`XTElO8P} zYzh57(=zvdmc?~a(WJ`bu3G{>lubVAYDx-qyl2_G(K-33_ZZ9WTJ@6(XWuwib;vi% z-i5W3o9$a^30N|@UHjoz&Mh45ncPP4ASu0xi?4B6>E!YAuO`*bOHFbg{l<5G>14~S z8aLWaDs{lpsq6iA8?}$xecKt)cEPmyN$u1JrQVr1v6qh%YncS;PCw78+l+FZzPz7S zbFZpNPaK}XYk!%=K&@fBVhK{Kkx_Q7iIduk<3*WA-^N)+ImSLYooC&fI|pP(<3tJI zSNnO1@^BZ=#Y6EjXG4O_jxo!nA;j$I^*G;&{KX-0vi)t0TpDbWeu42)zp+^~$J8h~ zg#L+r)mYJAjeoxJnsJ{VOz)hu7;+c`IB#yEf~krp7S~YYS|@rmJM+Bf+Sxr=gPQ@K z2(QD;D4t~wS!$e5BbR-p7hYFqhJ8m3vf8LICWABWVDcUtY2bL4`hK31Ku8|3E#whU;O<4a1v<lsbCP*l#OpXw}f6zl3ynR~O&MxSVE5YoDbBj!B6Pp)Ko zR0y2=vaVRIM|s{K$1^w&XFXw9Ms35IFk=7AyXt9%x}+JWw{d3i%79=eBkJ5Y0{7|1 zV=>}cX){v3(5K-N@rJcVYju^u z^L)sU_9Q;^%LWDa(o@+se9>~x_NQOLpbWU~vf)#4W)N}~@|ZQ(d18SBLb>OL^R-Xg zaE9mQ^gHPozs6m@-Kj55UmD5|@)SQf&@Y`{is3gJ$c=!8@;*f^I?hGCiQ{hjsh0kw zG&0WWCJwupqu{KPvjbg4rFWC&gWcuJS0@=z%U!1RZYnb}ykvWbhYZ}R5sPnqIr~e+ zTy>31e(NkgI#*dX&`qva^pJ?3ZZha!Z>d|!T{e2Ti>?E8_tV(7A5>uA_X5$9J5_zO z67!E1NHq0{f$UiW{>_t5{h8lqQ{W(d;6{I^-fDBcoFK>X=hs5&!I=BgT7g#NKknu8 zWy%A0>!w`%GZZFpC}ww{-M5)M51jKlYvh*j$F5^ko7t z@xDJQ(i`%LU59SZ{qePv|9>+UmdDZOKQ971`bUt`{4{K7i(tvKOnMb&?p=dhjHutf43?@$}N+loG`tvLUQ`4!DmFzb>P!M^lt zuv+2T^FLZ%D<1IYeJ1i}W)o8%$hpHqYG;YFzwE^4X5W33y{pp~D-NVs@wOg4=k}#w z@zM7%_-2y}%o+OGY|NQOjuiX7C8e|J18B#&-^`TWVn@?+w1EGMRUio~g<+8KI2z!GN`OtRx!7_L3=N`w5qXGEblGnD=F}>nF2Sz zEAaM>0**Tir0$%*61+@-wT+e7T1J6cp9*9Bg!JVJr)g#}`q zp@1`ajvC&NjyDRWdq|-qR^vRdJ#~8X3MKA3`Nqt9ubjpEuS&k`KFRy}R-Po-^Cdb$ ziP3G8^gSZ)WE}5T-vKb%IQ#kHk2+O|S;p!x{-Zy3b~&? zPwADhjeR}u=|1IyQ2H9Rw#@7BAMB5A)%-EBg$~a(QK++v_fiRBbec#c6LWn;PU7xq zk+{v7STO%BX(ApJAA#MR)%E!riH4UWVRR(tmzmO010qmkCUZo1zYQzOEH4}H6%~1l zYa&rSm-o^d`h}d0L`yGnA-7XcS}_W7p;6fOAOiESh8BZmnr7jhRV(5eRAq9q}R(zO9&cy<9Lk1CdZD2)( ztQ553{WX+0NP0NAj)I{S0SpT>H1L(07XXXhAuC?aXGT zfgQiPk~{3f3>p5+gErK@&(6jMVqi5}GIx*P58s%L9a(m?Yfc=hLJsyvlK)8l$qBn1 z*H=Ir!Dv9 zb+jBf*V{5`z{8}7iF!+efqN`qCbdsWgk?(ChL%MG2V1ghu4tF{B;2>iF^Be}H`YlW z(Wy_8IV?Hp_T5ds?+X|CuAd)dIsGP1njbaDi!%nP*wP@;l?`&-iJBqiTAW;DmVx!+ zWn^5ONNei5tZ}kDI8HkDh>_l3j8cW%k$rdR|2^Qa+_@hw#i*e&*vJJCer@8s&>Sxx zse6e$$t>%6hov<=t5y(4X>W>?=+~?%H^)l1k#RE1Y?f)WV@0Ph%0I>F5A|7%rhPe| z@>C(>g9pylW(G9pFoW6uoS}EO=`FpzEgI;rs*%B(FIc6);acoz{;JTYf(k3^YH**= zQSF)ng+j%lK^mEwP3%~ zk(#?)4=gRO$IL~cC`E0G-_kH*M|!*n(Bsb)au&ncJFq5vOV91ap<&E+rFKk74&#?F z1kR!N*SRo!ZonF^nH~$W*iSE@wvznENp_wqTqum(MHlA1gIOsU@N(e@B8cxb@l14c+y8`d~*4%pjE8 zDV2fxS=11&q^CA}-6cQi)%}!M-!$SZ-!rgciVdy{_}IV<_>^UDZcB$tKW26uWNyJG z`YS%pU_LHA9A8m)xygnxA2YCYE-{Y1%m=y2OzPz}-kan{*5~(zWFUJgGvUf-&^y`2 zx$*zyGakL{BQNT!#qEbXeM3Fu>@2l7_WtA2_akQq^! zbu|*>8q*^;)rwc#OD~p5LyvB(NxCzWvbzr*z!{tJ0U!w@l_awiPy#AUk74UWsK(8e_taTZPhG*yv z92|g8JkyMO=xuO@`+saCo)X6{)`;2@)_23tSgC2X;zw306x^d-e$yW%jx)tU*%+9e zjWU_pc=3_G(3v^NYr(qbHu;o2RgwbwR|YY=>kH>_7AG0RGkVfpp8F#e82OBTTLA^K zVxWTOFMW%52BOZLAT&)5!k#|N$mDgakrIg$)uYg93$NGaDEv6UET%dCGmom)HkCPy z)R+ur7B_3Of@-O#V$8AVoU*(U$w&!x?(arWXEuSonXrjUib^WH&VxuabLH)z$1(yE5xz0Qrj#>BmS+xbkv^Hi{UP z=CnfF`7!x$^sMyQYLM6TwkkrL#IV3D3(22ff1009H7|5~LEph@o>=SWiI#qPC|>JP zSY!ROK_tnfjWM0KA zPek~5VZkM4G7Z$=K!_fblgMKXrO%cv9Cya?Ji9?I|7e~!!~wrfH_;1#9E`8Lepkpp zeN8?)_v5Hm%rLD=E(rCD=SNZVK8rkutMt?)XE2D|hw_W53I7l8^FxB{f0ZcL^3C#W zMFO)J%`%KQ)9Fdfl;L$coJOyPdHm|5Mmyp(nbZhW+0XUUD;%5oxhzod+T}Cz`L_w` z^=33{VaBy1X6R0s@Gzfv;R9wy{3RE@+5>#!`uV;h10P0`LrBg=eNUzKgO%CN^_ALy zvPx~YNWMqM1bO@Os1%$c1{PwLmzz1iaWTr@Ku@d>@}LSRZ8uhdDNeCcJpEp=PrX4+D!vFPw{Cg7h@XB-ilr_)=rP%3XNp4dt+%+$pOKk z%z;xY(fg+obG7{M?$k{#(-E`L;gn|(ZciaU?i0Dx4+HRc4)5*Zc@ShA=;92A91b)vCT%^sS)^|^E_JwBL)r%1&?ixnGqcG~-pmyu3= z5OVOI=h^4d*+{78DvPIj$koyFLg@W*h7D0kKLSk3XY9rNCQ_H7}QKwyEc`a5MoY+ZgQ-E znT9!$dh6w5v&ekJ$uaXW&$erjL#q<0QeU3Lp;nk@q zjN$pUXhkIU?y#b~iQJDZsW|%6iovI?xcbS8P*-|7HK%vwPLH(b|c;}+LT zpTRlsn!~P+GsJNEA7;+r5cSfWA?nv}J$oJzDO|ByQ-qZ9Cis8AQkc!E5 z=rL@!VtbKP9NR{ZtcD*@dqp;?Y@zSyRn}#%$&r~szt0ATWu(J@GP3B0!d|BC63$7iy}eXizki{VN2CXJMXC3~T$#1;+_UfA-M3CE_Rdn z&c5_4Ayw_Z=S@JJc)fW4{D+(g7q34<5#z~q1baI z41EjflQ4@tCHudr!Fs&jO>dP=37AM+|LH3emc~*iu#eX(kZUHw27@1YohEV-NpdK4arQ&Qhyi zo@^uUsqr87O(4dzow!L?cX>KqiPPkNIj)Mtk+M_FpgZhQQdkblUxB5qc^gcS}I$#rh&DO-={OZl4v&{rFQYQ6bB z8!@Bfa|8OU1a;Dn_+gOPSwb){dw}>upf>TL?G*P3ijP0-gB~n^d*jH z9>&_A_;pEd;>QQL=OjAG$))*%lm2K|ClU!CQ_%S*aaT)2*+%?w%d-Jk{Wt<$E|Ir* z&5jq9-K6J)ztY4q0GDes7p1xtj zNH#hIHEEYdk~eYZE%n5w8hz7F4#32Z5x7#8dAN_W;Wo`#T9wO{ zem=~h-cHZul2#m^la1jwoTXrHf!wU^k79F}vrK$EQe#I0jk^q_-{q4h{uuc+0?*S@ zP-G$Vo!y*ee4RYm@210YK7Tjz8PjWI<4FhpUG(XDyibRp0nD0to{V#&=+pPpMKS{N z#gCfuo4+IQxses-PIjbhbCjds3grH8e~i5nfp>%XIk&N6#4=C0YgS^)cYj#&Bk=FW z6lC_Y9B+TZl$lKAbuQu>z>z>`Gb_0aD$lz^ks-OThT*7EO48PtlXI^10!_g8PYeC z8tm{F%quVICgoQu(2YKogQ{^}u{s4)-`erVNh3~irO0>VdS20#ewU9@kiojbaJ!CddsHYBI?>Z0jJW$m z^0JMrS?{>W^uR*V*6>Hww&V{wSh;7=SNw;gENa5s^V&Lcu_DnW*NS#VJLZ)luaI^9 z1b#lN!XuEVPr-~n)Db2%7R8=I89RwHglMkMt10+EUf$0MUNUNIp*+j*C$~HTfBzx> z^bdV0`n$=SdIgfaioDK4QE+-q9xijds{=@$+B%+)3IO=1S^8e@uQBfw?`1ueT;&n>qDQZqeuTtUuHbn0L>= zclH1~bSE2%qPqf1dgw5Kyh3##GtbuXe!O2#bUq5Wdg|c$obv-G&dE;MQN5;G?yV}2 zuqFXm@rd5>#uV0=%t6vSOFsR=r(ENH-b3|BrOLrbChk*H0(T>|&T(mRDc=w=mCc3O&6IoENgksm;%=_GdS78>+yq zTl9KaP4D_HDLAo+xKB4{aa)-y%Z&cGk;8hs3-_@QJH92x%gg&7&8Xd?YXj~rp+1pk>RrPDdDg)LPOM?PrjkFEM?P0> zAj35ps}ktyXhC^snE8VXArON9=P0?J$XG7LdIkusUd5DP5Z@OPla<^ zsA0WhK*b^%I6!{T+ac7PZgR%}XZk#@GNQ^{@{A@cw9CV&M?Iy&v*lrUoomFK$#~hqeBK^o$)o&bz*1rqL>ipaeGjsC-d-)dBLb49s+}9vtB=5`?g2=5Vq>&GGEr|8beWPq2tHvZ^H@;iB zPLk76E3^;>YH!qCyr|(P*1y__PPc6+R)U}NK$Fz0uf}>u;ykmB7}=g)?uQCd|2=c4 zJ2Q)FZWy}rb(4v2Z+u#aj#HR#zJR*UhG9^&HzKEv4dx!yt&)$aD$V=|K7V;1BUAEAflX#3z0;2mJew7}>Z{!#to+bS_4Yh>qM07p~98%x*oY!tpZnXLMoCZynb0 zKMK)gG}oIO^~{gL&}yj>f9&ZW`9>*)z<1a_sv)Rn&QZH+Q{ojVj& zLNR?2=L*H?nZ=s_H~C_Vl6YOX9^QW?kMaolVhZ~1xyQ)zcnzBMVJ-c|h=-$yd37LP zue?z@{-ef3^6bVwGoZx|a!!^O;`Z`5*%+us80RqeI~#FwD19wgv&ZNaBSWitAn!8y zXk5?JyvZXADa6H-anikk2QG9E#ZBT!^@ux;(kisgTOE*q!zwJ;5<<^p1OBWe|1^R= zkM!tRy;%kC3Sn65U_$W*HgqMQv{Ei}isRMD%v*#VW$5!*H{-v)iVNILvSbwbxoyaM z9d1Bi8FF8EKmJ-BBZECu*mpGq*MHG>FO9rQ;&x}M#z;Tb@H?GC@pOfWeGNVJ=P(Cc zZIIIR^_cb{4E4i|_&Ujkn_P$36eI7rUyYlmN2Np~Vqeo&v;i|o%F=5tkeLHXA-G8l z(OQ)ET~pq_;jyx9nmcMM^{CGK>py%<2Yx<%|22p&`N-2-Gk4a(h)lkp?MmKXH%(Hy zCHZ%G^o!JyuRV=DNm?P6{EC;`b^!qqpi0XbuiQzs_b7B|{aKD=7VZ)r=h0u~eUgId&5BH@! z?&tPB%$*;~znA>SQoHEad4&2rtr6-S?3-usb1QpL^kvj262uI*E7ZK7O~<8H|I>&4 z|L_?vt+-;jnKIQfc%8{|WLULitNp6wg#W~3-!rw7CzKDjDCv#!-KSY{)RC1*rjmV< z%M{z&Zgr}_L_t55~qh2*HYar{# zxv!3k=(qeaUiy3@){@3GNbg1S;zXIlIrgX@M#;{LmyPs39YDT(trN^TNHI#QW&gqO z4Kk7(--BMvp_*%u-kf#dApH_J>!`AsJXmO8GSRzn! z)L;!W*s0fyCGT;H3Qhkq&w8^4ZxTG|lgxdIXXNTEHO7&znB_t3#Tw3(SA^oyE8aGx~r;a30_Yw$oR}$*333V@$JJ0uxJMJHFe>kJ3Kq*c3-fOM-&iPE# z3Fqgk=rE)$eeR`nIKg>Df6hkq!tb-0zw+}vCsO|^9|Mnv(MYSr=L_$lt<*6dpVpxU zzyCi8^gfr=p;l>f8OJc65lBX?&dA;v_WD&|-nSmLmYW82n?ZKYegpRWHlXP_BT6Y! z&~i7qizf}3`G~zwBMtDsZ$yEI0S%jx={SWQ)y2pKh@vlQtGV**VC$hT|w_8?OBN z9#%YR%2@~3-M##N>e-xSSEuLs6aA3h?Gtftvc7I{J)$7 zjPjIt7qZh6yrc`WLUEjXzU^E`+E*i2e!Nl=;+fl9rjm;5eC6#xH+k}Jec2l9DJQgn za;QW@dHXgt-#O`3KTwDAeu?}GM8uG=7)aE z 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

YmD()?v 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

k(3eUSN@wI2>xvLzU?kG7;9mTIr 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

n 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,"Illegal fix langevin command"); iarg += 2; + } else if (strcmp(arg[iarg],"halfstep") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix langevin command"); + if (gjfflag == 0) error->all(FLERR,"GJF must be set"); + if (tallyflag == 0) error->warning(FLERR,"Careful, tally is untested"); + if (strcmp(arg[iarg+1],"no") == 0) hsflag = 0; + else if (strcmp(arg[iarg+1],"yes") == 0) hsflag = 1; + else error->all(FLERR,"Illegal fix langevin command"); + iarg += 2; } else error->all(FLERR,"Illegal fix langevin command"); } @@ -155,6 +164,8 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : flangevin = NULL; flangevin_allocated = 0; franprev = NULL; + wildcard = NULL; + lv = NULL; tforce = NULL; maxatom1 = maxatom2 = 0; @@ -163,6 +174,12 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : // no need to set peratom_flag, b/c data is for internal use only if (gjfflag) { + int mem = 6*atom->nmax*sizeof(double); + if (hsflag) mem += 3*atom->nmax*sizeof(double); + + comm->maxexchange_fix = MAX(comm->maxexchange_fix, 0); + comm->maxexchange_fix += MAX(1000, mem); + nvalues = 3; grow_arrays(atom->nmax); atom->add_callback(0); @@ -174,6 +191,14 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : franprev[i][0] = 0.0; franprev[i][1] = 0.0; franprev[i][2] = 0.0; + wildcard[i][0] = 0.0; + wildcard[i][1] = 0.0; + wildcard[i][2] = 0.0; + if (hsflag) { + lv[i][0] = 0.0; + lv[i][1] = 0.0; + lv[i][2] = 0.0; + } } } @@ -196,6 +221,8 @@ FixLangevin::~FixLangevin() if (gjfflag) { memory->destroy(franprev); + memory->destroy(wildcard); + if (hsflag) memory->destroy(lv); atom->delete_callback(id,0); } } @@ -205,6 +232,8 @@ FixLangevin::~FixLangevin() int FixLangevin::setmask() { int mask = 0; + //if (gjfflag) mask |= INITIAL_INTEGRATE; + if (gjfflag) mask |= POST_INTEGRATE; mask |= POST_FORCE; mask |= POST_FORCE_RESPA; mask |= END_OF_STEP; @@ -260,13 +289,11 @@ void FixLangevin::init() error->one(FLERR,"Fix langevin angmom requires extended particles"); } - // set force prefactors - if (!atom->rmass) { for (int i = 1; i <= atom->ntypes; i++) { gfactor1[i] = -atom->mass[i] / t_period / force->ftm2v; gfactor2[i] = sqrt(atom->mass[i]) * - sqrt(24.0*force->boltz/t_period/update->dt/force->mvv2e) / + sqrt(2.0*force->boltz/t_period/update->dt/force->mvv2e) / force->ftm2v; gfactor1[i] *= 1.0/ratio[i]; gfactor2[i] *= 1.0/sqrt(ratio[i]); @@ -279,7 +306,7 @@ void FixLangevin::init() if (strstr(update->integrate_style,"respa")) nlevels_respa = ((Respa *) update->integrate)->nlevels; - if (gjfflag) gjffac = 1.0/(1.0+update->dt/2.0/t_period); + if (gjfflag) gjffac = 1.0/sqrt(1.0+update->dt/2.0/t_period); } @@ -294,6 +321,94 @@ void FixLangevin::setup(int vflag) post_force_respa(vflag,nlevels_respa-1,0); ((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1); } + if (gjfflag && hsflag) { + + double dt = update->dt; + + // update v of atoms in group + + double **v = atom->v; + double *rmass = atom->rmass; + int *type = atom->type; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + double boltz = force->boltz; + double mvv2e = force->mvv2e; + double ftm2v = force->ftm2v; + + double gamma2; + + for (int i = 0; i < nlocal; i++) { + if (rmass) { + gamma2 = sqrt(rmass[i]) * sqrt(2.0*boltz/t_period/dt/mvv2e) / ftm2v; + gamma2 *= 1.0/sqrt(ratio[type[i]]) * tsqrt; + } else { + gamma2 = gfactor2[type[i]] * tsqrt; + } + + franprev[i][0] = gamma2*random->gaussian(); + franprev[i][1] = gamma2*random->gaussian(); + franprev[i][2] = gamma2*random->gaussian(); + wildcard[i][0] = v[i][0]; + wildcard[i][1] = v[i][1]; + wildcard[i][2] = v[i][2]; + } + } +} + +/* ---------------------------------------------------------------------- + allow for both per-type and per-atom mass +------------------------------------------------------------------------- */ + +void FixLangevin::post_integrate() +{ + double dtfm; + double dt = update->dt; + double dtf = 0.5 * dt * force->ftm2v; + + // update v of atoms in group + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + if (rmass) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / rmass[i]; + x[i][0] += -dt * v[i][0]; + x[i][1] += -dt * v[i][1]; + x[i][2] += -dt * v[i][2]; + v[i][0] = gjffac * (wildcard[i][0] + dtfm * franprev[i][0] + dtfm * f[i][0]); + v[i][1] = gjffac * (wildcard[i][1] + dtfm * franprev[i][1] + dtfm * f[i][1]); + v[i][2] = gjffac * (wildcard[i][2] + dtfm * franprev[i][2] + dtfm * f[i][2]); + x[i][0] += gjffac * dt * v[i][0]; + x[i][1] += gjffac * dt * v[i][1]; + x[i][2] += gjffac * dt * v[i][2]; + } + + } else { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / mass[type[i]]; + x[i][0] += -dt * v[i][0]; + x[i][1] += -dt * v[i][1]; + x[i][2] += -dt * v[i][2]; + v[i][0] = gjffac * (wildcard[i][0] + dtfm * franprev[i][0] + dtfm * f[i][0]); + v[i][1] = gjffac * (wildcard[i][1] + dtfm * franprev[i][1] + dtfm * f[i][1]); + v[i][2] = gjffac * (wildcard[i][2] + dtfm * franprev[i][2] + dtfm * f[i][2]); + x[i][0] += gjffac * dt * v[i][0]; + x[i][1] += gjffac * dt * v[i][1]; + x[i][2] += gjffac * dt * v[i][2]; + } + } } /* ---------------------------------------------------------------------- */ @@ -490,9 +605,8 @@ void FixLangevin::post_force_untemplated // sum random force over all atoms in group // subtract sum/count from each atom in group - double fdrag[3],fran[3],fsum[3],fsumall[3]; + double fdrag[3],fran[3],fsum[3],fsumall[3], rantemp[3]; bigint count; - double fswap; double boltz = force->boltz; double dt = update->dt; @@ -526,7 +640,7 @@ void FixLangevin::post_force_untemplated if (Tp_TSTYLEATOM) tsqrt = sqrt(tforce[i]); if (Tp_RMASS) { gamma1 = -rmass[i] / t_period / ftm2v; - gamma2 = sqrt(rmass[i]) * sqrt(24.0*boltz/t_period/dt/mvv2e) / ftm2v; + gamma2 = sqrt(rmass[i]) * sqrt(2.0*boltz/t_period/dt/mvv2e) / ftm2v; gamma1 *= 1.0/ratio[type[i]]; gamma2 *= 1.0/sqrt(ratio[type[i]]) * tsqrt; } else { @@ -534,9 +648,9 @@ void FixLangevin::post_force_untemplated gamma2 = gfactor2[type[i]] * tsqrt; } - fran[0] = gamma2*(random->uniform()-0.5); - fran[1] = gamma2*(random->uniform()-0.5); - fran[2] = gamma2*(random->uniform()-0.5); + fran[0] = gamma2*random->gaussian(); + fran[1] = gamma2*random->gaussian(); + fran[2] = gamma2*random->gaussian(); if (Tp_BIAS) { temperature->remove_bias(i,v[i]); @@ -554,25 +668,20 @@ void FixLangevin::post_force_untemplated } if (Tp_GJF) { - fswap = 0.5*(fran[0]+franprev[i][0]); - franprev[i][0] = fran[0]; - fran[0] = fswap; - fswap = 0.5*(fran[1]+franprev[i][1]); - franprev[i][1] = fran[1]; - fran[1] = fswap; - fswap = 0.5*(fran[2]+franprev[i][2]); - franprev[i][2] = fran[2]; - fran[2] = fswap; + wildcard[i][0] = f[i][0]; + wildcard[i][1] = f[i][1]; + wildcard[i][2] = f[i][2]; - fdrag[0] *= gjffac; - fdrag[1] *= gjffac; - fdrag[2] *= gjffac; - fran[0] *= gjffac; - fran[1] *= gjffac; - fran[2] *= gjffac; - f[i][0] *= gjffac; - f[i][1] *= gjffac; - f[i][2] *= gjffac; + rantemp[0] = fran[0]; + rantemp[1] = fran[1]; + rantemp[2] = fran[2]; + fran[0] = franprev[i][0]; + fran[1] = franprev[i][1]; + fran[2] = franprev[i][2]; + + fdrag[0] *= -2*t_period*(2*gjffac-1/gjffac-1)/dt; + fdrag[1] *= -2*t_period*(2*gjffac-1/gjffac-1)/dt; + fdrag[2] *= -2*t_period*(2*gjffac-1/gjffac-1)/dt; } f[i][0] += fdrag[0] + fran[0]; @@ -580,6 +689,11 @@ void FixLangevin::post_force_untemplated f[i][2] += fdrag[2] + fran[2]; if (Tp_TALLY) { + if (Tp_GJF){ + fdrag[0] = gamma1*gjffac*v[i][0]; + fdrag[1] = gamma1*gjffac*v[i][1]; + fdrag[2] = gamma1*gjffac*v[i][2]; + } flangevin[i][0] = fdrag[0] + fran[0]; flangevin[i][1] = fdrag[1] + fran[1]; flangevin[i][2] = fdrag[2] + fran[2]; @@ -590,6 +704,19 @@ void FixLangevin::post_force_untemplated fsum[1] += fran[1]; fsum[2] += fran[2]; } + + if (Tp_GJF) + { + franprev[i][0] = rantemp[0]; + franprev[i][1] = rantemp[1]; + franprev[i][2] = rantemp[2]; + + if (hsflag){ + lv[i][0] = v[i][0]; + lv[i][1] = v[i][1]; + lv[i][2] = v[i][2]; + } + } } } @@ -649,9 +776,9 @@ void FixLangevin::compute_target() input->variable->compute_atom(tvar,igroup,tforce,1,0); for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) - if (tforce[i] < 0.0) - error->one(FLERR, - "Fix langevin variable returned negative temperature"); + if (tforce[i] < 0.0) + error->one(FLERR, + "Fix langevin variable returned negative temperature"); } modify->addstep_compute(update->ntimestep + 1); } @@ -764,20 +891,41 @@ void FixLangevin::angmom_thermostat() void FixLangevin::end_of_step() { - if (!tallyflag) return; + if (!tallyflag && !gjfflag) return; double **v = atom->v; + double **f = atom->f; int *mask = atom->mask; int nlocal = atom->nlocal; energy_onestep = 0.0; - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - energy_onestep += flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] + - flangevin[i][2]*v[i][2]; - - energy += energy_onestep*update->dt; + if (mask[i] & groupbit) { + if (gjfflag){ + f[i][0] = wildcard[i][0]; + f[i][1] = wildcard[i][1]; + f[i][2] = wildcard[i][2]; + wildcard[i][0] = v[i][0]; + wildcard[i][1] = v[i][1]; + wildcard[i][2] = v[i][2]; + if (hsflag){ + v[i][0] = lv[i][0]; + v[i][1] = lv[i][1]; + v[i][2] = lv[i][2]; + } + } + if (tallyflag && hsflag){ + energy_onestep += gjffac*(flangevin[i][0] * lv[i][0] + + flangevin[i][1] * lv[i][1] + flangevin[i][2] * lv[i][2]); + } + else if (tallyflag){ + energy_onestep += flangevin[i][0] * v[i][0] + flangevin[i][1] * v[i][1] + + flangevin[i][2] * v[i][2]; + } + } + if (tallyflag) { + energy += energy_onestep * update->dt; + } } /* ---------------------------------------------------------------------- */ @@ -877,7 +1025,8 @@ void *FixLangevin::extract(const char *str, int &dim) double FixLangevin::memory_usage() { double bytes = 0.0; - if (gjfflag) bytes += atom->nmax*3 * sizeof(double); + if (gjfflag) bytes += atom->nmax*3*2 * sizeof(double); + if (gjfflag) if (hsflag) bytes += atom->nmax*3 * sizeof(double); if (tallyflag) bytes += atom->nmax*3 * sizeof(double); if (tforce) bytes += atom->nmax * sizeof(double); return bytes; @@ -890,6 +1039,8 @@ double FixLangevin::memory_usage() void FixLangevin::grow_arrays(int nmax) { memory->grow(franprev,nmax,3,"fix_langevin:franprev"); + memory->grow(wildcard,nmax,3,"fix_langevin:wildcard"); + if (hsflag) memory->grow(lv,nmax,3,"fix_langevin:lv"); } /* ---------------------------------------------------------------------- @@ -898,8 +1049,17 @@ void FixLangevin::grow_arrays(int nmax) void FixLangevin::copy_arrays(int i, int j, int /*delflag*/) { - for (int m = 0; m < nvalues; m++) - franprev[j][m] = franprev[i][m]; + franprev[j][0] = franprev[i][0]; + franprev[j][1] = franprev[i][1]; + franprev[j][2] = franprev[i][2]; + wildcard[j][0] = wildcard[i][0]; + wildcard[j][1] = wildcard[i][1]; + wildcard[j][2] = wildcard[i][2]; + if (hsflag) { + lv[j][0] = lv[i][0]; + lv[j][1] = lv[i][1]; + lv[j][2] = lv[i][2]; + } } /* ---------------------------------------------------------------------- @@ -908,8 +1068,19 @@ void FixLangevin::copy_arrays(int i, int j, int /*delflag*/) int FixLangevin::pack_exchange(int i, double *buf) { - for (int m = 0; m < nvalues; m++) buf[m] = franprev[i][m]; - return nvalues; + int n = 0; + buf[n++] = franprev[i][0]; + buf[n++] = franprev[i][1]; + buf[n++] = franprev[i][2]; + buf[n++] = wildcard[i][0]; + buf[n++] = wildcard[i][1]; + buf[n++] = wildcard[i][2]; + if (hsflag){ + buf[n++] = lv[i][0]; + buf[n++] = lv[i][1]; + buf[n++] = lv[i][2]; + } + return n; } /* ---------------------------------------------------------------------- @@ -918,6 +1089,17 @@ int FixLangevin::pack_exchange(int i, double *buf) int FixLangevin::unpack_exchange(int nlocal, double *buf) { - for (int m = 0; m < nvalues; m++) franprev[nlocal][m] = buf[m]; - return nvalues; + int n = 0; + franprev[nlocal][0] = buf[n++]; + franprev[nlocal][1] = buf[n++]; + franprev[nlocal][2] = buf[n++]; + wildcard[nlocal][0] = buf[n++]; + wildcard[nlocal][1] = buf[n++]; + wildcard[nlocal][2] = buf[n++]; + if (hsflag){ + lv[nlocal][0] = buf[n++]; + lv[nlocal][1] = buf[n++]; + lv[nlocal][2] = buf[n++]; + } + return n; } diff --git a/src/fix_langevin.h b/src/fix_langevin.h index 2883ac9ea2..70fb254f4e 100644 --- a/src/fix_langevin.h +++ b/src/fix_langevin.h @@ -31,6 +31,8 @@ class FixLangevin : public Fix { int setmask(); void init(); void setup(int); + //virtual void initial_integrate(int); + virtual void post_integrate(); virtual void post_force(int); void post_force_respa(int, int, int); virtual void end_of_step(); @@ -46,7 +48,7 @@ class FixLangevin : public Fix { int unpack_exchange(int, double *); protected: - int gjfflag,oflag,tallyflag,zeroflag,tbiasflag; + int gjfflag,oflag,tallyflag,zeroflag,tbiasflag,hsflag; int flangevin_allocated; double ascale; double t_start,t_stop,t_period,t_target; @@ -63,6 +65,9 @@ class FixLangevin : public Fix { double **flangevin; double *tforce; double **franprev; + double **lv; //lucas velocity or half-step velocity + double **wildcard; + int nvalues; char *id_temp; From eb447db7c55efc18cd3e6c398fbf31e5f7f56d1b Mon Sep 17 00:00:00 2001 From: casievers Date: Fri, 19 Jul 2019 13:51:36 -0700 Subject: [PATCH 052/418] added lammps python example --- examples/python/gjf_python/argon.lmp | 886 +++++++++++++++++++++ examples/python/gjf_python/ff-argon.lmp | 20 + examples/python/gjf_python/gjf.py | 180 +++++ examples/python/gjf_python/lammps_tools.py | 78 ++ 4 files changed, 1164 insertions(+) create mode 100644 examples/python/gjf_python/argon.lmp create mode 100644 examples/python/gjf_python/ff-argon.lmp create mode 100644 examples/python/gjf_python/gjf.py create mode 100644 examples/python/gjf_python/lammps_tools.py diff --git a/examples/python/gjf_python/argon.lmp b/examples/python/gjf_python/argon.lmp new file mode 100644 index 0000000000..00214b4c54 --- /dev/null +++ b/examples/python/gjf_python/argon.lmp @@ -0,0 +1,886 @@ +LAMMPS description + + 864 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 32.146000 xlo xhi + 0.0000000 32.146000 ylo yhi + 0.0000000 32.146000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 2.6790000 2.6790000 + 2 2 1 0.0000000 0.0000000 2.6790000 8.0360000 + 3 3 1 0.0000000 0.0000000 2.6790000 13.3940000 + 4 4 1 0.0000000 0.0000000 2.6790000 18.7520000 + 5 5 1 0.0000000 0.0000000 2.6790000 24.1090000 + 6 6 1 0.0000000 0.0000000 2.6790000 29.4670000 + 7 7 1 0.0000000 0.0000000 8.0360000 2.6790000 + 8 8 1 0.0000000 0.0000000 8.0360000 8.0360000 + 9 9 1 0.0000000 0.0000000 8.0360000 13.3940000 + 10 10 1 0.0000000 0.0000000 8.0360000 18.7520000 + 11 11 1 0.0000000 0.0000000 8.0360000 24.1090000 + 12 12 1 0.0000000 0.0000000 8.0360000 29.4670000 + 13 13 1 0.0000000 0.0000000 13.3940000 2.6790000 + 14 14 1 0.0000000 0.0000000 13.3940000 8.0360000 + 15 15 1 0.0000000 0.0000000 13.3940000 13.3940000 + 16 16 1 0.0000000 0.0000000 13.3940000 18.7520000 + 17 17 1 0.0000000 0.0000000 13.3940000 24.1090000 + 18 18 1 0.0000000 0.0000000 13.3940000 29.4670000 + 19 19 1 0.0000000 0.0000000 18.7520000 2.6790000 + 20 20 1 0.0000000 0.0000000 18.7520000 8.0360000 + 21 21 1 0.0000000 0.0000000 18.7520000 13.3940000 + 22 22 1 0.0000000 0.0000000 18.7520000 18.7520000 + 23 23 1 0.0000000 0.0000000 18.7520000 24.1090000 + 24 24 1 0.0000000 0.0000000 18.7520000 29.4670000 + 25 25 1 0.0000000 0.0000000 24.1090000 2.6790000 + 26 26 1 0.0000000 0.0000000 24.1090000 8.0360000 + 27 27 1 0.0000000 0.0000000 24.1090000 13.3940000 + 28 28 1 0.0000000 0.0000000 24.1090000 18.7520000 + 29 29 1 0.0000000 0.0000000 24.1090000 24.1090000 + 30 30 1 0.0000000 0.0000000 24.1090000 29.4670000 + 31 31 1 0.0000000 0.0000000 29.4670000 2.6790000 + 32 32 1 0.0000000 0.0000000 29.4670000 8.0360000 + 33 33 1 0.0000000 0.0000000 29.4670000 13.3940000 + 34 34 1 0.0000000 0.0000000 29.4670000 18.7520000 + 35 35 1 0.0000000 0.0000000 29.4670000 24.1090000 + 36 36 1 0.0000000 0.0000000 29.4670000 29.4670000 + 37 37 1 0.0000000 5.3580000 2.6790000 2.6790000 + 38 38 1 0.0000000 5.3580000 2.6790000 8.0360000 + 39 39 1 0.0000000 5.3580000 2.6790000 13.3940000 + 40 40 1 0.0000000 5.3580000 2.6790000 18.7520000 + 41 41 1 0.0000000 5.3580000 2.6790000 24.1090000 + 42 42 1 0.0000000 5.3580000 2.6790000 29.4670000 + 43 43 1 0.0000000 5.3580000 8.0360000 2.6790000 + 44 44 1 0.0000000 5.3580000 8.0360000 8.0360000 + 45 45 1 0.0000000 5.3580000 8.0360000 13.3940000 + 46 46 1 0.0000000 5.3580000 8.0360000 18.7520000 + 47 47 1 0.0000000 5.3580000 8.0360000 24.1090000 + 48 48 1 0.0000000 5.3580000 8.0360000 29.4670000 + 49 49 1 0.0000000 5.3580000 13.3940000 2.6790000 + 50 50 1 0.0000000 5.3580000 13.3940000 8.0360000 + 51 51 1 0.0000000 5.3580000 13.3940000 13.3940000 + 52 52 1 0.0000000 5.3580000 13.3940000 18.7520000 + 53 53 1 0.0000000 5.3580000 13.3940000 24.1090000 + 54 54 1 0.0000000 5.3580000 13.3940000 29.4670000 + 55 55 1 0.0000000 5.3580000 18.7520000 2.6790000 + 56 56 1 0.0000000 5.3580000 18.7520000 8.0360000 + 57 57 1 0.0000000 5.3580000 18.7520000 13.3940000 + 58 58 1 0.0000000 5.3580000 18.7520000 18.7520000 + 59 59 1 0.0000000 5.3580000 18.7520000 24.1090000 + 60 60 1 0.0000000 5.3580000 18.7520000 29.4670000 + 61 61 1 0.0000000 5.3580000 24.1090000 2.6790000 + 62 62 1 0.0000000 5.3580000 24.1090000 8.0360000 + 63 63 1 0.0000000 5.3580000 24.1090000 13.3940000 + 64 64 1 0.0000000 5.3580000 24.1090000 18.7520000 + 65 65 1 0.0000000 5.3580000 24.1090000 24.1090000 + 66 66 1 0.0000000 5.3580000 24.1090000 29.4670000 + 67 67 1 0.0000000 5.3580000 29.4670000 2.6790000 + 68 68 1 0.0000000 5.3580000 29.4670000 8.0360000 + 69 69 1 0.0000000 5.3580000 29.4670000 13.3940000 + 70 70 1 0.0000000 5.3580000 29.4670000 18.7520000 + 71 71 1 0.0000000 5.3580000 29.4670000 24.1090000 + 72 72 1 0.0000000 5.3580000 29.4670000 29.4670000 + 73 73 1 0.0000000 10.7150000 2.6790000 2.6790000 + 74 74 1 0.0000000 10.7150000 2.6790000 8.0360000 + 75 75 1 0.0000000 10.7150000 2.6790000 13.3940000 + 76 76 1 0.0000000 10.7150000 2.6790000 18.7520000 + 77 77 1 0.0000000 10.7150000 2.6790000 24.1090000 + 78 78 1 0.0000000 10.7150000 2.6790000 29.4670000 + 79 79 1 0.0000000 10.7150000 8.0360000 2.6790000 + 80 80 1 0.0000000 10.7150000 8.0360000 8.0360000 + 81 81 1 0.0000000 10.7150000 8.0360000 13.3940000 + 82 82 1 0.0000000 10.7150000 8.0360000 18.7520000 + 83 83 1 0.0000000 10.7150000 8.0360000 24.1090000 + 84 84 1 0.0000000 10.7150000 8.0360000 29.4670000 + 85 85 1 0.0000000 10.7150000 13.3940000 2.6790000 + 86 86 1 0.0000000 10.7150000 13.3940000 8.0360000 + 87 87 1 0.0000000 10.7150000 13.3940000 13.3940000 + 88 88 1 0.0000000 10.7150000 13.3940000 18.7520000 + 89 89 1 0.0000000 10.7150000 13.3940000 24.1090000 + 90 90 1 0.0000000 10.7150000 13.3940000 29.4670000 + 91 91 1 0.0000000 10.7150000 18.7520000 2.6790000 + 92 92 1 0.0000000 10.7150000 18.7520000 8.0360000 + 93 93 1 0.0000000 10.7150000 18.7520000 13.3940000 + 94 94 1 0.0000000 10.7150000 18.7520000 18.7520000 + 95 95 1 0.0000000 10.7150000 18.7520000 24.1090000 + 96 96 1 0.0000000 10.7150000 18.7520000 29.4670000 + 97 97 1 0.0000000 10.7150000 24.1090000 2.6790000 + 98 98 1 0.0000000 10.7150000 24.1090000 8.0360000 + 99 99 1 0.0000000 10.7150000 24.1090000 13.3940000 + 100 100 1 0.0000000 10.7150000 24.1090000 18.7520000 + 101 101 1 0.0000000 10.7150000 24.1090000 24.1090000 + 102 102 1 0.0000000 10.7150000 24.1090000 29.4670000 + 103 103 1 0.0000000 10.7150000 29.4670000 2.6790000 + 104 104 1 0.0000000 10.7150000 29.4670000 8.0360000 + 105 105 1 0.0000000 10.7150000 29.4670000 13.3940000 + 106 106 1 0.0000000 10.7150000 29.4670000 18.7520000 + 107 107 1 0.0000000 10.7150000 29.4670000 24.1090000 + 108 108 1 0.0000000 10.7150000 29.4670000 29.4670000 + 109 109 1 0.0000000 16.0730000 2.6790000 2.6790000 + 110 110 1 0.0000000 16.0730000 2.6790000 8.0360000 + 111 111 1 0.0000000 16.0730000 2.6790000 13.3940000 + 112 112 1 0.0000000 16.0730000 2.6790000 18.7520000 + 113 113 1 0.0000000 16.0730000 2.6790000 24.1090000 + 114 114 1 0.0000000 16.0730000 2.6790000 29.4670000 + 115 115 1 0.0000000 16.0730000 8.0360000 2.6790000 + 116 116 1 0.0000000 16.0730000 8.0360000 8.0360000 + 117 117 1 0.0000000 16.0730000 8.0360000 13.3940000 + 118 118 1 0.0000000 16.0730000 8.0360000 18.7520000 + 119 119 1 0.0000000 16.0730000 8.0360000 24.1090000 + 120 120 1 0.0000000 16.0730000 8.0360000 29.4670000 + 121 121 1 0.0000000 16.0730000 13.3940000 2.6790000 + 122 122 1 0.0000000 16.0730000 13.3940000 8.0360000 + 123 123 1 0.0000000 16.0730000 13.3940000 13.3940000 + 124 124 1 0.0000000 16.0730000 13.3940000 18.7520000 + 125 125 1 0.0000000 16.0730000 13.3940000 24.1090000 + 126 126 1 0.0000000 16.0730000 13.3940000 29.4670000 + 127 127 1 0.0000000 16.0730000 18.7520000 2.6790000 + 128 128 1 0.0000000 16.0730000 18.7520000 8.0360000 + 129 129 1 0.0000000 16.0730000 18.7520000 13.3940000 + 130 130 1 0.0000000 16.0730000 18.7520000 18.7520000 + 131 131 1 0.0000000 16.0730000 18.7520000 24.1090000 + 132 132 1 0.0000000 16.0730000 18.7520000 29.4670000 + 133 133 1 0.0000000 16.0730000 24.1090000 2.6790000 + 134 134 1 0.0000000 16.0730000 24.1090000 8.0360000 + 135 135 1 0.0000000 16.0730000 24.1090000 13.3940000 + 136 136 1 0.0000000 16.0730000 24.1090000 18.7520000 + 137 137 1 0.0000000 16.0730000 24.1090000 24.1090000 + 138 138 1 0.0000000 16.0730000 24.1090000 29.4670000 + 139 139 1 0.0000000 16.0730000 29.4670000 2.6790000 + 140 140 1 0.0000000 16.0730000 29.4670000 8.0360000 + 141 141 1 0.0000000 16.0730000 29.4670000 13.3940000 + 142 142 1 0.0000000 16.0730000 29.4670000 18.7520000 + 143 143 1 0.0000000 16.0730000 29.4670000 24.1090000 + 144 144 1 0.0000000 16.0730000 29.4670000 29.4670000 + 145 145 1 0.0000000 21.4310000 2.6790000 2.6790000 + 146 146 1 0.0000000 21.4310000 2.6790000 8.0360000 + 147 147 1 0.0000000 21.4310000 2.6790000 13.3940000 + 148 148 1 0.0000000 21.4310000 2.6790000 18.7520000 + 149 149 1 0.0000000 21.4310000 2.6790000 24.1090000 + 150 150 1 0.0000000 21.4310000 2.6790000 29.4670000 + 151 151 1 0.0000000 21.4310000 8.0360000 2.6790000 + 152 152 1 0.0000000 21.4310000 8.0360000 8.0360000 + 153 153 1 0.0000000 21.4310000 8.0360000 13.3940000 + 154 154 1 0.0000000 21.4310000 8.0360000 18.7520000 + 155 155 1 0.0000000 21.4310000 8.0360000 24.1090000 + 156 156 1 0.0000000 21.4310000 8.0360000 29.4670000 + 157 157 1 0.0000000 21.4310000 13.3940000 2.6790000 + 158 158 1 0.0000000 21.4310000 13.3940000 8.0360000 + 159 159 1 0.0000000 21.4310000 13.3940000 13.3940000 + 160 160 1 0.0000000 21.4310000 13.3940000 18.7520000 + 161 161 1 0.0000000 21.4310000 13.3940000 24.1090000 + 162 162 1 0.0000000 21.4310000 13.3940000 29.4670000 + 163 163 1 0.0000000 21.4310000 18.7520000 2.6790000 + 164 164 1 0.0000000 21.4310000 18.7520000 8.0360000 + 165 165 1 0.0000000 21.4310000 18.7520000 13.3940000 + 166 166 1 0.0000000 21.4310000 18.7520000 18.7520000 + 167 167 1 0.0000000 21.4310000 18.7520000 24.1090000 + 168 168 1 0.0000000 21.4310000 18.7520000 29.4670000 + 169 169 1 0.0000000 21.4310000 24.1090000 2.6790000 + 170 170 1 0.0000000 21.4310000 24.1090000 8.0360000 + 171 171 1 0.0000000 21.4310000 24.1090000 13.3940000 + 172 172 1 0.0000000 21.4310000 24.1090000 18.7520000 + 173 173 1 0.0000000 21.4310000 24.1090000 24.1090000 + 174 174 1 0.0000000 21.4310000 24.1090000 29.4670000 + 175 175 1 0.0000000 21.4310000 29.4670000 2.6790000 + 176 176 1 0.0000000 21.4310000 29.4670000 8.0360000 + 177 177 1 0.0000000 21.4310000 29.4670000 13.3940000 + 178 178 1 0.0000000 21.4310000 29.4670000 18.7520000 + 179 179 1 0.0000000 21.4310000 29.4670000 24.1090000 + 180 180 1 0.0000000 21.4310000 29.4670000 29.4670000 + 181 181 1 0.0000000 26.7880000 2.6790000 2.6790000 + 182 182 1 0.0000000 26.7880000 2.6790000 8.0360000 + 183 183 1 0.0000000 26.7880000 2.6790000 13.3940000 + 184 184 1 0.0000000 26.7880000 2.6790000 18.7520000 + 185 185 1 0.0000000 26.7880000 2.6790000 24.1090000 + 186 186 1 0.0000000 26.7880000 2.6790000 29.4670000 + 187 187 1 0.0000000 26.7880000 8.0360000 2.6790000 + 188 188 1 0.0000000 26.7880000 8.0360000 8.0360000 + 189 189 1 0.0000000 26.7880000 8.0360000 13.3940000 + 190 190 1 0.0000000 26.7880000 8.0360000 18.7520000 + 191 191 1 0.0000000 26.7880000 8.0360000 24.1090000 + 192 192 1 0.0000000 26.7880000 8.0360000 29.4670000 + 193 193 1 0.0000000 26.7880000 13.3940000 2.6790000 + 194 194 1 0.0000000 26.7880000 13.3940000 8.0360000 + 195 195 1 0.0000000 26.7880000 13.3940000 13.3940000 + 196 196 1 0.0000000 26.7880000 13.3940000 18.7520000 + 197 197 1 0.0000000 26.7880000 13.3940000 24.1090000 + 198 198 1 0.0000000 26.7880000 13.3940000 29.4670000 + 199 199 1 0.0000000 26.7880000 18.7520000 2.6790000 + 200 200 1 0.0000000 26.7880000 18.7520000 8.0360000 + 201 201 1 0.0000000 26.7880000 18.7520000 13.3940000 + 202 202 1 0.0000000 26.7880000 18.7520000 18.7520000 + 203 203 1 0.0000000 26.7880000 18.7520000 24.1090000 + 204 204 1 0.0000000 26.7880000 18.7520000 29.4670000 + 205 205 1 0.0000000 26.7880000 24.1090000 2.6790000 + 206 206 1 0.0000000 26.7880000 24.1090000 8.0360000 + 207 207 1 0.0000000 26.7880000 24.1090000 13.3940000 + 208 208 1 0.0000000 26.7880000 24.1090000 18.7520000 + 209 209 1 0.0000000 26.7880000 24.1090000 24.1090000 + 210 210 1 0.0000000 26.7880000 24.1090000 29.4670000 + 211 211 1 0.0000000 26.7880000 29.4670000 2.6790000 + 212 212 1 0.0000000 26.7880000 29.4670000 8.0360000 + 213 213 1 0.0000000 26.7880000 29.4670000 13.3940000 + 214 214 1 0.0000000 26.7880000 29.4670000 18.7520000 + 215 215 1 0.0000000 26.7880000 29.4670000 24.1090000 + 216 216 1 0.0000000 26.7880000 29.4670000 29.4670000 + 217 217 1 0.0000000 2.6790000 5.3580000 2.6790000 + 218 218 1 0.0000000 2.6790000 5.3580000 8.0360000 + 219 219 1 0.0000000 2.6790000 5.3580000 13.3940000 + 220 220 1 0.0000000 2.6790000 5.3580000 18.7520000 + 221 221 1 0.0000000 2.6790000 5.3580000 24.1090000 + 222 222 1 0.0000000 2.6790000 5.3580000 29.4670000 + 223 223 1 0.0000000 2.6790000 10.7150000 2.6790000 + 224 224 1 0.0000000 2.6790000 10.7150000 8.0360000 + 225 225 1 0.0000000 2.6790000 10.7150000 13.3940000 + 226 226 1 0.0000000 2.6790000 10.7150000 18.7520000 + 227 227 1 0.0000000 2.6790000 10.7150000 24.1090000 + 228 228 1 0.0000000 2.6790000 10.7150000 29.4670000 + 229 229 1 0.0000000 2.6790000 16.0730000 2.6790000 + 230 230 1 0.0000000 2.6790000 16.0730000 8.0360000 + 231 231 1 0.0000000 2.6790000 16.0730000 13.3940000 + 232 232 1 0.0000000 2.6790000 16.0730000 18.7520000 + 233 233 1 0.0000000 2.6790000 16.0730000 24.1090000 + 234 234 1 0.0000000 2.6790000 16.0730000 29.4670000 + 235 235 1 0.0000000 2.6790000 21.4310000 2.6790000 + 236 236 1 0.0000000 2.6790000 21.4310000 8.0360000 + 237 237 1 0.0000000 2.6790000 21.4310000 13.3940000 + 238 238 1 0.0000000 2.6790000 21.4310000 18.7520000 + 239 239 1 0.0000000 2.6790000 21.4310000 24.1090000 + 240 240 1 0.0000000 2.6790000 21.4310000 29.4670000 + 241 241 1 0.0000000 2.6790000 26.7880000 2.6790000 + 242 242 1 0.0000000 2.6790000 26.7880000 8.0360000 + 243 243 1 0.0000000 2.6790000 26.7880000 13.3940000 + 244 244 1 0.0000000 2.6790000 26.7880000 18.7520000 + 245 245 1 0.0000000 2.6790000 26.7880000 24.1090000 + 246 246 1 0.0000000 2.6790000 26.7880000 29.4670000 + 247 247 1 0.0000000 2.6790000 32.1460000 2.6790000 + 248 248 1 0.0000000 2.6790000 32.1460000 8.0360000 + 249 249 1 0.0000000 2.6790000 32.1460000 13.3940000 + 250 250 1 0.0000000 2.6790000 32.1460000 18.7520000 + 251 251 1 0.0000000 2.6790000 32.1460000 24.1090000 + 252 252 1 0.0000000 2.6790000 32.1460000 29.4670000 + 253 253 1 0.0000000 8.0360000 5.3580000 2.6790000 + 254 254 1 0.0000000 8.0360000 5.3580000 8.0360000 + 255 255 1 0.0000000 8.0360000 5.3580000 13.3940000 + 256 256 1 0.0000000 8.0360000 5.3580000 18.7520000 + 257 257 1 0.0000000 8.0360000 5.3580000 24.1090000 + 258 258 1 0.0000000 8.0360000 5.3580000 29.4670000 + 259 259 1 0.0000000 8.0360000 10.7150000 2.6790000 + 260 260 1 0.0000000 8.0360000 10.7150000 8.0360000 + 261 261 1 0.0000000 8.0360000 10.7150000 13.3940000 + 262 262 1 0.0000000 8.0360000 10.7150000 18.7520000 + 263 263 1 0.0000000 8.0360000 10.7150000 24.1090000 + 264 264 1 0.0000000 8.0360000 10.7150000 29.4670000 + 265 265 1 0.0000000 8.0360000 16.0730000 2.6790000 + 266 266 1 0.0000000 8.0360000 16.0730000 8.0360000 + 267 267 1 0.0000000 8.0360000 16.0730000 13.3940000 + 268 268 1 0.0000000 8.0360000 16.0730000 18.7520000 + 269 269 1 0.0000000 8.0360000 16.0730000 24.1090000 + 270 270 1 0.0000000 8.0360000 16.0730000 29.4670000 + 271 271 1 0.0000000 8.0360000 21.4310000 2.6790000 + 272 272 1 0.0000000 8.0360000 21.4310000 8.0360000 + 273 273 1 0.0000000 8.0360000 21.4310000 13.3940000 + 274 274 1 0.0000000 8.0360000 21.4310000 18.7520000 + 275 275 1 0.0000000 8.0360000 21.4310000 24.1090000 + 276 276 1 0.0000000 8.0360000 21.4310000 29.4670000 + 277 277 1 0.0000000 8.0360000 26.7880000 2.6790000 + 278 278 1 0.0000000 8.0360000 26.7880000 8.0360000 + 279 279 1 0.0000000 8.0360000 26.7880000 13.3940000 + 280 280 1 0.0000000 8.0360000 26.7880000 18.7520000 + 281 281 1 0.0000000 8.0360000 26.7880000 24.1090000 + 282 282 1 0.0000000 8.0360000 26.7880000 29.4670000 + 283 283 1 0.0000000 8.0360000 32.1460000 2.6790000 + 284 284 1 0.0000000 8.0360000 32.1460000 8.0360000 + 285 285 1 0.0000000 8.0360000 32.1460000 13.3940000 + 286 286 1 0.0000000 8.0360000 32.1460000 18.7520000 + 287 287 1 0.0000000 8.0360000 32.1460000 24.1090000 + 288 288 1 0.0000000 8.0360000 32.1460000 29.4670000 + 289 289 1 0.0000000 13.3940000 5.3580000 2.6790000 + 290 290 1 0.0000000 13.3940000 5.3580000 8.0360000 + 291 291 1 0.0000000 13.3940000 5.3580000 13.3940000 + 292 292 1 0.0000000 13.3940000 5.3580000 18.7520000 + 293 293 1 0.0000000 13.3940000 5.3580000 24.1090000 + 294 294 1 0.0000000 13.3940000 5.3580000 29.4670000 + 295 295 1 0.0000000 13.3940000 10.7150000 2.6790000 + 296 296 1 0.0000000 13.3940000 10.7150000 8.0360000 + 297 297 1 0.0000000 13.3940000 10.7150000 13.3940000 + 298 298 1 0.0000000 13.3940000 10.7150000 18.7520000 + 299 299 1 0.0000000 13.3940000 10.7150000 24.1090000 + 300 300 1 0.0000000 13.3940000 10.7150000 29.4670000 + 301 301 1 0.0000000 13.3940000 16.0730000 2.6790000 + 302 302 1 0.0000000 13.3940000 16.0730000 8.0360000 + 303 303 1 0.0000000 13.3940000 16.0730000 13.3940000 + 304 304 1 0.0000000 13.3940000 16.0730000 18.7520000 + 305 305 1 0.0000000 13.3940000 16.0730000 24.1090000 + 306 306 1 0.0000000 13.3940000 16.0730000 29.4670000 + 307 307 1 0.0000000 13.3940000 21.4310000 2.6790000 + 308 308 1 0.0000000 13.3940000 21.4310000 8.0360000 + 309 309 1 0.0000000 13.3940000 21.4310000 13.3940000 + 310 310 1 0.0000000 13.3940000 21.4310000 18.7520000 + 311 311 1 0.0000000 13.3940000 21.4310000 24.1090000 + 312 312 1 0.0000000 13.3940000 21.4310000 29.4670000 + 313 313 1 0.0000000 13.3940000 26.7880000 2.6790000 + 314 314 1 0.0000000 13.3940000 26.7880000 8.0360000 + 315 315 1 0.0000000 13.3940000 26.7880000 13.3940000 + 316 316 1 0.0000000 13.3940000 26.7880000 18.7520000 + 317 317 1 0.0000000 13.3940000 26.7880000 24.1090000 + 318 318 1 0.0000000 13.3940000 26.7880000 29.4670000 + 319 319 1 0.0000000 13.3940000 32.1460000 2.6790000 + 320 320 1 0.0000000 13.3940000 32.1460000 8.0360000 + 321 321 1 0.0000000 13.3940000 32.1460000 13.3940000 + 322 322 1 0.0000000 13.3940000 32.1460000 18.7520000 + 323 323 1 0.0000000 13.3940000 32.1460000 24.1090000 + 324 324 1 0.0000000 13.3940000 32.1460000 29.4670000 + 325 325 1 0.0000000 18.7520000 5.3580000 2.6790000 + 326 326 1 0.0000000 18.7520000 5.3580000 8.0360000 + 327 327 1 0.0000000 18.7520000 5.3580000 13.3940000 + 328 328 1 0.0000000 18.7520000 5.3580000 18.7520000 + 329 329 1 0.0000000 18.7520000 5.3580000 24.1090000 + 330 330 1 0.0000000 18.7520000 5.3580000 29.4670000 + 331 331 1 0.0000000 18.7520000 10.7150000 2.6790000 + 332 332 1 0.0000000 18.7520000 10.7150000 8.0360000 + 333 333 1 0.0000000 18.7520000 10.7150000 13.3940000 + 334 334 1 0.0000000 18.7520000 10.7150000 18.7520000 + 335 335 1 0.0000000 18.7520000 10.7150000 24.1090000 + 336 336 1 0.0000000 18.7520000 10.7150000 29.4670000 + 337 337 1 0.0000000 18.7520000 16.0730000 2.6790000 + 338 338 1 0.0000000 18.7520000 16.0730000 8.0360000 + 339 339 1 0.0000000 18.7520000 16.0730000 13.3940000 + 340 340 1 0.0000000 18.7520000 16.0730000 18.7520000 + 341 341 1 0.0000000 18.7520000 16.0730000 24.1090000 + 342 342 1 0.0000000 18.7520000 16.0730000 29.4670000 + 343 343 1 0.0000000 18.7520000 21.4310000 2.6790000 + 344 344 1 0.0000000 18.7520000 21.4310000 8.0360000 + 345 345 1 0.0000000 18.7520000 21.4310000 13.3940000 + 346 346 1 0.0000000 18.7520000 21.4310000 18.7520000 + 347 347 1 0.0000000 18.7520000 21.4310000 24.1090000 + 348 348 1 0.0000000 18.7520000 21.4310000 29.4670000 + 349 349 1 0.0000000 18.7520000 26.7880000 2.6790000 + 350 350 1 0.0000000 18.7520000 26.7880000 8.0360000 + 351 351 1 0.0000000 18.7520000 26.7880000 13.3940000 + 352 352 1 0.0000000 18.7520000 26.7880000 18.7520000 + 353 353 1 0.0000000 18.7520000 26.7880000 24.1090000 + 354 354 1 0.0000000 18.7520000 26.7880000 29.4670000 + 355 355 1 0.0000000 18.7520000 32.1460000 2.6790000 + 356 356 1 0.0000000 18.7520000 32.1460000 8.0360000 + 357 357 1 0.0000000 18.7520000 32.1460000 13.3940000 + 358 358 1 0.0000000 18.7520000 32.1460000 18.7520000 + 359 359 1 0.0000000 18.7520000 32.1460000 24.1090000 + 360 360 1 0.0000000 18.7520000 32.1460000 29.4670000 + 361 361 1 0.0000000 24.1090000 5.3580000 2.6790000 + 362 362 1 0.0000000 24.1090000 5.3580000 8.0360000 + 363 363 1 0.0000000 24.1090000 5.3580000 13.3940000 + 364 364 1 0.0000000 24.1090000 5.3580000 18.7520000 + 365 365 1 0.0000000 24.1090000 5.3580000 24.1090000 + 366 366 1 0.0000000 24.1090000 5.3580000 29.4670000 + 367 367 1 0.0000000 24.1090000 10.7150000 2.6790000 + 368 368 1 0.0000000 24.1090000 10.7150000 8.0360000 + 369 369 1 0.0000000 24.1090000 10.7150000 13.3940000 + 370 370 1 0.0000000 24.1090000 10.7150000 18.7520000 + 371 371 1 0.0000000 24.1090000 10.7150000 24.1090000 + 372 372 1 0.0000000 24.1090000 10.7150000 29.4670000 + 373 373 1 0.0000000 24.1090000 16.0730000 2.6790000 + 374 374 1 0.0000000 24.1090000 16.0730000 8.0360000 + 375 375 1 0.0000000 24.1090000 16.0730000 13.3940000 + 376 376 1 0.0000000 24.1090000 16.0730000 18.7520000 + 377 377 1 0.0000000 24.1090000 16.0730000 24.1090000 + 378 378 1 0.0000000 24.1090000 16.0730000 29.4670000 + 379 379 1 0.0000000 24.1090000 21.4310000 2.6790000 + 380 380 1 0.0000000 24.1090000 21.4310000 8.0360000 + 381 381 1 0.0000000 24.1090000 21.4310000 13.3940000 + 382 382 1 0.0000000 24.1090000 21.4310000 18.7520000 + 383 383 1 0.0000000 24.1090000 21.4310000 24.1090000 + 384 384 1 0.0000000 24.1090000 21.4310000 29.4670000 + 385 385 1 0.0000000 24.1090000 26.7880000 2.6790000 + 386 386 1 0.0000000 24.1090000 26.7880000 8.0360000 + 387 387 1 0.0000000 24.1090000 26.7880000 13.3940000 + 388 388 1 0.0000000 24.1090000 26.7880000 18.7520000 + 389 389 1 0.0000000 24.1090000 26.7880000 24.1090000 + 390 390 1 0.0000000 24.1090000 26.7880000 29.4670000 + 391 391 1 0.0000000 24.1090000 32.1460000 2.6790000 + 392 392 1 0.0000000 24.1090000 32.1460000 8.0360000 + 393 393 1 0.0000000 24.1090000 32.1460000 13.3940000 + 394 394 1 0.0000000 24.1090000 32.1460000 18.7520000 + 395 395 1 0.0000000 24.1090000 32.1460000 24.1090000 + 396 396 1 0.0000000 24.1090000 32.1460000 29.4670000 + 397 397 1 0.0000000 29.4670000 5.3580000 2.6790000 + 398 398 1 0.0000000 29.4670000 5.3580000 8.0360000 + 399 399 1 0.0000000 29.4670000 5.3580000 13.3940000 + 400 400 1 0.0000000 29.4670000 5.3580000 18.7520000 + 401 401 1 0.0000000 29.4670000 5.3580000 24.1090000 + 402 402 1 0.0000000 29.4670000 5.3580000 29.4670000 + 403 403 1 0.0000000 29.4670000 10.7150000 2.6790000 + 404 404 1 0.0000000 29.4670000 10.7150000 8.0360000 + 405 405 1 0.0000000 29.4670000 10.7150000 13.3940000 + 406 406 1 0.0000000 29.4670000 10.7150000 18.7520000 + 407 407 1 0.0000000 29.4670000 10.7150000 24.1090000 + 408 408 1 0.0000000 29.4670000 10.7150000 29.4670000 + 409 409 1 0.0000000 29.4670000 16.0730000 2.6790000 + 410 410 1 0.0000000 29.4670000 16.0730000 8.0360000 + 411 411 1 0.0000000 29.4670000 16.0730000 13.3940000 + 412 412 1 0.0000000 29.4670000 16.0730000 18.7520000 + 413 413 1 0.0000000 29.4670000 16.0730000 24.1090000 + 414 414 1 0.0000000 29.4670000 16.0730000 29.4670000 + 415 415 1 0.0000000 29.4670000 21.4310000 2.6790000 + 416 416 1 0.0000000 29.4670000 21.4310000 8.0360000 + 417 417 1 0.0000000 29.4670000 21.4310000 13.3940000 + 418 418 1 0.0000000 29.4670000 21.4310000 18.7520000 + 419 419 1 0.0000000 29.4670000 21.4310000 24.1090000 + 420 420 1 0.0000000 29.4670000 21.4310000 29.4670000 + 421 421 1 0.0000000 29.4670000 26.7880000 2.6790000 + 422 422 1 0.0000000 29.4670000 26.7880000 8.0360000 + 423 423 1 0.0000000 29.4670000 26.7880000 13.3940000 + 424 424 1 0.0000000 29.4670000 26.7880000 18.7520000 + 425 425 1 0.0000000 29.4670000 26.7880000 24.1090000 + 426 426 1 0.0000000 29.4670000 26.7880000 29.4670000 + 427 427 1 0.0000000 29.4670000 32.1460000 2.6790000 + 428 428 1 0.0000000 29.4670000 32.1460000 8.0360000 + 429 429 1 0.0000000 29.4670000 32.1460000 13.3940000 + 430 430 1 0.0000000 29.4670000 32.1460000 18.7520000 + 431 431 1 0.0000000 29.4670000 32.1460000 24.1090000 + 432 432 1 0.0000000 29.4670000 32.1460000 29.4670000 + 433 433 1 0.0000000 2.6790000 2.6790000 5.3580000 + 434 434 1 0.0000000 2.6790000 2.6790000 10.7150000 + 435 435 1 0.0000000 2.6790000 2.6790000 16.0730000 + 436 436 1 0.0000000 2.6790000 2.6790000 21.4310000 + 437 437 1 0.0000000 2.6790000 2.6790000 26.7880000 + 438 438 1 0.0000000 2.6790000 2.6790000 32.1460000 + 439 439 1 0.0000000 2.6790000 8.0360000 5.3580000 + 440 440 1 0.0000000 2.6790000 8.0360000 10.7150000 + 441 441 1 0.0000000 2.6790000 8.0360000 16.0730000 + 442 442 1 0.0000000 2.6790000 8.0360000 21.4310000 + 443 443 1 0.0000000 2.6790000 8.0360000 26.7880000 + 444 444 1 0.0000000 2.6790000 8.0360000 32.1460000 + 445 445 1 0.0000000 2.6790000 13.3940000 5.3580000 + 446 446 1 0.0000000 2.6790000 13.3940000 10.7150000 + 447 447 1 0.0000000 2.6790000 13.3940000 16.0730000 + 448 448 1 0.0000000 2.6790000 13.3940000 21.4310000 + 449 449 1 0.0000000 2.6790000 13.3940000 26.7880000 + 450 450 1 0.0000000 2.6790000 13.3940000 32.1460000 + 451 451 1 0.0000000 2.6790000 18.7520000 5.3580000 + 452 452 1 0.0000000 2.6790000 18.7520000 10.7150000 + 453 453 1 0.0000000 2.6790000 18.7520000 16.0730000 + 454 454 1 0.0000000 2.6790000 18.7520000 21.4310000 + 455 455 1 0.0000000 2.6790000 18.7520000 26.7880000 + 456 456 1 0.0000000 2.6790000 18.7520000 32.1460000 + 457 457 1 0.0000000 2.6790000 24.1090000 5.3580000 + 458 458 1 0.0000000 2.6790000 24.1090000 10.7150000 + 459 459 1 0.0000000 2.6790000 24.1090000 16.0730000 + 460 460 1 0.0000000 2.6790000 24.1090000 21.4310000 + 461 461 1 0.0000000 2.6790000 24.1090000 26.7880000 + 462 462 1 0.0000000 2.6790000 24.1090000 32.1460000 + 463 463 1 0.0000000 2.6790000 29.4670000 5.3580000 + 464 464 1 0.0000000 2.6790000 29.4670000 10.7150000 + 465 465 1 0.0000000 2.6790000 29.4670000 16.0730000 + 466 466 1 0.0000000 2.6790000 29.4670000 21.4310000 + 467 467 1 0.0000000 2.6790000 29.4670000 26.7880000 + 468 468 1 0.0000000 2.6790000 29.4670000 32.1460000 + 469 469 1 0.0000000 8.0360000 2.6790000 5.3580000 + 470 470 1 0.0000000 8.0360000 2.6790000 10.7150000 + 471 471 1 0.0000000 8.0360000 2.6790000 16.0730000 + 472 472 1 0.0000000 8.0360000 2.6790000 21.4310000 + 473 473 1 0.0000000 8.0360000 2.6790000 26.7880000 + 474 474 1 0.0000000 8.0360000 2.6790000 32.1460000 + 475 475 1 0.0000000 8.0360000 8.0360000 5.3580000 + 476 476 1 0.0000000 8.0360000 8.0360000 10.7150000 + 477 477 1 0.0000000 8.0360000 8.0360000 16.0730000 + 478 478 1 0.0000000 8.0360000 8.0360000 21.4310000 + 479 479 1 0.0000000 8.0360000 8.0360000 26.7880000 + 480 480 1 0.0000000 8.0360000 8.0360000 32.1460000 + 481 481 1 0.0000000 8.0360000 13.3940000 5.3580000 + 482 482 1 0.0000000 8.0360000 13.3940000 10.7150000 + 483 483 1 0.0000000 8.0360000 13.3940000 16.0730000 + 484 484 1 0.0000000 8.0360000 13.3940000 21.4310000 + 485 485 1 0.0000000 8.0360000 13.3940000 26.7880000 + 486 486 1 0.0000000 8.0360000 13.3940000 32.1460000 + 487 487 1 0.0000000 8.0360000 18.7520000 5.3580000 + 488 488 1 0.0000000 8.0360000 18.7520000 10.7150000 + 489 489 1 0.0000000 8.0360000 18.7520000 16.0730000 + 490 490 1 0.0000000 8.0360000 18.7520000 21.4310000 + 491 491 1 0.0000000 8.0360000 18.7520000 26.7880000 + 492 492 1 0.0000000 8.0360000 18.7520000 32.1460000 + 493 493 1 0.0000000 8.0360000 24.1090000 5.3580000 + 494 494 1 0.0000000 8.0360000 24.1090000 10.7150000 + 495 495 1 0.0000000 8.0360000 24.1090000 16.0730000 + 496 496 1 0.0000000 8.0360000 24.1090000 21.4310000 + 497 497 1 0.0000000 8.0360000 24.1090000 26.7880000 + 498 498 1 0.0000000 8.0360000 24.1090000 32.1460000 + 499 499 1 0.0000000 8.0360000 29.4670000 5.3580000 + 500 500 1 0.0000000 8.0360000 29.4670000 10.7150000 + 501 501 1 0.0000000 8.0360000 29.4670000 16.0730000 + 502 502 1 0.0000000 8.0360000 29.4670000 21.4310000 + 503 503 1 0.0000000 8.0360000 29.4670000 26.7880000 + 504 504 1 0.0000000 8.0360000 29.4670000 32.1460000 + 505 505 1 0.0000000 13.3940000 2.6790000 5.3580000 + 506 506 1 0.0000000 13.3940000 2.6790000 10.7150000 + 507 507 1 0.0000000 13.3940000 2.6790000 16.0730000 + 508 508 1 0.0000000 13.3940000 2.6790000 21.4310000 + 509 509 1 0.0000000 13.3940000 2.6790000 26.7880000 + 510 510 1 0.0000000 13.3940000 2.6790000 32.1460000 + 511 511 1 0.0000000 13.3940000 8.0360000 5.3580000 + 512 512 1 0.0000000 13.3940000 8.0360000 10.7150000 + 513 513 1 0.0000000 13.3940000 8.0360000 16.0730000 + 514 514 1 0.0000000 13.3940000 8.0360000 21.4310000 + 515 515 1 0.0000000 13.3940000 8.0360000 26.7880000 + 516 516 1 0.0000000 13.3940000 8.0360000 32.1460000 + 517 517 1 0.0000000 13.3940000 13.3940000 5.3580000 + 518 518 1 0.0000000 13.3940000 13.3940000 10.7150000 + 519 519 1 0.0000000 13.3940000 13.3940000 16.0730000 + 520 520 1 0.0000000 13.3940000 13.3940000 21.4310000 + 521 521 1 0.0000000 13.3940000 13.3940000 26.7880000 + 522 522 1 0.0000000 13.3940000 13.3940000 32.1460000 + 523 523 1 0.0000000 13.3940000 18.7520000 5.3580000 + 524 524 1 0.0000000 13.3940000 18.7520000 10.7150000 + 525 525 1 0.0000000 13.3940000 18.7520000 16.0730000 + 526 526 1 0.0000000 13.3940000 18.7520000 21.4310000 + 527 527 1 0.0000000 13.3940000 18.7520000 26.7880000 + 528 528 1 0.0000000 13.3940000 18.7520000 32.1460000 + 529 529 1 0.0000000 13.3940000 24.1090000 5.3580000 + 530 530 1 0.0000000 13.3940000 24.1090000 10.7150000 + 531 531 1 0.0000000 13.3940000 24.1090000 16.0730000 + 532 532 1 0.0000000 13.3940000 24.1090000 21.4310000 + 533 533 1 0.0000000 13.3940000 24.1090000 26.7880000 + 534 534 1 0.0000000 13.3940000 24.1090000 32.1460000 + 535 535 1 0.0000000 13.3940000 29.4670000 5.3580000 + 536 536 1 0.0000000 13.3940000 29.4670000 10.7150000 + 537 537 1 0.0000000 13.3940000 29.4670000 16.0730000 + 538 538 1 0.0000000 13.3940000 29.4670000 21.4310000 + 539 539 1 0.0000000 13.3940000 29.4670000 26.7880000 + 540 540 1 0.0000000 13.3940000 29.4670000 32.1460000 + 541 541 1 0.0000000 18.7520000 2.6790000 5.3580000 + 542 542 1 0.0000000 18.7520000 2.6790000 10.7150000 + 543 543 1 0.0000000 18.7520000 2.6790000 16.0730000 + 544 544 1 0.0000000 18.7520000 2.6790000 21.4310000 + 545 545 1 0.0000000 18.7520000 2.6790000 26.7880000 + 546 546 1 0.0000000 18.7520000 2.6790000 32.1460000 + 547 547 1 0.0000000 18.7520000 8.0360000 5.3580000 + 548 548 1 0.0000000 18.7520000 8.0360000 10.7150000 + 549 549 1 0.0000000 18.7520000 8.0360000 16.0730000 + 550 550 1 0.0000000 18.7520000 8.0360000 21.4310000 + 551 551 1 0.0000000 18.7520000 8.0360000 26.7880000 + 552 552 1 0.0000000 18.7520000 8.0360000 32.1460000 + 553 553 1 0.0000000 18.7520000 13.3940000 5.3580000 + 554 554 1 0.0000000 18.7520000 13.3940000 10.7150000 + 555 555 1 0.0000000 18.7520000 13.3940000 16.0730000 + 556 556 1 0.0000000 18.7520000 13.3940000 21.4310000 + 557 557 1 0.0000000 18.7520000 13.3940000 26.7880000 + 558 558 1 0.0000000 18.7520000 13.3940000 32.1460000 + 559 559 1 0.0000000 18.7520000 18.7520000 5.3580000 + 560 560 1 0.0000000 18.7520000 18.7520000 10.7150000 + 561 561 1 0.0000000 18.7520000 18.7520000 16.0730000 + 562 562 1 0.0000000 18.7520000 18.7520000 21.4310000 + 563 563 1 0.0000000 18.7520000 18.7520000 26.7880000 + 564 564 1 0.0000000 18.7520000 18.7520000 32.1460000 + 565 565 1 0.0000000 18.7520000 24.1090000 5.3580000 + 566 566 1 0.0000000 18.7520000 24.1090000 10.7150000 + 567 567 1 0.0000000 18.7520000 24.1090000 16.0730000 + 568 568 1 0.0000000 18.7520000 24.1090000 21.4310000 + 569 569 1 0.0000000 18.7520000 24.1090000 26.7880000 + 570 570 1 0.0000000 18.7520000 24.1090000 32.1460000 + 571 571 1 0.0000000 18.7520000 29.4670000 5.3580000 + 572 572 1 0.0000000 18.7520000 29.4670000 10.7150000 + 573 573 1 0.0000000 18.7520000 29.4670000 16.0730000 + 574 574 1 0.0000000 18.7520000 29.4670000 21.4310000 + 575 575 1 0.0000000 18.7520000 29.4670000 26.7880000 + 576 576 1 0.0000000 18.7520000 29.4670000 32.1460000 + 577 577 1 0.0000000 24.1090000 2.6790000 5.3580000 + 578 578 1 0.0000000 24.1090000 2.6790000 10.7150000 + 579 579 1 0.0000000 24.1090000 2.6790000 16.0730000 + 580 580 1 0.0000000 24.1090000 2.6790000 21.4310000 + 581 581 1 0.0000000 24.1090000 2.6790000 26.7880000 + 582 582 1 0.0000000 24.1090000 2.6790000 32.1460000 + 583 583 1 0.0000000 24.1090000 8.0360000 5.3580000 + 584 584 1 0.0000000 24.1090000 8.0360000 10.7150000 + 585 585 1 0.0000000 24.1090000 8.0360000 16.0730000 + 586 586 1 0.0000000 24.1090000 8.0360000 21.4310000 + 587 587 1 0.0000000 24.1090000 8.0360000 26.7880000 + 588 588 1 0.0000000 24.1090000 8.0360000 32.1460000 + 589 589 1 0.0000000 24.1090000 13.3940000 5.3580000 + 590 590 1 0.0000000 24.1090000 13.3940000 10.7150000 + 591 591 1 0.0000000 24.1090000 13.3940000 16.0730000 + 592 592 1 0.0000000 24.1090000 13.3940000 21.4310000 + 593 593 1 0.0000000 24.1090000 13.3940000 26.7880000 + 594 594 1 0.0000000 24.1090000 13.3940000 32.1460000 + 595 595 1 0.0000000 24.1090000 18.7520000 5.3580000 + 596 596 1 0.0000000 24.1090000 18.7520000 10.7150000 + 597 597 1 0.0000000 24.1090000 18.7520000 16.0730000 + 598 598 1 0.0000000 24.1090000 18.7520000 21.4310000 + 599 599 1 0.0000000 24.1090000 18.7520000 26.7880000 + 600 600 1 0.0000000 24.1090000 18.7520000 32.1460000 + 601 601 1 0.0000000 24.1090000 24.1090000 5.3580000 + 602 602 1 0.0000000 24.1090000 24.1090000 10.7150000 + 603 603 1 0.0000000 24.1090000 24.1090000 16.0730000 + 604 604 1 0.0000000 24.1090000 24.1090000 21.4310000 + 605 605 1 0.0000000 24.1090000 24.1090000 26.7880000 + 606 606 1 0.0000000 24.1090000 24.1090000 32.1460000 + 607 607 1 0.0000000 24.1090000 29.4670000 5.3580000 + 608 608 1 0.0000000 24.1090000 29.4670000 10.7150000 + 609 609 1 0.0000000 24.1090000 29.4670000 16.0730000 + 610 610 1 0.0000000 24.1090000 29.4670000 21.4310000 + 611 611 1 0.0000000 24.1090000 29.4670000 26.7880000 + 612 612 1 0.0000000 24.1090000 29.4670000 32.1460000 + 613 613 1 0.0000000 29.4670000 2.6790000 5.3580000 + 614 614 1 0.0000000 29.4670000 2.6790000 10.7150000 + 615 615 1 0.0000000 29.4670000 2.6790000 16.0730000 + 616 616 1 0.0000000 29.4670000 2.6790000 21.4310000 + 617 617 1 0.0000000 29.4670000 2.6790000 26.7880000 + 618 618 1 0.0000000 29.4670000 2.6790000 32.1460000 + 619 619 1 0.0000000 29.4670000 8.0360000 5.3580000 + 620 620 1 0.0000000 29.4670000 8.0360000 10.7150000 + 621 621 1 0.0000000 29.4670000 8.0360000 16.0730000 + 622 622 1 0.0000000 29.4670000 8.0360000 21.4310000 + 623 623 1 0.0000000 29.4670000 8.0360000 26.7880000 + 624 624 1 0.0000000 29.4670000 8.0360000 32.1460000 + 625 625 1 0.0000000 29.4670000 13.3940000 5.3580000 + 626 626 1 0.0000000 29.4670000 13.3940000 10.7150000 + 627 627 1 0.0000000 29.4670000 13.3940000 16.0730000 + 628 628 1 0.0000000 29.4670000 13.3940000 21.4310000 + 629 629 1 0.0000000 29.4670000 13.3940000 26.7880000 + 630 630 1 0.0000000 29.4670000 13.3940000 32.1460000 + 631 631 1 0.0000000 29.4670000 18.7520000 5.3580000 + 632 632 1 0.0000000 29.4670000 18.7520000 10.7150000 + 633 633 1 0.0000000 29.4670000 18.7520000 16.0730000 + 634 634 1 0.0000000 29.4670000 18.7520000 21.4310000 + 635 635 1 0.0000000 29.4670000 18.7520000 26.7880000 + 636 636 1 0.0000000 29.4670000 18.7520000 32.1460000 + 637 637 1 0.0000000 29.4670000 24.1090000 5.3580000 + 638 638 1 0.0000000 29.4670000 24.1090000 10.7150000 + 639 639 1 0.0000000 29.4670000 24.1090000 16.0730000 + 640 640 1 0.0000000 29.4670000 24.1090000 21.4310000 + 641 641 1 0.0000000 29.4670000 24.1090000 26.7880000 + 642 642 1 0.0000000 29.4670000 24.1090000 32.1460000 + 643 643 1 0.0000000 29.4670000 29.4670000 5.3580000 + 644 644 1 0.0000000 29.4670000 29.4670000 10.7150000 + 645 645 1 0.0000000 29.4670000 29.4670000 16.0730000 + 646 646 1 0.0000000 29.4670000 29.4670000 21.4310000 + 647 647 1 0.0000000 29.4670000 29.4670000 26.7880000 + 648 648 1 0.0000000 29.4670000 29.4670000 32.1460000 + 649 649 1 0.0000000 0.0000000 5.3580000 5.3580000 + 650 650 1 0.0000000 0.0000000 5.3580000 10.7150000 + 651 651 1 0.0000000 0.0000000 5.3580000 16.0730000 + 652 652 1 0.0000000 0.0000000 5.3580000 21.4310000 + 653 653 1 0.0000000 0.0000000 5.3580000 26.7880000 + 654 654 1 0.0000000 0.0000000 5.3580000 32.1460000 + 655 655 1 0.0000000 0.0000000 10.7150000 5.3580000 + 656 656 1 0.0000000 0.0000000 10.7150000 10.7150000 + 657 657 1 0.0000000 0.0000000 10.7150000 16.0730000 + 658 658 1 0.0000000 0.0000000 10.7150000 21.4310000 + 659 659 1 0.0000000 0.0000000 10.7150000 26.7880000 + 660 660 1 0.0000000 0.0000000 10.7150000 32.1460000 + 661 661 1 0.0000000 0.0000000 16.0730000 5.3580000 + 662 662 1 0.0000000 0.0000000 16.0730000 10.7150000 + 663 663 1 0.0000000 0.0000000 16.0730000 16.0730000 + 664 664 1 0.0000000 0.0000000 16.0730000 21.4310000 + 665 665 1 0.0000000 0.0000000 16.0730000 26.7880000 + 666 666 1 0.0000000 0.0000000 16.0730000 32.1460000 + 667 667 1 0.0000000 0.0000000 21.4310000 5.3580000 + 668 668 1 0.0000000 0.0000000 21.4310000 10.7150000 + 669 669 1 0.0000000 0.0000000 21.4310000 16.0730000 + 670 670 1 0.0000000 0.0000000 21.4310000 21.4310000 + 671 671 1 0.0000000 0.0000000 21.4310000 26.7880000 + 672 672 1 0.0000000 0.0000000 21.4310000 32.1460000 + 673 673 1 0.0000000 0.0000000 26.7880000 5.3580000 + 674 674 1 0.0000000 0.0000000 26.7880000 10.7150000 + 675 675 1 0.0000000 0.0000000 26.7880000 16.0730000 + 676 676 1 0.0000000 0.0000000 26.7880000 21.4310000 + 677 677 1 0.0000000 0.0000000 26.7880000 26.7880000 + 678 678 1 0.0000000 0.0000000 26.7880000 32.1460000 + 679 679 1 0.0000000 0.0000000 32.1460000 5.3580000 + 680 680 1 0.0000000 0.0000000 32.1460000 10.7150000 + 681 681 1 0.0000000 0.0000000 32.1460000 16.0730000 + 682 682 1 0.0000000 0.0000000 32.1460000 21.4310000 + 683 683 1 0.0000000 0.0000000 32.1460000 26.7880000 + 684 684 1 0.0000000 0.0000000 32.1460000 32.1460000 + 685 685 1 0.0000000 5.3580000 5.3580000 5.3580000 + 686 686 1 0.0000000 5.3580000 5.3580000 10.7150000 + 687 687 1 0.0000000 5.3580000 5.3580000 16.0730000 + 688 688 1 0.0000000 5.3580000 5.3580000 21.4310000 + 689 689 1 0.0000000 5.3580000 5.3580000 26.7880000 + 690 690 1 0.0000000 5.3580000 5.3580000 32.1460000 + 691 691 1 0.0000000 5.3580000 10.7150000 5.3580000 + 692 692 1 0.0000000 5.3580000 10.7150000 10.7150000 + 693 693 1 0.0000000 5.3580000 10.7150000 16.0730000 + 694 694 1 0.0000000 5.3580000 10.7150000 21.4310000 + 695 695 1 0.0000000 5.3580000 10.7150000 26.7880000 + 696 696 1 0.0000000 5.3580000 10.7150000 32.1460000 + 697 697 1 0.0000000 5.3580000 16.0730000 5.3580000 + 698 698 1 0.0000000 5.3580000 16.0730000 10.7150000 + 699 699 1 0.0000000 5.3580000 16.0730000 16.0730000 + 700 700 1 0.0000000 5.3580000 16.0730000 21.4310000 + 701 701 1 0.0000000 5.3580000 16.0730000 26.7880000 + 702 702 1 0.0000000 5.3580000 16.0730000 32.1460000 + 703 703 1 0.0000000 5.3580000 21.4310000 5.3580000 + 704 704 1 0.0000000 5.3580000 21.4310000 10.7150000 + 705 705 1 0.0000000 5.3580000 21.4310000 16.0730000 + 706 706 1 0.0000000 5.3580000 21.4310000 21.4310000 + 707 707 1 0.0000000 5.3580000 21.4310000 26.7880000 + 708 708 1 0.0000000 5.3580000 21.4310000 32.1460000 + 709 709 1 0.0000000 5.3580000 26.7880000 5.3580000 + 710 710 1 0.0000000 5.3580000 26.7880000 10.7150000 + 711 711 1 0.0000000 5.3580000 26.7880000 16.0730000 + 712 712 1 0.0000000 5.3580000 26.7880000 21.4310000 + 713 713 1 0.0000000 5.3580000 26.7880000 26.7880000 + 714 714 1 0.0000000 5.3580000 26.7880000 32.1460000 + 715 715 1 0.0000000 5.3580000 32.1460000 5.3580000 + 716 716 1 0.0000000 5.3580000 32.1460000 10.7150000 + 717 717 1 0.0000000 5.3580000 32.1460000 16.0730000 + 718 718 1 0.0000000 5.3580000 32.1460000 21.4310000 + 719 719 1 0.0000000 5.3580000 32.1460000 26.7880000 + 720 720 1 0.0000000 5.3580000 32.1460000 32.1460000 + 721 721 1 0.0000000 10.7150000 5.3580000 5.3580000 + 722 722 1 0.0000000 10.7150000 5.3580000 10.7150000 + 723 723 1 0.0000000 10.7150000 5.3580000 16.0730000 + 724 724 1 0.0000000 10.7150000 5.3580000 21.4310000 + 725 725 1 0.0000000 10.7150000 5.3580000 26.7880000 + 726 726 1 0.0000000 10.7150000 5.3580000 32.1460000 + 727 727 1 0.0000000 10.7150000 10.7150000 5.3580000 + 728 728 1 0.0000000 10.7150000 10.7150000 10.7150000 + 729 729 1 0.0000000 10.7150000 10.7150000 16.0730000 + 730 730 1 0.0000000 10.7150000 10.7150000 21.4310000 + 731 731 1 0.0000000 10.7150000 10.7150000 26.7880000 + 732 732 1 0.0000000 10.7150000 10.7150000 32.1460000 + 733 733 1 0.0000000 10.7150000 16.0730000 5.3580000 + 734 734 1 0.0000000 10.7150000 16.0730000 10.7150000 + 735 735 1 0.0000000 10.7150000 16.0730000 16.0730000 + 736 736 1 0.0000000 10.7150000 16.0730000 21.4310000 + 737 737 1 0.0000000 10.7150000 16.0730000 26.7880000 + 738 738 1 0.0000000 10.7150000 16.0730000 32.1460000 + 739 739 1 0.0000000 10.7150000 21.4310000 5.3580000 + 740 740 1 0.0000000 10.7150000 21.4310000 10.7150000 + 741 741 1 0.0000000 10.7150000 21.4310000 16.0730000 + 742 742 1 0.0000000 10.7150000 21.4310000 21.4310000 + 743 743 1 0.0000000 10.7150000 21.4310000 26.7880000 + 744 744 1 0.0000000 10.7150000 21.4310000 32.1460000 + 745 745 1 0.0000000 10.7150000 26.7880000 5.3580000 + 746 746 1 0.0000000 10.7150000 26.7880000 10.7150000 + 747 747 1 0.0000000 10.7150000 26.7880000 16.0730000 + 748 748 1 0.0000000 10.7150000 26.7880000 21.4310000 + 749 749 1 0.0000000 10.7150000 26.7880000 26.7880000 + 750 750 1 0.0000000 10.7150000 26.7880000 32.1460000 + 751 751 1 0.0000000 10.7150000 32.1460000 5.3580000 + 752 752 1 0.0000000 10.7150000 32.1460000 10.7150000 + 753 753 1 0.0000000 10.7150000 32.1460000 16.0730000 + 754 754 1 0.0000000 10.7150000 32.1460000 21.4310000 + 755 755 1 0.0000000 10.7150000 32.1460000 26.7880000 + 756 756 1 0.0000000 10.7150000 32.1460000 32.1460000 + 757 757 1 0.0000000 16.0730000 5.3580000 5.3580000 + 758 758 1 0.0000000 16.0730000 5.3580000 10.7150000 + 759 759 1 0.0000000 16.0730000 5.3580000 16.0730000 + 760 760 1 0.0000000 16.0730000 5.3580000 21.4310000 + 761 761 1 0.0000000 16.0730000 5.3580000 26.7880000 + 762 762 1 0.0000000 16.0730000 5.3580000 32.1460000 + 763 763 1 0.0000000 16.0730000 10.7150000 5.3580000 + 764 764 1 0.0000000 16.0730000 10.7150000 10.7150000 + 765 765 1 0.0000000 16.0730000 10.7150000 16.0730000 + 766 766 1 0.0000000 16.0730000 10.7150000 21.4310000 + 767 767 1 0.0000000 16.0730000 10.7150000 26.7880000 + 768 768 1 0.0000000 16.0730000 10.7150000 32.1460000 + 769 769 1 0.0000000 16.0730000 16.0730000 5.3580000 + 770 770 1 0.0000000 16.0730000 16.0730000 10.7150000 + 771 771 1 0.0000000 16.0730000 16.0730000 16.0730000 + 772 772 1 0.0000000 16.0730000 16.0730000 21.4310000 + 773 773 1 0.0000000 16.0730000 16.0730000 26.7880000 + 774 774 1 0.0000000 16.0730000 16.0730000 32.1460000 + 775 775 1 0.0000000 16.0730000 21.4310000 5.3580000 + 776 776 1 0.0000000 16.0730000 21.4310000 10.7150000 + 777 777 1 0.0000000 16.0730000 21.4310000 16.0730000 + 778 778 1 0.0000000 16.0730000 21.4310000 21.4310000 + 779 779 1 0.0000000 16.0730000 21.4310000 26.7880000 + 780 780 1 0.0000000 16.0730000 21.4310000 32.1460000 + 781 781 1 0.0000000 16.0730000 26.7880000 5.3580000 + 782 782 1 0.0000000 16.0730000 26.7880000 10.7150000 + 783 783 1 0.0000000 16.0730000 26.7880000 16.0730000 + 784 784 1 0.0000000 16.0730000 26.7880000 21.4310000 + 785 785 1 0.0000000 16.0730000 26.7880000 26.7880000 + 786 786 1 0.0000000 16.0730000 26.7880000 32.1460000 + 787 787 1 0.0000000 16.0730000 32.1460000 5.3580000 + 788 788 1 0.0000000 16.0730000 32.1460000 10.7150000 + 789 789 1 0.0000000 16.0730000 32.1460000 16.0730000 + 790 790 1 0.0000000 16.0730000 32.1460000 21.4310000 + 791 791 1 0.0000000 16.0730000 32.1460000 26.7880000 + 792 792 1 0.0000000 16.0730000 32.1460000 32.1460000 + 793 793 1 0.0000000 21.4310000 5.3580000 5.3580000 + 794 794 1 0.0000000 21.4310000 5.3580000 10.7150000 + 795 795 1 0.0000000 21.4310000 5.3580000 16.0730000 + 796 796 1 0.0000000 21.4310000 5.3580000 21.4310000 + 797 797 1 0.0000000 21.4310000 5.3580000 26.7880000 + 798 798 1 0.0000000 21.4310000 5.3580000 32.1460000 + 799 799 1 0.0000000 21.4310000 10.7150000 5.3580000 + 800 800 1 0.0000000 21.4310000 10.7150000 10.7150000 + 801 801 1 0.0000000 21.4310000 10.7150000 16.0730000 + 802 802 1 0.0000000 21.4310000 10.7150000 21.4310000 + 803 803 1 0.0000000 21.4310000 10.7150000 26.7880000 + 804 804 1 0.0000000 21.4310000 10.7150000 32.1460000 + 805 805 1 0.0000000 21.4310000 16.0730000 5.3580000 + 806 806 1 0.0000000 21.4310000 16.0730000 10.7150000 + 807 807 1 0.0000000 21.4310000 16.0730000 16.0730000 + 808 808 1 0.0000000 21.4310000 16.0730000 21.4310000 + 809 809 1 0.0000000 21.4310000 16.0730000 26.7880000 + 810 810 1 0.0000000 21.4310000 16.0730000 32.1460000 + 811 811 1 0.0000000 21.4310000 21.4310000 5.3580000 + 812 812 1 0.0000000 21.4310000 21.4310000 10.7150000 + 813 813 1 0.0000000 21.4310000 21.4310000 16.0730000 + 814 814 1 0.0000000 21.4310000 21.4310000 21.4310000 + 815 815 1 0.0000000 21.4310000 21.4310000 26.7880000 + 816 816 1 0.0000000 21.4310000 21.4310000 32.1460000 + 817 817 1 0.0000000 21.4310000 26.7880000 5.3580000 + 818 818 1 0.0000000 21.4310000 26.7880000 10.7150000 + 819 819 1 0.0000000 21.4310000 26.7880000 16.0730000 + 820 820 1 0.0000000 21.4310000 26.7880000 21.4310000 + 821 821 1 0.0000000 21.4310000 26.7880000 26.7880000 + 822 822 1 0.0000000 21.4310000 26.7880000 32.1460000 + 823 823 1 0.0000000 21.4310000 32.1460000 5.3580000 + 824 824 1 0.0000000 21.4310000 32.1460000 10.7150000 + 825 825 1 0.0000000 21.4310000 32.1460000 16.0730000 + 826 826 1 0.0000000 21.4310000 32.1460000 21.4310000 + 827 827 1 0.0000000 21.4310000 32.1460000 26.7880000 + 828 828 1 0.0000000 21.4310000 32.1460000 32.1460000 + 829 829 1 0.0000000 26.7880000 5.3580000 5.3580000 + 830 830 1 0.0000000 26.7880000 5.3580000 10.7150000 + 831 831 1 0.0000000 26.7880000 5.3580000 16.0730000 + 832 832 1 0.0000000 26.7880000 5.3580000 21.4310000 + 833 833 1 0.0000000 26.7880000 5.3580000 26.7880000 + 834 834 1 0.0000000 26.7880000 5.3580000 32.1460000 + 835 835 1 0.0000000 26.7880000 10.7150000 5.3580000 + 836 836 1 0.0000000 26.7880000 10.7150000 10.7150000 + 837 837 1 0.0000000 26.7880000 10.7150000 16.0730000 + 838 838 1 0.0000000 26.7880000 10.7150000 21.4310000 + 839 839 1 0.0000000 26.7880000 10.7150000 26.7880000 + 840 840 1 0.0000000 26.7880000 10.7150000 32.1460000 + 841 841 1 0.0000000 26.7880000 16.0730000 5.3580000 + 842 842 1 0.0000000 26.7880000 16.0730000 10.7150000 + 843 843 1 0.0000000 26.7880000 16.0730000 16.0730000 + 844 844 1 0.0000000 26.7880000 16.0730000 21.4310000 + 845 845 1 0.0000000 26.7880000 16.0730000 26.7880000 + 846 846 1 0.0000000 26.7880000 16.0730000 32.1460000 + 847 847 1 0.0000000 26.7880000 21.4310000 5.3580000 + 848 848 1 0.0000000 26.7880000 21.4310000 10.7150000 + 849 849 1 0.0000000 26.7880000 21.4310000 16.0730000 + 850 850 1 0.0000000 26.7880000 21.4310000 21.4310000 + 851 851 1 0.0000000 26.7880000 21.4310000 26.7880000 + 852 852 1 0.0000000 26.7880000 21.4310000 32.1460000 + 853 853 1 0.0000000 26.7880000 26.7880000 5.3580000 + 854 854 1 0.0000000 26.7880000 26.7880000 10.7150000 + 855 855 1 0.0000000 26.7880000 26.7880000 16.0730000 + 856 856 1 0.0000000 26.7880000 26.7880000 21.4310000 + 857 857 1 0.0000000 26.7880000 26.7880000 26.7880000 + 858 858 1 0.0000000 26.7880000 26.7880000 32.1460000 + 859 859 1 0.0000000 26.7880000 32.1460000 5.3580000 + 860 860 1 0.0000000 26.7880000 32.1460000 10.7150000 + 861 861 1 0.0000000 26.7880000 32.1460000 16.0730000 + 862 862 1 0.0000000 26.7880000 32.1460000 21.4310000 + 863 863 1 0.0000000 26.7880000 32.1460000 26.7880000 + 864 864 1 0.0000000 26.7880000 32.1460000 32.1460000 + diff --git a/examples/python/gjf_python/ff-argon.lmp b/examples/python/gjf_python/ff-argon.lmp new file mode 100644 index 0000000000..b6f7bc931a --- /dev/null +++ b/examples/python/gjf_python/ff-argon.lmp @@ -0,0 +1,20 @@ +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + diff --git a/examples/python/gjf_python/gjf.py b/examples/python/gjf_python/gjf.py new file mode 100644 index 0000000000..37fc28bb79 --- /dev/null +++ b/examples/python/gjf_python/gjf.py @@ -0,0 +1,180 @@ +"""Made by Charlie Sievers Ph.D. Candidate, UC Davis, Donadio Lab 2019""" + +from mpi4py import MPI +from lammps import lammps +import lammps_tools as lt +import numpy as np + +comm = MPI.COMM_WORLD +rank = comm.Get_rank() + +""" LAMMPS VARIABLES """ + +# new file or restart +run_no = 0 + +# data files +infile = "argon.lmp" +restart_file = "final_restart.{}".format(run_no) +ff_file = "ff-argon.lmp" +outfile = "output.dat" + +# write final_restart +write_final_restart = False + +# random numbers +seed0 = 2357 +seed1 = 26588 +seed2 = 10669 + +# MD Parameters +# number of steps +nsteps = 50000 +# timestep +# dt = 0.001 +# starting simulation temp +temp_start = 10 +# final simulation temp +temp_final = 10 +# relaxation time +trel = 1 +# trajectory frequency +ntraj = 0 + +# Ensemble 0 = GJF u, 1 = GJF v, 2 = Nose-Hoover, 3 = Langevin, 4 = BDP (Currently all NVT) +ensemble = 0 + +# Output Parameters +nthermo = 200 +nout = int(nsteps / nthermo) # Important + +# output to screen and log file? +lammps_output = False +# Lammps Thermo +thermo = False + +python_output = True + +# Write output to file? +write_output = False + +if write_output is True: + data = open("{}".format(outfile), "w") + +if python_output is True: + if rank == 0: + print("dt, temp, ke, fke, pe, fpe") + +for j in range(20): + + # timestep + dt = 0.005*(j+1) + + if lammps_output is True: + lmp = lammps() + else: + lmp = lammps(cmdargs=["-screen", "none", "-log", "none"]) + + lmp.command("atom_style full") + lmp.command("units metal") + lmp.command("processors * * *") + lmp.command("neighbor 1 bin") + lmp.command("boundary p p p") + + if run_no is 0: + lmp.command("read_data {}".format(infile)) + else: + lmp.command("read_restart final_restart".format(run_no-1)) + + if thermo is True: + lmp.command("thermo_style custom time temp pe ke press vol cpu") + lmp.command("thermo {}".format(nthermo)) + lmp.command("thermo_modify flush yes") + + lmp.file("{}".format(ff_file)) + lmp.command("timestep {}".format(dt)) + + # get_per_atom_compute example with dim of two and within a group + # lmp.command("region rand block 5 20 5 20 5 20") + # lmp.command("group rand region rand") + # lmp.command("compute x rand property/atom x y") + # test = get_per_atom_compute(comm, lmp, "x", 2, group="rand") + + lmp.command("compute ke all ke/atom") + + lmp.command("compute pe all pe") + + if ntraj != 0: + lmp.command("dump 1 all dcd {} trajectory.dcd".format(ntraj)) + lmp.command("dump_modify 1 unwrap yes") + + if run_no == 0: + lmp.command("velocity all create {} {} mom yes dist gaussian".format(temp_start, seed0)) + lmp.command("fix nve all nve") + + if ensemble == 0: + # gjf u + lmp.command("fix lang all langevin {} {} {} {} gjf yes halfstep yes".format( + temp_start, temp_final, trel, seed1)) + elif ensemble == 1: + # gjf v + lmp.command("fix lang all langevin {} {} {} {} gjf yes".format( + temp_start, temp_final, trel, seed1)) + elif ensemble == 2: + # NH + lmp.command("fix nvt all nvt temp {} {} {}".format( + temp_start, temp_final, trel)) + elif ensemble == 3: + # lang + lmp.command("fix lang all langevin {} {} {} {} tally yes zero yes".format( + temp_start, temp_final, trel, seed1)) + elif ensemble == 4: + # BDP + lmp.command("fix stoch all temp/csvr {} {} {} {}".format( + temp_start, temp_final, trel, seed1)) + + natoms = lmp.extract_global("natoms", 0) + nlocal = lmp.extract_global("nlocal", 0) + ke_sum = lt.get_per_atom_compute(comm, lmp, "ke") + ke_2 = ke_sum**2 + pe_sum = 0 + pe_2 = 0 + temp_sum = 0 + + for i in range(nout): + nlocal = lmp.extract_global("nlocal", 0) + lmp.command("run {} pre no post no".format(nthermo)) + temp = lmp.extract_compute("thermo_temp", 0, 0) + ke = lt.get_per_atom_compute(comm, lmp, "ke") + pe = lmp.extract_compute("pe", 0, 0) + ke_sum += ke + ke_2 += ke**2 + pe_sum += pe + pe_2 += pe**2 + temp_sum += temp + + if python_output is True: + if rank == 0: + print("Time: {:.6f}, Temp: {:.6f}, KE: {:.6f}, PE: {:.6f}".format( + i*nthermo*dt, temp, ke.sum(), pe)) + + if write_final_restart is True: + lmp.command("write_restart {}".format(restart_file)) + + if rank == 0: + ke = ke_sum.sum() / (nout + 1) + fke = (np.sqrt((ke_2 - ke_sum ** 2 / (nout + 1)) / (nout + 1))).sum() + pe = pe_sum / nout + fpe = np.sqrt((pe_2 - pe_sum ** 2 / nout) / nout) + temp = temp_sum / nout + + if python_output is True: + print(dt, temp, ke, fke, pe, fpe) + + if write_output is True: + data.write("{:.6f} {:.6f} {:.6f} {:.6f} {:.6f} {:.6f}\n".format( + dt, temp, ke, fke, pe, fpe)) + data.flush() + +if write_output is True: + data.close() diff --git a/examples/python/gjf_python/lammps_tools.py b/examples/python/gjf_python/lammps_tools.py new file mode 100644 index 0000000000..f9f25eaa28 --- /dev/null +++ b/examples/python/gjf_python/lammps_tools.py @@ -0,0 +1,78 @@ +"""Made by Charlie Sievers Ph.D. Candidate, UC Davis, Donadio Lab 2019""" + +from mpi4py import MPI +import numpy as np +import ctypes as ctypes + +""" USEFULL LAMMPS FUNCTION """ + + +def get_nlocal(lmp): + + nlocal = lmp.extract_global("nlocal", 0) + + return nlocal + + +def get_aid(lmp, group=None): + + if group is None: + c_aid = lmp.extract_atom("id", 0) + ptr = ctypes.cast(c_aid, ctypes.POINTER(ctypes.c_int32 * get_nlocal(lmp))) + aid = np.frombuffer(ptr.contents, dtype=np.int32) + else: + try: + c_aid = lmp.extract_variable("aid", group, 1) + ptr = ctypes.cast(c_aid, ctypes.POINTER(ctypes.c_double * get_nlocal(lmp))) + aid = np.frombuffer(ptr.contents, dtype=np.double) + except ValueError: + lmp.command("variable aid atom id") + aid = get_aid(lmp, group) + + return aid + + +def get_per_atom_compute(comm, lmp, name, dim=1, dtype="double", group=None): + laid = get_aid(lmp, group) + nlocal = get_nlocal(lmp) + ngroup = comm.allgather(laid) + type = dim + if dim > 1: + type = 2 + for array in ngroup: + try: + aid = np.concatenate((aid, array)) + except UnboundLocalError: + aid = array + if dtype == "double": + mem_type = ctypes.c_double + elif dtype == "integer": + mem_type = ctypes.c_int + elif dtype == "bigint": + mem_type = ctypes.c_int32 + else: + print("{} not implemented".format(dtype)) + return + + tmp = lmp.extract_compute(name, 1, type) + if type == 1: + ptr = ctypes.cast(tmp, ctypes.POINTER(mem_type * nlocal)) + else: + ptr = ctypes.cast(tmp[0], ctypes.POINTER(mem_type * nlocal * dim)) + lcompute = comm.allgather(np.frombuffer(ptr.contents).reshape((-1, dim))) + for array in lcompute: + try: + compute = np.concatenate((compute, array)) + except UnboundLocalError: + compute = array + + aid = np.expand_dims(aid, axis=1) + + compute = np.concatenate((aid, compute), axis=-1) + compute = compute[compute[..., 0] != 0] + compute = compute[compute[..., 0].argsort()][..., 1:] + + if dim == 1: + compute = np.squeeze(compute, axis=-1) + + return compute \ No newline at end of file From e517a16bdae1b1b3b1064b39f9a663d5900faff6 Mon Sep 17 00:00:00 2001 From: casievers Date: Fri, 19 Jul 2019 17:21:01 -0700 Subject: [PATCH 053/418] updated gjf in fix_langevin --- src/fix_langevin.cpp | 39 +++++++++++---------------------------- src/fix_langevin.h | 2 +- 2 files changed, 12 insertions(+), 29 deletions(-) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index 5058d5c650..840861ef91 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -174,11 +174,11 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : // no need to set peratom_flag, b/c data is for internal use only if (gjfflag) { - int mem = 6*atom->nmax*sizeof(double); - if (hsflag) mem += 3*atom->nmax*sizeof(double); - - comm->maxexchange_fix = MAX(comm->maxexchange_fix, 0); - comm->maxexchange_fix += MAX(1000, mem); + //int mem = 6*atom->nmax*sizeof(double); + //if (hsflag) mem += 3*atom->nmax*sizeof(double); +// + //comm->maxexchange_fix = MAX(comm->maxexchange_fix, 0); + //comm->maxexchange_fix += MAX(1000, mem); nvalues = 3; grow_arrays(atom->nmax); @@ -232,7 +232,6 @@ FixLangevin::~FixLangevin() int FixLangevin::setmask() { int mask = 0; - //if (gjfflag) mask |= INITIAL_INTEGRATE; if (gjfflag) mask |= POST_INTEGRATE; mask |= POST_FORCE; mask |= POST_FORCE_RESPA; @@ -321,35 +320,19 @@ void FixLangevin::setup(int vflag) post_force_respa(vflag,nlevels_respa-1,0); ((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1); } - if (gjfflag && hsflag) { + if (gjfflag) { - double dt = update->dt; // update v of atoms in group - - double **v = atom->v; - double *rmass = atom->rmass; - int *type = atom->type; + double ** v = atom->v; + double **f = atom->f; int nlocal = atom->nlocal; if (igroup == atom->firstgroup) nlocal = atom->nfirst; - double boltz = force->boltz; - double mvv2e = force->mvv2e; - double ftm2v = force->ftm2v; - - double gamma2; - for (int i = 0; i < nlocal; i++) { - if (rmass) { - gamma2 = sqrt(rmass[i]) * sqrt(2.0*boltz/t_period/dt/mvv2e) / ftm2v; - gamma2 *= 1.0/sqrt(ratio[type[i]]) * tsqrt; - } else { - gamma2 = gfactor2[type[i]] * tsqrt; - } - - franprev[i][0] = gamma2*random->gaussian(); - franprev[i][1] = gamma2*random->gaussian(); - franprev[i][2] = gamma2*random->gaussian(); + f[i][0] = wildcard[i][0]; + f[i][1] = wildcard[i][1]; + f[i][2] = wildcard[i][2]; wildcard[i][0] = v[i][0]; wildcard[i][1] = v[i][1]; wildcard[i][2] = v[i][2]; diff --git a/src/fix_langevin.h b/src/fix_langevin.h index 70fb254f4e..91ed210e54 100644 --- a/src/fix_langevin.h +++ b/src/fix_langevin.h @@ -65,7 +65,7 @@ class FixLangevin : public Fix { double **flangevin; double *tforce; double **franprev; - double **lv; //lucas velocity or half-step velocity + double **lv; //2GJ velocity or half-step velocity double **wildcard; int nvalues; From 473e64c6b6d2c2ac86db5672075febd12af4385c Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 22 Jul 2019 13:49:41 +0000 Subject: [PATCH 054/418] actual gradient of energy, not scaled by hbar. convergence criterion is in eV --- src/SPIN/min_spin_oso_lbfgs.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index 8d05ea63d8..d7e7302e4f 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -313,16 +313,14 @@ void MinSpinOSO_LBFGS::calc_gradient() int nlocal = atom->nlocal; double **sp = atom->sp; double **fm = atom->fm; + double hbar = force->hplanck/MY_2PI; // loop on all spins on proc. for (int i = 0; i < nlocal; i++) { - - // calculate gradients - - g_cur[3 * i + 0] = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - g_cur[3 * i + 1] = -(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - g_cur[3 * i + 2] = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + g_cur[3 * i + 0] = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]) * hbar; + g_cur[3 * i + 1] = -(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]) * hbar; + g_cur[3 * i + 2] = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]) * hbar; } } From e4001b01791e9ac1caa54d0c5962886f566afa18 Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 22 Jul 2019 14:38:02 +0000 Subject: [PATCH 055/418] change convergence criterion --- src/SPIN/min_spin_oso_cg.cpp | 49 +++++++++++++++++++----------------- src/SPIN/min_spin_oso_cg.h | 10 ++++---- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index d8535b19c4..fe52ddebe1 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -66,6 +66,8 @@ MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : { if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_cg); nlocal_max = 0; + alpha_damp = 1.0; + discrete_factor = 10.0; } /* ---------------------------------------------------------------------- */ @@ -81,11 +83,9 @@ MinSpinOSO_CG::~MinSpinOSO_CG() void MinSpinOSO_CG::init() { - alpha_damp = 1.0; - discrete_factor = 10.0; + local_iter = 0; Min::init(); - dts = dt = update->dt; last_negative = update->ntimestep; @@ -216,7 +216,7 @@ int MinSpinOSO_CG::iterate(int maxiter) // sync across replicas if running multi-replica minimization if (update->ftol > 0.0) { - fmdotfm = fmnorm_sqr(); + fmdotfm = max_torque(); if (update->multireplica == 0) { if (fmdotfm < update->ftol*update->ftol) return FTOL; } else { @@ -393,38 +393,41 @@ void MinSpinOSO_CG::advance_spins() } /* ---------------------------------------------------------------------- - compute and return ||mag. torque||_2^2 + compute and return max_i||mag. torque_i||_2 ------------------------------------------------------------------------- */ -double MinSpinOSO_CG::fmnorm_sqr() +double MinSpinOSO_CG::max_torque() { + double fmsq,fmaxsqone,fmaxsqloc,fmaxsqall; int nlocal = atom->nlocal; - double tx,ty,tz; - double **sp = atom->sp; - double **fm = atom->fm; + double hbar = force->hplanck/MY_2PI; - // calc. magnetic torques + // finding max fm on this proc. - double local_norm2_sqr = 0.0; + fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; for (int i = 0; i < nlocal; i++) { - tx = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - ty = (fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - tz = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - - local_norm2_sqr += tx*tx + ty*ty + tz*tz; + fmsq = 0.0; + for (int j = 0; j < 3; j++) + fmsq += g_cur[3 * i + j] * g_cur[3 * i + j]; + fmaxsqone = MAX(fmaxsqone,fmsq); } - // no extra atom calc. for spins + // finding max fm on this replica - if (nextra_atom) - error->all(FLERR,"extra atom option not available yet"); + fmaxsqloc = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - double norm2_sqr = 0.0; - MPI_Allreduce(&local_norm2_sqr,&norm2_sqr,1,MPI_DOUBLE,MPI_SUM,world); + // finding max fm over all replicas, if necessary + // this communicator would be invalid for multiprocess replicas - return norm2_sqr; + fmaxsqall = fmaxsqloc; + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + return sqrt(fmaxsqall) * hbar; } - /* ---------------------------------------------------------------------- calculate 3x3 matrix exponential using Rodrigues' formula (R. Murray, Z. Li, and S. Shankar Sastry, diff --git a/src/SPIN/min_spin_oso_cg.h b/src/SPIN/min_spin_oso_cg.h index 3a3d24f078..81bbd2c294 100644 --- a/src/SPIN/min_spin_oso_cg.h +++ b/src/SPIN/min_spin_oso_cg.h @@ -25,8 +25,7 @@ MinimizeStyle(spin/oso_cg, MinSpinOSO_CG) namespace LAMMPS_NS { class MinSpinOSO_CG : public Min { - -public: + public: MinSpinOSO_CG(class LAMMPS *); virtual ~MinSpinOSO_CG(); void init(); @@ -34,18 +33,19 @@ public: int modify_param(int, char **); void reset_vectors(); int iterate(int); + + private: double evaluate_dt(); void advance_spins(); - double fmnorm_sqr(); + double max_torque(); void calc_gradient(double); void calc_search_direction(); -private: // global and spin timesteps - int nlocal_max; // max value of nlocal (for size of lists) double dt; double dts; + int nlocal_max; // max value of nlocal (for size of lists) double alpha_damp; // damping for spin minimization double discrete_factor; // factor for spin timestep evaluation From fabe611c110b1366088369b9e8c5eb56f50aaf04 Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 22 Jul 2019 17:26:47 +0000 Subject: [PATCH 056/418] use line search or adaptive time step --- src/SPIN/min_spin_oso_cg.cpp | 3 +- src/SPIN/min_spin_oso_cg2.cpp | 98 ++++++++++++++++++++--------------- src/SPIN/min_spin_oso_cg2.h | 4 ++ 3 files changed, 62 insertions(+), 43 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index fe52ddebe1..8eb358f86a 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -151,7 +151,7 @@ void MinSpinOSO_CG::reset_vectors() } /* ---------------------------------------------------------------------- - minimization via damped spin dynamics + minimization via orthogonal spin optimisation ------------------------------------------------------------------------- */ int MinSpinOSO_CG::iterate(int maxiter) @@ -428,6 +428,7 @@ double MinSpinOSO_CG::max_torque() return sqrt(fmaxsqall) * hbar; } + /* ---------------------------------------------------------------------- calculate 3x3 matrix exponential using Rodrigues' formula (R. Murray, Z. Li, and S. Shankar Sastry, diff --git a/src/SPIN/min_spin_oso_cg2.cpp b/src/SPIN/min_spin_oso_cg2.cpp index 23873e24f2..52b98eead7 100644 --- a/src/SPIN/min_spin_oso_cg2.cpp +++ b/src/SPIN/min_spin_oso_cg2.cpp @@ -75,7 +75,7 @@ MinSpinOSO_CG2::MinSpinOSO_CG2(LAMMPS *lmp) : nreplica = universe->nworlds; ireplica = universe->iworld; use_line_search = 1; - maxepsrot = MY_2PI / (100.0); + discrete_factor = 10.0; } @@ -100,6 +100,7 @@ void MinSpinOSO_CG2::init() Min::init(); + dts = dt = update->dt; last_negative = update->ntimestep; // allocate tables @@ -140,9 +141,7 @@ int MinSpinOSO_CG2::modify_param(int narg, char **arg) } if (strcmp(arg[0],"discrete_factor") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - double discrete_factor; discrete_factor = force->numeric(FLERR,arg[1]); - maxepsrot = MY_2PI / discrete_factor; return 2; } return 0; @@ -169,7 +168,7 @@ void MinSpinOSO_CG2::reset_vectors() } /* ---------------------------------------------------------------------- - minimization via damped spin dynamics + minimization via orthogonal spin optimisation ------------------------------------------------------------------------- */ int MinSpinOSO_CG2::iterate(int maxiter) @@ -305,20 +304,21 @@ void MinSpinOSO_CG2::calc_gradient() double **sp = atom->sp; double **fm = atom->fm; double hbar = force->hplanck/MY_2PI; + double factor; + + if (use_line_search) + factor = hbar; + else factor = evaluate_dt(); // loop on all spins on proc. for (int i = 0; i < nlocal; i++) { - - // calculate gradients - - g_cur[3 * i + 0] = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]) * hbar; - g_cur[3 * i + 1] = -(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]) * hbar; - g_cur[3 * i + 2] = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]) * hbar; + g_cur[3 * i + 0] = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]) * factor; + g_cur[3 * i + 1] = -(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]) * factor; + g_cur[3 * i + 2] = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]) * factor; } } - /* ---------------------------------------------------------------------- search direction: The Fletcher-Reeves conj. grad. method @@ -335,14 +335,10 @@ void MinSpinOSO_CG2::calc_search_direction() double g2_global = 0.0; double g2old_global = 0.0; - double scaling = 1.0; - - if (use_line_search == 0) - scaling = maximum_rotation(g_cur); if (local_iter == 0 || local_iter % 5 == 0){ // steepest descent direction for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = -g_cur[i] * scaling; + p_s[i] = -g_cur[i]; g_old[i] = g_cur[i]; } } else { // conjugate direction @@ -352,11 +348,10 @@ void MinSpinOSO_CG2::calc_search_direction() } // now we need to collect/broadcast beta on this replica - // different replica can have different beta for now. // need to check what is beta for GNEB - MPI_Allreduce(&g2, &g2_global, 1, MPI_DOUBLE, MPI_SUM, world); - MPI_Allreduce(&g2old, &g2old_global, 1, MPI_DOUBLE, MPI_SUM, world); + MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,world); // Sum over all replicas. Good for GNEB. if (update->multireplica == 1) { @@ -365,12 +360,11 @@ void MinSpinOSO_CG2::calc_search_direction() MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } - if (fabs(g2_global) < 1.0e-60) beta = 0.0; else beta = g2_global / g2old_global; // calculate conjugate direction for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = (beta * p_s[i] - g_cur[i])*scaling; + p_s[i] = (beta * p_s[i] - g_cur[i]); g_old[i] = g_cur[i]; } } @@ -411,6 +405,11 @@ double MinSpinOSO_CG2::max_torque() { double fmsq,fmaxsqone,fmaxsqloc,fmaxsqall; int nlocal = atom->nlocal; + double factor; + double hbar = force->hplanck/MY_2PI; + + if (use_line_search) factor = 1.0; + else factor = hbar; // finding max fm on this proc. @@ -436,7 +435,7 @@ double MinSpinOSO_CG2::max_torque() MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); } - return sqrt(fmaxsqall); + return sqrt(fmaxsqall) * factor; } /* ---------------------------------------------------------------------- @@ -607,8 +606,6 @@ int MinSpinOSO_CG2::calc_and_make_step(double a, double b, int index) if (alpha < 0.0) alpha = r/2.0; - std::cout << alpha << "\n"; - for (int i = 0; i < nlocal; i++) { for (int j = 0; j < 3; j++) sp[i][j] = sp_copy[i][j]; } @@ -636,30 +633,47 @@ int MinSpinOSO_CG2::awc(double der_phi_0, double phi_0, double der_phi_j, double return 0; } -double MinSpinOSO_CG2::maximum_rotation(double *p) +/* ---------------------------------------------------------------------- + evaluate max timestep +---------------------------------------------------------------------- */ + +double MinSpinOSO_CG2::evaluate_dt() { - double norm2,norm2_global,scaling,alpha; + double dtmax; + double fmsq; + double fmaxsqone,fmaxsqloc,fmaxsqall; int nlocal = atom->nlocal; - int ntotal = 0; + double **fm = atom->fm; - norm2 = 0.0; - for (int i = 0; i < 3 * nlocal; i++) norm2 += p[i] * p[i]; + // finding max fm on this proc. - MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,world); - if (update->multireplica == 1) { - norm2 = norm2_global; - MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,world); - if (update->multireplica == 1) { - nlocal = ntotal; - MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,universe->uworld); + fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; + for (int i = 0; i < nlocal; i++) { + fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; + fmaxsqone = MAX(fmaxsqone,fmsq); } - scaling = (maxepsrot * sqrt((double) ntotal / norm2_global)); + // finding max fm on this replica - if (scaling < 1.0) alpha = scaling; - else alpha = 1.0; + fmaxsqloc = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - return alpha; + // finding max fm over all replicas, if necessary + // this communicator would be invalid for multiprocess replicas + + fmaxsqall = fmaxsqloc; + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + if (fmaxsqall == 0.0) + error->all(FLERR,"Incorrect fmaxsqall calculation"); + + // define max timestep by dividing by the + // inverse of max frequency by discrete_factor + + dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); + + return dtmax; } \ No newline at end of file diff --git a/src/SPIN/min_spin_oso_cg2.h b/src/SPIN/min_spin_oso_cg2.h index c96e82ca8e..83605f98ed 100644 --- a/src/SPIN/min_spin_oso_cg2.h +++ b/src/SPIN/min_spin_oso_cg2.h @@ -34,6 +34,8 @@ class MinSpinOSO_CG2: public Min { void reset_vectors(); int iterate(int); private: + double dt; // global timestep + double dts; // spin timestep int ireplica,nreplica; // for neb double *spvec; // variables for atomic dof, as 1d vector double *fmvec; // variables for atomic dof, as 1d vector @@ -43,7 +45,9 @@ class MinSpinOSO_CG2: public Min { double **sp_copy; // copy of the spins int local_iter; // for neb int nlocal_max; // max value of nlocal (for size of lists) + double discrete_factor; // factor for spin timestep evaluation + double evaluate_dt(); void advance_spins(); void calc_gradient(); void calc_search_direction(); From 31d2b23f9c8de272051beac63261278bcd6bf411 Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 22 Jul 2019 17:53:02 +0000 Subject: [PATCH 057/418] rename cg2 -> cg --- src/SPIN/min_spin_oso_cg.cpp | 660 ++++++++++++++++++++------------- src/SPIN/min_spin_oso_cg.h | 43 +-- src/SPIN/min_spin_oso_cg2.cpp | 679 ---------------------------------- src/SPIN/min_spin_oso_cg2.h | 72 ---- 4 files changed, 435 insertions(+), 1019 deletions(-) delete mode 100644 src/SPIN/min_spin_oso_cg2.cpp delete mode 100644 src/SPIN/min_spin_oso_cg2.h diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 8eb358f86a..c9f3a59f87 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -38,6 +38,7 @@ #include "modify.h" #include "math_special.h" #include "math_const.h" +#include "universe.h" using namespace LAMMPS_NS; using namespace MathConst; @@ -61,12 +62,18 @@ static const char cite_minstyle_spin_oso_cg[] = /* ---------------------------------------------------------------------- */ -MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : +MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL) { if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_cg); nlocal_max = 0; - alpha_damp = 1.0; + + // nreplica = number of partitions + // ireplica = which world I am in universe + + nreplica = universe->nworlds; + ireplica = universe->iworld; + use_line_search = 1; discrete_factor = 10.0; } @@ -77,24 +84,31 @@ MinSpinOSO_CG::~MinSpinOSO_CG() memory->destroy(g_old); memory->destroy(g_cur); memory->destroy(p_s); + if (use_line_search) + memory->destroy(sp_copy); } /* ---------------------------------------------------------------------- */ void MinSpinOSO_CG::init() { - local_iter = 0; + der_e_cur = 0.0; + der_e_pr = 0.0; + Min::init(); + dts = dt = update->dt; last_negative = update->ntimestep; - + // allocate tables nlocal_max = atom->nlocal; memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg:g_old"); memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg:g_cur"); memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg:p_s"); + if (use_line_search) + memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/cg:sp_copy"); } /* ---------------------------------------------------------------------- */ @@ -117,9 +131,9 @@ void MinSpinOSO_CG::setup_style() int MinSpinOSO_CG::modify_param(int narg, char **arg) { - if (strcmp(arg[0],"alpha_damp") == 0) { + if (strcmp(arg[0],"line_search") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - alpha_damp = force->numeric(FLERR,arg[1]); + use_line_search = force->numeric(FLERR,arg[1]); return 2; } if (strcmp(arg[0],"discrete_factor") == 0) { @@ -160,19 +174,22 @@ int MinSpinOSO_CG::iterate(int maxiter) bigint ntimestep; double fmdotfm; int flag, flagall; - - // grow tables if nlocal increased + double **sp = atom->sp; + double der_e_cur_tmp = 0.0; if (nlocal_max < nlocal) { + nlocal_max = nlocal; local_iter = 0; nlocal_max = nlocal; memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg:g_old"); memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg:g_cur"); memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg:p_s"); + if (use_line_search) + memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/cg:sp_copy"); } for (int iter = 0; iter < maxiter; iter++) { - + if (timer->check_timeout(niter)) return TIMEOUT; @@ -182,16 +199,51 @@ int MinSpinOSO_CG::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization - if (local_iter == 0) energy_force(0); - dts = evaluate_dt(); - - calc_gradient(dts); - calc_search_direction(); - advance_spins(); - - eprevious = ecurrent; - ecurrent = energy_force(0); - neval++; + if (use_line_search) { + + // here we need to do line search + if (local_iter == 0) + calc_gradient(); + + calc_search_direction(); + der_e_cur = 0.0; + for (int i = 0; i < 3 * nlocal; i++) + der_e_cur += g_cur[i] * p_s[i]; + MPI_Allreduce(&der_e_cur,&der_e_cur_tmp,1,MPI_DOUBLE,MPI_SUM,world); + der_e_cur = der_e_cur_tmp; + if (update->multireplica == 1) { + MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + for (int i = 0; i < nlocal; i++) + for (int j = 0; j < 3; j++) + sp_copy[i][j] = sp[i][j]; + + eprevious = ecurrent; + der_e_pr = der_e_cur; + calc_and_make_step(0.0, 1.0, 0); + } + else{ + + // here we don't do line search + // but use cutoff rotation angle + // if gneb calc., nreplica > 1 + // then calculate gradients and advance spins + // of intermediate replicas only + + if (nreplica > 1) { + if(ireplica != 0 && ireplica != nreplica-1) + calc_gradient(); + calc_search_direction(); + advance_spins(); + } else{ + calc_gradient(); + calc_search_direction(); + advance_spins(); + } + eprevious = ecurrent; + ecurrent = energy_force(0); + neval++; + } //// energy tolerance criterion //// only check after DELAYSTEP elapsed since velocties reset to 0 @@ -239,6 +291,347 @@ int MinSpinOSO_CG::iterate(int maxiter) return MAXITER; } +/* ---------------------------------------------------------------------- + calculate gradients +---------------------------------------------------------------------- */ + +void MinSpinOSO_CG::calc_gradient() +{ + int nlocal = atom->nlocal; + double **sp = atom->sp; + double **fm = atom->fm; + double hbar = force->hplanck/MY_2PI; + double factor; + + if (use_line_search) + factor = hbar; + else factor = evaluate_dt(); + + // loop on all spins on proc. + + for (int i = 0; i < nlocal; i++) { + g_cur[3 * i + 0] = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]) * factor; + g_cur[3 * i + 1] = -(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]) * factor; + g_cur[3 * i + 2] = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]) * factor; + } +} + +/* ---------------------------------------------------------------------- + search direction: + The Fletcher-Reeves conj. grad. method + See Jorge Nocedal and Stephen J. Wright 'Numerical + Optimization' Second Edition, 2006 (p. 121) +---------------------------------------------------------------------- */ + +void MinSpinOSO_CG::calc_search_direction() +{ + int nlocal = atom->nlocal; + double g2old = 0.0; + double g2 = 0.0; + double beta = 0.0; + + double g2_global = 0.0; + double g2old_global = 0.0; + + if (local_iter == 0 || local_iter % 5 == 0){ // steepest descent direction + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = -g_cur[i]; + g_old[i] = g_cur[i]; + } + } else { // conjugate direction + for (int i = 0; i < 3 * nlocal; i++) { + g2old += g_old[i] * g_old[i]; + g2 += g_cur[i] * g_cur[i]; + } + + // now we need to collect/broadcast beta on this replica + // need to check what is beta for GNEB + + MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,world); + + // Sum over all replicas. Good for GNEB. + if (update->multireplica == 1) { + g2 = g2_global; + g2old = g2old_global; + MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + if (fabs(g2_global) < 1.0e-60) beta = 0.0; + else beta = g2_global / g2old_global; + // calculate conjugate direction + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = (beta * p_s[i] - g_cur[i]); + g_old[i] = g_cur[i]; + } + } + + local_iter++; +} + +/* ---------------------------------------------------------------------- + rotation of spins along the search direction +---------------------------------------------------------------------- */ + +void MinSpinOSO_CG::advance_spins() +{ + int nlocal = atom->nlocal; + double **sp = atom->sp; + double **fm = atom->fm; + double tdampx, tdampy, tdampz; + double rot_mat[9]; // exponential of matrix made of search direction + double s_new[3]; + + // loop on all spins on proc. + + for (int i = 0; i < nlocal; i++) { + rodrigues_rotation(p_s + 3 * i, rot_mat); + + // rotate spins + + vm3(rot_mat, sp[i], s_new); + for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; + } +} + +/* ---------------------------------------------------------------------- + compute and return max_i||mag. torque_i||_2 +------------------------------------------------------------------------- */ + +double MinSpinOSO_CG::max_torque() +{ + double fmsq,fmaxsqone,fmaxsqloc,fmaxsqall; + int nlocal = atom->nlocal; + double factor; + double hbar = force->hplanck/MY_2PI; + + if (use_line_search) factor = 1.0; + else factor = hbar; + + // finding max fm on this proc. + + fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; + for (int i = 0; i < nlocal; i++) { + fmsq = 0.0; + for (int j = 0; j < 3; j++) + fmsq += g_cur[3 * i + j] * g_cur[3 * i + j]; + fmaxsqone = MAX(fmaxsqone,fmsq); + } + + // finding max fm on this replica + + fmaxsqloc = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); + + // finding max fm over all replicas, if necessary + // this communicator would be invalid for multiprocess replicas + + fmaxsqall = fmaxsqloc; + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + return sqrt(fmaxsqall) * factor; +} + +/* ---------------------------------------------------------------------- + calculate 3x3 matrix exponential using Rodrigues' formula + (R. Murray, Z. Li, and S. Shankar Sastry, + A Mathematical Introduction to + Robotic Manipulation (1994), p. 28 and 30). + + upp_tr - vector x, y, z so that one calculate + U = exp(A) with A= [[0, x, y], + [-x, 0, z], + [-y, -z, 0]] +------------------------------------------------------------------------- */ + +void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) +{ + double theta,A,B,D,x,y,z; + double s1,s2,s3,a1,a2,a3; + + if (fabs(upp_tr[0]) < 1.0e-40 && + fabs(upp_tr[1]) < 1.0e-40 && + fabs(upp_tr[2]) < 1.0e-40){ + + // if upp_tr is zero, return unity matrix + for(int k = 0; k < 3; k++){ + for(int m = 0; m < 3; m++){ + if (m == k) + out[3 * k + m] = 1.0; + else + out[3 * k + m] = 0.0; + } + } + return; + } + + theta = sqrt(upp_tr[0] * upp_tr[0] + + upp_tr[1] * upp_tr[1] + + upp_tr[2] * upp_tr[2]); + + A = cos(theta); + B = sin(theta); + D = 1 - A; + x = upp_tr[0]/theta; + y = upp_tr[1]/theta; + z = upp_tr[2]/theta; + + // diagonal elements of U + + out[0] = A + z * z * D; + out[4] = A + y * y * D; + out[8] = A + x * x * D; + + // off diagonal of U + + s1 = -y * z *D; + s2 = x * z * D; + s3 = -x * y * D; + + a1 = x * B; + a2 = y * B; + a3 = z * B; + + out[1] = s1 + a1; + out[3] = s1 - a1; + out[2] = s2 + a2; + out[6] = s2 - a2; + out[5] = s3 + a3; + out[7] = s3 - a3; + +} + +/* ---------------------------------------------------------------------- + out = vector^T x m, + m -- 3x3 matrix , v -- 3-d vector +------------------------------------------------------------------------- */ + +void MinSpinOSO_CG::vm3(const double *m, const double *v, double *out) +{ + for(int i = 0; i < 3; i++){ + out[i] *= 0.0; + for(int j = 0; j < 3; j++) + out[i] += *(m + 3 * j + i) * v[j]; + } +} + + +void MinSpinOSO_CG::make_step(double c, double *energy_and_der) +{ + double p_scaled[3]; + int nlocal = atom->nlocal; + double rot_mat[9]; // exponential of matrix made of search direction + double s_new[3]; + double **sp = atom->sp; + double der_e_cur_tmp = 0.0;; + + for (int i = 0; i < nlocal; i++) { + + // scale the search direction + + for (int j = 0; j < 3; j++) p_scaled[j] = c * p_s[3 * i + j]; + + // calculate rotation matrix + + rodrigues_rotation(p_scaled, rot_mat); + + // rotate spins + + vm3(rot_mat, sp[i], s_new); + for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; + } + + ecurrent = energy_force(0); + calc_gradient(); + neval++; + der_e_cur = 0.0; + for (int i = 0; i < 3 * nlocal; i++) { + der_e_cur += g_cur[i] * p_s[i]; + } + MPI_Allreduce(&der_e_cur,&der_e_cur_tmp,1,MPI_DOUBLE,MPI_SUM,world); + der_e_cur = der_e_cur_tmp; + if (update->multireplica == 1) { + MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + } + + energy_and_der[0] = ecurrent; + energy_and_der[1] = der_e_cur; +} + +/* ---------------------------------------------------------------------- + Calculate step length which satisfies approximate Wolfe conditions + using the cubic interpolation +------------------------------------------------------------------------- */ + +int MinSpinOSO_CG::calc_and_make_step(double a, double b, int index) +{ + double e_and_d[2] = {0.0,0.0}; + double alpha,c1,c2,c3; + double **sp = atom->sp; + int nlocal = atom->nlocal; + + make_step(b,e_and_d); + ecurrent = e_and_d[0]; + der_e_cur = e_and_d[1]; + index++; + + if (awc(der_e_pr,eprevious,e_and_d[1],e_and_d[0]) || index == 10){ + MPI_Bcast(&b,1,MPI_DOUBLE,0,world); + for (int i = 0; i < 3 * nlocal; i++) { + p_s[i] = b * p_s[i]; + } + return 1; + } + else{ + double r,f0,f1,df0,df1; + r = b - a; + f0 = eprevious; + f1 = ecurrent; + df0 = der_e_pr; + df1 = der_e_cur; + + c1 = -2.0*(f1-f0)/(r*r*r)+(df1+df0)/(r*r); + c2 = 3.0*(f1-f0)/(r*r)-(df1+2.0*df0)/(r); + c3 = df0; + + // f(x) = c1 x^3 + c2 x^2 + c3 x^1 + c4 + // has minimum at alpha below. We do not check boundaries. + + alpha = (-c2 + sqrt(c2*c2 - 3.0*c1*c3))/(3.0*c1); + MPI_Bcast(&alpha,1,MPI_DOUBLE,0,world); + + if (alpha < 0.0) alpha = r/2.0; + + for (int i = 0; i < nlocal; i++) { + for (int j = 0; j < 3; j++) sp[i][j] = sp_copy[i][j]; + } + calc_and_make_step(0.0, alpha, index); + } + + return 0; +} + +/* ---------------------------------------------------------------------- + Approximate Wolfe conditions: + William W. Hager and Hongchao Zhang + SIAM J. optim., 16(1), 170-192. (23 pages) +------------------------------------------------------------------------- */ + +int MinSpinOSO_CG::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){ + + double eps = 1.0e-6; + double delta = 0.1; + double sigma = 0.9; + + if ((phi_j<=phi_0+eps*fabs(phi_0)) && ((2.0*delta-1.0) * der_phi_0>=der_phi_j>=sigma*der_phi_0)) + return 1; + else + return 0; +} + /* ---------------------------------------------------------------------- evaluate max timestep ---------------------------------------------------------------------- */ @@ -282,231 +675,4 @@ double MinSpinOSO_CG::evaluate_dt() dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); return dtmax; -} - -/* ---------------------------------------------------------------------- - calculate gradients ----------------------------------------------------------------------- */ - -void MinSpinOSO_CG::calc_gradient(double dts) -{ - int nlocal = atom->nlocal; - double **sp = atom->sp; - double **fm = atom->fm; - double tdampx, tdampy, tdampz; - - // loop on all spins on proc. - - for (int i = 0; i < nlocal; i++) { - - // calc. damping torque - - tdampx = -alpha_damp*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - tdampy = -alpha_damp*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - tdampz = -alpha_damp*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - - // calculate gradients - - g_cur[3 * i + 0] = -tdampz * dts; - g_cur[3 * i + 1] = tdampy * dts; - g_cur[3 * i + 2] = -tdampx * dts; - } -} - -/* ---------------------------------------------------------------------- - search direction: - The Fletcher-Reeves conj. grad. method - See Jorge Nocedal and Stephen J. Wright 'Numerical - Optimization' Second Edition, 2006 (p. 121) ----------------------------------------------------------------------- */ - -void MinSpinOSO_CG::calc_search_direction() -{ - int nlocal = atom->nlocal; - double g2old = 0.0; - double g2 = 0.0; - double beta = 0.0; - - double g2_global = 0.0; - double g2old_global = 0.0; - if (local_iter == 0 || local_iter % 5 == 0){ // steepest descent direction - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = -g_cur[i]; - g_old[i] = g_cur[i]; - } - } else { // conjugate direction - for (int i = 0; i < 3 * nlocal; i++) { - g2old += g_old[i] * g_old[i]; - g2 += g_cur[i] * g_cur[i]; - } - - // now we need to collect/broadcast beta on this replica - // different replica can have different beta for now. - // need to check what is beta for GNEB - - MPI_Allreduce(&g2, &g2_global, 1, MPI_DOUBLE, MPI_SUM, world); - MPI_Allreduce(&g2old, &g2old_global, 1, MPI_DOUBLE, MPI_SUM, world); - - // Sum over all replicas. Good for GNEB. - if (update->multireplica == 1) { - g2 = g2_global; - g2old = g2old_global; - MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - - if (fabs(g2_global) < 1.0e-60) beta = 0.0; - else beta = g2_global / g2old_global; - // calculate conjugate direction - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = beta * p_s[i] - g_cur[i]; - g_old[i] = g_cur[i]; - } - } - - local_iter++; -} - -/* ---------------------------------------------------------------------- - rotation of spins along the search direction ----------------------------------------------------------------------- */ - -void MinSpinOSO_CG::advance_spins() -{ - int nlocal = atom->nlocal; - double **sp = atom->sp; - double **fm = atom->fm; - double tdampx, tdampy, tdampz; - double rot_mat[9]; // exponential of matrix made of search direction - double s_new[3]; - - // loop on all spins on proc. - - for (int i = 0; i < nlocal; i++) { - rodrigues_rotation(p_s + 3 * i, rot_mat); - - // rotate spins - - vm3(rot_mat, sp[i], s_new); - for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; - } -} - -/* ---------------------------------------------------------------------- - compute and return max_i||mag. torque_i||_2 -------------------------------------------------------------------------- */ - -double MinSpinOSO_CG::max_torque() -{ - double fmsq,fmaxsqone,fmaxsqloc,fmaxsqall; - int nlocal = atom->nlocal; - double hbar = force->hplanck/MY_2PI; - - // finding max fm on this proc. - - fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; - for (int i = 0; i < nlocal; i++) { - fmsq = 0.0; - for (int j = 0; j < 3; j++) - fmsq += g_cur[3 * i + j] * g_cur[3 * i + j]; - fmaxsqone = MAX(fmaxsqone,fmsq); - } - - // finding max fm on this replica - - fmaxsqloc = fmaxsqone; - MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - - // finding max fm over all replicas, if necessary - // this communicator would be invalid for multiprocess replicas - - fmaxsqall = fmaxsqloc; - if (update->multireplica == 1) { - fmaxsqall = fmaxsqloc; - MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); - } - - return sqrt(fmaxsqall) * hbar; -} - -/* ---------------------------------------------------------------------- - calculate 3x3 matrix exponential using Rodrigues' formula - (R. Murray, Z. Li, and S. Shankar Sastry, - A Mathematical Introduction to - Robotic Manipulation (1994), p. 28 and 30). - - upp_tr - vector x, y, z so that one calculate - U = exp(A) with A= [[0, x, y], - [-x, 0, z], - [-y, -z, 0]] -------------------------------------------------------------------------- */ - -void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) -{ - double theta,A,B,D,x,y,z; - double s1,s2,s3,a1,a2,a3; - - if (fabs(upp_tr[0]) < 1.0e-40 && - fabs(upp_tr[1]) < 1.0e-40 && - fabs(upp_tr[2]) < 1.0e-40){ - - // if upp_tr is zero, return unity matrix - for(int k = 0; k < 3; k++){ - for(int m = 0; m < 3; m++){ - if (m == k) out[3 * k + m] = 1.0; - else out[3 * k + m] = 0.0; - } - } - return; - } - - theta = sqrt(upp_tr[0] * upp_tr[0] + - upp_tr[1] * upp_tr[1] + - upp_tr[2] * upp_tr[2]); - - A = cos(theta); - B = sin(theta); - D = 1 - A; - x = upp_tr[0]/theta; - y = upp_tr[1]/theta; - z = upp_tr[2]/theta; - - // diagonal elements of U - - out[0] = A + z * z * D; - out[4] = A + y * y * D; - out[8] = A + x * x * D; - - // off diagonal of U - - s1 = -y * z *D; - s2 = x * z * D; - s3 = -x * y * D; - - a1 = x * B; - a2 = y * B; - a3 = z * B; - - out[1] = s1 + a1; - out[3] = s1 - a1; - out[2] = s2 + a2; - out[6] = s2 - a2; - out[5] = s3 + a3; - out[7] = s3 - a3; - -} - -/* ---------------------------------------------------------------------- - out = vector^T x m, - m -- 3x3 matrix , v -- 3-d vector -------------------------------------------------------------------------- */ - -void MinSpinOSO_CG::vm3(const double *m, const double *v, double *out) -{ - for(int i = 0; i < 3; i++){ - out[i] *= 0.0; - for(int j = 0; j < 3; j++){ - out[i] += *(m + 3 * j + i) * v[j]; - } - } -} +} \ No newline at end of file diff --git a/src/SPIN/min_spin_oso_cg.h b/src/SPIN/min_spin_oso_cg.h index 81bbd2c294..e50d1a69db 100644 --- a/src/SPIN/min_spin_oso_cg.h +++ b/src/SPIN/min_spin_oso_cg.h @@ -24,7 +24,7 @@ MinimizeStyle(spin/oso_cg, MinSpinOSO_CG) namespace LAMMPS_NS { -class MinSpinOSO_CG : public Min { +class MinSpinOSO_CG: public Min { public: MinSpinOSO_CG(class LAMMPS *); virtual ~MinSpinOSO_CG(); @@ -33,33 +33,34 @@ class MinSpinOSO_CG : public Min { int modify_param(int, char **); void reset_vectors(); int iterate(int); - private: - double evaluate_dt(); - void advance_spins(); - double max_torque(); - void calc_gradient(double); - void calc_search_direction(); - - // global and spin timesteps - - double dt; - double dts; - int nlocal_max; // max value of nlocal (for size of lists) - - double alpha_damp; // damping for spin minimization - double discrete_factor; // factor for spin timestep evaluation - + double dt; // global timestep + double dts; // spin timestep + int ireplica,nreplica; // for neb double *spvec; // variables for atomic dof, as 1d vector double *fmvec; // variables for atomic dof, as 1d vector - - double *g_old; // gradient vector at previous iteration - double *g_cur; // current gradient vector + double *g_cur; // current gradient vector + double *g_old; // gradient vector at previous step double *p_s; // search direction vector - int local_iter; // number of times we call search_direction + double **sp_copy; // copy of the spins + int local_iter; // for neb + int nlocal_max; // max value of nlocal (for size of lists) + double discrete_factor; // factor for spin timestep evaluation + double evaluate_dt(); + void advance_spins(); + void calc_gradient(); + void calc_search_direction(); + double maximum_rotation(double *); void vm3(const double *, const double *, double *); void rodrigues_rotation(const double *, double *); + int calc_and_make_step(double, double, int); + int awc(double, double, double, double); + void make_step(double, double *); + double max_torque(); + double der_e_cur; // current derivative along search dir. + double der_e_pr; // previous derivative along search dir. + int use_line_search; // use line search or not. bigint last_negative; }; diff --git a/src/SPIN/min_spin_oso_cg2.cpp b/src/SPIN/min_spin_oso_cg2.cpp deleted file mode 100644 index 52b98eead7..0000000000 --- a/src/SPIN/min_spin_oso_cg2.cpp +++ /dev/null @@ -1,679 +0,0 @@ -/* ---------------------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------------ - Contributing authors: Aleksei Ivanov (University of Iceland) - Julien Tranchida (SNL) - - Please cite the related publication: - Ivanov, A. V., Uzdin, V. M., & Jónsson, H. (2019). Fast and Robust - Algorithm for the Minimisation of the Energy of Spin Systems. arXiv - preprint arXiv:1904.02669. -------------------------------------------------------------------------- */ - -#include -#include -#include -#include -#include "min_spin_oso_cg2.h" -#include "universe.h" -#include "atom.h" -#include "citeme.h" -#include "force.h" -#include "update.h" -#include "output.h" -#include "timer.h" -#include "error.h" -#include "memory.h" -#include "modify.h" -#include "math_special.h" -#include "math_const.h" -#include "universe.h" -#include - -using namespace LAMMPS_NS; -using namespace MathConst; - -static const char cite_minstyle_spin_oso_cg2[] = - "min_style spin/oso_cg2 command:\n\n" - "@article{ivanov2019fast,\n" - "title={Fast and Robust Algorithm for the Minimisation of the Energy of " - "Spin Systems},\n" - "author={Ivanov, A. V and Uzdin, V. M. and J{\'o}nsson, H.},\n" - "journal={arXiv preprint arXiv:1904.02669},\n" - "year={2019}\n" - "}\n\n"; - -// EPS_ENERGY = minimum normalization for energy tolerance - -#define EPS_ENERGY 1.0e-8 - -#define DELAYSTEP 5 - - -/* ---------------------------------------------------------------------- */ - -MinSpinOSO_CG2::MinSpinOSO_CG2(LAMMPS *lmp) : - Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL) -{ - if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_cg2); - nlocal_max = 0; - - // nreplica = number of partitions - // ireplica = which world I am in universe - - nreplica = universe->nworlds; - ireplica = universe->iworld; - use_line_search = 1; - discrete_factor = 10.0; - -} - -/* ---------------------------------------------------------------------- */ - -MinSpinOSO_CG2::~MinSpinOSO_CG2() -{ - memory->destroy(g_old); - memory->destroy(g_cur); - memory->destroy(p_s); - if (use_line_search) - memory->destroy(sp_copy); -} - -/* ---------------------------------------------------------------------- */ - -void MinSpinOSO_CG2::init() -{ - local_iter = 0; - der_e_cur = 0.0; - der_e_pr = 0.0; - - Min::init(); - - dts = dt = update->dt; - last_negative = update->ntimestep; - - // allocate tables - - nlocal_max = atom->nlocal; - memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg2:g_old"); - memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg2:g_cur"); - memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg2:p_s"); - if (use_line_search) - memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/cg2:sp_copy"); -} - -/* ---------------------------------------------------------------------- */ - -void MinSpinOSO_CG2::setup_style() -{ - double **v = atom->v; - int nlocal = atom->nlocal; - - // check if the atom/spin style is defined - - if (!atom->sp_flag) - error->all(FLERR,"min/spin_oso_cg2 requires atom/spin style"); - - for (int i = 0; i < nlocal; i++) - v[i][0] = v[i][1] = v[i][2] = 0.0; -} - -/* ---------------------------------------------------------------------- */ - -int MinSpinOSO_CG2::modify_param(int narg, char **arg) -{ - - if (strcmp(arg[0],"line_search") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - use_line_search = force->numeric(FLERR,arg[1]); - return 2; - } - if (strcmp(arg[0],"discrete_factor") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - discrete_factor = force->numeric(FLERR,arg[1]); - return 2; - } - return 0; -} - -/* ---------------------------------------------------------------------- - set current vector lengths and pointers - called after atoms have migrated -------------------------------------------------------------------------- */ - -void MinSpinOSO_CG2::reset_vectors() -{ - // atomic dof - - // size sp is 4N vector - nvec = 4 * atom->nlocal; - if (nvec) spvec = atom->sp[0]; - - nvec = 3 * atom->nlocal; - if (nvec) fmvec = atom->fm[0]; - - if (nvec) xvec = atom->x[0]; - if (nvec) fvec = atom->f[0]; -} - -/* ---------------------------------------------------------------------- - minimization via orthogonal spin optimisation -------------------------------------------------------------------------- */ - -int MinSpinOSO_CG2::iterate(int maxiter) -{ - int nlocal = atom->nlocal; - bigint ntimestep; - double fmdotfm; - int flag, flagall; - double **sp = atom->sp; - double der_e_cur_tmp = 0.0; - - if (nlocal_max < nlocal) { - nlocal_max = nlocal; - local_iter = 0; - nlocal_max = nlocal; - memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg2:g_old"); - memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg2:g_cur"); - memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg2:p_s"); - if (use_line_search) - memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/cg2:sp_copy"); - } - - for (int iter = 0; iter < maxiter; iter++) { - - if (timer->check_timeout(niter)) - return TIMEOUT; - - ntimestep = ++update->ntimestep; - niter++; - - // optimize timestep accross processes / replicas - // need a force calculation for timestep optimization - - if (use_line_search) { - - // here we need to do line search - if (local_iter == 0) - calc_gradient(); - - calc_search_direction(); - der_e_cur = 0.0; - for (int i = 0; i < 3 * nlocal; i++) - der_e_cur += g_cur[i] * p_s[i]; - MPI_Allreduce(&der_e_cur,&der_e_cur_tmp,1,MPI_DOUBLE,MPI_SUM,world); - der_e_cur = der_e_cur_tmp; - if (update->multireplica == 1) { - MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - for (int i = 0; i < nlocal; i++) - for (int j = 0; j < 3; j++) - sp_copy[i][j] = sp[i][j]; - - eprevious = ecurrent; - der_e_pr = der_e_cur; - calc_and_make_step(0.0, 1.0, 0); - } - else{ - - // here we don't do line search - // but use cutoff rotation angle - // if gneb calc., nreplica > 1 - // then calculate gradients and advance spins - // of intermediate replicas only - - if (nreplica > 1) { - if(ireplica != 0 && ireplica != nreplica-1) - calc_gradient(); - calc_search_direction(); - advance_spins(); - } else{ - calc_gradient(); - calc_search_direction(); - advance_spins(); - } - eprevious = ecurrent; - ecurrent = energy_force(0); - neval++; - } - - //// energy tolerance criterion - //// only check after DELAYSTEP elapsed since velocties reset to 0 - //// sync across replicas if running multi-replica minimization - - if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { - if (update->multireplica == 0) { - if (fabs(ecurrent-eprevious) < - update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) - return ETOL; - } else { - if (fabs(ecurrent-eprevious) < - update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) - flag = 0; - else flag = 1; - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); - if (flagall == 0) return ETOL; - } - } - - // magnetic torque tolerance criterion - // sync across replicas if running multi-replica minimization - - if (update->ftol > 0.0) { - fmdotfm = max_torque(); - if (update->multireplica == 0) { - if (fmdotfm < update->ftol*update->ftol) return FTOL; - } else { - if (fmdotfm < update->ftol*update->ftol) flag = 0; - else flag = 1; - MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); - if (flagall == 0) return FTOL; - } - } - - // output for thermo, dump, restart files - - if (output->next == ntimestep) { - timer->stamp(); - output->write(ntimestep); - timer->stamp(Timer::OUTPUT); - } - } - - return MAXITER; -} - -/* ---------------------------------------------------------------------- - calculate gradients ----------------------------------------------------------------------- */ - -void MinSpinOSO_CG2::calc_gradient() -{ - int nlocal = atom->nlocal; - double **sp = atom->sp; - double **fm = atom->fm; - double hbar = force->hplanck/MY_2PI; - double factor; - - if (use_line_search) - factor = hbar; - else factor = evaluate_dt(); - - // loop on all spins on proc. - - for (int i = 0; i < nlocal; i++) { - g_cur[3 * i + 0] = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]) * factor; - g_cur[3 * i + 1] = -(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]) * factor; - g_cur[3 * i + 2] = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]) * factor; - } -} - -/* ---------------------------------------------------------------------- - search direction: - The Fletcher-Reeves conj. grad. method - See Jorge Nocedal and Stephen J. Wright 'Numerical - Optimization' Second Edition, 2006 (p. 121) ----------------------------------------------------------------------- */ - -void MinSpinOSO_CG2::calc_search_direction() -{ - int nlocal = atom->nlocal; - double g2old = 0.0; - double g2 = 0.0; - double beta = 0.0; - - double g2_global = 0.0; - double g2old_global = 0.0; - - if (local_iter == 0 || local_iter % 5 == 0){ // steepest descent direction - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = -g_cur[i]; - g_old[i] = g_cur[i]; - } - } else { // conjugate direction - for (int i = 0; i < 3 * nlocal; i++) { - g2old += g_old[i] * g_old[i]; - g2 += g_cur[i] * g_cur[i]; - } - - // now we need to collect/broadcast beta on this replica - // need to check what is beta for GNEB - - MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,world); - - // Sum over all replicas. Good for GNEB. - if (update->multireplica == 1) { - g2 = g2_global; - g2old = g2old_global; - MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - if (fabs(g2_global) < 1.0e-60) beta = 0.0; - else beta = g2_global / g2old_global; - // calculate conjugate direction - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = (beta * p_s[i] - g_cur[i]); - g_old[i] = g_cur[i]; - } - } - - local_iter++; -} - -/* ---------------------------------------------------------------------- - rotation of spins along the search direction ----------------------------------------------------------------------- */ - -void MinSpinOSO_CG2::advance_spins() -{ - int nlocal = atom->nlocal; - double **sp = atom->sp; - double **fm = atom->fm; - double tdampx, tdampy, tdampz; - double rot_mat[9]; // exponential of matrix made of search direction - double s_new[3]; - - // loop on all spins on proc. - - for (int i = 0; i < nlocal; i++) { - rodrigues_rotation(p_s + 3 * i, rot_mat); - - // rotate spins - - vm3(rot_mat, sp[i], s_new); - for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; - } -} - -/* ---------------------------------------------------------------------- - compute and return max_i||mag. torque_i||_2 -------------------------------------------------------------------------- */ - -double MinSpinOSO_CG2::max_torque() -{ - double fmsq,fmaxsqone,fmaxsqloc,fmaxsqall; - int nlocal = atom->nlocal; - double factor; - double hbar = force->hplanck/MY_2PI; - - if (use_line_search) factor = 1.0; - else factor = hbar; - - // finding max fm on this proc. - - fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; - for (int i = 0; i < nlocal; i++) { - fmsq = 0.0; - for (int j = 0; j < 3; j++) - fmsq += g_cur[3 * i + j] * g_cur[3 * i + j]; - fmaxsqone = MAX(fmaxsqone,fmsq); - } - - // finding max fm on this replica - - fmaxsqloc = fmaxsqone; - MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - - // finding max fm over all replicas, if necessary - // this communicator would be invalid for multiprocess replicas - - fmaxsqall = fmaxsqloc; - if (update->multireplica == 1) { - fmaxsqall = fmaxsqloc; - MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); - } - - return sqrt(fmaxsqall) * factor; -} - -/* ---------------------------------------------------------------------- - calculate 3x3 matrix exponential using Rodrigues' formula - (R. Murray, Z. Li, and S. Shankar Sastry, - A Mathematical Introduction to - Robotic Manipulation (1994), p. 28 and 30). - - upp_tr - vector x, y, z so that one calculate - U = exp(A) with A= [[0, x, y], - [-x, 0, z], - [-y, -z, 0]] -------------------------------------------------------------------------- */ - -void MinSpinOSO_CG2::rodrigues_rotation(const double *upp_tr, double *out) -{ - double theta,A,B,D,x,y,z; - double s1,s2,s3,a1,a2,a3; - - if (fabs(upp_tr[0]) < 1.0e-40 && - fabs(upp_tr[1]) < 1.0e-40 && - fabs(upp_tr[2]) < 1.0e-40){ - - // if upp_tr is zero, return unity matrix - for(int k = 0; k < 3; k++){ - for(int m = 0; m < 3; m++){ - if (m == k) out[3 * k + m] = 1.0; - else out[3 * k + m] = 0.0; - } - } - return; - } - - theta = sqrt(upp_tr[0] * upp_tr[0] + - upp_tr[1] * upp_tr[1] + - upp_tr[2] * upp_tr[2]); - - A = cos(theta); - B = sin(theta); - D = 1 - A; - x = upp_tr[0]/theta; - y = upp_tr[1]/theta; - z = upp_tr[2]/theta; - - // diagonal elements of U - - out[0] = A + z * z * D; - out[4] = A + y * y * D; - out[8] = A + x * x * D; - - // off diagonal of U - - s1 = -y * z *D; - s2 = x * z * D; - s3 = -x * y * D; - - a1 = x * B; - a2 = y * B; - a3 = z * B; - - out[1] = s1 + a1; - out[3] = s1 - a1; - out[2] = s2 + a2; - out[6] = s2 - a2; - out[5] = s3 + a3; - out[7] = s3 - a3; - -} - -/* ---------------------------------------------------------------------- - out = vector^T x m, - m -- 3x3 matrix , v -- 3-d vector -------------------------------------------------------------------------- */ - -void MinSpinOSO_CG2::vm3(const double *m, const double *v, double *out) -{ - for(int i = 0; i < 3; i++){ - out[i] *= 0.0; - for(int j = 0; j < 3; j++) - out[i] += *(m + 3 * j + i) * v[j]; - } -} - - -void MinSpinOSO_CG2::make_step(double c, double *energy_and_der) -{ - double p_scaled[3]; - int nlocal = atom->nlocal; - double rot_mat[9]; // exponential of matrix made of search direction - double s_new[3]; - double **sp = atom->sp; - double der_e_cur_tmp = 0.0;; - - for (int i = 0; i < nlocal; i++) { - - // scale the search direction - - for (int j = 0; j < 3; j++) p_scaled[j] = c * p_s[3 * i + j]; - - // calculate rotation matrix - - rodrigues_rotation(p_scaled, rot_mat); - - // rotate spins - - vm3(rot_mat, sp[i], s_new); - for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; - } - - ecurrent = energy_force(0); - calc_gradient(); - neval++; - der_e_cur = 0.0; - for (int i = 0; i < 3 * nlocal; i++) { - der_e_cur += g_cur[i] * p_s[i]; - } - MPI_Allreduce(&der_e_cur,&der_e_cur_tmp,1,MPI_DOUBLE,MPI_SUM,world); - der_e_cur = der_e_cur_tmp; - if (update->multireplica == 1) { - MPI_Allreduce(&der_e_cur_tmp,&der_e_cur,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - } - - energy_and_der[0] = ecurrent; - energy_and_der[1] = der_e_cur; -} - -/* ---------------------------------------------------------------------- - Calculate step length which satisfies approximate Wolfe conditions - using the cubic interpolation -------------------------------------------------------------------------- */ - -int MinSpinOSO_CG2::calc_and_make_step(double a, double b, int index) -{ - double e_and_d[2] = {0.0,0.0}; - double alpha,c1,c2,c3; - double **sp = atom->sp; - int nlocal = atom->nlocal; - - make_step(b,e_and_d); - ecurrent = e_and_d[0]; - der_e_cur = e_and_d[1]; - index++; - - if (awc(der_e_pr,eprevious,e_and_d[1],e_and_d[0]) || index == 10){ - MPI_Bcast(&b,1,MPI_DOUBLE,0,world); - for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = b * p_s[i]; - } - return 1; - } - else{ - double r,f0,f1,df0,df1; - r = b - a; - f0 = eprevious; - f1 = ecurrent; - df0 = der_e_pr; - df1 = der_e_cur; - - c1 = -2.0*(f1-f0)/(r*r*r)+(df1+df0)/(r*r); - c2 = 3.0*(f1-f0)/(r*r)-(df1+2.0*df0)/(r); - c3 = df0; - - // f(x) = c1 x^3 + c2 x^2 + c3 x^1 + c4 - // has minimum at alpha below. We do not check boundaries. - - alpha = (-c2 + sqrt(c2*c2 - 3.0*c1*c3))/(3.0*c1); - MPI_Bcast(&alpha,1,MPI_DOUBLE,0,world); - - if (alpha < 0.0) alpha = r/2.0; - - for (int i = 0; i < nlocal; i++) { - for (int j = 0; j < 3; j++) sp[i][j] = sp_copy[i][j]; - } - calc_and_make_step(0.0, alpha, index); - } - - return 0; -} - -/* ---------------------------------------------------------------------- - Approximate Wolfe conditions: - William W. Hager and Hongchao Zhang - SIAM J. optim., 16(1), 170-192. (23 pages) -------------------------------------------------------------------------- */ - -int MinSpinOSO_CG2::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){ - - double eps = 1.0e-6; - double delta = 0.1; - double sigma = 0.9; - - if ((phi_j<=phi_0+eps*fabs(phi_0)) && ((2.0*delta-1.0) * der_phi_0>=der_phi_j>=sigma*der_phi_0)) - return 1; - else - return 0; -} - -/* ---------------------------------------------------------------------- - evaluate max timestep ----------------------------------------------------------------------- */ - -double MinSpinOSO_CG2::evaluate_dt() -{ - double dtmax; - double fmsq; - double fmaxsqone,fmaxsqloc,fmaxsqall; - int nlocal = atom->nlocal; - double **fm = atom->fm; - - // finding max fm on this proc. - - fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; - for (int i = 0; i < nlocal; i++) { - fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; - fmaxsqone = MAX(fmaxsqone,fmsq); - } - - // finding max fm on this replica - - fmaxsqloc = fmaxsqone; - MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - - // finding max fm over all replicas, if necessary - // this communicator would be invalid for multiprocess replicas - - fmaxsqall = fmaxsqloc; - if (update->multireplica == 1) { - fmaxsqall = fmaxsqloc; - MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); - } - - if (fmaxsqall == 0.0) - error->all(FLERR,"Incorrect fmaxsqall calculation"); - - // define max timestep by dividing by the - // inverse of max frequency by discrete_factor - - dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); - - return dtmax; -} \ No newline at end of file diff --git a/src/SPIN/min_spin_oso_cg2.h b/src/SPIN/min_spin_oso_cg2.h deleted file mode 100644 index 83605f98ed..0000000000 --- a/src/SPIN/min_spin_oso_cg2.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- c++ -*- ---------------------------------------------------------- - LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator - http://lammps.sandia.gov, Sandia National Laboratories - Steve Plimpton, sjplimp@sandia.gov - - Copyright (2003) Sandia Corporation. Under the terms of Contract - DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains - certain rights in this software. This software is distributed under - the GNU General Public License. - - See the README file in the top-level LAMMPS directory. -------------------------------------------------------------------------- */ - -#ifdef MINIMIZE_CLASS - -MinimizeStyle(spin/oso_cg2, MinSpinOSO_CG2) - -#else - -#ifndef LMP_MIN_SPIN_OSO_CG2_H -#define LMP_MIN_SPIN_OSO_CG2_H - -#include "min.h" - -namespace LAMMPS_NS { - -class MinSpinOSO_CG2: public Min { - public: - MinSpinOSO_CG2(class LAMMPS *); - virtual ~MinSpinOSO_CG2(); - void init(); - void setup_style(); - int modify_param(int, char **); - void reset_vectors(); - int iterate(int); - private: - double dt; // global timestep - double dts; // spin timestep - int ireplica,nreplica; // for neb - double *spvec; // variables for atomic dof, as 1d vector - double *fmvec; // variables for atomic dof, as 1d vector - double *g_cur; // current gradient vector - double *g_old; // gradient vector at previous step - double *p_s; // search direction vector - double **sp_copy; // copy of the spins - int local_iter; // for neb - int nlocal_max; // max value of nlocal (for size of lists) - double discrete_factor; // factor for spin timestep evaluation - - double evaluate_dt(); - void advance_spins(); - void calc_gradient(); - void calc_search_direction(); - double maximum_rotation(double *); - void vm3(const double *, const double *, double *); - void rodrigues_rotation(const double *, double *); - int calc_and_make_step(double, double, int); - int awc(double, double, double, double); - void make_step(double, double *); - double max_torque(); - double der_e_cur; // current derivative along search dir. - double der_e_pr; // previous derivative along search dir. - int use_line_search; // use line search or not. - double maxepsrot; - - bigint last_negative; -}; - -} - -#endif -#endif From 07f2f5e5266983d3fcec42c5e50ac19ce82903f4 Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 22 Jul 2019 18:15:32 +0000 Subject: [PATCH 058/418] no line search for multireplica --- src/SPIN/min_spin_oso_cg.cpp | 10 +++++++++- src/SPIN/min_spin_oso_lbfgs.cpp | 12 ++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index c9f3a59f87..21927d0d31 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -73,7 +73,11 @@ MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : nreplica = universe->nworlds; ireplica = universe->iworld; - use_line_search = 1; + if (nreplica > 1) + use_line_search = 0; // no line search for NEB + else + use_line_search = 1; + discrete_factor = 10.0; } @@ -134,6 +138,10 @@ int MinSpinOSO_CG::modify_param(int narg, char **arg) if (strcmp(arg[0],"line_search") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); use_line_search = force->numeric(FLERR,arg[1]); + + if (nreplica > 1 && use_line_search) + error->all(FLERR,"Illegal fix_modify command, cannot use NEB and line search together"); + return 2; } if (strcmp(arg[0],"discrete_factor") == 0) { diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index d7e7302e4f..eba62f296f 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -73,7 +73,11 @@ MinSpinOSO_LBFGS::MinSpinOSO_LBFGS(LAMMPS *lmp) : nreplica = universe->nworlds; ireplica = universe->iworld; - use_line_search = 1; + if (nreplica > 1) + use_line_search = 0; // no line search for NEB + else + use_line_search = 1; + maxepsrot = MY_2PI / (100.0); } @@ -143,13 +147,17 @@ int MinSpinOSO_LBFGS::modify_param(int narg, char **arg) if (strcmp(arg[0],"line_search") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); use_line_search = force->numeric(FLERR,arg[1]); + + if (nreplica > 1 && use_line_search) + error->all(FLERR,"Illegal fix_modify command, cannot use NEB and line search together"); + return 2; } if (strcmp(arg[0],"discrete_factor") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); double discrete_factor; discrete_factor = force->numeric(FLERR,arg[1]); - maxepsrot = MY_2PI / discrete_factor; + maxepsrot = MY_2PI / (10 * discrete_factor); return 2; } return 0; From 89bfe4acf23eb09e6c9ab04302fb1faef89106de Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 22 Jul 2019 18:29:24 +0000 Subject: [PATCH 059/418] change convergence criteria in min_spin --- src/SPIN/min_spin.cpp | 42 +++++++++++++++++++++++++++++++++++++++++- src/SPIN/min_spin.h | 1 + 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp index 2277281e80..9849ba9946 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -167,7 +167,7 @@ int MinSpin::iterate(int maxiter) // sync across replicas if running multi-replica minimization if (update->ftol > 0.0) { - fmdotfm = fmnorm_sqr(); + fmdotfm = max_torque(); if (update->multireplica == 0) { if (fmdotfm < update->ftol*update->ftol) return FTOL; } else { @@ -331,3 +331,43 @@ double MinSpin::fmnorm_sqr() return norm2_sqr; } +/* ---------------------------------------------------------------------- + compute and return max_i||mag. torque_i||_2 +------------------------------------------------------------------------- */ + +double MinSpin::max_torque() +{ + double fmsq,fmaxsqone,fmaxsqloc,fmaxsqall; + int nlocal = atom->nlocal; + double hbar = force->hplanck/MY_2PI; + double tx,ty,tz; + double **sp = atom->sp; + double **fm = atom->fm; + + fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; + for (int i = 0; i < nlocal; i++) { + tx = fm[i][1] * sp[i][2] - fm[i][2] * sp[i][1]; + ty = fm[i][2] * sp[i][0] - fm[i][0] * sp[i][2]; + tz = fm[i][0] * sp[i][1] - fm[i][1] * sp[i][0]; + fmsq = tx * tx + ty * ty + tz * tz; + fmaxsqone = MAX(fmaxsqone,fmsq); + } + + // finding max fm on this replica + + fmaxsqloc = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); + + // finding max fm over all replicas, if necessary + // this communicator would be invalid for multiprocess replicas + + fmaxsqall = fmaxsqloc; + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + // multiply it by hbar so that units are in eV + + return sqrt(fmaxsqall) * hbar; +} diff --git a/src/SPIN/min_spin.h b/src/SPIN/min_spin.h index fbc624a9cc..d6d49203d5 100644 --- a/src/SPIN/min_spin.h +++ b/src/SPIN/min_spin.h @@ -36,6 +36,7 @@ class MinSpin : public Min { double evaluate_dt(); void advance_spins(double); double fmnorm_sqr(); + double max_torque(); private: From a9a2c7a496b38e4f30f6aa8389e6f7a58e13267c Mon Sep 17 00:00:00 2001 From: alxvov Date: Mon, 22 Jul 2019 18:31:14 +0000 Subject: [PATCH 060/418] no line search as default option for CG --- src/SPIN/min_spin_oso_cg.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 21927d0d31..843f1e48f1 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -73,10 +73,7 @@ MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : nreplica = universe->nworlds; ireplica = universe->iworld; - if (nreplica > 1) - use_line_search = 0; // no line search for NEB - else - use_line_search = 1; + use_line_search = 0; // no line search as default option for CG discrete_factor = 10.0; } From 1f4039048936835fb84a1e7a0f21d920b28a14ab Mon Sep 17 00:00:00 2001 From: casievers Date: Mon, 22 Jul 2019 13:48:02 -0700 Subject: [PATCH 061/418] recent change to gjf tally (not working) --- examples/gjf/out.argon | 249 ---------------------------------- examples/gjf/trajectory.0.dcd | Bin 439092 -> 0 bytes src/fix_langevin.cpp | 7 +- 3 files changed, 6 insertions(+), 250 deletions(-) delete mode 100644 examples/gjf/out.argon delete mode 100644 examples/gjf/trajectory.0.dcd diff --git a/examples/gjf/out.argon b/examples/gjf/out.argon deleted file mode 100644 index 8dda569157..0000000000 --- a/examples/gjf/out.argon +++ /dev/null @@ -1,249 +0,0 @@ -LAMMPS (1 Feb 2019) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) - using 1 OpenMP thread(s) per MPI task -Reading data file ... - orthogonal box = (0 0 0) to (32.146 32.146 32.146) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 864 atoms -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors -Setting up the ensembles -WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) -WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) -WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) -WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) -Doing Molecular dynamics -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.94072 - ghost atom cutoff = 6.94072 - binsize = 3.47036, bins = 10 10 10 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cubic, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard -Setting up Verlet run ... - Unit style : metal - Current step : 0 - Time step : 0.12 -Per MPI rank memory allocation (min/avg/max) = 6.847 | 6.847 | 6.847 Mbytes -Time Temp PotEng TotEng Press Volume CPU - 0 10 -56.207655 -55.09214 33.340921 33218.561 0 - 24 10.156356 -55.092888 -53.959932 339.40964 33218.561 0.082175482 - 48 9.6121006 -55.07262 -54.000376 344.56765 33218.561 0.19529325 - 72 9.8187467 -55.16687 -54.071574 318.85979 33218.561 0.29643488 - 96 9.5421385 -55.151229 -54.086789 322.8842 33218.561 0.38801357 - 120 10.295035 -55.12919 -53.980763 332.00171 33218.561 0.47607262 - 144 10.331608 -55.09907 -53.946563 339.28896 33218.561 0.57389224 - 168 10.154698 -55.058246 -53.925475 349.03253 33218.561 0.65481471 - 192 9.858198 -55.127583 -54.027886 330.09298 33218.561 0.74437734 - 216 9.6658918 -55.10812 -54.029875 334.28383 33218.561 0.8278495 - 240 9.6801591 -55.102386 -54.02255 336.27242 33218.561 0.91167379 - 264 10.685658 -55.046238 -53.854237 355.0448 33218.561 1.0023789 - 288 10.387727 -55.08427 -53.925504 343.87247 33218.561 1.0960371 - 312 10.231132 -55.120428 -53.97913 333.22463 33218.561 1.2382998 - 336 10.20896 -55.075142 -53.936317 344.88438 33218.561 1.3420489 - 360 9.7876538 -55.165008 -54.07318 319.14962 33218.561 1.42782 - 384 9.9872551 -55.13881 -54.024717 327.82471 33218.561 1.5417666 - 408 9.5362734 -55.063733 -53.999947 346.50545 33218.561 1.6328366 - 432 10.262638 -55.126608 -53.981796 332.16342 33218.561 1.7242996 - 456 9.9228239 -55.122119 -54.015214 332.26261 33218.561 1.8124888 - 480 9.7026324 -55.17057 -54.088227 317.84818 33218.561 1.900233 - 504 10.028762 -55.082465 -53.963741 343.04257 33218.561 1.989605 - 528 9.8227851 -55.121222 -54.025476 332.42857 33218.561 2.0708802 - 552 10.208672 -55.100242 -53.961449 338.68109 33218.561 2.1527217 - 576 10.180849 -55.124065 -53.988376 331.29516 33218.561 2.238126 - 600 9.6467252 -55.119533 -54.043427 332.43109 33218.561 2.323443 - 624 10.041885 -55.173802 -54.053614 318.48579 33218.561 2.4046151 - 648 10.151597 -55.111725 -53.979299 334.66227 33218.561 2.4902161 - 672 9.7719111 -55.060111 -53.970039 348.55249 33218.561 2.5800372 - 696 10.476688 -55.088109 -53.919419 342.94922 33218.561 2.6731395 - 720 10.517805 -55.113604 -53.940327 335.47342 33218.561 2.760651 - 744 10.006466 -55.045085 -53.928848 353.53813 33218.561 2.8537894 - 768 10.201492 -55.081598 -53.943606 343.3206 33218.561 2.9404115 - 792 10.117738 -55.077806 -53.949157 345.31093 33218.561 3.030765 - 816 10.362288 -55.11635 -53.960421 333.9045 33218.561 3.1177356 - 840 10.204164 -55.097619 -53.959329 338.82717 33218.561 3.2091886 - 864 10.147722 -55.101372 -53.969378 338.19682 33218.561 3.3003742 - 888 9.9265037 -55.111394 -54.004077 334.08116 33218.561 3.395341 - 912 10.206403 -55.132181 -53.993642 328.89904 33218.561 3.4882881 - 936 10.28639 -55.093317 -53.945855 340.61244 33218.561 3.5764735 - 960 9.8028822 -55.078802 -53.985276 343.5904 33218.561 3.7056267 - 984 10.492755 -55.121321 -53.950839 334.62697 33218.561 3.8055611 - 1008 10.621569 -55.088588 -53.903736 343.33166 33218.561 3.9144807 - 1032 10.006729 -55.113459 -53.997193 334.43025 33218.561 4.0189888 - 1056 10.099853 -55.068035 -53.941381 347.42158 33218.561 4.1391664 - 1080 10.254232 -55.066685 -53.92281 347.15777 33218.561 4.2443953 - 1104 9.9495142 -55.13686 -54.026977 327.63107 33218.561 4.3368342 - 1128 10.377108 -55.08846 -53.930878 344.13083 33218.561 4.4287748 - 1152 10.036981 -55.114643 -53.995003 334.88053 33218.561 4.526868 - 1176 10.144779 -55.097125 -53.965459 339.698 33218.561 4.6614049 - 1200 10.075844 -55.14695 -54.022974 326.05911 33218.561 4.799835 - 1224 10.183695 -55.121716 -53.98571 332.75772 33218.561 4.8908897 - 1248 10.581369 -55.027954 -53.847587 359.06251 33218.561 4.9839788 - 1272 10.158269 -55.105173 -53.972003 337.52964 33218.561 5.0918646 - 1296 9.8776072 -55.064085 -53.962223 347.15648 33218.561 5.2291209 - 1320 10.38161 -55.118366 -53.960282 335.17767 33218.561 5.3570446 - 1344 9.9528146 -55.141937 -54.031685 326.27117 33218.561 5.4584705 - 1368 9.8024326 -55.117808 -54.024332 332.99835 33218.561 5.5557818 - 1392 10.35447 -55.110235 -53.955179 336.80412 33218.561 5.6467392 - 1416 10.199061 -55.105641 -53.96792 337.36785 33218.561 5.7476527 - 1440 9.6868779 -55.087316 -54.00673 340.9166 33218.561 5.8432207 - 1464 10.093238 -55.049436 -53.92352 352.27563 33218.561 5.9471521 - 1488 9.7578808 -55.123935 -54.035429 329.93926 33218.561 6.0495014 - 1512 10.099979 -55.205426 -54.078758 309.26166 33218.561 6.1612976 - 1536 10.172944 -55.087106 -53.952299 342.93395 33218.561 6.2506202 - 1560 10.51771 -55.107635 -53.934369 340.1967 33218.561 6.3379856 - 1584 10.044994 -55.101362 -53.980828 339.03163 33218.561 6.4362567 - 1608 9.624758 -55.146246 -54.07259 324.32486 33218.561 6.5385845 - 1632 9.9135215 -55.097278 -53.99141 338.69162 33218.561 6.6452786 - 1656 9.863681 -55.070523 -53.970214 345.84608 33218.561 6.7518212 - 1680 10.138513 -55.127065 -53.996099 330.40757 33218.561 6.8775188 - 1704 10.382237 -55.070572 -53.912417 347.074 33218.561 7.0126448 - 1728 10.72487 -55.081147 -53.884771 345.83623 33218.561 7.1384216 - 1752 9.829431 -55.131041 -54.034553 328.57652 33218.561 7.2616419 - 1776 9.9135662 -55.100556 -53.994682 336.52238 33218.561 7.4193201 - 1800 10.41873 -55.097116 -53.934891 340.24798 33218.561 7.5570544 - 1824 10.151782 -55.03231 -53.899864 357.3654 33218.561 7.6872905 - 1848 10.42307 -55.043808 -53.881099 355.71677 33218.561 7.7933885 - 1872 10.276862 -55.085016 -53.938616 344.46273 33218.561 7.8887472 - 1896 9.7681373 -55.146507 -54.056857 324.84323 33218.561 7.9977923 - 1920 9.6624824 -55.103214 -54.025349 336.06397 33218.561 8.090235 - 1944 10.153504 -55.049175 -53.916536 352.36339 33218.561 8.1923703 - 1968 10.191954 -55.098741 -53.961813 338.8667 33218.561 8.3320906 - 1992 9.92167 -55.117079 -54.010302 332.96497 33218.561 8.4774437 - 2016 9.5737281 -55.091141 -54.023178 339.41837 33218.561 8.6149527 - 2040 10.600908 -55.092717 -53.91017 342.71852 33218.561 8.7639523 - 2064 9.9214513 -55.099904 -53.993151 337.46799 33218.561 8.898087 - 2088 9.9256258 -55.082224 -53.975005 342.85042 33218.561 9.0130784 - 2112 10.345379 -55.112923 -53.95888 335.81471 33218.561 9.1422766 - 2136 9.8876649 -55.079254 -53.97627 343.05764 33218.561 9.2885707 - 2160 10.04492 -55.074876 -53.95435 344.82419 33218.561 9.3876103 - 2184 10.028705 -55.063961 -53.945244 347.70549 33218.561 9.500967 - 2208 10.412572 -55.136316 -53.974778 329.8188 33218.561 9.5900362 - 2232 10.404205 -55.09913 -53.938525 339.77542 33218.561 9.7048353 - 2256 9.5694135 -55.139021 -54.071538 326.37473 33218.561 9.8045958 - 2280 10.244745 -55.134529 -53.991713 329.19392 33218.561 9.8968908 - 2304 9.9129922 -55.116192 -54.010382 333.14326 33218.561 9.9818651 - 2328 10.167027 -55.08241 -53.948263 343.08135 33218.561 10.068683 - 2352 10.262045 -55.144327 -53.999581 327.40876 33218.561 10.155937 - 2376 10.520934 -55.073147 -53.899521 347.6998 33218.561 10.246316 - 2400 9.9628692 -55.122001 -54.010628 331.25369 33218.561 10.336833 - 2424 10.565531 -55.157113 -53.978512 325.14897 33218.561 10.452039 - 2448 10.03709 -55.096409 -53.976756 338.29607 33218.561 10.537936 - 2472 9.384311 -55.141821 -54.094987 324.23247 33218.561 10.628689 - 2496 9.8019362 -55.105685 -54.012264 335.97239 33218.561 10.717287 - 2520 10.31114 -55.078831 -53.928608 345.42395 33218.561 10.818756 - 2544 10.407237 -55.148382 -53.987439 325.94421 33218.561 10.910801 - 2568 10.257967 -55.041348 -53.897056 355.73261 33218.561 11.004221 - 2592 9.8425807 -55.139428 -54.041474 328.28096 33218.561 11.101295 - 2616 10.140697 -55.100238 -53.969028 338.76319 33218.561 11.192211 - 2640 9.7102818 -55.136288 -54.053091 326.7053 33218.561 11.280277 - 2664 10.120372 -55.128779 -53.999836 330.71707 33218.561 11.369001 - 2688 10.232537 -55.120614 -53.979159 333.35087 33218.561 11.464652 - 2712 10.032526 -55.094761 -53.975618 339.97984 33218.561 11.559387 - 2736 9.8791 -55.121998 -54.01997 332.32556 33218.561 11.649679 - 2760 9.891483 -55.120919 -54.017509 331.32614 33218.561 11.742604 - 2784 10.201053 -55.165525 -54.027582 320.39272 33218.561 11.85274 - 2808 10.238648 -55.096449 -53.954312 340.06316 33218.561 11.939782 - 2832 9.8692851 -55.068632 -53.967699 346.77535 33218.561 12.036655 - 2856 10.179976 -55.128413 -53.992822 331.5662 33218.561 12.123227 - 2880 9.7656315 -55.1468 -54.057429 324.02612 33218.561 12.213117 - 2904 9.7991628 -55.049191 -53.95608 352.45738 33218.561 12.326761 - 2928 10.581767 -55.093293 -53.912881 341.37292 33218.561 12.417633 - 2952 10.546144 -55.07452 -53.898081 347.02025 33218.561 12.52701 - 2976 9.8306008 -55.14762 -54.051002 323.45715 33218.561 12.633522 - 3000 10.033532 -55.076433 -53.957178 345.36812 33218.561 12.72627 - 3024 10.046266 -55.085775 -53.965099 342.47786 33218.561 12.816242 - 3048 10.176777 -55.133013 -53.997778 329.04144 33218.561 12.903175 - 3072 9.9778064 -55.143787 -54.030748 326.75284 33218.561 13.014329 - 3096 10.516223 -55.110144 -53.937043 336.802 33218.561 13.104673 - 3120 9.6561157 -55.138699 -54.061544 325.6652 33218.561 13.207371 - 3144 10.237043 -55.060968 -53.91901 349.44011 33218.561 13.303442 - 3168 9.9704264 -55.123073 -54.010857 332.19725 33218.561 13.391877 - 3192 10.493307 -55.144402 -53.973858 327.15485 33218.561 13.482857 - 3216 10.022171 -55.141782 -54.023794 326.08249 33218.561 13.574484 - 3240 9.6957248 -55.137865 -54.056292 326.04858 33218.561 13.671408 - 3264 9.9685299 -55.124301 -54.012297 331.9015 33218.561 13.760186 - 3288 10.413707 -55.153604 -53.99194 324.32939 33218.561 13.877604 - 3312 10.022953 -55.103422 -53.985346 337.52066 33218.561 13.977562 - 3336 10.044478 -55.110297 -53.98982 334.48379 33218.561 14.065563 - 3360 9.8593734 -55.130623 -54.030795 327.71748 33218.561 14.15952 - 3384 9.9269422 -55.107979 -54.000613 335.18173 33218.561 14.258064 - 3408 10.288049 -55.092276 -53.944629 340.71484 33218.561 14.36211 - 3432 9.9702156 -55.08732 -53.975128 341.72171 33218.561 14.452123 - 3456 10.246178 -55.091669 -53.948692 341.62844 33218.561 14.555775 - 3480 10.559292 -55.086917 -53.909012 343.70626 33218.561 14.645718 - 3504 10.652207 -55.050897 -53.862628 354.46979 33218.561 14.797422 - 3528 9.9835266 -55.0557 -53.942023 350.74747 33218.561 14.895716 - 3552 10.240934 -55.123217 -53.980825 332.26434 33218.561 15.023796 - 3576 10.406519 -55.093536 -53.932674 341.54029 33218.561 15.203252 - 3600 10.406733 -55.095168 -53.934282 341.22192 33218.561 15.303986 - 3624 9.9877484 -55.154231 -54.040083 323.55633 33218.561 15.398883 - 3648 10.391829 -55.110208 -53.950984 337.09219 33218.561 15.49042 - 3672 10.368995 -55.069591 -53.912914 346.82649 33218.561 15.582259 - 3696 10.362939 -55.109012 -53.953011 337.32216 33218.561 15.679316 - 3720 10.465254 -55.136214 -53.968799 331.22288 33218.561 15.773303 - 3744 9.8238226 -55.10114 -54.005278 338.12616 33218.561 15.86905 - 3768 10.205504 -55.101263 -53.962824 339.04196 33218.561 15.960072 - 3792 9.9589987 -55.118883 -54.007942 332.84318 33218.561 16.047055 - 3816 10.253382 -55.117513 -53.973732 334.42101 33218.561 16.148412 - 3840 10.262393 -55.069549 -53.924764 349.084 33218.561 16.235391 - 3864 9.7367167 -55.078288 -53.992142 342.48207 33218.561 16.329112 - 3888 10.171202 -55.134701 -54.000088 329.5847 33218.561 16.415353 - 3912 10.01925 -55.145139 -54.027477 326.65074 33218.561 16.526334 - 3936 10.053638 -55.038151 -53.916653 355.74893 33218.561 16.618524 - 3960 10.044055 -55.058382 -53.937953 349.01834 33218.561 16.712577 - 3984 10.382422 -55.099216 -53.941041 339.28099 33218.561 16.79941 - 4008 9.97927 -55.09284 -53.979637 339.07225 33218.561 16.904198 - 4032 9.6782319 -55.126143 -54.046522 329.0201 33218.561 16.991454 - 4056 9.6593809 -55.123677 -54.046159 329.89833 33218.561 17.097172 - 4080 10.442896 -55.141149 -53.976229 327.9899 33218.561 17.189364 - 4104 9.9571109 -55.08588 -53.975149 341.3746 33218.561 17.294147 - 4128 10.44943 -55.087946 -53.922296 343.09435 33218.561 17.387357 - 4152 10.040581 -55.171939 -54.051897 317.85348 33218.561 17.500905 - 4176 10.089442 -55.128713 -54.00322 330.29121 33218.561 17.588891 - 4200 10.316156 -55.123219 -53.972436 333.59382 33218.561 17.679254 - 4224 10.177245 -55.095671 -53.960384 339.34498 33218.561 17.770569 - 4248 9.7129183 -55.135335 -54.051844 328.25125 33218.561 17.857728 - 4272 10.231838 -55.099554 -53.958177 339.64015 33218.561 17.944226 - 4296 9.9737677 -55.117885 -54.005297 333.07248 33218.561 18.034105 - 4320 10.004955 -55.116155 -54.000088 333.52271 33218.561 18.129644 - 4344 9.5938901 -55.133824 -54.063612 327.84171 33218.561 18.215476 - 4368 9.8954562 -55.131603 -54.02775 329.0813 33218.561 18.306539 - 4392 10.439732 -55.100379 -53.935812 339.81679 33218.561 18.395651 - 4416 9.934513 -55.08449 -53.97628 341.74441 33218.561 18.484506 - 4440 10.025998 -55.136771 -54.018356 327.73718 33218.561 18.593946 - 4464 9.9304451 -55.101817 -53.994061 338.1801 33218.561 18.684011 - 4488 10.344371 -55.085856 -53.931926 342.91721 33218.561 18.782399 - 4512 10.033193 -55.091778 -53.972561 339.85728 33218.561 18.879666 - 4536 9.2361614 -55.169375 -54.139067 316.67597 33218.561 18.983667 - 4560 9.5786289 -55.179976 -54.111465 314.76415 33218.561 19.079009 - 4584 10.071651 -55.107218 -53.98371 336.10364 33218.561 19.163975 - 4608 9.9873098 -55.109348 -53.995249 336.03665 33218.561 19.25635 - 4632 10.143888 -55.119423 -53.987857 333.74978 33218.561 19.346658 - 4656 9.7506264 -55.114772 -54.027075 332.98271 33218.561 19.435425 - 4680 9.9616769 -55.096054 -53.984814 339.20499 33218.561 19.55562 - 4704 10.271313 -55.074522 -53.928742 345.87397 33218.561 19.642652 - 4728 9.9172336 -55.098805 -53.992523 338.06318 33218.561 19.734557 - 4752 9.9556222 -55.12128 -54.010716 332.66408 33218.561 19.83859 - 4776 10.197593 -55.095293 -53.957736 339.50067 33218.561 19.947471 - 4800 10.145085 -55.108467 -53.976768 336.05115 33218.561 20.044183 - 4824 10.205523 -55.147376 -54.008934 325.56559 33218.561 20.144393 - 4848 9.8900281 -55.121598 -54.01835 331.17401 33218.561 20.243197 - 4872 10.03655 -55.100936 -53.981343 337.6777 33218.561 20.336043 - 4896 9.8120635 -55.087507 -53.992957 341.42438 33218.561 20.425498 - 4920 10.615354 -55.093335 -53.909176 342.30776 33218.561 20.519318 - 4944 10.374366 -55.06455 -53.907274 351.10607 33218.561 20.612312 - 4968 10.677474 -55.147807 -53.956718 327.85703 33218.561 20.719371 - 4992 10.558882 -55.145253 -53.967393 327.427 33218.561 20.818726 - 5016 9.4097946 -55.150835 -54.101158 321.62641 33218.561 20.914472 diff --git a/examples/gjf/trajectory.0.dcd b/examples/gjf/trajectory.0.dcd deleted file mode 100644 index 47927e9909cfcfc86ceb2568ba1660efed5834f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439092 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 z 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

YmD()?v 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

k(3eUSN@wI2>xvLzU?kG7;9mTIr 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

n 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 != update->beginstep){ fdrag[0] = gamma1*gjffac*v[i][0]; fdrag[1] = gamma1*gjffac*v[i][1]; fdrag[2] = gamma1*gjffac*v[i][2]; } + else if (Tp_GJF && update->ntimestep == update->beginstep){ + fdrag[0] = 0.0; + fdrag[1] = 0.0; + fdrag[2] = 0.0; + } flangevin[i][0] = fdrag[0] + fran[0]; flangevin[i][1] = fdrag[1] + fran[1]; flangevin[i][2] = fdrag[2] + fran[2]; From f0679cff6d87b0133f05833309af9c5d44468a0f Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 23 Jul 2019 09:27:15 -0600 Subject: [PATCH 062/418] Commit JT 072319 - added 2 oso examples in examples/SPIN/spinmin - added doc for oso_cg and oso_lbfgs --- doc/src/lammps.book | 1 + doc/src/min_modify.txt | 22 +++++++-- doc/src/min_spin.txt | 36 +++++++++++++-- doc/src/min_style.txt | 19 +++++++- doc/src/minimize.txt | 3 +- doc/src/neb_spin.txt | 6 ++- doc/src/pair_spin_dipole.txt | 5 +- examples/SPIN/spinmin/in.spinmin_cg.bfo | 54 ++++++++++++++++++++++ examples/SPIN/spinmin/in.spinmin_lbfgs.bfo | 54 ++++++++++++++++++++++ src/SPIN/min_spin.cpp | 4 +- src/SPIN/min_spin_oso_cg.cpp | 12 ++--- src/SPIN/min_spin_oso_lbfgs.cpp | 16 +++---- 12 files changed, 200 insertions(+), 32 deletions(-) create mode 100644 examples/SPIN/spinmin/in.spinmin_cg.bfo create mode 100644 examples/SPIN/spinmin/in.spinmin_lbfgs.bfo diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 2738c9b051..8abe9cffa1 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -647,6 +647,7 @@ pair_sph_lj.html pair_sph_rhosum.html pair_sph_taitwater.html pair_sph_taitwater_morris.html +pair_spin_dipole.html pair_spin_dmi.html pair_spin_exchange.html pair_spin_magelec.html diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index d342e8bf01..da7b593d16 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -13,11 +13,11 @@ min_modify command :h3 min_modify keyword values ... :pre one or more keyword/value pairs may be listed :ulb,l -keyword = {dmax} or {line} or {alpha_damp} or {discrete_factor} +keyword = {dmax} or {line} or {alpha_damp} or {discrete_factor} or {spin_cubic} or {spin_none} {dmax} value = max max = maximum distance for line search to move (distance units) - {line} value = {backtrack} or {quadratic} or {forcezero} - backtrack,quadratic,forcezero = style of linesearch to use + {line} value = {backtrack} or {quadratic} or {forcezero} or {spin_cubic} or {spin_none} + backtrack,quadratic,forcezero,spin_cubic,spin_none = style of linesearch to use {alpha_damp} value = damping damping = fictitious Gilbert damping for spin minimization (adim) {discrete_factor} value = factor @@ -80,7 +80,21 @@ See "min_spin"_min_spin.html for more information about those quantities. Default values are {alpha_damp} = 1.0 and {discrete_factor} = 10.0. -[Restrictions:] none +The choice of a line search algorithm for the {spin_oso_cg} and +{spin_oso_lbfgs} can be specified via the {line} keyword. +The {spin_cubic} and {spin_none} only make sense when those two +when one of those two minimization styles is declared. + +The {spin_cubic} keyword activates the line search procedure when +the {spin_oso_cg} algorithm is used. + +The {spin_none} keyword deactivates the line search procedure when +the {spin_oso_lbfgs} algorithm is used. + +[Restrictions:] The line search procedure of styles +{spin_oso_cg} and {spin_oso_lbfgs} cannot be used for magnetic +NEB calculations. See "neb/spin"_neb_spin.html for more +explanation. [Related commands:] diff --git a/doc/src/min_spin.txt b/doc/src/min_spin.txt index 890e324aca..6883a4197c 100644 --- a/doc/src/min_spin.txt +++ b/doc/src/min_spin.txt @@ -6,14 +6,19 @@ :line min_style spin command :h3 +min_style spin_oso_cg command :h3 +min_style spin_oso_lbfgs command :h3 [Syntax:] -min_style spin :pre +min_style spin +min_style spin_oso_cg +min_style spin_oso_lbfgs :pre [Examples:] -min_style spin :pre +min_style spin_oso_lbfgs +min_modify discrete_factor 10.0 line_search 0 :pre [Description:] @@ -46,9 +51,29 @@ definition of this timestep. {discrete_factor} can be defined with the "min_modify"_min_modify.html command. -NOTE: The {spin} style replaces the force tolerance by a torque +Style {spin_oso_cg} defines an orthogonal spin optimization +(OSO) combined to a conjugate gradient (CG) algorithm. +The "min_modify"_min_modify.html command can be used to +couple the {spin_oso_cg} to a line search procedure, and to modify the +discretization factor {discrete_factor}. + +Style {spin_oso_lbfgs} defines an orthogonal spin optimization +(OSO) combined to a limited-memory Broyden-Fletcher-Goldfarb-Shanno +(LBFGS) algorithm. +By default, style {spin_oso_lbfgs} uses a line search procedure. +The "min_modify"_min_modify.html command can be used to +deactivate the line search procedure. + +For more information about styles {spin_oso_cg} and {spin_oso_lbfgs}, +see their implementation reported in "(Ivanov)"_#Ivanov1. + +NOTE: All the {spin} styles replace the force tolerance by a torque tolerance. See "minimize"_minimize.html for more explanation. +NOTE: The {spin_oso_cg} and {spin_oso_lbfgs} styles can be used +for magnetic NEB calculations only if the line search procedure +is deactivated. See "neb/spin"_neb_spin.html for more explanation. + [Restrictions:] This minimization procedure is only applied to spin degrees of @@ -63,3 +88,8 @@ freedom for a frozen lattice configuration. The option defaults are {alpha_damp} = 1.0 and {discrete_factor} = 10.0. + +:line + +:link(Ivanov1) +[(Ivanov)] Ivanov, Uzdin, Jonsson. arXiv preprint arXiv:1904.02669, (2019). diff --git a/doc/src/min_style.txt b/doc/src/min_style.txt index c46c1492b4..081ec17889 100644 --- a/doc/src/min_style.txt +++ b/doc/src/min_style.txt @@ -11,7 +11,8 @@ min_style command :h3 min_style style :pre -style = {cg} or {hftn} or {sd} or {quickmin} or {fire} or {spin} :ul +style = {cg} or {hftn} or {sd} or {quickmin} or {fire} or {spin} +or {spin_oso_cg} or {spin_oso_lbfgs} :ul [Examples:] @@ -64,11 +65,25 @@ a minimization. Style {spin} is a damped spin dynamics with an adaptive timestep. -See the "min/spin"_min_spin.html doc page for more information. + +Style {spin_oso_cg} uses an orthogonal spin optimization (OSO) +combined to a conjugate gradient (CG) approach to minimize spin +configurations. + +Style {spin_oso_lbfgs} uses an orthogonal spin optimization (OSO) +combined to a limited-memory Broyden-Fletcher-Goldfarb-Shanno +(LBFGS) approach to minimize spin configurations. + +See the "min/spin"_min_spin.html doc page for more information +about the {spin}, {spin_oso_cg} and {spin_oso_lbfgs} styles. Either the {quickmin} and {fire} styles are useful in the context of nudged elastic band (NEB) calculations via the "neb"_neb.html command. +Either the {spin}, {spin_oso_cg} and {spin_oso_lbfgs} styles are useful +in the context of magnetic geodesic nudged elastic band (GNEB) calculations +via the "neb/spin"_neb_spin.html command. + NOTE: The damped dynamic minimizers use whatever timestep you have defined via the "timestep"_timestep.html command. Often they will converge more quickly if you use a timestep about 10x larger than you diff --git a/doc/src/minimize.txt b/doc/src/minimize.txt index ecf1ad0fcf..1dc28acdef 100644 --- a/doc/src/minimize.txt +++ b/doc/src/minimize.txt @@ -103,7 +103,8 @@ the line search fails because the step distance backtracks to 0.0 the number of outer iterations or timesteps exceeds {maxiter} the number of total force evaluations exceeds {maxeval} :ul -NOTE: the "minimization style"_min_style.html {spin} replaces +NOTE: the "minimization style"_min_style.html {spin}, +{spin_oso_cg}, and {spin_oso_lbfgs} replace the force tolerance {ftol} by a torque tolerance. The minimization procedure stops if the 2-norm (length) of the global torque vector (defined as the cross product between the diff --git a/doc/src/neb_spin.txt b/doc/src/neb_spin.txt index 7dbd924cd2..46478b1219 100644 --- a/doc/src/neb_spin.txt +++ b/doc/src/neb_spin.txt @@ -172,7 +172,8 @@ command is issued. A NEB calculation proceeds in two stages, each of which is a minimization procedure, performed via damped dynamics. To enable this, you must first define a damped spin dynamics -"min_style"_min_style.html, using the {spin} style (see +"min_style"_min_style.html, using either the {spin}, +{spin_oso_cg}, or {spin_oso_lbfgs} style (see "min_spin"_min_spin.html for more information). The other styles cannot be used, since they relax the lattice degrees of freedom instead of the spins. @@ -358,6 +359,9 @@ This command can only be used if LAMMPS was built with the SPIN package. See the "Build package"_Build_package.html doc page for more info. +The line search procedures of the {spin_oso_cg} and {spin_oso_lbfgs} +minimization styles cannot be used in a GNEB calculation. + :line [Related commands:] diff --git a/doc/src/pair_spin_dipole.txt b/doc/src/pair_spin_dipole.txt index 0d6471e07f..735c71139a 100644 --- a/doc/src/pair_spin_dipole.txt +++ b/doc/src/pair_spin_dipole.txt @@ -25,9 +25,8 @@ pair_coeff * * 10.0 pair_coeff 2 3 8.0 :pre pair_style spin/dipole/long 9.0 -pair_coeff * * 1.0 1.0 -pair_coeff 2 3 1.0 1.0 2.5 4.0 scale 0.5 -pair_coeff 2 3 1.0 1.0 2.5 4.0 :pre +pair_coeff * * 10.0 +pair_coeff 2 3 6.0 :pre [Description:] diff --git a/examples/SPIN/spinmin/in.spinmin_cg.bfo b/examples/SPIN/spinmin/in.spinmin_cg.bfo new file mode 100644 index 0000000000..cd6ec485ad --- /dev/null +++ b/examples/SPIN/spinmin/in.spinmin_cg.bfo @@ -0,0 +1,54 @@ +# bfo in a 3d periodic box + +units metal +dimension 3 +boundary p p f +atom_style spin + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice sc 3.96 +region box block 0.0 34.0 0.0 34.0 0.0 1.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 1.0 +set group all spin/random 11 2.50 + +pair_style hybrid/overlay spin/exchange 6.0 spin/magelec 4.5 spin/dmi 4.5 +pair_coeff * * spin/exchange exchange 6.0 -0.01575 0.0 1.965 +# pair_coeff * * spin/magelec magelec 4.5 0.000109 1.0 1.0 1.0 +pair_coeff * * spin/magelec magelec 4.5 0.00109 1.0 1.0 1.0 +pair_coeff * * spin/dmi dmi 4.5 0.00005 1.0 1.0 1.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +fix 1 all precession/spin anisotropy 0.0000033 0.0 0.0 1.0 +fix_modify 1 energy yes + +timestep 0.0001 + +compute out_mag all spin +compute out_pe all pe +compute out_ke all ke +compute out_temp all temp + +variable magz equal c_out_mag[3] +variable magnorm equal c_out_mag[4] +variable emag equal c_out_mag[5] +variable tmag equal c_out_mag[6] + +thermo 50 +thermo_style custom step time v_magnorm v_emag v_tmag temp etotal +thermo_modify format float %20.15g + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] + +min_style spin/oso_cg +min_modify discrete_factor 10.0 line_search 0 +minimize 1.0e-10 1.0e-10 10000 1000 diff --git a/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo b/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo new file mode 100644 index 0000000000..5db44522e1 --- /dev/null +++ b/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo @@ -0,0 +1,54 @@ +# bfo in a 3d periodic box + +units metal +dimension 3 +boundary p p f +atom_style spin + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice sc 3.96 +region box block 0.0 34.0 0.0 34.0 0.0 1.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 1.0 +set group all spin/random 11 2.50 + +pair_style hybrid/overlay spin/exchange 6.0 spin/magelec 4.5 spin/dmi 4.5 +pair_coeff * * spin/exchange exchange 6.0 -0.01575 0.0 1.965 +#pair_coeff * * spin/magelec magelec 4.5 0.000109 1.0 1.0 1.0 +pair_coeff * * spin/magelec magelec 4.5 0.00109 1.0 1.0 1.0 +pair_coeff * * spin/dmi dmi 4.5 0.00005 1.0 1.0 1.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +fix 1 all precession/spin anisotropy 0.0000033 0.0 0.0 1.0 +fix_modify 1 energy yes + +timestep 0.0001 + +compute out_mag all spin +compute out_pe all pe +compute out_ke all ke +compute out_temp all temp + +variable magz equal c_out_mag[3] +variable magnorm equal c_out_mag[4] +variable emag equal c_out_mag[5] +variable tmag equal c_out_mag[6] + +thermo 50 +thermo_style custom step time v_magnorm v_emag v_tmag temp etotal +thermo_modify format float %20.15g + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] + +min_style spin/oso_lbfgs +min_modify discrete_factor 10.0 line_search 1 +minimize 1.0e-15 1.0e-10 10000 1000 diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp index 9849ba9946..f56c9f0d96 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -80,12 +80,12 @@ void MinSpin::setup_style() int MinSpin::modify_param(int narg, char **arg) { if (strcmp(arg[0],"alpha_damp") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (narg < 2) error->all(FLERR,"Illegal min_modify command"); alpha_damp = force->numeric(FLERR,arg[1]); return 2; } if (strcmp(arg[0],"discrete_factor") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (narg < 2) error->all(FLERR,"Illegal min_modify command"); discrete_factor = force->numeric(FLERR,arg[1]); return 2; } diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 843f1e48f1..e43c51e3af 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -133,12 +133,10 @@ void MinSpinOSO_CG::setup_style() int MinSpinOSO_CG::modify_param(int narg, char **arg) { if (strcmp(arg[0],"line_search") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (narg < 2) error->all(FLERR,"Illegal min_modify command"); use_line_search = force->numeric(FLERR,arg[1]); - if (nreplica > 1 && use_line_search) error->all(FLERR,"Illegal fix_modify command, cannot use NEB and line search together"); - return 2; } if (strcmp(arg[0],"discrete_factor") == 0) { @@ -250,9 +248,9 @@ int MinSpinOSO_CG::iterate(int maxiter) neval++; } - //// energy tolerance criterion - //// only check after DELAYSTEP elapsed since velocties reset to 0 - //// sync across replicas if running multi-replica minimization + // energy tolerance criterion + // only check after DELAYSTEP elapsed since velocties reset to 0 + // sync across replicas if running multi-replica minimization if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { if (update->multireplica == 0) { @@ -680,4 +678,4 @@ double MinSpinOSO_CG::evaluate_dt() dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); return dtmax; -} \ No newline at end of file +} diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index eba62f296f..0bd128367f 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -145,16 +145,14 @@ int MinSpinOSO_LBFGS::modify_param(int narg, char **arg) { if (strcmp(arg[0],"line_search") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (narg < 2) error->all(FLERR,"Illegal min_modify command"); use_line_search = force->numeric(FLERR,arg[1]); - if (nreplica > 1 && use_line_search) - error->all(FLERR,"Illegal fix_modify command, cannot use NEB and line search together"); - + error->all(FLERR,"Illegal min_modify command, cannot use NEB and line search together"); return 2; } if (strcmp(arg[0],"discrete_factor") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); + if (narg < 2) error->all(FLERR,"Illegal min_modify command"); double discrete_factor; discrete_factor = force->numeric(FLERR,arg[1]); maxepsrot = MY_2PI / (10 * discrete_factor); @@ -266,9 +264,9 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) neval++; } - //// energy tolerance criterion - //// only check after DELAYSTEP elapsed since velocties reset to 0 - //// sync across replicas if running multi-replica minimization + // energy tolerance criterion + // only check after DELAYSTEP elapsed since velocties reset to 0 + // sync across replicas if running multi-replica minimization if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { if (update->multireplica == 0) { @@ -802,4 +800,4 @@ double MinSpinOSO_LBFGS::maximum_rotation(double *p) else alpha = 1.0; return alpha; -} \ No newline at end of file +} From f1c3b9d0bf3fd4f27711e81eb11dbb70d79da5fb Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 23 Jul 2019 11:24:52 -0600 Subject: [PATCH 063/418] Commit2 JT 072319 - corrected some mistakes in doc files - modified oso examples to match new line options --- doc/src/min_modify.txt | 10 +++++----- doc/src/min_spin.txt | 5 +++-- doc/src/neb_spin.txt | 4 ++-- examples/SPIN/spinmin/in.spinmin_cg.bfo | 2 +- examples/SPIN/spinmin/in.spinmin_lbfgs.bfo | 2 +- src/SPIN/neb_spin.cpp | 2 +- 6 files changed, 13 insertions(+), 12 deletions(-) diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index da7b593d16..c59e2b474b 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -13,7 +13,7 @@ min_modify command :h3 min_modify keyword values ... :pre one or more keyword/value pairs may be listed :ulb,l -keyword = {dmax} or {line} or {alpha_damp} or {discrete_factor} or {spin_cubic} or {spin_none} +keyword = {dmax} or {line} or {alpha_damp} or {discrete_factor} {dmax} value = max max = maximum distance for line search to move (distance units) {line} value = {backtrack} or {quadratic} or {forcezero} or {spin_cubic} or {spin_none} @@ -81,9 +81,9 @@ quantities. Default values are {alpha_damp} = 1.0 and {discrete_factor} = 10.0. The choice of a line search algorithm for the {spin_oso_cg} and -{spin_oso_lbfgs} can be specified via the {line} keyword. -The {spin_cubic} and {spin_none} only make sense when those two -when one of those two minimization styles is declared. +{spin_oso_lbfgs} styles can be specified via the {line} keyword. +The {spin_cubic} and {spin_none} only make sense when one of those +two minimization styles is declared. The {spin_cubic} keyword activates the line search procedure when the {spin_oso_cg} algorithm is used. @@ -93,7 +93,7 @@ the {spin_oso_lbfgs} algorithm is used. [Restrictions:] The line search procedure of styles {spin_oso_cg} and {spin_oso_lbfgs} cannot be used for magnetic -NEB calculations. See "neb/spin"_neb_spin.html for more +GNEB calculations. See "neb/spin"_neb_spin.html for more explanation. [Related commands:] diff --git a/doc/src/min_spin.txt b/doc/src/min_spin.txt index 6883a4197c..2a85427c56 100644 --- a/doc/src/min_spin.txt +++ b/doc/src/min_spin.txt @@ -18,7 +18,7 @@ min_style spin_oso_lbfgs :pre [Examples:] min_style spin_oso_lbfgs -min_modify discrete_factor 10.0 line_search 0 :pre +min_modify discrete_factor 10.0 line spin_none :pre [Description:] @@ -62,7 +62,8 @@ Style {spin_oso_lbfgs} defines an orthogonal spin optimization (LBFGS) algorithm. By default, style {spin_oso_lbfgs} uses a line search procedure. The "min_modify"_min_modify.html command can be used to -deactivate the line search procedure. +deactivate the line search procedure, and to modify the +discretization factor {discrete_factor}. For more information about styles {spin_oso_cg} and {spin_oso_lbfgs}, see their implementation reported in "(Ivanov)"_#Ivanov1. diff --git a/doc/src/neb_spin.txt b/doc/src/neb_spin.txt index 46478b1219..27e835276e 100644 --- a/doc/src/neb_spin.txt +++ b/doc/src/neb_spin.txt @@ -60,8 +60,8 @@ processors per replica. See the "Howto replica"_Howto_replica.html doc page for further discussion. NOTE: As explained below, a GNEB calculation performs a damped dynamics -minimization across all the replicas. The "spin"_min_spin.html -style minimizer has to be defined in your input script. +minimization across all the replicas. One of the "spin"_min_spin.html +style minimizers has to be defined in your input script. When a GNEB calculation is performed, it is assumed that each replica is running the same system, though LAMMPS does not check for this. diff --git a/examples/SPIN/spinmin/in.spinmin_cg.bfo b/examples/SPIN/spinmin/in.spinmin_cg.bfo index cd6ec485ad..901b04e5fd 100644 --- a/examples/SPIN/spinmin/in.spinmin_cg.bfo +++ b/examples/SPIN/spinmin/in.spinmin_cg.bfo @@ -50,5 +50,5 @@ compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] min_style spin/oso_cg -min_modify discrete_factor 10.0 line_search 0 +min_modify discrete_factor 10.0 line spin_cubic minimize 1.0e-10 1.0e-10 10000 1000 diff --git a/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo b/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo index 5db44522e1..4edd1a053e 100644 --- a/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo +++ b/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo @@ -50,5 +50,5 @@ compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] min_style spin/oso_lbfgs -min_modify discrete_factor 10.0 line_search 1 +min_modify discrete_factor 10.0 line spin_none minimize 1.0e-15 1.0e-10 10000 1000 diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index 12d1d2a956..4fa1f4467b 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -650,7 +650,7 @@ int NEBSpin::initial_rotation(double *spi, double *sploc, double fraction) kcrossy = kz*spix - kx*spiz; kcrossz = kx*spiy - ky*spix; - kdots = kx*spix + ky*spiz + kz*spiz; + kdots = kx*spix + ky*spiy + kz*spiz; omega = acos(sidotsf); omega *= fraction; From 9c3760064c5f3c7566a7917e2e034b1907301f9a Mon Sep 17 00:00:00 2001 From: Jun-Chieh Wang Date: Tue, 23 Jul 2019 15:01:49 -0700 Subject: [PATCH 064/418] move it to the constructor --- src/MISC/fix_deposit.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/MISC/fix_deposit.cpp b/src/MISC/fix_deposit.cpp index ca841b49bd..94449cbe5f 100644 --- a/src/MISC/fix_deposit.cpp +++ b/src/MISC/fix_deposit.cpp @@ -193,6 +193,14 @@ FixDeposit::FixDeposit(LAMMPS *lmp, int narg, char **arg) : next_reneighbor = update->ntimestep + 1; nfirst = next_reneighbor; ninserted = 0; + + // throw away the first few numbers to avoid the unexpected correlations + + double tmp_rand; + for (int ii=0; ii < 30; ii++) { + tmp_rand = random->uniform(); + } + } /* ---------------------------------------------------------------------- */ @@ -343,11 +351,6 @@ void FixDeposit::pre_exchange() // choose random position for new particle within region if (distflag == DIST_UNIFORM) { - // throw away the first few numbers to avoid the unexpected correlations - double tmp_rand; - for (int ii=0; ii < 30; ii++) { - tmp_rand = random->uniform(); - } do { coord[0] = xlo + random->uniform() * (xhi-xlo); coord[1] = ylo + random->uniform() * (yhi-ylo); From 15d791d0e3ff82b05fd5012daea2e6a9e41643a4 Mon Sep 17 00:00:00 2001 From: casievers Date: Tue, 23 Jul 2019 18:41:31 -0700 Subject: [PATCH 065/418] debugging gjf tally --- src/fix_langevin.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index 7d5c382488..82366be4dd 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -673,9 +673,12 @@ void FixLangevin::post_force_untemplated if (Tp_TALLY) { if (Tp_GJF && update->ntimestep != update->beginstep){ - fdrag[0] = gamma1*gjffac*v[i][0]; - fdrag[1] = gamma1*gjffac*v[i][1]; - fdrag[2] = gamma1*gjffac*v[i][2]; + fdrag[0] = gamma1*gjffac*gjffac*v[i][0]; + fdrag[1] = gamma1*gjffac*gjffac*v[i][1]; + fdrag[2] = gamma1*gjffac*gjffac*v[i][2]; + fran[0] *= gjffac; + fran[1] *= gjffac; + fran[2] *= gjffac; } else if (Tp_GJF && update->ntimestep == update->beginstep){ fdrag[0] = 0.0; @@ -902,14 +905,8 @@ void FixLangevin::end_of_step() v[i][2] = lv[i][2]; } } - if (tallyflag && hsflag){ - energy_onestep += gjffac*(flangevin[i][0] * lv[i][0] + - flangevin[i][1] * lv[i][1] + flangevin[i][2] * lv[i][2]); - } - else if (tallyflag){ - energy_onestep += flangevin[i][0] * v[i][0] + flangevin[i][1] * v[i][1] + - flangevin[i][2] * v[i][2]; - } + energy_onestep += flangevin[i][0] * v[i][0] + flangevin[i][1] * v[i][1] + + flangevin[i][2] * v[i][2]; } if (tallyflag) { energy += energy_onestep * update->dt; @@ -985,8 +982,11 @@ double FixLangevin::compute_scalar() } // convert midstep energy back to previous fullstep energy - - double energy_me = energy - 0.5*energy_onestep*update->dt; + double energy_me; + if (gjfflag) + energy_me = energy - energy_onestep*update->dt; + else + energy_me = energy - 0.5*energy_onestep*update->dt; double energy_all; MPI_Allreduce(&energy_me,&energy_all,1,MPI_DOUBLE,MPI_SUM,world); From fe7927af1180093ca062203656104910e0201f68 Mon Sep 17 00:00:00 2001 From: Jun-Chieh Wang Date: Wed, 24 Jul 2019 14:38:08 -0700 Subject: [PATCH 066/418] move it after the generator is constructed --- src/MISC/fix_deposit.cpp | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/MISC/fix_deposit.cpp b/src/MISC/fix_deposit.cpp index 94449cbe5f..66493f810f 100644 --- a/src/MISC/fix_deposit.cpp +++ b/src/MISC/fix_deposit.cpp @@ -184,8 +184,14 @@ FixDeposit::FixDeposit(LAMMPS *lmp, int narg, char **arg) : if (idnext) find_maxid(); // random number generator, same for all procs + // warm-up the generator 30x to avoid correlations in first-particle + // positions if runs are repeated with consecutive seeds random = new RanPark(lmp,seed); + double tmp_rand; + for (int ii=0; ii < 30; ii++) { + tmp_rand = random->uniform(); + } // set up reneighboring @@ -193,14 +199,6 @@ FixDeposit::FixDeposit(LAMMPS *lmp, int narg, char **arg) : next_reneighbor = update->ntimestep + 1; nfirst = next_reneighbor; ninserted = 0; - - // throw away the first few numbers to avoid the unexpected correlations - - double tmp_rand; - for (int ii=0; ii < 30; ii++) { - tmp_rand = random->uniform(); - } - } /* ---------------------------------------------------------------------- */ From 25653e67f8a041890f1ff6ff933a0fe2f84250b6 Mon Sep 17 00:00:00 2001 From: casievers Date: Wed, 24 Jul 2019 16:05:25 -0700 Subject: [PATCH 067/418] Tally works and example readmes addes --- examples/gjf/README.md | 13 +++++++++++++ examples/python/gjf_python/README.md | 18 ++++++++++++++++++ src/fix_langevin.cpp | 5 ----- 3 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 examples/gjf/README.md create mode 100644 examples/python/gjf_python/README.md diff --git a/examples/gjf/README.md b/examples/gjf/README.md new file mode 100644 index 0000000000..e285ab8510 --- /dev/null +++ b/examples/gjf/README.md @@ -0,0 +1,13 @@ +# LAMMPS GJF-2GJ THERMOSTAT EXAMPLE W/ PYTHON + +## GJF-2GJ THERMOSTAT + +This directory contains the ingredients to run an NVT simulation using the GJF-2GJ thermostat. + +Example: +``` +NP=4 #number of processors +mpirun -np $NP lmp_mpi -in.argon -out.argon +``` + +## Required LAMMPS packages: MOLECULE package diff --git a/examples/python/gjf_python/README.md b/examples/python/gjf_python/README.md new file mode 100644 index 0000000000..707289f02d --- /dev/null +++ b/examples/python/gjf_python/README.md @@ -0,0 +1,18 @@ +# LAMMPS GJF-2GJ THERMOSTAT EXAMPLE W/ PYTHON + +## GJF-2GJ THERMOSTAT + +This directory contains a python script to run NVT simulations using the GJF-2GJ thermostat. +The script will vary the timestep and write thermodynamic output to screen. +This script has True/False options to change how you would like to dump/write your output. + +Example: +``` +NP=4 #number of processors +mpirun -np $NP python gjf.py +``` + +## Required LAMMPS packages: MOLECULE package +## LAMMPS COMPILE MODE: SHLIB +## LAMMPS OPTIONAL INSTALL: make install-python +## Required Python packages: mpi4py diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index 82366be4dd..4fcf7c6a1d 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -174,11 +174,6 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : // no need to set peratom_flag, b/c data is for internal use only if (gjfflag) { - //int mem = 6*atom->nmax*sizeof(double); - //if (hsflag) mem += 3*atom->nmax*sizeof(double); -// - //comm->maxexchange_fix = MAX(comm->maxexchange_fix, 0); - //comm->maxexchange_fix += MAX(1000, mem); nvalues = 3; grow_arrays(atom->nmax); From f9ed12be4f0ff547661a6dffe420b67c76655379 Mon Sep 17 00:00:00 2001 From: alxvov Date: Wed, 24 Jul 2019 23:21:07 +0000 Subject: [PATCH 068/418] modify line for spin_cubic, spin_none. edit docs a bit. --- doc/src/min_modify.txt | 12 ++-- doc/src/min_spin.txt | 17 ++++-- doc/src/minimize.txt | 8 +-- doc/src/neb_spin.txt | 6 +- examples/SPIN/spinmin/in.spinmin_cg.bfo | 8 +-- examples/SPIN/spinmin/in.spinmin_lbfgs.bfo | 6 +- src/MAKE/Makefile.serial | 2 +- src/SPIN/min_spin_oso_cg.cpp | 64 +++++++++++----------- src/SPIN/min_spin_oso_cg.h | 4 +- src/SPIN/min_spin_oso_lbfgs.cpp | 48 +++++++--------- src/SPIN/min_spin_oso_lbfgs.h | 2 +- 11 files changed, 89 insertions(+), 88 deletions(-) diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index c59e2b474b..9c4d7c8fcb 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -84,12 +84,12 @@ The choice of a line search algorithm for the {spin_oso_cg} and {spin_oso_lbfgs} styles can be specified via the {line} keyword. The {spin_cubic} and {spin_none} only make sense when one of those two minimization styles is declared. - -The {spin_cubic} keyword activates the line search procedure when -the {spin_oso_cg} algorithm is used. - -The {spin_none} keyword deactivates the line search procedure when -the {spin_oso_lbfgs} algorithm is used. +The {spin_cubic} performs the line search based on a cubic interpolation +of the energy along the search direction. The {spin_none} keyword +deactivates the line search procedure. +The {spin_none} is a default value for {line} keyword apart from the case when +single-replica calculations are performed with {spin_oso_lbfgs} that +uses {spin_cubic} line search. [Restrictions:] The line search procedure of styles {spin_oso_cg} and {spin_oso_lbfgs} cannot be used for magnetic diff --git a/doc/src/min_spin.txt b/doc/src/min_spin.txt index 2a85427c56..77dc008b3e 100644 --- a/doc/src/min_spin.txt +++ b/doc/src/min_spin.txt @@ -18,7 +18,7 @@ min_style spin_oso_lbfgs :pre [Examples:] min_style spin_oso_lbfgs -min_modify discrete_factor 10.0 line spin_none :pre +min_modify line spin_none discrete_factor 10.0 :pre [Description:] @@ -55,12 +55,21 @@ Style {spin_oso_cg} defines an orthogonal spin optimization (OSO) combined to a conjugate gradient (CG) algorithm. The "min_modify"_min_modify.html command can be used to couple the {spin_oso_cg} to a line search procedure, and to modify the -discretization factor {discrete_factor}. +discretization factor {discrete_factor}. +By defualt, the style {spin_oso_cg} does not employ line search procedure and +and uses the adaptive time-step technique in the same way as style {spin}. Style {spin_oso_lbfgs} defines an orthogonal spin optimization (OSO) combined to a limited-memory Broyden-Fletcher-Goldfarb-Shanno -(LBFGS) algorithm. -By default, style {spin_oso_lbfgs} uses a line search procedure. +(L-BFGS) algorithm. +By default, style {spin_oso_lbfgs} uses a line search procedure +based on cubic interpolation for +a single-replica calculation, and it does not use line search procedure +for a multireplica calculation (such as in case of GNEB calculation). +If the line search procedure is not used then the discrete factor defines +the maximum root mean squared rotation angle of spins by equation {pi/(5*Kappa)}. +The default value for Kappa is 10. + The "min_modify"_min_modify.html command can be used to deactivate the line search procedure, and to modify the discretization factor {discrete_factor}. diff --git a/doc/src/minimize.txt b/doc/src/minimize.txt index 1dc28acdef..1de925d6c8 100644 --- a/doc/src/minimize.txt +++ b/doc/src/minimize.txt @@ -106,10 +106,10 @@ the number of total force evaluations exceeds {maxeval} :ul NOTE: the "minimization style"_min_style.html {spin}, {spin_oso_cg}, and {spin_oso_lbfgs} replace the force tolerance {ftol} by a torque tolerance. -The minimization procedure stops if the 2-norm (length) of the -global torque vector (defined as the cross product between the -spins and their precession vectors omega) is less than {ftol}, -or if any of the other criteria are met. +The minimization procedure stops if the 2-norm (length) of the torque vector on atom +(defined as the cross product between the +atomic spin and its precession vectors omega) is less than {ftol}, +or if any of the other criteria are met. Torque have the same units as the energy. NOTE: You can also use the "fix halt"_fix_halt.html command to specify a general criterion for exiting a minimization, that is a calculation diff --git a/doc/src/neb_spin.txt b/doc/src/neb_spin.txt index 27e835276e..2fdfda8c66 100644 --- a/doc/src/neb_spin.txt +++ b/doc/src/neb_spin.txt @@ -59,7 +59,7 @@ performance speed-up you would see with one or more physical processors per replica. See the "Howto replica"_Howto_replica.html doc page for further discussion. -NOTE: As explained below, a GNEB calculation performs a damped dynamics +NOTE: As explained below, a GNEB calculation performs a minimization across all the replicas. One of the "spin"_min_spin.html style minimizers has to be defined in your input script. @@ -170,8 +170,8 @@ command is issued. :line A NEB calculation proceeds in two stages, each of which is a -minimization procedure, performed via damped dynamics. To enable -this, you must first define a damped spin dynamics +minimization procedure. To enable +this, you must first define a "min_style"_min_style.html, using either the {spin}, {spin_oso_cg}, or {spin_oso_lbfgs} style (see "min_spin"_min_spin.html for more information). diff --git a/examples/SPIN/spinmin/in.spinmin_cg.bfo b/examples/SPIN/spinmin/in.spinmin_cg.bfo index 901b04e5fd..776079edb8 100644 --- a/examples/SPIN/spinmin/in.spinmin_cg.bfo +++ b/examples/SPIN/spinmin/in.spinmin_cg.bfo @@ -42,13 +42,13 @@ variable magnorm equal c_out_mag[4] variable emag equal c_out_mag[5] variable tmag equal c_out_mag[6] -thermo 50 +thermo 100 thermo_style custom step time v_magnorm v_emag v_tmag temp etotal thermo_modify format float %20.15g compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] -min_style spin/oso_cg -min_modify discrete_factor 10.0 line spin_cubic -minimize 1.0e-10 1.0e-10 10000 1000 +min_style spin_oso_cg +# min_modify line spin_none discrete_factor 10.0 +minimize 1.0e-10 1.0e-7 1000 1000 diff --git a/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo b/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo index 4edd1a053e..ca600f1c2b 100644 --- a/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo +++ b/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo @@ -49,6 +49,6 @@ thermo_modify format float %20.15g compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] -min_style spin/oso_lbfgs -min_modify discrete_factor 10.0 line spin_none -minimize 1.0e-15 1.0e-10 10000 1000 +min_style spin_oso_lbfgs +min_modify line spin_cubic discrete_factor 10.0 +minimize 1.0e-15 1.0e-7 10000 1000 diff --git a/src/MAKE/Makefile.serial b/src/MAKE/Makefile.serial index 5954d97761..8628d2bb73 100644 --- a/src/MAKE/Makefile.serial +++ b/src/MAKE/Makefile.serial @@ -7,7 +7,7 @@ SHELL = /bin/sh # specify flags and libraries needed for your compiler CC = g++ -CCFLAGS = -g -O3 +CCFLAGS = -g -O3 -Wall SHFLAGS = -fPIC DEPFLAGS = -M diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index e43c51e3af..2bdc00d8ed 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -63,7 +63,7 @@ static const char cite_minstyle_spin_oso_cg[] = /* ---------------------------------------------------------------------- */ MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : - Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL) + Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), sp_copy(NULL) { if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_cg); nlocal_max = 0; @@ -99,6 +99,13 @@ void MinSpinOSO_CG::init() Min::init(); + if (linestyle == 3 && nreplica == 1){ + use_line_search = 1; + } + else{ + use_line_search = 0; + } + dts = dt = update->dt; last_negative = update->ntimestep; @@ -132,13 +139,6 @@ void MinSpinOSO_CG::setup_style() int MinSpinOSO_CG::modify_param(int narg, char **arg) { - if (strcmp(arg[0],"line_search") == 0) { - if (narg < 2) error->all(FLERR,"Illegal min_modify command"); - use_line_search = force->numeric(FLERR,arg[1]); - if (nreplica > 1 && use_line_search) - error->all(FLERR,"Illegal fix_modify command, cannot use NEB and line search together"); - return 2; - } if (strcmp(arg[0],"discrete_factor") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); discrete_factor = force->numeric(FLERR,arg[1]); @@ -181,7 +181,6 @@ int MinSpinOSO_CG::iterate(int maxiter) double der_e_cur_tmp = 0.0; if (nlocal_max < nlocal) { - nlocal_max = nlocal; local_iter = 0; nlocal_max = nlocal; memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg:g_old"); @@ -205,8 +204,9 @@ int MinSpinOSO_CG::iterate(int maxiter) if (use_line_search) { // here we need to do line search - if (local_iter == 0) + if (local_iter == 0){ calc_gradient(); + } calc_search_direction(); der_e_cur = 0.0; @@ -219,7 +219,7 @@ int MinSpinOSO_CG::iterate(int maxiter) } for (int i = 0; i < nlocal; i++) for (int j = 0; j < 3; j++) - sp_copy[i][j] = sp[i][j]; + sp_copy[i][j] = sp[i][j]; eprevious = ecurrent; der_e_pr = der_e_cur; @@ -228,24 +228,15 @@ int MinSpinOSO_CG::iterate(int maxiter) else{ // here we don't do line search - // but use cutoff rotation angle // if gneb calc., nreplica > 1 // then calculate gradients and advance spins // of intermediate replicas only - - if (nreplica > 1) { - if(ireplica != 0 && ireplica != nreplica-1) calc_gradient(); calc_search_direction(); advance_spins(); - } else{ - calc_gradient(); - calc_search_direction(); - advance_spins(); - } + neval++; eprevious = ecurrent; ecurrent = energy_force(0); - neval++; } // energy tolerance criterion @@ -336,10 +327,18 @@ void MinSpinOSO_CG::calc_search_direction() double g2_global = 0.0; double g2old_global = 0.0; + double factor = 1.0; + + // for multiple replica do not move end points + if (nreplica > 1) + if (ireplica == 0 || ireplica == nreplica - 1) + factor = 0.0; + + if (local_iter == 0 || local_iter % 5 == 0){ // steepest descent direction for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = -g_cur[i]; - g_old[i] = g_cur[i]; + p_s[i] = -g_cur[i] * factor; + g_old[i] = g_cur[i] * factor; } } else { // conjugate direction for (int i = 0; i < 3 * nlocal; i++) { @@ -354,9 +353,9 @@ void MinSpinOSO_CG::calc_search_direction() MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,world); // Sum over all replicas. Good for GNEB. - if (update->multireplica == 1) { - g2 = g2_global; - g2old = g2old_global; + if (nreplica > 1) { + g2 = g2_global * factor; + g2old = g2old_global * factor; MPI_Allreduce(&g2,&g2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } @@ -364,8 +363,8 @@ void MinSpinOSO_CG::calc_search_direction() else beta = g2_global / g2old_global; // calculate conjugate direction for (int i = 0; i < 3 * nlocal; i++) { - p_s[i] = (beta * p_s[i] - g_cur[i]); - g_old[i] = g_cur[i]; + p_s[i] = (beta * p_s[i] - g_cur[i]) * factor; + g_old[i] = g_cur[i] * factor; } } @@ -380,8 +379,6 @@ void MinSpinOSO_CG::advance_spins() { int nlocal = atom->nlocal; double **sp = atom->sp; - double **fm = atom->fm; - double tdampx, tdampy, tdampz; double rot_mat[9]; // exponential of matrix made of search direction double s_new[3]; @@ -477,7 +474,7 @@ void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) A = cos(theta); B = sin(theta); - D = 1 - A; + D = 1.0 - A; x = upp_tr[0]/theta; y = upp_tr[1]/theta; z = upp_tr[2]/theta; @@ -529,7 +526,7 @@ void MinSpinOSO_CG::make_step(double c, double *energy_and_der) double rot_mat[9]; // exponential of matrix made of search direction double s_new[3]; double **sp = atom->sp; - double der_e_cur_tmp = 0.0;; + double der_e_cur_tmp = 0.0; for (int i = 0; i < nlocal; i++) { @@ -629,7 +626,8 @@ int MinSpinOSO_CG::awc(double der_phi_0, double phi_0, double der_phi_j, double double delta = 0.1; double sigma = 0.9; - if ((phi_j<=phi_0+eps*fabs(phi_0)) && ((2.0*delta-1.0) * der_phi_0>=der_phi_j>=sigma*der_phi_0)) + if ((phi_j<=phi_0+eps*fabs(phi_0)) && + ((2.0*delta-1.0) * der_phi_0>=der_phi_j>=sigma*der_phi_0)) return 1; else return 0; diff --git a/src/SPIN/min_spin_oso_cg.h b/src/SPIN/min_spin_oso_cg.h index e50d1a69db..41253f440f 100644 --- a/src/SPIN/min_spin_oso_cg.h +++ b/src/SPIN/min_spin_oso_cg.h @@ -13,7 +13,7 @@ #ifdef MINIMIZE_CLASS -MinimizeStyle(spin/oso_cg, MinSpinOSO_CG) +MinimizeStyle(spin_oso_cg, MinSpinOSO_CG) #else @@ -39,8 +39,8 @@ class MinSpinOSO_CG: public Min { int ireplica,nreplica; // for neb double *spvec; // variables for atomic dof, as 1d vector double *fmvec; // variables for atomic dof, as 1d vector - double *g_cur; // current gradient vector double *g_old; // gradient vector at previous step + double *g_cur; // current gradient vector double *p_s; // search direction vector double **sp_copy; // copy of the spins int local_iter; // for neb diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index 0bd128367f..6aaeb7ca23 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -107,6 +107,13 @@ void MinSpinOSO_LBFGS::init() Min::init(); + if (linestyle != 4 && nreplica == 1){ + use_line_search = 1; + } + else{ + use_line_search = 0; + } + last_negative = update->ntimestep; // allocate tables @@ -143,14 +150,6 @@ void MinSpinOSO_LBFGS::setup_style() int MinSpinOSO_LBFGS::modify_param(int narg, char **arg) { - - if (strcmp(arg[0],"line_search") == 0) { - if (narg < 2) error->all(FLERR,"Illegal min_modify command"); - use_line_search = force->numeric(FLERR,arg[1]); - if (nreplica > 1 && use_line_search) - error->all(FLERR,"Illegal min_modify command, cannot use NEB and line search together"); - return 2; - } if (strcmp(arg[0],"discrete_factor") == 0) { if (narg < 2) error->all(FLERR,"Illegal min_modify command"); double discrete_factor; @@ -221,8 +220,11 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) if (use_line_search) { // here we need to do line search - if (local_iter == 0) + if (local_iter == 0){ + eprevious = ecurrent; + ecurrent = energy_force(0); calc_gradient(); + } calc_search_direction(); der_e_cur = 0.0; @@ -248,19 +250,11 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) // if gneb calc., nreplica > 1 // then calculate gradients and advance spins // of intermediate replicas only - - if (nreplica > 1) { - if(ireplica != 0 && ireplica != nreplica-1) - calc_gradient(); - calc_search_direction(); - advance_spins(); - } else{ - calc_gradient(); - calc_search_direction(); - advance_spins(); - } eprevious = ecurrent; ecurrent = energy_force(0); + calc_gradient(); + calc_search_direction(); + advance_spins(); neval++; } @@ -398,7 +392,7 @@ void MinSpinOSO_LBFGS::calc_search_direction() } MPI_Allreduce(&dyds, &dyds_global, 1, MPI_DOUBLE, MPI_SUM, world); - if (update->multireplica == 1) { + if (nreplica > 1) { dyds_global *= factor; dyds = dyds_global; MPI_Allreduce(&dyds, &dyds_global, 1,MPI_DOUBLE,MPI_SUM,universe->uworld); @@ -437,7 +431,7 @@ void MinSpinOSO_LBFGS::calc_search_direction() sq += ds[c_ind][i] * q[i]; } MPI_Allreduce(&sq,&sq_global,1,MPI_DOUBLE,MPI_SUM,world); - if (update->multireplica == 1) { + if (nreplica > 1) { sq_global *= factor; sq = sq_global; MPI_Allreduce(&sq,&sq_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); @@ -460,7 +454,7 @@ void MinSpinOSO_LBFGS::calc_search_direction() yy += dy[m_index][i] * dy[m_index][i]; } MPI_Allreduce(&yy,&yy_global,1,MPI_DOUBLE,MPI_SUM,world); - if (update->multireplica == 1) { + if (nreplica > 1) { yy_global *= factor; yy = yy_global; MPI_Allreduce(&yy,&yy_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); @@ -493,7 +487,7 @@ void MinSpinOSO_LBFGS::calc_search_direction() } MPI_Allreduce(&yr,&yr_global,1,MPI_DOUBLE,MPI_SUM,world); - if (update->multireplica == 1) { + if (nreplica > 1) { yr_global *= factor; yr = yr_global; MPI_Allreduce(&yr,&yr_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); @@ -668,7 +662,7 @@ void MinSpinOSO_LBFGS::make_step(double c, double *energy_and_der) double rot_mat[9]; // exponential of matrix made of search direction double s_new[3]; double **sp = atom->sp; - double der_e_cur_tmp = 0.0;; + double der_e_cur_tmp = 0.0; for (int i = 0; i < nlocal; i++) { @@ -784,12 +778,12 @@ double MinSpinOSO_LBFGS::maximum_rotation(double *p) for (int i = 0; i < 3 * nlocal; i++) norm2 += p[i] * p[i]; MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,world); - if (update->multireplica == 1) { + if (nreplica > 1) { norm2 = norm2_global; MPI_Allreduce(&norm2,&norm2_global,1,MPI_DOUBLE,MPI_SUM,universe->uworld); } MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,world); - if (update->multireplica == 1) { + if (nreplica > 1) { nlocal = ntotal; MPI_Allreduce(&nlocal,&ntotal,1,MPI_INT,MPI_SUM,universe->uworld); } diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h index d74898aa8c..3071bacc35 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -13,7 +13,7 @@ #ifdef MINIMIZE_CLASS -MinimizeStyle(spin/oso_lbfgs, MinSpinOSO_LBFGS) +MinimizeStyle(spin_oso_lbfgs, MinSpinOSO_LBFGS) #else From 4a80edd75f5fb659fa1a9574642f16262fcd2dec Mon Sep 17 00:00:00 2001 From: casievers Date: Fri, 19 Jul 2019 13:36:57 -0700 Subject: [PATCH 069/418] updated fix_langevin and made example --- examples/gjf/argon.lmp | 886 ++++++++++++++++++++++++++++++++++ examples/gjf/ff-argon.lmp | 20 + examples/gjf/in.argon | 162 +++++++ examples/gjf/out.argon | 249 ++++++++++ examples/gjf/trajectory.0.dcd | Bin 0 -> 439092 bytes src/fix_langevin.cpp | 272 +++++++++-- src/fix_langevin.h | 7 +- 7 files changed, 1550 insertions(+), 46 deletions(-) create mode 100644 examples/gjf/argon.lmp create mode 100644 examples/gjf/ff-argon.lmp create mode 100644 examples/gjf/in.argon create mode 100644 examples/gjf/out.argon create mode 100644 examples/gjf/trajectory.0.dcd diff --git a/examples/gjf/argon.lmp b/examples/gjf/argon.lmp new file mode 100644 index 0000000000..00214b4c54 --- /dev/null +++ b/examples/gjf/argon.lmp @@ -0,0 +1,886 @@ +LAMMPS description + + 864 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 32.146000 xlo xhi + 0.0000000 32.146000 ylo yhi + 0.0000000 32.146000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 2.6790000 2.6790000 + 2 2 1 0.0000000 0.0000000 2.6790000 8.0360000 + 3 3 1 0.0000000 0.0000000 2.6790000 13.3940000 + 4 4 1 0.0000000 0.0000000 2.6790000 18.7520000 + 5 5 1 0.0000000 0.0000000 2.6790000 24.1090000 + 6 6 1 0.0000000 0.0000000 2.6790000 29.4670000 + 7 7 1 0.0000000 0.0000000 8.0360000 2.6790000 + 8 8 1 0.0000000 0.0000000 8.0360000 8.0360000 + 9 9 1 0.0000000 0.0000000 8.0360000 13.3940000 + 10 10 1 0.0000000 0.0000000 8.0360000 18.7520000 + 11 11 1 0.0000000 0.0000000 8.0360000 24.1090000 + 12 12 1 0.0000000 0.0000000 8.0360000 29.4670000 + 13 13 1 0.0000000 0.0000000 13.3940000 2.6790000 + 14 14 1 0.0000000 0.0000000 13.3940000 8.0360000 + 15 15 1 0.0000000 0.0000000 13.3940000 13.3940000 + 16 16 1 0.0000000 0.0000000 13.3940000 18.7520000 + 17 17 1 0.0000000 0.0000000 13.3940000 24.1090000 + 18 18 1 0.0000000 0.0000000 13.3940000 29.4670000 + 19 19 1 0.0000000 0.0000000 18.7520000 2.6790000 + 20 20 1 0.0000000 0.0000000 18.7520000 8.0360000 + 21 21 1 0.0000000 0.0000000 18.7520000 13.3940000 + 22 22 1 0.0000000 0.0000000 18.7520000 18.7520000 + 23 23 1 0.0000000 0.0000000 18.7520000 24.1090000 + 24 24 1 0.0000000 0.0000000 18.7520000 29.4670000 + 25 25 1 0.0000000 0.0000000 24.1090000 2.6790000 + 26 26 1 0.0000000 0.0000000 24.1090000 8.0360000 + 27 27 1 0.0000000 0.0000000 24.1090000 13.3940000 + 28 28 1 0.0000000 0.0000000 24.1090000 18.7520000 + 29 29 1 0.0000000 0.0000000 24.1090000 24.1090000 + 30 30 1 0.0000000 0.0000000 24.1090000 29.4670000 + 31 31 1 0.0000000 0.0000000 29.4670000 2.6790000 + 32 32 1 0.0000000 0.0000000 29.4670000 8.0360000 + 33 33 1 0.0000000 0.0000000 29.4670000 13.3940000 + 34 34 1 0.0000000 0.0000000 29.4670000 18.7520000 + 35 35 1 0.0000000 0.0000000 29.4670000 24.1090000 + 36 36 1 0.0000000 0.0000000 29.4670000 29.4670000 + 37 37 1 0.0000000 5.3580000 2.6790000 2.6790000 + 38 38 1 0.0000000 5.3580000 2.6790000 8.0360000 + 39 39 1 0.0000000 5.3580000 2.6790000 13.3940000 + 40 40 1 0.0000000 5.3580000 2.6790000 18.7520000 + 41 41 1 0.0000000 5.3580000 2.6790000 24.1090000 + 42 42 1 0.0000000 5.3580000 2.6790000 29.4670000 + 43 43 1 0.0000000 5.3580000 8.0360000 2.6790000 + 44 44 1 0.0000000 5.3580000 8.0360000 8.0360000 + 45 45 1 0.0000000 5.3580000 8.0360000 13.3940000 + 46 46 1 0.0000000 5.3580000 8.0360000 18.7520000 + 47 47 1 0.0000000 5.3580000 8.0360000 24.1090000 + 48 48 1 0.0000000 5.3580000 8.0360000 29.4670000 + 49 49 1 0.0000000 5.3580000 13.3940000 2.6790000 + 50 50 1 0.0000000 5.3580000 13.3940000 8.0360000 + 51 51 1 0.0000000 5.3580000 13.3940000 13.3940000 + 52 52 1 0.0000000 5.3580000 13.3940000 18.7520000 + 53 53 1 0.0000000 5.3580000 13.3940000 24.1090000 + 54 54 1 0.0000000 5.3580000 13.3940000 29.4670000 + 55 55 1 0.0000000 5.3580000 18.7520000 2.6790000 + 56 56 1 0.0000000 5.3580000 18.7520000 8.0360000 + 57 57 1 0.0000000 5.3580000 18.7520000 13.3940000 + 58 58 1 0.0000000 5.3580000 18.7520000 18.7520000 + 59 59 1 0.0000000 5.3580000 18.7520000 24.1090000 + 60 60 1 0.0000000 5.3580000 18.7520000 29.4670000 + 61 61 1 0.0000000 5.3580000 24.1090000 2.6790000 + 62 62 1 0.0000000 5.3580000 24.1090000 8.0360000 + 63 63 1 0.0000000 5.3580000 24.1090000 13.3940000 + 64 64 1 0.0000000 5.3580000 24.1090000 18.7520000 + 65 65 1 0.0000000 5.3580000 24.1090000 24.1090000 + 66 66 1 0.0000000 5.3580000 24.1090000 29.4670000 + 67 67 1 0.0000000 5.3580000 29.4670000 2.6790000 + 68 68 1 0.0000000 5.3580000 29.4670000 8.0360000 + 69 69 1 0.0000000 5.3580000 29.4670000 13.3940000 + 70 70 1 0.0000000 5.3580000 29.4670000 18.7520000 + 71 71 1 0.0000000 5.3580000 29.4670000 24.1090000 + 72 72 1 0.0000000 5.3580000 29.4670000 29.4670000 + 73 73 1 0.0000000 10.7150000 2.6790000 2.6790000 + 74 74 1 0.0000000 10.7150000 2.6790000 8.0360000 + 75 75 1 0.0000000 10.7150000 2.6790000 13.3940000 + 76 76 1 0.0000000 10.7150000 2.6790000 18.7520000 + 77 77 1 0.0000000 10.7150000 2.6790000 24.1090000 + 78 78 1 0.0000000 10.7150000 2.6790000 29.4670000 + 79 79 1 0.0000000 10.7150000 8.0360000 2.6790000 + 80 80 1 0.0000000 10.7150000 8.0360000 8.0360000 + 81 81 1 0.0000000 10.7150000 8.0360000 13.3940000 + 82 82 1 0.0000000 10.7150000 8.0360000 18.7520000 + 83 83 1 0.0000000 10.7150000 8.0360000 24.1090000 + 84 84 1 0.0000000 10.7150000 8.0360000 29.4670000 + 85 85 1 0.0000000 10.7150000 13.3940000 2.6790000 + 86 86 1 0.0000000 10.7150000 13.3940000 8.0360000 + 87 87 1 0.0000000 10.7150000 13.3940000 13.3940000 + 88 88 1 0.0000000 10.7150000 13.3940000 18.7520000 + 89 89 1 0.0000000 10.7150000 13.3940000 24.1090000 + 90 90 1 0.0000000 10.7150000 13.3940000 29.4670000 + 91 91 1 0.0000000 10.7150000 18.7520000 2.6790000 + 92 92 1 0.0000000 10.7150000 18.7520000 8.0360000 + 93 93 1 0.0000000 10.7150000 18.7520000 13.3940000 + 94 94 1 0.0000000 10.7150000 18.7520000 18.7520000 + 95 95 1 0.0000000 10.7150000 18.7520000 24.1090000 + 96 96 1 0.0000000 10.7150000 18.7520000 29.4670000 + 97 97 1 0.0000000 10.7150000 24.1090000 2.6790000 + 98 98 1 0.0000000 10.7150000 24.1090000 8.0360000 + 99 99 1 0.0000000 10.7150000 24.1090000 13.3940000 + 100 100 1 0.0000000 10.7150000 24.1090000 18.7520000 + 101 101 1 0.0000000 10.7150000 24.1090000 24.1090000 + 102 102 1 0.0000000 10.7150000 24.1090000 29.4670000 + 103 103 1 0.0000000 10.7150000 29.4670000 2.6790000 + 104 104 1 0.0000000 10.7150000 29.4670000 8.0360000 + 105 105 1 0.0000000 10.7150000 29.4670000 13.3940000 + 106 106 1 0.0000000 10.7150000 29.4670000 18.7520000 + 107 107 1 0.0000000 10.7150000 29.4670000 24.1090000 + 108 108 1 0.0000000 10.7150000 29.4670000 29.4670000 + 109 109 1 0.0000000 16.0730000 2.6790000 2.6790000 + 110 110 1 0.0000000 16.0730000 2.6790000 8.0360000 + 111 111 1 0.0000000 16.0730000 2.6790000 13.3940000 + 112 112 1 0.0000000 16.0730000 2.6790000 18.7520000 + 113 113 1 0.0000000 16.0730000 2.6790000 24.1090000 + 114 114 1 0.0000000 16.0730000 2.6790000 29.4670000 + 115 115 1 0.0000000 16.0730000 8.0360000 2.6790000 + 116 116 1 0.0000000 16.0730000 8.0360000 8.0360000 + 117 117 1 0.0000000 16.0730000 8.0360000 13.3940000 + 118 118 1 0.0000000 16.0730000 8.0360000 18.7520000 + 119 119 1 0.0000000 16.0730000 8.0360000 24.1090000 + 120 120 1 0.0000000 16.0730000 8.0360000 29.4670000 + 121 121 1 0.0000000 16.0730000 13.3940000 2.6790000 + 122 122 1 0.0000000 16.0730000 13.3940000 8.0360000 + 123 123 1 0.0000000 16.0730000 13.3940000 13.3940000 + 124 124 1 0.0000000 16.0730000 13.3940000 18.7520000 + 125 125 1 0.0000000 16.0730000 13.3940000 24.1090000 + 126 126 1 0.0000000 16.0730000 13.3940000 29.4670000 + 127 127 1 0.0000000 16.0730000 18.7520000 2.6790000 + 128 128 1 0.0000000 16.0730000 18.7520000 8.0360000 + 129 129 1 0.0000000 16.0730000 18.7520000 13.3940000 + 130 130 1 0.0000000 16.0730000 18.7520000 18.7520000 + 131 131 1 0.0000000 16.0730000 18.7520000 24.1090000 + 132 132 1 0.0000000 16.0730000 18.7520000 29.4670000 + 133 133 1 0.0000000 16.0730000 24.1090000 2.6790000 + 134 134 1 0.0000000 16.0730000 24.1090000 8.0360000 + 135 135 1 0.0000000 16.0730000 24.1090000 13.3940000 + 136 136 1 0.0000000 16.0730000 24.1090000 18.7520000 + 137 137 1 0.0000000 16.0730000 24.1090000 24.1090000 + 138 138 1 0.0000000 16.0730000 24.1090000 29.4670000 + 139 139 1 0.0000000 16.0730000 29.4670000 2.6790000 + 140 140 1 0.0000000 16.0730000 29.4670000 8.0360000 + 141 141 1 0.0000000 16.0730000 29.4670000 13.3940000 + 142 142 1 0.0000000 16.0730000 29.4670000 18.7520000 + 143 143 1 0.0000000 16.0730000 29.4670000 24.1090000 + 144 144 1 0.0000000 16.0730000 29.4670000 29.4670000 + 145 145 1 0.0000000 21.4310000 2.6790000 2.6790000 + 146 146 1 0.0000000 21.4310000 2.6790000 8.0360000 + 147 147 1 0.0000000 21.4310000 2.6790000 13.3940000 + 148 148 1 0.0000000 21.4310000 2.6790000 18.7520000 + 149 149 1 0.0000000 21.4310000 2.6790000 24.1090000 + 150 150 1 0.0000000 21.4310000 2.6790000 29.4670000 + 151 151 1 0.0000000 21.4310000 8.0360000 2.6790000 + 152 152 1 0.0000000 21.4310000 8.0360000 8.0360000 + 153 153 1 0.0000000 21.4310000 8.0360000 13.3940000 + 154 154 1 0.0000000 21.4310000 8.0360000 18.7520000 + 155 155 1 0.0000000 21.4310000 8.0360000 24.1090000 + 156 156 1 0.0000000 21.4310000 8.0360000 29.4670000 + 157 157 1 0.0000000 21.4310000 13.3940000 2.6790000 + 158 158 1 0.0000000 21.4310000 13.3940000 8.0360000 + 159 159 1 0.0000000 21.4310000 13.3940000 13.3940000 + 160 160 1 0.0000000 21.4310000 13.3940000 18.7520000 + 161 161 1 0.0000000 21.4310000 13.3940000 24.1090000 + 162 162 1 0.0000000 21.4310000 13.3940000 29.4670000 + 163 163 1 0.0000000 21.4310000 18.7520000 2.6790000 + 164 164 1 0.0000000 21.4310000 18.7520000 8.0360000 + 165 165 1 0.0000000 21.4310000 18.7520000 13.3940000 + 166 166 1 0.0000000 21.4310000 18.7520000 18.7520000 + 167 167 1 0.0000000 21.4310000 18.7520000 24.1090000 + 168 168 1 0.0000000 21.4310000 18.7520000 29.4670000 + 169 169 1 0.0000000 21.4310000 24.1090000 2.6790000 + 170 170 1 0.0000000 21.4310000 24.1090000 8.0360000 + 171 171 1 0.0000000 21.4310000 24.1090000 13.3940000 + 172 172 1 0.0000000 21.4310000 24.1090000 18.7520000 + 173 173 1 0.0000000 21.4310000 24.1090000 24.1090000 + 174 174 1 0.0000000 21.4310000 24.1090000 29.4670000 + 175 175 1 0.0000000 21.4310000 29.4670000 2.6790000 + 176 176 1 0.0000000 21.4310000 29.4670000 8.0360000 + 177 177 1 0.0000000 21.4310000 29.4670000 13.3940000 + 178 178 1 0.0000000 21.4310000 29.4670000 18.7520000 + 179 179 1 0.0000000 21.4310000 29.4670000 24.1090000 + 180 180 1 0.0000000 21.4310000 29.4670000 29.4670000 + 181 181 1 0.0000000 26.7880000 2.6790000 2.6790000 + 182 182 1 0.0000000 26.7880000 2.6790000 8.0360000 + 183 183 1 0.0000000 26.7880000 2.6790000 13.3940000 + 184 184 1 0.0000000 26.7880000 2.6790000 18.7520000 + 185 185 1 0.0000000 26.7880000 2.6790000 24.1090000 + 186 186 1 0.0000000 26.7880000 2.6790000 29.4670000 + 187 187 1 0.0000000 26.7880000 8.0360000 2.6790000 + 188 188 1 0.0000000 26.7880000 8.0360000 8.0360000 + 189 189 1 0.0000000 26.7880000 8.0360000 13.3940000 + 190 190 1 0.0000000 26.7880000 8.0360000 18.7520000 + 191 191 1 0.0000000 26.7880000 8.0360000 24.1090000 + 192 192 1 0.0000000 26.7880000 8.0360000 29.4670000 + 193 193 1 0.0000000 26.7880000 13.3940000 2.6790000 + 194 194 1 0.0000000 26.7880000 13.3940000 8.0360000 + 195 195 1 0.0000000 26.7880000 13.3940000 13.3940000 + 196 196 1 0.0000000 26.7880000 13.3940000 18.7520000 + 197 197 1 0.0000000 26.7880000 13.3940000 24.1090000 + 198 198 1 0.0000000 26.7880000 13.3940000 29.4670000 + 199 199 1 0.0000000 26.7880000 18.7520000 2.6790000 + 200 200 1 0.0000000 26.7880000 18.7520000 8.0360000 + 201 201 1 0.0000000 26.7880000 18.7520000 13.3940000 + 202 202 1 0.0000000 26.7880000 18.7520000 18.7520000 + 203 203 1 0.0000000 26.7880000 18.7520000 24.1090000 + 204 204 1 0.0000000 26.7880000 18.7520000 29.4670000 + 205 205 1 0.0000000 26.7880000 24.1090000 2.6790000 + 206 206 1 0.0000000 26.7880000 24.1090000 8.0360000 + 207 207 1 0.0000000 26.7880000 24.1090000 13.3940000 + 208 208 1 0.0000000 26.7880000 24.1090000 18.7520000 + 209 209 1 0.0000000 26.7880000 24.1090000 24.1090000 + 210 210 1 0.0000000 26.7880000 24.1090000 29.4670000 + 211 211 1 0.0000000 26.7880000 29.4670000 2.6790000 + 212 212 1 0.0000000 26.7880000 29.4670000 8.0360000 + 213 213 1 0.0000000 26.7880000 29.4670000 13.3940000 + 214 214 1 0.0000000 26.7880000 29.4670000 18.7520000 + 215 215 1 0.0000000 26.7880000 29.4670000 24.1090000 + 216 216 1 0.0000000 26.7880000 29.4670000 29.4670000 + 217 217 1 0.0000000 2.6790000 5.3580000 2.6790000 + 218 218 1 0.0000000 2.6790000 5.3580000 8.0360000 + 219 219 1 0.0000000 2.6790000 5.3580000 13.3940000 + 220 220 1 0.0000000 2.6790000 5.3580000 18.7520000 + 221 221 1 0.0000000 2.6790000 5.3580000 24.1090000 + 222 222 1 0.0000000 2.6790000 5.3580000 29.4670000 + 223 223 1 0.0000000 2.6790000 10.7150000 2.6790000 + 224 224 1 0.0000000 2.6790000 10.7150000 8.0360000 + 225 225 1 0.0000000 2.6790000 10.7150000 13.3940000 + 226 226 1 0.0000000 2.6790000 10.7150000 18.7520000 + 227 227 1 0.0000000 2.6790000 10.7150000 24.1090000 + 228 228 1 0.0000000 2.6790000 10.7150000 29.4670000 + 229 229 1 0.0000000 2.6790000 16.0730000 2.6790000 + 230 230 1 0.0000000 2.6790000 16.0730000 8.0360000 + 231 231 1 0.0000000 2.6790000 16.0730000 13.3940000 + 232 232 1 0.0000000 2.6790000 16.0730000 18.7520000 + 233 233 1 0.0000000 2.6790000 16.0730000 24.1090000 + 234 234 1 0.0000000 2.6790000 16.0730000 29.4670000 + 235 235 1 0.0000000 2.6790000 21.4310000 2.6790000 + 236 236 1 0.0000000 2.6790000 21.4310000 8.0360000 + 237 237 1 0.0000000 2.6790000 21.4310000 13.3940000 + 238 238 1 0.0000000 2.6790000 21.4310000 18.7520000 + 239 239 1 0.0000000 2.6790000 21.4310000 24.1090000 + 240 240 1 0.0000000 2.6790000 21.4310000 29.4670000 + 241 241 1 0.0000000 2.6790000 26.7880000 2.6790000 + 242 242 1 0.0000000 2.6790000 26.7880000 8.0360000 + 243 243 1 0.0000000 2.6790000 26.7880000 13.3940000 + 244 244 1 0.0000000 2.6790000 26.7880000 18.7520000 + 245 245 1 0.0000000 2.6790000 26.7880000 24.1090000 + 246 246 1 0.0000000 2.6790000 26.7880000 29.4670000 + 247 247 1 0.0000000 2.6790000 32.1460000 2.6790000 + 248 248 1 0.0000000 2.6790000 32.1460000 8.0360000 + 249 249 1 0.0000000 2.6790000 32.1460000 13.3940000 + 250 250 1 0.0000000 2.6790000 32.1460000 18.7520000 + 251 251 1 0.0000000 2.6790000 32.1460000 24.1090000 + 252 252 1 0.0000000 2.6790000 32.1460000 29.4670000 + 253 253 1 0.0000000 8.0360000 5.3580000 2.6790000 + 254 254 1 0.0000000 8.0360000 5.3580000 8.0360000 + 255 255 1 0.0000000 8.0360000 5.3580000 13.3940000 + 256 256 1 0.0000000 8.0360000 5.3580000 18.7520000 + 257 257 1 0.0000000 8.0360000 5.3580000 24.1090000 + 258 258 1 0.0000000 8.0360000 5.3580000 29.4670000 + 259 259 1 0.0000000 8.0360000 10.7150000 2.6790000 + 260 260 1 0.0000000 8.0360000 10.7150000 8.0360000 + 261 261 1 0.0000000 8.0360000 10.7150000 13.3940000 + 262 262 1 0.0000000 8.0360000 10.7150000 18.7520000 + 263 263 1 0.0000000 8.0360000 10.7150000 24.1090000 + 264 264 1 0.0000000 8.0360000 10.7150000 29.4670000 + 265 265 1 0.0000000 8.0360000 16.0730000 2.6790000 + 266 266 1 0.0000000 8.0360000 16.0730000 8.0360000 + 267 267 1 0.0000000 8.0360000 16.0730000 13.3940000 + 268 268 1 0.0000000 8.0360000 16.0730000 18.7520000 + 269 269 1 0.0000000 8.0360000 16.0730000 24.1090000 + 270 270 1 0.0000000 8.0360000 16.0730000 29.4670000 + 271 271 1 0.0000000 8.0360000 21.4310000 2.6790000 + 272 272 1 0.0000000 8.0360000 21.4310000 8.0360000 + 273 273 1 0.0000000 8.0360000 21.4310000 13.3940000 + 274 274 1 0.0000000 8.0360000 21.4310000 18.7520000 + 275 275 1 0.0000000 8.0360000 21.4310000 24.1090000 + 276 276 1 0.0000000 8.0360000 21.4310000 29.4670000 + 277 277 1 0.0000000 8.0360000 26.7880000 2.6790000 + 278 278 1 0.0000000 8.0360000 26.7880000 8.0360000 + 279 279 1 0.0000000 8.0360000 26.7880000 13.3940000 + 280 280 1 0.0000000 8.0360000 26.7880000 18.7520000 + 281 281 1 0.0000000 8.0360000 26.7880000 24.1090000 + 282 282 1 0.0000000 8.0360000 26.7880000 29.4670000 + 283 283 1 0.0000000 8.0360000 32.1460000 2.6790000 + 284 284 1 0.0000000 8.0360000 32.1460000 8.0360000 + 285 285 1 0.0000000 8.0360000 32.1460000 13.3940000 + 286 286 1 0.0000000 8.0360000 32.1460000 18.7520000 + 287 287 1 0.0000000 8.0360000 32.1460000 24.1090000 + 288 288 1 0.0000000 8.0360000 32.1460000 29.4670000 + 289 289 1 0.0000000 13.3940000 5.3580000 2.6790000 + 290 290 1 0.0000000 13.3940000 5.3580000 8.0360000 + 291 291 1 0.0000000 13.3940000 5.3580000 13.3940000 + 292 292 1 0.0000000 13.3940000 5.3580000 18.7520000 + 293 293 1 0.0000000 13.3940000 5.3580000 24.1090000 + 294 294 1 0.0000000 13.3940000 5.3580000 29.4670000 + 295 295 1 0.0000000 13.3940000 10.7150000 2.6790000 + 296 296 1 0.0000000 13.3940000 10.7150000 8.0360000 + 297 297 1 0.0000000 13.3940000 10.7150000 13.3940000 + 298 298 1 0.0000000 13.3940000 10.7150000 18.7520000 + 299 299 1 0.0000000 13.3940000 10.7150000 24.1090000 + 300 300 1 0.0000000 13.3940000 10.7150000 29.4670000 + 301 301 1 0.0000000 13.3940000 16.0730000 2.6790000 + 302 302 1 0.0000000 13.3940000 16.0730000 8.0360000 + 303 303 1 0.0000000 13.3940000 16.0730000 13.3940000 + 304 304 1 0.0000000 13.3940000 16.0730000 18.7520000 + 305 305 1 0.0000000 13.3940000 16.0730000 24.1090000 + 306 306 1 0.0000000 13.3940000 16.0730000 29.4670000 + 307 307 1 0.0000000 13.3940000 21.4310000 2.6790000 + 308 308 1 0.0000000 13.3940000 21.4310000 8.0360000 + 309 309 1 0.0000000 13.3940000 21.4310000 13.3940000 + 310 310 1 0.0000000 13.3940000 21.4310000 18.7520000 + 311 311 1 0.0000000 13.3940000 21.4310000 24.1090000 + 312 312 1 0.0000000 13.3940000 21.4310000 29.4670000 + 313 313 1 0.0000000 13.3940000 26.7880000 2.6790000 + 314 314 1 0.0000000 13.3940000 26.7880000 8.0360000 + 315 315 1 0.0000000 13.3940000 26.7880000 13.3940000 + 316 316 1 0.0000000 13.3940000 26.7880000 18.7520000 + 317 317 1 0.0000000 13.3940000 26.7880000 24.1090000 + 318 318 1 0.0000000 13.3940000 26.7880000 29.4670000 + 319 319 1 0.0000000 13.3940000 32.1460000 2.6790000 + 320 320 1 0.0000000 13.3940000 32.1460000 8.0360000 + 321 321 1 0.0000000 13.3940000 32.1460000 13.3940000 + 322 322 1 0.0000000 13.3940000 32.1460000 18.7520000 + 323 323 1 0.0000000 13.3940000 32.1460000 24.1090000 + 324 324 1 0.0000000 13.3940000 32.1460000 29.4670000 + 325 325 1 0.0000000 18.7520000 5.3580000 2.6790000 + 326 326 1 0.0000000 18.7520000 5.3580000 8.0360000 + 327 327 1 0.0000000 18.7520000 5.3580000 13.3940000 + 328 328 1 0.0000000 18.7520000 5.3580000 18.7520000 + 329 329 1 0.0000000 18.7520000 5.3580000 24.1090000 + 330 330 1 0.0000000 18.7520000 5.3580000 29.4670000 + 331 331 1 0.0000000 18.7520000 10.7150000 2.6790000 + 332 332 1 0.0000000 18.7520000 10.7150000 8.0360000 + 333 333 1 0.0000000 18.7520000 10.7150000 13.3940000 + 334 334 1 0.0000000 18.7520000 10.7150000 18.7520000 + 335 335 1 0.0000000 18.7520000 10.7150000 24.1090000 + 336 336 1 0.0000000 18.7520000 10.7150000 29.4670000 + 337 337 1 0.0000000 18.7520000 16.0730000 2.6790000 + 338 338 1 0.0000000 18.7520000 16.0730000 8.0360000 + 339 339 1 0.0000000 18.7520000 16.0730000 13.3940000 + 340 340 1 0.0000000 18.7520000 16.0730000 18.7520000 + 341 341 1 0.0000000 18.7520000 16.0730000 24.1090000 + 342 342 1 0.0000000 18.7520000 16.0730000 29.4670000 + 343 343 1 0.0000000 18.7520000 21.4310000 2.6790000 + 344 344 1 0.0000000 18.7520000 21.4310000 8.0360000 + 345 345 1 0.0000000 18.7520000 21.4310000 13.3940000 + 346 346 1 0.0000000 18.7520000 21.4310000 18.7520000 + 347 347 1 0.0000000 18.7520000 21.4310000 24.1090000 + 348 348 1 0.0000000 18.7520000 21.4310000 29.4670000 + 349 349 1 0.0000000 18.7520000 26.7880000 2.6790000 + 350 350 1 0.0000000 18.7520000 26.7880000 8.0360000 + 351 351 1 0.0000000 18.7520000 26.7880000 13.3940000 + 352 352 1 0.0000000 18.7520000 26.7880000 18.7520000 + 353 353 1 0.0000000 18.7520000 26.7880000 24.1090000 + 354 354 1 0.0000000 18.7520000 26.7880000 29.4670000 + 355 355 1 0.0000000 18.7520000 32.1460000 2.6790000 + 356 356 1 0.0000000 18.7520000 32.1460000 8.0360000 + 357 357 1 0.0000000 18.7520000 32.1460000 13.3940000 + 358 358 1 0.0000000 18.7520000 32.1460000 18.7520000 + 359 359 1 0.0000000 18.7520000 32.1460000 24.1090000 + 360 360 1 0.0000000 18.7520000 32.1460000 29.4670000 + 361 361 1 0.0000000 24.1090000 5.3580000 2.6790000 + 362 362 1 0.0000000 24.1090000 5.3580000 8.0360000 + 363 363 1 0.0000000 24.1090000 5.3580000 13.3940000 + 364 364 1 0.0000000 24.1090000 5.3580000 18.7520000 + 365 365 1 0.0000000 24.1090000 5.3580000 24.1090000 + 366 366 1 0.0000000 24.1090000 5.3580000 29.4670000 + 367 367 1 0.0000000 24.1090000 10.7150000 2.6790000 + 368 368 1 0.0000000 24.1090000 10.7150000 8.0360000 + 369 369 1 0.0000000 24.1090000 10.7150000 13.3940000 + 370 370 1 0.0000000 24.1090000 10.7150000 18.7520000 + 371 371 1 0.0000000 24.1090000 10.7150000 24.1090000 + 372 372 1 0.0000000 24.1090000 10.7150000 29.4670000 + 373 373 1 0.0000000 24.1090000 16.0730000 2.6790000 + 374 374 1 0.0000000 24.1090000 16.0730000 8.0360000 + 375 375 1 0.0000000 24.1090000 16.0730000 13.3940000 + 376 376 1 0.0000000 24.1090000 16.0730000 18.7520000 + 377 377 1 0.0000000 24.1090000 16.0730000 24.1090000 + 378 378 1 0.0000000 24.1090000 16.0730000 29.4670000 + 379 379 1 0.0000000 24.1090000 21.4310000 2.6790000 + 380 380 1 0.0000000 24.1090000 21.4310000 8.0360000 + 381 381 1 0.0000000 24.1090000 21.4310000 13.3940000 + 382 382 1 0.0000000 24.1090000 21.4310000 18.7520000 + 383 383 1 0.0000000 24.1090000 21.4310000 24.1090000 + 384 384 1 0.0000000 24.1090000 21.4310000 29.4670000 + 385 385 1 0.0000000 24.1090000 26.7880000 2.6790000 + 386 386 1 0.0000000 24.1090000 26.7880000 8.0360000 + 387 387 1 0.0000000 24.1090000 26.7880000 13.3940000 + 388 388 1 0.0000000 24.1090000 26.7880000 18.7520000 + 389 389 1 0.0000000 24.1090000 26.7880000 24.1090000 + 390 390 1 0.0000000 24.1090000 26.7880000 29.4670000 + 391 391 1 0.0000000 24.1090000 32.1460000 2.6790000 + 392 392 1 0.0000000 24.1090000 32.1460000 8.0360000 + 393 393 1 0.0000000 24.1090000 32.1460000 13.3940000 + 394 394 1 0.0000000 24.1090000 32.1460000 18.7520000 + 395 395 1 0.0000000 24.1090000 32.1460000 24.1090000 + 396 396 1 0.0000000 24.1090000 32.1460000 29.4670000 + 397 397 1 0.0000000 29.4670000 5.3580000 2.6790000 + 398 398 1 0.0000000 29.4670000 5.3580000 8.0360000 + 399 399 1 0.0000000 29.4670000 5.3580000 13.3940000 + 400 400 1 0.0000000 29.4670000 5.3580000 18.7520000 + 401 401 1 0.0000000 29.4670000 5.3580000 24.1090000 + 402 402 1 0.0000000 29.4670000 5.3580000 29.4670000 + 403 403 1 0.0000000 29.4670000 10.7150000 2.6790000 + 404 404 1 0.0000000 29.4670000 10.7150000 8.0360000 + 405 405 1 0.0000000 29.4670000 10.7150000 13.3940000 + 406 406 1 0.0000000 29.4670000 10.7150000 18.7520000 + 407 407 1 0.0000000 29.4670000 10.7150000 24.1090000 + 408 408 1 0.0000000 29.4670000 10.7150000 29.4670000 + 409 409 1 0.0000000 29.4670000 16.0730000 2.6790000 + 410 410 1 0.0000000 29.4670000 16.0730000 8.0360000 + 411 411 1 0.0000000 29.4670000 16.0730000 13.3940000 + 412 412 1 0.0000000 29.4670000 16.0730000 18.7520000 + 413 413 1 0.0000000 29.4670000 16.0730000 24.1090000 + 414 414 1 0.0000000 29.4670000 16.0730000 29.4670000 + 415 415 1 0.0000000 29.4670000 21.4310000 2.6790000 + 416 416 1 0.0000000 29.4670000 21.4310000 8.0360000 + 417 417 1 0.0000000 29.4670000 21.4310000 13.3940000 + 418 418 1 0.0000000 29.4670000 21.4310000 18.7520000 + 419 419 1 0.0000000 29.4670000 21.4310000 24.1090000 + 420 420 1 0.0000000 29.4670000 21.4310000 29.4670000 + 421 421 1 0.0000000 29.4670000 26.7880000 2.6790000 + 422 422 1 0.0000000 29.4670000 26.7880000 8.0360000 + 423 423 1 0.0000000 29.4670000 26.7880000 13.3940000 + 424 424 1 0.0000000 29.4670000 26.7880000 18.7520000 + 425 425 1 0.0000000 29.4670000 26.7880000 24.1090000 + 426 426 1 0.0000000 29.4670000 26.7880000 29.4670000 + 427 427 1 0.0000000 29.4670000 32.1460000 2.6790000 + 428 428 1 0.0000000 29.4670000 32.1460000 8.0360000 + 429 429 1 0.0000000 29.4670000 32.1460000 13.3940000 + 430 430 1 0.0000000 29.4670000 32.1460000 18.7520000 + 431 431 1 0.0000000 29.4670000 32.1460000 24.1090000 + 432 432 1 0.0000000 29.4670000 32.1460000 29.4670000 + 433 433 1 0.0000000 2.6790000 2.6790000 5.3580000 + 434 434 1 0.0000000 2.6790000 2.6790000 10.7150000 + 435 435 1 0.0000000 2.6790000 2.6790000 16.0730000 + 436 436 1 0.0000000 2.6790000 2.6790000 21.4310000 + 437 437 1 0.0000000 2.6790000 2.6790000 26.7880000 + 438 438 1 0.0000000 2.6790000 2.6790000 32.1460000 + 439 439 1 0.0000000 2.6790000 8.0360000 5.3580000 + 440 440 1 0.0000000 2.6790000 8.0360000 10.7150000 + 441 441 1 0.0000000 2.6790000 8.0360000 16.0730000 + 442 442 1 0.0000000 2.6790000 8.0360000 21.4310000 + 443 443 1 0.0000000 2.6790000 8.0360000 26.7880000 + 444 444 1 0.0000000 2.6790000 8.0360000 32.1460000 + 445 445 1 0.0000000 2.6790000 13.3940000 5.3580000 + 446 446 1 0.0000000 2.6790000 13.3940000 10.7150000 + 447 447 1 0.0000000 2.6790000 13.3940000 16.0730000 + 448 448 1 0.0000000 2.6790000 13.3940000 21.4310000 + 449 449 1 0.0000000 2.6790000 13.3940000 26.7880000 + 450 450 1 0.0000000 2.6790000 13.3940000 32.1460000 + 451 451 1 0.0000000 2.6790000 18.7520000 5.3580000 + 452 452 1 0.0000000 2.6790000 18.7520000 10.7150000 + 453 453 1 0.0000000 2.6790000 18.7520000 16.0730000 + 454 454 1 0.0000000 2.6790000 18.7520000 21.4310000 + 455 455 1 0.0000000 2.6790000 18.7520000 26.7880000 + 456 456 1 0.0000000 2.6790000 18.7520000 32.1460000 + 457 457 1 0.0000000 2.6790000 24.1090000 5.3580000 + 458 458 1 0.0000000 2.6790000 24.1090000 10.7150000 + 459 459 1 0.0000000 2.6790000 24.1090000 16.0730000 + 460 460 1 0.0000000 2.6790000 24.1090000 21.4310000 + 461 461 1 0.0000000 2.6790000 24.1090000 26.7880000 + 462 462 1 0.0000000 2.6790000 24.1090000 32.1460000 + 463 463 1 0.0000000 2.6790000 29.4670000 5.3580000 + 464 464 1 0.0000000 2.6790000 29.4670000 10.7150000 + 465 465 1 0.0000000 2.6790000 29.4670000 16.0730000 + 466 466 1 0.0000000 2.6790000 29.4670000 21.4310000 + 467 467 1 0.0000000 2.6790000 29.4670000 26.7880000 + 468 468 1 0.0000000 2.6790000 29.4670000 32.1460000 + 469 469 1 0.0000000 8.0360000 2.6790000 5.3580000 + 470 470 1 0.0000000 8.0360000 2.6790000 10.7150000 + 471 471 1 0.0000000 8.0360000 2.6790000 16.0730000 + 472 472 1 0.0000000 8.0360000 2.6790000 21.4310000 + 473 473 1 0.0000000 8.0360000 2.6790000 26.7880000 + 474 474 1 0.0000000 8.0360000 2.6790000 32.1460000 + 475 475 1 0.0000000 8.0360000 8.0360000 5.3580000 + 476 476 1 0.0000000 8.0360000 8.0360000 10.7150000 + 477 477 1 0.0000000 8.0360000 8.0360000 16.0730000 + 478 478 1 0.0000000 8.0360000 8.0360000 21.4310000 + 479 479 1 0.0000000 8.0360000 8.0360000 26.7880000 + 480 480 1 0.0000000 8.0360000 8.0360000 32.1460000 + 481 481 1 0.0000000 8.0360000 13.3940000 5.3580000 + 482 482 1 0.0000000 8.0360000 13.3940000 10.7150000 + 483 483 1 0.0000000 8.0360000 13.3940000 16.0730000 + 484 484 1 0.0000000 8.0360000 13.3940000 21.4310000 + 485 485 1 0.0000000 8.0360000 13.3940000 26.7880000 + 486 486 1 0.0000000 8.0360000 13.3940000 32.1460000 + 487 487 1 0.0000000 8.0360000 18.7520000 5.3580000 + 488 488 1 0.0000000 8.0360000 18.7520000 10.7150000 + 489 489 1 0.0000000 8.0360000 18.7520000 16.0730000 + 490 490 1 0.0000000 8.0360000 18.7520000 21.4310000 + 491 491 1 0.0000000 8.0360000 18.7520000 26.7880000 + 492 492 1 0.0000000 8.0360000 18.7520000 32.1460000 + 493 493 1 0.0000000 8.0360000 24.1090000 5.3580000 + 494 494 1 0.0000000 8.0360000 24.1090000 10.7150000 + 495 495 1 0.0000000 8.0360000 24.1090000 16.0730000 + 496 496 1 0.0000000 8.0360000 24.1090000 21.4310000 + 497 497 1 0.0000000 8.0360000 24.1090000 26.7880000 + 498 498 1 0.0000000 8.0360000 24.1090000 32.1460000 + 499 499 1 0.0000000 8.0360000 29.4670000 5.3580000 + 500 500 1 0.0000000 8.0360000 29.4670000 10.7150000 + 501 501 1 0.0000000 8.0360000 29.4670000 16.0730000 + 502 502 1 0.0000000 8.0360000 29.4670000 21.4310000 + 503 503 1 0.0000000 8.0360000 29.4670000 26.7880000 + 504 504 1 0.0000000 8.0360000 29.4670000 32.1460000 + 505 505 1 0.0000000 13.3940000 2.6790000 5.3580000 + 506 506 1 0.0000000 13.3940000 2.6790000 10.7150000 + 507 507 1 0.0000000 13.3940000 2.6790000 16.0730000 + 508 508 1 0.0000000 13.3940000 2.6790000 21.4310000 + 509 509 1 0.0000000 13.3940000 2.6790000 26.7880000 + 510 510 1 0.0000000 13.3940000 2.6790000 32.1460000 + 511 511 1 0.0000000 13.3940000 8.0360000 5.3580000 + 512 512 1 0.0000000 13.3940000 8.0360000 10.7150000 + 513 513 1 0.0000000 13.3940000 8.0360000 16.0730000 + 514 514 1 0.0000000 13.3940000 8.0360000 21.4310000 + 515 515 1 0.0000000 13.3940000 8.0360000 26.7880000 + 516 516 1 0.0000000 13.3940000 8.0360000 32.1460000 + 517 517 1 0.0000000 13.3940000 13.3940000 5.3580000 + 518 518 1 0.0000000 13.3940000 13.3940000 10.7150000 + 519 519 1 0.0000000 13.3940000 13.3940000 16.0730000 + 520 520 1 0.0000000 13.3940000 13.3940000 21.4310000 + 521 521 1 0.0000000 13.3940000 13.3940000 26.7880000 + 522 522 1 0.0000000 13.3940000 13.3940000 32.1460000 + 523 523 1 0.0000000 13.3940000 18.7520000 5.3580000 + 524 524 1 0.0000000 13.3940000 18.7520000 10.7150000 + 525 525 1 0.0000000 13.3940000 18.7520000 16.0730000 + 526 526 1 0.0000000 13.3940000 18.7520000 21.4310000 + 527 527 1 0.0000000 13.3940000 18.7520000 26.7880000 + 528 528 1 0.0000000 13.3940000 18.7520000 32.1460000 + 529 529 1 0.0000000 13.3940000 24.1090000 5.3580000 + 530 530 1 0.0000000 13.3940000 24.1090000 10.7150000 + 531 531 1 0.0000000 13.3940000 24.1090000 16.0730000 + 532 532 1 0.0000000 13.3940000 24.1090000 21.4310000 + 533 533 1 0.0000000 13.3940000 24.1090000 26.7880000 + 534 534 1 0.0000000 13.3940000 24.1090000 32.1460000 + 535 535 1 0.0000000 13.3940000 29.4670000 5.3580000 + 536 536 1 0.0000000 13.3940000 29.4670000 10.7150000 + 537 537 1 0.0000000 13.3940000 29.4670000 16.0730000 + 538 538 1 0.0000000 13.3940000 29.4670000 21.4310000 + 539 539 1 0.0000000 13.3940000 29.4670000 26.7880000 + 540 540 1 0.0000000 13.3940000 29.4670000 32.1460000 + 541 541 1 0.0000000 18.7520000 2.6790000 5.3580000 + 542 542 1 0.0000000 18.7520000 2.6790000 10.7150000 + 543 543 1 0.0000000 18.7520000 2.6790000 16.0730000 + 544 544 1 0.0000000 18.7520000 2.6790000 21.4310000 + 545 545 1 0.0000000 18.7520000 2.6790000 26.7880000 + 546 546 1 0.0000000 18.7520000 2.6790000 32.1460000 + 547 547 1 0.0000000 18.7520000 8.0360000 5.3580000 + 548 548 1 0.0000000 18.7520000 8.0360000 10.7150000 + 549 549 1 0.0000000 18.7520000 8.0360000 16.0730000 + 550 550 1 0.0000000 18.7520000 8.0360000 21.4310000 + 551 551 1 0.0000000 18.7520000 8.0360000 26.7880000 + 552 552 1 0.0000000 18.7520000 8.0360000 32.1460000 + 553 553 1 0.0000000 18.7520000 13.3940000 5.3580000 + 554 554 1 0.0000000 18.7520000 13.3940000 10.7150000 + 555 555 1 0.0000000 18.7520000 13.3940000 16.0730000 + 556 556 1 0.0000000 18.7520000 13.3940000 21.4310000 + 557 557 1 0.0000000 18.7520000 13.3940000 26.7880000 + 558 558 1 0.0000000 18.7520000 13.3940000 32.1460000 + 559 559 1 0.0000000 18.7520000 18.7520000 5.3580000 + 560 560 1 0.0000000 18.7520000 18.7520000 10.7150000 + 561 561 1 0.0000000 18.7520000 18.7520000 16.0730000 + 562 562 1 0.0000000 18.7520000 18.7520000 21.4310000 + 563 563 1 0.0000000 18.7520000 18.7520000 26.7880000 + 564 564 1 0.0000000 18.7520000 18.7520000 32.1460000 + 565 565 1 0.0000000 18.7520000 24.1090000 5.3580000 + 566 566 1 0.0000000 18.7520000 24.1090000 10.7150000 + 567 567 1 0.0000000 18.7520000 24.1090000 16.0730000 + 568 568 1 0.0000000 18.7520000 24.1090000 21.4310000 + 569 569 1 0.0000000 18.7520000 24.1090000 26.7880000 + 570 570 1 0.0000000 18.7520000 24.1090000 32.1460000 + 571 571 1 0.0000000 18.7520000 29.4670000 5.3580000 + 572 572 1 0.0000000 18.7520000 29.4670000 10.7150000 + 573 573 1 0.0000000 18.7520000 29.4670000 16.0730000 + 574 574 1 0.0000000 18.7520000 29.4670000 21.4310000 + 575 575 1 0.0000000 18.7520000 29.4670000 26.7880000 + 576 576 1 0.0000000 18.7520000 29.4670000 32.1460000 + 577 577 1 0.0000000 24.1090000 2.6790000 5.3580000 + 578 578 1 0.0000000 24.1090000 2.6790000 10.7150000 + 579 579 1 0.0000000 24.1090000 2.6790000 16.0730000 + 580 580 1 0.0000000 24.1090000 2.6790000 21.4310000 + 581 581 1 0.0000000 24.1090000 2.6790000 26.7880000 + 582 582 1 0.0000000 24.1090000 2.6790000 32.1460000 + 583 583 1 0.0000000 24.1090000 8.0360000 5.3580000 + 584 584 1 0.0000000 24.1090000 8.0360000 10.7150000 + 585 585 1 0.0000000 24.1090000 8.0360000 16.0730000 + 586 586 1 0.0000000 24.1090000 8.0360000 21.4310000 + 587 587 1 0.0000000 24.1090000 8.0360000 26.7880000 + 588 588 1 0.0000000 24.1090000 8.0360000 32.1460000 + 589 589 1 0.0000000 24.1090000 13.3940000 5.3580000 + 590 590 1 0.0000000 24.1090000 13.3940000 10.7150000 + 591 591 1 0.0000000 24.1090000 13.3940000 16.0730000 + 592 592 1 0.0000000 24.1090000 13.3940000 21.4310000 + 593 593 1 0.0000000 24.1090000 13.3940000 26.7880000 + 594 594 1 0.0000000 24.1090000 13.3940000 32.1460000 + 595 595 1 0.0000000 24.1090000 18.7520000 5.3580000 + 596 596 1 0.0000000 24.1090000 18.7520000 10.7150000 + 597 597 1 0.0000000 24.1090000 18.7520000 16.0730000 + 598 598 1 0.0000000 24.1090000 18.7520000 21.4310000 + 599 599 1 0.0000000 24.1090000 18.7520000 26.7880000 + 600 600 1 0.0000000 24.1090000 18.7520000 32.1460000 + 601 601 1 0.0000000 24.1090000 24.1090000 5.3580000 + 602 602 1 0.0000000 24.1090000 24.1090000 10.7150000 + 603 603 1 0.0000000 24.1090000 24.1090000 16.0730000 + 604 604 1 0.0000000 24.1090000 24.1090000 21.4310000 + 605 605 1 0.0000000 24.1090000 24.1090000 26.7880000 + 606 606 1 0.0000000 24.1090000 24.1090000 32.1460000 + 607 607 1 0.0000000 24.1090000 29.4670000 5.3580000 + 608 608 1 0.0000000 24.1090000 29.4670000 10.7150000 + 609 609 1 0.0000000 24.1090000 29.4670000 16.0730000 + 610 610 1 0.0000000 24.1090000 29.4670000 21.4310000 + 611 611 1 0.0000000 24.1090000 29.4670000 26.7880000 + 612 612 1 0.0000000 24.1090000 29.4670000 32.1460000 + 613 613 1 0.0000000 29.4670000 2.6790000 5.3580000 + 614 614 1 0.0000000 29.4670000 2.6790000 10.7150000 + 615 615 1 0.0000000 29.4670000 2.6790000 16.0730000 + 616 616 1 0.0000000 29.4670000 2.6790000 21.4310000 + 617 617 1 0.0000000 29.4670000 2.6790000 26.7880000 + 618 618 1 0.0000000 29.4670000 2.6790000 32.1460000 + 619 619 1 0.0000000 29.4670000 8.0360000 5.3580000 + 620 620 1 0.0000000 29.4670000 8.0360000 10.7150000 + 621 621 1 0.0000000 29.4670000 8.0360000 16.0730000 + 622 622 1 0.0000000 29.4670000 8.0360000 21.4310000 + 623 623 1 0.0000000 29.4670000 8.0360000 26.7880000 + 624 624 1 0.0000000 29.4670000 8.0360000 32.1460000 + 625 625 1 0.0000000 29.4670000 13.3940000 5.3580000 + 626 626 1 0.0000000 29.4670000 13.3940000 10.7150000 + 627 627 1 0.0000000 29.4670000 13.3940000 16.0730000 + 628 628 1 0.0000000 29.4670000 13.3940000 21.4310000 + 629 629 1 0.0000000 29.4670000 13.3940000 26.7880000 + 630 630 1 0.0000000 29.4670000 13.3940000 32.1460000 + 631 631 1 0.0000000 29.4670000 18.7520000 5.3580000 + 632 632 1 0.0000000 29.4670000 18.7520000 10.7150000 + 633 633 1 0.0000000 29.4670000 18.7520000 16.0730000 + 634 634 1 0.0000000 29.4670000 18.7520000 21.4310000 + 635 635 1 0.0000000 29.4670000 18.7520000 26.7880000 + 636 636 1 0.0000000 29.4670000 18.7520000 32.1460000 + 637 637 1 0.0000000 29.4670000 24.1090000 5.3580000 + 638 638 1 0.0000000 29.4670000 24.1090000 10.7150000 + 639 639 1 0.0000000 29.4670000 24.1090000 16.0730000 + 640 640 1 0.0000000 29.4670000 24.1090000 21.4310000 + 641 641 1 0.0000000 29.4670000 24.1090000 26.7880000 + 642 642 1 0.0000000 29.4670000 24.1090000 32.1460000 + 643 643 1 0.0000000 29.4670000 29.4670000 5.3580000 + 644 644 1 0.0000000 29.4670000 29.4670000 10.7150000 + 645 645 1 0.0000000 29.4670000 29.4670000 16.0730000 + 646 646 1 0.0000000 29.4670000 29.4670000 21.4310000 + 647 647 1 0.0000000 29.4670000 29.4670000 26.7880000 + 648 648 1 0.0000000 29.4670000 29.4670000 32.1460000 + 649 649 1 0.0000000 0.0000000 5.3580000 5.3580000 + 650 650 1 0.0000000 0.0000000 5.3580000 10.7150000 + 651 651 1 0.0000000 0.0000000 5.3580000 16.0730000 + 652 652 1 0.0000000 0.0000000 5.3580000 21.4310000 + 653 653 1 0.0000000 0.0000000 5.3580000 26.7880000 + 654 654 1 0.0000000 0.0000000 5.3580000 32.1460000 + 655 655 1 0.0000000 0.0000000 10.7150000 5.3580000 + 656 656 1 0.0000000 0.0000000 10.7150000 10.7150000 + 657 657 1 0.0000000 0.0000000 10.7150000 16.0730000 + 658 658 1 0.0000000 0.0000000 10.7150000 21.4310000 + 659 659 1 0.0000000 0.0000000 10.7150000 26.7880000 + 660 660 1 0.0000000 0.0000000 10.7150000 32.1460000 + 661 661 1 0.0000000 0.0000000 16.0730000 5.3580000 + 662 662 1 0.0000000 0.0000000 16.0730000 10.7150000 + 663 663 1 0.0000000 0.0000000 16.0730000 16.0730000 + 664 664 1 0.0000000 0.0000000 16.0730000 21.4310000 + 665 665 1 0.0000000 0.0000000 16.0730000 26.7880000 + 666 666 1 0.0000000 0.0000000 16.0730000 32.1460000 + 667 667 1 0.0000000 0.0000000 21.4310000 5.3580000 + 668 668 1 0.0000000 0.0000000 21.4310000 10.7150000 + 669 669 1 0.0000000 0.0000000 21.4310000 16.0730000 + 670 670 1 0.0000000 0.0000000 21.4310000 21.4310000 + 671 671 1 0.0000000 0.0000000 21.4310000 26.7880000 + 672 672 1 0.0000000 0.0000000 21.4310000 32.1460000 + 673 673 1 0.0000000 0.0000000 26.7880000 5.3580000 + 674 674 1 0.0000000 0.0000000 26.7880000 10.7150000 + 675 675 1 0.0000000 0.0000000 26.7880000 16.0730000 + 676 676 1 0.0000000 0.0000000 26.7880000 21.4310000 + 677 677 1 0.0000000 0.0000000 26.7880000 26.7880000 + 678 678 1 0.0000000 0.0000000 26.7880000 32.1460000 + 679 679 1 0.0000000 0.0000000 32.1460000 5.3580000 + 680 680 1 0.0000000 0.0000000 32.1460000 10.7150000 + 681 681 1 0.0000000 0.0000000 32.1460000 16.0730000 + 682 682 1 0.0000000 0.0000000 32.1460000 21.4310000 + 683 683 1 0.0000000 0.0000000 32.1460000 26.7880000 + 684 684 1 0.0000000 0.0000000 32.1460000 32.1460000 + 685 685 1 0.0000000 5.3580000 5.3580000 5.3580000 + 686 686 1 0.0000000 5.3580000 5.3580000 10.7150000 + 687 687 1 0.0000000 5.3580000 5.3580000 16.0730000 + 688 688 1 0.0000000 5.3580000 5.3580000 21.4310000 + 689 689 1 0.0000000 5.3580000 5.3580000 26.7880000 + 690 690 1 0.0000000 5.3580000 5.3580000 32.1460000 + 691 691 1 0.0000000 5.3580000 10.7150000 5.3580000 + 692 692 1 0.0000000 5.3580000 10.7150000 10.7150000 + 693 693 1 0.0000000 5.3580000 10.7150000 16.0730000 + 694 694 1 0.0000000 5.3580000 10.7150000 21.4310000 + 695 695 1 0.0000000 5.3580000 10.7150000 26.7880000 + 696 696 1 0.0000000 5.3580000 10.7150000 32.1460000 + 697 697 1 0.0000000 5.3580000 16.0730000 5.3580000 + 698 698 1 0.0000000 5.3580000 16.0730000 10.7150000 + 699 699 1 0.0000000 5.3580000 16.0730000 16.0730000 + 700 700 1 0.0000000 5.3580000 16.0730000 21.4310000 + 701 701 1 0.0000000 5.3580000 16.0730000 26.7880000 + 702 702 1 0.0000000 5.3580000 16.0730000 32.1460000 + 703 703 1 0.0000000 5.3580000 21.4310000 5.3580000 + 704 704 1 0.0000000 5.3580000 21.4310000 10.7150000 + 705 705 1 0.0000000 5.3580000 21.4310000 16.0730000 + 706 706 1 0.0000000 5.3580000 21.4310000 21.4310000 + 707 707 1 0.0000000 5.3580000 21.4310000 26.7880000 + 708 708 1 0.0000000 5.3580000 21.4310000 32.1460000 + 709 709 1 0.0000000 5.3580000 26.7880000 5.3580000 + 710 710 1 0.0000000 5.3580000 26.7880000 10.7150000 + 711 711 1 0.0000000 5.3580000 26.7880000 16.0730000 + 712 712 1 0.0000000 5.3580000 26.7880000 21.4310000 + 713 713 1 0.0000000 5.3580000 26.7880000 26.7880000 + 714 714 1 0.0000000 5.3580000 26.7880000 32.1460000 + 715 715 1 0.0000000 5.3580000 32.1460000 5.3580000 + 716 716 1 0.0000000 5.3580000 32.1460000 10.7150000 + 717 717 1 0.0000000 5.3580000 32.1460000 16.0730000 + 718 718 1 0.0000000 5.3580000 32.1460000 21.4310000 + 719 719 1 0.0000000 5.3580000 32.1460000 26.7880000 + 720 720 1 0.0000000 5.3580000 32.1460000 32.1460000 + 721 721 1 0.0000000 10.7150000 5.3580000 5.3580000 + 722 722 1 0.0000000 10.7150000 5.3580000 10.7150000 + 723 723 1 0.0000000 10.7150000 5.3580000 16.0730000 + 724 724 1 0.0000000 10.7150000 5.3580000 21.4310000 + 725 725 1 0.0000000 10.7150000 5.3580000 26.7880000 + 726 726 1 0.0000000 10.7150000 5.3580000 32.1460000 + 727 727 1 0.0000000 10.7150000 10.7150000 5.3580000 + 728 728 1 0.0000000 10.7150000 10.7150000 10.7150000 + 729 729 1 0.0000000 10.7150000 10.7150000 16.0730000 + 730 730 1 0.0000000 10.7150000 10.7150000 21.4310000 + 731 731 1 0.0000000 10.7150000 10.7150000 26.7880000 + 732 732 1 0.0000000 10.7150000 10.7150000 32.1460000 + 733 733 1 0.0000000 10.7150000 16.0730000 5.3580000 + 734 734 1 0.0000000 10.7150000 16.0730000 10.7150000 + 735 735 1 0.0000000 10.7150000 16.0730000 16.0730000 + 736 736 1 0.0000000 10.7150000 16.0730000 21.4310000 + 737 737 1 0.0000000 10.7150000 16.0730000 26.7880000 + 738 738 1 0.0000000 10.7150000 16.0730000 32.1460000 + 739 739 1 0.0000000 10.7150000 21.4310000 5.3580000 + 740 740 1 0.0000000 10.7150000 21.4310000 10.7150000 + 741 741 1 0.0000000 10.7150000 21.4310000 16.0730000 + 742 742 1 0.0000000 10.7150000 21.4310000 21.4310000 + 743 743 1 0.0000000 10.7150000 21.4310000 26.7880000 + 744 744 1 0.0000000 10.7150000 21.4310000 32.1460000 + 745 745 1 0.0000000 10.7150000 26.7880000 5.3580000 + 746 746 1 0.0000000 10.7150000 26.7880000 10.7150000 + 747 747 1 0.0000000 10.7150000 26.7880000 16.0730000 + 748 748 1 0.0000000 10.7150000 26.7880000 21.4310000 + 749 749 1 0.0000000 10.7150000 26.7880000 26.7880000 + 750 750 1 0.0000000 10.7150000 26.7880000 32.1460000 + 751 751 1 0.0000000 10.7150000 32.1460000 5.3580000 + 752 752 1 0.0000000 10.7150000 32.1460000 10.7150000 + 753 753 1 0.0000000 10.7150000 32.1460000 16.0730000 + 754 754 1 0.0000000 10.7150000 32.1460000 21.4310000 + 755 755 1 0.0000000 10.7150000 32.1460000 26.7880000 + 756 756 1 0.0000000 10.7150000 32.1460000 32.1460000 + 757 757 1 0.0000000 16.0730000 5.3580000 5.3580000 + 758 758 1 0.0000000 16.0730000 5.3580000 10.7150000 + 759 759 1 0.0000000 16.0730000 5.3580000 16.0730000 + 760 760 1 0.0000000 16.0730000 5.3580000 21.4310000 + 761 761 1 0.0000000 16.0730000 5.3580000 26.7880000 + 762 762 1 0.0000000 16.0730000 5.3580000 32.1460000 + 763 763 1 0.0000000 16.0730000 10.7150000 5.3580000 + 764 764 1 0.0000000 16.0730000 10.7150000 10.7150000 + 765 765 1 0.0000000 16.0730000 10.7150000 16.0730000 + 766 766 1 0.0000000 16.0730000 10.7150000 21.4310000 + 767 767 1 0.0000000 16.0730000 10.7150000 26.7880000 + 768 768 1 0.0000000 16.0730000 10.7150000 32.1460000 + 769 769 1 0.0000000 16.0730000 16.0730000 5.3580000 + 770 770 1 0.0000000 16.0730000 16.0730000 10.7150000 + 771 771 1 0.0000000 16.0730000 16.0730000 16.0730000 + 772 772 1 0.0000000 16.0730000 16.0730000 21.4310000 + 773 773 1 0.0000000 16.0730000 16.0730000 26.7880000 + 774 774 1 0.0000000 16.0730000 16.0730000 32.1460000 + 775 775 1 0.0000000 16.0730000 21.4310000 5.3580000 + 776 776 1 0.0000000 16.0730000 21.4310000 10.7150000 + 777 777 1 0.0000000 16.0730000 21.4310000 16.0730000 + 778 778 1 0.0000000 16.0730000 21.4310000 21.4310000 + 779 779 1 0.0000000 16.0730000 21.4310000 26.7880000 + 780 780 1 0.0000000 16.0730000 21.4310000 32.1460000 + 781 781 1 0.0000000 16.0730000 26.7880000 5.3580000 + 782 782 1 0.0000000 16.0730000 26.7880000 10.7150000 + 783 783 1 0.0000000 16.0730000 26.7880000 16.0730000 + 784 784 1 0.0000000 16.0730000 26.7880000 21.4310000 + 785 785 1 0.0000000 16.0730000 26.7880000 26.7880000 + 786 786 1 0.0000000 16.0730000 26.7880000 32.1460000 + 787 787 1 0.0000000 16.0730000 32.1460000 5.3580000 + 788 788 1 0.0000000 16.0730000 32.1460000 10.7150000 + 789 789 1 0.0000000 16.0730000 32.1460000 16.0730000 + 790 790 1 0.0000000 16.0730000 32.1460000 21.4310000 + 791 791 1 0.0000000 16.0730000 32.1460000 26.7880000 + 792 792 1 0.0000000 16.0730000 32.1460000 32.1460000 + 793 793 1 0.0000000 21.4310000 5.3580000 5.3580000 + 794 794 1 0.0000000 21.4310000 5.3580000 10.7150000 + 795 795 1 0.0000000 21.4310000 5.3580000 16.0730000 + 796 796 1 0.0000000 21.4310000 5.3580000 21.4310000 + 797 797 1 0.0000000 21.4310000 5.3580000 26.7880000 + 798 798 1 0.0000000 21.4310000 5.3580000 32.1460000 + 799 799 1 0.0000000 21.4310000 10.7150000 5.3580000 + 800 800 1 0.0000000 21.4310000 10.7150000 10.7150000 + 801 801 1 0.0000000 21.4310000 10.7150000 16.0730000 + 802 802 1 0.0000000 21.4310000 10.7150000 21.4310000 + 803 803 1 0.0000000 21.4310000 10.7150000 26.7880000 + 804 804 1 0.0000000 21.4310000 10.7150000 32.1460000 + 805 805 1 0.0000000 21.4310000 16.0730000 5.3580000 + 806 806 1 0.0000000 21.4310000 16.0730000 10.7150000 + 807 807 1 0.0000000 21.4310000 16.0730000 16.0730000 + 808 808 1 0.0000000 21.4310000 16.0730000 21.4310000 + 809 809 1 0.0000000 21.4310000 16.0730000 26.7880000 + 810 810 1 0.0000000 21.4310000 16.0730000 32.1460000 + 811 811 1 0.0000000 21.4310000 21.4310000 5.3580000 + 812 812 1 0.0000000 21.4310000 21.4310000 10.7150000 + 813 813 1 0.0000000 21.4310000 21.4310000 16.0730000 + 814 814 1 0.0000000 21.4310000 21.4310000 21.4310000 + 815 815 1 0.0000000 21.4310000 21.4310000 26.7880000 + 816 816 1 0.0000000 21.4310000 21.4310000 32.1460000 + 817 817 1 0.0000000 21.4310000 26.7880000 5.3580000 + 818 818 1 0.0000000 21.4310000 26.7880000 10.7150000 + 819 819 1 0.0000000 21.4310000 26.7880000 16.0730000 + 820 820 1 0.0000000 21.4310000 26.7880000 21.4310000 + 821 821 1 0.0000000 21.4310000 26.7880000 26.7880000 + 822 822 1 0.0000000 21.4310000 26.7880000 32.1460000 + 823 823 1 0.0000000 21.4310000 32.1460000 5.3580000 + 824 824 1 0.0000000 21.4310000 32.1460000 10.7150000 + 825 825 1 0.0000000 21.4310000 32.1460000 16.0730000 + 826 826 1 0.0000000 21.4310000 32.1460000 21.4310000 + 827 827 1 0.0000000 21.4310000 32.1460000 26.7880000 + 828 828 1 0.0000000 21.4310000 32.1460000 32.1460000 + 829 829 1 0.0000000 26.7880000 5.3580000 5.3580000 + 830 830 1 0.0000000 26.7880000 5.3580000 10.7150000 + 831 831 1 0.0000000 26.7880000 5.3580000 16.0730000 + 832 832 1 0.0000000 26.7880000 5.3580000 21.4310000 + 833 833 1 0.0000000 26.7880000 5.3580000 26.7880000 + 834 834 1 0.0000000 26.7880000 5.3580000 32.1460000 + 835 835 1 0.0000000 26.7880000 10.7150000 5.3580000 + 836 836 1 0.0000000 26.7880000 10.7150000 10.7150000 + 837 837 1 0.0000000 26.7880000 10.7150000 16.0730000 + 838 838 1 0.0000000 26.7880000 10.7150000 21.4310000 + 839 839 1 0.0000000 26.7880000 10.7150000 26.7880000 + 840 840 1 0.0000000 26.7880000 10.7150000 32.1460000 + 841 841 1 0.0000000 26.7880000 16.0730000 5.3580000 + 842 842 1 0.0000000 26.7880000 16.0730000 10.7150000 + 843 843 1 0.0000000 26.7880000 16.0730000 16.0730000 + 844 844 1 0.0000000 26.7880000 16.0730000 21.4310000 + 845 845 1 0.0000000 26.7880000 16.0730000 26.7880000 + 846 846 1 0.0000000 26.7880000 16.0730000 32.1460000 + 847 847 1 0.0000000 26.7880000 21.4310000 5.3580000 + 848 848 1 0.0000000 26.7880000 21.4310000 10.7150000 + 849 849 1 0.0000000 26.7880000 21.4310000 16.0730000 + 850 850 1 0.0000000 26.7880000 21.4310000 21.4310000 + 851 851 1 0.0000000 26.7880000 21.4310000 26.7880000 + 852 852 1 0.0000000 26.7880000 21.4310000 32.1460000 + 853 853 1 0.0000000 26.7880000 26.7880000 5.3580000 + 854 854 1 0.0000000 26.7880000 26.7880000 10.7150000 + 855 855 1 0.0000000 26.7880000 26.7880000 16.0730000 + 856 856 1 0.0000000 26.7880000 26.7880000 21.4310000 + 857 857 1 0.0000000 26.7880000 26.7880000 26.7880000 + 858 858 1 0.0000000 26.7880000 26.7880000 32.1460000 + 859 859 1 0.0000000 26.7880000 32.1460000 5.3580000 + 860 860 1 0.0000000 26.7880000 32.1460000 10.7150000 + 861 861 1 0.0000000 26.7880000 32.1460000 16.0730000 + 862 862 1 0.0000000 26.7880000 32.1460000 21.4310000 + 863 863 1 0.0000000 26.7880000 32.1460000 26.7880000 + 864 864 1 0.0000000 26.7880000 32.1460000 32.1460000 + diff --git a/examples/gjf/ff-argon.lmp b/examples/gjf/ff-argon.lmp new file mode 100644 index 0000000000..b6f7bc931a --- /dev/null +++ b/examples/gjf/ff-argon.lmp @@ -0,0 +1,20 @@ +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + diff --git a/examples/gjf/in.argon b/examples/gjf/in.argon new file mode 100644 index 0000000000..271882c665 --- /dev/null +++ b/examples/gjf/in.argon @@ -0,0 +1,162 @@ +###############################mm +# Atom style - charge/vdw/bonded# +################################# +atom_style full + +############################################## +#Units Metal : eV - ps - angstrom - bar# +# Real : kcal/mol - fs - angstrom - atm# +############################################## +units metal + +############ +#Run number# +############ +variable run_no equal 0 # is it a restart? +variable res_no equal ${run_no}-1 # restart file number + +####################################### +#Random Seeds and Domain Decomposition# +####################################### +variable iseed0 equal 2357 +variable iseed1 equal 26488 +variable iseed2 equal 10669 +processors * * * + +########### +#Data File# +########### +variable inpfile string argon.lmp +variable resfile string final_restart.${res_no} +variable ff_file string ff-argon.lmp + +########## +#Run Type# +########## +variable minimise equal 0 #Energy Minimization +variable md equal 1 #Plain MD + +############################### +#Molecular Dynamics Parameters# +############################### +variable run_no equal 0 # is it a restart? + +variable ens equal 9 # ensemble (0=nve, 1=nvt, 2=npt, 3=ber, 4=lang, 5=stoc, 6=vres, 7=stoch, 8=gjf) +variable ts equal 0.120 # simulation timestep (time units) +variable nequil equal 0 # number of equilibration steps +variable nsteps equal 200000 # number of MD steps +#variable nsteps equal 20 # number of MD steps + +variable temp_s equal 10 # starting temperature +variable temp_f equal 10 # final simulation temperature +variable trel equal 1 # thermostat relaxation time +variable tscale equal 1 # thermostat relaxation freq - vel rescaling only +variable deltat equal 1 # maximum temperature change - vel rescaling only + +variable npttype string iso # type of NPT (iso, aniso, tri, z...) +variable pres equal 1.01325 # pressure (NPT runs only) +variable prel equal 1.0 # barostat relaxation time + +neighbor 1 bin + +################### +#Output Parameters# +################### +variable ntraj equal 1000 # trajectory output frequency - all system +variable ntraj_s equal -100 # trajectory output frequency - solute only +variable nthermo equal 200 # thermodynamic data output frequency + +################################ +#Energy Minimization Parameters# +################################ +variable mtraj equal 1 # trajectory output frequency - all system +variable etol equal 1e-5 # % change in energy +variable ftol equal 1e-5 # max force threshold (force units) +variable maxiter equal 10000 # max # of iterations + +######################## +#3D Periodic Simulation# +######################## +boundary p p p + +############################# +#Reading the input structure# +############################# +if "${run_no} == 0" then "read_data ${inpfile}" else "read_restart ${resfile}" + +############# +#Force Field# +############# +include ${ff_file} + +###################### +#Thermodynamic Output# +###################### +variable str_basic string 'step time pe temp press' + +#MD ensemble (0=nve, 1=nvt, 2=npt, 3=ber, 4=lang, 5=stoc, 6=vres) +variable str_ens string ' ' +if "${ens} == 0" then "variable str_ens string 'etotal'" +if "${ens} == 2" then "variable str_ens string 'vol pxx pyy pzz cella cellb cellc cellakpha cellbeta cellgamma'" + +#Variable for a gulp friend output +if "${ens} >= 0" then "thermo_style custom time temp pe etotal press vol cpu" & + "thermo ${nthermo}" & + "thermo_modify flush yes" + +##################### +#Energy Minimization# +##################### +if "${minimise} <= 0 || ${run_no} > 0" then "jump SELF end_minimise" + print "Doing CG minimisation" + dump mdcd all dcd ${mtraj} min.dcd + dump_modify mdcd unwrap yes + min_style cg + min_modify line quadratic + minimize ${etol} ${ftol} ${maxiter} ${maxiter} + reset_timestep 0 + undump mdcd +label end_minimise + +################ +#Timestep in ps# +################ +timestep ${ts} + +############## +#Restart file# +############## +restart 100000 restart.1 restart.2 + +################### +#Trajectory output# +################### +#dump xyz all atom 1000 silicon.lammpstrj + +if "${ntraj} > 0" then & + "dump 1 all dcd ${ntraj} trajectory.${run_no}.dcd" & + "dump_modify 1 unwrap yes" + +fix mom all momentum 1 linear 1 1 1 + +############################################################### +#Ensembles (0=nve,1=nvt, 2=npt, 3=ber, 4=lang, 5=stoc, 6=vres)# +############################################################### +if "${md} > 0" then 'print "Setting up the ensembles"' & + 'if "${run_no} == 0" then "velocity all create ${temp_s} ${iseed0} mom yes dist gaussian"' & + 'if "${ens} == 0" then "fix nve all nve"' & + 'if "${ens} == 1" then "fix nvt all nvt temp ${temp_s} ${temp_f} ${trel} tchain 5"' & + 'if "${ens} == 2" then "fix npt all npt temp ${temp_s} ${temp_f} ${trel} ${npttype} ${pres} ${pres} ${prel} tchain 5 pchain 5 mtk yes"' & + 'if "${ens} == 3" then "fix nve all nve" "fix ber all temp/berendsen ${temp_s} ${temp_f} ${trel}"' & + 'if "${ens} == 4" then "fix nve all nve" "fix lang all langevin ${temp_s} ${temp_f} ${trel} ${iseed1} tally yes zero yes"' & + 'if "${ens} == 5" then "fix nve all nve" "fix stoch all temp/csvr ${temp_s} ${temp_f} ${trel} ${iseed1}"' & + 'if "${ens} == 6" then "fix nve all nve" "fix stoch all temp/csld ${temp_s} ${temp_f} ${trel} ${iseed1}"' & + 'if "${ens} == 7" then "fix nve all nve" "fix vres all temp/rescale ${tscale} ${temp_s} ${temp_f} ${tmin} ${tmax}"' & + 'if "${ens} == 8" then "fix nve all nve" "fix lang all langevin ${temp_s} ${temp_f} ${trel} ${iseed1} gjf yes"' & + 'if "${ens} == 9" then "fix nve all nve" "fix lang all langevin ${temp_s} ${temp_f} ${trel} ${iseed1} gjf yes halfstep yes"' + +if "${md} > 0" then "print 'Doing Molecular dynamics'" & + "run ${nsteps}" & + "write_restart final_restart.${run_no}" + + diff --git a/examples/gjf/out.argon b/examples/gjf/out.argon new file mode 100644 index 0000000000..8dda569157 --- /dev/null +++ b/examples/gjf/out.argon @@ -0,0 +1,249 @@ +LAMMPS (1 Feb 2019) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +Reading data file ... + orthogonal box = (0 0 0) to (32.146 32.146 32.146) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 864 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors +Setting up the ensembles +WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) +WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) +WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) +WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) +Doing Molecular dynamics +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.94072 + ghost atom cutoff = 6.94072 + binsize = 3.47036, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cubic, perpetual + attributes: half, newton on + pair build: half/bin/newton + stencil: half/bin/3d/newton + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.12 +Per MPI rank memory allocation (min/avg/max) = 6.847 | 6.847 | 6.847 Mbytes +Time Temp PotEng TotEng Press Volume CPU + 0 10 -56.207655 -55.09214 33.340921 33218.561 0 + 24 10.156356 -55.092888 -53.959932 339.40964 33218.561 0.082175482 + 48 9.6121006 -55.07262 -54.000376 344.56765 33218.561 0.19529325 + 72 9.8187467 -55.16687 -54.071574 318.85979 33218.561 0.29643488 + 96 9.5421385 -55.151229 -54.086789 322.8842 33218.561 0.38801357 + 120 10.295035 -55.12919 -53.980763 332.00171 33218.561 0.47607262 + 144 10.331608 -55.09907 -53.946563 339.28896 33218.561 0.57389224 + 168 10.154698 -55.058246 -53.925475 349.03253 33218.561 0.65481471 + 192 9.858198 -55.127583 -54.027886 330.09298 33218.561 0.74437734 + 216 9.6658918 -55.10812 -54.029875 334.28383 33218.561 0.8278495 + 240 9.6801591 -55.102386 -54.02255 336.27242 33218.561 0.91167379 + 264 10.685658 -55.046238 -53.854237 355.0448 33218.561 1.0023789 + 288 10.387727 -55.08427 -53.925504 343.87247 33218.561 1.0960371 + 312 10.231132 -55.120428 -53.97913 333.22463 33218.561 1.2382998 + 336 10.20896 -55.075142 -53.936317 344.88438 33218.561 1.3420489 + 360 9.7876538 -55.165008 -54.07318 319.14962 33218.561 1.42782 + 384 9.9872551 -55.13881 -54.024717 327.82471 33218.561 1.5417666 + 408 9.5362734 -55.063733 -53.999947 346.50545 33218.561 1.6328366 + 432 10.262638 -55.126608 -53.981796 332.16342 33218.561 1.7242996 + 456 9.9228239 -55.122119 -54.015214 332.26261 33218.561 1.8124888 + 480 9.7026324 -55.17057 -54.088227 317.84818 33218.561 1.900233 + 504 10.028762 -55.082465 -53.963741 343.04257 33218.561 1.989605 + 528 9.8227851 -55.121222 -54.025476 332.42857 33218.561 2.0708802 + 552 10.208672 -55.100242 -53.961449 338.68109 33218.561 2.1527217 + 576 10.180849 -55.124065 -53.988376 331.29516 33218.561 2.238126 + 600 9.6467252 -55.119533 -54.043427 332.43109 33218.561 2.323443 + 624 10.041885 -55.173802 -54.053614 318.48579 33218.561 2.4046151 + 648 10.151597 -55.111725 -53.979299 334.66227 33218.561 2.4902161 + 672 9.7719111 -55.060111 -53.970039 348.55249 33218.561 2.5800372 + 696 10.476688 -55.088109 -53.919419 342.94922 33218.561 2.6731395 + 720 10.517805 -55.113604 -53.940327 335.47342 33218.561 2.760651 + 744 10.006466 -55.045085 -53.928848 353.53813 33218.561 2.8537894 + 768 10.201492 -55.081598 -53.943606 343.3206 33218.561 2.9404115 + 792 10.117738 -55.077806 -53.949157 345.31093 33218.561 3.030765 + 816 10.362288 -55.11635 -53.960421 333.9045 33218.561 3.1177356 + 840 10.204164 -55.097619 -53.959329 338.82717 33218.561 3.2091886 + 864 10.147722 -55.101372 -53.969378 338.19682 33218.561 3.3003742 + 888 9.9265037 -55.111394 -54.004077 334.08116 33218.561 3.395341 + 912 10.206403 -55.132181 -53.993642 328.89904 33218.561 3.4882881 + 936 10.28639 -55.093317 -53.945855 340.61244 33218.561 3.5764735 + 960 9.8028822 -55.078802 -53.985276 343.5904 33218.561 3.7056267 + 984 10.492755 -55.121321 -53.950839 334.62697 33218.561 3.8055611 + 1008 10.621569 -55.088588 -53.903736 343.33166 33218.561 3.9144807 + 1032 10.006729 -55.113459 -53.997193 334.43025 33218.561 4.0189888 + 1056 10.099853 -55.068035 -53.941381 347.42158 33218.561 4.1391664 + 1080 10.254232 -55.066685 -53.92281 347.15777 33218.561 4.2443953 + 1104 9.9495142 -55.13686 -54.026977 327.63107 33218.561 4.3368342 + 1128 10.377108 -55.08846 -53.930878 344.13083 33218.561 4.4287748 + 1152 10.036981 -55.114643 -53.995003 334.88053 33218.561 4.526868 + 1176 10.144779 -55.097125 -53.965459 339.698 33218.561 4.6614049 + 1200 10.075844 -55.14695 -54.022974 326.05911 33218.561 4.799835 + 1224 10.183695 -55.121716 -53.98571 332.75772 33218.561 4.8908897 + 1248 10.581369 -55.027954 -53.847587 359.06251 33218.561 4.9839788 + 1272 10.158269 -55.105173 -53.972003 337.52964 33218.561 5.0918646 + 1296 9.8776072 -55.064085 -53.962223 347.15648 33218.561 5.2291209 + 1320 10.38161 -55.118366 -53.960282 335.17767 33218.561 5.3570446 + 1344 9.9528146 -55.141937 -54.031685 326.27117 33218.561 5.4584705 + 1368 9.8024326 -55.117808 -54.024332 332.99835 33218.561 5.5557818 + 1392 10.35447 -55.110235 -53.955179 336.80412 33218.561 5.6467392 + 1416 10.199061 -55.105641 -53.96792 337.36785 33218.561 5.7476527 + 1440 9.6868779 -55.087316 -54.00673 340.9166 33218.561 5.8432207 + 1464 10.093238 -55.049436 -53.92352 352.27563 33218.561 5.9471521 + 1488 9.7578808 -55.123935 -54.035429 329.93926 33218.561 6.0495014 + 1512 10.099979 -55.205426 -54.078758 309.26166 33218.561 6.1612976 + 1536 10.172944 -55.087106 -53.952299 342.93395 33218.561 6.2506202 + 1560 10.51771 -55.107635 -53.934369 340.1967 33218.561 6.3379856 + 1584 10.044994 -55.101362 -53.980828 339.03163 33218.561 6.4362567 + 1608 9.624758 -55.146246 -54.07259 324.32486 33218.561 6.5385845 + 1632 9.9135215 -55.097278 -53.99141 338.69162 33218.561 6.6452786 + 1656 9.863681 -55.070523 -53.970214 345.84608 33218.561 6.7518212 + 1680 10.138513 -55.127065 -53.996099 330.40757 33218.561 6.8775188 + 1704 10.382237 -55.070572 -53.912417 347.074 33218.561 7.0126448 + 1728 10.72487 -55.081147 -53.884771 345.83623 33218.561 7.1384216 + 1752 9.829431 -55.131041 -54.034553 328.57652 33218.561 7.2616419 + 1776 9.9135662 -55.100556 -53.994682 336.52238 33218.561 7.4193201 + 1800 10.41873 -55.097116 -53.934891 340.24798 33218.561 7.5570544 + 1824 10.151782 -55.03231 -53.899864 357.3654 33218.561 7.6872905 + 1848 10.42307 -55.043808 -53.881099 355.71677 33218.561 7.7933885 + 1872 10.276862 -55.085016 -53.938616 344.46273 33218.561 7.8887472 + 1896 9.7681373 -55.146507 -54.056857 324.84323 33218.561 7.9977923 + 1920 9.6624824 -55.103214 -54.025349 336.06397 33218.561 8.090235 + 1944 10.153504 -55.049175 -53.916536 352.36339 33218.561 8.1923703 + 1968 10.191954 -55.098741 -53.961813 338.8667 33218.561 8.3320906 + 1992 9.92167 -55.117079 -54.010302 332.96497 33218.561 8.4774437 + 2016 9.5737281 -55.091141 -54.023178 339.41837 33218.561 8.6149527 + 2040 10.600908 -55.092717 -53.91017 342.71852 33218.561 8.7639523 + 2064 9.9214513 -55.099904 -53.993151 337.46799 33218.561 8.898087 + 2088 9.9256258 -55.082224 -53.975005 342.85042 33218.561 9.0130784 + 2112 10.345379 -55.112923 -53.95888 335.81471 33218.561 9.1422766 + 2136 9.8876649 -55.079254 -53.97627 343.05764 33218.561 9.2885707 + 2160 10.04492 -55.074876 -53.95435 344.82419 33218.561 9.3876103 + 2184 10.028705 -55.063961 -53.945244 347.70549 33218.561 9.500967 + 2208 10.412572 -55.136316 -53.974778 329.8188 33218.561 9.5900362 + 2232 10.404205 -55.09913 -53.938525 339.77542 33218.561 9.7048353 + 2256 9.5694135 -55.139021 -54.071538 326.37473 33218.561 9.8045958 + 2280 10.244745 -55.134529 -53.991713 329.19392 33218.561 9.8968908 + 2304 9.9129922 -55.116192 -54.010382 333.14326 33218.561 9.9818651 + 2328 10.167027 -55.08241 -53.948263 343.08135 33218.561 10.068683 + 2352 10.262045 -55.144327 -53.999581 327.40876 33218.561 10.155937 + 2376 10.520934 -55.073147 -53.899521 347.6998 33218.561 10.246316 + 2400 9.9628692 -55.122001 -54.010628 331.25369 33218.561 10.336833 + 2424 10.565531 -55.157113 -53.978512 325.14897 33218.561 10.452039 + 2448 10.03709 -55.096409 -53.976756 338.29607 33218.561 10.537936 + 2472 9.384311 -55.141821 -54.094987 324.23247 33218.561 10.628689 + 2496 9.8019362 -55.105685 -54.012264 335.97239 33218.561 10.717287 + 2520 10.31114 -55.078831 -53.928608 345.42395 33218.561 10.818756 + 2544 10.407237 -55.148382 -53.987439 325.94421 33218.561 10.910801 + 2568 10.257967 -55.041348 -53.897056 355.73261 33218.561 11.004221 + 2592 9.8425807 -55.139428 -54.041474 328.28096 33218.561 11.101295 + 2616 10.140697 -55.100238 -53.969028 338.76319 33218.561 11.192211 + 2640 9.7102818 -55.136288 -54.053091 326.7053 33218.561 11.280277 + 2664 10.120372 -55.128779 -53.999836 330.71707 33218.561 11.369001 + 2688 10.232537 -55.120614 -53.979159 333.35087 33218.561 11.464652 + 2712 10.032526 -55.094761 -53.975618 339.97984 33218.561 11.559387 + 2736 9.8791 -55.121998 -54.01997 332.32556 33218.561 11.649679 + 2760 9.891483 -55.120919 -54.017509 331.32614 33218.561 11.742604 + 2784 10.201053 -55.165525 -54.027582 320.39272 33218.561 11.85274 + 2808 10.238648 -55.096449 -53.954312 340.06316 33218.561 11.939782 + 2832 9.8692851 -55.068632 -53.967699 346.77535 33218.561 12.036655 + 2856 10.179976 -55.128413 -53.992822 331.5662 33218.561 12.123227 + 2880 9.7656315 -55.1468 -54.057429 324.02612 33218.561 12.213117 + 2904 9.7991628 -55.049191 -53.95608 352.45738 33218.561 12.326761 + 2928 10.581767 -55.093293 -53.912881 341.37292 33218.561 12.417633 + 2952 10.546144 -55.07452 -53.898081 347.02025 33218.561 12.52701 + 2976 9.8306008 -55.14762 -54.051002 323.45715 33218.561 12.633522 + 3000 10.033532 -55.076433 -53.957178 345.36812 33218.561 12.72627 + 3024 10.046266 -55.085775 -53.965099 342.47786 33218.561 12.816242 + 3048 10.176777 -55.133013 -53.997778 329.04144 33218.561 12.903175 + 3072 9.9778064 -55.143787 -54.030748 326.75284 33218.561 13.014329 + 3096 10.516223 -55.110144 -53.937043 336.802 33218.561 13.104673 + 3120 9.6561157 -55.138699 -54.061544 325.6652 33218.561 13.207371 + 3144 10.237043 -55.060968 -53.91901 349.44011 33218.561 13.303442 + 3168 9.9704264 -55.123073 -54.010857 332.19725 33218.561 13.391877 + 3192 10.493307 -55.144402 -53.973858 327.15485 33218.561 13.482857 + 3216 10.022171 -55.141782 -54.023794 326.08249 33218.561 13.574484 + 3240 9.6957248 -55.137865 -54.056292 326.04858 33218.561 13.671408 + 3264 9.9685299 -55.124301 -54.012297 331.9015 33218.561 13.760186 + 3288 10.413707 -55.153604 -53.99194 324.32939 33218.561 13.877604 + 3312 10.022953 -55.103422 -53.985346 337.52066 33218.561 13.977562 + 3336 10.044478 -55.110297 -53.98982 334.48379 33218.561 14.065563 + 3360 9.8593734 -55.130623 -54.030795 327.71748 33218.561 14.15952 + 3384 9.9269422 -55.107979 -54.000613 335.18173 33218.561 14.258064 + 3408 10.288049 -55.092276 -53.944629 340.71484 33218.561 14.36211 + 3432 9.9702156 -55.08732 -53.975128 341.72171 33218.561 14.452123 + 3456 10.246178 -55.091669 -53.948692 341.62844 33218.561 14.555775 + 3480 10.559292 -55.086917 -53.909012 343.70626 33218.561 14.645718 + 3504 10.652207 -55.050897 -53.862628 354.46979 33218.561 14.797422 + 3528 9.9835266 -55.0557 -53.942023 350.74747 33218.561 14.895716 + 3552 10.240934 -55.123217 -53.980825 332.26434 33218.561 15.023796 + 3576 10.406519 -55.093536 -53.932674 341.54029 33218.561 15.203252 + 3600 10.406733 -55.095168 -53.934282 341.22192 33218.561 15.303986 + 3624 9.9877484 -55.154231 -54.040083 323.55633 33218.561 15.398883 + 3648 10.391829 -55.110208 -53.950984 337.09219 33218.561 15.49042 + 3672 10.368995 -55.069591 -53.912914 346.82649 33218.561 15.582259 + 3696 10.362939 -55.109012 -53.953011 337.32216 33218.561 15.679316 + 3720 10.465254 -55.136214 -53.968799 331.22288 33218.561 15.773303 + 3744 9.8238226 -55.10114 -54.005278 338.12616 33218.561 15.86905 + 3768 10.205504 -55.101263 -53.962824 339.04196 33218.561 15.960072 + 3792 9.9589987 -55.118883 -54.007942 332.84318 33218.561 16.047055 + 3816 10.253382 -55.117513 -53.973732 334.42101 33218.561 16.148412 + 3840 10.262393 -55.069549 -53.924764 349.084 33218.561 16.235391 + 3864 9.7367167 -55.078288 -53.992142 342.48207 33218.561 16.329112 + 3888 10.171202 -55.134701 -54.000088 329.5847 33218.561 16.415353 + 3912 10.01925 -55.145139 -54.027477 326.65074 33218.561 16.526334 + 3936 10.053638 -55.038151 -53.916653 355.74893 33218.561 16.618524 + 3960 10.044055 -55.058382 -53.937953 349.01834 33218.561 16.712577 + 3984 10.382422 -55.099216 -53.941041 339.28099 33218.561 16.79941 + 4008 9.97927 -55.09284 -53.979637 339.07225 33218.561 16.904198 + 4032 9.6782319 -55.126143 -54.046522 329.0201 33218.561 16.991454 + 4056 9.6593809 -55.123677 -54.046159 329.89833 33218.561 17.097172 + 4080 10.442896 -55.141149 -53.976229 327.9899 33218.561 17.189364 + 4104 9.9571109 -55.08588 -53.975149 341.3746 33218.561 17.294147 + 4128 10.44943 -55.087946 -53.922296 343.09435 33218.561 17.387357 + 4152 10.040581 -55.171939 -54.051897 317.85348 33218.561 17.500905 + 4176 10.089442 -55.128713 -54.00322 330.29121 33218.561 17.588891 + 4200 10.316156 -55.123219 -53.972436 333.59382 33218.561 17.679254 + 4224 10.177245 -55.095671 -53.960384 339.34498 33218.561 17.770569 + 4248 9.7129183 -55.135335 -54.051844 328.25125 33218.561 17.857728 + 4272 10.231838 -55.099554 -53.958177 339.64015 33218.561 17.944226 + 4296 9.9737677 -55.117885 -54.005297 333.07248 33218.561 18.034105 + 4320 10.004955 -55.116155 -54.000088 333.52271 33218.561 18.129644 + 4344 9.5938901 -55.133824 -54.063612 327.84171 33218.561 18.215476 + 4368 9.8954562 -55.131603 -54.02775 329.0813 33218.561 18.306539 + 4392 10.439732 -55.100379 -53.935812 339.81679 33218.561 18.395651 + 4416 9.934513 -55.08449 -53.97628 341.74441 33218.561 18.484506 + 4440 10.025998 -55.136771 -54.018356 327.73718 33218.561 18.593946 + 4464 9.9304451 -55.101817 -53.994061 338.1801 33218.561 18.684011 + 4488 10.344371 -55.085856 -53.931926 342.91721 33218.561 18.782399 + 4512 10.033193 -55.091778 -53.972561 339.85728 33218.561 18.879666 + 4536 9.2361614 -55.169375 -54.139067 316.67597 33218.561 18.983667 + 4560 9.5786289 -55.179976 -54.111465 314.76415 33218.561 19.079009 + 4584 10.071651 -55.107218 -53.98371 336.10364 33218.561 19.163975 + 4608 9.9873098 -55.109348 -53.995249 336.03665 33218.561 19.25635 + 4632 10.143888 -55.119423 -53.987857 333.74978 33218.561 19.346658 + 4656 9.7506264 -55.114772 -54.027075 332.98271 33218.561 19.435425 + 4680 9.9616769 -55.096054 -53.984814 339.20499 33218.561 19.55562 + 4704 10.271313 -55.074522 -53.928742 345.87397 33218.561 19.642652 + 4728 9.9172336 -55.098805 -53.992523 338.06318 33218.561 19.734557 + 4752 9.9556222 -55.12128 -54.010716 332.66408 33218.561 19.83859 + 4776 10.197593 -55.095293 -53.957736 339.50067 33218.561 19.947471 + 4800 10.145085 -55.108467 -53.976768 336.05115 33218.561 20.044183 + 4824 10.205523 -55.147376 -54.008934 325.56559 33218.561 20.144393 + 4848 9.8900281 -55.121598 -54.01835 331.17401 33218.561 20.243197 + 4872 10.03655 -55.100936 -53.981343 337.6777 33218.561 20.336043 + 4896 9.8120635 -55.087507 -53.992957 341.42438 33218.561 20.425498 + 4920 10.615354 -55.093335 -53.909176 342.30776 33218.561 20.519318 + 4944 10.374366 -55.06455 -53.907274 351.10607 33218.561 20.612312 + 4968 10.677474 -55.147807 -53.956718 327.85703 33218.561 20.719371 + 4992 10.558882 -55.145253 -53.967393 327.427 33218.561 20.818726 + 5016 9.4097946 -55.150835 -54.101158 321.62641 33218.561 20.914472 diff --git a/examples/gjf/trajectory.0.dcd b/examples/gjf/trajectory.0.dcd new file mode 100644 index 0000000000000000000000000000000000000000..47927e9909cfcfc86ceb2568ba1660efed5834f2 GIT binary patch literal 439092 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 z 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

YmD()?v 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

k(3eUSN@wI2>xvLzU?kG7;9mTIr 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

n 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,"Illegal fix langevin command"); iarg += 2; + } else if (strcmp(arg[iarg],"halfstep") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix langevin command"); + if (gjfflag == 0) error->all(FLERR,"GJF must be set"); + if (tallyflag == 0) error->warning(FLERR,"Careful, tally is untested"); + if (strcmp(arg[iarg+1],"no") == 0) hsflag = 0; + else if (strcmp(arg[iarg+1],"yes") == 0) hsflag = 1; + else error->all(FLERR,"Illegal fix langevin command"); + iarg += 2; } else error->all(FLERR,"Illegal fix langevin command"); } @@ -155,6 +164,8 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : flangevin = NULL; flangevin_allocated = 0; franprev = NULL; + wildcard = NULL; + lv = NULL; tforce = NULL; maxatom1 = maxatom2 = 0; @@ -163,6 +174,12 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : // no need to set peratom_flag, b/c data is for internal use only if (gjfflag) { + int mem = 6*atom->nmax*sizeof(double); + if (hsflag) mem += 3*atom->nmax*sizeof(double); + + comm->maxexchange_fix = MAX(comm->maxexchange_fix, 0); + comm->maxexchange_fix += MAX(1000, mem); + nvalues = 3; grow_arrays(atom->nmax); atom->add_callback(0); @@ -174,6 +191,14 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : franprev[i][0] = 0.0; franprev[i][1] = 0.0; franprev[i][2] = 0.0; + wildcard[i][0] = 0.0; + wildcard[i][1] = 0.0; + wildcard[i][2] = 0.0; + if (hsflag) { + lv[i][0] = 0.0; + lv[i][1] = 0.0; + lv[i][2] = 0.0; + } } } @@ -194,6 +219,8 @@ FixLangevin::~FixLangevin() if (gjfflag) { memory->destroy(franprev); + memory->destroy(wildcard); + if (hsflag) memory->destroy(lv); atom->delete_callback(id,0); } } @@ -203,6 +230,8 @@ FixLangevin::~FixLangevin() int FixLangevin::setmask() { int mask = 0; + //if (gjfflag) mask |= INITIAL_INTEGRATE; + if (gjfflag) mask |= POST_INTEGRATE; mask |= POST_FORCE; mask |= POST_FORCE_RESPA; mask |= END_OF_STEP; @@ -258,13 +287,11 @@ void FixLangevin::init() error->one(FLERR,"Fix langevin angmom requires extended particles"); } - // set force prefactors - if (!atom->rmass) { for (int i = 1; i <= atom->ntypes; i++) { gfactor1[i] = -atom->mass[i] / t_period / force->ftm2v; gfactor2[i] = sqrt(atom->mass[i]) * - sqrt(24.0*force->boltz/t_period/update->dt/force->mvv2e) / + sqrt(2.0*force->boltz/t_period/update->dt/force->mvv2e) / force->ftm2v; gfactor1[i] *= 1.0/ratio[i]; gfactor2[i] *= 1.0/sqrt(ratio[i]); @@ -277,7 +304,7 @@ void FixLangevin::init() if (strstr(update->integrate_style,"respa")) nlevels_respa = ((Respa *) update->integrate)->nlevels; - if (gjfflag) gjffac = 1.0/(1.0+update->dt/2.0/t_period); + if (gjfflag) gjffac = 1.0/sqrt(1.0+update->dt/2.0/t_period); } @@ -292,6 +319,94 @@ void FixLangevin::setup(int vflag) post_force_respa(vflag,nlevels_respa-1,0); ((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1); } + if (gjfflag && hsflag) { + + double dt = update->dt; + + // update v of atoms in group + + double **v = atom->v; + double *rmass = atom->rmass; + int *type = atom->type; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + double boltz = force->boltz; + double mvv2e = force->mvv2e; + double ftm2v = force->ftm2v; + + double gamma2; + + for (int i = 0; i < nlocal; i++) { + if (rmass) { + gamma2 = sqrt(rmass[i]) * sqrt(2.0*boltz/t_period/dt/mvv2e) / ftm2v; + gamma2 *= 1.0/sqrt(ratio[type[i]]) * tsqrt; + } else { + gamma2 = gfactor2[type[i]] * tsqrt; + } + + franprev[i][0] = gamma2*random->gaussian(); + franprev[i][1] = gamma2*random->gaussian(); + franprev[i][2] = gamma2*random->gaussian(); + wildcard[i][0] = v[i][0]; + wildcard[i][1] = v[i][1]; + wildcard[i][2] = v[i][2]; + } + } +} + +/* ---------------------------------------------------------------------- + allow for both per-type and per-atom mass +------------------------------------------------------------------------- */ + +void FixLangevin::post_integrate() +{ + double dtfm; + double dt = update->dt; + double dtf = 0.5 * dt * force->ftm2v; + + // update v of atoms in group + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + if (igroup == atom->firstgroup) nlocal = atom->nfirst; + + if (rmass) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / rmass[i]; + x[i][0] += -dt * v[i][0]; + x[i][1] += -dt * v[i][1]; + x[i][2] += -dt * v[i][2]; + v[i][0] = gjffac * (wildcard[i][0] + dtfm * franprev[i][0] + dtfm * f[i][0]); + v[i][1] = gjffac * (wildcard[i][1] + dtfm * franprev[i][1] + dtfm * f[i][1]); + v[i][2] = gjffac * (wildcard[i][2] + dtfm * franprev[i][2] + dtfm * f[i][2]); + x[i][0] += gjffac * dt * v[i][0]; + x[i][1] += gjffac * dt * v[i][1]; + x[i][2] += gjffac * dt * v[i][2]; + } + + } else { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = dtf / mass[type[i]]; + x[i][0] += -dt * v[i][0]; + x[i][1] += -dt * v[i][1]; + x[i][2] += -dt * v[i][2]; + v[i][0] = gjffac * (wildcard[i][0] + dtfm * franprev[i][0] + dtfm * f[i][0]); + v[i][1] = gjffac * (wildcard[i][1] + dtfm * franprev[i][1] + dtfm * f[i][1]); + v[i][2] = gjffac * (wildcard[i][2] + dtfm * franprev[i][2] + dtfm * f[i][2]); + x[i][0] += gjffac * dt * v[i][0]; + x[i][1] += gjffac * dt * v[i][1]; + x[i][2] += gjffac * dt * v[i][2]; + } + } } /* ---------------------------------------------------------------------- */ @@ -477,9 +592,8 @@ void FixLangevin::post_force_templated() // sum random force over all atoms in group // subtract sum/count from each atom in group - double fdrag[3],fran[3],fsum[3],fsumall[3]; + double fdrag[3],fran[3],fsum[3],fsumall[3], rantemp[3]; bigint count; - double fswap; double boltz = force->boltz; double dt = update->dt; @@ -513,7 +627,7 @@ void FixLangevin::post_force_templated() if (Tp_TSTYLEATOM) tsqrt = sqrt(tforce[i]); if (Tp_RMASS) { gamma1 = -rmass[i] / t_period / ftm2v; - gamma2 = sqrt(rmass[i]) * sqrt(24.0*boltz/t_period/dt/mvv2e) / ftm2v; + gamma2 = sqrt(rmass[i]) * sqrt(2.0*boltz/t_period/dt/mvv2e) / ftm2v; gamma1 *= 1.0/ratio[type[i]]; gamma2 *= 1.0/sqrt(ratio[type[i]]) * tsqrt; } else { @@ -521,9 +635,9 @@ void FixLangevin::post_force_templated() gamma2 = gfactor2[type[i]] * tsqrt; } - fran[0] = gamma2*(random->uniform()-0.5); - fran[1] = gamma2*(random->uniform()-0.5); - fran[2] = gamma2*(random->uniform()-0.5); + fran[0] = gamma2*random->gaussian(); + fran[1] = gamma2*random->gaussian(); + fran[2] = gamma2*random->gaussian(); if (Tp_BIAS) { temperature->remove_bias(i,v[i]); @@ -541,25 +655,20 @@ void FixLangevin::post_force_templated() } if (Tp_GJF) { - fswap = 0.5*(fran[0]+franprev[i][0]); - franprev[i][0] = fran[0]; - fran[0] = fswap; - fswap = 0.5*(fran[1]+franprev[i][1]); - franprev[i][1] = fran[1]; - fran[1] = fswap; - fswap = 0.5*(fran[2]+franprev[i][2]); - franprev[i][2] = fran[2]; - fran[2] = fswap; + wildcard[i][0] = f[i][0]; + wildcard[i][1] = f[i][1]; + wildcard[i][2] = f[i][2]; - fdrag[0] *= gjffac; - fdrag[1] *= gjffac; - fdrag[2] *= gjffac; - fran[0] *= gjffac; - fran[1] *= gjffac; - fran[2] *= gjffac; - f[i][0] *= gjffac; - f[i][1] *= gjffac; - f[i][2] *= gjffac; + rantemp[0] = fran[0]; + rantemp[1] = fran[1]; + rantemp[2] = fran[2]; + fran[0] = franprev[i][0]; + fran[1] = franprev[i][1]; + fran[2] = franprev[i][2]; + + fdrag[0] *= -2*t_period*(2*gjffac-1/gjffac-1)/dt; + fdrag[1] *= -2*t_period*(2*gjffac-1/gjffac-1)/dt; + fdrag[2] *= -2*t_period*(2*gjffac-1/gjffac-1)/dt; } f[i][0] += fdrag[0] + fran[0]; @@ -567,6 +676,11 @@ void FixLangevin::post_force_templated() f[i][2] += fdrag[2] + fran[2]; if (Tp_TALLY) { + if (Tp_GJF){ + fdrag[0] = gamma1*gjffac*v[i][0]; + fdrag[1] = gamma1*gjffac*v[i][1]; + fdrag[2] = gamma1*gjffac*v[i][2]; + } flangevin[i][0] = fdrag[0] + fran[0]; flangevin[i][1] = fdrag[1] + fran[1]; flangevin[i][2] = fdrag[2] + fran[2]; @@ -577,6 +691,19 @@ void FixLangevin::post_force_templated() fsum[1] += fran[1]; fsum[2] += fran[2]; } + + if (Tp_GJF) + { + franprev[i][0] = rantemp[0]; + franprev[i][1] = rantemp[1]; + franprev[i][2] = rantemp[2]; + + if (hsflag){ + lv[i][0] = v[i][0]; + lv[i][1] = v[i][1]; + lv[i][2] = v[i][2]; + } + } } } @@ -641,9 +768,9 @@ void FixLangevin::compute_target() input->variable->compute_atom(tvar,igroup,tforce,1,0); for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) - if (tforce[i] < 0.0) - error->one(FLERR, - "Fix langevin variable returned negative temperature"); + if (tforce[i] < 0.0) + error->one(FLERR, + "Fix langevin variable returned negative temperature"); } modify->addstep_compute(update->ntimestep + 1); } @@ -756,20 +883,41 @@ void FixLangevin::angmom_thermostat() void FixLangevin::end_of_step() { - if (!tallyflag) return; + if (!tallyflag && !gjfflag) return; double **v = atom->v; + double **f = atom->f; int *mask = atom->mask; int nlocal = atom->nlocal; energy_onestep = 0.0; - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) - energy_onestep += flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] + - flangevin[i][2]*v[i][2]; - - energy += energy_onestep*update->dt; + if (mask[i] & groupbit) { + if (gjfflag){ + f[i][0] = wildcard[i][0]; + f[i][1] = wildcard[i][1]; + f[i][2] = wildcard[i][2]; + wildcard[i][0] = v[i][0]; + wildcard[i][1] = v[i][1]; + wildcard[i][2] = v[i][2]; + if (hsflag){ + v[i][0] = lv[i][0]; + v[i][1] = lv[i][1]; + v[i][2] = lv[i][2]; + } + } + if (tallyflag && hsflag){ + energy_onestep += gjffac*(flangevin[i][0] * lv[i][0] + + flangevin[i][1] * lv[i][1] + flangevin[i][2] * lv[i][2]); + } + else if (tallyflag){ + energy_onestep += flangevin[i][0] * v[i][0] + flangevin[i][1] * v[i][1] + + flangevin[i][2] * v[i][2]; + } + } + if (tallyflag) { + energy += energy_onestep * update->dt; + } } /* ---------------------------------------------------------------------- */ @@ -869,7 +1017,8 @@ void *FixLangevin::extract(const char *str, int &dim) double FixLangevin::memory_usage() { double bytes = 0.0; - if (gjfflag) bytes += atom->nmax*3 * sizeof(double); + if (gjfflag) bytes += atom->nmax*3*2 * sizeof(double); + if (gjfflag) if (hsflag) bytes += atom->nmax*3 * sizeof(double); if (tallyflag) bytes += atom->nmax*3 * sizeof(double); if (tforce) bytes += atom->nmax * sizeof(double); return bytes; @@ -882,6 +1031,8 @@ double FixLangevin::memory_usage() void FixLangevin::grow_arrays(int nmax) { memory->grow(franprev,nmax,3,"fix_langevin:franprev"); + memory->grow(wildcard,nmax,3,"fix_langevin:wildcard"); + if (hsflag) memory->grow(lv,nmax,3,"fix_langevin:lv"); } /* ---------------------------------------------------------------------- @@ -890,8 +1041,17 @@ void FixLangevin::grow_arrays(int nmax) void FixLangevin::copy_arrays(int i, int j, int /*delflag*/) { - for (int m = 0; m < nvalues; m++) - franprev[j][m] = franprev[i][m]; + franprev[j][0] = franprev[i][0]; + franprev[j][1] = franprev[i][1]; + franprev[j][2] = franprev[i][2]; + wildcard[j][0] = wildcard[i][0]; + wildcard[j][1] = wildcard[i][1]; + wildcard[j][2] = wildcard[i][2]; + if (hsflag) { + lv[j][0] = lv[i][0]; + lv[j][1] = lv[i][1]; + lv[j][2] = lv[i][2]; + } } /* ---------------------------------------------------------------------- @@ -900,8 +1060,19 @@ void FixLangevin::copy_arrays(int i, int j, int /*delflag*/) int FixLangevin::pack_exchange(int i, double *buf) { - for (int m = 0; m < nvalues; m++) buf[m] = franprev[i][m]; - return nvalues; + int n = 0; + buf[n++] = franprev[i][0]; + buf[n++] = franprev[i][1]; + buf[n++] = franprev[i][2]; + buf[n++] = wildcard[i][0]; + buf[n++] = wildcard[i][1]; + buf[n++] = wildcard[i][2]; + if (hsflag){ + buf[n++] = lv[i][0]; + buf[n++] = lv[i][1]; + buf[n++] = lv[i][2]; + } + return n; } /* ---------------------------------------------------------------------- @@ -910,6 +1081,17 @@ int FixLangevin::pack_exchange(int i, double *buf) int FixLangevin::unpack_exchange(int nlocal, double *buf) { - for (int m = 0; m < nvalues; m++) franprev[nlocal][m] = buf[m]; - return nvalues; + int n = 0; + franprev[nlocal][0] = buf[n++]; + franprev[nlocal][1] = buf[n++]; + franprev[nlocal][2] = buf[n++]; + wildcard[nlocal][0] = buf[n++]; + wildcard[nlocal][1] = buf[n++]; + wildcard[nlocal][2] = buf[n++]; + if (hsflag){ + lv[nlocal][0] = buf[n++]; + lv[nlocal][1] = buf[n++]; + lv[nlocal][2] = buf[n++]; + } + return n; } diff --git a/src/fix_langevin.h b/src/fix_langevin.h index 4b5570ac2e..461d4e5140 100644 --- a/src/fix_langevin.h +++ b/src/fix_langevin.h @@ -31,6 +31,8 @@ class FixLangevin : public Fix { int setmask(); void init(); void setup(int); + //virtual void initial_integrate(int); + virtual void post_integrate(); virtual void post_force(int); void post_force_respa(int, int, int); virtual void end_of_step(); @@ -46,7 +48,7 @@ class FixLangevin : public Fix { int unpack_exchange(int, double *); protected: - int gjfflag,oflag,tallyflag,zeroflag,tbiasflag; + int gjfflag,oflag,tallyflag,zeroflag,tbiasflag,hsflag; int flangevin_allocated; double ascale; double t_start,t_stop,t_period,t_target; @@ -63,6 +65,9 @@ class FixLangevin : public Fix { double **flangevin; double *tforce; double **franprev; + double **lv; //lucas velocity or half-step velocity + double **wildcard; + int nvalues; char *id_temp; From e38072f365d40a915328b9656b0a27d5ac1ef4ed Mon Sep 17 00:00:00 2001 From: casievers Date: Fri, 19 Jul 2019 13:51:36 -0700 Subject: [PATCH 070/418] added lammps python example --- examples/python/gjf_python/argon.lmp | 886 +++++++++++++++++++++ examples/python/gjf_python/ff-argon.lmp | 20 + examples/python/gjf_python/gjf.py | 180 +++++ examples/python/gjf_python/lammps_tools.py | 78 ++ 4 files changed, 1164 insertions(+) create mode 100644 examples/python/gjf_python/argon.lmp create mode 100644 examples/python/gjf_python/ff-argon.lmp create mode 100644 examples/python/gjf_python/gjf.py create mode 100644 examples/python/gjf_python/lammps_tools.py diff --git a/examples/python/gjf_python/argon.lmp b/examples/python/gjf_python/argon.lmp new file mode 100644 index 0000000000..00214b4c54 --- /dev/null +++ b/examples/python/gjf_python/argon.lmp @@ -0,0 +1,886 @@ +LAMMPS description + + 864 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 32.146000 xlo xhi + 0.0000000 32.146000 ylo yhi + 0.0000000 32.146000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 2.6790000 2.6790000 + 2 2 1 0.0000000 0.0000000 2.6790000 8.0360000 + 3 3 1 0.0000000 0.0000000 2.6790000 13.3940000 + 4 4 1 0.0000000 0.0000000 2.6790000 18.7520000 + 5 5 1 0.0000000 0.0000000 2.6790000 24.1090000 + 6 6 1 0.0000000 0.0000000 2.6790000 29.4670000 + 7 7 1 0.0000000 0.0000000 8.0360000 2.6790000 + 8 8 1 0.0000000 0.0000000 8.0360000 8.0360000 + 9 9 1 0.0000000 0.0000000 8.0360000 13.3940000 + 10 10 1 0.0000000 0.0000000 8.0360000 18.7520000 + 11 11 1 0.0000000 0.0000000 8.0360000 24.1090000 + 12 12 1 0.0000000 0.0000000 8.0360000 29.4670000 + 13 13 1 0.0000000 0.0000000 13.3940000 2.6790000 + 14 14 1 0.0000000 0.0000000 13.3940000 8.0360000 + 15 15 1 0.0000000 0.0000000 13.3940000 13.3940000 + 16 16 1 0.0000000 0.0000000 13.3940000 18.7520000 + 17 17 1 0.0000000 0.0000000 13.3940000 24.1090000 + 18 18 1 0.0000000 0.0000000 13.3940000 29.4670000 + 19 19 1 0.0000000 0.0000000 18.7520000 2.6790000 + 20 20 1 0.0000000 0.0000000 18.7520000 8.0360000 + 21 21 1 0.0000000 0.0000000 18.7520000 13.3940000 + 22 22 1 0.0000000 0.0000000 18.7520000 18.7520000 + 23 23 1 0.0000000 0.0000000 18.7520000 24.1090000 + 24 24 1 0.0000000 0.0000000 18.7520000 29.4670000 + 25 25 1 0.0000000 0.0000000 24.1090000 2.6790000 + 26 26 1 0.0000000 0.0000000 24.1090000 8.0360000 + 27 27 1 0.0000000 0.0000000 24.1090000 13.3940000 + 28 28 1 0.0000000 0.0000000 24.1090000 18.7520000 + 29 29 1 0.0000000 0.0000000 24.1090000 24.1090000 + 30 30 1 0.0000000 0.0000000 24.1090000 29.4670000 + 31 31 1 0.0000000 0.0000000 29.4670000 2.6790000 + 32 32 1 0.0000000 0.0000000 29.4670000 8.0360000 + 33 33 1 0.0000000 0.0000000 29.4670000 13.3940000 + 34 34 1 0.0000000 0.0000000 29.4670000 18.7520000 + 35 35 1 0.0000000 0.0000000 29.4670000 24.1090000 + 36 36 1 0.0000000 0.0000000 29.4670000 29.4670000 + 37 37 1 0.0000000 5.3580000 2.6790000 2.6790000 + 38 38 1 0.0000000 5.3580000 2.6790000 8.0360000 + 39 39 1 0.0000000 5.3580000 2.6790000 13.3940000 + 40 40 1 0.0000000 5.3580000 2.6790000 18.7520000 + 41 41 1 0.0000000 5.3580000 2.6790000 24.1090000 + 42 42 1 0.0000000 5.3580000 2.6790000 29.4670000 + 43 43 1 0.0000000 5.3580000 8.0360000 2.6790000 + 44 44 1 0.0000000 5.3580000 8.0360000 8.0360000 + 45 45 1 0.0000000 5.3580000 8.0360000 13.3940000 + 46 46 1 0.0000000 5.3580000 8.0360000 18.7520000 + 47 47 1 0.0000000 5.3580000 8.0360000 24.1090000 + 48 48 1 0.0000000 5.3580000 8.0360000 29.4670000 + 49 49 1 0.0000000 5.3580000 13.3940000 2.6790000 + 50 50 1 0.0000000 5.3580000 13.3940000 8.0360000 + 51 51 1 0.0000000 5.3580000 13.3940000 13.3940000 + 52 52 1 0.0000000 5.3580000 13.3940000 18.7520000 + 53 53 1 0.0000000 5.3580000 13.3940000 24.1090000 + 54 54 1 0.0000000 5.3580000 13.3940000 29.4670000 + 55 55 1 0.0000000 5.3580000 18.7520000 2.6790000 + 56 56 1 0.0000000 5.3580000 18.7520000 8.0360000 + 57 57 1 0.0000000 5.3580000 18.7520000 13.3940000 + 58 58 1 0.0000000 5.3580000 18.7520000 18.7520000 + 59 59 1 0.0000000 5.3580000 18.7520000 24.1090000 + 60 60 1 0.0000000 5.3580000 18.7520000 29.4670000 + 61 61 1 0.0000000 5.3580000 24.1090000 2.6790000 + 62 62 1 0.0000000 5.3580000 24.1090000 8.0360000 + 63 63 1 0.0000000 5.3580000 24.1090000 13.3940000 + 64 64 1 0.0000000 5.3580000 24.1090000 18.7520000 + 65 65 1 0.0000000 5.3580000 24.1090000 24.1090000 + 66 66 1 0.0000000 5.3580000 24.1090000 29.4670000 + 67 67 1 0.0000000 5.3580000 29.4670000 2.6790000 + 68 68 1 0.0000000 5.3580000 29.4670000 8.0360000 + 69 69 1 0.0000000 5.3580000 29.4670000 13.3940000 + 70 70 1 0.0000000 5.3580000 29.4670000 18.7520000 + 71 71 1 0.0000000 5.3580000 29.4670000 24.1090000 + 72 72 1 0.0000000 5.3580000 29.4670000 29.4670000 + 73 73 1 0.0000000 10.7150000 2.6790000 2.6790000 + 74 74 1 0.0000000 10.7150000 2.6790000 8.0360000 + 75 75 1 0.0000000 10.7150000 2.6790000 13.3940000 + 76 76 1 0.0000000 10.7150000 2.6790000 18.7520000 + 77 77 1 0.0000000 10.7150000 2.6790000 24.1090000 + 78 78 1 0.0000000 10.7150000 2.6790000 29.4670000 + 79 79 1 0.0000000 10.7150000 8.0360000 2.6790000 + 80 80 1 0.0000000 10.7150000 8.0360000 8.0360000 + 81 81 1 0.0000000 10.7150000 8.0360000 13.3940000 + 82 82 1 0.0000000 10.7150000 8.0360000 18.7520000 + 83 83 1 0.0000000 10.7150000 8.0360000 24.1090000 + 84 84 1 0.0000000 10.7150000 8.0360000 29.4670000 + 85 85 1 0.0000000 10.7150000 13.3940000 2.6790000 + 86 86 1 0.0000000 10.7150000 13.3940000 8.0360000 + 87 87 1 0.0000000 10.7150000 13.3940000 13.3940000 + 88 88 1 0.0000000 10.7150000 13.3940000 18.7520000 + 89 89 1 0.0000000 10.7150000 13.3940000 24.1090000 + 90 90 1 0.0000000 10.7150000 13.3940000 29.4670000 + 91 91 1 0.0000000 10.7150000 18.7520000 2.6790000 + 92 92 1 0.0000000 10.7150000 18.7520000 8.0360000 + 93 93 1 0.0000000 10.7150000 18.7520000 13.3940000 + 94 94 1 0.0000000 10.7150000 18.7520000 18.7520000 + 95 95 1 0.0000000 10.7150000 18.7520000 24.1090000 + 96 96 1 0.0000000 10.7150000 18.7520000 29.4670000 + 97 97 1 0.0000000 10.7150000 24.1090000 2.6790000 + 98 98 1 0.0000000 10.7150000 24.1090000 8.0360000 + 99 99 1 0.0000000 10.7150000 24.1090000 13.3940000 + 100 100 1 0.0000000 10.7150000 24.1090000 18.7520000 + 101 101 1 0.0000000 10.7150000 24.1090000 24.1090000 + 102 102 1 0.0000000 10.7150000 24.1090000 29.4670000 + 103 103 1 0.0000000 10.7150000 29.4670000 2.6790000 + 104 104 1 0.0000000 10.7150000 29.4670000 8.0360000 + 105 105 1 0.0000000 10.7150000 29.4670000 13.3940000 + 106 106 1 0.0000000 10.7150000 29.4670000 18.7520000 + 107 107 1 0.0000000 10.7150000 29.4670000 24.1090000 + 108 108 1 0.0000000 10.7150000 29.4670000 29.4670000 + 109 109 1 0.0000000 16.0730000 2.6790000 2.6790000 + 110 110 1 0.0000000 16.0730000 2.6790000 8.0360000 + 111 111 1 0.0000000 16.0730000 2.6790000 13.3940000 + 112 112 1 0.0000000 16.0730000 2.6790000 18.7520000 + 113 113 1 0.0000000 16.0730000 2.6790000 24.1090000 + 114 114 1 0.0000000 16.0730000 2.6790000 29.4670000 + 115 115 1 0.0000000 16.0730000 8.0360000 2.6790000 + 116 116 1 0.0000000 16.0730000 8.0360000 8.0360000 + 117 117 1 0.0000000 16.0730000 8.0360000 13.3940000 + 118 118 1 0.0000000 16.0730000 8.0360000 18.7520000 + 119 119 1 0.0000000 16.0730000 8.0360000 24.1090000 + 120 120 1 0.0000000 16.0730000 8.0360000 29.4670000 + 121 121 1 0.0000000 16.0730000 13.3940000 2.6790000 + 122 122 1 0.0000000 16.0730000 13.3940000 8.0360000 + 123 123 1 0.0000000 16.0730000 13.3940000 13.3940000 + 124 124 1 0.0000000 16.0730000 13.3940000 18.7520000 + 125 125 1 0.0000000 16.0730000 13.3940000 24.1090000 + 126 126 1 0.0000000 16.0730000 13.3940000 29.4670000 + 127 127 1 0.0000000 16.0730000 18.7520000 2.6790000 + 128 128 1 0.0000000 16.0730000 18.7520000 8.0360000 + 129 129 1 0.0000000 16.0730000 18.7520000 13.3940000 + 130 130 1 0.0000000 16.0730000 18.7520000 18.7520000 + 131 131 1 0.0000000 16.0730000 18.7520000 24.1090000 + 132 132 1 0.0000000 16.0730000 18.7520000 29.4670000 + 133 133 1 0.0000000 16.0730000 24.1090000 2.6790000 + 134 134 1 0.0000000 16.0730000 24.1090000 8.0360000 + 135 135 1 0.0000000 16.0730000 24.1090000 13.3940000 + 136 136 1 0.0000000 16.0730000 24.1090000 18.7520000 + 137 137 1 0.0000000 16.0730000 24.1090000 24.1090000 + 138 138 1 0.0000000 16.0730000 24.1090000 29.4670000 + 139 139 1 0.0000000 16.0730000 29.4670000 2.6790000 + 140 140 1 0.0000000 16.0730000 29.4670000 8.0360000 + 141 141 1 0.0000000 16.0730000 29.4670000 13.3940000 + 142 142 1 0.0000000 16.0730000 29.4670000 18.7520000 + 143 143 1 0.0000000 16.0730000 29.4670000 24.1090000 + 144 144 1 0.0000000 16.0730000 29.4670000 29.4670000 + 145 145 1 0.0000000 21.4310000 2.6790000 2.6790000 + 146 146 1 0.0000000 21.4310000 2.6790000 8.0360000 + 147 147 1 0.0000000 21.4310000 2.6790000 13.3940000 + 148 148 1 0.0000000 21.4310000 2.6790000 18.7520000 + 149 149 1 0.0000000 21.4310000 2.6790000 24.1090000 + 150 150 1 0.0000000 21.4310000 2.6790000 29.4670000 + 151 151 1 0.0000000 21.4310000 8.0360000 2.6790000 + 152 152 1 0.0000000 21.4310000 8.0360000 8.0360000 + 153 153 1 0.0000000 21.4310000 8.0360000 13.3940000 + 154 154 1 0.0000000 21.4310000 8.0360000 18.7520000 + 155 155 1 0.0000000 21.4310000 8.0360000 24.1090000 + 156 156 1 0.0000000 21.4310000 8.0360000 29.4670000 + 157 157 1 0.0000000 21.4310000 13.3940000 2.6790000 + 158 158 1 0.0000000 21.4310000 13.3940000 8.0360000 + 159 159 1 0.0000000 21.4310000 13.3940000 13.3940000 + 160 160 1 0.0000000 21.4310000 13.3940000 18.7520000 + 161 161 1 0.0000000 21.4310000 13.3940000 24.1090000 + 162 162 1 0.0000000 21.4310000 13.3940000 29.4670000 + 163 163 1 0.0000000 21.4310000 18.7520000 2.6790000 + 164 164 1 0.0000000 21.4310000 18.7520000 8.0360000 + 165 165 1 0.0000000 21.4310000 18.7520000 13.3940000 + 166 166 1 0.0000000 21.4310000 18.7520000 18.7520000 + 167 167 1 0.0000000 21.4310000 18.7520000 24.1090000 + 168 168 1 0.0000000 21.4310000 18.7520000 29.4670000 + 169 169 1 0.0000000 21.4310000 24.1090000 2.6790000 + 170 170 1 0.0000000 21.4310000 24.1090000 8.0360000 + 171 171 1 0.0000000 21.4310000 24.1090000 13.3940000 + 172 172 1 0.0000000 21.4310000 24.1090000 18.7520000 + 173 173 1 0.0000000 21.4310000 24.1090000 24.1090000 + 174 174 1 0.0000000 21.4310000 24.1090000 29.4670000 + 175 175 1 0.0000000 21.4310000 29.4670000 2.6790000 + 176 176 1 0.0000000 21.4310000 29.4670000 8.0360000 + 177 177 1 0.0000000 21.4310000 29.4670000 13.3940000 + 178 178 1 0.0000000 21.4310000 29.4670000 18.7520000 + 179 179 1 0.0000000 21.4310000 29.4670000 24.1090000 + 180 180 1 0.0000000 21.4310000 29.4670000 29.4670000 + 181 181 1 0.0000000 26.7880000 2.6790000 2.6790000 + 182 182 1 0.0000000 26.7880000 2.6790000 8.0360000 + 183 183 1 0.0000000 26.7880000 2.6790000 13.3940000 + 184 184 1 0.0000000 26.7880000 2.6790000 18.7520000 + 185 185 1 0.0000000 26.7880000 2.6790000 24.1090000 + 186 186 1 0.0000000 26.7880000 2.6790000 29.4670000 + 187 187 1 0.0000000 26.7880000 8.0360000 2.6790000 + 188 188 1 0.0000000 26.7880000 8.0360000 8.0360000 + 189 189 1 0.0000000 26.7880000 8.0360000 13.3940000 + 190 190 1 0.0000000 26.7880000 8.0360000 18.7520000 + 191 191 1 0.0000000 26.7880000 8.0360000 24.1090000 + 192 192 1 0.0000000 26.7880000 8.0360000 29.4670000 + 193 193 1 0.0000000 26.7880000 13.3940000 2.6790000 + 194 194 1 0.0000000 26.7880000 13.3940000 8.0360000 + 195 195 1 0.0000000 26.7880000 13.3940000 13.3940000 + 196 196 1 0.0000000 26.7880000 13.3940000 18.7520000 + 197 197 1 0.0000000 26.7880000 13.3940000 24.1090000 + 198 198 1 0.0000000 26.7880000 13.3940000 29.4670000 + 199 199 1 0.0000000 26.7880000 18.7520000 2.6790000 + 200 200 1 0.0000000 26.7880000 18.7520000 8.0360000 + 201 201 1 0.0000000 26.7880000 18.7520000 13.3940000 + 202 202 1 0.0000000 26.7880000 18.7520000 18.7520000 + 203 203 1 0.0000000 26.7880000 18.7520000 24.1090000 + 204 204 1 0.0000000 26.7880000 18.7520000 29.4670000 + 205 205 1 0.0000000 26.7880000 24.1090000 2.6790000 + 206 206 1 0.0000000 26.7880000 24.1090000 8.0360000 + 207 207 1 0.0000000 26.7880000 24.1090000 13.3940000 + 208 208 1 0.0000000 26.7880000 24.1090000 18.7520000 + 209 209 1 0.0000000 26.7880000 24.1090000 24.1090000 + 210 210 1 0.0000000 26.7880000 24.1090000 29.4670000 + 211 211 1 0.0000000 26.7880000 29.4670000 2.6790000 + 212 212 1 0.0000000 26.7880000 29.4670000 8.0360000 + 213 213 1 0.0000000 26.7880000 29.4670000 13.3940000 + 214 214 1 0.0000000 26.7880000 29.4670000 18.7520000 + 215 215 1 0.0000000 26.7880000 29.4670000 24.1090000 + 216 216 1 0.0000000 26.7880000 29.4670000 29.4670000 + 217 217 1 0.0000000 2.6790000 5.3580000 2.6790000 + 218 218 1 0.0000000 2.6790000 5.3580000 8.0360000 + 219 219 1 0.0000000 2.6790000 5.3580000 13.3940000 + 220 220 1 0.0000000 2.6790000 5.3580000 18.7520000 + 221 221 1 0.0000000 2.6790000 5.3580000 24.1090000 + 222 222 1 0.0000000 2.6790000 5.3580000 29.4670000 + 223 223 1 0.0000000 2.6790000 10.7150000 2.6790000 + 224 224 1 0.0000000 2.6790000 10.7150000 8.0360000 + 225 225 1 0.0000000 2.6790000 10.7150000 13.3940000 + 226 226 1 0.0000000 2.6790000 10.7150000 18.7520000 + 227 227 1 0.0000000 2.6790000 10.7150000 24.1090000 + 228 228 1 0.0000000 2.6790000 10.7150000 29.4670000 + 229 229 1 0.0000000 2.6790000 16.0730000 2.6790000 + 230 230 1 0.0000000 2.6790000 16.0730000 8.0360000 + 231 231 1 0.0000000 2.6790000 16.0730000 13.3940000 + 232 232 1 0.0000000 2.6790000 16.0730000 18.7520000 + 233 233 1 0.0000000 2.6790000 16.0730000 24.1090000 + 234 234 1 0.0000000 2.6790000 16.0730000 29.4670000 + 235 235 1 0.0000000 2.6790000 21.4310000 2.6790000 + 236 236 1 0.0000000 2.6790000 21.4310000 8.0360000 + 237 237 1 0.0000000 2.6790000 21.4310000 13.3940000 + 238 238 1 0.0000000 2.6790000 21.4310000 18.7520000 + 239 239 1 0.0000000 2.6790000 21.4310000 24.1090000 + 240 240 1 0.0000000 2.6790000 21.4310000 29.4670000 + 241 241 1 0.0000000 2.6790000 26.7880000 2.6790000 + 242 242 1 0.0000000 2.6790000 26.7880000 8.0360000 + 243 243 1 0.0000000 2.6790000 26.7880000 13.3940000 + 244 244 1 0.0000000 2.6790000 26.7880000 18.7520000 + 245 245 1 0.0000000 2.6790000 26.7880000 24.1090000 + 246 246 1 0.0000000 2.6790000 26.7880000 29.4670000 + 247 247 1 0.0000000 2.6790000 32.1460000 2.6790000 + 248 248 1 0.0000000 2.6790000 32.1460000 8.0360000 + 249 249 1 0.0000000 2.6790000 32.1460000 13.3940000 + 250 250 1 0.0000000 2.6790000 32.1460000 18.7520000 + 251 251 1 0.0000000 2.6790000 32.1460000 24.1090000 + 252 252 1 0.0000000 2.6790000 32.1460000 29.4670000 + 253 253 1 0.0000000 8.0360000 5.3580000 2.6790000 + 254 254 1 0.0000000 8.0360000 5.3580000 8.0360000 + 255 255 1 0.0000000 8.0360000 5.3580000 13.3940000 + 256 256 1 0.0000000 8.0360000 5.3580000 18.7520000 + 257 257 1 0.0000000 8.0360000 5.3580000 24.1090000 + 258 258 1 0.0000000 8.0360000 5.3580000 29.4670000 + 259 259 1 0.0000000 8.0360000 10.7150000 2.6790000 + 260 260 1 0.0000000 8.0360000 10.7150000 8.0360000 + 261 261 1 0.0000000 8.0360000 10.7150000 13.3940000 + 262 262 1 0.0000000 8.0360000 10.7150000 18.7520000 + 263 263 1 0.0000000 8.0360000 10.7150000 24.1090000 + 264 264 1 0.0000000 8.0360000 10.7150000 29.4670000 + 265 265 1 0.0000000 8.0360000 16.0730000 2.6790000 + 266 266 1 0.0000000 8.0360000 16.0730000 8.0360000 + 267 267 1 0.0000000 8.0360000 16.0730000 13.3940000 + 268 268 1 0.0000000 8.0360000 16.0730000 18.7520000 + 269 269 1 0.0000000 8.0360000 16.0730000 24.1090000 + 270 270 1 0.0000000 8.0360000 16.0730000 29.4670000 + 271 271 1 0.0000000 8.0360000 21.4310000 2.6790000 + 272 272 1 0.0000000 8.0360000 21.4310000 8.0360000 + 273 273 1 0.0000000 8.0360000 21.4310000 13.3940000 + 274 274 1 0.0000000 8.0360000 21.4310000 18.7520000 + 275 275 1 0.0000000 8.0360000 21.4310000 24.1090000 + 276 276 1 0.0000000 8.0360000 21.4310000 29.4670000 + 277 277 1 0.0000000 8.0360000 26.7880000 2.6790000 + 278 278 1 0.0000000 8.0360000 26.7880000 8.0360000 + 279 279 1 0.0000000 8.0360000 26.7880000 13.3940000 + 280 280 1 0.0000000 8.0360000 26.7880000 18.7520000 + 281 281 1 0.0000000 8.0360000 26.7880000 24.1090000 + 282 282 1 0.0000000 8.0360000 26.7880000 29.4670000 + 283 283 1 0.0000000 8.0360000 32.1460000 2.6790000 + 284 284 1 0.0000000 8.0360000 32.1460000 8.0360000 + 285 285 1 0.0000000 8.0360000 32.1460000 13.3940000 + 286 286 1 0.0000000 8.0360000 32.1460000 18.7520000 + 287 287 1 0.0000000 8.0360000 32.1460000 24.1090000 + 288 288 1 0.0000000 8.0360000 32.1460000 29.4670000 + 289 289 1 0.0000000 13.3940000 5.3580000 2.6790000 + 290 290 1 0.0000000 13.3940000 5.3580000 8.0360000 + 291 291 1 0.0000000 13.3940000 5.3580000 13.3940000 + 292 292 1 0.0000000 13.3940000 5.3580000 18.7520000 + 293 293 1 0.0000000 13.3940000 5.3580000 24.1090000 + 294 294 1 0.0000000 13.3940000 5.3580000 29.4670000 + 295 295 1 0.0000000 13.3940000 10.7150000 2.6790000 + 296 296 1 0.0000000 13.3940000 10.7150000 8.0360000 + 297 297 1 0.0000000 13.3940000 10.7150000 13.3940000 + 298 298 1 0.0000000 13.3940000 10.7150000 18.7520000 + 299 299 1 0.0000000 13.3940000 10.7150000 24.1090000 + 300 300 1 0.0000000 13.3940000 10.7150000 29.4670000 + 301 301 1 0.0000000 13.3940000 16.0730000 2.6790000 + 302 302 1 0.0000000 13.3940000 16.0730000 8.0360000 + 303 303 1 0.0000000 13.3940000 16.0730000 13.3940000 + 304 304 1 0.0000000 13.3940000 16.0730000 18.7520000 + 305 305 1 0.0000000 13.3940000 16.0730000 24.1090000 + 306 306 1 0.0000000 13.3940000 16.0730000 29.4670000 + 307 307 1 0.0000000 13.3940000 21.4310000 2.6790000 + 308 308 1 0.0000000 13.3940000 21.4310000 8.0360000 + 309 309 1 0.0000000 13.3940000 21.4310000 13.3940000 + 310 310 1 0.0000000 13.3940000 21.4310000 18.7520000 + 311 311 1 0.0000000 13.3940000 21.4310000 24.1090000 + 312 312 1 0.0000000 13.3940000 21.4310000 29.4670000 + 313 313 1 0.0000000 13.3940000 26.7880000 2.6790000 + 314 314 1 0.0000000 13.3940000 26.7880000 8.0360000 + 315 315 1 0.0000000 13.3940000 26.7880000 13.3940000 + 316 316 1 0.0000000 13.3940000 26.7880000 18.7520000 + 317 317 1 0.0000000 13.3940000 26.7880000 24.1090000 + 318 318 1 0.0000000 13.3940000 26.7880000 29.4670000 + 319 319 1 0.0000000 13.3940000 32.1460000 2.6790000 + 320 320 1 0.0000000 13.3940000 32.1460000 8.0360000 + 321 321 1 0.0000000 13.3940000 32.1460000 13.3940000 + 322 322 1 0.0000000 13.3940000 32.1460000 18.7520000 + 323 323 1 0.0000000 13.3940000 32.1460000 24.1090000 + 324 324 1 0.0000000 13.3940000 32.1460000 29.4670000 + 325 325 1 0.0000000 18.7520000 5.3580000 2.6790000 + 326 326 1 0.0000000 18.7520000 5.3580000 8.0360000 + 327 327 1 0.0000000 18.7520000 5.3580000 13.3940000 + 328 328 1 0.0000000 18.7520000 5.3580000 18.7520000 + 329 329 1 0.0000000 18.7520000 5.3580000 24.1090000 + 330 330 1 0.0000000 18.7520000 5.3580000 29.4670000 + 331 331 1 0.0000000 18.7520000 10.7150000 2.6790000 + 332 332 1 0.0000000 18.7520000 10.7150000 8.0360000 + 333 333 1 0.0000000 18.7520000 10.7150000 13.3940000 + 334 334 1 0.0000000 18.7520000 10.7150000 18.7520000 + 335 335 1 0.0000000 18.7520000 10.7150000 24.1090000 + 336 336 1 0.0000000 18.7520000 10.7150000 29.4670000 + 337 337 1 0.0000000 18.7520000 16.0730000 2.6790000 + 338 338 1 0.0000000 18.7520000 16.0730000 8.0360000 + 339 339 1 0.0000000 18.7520000 16.0730000 13.3940000 + 340 340 1 0.0000000 18.7520000 16.0730000 18.7520000 + 341 341 1 0.0000000 18.7520000 16.0730000 24.1090000 + 342 342 1 0.0000000 18.7520000 16.0730000 29.4670000 + 343 343 1 0.0000000 18.7520000 21.4310000 2.6790000 + 344 344 1 0.0000000 18.7520000 21.4310000 8.0360000 + 345 345 1 0.0000000 18.7520000 21.4310000 13.3940000 + 346 346 1 0.0000000 18.7520000 21.4310000 18.7520000 + 347 347 1 0.0000000 18.7520000 21.4310000 24.1090000 + 348 348 1 0.0000000 18.7520000 21.4310000 29.4670000 + 349 349 1 0.0000000 18.7520000 26.7880000 2.6790000 + 350 350 1 0.0000000 18.7520000 26.7880000 8.0360000 + 351 351 1 0.0000000 18.7520000 26.7880000 13.3940000 + 352 352 1 0.0000000 18.7520000 26.7880000 18.7520000 + 353 353 1 0.0000000 18.7520000 26.7880000 24.1090000 + 354 354 1 0.0000000 18.7520000 26.7880000 29.4670000 + 355 355 1 0.0000000 18.7520000 32.1460000 2.6790000 + 356 356 1 0.0000000 18.7520000 32.1460000 8.0360000 + 357 357 1 0.0000000 18.7520000 32.1460000 13.3940000 + 358 358 1 0.0000000 18.7520000 32.1460000 18.7520000 + 359 359 1 0.0000000 18.7520000 32.1460000 24.1090000 + 360 360 1 0.0000000 18.7520000 32.1460000 29.4670000 + 361 361 1 0.0000000 24.1090000 5.3580000 2.6790000 + 362 362 1 0.0000000 24.1090000 5.3580000 8.0360000 + 363 363 1 0.0000000 24.1090000 5.3580000 13.3940000 + 364 364 1 0.0000000 24.1090000 5.3580000 18.7520000 + 365 365 1 0.0000000 24.1090000 5.3580000 24.1090000 + 366 366 1 0.0000000 24.1090000 5.3580000 29.4670000 + 367 367 1 0.0000000 24.1090000 10.7150000 2.6790000 + 368 368 1 0.0000000 24.1090000 10.7150000 8.0360000 + 369 369 1 0.0000000 24.1090000 10.7150000 13.3940000 + 370 370 1 0.0000000 24.1090000 10.7150000 18.7520000 + 371 371 1 0.0000000 24.1090000 10.7150000 24.1090000 + 372 372 1 0.0000000 24.1090000 10.7150000 29.4670000 + 373 373 1 0.0000000 24.1090000 16.0730000 2.6790000 + 374 374 1 0.0000000 24.1090000 16.0730000 8.0360000 + 375 375 1 0.0000000 24.1090000 16.0730000 13.3940000 + 376 376 1 0.0000000 24.1090000 16.0730000 18.7520000 + 377 377 1 0.0000000 24.1090000 16.0730000 24.1090000 + 378 378 1 0.0000000 24.1090000 16.0730000 29.4670000 + 379 379 1 0.0000000 24.1090000 21.4310000 2.6790000 + 380 380 1 0.0000000 24.1090000 21.4310000 8.0360000 + 381 381 1 0.0000000 24.1090000 21.4310000 13.3940000 + 382 382 1 0.0000000 24.1090000 21.4310000 18.7520000 + 383 383 1 0.0000000 24.1090000 21.4310000 24.1090000 + 384 384 1 0.0000000 24.1090000 21.4310000 29.4670000 + 385 385 1 0.0000000 24.1090000 26.7880000 2.6790000 + 386 386 1 0.0000000 24.1090000 26.7880000 8.0360000 + 387 387 1 0.0000000 24.1090000 26.7880000 13.3940000 + 388 388 1 0.0000000 24.1090000 26.7880000 18.7520000 + 389 389 1 0.0000000 24.1090000 26.7880000 24.1090000 + 390 390 1 0.0000000 24.1090000 26.7880000 29.4670000 + 391 391 1 0.0000000 24.1090000 32.1460000 2.6790000 + 392 392 1 0.0000000 24.1090000 32.1460000 8.0360000 + 393 393 1 0.0000000 24.1090000 32.1460000 13.3940000 + 394 394 1 0.0000000 24.1090000 32.1460000 18.7520000 + 395 395 1 0.0000000 24.1090000 32.1460000 24.1090000 + 396 396 1 0.0000000 24.1090000 32.1460000 29.4670000 + 397 397 1 0.0000000 29.4670000 5.3580000 2.6790000 + 398 398 1 0.0000000 29.4670000 5.3580000 8.0360000 + 399 399 1 0.0000000 29.4670000 5.3580000 13.3940000 + 400 400 1 0.0000000 29.4670000 5.3580000 18.7520000 + 401 401 1 0.0000000 29.4670000 5.3580000 24.1090000 + 402 402 1 0.0000000 29.4670000 5.3580000 29.4670000 + 403 403 1 0.0000000 29.4670000 10.7150000 2.6790000 + 404 404 1 0.0000000 29.4670000 10.7150000 8.0360000 + 405 405 1 0.0000000 29.4670000 10.7150000 13.3940000 + 406 406 1 0.0000000 29.4670000 10.7150000 18.7520000 + 407 407 1 0.0000000 29.4670000 10.7150000 24.1090000 + 408 408 1 0.0000000 29.4670000 10.7150000 29.4670000 + 409 409 1 0.0000000 29.4670000 16.0730000 2.6790000 + 410 410 1 0.0000000 29.4670000 16.0730000 8.0360000 + 411 411 1 0.0000000 29.4670000 16.0730000 13.3940000 + 412 412 1 0.0000000 29.4670000 16.0730000 18.7520000 + 413 413 1 0.0000000 29.4670000 16.0730000 24.1090000 + 414 414 1 0.0000000 29.4670000 16.0730000 29.4670000 + 415 415 1 0.0000000 29.4670000 21.4310000 2.6790000 + 416 416 1 0.0000000 29.4670000 21.4310000 8.0360000 + 417 417 1 0.0000000 29.4670000 21.4310000 13.3940000 + 418 418 1 0.0000000 29.4670000 21.4310000 18.7520000 + 419 419 1 0.0000000 29.4670000 21.4310000 24.1090000 + 420 420 1 0.0000000 29.4670000 21.4310000 29.4670000 + 421 421 1 0.0000000 29.4670000 26.7880000 2.6790000 + 422 422 1 0.0000000 29.4670000 26.7880000 8.0360000 + 423 423 1 0.0000000 29.4670000 26.7880000 13.3940000 + 424 424 1 0.0000000 29.4670000 26.7880000 18.7520000 + 425 425 1 0.0000000 29.4670000 26.7880000 24.1090000 + 426 426 1 0.0000000 29.4670000 26.7880000 29.4670000 + 427 427 1 0.0000000 29.4670000 32.1460000 2.6790000 + 428 428 1 0.0000000 29.4670000 32.1460000 8.0360000 + 429 429 1 0.0000000 29.4670000 32.1460000 13.3940000 + 430 430 1 0.0000000 29.4670000 32.1460000 18.7520000 + 431 431 1 0.0000000 29.4670000 32.1460000 24.1090000 + 432 432 1 0.0000000 29.4670000 32.1460000 29.4670000 + 433 433 1 0.0000000 2.6790000 2.6790000 5.3580000 + 434 434 1 0.0000000 2.6790000 2.6790000 10.7150000 + 435 435 1 0.0000000 2.6790000 2.6790000 16.0730000 + 436 436 1 0.0000000 2.6790000 2.6790000 21.4310000 + 437 437 1 0.0000000 2.6790000 2.6790000 26.7880000 + 438 438 1 0.0000000 2.6790000 2.6790000 32.1460000 + 439 439 1 0.0000000 2.6790000 8.0360000 5.3580000 + 440 440 1 0.0000000 2.6790000 8.0360000 10.7150000 + 441 441 1 0.0000000 2.6790000 8.0360000 16.0730000 + 442 442 1 0.0000000 2.6790000 8.0360000 21.4310000 + 443 443 1 0.0000000 2.6790000 8.0360000 26.7880000 + 444 444 1 0.0000000 2.6790000 8.0360000 32.1460000 + 445 445 1 0.0000000 2.6790000 13.3940000 5.3580000 + 446 446 1 0.0000000 2.6790000 13.3940000 10.7150000 + 447 447 1 0.0000000 2.6790000 13.3940000 16.0730000 + 448 448 1 0.0000000 2.6790000 13.3940000 21.4310000 + 449 449 1 0.0000000 2.6790000 13.3940000 26.7880000 + 450 450 1 0.0000000 2.6790000 13.3940000 32.1460000 + 451 451 1 0.0000000 2.6790000 18.7520000 5.3580000 + 452 452 1 0.0000000 2.6790000 18.7520000 10.7150000 + 453 453 1 0.0000000 2.6790000 18.7520000 16.0730000 + 454 454 1 0.0000000 2.6790000 18.7520000 21.4310000 + 455 455 1 0.0000000 2.6790000 18.7520000 26.7880000 + 456 456 1 0.0000000 2.6790000 18.7520000 32.1460000 + 457 457 1 0.0000000 2.6790000 24.1090000 5.3580000 + 458 458 1 0.0000000 2.6790000 24.1090000 10.7150000 + 459 459 1 0.0000000 2.6790000 24.1090000 16.0730000 + 460 460 1 0.0000000 2.6790000 24.1090000 21.4310000 + 461 461 1 0.0000000 2.6790000 24.1090000 26.7880000 + 462 462 1 0.0000000 2.6790000 24.1090000 32.1460000 + 463 463 1 0.0000000 2.6790000 29.4670000 5.3580000 + 464 464 1 0.0000000 2.6790000 29.4670000 10.7150000 + 465 465 1 0.0000000 2.6790000 29.4670000 16.0730000 + 466 466 1 0.0000000 2.6790000 29.4670000 21.4310000 + 467 467 1 0.0000000 2.6790000 29.4670000 26.7880000 + 468 468 1 0.0000000 2.6790000 29.4670000 32.1460000 + 469 469 1 0.0000000 8.0360000 2.6790000 5.3580000 + 470 470 1 0.0000000 8.0360000 2.6790000 10.7150000 + 471 471 1 0.0000000 8.0360000 2.6790000 16.0730000 + 472 472 1 0.0000000 8.0360000 2.6790000 21.4310000 + 473 473 1 0.0000000 8.0360000 2.6790000 26.7880000 + 474 474 1 0.0000000 8.0360000 2.6790000 32.1460000 + 475 475 1 0.0000000 8.0360000 8.0360000 5.3580000 + 476 476 1 0.0000000 8.0360000 8.0360000 10.7150000 + 477 477 1 0.0000000 8.0360000 8.0360000 16.0730000 + 478 478 1 0.0000000 8.0360000 8.0360000 21.4310000 + 479 479 1 0.0000000 8.0360000 8.0360000 26.7880000 + 480 480 1 0.0000000 8.0360000 8.0360000 32.1460000 + 481 481 1 0.0000000 8.0360000 13.3940000 5.3580000 + 482 482 1 0.0000000 8.0360000 13.3940000 10.7150000 + 483 483 1 0.0000000 8.0360000 13.3940000 16.0730000 + 484 484 1 0.0000000 8.0360000 13.3940000 21.4310000 + 485 485 1 0.0000000 8.0360000 13.3940000 26.7880000 + 486 486 1 0.0000000 8.0360000 13.3940000 32.1460000 + 487 487 1 0.0000000 8.0360000 18.7520000 5.3580000 + 488 488 1 0.0000000 8.0360000 18.7520000 10.7150000 + 489 489 1 0.0000000 8.0360000 18.7520000 16.0730000 + 490 490 1 0.0000000 8.0360000 18.7520000 21.4310000 + 491 491 1 0.0000000 8.0360000 18.7520000 26.7880000 + 492 492 1 0.0000000 8.0360000 18.7520000 32.1460000 + 493 493 1 0.0000000 8.0360000 24.1090000 5.3580000 + 494 494 1 0.0000000 8.0360000 24.1090000 10.7150000 + 495 495 1 0.0000000 8.0360000 24.1090000 16.0730000 + 496 496 1 0.0000000 8.0360000 24.1090000 21.4310000 + 497 497 1 0.0000000 8.0360000 24.1090000 26.7880000 + 498 498 1 0.0000000 8.0360000 24.1090000 32.1460000 + 499 499 1 0.0000000 8.0360000 29.4670000 5.3580000 + 500 500 1 0.0000000 8.0360000 29.4670000 10.7150000 + 501 501 1 0.0000000 8.0360000 29.4670000 16.0730000 + 502 502 1 0.0000000 8.0360000 29.4670000 21.4310000 + 503 503 1 0.0000000 8.0360000 29.4670000 26.7880000 + 504 504 1 0.0000000 8.0360000 29.4670000 32.1460000 + 505 505 1 0.0000000 13.3940000 2.6790000 5.3580000 + 506 506 1 0.0000000 13.3940000 2.6790000 10.7150000 + 507 507 1 0.0000000 13.3940000 2.6790000 16.0730000 + 508 508 1 0.0000000 13.3940000 2.6790000 21.4310000 + 509 509 1 0.0000000 13.3940000 2.6790000 26.7880000 + 510 510 1 0.0000000 13.3940000 2.6790000 32.1460000 + 511 511 1 0.0000000 13.3940000 8.0360000 5.3580000 + 512 512 1 0.0000000 13.3940000 8.0360000 10.7150000 + 513 513 1 0.0000000 13.3940000 8.0360000 16.0730000 + 514 514 1 0.0000000 13.3940000 8.0360000 21.4310000 + 515 515 1 0.0000000 13.3940000 8.0360000 26.7880000 + 516 516 1 0.0000000 13.3940000 8.0360000 32.1460000 + 517 517 1 0.0000000 13.3940000 13.3940000 5.3580000 + 518 518 1 0.0000000 13.3940000 13.3940000 10.7150000 + 519 519 1 0.0000000 13.3940000 13.3940000 16.0730000 + 520 520 1 0.0000000 13.3940000 13.3940000 21.4310000 + 521 521 1 0.0000000 13.3940000 13.3940000 26.7880000 + 522 522 1 0.0000000 13.3940000 13.3940000 32.1460000 + 523 523 1 0.0000000 13.3940000 18.7520000 5.3580000 + 524 524 1 0.0000000 13.3940000 18.7520000 10.7150000 + 525 525 1 0.0000000 13.3940000 18.7520000 16.0730000 + 526 526 1 0.0000000 13.3940000 18.7520000 21.4310000 + 527 527 1 0.0000000 13.3940000 18.7520000 26.7880000 + 528 528 1 0.0000000 13.3940000 18.7520000 32.1460000 + 529 529 1 0.0000000 13.3940000 24.1090000 5.3580000 + 530 530 1 0.0000000 13.3940000 24.1090000 10.7150000 + 531 531 1 0.0000000 13.3940000 24.1090000 16.0730000 + 532 532 1 0.0000000 13.3940000 24.1090000 21.4310000 + 533 533 1 0.0000000 13.3940000 24.1090000 26.7880000 + 534 534 1 0.0000000 13.3940000 24.1090000 32.1460000 + 535 535 1 0.0000000 13.3940000 29.4670000 5.3580000 + 536 536 1 0.0000000 13.3940000 29.4670000 10.7150000 + 537 537 1 0.0000000 13.3940000 29.4670000 16.0730000 + 538 538 1 0.0000000 13.3940000 29.4670000 21.4310000 + 539 539 1 0.0000000 13.3940000 29.4670000 26.7880000 + 540 540 1 0.0000000 13.3940000 29.4670000 32.1460000 + 541 541 1 0.0000000 18.7520000 2.6790000 5.3580000 + 542 542 1 0.0000000 18.7520000 2.6790000 10.7150000 + 543 543 1 0.0000000 18.7520000 2.6790000 16.0730000 + 544 544 1 0.0000000 18.7520000 2.6790000 21.4310000 + 545 545 1 0.0000000 18.7520000 2.6790000 26.7880000 + 546 546 1 0.0000000 18.7520000 2.6790000 32.1460000 + 547 547 1 0.0000000 18.7520000 8.0360000 5.3580000 + 548 548 1 0.0000000 18.7520000 8.0360000 10.7150000 + 549 549 1 0.0000000 18.7520000 8.0360000 16.0730000 + 550 550 1 0.0000000 18.7520000 8.0360000 21.4310000 + 551 551 1 0.0000000 18.7520000 8.0360000 26.7880000 + 552 552 1 0.0000000 18.7520000 8.0360000 32.1460000 + 553 553 1 0.0000000 18.7520000 13.3940000 5.3580000 + 554 554 1 0.0000000 18.7520000 13.3940000 10.7150000 + 555 555 1 0.0000000 18.7520000 13.3940000 16.0730000 + 556 556 1 0.0000000 18.7520000 13.3940000 21.4310000 + 557 557 1 0.0000000 18.7520000 13.3940000 26.7880000 + 558 558 1 0.0000000 18.7520000 13.3940000 32.1460000 + 559 559 1 0.0000000 18.7520000 18.7520000 5.3580000 + 560 560 1 0.0000000 18.7520000 18.7520000 10.7150000 + 561 561 1 0.0000000 18.7520000 18.7520000 16.0730000 + 562 562 1 0.0000000 18.7520000 18.7520000 21.4310000 + 563 563 1 0.0000000 18.7520000 18.7520000 26.7880000 + 564 564 1 0.0000000 18.7520000 18.7520000 32.1460000 + 565 565 1 0.0000000 18.7520000 24.1090000 5.3580000 + 566 566 1 0.0000000 18.7520000 24.1090000 10.7150000 + 567 567 1 0.0000000 18.7520000 24.1090000 16.0730000 + 568 568 1 0.0000000 18.7520000 24.1090000 21.4310000 + 569 569 1 0.0000000 18.7520000 24.1090000 26.7880000 + 570 570 1 0.0000000 18.7520000 24.1090000 32.1460000 + 571 571 1 0.0000000 18.7520000 29.4670000 5.3580000 + 572 572 1 0.0000000 18.7520000 29.4670000 10.7150000 + 573 573 1 0.0000000 18.7520000 29.4670000 16.0730000 + 574 574 1 0.0000000 18.7520000 29.4670000 21.4310000 + 575 575 1 0.0000000 18.7520000 29.4670000 26.7880000 + 576 576 1 0.0000000 18.7520000 29.4670000 32.1460000 + 577 577 1 0.0000000 24.1090000 2.6790000 5.3580000 + 578 578 1 0.0000000 24.1090000 2.6790000 10.7150000 + 579 579 1 0.0000000 24.1090000 2.6790000 16.0730000 + 580 580 1 0.0000000 24.1090000 2.6790000 21.4310000 + 581 581 1 0.0000000 24.1090000 2.6790000 26.7880000 + 582 582 1 0.0000000 24.1090000 2.6790000 32.1460000 + 583 583 1 0.0000000 24.1090000 8.0360000 5.3580000 + 584 584 1 0.0000000 24.1090000 8.0360000 10.7150000 + 585 585 1 0.0000000 24.1090000 8.0360000 16.0730000 + 586 586 1 0.0000000 24.1090000 8.0360000 21.4310000 + 587 587 1 0.0000000 24.1090000 8.0360000 26.7880000 + 588 588 1 0.0000000 24.1090000 8.0360000 32.1460000 + 589 589 1 0.0000000 24.1090000 13.3940000 5.3580000 + 590 590 1 0.0000000 24.1090000 13.3940000 10.7150000 + 591 591 1 0.0000000 24.1090000 13.3940000 16.0730000 + 592 592 1 0.0000000 24.1090000 13.3940000 21.4310000 + 593 593 1 0.0000000 24.1090000 13.3940000 26.7880000 + 594 594 1 0.0000000 24.1090000 13.3940000 32.1460000 + 595 595 1 0.0000000 24.1090000 18.7520000 5.3580000 + 596 596 1 0.0000000 24.1090000 18.7520000 10.7150000 + 597 597 1 0.0000000 24.1090000 18.7520000 16.0730000 + 598 598 1 0.0000000 24.1090000 18.7520000 21.4310000 + 599 599 1 0.0000000 24.1090000 18.7520000 26.7880000 + 600 600 1 0.0000000 24.1090000 18.7520000 32.1460000 + 601 601 1 0.0000000 24.1090000 24.1090000 5.3580000 + 602 602 1 0.0000000 24.1090000 24.1090000 10.7150000 + 603 603 1 0.0000000 24.1090000 24.1090000 16.0730000 + 604 604 1 0.0000000 24.1090000 24.1090000 21.4310000 + 605 605 1 0.0000000 24.1090000 24.1090000 26.7880000 + 606 606 1 0.0000000 24.1090000 24.1090000 32.1460000 + 607 607 1 0.0000000 24.1090000 29.4670000 5.3580000 + 608 608 1 0.0000000 24.1090000 29.4670000 10.7150000 + 609 609 1 0.0000000 24.1090000 29.4670000 16.0730000 + 610 610 1 0.0000000 24.1090000 29.4670000 21.4310000 + 611 611 1 0.0000000 24.1090000 29.4670000 26.7880000 + 612 612 1 0.0000000 24.1090000 29.4670000 32.1460000 + 613 613 1 0.0000000 29.4670000 2.6790000 5.3580000 + 614 614 1 0.0000000 29.4670000 2.6790000 10.7150000 + 615 615 1 0.0000000 29.4670000 2.6790000 16.0730000 + 616 616 1 0.0000000 29.4670000 2.6790000 21.4310000 + 617 617 1 0.0000000 29.4670000 2.6790000 26.7880000 + 618 618 1 0.0000000 29.4670000 2.6790000 32.1460000 + 619 619 1 0.0000000 29.4670000 8.0360000 5.3580000 + 620 620 1 0.0000000 29.4670000 8.0360000 10.7150000 + 621 621 1 0.0000000 29.4670000 8.0360000 16.0730000 + 622 622 1 0.0000000 29.4670000 8.0360000 21.4310000 + 623 623 1 0.0000000 29.4670000 8.0360000 26.7880000 + 624 624 1 0.0000000 29.4670000 8.0360000 32.1460000 + 625 625 1 0.0000000 29.4670000 13.3940000 5.3580000 + 626 626 1 0.0000000 29.4670000 13.3940000 10.7150000 + 627 627 1 0.0000000 29.4670000 13.3940000 16.0730000 + 628 628 1 0.0000000 29.4670000 13.3940000 21.4310000 + 629 629 1 0.0000000 29.4670000 13.3940000 26.7880000 + 630 630 1 0.0000000 29.4670000 13.3940000 32.1460000 + 631 631 1 0.0000000 29.4670000 18.7520000 5.3580000 + 632 632 1 0.0000000 29.4670000 18.7520000 10.7150000 + 633 633 1 0.0000000 29.4670000 18.7520000 16.0730000 + 634 634 1 0.0000000 29.4670000 18.7520000 21.4310000 + 635 635 1 0.0000000 29.4670000 18.7520000 26.7880000 + 636 636 1 0.0000000 29.4670000 18.7520000 32.1460000 + 637 637 1 0.0000000 29.4670000 24.1090000 5.3580000 + 638 638 1 0.0000000 29.4670000 24.1090000 10.7150000 + 639 639 1 0.0000000 29.4670000 24.1090000 16.0730000 + 640 640 1 0.0000000 29.4670000 24.1090000 21.4310000 + 641 641 1 0.0000000 29.4670000 24.1090000 26.7880000 + 642 642 1 0.0000000 29.4670000 24.1090000 32.1460000 + 643 643 1 0.0000000 29.4670000 29.4670000 5.3580000 + 644 644 1 0.0000000 29.4670000 29.4670000 10.7150000 + 645 645 1 0.0000000 29.4670000 29.4670000 16.0730000 + 646 646 1 0.0000000 29.4670000 29.4670000 21.4310000 + 647 647 1 0.0000000 29.4670000 29.4670000 26.7880000 + 648 648 1 0.0000000 29.4670000 29.4670000 32.1460000 + 649 649 1 0.0000000 0.0000000 5.3580000 5.3580000 + 650 650 1 0.0000000 0.0000000 5.3580000 10.7150000 + 651 651 1 0.0000000 0.0000000 5.3580000 16.0730000 + 652 652 1 0.0000000 0.0000000 5.3580000 21.4310000 + 653 653 1 0.0000000 0.0000000 5.3580000 26.7880000 + 654 654 1 0.0000000 0.0000000 5.3580000 32.1460000 + 655 655 1 0.0000000 0.0000000 10.7150000 5.3580000 + 656 656 1 0.0000000 0.0000000 10.7150000 10.7150000 + 657 657 1 0.0000000 0.0000000 10.7150000 16.0730000 + 658 658 1 0.0000000 0.0000000 10.7150000 21.4310000 + 659 659 1 0.0000000 0.0000000 10.7150000 26.7880000 + 660 660 1 0.0000000 0.0000000 10.7150000 32.1460000 + 661 661 1 0.0000000 0.0000000 16.0730000 5.3580000 + 662 662 1 0.0000000 0.0000000 16.0730000 10.7150000 + 663 663 1 0.0000000 0.0000000 16.0730000 16.0730000 + 664 664 1 0.0000000 0.0000000 16.0730000 21.4310000 + 665 665 1 0.0000000 0.0000000 16.0730000 26.7880000 + 666 666 1 0.0000000 0.0000000 16.0730000 32.1460000 + 667 667 1 0.0000000 0.0000000 21.4310000 5.3580000 + 668 668 1 0.0000000 0.0000000 21.4310000 10.7150000 + 669 669 1 0.0000000 0.0000000 21.4310000 16.0730000 + 670 670 1 0.0000000 0.0000000 21.4310000 21.4310000 + 671 671 1 0.0000000 0.0000000 21.4310000 26.7880000 + 672 672 1 0.0000000 0.0000000 21.4310000 32.1460000 + 673 673 1 0.0000000 0.0000000 26.7880000 5.3580000 + 674 674 1 0.0000000 0.0000000 26.7880000 10.7150000 + 675 675 1 0.0000000 0.0000000 26.7880000 16.0730000 + 676 676 1 0.0000000 0.0000000 26.7880000 21.4310000 + 677 677 1 0.0000000 0.0000000 26.7880000 26.7880000 + 678 678 1 0.0000000 0.0000000 26.7880000 32.1460000 + 679 679 1 0.0000000 0.0000000 32.1460000 5.3580000 + 680 680 1 0.0000000 0.0000000 32.1460000 10.7150000 + 681 681 1 0.0000000 0.0000000 32.1460000 16.0730000 + 682 682 1 0.0000000 0.0000000 32.1460000 21.4310000 + 683 683 1 0.0000000 0.0000000 32.1460000 26.7880000 + 684 684 1 0.0000000 0.0000000 32.1460000 32.1460000 + 685 685 1 0.0000000 5.3580000 5.3580000 5.3580000 + 686 686 1 0.0000000 5.3580000 5.3580000 10.7150000 + 687 687 1 0.0000000 5.3580000 5.3580000 16.0730000 + 688 688 1 0.0000000 5.3580000 5.3580000 21.4310000 + 689 689 1 0.0000000 5.3580000 5.3580000 26.7880000 + 690 690 1 0.0000000 5.3580000 5.3580000 32.1460000 + 691 691 1 0.0000000 5.3580000 10.7150000 5.3580000 + 692 692 1 0.0000000 5.3580000 10.7150000 10.7150000 + 693 693 1 0.0000000 5.3580000 10.7150000 16.0730000 + 694 694 1 0.0000000 5.3580000 10.7150000 21.4310000 + 695 695 1 0.0000000 5.3580000 10.7150000 26.7880000 + 696 696 1 0.0000000 5.3580000 10.7150000 32.1460000 + 697 697 1 0.0000000 5.3580000 16.0730000 5.3580000 + 698 698 1 0.0000000 5.3580000 16.0730000 10.7150000 + 699 699 1 0.0000000 5.3580000 16.0730000 16.0730000 + 700 700 1 0.0000000 5.3580000 16.0730000 21.4310000 + 701 701 1 0.0000000 5.3580000 16.0730000 26.7880000 + 702 702 1 0.0000000 5.3580000 16.0730000 32.1460000 + 703 703 1 0.0000000 5.3580000 21.4310000 5.3580000 + 704 704 1 0.0000000 5.3580000 21.4310000 10.7150000 + 705 705 1 0.0000000 5.3580000 21.4310000 16.0730000 + 706 706 1 0.0000000 5.3580000 21.4310000 21.4310000 + 707 707 1 0.0000000 5.3580000 21.4310000 26.7880000 + 708 708 1 0.0000000 5.3580000 21.4310000 32.1460000 + 709 709 1 0.0000000 5.3580000 26.7880000 5.3580000 + 710 710 1 0.0000000 5.3580000 26.7880000 10.7150000 + 711 711 1 0.0000000 5.3580000 26.7880000 16.0730000 + 712 712 1 0.0000000 5.3580000 26.7880000 21.4310000 + 713 713 1 0.0000000 5.3580000 26.7880000 26.7880000 + 714 714 1 0.0000000 5.3580000 26.7880000 32.1460000 + 715 715 1 0.0000000 5.3580000 32.1460000 5.3580000 + 716 716 1 0.0000000 5.3580000 32.1460000 10.7150000 + 717 717 1 0.0000000 5.3580000 32.1460000 16.0730000 + 718 718 1 0.0000000 5.3580000 32.1460000 21.4310000 + 719 719 1 0.0000000 5.3580000 32.1460000 26.7880000 + 720 720 1 0.0000000 5.3580000 32.1460000 32.1460000 + 721 721 1 0.0000000 10.7150000 5.3580000 5.3580000 + 722 722 1 0.0000000 10.7150000 5.3580000 10.7150000 + 723 723 1 0.0000000 10.7150000 5.3580000 16.0730000 + 724 724 1 0.0000000 10.7150000 5.3580000 21.4310000 + 725 725 1 0.0000000 10.7150000 5.3580000 26.7880000 + 726 726 1 0.0000000 10.7150000 5.3580000 32.1460000 + 727 727 1 0.0000000 10.7150000 10.7150000 5.3580000 + 728 728 1 0.0000000 10.7150000 10.7150000 10.7150000 + 729 729 1 0.0000000 10.7150000 10.7150000 16.0730000 + 730 730 1 0.0000000 10.7150000 10.7150000 21.4310000 + 731 731 1 0.0000000 10.7150000 10.7150000 26.7880000 + 732 732 1 0.0000000 10.7150000 10.7150000 32.1460000 + 733 733 1 0.0000000 10.7150000 16.0730000 5.3580000 + 734 734 1 0.0000000 10.7150000 16.0730000 10.7150000 + 735 735 1 0.0000000 10.7150000 16.0730000 16.0730000 + 736 736 1 0.0000000 10.7150000 16.0730000 21.4310000 + 737 737 1 0.0000000 10.7150000 16.0730000 26.7880000 + 738 738 1 0.0000000 10.7150000 16.0730000 32.1460000 + 739 739 1 0.0000000 10.7150000 21.4310000 5.3580000 + 740 740 1 0.0000000 10.7150000 21.4310000 10.7150000 + 741 741 1 0.0000000 10.7150000 21.4310000 16.0730000 + 742 742 1 0.0000000 10.7150000 21.4310000 21.4310000 + 743 743 1 0.0000000 10.7150000 21.4310000 26.7880000 + 744 744 1 0.0000000 10.7150000 21.4310000 32.1460000 + 745 745 1 0.0000000 10.7150000 26.7880000 5.3580000 + 746 746 1 0.0000000 10.7150000 26.7880000 10.7150000 + 747 747 1 0.0000000 10.7150000 26.7880000 16.0730000 + 748 748 1 0.0000000 10.7150000 26.7880000 21.4310000 + 749 749 1 0.0000000 10.7150000 26.7880000 26.7880000 + 750 750 1 0.0000000 10.7150000 26.7880000 32.1460000 + 751 751 1 0.0000000 10.7150000 32.1460000 5.3580000 + 752 752 1 0.0000000 10.7150000 32.1460000 10.7150000 + 753 753 1 0.0000000 10.7150000 32.1460000 16.0730000 + 754 754 1 0.0000000 10.7150000 32.1460000 21.4310000 + 755 755 1 0.0000000 10.7150000 32.1460000 26.7880000 + 756 756 1 0.0000000 10.7150000 32.1460000 32.1460000 + 757 757 1 0.0000000 16.0730000 5.3580000 5.3580000 + 758 758 1 0.0000000 16.0730000 5.3580000 10.7150000 + 759 759 1 0.0000000 16.0730000 5.3580000 16.0730000 + 760 760 1 0.0000000 16.0730000 5.3580000 21.4310000 + 761 761 1 0.0000000 16.0730000 5.3580000 26.7880000 + 762 762 1 0.0000000 16.0730000 5.3580000 32.1460000 + 763 763 1 0.0000000 16.0730000 10.7150000 5.3580000 + 764 764 1 0.0000000 16.0730000 10.7150000 10.7150000 + 765 765 1 0.0000000 16.0730000 10.7150000 16.0730000 + 766 766 1 0.0000000 16.0730000 10.7150000 21.4310000 + 767 767 1 0.0000000 16.0730000 10.7150000 26.7880000 + 768 768 1 0.0000000 16.0730000 10.7150000 32.1460000 + 769 769 1 0.0000000 16.0730000 16.0730000 5.3580000 + 770 770 1 0.0000000 16.0730000 16.0730000 10.7150000 + 771 771 1 0.0000000 16.0730000 16.0730000 16.0730000 + 772 772 1 0.0000000 16.0730000 16.0730000 21.4310000 + 773 773 1 0.0000000 16.0730000 16.0730000 26.7880000 + 774 774 1 0.0000000 16.0730000 16.0730000 32.1460000 + 775 775 1 0.0000000 16.0730000 21.4310000 5.3580000 + 776 776 1 0.0000000 16.0730000 21.4310000 10.7150000 + 777 777 1 0.0000000 16.0730000 21.4310000 16.0730000 + 778 778 1 0.0000000 16.0730000 21.4310000 21.4310000 + 779 779 1 0.0000000 16.0730000 21.4310000 26.7880000 + 780 780 1 0.0000000 16.0730000 21.4310000 32.1460000 + 781 781 1 0.0000000 16.0730000 26.7880000 5.3580000 + 782 782 1 0.0000000 16.0730000 26.7880000 10.7150000 + 783 783 1 0.0000000 16.0730000 26.7880000 16.0730000 + 784 784 1 0.0000000 16.0730000 26.7880000 21.4310000 + 785 785 1 0.0000000 16.0730000 26.7880000 26.7880000 + 786 786 1 0.0000000 16.0730000 26.7880000 32.1460000 + 787 787 1 0.0000000 16.0730000 32.1460000 5.3580000 + 788 788 1 0.0000000 16.0730000 32.1460000 10.7150000 + 789 789 1 0.0000000 16.0730000 32.1460000 16.0730000 + 790 790 1 0.0000000 16.0730000 32.1460000 21.4310000 + 791 791 1 0.0000000 16.0730000 32.1460000 26.7880000 + 792 792 1 0.0000000 16.0730000 32.1460000 32.1460000 + 793 793 1 0.0000000 21.4310000 5.3580000 5.3580000 + 794 794 1 0.0000000 21.4310000 5.3580000 10.7150000 + 795 795 1 0.0000000 21.4310000 5.3580000 16.0730000 + 796 796 1 0.0000000 21.4310000 5.3580000 21.4310000 + 797 797 1 0.0000000 21.4310000 5.3580000 26.7880000 + 798 798 1 0.0000000 21.4310000 5.3580000 32.1460000 + 799 799 1 0.0000000 21.4310000 10.7150000 5.3580000 + 800 800 1 0.0000000 21.4310000 10.7150000 10.7150000 + 801 801 1 0.0000000 21.4310000 10.7150000 16.0730000 + 802 802 1 0.0000000 21.4310000 10.7150000 21.4310000 + 803 803 1 0.0000000 21.4310000 10.7150000 26.7880000 + 804 804 1 0.0000000 21.4310000 10.7150000 32.1460000 + 805 805 1 0.0000000 21.4310000 16.0730000 5.3580000 + 806 806 1 0.0000000 21.4310000 16.0730000 10.7150000 + 807 807 1 0.0000000 21.4310000 16.0730000 16.0730000 + 808 808 1 0.0000000 21.4310000 16.0730000 21.4310000 + 809 809 1 0.0000000 21.4310000 16.0730000 26.7880000 + 810 810 1 0.0000000 21.4310000 16.0730000 32.1460000 + 811 811 1 0.0000000 21.4310000 21.4310000 5.3580000 + 812 812 1 0.0000000 21.4310000 21.4310000 10.7150000 + 813 813 1 0.0000000 21.4310000 21.4310000 16.0730000 + 814 814 1 0.0000000 21.4310000 21.4310000 21.4310000 + 815 815 1 0.0000000 21.4310000 21.4310000 26.7880000 + 816 816 1 0.0000000 21.4310000 21.4310000 32.1460000 + 817 817 1 0.0000000 21.4310000 26.7880000 5.3580000 + 818 818 1 0.0000000 21.4310000 26.7880000 10.7150000 + 819 819 1 0.0000000 21.4310000 26.7880000 16.0730000 + 820 820 1 0.0000000 21.4310000 26.7880000 21.4310000 + 821 821 1 0.0000000 21.4310000 26.7880000 26.7880000 + 822 822 1 0.0000000 21.4310000 26.7880000 32.1460000 + 823 823 1 0.0000000 21.4310000 32.1460000 5.3580000 + 824 824 1 0.0000000 21.4310000 32.1460000 10.7150000 + 825 825 1 0.0000000 21.4310000 32.1460000 16.0730000 + 826 826 1 0.0000000 21.4310000 32.1460000 21.4310000 + 827 827 1 0.0000000 21.4310000 32.1460000 26.7880000 + 828 828 1 0.0000000 21.4310000 32.1460000 32.1460000 + 829 829 1 0.0000000 26.7880000 5.3580000 5.3580000 + 830 830 1 0.0000000 26.7880000 5.3580000 10.7150000 + 831 831 1 0.0000000 26.7880000 5.3580000 16.0730000 + 832 832 1 0.0000000 26.7880000 5.3580000 21.4310000 + 833 833 1 0.0000000 26.7880000 5.3580000 26.7880000 + 834 834 1 0.0000000 26.7880000 5.3580000 32.1460000 + 835 835 1 0.0000000 26.7880000 10.7150000 5.3580000 + 836 836 1 0.0000000 26.7880000 10.7150000 10.7150000 + 837 837 1 0.0000000 26.7880000 10.7150000 16.0730000 + 838 838 1 0.0000000 26.7880000 10.7150000 21.4310000 + 839 839 1 0.0000000 26.7880000 10.7150000 26.7880000 + 840 840 1 0.0000000 26.7880000 10.7150000 32.1460000 + 841 841 1 0.0000000 26.7880000 16.0730000 5.3580000 + 842 842 1 0.0000000 26.7880000 16.0730000 10.7150000 + 843 843 1 0.0000000 26.7880000 16.0730000 16.0730000 + 844 844 1 0.0000000 26.7880000 16.0730000 21.4310000 + 845 845 1 0.0000000 26.7880000 16.0730000 26.7880000 + 846 846 1 0.0000000 26.7880000 16.0730000 32.1460000 + 847 847 1 0.0000000 26.7880000 21.4310000 5.3580000 + 848 848 1 0.0000000 26.7880000 21.4310000 10.7150000 + 849 849 1 0.0000000 26.7880000 21.4310000 16.0730000 + 850 850 1 0.0000000 26.7880000 21.4310000 21.4310000 + 851 851 1 0.0000000 26.7880000 21.4310000 26.7880000 + 852 852 1 0.0000000 26.7880000 21.4310000 32.1460000 + 853 853 1 0.0000000 26.7880000 26.7880000 5.3580000 + 854 854 1 0.0000000 26.7880000 26.7880000 10.7150000 + 855 855 1 0.0000000 26.7880000 26.7880000 16.0730000 + 856 856 1 0.0000000 26.7880000 26.7880000 21.4310000 + 857 857 1 0.0000000 26.7880000 26.7880000 26.7880000 + 858 858 1 0.0000000 26.7880000 26.7880000 32.1460000 + 859 859 1 0.0000000 26.7880000 32.1460000 5.3580000 + 860 860 1 0.0000000 26.7880000 32.1460000 10.7150000 + 861 861 1 0.0000000 26.7880000 32.1460000 16.0730000 + 862 862 1 0.0000000 26.7880000 32.1460000 21.4310000 + 863 863 1 0.0000000 26.7880000 32.1460000 26.7880000 + 864 864 1 0.0000000 26.7880000 32.1460000 32.1460000 + diff --git a/examples/python/gjf_python/ff-argon.lmp b/examples/python/gjf_python/ff-argon.lmp new file mode 100644 index 0000000000..b6f7bc931a --- /dev/null +++ b/examples/python/gjf_python/ff-argon.lmp @@ -0,0 +1,20 @@ +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Ar equal 1 + +############# +#Atom Masses# +############# + +mass ${Ar} 39.903 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style lj/cubic +pair_coeff * * 0.0102701 3.42 + diff --git a/examples/python/gjf_python/gjf.py b/examples/python/gjf_python/gjf.py new file mode 100644 index 0000000000..37fc28bb79 --- /dev/null +++ b/examples/python/gjf_python/gjf.py @@ -0,0 +1,180 @@ +"""Made by Charlie Sievers Ph.D. Candidate, UC Davis, Donadio Lab 2019""" + +from mpi4py import MPI +from lammps import lammps +import lammps_tools as lt +import numpy as np + +comm = MPI.COMM_WORLD +rank = comm.Get_rank() + +""" LAMMPS VARIABLES """ + +# new file or restart +run_no = 0 + +# data files +infile = "argon.lmp" +restart_file = "final_restart.{}".format(run_no) +ff_file = "ff-argon.lmp" +outfile = "output.dat" + +# write final_restart +write_final_restart = False + +# random numbers +seed0 = 2357 +seed1 = 26588 +seed2 = 10669 + +# MD Parameters +# number of steps +nsteps = 50000 +# timestep +# dt = 0.001 +# starting simulation temp +temp_start = 10 +# final simulation temp +temp_final = 10 +# relaxation time +trel = 1 +# trajectory frequency +ntraj = 0 + +# Ensemble 0 = GJF u, 1 = GJF v, 2 = Nose-Hoover, 3 = Langevin, 4 = BDP (Currently all NVT) +ensemble = 0 + +# Output Parameters +nthermo = 200 +nout = int(nsteps / nthermo) # Important + +# output to screen and log file? +lammps_output = False +# Lammps Thermo +thermo = False + +python_output = True + +# Write output to file? +write_output = False + +if write_output is True: + data = open("{}".format(outfile), "w") + +if python_output is True: + if rank == 0: + print("dt, temp, ke, fke, pe, fpe") + +for j in range(20): + + # timestep + dt = 0.005*(j+1) + + if lammps_output is True: + lmp = lammps() + else: + lmp = lammps(cmdargs=["-screen", "none", "-log", "none"]) + + lmp.command("atom_style full") + lmp.command("units metal") + lmp.command("processors * * *") + lmp.command("neighbor 1 bin") + lmp.command("boundary p p p") + + if run_no is 0: + lmp.command("read_data {}".format(infile)) + else: + lmp.command("read_restart final_restart".format(run_no-1)) + + if thermo is True: + lmp.command("thermo_style custom time temp pe ke press vol cpu") + lmp.command("thermo {}".format(nthermo)) + lmp.command("thermo_modify flush yes") + + lmp.file("{}".format(ff_file)) + lmp.command("timestep {}".format(dt)) + + # get_per_atom_compute example with dim of two and within a group + # lmp.command("region rand block 5 20 5 20 5 20") + # lmp.command("group rand region rand") + # lmp.command("compute x rand property/atom x y") + # test = get_per_atom_compute(comm, lmp, "x", 2, group="rand") + + lmp.command("compute ke all ke/atom") + + lmp.command("compute pe all pe") + + if ntraj != 0: + lmp.command("dump 1 all dcd {} trajectory.dcd".format(ntraj)) + lmp.command("dump_modify 1 unwrap yes") + + if run_no == 0: + lmp.command("velocity all create {} {} mom yes dist gaussian".format(temp_start, seed0)) + lmp.command("fix nve all nve") + + if ensemble == 0: + # gjf u + lmp.command("fix lang all langevin {} {} {} {} gjf yes halfstep yes".format( + temp_start, temp_final, trel, seed1)) + elif ensemble == 1: + # gjf v + lmp.command("fix lang all langevin {} {} {} {} gjf yes".format( + temp_start, temp_final, trel, seed1)) + elif ensemble == 2: + # NH + lmp.command("fix nvt all nvt temp {} {} {}".format( + temp_start, temp_final, trel)) + elif ensemble == 3: + # lang + lmp.command("fix lang all langevin {} {} {} {} tally yes zero yes".format( + temp_start, temp_final, trel, seed1)) + elif ensemble == 4: + # BDP + lmp.command("fix stoch all temp/csvr {} {} {} {}".format( + temp_start, temp_final, trel, seed1)) + + natoms = lmp.extract_global("natoms", 0) + nlocal = lmp.extract_global("nlocal", 0) + ke_sum = lt.get_per_atom_compute(comm, lmp, "ke") + ke_2 = ke_sum**2 + pe_sum = 0 + pe_2 = 0 + temp_sum = 0 + + for i in range(nout): + nlocal = lmp.extract_global("nlocal", 0) + lmp.command("run {} pre no post no".format(nthermo)) + temp = lmp.extract_compute("thermo_temp", 0, 0) + ke = lt.get_per_atom_compute(comm, lmp, "ke") + pe = lmp.extract_compute("pe", 0, 0) + ke_sum += ke + ke_2 += ke**2 + pe_sum += pe + pe_2 += pe**2 + temp_sum += temp + + if python_output is True: + if rank == 0: + print("Time: {:.6f}, Temp: {:.6f}, KE: {:.6f}, PE: {:.6f}".format( + i*nthermo*dt, temp, ke.sum(), pe)) + + if write_final_restart is True: + lmp.command("write_restart {}".format(restart_file)) + + if rank == 0: + ke = ke_sum.sum() / (nout + 1) + fke = (np.sqrt((ke_2 - ke_sum ** 2 / (nout + 1)) / (nout + 1))).sum() + pe = pe_sum / nout + fpe = np.sqrt((pe_2 - pe_sum ** 2 / nout) / nout) + temp = temp_sum / nout + + if python_output is True: + print(dt, temp, ke, fke, pe, fpe) + + if write_output is True: + data.write("{:.6f} {:.6f} {:.6f} {:.6f} {:.6f} {:.6f}\n".format( + dt, temp, ke, fke, pe, fpe)) + data.flush() + +if write_output is True: + data.close() diff --git a/examples/python/gjf_python/lammps_tools.py b/examples/python/gjf_python/lammps_tools.py new file mode 100644 index 0000000000..f9f25eaa28 --- /dev/null +++ b/examples/python/gjf_python/lammps_tools.py @@ -0,0 +1,78 @@ +"""Made by Charlie Sievers Ph.D. Candidate, UC Davis, Donadio Lab 2019""" + +from mpi4py import MPI +import numpy as np +import ctypes as ctypes + +""" USEFULL LAMMPS FUNCTION """ + + +def get_nlocal(lmp): + + nlocal = lmp.extract_global("nlocal", 0) + + return nlocal + + +def get_aid(lmp, group=None): + + if group is None: + c_aid = lmp.extract_atom("id", 0) + ptr = ctypes.cast(c_aid, ctypes.POINTER(ctypes.c_int32 * get_nlocal(lmp))) + aid = np.frombuffer(ptr.contents, dtype=np.int32) + else: + try: + c_aid = lmp.extract_variable("aid", group, 1) + ptr = ctypes.cast(c_aid, ctypes.POINTER(ctypes.c_double * get_nlocal(lmp))) + aid = np.frombuffer(ptr.contents, dtype=np.double) + except ValueError: + lmp.command("variable aid atom id") + aid = get_aid(lmp, group) + + return aid + + +def get_per_atom_compute(comm, lmp, name, dim=1, dtype="double", group=None): + laid = get_aid(lmp, group) + nlocal = get_nlocal(lmp) + ngroup = comm.allgather(laid) + type = dim + if dim > 1: + type = 2 + for array in ngroup: + try: + aid = np.concatenate((aid, array)) + except UnboundLocalError: + aid = array + if dtype == "double": + mem_type = ctypes.c_double + elif dtype == "integer": + mem_type = ctypes.c_int + elif dtype == "bigint": + mem_type = ctypes.c_int32 + else: + print("{} not implemented".format(dtype)) + return + + tmp = lmp.extract_compute(name, 1, type) + if type == 1: + ptr = ctypes.cast(tmp, ctypes.POINTER(mem_type * nlocal)) + else: + ptr = ctypes.cast(tmp[0], ctypes.POINTER(mem_type * nlocal * dim)) + lcompute = comm.allgather(np.frombuffer(ptr.contents).reshape((-1, dim))) + for array in lcompute: + try: + compute = np.concatenate((compute, array)) + except UnboundLocalError: + compute = array + + aid = np.expand_dims(aid, axis=1) + + compute = np.concatenate((aid, compute), axis=-1) + compute = compute[compute[..., 0] != 0] + compute = compute[compute[..., 0].argsort()][..., 1:] + + if dim == 1: + compute = np.squeeze(compute, axis=-1) + + return compute \ No newline at end of file From e0454ce5809dac84d953d4ea1349546d6ce6c9c4 Mon Sep 17 00:00:00 2001 From: casievers Date: Fri, 19 Jul 2019 17:21:01 -0700 Subject: [PATCH 071/418] updated gjf in fix_langevin --- src/fix_langevin.cpp | 39 +++++++++++---------------------------- src/fix_langevin.h | 2 +- 2 files changed, 12 insertions(+), 29 deletions(-) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index 0db60c14cf..e530a4615d 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -174,11 +174,11 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : // no need to set peratom_flag, b/c data is for internal use only if (gjfflag) { - int mem = 6*atom->nmax*sizeof(double); - if (hsflag) mem += 3*atom->nmax*sizeof(double); - - comm->maxexchange_fix = MAX(comm->maxexchange_fix, 0); - comm->maxexchange_fix += MAX(1000, mem); + //int mem = 6*atom->nmax*sizeof(double); + //if (hsflag) mem += 3*atom->nmax*sizeof(double); +// + //comm->maxexchange_fix = MAX(comm->maxexchange_fix, 0); + //comm->maxexchange_fix += MAX(1000, mem); nvalues = 3; grow_arrays(atom->nmax); @@ -230,7 +230,6 @@ FixLangevin::~FixLangevin() int FixLangevin::setmask() { int mask = 0; - //if (gjfflag) mask |= INITIAL_INTEGRATE; if (gjfflag) mask |= POST_INTEGRATE; mask |= POST_FORCE; mask |= POST_FORCE_RESPA; @@ -319,35 +318,19 @@ void FixLangevin::setup(int vflag) post_force_respa(vflag,nlevels_respa-1,0); ((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1); } - if (gjfflag && hsflag) { + if (gjfflag) { - double dt = update->dt; // update v of atoms in group - - double **v = atom->v; - double *rmass = atom->rmass; - int *type = atom->type; + double ** v = atom->v; + double **f = atom->f; int nlocal = atom->nlocal; if (igroup == atom->firstgroup) nlocal = atom->nfirst; - double boltz = force->boltz; - double mvv2e = force->mvv2e; - double ftm2v = force->ftm2v; - - double gamma2; - for (int i = 0; i < nlocal; i++) { - if (rmass) { - gamma2 = sqrt(rmass[i]) * sqrt(2.0*boltz/t_period/dt/mvv2e) / ftm2v; - gamma2 *= 1.0/sqrt(ratio[type[i]]) * tsqrt; - } else { - gamma2 = gfactor2[type[i]] * tsqrt; - } - - franprev[i][0] = gamma2*random->gaussian(); - franprev[i][1] = gamma2*random->gaussian(); - franprev[i][2] = gamma2*random->gaussian(); + f[i][0] = wildcard[i][0]; + f[i][1] = wildcard[i][1]; + f[i][2] = wildcard[i][2]; wildcard[i][0] = v[i][0]; wildcard[i][1] = v[i][1]; wildcard[i][2] = v[i][2]; diff --git a/src/fix_langevin.h b/src/fix_langevin.h index 461d4e5140..888734de04 100644 --- a/src/fix_langevin.h +++ b/src/fix_langevin.h @@ -65,7 +65,7 @@ class FixLangevin : public Fix { double **flangevin; double *tforce; double **franprev; - double **lv; //lucas velocity or half-step velocity + double **lv; //2GJ velocity or half-step velocity double **wildcard; int nvalues; From f4da63287042207967a76897717eb3712925ff32 Mon Sep 17 00:00:00 2001 From: casievers Date: Mon, 22 Jul 2019 13:48:02 -0700 Subject: [PATCH 072/418] recent change to gjf tally (not working) --- examples/gjf/out.argon | 249 ---------------------------------- examples/gjf/trajectory.0.dcd | Bin 439092 -> 0 bytes src/fix_langevin.cpp | 7 +- 3 files changed, 6 insertions(+), 250 deletions(-) delete mode 100644 examples/gjf/out.argon delete mode 100644 examples/gjf/trajectory.0.dcd diff --git a/examples/gjf/out.argon b/examples/gjf/out.argon deleted file mode 100644 index 8dda569157..0000000000 --- a/examples/gjf/out.argon +++ /dev/null @@ -1,249 +0,0 @@ -LAMMPS (1 Feb 2019) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) - using 1 OpenMP thread(s) per MPI task -Reading data file ... - orthogonal box = (0 0 0) to (32.146 32.146 32.146) - 1 by 2 by 2 MPI processor grid - reading atoms ... - 864 atoms -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors -Setting up the ensembles -WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) -WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) -WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) -WARNING: Careful, tally is untested (src/fix_langevin.cpp:145) -Doing Molecular dynamics -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 6.94072 - ghost atom cutoff = 6.94072 - binsize = 3.47036, bins = 10 10 10 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair lj/cubic, perpetual - attributes: half, newton on - pair build: half/bin/newton - stencil: half/bin/3d/newton - bin: standard -Setting up Verlet run ... - Unit style : metal - Current step : 0 - Time step : 0.12 -Per MPI rank memory allocation (min/avg/max) = 6.847 | 6.847 | 6.847 Mbytes -Time Temp PotEng TotEng Press Volume CPU - 0 10 -56.207655 -55.09214 33.340921 33218.561 0 - 24 10.156356 -55.092888 -53.959932 339.40964 33218.561 0.082175482 - 48 9.6121006 -55.07262 -54.000376 344.56765 33218.561 0.19529325 - 72 9.8187467 -55.16687 -54.071574 318.85979 33218.561 0.29643488 - 96 9.5421385 -55.151229 -54.086789 322.8842 33218.561 0.38801357 - 120 10.295035 -55.12919 -53.980763 332.00171 33218.561 0.47607262 - 144 10.331608 -55.09907 -53.946563 339.28896 33218.561 0.57389224 - 168 10.154698 -55.058246 -53.925475 349.03253 33218.561 0.65481471 - 192 9.858198 -55.127583 -54.027886 330.09298 33218.561 0.74437734 - 216 9.6658918 -55.10812 -54.029875 334.28383 33218.561 0.8278495 - 240 9.6801591 -55.102386 -54.02255 336.27242 33218.561 0.91167379 - 264 10.685658 -55.046238 -53.854237 355.0448 33218.561 1.0023789 - 288 10.387727 -55.08427 -53.925504 343.87247 33218.561 1.0960371 - 312 10.231132 -55.120428 -53.97913 333.22463 33218.561 1.2382998 - 336 10.20896 -55.075142 -53.936317 344.88438 33218.561 1.3420489 - 360 9.7876538 -55.165008 -54.07318 319.14962 33218.561 1.42782 - 384 9.9872551 -55.13881 -54.024717 327.82471 33218.561 1.5417666 - 408 9.5362734 -55.063733 -53.999947 346.50545 33218.561 1.6328366 - 432 10.262638 -55.126608 -53.981796 332.16342 33218.561 1.7242996 - 456 9.9228239 -55.122119 -54.015214 332.26261 33218.561 1.8124888 - 480 9.7026324 -55.17057 -54.088227 317.84818 33218.561 1.900233 - 504 10.028762 -55.082465 -53.963741 343.04257 33218.561 1.989605 - 528 9.8227851 -55.121222 -54.025476 332.42857 33218.561 2.0708802 - 552 10.208672 -55.100242 -53.961449 338.68109 33218.561 2.1527217 - 576 10.180849 -55.124065 -53.988376 331.29516 33218.561 2.238126 - 600 9.6467252 -55.119533 -54.043427 332.43109 33218.561 2.323443 - 624 10.041885 -55.173802 -54.053614 318.48579 33218.561 2.4046151 - 648 10.151597 -55.111725 -53.979299 334.66227 33218.561 2.4902161 - 672 9.7719111 -55.060111 -53.970039 348.55249 33218.561 2.5800372 - 696 10.476688 -55.088109 -53.919419 342.94922 33218.561 2.6731395 - 720 10.517805 -55.113604 -53.940327 335.47342 33218.561 2.760651 - 744 10.006466 -55.045085 -53.928848 353.53813 33218.561 2.8537894 - 768 10.201492 -55.081598 -53.943606 343.3206 33218.561 2.9404115 - 792 10.117738 -55.077806 -53.949157 345.31093 33218.561 3.030765 - 816 10.362288 -55.11635 -53.960421 333.9045 33218.561 3.1177356 - 840 10.204164 -55.097619 -53.959329 338.82717 33218.561 3.2091886 - 864 10.147722 -55.101372 -53.969378 338.19682 33218.561 3.3003742 - 888 9.9265037 -55.111394 -54.004077 334.08116 33218.561 3.395341 - 912 10.206403 -55.132181 -53.993642 328.89904 33218.561 3.4882881 - 936 10.28639 -55.093317 -53.945855 340.61244 33218.561 3.5764735 - 960 9.8028822 -55.078802 -53.985276 343.5904 33218.561 3.7056267 - 984 10.492755 -55.121321 -53.950839 334.62697 33218.561 3.8055611 - 1008 10.621569 -55.088588 -53.903736 343.33166 33218.561 3.9144807 - 1032 10.006729 -55.113459 -53.997193 334.43025 33218.561 4.0189888 - 1056 10.099853 -55.068035 -53.941381 347.42158 33218.561 4.1391664 - 1080 10.254232 -55.066685 -53.92281 347.15777 33218.561 4.2443953 - 1104 9.9495142 -55.13686 -54.026977 327.63107 33218.561 4.3368342 - 1128 10.377108 -55.08846 -53.930878 344.13083 33218.561 4.4287748 - 1152 10.036981 -55.114643 -53.995003 334.88053 33218.561 4.526868 - 1176 10.144779 -55.097125 -53.965459 339.698 33218.561 4.6614049 - 1200 10.075844 -55.14695 -54.022974 326.05911 33218.561 4.799835 - 1224 10.183695 -55.121716 -53.98571 332.75772 33218.561 4.8908897 - 1248 10.581369 -55.027954 -53.847587 359.06251 33218.561 4.9839788 - 1272 10.158269 -55.105173 -53.972003 337.52964 33218.561 5.0918646 - 1296 9.8776072 -55.064085 -53.962223 347.15648 33218.561 5.2291209 - 1320 10.38161 -55.118366 -53.960282 335.17767 33218.561 5.3570446 - 1344 9.9528146 -55.141937 -54.031685 326.27117 33218.561 5.4584705 - 1368 9.8024326 -55.117808 -54.024332 332.99835 33218.561 5.5557818 - 1392 10.35447 -55.110235 -53.955179 336.80412 33218.561 5.6467392 - 1416 10.199061 -55.105641 -53.96792 337.36785 33218.561 5.7476527 - 1440 9.6868779 -55.087316 -54.00673 340.9166 33218.561 5.8432207 - 1464 10.093238 -55.049436 -53.92352 352.27563 33218.561 5.9471521 - 1488 9.7578808 -55.123935 -54.035429 329.93926 33218.561 6.0495014 - 1512 10.099979 -55.205426 -54.078758 309.26166 33218.561 6.1612976 - 1536 10.172944 -55.087106 -53.952299 342.93395 33218.561 6.2506202 - 1560 10.51771 -55.107635 -53.934369 340.1967 33218.561 6.3379856 - 1584 10.044994 -55.101362 -53.980828 339.03163 33218.561 6.4362567 - 1608 9.624758 -55.146246 -54.07259 324.32486 33218.561 6.5385845 - 1632 9.9135215 -55.097278 -53.99141 338.69162 33218.561 6.6452786 - 1656 9.863681 -55.070523 -53.970214 345.84608 33218.561 6.7518212 - 1680 10.138513 -55.127065 -53.996099 330.40757 33218.561 6.8775188 - 1704 10.382237 -55.070572 -53.912417 347.074 33218.561 7.0126448 - 1728 10.72487 -55.081147 -53.884771 345.83623 33218.561 7.1384216 - 1752 9.829431 -55.131041 -54.034553 328.57652 33218.561 7.2616419 - 1776 9.9135662 -55.100556 -53.994682 336.52238 33218.561 7.4193201 - 1800 10.41873 -55.097116 -53.934891 340.24798 33218.561 7.5570544 - 1824 10.151782 -55.03231 -53.899864 357.3654 33218.561 7.6872905 - 1848 10.42307 -55.043808 -53.881099 355.71677 33218.561 7.7933885 - 1872 10.276862 -55.085016 -53.938616 344.46273 33218.561 7.8887472 - 1896 9.7681373 -55.146507 -54.056857 324.84323 33218.561 7.9977923 - 1920 9.6624824 -55.103214 -54.025349 336.06397 33218.561 8.090235 - 1944 10.153504 -55.049175 -53.916536 352.36339 33218.561 8.1923703 - 1968 10.191954 -55.098741 -53.961813 338.8667 33218.561 8.3320906 - 1992 9.92167 -55.117079 -54.010302 332.96497 33218.561 8.4774437 - 2016 9.5737281 -55.091141 -54.023178 339.41837 33218.561 8.6149527 - 2040 10.600908 -55.092717 -53.91017 342.71852 33218.561 8.7639523 - 2064 9.9214513 -55.099904 -53.993151 337.46799 33218.561 8.898087 - 2088 9.9256258 -55.082224 -53.975005 342.85042 33218.561 9.0130784 - 2112 10.345379 -55.112923 -53.95888 335.81471 33218.561 9.1422766 - 2136 9.8876649 -55.079254 -53.97627 343.05764 33218.561 9.2885707 - 2160 10.04492 -55.074876 -53.95435 344.82419 33218.561 9.3876103 - 2184 10.028705 -55.063961 -53.945244 347.70549 33218.561 9.500967 - 2208 10.412572 -55.136316 -53.974778 329.8188 33218.561 9.5900362 - 2232 10.404205 -55.09913 -53.938525 339.77542 33218.561 9.7048353 - 2256 9.5694135 -55.139021 -54.071538 326.37473 33218.561 9.8045958 - 2280 10.244745 -55.134529 -53.991713 329.19392 33218.561 9.8968908 - 2304 9.9129922 -55.116192 -54.010382 333.14326 33218.561 9.9818651 - 2328 10.167027 -55.08241 -53.948263 343.08135 33218.561 10.068683 - 2352 10.262045 -55.144327 -53.999581 327.40876 33218.561 10.155937 - 2376 10.520934 -55.073147 -53.899521 347.6998 33218.561 10.246316 - 2400 9.9628692 -55.122001 -54.010628 331.25369 33218.561 10.336833 - 2424 10.565531 -55.157113 -53.978512 325.14897 33218.561 10.452039 - 2448 10.03709 -55.096409 -53.976756 338.29607 33218.561 10.537936 - 2472 9.384311 -55.141821 -54.094987 324.23247 33218.561 10.628689 - 2496 9.8019362 -55.105685 -54.012264 335.97239 33218.561 10.717287 - 2520 10.31114 -55.078831 -53.928608 345.42395 33218.561 10.818756 - 2544 10.407237 -55.148382 -53.987439 325.94421 33218.561 10.910801 - 2568 10.257967 -55.041348 -53.897056 355.73261 33218.561 11.004221 - 2592 9.8425807 -55.139428 -54.041474 328.28096 33218.561 11.101295 - 2616 10.140697 -55.100238 -53.969028 338.76319 33218.561 11.192211 - 2640 9.7102818 -55.136288 -54.053091 326.7053 33218.561 11.280277 - 2664 10.120372 -55.128779 -53.999836 330.71707 33218.561 11.369001 - 2688 10.232537 -55.120614 -53.979159 333.35087 33218.561 11.464652 - 2712 10.032526 -55.094761 -53.975618 339.97984 33218.561 11.559387 - 2736 9.8791 -55.121998 -54.01997 332.32556 33218.561 11.649679 - 2760 9.891483 -55.120919 -54.017509 331.32614 33218.561 11.742604 - 2784 10.201053 -55.165525 -54.027582 320.39272 33218.561 11.85274 - 2808 10.238648 -55.096449 -53.954312 340.06316 33218.561 11.939782 - 2832 9.8692851 -55.068632 -53.967699 346.77535 33218.561 12.036655 - 2856 10.179976 -55.128413 -53.992822 331.5662 33218.561 12.123227 - 2880 9.7656315 -55.1468 -54.057429 324.02612 33218.561 12.213117 - 2904 9.7991628 -55.049191 -53.95608 352.45738 33218.561 12.326761 - 2928 10.581767 -55.093293 -53.912881 341.37292 33218.561 12.417633 - 2952 10.546144 -55.07452 -53.898081 347.02025 33218.561 12.52701 - 2976 9.8306008 -55.14762 -54.051002 323.45715 33218.561 12.633522 - 3000 10.033532 -55.076433 -53.957178 345.36812 33218.561 12.72627 - 3024 10.046266 -55.085775 -53.965099 342.47786 33218.561 12.816242 - 3048 10.176777 -55.133013 -53.997778 329.04144 33218.561 12.903175 - 3072 9.9778064 -55.143787 -54.030748 326.75284 33218.561 13.014329 - 3096 10.516223 -55.110144 -53.937043 336.802 33218.561 13.104673 - 3120 9.6561157 -55.138699 -54.061544 325.6652 33218.561 13.207371 - 3144 10.237043 -55.060968 -53.91901 349.44011 33218.561 13.303442 - 3168 9.9704264 -55.123073 -54.010857 332.19725 33218.561 13.391877 - 3192 10.493307 -55.144402 -53.973858 327.15485 33218.561 13.482857 - 3216 10.022171 -55.141782 -54.023794 326.08249 33218.561 13.574484 - 3240 9.6957248 -55.137865 -54.056292 326.04858 33218.561 13.671408 - 3264 9.9685299 -55.124301 -54.012297 331.9015 33218.561 13.760186 - 3288 10.413707 -55.153604 -53.99194 324.32939 33218.561 13.877604 - 3312 10.022953 -55.103422 -53.985346 337.52066 33218.561 13.977562 - 3336 10.044478 -55.110297 -53.98982 334.48379 33218.561 14.065563 - 3360 9.8593734 -55.130623 -54.030795 327.71748 33218.561 14.15952 - 3384 9.9269422 -55.107979 -54.000613 335.18173 33218.561 14.258064 - 3408 10.288049 -55.092276 -53.944629 340.71484 33218.561 14.36211 - 3432 9.9702156 -55.08732 -53.975128 341.72171 33218.561 14.452123 - 3456 10.246178 -55.091669 -53.948692 341.62844 33218.561 14.555775 - 3480 10.559292 -55.086917 -53.909012 343.70626 33218.561 14.645718 - 3504 10.652207 -55.050897 -53.862628 354.46979 33218.561 14.797422 - 3528 9.9835266 -55.0557 -53.942023 350.74747 33218.561 14.895716 - 3552 10.240934 -55.123217 -53.980825 332.26434 33218.561 15.023796 - 3576 10.406519 -55.093536 -53.932674 341.54029 33218.561 15.203252 - 3600 10.406733 -55.095168 -53.934282 341.22192 33218.561 15.303986 - 3624 9.9877484 -55.154231 -54.040083 323.55633 33218.561 15.398883 - 3648 10.391829 -55.110208 -53.950984 337.09219 33218.561 15.49042 - 3672 10.368995 -55.069591 -53.912914 346.82649 33218.561 15.582259 - 3696 10.362939 -55.109012 -53.953011 337.32216 33218.561 15.679316 - 3720 10.465254 -55.136214 -53.968799 331.22288 33218.561 15.773303 - 3744 9.8238226 -55.10114 -54.005278 338.12616 33218.561 15.86905 - 3768 10.205504 -55.101263 -53.962824 339.04196 33218.561 15.960072 - 3792 9.9589987 -55.118883 -54.007942 332.84318 33218.561 16.047055 - 3816 10.253382 -55.117513 -53.973732 334.42101 33218.561 16.148412 - 3840 10.262393 -55.069549 -53.924764 349.084 33218.561 16.235391 - 3864 9.7367167 -55.078288 -53.992142 342.48207 33218.561 16.329112 - 3888 10.171202 -55.134701 -54.000088 329.5847 33218.561 16.415353 - 3912 10.01925 -55.145139 -54.027477 326.65074 33218.561 16.526334 - 3936 10.053638 -55.038151 -53.916653 355.74893 33218.561 16.618524 - 3960 10.044055 -55.058382 -53.937953 349.01834 33218.561 16.712577 - 3984 10.382422 -55.099216 -53.941041 339.28099 33218.561 16.79941 - 4008 9.97927 -55.09284 -53.979637 339.07225 33218.561 16.904198 - 4032 9.6782319 -55.126143 -54.046522 329.0201 33218.561 16.991454 - 4056 9.6593809 -55.123677 -54.046159 329.89833 33218.561 17.097172 - 4080 10.442896 -55.141149 -53.976229 327.9899 33218.561 17.189364 - 4104 9.9571109 -55.08588 -53.975149 341.3746 33218.561 17.294147 - 4128 10.44943 -55.087946 -53.922296 343.09435 33218.561 17.387357 - 4152 10.040581 -55.171939 -54.051897 317.85348 33218.561 17.500905 - 4176 10.089442 -55.128713 -54.00322 330.29121 33218.561 17.588891 - 4200 10.316156 -55.123219 -53.972436 333.59382 33218.561 17.679254 - 4224 10.177245 -55.095671 -53.960384 339.34498 33218.561 17.770569 - 4248 9.7129183 -55.135335 -54.051844 328.25125 33218.561 17.857728 - 4272 10.231838 -55.099554 -53.958177 339.64015 33218.561 17.944226 - 4296 9.9737677 -55.117885 -54.005297 333.07248 33218.561 18.034105 - 4320 10.004955 -55.116155 -54.000088 333.52271 33218.561 18.129644 - 4344 9.5938901 -55.133824 -54.063612 327.84171 33218.561 18.215476 - 4368 9.8954562 -55.131603 -54.02775 329.0813 33218.561 18.306539 - 4392 10.439732 -55.100379 -53.935812 339.81679 33218.561 18.395651 - 4416 9.934513 -55.08449 -53.97628 341.74441 33218.561 18.484506 - 4440 10.025998 -55.136771 -54.018356 327.73718 33218.561 18.593946 - 4464 9.9304451 -55.101817 -53.994061 338.1801 33218.561 18.684011 - 4488 10.344371 -55.085856 -53.931926 342.91721 33218.561 18.782399 - 4512 10.033193 -55.091778 -53.972561 339.85728 33218.561 18.879666 - 4536 9.2361614 -55.169375 -54.139067 316.67597 33218.561 18.983667 - 4560 9.5786289 -55.179976 -54.111465 314.76415 33218.561 19.079009 - 4584 10.071651 -55.107218 -53.98371 336.10364 33218.561 19.163975 - 4608 9.9873098 -55.109348 -53.995249 336.03665 33218.561 19.25635 - 4632 10.143888 -55.119423 -53.987857 333.74978 33218.561 19.346658 - 4656 9.7506264 -55.114772 -54.027075 332.98271 33218.561 19.435425 - 4680 9.9616769 -55.096054 -53.984814 339.20499 33218.561 19.55562 - 4704 10.271313 -55.074522 -53.928742 345.87397 33218.561 19.642652 - 4728 9.9172336 -55.098805 -53.992523 338.06318 33218.561 19.734557 - 4752 9.9556222 -55.12128 -54.010716 332.66408 33218.561 19.83859 - 4776 10.197593 -55.095293 -53.957736 339.50067 33218.561 19.947471 - 4800 10.145085 -55.108467 -53.976768 336.05115 33218.561 20.044183 - 4824 10.205523 -55.147376 -54.008934 325.56559 33218.561 20.144393 - 4848 9.8900281 -55.121598 -54.01835 331.17401 33218.561 20.243197 - 4872 10.03655 -55.100936 -53.981343 337.6777 33218.561 20.336043 - 4896 9.8120635 -55.087507 -53.992957 341.42438 33218.561 20.425498 - 4920 10.615354 -55.093335 -53.909176 342.30776 33218.561 20.519318 - 4944 10.374366 -55.06455 -53.907274 351.10607 33218.561 20.612312 - 4968 10.677474 -55.147807 -53.956718 327.85703 33218.561 20.719371 - 4992 10.558882 -55.145253 -53.967393 327.427 33218.561 20.818726 - 5016 9.4097946 -55.150835 -54.101158 321.62641 33218.561 20.914472 diff --git a/examples/gjf/trajectory.0.dcd b/examples/gjf/trajectory.0.dcd deleted file mode 100644 index 47927e9909cfcfc86ceb2568ba1660efed5834f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439092 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 z 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

YmD()?v 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

k(3eUSN@wI2>xvLzU?kG7;9mTIr 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

n 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 != update->beginstep){ fdrag[0] = gamma1*gjffac*v[i][0]; fdrag[1] = gamma1*gjffac*v[i][1]; fdrag[2] = gamma1*gjffac*v[i][2]; } + else if (Tp_GJF && update->ntimestep == update->beginstep){ + fdrag[0] = 0.0; + fdrag[1] = 0.0; + fdrag[2] = 0.0; + } flangevin[i][0] = fdrag[0] + fran[0]; flangevin[i][1] = fdrag[1] + fran[1]; flangevin[i][2] = fdrag[2] + fran[2]; From 3ae8d5ea702eae92d1645608b2e75abcb119fcc6 Mon Sep 17 00:00:00 2001 From: casievers Date: Tue, 23 Jul 2019 18:41:31 -0700 Subject: [PATCH 073/418] debugging gjf tally --- src/fix_langevin.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index 3aa8a8e6ff..33f5c3d2d9 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -660,9 +660,12 @@ void FixLangevin::post_force_templated() if (Tp_TALLY) { if (Tp_GJF && update->ntimestep != update->beginstep){ - fdrag[0] = gamma1*gjffac*v[i][0]; - fdrag[1] = gamma1*gjffac*v[i][1]; - fdrag[2] = gamma1*gjffac*v[i][2]; + fdrag[0] = gamma1*gjffac*gjffac*v[i][0]; + fdrag[1] = gamma1*gjffac*gjffac*v[i][1]; + fdrag[2] = gamma1*gjffac*gjffac*v[i][2]; + fran[0] *= gjffac; + fran[1] *= gjffac; + fran[2] *= gjffac; } else if (Tp_GJF && update->ntimestep == update->beginstep){ fdrag[0] = 0.0; @@ -894,14 +897,8 @@ void FixLangevin::end_of_step() v[i][2] = lv[i][2]; } } - if (tallyflag && hsflag){ - energy_onestep += gjffac*(flangevin[i][0] * lv[i][0] + - flangevin[i][1] * lv[i][1] + flangevin[i][2] * lv[i][2]); - } - else if (tallyflag){ - energy_onestep += flangevin[i][0] * v[i][0] + flangevin[i][1] * v[i][1] + - flangevin[i][2] * v[i][2]; - } + energy_onestep += flangevin[i][0] * v[i][0] + flangevin[i][1] * v[i][1] + + flangevin[i][2] * v[i][2]; } if (tallyflag) { energy += energy_onestep * update->dt; @@ -977,8 +974,11 @@ double FixLangevin::compute_scalar() } // convert midstep energy back to previous fullstep energy - - double energy_me = energy - 0.5*energy_onestep*update->dt; + double energy_me; + if (gjfflag) + energy_me = energy - energy_onestep*update->dt; + else + energy_me = energy - 0.5*energy_onestep*update->dt; double energy_all; MPI_Allreduce(&energy_me,&energy_all,1,MPI_DOUBLE,MPI_SUM,world); From b97e856bf29d87059a8236230ff5591af2748838 Mon Sep 17 00:00:00 2001 From: casievers Date: Wed, 24 Jul 2019 16:05:25 -0700 Subject: [PATCH 074/418] Tally works and example readmes addes --- examples/gjf/README.md | 13 +++++++++++++ examples/python/gjf_python/README.md | 18 ++++++++++++++++++ src/fix_langevin.cpp | 5 ----- 3 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 examples/gjf/README.md create mode 100644 examples/python/gjf_python/README.md diff --git a/examples/gjf/README.md b/examples/gjf/README.md new file mode 100644 index 0000000000..e285ab8510 --- /dev/null +++ b/examples/gjf/README.md @@ -0,0 +1,13 @@ +# LAMMPS GJF-2GJ THERMOSTAT EXAMPLE W/ PYTHON + +## GJF-2GJ THERMOSTAT + +This directory contains the ingredients to run an NVT simulation using the GJF-2GJ thermostat. + +Example: +``` +NP=4 #number of processors +mpirun -np $NP lmp_mpi -in.argon -out.argon +``` + +## Required LAMMPS packages: MOLECULE package diff --git a/examples/python/gjf_python/README.md b/examples/python/gjf_python/README.md new file mode 100644 index 0000000000..707289f02d --- /dev/null +++ b/examples/python/gjf_python/README.md @@ -0,0 +1,18 @@ +# LAMMPS GJF-2GJ THERMOSTAT EXAMPLE W/ PYTHON + +## GJF-2GJ THERMOSTAT + +This directory contains a python script to run NVT simulations using the GJF-2GJ thermostat. +The script will vary the timestep and write thermodynamic output to screen. +This script has True/False options to change how you would like to dump/write your output. + +Example: +``` +NP=4 #number of processors +mpirun -np $NP python gjf.py +``` + +## Required LAMMPS packages: MOLECULE package +## LAMMPS COMPILE MODE: SHLIB +## LAMMPS OPTIONAL INSTALL: make install-python +## Required Python packages: mpi4py diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index 33f5c3d2d9..bfd170262e 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -174,11 +174,6 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : // no need to set peratom_flag, b/c data is for internal use only if (gjfflag) { - //int mem = 6*atom->nmax*sizeof(double); - //if (hsflag) mem += 3*atom->nmax*sizeof(double); -// - //comm->maxexchange_fix = MAX(comm->maxexchange_fix, 0); - //comm->maxexchange_fix += MAX(1000, mem); nvalues = 3; grow_arrays(atom->nmax); From 13f4fe186be64b10ed387f716dcf6cfb91a904c7 Mon Sep 17 00:00:00 2001 From: casievers Date: Wed, 24 Jul 2019 16:30:02 -0700 Subject: [PATCH 075/418] Updated examples/gjf/README.md --- examples/gjf/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/gjf/README.md b/examples/gjf/README.md index e285ab8510..79ef4cd2e1 100644 --- a/examples/gjf/README.md +++ b/examples/gjf/README.md @@ -1,4 +1,4 @@ -# LAMMPS GJF-2GJ THERMOSTAT EXAMPLE W/ PYTHON +# LAMMPS GJF-2GJ THERMOSTAT EXAMPLE ## GJF-2GJ THERMOSTAT From 14d38596050af99f9b3bbeef49bf229b18031b41 Mon Sep 17 00:00:00 2001 From: casievers Date: Wed, 24 Jul 2019 20:08:00 -0700 Subject: [PATCH 076/418] Added GJF-2GJ authors --- src/fix_langevin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index bfd170262e..ea0929a236 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -14,6 +14,8 @@ /* ---------------------------------------------------------------------- Contributing authors: Carolyn Phillips (U Mich), reservoir energy tally Aidan Thompson (SNL) GJF formulation + Charles Sievers (UC Davis) GJF-2GJ Implementation + Niels Gronbech-Jensen (UC Davis) GJF-2GJ Formulation ------------------------------------------------------------------------- */ #include From cc96ea1ded97f45f394bc9abec28b5e649a3368b Mon Sep 17 00:00:00 2001 From: casievers Date: Thu, 25 Jul 2019 15:23:01 -0700 Subject: [PATCH 077/418] added respa compatability, and simplified examples --- .gitignore | 3 + examples/gjf/README.md | 2 +- examples/gjf/in.argon | 162 -------------------------------------- examples/gjf/in.gjf.vfull | 23 ++++++ examples/gjf/in.gjf.vhalf | 23 ++++++ 5 files changed, 50 insertions(+), 163 deletions(-) delete mode 100644 examples/gjf/in.argon create mode 100644 examples/gjf/in.gjf.vfull create mode 100644 examples/gjf/in.gjf.vhalf diff --git a/.gitignore b/.gitignore index f9dda49da6..3e4ebcda98 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,6 @@ Thumbs.db /Makefile /cmake_install.cmake /lmp + +#python example +/example/python/gjf_python diff --git a/examples/gjf/README.md b/examples/gjf/README.md index 79ef4cd2e1..e6886cb2dd 100644 --- a/examples/gjf/README.md +++ b/examples/gjf/README.md @@ -7,7 +7,7 @@ This directory contains the ingredients to run an NVT simulation using the GJF-2 Example: ``` NP=4 #number of processors -mpirun -np $NP lmp_mpi -in.argon -out.argon +mpirun -np $NP lmp_mpi -in.gjf.vhalf ``` ## Required LAMMPS packages: MOLECULE package diff --git a/examples/gjf/in.argon b/examples/gjf/in.argon deleted file mode 100644 index 271882c665..0000000000 --- a/examples/gjf/in.argon +++ /dev/null @@ -1,162 +0,0 @@ -###############################mm -# Atom style - charge/vdw/bonded# -################################# -atom_style full - -############################################## -#Units Metal : eV - ps - angstrom - bar# -# Real : kcal/mol - fs - angstrom - atm# -############################################## -units metal - -############ -#Run number# -############ -variable run_no equal 0 # is it a restart? -variable res_no equal ${run_no}-1 # restart file number - -####################################### -#Random Seeds and Domain Decomposition# -####################################### -variable iseed0 equal 2357 -variable iseed1 equal 26488 -variable iseed2 equal 10669 -processors * * * - -########### -#Data File# -########### -variable inpfile string argon.lmp -variable resfile string final_restart.${res_no} -variable ff_file string ff-argon.lmp - -########## -#Run Type# -########## -variable minimise equal 0 #Energy Minimization -variable md equal 1 #Plain MD - -############################### -#Molecular Dynamics Parameters# -############################### -variable run_no equal 0 # is it a restart? - -variable ens equal 9 # ensemble (0=nve, 1=nvt, 2=npt, 3=ber, 4=lang, 5=stoc, 6=vres, 7=stoch, 8=gjf) -variable ts equal 0.120 # simulation timestep (time units) -variable nequil equal 0 # number of equilibration steps -variable nsteps equal 200000 # number of MD steps -#variable nsteps equal 20 # number of MD steps - -variable temp_s equal 10 # starting temperature -variable temp_f equal 10 # final simulation temperature -variable trel equal 1 # thermostat relaxation time -variable tscale equal 1 # thermostat relaxation freq - vel rescaling only -variable deltat equal 1 # maximum temperature change - vel rescaling only - -variable npttype string iso # type of NPT (iso, aniso, tri, z...) -variable pres equal 1.01325 # pressure (NPT runs only) -variable prel equal 1.0 # barostat relaxation time - -neighbor 1 bin - -################### -#Output Parameters# -################### -variable ntraj equal 1000 # trajectory output frequency - all system -variable ntraj_s equal -100 # trajectory output frequency - solute only -variable nthermo equal 200 # thermodynamic data output frequency - -################################ -#Energy Minimization Parameters# -################################ -variable mtraj equal 1 # trajectory output frequency - all system -variable etol equal 1e-5 # % change in energy -variable ftol equal 1e-5 # max force threshold (force units) -variable maxiter equal 10000 # max # of iterations - -######################## -#3D Periodic Simulation# -######################## -boundary p p p - -############################# -#Reading the input structure# -############################# -if "${run_no} == 0" then "read_data ${inpfile}" else "read_restart ${resfile}" - -############# -#Force Field# -############# -include ${ff_file} - -###################### -#Thermodynamic Output# -###################### -variable str_basic string 'step time pe temp press' - -#MD ensemble (0=nve, 1=nvt, 2=npt, 3=ber, 4=lang, 5=stoc, 6=vres) -variable str_ens string ' ' -if "${ens} == 0" then "variable str_ens string 'etotal'" -if "${ens} == 2" then "variable str_ens string 'vol pxx pyy pzz cella cellb cellc cellakpha cellbeta cellgamma'" - -#Variable for a gulp friend output -if "${ens} >= 0" then "thermo_style custom time temp pe etotal press vol cpu" & - "thermo ${nthermo}" & - "thermo_modify flush yes" - -##################### -#Energy Minimization# -##################### -if "${minimise} <= 0 || ${run_no} > 0" then "jump SELF end_minimise" - print "Doing CG minimisation" - dump mdcd all dcd ${mtraj} min.dcd - dump_modify mdcd unwrap yes - min_style cg - min_modify line quadratic - minimize ${etol} ${ftol} ${maxiter} ${maxiter} - reset_timestep 0 - undump mdcd -label end_minimise - -################ -#Timestep in ps# -################ -timestep ${ts} - -############## -#Restart file# -############## -restart 100000 restart.1 restart.2 - -################### -#Trajectory output# -################### -#dump xyz all atom 1000 silicon.lammpstrj - -if "${ntraj} > 0" then & - "dump 1 all dcd ${ntraj} trajectory.${run_no}.dcd" & - "dump_modify 1 unwrap yes" - -fix mom all momentum 1 linear 1 1 1 - -############################################################### -#Ensembles (0=nve,1=nvt, 2=npt, 3=ber, 4=lang, 5=stoc, 6=vres)# -############################################################### -if "${md} > 0" then 'print "Setting up the ensembles"' & - 'if "${run_no} == 0" then "velocity all create ${temp_s} ${iseed0} mom yes dist gaussian"' & - 'if "${ens} == 0" then "fix nve all nve"' & - 'if "${ens} == 1" then "fix nvt all nvt temp ${temp_s} ${temp_f} ${trel} tchain 5"' & - 'if "${ens} == 2" then "fix npt all npt temp ${temp_s} ${temp_f} ${trel} ${npttype} ${pres} ${pres} ${prel} tchain 5 pchain 5 mtk yes"' & - 'if "${ens} == 3" then "fix nve all nve" "fix ber all temp/berendsen ${temp_s} ${temp_f} ${trel}"' & - 'if "${ens} == 4" then "fix nve all nve" "fix lang all langevin ${temp_s} ${temp_f} ${trel} ${iseed1} tally yes zero yes"' & - 'if "${ens} == 5" then "fix nve all nve" "fix stoch all temp/csvr ${temp_s} ${temp_f} ${trel} ${iseed1}"' & - 'if "${ens} == 6" then "fix nve all nve" "fix stoch all temp/csld ${temp_s} ${temp_f} ${trel} ${iseed1}"' & - 'if "${ens} == 7" then "fix nve all nve" "fix vres all temp/rescale ${tscale} ${temp_s} ${temp_f} ${tmin} ${tmax}"' & - 'if "${ens} == 8" then "fix nve all nve" "fix lang all langevin ${temp_s} ${temp_f} ${trel} ${iseed1} gjf yes"' & - 'if "${ens} == 9" then "fix nve all nve" "fix lang all langevin ${temp_s} ${temp_f} ${trel} ${iseed1} gjf yes halfstep yes"' - -if "${md} > 0" then "print 'Doing Molecular dynamics'" & - "run ${nsteps}" & - "write_restart final_restart.${run_no}" - - diff --git a/examples/gjf/in.gjf.vfull b/examples/gjf/in.gjf.vfull new file mode 100644 index 0000000000..19420e22ca --- /dev/null +++ b/examples/gjf/in.gjf.vfull @@ -0,0 +1,23 @@ +# GJF-2GJ thermostat + +units metal +atom_style full + +boundary p p p +read_data argon.lmp + +include ff-argon.lmp + +velocity all create 10 2357 mom yes dist gaussian + +neighbor 1 bin + +timestep 0.1 + +fix nve all nve +fix lang all langevin 10 10 1 26488 gjf vfull + +thermo 200 +run 50000 + + diff --git a/examples/gjf/in.gjf.vhalf b/examples/gjf/in.gjf.vhalf new file mode 100644 index 0000000000..74e2089595 --- /dev/null +++ b/examples/gjf/in.gjf.vhalf @@ -0,0 +1,23 @@ +# GJF-2GJ thermostat + +units metal +atom_style full + +boundary p p p +read_data argon.lmp + +include ff-argon.lmp + +velocity all create 10 2357 mom yes dist gaussian + +neighbor 1 bin + +timestep 0.1 + +fix nve all nve +fix lang all langevin 10 10 1 26488 gjf vhalf + +thermo 200 +run 50000 + + From 883f6d1e8d6eb18e7ab520a1a7845ec41f31607a Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 26 Jul 2019 09:06:43 -0600 Subject: [PATCH 078/418] Commit1 JT 072619 - corrected warnings in cg and lbfgs - removed unused variables in spin/dipole pair styles --- src/SPIN/min_spin_oso_cg.cpp | 6 ++++-- src/SPIN/min_spin_oso_lbfgs.cpp | 12 ++++++------ src/SPIN/min_spin_oso_lbfgs.h | 20 ++++++++++---------- src/SPIN/pair_spin_dipole_cut.cpp | 2 +- src/SPIN/pair_spin_dipole_long.cpp | 5 +---- 5 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 2bdc00d8ed..1c91fa1500 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -512,7 +512,8 @@ void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) void MinSpinOSO_CG::vm3(const double *m, const double *v, double *out) { for(int i = 0; i < 3; i++){ - out[i] *= 0.0; + //out[i] *= 0.0; + out[i] = 0.0; for(int j = 0; j < 3; j++) out[i] += *(m + 3 * j + i) * v[j]; } @@ -627,7 +628,8 @@ int MinSpinOSO_CG::awc(double der_phi_0, double phi_0, double der_phi_j, double double sigma = 0.9; if ((phi_j<=phi_0+eps*fabs(phi_0)) && - ((2.0*delta-1.0) * der_phi_0>=der_phi_j>=sigma*der_phi_0)) + ((2.0*delta-1.0) * der_phi_0>=der_phi_j) && + (der_phi_j>=sigma*der_phi_0)) return 1; else return 0; diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index 6aaeb7ca23..b9315d706e 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -63,7 +63,7 @@ static const char cite_minstyle_spin_oso_lbfgs[] = /* ---------------------------------------------------------------------- */ MinSpinOSO_LBFGS::MinSpinOSO_LBFGS(LAMMPS *lmp) : - Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), ds(NULL), dy(NULL), rho(NULL), sp_copy(NULL) + Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), rho(NULL), ds(NULL), dy(NULL), sp_copy(NULL) { if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_lbfgs); nlocal_max = 0; @@ -345,7 +345,6 @@ void MinSpinOSO_LBFGS::calc_search_direction() double sq_global = 0.0; double yy_global = 0.0; double yr_global = 0.0; - double beta_global = 0.0; int m_index = local_iter % num_mem; // memory index int c_ind = 0; @@ -520,8 +519,6 @@ void MinSpinOSO_LBFGS::advance_spins() { int nlocal = atom->nlocal; double **sp = atom->sp; - double **fm = atom->fm; - double tdampx, tdampy, tdampz; double rot_mat[9]; // exponential of matrix made of search direction double s_new[3]; @@ -648,7 +645,8 @@ void MinSpinOSO_LBFGS::rodrigues_rotation(const double *upp_tr, double *out) void MinSpinOSO_LBFGS::vm3(const double *m, const double *v, double *out) { for(int i = 0; i < 3; i++){ - out[i] *= 0.0; + //out[i] *= 0.0; + out[i] = 0.0; for(int j = 0; j < 3; j++) out[i] += *(m + 3 * j + i) * v[j]; } @@ -762,7 +760,9 @@ int MinSpinOSO_LBFGS::awc(double der_phi_0, double phi_0, double der_phi_j, doub double delta = 0.1; double sigma = 0.9; - if ((phi_j<=phi_0+eps*fabs(phi_0)) && ((2.0*delta-1.0) * der_phi_0>=der_phi_j>=sigma*der_phi_0)) + if ((phi_j<=phi_0+eps*fabs(phi_0)) && + ((2.0*delta-1.0) * der_phi_0>=der_phi_j) && + (der_phi_j>=sigma*der_phi_0)) return 1; else return 0; diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h index 3071bacc35..204f6bf058 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -34,14 +34,13 @@ class MinSpinOSO_LBFGS: public Min { void reset_vectors(); int iterate(int); private: - int ireplica,nreplica; // for neb + int ireplica,nreplica; // for neb double *spvec; // variables for atomic dof, as 1d vector double *fmvec; // variables for atomic dof, as 1d vector - double *g_cur; // current gradient vector - double *g_old; // gradient vector at previous step + double *g_old; // gradient vector at previous step + double *g_cur; // current gradient vector double *p_s; // search direction vector - double **sp_copy; // copy of the spins - int local_iter; // for neb + int local_iter; // for neb int nlocal_max; // max value of nlocal (for size of lists) void advance_spins(); @@ -54,14 +53,15 @@ class MinSpinOSO_LBFGS: public Min { int awc(double, double, double, double); void make_step(double, double *); double max_torque(); - double der_e_cur; // current derivative along search dir. - double der_e_pr; // previous derivative along search dir. - int use_line_search; // use line search or not. + double der_e_cur; // current derivative along search dir. + double der_e_pr; // previous derivative along search dir. + int use_line_search; // use line search or not. double maxepsrot; - double **ds; // change in rotation matrix between two iterations, da - double **dy; // change in gradients between two iterations, dg double *rho; // estimation of curvature + double **ds; // change in rotation matrix between two iterations, da + double **dy; // change in gradients between two iterations, dg + double **sp_copy; // copy of the spins int num_mem; // number of stored steps bigint last_negative; }; diff --git a/src/SPIN/pair_spin_dipole_cut.cpp b/src/SPIN/pair_spin_dipole_cut.cpp index 4ff198488a..e6b9a59ad9 100644 --- a/src/SPIN/pair_spin_dipole_cut.cpp +++ b/src/SPIN/pair_spin_dipole_cut.cpp @@ -323,7 +323,7 @@ void PairSpinDipoleCut::compute(int eflag, int vflag) void PairSpinDipoleCut::compute_single_pair(int ii, double fmi[3]) { int j,jnum,itype,jtype,ntypes; - int *ilist,*jlist,*numneigh,**firstneigh; + int *jlist,*numneigh,**firstneigh; double rsq,rinv,r2inv,r3inv,local_cut2; double xi[3],rij[3],eij[3],spi[4],spj[4]; diff --git a/src/SPIN/pair_spin_dipole_long.cpp b/src/SPIN/pair_spin_dipole_long.cpp index e3575a6a07..febc6f924c 100644 --- a/src/SPIN/pair_spin_dipole_long.cpp +++ b/src/SPIN/pair_spin_dipole_long.cpp @@ -355,10 +355,9 @@ void PairSpinDipoleLong::compute(int eflag, int vflag) void PairSpinDipoleLong::compute_single_pair(int ii, double fmi[3]) { - //int i,j,jj,jnum,itype,jtype; int j,jj,jnum,itype,jtype,ntypes; int k,locflag; - int *ilist,*jlist,*numneigh,**firstneigh; + int *jlist,*numneigh,**firstneigh; double r,rinv,r2inv,rsq,grij,expm2,t,erfc; double local_cut2,pre1,pre2,pre3; double bij[4],xi[3],rij[3],eij[3],spi[4],spj[4]; @@ -368,7 +367,6 @@ void PairSpinDipoleLong::compute_single_pair(int ii, double fmi[3]) double **sp = atom->sp; double **fm_long = atom->fm_long; - ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; @@ -406,7 +404,6 @@ void PairSpinDipoleLong::compute_single_pair(int ii, double fmi[3]) // computation of the exchange interaction // loop over neighbors of atom i - //i = ilist[ii]; xi[0] = x[ii][0]; xi[1] = x[ii][1]; xi[2] = x[ii][2]; From 7e5c293a233b7f8e5b7095559452b92fb4c7eddd Mon Sep 17 00:00:00 2001 From: alxvov Date: Fri, 26 Jul 2019 16:30:38 +0000 Subject: [PATCH 079/418] delete comment. Add line option --- src/SPIN/min_spin_oso_cg.cpp | 1 - src/SPIN/min_spin_oso_lbfgs.cpp | 3 +-- src/min.cpp | 2 ++ 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 1c91fa1500..f95bffb947 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -512,7 +512,6 @@ void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) void MinSpinOSO_CG::vm3(const double *m, const double *v, double *out) { for(int i = 0; i < 3; i++){ - //out[i] *= 0.0; out[i] = 0.0; for(int j = 0; j < 3; j++) out[i] += *(m + 3 * j + i) * v[j]; diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index b9315d706e..ce459586bf 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -645,7 +645,6 @@ void MinSpinOSO_LBFGS::rodrigues_rotation(const double *upp_tr, double *out) void MinSpinOSO_LBFGS::vm3(const double *m, const double *v, double *out) { for(int i = 0; i < 3; i++){ - //out[i] *= 0.0; out[i] = 0.0; for(int j = 0; j < 3; j++) out[i] += *(m + 3 * j + i) * v[j]; @@ -760,7 +759,7 @@ int MinSpinOSO_LBFGS::awc(double der_phi_0, double phi_0, double der_phi_j, doub double delta = 0.1; double sigma = 0.9; - if ((phi_j<=phi_0+eps*fabs(phi_0)) && + if ((phi_j<=phi_0+eps*fabs(phi_0)) && ((2.0*delta-1.0) * der_phi_0>=der_phi_j) && (der_phi_j>=sigma*der_phi_0)) return 1; diff --git a/src/min.cpp b/src/min.cpp index 2a42a444a0..a903fa98d8 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -653,6 +653,8 @@ void Min::modify_params(int narg, char **arg) if (strcmp(arg[iarg+1],"backtrack") == 0) linestyle = 0; else if (strcmp(arg[iarg+1],"quadratic") == 0) linestyle = 1; else if (strcmp(arg[iarg+1],"forcezero") == 0) linestyle = 2; + else if (strcmp(arg[iarg+1],"spin_cubic") == 0) linestyle = 3; + else if (strcmp(arg[iarg+1],"spin_none") == 0) linestyle = 4; else error->all(FLERR,"Illegal min_modify command"); iarg += 2; } else { From c5b7a36eebe3f8a886c902d53d71486920ecea2d Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 26 Jul 2019 17:33:49 -0600 Subject: [PATCH 080/418] Commit JT 072619 - added a min_style option for norm type (euclidean or Max) - adapted and tested spin minimizers - adapted (net tested) regular minimizers --- src/SPIN/min_spin.cpp | 90 +++++-------------------------- src/SPIN/min_spin.h | 2 - src/SPIN/min_spin_oso_cg.cpp | 94 +++++++++++++-------------------- src/SPIN/min_spin_oso_cg.h | 72 ++++++++++++------------- src/SPIN/min_spin_oso_lbfgs.cpp | 61 ++++++++------------- src/SPIN/min_spin_oso_lbfgs.h | 74 +++++++++++++------------- src/min.cpp | 74 ++++++++++++++++++++++++++ src/min.h | 14 +++-- src/min_cg.cpp | 12 ++++- src/min_fire.cpp | 12 ++++- src/min_hftn.cpp | 4 ++ src/min_quickmin.cpp | 12 ++++- src/min_sd.cpp | 3 +- 13 files changed, 266 insertions(+), 258 deletions(-) diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp index f56c9f0d96..d229927c29 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -119,7 +119,7 @@ void MinSpin::reset_vectors() int MinSpin::iterate(int maxiter) { bigint ntimestep; - double fmdotfm; + double fmdotfm,fmsq,fmsqall; int flag,flagall; for (int iter = 0; iter < maxiter; iter++) { @@ -166,8 +166,20 @@ int MinSpin::iterate(int maxiter) // magnetic torque tolerance criterion // sync across replicas if running multi-replica minimization + fmdotfm = fmsq = fmsqall = 0.0; if (update->ftol > 0.0) { - fmdotfm = max_torque(); + if (normstyle == 1) { // max torque norm + fmsq = max_torque(); + fmsqall = fmsq; + if (update->multireplica == 0) + MPI_Allreduce(&fmsq,&fmsqall,1,MPI_INT,MPI_MAX,universe->uworld); + } else { // Euclidean torque norm + fmsq = total_torque(); + fmsqall = fmsq; + if (update->multireplica == 0) + MPI_Allreduce(&fmsq,&fmsqall,1,MPI_INT,MPI_SUM,universe->uworld); + } + fmdotfm = fmsqall*fmsqall; if (update->multireplica == 0) { if (fmdotfm < update->ftol*update->ftol) return FTOL; } else { @@ -297,77 +309,3 @@ void MinSpin::advance_spins(double dts) // because no need for simplecticity } } - -/* ---------------------------------------------------------------------- - compute and return ||mag. torque||_2^2 -------------------------------------------------------------------------- */ - -double MinSpin::fmnorm_sqr() -{ - int nlocal = atom->nlocal; - double tx,ty,tz; - double **sp = atom->sp; - double **fm = atom->fm; - - // calc. magnetic torques - - double local_norm2_sqr = 0.0; - for (int i = 0; i < nlocal; i++) { - tx = (fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - ty = (fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - tz = (fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - - local_norm2_sqr += tx*tx + ty*ty + tz*tz; - } - - // no extra atom calc. for spins - - if (nextra_atom) - error->all(FLERR,"extra atom option not available yet"); - - double norm2_sqr = 0.0; - MPI_Allreduce(&local_norm2_sqr,&norm2_sqr,1,MPI_DOUBLE,MPI_SUM,world); - - return norm2_sqr; -} - -/* ---------------------------------------------------------------------- - compute and return max_i||mag. torque_i||_2 -------------------------------------------------------------------------- */ - -double MinSpin::max_torque() -{ - double fmsq,fmaxsqone,fmaxsqloc,fmaxsqall; - int nlocal = atom->nlocal; - double hbar = force->hplanck/MY_2PI; - double tx,ty,tz; - double **sp = atom->sp; - double **fm = atom->fm; - - fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; - for (int i = 0; i < nlocal; i++) { - tx = fm[i][1] * sp[i][2] - fm[i][2] * sp[i][1]; - ty = fm[i][2] * sp[i][0] - fm[i][0] * sp[i][2]; - tz = fm[i][0] * sp[i][1] - fm[i][1] * sp[i][0]; - fmsq = tx * tx + ty * ty + tz * tz; - fmaxsqone = MAX(fmaxsqone,fmsq); - } - - // finding max fm on this replica - - fmaxsqloc = fmaxsqone; - MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - - // finding max fm over all replicas, if necessary - // this communicator would be invalid for multiprocess replicas - - fmaxsqall = fmaxsqloc; - if (update->multireplica == 1) { - fmaxsqall = fmaxsqloc; - MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); - } - - // multiply it by hbar so that units are in eV - - return sqrt(fmaxsqall) * hbar; -} diff --git a/src/SPIN/min_spin.h b/src/SPIN/min_spin.h index d6d49203d5..f2df81e58c 100644 --- a/src/SPIN/min_spin.h +++ b/src/SPIN/min_spin.h @@ -35,8 +35,6 @@ class MinSpin : public Min { int iterate(int); double evaluate_dt(); void advance_spins(double); - double fmnorm_sqr(); - double max_torque(); private: diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 1c91fa1500..16a95c5c02 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -29,6 +29,7 @@ #include "universe.h" #include "atom.h" #include "citeme.h" +#include "comm.h" #include "force.h" #include "update.h" #include "output.h" @@ -99,6 +100,13 @@ void MinSpinOSO_CG::init() Min::init(); + // warning if line_search combined to gneb + + if ((nreplica >= 1) && (linestyle != 4) && (comm->me == 0)) + error->warning(FLERR,"Line search incompatible gneb"); + + // set back use_line_search to 0 if more than one replica + if (linestyle == 3 && nreplica == 1){ use_line_search = 1; } @@ -175,7 +183,7 @@ int MinSpinOSO_CG::iterate(int maxiter) { int nlocal = atom->nlocal; bigint ntimestep; - double fmdotfm; + double fmdotfm,fmsq,fmsqall; int flag, flagall; double **sp = atom->sp; double der_e_cur_tmp = 0.0; @@ -261,8 +269,20 @@ int MinSpinOSO_CG::iterate(int maxiter) // magnetic torque tolerance criterion // sync across replicas if running multi-replica minimization + fmdotfm = fmsq = fmsqall = 0.0; if (update->ftol > 0.0) { - fmdotfm = max_torque(); + if (normstyle == 1) { // max torque norm + fmsq = max_torque(); + fmsqall = fmsq; + if (update->multireplica == 0) + MPI_Allreduce(&fmsq,&fmsqall,1,MPI_INT,MPI_MAX,universe->uworld); + } else { // Euclidean torque norm + fmsq = total_torque(); + fmsqall = fmsq; + if (update->multireplica == 0) + MPI_Allreduce(&fmsq,&fmsqall,1,MPI_INT,MPI_SUM,universe->uworld); + } + fmdotfm = fmsqall*fmsqall; if (update->multireplica == 0) { if (fmdotfm < update->ftol*update->ftol) return FTOL; } else { @@ -353,6 +373,7 @@ void MinSpinOSO_CG::calc_search_direction() MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,world); // Sum over all replicas. Good for GNEB. + if (nreplica > 1) { g2 = g2_global * factor; g2old = g2old_global * factor; @@ -361,7 +382,9 @@ void MinSpinOSO_CG::calc_search_direction() } if (fabs(g2_global) < 1.0e-60) beta = 0.0; else beta = g2_global / g2old_global; + // calculate conjugate direction + for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = (beta * p_s[i] - g_cur[i]) * factor; g_old[i] = g_cur[i] * factor; @@ -379,7 +402,7 @@ void MinSpinOSO_CG::advance_spins() { int nlocal = atom->nlocal; double **sp = atom->sp; - double rot_mat[9]; // exponential of matrix made of search direction + double rot_mat[9]; // exponential of matrix made of search direction double s_new[3]; // loop on all spins on proc. @@ -394,47 +417,6 @@ void MinSpinOSO_CG::advance_spins() } } -/* ---------------------------------------------------------------------- - compute and return max_i||mag. torque_i||_2 -------------------------------------------------------------------------- */ - -double MinSpinOSO_CG::max_torque() -{ - double fmsq,fmaxsqone,fmaxsqloc,fmaxsqall; - int nlocal = atom->nlocal; - double factor; - double hbar = force->hplanck/MY_2PI; - - if (use_line_search) factor = 1.0; - else factor = hbar; - - // finding max fm on this proc. - - fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; - for (int i = 0; i < nlocal; i++) { - fmsq = 0.0; - for (int j = 0; j < 3; j++) - fmsq += g_cur[3 * i + j] * g_cur[3 * i + j]; - fmaxsqone = MAX(fmaxsqone,fmsq); - } - - // finding max fm on this replica - - fmaxsqloc = fmaxsqone; - MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - - // finding max fm over all replicas, if necessary - // this communicator would be invalid for multiprocess replicas - - fmaxsqall = fmaxsqloc; - if (update->multireplica == 1) { - fmaxsqall = fmaxsqloc; - MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); - } - - return sqrt(fmaxsqall) * factor; -} - /* ---------------------------------------------------------------------- calculate 3x3 matrix exponential using Rodrigues' formula (R. Murray, Z. Li, and S. Shankar Sastry, @@ -456,15 +438,14 @@ void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) fabs(upp_tr[1]) < 1.0e-40 && fabs(upp_tr[2]) < 1.0e-40){ - // if upp_tr is zero, return unity matrix - for(int k = 0; k < 3; k++){ - for(int m = 0; m < 3; m++){ - if (m == k) - out[3 * k + m] = 1.0; - else - out[3 * k + m] = 0.0; + // if upp_tr is zero, return unity matrix + + for(int k = 0; k < 3; k++){ + for(int m = 0; m < 3; m++){ + if (m == k) out[3 * k + m] = 1.0; + else out[3 * k + m] = 0.0; + } } - } return; } @@ -512,13 +493,14 @@ void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) void MinSpinOSO_CG::vm3(const double *m, const double *v, double *out) { for(int i = 0; i < 3; i++){ - //out[i] *= 0.0; out[i] = 0.0; - for(int j = 0; j < 3; j++) - out[i] += *(m + 3 * j + i) * v[j]; + for(int j = 0; j < 3; j++) out[i] += *(m + 3 * j + i) * v[j]; } } +/* ---------------------------------------------------------------------- + advance spins +------------------------------------------------------------------------- */ void MinSpinOSO_CG::make_step(double c, double *energy_and_der) { @@ -586,7 +568,7 @@ int MinSpinOSO_CG::calc_and_make_step(double a, double b, int index) } return 1; } - else{ + else { double r,f0,f1,df0,df1; r = b - a; f0 = eprevious; diff --git a/src/SPIN/min_spin_oso_cg.h b/src/SPIN/min_spin_oso_cg.h index 41253f440f..30d9adf066 100644 --- a/src/SPIN/min_spin_oso_cg.h +++ b/src/SPIN/min_spin_oso_cg.h @@ -25,44 +25,44 @@ MinimizeStyle(spin_oso_cg, MinSpinOSO_CG) namespace LAMMPS_NS { class MinSpinOSO_CG: public Min { - public: - MinSpinOSO_CG(class LAMMPS *); - virtual ~MinSpinOSO_CG(); - void init(); - void setup_style(); - int modify_param(int, char **); - void reset_vectors(); - int iterate(int); - private: - double dt; // global timestep - double dts; // spin timestep - int ireplica,nreplica; // for neb - double *spvec; // variables for atomic dof, as 1d vector - double *fmvec; // variables for atomic dof, as 1d vector - double *g_old; // gradient vector at previous step - double *g_cur; // current gradient vector - double *p_s; // search direction vector - double **sp_copy; // copy of the spins - int local_iter; // for neb - int nlocal_max; // max value of nlocal (for size of lists) - double discrete_factor; // factor for spin timestep evaluation + public: + MinSpinOSO_CG(class LAMMPS *); + virtual ~MinSpinOSO_CG(); + void init(); + void setup_style(); + void reset_vectors(); + int modify_param(int, char **); + int iterate(int); - double evaluate_dt(); - void advance_spins(); - void calc_gradient(); - void calc_search_direction(); - double maximum_rotation(double *); - void vm3(const double *, const double *, double *); - void rodrigues_rotation(const double *, double *); - int calc_and_make_step(double, double, int); - int awc(double, double, double, double); - void make_step(double, double *); - double max_torque(); - double der_e_cur; // current derivative along search dir. - double der_e_pr; // previous derivative along search dir. - int use_line_search; // use line search or not. + private: + int local_iter; // for neb + int nlocal_max; // max value of nlocal (for size of lists) + int use_line_search; // use line search or not. + int ireplica,nreplica; // for neb + double dt; // global timestep + double dts; // spin timestep + double discrete_factor; // factor for spin timestep evaluation + double der_e_cur; // current derivative along search dir. + double der_e_pr; // previous derivative along search dir. + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + double *g_old; // gradient vector at previous step + double *g_cur; // current gradient vector + double *p_s; // search direction vector + double **sp_copy; // copy of the spins - bigint last_negative; + void advance_spins(); + void calc_gradient(); + void calc_search_direction(); + void vm3(const double *, const double *, double *); + void rodrigues_rotation(const double *, double *); + void make_step(double, double *); + int calc_and_make_step(double, double, int); + int awc(double, double, double, double); + double evaluate_dt(); + double maximum_rotation(double *); + + bigint last_negative; }; } diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index b9315d706e..2913ef4101 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -26,9 +26,9 @@ #include #include #include "min_spin_oso_lbfgs.h" -#include "universe.h" #include "atom.h" #include "citeme.h" +#include "comm.h" #include "force.h" #include "update.h" #include "output.h" @@ -107,6 +107,13 @@ void MinSpinOSO_LBFGS::init() Min::init(); + // warning if line_search combined to gneb + + if ((nreplica >= 1) && (linestyle != 4) && (comm->me == 0)) + error->warning(FLERR,"Line search incompatible gneb"); + + // set back use_line_search to 0 if more than one replica + if (linestyle != 4 && nreplica == 1){ use_line_search = 1; } @@ -188,7 +195,7 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) { int nlocal = atom->nlocal; bigint ntimestep; - double fmdotfm; + double fmdotfm,fmsq,fmsqall; int flag, flagall; double **sp = atom->sp; double der_e_cur_tmp = 0.0; @@ -280,8 +287,20 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) // magnetic torque tolerance criterion // sync across replicas if running multi-replica minimization + fmdotfm = fmsq = fmsqall = 0.0; if (update->ftol > 0.0) { - fmdotfm = max_torque(); + if (normstyle == 1) { // max torque norm + fmsq = max_torque(); + fmsqall = fmsq; + if (update->multireplica == 0) + MPI_Allreduce(&fmsq,&fmsqall,1,MPI_INT,MPI_MAX,universe->uworld); + } else { // Euclidean torque norm + fmsq = total_torque(); + fmsqall = fmsq; + if (update->multireplica == 0) + MPI_Allreduce(&fmsq,&fmsqall,1,MPI_INT,MPI_SUM,universe->uworld); + } + fmdotfm = fmsqall*fmsqall; if (update->multireplica == 0) { if (fmdotfm < update->ftol*update->ftol) return FTOL; } else { @@ -534,42 +553,6 @@ void MinSpinOSO_LBFGS::advance_spins() } } -/* ---------------------------------------------------------------------- - compute and return max_i||mag. torque_i||_2 -------------------------------------------------------------------------- */ - -double MinSpinOSO_LBFGS::max_torque() -{ - double fmsq,fmaxsqone,fmaxsqloc,fmaxsqall; - int nlocal = atom->nlocal; - - // finding max fm on this proc. - - fmsq = fmaxsqone = fmaxsqloc = fmaxsqall = 0.0; - for (int i = 0; i < nlocal; i++) { - fmsq = 0.0; - for (int j = 0; j < 3; j++) - fmsq += g_cur[3 * i + j] * g_cur[3 * i + j]; - fmaxsqone = MAX(fmaxsqone,fmsq); - } - - // finding max fm on this replica - - fmaxsqloc = fmaxsqone; - MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - - // finding max fm over all replicas, if necessary - // this communicator would be invalid for multiprocess replicas - - fmaxsqall = fmaxsqloc; - if (update->multireplica == 1) { - fmaxsqall = fmaxsqloc; - MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); - } - - return sqrt(fmaxsqall); -} - /* ---------------------------------------------------------------------- calculate 3x3 matrix exponential using Rodrigues' formula (R. Murray, Z. Li, and S. Shankar Sastry, diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h index 204f6bf058..9bd36afa8b 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -25,45 +25,45 @@ MinimizeStyle(spin_oso_lbfgs, MinSpinOSO_LBFGS) namespace LAMMPS_NS { class MinSpinOSO_LBFGS: public Min { - public: - MinSpinOSO_LBFGS(class LAMMPS *); - virtual ~MinSpinOSO_LBFGS(); - void init(); - void setup_style(); - int modify_param(int, char **); - void reset_vectors(); - int iterate(int); - private: - int ireplica,nreplica; // for neb - double *spvec; // variables for atomic dof, as 1d vector - double *fmvec; // variables for atomic dof, as 1d vector - double *g_old; // gradient vector at previous step - double *g_cur; // current gradient vector - double *p_s; // search direction vector - int local_iter; // for neb - int nlocal_max; // max value of nlocal (for size of lists) + public: + MinSpinOSO_LBFGS(class LAMMPS *); + virtual ~MinSpinOSO_LBFGS(); + void init(); + void setup_style(); + int modify_param(int, char **); + void reset_vectors(); + int iterate(int); - void advance_spins(); - void calc_gradient(); - void calc_search_direction(); - double maximum_rotation(double *); - void vm3(const double *, const double *, double *); - void rodrigues_rotation(const double *, double *); - int calc_and_make_step(double, double, int); - int awc(double, double, double, double); - void make_step(double, double *); - double max_torque(); - double der_e_cur; // current derivative along search dir. - double der_e_pr; // previous derivative along search dir. - int use_line_search; // use line search or not. - double maxepsrot; + private: + int local_iter; // for neb + int use_line_search; // use line search or not. + int nlocal_max; // max value of nlocal (for size of lists) + int ireplica,nreplica; // for neb + double der_e_cur; // current derivative along search dir. + double der_e_pr; // previous derivative along search dir. + double maxepsrot; + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + double *g_old; // gradient vector at previous step + double *g_cur; // current gradient vector + double *p_s; // search direction vector - double *rho; // estimation of curvature - double **ds; // change in rotation matrix between two iterations, da - double **dy; // change in gradients between two iterations, dg - double **sp_copy; // copy of the spins - int num_mem; // number of stored steps - bigint last_negative; + void advance_spins(); + void calc_gradient(); + void calc_search_direction(); + void vm3(const double *, const double *, double *); + void rodrigues_rotation(const double *, double *); + void make_step(double, double *); + int calc_and_make_step(double, double, int); + int awc(double, double, double, double); + double maximum_rotation(double *); + + double *rho; // estimation of curvature + double **ds; // change in rotation matrix between two iterations, da + double **dy; // change in gradients between two iterations, dg + double **sp_copy; // copy of the spins + int num_mem; // number of stored steps + bigint last_negative; }; } diff --git a/src/min.cpp b/src/min.cpp index 2a42a444a0..e476b1abc8 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -42,10 +42,12 @@ #include "output.h" #include "thermo.h" #include "timer.h" +#include "math_const.h" #include "memory.h" #include "error.h" using namespace LAMMPS_NS; +using namespace MathConst; /* ---------------------------------------------------------------------- */ @@ -54,6 +56,7 @@ Min::Min(LAMMPS *lmp) : Pointers(lmp) dmax = 0.1; searchflag = 0; linestyle = 1; + normstyle = 0; elist_global = elist_atom = NULL; vlist_global = vlist_atom = NULL; @@ -653,6 +656,14 @@ void Min::modify_params(int narg, char **arg) if (strcmp(arg[iarg+1],"backtrack") == 0) linestyle = 0; else if (strcmp(arg[iarg+1],"quadratic") == 0) linestyle = 1; else if (strcmp(arg[iarg+1],"forcezero") == 0) linestyle = 2; + else if (strcmp(arg[iarg+1],"spin_cubic") == 0) linestyle = 3; + else if (strcmp(arg[iarg+1],"spin_none") == 0) linestyle = 4; + else error->all(FLERR,"Illegal min_modify command"); + iarg += 2; + } else if (strcmp(arg[iarg],"norm") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command"); + if (strcmp(arg[iarg+1],"euclidean") == 0) normstyle = 0; + else if (strcmp(arg[iarg+1],"max") == 0) normstyle = 1; else error->all(FLERR,"Illegal min_modify command"); iarg += 2; } else { @@ -816,6 +827,69 @@ double Min::fnorm_inf() return norm_inf; } +/* ---------------------------------------------------------------------- + compute and return sum_i||mag. torque_i||_2 (in eV) +------------------------------------------------------------------------- */ + +double Min::total_torque() +{ + double fmsq,ftotsqone,ftotsqall; + int nlocal = atom->nlocal; + double hbar = force->hplanck/MY_2PI; + double tx,ty,tz; + double **sp = atom->sp; + double **fm = atom->fm; + + fmsq = ftotsqone = ftotsqall = 0.0; + for (int i = 0; i < nlocal; i++) { + tx = fm[i][1] * sp[i][2] - fm[i][2] * sp[i][1]; + ty = fm[i][2] * sp[i][0] - fm[i][0] * sp[i][2]; + tz = fm[i][0] * sp[i][1] - fm[i][1] * sp[i][0]; + fmsq = tx * tx + ty * ty + tz * tz; + ftotsqone += fmsq; + } + + // summing all fmsqtot on this replica + + MPI_Allreduce(&ftotsqone,&ftotsqall,1,MPI_DOUBLE,MPI_SUM,world); + + // multiply it by hbar so that units are in eV + + return sqrt(ftotsqall) * hbar; +} + +/* ---------------------------------------------------------------------- + compute and return max_i ||mag. torque_i|| (in eV) +------------------------------------------------------------------------- */ + +double Min::max_torque() +{ + double fmsq,fmaxsqone,fmaxsqall; + int nlocal = atom->nlocal; + double hbar = force->hplanck/MY_2PI; + double tx,ty,tz; + double **sp = atom->sp; + double **fm = atom->fm; + + fmsq = fmaxsqone = fmaxsqall = 0.0; + for (int i = 0; i < nlocal; i++) { + tx = fm[i][1] * sp[i][2] - fm[i][2] * sp[i][1]; + ty = fm[i][2] * sp[i][0] - fm[i][0] * sp[i][2]; + tz = fm[i][0] * sp[i][1] - fm[i][1] * sp[i][0]; + fmsq = tx * tx + ty * ty + tz * tz; + fmaxsqone = MAX(fmaxsqone,fmsq); + } + + // finding max fm on this replica + + fmaxsqall = fmaxsqone; + MPI_Allreduce(&fmaxsqone,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,world); + + // multiply it by hbar so that units are in eV + + return sqrt(fmaxsqall) * hbar; +} + /* ---------------------------------------------------------------------- possible stop conditions ------------------------------------------------------------------------- */ diff --git a/src/min.h b/src/min.h index a63254231c..e18d0dd677 100644 --- a/src/min.h +++ b/src/min.h @@ -42,6 +42,10 @@ class Min : protected Pointers { double fnorm_sqr(); double fnorm_inf(); + // methods for spin minimizers + double max_torque(); + double total_torque(); + virtual void init_style() {} virtual void setup_style() = 0; virtual void reset_vectors() = 0; @@ -56,8 +60,11 @@ class Min : protected Pointers { int virial_style; // compute virial explicitly or implicitly int external_force_clear; // clear forces locally or externally - double dmax; // max dist to move any atom in one step - int linestyle; // 0 = backtrack, 1 = quadratic, 2 = forcezero + double dmax; // max dist to move any atom in one step + int linestyle; // 0 = backtrack, 1 = quadratic, 2 = forcezero + // 3 = spin_cubic, 4 = spin_none + + int normstyle; // 0 = Euclidean norm, 1 = inf. norm int nelist_global,nelist_atom; // # of PE,virial computes to check int nvlist_global,nvlist_atom; @@ -102,9 +109,6 @@ class Min : protected Pointers { double energy_force(int); void force_clear(); - double compute_force_norm_sqr(); - double compute_force_norm_inf(); - void ev_setup(); void ev_set(bigint); diff --git a/src/min_cg.cpp b/src/min_cg.cpp index 20e8cc30dd..9801e57f4d 100644 --- a/src/min_cg.cpp +++ b/src/min_cg.cpp @@ -37,7 +37,7 @@ MinCG::MinCG(LAMMPS *lmp) : MinLineSearch(lmp) {} int MinCG::iterate(int maxiter) { int i,m,n,fail,ntimestep; - double beta,gg,dot[2],dotall[2]; + double beta,gg,dot[2],dotall[2],fmax,fmaxall; double *fatom,*gatom,*hatom; // nlimit = max # of CG iterations before restarting @@ -87,10 +87,12 @@ int MinCG::iterate(int maxiter) // force tolerance criterion + fmax = fmaxall = 0.0; dot[0] = dot[1] = 0.0; for (i = 0; i < nvec; i++) { dot[0] += fvec[i]*fvec[i]; dot[1] += fvec[i]*g[i]; + fmax = MAX(fmax,fvec[i]*fvec[i]); } if (nextra_atom) for (m = 0; m < nextra_atom; m++) { @@ -100,16 +102,22 @@ int MinCG::iterate(int maxiter) for (i = 0; i < n; i++) { dot[0] += fatom[i]*fatom[i]; dot[1] += fatom[i]*gatom[i]; + fmax = MAX(fmax,fatom[i]*fatom[i]); } } MPI_Allreduce(dot,dotall,2,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&fmax,&fmaxall,2,MPI_DOUBLE,MPI_MAX,world); if (nextra_global) for (i = 0; i < nextra_global; i++) { dotall[0] += fextra[i]*fextra[i]; dotall[1] += fextra[i]*gextra[i]; } - if (dotall[0] < update->ftol*update->ftol) return FTOL; + if (normstyle == 1) { // max force norm + if (fmax < update->ftol*update->ftol) return FTOL; + } else { // Euclidean force norm + if (dotall[0] < update->ftol*update->ftol) return FTOL; + } // update new search direction h from new f = -Grad(x) and old g // this is Polak-Ribieri formulation diff --git a/src/min_fire.cpp b/src/min_fire.cpp index a50071d562..a0a3bce8ba 100644 --- a/src/min_fire.cpp +++ b/src/min_fire.cpp @@ -80,7 +80,7 @@ void MinFire::reset_vectors() int MinFire::iterate(int maxiter) { bigint ntimestep; - double vmax,vdotf,vdotfall,vdotv,vdotvall,fdotf,fdotfall; + double vmax,vdotf,vdotfall,vdotv,vdotvall,fdotf,fdotfloc,fdotfall; double scale1,scale2; double dtvone,dtv,dtf,dtfm; int flag,flagall; @@ -250,7 +250,15 @@ int MinFire::iterate(int maxiter) // sync across replicas if running multi-replica minimization if (update->ftol > 0.0) { - fdotf = fnorm_sqr(); + if (normstyle == 1) { // max force norm + fdotf = fnorm_inf(); + fdotfloc = fdotf; + MPI_Allreduce(&fdotfloc,&fdotf,1,MPI_INT,MPI_MAX,universe->uworld); + } else { // Euclidean force norm + fdotf = fnorm_sqr(); + fdotfloc = fdotf; + MPI_Allreduce(&fdotfloc,&fdotf,1,MPI_INT,MPI_SUM,universe->uworld); + } if (update->multireplica == 0) { if (fdotf < update->ftol*update->ftol) return FTOL; } else { diff --git a/src/min_hftn.cpp b/src/min_hftn.cpp index 0c834fbeb4..9f8695f151 100644 --- a/src/min_hftn.cpp +++ b/src/min_hftn.cpp @@ -20,6 +20,7 @@ #include #include #include "atom.h" +#include "error.h" #include "fix_minimize.h" #include "min_hftn.h" #include "modify.h" @@ -111,6 +112,9 @@ void MinHFTN::init() { Min::init(); + if (normstyle == 1) + error->all(FLERR,"Incorrect min_modify option"); + for (int i = 1; i < NUM_HFTN_ATOM_BASED_VECTORS; i++) { if (_daExtraGlobal[i] != NULL) delete [] _daExtraGlobal[i]; diff --git a/src/min_quickmin.cpp b/src/min_quickmin.cpp index 8b48816355..d6507cfcde 100644 --- a/src/min_quickmin.cpp +++ b/src/min_quickmin.cpp @@ -76,7 +76,7 @@ void MinQuickMin::reset_vectors() int MinQuickMin::iterate(int maxiter) { bigint ntimestep; - double vmax,vdotf,vdotfall,fdotf,fdotfall,scale; + double vmax,vdotf,vdotfall,fdotf,fdotfloc,fdotfall,scale; double dtvone,dtv,dtf,dtfm; int flag,flagall; @@ -216,7 +216,15 @@ int MinQuickMin::iterate(int maxiter) // sync across replicas if running multi-replica minimization if (update->ftol > 0.0) { - fdotf = fnorm_sqr(); + if (normstyle == 1) { // max force norm + fdotf = fnorm_inf(); + fdotfloc = fdotf; + MPI_Allreduce(&fdotfloc,&fdotf,1,MPI_INT,MPI_MAX,universe->uworld); + } else { // Euclidean force norm + fdotf = fnorm_sqr(); + fdotfloc = fdotf; + MPI_Allreduce(&fdotfloc,&fdotf,1,MPI_INT,MPI_SUM,universe->uworld); + } if (update->multireplica == 0) { if (fdotf < update->ftol*update->ftol) return FTOL; } else { diff --git a/src/min_sd.cpp b/src/min_sd.cpp index 5d44437ca0..60386df82c 100644 --- a/src/min_sd.cpp +++ b/src/min_sd.cpp @@ -79,7 +79,8 @@ int MinSD::iterate(int maxiter) // force tolerance criterion - fdotf = fnorm_sqr(); + if (normstyle == 1) fdotf = fnorm_inf(); // max force norm + else fdotf = fnorm_sqr(); // Euclidean force norm if (fdotf < update->ftol*update->ftol) return FTOL; // set new search direction h to f = -Grad(x) From 1364329432bef1809811b4e188e02520091ed825 Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 26 Jul 2019 17:54:04 -0600 Subject: [PATCH 081/418] Commit JT 072619 - draft doc of norm option (doc/src/min_modify.txt) --- doc/src/min_modify.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index 9c4d7c8fcb..ecd4795a8f 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -18,6 +18,8 @@ keyword = {dmax} or {line} or {alpha_damp} or {discrete_factor} max = maximum distance for line search to move (distance units) {line} value = {backtrack} or {quadratic} or {forcezero} or {spin_cubic} or {spin_none} backtrack,quadratic,forcezero,spin_cubic,spin_none = style of linesearch to use + {norm} value = {euclidean} or {max} + euclidean,max = style of norm to use {alpha_damp} value = damping damping = fictitious Gilbert damping for spin minimization (adim) {discrete_factor} value = factor @@ -69,6 +71,14 @@ difference of two large values (energy before and energy after) and that difference may be smaller than machine epsilon even if atoms could move in the gradient direction to reduce forces further. +The choice of a norm can be modified for the min styles {fire}, +{quickmin}, {sd}, {spin}, {spin_oso_cg} and {spin_oso_lbfgs} +using the {norm} keyword. +The default {euclidean} norm computes the 2-norm (length) of the +global force vector. The {max} norm computes the maximum value +of the 2-norms of all forces in the system. + + Keywords {alpha_damp} and {discrete_factor} only make sense when a "min_spin"_min_spin.html command is declared. Keyword {alpha_damp} defines an analog of a magnetic Gilbert From 000d5b7cc278b0f8ecdc22e2f3370b30356045c8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 29 Jul 2019 20:02:31 -0400 Subject: [PATCH 082/418] simplify code a little and remove excess whitespace --- src/MISC/fix_deposit.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/MISC/fix_deposit.cpp b/src/MISC/fix_deposit.cpp index 66493f810f..06ce7a464d 100644 --- a/src/MISC/fix_deposit.cpp +++ b/src/MISC/fix_deposit.cpp @@ -184,14 +184,11 @@ FixDeposit::FixDeposit(LAMMPS *lmp, int narg, char **arg) : if (idnext) find_maxid(); // random number generator, same for all procs - // warm-up the generator 30x to avoid correlations in first-particle + // warm up the generator 30x to avoid correlations in first-particle // positions if runs are repeated with consecutive seeds random = new RanPark(lmp,seed); - double tmp_rand; - for (int ii=0; ii < 30; ii++) { - tmp_rand = random->uniform(); - } + for (int ii=0; ii < 30; ii++) random->uniform(); // set up reneighboring From 0f9112d9866255dc56ef45159e725e3cfcb7b99b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 29 Jul 2019 20:03:16 -0400 Subject: [PATCH 083/418] transfer pRNG init changes from fix deposit to fix pour --- src/GRANULAR/fix_pour.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/GRANULAR/fix_pour.cpp b/src/GRANULAR/fix_pour.cpp index 3ffca8db9d..6372575333 100644 --- a/src/GRANULAR/fix_pour.cpp +++ b/src/GRANULAR/fix_pour.cpp @@ -166,8 +166,11 @@ FixPour::FixPour(LAMMPS *lmp, int narg, char **arg) : if (idnext) find_maxid(); // random number generator, same for all procs + // warm up the generator 30x to avoid correlations in first-particle + // positions if runs are repeated with consecutive seeds random = new RanPark(lmp,seed); + for (int ii=0; ii < 30; ii++) random->uniform(); // allgather arrays From 9609c75073130b19856c3bc0e64068e72254e507 Mon Sep 17 00:00:00 2001 From: alxvov Date: Tue, 30 Jul 2019 11:16:40 +0000 Subject: [PATCH 084/418] Use descent condition, and no line search as a default option for all oso --- examples/SPIN/spinmin/in.spinmin_cg.bfo | 2 +- examples/SPIN/spinmin/in.spinmin_lbfgs.bfo | 4 ++-- src/SPIN/min_spin_oso_cg.cpp | 14 ++++---------- src/SPIN/min_spin_oso_cg.h | 2 +- src/SPIN/min_spin_oso_lbfgs.cpp | 21 ++++++--------------- src/SPIN/min_spin_oso_lbfgs.h | 2 +- 6 files changed, 15 insertions(+), 30 deletions(-) diff --git a/examples/SPIN/spinmin/in.spinmin_cg.bfo b/examples/SPIN/spinmin/in.spinmin_cg.bfo index 776079edb8..8c288763c4 100644 --- a/examples/SPIN/spinmin/in.spinmin_cg.bfo +++ b/examples/SPIN/spinmin/in.spinmin_cg.bfo @@ -51,4 +51,4 @@ dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3 min_style spin_oso_cg # min_modify line spin_none discrete_factor 10.0 -minimize 1.0e-10 1.0e-7 1000 1000 +minimize 1.0e-10 1.0e-10 10000 10000 diff --git a/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo b/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo index ca600f1c2b..6a9104cc9c 100644 --- a/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo +++ b/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo @@ -50,5 +50,5 @@ compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] min_style spin_oso_lbfgs -min_modify line spin_cubic discrete_factor 10.0 -minimize 1.0e-15 1.0e-7 10000 1000 +# min_modify line spin_cubic discrete_factor 10.0 +minimize 1.0e-15 1.0e-10 10000 1000 diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_oso_cg.cpp index 16a95c5c02..f1f2f72436 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_oso_cg.cpp @@ -561,7 +561,7 @@ int MinSpinOSO_CG::calc_and_make_step(double a, double b, int index) der_e_cur = e_and_d[1]; index++; - if (awc(der_e_pr,eprevious,e_and_d[1],e_and_d[0]) || index == 10){ + if (adescent(eprevious,e_and_d[0]) || index == 5){ MPI_Bcast(&b,1,MPI_DOUBLE,0,world); for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = b * p_s[i]; @@ -598,20 +598,14 @@ int MinSpinOSO_CG::calc_and_make_step(double a, double b, int index) } /* ---------------------------------------------------------------------- - Approximate Wolfe conditions: - William W. Hager and Hongchao Zhang - SIAM J. optim., 16(1), 170-192. (23 pages) + Approximate descent ------------------------------------------------------------------------- */ -int MinSpinOSO_CG::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){ +int MinSpinOSO_CG::adescent(double phi_0, double phi_j){ double eps = 1.0e-6; - double delta = 0.1; - double sigma = 0.9; - if ((phi_j<=phi_0+eps*fabs(phi_0)) && - ((2.0*delta-1.0) * der_phi_0>=der_phi_j) && - (der_phi_j>=sigma*der_phi_0)) + if (phi_j<=phi_0+eps*fabs(phi_0)) return 1; else return 0; diff --git a/src/SPIN/min_spin_oso_cg.h b/src/SPIN/min_spin_oso_cg.h index 30d9adf066..d6dc7c03d0 100644 --- a/src/SPIN/min_spin_oso_cg.h +++ b/src/SPIN/min_spin_oso_cg.h @@ -58,7 +58,7 @@ class MinSpinOSO_CG: public Min { void rodrigues_rotation(const double *, double *); void make_step(double, double *); int calc_and_make_step(double, double, int); - int awc(double, double, double, double); + int adescent(double, double); double evaluate_dt(); double maximum_rotation(double *); diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_oso_lbfgs.cpp index f850879d1a..8623a8bb29 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_oso_lbfgs.cpp @@ -73,10 +73,7 @@ MinSpinOSO_LBFGS::MinSpinOSO_LBFGS(LAMMPS *lmp) : nreplica = universe->nworlds; ireplica = universe->iworld; - if (nreplica > 1) - use_line_search = 0; // no line search for NEB - else - use_line_search = 1; + use_line_search = 0; // no line search as default option for LBFGS maxepsrot = MY_2PI / (100.0); @@ -114,7 +111,7 @@ void MinSpinOSO_LBFGS::init() // set back use_line_search to 0 if more than one replica - if (linestyle != 4 && nreplica == 1){ + if (linestyle == 3 && nreplica == 1){ use_line_search = 1; } else{ @@ -694,7 +691,7 @@ int MinSpinOSO_LBFGS::calc_and_make_step(double a, double b, int index) der_e_cur = e_and_d[1]; index++; - if (awc(der_e_pr,eprevious,e_and_d[1],e_and_d[0]) || index == 5){ + if (adescent(eprevious,e_and_d[0]) || index == 5){ MPI_Bcast(&b,1,MPI_DOUBLE,0,world); for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = b * p_s[i]; @@ -731,20 +728,14 @@ int MinSpinOSO_LBFGS::calc_and_make_step(double a, double b, int index) } /* ---------------------------------------------------------------------- - Approximate Wolfe conditions: - William W. Hager and Hongchao Zhang - SIAM J. optim., 16(1), 170-192. (23 pages) + Approximate descent ------------------------------------------------------------------------- */ -int MinSpinOSO_LBFGS::awc(double der_phi_0, double phi_0, double der_phi_j, double phi_j){ +int MinSpinOSO_LBFGS::adescent(double phi_0, double phi_j){ double eps = 1.0e-6; - double delta = 0.1; - double sigma = 0.9; - if ((phi_j<=phi_0+eps*fabs(phi_0)) && - ((2.0*delta-1.0) * der_phi_0>=der_phi_j) && - (der_phi_j>=sigma*der_phi_0)) + if (phi_j<=phi_0+eps*fabs(phi_0)) return 1; else return 0; diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_oso_lbfgs.h index 9bd36afa8b..68fa10921e 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_oso_lbfgs.h @@ -55,7 +55,7 @@ class MinSpinOSO_LBFGS: public Min { void rodrigues_rotation(const double *, double *); void make_step(double, double *); int calc_and_make_step(double, double, int); - int awc(double, double, double, double); + int adescent(double, double); double maximum_rotation(double *); double *rho; // estimation of curvature From aa3c44ad4af471e3c4cc65734f3abe43179d3b27 Mon Sep 17 00:00:00 2001 From: alxvov Date: Tue, 30 Jul 2019 12:02:10 +0000 Subject: [PATCH 085/418] modify documentation a bit --- doc/src/min_modify.txt | 6 +++--- doc/src/min_spin.txt | 11 +++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index ecd4795a8f..35a02c47c3 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -97,9 +97,9 @@ two minimization styles is declared. The {spin_cubic} performs the line search based on a cubic interpolation of the energy along the search direction. The {spin_none} keyword deactivates the line search procedure. -The {spin_none} is a default value for {line} keyword apart from the case when -single-replica calculations are performed with {spin_oso_lbfgs} that -uses {spin_cubic} line search. +The {spin_none} is a default value for {line} keyword for both {spin_oso_lbfgs} +and {spin_oso_cg}. Convergence of {spin_oso_lbfgs} can be more robust if +{spin_cubic} line search is used. [Restrictions:] The line search procedure of styles {spin_oso_cg} and {spin_oso_lbfgs} cannot be used for magnetic diff --git a/doc/src/min_spin.txt b/doc/src/min_spin.txt index 77dc008b3e..20c4cde1d7 100644 --- a/doc/src/min_spin.txt +++ b/doc/src/min_spin.txt @@ -18,7 +18,7 @@ min_style spin_oso_lbfgs :pre [Examples:] min_style spin_oso_lbfgs -min_modify line spin_none discrete_factor 10.0 :pre +min_modify line spin_cubic discrete_factor 10.0 :pre [Description:] @@ -62,16 +62,15 @@ and uses the adaptive time-step technique in the same way as style {spin}. Style {spin_oso_lbfgs} defines an orthogonal spin optimization (OSO) combined to a limited-memory Broyden-Fletcher-Goldfarb-Shanno (L-BFGS) algorithm. -By default, style {spin_oso_lbfgs} uses a line search procedure -based on cubic interpolation for -a single-replica calculation, and it does not use line search procedure -for a multireplica calculation (such as in case of GNEB calculation). +By default, style {spin_oso_lbfgs} does not employ line search procedure. If the line search procedure is not used then the discrete factor defines the maximum root mean squared rotation angle of spins by equation {pi/(5*Kappa)}. The default value for Kappa is 10. +The {spin_cubic} line search can improve +the convergence of the {spin_oso_lbfgs} algorithm. The "min_modify"_min_modify.html command can be used to -deactivate the line search procedure, and to modify the +activate the line search procedure, and to modify the discretization factor {discrete_factor}. For more information about styles {spin_oso_cg} and {spin_oso_lbfgs}, From 74fa4f741571be0bb060462691d76651d10394e8 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 30 Jul 2019 08:58:12 -0600 Subject: [PATCH 086/418] Commit JT 073019 - modified doc doc/src/min_modify.txt - tested lattice minimizers with norm styles --- doc/src/min_modify.txt | 19 +++++++++++-------- doc/src/min_spin.txt | 10 +++++----- doc/src/min_style.txt | 3 +-- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index 35a02c47c3..2056655d40 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -13,7 +13,7 @@ min_modify command :h3 min_modify keyword values ... :pre one or more keyword/value pairs may be listed :ulb,l -keyword = {dmax} or {line} or {alpha_damp} or {discrete_factor} +keyword = {dmax} or {line} or {norm} or {alpha_damp} or {discrete_factor} {dmax} value = max max = maximum distance for line search to move (distance units) {line} value = {backtrack} or {quadratic} or {forcezero} or {spin_cubic} or {spin_none} @@ -71,13 +71,12 @@ difference of two large values (energy before and energy after) and that difference may be smaller than machine epsilon even if atoms could move in the gradient direction to reduce forces further. -The choice of a norm can be modified for the min styles {fire}, -{quickmin}, {sd}, {spin}, {spin_oso_cg} and {spin_oso_lbfgs} -using the {norm} keyword. +The choice of a norm can be modified for the min styles {cg}, {sd}, +{quickmin}, {fire}, {spin}, {spin_oso_cg} and {spin_oso_lbfgs} using +the {norm} keyword. The default {euclidean} norm computes the 2-norm (length) of the global force vector. The {max} norm computes the maximum value -of the 2-norms of all forces in the system. - +of the 2-norms across all forces in the system. Keywords {alpha_damp} and {discrete_factor} only make sense when a "min_spin"_min_spin.html command is declared. @@ -88,7 +87,6 @@ Keyword {discrete_factor} defines a discretization factor for the adaptive timestep used in the {spin} minimization. See "min_spin"_min_spin.html for more information about those quantities. -Default values are {alpha_damp} = 1.0 and {discrete_factor} = 10.0. The choice of a line search algorithm for the {spin_oso_cg} and {spin_oso_lbfgs} styles can be specified via the {line} keyword. @@ -112,4 +110,9 @@ explanation. [Default:] -The option defaults are dmax = 0.1 and line = quadratic. +The option defaults are dmax = 0.1, line = quadratic and norm = +euclidean. + +For the {spin}, {spin_oso_cg} and {spin_oso_lbfgs} styles, the +option defaults are alpha_damp = 1.0, discrete_factor = 10.0, +line = spin_none, and norm = euclidean. diff --git a/doc/src/min_spin.txt b/doc/src/min_spin.txt index 20c4cde1d7..575db2dc74 100644 --- a/doc/src/min_spin.txt +++ b/doc/src/min_spin.txt @@ -56,7 +56,7 @@ Style {spin_oso_cg} defines an orthogonal spin optimization The "min_modify"_min_modify.html command can be used to couple the {spin_oso_cg} to a line search procedure, and to modify the discretization factor {discrete_factor}. -By defualt, the style {spin_oso_cg} does not employ line search procedure and +By default, style {spin_oso_cg} does not employ the line search procedure and uses the adaptive time-step technique in the same way as style {spin}. Style {spin_oso_lbfgs} defines an orthogonal spin optimization @@ -66,8 +66,8 @@ By default, style {spin_oso_lbfgs} does not employ line search procedure. If the line search procedure is not used then the discrete factor defines the maximum root mean squared rotation angle of spins by equation {pi/(5*Kappa)}. The default value for Kappa is 10. -The {spin_cubic} line search can improve -the convergence of the {spin_oso_lbfgs} algorithm. +The {spin_cubic} line search can improve the convergence of the +{spin_oso_lbfgs} algorithm. The "min_modify"_min_modify.html command can be used to activate the line search procedure, and to modify the @@ -95,8 +95,8 @@ freedom for a frozen lattice configuration. [Default:] -The option defaults are {alpha_damp} = 1.0 and {discrete_factor} = -10.0. +The option defaults are {alpha_damp} = 1.0, {discrete_factor} = +10.0, {line} = spin_none and {norm} = euclidean. :line diff --git a/doc/src/min_style.txt b/doc/src/min_style.txt index 081ec17889..7c40fd4947 100644 --- a/doc/src/min_style.txt +++ b/doc/src/min_style.txt @@ -11,8 +11,7 @@ min_style command :h3 min_style style :pre -style = {cg} or {hftn} or {sd} or {quickmin} or {fire} or {spin} -or {spin_oso_cg} or {spin_oso_lbfgs} :ul +style = {cg} or {hftn} or {sd} or {quickmin} or {fire} or {spin} or {spin_oso_cg} or {spin_oso_lbfgs} :ul [Examples:] From f4e3186abf95e0b0d6efd165c84a693ca295f448 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 30 Jul 2019 13:10:27 -0600 Subject: [PATCH 087/418] Commit JT 073019 - modified the false_positive file to correct errors - improved the doc page of fix nve/spin --- doc/src/fix_nve_spin.txt | 15 +++++++++++---- doc/src/min_modify.txt | 3 +-- doc/utils/sphinx-config/false_positives.txt | 5 +++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/doc/src/fix_nve_spin.txt b/doc/src/fix_nve_spin.txt index 7b382bb6ad..30df484e54 100644 --- a/doc/src/fix_nve_spin.txt +++ b/doc/src/fix_nve_spin.txt @@ -27,10 +27,16 @@ fix 1 all nve/spin lattice no :pre Perform a symplectic integration for the spin or spin-lattice system. -The {lattice} keyword defines if the spins are integrated on a lattice -of fixed atoms (lattice = no), or if atoms are moving (lattice = yes). +The {lattice} keyword defines whether the spins are integrated on a +fixed or moving lattice. -By default (lattice = yes), a spin-lattice integration is performed. +If {lattice}=yes, the equations of motion of the atoms are integrated, +and a combined spin and lattice calculation is performed. +This is the default option. + +If {lattice}=no, the equations of motion of the atoms are not +integrated. The lattice degrees of freedom are frozen, and a +spin dynamics only calculation is performed. The {nve/spin} fix applies a Suzuki-Trotter decomposition to the equations of motion of the spin lattice system, following the scheme: @@ -63,7 +69,8 @@ instead of "array" is also valid. "atom_style spin"_atom_style.html, "fix nve"_fix_nve.html -[Default:] none +[Default:] By default (lattice = yes), a spin-lattice integration is +performed. :line diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index 2056655d40..857c3551aa 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -110,8 +110,7 @@ explanation. [Default:] -The option defaults are dmax = 0.1, line = quadratic and norm = -euclidean. +The option defaults are dmax = 0.1, line = quadratic and norm = euclidean. For the {spin}, {spin_oso_cg} and {spin_oso_lbfgs} styles, the option defaults are alpha_damp = 1.0, discrete_factor = 10.0, diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 1dea229393..417738998e 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -273,6 +273,7 @@ Broadwell Broglie brownian brownw +Broyden Bryantsev Btarget btype @@ -981,6 +982,7 @@ gmask Gmask gneb GNEB +Goldfarb googlemail Gordan GPa @@ -1395,6 +1397,7 @@ Laupretre lavenderblush lawngreen lB +lbfgs lbl LBtype lcbop @@ -2030,6 +2033,7 @@ Orsi ortho orthonormal orthorhombic +oso ot Otype Ouldridge @@ -2493,6 +2497,7 @@ setvel sfftw Sg Shan +Shanno shapex shapey shapez From 55a7200246e5f3253d3f964e086a2cee8ba24048 Mon Sep 17 00:00:00 2001 From: charlie sievers Date: Wed, 7 Aug 2019 12:13:49 -0700 Subject: [PATCH 088/418] updates to src/fix_langevin.cpp --- src/fix_langevin.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index 723f4be2e4..ea0929a236 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -18,10 +18,11 @@ Niels Gronbech-Jensen (UC Davis) GJF-2GJ Formulation ------------------------------------------------------------------------- */ -#include "fix_langevin.h" #include #include #include +#include +#include "fix_langevin.h" #include "math_extra.h" #include "atom.h" #include "atom_vec_ellipsoid.h" @@ -29,6 +30,8 @@ #include "update.h" #include "modify.h" #include "compute.h" +#include "domain.h" +#include "region.h" #include "respa.h" #include "comm.h" #include "input.h" From ef3f382f61f436540fe6fc980f6fd40b876c793a Mon Sep 17 00:00:00 2001 From: charlie sievers Date: Wed, 7 Aug 2019 17:27:35 -0700 Subject: [PATCH 089/418] fixed tbias --- examples/python/gjf_python/README.md | 18 - examples/python/gjf_python/argon.lmp | 886 --------------------- examples/python/gjf_python/ff-argon.lmp | 20 - examples/python/gjf_python/gjf.py | 180 ----- examples/python/gjf_python/lammps_tools.py | 78 -- src/fix_langevin.cpp | 142 +++- src/fix_langevin.h | 1 + 7 files changed, 117 insertions(+), 1208 deletions(-) delete mode 100644 examples/python/gjf_python/README.md delete mode 100644 examples/python/gjf_python/argon.lmp delete mode 100644 examples/python/gjf_python/ff-argon.lmp delete mode 100644 examples/python/gjf_python/gjf.py delete mode 100644 examples/python/gjf_python/lammps_tools.py diff --git a/examples/python/gjf_python/README.md b/examples/python/gjf_python/README.md deleted file mode 100644 index 707289f02d..0000000000 --- a/examples/python/gjf_python/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# LAMMPS GJF-2GJ THERMOSTAT EXAMPLE W/ PYTHON - -## GJF-2GJ THERMOSTAT - -This directory contains a python script to run NVT simulations using the GJF-2GJ thermostat. -The script will vary the timestep and write thermodynamic output to screen. -This script has True/False options to change how you would like to dump/write your output. - -Example: -``` -NP=4 #number of processors -mpirun -np $NP python gjf.py -``` - -## Required LAMMPS packages: MOLECULE package -## LAMMPS COMPILE MODE: SHLIB -## LAMMPS OPTIONAL INSTALL: make install-python -## Required Python packages: mpi4py diff --git a/examples/python/gjf_python/argon.lmp b/examples/python/gjf_python/argon.lmp deleted file mode 100644 index 00214b4c54..0000000000 --- a/examples/python/gjf_python/argon.lmp +++ /dev/null @@ -1,886 +0,0 @@ -LAMMPS description - - 864 atoms - 0 bonds - 0 angles - 0 dihedrals - 0 impropers - - 1 atom types - 0 bond types - 0 angle types - 0 dihedral types - 0 improper types - - - 0.0000000 32.146000 xlo xhi - 0.0000000 32.146000 ylo yhi - 0.0000000 32.146000 zlo zhi - - Atoms - - 1 1 1 0.0000000 0.0000000 2.6790000 2.6790000 - 2 2 1 0.0000000 0.0000000 2.6790000 8.0360000 - 3 3 1 0.0000000 0.0000000 2.6790000 13.3940000 - 4 4 1 0.0000000 0.0000000 2.6790000 18.7520000 - 5 5 1 0.0000000 0.0000000 2.6790000 24.1090000 - 6 6 1 0.0000000 0.0000000 2.6790000 29.4670000 - 7 7 1 0.0000000 0.0000000 8.0360000 2.6790000 - 8 8 1 0.0000000 0.0000000 8.0360000 8.0360000 - 9 9 1 0.0000000 0.0000000 8.0360000 13.3940000 - 10 10 1 0.0000000 0.0000000 8.0360000 18.7520000 - 11 11 1 0.0000000 0.0000000 8.0360000 24.1090000 - 12 12 1 0.0000000 0.0000000 8.0360000 29.4670000 - 13 13 1 0.0000000 0.0000000 13.3940000 2.6790000 - 14 14 1 0.0000000 0.0000000 13.3940000 8.0360000 - 15 15 1 0.0000000 0.0000000 13.3940000 13.3940000 - 16 16 1 0.0000000 0.0000000 13.3940000 18.7520000 - 17 17 1 0.0000000 0.0000000 13.3940000 24.1090000 - 18 18 1 0.0000000 0.0000000 13.3940000 29.4670000 - 19 19 1 0.0000000 0.0000000 18.7520000 2.6790000 - 20 20 1 0.0000000 0.0000000 18.7520000 8.0360000 - 21 21 1 0.0000000 0.0000000 18.7520000 13.3940000 - 22 22 1 0.0000000 0.0000000 18.7520000 18.7520000 - 23 23 1 0.0000000 0.0000000 18.7520000 24.1090000 - 24 24 1 0.0000000 0.0000000 18.7520000 29.4670000 - 25 25 1 0.0000000 0.0000000 24.1090000 2.6790000 - 26 26 1 0.0000000 0.0000000 24.1090000 8.0360000 - 27 27 1 0.0000000 0.0000000 24.1090000 13.3940000 - 28 28 1 0.0000000 0.0000000 24.1090000 18.7520000 - 29 29 1 0.0000000 0.0000000 24.1090000 24.1090000 - 30 30 1 0.0000000 0.0000000 24.1090000 29.4670000 - 31 31 1 0.0000000 0.0000000 29.4670000 2.6790000 - 32 32 1 0.0000000 0.0000000 29.4670000 8.0360000 - 33 33 1 0.0000000 0.0000000 29.4670000 13.3940000 - 34 34 1 0.0000000 0.0000000 29.4670000 18.7520000 - 35 35 1 0.0000000 0.0000000 29.4670000 24.1090000 - 36 36 1 0.0000000 0.0000000 29.4670000 29.4670000 - 37 37 1 0.0000000 5.3580000 2.6790000 2.6790000 - 38 38 1 0.0000000 5.3580000 2.6790000 8.0360000 - 39 39 1 0.0000000 5.3580000 2.6790000 13.3940000 - 40 40 1 0.0000000 5.3580000 2.6790000 18.7520000 - 41 41 1 0.0000000 5.3580000 2.6790000 24.1090000 - 42 42 1 0.0000000 5.3580000 2.6790000 29.4670000 - 43 43 1 0.0000000 5.3580000 8.0360000 2.6790000 - 44 44 1 0.0000000 5.3580000 8.0360000 8.0360000 - 45 45 1 0.0000000 5.3580000 8.0360000 13.3940000 - 46 46 1 0.0000000 5.3580000 8.0360000 18.7520000 - 47 47 1 0.0000000 5.3580000 8.0360000 24.1090000 - 48 48 1 0.0000000 5.3580000 8.0360000 29.4670000 - 49 49 1 0.0000000 5.3580000 13.3940000 2.6790000 - 50 50 1 0.0000000 5.3580000 13.3940000 8.0360000 - 51 51 1 0.0000000 5.3580000 13.3940000 13.3940000 - 52 52 1 0.0000000 5.3580000 13.3940000 18.7520000 - 53 53 1 0.0000000 5.3580000 13.3940000 24.1090000 - 54 54 1 0.0000000 5.3580000 13.3940000 29.4670000 - 55 55 1 0.0000000 5.3580000 18.7520000 2.6790000 - 56 56 1 0.0000000 5.3580000 18.7520000 8.0360000 - 57 57 1 0.0000000 5.3580000 18.7520000 13.3940000 - 58 58 1 0.0000000 5.3580000 18.7520000 18.7520000 - 59 59 1 0.0000000 5.3580000 18.7520000 24.1090000 - 60 60 1 0.0000000 5.3580000 18.7520000 29.4670000 - 61 61 1 0.0000000 5.3580000 24.1090000 2.6790000 - 62 62 1 0.0000000 5.3580000 24.1090000 8.0360000 - 63 63 1 0.0000000 5.3580000 24.1090000 13.3940000 - 64 64 1 0.0000000 5.3580000 24.1090000 18.7520000 - 65 65 1 0.0000000 5.3580000 24.1090000 24.1090000 - 66 66 1 0.0000000 5.3580000 24.1090000 29.4670000 - 67 67 1 0.0000000 5.3580000 29.4670000 2.6790000 - 68 68 1 0.0000000 5.3580000 29.4670000 8.0360000 - 69 69 1 0.0000000 5.3580000 29.4670000 13.3940000 - 70 70 1 0.0000000 5.3580000 29.4670000 18.7520000 - 71 71 1 0.0000000 5.3580000 29.4670000 24.1090000 - 72 72 1 0.0000000 5.3580000 29.4670000 29.4670000 - 73 73 1 0.0000000 10.7150000 2.6790000 2.6790000 - 74 74 1 0.0000000 10.7150000 2.6790000 8.0360000 - 75 75 1 0.0000000 10.7150000 2.6790000 13.3940000 - 76 76 1 0.0000000 10.7150000 2.6790000 18.7520000 - 77 77 1 0.0000000 10.7150000 2.6790000 24.1090000 - 78 78 1 0.0000000 10.7150000 2.6790000 29.4670000 - 79 79 1 0.0000000 10.7150000 8.0360000 2.6790000 - 80 80 1 0.0000000 10.7150000 8.0360000 8.0360000 - 81 81 1 0.0000000 10.7150000 8.0360000 13.3940000 - 82 82 1 0.0000000 10.7150000 8.0360000 18.7520000 - 83 83 1 0.0000000 10.7150000 8.0360000 24.1090000 - 84 84 1 0.0000000 10.7150000 8.0360000 29.4670000 - 85 85 1 0.0000000 10.7150000 13.3940000 2.6790000 - 86 86 1 0.0000000 10.7150000 13.3940000 8.0360000 - 87 87 1 0.0000000 10.7150000 13.3940000 13.3940000 - 88 88 1 0.0000000 10.7150000 13.3940000 18.7520000 - 89 89 1 0.0000000 10.7150000 13.3940000 24.1090000 - 90 90 1 0.0000000 10.7150000 13.3940000 29.4670000 - 91 91 1 0.0000000 10.7150000 18.7520000 2.6790000 - 92 92 1 0.0000000 10.7150000 18.7520000 8.0360000 - 93 93 1 0.0000000 10.7150000 18.7520000 13.3940000 - 94 94 1 0.0000000 10.7150000 18.7520000 18.7520000 - 95 95 1 0.0000000 10.7150000 18.7520000 24.1090000 - 96 96 1 0.0000000 10.7150000 18.7520000 29.4670000 - 97 97 1 0.0000000 10.7150000 24.1090000 2.6790000 - 98 98 1 0.0000000 10.7150000 24.1090000 8.0360000 - 99 99 1 0.0000000 10.7150000 24.1090000 13.3940000 - 100 100 1 0.0000000 10.7150000 24.1090000 18.7520000 - 101 101 1 0.0000000 10.7150000 24.1090000 24.1090000 - 102 102 1 0.0000000 10.7150000 24.1090000 29.4670000 - 103 103 1 0.0000000 10.7150000 29.4670000 2.6790000 - 104 104 1 0.0000000 10.7150000 29.4670000 8.0360000 - 105 105 1 0.0000000 10.7150000 29.4670000 13.3940000 - 106 106 1 0.0000000 10.7150000 29.4670000 18.7520000 - 107 107 1 0.0000000 10.7150000 29.4670000 24.1090000 - 108 108 1 0.0000000 10.7150000 29.4670000 29.4670000 - 109 109 1 0.0000000 16.0730000 2.6790000 2.6790000 - 110 110 1 0.0000000 16.0730000 2.6790000 8.0360000 - 111 111 1 0.0000000 16.0730000 2.6790000 13.3940000 - 112 112 1 0.0000000 16.0730000 2.6790000 18.7520000 - 113 113 1 0.0000000 16.0730000 2.6790000 24.1090000 - 114 114 1 0.0000000 16.0730000 2.6790000 29.4670000 - 115 115 1 0.0000000 16.0730000 8.0360000 2.6790000 - 116 116 1 0.0000000 16.0730000 8.0360000 8.0360000 - 117 117 1 0.0000000 16.0730000 8.0360000 13.3940000 - 118 118 1 0.0000000 16.0730000 8.0360000 18.7520000 - 119 119 1 0.0000000 16.0730000 8.0360000 24.1090000 - 120 120 1 0.0000000 16.0730000 8.0360000 29.4670000 - 121 121 1 0.0000000 16.0730000 13.3940000 2.6790000 - 122 122 1 0.0000000 16.0730000 13.3940000 8.0360000 - 123 123 1 0.0000000 16.0730000 13.3940000 13.3940000 - 124 124 1 0.0000000 16.0730000 13.3940000 18.7520000 - 125 125 1 0.0000000 16.0730000 13.3940000 24.1090000 - 126 126 1 0.0000000 16.0730000 13.3940000 29.4670000 - 127 127 1 0.0000000 16.0730000 18.7520000 2.6790000 - 128 128 1 0.0000000 16.0730000 18.7520000 8.0360000 - 129 129 1 0.0000000 16.0730000 18.7520000 13.3940000 - 130 130 1 0.0000000 16.0730000 18.7520000 18.7520000 - 131 131 1 0.0000000 16.0730000 18.7520000 24.1090000 - 132 132 1 0.0000000 16.0730000 18.7520000 29.4670000 - 133 133 1 0.0000000 16.0730000 24.1090000 2.6790000 - 134 134 1 0.0000000 16.0730000 24.1090000 8.0360000 - 135 135 1 0.0000000 16.0730000 24.1090000 13.3940000 - 136 136 1 0.0000000 16.0730000 24.1090000 18.7520000 - 137 137 1 0.0000000 16.0730000 24.1090000 24.1090000 - 138 138 1 0.0000000 16.0730000 24.1090000 29.4670000 - 139 139 1 0.0000000 16.0730000 29.4670000 2.6790000 - 140 140 1 0.0000000 16.0730000 29.4670000 8.0360000 - 141 141 1 0.0000000 16.0730000 29.4670000 13.3940000 - 142 142 1 0.0000000 16.0730000 29.4670000 18.7520000 - 143 143 1 0.0000000 16.0730000 29.4670000 24.1090000 - 144 144 1 0.0000000 16.0730000 29.4670000 29.4670000 - 145 145 1 0.0000000 21.4310000 2.6790000 2.6790000 - 146 146 1 0.0000000 21.4310000 2.6790000 8.0360000 - 147 147 1 0.0000000 21.4310000 2.6790000 13.3940000 - 148 148 1 0.0000000 21.4310000 2.6790000 18.7520000 - 149 149 1 0.0000000 21.4310000 2.6790000 24.1090000 - 150 150 1 0.0000000 21.4310000 2.6790000 29.4670000 - 151 151 1 0.0000000 21.4310000 8.0360000 2.6790000 - 152 152 1 0.0000000 21.4310000 8.0360000 8.0360000 - 153 153 1 0.0000000 21.4310000 8.0360000 13.3940000 - 154 154 1 0.0000000 21.4310000 8.0360000 18.7520000 - 155 155 1 0.0000000 21.4310000 8.0360000 24.1090000 - 156 156 1 0.0000000 21.4310000 8.0360000 29.4670000 - 157 157 1 0.0000000 21.4310000 13.3940000 2.6790000 - 158 158 1 0.0000000 21.4310000 13.3940000 8.0360000 - 159 159 1 0.0000000 21.4310000 13.3940000 13.3940000 - 160 160 1 0.0000000 21.4310000 13.3940000 18.7520000 - 161 161 1 0.0000000 21.4310000 13.3940000 24.1090000 - 162 162 1 0.0000000 21.4310000 13.3940000 29.4670000 - 163 163 1 0.0000000 21.4310000 18.7520000 2.6790000 - 164 164 1 0.0000000 21.4310000 18.7520000 8.0360000 - 165 165 1 0.0000000 21.4310000 18.7520000 13.3940000 - 166 166 1 0.0000000 21.4310000 18.7520000 18.7520000 - 167 167 1 0.0000000 21.4310000 18.7520000 24.1090000 - 168 168 1 0.0000000 21.4310000 18.7520000 29.4670000 - 169 169 1 0.0000000 21.4310000 24.1090000 2.6790000 - 170 170 1 0.0000000 21.4310000 24.1090000 8.0360000 - 171 171 1 0.0000000 21.4310000 24.1090000 13.3940000 - 172 172 1 0.0000000 21.4310000 24.1090000 18.7520000 - 173 173 1 0.0000000 21.4310000 24.1090000 24.1090000 - 174 174 1 0.0000000 21.4310000 24.1090000 29.4670000 - 175 175 1 0.0000000 21.4310000 29.4670000 2.6790000 - 176 176 1 0.0000000 21.4310000 29.4670000 8.0360000 - 177 177 1 0.0000000 21.4310000 29.4670000 13.3940000 - 178 178 1 0.0000000 21.4310000 29.4670000 18.7520000 - 179 179 1 0.0000000 21.4310000 29.4670000 24.1090000 - 180 180 1 0.0000000 21.4310000 29.4670000 29.4670000 - 181 181 1 0.0000000 26.7880000 2.6790000 2.6790000 - 182 182 1 0.0000000 26.7880000 2.6790000 8.0360000 - 183 183 1 0.0000000 26.7880000 2.6790000 13.3940000 - 184 184 1 0.0000000 26.7880000 2.6790000 18.7520000 - 185 185 1 0.0000000 26.7880000 2.6790000 24.1090000 - 186 186 1 0.0000000 26.7880000 2.6790000 29.4670000 - 187 187 1 0.0000000 26.7880000 8.0360000 2.6790000 - 188 188 1 0.0000000 26.7880000 8.0360000 8.0360000 - 189 189 1 0.0000000 26.7880000 8.0360000 13.3940000 - 190 190 1 0.0000000 26.7880000 8.0360000 18.7520000 - 191 191 1 0.0000000 26.7880000 8.0360000 24.1090000 - 192 192 1 0.0000000 26.7880000 8.0360000 29.4670000 - 193 193 1 0.0000000 26.7880000 13.3940000 2.6790000 - 194 194 1 0.0000000 26.7880000 13.3940000 8.0360000 - 195 195 1 0.0000000 26.7880000 13.3940000 13.3940000 - 196 196 1 0.0000000 26.7880000 13.3940000 18.7520000 - 197 197 1 0.0000000 26.7880000 13.3940000 24.1090000 - 198 198 1 0.0000000 26.7880000 13.3940000 29.4670000 - 199 199 1 0.0000000 26.7880000 18.7520000 2.6790000 - 200 200 1 0.0000000 26.7880000 18.7520000 8.0360000 - 201 201 1 0.0000000 26.7880000 18.7520000 13.3940000 - 202 202 1 0.0000000 26.7880000 18.7520000 18.7520000 - 203 203 1 0.0000000 26.7880000 18.7520000 24.1090000 - 204 204 1 0.0000000 26.7880000 18.7520000 29.4670000 - 205 205 1 0.0000000 26.7880000 24.1090000 2.6790000 - 206 206 1 0.0000000 26.7880000 24.1090000 8.0360000 - 207 207 1 0.0000000 26.7880000 24.1090000 13.3940000 - 208 208 1 0.0000000 26.7880000 24.1090000 18.7520000 - 209 209 1 0.0000000 26.7880000 24.1090000 24.1090000 - 210 210 1 0.0000000 26.7880000 24.1090000 29.4670000 - 211 211 1 0.0000000 26.7880000 29.4670000 2.6790000 - 212 212 1 0.0000000 26.7880000 29.4670000 8.0360000 - 213 213 1 0.0000000 26.7880000 29.4670000 13.3940000 - 214 214 1 0.0000000 26.7880000 29.4670000 18.7520000 - 215 215 1 0.0000000 26.7880000 29.4670000 24.1090000 - 216 216 1 0.0000000 26.7880000 29.4670000 29.4670000 - 217 217 1 0.0000000 2.6790000 5.3580000 2.6790000 - 218 218 1 0.0000000 2.6790000 5.3580000 8.0360000 - 219 219 1 0.0000000 2.6790000 5.3580000 13.3940000 - 220 220 1 0.0000000 2.6790000 5.3580000 18.7520000 - 221 221 1 0.0000000 2.6790000 5.3580000 24.1090000 - 222 222 1 0.0000000 2.6790000 5.3580000 29.4670000 - 223 223 1 0.0000000 2.6790000 10.7150000 2.6790000 - 224 224 1 0.0000000 2.6790000 10.7150000 8.0360000 - 225 225 1 0.0000000 2.6790000 10.7150000 13.3940000 - 226 226 1 0.0000000 2.6790000 10.7150000 18.7520000 - 227 227 1 0.0000000 2.6790000 10.7150000 24.1090000 - 228 228 1 0.0000000 2.6790000 10.7150000 29.4670000 - 229 229 1 0.0000000 2.6790000 16.0730000 2.6790000 - 230 230 1 0.0000000 2.6790000 16.0730000 8.0360000 - 231 231 1 0.0000000 2.6790000 16.0730000 13.3940000 - 232 232 1 0.0000000 2.6790000 16.0730000 18.7520000 - 233 233 1 0.0000000 2.6790000 16.0730000 24.1090000 - 234 234 1 0.0000000 2.6790000 16.0730000 29.4670000 - 235 235 1 0.0000000 2.6790000 21.4310000 2.6790000 - 236 236 1 0.0000000 2.6790000 21.4310000 8.0360000 - 237 237 1 0.0000000 2.6790000 21.4310000 13.3940000 - 238 238 1 0.0000000 2.6790000 21.4310000 18.7520000 - 239 239 1 0.0000000 2.6790000 21.4310000 24.1090000 - 240 240 1 0.0000000 2.6790000 21.4310000 29.4670000 - 241 241 1 0.0000000 2.6790000 26.7880000 2.6790000 - 242 242 1 0.0000000 2.6790000 26.7880000 8.0360000 - 243 243 1 0.0000000 2.6790000 26.7880000 13.3940000 - 244 244 1 0.0000000 2.6790000 26.7880000 18.7520000 - 245 245 1 0.0000000 2.6790000 26.7880000 24.1090000 - 246 246 1 0.0000000 2.6790000 26.7880000 29.4670000 - 247 247 1 0.0000000 2.6790000 32.1460000 2.6790000 - 248 248 1 0.0000000 2.6790000 32.1460000 8.0360000 - 249 249 1 0.0000000 2.6790000 32.1460000 13.3940000 - 250 250 1 0.0000000 2.6790000 32.1460000 18.7520000 - 251 251 1 0.0000000 2.6790000 32.1460000 24.1090000 - 252 252 1 0.0000000 2.6790000 32.1460000 29.4670000 - 253 253 1 0.0000000 8.0360000 5.3580000 2.6790000 - 254 254 1 0.0000000 8.0360000 5.3580000 8.0360000 - 255 255 1 0.0000000 8.0360000 5.3580000 13.3940000 - 256 256 1 0.0000000 8.0360000 5.3580000 18.7520000 - 257 257 1 0.0000000 8.0360000 5.3580000 24.1090000 - 258 258 1 0.0000000 8.0360000 5.3580000 29.4670000 - 259 259 1 0.0000000 8.0360000 10.7150000 2.6790000 - 260 260 1 0.0000000 8.0360000 10.7150000 8.0360000 - 261 261 1 0.0000000 8.0360000 10.7150000 13.3940000 - 262 262 1 0.0000000 8.0360000 10.7150000 18.7520000 - 263 263 1 0.0000000 8.0360000 10.7150000 24.1090000 - 264 264 1 0.0000000 8.0360000 10.7150000 29.4670000 - 265 265 1 0.0000000 8.0360000 16.0730000 2.6790000 - 266 266 1 0.0000000 8.0360000 16.0730000 8.0360000 - 267 267 1 0.0000000 8.0360000 16.0730000 13.3940000 - 268 268 1 0.0000000 8.0360000 16.0730000 18.7520000 - 269 269 1 0.0000000 8.0360000 16.0730000 24.1090000 - 270 270 1 0.0000000 8.0360000 16.0730000 29.4670000 - 271 271 1 0.0000000 8.0360000 21.4310000 2.6790000 - 272 272 1 0.0000000 8.0360000 21.4310000 8.0360000 - 273 273 1 0.0000000 8.0360000 21.4310000 13.3940000 - 274 274 1 0.0000000 8.0360000 21.4310000 18.7520000 - 275 275 1 0.0000000 8.0360000 21.4310000 24.1090000 - 276 276 1 0.0000000 8.0360000 21.4310000 29.4670000 - 277 277 1 0.0000000 8.0360000 26.7880000 2.6790000 - 278 278 1 0.0000000 8.0360000 26.7880000 8.0360000 - 279 279 1 0.0000000 8.0360000 26.7880000 13.3940000 - 280 280 1 0.0000000 8.0360000 26.7880000 18.7520000 - 281 281 1 0.0000000 8.0360000 26.7880000 24.1090000 - 282 282 1 0.0000000 8.0360000 26.7880000 29.4670000 - 283 283 1 0.0000000 8.0360000 32.1460000 2.6790000 - 284 284 1 0.0000000 8.0360000 32.1460000 8.0360000 - 285 285 1 0.0000000 8.0360000 32.1460000 13.3940000 - 286 286 1 0.0000000 8.0360000 32.1460000 18.7520000 - 287 287 1 0.0000000 8.0360000 32.1460000 24.1090000 - 288 288 1 0.0000000 8.0360000 32.1460000 29.4670000 - 289 289 1 0.0000000 13.3940000 5.3580000 2.6790000 - 290 290 1 0.0000000 13.3940000 5.3580000 8.0360000 - 291 291 1 0.0000000 13.3940000 5.3580000 13.3940000 - 292 292 1 0.0000000 13.3940000 5.3580000 18.7520000 - 293 293 1 0.0000000 13.3940000 5.3580000 24.1090000 - 294 294 1 0.0000000 13.3940000 5.3580000 29.4670000 - 295 295 1 0.0000000 13.3940000 10.7150000 2.6790000 - 296 296 1 0.0000000 13.3940000 10.7150000 8.0360000 - 297 297 1 0.0000000 13.3940000 10.7150000 13.3940000 - 298 298 1 0.0000000 13.3940000 10.7150000 18.7520000 - 299 299 1 0.0000000 13.3940000 10.7150000 24.1090000 - 300 300 1 0.0000000 13.3940000 10.7150000 29.4670000 - 301 301 1 0.0000000 13.3940000 16.0730000 2.6790000 - 302 302 1 0.0000000 13.3940000 16.0730000 8.0360000 - 303 303 1 0.0000000 13.3940000 16.0730000 13.3940000 - 304 304 1 0.0000000 13.3940000 16.0730000 18.7520000 - 305 305 1 0.0000000 13.3940000 16.0730000 24.1090000 - 306 306 1 0.0000000 13.3940000 16.0730000 29.4670000 - 307 307 1 0.0000000 13.3940000 21.4310000 2.6790000 - 308 308 1 0.0000000 13.3940000 21.4310000 8.0360000 - 309 309 1 0.0000000 13.3940000 21.4310000 13.3940000 - 310 310 1 0.0000000 13.3940000 21.4310000 18.7520000 - 311 311 1 0.0000000 13.3940000 21.4310000 24.1090000 - 312 312 1 0.0000000 13.3940000 21.4310000 29.4670000 - 313 313 1 0.0000000 13.3940000 26.7880000 2.6790000 - 314 314 1 0.0000000 13.3940000 26.7880000 8.0360000 - 315 315 1 0.0000000 13.3940000 26.7880000 13.3940000 - 316 316 1 0.0000000 13.3940000 26.7880000 18.7520000 - 317 317 1 0.0000000 13.3940000 26.7880000 24.1090000 - 318 318 1 0.0000000 13.3940000 26.7880000 29.4670000 - 319 319 1 0.0000000 13.3940000 32.1460000 2.6790000 - 320 320 1 0.0000000 13.3940000 32.1460000 8.0360000 - 321 321 1 0.0000000 13.3940000 32.1460000 13.3940000 - 322 322 1 0.0000000 13.3940000 32.1460000 18.7520000 - 323 323 1 0.0000000 13.3940000 32.1460000 24.1090000 - 324 324 1 0.0000000 13.3940000 32.1460000 29.4670000 - 325 325 1 0.0000000 18.7520000 5.3580000 2.6790000 - 326 326 1 0.0000000 18.7520000 5.3580000 8.0360000 - 327 327 1 0.0000000 18.7520000 5.3580000 13.3940000 - 328 328 1 0.0000000 18.7520000 5.3580000 18.7520000 - 329 329 1 0.0000000 18.7520000 5.3580000 24.1090000 - 330 330 1 0.0000000 18.7520000 5.3580000 29.4670000 - 331 331 1 0.0000000 18.7520000 10.7150000 2.6790000 - 332 332 1 0.0000000 18.7520000 10.7150000 8.0360000 - 333 333 1 0.0000000 18.7520000 10.7150000 13.3940000 - 334 334 1 0.0000000 18.7520000 10.7150000 18.7520000 - 335 335 1 0.0000000 18.7520000 10.7150000 24.1090000 - 336 336 1 0.0000000 18.7520000 10.7150000 29.4670000 - 337 337 1 0.0000000 18.7520000 16.0730000 2.6790000 - 338 338 1 0.0000000 18.7520000 16.0730000 8.0360000 - 339 339 1 0.0000000 18.7520000 16.0730000 13.3940000 - 340 340 1 0.0000000 18.7520000 16.0730000 18.7520000 - 341 341 1 0.0000000 18.7520000 16.0730000 24.1090000 - 342 342 1 0.0000000 18.7520000 16.0730000 29.4670000 - 343 343 1 0.0000000 18.7520000 21.4310000 2.6790000 - 344 344 1 0.0000000 18.7520000 21.4310000 8.0360000 - 345 345 1 0.0000000 18.7520000 21.4310000 13.3940000 - 346 346 1 0.0000000 18.7520000 21.4310000 18.7520000 - 347 347 1 0.0000000 18.7520000 21.4310000 24.1090000 - 348 348 1 0.0000000 18.7520000 21.4310000 29.4670000 - 349 349 1 0.0000000 18.7520000 26.7880000 2.6790000 - 350 350 1 0.0000000 18.7520000 26.7880000 8.0360000 - 351 351 1 0.0000000 18.7520000 26.7880000 13.3940000 - 352 352 1 0.0000000 18.7520000 26.7880000 18.7520000 - 353 353 1 0.0000000 18.7520000 26.7880000 24.1090000 - 354 354 1 0.0000000 18.7520000 26.7880000 29.4670000 - 355 355 1 0.0000000 18.7520000 32.1460000 2.6790000 - 356 356 1 0.0000000 18.7520000 32.1460000 8.0360000 - 357 357 1 0.0000000 18.7520000 32.1460000 13.3940000 - 358 358 1 0.0000000 18.7520000 32.1460000 18.7520000 - 359 359 1 0.0000000 18.7520000 32.1460000 24.1090000 - 360 360 1 0.0000000 18.7520000 32.1460000 29.4670000 - 361 361 1 0.0000000 24.1090000 5.3580000 2.6790000 - 362 362 1 0.0000000 24.1090000 5.3580000 8.0360000 - 363 363 1 0.0000000 24.1090000 5.3580000 13.3940000 - 364 364 1 0.0000000 24.1090000 5.3580000 18.7520000 - 365 365 1 0.0000000 24.1090000 5.3580000 24.1090000 - 366 366 1 0.0000000 24.1090000 5.3580000 29.4670000 - 367 367 1 0.0000000 24.1090000 10.7150000 2.6790000 - 368 368 1 0.0000000 24.1090000 10.7150000 8.0360000 - 369 369 1 0.0000000 24.1090000 10.7150000 13.3940000 - 370 370 1 0.0000000 24.1090000 10.7150000 18.7520000 - 371 371 1 0.0000000 24.1090000 10.7150000 24.1090000 - 372 372 1 0.0000000 24.1090000 10.7150000 29.4670000 - 373 373 1 0.0000000 24.1090000 16.0730000 2.6790000 - 374 374 1 0.0000000 24.1090000 16.0730000 8.0360000 - 375 375 1 0.0000000 24.1090000 16.0730000 13.3940000 - 376 376 1 0.0000000 24.1090000 16.0730000 18.7520000 - 377 377 1 0.0000000 24.1090000 16.0730000 24.1090000 - 378 378 1 0.0000000 24.1090000 16.0730000 29.4670000 - 379 379 1 0.0000000 24.1090000 21.4310000 2.6790000 - 380 380 1 0.0000000 24.1090000 21.4310000 8.0360000 - 381 381 1 0.0000000 24.1090000 21.4310000 13.3940000 - 382 382 1 0.0000000 24.1090000 21.4310000 18.7520000 - 383 383 1 0.0000000 24.1090000 21.4310000 24.1090000 - 384 384 1 0.0000000 24.1090000 21.4310000 29.4670000 - 385 385 1 0.0000000 24.1090000 26.7880000 2.6790000 - 386 386 1 0.0000000 24.1090000 26.7880000 8.0360000 - 387 387 1 0.0000000 24.1090000 26.7880000 13.3940000 - 388 388 1 0.0000000 24.1090000 26.7880000 18.7520000 - 389 389 1 0.0000000 24.1090000 26.7880000 24.1090000 - 390 390 1 0.0000000 24.1090000 26.7880000 29.4670000 - 391 391 1 0.0000000 24.1090000 32.1460000 2.6790000 - 392 392 1 0.0000000 24.1090000 32.1460000 8.0360000 - 393 393 1 0.0000000 24.1090000 32.1460000 13.3940000 - 394 394 1 0.0000000 24.1090000 32.1460000 18.7520000 - 395 395 1 0.0000000 24.1090000 32.1460000 24.1090000 - 396 396 1 0.0000000 24.1090000 32.1460000 29.4670000 - 397 397 1 0.0000000 29.4670000 5.3580000 2.6790000 - 398 398 1 0.0000000 29.4670000 5.3580000 8.0360000 - 399 399 1 0.0000000 29.4670000 5.3580000 13.3940000 - 400 400 1 0.0000000 29.4670000 5.3580000 18.7520000 - 401 401 1 0.0000000 29.4670000 5.3580000 24.1090000 - 402 402 1 0.0000000 29.4670000 5.3580000 29.4670000 - 403 403 1 0.0000000 29.4670000 10.7150000 2.6790000 - 404 404 1 0.0000000 29.4670000 10.7150000 8.0360000 - 405 405 1 0.0000000 29.4670000 10.7150000 13.3940000 - 406 406 1 0.0000000 29.4670000 10.7150000 18.7520000 - 407 407 1 0.0000000 29.4670000 10.7150000 24.1090000 - 408 408 1 0.0000000 29.4670000 10.7150000 29.4670000 - 409 409 1 0.0000000 29.4670000 16.0730000 2.6790000 - 410 410 1 0.0000000 29.4670000 16.0730000 8.0360000 - 411 411 1 0.0000000 29.4670000 16.0730000 13.3940000 - 412 412 1 0.0000000 29.4670000 16.0730000 18.7520000 - 413 413 1 0.0000000 29.4670000 16.0730000 24.1090000 - 414 414 1 0.0000000 29.4670000 16.0730000 29.4670000 - 415 415 1 0.0000000 29.4670000 21.4310000 2.6790000 - 416 416 1 0.0000000 29.4670000 21.4310000 8.0360000 - 417 417 1 0.0000000 29.4670000 21.4310000 13.3940000 - 418 418 1 0.0000000 29.4670000 21.4310000 18.7520000 - 419 419 1 0.0000000 29.4670000 21.4310000 24.1090000 - 420 420 1 0.0000000 29.4670000 21.4310000 29.4670000 - 421 421 1 0.0000000 29.4670000 26.7880000 2.6790000 - 422 422 1 0.0000000 29.4670000 26.7880000 8.0360000 - 423 423 1 0.0000000 29.4670000 26.7880000 13.3940000 - 424 424 1 0.0000000 29.4670000 26.7880000 18.7520000 - 425 425 1 0.0000000 29.4670000 26.7880000 24.1090000 - 426 426 1 0.0000000 29.4670000 26.7880000 29.4670000 - 427 427 1 0.0000000 29.4670000 32.1460000 2.6790000 - 428 428 1 0.0000000 29.4670000 32.1460000 8.0360000 - 429 429 1 0.0000000 29.4670000 32.1460000 13.3940000 - 430 430 1 0.0000000 29.4670000 32.1460000 18.7520000 - 431 431 1 0.0000000 29.4670000 32.1460000 24.1090000 - 432 432 1 0.0000000 29.4670000 32.1460000 29.4670000 - 433 433 1 0.0000000 2.6790000 2.6790000 5.3580000 - 434 434 1 0.0000000 2.6790000 2.6790000 10.7150000 - 435 435 1 0.0000000 2.6790000 2.6790000 16.0730000 - 436 436 1 0.0000000 2.6790000 2.6790000 21.4310000 - 437 437 1 0.0000000 2.6790000 2.6790000 26.7880000 - 438 438 1 0.0000000 2.6790000 2.6790000 32.1460000 - 439 439 1 0.0000000 2.6790000 8.0360000 5.3580000 - 440 440 1 0.0000000 2.6790000 8.0360000 10.7150000 - 441 441 1 0.0000000 2.6790000 8.0360000 16.0730000 - 442 442 1 0.0000000 2.6790000 8.0360000 21.4310000 - 443 443 1 0.0000000 2.6790000 8.0360000 26.7880000 - 444 444 1 0.0000000 2.6790000 8.0360000 32.1460000 - 445 445 1 0.0000000 2.6790000 13.3940000 5.3580000 - 446 446 1 0.0000000 2.6790000 13.3940000 10.7150000 - 447 447 1 0.0000000 2.6790000 13.3940000 16.0730000 - 448 448 1 0.0000000 2.6790000 13.3940000 21.4310000 - 449 449 1 0.0000000 2.6790000 13.3940000 26.7880000 - 450 450 1 0.0000000 2.6790000 13.3940000 32.1460000 - 451 451 1 0.0000000 2.6790000 18.7520000 5.3580000 - 452 452 1 0.0000000 2.6790000 18.7520000 10.7150000 - 453 453 1 0.0000000 2.6790000 18.7520000 16.0730000 - 454 454 1 0.0000000 2.6790000 18.7520000 21.4310000 - 455 455 1 0.0000000 2.6790000 18.7520000 26.7880000 - 456 456 1 0.0000000 2.6790000 18.7520000 32.1460000 - 457 457 1 0.0000000 2.6790000 24.1090000 5.3580000 - 458 458 1 0.0000000 2.6790000 24.1090000 10.7150000 - 459 459 1 0.0000000 2.6790000 24.1090000 16.0730000 - 460 460 1 0.0000000 2.6790000 24.1090000 21.4310000 - 461 461 1 0.0000000 2.6790000 24.1090000 26.7880000 - 462 462 1 0.0000000 2.6790000 24.1090000 32.1460000 - 463 463 1 0.0000000 2.6790000 29.4670000 5.3580000 - 464 464 1 0.0000000 2.6790000 29.4670000 10.7150000 - 465 465 1 0.0000000 2.6790000 29.4670000 16.0730000 - 466 466 1 0.0000000 2.6790000 29.4670000 21.4310000 - 467 467 1 0.0000000 2.6790000 29.4670000 26.7880000 - 468 468 1 0.0000000 2.6790000 29.4670000 32.1460000 - 469 469 1 0.0000000 8.0360000 2.6790000 5.3580000 - 470 470 1 0.0000000 8.0360000 2.6790000 10.7150000 - 471 471 1 0.0000000 8.0360000 2.6790000 16.0730000 - 472 472 1 0.0000000 8.0360000 2.6790000 21.4310000 - 473 473 1 0.0000000 8.0360000 2.6790000 26.7880000 - 474 474 1 0.0000000 8.0360000 2.6790000 32.1460000 - 475 475 1 0.0000000 8.0360000 8.0360000 5.3580000 - 476 476 1 0.0000000 8.0360000 8.0360000 10.7150000 - 477 477 1 0.0000000 8.0360000 8.0360000 16.0730000 - 478 478 1 0.0000000 8.0360000 8.0360000 21.4310000 - 479 479 1 0.0000000 8.0360000 8.0360000 26.7880000 - 480 480 1 0.0000000 8.0360000 8.0360000 32.1460000 - 481 481 1 0.0000000 8.0360000 13.3940000 5.3580000 - 482 482 1 0.0000000 8.0360000 13.3940000 10.7150000 - 483 483 1 0.0000000 8.0360000 13.3940000 16.0730000 - 484 484 1 0.0000000 8.0360000 13.3940000 21.4310000 - 485 485 1 0.0000000 8.0360000 13.3940000 26.7880000 - 486 486 1 0.0000000 8.0360000 13.3940000 32.1460000 - 487 487 1 0.0000000 8.0360000 18.7520000 5.3580000 - 488 488 1 0.0000000 8.0360000 18.7520000 10.7150000 - 489 489 1 0.0000000 8.0360000 18.7520000 16.0730000 - 490 490 1 0.0000000 8.0360000 18.7520000 21.4310000 - 491 491 1 0.0000000 8.0360000 18.7520000 26.7880000 - 492 492 1 0.0000000 8.0360000 18.7520000 32.1460000 - 493 493 1 0.0000000 8.0360000 24.1090000 5.3580000 - 494 494 1 0.0000000 8.0360000 24.1090000 10.7150000 - 495 495 1 0.0000000 8.0360000 24.1090000 16.0730000 - 496 496 1 0.0000000 8.0360000 24.1090000 21.4310000 - 497 497 1 0.0000000 8.0360000 24.1090000 26.7880000 - 498 498 1 0.0000000 8.0360000 24.1090000 32.1460000 - 499 499 1 0.0000000 8.0360000 29.4670000 5.3580000 - 500 500 1 0.0000000 8.0360000 29.4670000 10.7150000 - 501 501 1 0.0000000 8.0360000 29.4670000 16.0730000 - 502 502 1 0.0000000 8.0360000 29.4670000 21.4310000 - 503 503 1 0.0000000 8.0360000 29.4670000 26.7880000 - 504 504 1 0.0000000 8.0360000 29.4670000 32.1460000 - 505 505 1 0.0000000 13.3940000 2.6790000 5.3580000 - 506 506 1 0.0000000 13.3940000 2.6790000 10.7150000 - 507 507 1 0.0000000 13.3940000 2.6790000 16.0730000 - 508 508 1 0.0000000 13.3940000 2.6790000 21.4310000 - 509 509 1 0.0000000 13.3940000 2.6790000 26.7880000 - 510 510 1 0.0000000 13.3940000 2.6790000 32.1460000 - 511 511 1 0.0000000 13.3940000 8.0360000 5.3580000 - 512 512 1 0.0000000 13.3940000 8.0360000 10.7150000 - 513 513 1 0.0000000 13.3940000 8.0360000 16.0730000 - 514 514 1 0.0000000 13.3940000 8.0360000 21.4310000 - 515 515 1 0.0000000 13.3940000 8.0360000 26.7880000 - 516 516 1 0.0000000 13.3940000 8.0360000 32.1460000 - 517 517 1 0.0000000 13.3940000 13.3940000 5.3580000 - 518 518 1 0.0000000 13.3940000 13.3940000 10.7150000 - 519 519 1 0.0000000 13.3940000 13.3940000 16.0730000 - 520 520 1 0.0000000 13.3940000 13.3940000 21.4310000 - 521 521 1 0.0000000 13.3940000 13.3940000 26.7880000 - 522 522 1 0.0000000 13.3940000 13.3940000 32.1460000 - 523 523 1 0.0000000 13.3940000 18.7520000 5.3580000 - 524 524 1 0.0000000 13.3940000 18.7520000 10.7150000 - 525 525 1 0.0000000 13.3940000 18.7520000 16.0730000 - 526 526 1 0.0000000 13.3940000 18.7520000 21.4310000 - 527 527 1 0.0000000 13.3940000 18.7520000 26.7880000 - 528 528 1 0.0000000 13.3940000 18.7520000 32.1460000 - 529 529 1 0.0000000 13.3940000 24.1090000 5.3580000 - 530 530 1 0.0000000 13.3940000 24.1090000 10.7150000 - 531 531 1 0.0000000 13.3940000 24.1090000 16.0730000 - 532 532 1 0.0000000 13.3940000 24.1090000 21.4310000 - 533 533 1 0.0000000 13.3940000 24.1090000 26.7880000 - 534 534 1 0.0000000 13.3940000 24.1090000 32.1460000 - 535 535 1 0.0000000 13.3940000 29.4670000 5.3580000 - 536 536 1 0.0000000 13.3940000 29.4670000 10.7150000 - 537 537 1 0.0000000 13.3940000 29.4670000 16.0730000 - 538 538 1 0.0000000 13.3940000 29.4670000 21.4310000 - 539 539 1 0.0000000 13.3940000 29.4670000 26.7880000 - 540 540 1 0.0000000 13.3940000 29.4670000 32.1460000 - 541 541 1 0.0000000 18.7520000 2.6790000 5.3580000 - 542 542 1 0.0000000 18.7520000 2.6790000 10.7150000 - 543 543 1 0.0000000 18.7520000 2.6790000 16.0730000 - 544 544 1 0.0000000 18.7520000 2.6790000 21.4310000 - 545 545 1 0.0000000 18.7520000 2.6790000 26.7880000 - 546 546 1 0.0000000 18.7520000 2.6790000 32.1460000 - 547 547 1 0.0000000 18.7520000 8.0360000 5.3580000 - 548 548 1 0.0000000 18.7520000 8.0360000 10.7150000 - 549 549 1 0.0000000 18.7520000 8.0360000 16.0730000 - 550 550 1 0.0000000 18.7520000 8.0360000 21.4310000 - 551 551 1 0.0000000 18.7520000 8.0360000 26.7880000 - 552 552 1 0.0000000 18.7520000 8.0360000 32.1460000 - 553 553 1 0.0000000 18.7520000 13.3940000 5.3580000 - 554 554 1 0.0000000 18.7520000 13.3940000 10.7150000 - 555 555 1 0.0000000 18.7520000 13.3940000 16.0730000 - 556 556 1 0.0000000 18.7520000 13.3940000 21.4310000 - 557 557 1 0.0000000 18.7520000 13.3940000 26.7880000 - 558 558 1 0.0000000 18.7520000 13.3940000 32.1460000 - 559 559 1 0.0000000 18.7520000 18.7520000 5.3580000 - 560 560 1 0.0000000 18.7520000 18.7520000 10.7150000 - 561 561 1 0.0000000 18.7520000 18.7520000 16.0730000 - 562 562 1 0.0000000 18.7520000 18.7520000 21.4310000 - 563 563 1 0.0000000 18.7520000 18.7520000 26.7880000 - 564 564 1 0.0000000 18.7520000 18.7520000 32.1460000 - 565 565 1 0.0000000 18.7520000 24.1090000 5.3580000 - 566 566 1 0.0000000 18.7520000 24.1090000 10.7150000 - 567 567 1 0.0000000 18.7520000 24.1090000 16.0730000 - 568 568 1 0.0000000 18.7520000 24.1090000 21.4310000 - 569 569 1 0.0000000 18.7520000 24.1090000 26.7880000 - 570 570 1 0.0000000 18.7520000 24.1090000 32.1460000 - 571 571 1 0.0000000 18.7520000 29.4670000 5.3580000 - 572 572 1 0.0000000 18.7520000 29.4670000 10.7150000 - 573 573 1 0.0000000 18.7520000 29.4670000 16.0730000 - 574 574 1 0.0000000 18.7520000 29.4670000 21.4310000 - 575 575 1 0.0000000 18.7520000 29.4670000 26.7880000 - 576 576 1 0.0000000 18.7520000 29.4670000 32.1460000 - 577 577 1 0.0000000 24.1090000 2.6790000 5.3580000 - 578 578 1 0.0000000 24.1090000 2.6790000 10.7150000 - 579 579 1 0.0000000 24.1090000 2.6790000 16.0730000 - 580 580 1 0.0000000 24.1090000 2.6790000 21.4310000 - 581 581 1 0.0000000 24.1090000 2.6790000 26.7880000 - 582 582 1 0.0000000 24.1090000 2.6790000 32.1460000 - 583 583 1 0.0000000 24.1090000 8.0360000 5.3580000 - 584 584 1 0.0000000 24.1090000 8.0360000 10.7150000 - 585 585 1 0.0000000 24.1090000 8.0360000 16.0730000 - 586 586 1 0.0000000 24.1090000 8.0360000 21.4310000 - 587 587 1 0.0000000 24.1090000 8.0360000 26.7880000 - 588 588 1 0.0000000 24.1090000 8.0360000 32.1460000 - 589 589 1 0.0000000 24.1090000 13.3940000 5.3580000 - 590 590 1 0.0000000 24.1090000 13.3940000 10.7150000 - 591 591 1 0.0000000 24.1090000 13.3940000 16.0730000 - 592 592 1 0.0000000 24.1090000 13.3940000 21.4310000 - 593 593 1 0.0000000 24.1090000 13.3940000 26.7880000 - 594 594 1 0.0000000 24.1090000 13.3940000 32.1460000 - 595 595 1 0.0000000 24.1090000 18.7520000 5.3580000 - 596 596 1 0.0000000 24.1090000 18.7520000 10.7150000 - 597 597 1 0.0000000 24.1090000 18.7520000 16.0730000 - 598 598 1 0.0000000 24.1090000 18.7520000 21.4310000 - 599 599 1 0.0000000 24.1090000 18.7520000 26.7880000 - 600 600 1 0.0000000 24.1090000 18.7520000 32.1460000 - 601 601 1 0.0000000 24.1090000 24.1090000 5.3580000 - 602 602 1 0.0000000 24.1090000 24.1090000 10.7150000 - 603 603 1 0.0000000 24.1090000 24.1090000 16.0730000 - 604 604 1 0.0000000 24.1090000 24.1090000 21.4310000 - 605 605 1 0.0000000 24.1090000 24.1090000 26.7880000 - 606 606 1 0.0000000 24.1090000 24.1090000 32.1460000 - 607 607 1 0.0000000 24.1090000 29.4670000 5.3580000 - 608 608 1 0.0000000 24.1090000 29.4670000 10.7150000 - 609 609 1 0.0000000 24.1090000 29.4670000 16.0730000 - 610 610 1 0.0000000 24.1090000 29.4670000 21.4310000 - 611 611 1 0.0000000 24.1090000 29.4670000 26.7880000 - 612 612 1 0.0000000 24.1090000 29.4670000 32.1460000 - 613 613 1 0.0000000 29.4670000 2.6790000 5.3580000 - 614 614 1 0.0000000 29.4670000 2.6790000 10.7150000 - 615 615 1 0.0000000 29.4670000 2.6790000 16.0730000 - 616 616 1 0.0000000 29.4670000 2.6790000 21.4310000 - 617 617 1 0.0000000 29.4670000 2.6790000 26.7880000 - 618 618 1 0.0000000 29.4670000 2.6790000 32.1460000 - 619 619 1 0.0000000 29.4670000 8.0360000 5.3580000 - 620 620 1 0.0000000 29.4670000 8.0360000 10.7150000 - 621 621 1 0.0000000 29.4670000 8.0360000 16.0730000 - 622 622 1 0.0000000 29.4670000 8.0360000 21.4310000 - 623 623 1 0.0000000 29.4670000 8.0360000 26.7880000 - 624 624 1 0.0000000 29.4670000 8.0360000 32.1460000 - 625 625 1 0.0000000 29.4670000 13.3940000 5.3580000 - 626 626 1 0.0000000 29.4670000 13.3940000 10.7150000 - 627 627 1 0.0000000 29.4670000 13.3940000 16.0730000 - 628 628 1 0.0000000 29.4670000 13.3940000 21.4310000 - 629 629 1 0.0000000 29.4670000 13.3940000 26.7880000 - 630 630 1 0.0000000 29.4670000 13.3940000 32.1460000 - 631 631 1 0.0000000 29.4670000 18.7520000 5.3580000 - 632 632 1 0.0000000 29.4670000 18.7520000 10.7150000 - 633 633 1 0.0000000 29.4670000 18.7520000 16.0730000 - 634 634 1 0.0000000 29.4670000 18.7520000 21.4310000 - 635 635 1 0.0000000 29.4670000 18.7520000 26.7880000 - 636 636 1 0.0000000 29.4670000 18.7520000 32.1460000 - 637 637 1 0.0000000 29.4670000 24.1090000 5.3580000 - 638 638 1 0.0000000 29.4670000 24.1090000 10.7150000 - 639 639 1 0.0000000 29.4670000 24.1090000 16.0730000 - 640 640 1 0.0000000 29.4670000 24.1090000 21.4310000 - 641 641 1 0.0000000 29.4670000 24.1090000 26.7880000 - 642 642 1 0.0000000 29.4670000 24.1090000 32.1460000 - 643 643 1 0.0000000 29.4670000 29.4670000 5.3580000 - 644 644 1 0.0000000 29.4670000 29.4670000 10.7150000 - 645 645 1 0.0000000 29.4670000 29.4670000 16.0730000 - 646 646 1 0.0000000 29.4670000 29.4670000 21.4310000 - 647 647 1 0.0000000 29.4670000 29.4670000 26.7880000 - 648 648 1 0.0000000 29.4670000 29.4670000 32.1460000 - 649 649 1 0.0000000 0.0000000 5.3580000 5.3580000 - 650 650 1 0.0000000 0.0000000 5.3580000 10.7150000 - 651 651 1 0.0000000 0.0000000 5.3580000 16.0730000 - 652 652 1 0.0000000 0.0000000 5.3580000 21.4310000 - 653 653 1 0.0000000 0.0000000 5.3580000 26.7880000 - 654 654 1 0.0000000 0.0000000 5.3580000 32.1460000 - 655 655 1 0.0000000 0.0000000 10.7150000 5.3580000 - 656 656 1 0.0000000 0.0000000 10.7150000 10.7150000 - 657 657 1 0.0000000 0.0000000 10.7150000 16.0730000 - 658 658 1 0.0000000 0.0000000 10.7150000 21.4310000 - 659 659 1 0.0000000 0.0000000 10.7150000 26.7880000 - 660 660 1 0.0000000 0.0000000 10.7150000 32.1460000 - 661 661 1 0.0000000 0.0000000 16.0730000 5.3580000 - 662 662 1 0.0000000 0.0000000 16.0730000 10.7150000 - 663 663 1 0.0000000 0.0000000 16.0730000 16.0730000 - 664 664 1 0.0000000 0.0000000 16.0730000 21.4310000 - 665 665 1 0.0000000 0.0000000 16.0730000 26.7880000 - 666 666 1 0.0000000 0.0000000 16.0730000 32.1460000 - 667 667 1 0.0000000 0.0000000 21.4310000 5.3580000 - 668 668 1 0.0000000 0.0000000 21.4310000 10.7150000 - 669 669 1 0.0000000 0.0000000 21.4310000 16.0730000 - 670 670 1 0.0000000 0.0000000 21.4310000 21.4310000 - 671 671 1 0.0000000 0.0000000 21.4310000 26.7880000 - 672 672 1 0.0000000 0.0000000 21.4310000 32.1460000 - 673 673 1 0.0000000 0.0000000 26.7880000 5.3580000 - 674 674 1 0.0000000 0.0000000 26.7880000 10.7150000 - 675 675 1 0.0000000 0.0000000 26.7880000 16.0730000 - 676 676 1 0.0000000 0.0000000 26.7880000 21.4310000 - 677 677 1 0.0000000 0.0000000 26.7880000 26.7880000 - 678 678 1 0.0000000 0.0000000 26.7880000 32.1460000 - 679 679 1 0.0000000 0.0000000 32.1460000 5.3580000 - 680 680 1 0.0000000 0.0000000 32.1460000 10.7150000 - 681 681 1 0.0000000 0.0000000 32.1460000 16.0730000 - 682 682 1 0.0000000 0.0000000 32.1460000 21.4310000 - 683 683 1 0.0000000 0.0000000 32.1460000 26.7880000 - 684 684 1 0.0000000 0.0000000 32.1460000 32.1460000 - 685 685 1 0.0000000 5.3580000 5.3580000 5.3580000 - 686 686 1 0.0000000 5.3580000 5.3580000 10.7150000 - 687 687 1 0.0000000 5.3580000 5.3580000 16.0730000 - 688 688 1 0.0000000 5.3580000 5.3580000 21.4310000 - 689 689 1 0.0000000 5.3580000 5.3580000 26.7880000 - 690 690 1 0.0000000 5.3580000 5.3580000 32.1460000 - 691 691 1 0.0000000 5.3580000 10.7150000 5.3580000 - 692 692 1 0.0000000 5.3580000 10.7150000 10.7150000 - 693 693 1 0.0000000 5.3580000 10.7150000 16.0730000 - 694 694 1 0.0000000 5.3580000 10.7150000 21.4310000 - 695 695 1 0.0000000 5.3580000 10.7150000 26.7880000 - 696 696 1 0.0000000 5.3580000 10.7150000 32.1460000 - 697 697 1 0.0000000 5.3580000 16.0730000 5.3580000 - 698 698 1 0.0000000 5.3580000 16.0730000 10.7150000 - 699 699 1 0.0000000 5.3580000 16.0730000 16.0730000 - 700 700 1 0.0000000 5.3580000 16.0730000 21.4310000 - 701 701 1 0.0000000 5.3580000 16.0730000 26.7880000 - 702 702 1 0.0000000 5.3580000 16.0730000 32.1460000 - 703 703 1 0.0000000 5.3580000 21.4310000 5.3580000 - 704 704 1 0.0000000 5.3580000 21.4310000 10.7150000 - 705 705 1 0.0000000 5.3580000 21.4310000 16.0730000 - 706 706 1 0.0000000 5.3580000 21.4310000 21.4310000 - 707 707 1 0.0000000 5.3580000 21.4310000 26.7880000 - 708 708 1 0.0000000 5.3580000 21.4310000 32.1460000 - 709 709 1 0.0000000 5.3580000 26.7880000 5.3580000 - 710 710 1 0.0000000 5.3580000 26.7880000 10.7150000 - 711 711 1 0.0000000 5.3580000 26.7880000 16.0730000 - 712 712 1 0.0000000 5.3580000 26.7880000 21.4310000 - 713 713 1 0.0000000 5.3580000 26.7880000 26.7880000 - 714 714 1 0.0000000 5.3580000 26.7880000 32.1460000 - 715 715 1 0.0000000 5.3580000 32.1460000 5.3580000 - 716 716 1 0.0000000 5.3580000 32.1460000 10.7150000 - 717 717 1 0.0000000 5.3580000 32.1460000 16.0730000 - 718 718 1 0.0000000 5.3580000 32.1460000 21.4310000 - 719 719 1 0.0000000 5.3580000 32.1460000 26.7880000 - 720 720 1 0.0000000 5.3580000 32.1460000 32.1460000 - 721 721 1 0.0000000 10.7150000 5.3580000 5.3580000 - 722 722 1 0.0000000 10.7150000 5.3580000 10.7150000 - 723 723 1 0.0000000 10.7150000 5.3580000 16.0730000 - 724 724 1 0.0000000 10.7150000 5.3580000 21.4310000 - 725 725 1 0.0000000 10.7150000 5.3580000 26.7880000 - 726 726 1 0.0000000 10.7150000 5.3580000 32.1460000 - 727 727 1 0.0000000 10.7150000 10.7150000 5.3580000 - 728 728 1 0.0000000 10.7150000 10.7150000 10.7150000 - 729 729 1 0.0000000 10.7150000 10.7150000 16.0730000 - 730 730 1 0.0000000 10.7150000 10.7150000 21.4310000 - 731 731 1 0.0000000 10.7150000 10.7150000 26.7880000 - 732 732 1 0.0000000 10.7150000 10.7150000 32.1460000 - 733 733 1 0.0000000 10.7150000 16.0730000 5.3580000 - 734 734 1 0.0000000 10.7150000 16.0730000 10.7150000 - 735 735 1 0.0000000 10.7150000 16.0730000 16.0730000 - 736 736 1 0.0000000 10.7150000 16.0730000 21.4310000 - 737 737 1 0.0000000 10.7150000 16.0730000 26.7880000 - 738 738 1 0.0000000 10.7150000 16.0730000 32.1460000 - 739 739 1 0.0000000 10.7150000 21.4310000 5.3580000 - 740 740 1 0.0000000 10.7150000 21.4310000 10.7150000 - 741 741 1 0.0000000 10.7150000 21.4310000 16.0730000 - 742 742 1 0.0000000 10.7150000 21.4310000 21.4310000 - 743 743 1 0.0000000 10.7150000 21.4310000 26.7880000 - 744 744 1 0.0000000 10.7150000 21.4310000 32.1460000 - 745 745 1 0.0000000 10.7150000 26.7880000 5.3580000 - 746 746 1 0.0000000 10.7150000 26.7880000 10.7150000 - 747 747 1 0.0000000 10.7150000 26.7880000 16.0730000 - 748 748 1 0.0000000 10.7150000 26.7880000 21.4310000 - 749 749 1 0.0000000 10.7150000 26.7880000 26.7880000 - 750 750 1 0.0000000 10.7150000 26.7880000 32.1460000 - 751 751 1 0.0000000 10.7150000 32.1460000 5.3580000 - 752 752 1 0.0000000 10.7150000 32.1460000 10.7150000 - 753 753 1 0.0000000 10.7150000 32.1460000 16.0730000 - 754 754 1 0.0000000 10.7150000 32.1460000 21.4310000 - 755 755 1 0.0000000 10.7150000 32.1460000 26.7880000 - 756 756 1 0.0000000 10.7150000 32.1460000 32.1460000 - 757 757 1 0.0000000 16.0730000 5.3580000 5.3580000 - 758 758 1 0.0000000 16.0730000 5.3580000 10.7150000 - 759 759 1 0.0000000 16.0730000 5.3580000 16.0730000 - 760 760 1 0.0000000 16.0730000 5.3580000 21.4310000 - 761 761 1 0.0000000 16.0730000 5.3580000 26.7880000 - 762 762 1 0.0000000 16.0730000 5.3580000 32.1460000 - 763 763 1 0.0000000 16.0730000 10.7150000 5.3580000 - 764 764 1 0.0000000 16.0730000 10.7150000 10.7150000 - 765 765 1 0.0000000 16.0730000 10.7150000 16.0730000 - 766 766 1 0.0000000 16.0730000 10.7150000 21.4310000 - 767 767 1 0.0000000 16.0730000 10.7150000 26.7880000 - 768 768 1 0.0000000 16.0730000 10.7150000 32.1460000 - 769 769 1 0.0000000 16.0730000 16.0730000 5.3580000 - 770 770 1 0.0000000 16.0730000 16.0730000 10.7150000 - 771 771 1 0.0000000 16.0730000 16.0730000 16.0730000 - 772 772 1 0.0000000 16.0730000 16.0730000 21.4310000 - 773 773 1 0.0000000 16.0730000 16.0730000 26.7880000 - 774 774 1 0.0000000 16.0730000 16.0730000 32.1460000 - 775 775 1 0.0000000 16.0730000 21.4310000 5.3580000 - 776 776 1 0.0000000 16.0730000 21.4310000 10.7150000 - 777 777 1 0.0000000 16.0730000 21.4310000 16.0730000 - 778 778 1 0.0000000 16.0730000 21.4310000 21.4310000 - 779 779 1 0.0000000 16.0730000 21.4310000 26.7880000 - 780 780 1 0.0000000 16.0730000 21.4310000 32.1460000 - 781 781 1 0.0000000 16.0730000 26.7880000 5.3580000 - 782 782 1 0.0000000 16.0730000 26.7880000 10.7150000 - 783 783 1 0.0000000 16.0730000 26.7880000 16.0730000 - 784 784 1 0.0000000 16.0730000 26.7880000 21.4310000 - 785 785 1 0.0000000 16.0730000 26.7880000 26.7880000 - 786 786 1 0.0000000 16.0730000 26.7880000 32.1460000 - 787 787 1 0.0000000 16.0730000 32.1460000 5.3580000 - 788 788 1 0.0000000 16.0730000 32.1460000 10.7150000 - 789 789 1 0.0000000 16.0730000 32.1460000 16.0730000 - 790 790 1 0.0000000 16.0730000 32.1460000 21.4310000 - 791 791 1 0.0000000 16.0730000 32.1460000 26.7880000 - 792 792 1 0.0000000 16.0730000 32.1460000 32.1460000 - 793 793 1 0.0000000 21.4310000 5.3580000 5.3580000 - 794 794 1 0.0000000 21.4310000 5.3580000 10.7150000 - 795 795 1 0.0000000 21.4310000 5.3580000 16.0730000 - 796 796 1 0.0000000 21.4310000 5.3580000 21.4310000 - 797 797 1 0.0000000 21.4310000 5.3580000 26.7880000 - 798 798 1 0.0000000 21.4310000 5.3580000 32.1460000 - 799 799 1 0.0000000 21.4310000 10.7150000 5.3580000 - 800 800 1 0.0000000 21.4310000 10.7150000 10.7150000 - 801 801 1 0.0000000 21.4310000 10.7150000 16.0730000 - 802 802 1 0.0000000 21.4310000 10.7150000 21.4310000 - 803 803 1 0.0000000 21.4310000 10.7150000 26.7880000 - 804 804 1 0.0000000 21.4310000 10.7150000 32.1460000 - 805 805 1 0.0000000 21.4310000 16.0730000 5.3580000 - 806 806 1 0.0000000 21.4310000 16.0730000 10.7150000 - 807 807 1 0.0000000 21.4310000 16.0730000 16.0730000 - 808 808 1 0.0000000 21.4310000 16.0730000 21.4310000 - 809 809 1 0.0000000 21.4310000 16.0730000 26.7880000 - 810 810 1 0.0000000 21.4310000 16.0730000 32.1460000 - 811 811 1 0.0000000 21.4310000 21.4310000 5.3580000 - 812 812 1 0.0000000 21.4310000 21.4310000 10.7150000 - 813 813 1 0.0000000 21.4310000 21.4310000 16.0730000 - 814 814 1 0.0000000 21.4310000 21.4310000 21.4310000 - 815 815 1 0.0000000 21.4310000 21.4310000 26.7880000 - 816 816 1 0.0000000 21.4310000 21.4310000 32.1460000 - 817 817 1 0.0000000 21.4310000 26.7880000 5.3580000 - 818 818 1 0.0000000 21.4310000 26.7880000 10.7150000 - 819 819 1 0.0000000 21.4310000 26.7880000 16.0730000 - 820 820 1 0.0000000 21.4310000 26.7880000 21.4310000 - 821 821 1 0.0000000 21.4310000 26.7880000 26.7880000 - 822 822 1 0.0000000 21.4310000 26.7880000 32.1460000 - 823 823 1 0.0000000 21.4310000 32.1460000 5.3580000 - 824 824 1 0.0000000 21.4310000 32.1460000 10.7150000 - 825 825 1 0.0000000 21.4310000 32.1460000 16.0730000 - 826 826 1 0.0000000 21.4310000 32.1460000 21.4310000 - 827 827 1 0.0000000 21.4310000 32.1460000 26.7880000 - 828 828 1 0.0000000 21.4310000 32.1460000 32.1460000 - 829 829 1 0.0000000 26.7880000 5.3580000 5.3580000 - 830 830 1 0.0000000 26.7880000 5.3580000 10.7150000 - 831 831 1 0.0000000 26.7880000 5.3580000 16.0730000 - 832 832 1 0.0000000 26.7880000 5.3580000 21.4310000 - 833 833 1 0.0000000 26.7880000 5.3580000 26.7880000 - 834 834 1 0.0000000 26.7880000 5.3580000 32.1460000 - 835 835 1 0.0000000 26.7880000 10.7150000 5.3580000 - 836 836 1 0.0000000 26.7880000 10.7150000 10.7150000 - 837 837 1 0.0000000 26.7880000 10.7150000 16.0730000 - 838 838 1 0.0000000 26.7880000 10.7150000 21.4310000 - 839 839 1 0.0000000 26.7880000 10.7150000 26.7880000 - 840 840 1 0.0000000 26.7880000 10.7150000 32.1460000 - 841 841 1 0.0000000 26.7880000 16.0730000 5.3580000 - 842 842 1 0.0000000 26.7880000 16.0730000 10.7150000 - 843 843 1 0.0000000 26.7880000 16.0730000 16.0730000 - 844 844 1 0.0000000 26.7880000 16.0730000 21.4310000 - 845 845 1 0.0000000 26.7880000 16.0730000 26.7880000 - 846 846 1 0.0000000 26.7880000 16.0730000 32.1460000 - 847 847 1 0.0000000 26.7880000 21.4310000 5.3580000 - 848 848 1 0.0000000 26.7880000 21.4310000 10.7150000 - 849 849 1 0.0000000 26.7880000 21.4310000 16.0730000 - 850 850 1 0.0000000 26.7880000 21.4310000 21.4310000 - 851 851 1 0.0000000 26.7880000 21.4310000 26.7880000 - 852 852 1 0.0000000 26.7880000 21.4310000 32.1460000 - 853 853 1 0.0000000 26.7880000 26.7880000 5.3580000 - 854 854 1 0.0000000 26.7880000 26.7880000 10.7150000 - 855 855 1 0.0000000 26.7880000 26.7880000 16.0730000 - 856 856 1 0.0000000 26.7880000 26.7880000 21.4310000 - 857 857 1 0.0000000 26.7880000 26.7880000 26.7880000 - 858 858 1 0.0000000 26.7880000 26.7880000 32.1460000 - 859 859 1 0.0000000 26.7880000 32.1460000 5.3580000 - 860 860 1 0.0000000 26.7880000 32.1460000 10.7150000 - 861 861 1 0.0000000 26.7880000 32.1460000 16.0730000 - 862 862 1 0.0000000 26.7880000 32.1460000 21.4310000 - 863 863 1 0.0000000 26.7880000 32.1460000 26.7880000 - 864 864 1 0.0000000 26.7880000 32.1460000 32.1460000 - diff --git a/examples/python/gjf_python/ff-argon.lmp b/examples/python/gjf_python/ff-argon.lmp deleted file mode 100644 index b6f7bc931a..0000000000 --- a/examples/python/gjf_python/ff-argon.lmp +++ /dev/null @@ -1,20 +0,0 @@ -############################# -#Atoms types - mass - charge# -############################# -#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# - -variable Ar equal 1 - -############# -#Atom Masses# -############# - -mass ${Ar} 39.903 - -########################### -#Pair Potentials - Tersoff# -########################### - -pair_style lj/cubic -pair_coeff * * 0.0102701 3.42 - diff --git a/examples/python/gjf_python/gjf.py b/examples/python/gjf_python/gjf.py deleted file mode 100644 index 37fc28bb79..0000000000 --- a/examples/python/gjf_python/gjf.py +++ /dev/null @@ -1,180 +0,0 @@ -"""Made by Charlie Sievers Ph.D. Candidate, UC Davis, Donadio Lab 2019""" - -from mpi4py import MPI -from lammps import lammps -import lammps_tools as lt -import numpy as np - -comm = MPI.COMM_WORLD -rank = comm.Get_rank() - -""" LAMMPS VARIABLES """ - -# new file or restart -run_no = 0 - -# data files -infile = "argon.lmp" -restart_file = "final_restart.{}".format(run_no) -ff_file = "ff-argon.lmp" -outfile = "output.dat" - -# write final_restart -write_final_restart = False - -# random numbers -seed0 = 2357 -seed1 = 26588 -seed2 = 10669 - -# MD Parameters -# number of steps -nsteps = 50000 -# timestep -# dt = 0.001 -# starting simulation temp -temp_start = 10 -# final simulation temp -temp_final = 10 -# relaxation time -trel = 1 -# trajectory frequency -ntraj = 0 - -# Ensemble 0 = GJF u, 1 = GJF v, 2 = Nose-Hoover, 3 = Langevin, 4 = BDP (Currently all NVT) -ensemble = 0 - -# Output Parameters -nthermo = 200 -nout = int(nsteps / nthermo) # Important - -# output to screen and log file? -lammps_output = False -# Lammps Thermo -thermo = False - -python_output = True - -# Write output to file? -write_output = False - -if write_output is True: - data = open("{}".format(outfile), "w") - -if python_output is True: - if rank == 0: - print("dt, temp, ke, fke, pe, fpe") - -for j in range(20): - - # timestep - dt = 0.005*(j+1) - - if lammps_output is True: - lmp = lammps() - else: - lmp = lammps(cmdargs=["-screen", "none", "-log", "none"]) - - lmp.command("atom_style full") - lmp.command("units metal") - lmp.command("processors * * *") - lmp.command("neighbor 1 bin") - lmp.command("boundary p p p") - - if run_no is 0: - lmp.command("read_data {}".format(infile)) - else: - lmp.command("read_restart final_restart".format(run_no-1)) - - if thermo is True: - lmp.command("thermo_style custom time temp pe ke press vol cpu") - lmp.command("thermo {}".format(nthermo)) - lmp.command("thermo_modify flush yes") - - lmp.file("{}".format(ff_file)) - lmp.command("timestep {}".format(dt)) - - # get_per_atom_compute example with dim of two and within a group - # lmp.command("region rand block 5 20 5 20 5 20") - # lmp.command("group rand region rand") - # lmp.command("compute x rand property/atom x y") - # test = get_per_atom_compute(comm, lmp, "x", 2, group="rand") - - lmp.command("compute ke all ke/atom") - - lmp.command("compute pe all pe") - - if ntraj != 0: - lmp.command("dump 1 all dcd {} trajectory.dcd".format(ntraj)) - lmp.command("dump_modify 1 unwrap yes") - - if run_no == 0: - lmp.command("velocity all create {} {} mom yes dist gaussian".format(temp_start, seed0)) - lmp.command("fix nve all nve") - - if ensemble == 0: - # gjf u - lmp.command("fix lang all langevin {} {} {} {} gjf yes halfstep yes".format( - temp_start, temp_final, trel, seed1)) - elif ensemble == 1: - # gjf v - lmp.command("fix lang all langevin {} {} {} {} gjf yes".format( - temp_start, temp_final, trel, seed1)) - elif ensemble == 2: - # NH - lmp.command("fix nvt all nvt temp {} {} {}".format( - temp_start, temp_final, trel)) - elif ensemble == 3: - # lang - lmp.command("fix lang all langevin {} {} {} {} tally yes zero yes".format( - temp_start, temp_final, trel, seed1)) - elif ensemble == 4: - # BDP - lmp.command("fix stoch all temp/csvr {} {} {} {}".format( - temp_start, temp_final, trel, seed1)) - - natoms = lmp.extract_global("natoms", 0) - nlocal = lmp.extract_global("nlocal", 0) - ke_sum = lt.get_per_atom_compute(comm, lmp, "ke") - ke_2 = ke_sum**2 - pe_sum = 0 - pe_2 = 0 - temp_sum = 0 - - for i in range(nout): - nlocal = lmp.extract_global("nlocal", 0) - lmp.command("run {} pre no post no".format(nthermo)) - temp = lmp.extract_compute("thermo_temp", 0, 0) - ke = lt.get_per_atom_compute(comm, lmp, "ke") - pe = lmp.extract_compute("pe", 0, 0) - ke_sum += ke - ke_2 += ke**2 - pe_sum += pe - pe_2 += pe**2 - temp_sum += temp - - if python_output is True: - if rank == 0: - print("Time: {:.6f}, Temp: {:.6f}, KE: {:.6f}, PE: {:.6f}".format( - i*nthermo*dt, temp, ke.sum(), pe)) - - if write_final_restart is True: - lmp.command("write_restart {}".format(restart_file)) - - if rank == 0: - ke = ke_sum.sum() / (nout + 1) - fke = (np.sqrt((ke_2 - ke_sum ** 2 / (nout + 1)) / (nout + 1))).sum() - pe = pe_sum / nout - fpe = np.sqrt((pe_2 - pe_sum ** 2 / nout) / nout) - temp = temp_sum / nout - - if python_output is True: - print(dt, temp, ke, fke, pe, fpe) - - if write_output is True: - data.write("{:.6f} {:.6f} {:.6f} {:.6f} {:.6f} {:.6f}\n".format( - dt, temp, ke, fke, pe, fpe)) - data.flush() - -if write_output is True: - data.close() diff --git a/examples/python/gjf_python/lammps_tools.py b/examples/python/gjf_python/lammps_tools.py deleted file mode 100644 index f9f25eaa28..0000000000 --- a/examples/python/gjf_python/lammps_tools.py +++ /dev/null @@ -1,78 +0,0 @@ -"""Made by Charlie Sievers Ph.D. Candidate, UC Davis, Donadio Lab 2019""" - -from mpi4py import MPI -import numpy as np -import ctypes as ctypes - -""" USEFULL LAMMPS FUNCTION """ - - -def get_nlocal(lmp): - - nlocal = lmp.extract_global("nlocal", 0) - - return nlocal - - -def get_aid(lmp, group=None): - - if group is None: - c_aid = lmp.extract_atom("id", 0) - ptr = ctypes.cast(c_aid, ctypes.POINTER(ctypes.c_int32 * get_nlocal(lmp))) - aid = np.frombuffer(ptr.contents, dtype=np.int32) - else: - try: - c_aid = lmp.extract_variable("aid", group, 1) - ptr = ctypes.cast(c_aid, ctypes.POINTER(ctypes.c_double * get_nlocal(lmp))) - aid = np.frombuffer(ptr.contents, dtype=np.double) - except ValueError: - lmp.command("variable aid atom id") - aid = get_aid(lmp, group) - - return aid - - -def get_per_atom_compute(comm, lmp, name, dim=1, dtype="double", group=None): - laid = get_aid(lmp, group) - nlocal = get_nlocal(lmp) - ngroup = comm.allgather(laid) - type = dim - if dim > 1: - type = 2 - for array in ngroup: - try: - aid = np.concatenate((aid, array)) - except UnboundLocalError: - aid = array - if dtype == "double": - mem_type = ctypes.c_double - elif dtype == "integer": - mem_type = ctypes.c_int - elif dtype == "bigint": - mem_type = ctypes.c_int32 - else: - print("{} not implemented".format(dtype)) - return - - tmp = lmp.extract_compute(name, 1, type) - if type == 1: - ptr = ctypes.cast(tmp, ctypes.POINTER(mem_type * nlocal)) - else: - ptr = ctypes.cast(tmp[0], ctypes.POINTER(mem_type * nlocal * dim)) - lcompute = comm.allgather(np.frombuffer(ptr.contents).reshape((-1, dim))) - for array in lcompute: - try: - compute = np.concatenate((compute, array)) - except UnboundLocalError: - compute = array - - aid = np.expand_dims(aid, axis=1) - - compute = np.concatenate((aid, compute), axis=-1) - compute = compute[compute[..., 0] != 0] - compute = compute[compute[..., 0].argsort()][..., 1:] - - if dim == 1: - compute = np.squeeze(compute, axis=-1) - - return compute \ No newline at end of file diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index ea0929a236..36671ba6a4 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -18,11 +18,10 @@ Niels Gronbech-Jensen (UC Davis) GJF-2GJ Formulation ------------------------------------------------------------------------- */ +#include "fix_langevin.h" #include #include #include -#include -#include "fix_langevin.h" #include "math_extra.h" #include "atom.h" #include "atom_vec_ellipsoid.h" @@ -30,8 +29,6 @@ #include "update.h" #include "modify.h" #include "compute.h" -#include "domain.h" -#include "region.h" #include "respa.h" #include "comm.h" #include "input.h" @@ -55,7 +52,8 @@ enum{CONSTANT,EQUAL,ATOM}; FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg), gjfflag(0), gfactor1(NULL), gfactor2(NULL), ratio(NULL), tstr(NULL), - flangevin(NULL), tforce(NULL), franprev(NULL), id_temp(NULL), random(NULL) + flangevin(NULL), tforce(NULL), franprev(NULL), id_temp(NULL), random(NULL), + lv(NULL), wildcard(NULL), bias(NULL) { if (narg < 7) error->all(FLERR,"Illegal fix langevin command"); @@ -112,7 +110,10 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg],"gjf") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix langevin command"); if (strcmp(arg[iarg+1],"no") == 0) gjfflag = 0; - else if (strcmp(arg[iarg+1],"yes") == 0) gjfflag = 1; + else if (strcmp(arg[iarg+1],"yes") == 0) + error->all(FLERR,"GJF yes keyword is deprecated.\nPlease use vhalf or vfull."); + else if (strcmp(arg[iarg+1],"vfull") == 0) {gjfflag = 1; hsflag = 0;} + else if (strcmp(arg[iarg+1],"vhalf") == 0) {gjfflag = 1; hsflag = 1;} else error->all(FLERR,"Illegal fix langevin command"); iarg += 2; } else if (strcmp(arg[iarg],"omega") == 0) { @@ -141,14 +142,6 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : else if (strcmp(arg[iarg+1],"yes") == 0) zeroflag = 1; else error->all(FLERR,"Illegal fix langevin command"); iarg += 2; - } else if (strcmp(arg[iarg],"halfstep") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix langevin command"); - if (gjfflag == 0) error->all(FLERR,"GJF must be set"); - if (tallyflag == 0) error->warning(FLERR,"Careful, tally is untested"); - if (strcmp(arg[iarg+1],"no") == 0) hsflag = 0; - else if (strcmp(arg[iarg+1],"yes") == 0) hsflag = 1; - else error->all(FLERR,"Illegal fix langevin command"); - iarg += 2; } else error->all(FLERR,"Illegal fix langevin command"); } @@ -168,6 +161,7 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : franprev = NULL; wildcard = NULL; lv = NULL; + bias = NULL; tforce = NULL; maxatom1 = maxatom2 = 0; @@ -218,6 +212,7 @@ FixLangevin::~FixLangevin() memory->destroy(franprev); memory->destroy(wildcard); if (hsflag) memory->destroy(lv); + if (temperature && temperature->tempbias) memory->destroy(bias); atom->delete_callback(id,0); } } @@ -300,6 +295,9 @@ void FixLangevin::init() if (strstr(update->integrate_style,"respa")) nlevels_respa = ((Respa *) update->integrate)->nlevels; + if (strstr(update->integrate_style,"respa")) + error->one(FLERR,"Fix langevin gjf not implemented with respa capabilities"); + if (gjfflag) gjffac = 1.0/sqrt(1.0+update->dt/2.0/t_period); } @@ -331,6 +329,11 @@ void FixLangevin::setup(int vflag) wildcard[i][0] = v[i][0]; wildcard[i][1] = v[i][1]; wildcard[i][2] = v[i][2]; + if (tbiasflag == BIAS) { + bias[i][0] = 0.0; + bias[i][1] = 0.0; + bias[i][2] = 0.0; + } } } } @@ -357,34 +360,95 @@ void FixLangevin::post_integrate() int nlocal = atom->nlocal; if (igroup == atom->firstgroup) nlocal = atom->nfirst; + if (tbiasflag == BIAS) { + double b[3] = {0.0, 0.0, 0.0}; + for (int i = 0; i < nlocal; i++) { + bias[i][0] = v[i][0]; + bias[i][1] = v[i][1]; + bias[i][2] = v[i][2]; + v[i][0] = wildcard[i][0]; + v[i][1] = wildcard[i][1]; + v[i][2] = wildcard[i][2]; + } + temperature->compute_scalar(); + for (int i = 0; i < nlocal; i++) { + temperature->remove_bias(i, v[i]); + wildcard[i][0] = v[i][0]; + wildcard[i][1] = v[i][1]; + wildcard[i][2] = v[i][2]; + if (wildcard[i][0] == 0.0) franprev[i][0] = 0.0; + if (wildcard[i][1] == 0.0) franprev[i][1] = 0.0; + if (wildcard[i][2] == 0.0) franprev[i][2] = 0.0; + temperature->restore_bias(i, v[i]); + b[0] = v[i][0] - wildcard[i][0]; + b[1] = v[i][1] - wildcard[i][1]; + b[2] = v[i][2] - wildcard[i][2]; + v[i][0] = bias[i][0]; + v[i][1] = bias[i][1]; + v[i][2] = bias[i][2]; + bias[i][0] = b[0]; + bias[i][1] = b[1]; + bias[i][2] = b[2]; + } + } if (rmass) { for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { dtfm = dtf / rmass[i]; - x[i][0] += -dt * v[i][0]; - x[i][1] += -dt * v[i][1]; - x[i][2] += -dt * v[i][2]; + x[i][0] -= dt * v[i][0]; + x[i][1] -= dt * v[i][1]; + x[i][2] -= dt * v[i][2]; v[i][0] = gjffac * (wildcard[i][0] + dtfm * franprev[i][0] + dtfm * f[i][0]); v[i][1] = gjffac * (wildcard[i][1] + dtfm * franprev[i][1] + dtfm * f[i][1]); v[i][2] = gjffac * (wildcard[i][2] + dtfm * franprev[i][2] + dtfm * f[i][2]); + if (tbiasflag == BIAS) + for (int j = 0; j < 3; j++) { + if (wildcard[i][j] == 0) { + v[i][j] /= gjffac; + } + v[i][j] += bias[i][j]; + if (wildcard[i][j] == 0){ + v[i][j] /= gjffac; + } + } x[i][0] += gjffac * dt * v[i][0]; x[i][1] += gjffac * dt * v[i][1]; x[i][2] += gjffac * dt * v[i][2]; + if (tbiasflag == BIAS) + for (int j = 0; j < 3; j++) { + if (wildcard[i][j] == 0) + v[i][j] *= gjffac; + } } } else { for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { dtfm = dtf / mass[type[i]]; - x[i][0] += -dt * v[i][0]; - x[i][1] += -dt * v[i][1]; - x[i][2] += -dt * v[i][2]; + x[i][0] -= dt * v[i][0]; + x[i][1] -= dt * v[i][1]; + x[i][2] -= dt * v[i][2]; v[i][0] = gjffac * (wildcard[i][0] + dtfm * franprev[i][0] + dtfm * f[i][0]); v[i][1] = gjffac * (wildcard[i][1] + dtfm * franprev[i][1] + dtfm * f[i][1]); v[i][2] = gjffac * (wildcard[i][2] + dtfm * franprev[i][2] + dtfm * f[i][2]); + if (tbiasflag == BIAS) + for (int j = 0; j < 3; j++) { + if (wildcard[i][j] == 0) { + v[i][j] /= gjffac; + } + v[i][j] += bias[i][j]; + if (wildcard[i][j] == 0){ + v[i][j] /= gjffac; + } + } x[i][0] += gjffac * dt * v[i][0]; x[i][1] += gjffac * dt * v[i][1]; x[i][2] += gjffac * dt * v[i][2]; + if (tbiasflag == BIAS) + for (int j = 0; j < 3; j++) { + if (wildcard[i][j] == 0) + v[i][j] *= gjffac; + } } } } @@ -657,9 +721,17 @@ void FixLangevin::post_force_templated() if (Tp_TALLY) { if (Tp_GJF && update->ntimestep != update->beginstep){ - fdrag[0] = gamma1*gjffac*gjffac*v[i][0]; - fdrag[1] = gamma1*gjffac*gjffac*v[i][1]; - fdrag[2] = gamma1*gjffac*gjffac*v[i][2]; + if (Tp_BIAS) { + temperature->remove_bias(i,v[i]); + fdrag[0] = gamma1*gjffac*gjffac*v[i][0]; + fdrag[1] = gamma1*gjffac*gjffac*v[i][1]; + fdrag[2] = gamma1*gjffac*gjffac*v[i][2]; + temperature->restore_bias(i,v[i]); + } else { + fdrag[0] = gamma1*gjffac*gjffac*v[i][0]; + fdrag[1] = gamma1*gjffac*gjffac*v[i][1]; + fdrag[2] = gamma1*gjffac*gjffac*v[i][2]; + } fran[0] *= gjffac; fran[1] *= gjffac; fran[2] *= gjffac; @@ -894,8 +966,9 @@ void FixLangevin::end_of_step() v[i][2] = lv[i][2]; } } - energy_onestep += flangevin[i][0] * v[i][0] + flangevin[i][1] * v[i][1] + - flangevin[i][2] * v[i][2]; + if (tallyflag) + energy_onestep += flangevin[i][0] * v[i][0] + flangevin[i][1] * v[i][1] + + flangevin[i][2] * v[i][2]; } if (tallyflag) { energy += energy_onestep * update->dt; @@ -953,7 +1026,7 @@ int FixLangevin::modify_param(int narg, char **arg) double FixLangevin::compute_scalar() { - if (!tallyflag || !flangevin_allocated) return 0.0; + if (!tallyflag && !flangevin_allocated) return 0.0; // capture the very first energy transfer to thermal reservoir @@ -1004,6 +1077,7 @@ double FixLangevin::memory_usage() double bytes = 0.0; if (gjfflag) bytes += atom->nmax*3*2 * sizeof(double); if (gjfflag) if (hsflag) bytes += atom->nmax*3 * sizeof(double); + if (gjfflag && tbiasflag == BIAS) bytes += atom->nmax*3 * sizeof(double); if (tallyflag) bytes += atom->nmax*3 * sizeof(double); if (tforce) bytes += atom->nmax * sizeof(double); return bytes; @@ -1018,6 +1092,7 @@ void FixLangevin::grow_arrays(int nmax) memory->grow(franprev,nmax,3,"fix_langevin:franprev"); memory->grow(wildcard,nmax,3,"fix_langevin:wildcard"); if (hsflag) memory->grow(lv,nmax,3,"fix_langevin:lv"); + if (tbiasflag == BIAS) memory->grow(bias,nmax,3,"fix_langevin:bias"); } /* ---------------------------------------------------------------------- @@ -1037,6 +1112,11 @@ void FixLangevin::copy_arrays(int i, int j, int /*delflag*/) lv[j][1] = lv[i][1]; lv[j][2] = lv[i][2]; } + if (tbiasflag == BIAS){ + bias[j][0] = bias[i][0]; + bias[j][1] = bias[i][1]; + bias[j][2] = bias[i][2]; + } } /* ---------------------------------------------------------------------- @@ -1057,6 +1137,11 @@ int FixLangevin::pack_exchange(int i, double *buf) buf[n++] = lv[i][1]; buf[n++] = lv[i][2]; } + if (tbiasflag == BIAS){ + buf[n++] = bias[i][0]; + buf[n++] = bias[i][1]; + buf[n++] = bias[i][2]; + } return n; } @@ -1078,5 +1163,10 @@ int FixLangevin::unpack_exchange(int nlocal, double *buf) lv[nlocal][1] = buf[n++]; lv[nlocal][2] = buf[n++]; } + if (tbiasflag == BIAS){ + bias[nlocal][0] = buf[n++]; + bias[nlocal][1] = buf[n++]; + bias[nlocal][2] = buf[n++]; + } return n; } diff --git a/src/fix_langevin.h b/src/fix_langevin.h index 888734de04..1f9954153f 100644 --- a/src/fix_langevin.h +++ b/src/fix_langevin.h @@ -67,6 +67,7 @@ class FixLangevin : public Fix { double **franprev; double **lv; //2GJ velocity or half-step velocity double **wildcard; + double **bias; int nvalues; From 39050265c279ac662e5921ebb1afaa9ab26faeea Mon Sep 17 00:00:00 2001 From: charlie sievers Date: Sun, 11 Aug 2019 20:23:57 -0700 Subject: [PATCH 090/418] Added gjf zero flag functionality and tbias functionality --- src/fix_langevin.cpp | 160 ++++++++++++++++++++++++++----------------- src/fix_langevin.h | 1 + 2 files changed, 99 insertions(+), 62 deletions(-) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index 36671ba6a4..3dedce1b18 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -239,6 +239,8 @@ void FixLangevin::init() if (ascale && !atom->ellipsoid_flag) error->all(FLERR,"Fix langevin angmom requires atom style ellipsoid"); + if (gjfflag && zeroflag && tallyflag) + error->warning(FLERR,"Fix langevin gjf zero and tally were all set"); // check variable if (tstr) { @@ -315,24 +317,29 @@ void FixLangevin::setup(int vflag) } if (gjfflag) { - // update v of atoms in group double ** v = atom->v; double **f = atom->f; int nlocal = atom->nlocal; if (igroup == atom->firstgroup) nlocal = atom->nfirst; + double b[3] = {0.0,0.0,0.0}; for (int i = 0; i < nlocal; i++) { f[i][0] = wildcard[i][0]; f[i][1] = wildcard[i][1]; f[i][2] = wildcard[i][2]; + b[0] = v[i][0]; + b[1] = v[i][1]; + b[2] = v[i][2]; + if (tbiasflag == BIAS) temperature->remove_bias(i,v[i]); wildcard[i][0] = v[i][0]; wildcard[i][1] = v[i][1]; wildcard[i][2] = v[i][2]; if (tbiasflag == BIAS) { - bias[i][0] = 0.0; - bias[i][1] = 0.0; - bias[i][2] = 0.0; + temperature->restore_bias(i,v[i]); + bias[i][0] = b[0] - wildcard[i][0]; + bias[i][1] = b[1] - wildcard[i][1]; + bias[i][2] = b[2] - wildcard[i][2]; } } } @@ -360,37 +367,17 @@ void FixLangevin::post_integrate() int nlocal = atom->nlocal; if (igroup == atom->firstgroup) nlocal = atom->nfirst; - if (tbiasflag == BIAS) { - double b[3] = {0.0, 0.0, 0.0}; - for (int i = 0; i < nlocal; i++) { - bias[i][0] = v[i][0]; - bias[i][1] = v[i][1]; - bias[i][2] = v[i][2]; - v[i][0] = wildcard[i][0]; - v[i][1] = wildcard[i][1]; - v[i][2] = wildcard[i][2]; - } - temperature->compute_scalar(); - for (int i = 0; i < nlocal; i++) { - temperature->remove_bias(i, v[i]); - wildcard[i][0] = v[i][0]; - wildcard[i][1] = v[i][1]; - wildcard[i][2] = v[i][2]; - if (wildcard[i][0] == 0.0) franprev[i][0] = 0.0; - if (wildcard[i][1] == 0.0) franprev[i][1] = 0.0; - if (wildcard[i][2] == 0.0) franprev[i][2] = 0.0; - temperature->restore_bias(i, v[i]); - b[0] = v[i][0] - wildcard[i][0]; - b[1] = v[i][1] - wildcard[i][1]; - b[2] = v[i][2] - wildcard[i][2]; - v[i][0] = bias[i][0]; - v[i][1] = bias[i][1]; - v[i][2] = bias[i][2]; - bias[i][0] = b[0]; - bias[i][1] = b[1]; - bias[i][2] = b[2]; - } + // zero option + double vsum[3],vsumall[3]; + bigint count; + + if (zeroflag) { + vsum[0] = vsum[1] = vsum[2] = 0.0; + count = group->count(igroup); + if (count == 0) + error->all(FLERR,"Cannot zero Langevin force of 0 atoms"); } + if (rmass) { for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { @@ -404,11 +391,7 @@ void FixLangevin::post_integrate() if (tbiasflag == BIAS) for (int j = 0; j < 3; j++) { if (wildcard[i][j] == 0) { - v[i][j] /= gjffac; - } - v[i][j] += bias[i][j]; - if (wildcard[i][j] == 0){ - v[i][j] /= gjffac; + v[i][j] /= gjffac * gjffac; } } x[i][0] += gjffac * dt * v[i][0]; @@ -418,6 +401,8 @@ void FixLangevin::post_integrate() for (int j = 0; j < 3; j++) { if (wildcard[i][j] == 0) v[i][j] *= gjffac; + v[i][j] += bias[i][j]; + x[i][j] += dt * bias[i][j]; } } @@ -434,11 +419,7 @@ void FixLangevin::post_integrate() if (tbiasflag == BIAS) for (int j = 0; j < 3; j++) { if (wildcard[i][j] == 0) { - v[i][j] /= gjffac; - } - v[i][j] += bias[i][j]; - if (wildcard[i][j] == 0){ - v[i][j] /= gjffac; + v[i][j] /= gjffac*gjffac; } } x[i][0] += gjffac * dt * v[i][0]; @@ -446,11 +427,32 @@ void FixLangevin::post_integrate() x[i][2] += gjffac * dt * v[i][2]; if (tbiasflag == BIAS) for (int j = 0; j < 3; j++) { - if (wildcard[i][j] == 0) - v[i][j] *= gjffac; + if (wildcard[i][j] == 0) + v[i][j] *= gjffac; + v[i][j] += bias[i][j]; + x[i][j] += dt * bias[i][j]; } + if (zeroflag){ + vsum[0] += gjffac * dtfm * franprev[i][0]; + vsum[1] += gjffac * dtfm * franprev[i][1]; + vsum[2] += gjffac * dtfm * franprev[i][2]; + } } } + + if (zeroflag) { + MPI_Allreduce(vsum,vsumall,3,MPI_DOUBLE,MPI_SUM,world); + vsumall[0] /= count; + vsumall[1] /= count; + vsumall[2] /= count; + for (int i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + v[i][0] -= vsumall[0]; + v[i][1] -= vsumall[1]; + v[i][2] -= vsumall[2]; + } + } + } } /* ---------------------------------------------------------------------- */ @@ -664,26 +666,34 @@ void FixLangevin::post_force_templated() flangevin_allocated = 1; } - if (Tp_BIAS) temperature->compute_scalar(); + if (Tp_BIAS && !gjfflag) temperature->compute_scalar(); + else if (Tp_BIAS && update->ntimestep == update->beginstep && gjfflag) temperature->compute_scalar(); for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { if (Tp_TSTYLEATOM) tsqrt = sqrt(tforce[i]); if (Tp_RMASS) { gamma1 = -rmass[i] / t_period / ftm2v; - gamma2 = sqrt(rmass[i]) * sqrt(2.0*boltz/t_period/dt/mvv2e) / ftm2v; - gamma1 *= 1.0/ratio[type[i]]; - gamma2 *= 1.0/sqrt(ratio[type[i]]) * tsqrt; + gamma2 = sqrt(rmass[i]) * sqrt(2.0 * boltz / t_period / dt / mvv2e) / ftm2v; + gamma1 *= 1.0 / ratio[type[i]]; + gamma2 *= 1.0 / sqrt(ratio[type[i]]) * tsqrt; } else { gamma1 = gfactor1[type[i]]; gamma2 = gfactor2[type[i]] * tsqrt; } - fran[0] = gamma2*random->gaussian(); - fran[1] = gamma2*random->gaussian(); - fran[2] = gamma2*random->gaussian(); + if (!gjfflag) { + fran[0] = gamma2 * random->uniform(); + fran[1] = gamma2 * random->uniform(); + fran[2] = gamma2 * random->uniform(); + } else { + fran[0] = gamma2 * random->gaussian(); + fran[1] = gamma2 * random->gaussian(); + fran[2] = gamma2 * random->gaussian(); + } if (Tp_BIAS) { + double b[3] = {0.0,0.0,0.0}; temperature->remove_bias(i,v[i]); fdrag[0] = gamma1*v[i][0]; fdrag[1] = gamma1*v[i][1]; @@ -693,9 +703,9 @@ void FixLangevin::post_force_templated() if (v[i][2] == 0.0) fran[2] = 0.0; temperature->restore_bias(i,v[i]); } else { - fdrag[0] = gamma1*v[i][0]; - fdrag[1] = gamma1*v[i][1]; - fdrag[2] = gamma1*v[i][2]; + fdrag[0] = gamma1*v[i][0];// - gjffac*(dtf / mass[type[i]])*gamma1*franprev[i][0]; + fdrag[1] = gamma1*v[i][1];// - gjffac*(dtf / mass[type[i]])*gamma1*franprev[i][1]; + fdrag[2] = gamma1*v[i][2];// - gjffac*(dtf / mass[type[i]])*gamma1*franprev[i][2]; } if (Tp_GJF) { @@ -706,13 +716,14 @@ void FixLangevin::post_force_templated() rantemp[0] = fran[0]; rantemp[1] = fran[1]; rantemp[2] = fran[2]; + fran[0] = franprev[i][0]; fran[1] = franprev[i][1]; fran[2] = franprev[i][2]; - fdrag[0] *= -2*t_period*(2*gjffac-1/gjffac-1)/dt; - fdrag[1] *= -2*t_period*(2*gjffac-1/gjffac-1)/dt; - fdrag[2] *= -2*t_period*(2*gjffac-1/gjffac-1)/dt; + fdrag[0] *= -2*t_period*((2*gjffac)-(1.0/gjffac)-1.0)/dt; + fdrag[1] *= -2*t_period*((2*gjffac)-(1.0/gjffac)-1.0)/dt; + fdrag[2] *= -2*t_period*((2*gjffac)-(1.0/gjffac)-1.0)/dt; } f[i][0] += fdrag[0] + fran[0]; @@ -747,9 +758,16 @@ void FixLangevin::post_force_templated() } if (Tp_ZERO) { - fsum[0] += fran[0]; - fsum[1] += fran[1]; - fsum[2] += fran[2]; + if (!gjfflag){ + fsum[0] += fran[0]; + fsum[1] += fran[1]; + fsum[2] += fran[2]; + } + else { + fsum[0] += franprev[i][0]; + fsum[1] += franprev[i][1]; + fsum[2] += franprev[i][2]; + } } if (Tp_GJF) @@ -762,6 +780,11 @@ void FixLangevin::post_force_templated() lv[i][0] = v[i][0]; lv[i][1] = v[i][1]; lv[i][2] = v[i][2]; + if (tbiasflag == BIAS) { + lv[i][0] += bias[i][0]; + lv[i][1] += bias[i][1]; + lv[i][2] += bias[i][2]; + } } } } @@ -949,17 +972,30 @@ void FixLangevin::end_of_step() double **f = atom->f; int *mask = atom->mask; int nlocal = atom->nlocal; + double b[3] = {0.0,0.0,0.0}; + + if (gjfflag && tbiasflag == BIAS) temperature->compute_scalar(); energy_onestep = 0.0; for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { if (gjfflag){ + b[0] = v[i][0]; + b[1] = v[i][1]; + b[2] = v[i][2]; f[i][0] = wildcard[i][0]; f[i][1] = wildcard[i][1]; f[i][2] = wildcard[i][2]; + if (tbiasflag == BIAS) temperature->remove_bias(i,v[i]); wildcard[i][0] = v[i][0]; wildcard[i][1] = v[i][1]; wildcard[i][2] = v[i][2]; + if (tbiasflag == BIAS) { + bias[i][0] = b[0] - v[i][0]; + bias[i][1] = b[1] - v[i][1]; + bias[i][2] = b[2] - v[i][2]; + temperature->restore_bias(i, v[i]); + } if (hsflag){ v[i][0] = lv[i][0]; v[i][1] = lv[i][1]; diff --git a/src/fix_langevin.h b/src/fix_langevin.h index 1f9954153f..9cd1ecb66a 100644 --- a/src/fix_langevin.h +++ b/src/fix_langevin.h @@ -68,6 +68,7 @@ class FixLangevin : public Fix { double **lv; //2GJ velocity or half-step velocity double **wildcard; double **bias; + double cm[3]; int nvalues; From 8078ac38493eb08d56f9c377c905ce7725ca6f00 Mon Sep 17 00:00:00 2001 From: charlie sievers Date: Mon, 12 Aug 2019 15:32:13 -0700 Subject: [PATCH 091/418] cleaned up src files --- src/fix_langevin.cpp | 36 ++++++++++++++++++++++-------------- src/fix_langevin.h | 3 +-- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index 3dedce1b18..c2e56881b7 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -240,7 +240,8 @@ void FixLangevin::init() error->all(FLERR,"Fix langevin angmom requires atom style ellipsoid"); if (gjfflag && zeroflag && tallyflag) - error->warning(FLERR,"Fix langevin gjf zero and tally were all set"); + error->warning(FLERR, + "Fix langevin: gjf, zero, and tally were all set correct energy tallying is not guaranteed"); // check variable if (tstr) { @@ -283,9 +284,14 @@ void FixLangevin::init() if (!atom->rmass) { for (int i = 1; i <= atom->ntypes; i++) { gfactor1[i] = -atom->mass[i] / t_period / force->ftm2v; - gfactor2[i] = sqrt(atom->mass[i]) * - sqrt(2.0*force->boltz/t_period/update->dt/force->mvv2e) / - force->ftm2v; + if (gjfflag) + gfactor2[i] = sqrt(atom->mass[i]) * + sqrt(2.0*force->boltz/t_period/update->dt/force->mvv2e) / + force->ftm2v; + else + gfactor2[i] = sqrt(atom->mass[i]) * + sqrt(24.0*force->boltz/t_period/update->dt/force->mvv2e) / + force->ftm2v; gfactor1[i] *= 1.0/ratio[i]; gfactor2[i] *= 1.0/sqrt(ratio[i]); } @@ -674,7 +680,10 @@ void FixLangevin::post_force_templated() if (Tp_TSTYLEATOM) tsqrt = sqrt(tforce[i]); if (Tp_RMASS) { gamma1 = -rmass[i] / t_period / ftm2v; - gamma2 = sqrt(rmass[i]) * sqrt(2.0 * boltz / t_period / dt / mvv2e) / ftm2v; + if (gjfflag) + gamma2 = sqrt(rmass[i]) * sqrt(2.0 * boltz / t_period / dt / mvv2e) / ftm2v; + else + gamma2 = sqrt(rmass[i]) * sqrt(24.0 * boltz / t_period / dt / mvv2e) / ftm2v; gamma1 *= 1.0 / ratio[type[i]]; gamma2 *= 1.0 / sqrt(ratio[type[i]]) * tsqrt; } else { @@ -682,18 +691,17 @@ void FixLangevin::post_force_templated() gamma2 = gfactor2[type[i]] * tsqrt; } - if (!gjfflag) { - fran[0] = gamma2 * random->uniform(); - fran[1] = gamma2 * random->uniform(); - fran[2] = gamma2 * random->uniform(); - } else { + if (gjfflag) { fran[0] = gamma2 * random->gaussian(); fran[1] = gamma2 * random->gaussian(); fran[2] = gamma2 * random->gaussian(); + } else { + fran[0] = gamma2 * random->uniform(); + fran[1] = gamma2 * random->uniform(); + fran[2] = gamma2 * random->uniform(); } if (Tp_BIAS) { - double b[3] = {0.0,0.0,0.0}; temperature->remove_bias(i,v[i]); fdrag[0] = gamma1*v[i][0]; fdrag[1] = gamma1*v[i][1]; @@ -703,9 +711,9 @@ void FixLangevin::post_force_templated() if (v[i][2] == 0.0) fran[2] = 0.0; temperature->restore_bias(i,v[i]); } else { - fdrag[0] = gamma1*v[i][0];// - gjffac*(dtf / mass[type[i]])*gamma1*franprev[i][0]; - fdrag[1] = gamma1*v[i][1];// - gjffac*(dtf / mass[type[i]])*gamma1*franprev[i][1]; - fdrag[2] = gamma1*v[i][2];// - gjffac*(dtf / mass[type[i]])*gamma1*franprev[i][2]; + fdrag[0] = gamma1*v[i][0]; + fdrag[1] = gamma1*v[i][1]; + fdrag[2] = gamma1*v[i][2]; } if (Tp_GJF) { diff --git a/src/fix_langevin.h b/src/fix_langevin.h index 9cd1ecb66a..939b161c35 100644 --- a/src/fix_langevin.h +++ b/src/fix_langevin.h @@ -67,8 +67,7 @@ class FixLangevin : public Fix { double **franprev; double **lv; //2GJ velocity or half-step velocity double **wildcard; - double **bias; - double cm[3]; + double **bias; //Bias velocity int nvalues; From f2068ece84baf0cf3b5fa0f28cba819b905ea814 Mon Sep 17 00:00:00 2001 From: charlie sievers Date: Tue, 13 Aug 2019 16:06:17 -0700 Subject: [PATCH 092/418] restored regular langevin functionality --- src/fix_langevin.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index c2e56881b7..d323453cdb 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -680,7 +680,7 @@ void FixLangevin::post_force_templated() if (Tp_TSTYLEATOM) tsqrt = sqrt(tforce[i]); if (Tp_RMASS) { gamma1 = -rmass[i] / t_period / ftm2v; - if (gjfflag) + if (Tp_GJF) gamma2 = sqrt(rmass[i]) * sqrt(2.0 * boltz / t_period / dt / mvv2e) / ftm2v; else gamma2 = sqrt(rmass[i]) * sqrt(24.0 * boltz / t_period / dt / mvv2e) / ftm2v; @@ -691,14 +691,14 @@ void FixLangevin::post_force_templated() gamma2 = gfactor2[type[i]] * tsqrt; } - if (gjfflag) { + if (Tp_GJF) { fran[0] = gamma2 * random->gaussian(); fran[1] = gamma2 * random->gaussian(); fran[2] = gamma2 * random->gaussian(); } else { - fran[0] = gamma2 * random->uniform(); - fran[1] = gamma2 * random->uniform(); - fran[2] = gamma2 * random->uniform(); + fran[0] = gamma2 * (random->uniform()-0.5); + fran[1] = gamma2 * (random->uniform()-0.5); + fran[2] = gamma2 * (random->uniform()-0.5); } if (Tp_BIAS) { @@ -766,7 +766,7 @@ void FixLangevin::post_force_templated() } if (Tp_ZERO) { - if (!gjfflag){ + if (!Tp_GJF){ fsum[0] += fran[0]; fsum[1] += fran[1]; fsum[2] += fran[2]; From 37a046cf1eadee8d20fcfbaa6b744680bdbb0f68 Mon Sep 17 00:00:00 2001 From: "Jibril B. Coulibaly" <43829860+jibril-b-coulibaly@users.noreply.github.com> Date: Wed, 14 Aug 2019 17:39:56 -0500 Subject: [PATCH 093/418] Update pair_granular.cpp Modified PairGranular::single function to return the total normal force into argument fforce. This was done for pair styles gran/* but not for the granular pari_style, resulting in the variable fforce being uninitialized. --- src/GRANULAR/pair_granular.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index b87e64a456..2813035ebb 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -1630,7 +1630,11 @@ double PairGranular::single(int i, int j, int itype, int jtype, magtortwist = -Mtcrit * signtwist; // eq 34 } } - + + // set force and return no energy + + fforce = Fntot*rinv; + // set single_extra quantities svector[0] = fs1; From cc14103f28f65a8610780f6e1f73676214e95cca Mon Sep 17 00:00:00 2001 From: "Jibril B. Coulibaly" Date: Fri, 16 Aug 2019 15:22:15 -0500 Subject: [PATCH 094/418] Bug fixes in granular pair style: - correct formula for tangent forces in style with no history in compute() and in single() functions - remove tangent history update in the single() function - implement correct output for tangent, normal and rolling forces in single() function - correct typos in documentation --- doc/src/pair_granular.txt | 8 +++---- src/GRANULAR/pair_granular.cpp | 42 +++++++++++++++------------------- 2 files changed, 23 insertions(+), 27 deletions(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index f16cd9fe0b..ccfe805b67 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -100,7 +100,7 @@ on particle {i} due to contact with particle {j} is given by: \mathbf\{F\}_\{ne, Hooke\} = k_N \delta_\{ij\} \mathbf\{n\} \end\{equation\} -Where \(\delta = R_i + R_j - \|\mathbf\{r\}_\{ij\}\|\) is the particle +Where \(\delta_\{ij\} = R_i + R_j - \|\mathbf\{r\}_\{ij\}\|\) is the particle overlap, \(R_i, R_j\) are the particle radii, \(\mathbf\{r\}_\{ij\} = \mathbf\{r\}_i - \mathbf\{r\}_j\) is the vector separating the two particle centers (note the i-j ordering so that \(F_\{ne\}\) is @@ -411,8 +411,8 @@ option by an additional factor of {a}, the radius of the contact region. The tan \mathbf\{F\}_t = -min(\mu_t F_\{n0\}, \|-k_t a \mathbf\{\xi\} + \mathbf\{F\}_\mathrm\{t,damp\}\|) \mathbf\{t\} \end\{equation\} -Here, {a} is the radius of the contact region, given by \(a = \delta -R\) for all normal contact models, except for {jkr}, where it is given +Here, {a} is the radius of the contact region, given by \(a =\sqrt\{R\delta\}\) + for all normal contact models, except for {jkr}, where it is given implicitly by \(\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\), see discussion above. To match the Mindlin solution, one should set \(k_t = 8G\), where \(G\) is the shear modulus, related to Young's modulus @@ -680,7 +680,7 @@ The single() function of these pair styles returns 0.0 for the energy of a pairwise interaction, since energy is not conserved in these dissipative potentials. It also returns only the normal component of the pairwise interaction force. However, the single() function also -calculates 10 extra pairwise quantities. The first 3 are the +calculates 12 extra pairwise quantities. The first 3 are the components of the tangential force between particles I and J, acting on particle I. The 4th is the magnitude of this tangential force. The next 3 (5-7) are the components of the rolling torque acting on diff --git a/src/GRANULAR/pair_granular.cpp b/src/GRANULAR/pair_granular.cpp index 2813035ebb..334c6a471e 100644 --- a/src/GRANULAR/pair_granular.cpp +++ b/src/GRANULAR/pair_granular.cpp @@ -391,6 +391,7 @@ void PairGranular::compute(int eflag, int vflag) } else { Fncrit = fabs(Fntot); } + Fscrit = tangential_coeffs[itype][jtype][2] * Fncrit; //------------------------------ // tangential forces @@ -446,7 +447,6 @@ void PairGranular::compute(int eflag, int vflag) fs3 = -k_tangential*history[2] - damp_tangential*vtr3; // rescale frictional displacements and forces if needed - Fscrit = tangential_coeffs[itype][jtype][2] * Fncrit; fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); if (fs > Fscrit) { shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + @@ -464,8 +464,8 @@ void PairGranular::compute(int eflag, int vflag) } else fs1 = fs2 = fs3 = 0.0; } } else { // classic pair gran/hooke (no history) - fs = meff*damp_tangential*vrel; - if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; + fs = damp_tangential*vrel; // From documentation: F_{t,damp} = - \eta_t v_{t,rel}, no need for extra `meff` + if (vrel != 0.0) Ft = MIN(Fscrit,fs) / vrel; // From documentation: critical force `Fscrit` used, not elastic normal force `Fne` else Ft = 0.0; fs1 = -Ft*vtr1; fs2 = -Ft*vtr2; @@ -635,7 +635,7 @@ void PairGranular::compute(int eflag, int vflag) torque[j][2] -= torroll3; } } - if (evflag) ev_tally_xyz(i,j,nlocal,0, + if (evflag) ev_tally_xyz(i,j,nlocal,0,//Should `newton_pair` passed instead of 0 ? 0.0,0.0,fx,fy,fz,delx,dely,delz); } } @@ -1451,11 +1451,13 @@ double PairGranular::single(int i, int j, int itype, int jtype, } if (damping_model[itype][jtype] == VELOCITY) { - damp_normal = normal_coeffs[itype][jtype][1]; + damp_normal = 1; + } else if (damping_model[itype][jtype] == MASS_VELOCITY) { + damp_normal = meff; } else if (damping_model[itype][jtype] == VISCOELASTIC) { - damp_normal = normal_coeffs[itype][jtype][1]*a*meff; + damp_normal = a*meff; } else if (damping_model[itype][jtype] == TSUJI) { - damp_normal = normal_coeffs[itype][jtype][1]*sqrt(meff*knfac); + damp_normal = sqrt(meff*knfac); } damp_normal_prefactor = normal_coeffs[itype][jtype][1]*damp_normal; @@ -1473,6 +1475,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, if (neighprev >= jnum) neighprev = 0; if (jlist[neighprev] == j) break; } + // the `history` pointer must not be modified here in single() function. already calculated in the compute() function. If modified here it changes the pair forces that have friction/twisting/rolling and history effects ! history = &allhistory[size_history*neighprev]; } @@ -1506,6 +1509,7 @@ double PairGranular::single(int i, int j, int itype, int jtype, } else { Fncrit = fabs(Fntot); } + Fscrit = tangential_coeffs[itype][jtype][2] * Fncrit; //------------------------------ // tangential forces @@ -1518,13 +1522,6 @@ double PairGranular::single(int i, int j, int itype, int jtype, k_tangential *= a; } else if (tangential_model[itype][jtype] == TANGENTIAL_MINDLIN_RESCALE) { k_tangential *= a; - // on unloading, rescale the shear displacements - if (a < history[3]) { - double factor = a/history[3]; - history[0] *= factor; - history[1] *= factor; - history[2] *= factor; - } } shrmag = sqrt(history[0]*history[0] + history[1]*history[1] + @@ -1535,28 +1532,26 @@ double PairGranular::single(int i, int j, int itype, int jtype, fs2 = -k_tangential*history[1] - damp_tangential*vtr2; fs3 = -k_tangential*history[2] - damp_tangential*vtr3; - // rescale frictional displacements and forces if needed - Fscrit = tangential_coeffs[itype][jtype][2] * Fncrit; + // rescale frictional forces if needed fs = sqrt(fs1*fs1 + fs2*fs2 + fs3*fs3); if (fs > Fscrit) { if (shrmag != 0.0) { - history[0] = -1.0/k_tangential*(Fscrit*fs1/fs + damp_tangential*vtr1); - history[1] = -1.0/k_tangential*(Fscrit*fs2/fs + damp_tangential*vtr2); - history[2] = -1.0/k_tangential*(Fscrit*fs3/fs + damp_tangential*vtr3); fs1 *= Fscrit/fs; fs2 *= Fscrit/fs; fs3 *= Fscrit/fs; - } else fs1 = fs2 = fs3 = 0.0; + fs *= Fscrit/fs; // saves the correct value of `fs` to svector + } else fs1 = fs2 = fs3 = fs = 0.0; // saves the correct of `fs` value to svector } // classic pair gran/hooke (no history) } else { - fs = meff*damp_tangential*vrel; - if (vrel != 0.0) Ft = MIN(Fne,fs) / vrel; + fs = damp_tangential*vrel; + if (vrel != 0.0) Ft = MIN(Fscrit,fs) / vrel; else Ft = 0.0; fs1 = -Ft*vtr1; fs2 = -Ft*vtr2; fs3 = -Ft*vtr3; + fs = Ft*vrel; // saves the correct value of `fs` to svector } //**************************************** @@ -1601,7 +1596,8 @@ double PairGranular::single(int i, int j, int itype, int jtype, fr1 *= Frcrit/fr; fr2 *= Frcrit/fr; fr3 *= Frcrit/fr; - } else fr1 = fr2 = fr3 = 0.0; + fr *= Frcrit/fr; // saves the correct value of `fr` to svector + } else fr1 = fr2 = fr3 = fr = 0.0; // saves the correct value of `fr` to svector } } From a5acf1655bd05de4d13921d25fb647f1d5d29ab3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 16 Aug 2019 17:30:37 -0400 Subject: [PATCH 095/418] resolve small formatting glitch Text blocks must all be flush on the left side or else sphinx gets confused since indenting is part of the syntax. --- doc/src/pair_granular.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index ccfe805b67..9fcc4dbe48 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -412,7 +412,7 @@ option by an additional factor of {a}, the radius of the contact region. The tan \end\{equation\} Here, {a} is the radius of the contact region, given by \(a =\sqrt\{R\delta\}\) - for all normal contact models, except for {jkr}, where it is given +for all normal contact models, except for {jkr}, where it is given implicitly by \(\delta = a^2/R - 2\sqrt\{\pi \gamma a/E\}\), see discussion above. To match the Mindlin solution, one should set \(k_t = 8G\), where \(G\) is the shear modulus, related to Young's modulus From c71e869a33cdec0c855763a0ce60928cf1149975 Mon Sep 17 00:00:00 2001 From: alxvov Date: Wed, 21 Aug 2019 14:02:34 +0000 Subject: [PATCH 096/418] define params in creator as init is called after modify --- src/SPIN/min_spin.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp index c8e0020ef8..947e281b42 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -41,15 +41,15 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -MinSpin::MinSpin(LAMMPS *lmp) : Min(lmp) {} +MinSpin::MinSpin(LAMMPS *lmp) : Min(lmp) { + alpha_damp = 1.0; + discrete_factor = 10.0; +} /* ---------------------------------------------------------------------- */ void MinSpin::init() { - alpha_damp = 1.0; - discrete_factor = 10.0; - Min::init(); dts = dt = update->dt; From 52a51ea470dbd9f844db003af0153e3dad33c493 Mon Sep 17 00:00:00 2001 From: charlie sievers Date: Wed, 21 Aug 2019 19:14:08 -0700 Subject: [PATCH 097/418] Simplified GJF formalism --- src/fix_langevin.cpp | 762 ++++++++++++++++++------------------------- src/fix_langevin.h | 135 +++----- 2 files changed, 371 insertions(+), 526 deletions(-) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index d323453cdb..b8144fc5f3 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -2,20 +2,16 @@ LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator http://lammps.sandia.gov, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov - Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. This software is distributed under the GNU General Public License. - See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- Contributing authors: Carolyn Phillips (U Mich), reservoir energy tally Aidan Thompson (SNL) GJF formulation - Charles Sievers (UC Davis) GJF-2GJ Implementation - Niels Gronbech-Jensen (UC Davis) GJF-2GJ Formulation ------------------------------------------------------------------------- */ #include "fix_langevin.h" @@ -50,10 +46,9 @@ enum{CONSTANT,EQUAL,ATOM}; /* ---------------------------------------------------------------------- */ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - gjfflag(0), gfactor1(NULL), gfactor2(NULL), ratio(NULL), tstr(NULL), - flangevin(NULL), tforce(NULL), franprev(NULL), id_temp(NULL), random(NULL), - lv(NULL), wildcard(NULL), bias(NULL) + Fix(lmp, narg, arg), + gjfflag(0), gfactor1(NULL), gfactor2(NULL), ratio(NULL), tstr(NULL), + flangevin(NULL), tforce(NULL), franprev(NULL), id_temp(NULL), random(NULL), lv(NULL) { if (narg < 7) error->all(FLERR,"Illegal fix langevin command"); @@ -98,7 +93,6 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : oflag = 0; tallyflag = 0; zeroflag = 0; - hsflag = 0; int iarg = 7; while (iarg < narg) { @@ -110,10 +104,7 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : } else if (strcmp(arg[iarg],"gjf") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix langevin command"); if (strcmp(arg[iarg+1],"no") == 0) gjfflag = 0; - else if (strcmp(arg[iarg+1],"yes") == 0) - error->all(FLERR,"GJF yes keyword is deprecated.\nPlease use vhalf or vfull."); - else if (strcmp(arg[iarg+1],"vfull") == 0) {gjfflag = 1; hsflag = 0;} - else if (strcmp(arg[iarg+1],"vhalf") == 0) {gjfflag = 1; hsflag = 1;} + else if (strcmp(arg[iarg+1],"yes") == 0) gjfflag = 1; else error->all(FLERR,"Illegal fix langevin command"); iarg += 2; } else if (strcmp(arg[iarg],"omega") == 0) { @@ -159,9 +150,7 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : flangevin = NULL; flangevin_allocated = 0; franprev = NULL; - wildcard = NULL; lv = NULL; - bias = NULL; tforce = NULL; maxatom1 = maxatom2 = 0; @@ -170,26 +159,19 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : // no need to set peratom_flag, b/c data is for internal use only if (gjfflag) { - - nvalues = 3; grow_arrays(atom->nmax); atom->add_callback(0); - // initialize franprev to zero + // initialize franprev to zero int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) { franprev[i][0] = 0.0; franprev[i][1] = 0.0; franprev[i][2] = 0.0; - wildcard[i][0] = 0.0; - wildcard[i][1] = 0.0; - wildcard[i][2] = 0.0; - if (hsflag) { - lv[i][0] = 0.0; - lv[i][1] = 0.0; - lv[i][2] = 0.0; - } + lv[i][0] = 0.0; + lv[i][1] = 0.0; + lv[i][2] = 0.0; } } @@ -210,9 +192,7 @@ FixLangevin::~FixLangevin() if (gjfflag) { memory->destroy(franprev); - memory->destroy(wildcard); - if (hsflag) memory->destroy(lv); - if (temperature && temperature->tempbias) memory->destroy(bias); + memory->destroy(lv); atom->delete_callback(id,0); } } @@ -222,7 +202,8 @@ FixLangevin::~FixLangevin() int FixLangevin::setmask() { int mask = 0; - if (gjfflag) mask |= POST_INTEGRATE; + if (gjfflag) mask |= INITIAL_INTEGRATE; + if (gjfflag) mask |= INITIAL_INTEGRATE_RESPA; mask |= POST_FORCE; mask |= POST_FORCE_RESPA; mask |= END_OF_STEP; @@ -234,14 +215,26 @@ int FixLangevin::setmask() void FixLangevin::init() { + if (gjfflag){ + if (t_period*2 == update->dt) + error->all(FLERR,"Fix langevin gjf cannot have t_period equal to dt/2 at the start"); + + // warn if any integrate fix comes after this one + int before = 1; + int flag = 0; + for (int i = 0; i < modify->nfix; i++) { + if (strcmp(id,modify->fix[i]->id) == 0) before = 0; + else if ((modify->fmask[i] && strcmp(modify->fix[i]->style,"nve")==0) && before) flag = 1; + } + if (flag && comm->me == 0) + error->all(FLERR,"Fix langevin gjf should come before fix nve"); + } + if (oflag && !atom->sphere_flag) error->all(FLERR,"Fix langevin omega requires atom style sphere"); if (ascale && !atom->ellipsoid_flag) error->all(FLERR,"Fix langevin angmom requires atom style ellipsoid"); - if (gjfflag && zeroflag && tallyflag) - error->warning(FLERR, - "Fix langevin: gjf, zero, and tally were all set correct energy tallying is not guaranteed"); // check variable if (tstr) { @@ -281,17 +274,19 @@ void FixLangevin::init() error->one(FLERR,"Fix langevin angmom requires extended particles"); } + // set force prefactors + if (!atom->rmass) { for (int i = 1; i <= atom->ntypes; i++) { gfactor1[i] = -atom->mass[i] / t_period / force->ftm2v; - if (gjfflag) + if (!gjfflag) gfactor2[i] = sqrt(atom->mass[i]) * - sqrt(2.0*force->boltz/t_period/update->dt/force->mvv2e) / - force->ftm2v; + sqrt(24.0*force->boltz/t_period/update->dt/force->mvv2e) / + force->ftm2v; else gfactor2[i] = sqrt(atom->mass[i]) * - sqrt(24.0*force->boltz/t_period/update->dt/force->mvv2e) / - force->ftm2v; + sqrt(2.0*force->boltz/t_period/update->dt/force->mvv2e) / + force->ftm2v; gfactor1[i] *= 1.0/ratio[i]; gfactor2[i] *= 1.0/sqrt(ratio[i]); } @@ -303,17 +298,57 @@ void FixLangevin::init() if (strstr(update->integrate_style,"respa")) nlevels_respa = ((Respa *) update->integrate)->nlevels; - if (strstr(update->integrate_style,"respa")) - error->one(FLERR,"Fix langevin gjf not implemented with respa capabilities"); - - if (gjfflag) gjffac = 1.0/sqrt(1.0+update->dt/2.0/t_period); - + if (gjfflag) gjfa = (1.0-update->dt/2.0/t_period)/(1.0+update->dt/2.0/t_period); + if (gjfflag) gjfsib = sqrt(1.0+update->dt/2.0/t_period); } /* ---------------------------------------------------------------------- */ void FixLangevin::setup(int vflag) { + if (gjfflag){ + double dtfm; + double dt = update->dt; + double **v = atom->v; + double **f = atom->f; + int *mask = atom->mask; + int nlocal = atom->nlocal; + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + if (rmass) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = 0.5 * dt / rmass[i]; + v[i][0] -= dtfm * f[i][0]; + v[i][1] -= dtfm * f[i][1]; + v[i][2] -= dtfm * f[i][2]; + if (tbiasflag) + temperature->remove_bias(i,v[i]); + v[i][0] /= gjfa*gjfsib*gjfsib; + v[i][1] /= gjfa*gjfsib*gjfsib; + v[i][2] /= gjfa*gjfsib*gjfsib; + if (tbiasflag) + temperature->restore_bias(i,v[i]); + } + + } else { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = 0.5 * dt / 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 (tbiasflag) + temperature->remove_bias(i,v[i]); + v[i][0] /= gjfa*gjfsib*gjfsib; + v[i][1] /= gjfa*gjfsib*gjfsib; + v[i][2] /= gjfa*gjfsib*gjfsib; + if (tbiasflag) + temperature->restore_bias(i,v[i]); + } + } + } if (strstr(update->integrate_style,"verlet")) post_force(vflag); else { @@ -321,144 +356,67 @@ void FixLangevin::setup(int vflag) post_force_respa(vflag,nlevels_respa-1,0); ((Respa *) update->integrate)->copy_f_flevel(nlevels_respa-1); } - if (gjfflag) { - - // update v of atoms in group - double ** v = atom->v; + if (gjfflag){ + double dtfm; + double dt = update->dt; double **f = atom->f; + double **v = atom->v; + int *mask = atom->mask; int nlocal = atom->nlocal; - if (igroup == atom->firstgroup) nlocal = atom->nfirst; - double b[3] = {0.0,0.0,0.0}; - - for (int i = 0; i < nlocal; i++) { - f[i][0] = wildcard[i][0]; - f[i][1] = wildcard[i][1]; - f[i][2] = wildcard[i][2]; - b[0] = v[i][0]; - b[1] = v[i][1]; - b[2] = v[i][2]; - if (tbiasflag == BIAS) temperature->remove_bias(i,v[i]); - wildcard[i][0] = v[i][0]; - wildcard[i][1] = v[i][1]; - wildcard[i][2] = v[i][2]; - if (tbiasflag == BIAS) { - temperature->restore_bias(i,v[i]); - bias[i][0] = b[0] - wildcard[i][0]; - bias[i][1] = b[1] - wildcard[i][1]; - bias[i][2] = b[2] - wildcard[i][2]; - } + double *rmass = atom->rmass; + double *mass = atom->mass; + int *type = atom->type; + if (rmass) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = 0.5 * dt / rmass[i]; + v[i][0] += dtfm * f[i][0]; + v[i][1] += dtfm * f[i][1]; + v[i][2] += dtfm * f[i][2]; + lv[i][0] = f[i][0]; + lv[i][1] = f[i][1]; + lv[i][2] = f[i][2]; + } +// + } else { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + dtfm = 0.5 * dt / mass[type[i]]; + v[i][0] += dtfm * f[i][0]; + v[i][1] += dtfm * f[i][1]; + v[i][2] += dtfm * f[i][2]; + lv[i][0] = v[i][0]; + lv[i][1] = v[i][1]; + lv[i][2] = v[i][2]; + } } } } -/* ---------------------------------------------------------------------- - allow for both per-type and per-atom mass -------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- */ -void FixLangevin::post_integrate() +void FixLangevin::initial_integrate_respa(int vflag, int ilevel, int /* iloop */){ + if (ilevel == respa_level-1) initial_integrate(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixLangevin::initial_integrate(int /* vflag */) { - double dtfm; - double dt = update->dt; - double dtf = 0.5 * dt * force->ftm2v; - - // update v of atoms in group - - double **x = atom->x; double **v = atom->v; double **f = atom->f; - double *rmass = atom->rmass; - double *mass = atom->mass; - int *type = atom->type; int *mask = atom->mask; int nlocal = atom->nlocal; - if (igroup == atom->firstgroup) nlocal = atom->nfirst; - // zero option - double vsum[3],vsumall[3]; - bigint count; - - if (zeroflag) { - vsum[0] = vsum[1] = vsum[2] = 0.0; - count = group->count(igroup); - if (count == 0) - error->all(FLERR,"Cannot zero Langevin force of 0 atoms"); - } - - if (rmass) { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - dtfm = dtf / rmass[i]; - x[i][0] -= dt * v[i][0]; - x[i][1] -= dt * v[i][1]; - x[i][2] -= dt * v[i][2]; - v[i][0] = gjffac * (wildcard[i][0] + dtfm * franprev[i][0] + dtfm * f[i][0]); - v[i][1] = gjffac * (wildcard[i][1] + dtfm * franprev[i][1] + dtfm * f[i][1]); - v[i][2] = gjffac * (wildcard[i][2] + dtfm * franprev[i][2] + dtfm * f[i][2]); - if (tbiasflag == BIAS) - for (int j = 0; j < 3; j++) { - if (wildcard[i][j] == 0) { - v[i][j] /= gjffac * gjffac; - } - } - x[i][0] += gjffac * dt * v[i][0]; - x[i][1] += gjffac * dt * v[i][1]; - x[i][2] += gjffac * dt * v[i][2]; - if (tbiasflag == BIAS) - for (int j = 0; j < 3; j++) { - if (wildcard[i][j] == 0) - v[i][j] *= gjffac; - v[i][j] += bias[i][j]; - x[i][j] += dt * bias[i][j]; - } - } - - } else { - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - dtfm = dtf / mass[type[i]]; - x[i][0] -= dt * v[i][0]; - x[i][1] -= dt * v[i][1]; - x[i][2] -= dt * v[i][2]; - v[i][0] = gjffac * (wildcard[i][0] + dtfm * franprev[i][0] + dtfm * f[i][0]); - v[i][1] = gjffac * (wildcard[i][1] + dtfm * franprev[i][1] + dtfm * f[i][1]); - v[i][2] = gjffac * (wildcard[i][2] + dtfm * franprev[i][2] + dtfm * f[i][2]); - if (tbiasflag == BIAS) - for (int j = 0; j < 3; j++) { - if (wildcard[i][j] == 0) { - v[i][j] /= gjffac*gjffac; - } - } - x[i][0] += gjffac * dt * v[i][0]; - x[i][1] += gjffac * dt * v[i][1]; - x[i][2] += gjffac * dt * v[i][2]; - if (tbiasflag == BIAS) - for (int j = 0; j < 3; j++) { - if (wildcard[i][j] == 0) - v[i][j] *= gjffac; - v[i][j] += bias[i][j]; - x[i][j] += dt * bias[i][j]; - } - if (zeroflag){ - vsum[0] += gjffac * dtfm * franprev[i][0]; - vsum[1] += gjffac * dtfm * franprev[i][1]; - vsum[2] += gjffac * dtfm * franprev[i][2]; - } - } - } - - if (zeroflag) { - MPI_Allreduce(vsum,vsumall,3,MPI_DOUBLE,MPI_SUM,world); - vsumall[0] /= count; - vsumall[1] /= count; - vsumall[2] /= count; - for (int i = 0; i < nlocal; i++) { - if (mask[i] & groupbit) { - v[i][0] -= vsumall[0]; - v[i][1] -= vsumall[1]; - v[i][2] -= vsumall[2]; - } + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit){ + f[i][0] /= gjfa; + f[i][1] /= gjfa; + f[i][2] /= gjfa; + v[i][0] = lv[i][0]; + v[i][1] = lv[i][1]; + v[i][2] = lv[i][2]; } - } } /* ---------------------------------------------------------------------- */ @@ -479,124 +437,124 @@ void FixLangevin::post_force(int /*vflag*/) if (zeroflag) post_force_templated<1,1,1,1,1,1>(); else post_force_templated<1,1,1,1,1,0>(); else - if (zeroflag) post_force_templated<1,1,1,1,0,1>(); - else post_force_templated<1,1,1,1,0,0>(); + if (zeroflag) post_force_templated<1,1,1,1,0,1>(); + else post_force_templated<1,1,1,1,0,0>(); else - if (rmass) - if (zeroflag) post_force_templated<1,1,1,0,1,1>(); - else post_force_templated<1,1,1,0,1,0>(); - else - if (zeroflag) post_force_templated<1,1,1,0,0,1>(); - else post_force_templated<1,1,1,0,0,0>(); + if (rmass) + if (zeroflag) post_force_templated<1,1,1,0,1,1>(); + else post_force_templated<1,1,1,0,1,0>(); + else + if (zeroflag) post_force_templated<1,1,1,0,0,1>(); + else post_force_templated<1,1,1,0,0,0>(); else - if (tbiasflag == BIAS) - if (rmass) - if (zeroflag) post_force_templated<1,1,0,1,1,1>(); - else post_force_templated<1,1,0,1,1,0>(); - else - if (zeroflag) post_force_templated<1,1,0,1,0,1>(); - else post_force_templated<1,1,0,1,0,0>(); + if (tbiasflag == BIAS) + if (rmass) + if (zeroflag) post_force_templated<1,1,0,1,1,1>(); + else post_force_templated<1,1,0,1,1,0>(); else - if (rmass) - if (zeroflag) post_force_templated<1,1,0,0,1,1>(); - else post_force_templated<1,1,0,0,1,0>(); - else - if (zeroflag) post_force_templated<1,1,0,0,0,1>(); - else post_force_templated<1,1,0,0,0,0>(); + if (zeroflag) post_force_templated<1,1,0,1,0,1>(); + else post_force_templated<1,1,0,1,0,0>(); + else + if (rmass) + if (zeroflag) post_force_templated<1,1,0,0,1,1>(); + else post_force_templated<1,1,0,0,1,0>(); + else + if (zeroflag) post_force_templated<1,1,0,0,0,1>(); + else post_force_templated<1,1,0,0,0,0>(); else - if (tallyflag) - if (tbiasflag == BIAS) - if (rmass) - if (zeroflag) post_force_templated<1,0,1,1,1,1>(); - else post_force_templated<1,0,1,1,1,0>(); - else - if (zeroflag) post_force_templated<1,0,1,1,0,1>(); - else post_force_templated<1,0,1,1,0,0>(); + if (tallyflag) + if (tbiasflag == BIAS) + if (rmass) + if (zeroflag) post_force_templated<1,0,1,1,1,1>(); + else post_force_templated<1,0,1,1,1,0>(); else - if (rmass) - if (zeroflag) post_force_templated<1,0,1,0,1,1>(); - else post_force_templated<1,0,1,0,1,0>(); - else - if (zeroflag) post_force_templated<1,0,1,0,0,1>(); - else post_force_templated<1,0,1,0,0,0>(); + if (zeroflag) post_force_templated<1,0,1,1,0,1>(); + else post_force_templated<1,0,1,1,0,0>(); else - if (tbiasflag == BIAS) - if (rmass) - if (zeroflag) post_force_templated<1,0,0,1,1,1>(); - else post_force_templated<1,0,0,1,1,0>(); - else - if (zeroflag) post_force_templated<1,0,0,1,0,1>(); - else post_force_templated<1,0,0,1,0,0>(); - else - if (rmass) - if (zeroflag) post_force_templated<1,0,0,0,1,1>(); - else post_force_templated<1,0,0,0,1,0>(); - else - if (zeroflag) post_force_templated<1,0,0,0,0,1>(); - else post_force_templated<1,0,0,0,0,0>(); + if (rmass) + if (zeroflag) post_force_templated<1,0,1,0,1,1>(); + else post_force_templated<1,0,1,0,1,0>(); + else + if (zeroflag) post_force_templated<1,0,1,0,0,1>(); + else post_force_templated<1,0,1,0,0,0>(); + else + if (tbiasflag == BIAS) + if (rmass) + if (zeroflag) post_force_templated<1,0,0,1,1,1>(); + else post_force_templated<1,0,0,1,1,0>(); + else + if (zeroflag) post_force_templated<1,0,0,1,0,1>(); + else post_force_templated<1,0,0,1,0,0>(); + else + if (rmass) + if (zeroflag) post_force_templated<1,0,0,0,1,1>(); + else post_force_templated<1,0,0,0,1,0>(); + else + if (zeroflag) post_force_templated<1,0,0,0,0,1>(); + else post_force_templated<1,0,0,0,0,0>(); else - if (gjfflag) - if (tallyflag) - if (tbiasflag == BIAS) - if (rmass) - if (zeroflag) post_force_templated<0,1,1,1,1,1>(); - else post_force_templated<0,1,1,1,1,0>(); - else - if (zeroflag) post_force_templated<0,1,1,1,0,1>(); - else post_force_templated<0,1,1,1,0,0>(); + if (gjfflag) + if (tallyflag) + if (tbiasflag == BIAS) + if (rmass) + if (zeroflag) post_force_templated<0,1,1,1,1,1>(); + else post_force_templated<0,1,1,1,1,0>(); else - if (rmass) - if (zeroflag) post_force_templated<0,1,1,0,1,1>(); - else post_force_templated<0,1,1,0,1,0>(); - else - if (zeroflag) post_force_templated<0,1,1,0,0,1>(); - else post_force_templated<0,1,1,0,0,0>(); + if (zeroflag) post_force_templated<0,1,1,1,0,1>(); + else post_force_templated<0,1,1,1,0,0>(); else - if (tbiasflag == BIAS) - if (rmass) - if (zeroflag) post_force_templated<0,1,0,1,1,1>(); - else post_force_templated<0,1,0,1,1,0>(); - else - if (zeroflag) post_force_templated<0,1,0,1,0,1>(); - else post_force_templated<0,1,0,1,0,0>(); - else - if (rmass) - if (zeroflag) post_force_templated<0,1,0,0,1,1>(); - else post_force_templated<0,1,0,0,1,0>(); - else - if (zeroflag) post_force_templated<0,1,0,0,0,1>(); - else post_force_templated<0,1,0,0,0,0>(); + if (rmass) + if (zeroflag) post_force_templated<0,1,1,0,1,1>(); + else post_force_templated<0,1,1,0,1,0>(); + else + if (zeroflag) post_force_templated<0,1,1,0,0,1>(); + else post_force_templated<0,1,1,0,0,0>(); else - if (tallyflag) - if (tbiasflag == BIAS) - if (rmass) - if (zeroflag) post_force_templated<0,0,1,1,1,1>(); - else post_force_templated<0,0,1,1,1,0>(); - else - if (zeroflag) post_force_templated<0,0,1,1,0,1>(); - else post_force_templated<0,0,1,1,0,0>(); - else - if (rmass) - if (zeroflag) post_force_templated<0,0,1,0,1,1>(); - else post_force_templated<0,0,1,0,1,0>(); - else - if (zeroflag) post_force_templated<0,0,1,0,0,1>(); - else post_force_templated<0,0,1,0,0,0>(); + if (tbiasflag == BIAS) + if (rmass) + if (zeroflag) post_force_templated<0,1,0,1,1,1>(); + else post_force_templated<0,1,0,1,1,0>(); else - if (tbiasflag == BIAS) - if (rmass) - if (zeroflag) post_force_templated<0,0,0,1,1,1>(); - else post_force_templated<0,0,0,1,1,0>(); - else - if (zeroflag) post_force_templated<0,0,0,1,0,1>(); - else post_force_templated<0,0,0,1,0,0>(); - else - if (rmass) - if (zeroflag) post_force_templated<0,0,0,0,1,1>(); - else post_force_templated<0,0,0,0,1,0>(); - else - if (zeroflag) post_force_templated<0,0,0,0,0,1>(); - else post_force_templated<0,0,0,0,0,0>(); + if (zeroflag) post_force_templated<0,1,0,1,0,1>(); + else post_force_templated<0,1,0,1,0,0>(); + else + if (rmass) + if (zeroflag) post_force_templated<0,1,0,0,1,1>(); + else post_force_templated<0,1,0,0,1,0>(); + else + if (zeroflag) post_force_templated<0,1,0,0,0,1>(); + else post_force_templated<0,1,0,0,0,0>(); + else + if (tallyflag) + if (tbiasflag == BIAS) + if (rmass) + if (zeroflag) post_force_templated<0,0,1,1,1,1>(); + else post_force_templated<0,0,1,1,1,0>(); + else + if (zeroflag) post_force_templated<0,0,1,1,0,1>(); + else post_force_templated<0,0,1,1,0,0>(); + else + if (rmass) + if (zeroflag) post_force_templated<0,0,1,0,1,1>(); + else post_force_templated<0,0,1,0,1,0>(); + else + if (zeroflag) post_force_templated<0,0,1,0,0,1>(); + else post_force_templated<0,0,1,0,0,0>(); + else + if (tbiasflag == BIAS) + if (rmass) + if (zeroflag) post_force_templated<0,0,0,1,1,1>(); + else post_force_templated<0,0,0,1,1,0>(); + else + if (zeroflag) post_force_templated<0,0,0,1,0,1>(); + else post_force_templated<0,0,0,1,0,0>(); + else + if (rmass) + if (zeroflag) post_force_templated<0,0,0,0,1,1>(); + else post_force_templated<0,0,0,0,1,0>(); + else + if (zeroflag) post_force_templated<0,0,0,0,0,1>(); + else post_force_templated<0,0,0,0,0,0>(); } /* ---------------------------------------------------------------------- */ @@ -611,7 +569,7 @@ void FixLangevin::post_force_respa(int vflag, int ilevel, int /*iloop*/) ------------------------------------------------------------------------- */ template < int Tp_TSTYLEATOM, int Tp_GJF, int Tp_TALLY, - int Tp_BIAS, int Tp_RMASS, int Tp_ZERO > + int Tp_BIAS, int Tp_RMASS, int Tp_ZERO > void FixLangevin::post_force_templated() { double gamma1,gamma2; @@ -644,8 +602,9 @@ void FixLangevin::post_force_templated() // sum random force over all atoms in group // subtract sum/count from each atom in group - double fdrag[3],fran[3],fsum[3],fsumall[3], rantemp[3]; + double fdrag[3],fran[3],fsum[3],fsumall[3]; bigint count; + double fswap; double boltz = force->boltz; double dt = update->dt; @@ -672,33 +631,33 @@ void FixLangevin::post_force_templated() flangevin_allocated = 1; } - if (Tp_BIAS && !gjfflag) temperature->compute_scalar(); - else if (Tp_BIAS && update->ntimestep == update->beginstep && gjfflag) temperature->compute_scalar(); + if (Tp_BIAS) temperature->compute_scalar(); for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { if (Tp_TSTYLEATOM) tsqrt = sqrt(tforce[i]); if (Tp_RMASS) { gamma1 = -rmass[i] / t_period / ftm2v; - if (Tp_GJF) - gamma2 = sqrt(rmass[i]) * sqrt(2.0 * boltz / t_period / dt / mvv2e) / ftm2v; + if (!Tp_GJF) + gamma2 = sqrt(rmass[i]) * sqrt(24.0*boltz/t_period/dt/mvv2e) / ftm2v; else - gamma2 = sqrt(rmass[i]) * sqrt(24.0 * boltz / t_period / dt / mvv2e) / ftm2v; - gamma1 *= 1.0 / ratio[type[i]]; - gamma2 *= 1.0 / sqrt(ratio[type[i]]) * tsqrt; + gamma2 = sqrt(rmass[i]) * sqrt(2.0*boltz/t_period/dt/mvv2e) / ftm2v; + gamma1 *= 1.0/ratio[type[i]]; + gamma2 *= 1.0/sqrt(ratio[type[i]]) * tsqrt; } else { gamma1 = gfactor1[type[i]]; gamma2 = gfactor2[type[i]] * tsqrt; } - if (Tp_GJF) { - fran[0] = gamma2 * random->gaussian(); - fran[1] = gamma2 * random->gaussian(); - fran[2] = gamma2 * random->gaussian(); - } else { - fran[0] = gamma2 * (random->uniform()-0.5); - fran[1] = gamma2 * (random->uniform()-0.5); - fran[2] = gamma2 * (random->uniform()-0.5); + if (!Tp_GJF){ + fran[0] = gamma2*(random->uniform()-0.5); + fran[1] = gamma2*(random->uniform()-0.5); + fran[2] = gamma2*(random->uniform()-0.5); + } + else{ + fran[0] = gamma2*random->gaussian(); + fran[1] = gamma2*random->gaussian(); + fran[2] = gamma2*random->gaussian(); } if (Tp_BIAS) { @@ -717,21 +676,35 @@ void FixLangevin::post_force_templated() } if (Tp_GJF) { - wildcard[i][0] = f[i][0]; - wildcard[i][1] = f[i][1]; - wildcard[i][2] = f[i][2]; + if (Tp_BIAS) + temperature->remove_bias(i,v[i]); + lv[i][0] = gjfsib*v[i][0]; + lv[i][1] = gjfsib*v[i][1]; + lv[i][2] = gjfsib*v[i][2]; + if (Tp_BIAS) + temperature->restore_bias(i,v[i]); + if (Tp_BIAS) + temperature->restore_bias(i,lv[i]); - rantemp[0] = fran[0]; - rantemp[1] = fran[1]; - rantemp[2] = fran[2]; + fswap = 0.5*(fran[0]+franprev[i][0]); + franprev[i][0] = fran[0]; + fran[0] = fswap; + fswap = 0.5*(fran[1]+franprev[i][1]); + franprev[i][1] = fran[1]; + fran[1] = fswap; + fswap = 0.5*(fran[2]+franprev[i][2]); + franprev[i][2] = fran[2]; + fran[2] = fswap; - fran[0] = franprev[i][0]; - fran[1] = franprev[i][1]; - fran[2] = franprev[i][2]; - - fdrag[0] *= -2*t_period*((2*gjffac)-(1.0/gjffac)-1.0)/dt; - fdrag[1] *= -2*t_period*((2*gjffac)-(1.0/gjffac)-1.0)/dt; - fdrag[2] *= -2*t_period*((2*gjffac)-(1.0/gjffac)-1.0)/dt; + fdrag[0] *= gjfa; + fdrag[1] *= gjfa; + fdrag[2] *= gjfa; + fran[0] *= gjfa; + fran[1] *= gjfa; + fran[2] *= gjfa; + f[i][0] *= gjfa; + f[i][1] *= gjfa; + f[i][2] *= gjfa; } f[i][0] += fdrag[0] + fran[0]; @@ -739,61 +712,15 @@ void FixLangevin::post_force_templated() f[i][2] += fdrag[2] + fran[2]; if (Tp_TALLY) { - if (Tp_GJF && update->ntimestep != update->beginstep){ - if (Tp_BIAS) { - temperature->remove_bias(i,v[i]); - fdrag[0] = gamma1*gjffac*gjffac*v[i][0]; - fdrag[1] = gamma1*gjffac*gjffac*v[i][1]; - fdrag[2] = gamma1*gjffac*gjffac*v[i][2]; - temperature->restore_bias(i,v[i]); - } else { - fdrag[0] = gamma1*gjffac*gjffac*v[i][0]; - fdrag[1] = gamma1*gjffac*gjffac*v[i][1]; - fdrag[2] = gamma1*gjffac*gjffac*v[i][2]; - } - fran[0] *= gjffac; - fran[1] *= gjffac; - fran[2] *= gjffac; - } - else if (Tp_GJF && update->ntimestep == update->beginstep){ - fdrag[0] = 0.0; - fdrag[1] = 0.0; - fdrag[2] = 0.0; - } flangevin[i][0] = fdrag[0] + fran[0]; flangevin[i][1] = fdrag[1] + fran[1]; flangevin[i][2] = fdrag[2] + fran[2]; } if (Tp_ZERO) { - if (!Tp_GJF){ - fsum[0] += fran[0]; - fsum[1] += fran[1]; - fsum[2] += fran[2]; - } - else { - fsum[0] += franprev[i][0]; - fsum[1] += franprev[i][1]; - fsum[2] += franprev[i][2]; - } - } - - if (Tp_GJF) - { - franprev[i][0] = rantemp[0]; - franprev[i][1] = rantemp[1]; - franprev[i][2] = rantemp[2]; - - if (hsflag){ - lv[i][0] = v[i][0]; - lv[i][1] = v[i][1]; - lv[i][2] = v[i][2]; - if (tbiasflag == BIAS) { - lv[i][0] += bias[i][0]; - lv[i][1] += bias[i][1]; - lv[i][2] += bias[i][2]; - } - } + fsum[0] += fran[0]; + fsum[1] += fran[1]; + fsum[2] += fran[2]; } } } @@ -977,46 +904,34 @@ void FixLangevin::end_of_step() if (!tallyflag && !gjfflag) return; double **v = atom->v; - double **f = atom->f; int *mask = atom->mask; int nlocal = atom->nlocal; - double b[3] = {0.0,0.0,0.0}; - - if (gjfflag && tbiasflag == BIAS) temperature->compute_scalar(); energy_onestep = 0.0; - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - if (gjfflag){ - b[0] = v[i][0]; - b[1] = v[i][1]; - b[2] = v[i][2]; - f[i][0] = wildcard[i][0]; - f[i][1] = wildcard[i][1]; - f[i][2] = wildcard[i][2]; - if (tbiasflag == BIAS) temperature->remove_bias(i,v[i]); - wildcard[i][0] = v[i][0]; - wildcard[i][1] = v[i][1]; - wildcard[i][2] = v[i][2]; - if (tbiasflag == BIAS) { - bias[i][0] = b[0] - v[i][0]; - bias[i][1] = b[1] - v[i][1]; - bias[i][2] = b[2] - v[i][2]; - temperature->restore_bias(i, v[i]); - } - if (hsflag){ - v[i][0] = lv[i][0]; - v[i][1] = lv[i][1]; - v[i][2] = lv[i][2]; - } + + if (gjfflag){ + double tmp[3]; + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit){ + tmp[0] = v[i][0]; + tmp[1] = v[i][1]; + tmp[2] = v[i][2]; + v[i][0] = lv[i][0]; + v[i][1] = lv[i][1]; + v[i][2] = lv[i][2]; + lv[i][0] = tmp[0]; + lv[i][1] = tmp[1]; + lv[i][2] = tmp[2]; } - if (tallyflag) - energy_onestep += flangevin[i][0] * v[i][0] + flangevin[i][1] * v[i][1] + - flangevin[i][2] * v[i][2]; - } - if (tallyflag) { - energy += energy_onestep * update->dt; } + + if (tallyflag) + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) + energy_onestep += flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] + + flangevin[i][2]*v[i][2]; + + energy += energy_onestep*update->dt; } /* ---------------------------------------------------------------------- */ @@ -1033,8 +948,8 @@ void FixLangevin::reset_dt() if (atom->mass) { for (int i = 1; i <= atom->ntypes; i++) { gfactor2[i] = sqrt(atom->mass[i]) * - sqrt(24.0*force->boltz/t_period/update->dt/force->mvv2e) / - force->ftm2v; + sqrt(24.0*force->boltz/t_period/update->dt/force->mvv2e) / + force->ftm2v; gfactor2[i] *= 1.0/sqrt(ratio[i]); } } @@ -1070,7 +985,7 @@ int FixLangevin::modify_param(int narg, char **arg) double FixLangevin::compute_scalar() { - if (!tallyflag && !flangevin_allocated) return 0.0; + if (!tallyflag || !flangevin_allocated) return 0.0; // capture the very first energy transfer to thermal reservoir @@ -1083,16 +998,13 @@ double FixLangevin::compute_scalar() for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) energy_onestep += flangevin[i][0]*v[i][0] + flangevin[i][1]*v[i][1] + - flangevin[i][2]*v[i][2]; + flangevin[i][2]*v[i][2]; energy = 0.5*energy_onestep*update->dt; } // convert midstep energy back to previous fullstep energy - double energy_me; - if (gjfflag) - energy_me = energy - energy_onestep*update->dt; - else - energy_me = energy - 0.5*energy_onestep*update->dt; + + double energy_me = energy - 0.5*energy_onestep*update->dt; double energy_all; MPI_Allreduce(&energy_me,&energy_all,1,MPI_DOUBLE,MPI_SUM,world); @@ -1119,9 +1031,7 @@ void *FixLangevin::extract(const char *str, int &dim) double FixLangevin::memory_usage() { double bytes = 0.0; - if (gjfflag) bytes += atom->nmax*3*2 * sizeof(double); - if (gjfflag) if (hsflag) bytes += atom->nmax*3 * sizeof(double); - if (gjfflag && tbiasflag == BIAS) bytes += atom->nmax*3 * sizeof(double); + if (gjfflag) bytes += atom->nmax*6 * sizeof(double); if (tallyflag) bytes += atom->nmax*3 * sizeof(double); if (tforce) bytes += atom->nmax * sizeof(double); return bytes; @@ -1134,9 +1044,7 @@ double FixLangevin::memory_usage() void FixLangevin::grow_arrays(int nmax) { memory->grow(franprev,nmax,3,"fix_langevin:franprev"); - memory->grow(wildcard,nmax,3,"fix_langevin:wildcard"); - if (hsflag) memory->grow(lv,nmax,3,"fix_langevin:lv"); - if (tbiasflag == BIAS) memory->grow(bias,nmax,3,"fix_langevin:bias"); + memory->grow(lv,nmax,3,"fix_langevin:lv"); } /* ---------------------------------------------------------------------- @@ -1148,19 +1056,9 @@ void FixLangevin::copy_arrays(int i, int j, int /*delflag*/) franprev[j][0] = franprev[i][0]; franprev[j][1] = franprev[i][1]; franprev[j][2] = franprev[i][2]; - wildcard[j][0] = wildcard[i][0]; - wildcard[j][1] = wildcard[i][1]; - wildcard[j][2] = wildcard[i][2]; - if (hsflag) { - lv[j][0] = lv[i][0]; - lv[j][1] = lv[i][1]; - lv[j][2] = lv[i][2]; - } - if (tbiasflag == BIAS){ - bias[j][0] = bias[i][0]; - bias[j][1] = bias[i][1]; - bias[j][2] = bias[i][2]; - } + lv[j][0] = lv[i][0]; + lv[j][1] = lv[i][1]; + lv[j][2] = lv[i][2]; } /* ---------------------------------------------------------------------- @@ -1173,19 +1071,9 @@ int FixLangevin::pack_exchange(int i, double *buf) buf[n++] = franprev[i][0]; buf[n++] = franprev[i][1]; buf[n++] = franprev[i][2]; - buf[n++] = wildcard[i][0]; - buf[n++] = wildcard[i][1]; - buf[n++] = wildcard[i][2]; - if (hsflag){ - buf[n++] = lv[i][0]; - buf[n++] = lv[i][1]; - buf[n++] = lv[i][2]; - } - if (tbiasflag == BIAS){ - buf[n++] = bias[i][0]; - buf[n++] = bias[i][1]; - buf[n++] = bias[i][2]; - } + buf[n++] = lv[i][0]; + buf[n++] = lv[i][1]; + buf[n++] = lv[i][2]; return n; } @@ -1199,18 +1087,8 @@ int FixLangevin::unpack_exchange(int nlocal, double *buf) franprev[nlocal][0] = buf[n++]; franprev[nlocal][1] = buf[n++]; franprev[nlocal][2] = buf[n++]; - wildcard[nlocal][0] = buf[n++]; - wildcard[nlocal][1] = buf[n++]; - wildcard[nlocal][2] = buf[n++]; - if (hsflag){ - lv[nlocal][0] = buf[n++]; - lv[nlocal][1] = buf[n++]; - lv[nlocal][2] = buf[n++]; - } - if (tbiasflag == BIAS){ - bias[nlocal][0] = buf[n++]; - bias[nlocal][1] = buf[n++]; - bias[nlocal][2] = buf[n++]; - } + lv[nlocal][0] = buf[n++]; + lv[nlocal][1] = buf[n++]; + lv[nlocal][2] = buf[n++]; return n; -} +} \ No newline at end of file diff --git a/src/fix_langevin.h b/src/fix_langevin.h index 939b161c35..8b8c1cd6c8 100644 --- a/src/fix_langevin.h +++ b/src/fix_langevin.h @@ -2,12 +2,10 @@ LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator http://lammps.sandia.gov, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov - Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. This software is distributed under the GNU General Public License. - See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ @@ -24,68 +22,64 @@ FixStyle(langevin,FixLangevin) namespace LAMMPS_NS { -class FixLangevin : public Fix { - public: - FixLangevin(class LAMMPS *, int, char **); - virtual ~FixLangevin(); - int setmask(); - void init(); - void setup(int); - //virtual void initial_integrate(int); - virtual void post_integrate(); - virtual void post_force(int); - void post_force_respa(int, int, int); - virtual void end_of_step(); - void reset_target(double); - void reset_dt(); - int modify_param(int, char **); - virtual double compute_scalar(); - double memory_usage(); - virtual void *extract(const char *, int &); - void grow_arrays(int); - void copy_arrays(int, int, int); - int pack_exchange(int, double *); - int unpack_exchange(int, double *); + class FixLangevin : public Fix { + public: + FixLangevin(class LAMMPS *, int, char **); + virtual ~FixLangevin(); + int setmask(); + void init(); + void setup(int); + void initial_integrate_respa(int, int, int); + virtual void initial_integrate(int); + virtual void post_force(int); + void post_force_respa(int, int, int); + virtual void end_of_step(); + void reset_target(double); + void reset_dt(); + int modify_param(int, char **); + virtual double compute_scalar(); + double memory_usage(); + virtual void *extract(const char *, int &); + void grow_arrays(int); + void copy_arrays(int, int, int); + int pack_exchange(int, double *); + int unpack_exchange(int, double *); - protected: - int gjfflag,oflag,tallyflag,zeroflag,tbiasflag,hsflag; - int flangevin_allocated; - double ascale; - double t_start,t_stop,t_period,t_target; - double *gfactor1,*gfactor2,*ratio; - double energy,energy_onestep; - double tsqrt; - int tstyle,tvar; - double gjffac; - char *tstr; + protected: + int gjfflag,oflag,tallyflag,zeroflag,tbiasflag; + int flangevin_allocated; + double ascale; + double t_start,t_stop,t_period,t_target; + double *gfactor1,*gfactor2,*ratio; + double energy,energy_onestep; + double tsqrt; + int tstyle,tvar; + double gjfa, gjfsib; //gjf a and gjf sqrt inverse b + char *tstr; - class AtomVecEllipsoid *avec; + class AtomVecEllipsoid *avec; - int maxatom1,maxatom2; - double **flangevin; - double *tforce; - double **franprev; - double **lv; //2GJ velocity or half-step velocity - double **wildcard; - double **bias; //Bias velocity + int maxatom1,maxatom2; + double **flangevin; + double *tforce; + double **franprev; + double **lv; //half step velocity - int nvalues; + char *id_temp; + class Compute *temperature; - char *id_temp; - class Compute *temperature; + int nlevels_respa; + class RanMars *random; + int seed; - int nlevels_respa; - class RanMars *random; - int seed; + template < int Tp_TSTYLEATOM, int Tp_GJF, int Tp_TALLY, + int Tp_BIAS, int Tp_RMASS, int Tp_ZERO > + void post_force_templated(); - template < int Tp_TSTYLEATOM, int Tp_GJF, int Tp_TALLY, - int Tp_BIAS, int Tp_RMASS, int Tp_ZERO > - void post_force_templated(); - - void omega_thermostat(); - void angmom_thermostat(); - void compute_target(); -}; + void omega_thermostat(); + void angmom_thermostat(); + void compute_target(); + }; } @@ -93,62 +87,35 @@ class FixLangevin : public Fix { #endif /* ERROR/WARNING messages: - E: Illegal ... command - Self-explanatory. Check the input script syntax and compare to the documentation for the command. You can use -echo screen as a command-line option when running LAMMPS to see the offending line. - E: Fix langevin period must be > 0.0 - The time window for temperature relaxation must be > 0 - E: Fix langevin omega requires atom style sphere - Self-explanatory. - E: Fix langevin angmom requires atom style ellipsoid - Self-explanatory. - E: Variable name for fix langevin does not exist - Self-explanatory. - E: Variable for fix langevin is invalid style - It must be an equal-style variable. - E: Fix langevin omega requires extended particles - One of the particles has radius 0.0. - E: Fix langevin angmom requires extended particles - This fix option cannot be used with point particles. - E: Cannot zero Langevin force of 0 atoms - The group has zero atoms, so you cannot request its force be zeroed. - E: Fix langevin variable returned negative temperature - Self-explanatory. - E: Could not find fix_modify temperature ID - The compute ID for computing temperature does not exist. - E: Fix_modify temperature ID does not compute temperature - The compute ID assigned to the fix must compute temperature. - W: Group for fix_modify temp != fix group - The fix_modify command is specifying a temperature computation that computes a temperature on a different group of atoms than the fix itself operates on. This is probably not what you want to do. - */ From 801c1656533e65234d97ef2d996c57afce76a80e Mon Sep 17 00:00:00 2001 From: charlie sievers Date: Wed, 21 Aug 2019 20:11:43 -0700 Subject: [PATCH 098/418] Added onsite GJF formalism --- src/fix_langevin.cpp | 49 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index b8144fc5f3..6971b145ec 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -90,6 +90,7 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : for (int i = 1; i <= atom->ntypes; i++) ratio[i] = 1.0; ascale = 0.0; gjfflag = 0; + fsflag = 0; oflag = 0; tallyflag = 0; zeroflag = 0; @@ -103,8 +104,11 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : iarg += 2; } else if (strcmp(arg[iarg],"gjf") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal fix langevin command"); - if (strcmp(arg[iarg+1],"no") == 0) gjfflag = 0; - else if (strcmp(arg[iarg+1],"yes") == 0) gjfflag = 1; + if (strcmp(arg[iarg+1],"no") == 0) {gjfflag = 0; fsflag = 0;} + else if (strcmp(arg[iarg+1],"yes") == 0) + error->all(FLERR,"Fix langevin gjf yes is outdated, please use vhalf or vfull"); + else if (strcmp(arg[iarg+1],"vhalf") == 0) {gjfflag = 1; fsflag = 0;} + else if (strcmp(arg[iarg+1],"vfull") == 0) {gjfflag = 1; fsflag = 1;} else error->all(FLERR,"Illegal fix langevin command"); iarg += 2; } else if (strcmp(arg[iarg],"omega") == 0) { @@ -431,7 +435,7 @@ void FixLangevin::post_force(int /*vflag*/) if (tstyle == ATOM) if (gjfflag) - if (tallyflag) + if (tallyflag || fsflag) if (tbiasflag == BIAS) if (rmass) if (zeroflag) post_force_templated<1,1,1,1,1,1>(); @@ -462,7 +466,7 @@ void FixLangevin::post_force(int /*vflag*/) if (zeroflag) post_force_templated<1,1,0,0,0,1>(); else post_force_templated<1,1,0,0,0,0>(); else - if (tallyflag) + if (tallyflag || fsflag) if (tbiasflag == BIAS) if (rmass) if (zeroflag) post_force_templated<1,0,1,1,1,1>(); @@ -494,7 +498,7 @@ void FixLangevin::post_force(int /*vflag*/) else post_force_templated<1,0,0,0,0,0>(); else if (gjfflag) - if (tallyflag) + if (tallyflag || fsflag) if (tbiasflag == BIAS) if (rmass) if (zeroflag) post_force_templated<0,1,1,1,1,1>(); @@ -525,7 +529,7 @@ void FixLangevin::post_force(int /*vflag*/) if (zeroflag) post_force_templated<0,1,0,0,0,1>(); else post_force_templated<0,1,0,0,0,0>(); else - if (tallyflag) + if (tallyflag || fsflag) if (tbiasflag == BIAS) if (rmass) if (zeroflag) post_force_templated<0,0,1,1,1,1>(); @@ -906,6 +910,13 @@ void FixLangevin::end_of_step() double **v = atom->v; int *mask = atom->mask; int nlocal = atom->nlocal; + double ftm2v = force->ftm2v; + double gamma1; double dtfm; + double dt = update->dt; + double *mass = atom->mass; + double *rmass = atom->rmass; + double **f = atom->f; + int *type = atom->type; energy_onestep = 0.0; @@ -916,9 +927,27 @@ void FixLangevin::end_of_step() tmp[0] = v[i][0]; tmp[1] = v[i][1]; tmp[2] = v[i][2]; - v[i][0] = lv[i][0]; - v[i][1] = lv[i][1]; - v[i][2] = lv[i][2]; + if (!fsflag){ + v[i][0] = lv[i][0]; + v[i][1] = lv[i][1]; + v[i][2] = lv[i][2]; + } + else{ + if (atom->rmass) { + dtfm = 0.5 * dt / rmass[i]; + gamma1 = -rmass[i] / t_period / ftm2v; + gamma1 *= 1.0/ratio[type[i]]; + } else { + dtfm = 0.5 * dt / mass[type[i]]; + gamma1 = gfactor1[type[i]]; + } + v[i][0] = flangevin[i][0] - franprev[i][0] + gjfa * (gjfsib/2 + gamma1/gjfsib) * lv[i][0] + + gjfsib*gjfsib*(dtfm * f[i][0] + v[i][0])/2; + v[i][1] = flangevin[i][1] - franprev[i][1] + gjfa * (gjfsib/2 + gamma1/gjfsib) * lv[i][1] + + gjfsib*gjfsib*(dtfm * f[i][1] + v[i][1])/2; + v[i][2] = flangevin[i][2] - franprev[i][2] + gjfa * (gjfsib/2 + gamma1/gjfsib) * lv[i][2] + + gjfsib*gjfsib*(dtfm * f[i][2] + v[i][2])/2; + } lv[i][0] = tmp[0]; lv[i][1] = tmp[1]; lv[i][2] = tmp[2]; @@ -1032,7 +1061,7 @@ double FixLangevin::memory_usage() { double bytes = 0.0; if (gjfflag) bytes += atom->nmax*6 * sizeof(double); - if (tallyflag) bytes += atom->nmax*3 * sizeof(double); + if (tallyflag || fsflag) bytes += atom->nmax*3 * sizeof(double); if (tforce) bytes += atom->nmax * sizeof(double); return bytes; } From ceeb7da5911c47c7b7eda617a172954bc04a1134 Mon Sep 17 00:00:00 2001 From: charlie sievers Date: Wed, 21 Aug 2019 20:47:17 -0700 Subject: [PATCH 099/418] Added onsite GJF formalism --- src/fix_langevin.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fix_langevin.h b/src/fix_langevin.h index 8b8c1cd6c8..5abfa53288 100644 --- a/src/fix_langevin.h +++ b/src/fix_langevin.h @@ -46,7 +46,7 @@ namespace LAMMPS_NS { int unpack_exchange(int, double *); protected: - int gjfflag,oflag,tallyflag,zeroflag,tbiasflag; + int gjfflag,fsflag,oflag,tallyflag,zeroflag,tbiasflag; int flangevin_allocated; double ascale; double t_start,t_stop,t_period,t_target; From f74c5fc9567c3452fcd0fbe6243fd8c6be461140 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 22 Aug 2019 09:38:55 -0400 Subject: [PATCH 100/418] add RanPark pRNG warmup also to fix evaporate and create_atoms --- src/MISC/fix_evaporate.cpp | 3 +++ src/create_atoms.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/MISC/fix_evaporate.cpp b/src/MISC/fix_evaporate.cpp index 1bf7a15f1f..6c08b201b7 100644 --- a/src/MISC/fix_evaporate.cpp +++ b/src/MISC/fix_evaporate.cpp @@ -58,8 +58,11 @@ FixEvaporate::FixEvaporate(LAMMPS *lmp, int narg, char **arg) : if (seed <= 0) error->all(FLERR,"Illegal fix evaporate command"); // random number generator, same for all procs + // warm up the generator 30x to avoid correlations in first-particle + // positions if runs are repeated with consecutive seeds random = new RanPark(lmp,seed); + for (int ii=0; ii < 30; ii++) random->uniform(); // optional args diff --git a/src/create_atoms.cpp b/src/create_atoms.cpp index 52e4256fca..65467ea657 100644 --- a/src/create_atoms.cpp +++ b/src/create_atoms.cpp @@ -611,8 +611,11 @@ void CreateAtoms::add_random() double *boxlo,*boxhi; // random number generator, same for all procs + // warm up the generator 30x to avoid correlations in first-particle + // positions if runs are repeated with consecutive seeds RanPark *random = new RanPark(lmp,seed); + for (int ii=0; ii < 30; ii++) random->uniform(); // bounding box for atom creation // in real units, even if triclinic From 8ec4e3fc9164fb21a2ceadf5211b3abe7987690f Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 22 Aug 2019 10:48:58 -0600 Subject: [PATCH 101/418] Commit JT 082219 - modified min spin names (removed oso from spin/cg and spin/lbfgs) - modified associated option name (from spin_oso_cg to spin/cg, same for lbfgs) - modified .gitignore, doc pages, and examples accordingly --- doc/src/min_modify.txt | 14 ++-- doc/src/min_spin.txt | 26 +++---- doc/src/min_style.txt | 10 +-- doc/src/minimize.txt | 2 +- doc/src/neb_spin.txt | 4 +- examples/SPIN/spinmin/in.spinmin_cg.bfo | 2 +- examples/SPIN/spinmin/in.spinmin_lbfgs.bfo | 2 +- src/.gitignore | 8 +-- .../{min_spin_oso_cg.cpp => min_spin_cg.cpp} | 58 +++++++-------- src/SPIN/{min_spin_oso_cg.h => min_spin_cg.h} | 12 ++-- ..._spin_oso_lbfgs.cpp => min_spin_lbfgs.cpp} | 70 +++++++++---------- ...{min_spin_oso_lbfgs.h => min_spin_lbfgs.h} | 12 ++-- 12 files changed, 110 insertions(+), 110 deletions(-) rename src/SPIN/{min_spin_oso_cg.cpp => min_spin_cg.cpp} (91%) rename src/SPIN/{min_spin_oso_cg.h => min_spin_cg.h} (90%) rename src/SPIN/{min_spin_oso_lbfgs.cpp => min_spin_lbfgs.cpp} (90%) rename src/SPIN/{min_spin_oso_lbfgs.h => min_spin_lbfgs.h} (90%) diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index 857c3551aa..22ee232467 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -72,7 +72,7 @@ that difference may be smaller than machine epsilon even if atoms could move in the gradient direction to reduce forces further. The choice of a norm can be modified for the min styles {cg}, {sd}, -{quickmin}, {fire}, {spin}, {spin_oso_cg} and {spin_oso_lbfgs} using +{quickmin}, {fire}, {spin}, {spin/cg} and {spin/lbfgs} using the {norm} keyword. The default {euclidean} norm computes the 2-norm (length) of the global force vector. The {max} norm computes the maximum value @@ -88,19 +88,19 @@ adaptive timestep used in the {spin} minimization. See "min_spin"_min_spin.html for more information about those quantities. -The choice of a line search algorithm for the {spin_oso_cg} and -{spin_oso_lbfgs} styles can be specified via the {line} keyword. +The choice of a line search algorithm for the {spin/cg} and +{spin/lbfgs} styles can be specified via the {line} keyword. The {spin_cubic} and {spin_none} only make sense when one of those two minimization styles is declared. The {spin_cubic} performs the line search based on a cubic interpolation of the energy along the search direction. The {spin_none} keyword deactivates the line search procedure. -The {spin_none} is a default value for {line} keyword for both {spin_oso_lbfgs} -and {spin_oso_cg}. Convergence of {spin_oso_lbfgs} can be more robust if +The {spin_none} is a default value for {line} keyword for both {spin/lbfgs} +and {spin/cg}. Convergence of {spin/lbfgs} can be more robust if {spin_cubic} line search is used. [Restrictions:] The line search procedure of styles -{spin_oso_cg} and {spin_oso_lbfgs} cannot be used for magnetic +{spin/cg} and {spin/lbfgs} cannot be used for magnetic GNEB calculations. See "neb/spin"_neb_spin.html for more explanation. @@ -112,6 +112,6 @@ explanation. The option defaults are dmax = 0.1, line = quadratic and norm = euclidean. -For the {spin}, {spin_oso_cg} and {spin_oso_lbfgs} styles, the +For the {spin}, {spin/cg} and {spin/lbfgs} styles, the option defaults are alpha_damp = 1.0, discrete_factor = 10.0, line = spin_none, and norm = euclidean. diff --git a/doc/src/min_spin.txt b/doc/src/min_spin.txt index 575db2dc74..ba034cfbb9 100644 --- a/doc/src/min_spin.txt +++ b/doc/src/min_spin.txt @@ -6,18 +6,18 @@ :line min_style spin command :h3 -min_style spin_oso_cg command :h3 -min_style spin_oso_lbfgs command :h3 +min_style spin/cg command :h3 +min_style spin/lbfgs command :h3 [Syntax:] min_style spin -min_style spin_oso_cg -min_style spin_oso_lbfgs :pre +min_style spin/cg +min_style spin/lbfgs :pre [Examples:] -min_style spin_oso_lbfgs +min_style spin/lbfgs min_modify line spin_cubic discrete_factor 10.0 :pre [Description:] @@ -51,35 +51,35 @@ definition of this timestep. {discrete_factor} can be defined with the "min_modify"_min_modify.html command. -Style {spin_oso_cg} defines an orthogonal spin optimization +Style {spin/cg} defines an orthogonal spin optimization (OSO) combined to a conjugate gradient (CG) algorithm. The "min_modify"_min_modify.html command can be used to -couple the {spin_oso_cg} to a line search procedure, and to modify the +couple the {spin/cg} to a line search procedure, and to modify the discretization factor {discrete_factor}. -By default, style {spin_oso_cg} does not employ the line search procedure +By default, style {spin/cg} does not employ the line search procedure and uses the adaptive time-step technique in the same way as style {spin}. -Style {spin_oso_lbfgs} defines an orthogonal spin optimization +Style {spin/lbfgs} defines an orthogonal spin optimization (OSO) combined to a limited-memory Broyden-Fletcher-Goldfarb-Shanno (L-BFGS) algorithm. -By default, style {spin_oso_lbfgs} does not employ line search procedure. +By default, style {spin/lbfgs} does not employ line search procedure. If the line search procedure is not used then the discrete factor defines the maximum root mean squared rotation angle of spins by equation {pi/(5*Kappa)}. The default value for Kappa is 10. The {spin_cubic} line search can improve the convergence of the -{spin_oso_lbfgs} algorithm. +{spin/lbfgs} algorithm. The "min_modify"_min_modify.html command can be used to activate the line search procedure, and to modify the discretization factor {discrete_factor}. -For more information about styles {spin_oso_cg} and {spin_oso_lbfgs}, +For more information about styles {spin/cg} and {spin/lbfgs}, see their implementation reported in "(Ivanov)"_#Ivanov1. NOTE: All the {spin} styles replace the force tolerance by a torque tolerance. See "minimize"_minimize.html for more explanation. -NOTE: The {spin_oso_cg} and {spin_oso_lbfgs} styles can be used +NOTE: The {spin/cg} and {spin/lbfgs} styles can be used for magnetic NEB calculations only if the line search procedure is deactivated. See "neb/spin"_neb_spin.html for more explanation. diff --git a/doc/src/min_style.txt b/doc/src/min_style.txt index 7c40fd4947..9613da7b13 100644 --- a/doc/src/min_style.txt +++ b/doc/src/min_style.txt @@ -11,7 +11,7 @@ min_style command :h3 min_style style :pre -style = {cg} or {hftn} or {sd} or {quickmin} or {fire} or {spin} or {spin_oso_cg} or {spin_oso_lbfgs} :ul +style = {cg} or {hftn} or {sd} or {quickmin} or {fire} or {spin} or {spin/cg} or {spin/lbfgs} :ul [Examples:] @@ -65,21 +65,21 @@ a minimization. Style {spin} is a damped spin dynamics with an adaptive timestep. -Style {spin_oso_cg} uses an orthogonal spin optimization (OSO) +Style {spin/cg} uses an orthogonal spin optimization (OSO) combined to a conjugate gradient (CG) approach to minimize spin configurations. -Style {spin_oso_lbfgs} uses an orthogonal spin optimization (OSO) +Style {spin/lbfgs} uses an orthogonal spin optimization (OSO) combined to a limited-memory Broyden-Fletcher-Goldfarb-Shanno (LBFGS) approach to minimize spin configurations. See the "min/spin"_min_spin.html doc page for more information -about the {spin}, {spin_oso_cg} and {spin_oso_lbfgs} styles. +about the {spin}, {spin/cg} and {spin/lbfgs} styles. Either the {quickmin} and {fire} styles are useful in the context of nudged elastic band (NEB) calculations via the "neb"_neb.html command. -Either the {spin}, {spin_oso_cg} and {spin_oso_lbfgs} styles are useful +Either the {spin}, {spin/cg} and {spin/lbfgs} styles are useful in the context of magnetic geodesic nudged elastic band (GNEB) calculations via the "neb/spin"_neb_spin.html command. diff --git a/doc/src/minimize.txt b/doc/src/minimize.txt index 1de925d6c8..bfdc02bedf 100644 --- a/doc/src/minimize.txt +++ b/doc/src/minimize.txt @@ -104,7 +104,7 @@ the number of outer iterations or timesteps exceeds {maxiter} the number of total force evaluations exceeds {maxeval} :ul NOTE: the "minimization style"_min_style.html {spin}, -{spin_oso_cg}, and {spin_oso_lbfgs} replace +{spin/cg}, and {spin/lbfgs} replace the force tolerance {ftol} by a torque tolerance. The minimization procedure stops if the 2-norm (length) of the torque vector on atom (defined as the cross product between the diff --git a/doc/src/neb_spin.txt b/doc/src/neb_spin.txt index 2fdfda8c66..b64df39219 100644 --- a/doc/src/neb_spin.txt +++ b/doc/src/neb_spin.txt @@ -173,7 +173,7 @@ A NEB calculation proceeds in two stages, each of which is a minimization procedure. To enable this, you must first define a "min_style"_min_style.html, using either the {spin}, -{spin_oso_cg}, or {spin_oso_lbfgs} style (see +{spin/cg}, or {spin/lbfgs} style (see "min_spin"_min_spin.html for more information). The other styles cannot be used, since they relax the lattice degrees of freedom instead of the spins. @@ -359,7 +359,7 @@ This command can only be used if LAMMPS was built with the SPIN package. See the "Build package"_Build_package.html doc page for more info. -The line search procedures of the {spin_oso_cg} and {spin_oso_lbfgs} +The line search procedures of the {spin/cg} and {spin/lbfgs} minimization styles cannot be used in a GNEB calculation. :line diff --git a/examples/SPIN/spinmin/in.spinmin_cg.bfo b/examples/SPIN/spinmin/in.spinmin_cg.bfo index 8c288763c4..9d57399a56 100644 --- a/examples/SPIN/spinmin/in.spinmin_cg.bfo +++ b/examples/SPIN/spinmin/in.spinmin_cg.bfo @@ -49,6 +49,6 @@ thermo_modify format float %20.15g compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] -min_style spin_oso_cg +min_style spin/cg # min_modify line spin_none discrete_factor 10.0 minimize 1.0e-10 1.0e-10 10000 10000 diff --git a/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo b/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo index 6a9104cc9c..a73b863b11 100644 --- a/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo +++ b/examples/SPIN/spinmin/in.spinmin_lbfgs.bfo @@ -49,6 +49,6 @@ thermo_modify format float %20.15g compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 1 all custom 50 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[4] c_outsp[5] c_outsp[6] c_outsp[7] -min_style spin_oso_lbfgs +min_style spin/lbfgs # min_modify line spin_cubic discrete_factor 10.0 minimize 1.0e-15 1.0e-10 10000 1000 diff --git a/src/.gitignore b/src/.gitignore index 595276853c..5848874d94 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -161,10 +161,10 @@ /fix_setforce_spin.h /min_spin.cpp /min_spin.h -/min_spin_oso_cg.cpp -/min_spin_oso_cg.h -/min_spin_oso_lbfgs.cpp -/min_spin_oso_lbfgs.h +/min_spin_cg.cpp +/min_spin_cg.h +/min_spin_lbfgs.cpp +/min_spin_lbfgs.h /neb_spin.cpp /neb_spin.h /pair_spin.cpp diff --git a/src/SPIN/min_spin_oso_cg.cpp b/src/SPIN/min_spin_cg.cpp similarity index 91% rename from src/SPIN/min_spin_oso_cg.cpp rename to src/SPIN/min_spin_cg.cpp index f1f2f72436..322915c0f3 100644 --- a/src/SPIN/min_spin_oso_cg.cpp +++ b/src/SPIN/min_spin_cg.cpp @@ -25,7 +25,7 @@ #include #include #include -#include "min_spin_oso_cg.h" +#include "min_spin_cg.h" #include "universe.h" #include "atom.h" #include "citeme.h" @@ -44,8 +44,8 @@ using namespace LAMMPS_NS; using namespace MathConst; -static const char cite_minstyle_spin_oso_cg[] = - "min_style spin/oso_cg command:\n\n" +static const char cite_minstyle_spin_cg[] = + "min_style spin/cg command:\n\n" "@article{ivanov2019fast,\n" "title={Fast and Robust Algorithm for the Minimisation of the Energy of " "Spin Systems},\n" @@ -63,10 +63,10 @@ static const char cite_minstyle_spin_oso_cg[] = /* ---------------------------------------------------------------------- */ -MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : +MinSpinCG::MinSpinCG(LAMMPS *lmp) : Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), sp_copy(NULL) { - if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_cg); + if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_cg); nlocal_max = 0; // nreplica = number of partitions @@ -81,7 +81,7 @@ MinSpinOSO_CG::MinSpinOSO_CG(LAMMPS *lmp) : /* ---------------------------------------------------------------------- */ -MinSpinOSO_CG::~MinSpinOSO_CG() +MinSpinCG::~MinSpinCG() { memory->destroy(g_old); memory->destroy(g_cur); @@ -92,7 +92,7 @@ MinSpinOSO_CG::~MinSpinOSO_CG() /* ---------------------------------------------------------------------- */ -void MinSpinOSO_CG::init() +void MinSpinCG::init() { local_iter = 0; der_e_cur = 0.0; @@ -120,16 +120,16 @@ void MinSpinOSO_CG::init() // allocate tables nlocal_max = atom->nlocal; - memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg:g_old"); - memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg:g_cur"); - memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg:p_s"); + memory->grow(g_old,3*nlocal_max,"min/spin/cg:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/cg:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/cg:p_s"); if (use_line_search) - memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/cg:sp_copy"); + memory->grow(sp_copy,nlocal_max,3,"min/spin/cg:sp_copy"); } /* ---------------------------------------------------------------------- */ -void MinSpinOSO_CG::setup_style() +void MinSpinCG::setup_style() { double **v = atom->v; int nlocal = atom->nlocal; @@ -137,7 +137,7 @@ void MinSpinOSO_CG::setup_style() // check if the atom/spin style is defined if (!atom->sp_flag) - error->all(FLERR,"min/spin_oso_cg requires atom/spin style"); + error->all(FLERR,"min spin/cg requires atom/spin style"); for (int i = 0; i < nlocal; i++) v[i][0] = v[i][1] = v[i][2] = 0.0; @@ -145,7 +145,7 @@ void MinSpinOSO_CG::setup_style() /* ---------------------------------------------------------------------- */ -int MinSpinOSO_CG::modify_param(int narg, char **arg) +int MinSpinCG::modify_param(int narg, char **arg) { if (strcmp(arg[0],"discrete_factor") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); @@ -160,7 +160,7 @@ int MinSpinOSO_CG::modify_param(int narg, char **arg) called after atoms have migrated ------------------------------------------------------------------------- */ -void MinSpinOSO_CG::reset_vectors() +void MinSpinCG::reset_vectors() { // atomic dof @@ -179,7 +179,7 @@ void MinSpinOSO_CG::reset_vectors() minimization via orthogonal spin optimisation ------------------------------------------------------------------------- */ -int MinSpinOSO_CG::iterate(int maxiter) +int MinSpinCG::iterate(int maxiter) { int nlocal = atom->nlocal; bigint ntimestep; @@ -191,11 +191,11 @@ int MinSpinOSO_CG::iterate(int maxiter) if (nlocal_max < nlocal) { local_iter = 0; nlocal_max = nlocal; - memory->grow(g_old,3*nlocal_max,"min/spin/oso/cg:g_old"); - memory->grow(g_cur,3*nlocal_max,"min/spin/oso/cg:g_cur"); - memory->grow(p_s,3*nlocal_max,"min/spin/oso/cg:p_s"); + memory->grow(g_old,3*nlocal_max,"min/spin/cg:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/cg:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/cg:p_s"); if (use_line_search) - memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/cg:sp_copy"); + memory->grow(sp_copy,nlocal_max,3,"min/spin/cg:sp_copy"); } for (int iter = 0; iter < maxiter; iter++) { @@ -309,7 +309,7 @@ int MinSpinOSO_CG::iterate(int maxiter) calculate gradients ---------------------------------------------------------------------- */ -void MinSpinOSO_CG::calc_gradient() +void MinSpinCG::calc_gradient() { int nlocal = atom->nlocal; double **sp = atom->sp; @@ -337,7 +337,7 @@ void MinSpinOSO_CG::calc_gradient() Optimization' Second Edition, 2006 (p. 121) ---------------------------------------------------------------------- */ -void MinSpinOSO_CG::calc_search_direction() +void MinSpinCG::calc_search_direction() { int nlocal = atom->nlocal; double g2old = 0.0; @@ -398,7 +398,7 @@ void MinSpinOSO_CG::calc_search_direction() rotation of spins along the search direction ---------------------------------------------------------------------- */ -void MinSpinOSO_CG::advance_spins() +void MinSpinCG::advance_spins() { int nlocal = atom->nlocal; double **sp = atom->sp; @@ -429,7 +429,7 @@ void MinSpinOSO_CG::advance_spins() [-y, -z, 0]] ------------------------------------------------------------------------- */ -void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) +void MinSpinCG::rodrigues_rotation(const double *upp_tr, double *out) { double theta,A,B,D,x,y,z; double s1,s2,s3,a1,a2,a3; @@ -490,7 +490,7 @@ void MinSpinOSO_CG::rodrigues_rotation(const double *upp_tr, double *out) m -- 3x3 matrix , v -- 3-d vector ------------------------------------------------------------------------- */ -void MinSpinOSO_CG::vm3(const double *m, const double *v, double *out) +void MinSpinCG::vm3(const double *m, const double *v, double *out) { for(int i = 0; i < 3; i++){ out[i] = 0.0; @@ -502,7 +502,7 @@ void MinSpinOSO_CG::vm3(const double *m, const double *v, double *out) advance spins ------------------------------------------------------------------------- */ -void MinSpinOSO_CG::make_step(double c, double *energy_and_der) +void MinSpinCG::make_step(double c, double *energy_and_der) { double p_scaled[3]; int nlocal = atom->nlocal; @@ -549,7 +549,7 @@ void MinSpinOSO_CG::make_step(double c, double *energy_and_der) using the cubic interpolation ------------------------------------------------------------------------- */ -int MinSpinOSO_CG::calc_and_make_step(double a, double b, int index) +int MinSpinCG::calc_and_make_step(double a, double b, int index) { double e_and_d[2] = {0.0,0.0}; double alpha,c1,c2,c3; @@ -601,7 +601,7 @@ int MinSpinOSO_CG::calc_and_make_step(double a, double b, int index) Approximate descent ------------------------------------------------------------------------- */ -int MinSpinOSO_CG::adescent(double phi_0, double phi_j){ +int MinSpinCG::adescent(double phi_0, double phi_j){ double eps = 1.0e-6; @@ -615,7 +615,7 @@ int MinSpinOSO_CG::adescent(double phi_0, double phi_j){ evaluate max timestep ---------------------------------------------------------------------- */ -double MinSpinOSO_CG::evaluate_dt() +double MinSpinCG::evaluate_dt() { double dtmax; double fmsq; diff --git a/src/SPIN/min_spin_oso_cg.h b/src/SPIN/min_spin_cg.h similarity index 90% rename from src/SPIN/min_spin_oso_cg.h rename to src/SPIN/min_spin_cg.h index d6dc7c03d0..0eed7a61e6 100644 --- a/src/SPIN/min_spin_oso_cg.h +++ b/src/SPIN/min_spin_cg.h @@ -13,21 +13,21 @@ #ifdef MINIMIZE_CLASS -MinimizeStyle(spin_oso_cg, MinSpinOSO_CG) +MinimizeStyle(spin/cg, MinSpinCG) #else -#ifndef LMP_MIN_SPIN_OSO_CG_H -#define LMP_MIN_SPIN_OSO_CG_H +#ifndef LMP_MIN_SPIN_CG_H +#define LMP_MIN_SPIN_CG_H #include "min.h" namespace LAMMPS_NS { -class MinSpinOSO_CG: public Min { +class MinSpinCG: public Min { public: - MinSpinOSO_CG(class LAMMPS *); - virtual ~MinSpinOSO_CG(); + MinSpinCG(class LAMMPS *); + virtual ~MinSpinCG(); void init(); void setup_style(); void reset_vectors(); diff --git a/src/SPIN/min_spin_oso_lbfgs.cpp b/src/SPIN/min_spin_lbfgs.cpp similarity index 90% rename from src/SPIN/min_spin_oso_lbfgs.cpp rename to src/SPIN/min_spin_lbfgs.cpp index 8623a8bb29..891dec5c93 100644 --- a/src/SPIN/min_spin_oso_lbfgs.cpp +++ b/src/SPIN/min_spin_lbfgs.cpp @@ -25,7 +25,7 @@ #include #include #include -#include "min_spin_oso_lbfgs.h" +#include "min_spin_lbfgs.h" #include "atom.h" #include "citeme.h" #include "comm.h" @@ -43,8 +43,8 @@ using namespace LAMMPS_NS; using namespace MathConst; -static const char cite_minstyle_spin_oso_lbfgs[] = - "min_style spin/oso_lbfgs command:\n\n" +static const char cite_minstyle_spin_lbfgs[] = + "min_style spin/lbfgs command:\n\n" "@article{ivanov2019fast,\n" "title={Fast and Robust Algorithm for the Minimisation of the Energy of " "Spin Systems},\n" @@ -62,10 +62,10 @@ static const char cite_minstyle_spin_oso_lbfgs[] = /* ---------------------------------------------------------------------- */ -MinSpinOSO_LBFGS::MinSpinOSO_LBFGS(LAMMPS *lmp) : +MinSpinLBFGS::MinSpinLBFGS(LAMMPS *lmp) : Min(lmp), g_old(NULL), g_cur(NULL), p_s(NULL), rho(NULL), ds(NULL), dy(NULL), sp_copy(NULL) { - if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_oso_lbfgs); + if (lmp->citeme) lmp->citeme->add(cite_minstyle_spin_lbfgs); nlocal_max = 0; // nreplica = number of partitions @@ -81,7 +81,7 @@ MinSpinOSO_LBFGS::MinSpinOSO_LBFGS(LAMMPS *lmp) : /* ---------------------------------------------------------------------- */ -MinSpinOSO_LBFGS::~MinSpinOSO_LBFGS() +MinSpinLBFGS::~MinSpinLBFGS() { memory->destroy(g_old); memory->destroy(g_cur); @@ -95,7 +95,7 @@ MinSpinOSO_LBFGS::~MinSpinOSO_LBFGS() /* ---------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS::init() +void MinSpinLBFGS::init() { num_mem = 3; local_iter = 0; @@ -123,20 +123,20 @@ void MinSpinOSO_LBFGS::init() // allocate tables nlocal_max = atom->nlocal; - memory->grow(g_old,3*nlocal_max,"min/spin/oso/lbfgs:g_old"); - memory->grow(g_cur,3*nlocal_max,"min/spin/oso/lbfgs:g_cur"); - memory->grow(p_s,3*nlocal_max,"min/spin/oso/lbfgs:p_s"); - memory->grow(rho,num_mem,"min/spin/oso/lbfgs:rho"); - memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:ds"); - memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:dy"); + memory->grow(g_old,3*nlocal_max,"min/spin/lbfgs:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/lbfgs:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/lbfgs:p_s"); + memory->grow(rho,num_mem,"min/spin/lbfgs:rho"); + memory->grow(ds,num_mem,3*nlocal_max,"min/spin/lbfgs:ds"); + memory->grow(dy,num_mem,3*nlocal_max,"min/spin/lbfgs:dy"); if (use_line_search) - memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs:sp_copy"); + memory->grow(sp_copy,nlocal_max,3,"min/spin/lbfgs:sp_copy"); } /* ---------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS::setup_style() +void MinSpinLBFGS::setup_style() { double **v = atom->v; int nlocal = atom->nlocal; @@ -144,7 +144,7 @@ void MinSpinOSO_LBFGS::setup_style() // check if the atom/spin style is defined if (!atom->sp_flag) - error->all(FLERR,"min/spin_oso_lbfgs requires atom/spin style"); + error->all(FLERR,"min spin/lbfgs requires atom/spin style"); for (int i = 0; i < nlocal; i++) v[i][0] = v[i][1] = v[i][2] = 0.0; @@ -152,7 +152,7 @@ void MinSpinOSO_LBFGS::setup_style() /* ---------------------------------------------------------------------- */ -int MinSpinOSO_LBFGS::modify_param(int narg, char **arg) +int MinSpinLBFGS::modify_param(int narg, char **arg) { if (strcmp(arg[0],"discrete_factor") == 0) { if (narg < 2) error->all(FLERR,"Illegal min_modify command"); @@ -169,7 +169,7 @@ int MinSpinOSO_LBFGS::modify_param(int narg, char **arg) called after atoms have migrated ------------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS::reset_vectors() +void MinSpinLBFGS::reset_vectors() { // atomic dof @@ -188,7 +188,7 @@ void MinSpinOSO_LBFGS::reset_vectors() minimization via damped spin dynamics ------------------------------------------------------------------------- */ -int MinSpinOSO_LBFGS::iterate(int maxiter) +int MinSpinLBFGS::iterate(int maxiter) { int nlocal = atom->nlocal; bigint ntimestep; @@ -200,14 +200,14 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) if (nlocal_max < nlocal) { nlocal_max = nlocal; local_iter = 0; - memory->grow(g_old,3*nlocal_max,"min/spin/oso/lbfgs:g_old"); - memory->grow(g_cur,3*nlocal_max,"min/spin/oso/lbfgs:g_cur"); - memory->grow(p_s,3*nlocal_max,"min/spin/oso/lbfgs:p_s"); - memory->grow(rho,num_mem,"min/spin/oso/lbfgs:rho"); - memory->grow(ds,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:ds"); - memory->grow(dy,num_mem,3*nlocal_max,"min/spin/oso/lbfgs:dy"); + memory->grow(g_old,3*nlocal_max,"min/spin/lbfgs:g_old"); + memory->grow(g_cur,3*nlocal_max,"min/spin/lbfgs:g_cur"); + memory->grow(p_s,3*nlocal_max,"min/spin/lbfgs:p_s"); + memory->grow(rho,num_mem,"min/spin/lbfgs:rho"); + memory->grow(ds,num_mem,3*nlocal_max,"min/spin/lbfgs:ds"); + memory->grow(dy,num_mem,3*nlocal_max,"min/spin/lbfgs:dy"); if (use_line_search) - memory->grow(sp_copy,nlocal_max,3,"min/spin/oso/lbfgs:sp_copy"); + memory->grow(sp_copy,nlocal_max,3,"min/spin/lbfgs:sp_copy"); } for (int iter = 0; iter < maxiter; iter++) { @@ -324,7 +324,7 @@ int MinSpinOSO_LBFGS::iterate(int maxiter) calculate gradients ---------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS::calc_gradient() +void MinSpinLBFGS::calc_gradient() { int nlocal = atom->nlocal; double **sp = atom->sp; @@ -347,7 +347,7 @@ void MinSpinOSO_LBFGS::calc_gradient() Optimization' Second Edition, 2006 (p. 177) ---------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS::calc_search_direction() +void MinSpinLBFGS::calc_search_direction() { int nlocal = atom->nlocal; @@ -531,7 +531,7 @@ void MinSpinOSO_LBFGS::calc_search_direction() rotation of spins along the search direction ---------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS::advance_spins() +void MinSpinLBFGS::advance_spins() { int nlocal = atom->nlocal; double **sp = atom->sp; @@ -562,7 +562,7 @@ void MinSpinOSO_LBFGS::advance_spins() [-y, -z, 0]] ------------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS::rodrigues_rotation(const double *upp_tr, double *out) +void MinSpinLBFGS::rodrigues_rotation(const double *upp_tr, double *out) { double theta,A,B,D,x,y,z; double s1,s2,s3,a1,a2,a3; @@ -622,7 +622,7 @@ void MinSpinOSO_LBFGS::rodrigues_rotation(const double *upp_tr, double *out) m -- 3x3 matrix , v -- 3-d vector ------------------------------------------------------------------------- */ -void MinSpinOSO_LBFGS::vm3(const double *m, const double *v, double *out) +void MinSpinLBFGS::vm3(const double *m, const double *v, double *out) { for(int i = 0; i < 3; i++){ out[i] = 0.0; @@ -632,7 +632,7 @@ void MinSpinOSO_LBFGS::vm3(const double *m, const double *v, double *out) } -void MinSpinOSO_LBFGS::make_step(double c, double *energy_and_der) +void MinSpinLBFGS::make_step(double c, double *energy_and_der) { double p_scaled[3]; int nlocal = atom->nlocal; @@ -679,7 +679,7 @@ void MinSpinOSO_LBFGS::make_step(double c, double *energy_and_der) using the cubic interpolation ------------------------------------------------------------------------- */ -int MinSpinOSO_LBFGS::calc_and_make_step(double a, double b, int index) +int MinSpinLBFGS::calc_and_make_step(double a, double b, int index) { double e_and_d[2] = {0.0,0.0}; double alpha,c1,c2,c3; @@ -731,7 +731,7 @@ int MinSpinOSO_LBFGS::calc_and_make_step(double a, double b, int index) Approximate descent ------------------------------------------------------------------------- */ -int MinSpinOSO_LBFGS::adescent(double phi_0, double phi_j){ +int MinSpinLBFGS::adescent(double phi_0, double phi_j){ double eps = 1.0e-6; @@ -741,7 +741,7 @@ int MinSpinOSO_LBFGS::adescent(double phi_0, double phi_j){ return 0; } -double MinSpinOSO_LBFGS::maximum_rotation(double *p) +double MinSpinLBFGS::maximum_rotation(double *p) { double norm2,norm2_global,scaling,alpha; int nlocal = atom->nlocal; diff --git a/src/SPIN/min_spin_oso_lbfgs.h b/src/SPIN/min_spin_lbfgs.h similarity index 90% rename from src/SPIN/min_spin_oso_lbfgs.h rename to src/SPIN/min_spin_lbfgs.h index 68fa10921e..cead605b32 100644 --- a/src/SPIN/min_spin_oso_lbfgs.h +++ b/src/SPIN/min_spin_lbfgs.h @@ -13,21 +13,21 @@ #ifdef MINIMIZE_CLASS -MinimizeStyle(spin_oso_lbfgs, MinSpinOSO_LBFGS) +MinimizeStyle(spin/lbfgs, MinSpinLBFGS) #else -#ifndef LMP_MIN_SPIN_OSO_LBFGS_H -#define LMP_MIN_SPIN_OSO_LBFGS_H +#ifndef LMP_MIN_SPIN_LBFGS_H +#define LMP_MIN_SPIN_LBFGS_H #include "min.h" namespace LAMMPS_NS { -class MinSpinOSO_LBFGS: public Min { +class MinSpinLBFGS: public Min { public: - MinSpinOSO_LBFGS(class LAMMPS *); - virtual ~MinSpinOSO_LBFGS(); + MinSpinLBFGS(class LAMMPS *); + virtual ~MinSpinLBFGS(); void init(); void setup_style(); int modify_param(int, char **); From 574e4067dcff1ed0a3e53e12b22188daf685dfe6 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Thu, 22 Aug 2019 11:24:26 -0600 Subject: [PATCH 102/418] Add documentation files in RST format This is the first step for moving the documentation format from *.txt to the *.rst format. In the last years we've been automatically converting txt files from Steve's markup into RST to generate the documentation pages via Sphinx. The decision has now been made to fully migrate to RST and avoid the conversion in the future. This will enable us to fully use RST and Sphinx to improve the documentation. For the intermediate period, while there are still pending PRs with documentation changes, we will keep both source files and update the RST files accordingly. --- doc/.gitignore | 2 + doc/Makefile | 16 +- doc/rst/.gitignore | 2 + doc/rst/Build.rst | 28 + doc/rst/Build_basics.rst | 437 + doc/rst/Build_cmake.rst | 245 + doc/rst/Build_development.rst | 120 + doc/rst/Build_extras.rst | 1369 +++ doc/rst/Build_link.rst | 91 + doc/rst/Build_make.rst | 94 + doc/rst/Build_package.rst | 265 + doc/rst/Build_settings.rst | 437 + doc/rst/Build_windows.rst | 111 + doc/rst/Commands.rst | 34 + doc/rst/Commands_all.rst | 59 + doc/rst/Commands_bond.rst | 112 + doc/rst/Commands_category.rst | 137 + doc/rst/Commands_compute.rst | 68 + doc/rst/Commands_fix.rst | 94 + doc/rst/Commands_input.rst | 62 + doc/rst/Commands_kspace.rst | 28 + doc/rst/Commands_pair.rst | 136 + doc/rst/Commands_parse.rst | 149 + doc/rst/Commands_removed.rst | 67 + doc/rst/Commands_structure.rst | 91 + doc/rst/Errors.rst | 22 + doc/rst/Errors_bugs.rst | 32 + doc/rst/Errors_common.rst | 128 + doc/rst/Errors_messages.rst | 8396 +++++++++++++++++ doc/rst/Errors_warnings.rst | 752 ++ doc/rst/Examples.rst | 233 + doc/rst/Howto.rst | 106 + doc/rst/Howto_2d.rst | 48 + doc/rst/Howto_barostat.rst | 68 + doc/rst/Howto_bash.rst | 291 + doc/rst/Howto_bioFF.rst | 151 + doc/rst/Howto_body.rst | 519 + doc/rst/Howto_chunk.rst | 209 + doc/rst/Howto_client_server.rst | 135 + doc/rst/Howto_coreshell.rst | 271 + doc/rst/Howto_couple.rst | 125 + doc/rst/Howto_diffusion.rst | 32 + doc/rst/Howto_dispersion.rst | 105 + doc/rst/Howto_drude.rst | 72 + doc/rst/Howto_drude2.rst | 542 ++ doc/rst/Howto_elastic.rst | 49 + doc/rst/Howto_github.rst | 499 + doc/rst/Howto_granular.rst | 55 + doc/rst/Howto_kappa.rst | 86 + doc/rst/Howto_library.rst | 227 + doc/rst/Howto_manifold.rst | 57 + doc/rst/Howto_multiple.rst | 103 + doc/rst/Howto_nemd.rst | 60 + doc/rst/Howto_output.rst | 349 + doc/rst/Howto_polarizable.rst | 78 + doc/rst/Howto_pylammps.rst | 585 ++ doc/rst/Howto_replica.rst | 60 + doc/rst/Howto_restart.rst | 105 + doc/rst/Howto_spc.rst | 57 + doc/rst/Howto_spherical.rst | 243 + doc/rst/Howto_spins.rst | 73 + doc/rst/Howto_temperature.rst | 38 + doc/rst/Howto_thermostat.rst | 99 + doc/rst/Howto_tip3p.rst | 81 + doc/rst/Howto_tip4p.rst | 116 + doc/rst/Howto_triclinic.rst | 228 + doc/rst/Howto_viscosity.rst | 148 + doc/rst/Howto_viz.rst | 43 + doc/rst/Howto_walls.rst | 76 + doc/rst/Install.rst | 57 + doc/rst/Install_git.rst | 128 + doc/rst/Install_linux.rst | 269 + doc/rst/Install_mac.rst | 54 + doc/rst/Install_patch.rst | 68 + doc/rst/Install_svn.rst | 102 + doc/rst/Install_tarball.rst | 84 + doc/rst/Install_windows.rst | 49 + doc/rst/Intro.rst | 21 + doc/rst/Intro_authors.rst | 69 + doc/rst/Intro_features.rst | 231 + doc/rst/Intro_nonfeatures.rst | 87 + doc/rst/Intro_opensource.rst | 49 + doc/rst/Intro_overview.rst | 54 + doc/rst/Intro_website.rst | 39 + doc/rst/Manual.rst | 92 + doc/rst/Manual_build.rst | 165 + doc/rst/Manual_version.rst | 28 + doc/rst/Modify.rst | 40 + doc/rst/Modify_atom.rst | 124 + doc/rst/Modify_body.rst | 40 + doc/rst/Modify_bond.rst | 41 + doc/rst/Modify_command.rst | 25 + doc/rst/Modify_compute.rst | 62 + doc/rst/Modify_contribute.rst | 203 + doc/rst/Modify_dump.rst | 37 + doc/rst/Modify_fix.rst | 158 + doc/rst/Modify_kspace.rst | 26 + doc/rst/Modify_min.rst | 24 + doc/rst/Modify_overview.rst | 107 + doc/rst/Modify_pair.rst | 40 + doc/rst/Modify_region.rst | 27 + doc/rst/Modify_thermo.rst | 32 + doc/rst/Modify_variable.rst | 45 + doc/rst/Packages.rst | 25 + doc/rst/Packages_details.rst | 2446 +++++ doc/rst/Packages_standard.rst | 96 + doc/rst/Packages_user.rst | 126 + doc/rst/Python_call.rst | 84 + doc/rst/Python_examples.rst | 116 + doc/rst/Python_head.rst | 49 + doc/rst/Python_install.rst | 70 + doc/rst/Python_library.rst | 271 + doc/rst/Python_mpi.rst | 79 + doc/rst/Python_overview.rst | 30 + doc/rst/Python_pylammps.rst | 10 + doc/rst/Python_run.rst | 37 + doc/rst/Python_shlib.rst | 86 + doc/rst/Python_test.rst | 170 + doc/rst/Run_basics.rst | 96 + doc/rst/Run_head.rst | 21 + doc/rst/Run_options.rst | 645 ++ doc/rst/Run_output.rst | 197 + doc/rst/Run_windows.rst | 81 + doc/rst/Speed.rst | 35 + doc/rst/Speed_bench.rst | 82 + doc/rst/Speed_compare.rst | 101 + doc/rst/Speed_gpu.rst | 185 + doc/rst/Speed_intel.rst | 553 ++ doc/rst/Speed_kokkos.rst | 451 + doc/rst/Speed_measure.rst | 51 + doc/rst/Speed_omp.rst | 167 + doc/rst/Speed_opt.rst | 58 + doc/rst/Speed_packages.rst | 195 + doc/rst/Speed_tips.rst | 61 + doc/rst/Tools.rst | 712 ++ doc/rst/angle_charmm.rst | 115 + doc/rst/angle_class2.rst | 167 + doc/rst/angle_coeff.rst | 109 + doc/rst/angle_cosine.rst | 90 + doc/rst/angle_cosine_buck6d.rst | 80 + doc/rst/angle_cosine_delta.rst | 92 + doc/rst/angle_cosine_periodic.rst | 111 + doc/rst/angle_cosine_shift.rst | 90 + doc/rst/angle_cosine_shift_exp.rst | 104 + doc/rst/angle_cosine_squared.rst | 92 + doc/rst/angle_cross.rst | 75 + doc/rst/angle_dipole.rst | 154 + doc/rst/angle_fourier.rst | 85 + doc/rst/angle_fourier_simple.rst | 84 + doc/rst/angle_harmonic.rst | 98 + doc/rst/angle_hybrid.rst | 110 + doc/rst/angle_mm3.rst | 69 + doc/rst/angle_none.rst | 46 + doc/rst/angle_quartic.rst | 94 + doc/rst/angle_sdk.rst | 100 + doc/rst/angle_style.rst | 131 + doc/rst/angle_table.rst | 186 + doc/rst/angle_zero.rst | 61 + doc/rst/angles.rst | 29 + doc/rst/atom_modify.rst | 195 + doc/rst/atom_style.rst | 378 + doc/rst/balance.rst | 574 ++ doc/rst/bond_class2.rst | 105 + doc/rst/bond_coeff.rst | 104 + doc/rst/bond_fene.rst | 114 + doc/rst/bond_fene_expand.rst | 113 + doc/rst/bond_gromos.rst | 89 + doc/rst/bond_harmonic.rst | 95 + doc/rst/bond_harmonic_shift.rst | 95 + doc/rst/bond_harmonic_shift_cut.rst | 94 + doc/rst/bond_hybrid.rst | 90 + doc/rst/bond_mm3.rst | 76 + doc/rst/bond_morse.rst | 90 + doc/rst/bond_none.rst | 45 + doc/rst/bond_nonlinear.rst | 100 + doc/rst/bond_oxdna.rst | 128 + doc/rst/bond_quartic.rst | 131 + doc/rst/bond_style.rst | 136 + doc/rst/bond_table.rst | 183 + doc/rst/bond_write.rst | 76 + doc/rst/bond_zero.rst | 60 + doc/rst/bonds.rst | 24 + doc/rst/boundary.rst | 126 + doc/rst/box.rst | 76 + doc/rst/change_box.rst | 387 + doc/rst/clear.rst | 49 + doc/rst/comm_modify.rst | 186 + doc/rst/comm_style.rst | 78 + doc/rst/commands_list.rst | 123 + doc/rst/compute.rst | 336 + doc/rst/compute_ackland_atom.rst | 104 + doc/rst/compute_adf.rst | 234 + doc/rst/compute_angle.rst | 62 + doc/rst/compute_angle_local.rst | 158 + doc/rst/compute_angmom_chunk.rst | 100 + doc/rst/compute_basal_atom.rst | 90 + doc/rst/compute_body_local.rst | 110 + doc/rst/compute_bond.rst | 62 + doc/rst/compute_bond_local.rst | 208 + doc/rst/compute_centro_atom.rst | 180 + doc/rst/compute_chunk_atom.rst | 707 ++ doc/rst/compute_chunk_spread_atom.rst | 203 + doc/rst/compute_cluster_atom.rst | 117 + doc/rst/compute_cna_atom.rst | 119 + doc/rst/compute_cnp_atom.rst | 133 + doc/rst/compute_com.rst | 69 + doc/rst/compute_com_chunk.rst | 98 + doc/rst/compute_contact_atom.rst | 66 + doc/rst/compute_coord_atom.rst | 162 + doc/rst/compute_damage_atom.rst | 72 + doc/rst/compute_dihedral.rst | 61 + doc/rst/compute_dihedral_local.rst | 151 + doc/rst/compute_dilatation_atom.rst | 75 + doc/rst/compute_dipole_chunk.rst | 103 + doc/rst/compute_displace_atom.rst | 160 + doc/rst/compute_dpd.rst | 90 + doc/rst/compute_dpd_atom.rst | 79 + doc/rst/compute_edpd_temp_atom.rst | 80 + doc/rst/compute_entropy_atom.rst | 164 + doc/rst/compute_erotate_asphere.rst | 82 + doc/rst/compute_erotate_rigid.rst | 70 + doc/rst/compute_erotate_sphere.rst | 71 + doc/rst/compute_erotate_sphere_atom.rst | 67 + doc/rst/compute_event_displace.rst | 76 + doc/rst/compute_fep.rst | 349 + doc/rst/compute_global_atom.rst | 250 + doc/rst/compute_group_group.rst | 187 + doc/rst/compute_gyration.rst | 86 + doc/rst/compute_gyration_chunk.rst | 126 + doc/rst/compute_gyration_shape.rst | 103 + doc/rst/compute_heat_flux.rst | 217 + doc/rst/compute_hexorder_atom.rst | 139 + doc/rst/compute_hma.rst | 209 + doc/rst/compute_improper.rst | 61 + doc/rst/compute_improper_local.rst | 95 + doc/rst/compute_inertia_chunk.rst | 99 + doc/rst/compute_ke.rst | 71 + doc/rst/compute_ke_atom.rst | 60 + doc/rst/compute_ke_atom_eff.rst | 91 + doc/rst/compute_ke_eff.rst | 90 + doc/rst/compute_ke_rigid.rst | 69 + doc/rst/compute_meso_e_atom.rst | 67 + doc/rst/compute_meso_rho_atom.rst | 67 + doc/rst/compute_meso_t_atom.rst | 69 + doc/rst/compute_modify.rst | 87 + doc/rst/compute_momentum.rst | 59 + doc/rst/compute_msd.rst | 129 + doc/rst/compute_msd_chunk.rst | 137 + doc/rst/compute_msd_nongauss.rst | 96 + doc/rst/compute_omega_chunk.rst | 100 + doc/rst/compute_orientorder_atom.rst | 174 + doc/rst/compute_pair.rst | 107 + doc/rst/compute_pair_local.rst | 162 + doc/rst/compute_pe.rst | 97 + doc/rst/compute_pe_atom.rst | 123 + doc/rst/compute_plasticity_atom.rst | 82 + doc/rst/compute_pressure.rst | 176 + doc/rst/compute_pressure_cylinder.rst | 96 + doc/rst/compute_pressure_uef.rst | 70 + doc/rst/compute_property_atom.rst | 198 + doc/rst/compute_property_chunk.rst | 129 + doc/rst/compute_property_local.rst | 179 + doc/rst/compute_ptm_atom.rst | 135 + doc/rst/compute_rdf.rst | 224 + doc/rst/compute_reduce.rst | 244 + doc/rst/compute_reduce_chunk.rst | 205 + doc/rst/compute_rigid_local.rst | 205 + doc/rst/compute_saed.rst | 214 + doc/rst/compute_slice.rst | 137 + doc/rst/compute_smd_contact_radius.rst | 66 + doc/rst/compute_smd_damage.rst | 59 + doc/rst/compute_smd_hourglass_error.rst | 72 + doc/rst/compute_smd_internal_energy.rst | 60 + doc/rst/compute_smd_plastic_strain.rst | 65 + doc/rst/compute_smd_plastic_strain_rate.rst | 65 + doc/rst/compute_smd_rho.rst | 62 + doc/rst/compute_smd_tlsph_defgrad.rst | 67 + doc/rst/compute_smd_tlsph_dt.rst | 69 + doc/rst/compute_smd_tlsph_num_neighs.rst | 64 + doc/rst/compute_smd_tlsph_shape.rst | 71 + doc/rst/compute_smd_tlsph_strain.rst | 68 + doc/rst/compute_smd_tlsph_strain_rate.rst | 66 + doc/rst/compute_smd_tlsph_stress.rst | 68 + doc/rst/compute_smd_triangle_vertices.rst | 72 + doc/rst/compute_smd_ulsph_num_neighs.rst | 63 + doc/rst/compute_smd_ulsph_strain.rst | 66 + doc/rst/compute_smd_ulsph_strain_rate.rst | 67 + doc/rst/compute_smd_ulsph_stress.rst | 66 + doc/rst/compute_smd_vol.rst | 64 + doc/rst/compute_sna_atom.rst | 316 + doc/rst/compute_spin.rst | 94 + doc/rst/compute_stress_atom.rst | 196 + doc/rst/compute_stress_mop.rst | 127 + doc/rst/compute_tally.rst | 120 + doc/rst/compute_tdpd_cc_atom.rst | 75 + doc/rst/compute_temp.rst | 127 + doc/rst/compute_temp_asphere.rst | 173 + doc/rst/compute_temp_body.rst | 149 + doc/rst/compute_temp_chunk.rst | 260 + doc/rst/compute_temp_com.rst | 100 + doc/rst/compute_temp_cs.rst | 131 + doc/rst/compute_temp_deform.rst | 142 + doc/rst/compute_temp_deform_eff.rst | 80 + doc/rst/compute_temp_drude.rst | 87 + doc/rst/compute_temp_eff.rst | 108 + doc/rst/compute_temp_partial.rst | 126 + doc/rst/compute_temp_profile.rst | 202 + doc/rst/compute_temp_ramp.rst | 125 + doc/rst/compute_temp_region.rst | 114 + doc/rst/compute_temp_region_eff.rst | 71 + doc/rst/compute_temp_rotate.rst | 102 + doc/rst/compute_temp_sphere.rst | 159 + doc/rst/compute_temp_uef.rst | 62 + doc/rst/compute_ti.rst | 162 + doc/rst/compute_torque_chunk.rst | 99 + doc/rst/compute_vacf.rst | 87 + doc/rst/compute_vcm_chunk.rst | 86 + doc/rst/compute_voronoi_atom.rst | 256 + doc/rst/compute_xrd.rst | 278 + doc/rst/computes.rst | 136 + doc/rst/create_atoms.rst | 372 + doc/rst/create_bonds.rst | 226 + doc/rst/create_box.rst | 170 + doc/rst/delete_atoms.rst | 175 + doc/rst/delete_bonds.rst | 168 + doc/rst/dielectric.rst | 55 + doc/rst/dihedral_charmm.rst | 197 + doc/rst/dihedral_class2.rst | 202 + doc/rst/dihedral_coeff.rst | 119 + doc/rst/dihedral_cosine_shift_exp.rst | 102 + doc/rst/dihedral_fourier.rst | 95 + doc/rst/dihedral_harmonic.rst | 104 + doc/rst/dihedral_helix.rst | 105 + doc/rst/dihedral_hybrid.rst | 111 + doc/rst/dihedral_multi_harmonic.rst | 89 + doc/rst/dihedral_nharmonic.rst | 89 + doc/rst/dihedral_none.rst | 46 + doc/rst/dihedral_opls.rst | 111 + doc/rst/dihedral_quadratic.rst | 90 + doc/rst/dihedral_spherical.rst | 104 + doc/rst/dihedral_style.rst | 150 + doc/rst/dihedral_table.rst | 233 + doc/rst/dihedral_table_cut.rst | 236 + doc/rst/dihedral_zero.rst | 58 + doc/rst/dihedrals.rst | 39 + doc/rst/dimension.rst | 66 + doc/rst/displace_atoms.rst | 167 + doc/rst/dump.rst | 728 ++ doc/rst/dump_adios.rst | 95 + doc/rst/dump_cfg_uef.rst | 67 + doc/rst/dump_h5md.rst | 158 + doc/rst/dump_image.rst | 753 ++ doc/rst/dump_modify.rst | 1156 +++ doc/rst/dump_molfile.rst | 145 + doc/rst/dump_netcdf.rst | 97 + doc/rst/dump_vtk.rst | 199 + doc/rst/dynamical_matrix.rst | 71 + doc/rst/echo.rst | 53 + doc/rst/fix.rst | 409 + doc/rst/fix_adapt.rst | 390 + doc/rst/fix_adapt_fep.rst | 332 + doc/rst/fix_addforce.rst | 206 + doc/rst/fix_addtorque.rst | 108 + doc/rst/fix_append_atoms.rst | 128 + doc/rst/fix_atc.rst | 297 + doc/rst/fix_atom_swap.rst | 213 + doc/rst/fix_ave_atom.rst | 194 + doc/rst/fix_ave_chunk.rst | 520 + doc/rst/fix_ave_correlate.rst | 393 + doc/rst/fix_ave_correlate_long.rst | 162 + doc/rst/fix_ave_histo.rst | 395 + doc/rst/fix_ave_time.rst | 375 + doc/rst/fix_aveforce.rst | 139 + doc/rst/fix_balance.rst | 430 + doc/rst/fix_bocs.rst | 140 + doc/rst/fix_bond_break.rst | 163 + doc/rst/fix_bond_create.rst | 265 + doc/rst/fix_bond_react.rst | 487 + doc/rst/fix_bond_swap.rst | 216 + doc/rst/fix_box_relax.rst | 422 + doc/rst/fix_client_md.rst | 115 + doc/rst/fix_cmap.rst | 172 + doc/rst/fix_colvars.rst | 162 + doc/rst/fix_controller.rst | 231 + doc/rst/fix_deform.rst | 643 ++ doc/rst/fix_deposit.rst | 318 + doc/rst/fix_dpd_energy.rst | 127 + doc/rst/fix_dpd_source.rst | 124 + doc/rst/fix_drag.rst | 74 + doc/rst/fix_drude.rst | 59 + doc/rst/fix_drude_transform.rst | 231 + doc/rst/fix_dt_reset.rst | 118 + doc/rst/fix_efield.rst | 186 + doc/rst/fix_ehex.rst | 209 + doc/rst/fix_electron_stopping.rst | 210 + doc/rst/fix_enforce2d.rst | 83 + doc/rst/fix_eos_cv.rst | 79 + doc/rst/fix_eos_table.rst | 134 + doc/rst/fix_eos_table_rx.rst | 232 + doc/rst/fix_evaporate.rst | 112 + doc/rst/fix_external.rst | 187 + doc/rst/fix_ffl.rst | 142 + doc/rst/fix_filter_corotate.rst | 104 + doc/rst/fix_flow_gauss.rst | 190 + doc/rst/fix_freeze.rst | 101 + doc/rst/fix_gcmc.rst | 492 + doc/rst/fix_gld.rst | 181 + doc/rst/fix_gle.rst | 182 + doc/rst/fix_gravity.rst | 163 + doc/rst/fix_grem.rst | 131 + doc/rst/fix_halt.rst | 174 + doc/rst/fix_heat.rst | 144 + doc/rst/fix_hyper_global.rst | 301 + doc/rst/fix_hyper_local.rst | 516 + doc/rst/fix_imd.rst | 182 + doc/rst/fix_indent.rst | 234 + doc/rst/fix_ipi.rst | 117 + doc/rst/fix_langevin.rst | 370 + doc/rst/fix_langevin_drude.rst | 326 + doc/rst/fix_langevin_eff.rst | 140 + doc/rst/fix_langevin_spin.rst | 126 + doc/rst/fix_latte.rst | 259 + doc/rst/fix_lb_fluid.rst | 412 + doc/rst/fix_lb_momentum.rst | 89 + doc/rst/fix_lb_pc.rst | 73 + doc/rst/fix_lb_rigid_pc_sphere.rst | 173 + doc/rst/fix_lb_viscous.rst | 108 + doc/rst/fix_lineforce.rst | 62 + doc/rst/fix_manifoldforce.rst | 74 + doc/rst/fix_meso.rst | 61 + doc/rst/fix_meso_move.rst | 273 + doc/rst/fix_meso_stationary.rst | 62 + doc/rst/fix_modify.rst | 174 + doc/rst/fix_momentum.rst | 117 + doc/rst/fix_move.rst | 263 + doc/rst/fix_mscg.rst | 155 + doc/rst/fix_msst.rst | 228 + doc/rst/fix_mvv_dpd.rst | 119 + doc/rst/fix_neb.rst | 292 + doc/rst/fix_neb_spin.rst | 93 + doc/rst/fix_nh.rst | 743 ++ doc/rst/fix_nh_eff.rst | 181 + doc/rst/fix_nh_uef.rst | 279 + doc/rst/fix_nph_asphere.rst | 164 + doc/rst/fix_nph_body.rst | 157 + doc/rst/fix_nph_sphere.rst | 177 + doc/rst/fix_nphug.rst | 259 + doc/rst/fix_npt_asphere.rst | 189 + doc/rst/fix_npt_body.rst | 182 + doc/rst/fix_npt_sphere.rst | 201 + doc/rst/fix_nve.rst | 90 + doc/rst/fix_nve_asphere.rst | 98 + doc/rst/fix_nve_asphere_noforce.rst | 72 + doc/rst/fix_nve_awpmd.rst | 65 + doc/rst/fix_nve_body.rst | 69 + doc/rst/fix_nve_dot.rst | 88 + doc/rst/fix_nve_dotc_langevin.rst | 181 + doc/rst/fix_nve_eff.rst | 60 + doc/rst/fix_nve_limit.rst | 98 + doc/rst/fix_nve_line.rst | 65 + doc/rst/fix_nve_manifold_rattle.rst | 129 + doc/rst/fix_nve_noforce.rst | 64 + doc/rst/fix_nve_sphere.rst | 146 + doc/rst/fix_nve_spin.rst | 106 + doc/rst/fix_nve_tri.rst | 66 + doc/rst/fix_nvk.rst | 89 + doc/rst/fix_nvt_asphere.rst | 163 + doc/rst/fix_nvt_body.rst | 156 + doc/rst/fix_nvt_manifold_rattle.rst | 103 + doc/rst/fix_nvt_sllod.rst | 215 + doc/rst/fix_nvt_sllod_eff.rst | 103 + doc/rst/fix_nvt_sphere.rst | 176 + doc/rst/fix_oneway.rst | 73 + doc/rst/fix_orient.rst | 231 + doc/rst/fix_phonon.rst | 245 + doc/rst/fix_pimd.rst | 228 + doc/rst/fix_planeforce.rst | 62 + doc/rst/fix_plumed.rst | 142 + doc/rst/fix_poems.rst | 159 + doc/rst/fix_pour.rst | 291 + doc/rst/fix_precession_spin.rst | 147 + doc/rst/fix_press_berendsen.rst | 262 + doc/rst/fix_print.rst | 124 + doc/rst/fix_property_atom.rst | 343 + doc/rst/fix_python_invoke.rst | 93 + doc/rst/fix_python_move.rst | 117 + doc/rst/fix_qbmsst.rst | 256 + doc/rst/fix_qeq.rst | 270 + doc/rst/fix_qeq_comb.rst | 165 + doc/rst/fix_qeq_reax.rst | 156 + doc/rst/fix_qmmm.rst | 73 + doc/rst/fix_qtb.rst | 218 + doc/rst/fix_reaxc_bonds.rst | 122 + doc/rst/fix_reaxc_species.rst | 204 + doc/rst/fix_recenter.rst | 143 + doc/rst/fix_restrain.rst | 240 + doc/rst/fix_rhok.rst | 71 + doc/rst/fix_rigid.rst | 958 ++ doc/rst/fix_rigid_meso.rst | 396 + doc/rst/fix_rx.rst | 253 + doc/rst/fix_saed_vtk.rst | 219 + doc/rst/fix_setforce.rst | 167 + doc/rst/fix_shake.rst | 270 + doc/rst/fix_shardlow.rst | 141 + doc/rst/fix_smd.rst | 184 + doc/rst/fix_smd_adjust_dt.rst | 74 + doc/rst/fix_smd_integrate_tlsph.rst | 69 + doc/rst/fix_smd_integrate_ulsph.rst | 73 + doc/rst/fix_smd_move_triangulated_surface.rst | 93 + doc/rst/fix_smd_setvel.rst | 100 + doc/rst/fix_smd_wall_surface.rst | 86 + doc/rst/fix_spring.rst | 161 + doc/rst/fix_spring_chunk.rst | 99 + doc/rst/fix_spring_rg.rst | 85 + doc/rst/fix_spring_self.rst | 96 + doc/rst/fix_srd.rst | 432 + doc/rst/fix_store_force.rst | 81 + doc/rst/fix_store_state.rst | 148 + doc/rst/fix_temp_berendsen.rst | 186 + doc/rst/fix_temp_csvr.rst | 198 + doc/rst/fix_temp_rescale.rst | 173 + doc/rst/fix_temp_rescale_eff.rst | 83 + doc/rst/fix_tfmc.rst | 181 + doc/rst/fix_thermal_conductivity.rst | 188 + doc/rst/fix_ti_spring.rst | 189 + doc/rst/fix_tmd.rst | 151 + doc/rst/fix_ttm.rst | 383 + doc/rst/fix_tune_kspace.rst | 109 + doc/rst/fix_vector.rst | 181 + doc/rst/fix_viscosity.rst | 191 + doc/rst/fix_viscous.rst | 122 + doc/rst/fix_wall.rst | 415 + doc/rst/fix_wall_body_polygon.rst | 119 + doc/rst/fix_wall_body_polyhedron.rst | 118 + doc/rst/fix_wall_ees.rst | 145 + doc/rst/fix_wall_gran.rst | 216 + doc/rst/fix_wall_gran_region.rst | 249 + doc/rst/fix_wall_piston.rst | 135 + doc/rst/fix_wall_reflect.rst | 219 + doc/rst/fix_wall_region.rst | 232 + doc/rst/fix_wall_srd.rst | 225 + doc/rst/fixes.rst | 189 + doc/rst/group.rst | 328 + doc/rst/group2ndx.rst | 79 + doc/rst/hyper.rst | 219 + doc/rst/if.rst | 223 + doc/rst/improper_class2.rst | 148 + doc/rst/improper_coeff.rst | 110 + doc/rst/improper_cossq.rst | 102 + doc/rst/improper_cvff.rst | 105 + doc/rst/improper_distance.rst | 71 + doc/rst/improper_distharm.rst | 65 + doc/rst/improper_fourier.rst | 98 + doc/rst/improper_harmonic.rst | 111 + doc/rst/improper_hybrid.rst | 83 + doc/rst/improper_inversion_harmonic.rst | 82 + doc/rst/improper_none.rst | 46 + doc/rst/improper_ring.rst | 111 + doc/rst/improper_sqdistharm.rst | 66 + doc/rst/improper_style.rst | 128 + doc/rst/improper_umbrella.rst | 112 + doc/rst/improper_zero.rst | 58 + doc/rst/impropers.rst | 22 + doc/rst/include.rst | 52 + doc/rst/info.rst | 135 + doc/rst/jump.rst | 163 + doc/rst/kim_commands.rst | 620 ++ doc/rst/kspace_modify.rst | 567 ++ doc/rst/kspace_style.rst | 592 ++ doc/rst/label.rst | 47 + doc/rst/lattice.rst | 335 + doc/rst/log.rst | 56 + doc/rst/mass.rst | 95 + doc/rst/message.rst | 195 + doc/rst/min_modify.rst | 108 + doc/rst/min_spin.rst | 83 + doc/rst/min_style.rst | 129 + doc/rst/minimize.rst | 318 + doc/rst/molecule.rst | 518 + doc/rst/neb.rst | 478 + doc/rst/neb_spin.rst | 419 + doc/rst/neigh_modify.rst | 234 + doc/rst/neighbor.rst | 95 + doc/rst/newton.rst | 78 + doc/rst/next.rst | 163 + doc/rst/package.rst | 689 ++ doc/rst/pair_adp.rst | 211 + doc/rst/pair_agni.rst | 154 + doc/rst/pair_airebo.rst | 293 + doc/rst/pair_atm.rst | 197 + doc/rst/pair_awpmd.rst | 140 + doc/rst/pair_beck.rst | 133 + doc/rst/pair_body_nparticle.rst | 133 + doc/rst/pair_body_rounded_polygon.rst | 147 + doc/rst/pair_body_rounded_polyhedron.rst | 142 + doc/rst/pair_bop.rst | 480 + doc/rst/pair_born.rst | 238 + doc/rst/pair_brownian.rst | 161 + doc/rst/pair_buck.rst | 242 + doc/rst/pair_buck6d_coul_gauss.rst | 164 + doc/rst/pair_buck_long.rst | 199 + doc/rst/pair_charmm.rst | 336 + doc/rst/pair_class2.rst | 223 + doc/rst/pair_coeff.rst | 165 + doc/rst/pair_colloid.rst | 230 + doc/rst/pair_comb.rst | 227 + doc/rst/pair_cosine_squared.rst | 134 + doc/rst/pair_coul.rst | 434 + doc/rst/pair_coul_diel.rst | 139 + doc/rst/pair_coul_shield.rst | 119 + doc/rst/pair_cs.rst | 218 + doc/rst/pair_dipole.rst | 321 + doc/rst/pair_dpd.rst | 248 + doc/rst/pair_dpd_fdt.rst | 207 + doc/rst/pair_drip.rst | 167 + doc/rst/pair_dsmc.rst | 178 + doc/rst/pair_e3b.rst | 176 + doc/rst/pair_eam.rst | 555 ++ doc/rst/pair_edip.rst | 194 + doc/rst/pair_eff.rst | 358 + doc/rst/pair_eim.rst | 204 + doc/rst/pair_exp6_rx.rst | 214 + doc/rst/pair_extep.rst | 59 + doc/rst/pair_fep_soft.rst | 433 + doc/rst/pair_gauss.rst | 217 + doc/rst/pair_gayberne.rst | 264 + doc/rst/pair_gran.rst | 315 + doc/rst/pair_granular.rst | 876 ++ doc/rst/pair_gromacs.rst | 193 + doc/rst/pair_gw.rst | 145 + doc/rst/pair_hbond_dreiding.rst | 286 + doc/rst/pair_hybrid.rst | 444 + doc/rst/pair_ilp_graphene_hbn.rst | 197 + doc/rst/pair_kim.rst | 135 + doc/rst/pair_kolmogorov_crespi_full.rst | 166 + doc/rst/pair_kolmogorov_crespi_z.rst | 96 + doc/rst/pair_lcbop.rst | 116 + doc/rst/pair_lebedeva_z.rst | 83 + doc/rst/pair_line_lj.rst | 159 + doc/rst/pair_list.rst | 168 + doc/rst/pair_lj.rst | 448 + doc/rst/pair_lj96.rst | 126 + doc/rst/pair_lj_cubic.rst | 156 + doc/rst/pair_lj_expand.rst | 150 + doc/rst/pair_lj_long.rst | 278 + doc/rst/pair_lj_smooth.rst | 140 + doc/rst/pair_lj_smooth_linear.rst | 133 + doc/rst/pair_lj_switch3_coulgauss.rst | 104 + doc/rst/pair_lubricate.rst | 258 + doc/rst/pair_lubricateU.rst | 242 + doc/rst/pair_mdf.rst | 196 + doc/rst/pair_meam_spline.rst | 200 + doc/rst/pair_meam_sw_spline.rst | 167 + doc/rst/pair_meamc.rst | 471 + doc/rst/pair_meso.rst | 337 + doc/rst/pair_mgpt.rst | 254 + doc/rst/pair_mie.rst | 126 + doc/rst/pair_mm3_switch3_coulgauss.rst | 106 + doc/rst/pair_modify.rst | 321 + doc/rst/pair_momb.rst | 96 + doc/rst/pair_morse.rst | 170 + doc/rst/pair_multi_lucy.rst | 234 + doc/rst/pair_multi_lucy_rx.rst | 285 + doc/rst/pair_nb3b_harmonic.rst | 119 + doc/rst/pair_nm.rst | 201 + doc/rst/pair_none.rst | 58 + doc/rst/pair_oxdna.rst | 150 + doc/rst/pair_oxdna2.rst | 164 + doc/rst/pair_peri.rst | 254 + doc/rst/pair_polymorphic.rst | 288 + doc/rst/pair_python.rst | 255 + doc/rst/pair_quip.rst | 124 + doc/rst/pair_reaxc.rst | 401 + doc/rst/pair_resquared.rst | 260 + doc/rst/pair_sdk.rst | 203 + doc/rst/pair_sdpd_taitwater_isothermal.rst | 130 + doc/rst/pair_smd_hertz.rst | 73 + doc/rst/pair_smd_tlsph.rst | 89 + doc/rst/pair_smd_triangulated_surface.rst | 74 + doc/rst/pair_smd_ulsph.rst | 104 + doc/rst/pair_smtbq.rst | 300 + doc/rst/pair_snap.rst | 252 + doc/rst/pair_soft.rst | 158 + doc/rst/pair_sph_heatconduction.rst | 74 + doc/rst/pair_sph_idealgas.rst | 93 + doc/rst/pair_sph_lj.rst | 98 + doc/rst/pair_sph_rhosum.rst | 75 + doc/rst/pair_sph_taitwater.rst | 96 + doc/rst/pair_sph_taitwater_morris.rst | 94 + doc/rst/pair_spin_dipole.rst | 97 + doc/rst/pair_spin_dmi.rst | 113 + doc/rst/pair_spin_exchange.rst | 118 + doc/rst/pair_spin_magelec.rst | 95 + doc/rst/pair_spin_neel.rst | 103 + doc/rst/pair_srp.rst | 190 + doc/rst/pair_style.rst | 355 + doc/rst/pair_sw.rst | 246 + doc/rst/pair_table.rst | 301 + doc/rst/pair_table_rx.rst | 288 + doc/rst/pair_tersoff.rst | 294 + doc/rst/pair_tersoff_mod.rst | 252 + doc/rst/pair_tersoff_zbl.rst | 306 + doc/rst/pair_thole.rst | 220 + doc/rst/pair_tri_lj.rst | 128 + doc/rst/pair_ufm.rst | 167 + doc/rst/pair_vashishta.rst | 289 + doc/rst/pair_write.rst | 91 + doc/rst/pair_yukawa.rst | 126 + doc/rst/pair_yukawa_colloid.rst | 181 + doc/rst/pair_zbl.rst | 169 + doc/rst/pair_zero.rst | 100 + doc/rst/pairs.rst | 129 + doc/rst/partition.rst | 82 + doc/rst/prd.rst | 371 + doc/rst/print.rst | 101 + doc/rst/processors.rst | 385 + doc/rst/python.rst | 556 ++ doc/rst/quit.rst | 58 + doc/rst/read_data.rst | 1445 +++ doc/rst/read_dump.rst | 380 + doc/rst/read_restart.rst | 288 + doc/rst/region.rst | 435 + doc/rst/replicate.rst | 116 + doc/rst/rerun.rst | 237 + doc/rst/reset_ids.rst | 69 + doc/rst/reset_timestep.rst | 72 + doc/rst/restart.rst | 204 + doc/rst/run.rst | 241 + doc/rst/run_style.rst | 374 + doc/rst/server.rst | 81 + doc/rst/server_mc.rst | 137 + doc/rst/server_md.rst | 174 + doc/rst/set.rst | 491 + doc/rst/shell.rst | 128 + doc/rst/special_bonds.rst | 300 + doc/rst/suffix.rst | 117 + doc/rst/tad.rst | 339 + doc/rst/temper.rst | 176 + doc/rst/temper_grem.rst | 133 + doc/rst/temper_npt.rst | 88 + doc/rst/thermo.rst | 76 + doc/rst/thermo_modify.rst | 200 + doc/rst/thermo_style.rst | 451 + doc/rst/timer.rst | 140 + doc/rst/timestep.rst | 74 + doc/rst/uncompute.rst | 46 + doc/rst/undump.rst | 45 + doc/rst/unfix.rst | 46 + doc/rst/units.rst | 238 + doc/rst/variable.rst | 1481 +++ doc/rst/velocity.rst | 288 + doc/rst/write_coeff.rst | 58 + doc/rst/write_data.rst | 152 + doc/rst/write_dump.rst | 105 + doc/rst/write_restart.rst | 144 + 755 files changed, 141591 insertions(+), 8 deletions(-) create mode 100644 doc/rst/.gitignore create mode 100644 doc/rst/Build.rst create mode 100644 doc/rst/Build_basics.rst create mode 100644 doc/rst/Build_cmake.rst create mode 100644 doc/rst/Build_development.rst create mode 100644 doc/rst/Build_extras.rst create mode 100644 doc/rst/Build_link.rst create mode 100644 doc/rst/Build_make.rst create mode 100644 doc/rst/Build_package.rst create mode 100644 doc/rst/Build_settings.rst create mode 100644 doc/rst/Build_windows.rst create mode 100644 doc/rst/Commands.rst create mode 100644 doc/rst/Commands_all.rst create mode 100644 doc/rst/Commands_bond.rst create mode 100644 doc/rst/Commands_category.rst create mode 100644 doc/rst/Commands_compute.rst create mode 100644 doc/rst/Commands_fix.rst create mode 100644 doc/rst/Commands_input.rst create mode 100644 doc/rst/Commands_kspace.rst create mode 100644 doc/rst/Commands_pair.rst create mode 100644 doc/rst/Commands_parse.rst create mode 100644 doc/rst/Commands_removed.rst create mode 100644 doc/rst/Commands_structure.rst create mode 100644 doc/rst/Errors.rst create mode 100644 doc/rst/Errors_bugs.rst create mode 100644 doc/rst/Errors_common.rst create mode 100644 doc/rst/Errors_messages.rst create mode 100644 doc/rst/Errors_warnings.rst create mode 100644 doc/rst/Examples.rst create mode 100644 doc/rst/Howto.rst create mode 100644 doc/rst/Howto_2d.rst create mode 100644 doc/rst/Howto_barostat.rst create mode 100644 doc/rst/Howto_bash.rst create mode 100644 doc/rst/Howto_bioFF.rst create mode 100644 doc/rst/Howto_body.rst create mode 100644 doc/rst/Howto_chunk.rst create mode 100644 doc/rst/Howto_client_server.rst create mode 100644 doc/rst/Howto_coreshell.rst create mode 100644 doc/rst/Howto_couple.rst create mode 100644 doc/rst/Howto_diffusion.rst create mode 100644 doc/rst/Howto_dispersion.rst create mode 100644 doc/rst/Howto_drude.rst create mode 100644 doc/rst/Howto_drude2.rst create mode 100644 doc/rst/Howto_elastic.rst create mode 100644 doc/rst/Howto_github.rst create mode 100644 doc/rst/Howto_granular.rst create mode 100644 doc/rst/Howto_kappa.rst create mode 100644 doc/rst/Howto_library.rst create mode 100644 doc/rst/Howto_manifold.rst create mode 100644 doc/rst/Howto_multiple.rst create mode 100644 doc/rst/Howto_nemd.rst create mode 100644 doc/rst/Howto_output.rst create mode 100644 doc/rst/Howto_polarizable.rst create mode 100644 doc/rst/Howto_pylammps.rst create mode 100644 doc/rst/Howto_replica.rst create mode 100644 doc/rst/Howto_restart.rst create mode 100644 doc/rst/Howto_spc.rst create mode 100644 doc/rst/Howto_spherical.rst create mode 100644 doc/rst/Howto_spins.rst create mode 100644 doc/rst/Howto_temperature.rst create mode 100644 doc/rst/Howto_thermostat.rst create mode 100644 doc/rst/Howto_tip3p.rst create mode 100644 doc/rst/Howto_tip4p.rst create mode 100644 doc/rst/Howto_triclinic.rst create mode 100644 doc/rst/Howto_viscosity.rst create mode 100644 doc/rst/Howto_viz.rst create mode 100644 doc/rst/Howto_walls.rst create mode 100644 doc/rst/Install.rst create mode 100644 doc/rst/Install_git.rst create mode 100644 doc/rst/Install_linux.rst create mode 100644 doc/rst/Install_mac.rst create mode 100644 doc/rst/Install_patch.rst create mode 100644 doc/rst/Install_svn.rst create mode 100644 doc/rst/Install_tarball.rst create mode 100644 doc/rst/Install_windows.rst create mode 100644 doc/rst/Intro.rst create mode 100644 doc/rst/Intro_authors.rst create mode 100644 doc/rst/Intro_features.rst create mode 100644 doc/rst/Intro_nonfeatures.rst create mode 100644 doc/rst/Intro_opensource.rst create mode 100644 doc/rst/Intro_overview.rst create mode 100644 doc/rst/Intro_website.rst create mode 100644 doc/rst/Manual.rst create mode 100644 doc/rst/Manual_build.rst create mode 100644 doc/rst/Manual_version.rst create mode 100644 doc/rst/Modify.rst create mode 100644 doc/rst/Modify_atom.rst create mode 100644 doc/rst/Modify_body.rst create mode 100644 doc/rst/Modify_bond.rst create mode 100644 doc/rst/Modify_command.rst create mode 100644 doc/rst/Modify_compute.rst create mode 100644 doc/rst/Modify_contribute.rst create mode 100644 doc/rst/Modify_dump.rst create mode 100644 doc/rst/Modify_fix.rst create mode 100644 doc/rst/Modify_kspace.rst create mode 100644 doc/rst/Modify_min.rst create mode 100644 doc/rst/Modify_overview.rst create mode 100644 doc/rst/Modify_pair.rst create mode 100644 doc/rst/Modify_region.rst create mode 100644 doc/rst/Modify_thermo.rst create mode 100644 doc/rst/Modify_variable.rst create mode 100644 doc/rst/Packages.rst create mode 100644 doc/rst/Packages_details.rst create mode 100644 doc/rst/Packages_standard.rst create mode 100644 doc/rst/Packages_user.rst create mode 100644 doc/rst/Python_call.rst create mode 100644 doc/rst/Python_examples.rst create mode 100644 doc/rst/Python_head.rst create mode 100644 doc/rst/Python_install.rst create mode 100644 doc/rst/Python_library.rst create mode 100644 doc/rst/Python_mpi.rst create mode 100644 doc/rst/Python_overview.rst create mode 100644 doc/rst/Python_pylammps.rst create mode 100644 doc/rst/Python_run.rst create mode 100644 doc/rst/Python_shlib.rst create mode 100644 doc/rst/Python_test.rst create mode 100644 doc/rst/Run_basics.rst create mode 100644 doc/rst/Run_head.rst create mode 100644 doc/rst/Run_options.rst create mode 100644 doc/rst/Run_output.rst create mode 100644 doc/rst/Run_windows.rst create mode 100644 doc/rst/Speed.rst create mode 100644 doc/rst/Speed_bench.rst create mode 100644 doc/rst/Speed_compare.rst create mode 100644 doc/rst/Speed_gpu.rst create mode 100644 doc/rst/Speed_intel.rst create mode 100644 doc/rst/Speed_kokkos.rst create mode 100644 doc/rst/Speed_measure.rst create mode 100644 doc/rst/Speed_omp.rst create mode 100644 doc/rst/Speed_opt.rst create mode 100644 doc/rst/Speed_packages.rst create mode 100644 doc/rst/Speed_tips.rst create mode 100644 doc/rst/Tools.rst create mode 100644 doc/rst/angle_charmm.rst create mode 100644 doc/rst/angle_class2.rst create mode 100644 doc/rst/angle_coeff.rst create mode 100644 doc/rst/angle_cosine.rst create mode 100644 doc/rst/angle_cosine_buck6d.rst create mode 100644 doc/rst/angle_cosine_delta.rst create mode 100644 doc/rst/angle_cosine_periodic.rst create mode 100644 doc/rst/angle_cosine_shift.rst create mode 100644 doc/rst/angle_cosine_shift_exp.rst create mode 100644 doc/rst/angle_cosine_squared.rst create mode 100644 doc/rst/angle_cross.rst create mode 100644 doc/rst/angle_dipole.rst create mode 100644 doc/rst/angle_fourier.rst create mode 100644 doc/rst/angle_fourier_simple.rst create mode 100644 doc/rst/angle_harmonic.rst create mode 100644 doc/rst/angle_hybrid.rst create mode 100644 doc/rst/angle_mm3.rst create mode 100644 doc/rst/angle_none.rst create mode 100644 doc/rst/angle_quartic.rst create mode 100644 doc/rst/angle_sdk.rst create mode 100644 doc/rst/angle_style.rst create mode 100644 doc/rst/angle_table.rst create mode 100644 doc/rst/angle_zero.rst create mode 100644 doc/rst/angles.rst create mode 100644 doc/rst/atom_modify.rst create mode 100644 doc/rst/atom_style.rst create mode 100644 doc/rst/balance.rst create mode 100644 doc/rst/bond_class2.rst create mode 100644 doc/rst/bond_coeff.rst create mode 100644 doc/rst/bond_fene.rst create mode 100644 doc/rst/bond_fene_expand.rst create mode 100644 doc/rst/bond_gromos.rst create mode 100644 doc/rst/bond_harmonic.rst create mode 100644 doc/rst/bond_harmonic_shift.rst create mode 100644 doc/rst/bond_harmonic_shift_cut.rst create mode 100644 doc/rst/bond_hybrid.rst create mode 100644 doc/rst/bond_mm3.rst create mode 100644 doc/rst/bond_morse.rst create mode 100644 doc/rst/bond_none.rst create mode 100644 doc/rst/bond_nonlinear.rst create mode 100644 doc/rst/bond_oxdna.rst create mode 100644 doc/rst/bond_quartic.rst create mode 100644 doc/rst/bond_style.rst create mode 100644 doc/rst/bond_table.rst create mode 100644 doc/rst/bond_write.rst create mode 100644 doc/rst/bond_zero.rst create mode 100644 doc/rst/bonds.rst create mode 100644 doc/rst/boundary.rst create mode 100644 doc/rst/box.rst create mode 100644 doc/rst/change_box.rst create mode 100644 doc/rst/clear.rst create mode 100644 doc/rst/comm_modify.rst create mode 100644 doc/rst/comm_style.rst create mode 100644 doc/rst/commands_list.rst create mode 100644 doc/rst/compute.rst create mode 100644 doc/rst/compute_ackland_atom.rst create mode 100644 doc/rst/compute_adf.rst create mode 100644 doc/rst/compute_angle.rst create mode 100644 doc/rst/compute_angle_local.rst create mode 100644 doc/rst/compute_angmom_chunk.rst create mode 100644 doc/rst/compute_basal_atom.rst create mode 100644 doc/rst/compute_body_local.rst create mode 100644 doc/rst/compute_bond.rst create mode 100644 doc/rst/compute_bond_local.rst create mode 100644 doc/rst/compute_centro_atom.rst create mode 100644 doc/rst/compute_chunk_atom.rst create mode 100644 doc/rst/compute_chunk_spread_atom.rst create mode 100644 doc/rst/compute_cluster_atom.rst create mode 100644 doc/rst/compute_cna_atom.rst create mode 100644 doc/rst/compute_cnp_atom.rst create mode 100644 doc/rst/compute_com.rst create mode 100644 doc/rst/compute_com_chunk.rst create mode 100644 doc/rst/compute_contact_atom.rst create mode 100644 doc/rst/compute_coord_atom.rst create mode 100644 doc/rst/compute_damage_atom.rst create mode 100644 doc/rst/compute_dihedral.rst create mode 100644 doc/rst/compute_dihedral_local.rst create mode 100644 doc/rst/compute_dilatation_atom.rst create mode 100644 doc/rst/compute_dipole_chunk.rst create mode 100644 doc/rst/compute_displace_atom.rst create mode 100644 doc/rst/compute_dpd.rst create mode 100644 doc/rst/compute_dpd_atom.rst create mode 100644 doc/rst/compute_edpd_temp_atom.rst create mode 100644 doc/rst/compute_entropy_atom.rst create mode 100644 doc/rst/compute_erotate_asphere.rst create mode 100644 doc/rst/compute_erotate_rigid.rst create mode 100644 doc/rst/compute_erotate_sphere.rst create mode 100644 doc/rst/compute_erotate_sphere_atom.rst create mode 100644 doc/rst/compute_event_displace.rst create mode 100644 doc/rst/compute_fep.rst create mode 100644 doc/rst/compute_global_atom.rst create mode 100644 doc/rst/compute_group_group.rst create mode 100644 doc/rst/compute_gyration.rst create mode 100644 doc/rst/compute_gyration_chunk.rst create mode 100644 doc/rst/compute_gyration_shape.rst create mode 100644 doc/rst/compute_heat_flux.rst create mode 100644 doc/rst/compute_hexorder_atom.rst create mode 100644 doc/rst/compute_hma.rst create mode 100644 doc/rst/compute_improper.rst create mode 100644 doc/rst/compute_improper_local.rst create mode 100644 doc/rst/compute_inertia_chunk.rst create mode 100644 doc/rst/compute_ke.rst create mode 100644 doc/rst/compute_ke_atom.rst create mode 100644 doc/rst/compute_ke_atom_eff.rst create mode 100644 doc/rst/compute_ke_eff.rst create mode 100644 doc/rst/compute_ke_rigid.rst create mode 100644 doc/rst/compute_meso_e_atom.rst create mode 100644 doc/rst/compute_meso_rho_atom.rst create mode 100644 doc/rst/compute_meso_t_atom.rst create mode 100644 doc/rst/compute_modify.rst create mode 100644 doc/rst/compute_momentum.rst create mode 100644 doc/rst/compute_msd.rst create mode 100644 doc/rst/compute_msd_chunk.rst create mode 100644 doc/rst/compute_msd_nongauss.rst create mode 100644 doc/rst/compute_omega_chunk.rst create mode 100644 doc/rst/compute_orientorder_atom.rst create mode 100644 doc/rst/compute_pair.rst create mode 100644 doc/rst/compute_pair_local.rst create mode 100644 doc/rst/compute_pe.rst create mode 100644 doc/rst/compute_pe_atom.rst create mode 100644 doc/rst/compute_plasticity_atom.rst create mode 100644 doc/rst/compute_pressure.rst create mode 100644 doc/rst/compute_pressure_cylinder.rst create mode 100644 doc/rst/compute_pressure_uef.rst create mode 100644 doc/rst/compute_property_atom.rst create mode 100644 doc/rst/compute_property_chunk.rst create mode 100644 doc/rst/compute_property_local.rst create mode 100644 doc/rst/compute_ptm_atom.rst create mode 100644 doc/rst/compute_rdf.rst create mode 100644 doc/rst/compute_reduce.rst create mode 100644 doc/rst/compute_reduce_chunk.rst create mode 100644 doc/rst/compute_rigid_local.rst create mode 100644 doc/rst/compute_saed.rst create mode 100644 doc/rst/compute_slice.rst create mode 100644 doc/rst/compute_smd_contact_radius.rst create mode 100644 doc/rst/compute_smd_damage.rst create mode 100644 doc/rst/compute_smd_hourglass_error.rst create mode 100644 doc/rst/compute_smd_internal_energy.rst create mode 100644 doc/rst/compute_smd_plastic_strain.rst create mode 100644 doc/rst/compute_smd_plastic_strain_rate.rst create mode 100644 doc/rst/compute_smd_rho.rst create mode 100644 doc/rst/compute_smd_tlsph_defgrad.rst create mode 100644 doc/rst/compute_smd_tlsph_dt.rst create mode 100644 doc/rst/compute_smd_tlsph_num_neighs.rst create mode 100644 doc/rst/compute_smd_tlsph_shape.rst create mode 100644 doc/rst/compute_smd_tlsph_strain.rst create mode 100644 doc/rst/compute_smd_tlsph_strain_rate.rst create mode 100644 doc/rst/compute_smd_tlsph_stress.rst create mode 100644 doc/rst/compute_smd_triangle_vertices.rst create mode 100644 doc/rst/compute_smd_ulsph_num_neighs.rst create mode 100644 doc/rst/compute_smd_ulsph_strain.rst create mode 100644 doc/rst/compute_smd_ulsph_strain_rate.rst create mode 100644 doc/rst/compute_smd_ulsph_stress.rst create mode 100644 doc/rst/compute_smd_vol.rst create mode 100644 doc/rst/compute_sna_atom.rst create mode 100644 doc/rst/compute_spin.rst create mode 100644 doc/rst/compute_stress_atom.rst create mode 100644 doc/rst/compute_stress_mop.rst create mode 100644 doc/rst/compute_tally.rst create mode 100644 doc/rst/compute_tdpd_cc_atom.rst create mode 100644 doc/rst/compute_temp.rst create mode 100644 doc/rst/compute_temp_asphere.rst create mode 100644 doc/rst/compute_temp_body.rst create mode 100644 doc/rst/compute_temp_chunk.rst create mode 100644 doc/rst/compute_temp_com.rst create mode 100644 doc/rst/compute_temp_cs.rst create mode 100644 doc/rst/compute_temp_deform.rst create mode 100644 doc/rst/compute_temp_deform_eff.rst create mode 100644 doc/rst/compute_temp_drude.rst create mode 100644 doc/rst/compute_temp_eff.rst create mode 100644 doc/rst/compute_temp_partial.rst create mode 100644 doc/rst/compute_temp_profile.rst create mode 100644 doc/rst/compute_temp_ramp.rst create mode 100644 doc/rst/compute_temp_region.rst create mode 100644 doc/rst/compute_temp_region_eff.rst create mode 100644 doc/rst/compute_temp_rotate.rst create mode 100644 doc/rst/compute_temp_sphere.rst create mode 100644 doc/rst/compute_temp_uef.rst create mode 100644 doc/rst/compute_ti.rst create mode 100644 doc/rst/compute_torque_chunk.rst create mode 100644 doc/rst/compute_vacf.rst create mode 100644 doc/rst/compute_vcm_chunk.rst create mode 100644 doc/rst/compute_voronoi_atom.rst create mode 100644 doc/rst/compute_xrd.rst create mode 100644 doc/rst/computes.rst create mode 100644 doc/rst/create_atoms.rst create mode 100644 doc/rst/create_bonds.rst create mode 100644 doc/rst/create_box.rst create mode 100644 doc/rst/delete_atoms.rst create mode 100644 doc/rst/delete_bonds.rst create mode 100644 doc/rst/dielectric.rst create mode 100644 doc/rst/dihedral_charmm.rst create mode 100644 doc/rst/dihedral_class2.rst create mode 100644 doc/rst/dihedral_coeff.rst create mode 100644 doc/rst/dihedral_cosine_shift_exp.rst create mode 100644 doc/rst/dihedral_fourier.rst create mode 100644 doc/rst/dihedral_harmonic.rst create mode 100644 doc/rst/dihedral_helix.rst create mode 100644 doc/rst/dihedral_hybrid.rst create mode 100644 doc/rst/dihedral_multi_harmonic.rst create mode 100644 doc/rst/dihedral_nharmonic.rst create mode 100644 doc/rst/dihedral_none.rst create mode 100644 doc/rst/dihedral_opls.rst create mode 100644 doc/rst/dihedral_quadratic.rst create mode 100644 doc/rst/dihedral_spherical.rst create mode 100644 doc/rst/dihedral_style.rst create mode 100644 doc/rst/dihedral_table.rst create mode 100644 doc/rst/dihedral_table_cut.rst create mode 100644 doc/rst/dihedral_zero.rst create mode 100644 doc/rst/dihedrals.rst create mode 100644 doc/rst/dimension.rst create mode 100644 doc/rst/displace_atoms.rst create mode 100644 doc/rst/dump.rst create mode 100644 doc/rst/dump_adios.rst create mode 100644 doc/rst/dump_cfg_uef.rst create mode 100644 doc/rst/dump_h5md.rst create mode 100644 doc/rst/dump_image.rst create mode 100644 doc/rst/dump_modify.rst create mode 100644 doc/rst/dump_molfile.rst create mode 100644 doc/rst/dump_netcdf.rst create mode 100644 doc/rst/dump_vtk.rst create mode 100644 doc/rst/dynamical_matrix.rst create mode 100644 doc/rst/echo.rst create mode 100644 doc/rst/fix.rst create mode 100644 doc/rst/fix_adapt.rst create mode 100644 doc/rst/fix_adapt_fep.rst create mode 100644 doc/rst/fix_addforce.rst create mode 100644 doc/rst/fix_addtorque.rst create mode 100644 doc/rst/fix_append_atoms.rst create mode 100644 doc/rst/fix_atc.rst create mode 100644 doc/rst/fix_atom_swap.rst create mode 100644 doc/rst/fix_ave_atom.rst create mode 100644 doc/rst/fix_ave_chunk.rst create mode 100644 doc/rst/fix_ave_correlate.rst create mode 100644 doc/rst/fix_ave_correlate_long.rst create mode 100644 doc/rst/fix_ave_histo.rst create mode 100644 doc/rst/fix_ave_time.rst create mode 100644 doc/rst/fix_aveforce.rst create mode 100644 doc/rst/fix_balance.rst create mode 100644 doc/rst/fix_bocs.rst create mode 100644 doc/rst/fix_bond_break.rst create mode 100644 doc/rst/fix_bond_create.rst create mode 100644 doc/rst/fix_bond_react.rst create mode 100644 doc/rst/fix_bond_swap.rst create mode 100644 doc/rst/fix_box_relax.rst create mode 100644 doc/rst/fix_client_md.rst create mode 100644 doc/rst/fix_cmap.rst create mode 100644 doc/rst/fix_colvars.rst create mode 100644 doc/rst/fix_controller.rst create mode 100644 doc/rst/fix_deform.rst create mode 100644 doc/rst/fix_deposit.rst create mode 100644 doc/rst/fix_dpd_energy.rst create mode 100644 doc/rst/fix_dpd_source.rst create mode 100644 doc/rst/fix_drag.rst create mode 100644 doc/rst/fix_drude.rst create mode 100644 doc/rst/fix_drude_transform.rst create mode 100644 doc/rst/fix_dt_reset.rst create mode 100644 doc/rst/fix_efield.rst create mode 100644 doc/rst/fix_ehex.rst create mode 100644 doc/rst/fix_electron_stopping.rst create mode 100644 doc/rst/fix_enforce2d.rst create mode 100644 doc/rst/fix_eos_cv.rst create mode 100644 doc/rst/fix_eos_table.rst create mode 100644 doc/rst/fix_eos_table_rx.rst create mode 100644 doc/rst/fix_evaporate.rst create mode 100644 doc/rst/fix_external.rst create mode 100644 doc/rst/fix_ffl.rst create mode 100644 doc/rst/fix_filter_corotate.rst create mode 100644 doc/rst/fix_flow_gauss.rst create mode 100644 doc/rst/fix_freeze.rst create mode 100644 doc/rst/fix_gcmc.rst create mode 100644 doc/rst/fix_gld.rst create mode 100644 doc/rst/fix_gle.rst create mode 100644 doc/rst/fix_gravity.rst create mode 100644 doc/rst/fix_grem.rst create mode 100644 doc/rst/fix_halt.rst create mode 100644 doc/rst/fix_heat.rst create mode 100644 doc/rst/fix_hyper_global.rst create mode 100644 doc/rst/fix_hyper_local.rst create mode 100644 doc/rst/fix_imd.rst create mode 100644 doc/rst/fix_indent.rst create mode 100644 doc/rst/fix_ipi.rst create mode 100644 doc/rst/fix_langevin.rst create mode 100644 doc/rst/fix_langevin_drude.rst create mode 100644 doc/rst/fix_langevin_eff.rst create mode 100644 doc/rst/fix_langevin_spin.rst create mode 100644 doc/rst/fix_latte.rst create mode 100644 doc/rst/fix_lb_fluid.rst create mode 100644 doc/rst/fix_lb_momentum.rst create mode 100644 doc/rst/fix_lb_pc.rst create mode 100644 doc/rst/fix_lb_rigid_pc_sphere.rst create mode 100644 doc/rst/fix_lb_viscous.rst create mode 100644 doc/rst/fix_lineforce.rst create mode 100644 doc/rst/fix_manifoldforce.rst create mode 100644 doc/rst/fix_meso.rst create mode 100644 doc/rst/fix_meso_move.rst create mode 100644 doc/rst/fix_meso_stationary.rst create mode 100644 doc/rst/fix_modify.rst create mode 100644 doc/rst/fix_momentum.rst create mode 100644 doc/rst/fix_move.rst create mode 100644 doc/rst/fix_mscg.rst create mode 100644 doc/rst/fix_msst.rst create mode 100644 doc/rst/fix_mvv_dpd.rst create mode 100644 doc/rst/fix_neb.rst create mode 100644 doc/rst/fix_neb_spin.rst create mode 100644 doc/rst/fix_nh.rst create mode 100644 doc/rst/fix_nh_eff.rst create mode 100644 doc/rst/fix_nh_uef.rst create mode 100644 doc/rst/fix_nph_asphere.rst create mode 100644 doc/rst/fix_nph_body.rst create mode 100644 doc/rst/fix_nph_sphere.rst create mode 100644 doc/rst/fix_nphug.rst create mode 100644 doc/rst/fix_npt_asphere.rst create mode 100644 doc/rst/fix_npt_body.rst create mode 100644 doc/rst/fix_npt_sphere.rst create mode 100644 doc/rst/fix_nve.rst create mode 100644 doc/rst/fix_nve_asphere.rst create mode 100644 doc/rst/fix_nve_asphere_noforce.rst create mode 100644 doc/rst/fix_nve_awpmd.rst create mode 100644 doc/rst/fix_nve_body.rst create mode 100644 doc/rst/fix_nve_dot.rst create mode 100644 doc/rst/fix_nve_dotc_langevin.rst create mode 100644 doc/rst/fix_nve_eff.rst create mode 100644 doc/rst/fix_nve_limit.rst create mode 100644 doc/rst/fix_nve_line.rst create mode 100644 doc/rst/fix_nve_manifold_rattle.rst create mode 100644 doc/rst/fix_nve_noforce.rst create mode 100644 doc/rst/fix_nve_sphere.rst create mode 100644 doc/rst/fix_nve_spin.rst create mode 100644 doc/rst/fix_nve_tri.rst create mode 100644 doc/rst/fix_nvk.rst create mode 100644 doc/rst/fix_nvt_asphere.rst create mode 100644 doc/rst/fix_nvt_body.rst create mode 100644 doc/rst/fix_nvt_manifold_rattle.rst create mode 100644 doc/rst/fix_nvt_sllod.rst create mode 100644 doc/rst/fix_nvt_sllod_eff.rst create mode 100644 doc/rst/fix_nvt_sphere.rst create mode 100644 doc/rst/fix_oneway.rst create mode 100644 doc/rst/fix_orient.rst create mode 100644 doc/rst/fix_phonon.rst create mode 100644 doc/rst/fix_pimd.rst create mode 100644 doc/rst/fix_planeforce.rst create mode 100644 doc/rst/fix_plumed.rst create mode 100644 doc/rst/fix_poems.rst create mode 100644 doc/rst/fix_pour.rst create mode 100644 doc/rst/fix_precession_spin.rst create mode 100644 doc/rst/fix_press_berendsen.rst create mode 100644 doc/rst/fix_print.rst create mode 100644 doc/rst/fix_property_atom.rst create mode 100644 doc/rst/fix_python_invoke.rst create mode 100644 doc/rst/fix_python_move.rst create mode 100644 doc/rst/fix_qbmsst.rst create mode 100644 doc/rst/fix_qeq.rst create mode 100644 doc/rst/fix_qeq_comb.rst create mode 100644 doc/rst/fix_qeq_reax.rst create mode 100644 doc/rst/fix_qmmm.rst create mode 100644 doc/rst/fix_qtb.rst create mode 100644 doc/rst/fix_reaxc_bonds.rst create mode 100644 doc/rst/fix_reaxc_species.rst create mode 100644 doc/rst/fix_recenter.rst create mode 100644 doc/rst/fix_restrain.rst create mode 100644 doc/rst/fix_rhok.rst create mode 100644 doc/rst/fix_rigid.rst create mode 100644 doc/rst/fix_rigid_meso.rst create mode 100644 doc/rst/fix_rx.rst create mode 100644 doc/rst/fix_saed_vtk.rst create mode 100644 doc/rst/fix_setforce.rst create mode 100644 doc/rst/fix_shake.rst create mode 100644 doc/rst/fix_shardlow.rst create mode 100644 doc/rst/fix_smd.rst create mode 100644 doc/rst/fix_smd_adjust_dt.rst create mode 100644 doc/rst/fix_smd_integrate_tlsph.rst create mode 100644 doc/rst/fix_smd_integrate_ulsph.rst create mode 100644 doc/rst/fix_smd_move_triangulated_surface.rst create mode 100644 doc/rst/fix_smd_setvel.rst create mode 100644 doc/rst/fix_smd_wall_surface.rst create mode 100644 doc/rst/fix_spring.rst create mode 100644 doc/rst/fix_spring_chunk.rst create mode 100644 doc/rst/fix_spring_rg.rst create mode 100644 doc/rst/fix_spring_self.rst create mode 100644 doc/rst/fix_srd.rst create mode 100644 doc/rst/fix_store_force.rst create mode 100644 doc/rst/fix_store_state.rst create mode 100644 doc/rst/fix_temp_berendsen.rst create mode 100644 doc/rst/fix_temp_csvr.rst create mode 100644 doc/rst/fix_temp_rescale.rst create mode 100644 doc/rst/fix_temp_rescale_eff.rst create mode 100644 doc/rst/fix_tfmc.rst create mode 100644 doc/rst/fix_thermal_conductivity.rst create mode 100644 doc/rst/fix_ti_spring.rst create mode 100644 doc/rst/fix_tmd.rst create mode 100644 doc/rst/fix_ttm.rst create mode 100644 doc/rst/fix_tune_kspace.rst create mode 100644 doc/rst/fix_vector.rst create mode 100644 doc/rst/fix_viscosity.rst create mode 100644 doc/rst/fix_viscous.rst create mode 100644 doc/rst/fix_wall.rst create mode 100644 doc/rst/fix_wall_body_polygon.rst create mode 100644 doc/rst/fix_wall_body_polyhedron.rst create mode 100644 doc/rst/fix_wall_ees.rst create mode 100644 doc/rst/fix_wall_gran.rst create mode 100644 doc/rst/fix_wall_gran_region.rst create mode 100644 doc/rst/fix_wall_piston.rst create mode 100644 doc/rst/fix_wall_reflect.rst create mode 100644 doc/rst/fix_wall_region.rst create mode 100644 doc/rst/fix_wall_srd.rst create mode 100644 doc/rst/fixes.rst create mode 100644 doc/rst/group.rst create mode 100644 doc/rst/group2ndx.rst create mode 100644 doc/rst/hyper.rst create mode 100644 doc/rst/if.rst create mode 100644 doc/rst/improper_class2.rst create mode 100644 doc/rst/improper_coeff.rst create mode 100644 doc/rst/improper_cossq.rst create mode 100644 doc/rst/improper_cvff.rst create mode 100644 doc/rst/improper_distance.rst create mode 100644 doc/rst/improper_distharm.rst create mode 100644 doc/rst/improper_fourier.rst create mode 100644 doc/rst/improper_harmonic.rst create mode 100644 doc/rst/improper_hybrid.rst create mode 100644 doc/rst/improper_inversion_harmonic.rst create mode 100644 doc/rst/improper_none.rst create mode 100644 doc/rst/improper_ring.rst create mode 100644 doc/rst/improper_sqdistharm.rst create mode 100644 doc/rst/improper_style.rst create mode 100644 doc/rst/improper_umbrella.rst create mode 100644 doc/rst/improper_zero.rst create mode 100644 doc/rst/impropers.rst create mode 100644 doc/rst/include.rst create mode 100644 doc/rst/info.rst create mode 100644 doc/rst/jump.rst create mode 100644 doc/rst/kim_commands.rst create mode 100644 doc/rst/kspace_modify.rst create mode 100644 doc/rst/kspace_style.rst create mode 100644 doc/rst/label.rst create mode 100644 doc/rst/lattice.rst create mode 100644 doc/rst/log.rst create mode 100644 doc/rst/mass.rst create mode 100644 doc/rst/message.rst create mode 100644 doc/rst/min_modify.rst create mode 100644 doc/rst/min_spin.rst create mode 100644 doc/rst/min_style.rst create mode 100644 doc/rst/minimize.rst create mode 100644 doc/rst/molecule.rst create mode 100644 doc/rst/neb.rst create mode 100644 doc/rst/neb_spin.rst create mode 100644 doc/rst/neigh_modify.rst create mode 100644 doc/rst/neighbor.rst create mode 100644 doc/rst/newton.rst create mode 100644 doc/rst/next.rst create mode 100644 doc/rst/package.rst create mode 100644 doc/rst/pair_adp.rst create mode 100644 doc/rst/pair_agni.rst create mode 100644 doc/rst/pair_airebo.rst create mode 100644 doc/rst/pair_atm.rst create mode 100644 doc/rst/pair_awpmd.rst create mode 100644 doc/rst/pair_beck.rst create mode 100644 doc/rst/pair_body_nparticle.rst create mode 100644 doc/rst/pair_body_rounded_polygon.rst create mode 100644 doc/rst/pair_body_rounded_polyhedron.rst create mode 100644 doc/rst/pair_bop.rst create mode 100644 doc/rst/pair_born.rst create mode 100644 doc/rst/pair_brownian.rst create mode 100644 doc/rst/pair_buck.rst create mode 100644 doc/rst/pair_buck6d_coul_gauss.rst create mode 100644 doc/rst/pair_buck_long.rst create mode 100644 doc/rst/pair_charmm.rst create mode 100644 doc/rst/pair_class2.rst create mode 100644 doc/rst/pair_coeff.rst create mode 100644 doc/rst/pair_colloid.rst create mode 100644 doc/rst/pair_comb.rst create mode 100644 doc/rst/pair_cosine_squared.rst create mode 100644 doc/rst/pair_coul.rst create mode 100644 doc/rst/pair_coul_diel.rst create mode 100644 doc/rst/pair_coul_shield.rst create mode 100644 doc/rst/pair_cs.rst create mode 100644 doc/rst/pair_dipole.rst create mode 100644 doc/rst/pair_dpd.rst create mode 100644 doc/rst/pair_dpd_fdt.rst create mode 100644 doc/rst/pair_drip.rst create mode 100644 doc/rst/pair_dsmc.rst create mode 100644 doc/rst/pair_e3b.rst create mode 100644 doc/rst/pair_eam.rst create mode 100644 doc/rst/pair_edip.rst create mode 100644 doc/rst/pair_eff.rst create mode 100644 doc/rst/pair_eim.rst create mode 100644 doc/rst/pair_exp6_rx.rst create mode 100644 doc/rst/pair_extep.rst create mode 100644 doc/rst/pair_fep_soft.rst create mode 100644 doc/rst/pair_gauss.rst create mode 100644 doc/rst/pair_gayberne.rst create mode 100644 doc/rst/pair_gran.rst create mode 100644 doc/rst/pair_granular.rst create mode 100644 doc/rst/pair_gromacs.rst create mode 100644 doc/rst/pair_gw.rst create mode 100644 doc/rst/pair_hbond_dreiding.rst create mode 100644 doc/rst/pair_hybrid.rst create mode 100644 doc/rst/pair_ilp_graphene_hbn.rst create mode 100644 doc/rst/pair_kim.rst create mode 100644 doc/rst/pair_kolmogorov_crespi_full.rst create mode 100644 doc/rst/pair_kolmogorov_crespi_z.rst create mode 100644 doc/rst/pair_lcbop.rst create mode 100644 doc/rst/pair_lebedeva_z.rst create mode 100644 doc/rst/pair_line_lj.rst create mode 100644 doc/rst/pair_list.rst create mode 100644 doc/rst/pair_lj.rst create mode 100644 doc/rst/pair_lj96.rst create mode 100644 doc/rst/pair_lj_cubic.rst create mode 100644 doc/rst/pair_lj_expand.rst create mode 100644 doc/rst/pair_lj_long.rst create mode 100644 doc/rst/pair_lj_smooth.rst create mode 100644 doc/rst/pair_lj_smooth_linear.rst create mode 100644 doc/rst/pair_lj_switch3_coulgauss.rst create mode 100644 doc/rst/pair_lubricate.rst create mode 100644 doc/rst/pair_lubricateU.rst create mode 100644 doc/rst/pair_mdf.rst create mode 100644 doc/rst/pair_meam_spline.rst create mode 100644 doc/rst/pair_meam_sw_spline.rst create mode 100644 doc/rst/pair_meamc.rst create mode 100644 doc/rst/pair_meso.rst create mode 100644 doc/rst/pair_mgpt.rst create mode 100644 doc/rst/pair_mie.rst create mode 100644 doc/rst/pair_mm3_switch3_coulgauss.rst create mode 100644 doc/rst/pair_modify.rst create mode 100644 doc/rst/pair_momb.rst create mode 100644 doc/rst/pair_morse.rst create mode 100644 doc/rst/pair_multi_lucy.rst create mode 100644 doc/rst/pair_multi_lucy_rx.rst create mode 100644 doc/rst/pair_nb3b_harmonic.rst create mode 100644 doc/rst/pair_nm.rst create mode 100644 doc/rst/pair_none.rst create mode 100644 doc/rst/pair_oxdna.rst create mode 100644 doc/rst/pair_oxdna2.rst create mode 100644 doc/rst/pair_peri.rst create mode 100644 doc/rst/pair_polymorphic.rst create mode 100644 doc/rst/pair_python.rst create mode 100644 doc/rst/pair_quip.rst create mode 100644 doc/rst/pair_reaxc.rst create mode 100644 doc/rst/pair_resquared.rst create mode 100644 doc/rst/pair_sdk.rst create mode 100644 doc/rst/pair_sdpd_taitwater_isothermal.rst create mode 100644 doc/rst/pair_smd_hertz.rst create mode 100644 doc/rst/pair_smd_tlsph.rst create mode 100644 doc/rst/pair_smd_triangulated_surface.rst create mode 100644 doc/rst/pair_smd_ulsph.rst create mode 100644 doc/rst/pair_smtbq.rst create mode 100644 doc/rst/pair_snap.rst create mode 100644 doc/rst/pair_soft.rst create mode 100644 doc/rst/pair_sph_heatconduction.rst create mode 100644 doc/rst/pair_sph_idealgas.rst create mode 100644 doc/rst/pair_sph_lj.rst create mode 100644 doc/rst/pair_sph_rhosum.rst create mode 100644 doc/rst/pair_sph_taitwater.rst create mode 100644 doc/rst/pair_sph_taitwater_morris.rst create mode 100644 doc/rst/pair_spin_dipole.rst create mode 100644 doc/rst/pair_spin_dmi.rst create mode 100644 doc/rst/pair_spin_exchange.rst create mode 100644 doc/rst/pair_spin_magelec.rst create mode 100644 doc/rst/pair_spin_neel.rst create mode 100644 doc/rst/pair_srp.rst create mode 100644 doc/rst/pair_style.rst create mode 100644 doc/rst/pair_sw.rst create mode 100644 doc/rst/pair_table.rst create mode 100644 doc/rst/pair_table_rx.rst create mode 100644 doc/rst/pair_tersoff.rst create mode 100644 doc/rst/pair_tersoff_mod.rst create mode 100644 doc/rst/pair_tersoff_zbl.rst create mode 100644 doc/rst/pair_thole.rst create mode 100644 doc/rst/pair_tri_lj.rst create mode 100644 doc/rst/pair_ufm.rst create mode 100644 doc/rst/pair_vashishta.rst create mode 100644 doc/rst/pair_write.rst create mode 100644 doc/rst/pair_yukawa.rst create mode 100644 doc/rst/pair_yukawa_colloid.rst create mode 100644 doc/rst/pair_zbl.rst create mode 100644 doc/rst/pair_zero.rst create mode 100644 doc/rst/pairs.rst create mode 100644 doc/rst/partition.rst create mode 100644 doc/rst/prd.rst create mode 100644 doc/rst/print.rst create mode 100644 doc/rst/processors.rst create mode 100644 doc/rst/python.rst create mode 100644 doc/rst/quit.rst create mode 100644 doc/rst/read_data.rst create mode 100644 doc/rst/read_dump.rst create mode 100644 doc/rst/read_restart.rst create mode 100644 doc/rst/region.rst create mode 100644 doc/rst/replicate.rst create mode 100644 doc/rst/rerun.rst create mode 100644 doc/rst/reset_ids.rst create mode 100644 doc/rst/reset_timestep.rst create mode 100644 doc/rst/restart.rst create mode 100644 doc/rst/run.rst create mode 100644 doc/rst/run_style.rst create mode 100644 doc/rst/server.rst create mode 100644 doc/rst/server_mc.rst create mode 100644 doc/rst/server_md.rst create mode 100644 doc/rst/set.rst create mode 100644 doc/rst/shell.rst create mode 100644 doc/rst/special_bonds.rst create mode 100644 doc/rst/suffix.rst create mode 100644 doc/rst/tad.rst create mode 100644 doc/rst/temper.rst create mode 100644 doc/rst/temper_grem.rst create mode 100644 doc/rst/temper_npt.rst create mode 100644 doc/rst/thermo.rst create mode 100644 doc/rst/thermo_modify.rst create mode 100644 doc/rst/thermo_style.rst create mode 100644 doc/rst/timer.rst create mode 100644 doc/rst/timestep.rst create mode 100644 doc/rst/uncompute.rst create mode 100644 doc/rst/undump.rst create mode 100644 doc/rst/unfix.rst create mode 100644 doc/rst/units.rst create mode 100644 doc/rst/variable.rst create mode 100644 doc/rst/velocity.rst create mode 100644 doc/rst/write_coeff.rst create mode 100644 doc/rst/write_data.rst create mode 100644 doc/rst/write_dump.rst create mode 100644 doc/rst/write_restart.rst diff --git a/doc/.gitignore b/doc/.gitignore index 88679898a8..ca450f00f9 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -6,3 +6,5 @@ /LAMMPS.mobi /Manual.pdf /Developer.pdf +/doctrees +/docenv diff --git a/doc/Makefile b/doc/Makefile index 5c679440b8..4e8b361fdc 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -2,7 +2,7 @@ SHELL = /bin/bash SHA1 = $(shell echo ${USER}-${PWD} | python utils/sha1sum.py) -BUILDDIR = /tmp/lammps-docs-$(SHA1) +BUILDDIR = ${PWD} RSTDIR = $(BUILDDIR)/rst VENV = $(BUILDDIR)/docenv TXT2RST = $(VENV)/bin/txt2rst @@ -31,7 +31,7 @@ SPHINXEXTRA = -j $(shell $(PYTHON) -c 'import multiprocessing;print(multiprocess SOURCES=$(filter-out $(wildcard src/lammps_commands*.txt) src/lammps_support.txt src/lammps_tutorials.txt,$(wildcard src/*.txt)) OBJECTS=$(SOURCES:src/%.txt=$(RSTDIR)/%.rst) -.PHONY: help clean-all clean epub mobi html pdf old venv spelling anchor_check +.PHONY: help clean-all clean epub mobi rst html pdf old venv spelling anchor_check # ------------------------------------------ @@ -53,19 +53,22 @@ help: # ------------------------------------------ clean-all: clean - rm -rf $(BUILDDIR)/* utils/txt2html/txt2html.exe + rm -rf $(BUILDDIR)/docenv $(BUILDDIR)/doctrees utils/txt2html/txt2html.exe clean: - rm -rf $(RSTDIR) html old epub latex + rm -rf $(RSTDIR)/{Eqs,JPG,*.rst} html old epub latex rm -rf spelling clean-spelling: rm -rf spelling +rst: clean $(OBJECTS) $(ANCHORCHECK) + html: $(OBJECTS) $(ANCHORCHECK) @(\ . $(VENV)/bin/activate ;\ - cp -r src/* $(RSTDIR)/ ;\ + cp -r src/JPG $(RSTDIR)/ ;\ + cp -r src/Eqs $(RSTDIR)/ ;\ sphinx-build $(SPHINXEXTRA) -b html -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) html ;\ echo "############################################" ;\ doc_anchor_check src/*.txt ;\ @@ -88,7 +91,6 @@ spelling: $(OBJECTS) utils/sphinx-config/false_positives.txt @(\ . $(VENV)/bin/activate ;\ pip install sphinxcontrib-spelling ;\ - cp -r src/* $(RSTDIR)/ ;\ cp utils/sphinx-config/false_positives.txt $(RSTDIR)/ ;\ sphinx-build -b spelling -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) spelling ;\ deactivate ;\ @@ -102,7 +104,6 @@ epub: $(OBJECTS) @cp src/JPG/*.* epub/JPG @(\ . $(VENV)/bin/activate ;\ - cp -r src/* $(RSTDIR)/ ;\ sphinx-build $(SPHINXEXTRA) -b epub -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) epub ;\ deactivate ;\ ) @@ -125,7 +126,6 @@ pdf: $(OBJECTS) $(ANCHORCHECK) ) @(\ . $(VENV)/bin/activate ;\ - cp -r src/* $(RSTDIR)/ ;\ sphinx-build $(SPHINXEXTRA) -b latex -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) latex ;\ echo "############################################" ;\ doc_anchor_check src/*.txt ;\ diff --git a/doc/rst/.gitignore b/doc/rst/.gitignore new file mode 100644 index 0000000000..be126ab4aa --- /dev/null +++ b/doc/rst/.gitignore @@ -0,0 +1,2 @@ +Eqs +JPG diff --git a/doc/rst/Build.rst b/doc/rst/Build.rst new file mode 100644 index 0000000000..2eba3ddd48 --- /dev/null +++ b/doc/rst/Build.rst @@ -0,0 +1,28 @@ +Build LAMMPS +************ + +LAMMPS can be built as an executable or library from source code via +either traditional makefiles (which may require manual editing) +for use with GNU make or gmake, or a build environment generated by CMake +(Unix Makefiles, Xcode, Visual Studio, KDevelop or more). As an +alternative you can download a package with pre-built executables +as described on the :doc:`Install ` doc page. + + +.. toctree:: + :maxdepth: 1 + + Build_cmake + Build_make + Build_link + Build_basics + Build_settings + Build_package + Build_extras + Build_windows + Build_development + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/rst/Build_basics.rst b/doc/rst/Build_basics.rst new file mode 100644 index 0000000000..0f454994a5 --- /dev/null +++ b/doc/rst/Build_basics.rst @@ -0,0 +1,437 @@ +Basic build options +=================== + +The following topics are covered on this page, for building both with +CMake and make: + +* :ref:`Serial vs parallel build ` +* :ref:`Choice of compiler and compile/link options ` +* :ref:`Build LAMMPS as an executable or a library ` +* :ref:`Build the LAMMPS documentation ` +* :ref:`Install LAMMPS after a build ` + + +---------- + + +.. _serial: + +Serial vs parallel build +------------------------------------- + +LAMMPS can be built to run in parallel using the ubiquitous `MPI (message-passing interface) `_ +library. Or it can built to run on a single processor (serial) +without MPI. It can also be built with support for OpenMP threading +(see more discussion below). + +**CMake variables**\ : + + +.. parsed-literal:: + + -D BUILD_MPI=value # yes or no, default is yes if CMake finds MPI, else no + -D BUILD_OMP=value # yes or no (default) + -D LAMMPS_MACHINE=name # name = mpi, serial, mybox, titan, laptop, etc + # no default value + +The executable created by CMake (after running make) is lmp\_name. If +the LAMMPS\_MACHINE variable is not specified, the executable is just +lmp. Using BUILD\_MPI=no will produce a serial executable. + +**Traditional make**\ : + + +.. parsed-literal:: + + cd lammps/src + make mpi # parallel build, produces lmp_mpi using Makefile.mpi + make serial # serial build, produces lmp_serial using Makefile/serial + make mybox # uses Makefile.mybox to produce lmp_mybox + +Serial build (see src/MAKE/Makefile.serial): + + +.. parsed-literal:: + + MPI_INC = -I../STUBS + MPI_PATH = -L../STUBS + MPI_LIB = -lmpi_stubs + +For a parallel build, if MPI is installed on your system in the usual +place (e.g. under /usr/local), you do not need to specify the 3 +variables MPI\_INC, MPI\_PATH, MPI\_LIB. The MPI wrapper on the compiler +(e.g. mpicxx, mpiCC) knows where to find the needed include and +library files. Failing this, these 3 variables can be used to specify +where the mpi.h file (MPI\_INC), and the MPI library files (MPI\_PATH) +are found, and the name of the library files (MPI\_LIB). + +For a serial build, you need to specify the 3 variables, as shown +above. + +For a serial LAMMPS build, use the dummy MPI library provided in +src/STUBS. You also need to build the STUBS library for your platform +before making LAMMPS itself. A "make serial" build does this for. +Otherwise, type "make mpi-stubs" from the src directory, or "make" +from the src/STUBS dir. If the build fails, you will need to edit the +STUBS/Makefile for your platform. + +The file STUBS/mpi.c provides a CPU timer function called MPI\_Wtime() +that calls gettimeofday() . If your system doesn't support +gettimeofday() , you'll need to insert code to call another timer. +Note that the ANSI-standard function clock() rolls over after an hour +or so, and is therefore insufficient for timing long LAMMPS +simulations. + +**CMake and make info**\ : + +If you are installing MPI yourself, we recommend MPICH2 from Argonne +National Laboratory or OpenMPI. MPICH can be downloaded from the +`Argonne MPI site `_. +OpenMPI can be downloaded from the `OpenMPI site `_. Other MPI packages should also work. +If you are running on a large parallel machine, your system admins or +the vendor should have already installed a version of MPI, which is +likely to be faster than a self-installed MPICH or OpenMPI, so find +out how to build and link with it. + +The majority of OpenMP (threading) support in LAMMPS is provided by +the USER-OMP package; see the :doc:`Speed omp ` doc page for +details. The USER-INTEL package also provides OpenMP support (it is +compatible with USER-OMP) and adds vectorization support when compiled +with the Intel compilers on top of that. Also, the KOKKOS package can +be compiled for using OpenMP threading. + +However, there are a few commands in LAMMPS that have native OpenMP +support. These are commands in the MPIIO, SNAP, USER-DIFFRACTION, and +USER-DPD packages. In addition some packages support OpenMP threading +indirectly through the libraries they interface to: e.g. LATTE and +USER-COLVARS. See the :doc:`Packages details ` doc +page for more info on these packages and the doc pages for their +respective commands for OpenMP threading info. + +For CMake, if you use BUILD\_OMP=yes, you can use these packages and +turn on their native OpenMP support and turn on their native OpenMP +support at run time, by setting the OMP\_NUM\_THREADS environment +variable before you launch LAMMPS. + +For building via conventional make, the CCFLAGS and LINKFLAGS +variables in Makefile.machine need to include the compiler flag that +enables OpenMP. For GNU compilers it is -fopenmp. For (recent) Intel +compilers it is -qopenmp. If you are using a different compiler, +please refer to its documentation. + +.. _default-none-issues: + +**OpenMP Compiler compatibility info**\ : + +Some compilers do not fully support the 'default(none)' directive +and others (e.g. GCC version 9 and beyond) may implement OpenMP 4.0 +semantics, which are incompatible with the OpenMP 3.1 directives used +in LAMMPS (for maximal compatibility with compiler versions in use). +In those case, all 'default(none)' directives (which aid in detecting +incorrect and unwanted sharing) can be replaced with 'default(shared)' +while dropping all 'shared()' directives. The script +'src/USER-OMP/hack\_openmp\_for\_pgi\_gcc9.sh' can be used to automate +this conversion. + + +---------- + + +.. _compile: + +Choice of compiler and compile/link options +--------------------------------------------------------- + +The choice of compiler and compiler flags can be important for +performance. Vendor compilers can produce faster code than +open-source compilers like GNU. On boxes with Intel CPUs, we suggest +trying the `Intel C++ compiler `_. + +.. _intel: https://software.intel.com/en-us/intel-compilers + + + +On parallel clusters or supercomputers which use "modules" for their +compile/link environments, you can often access different compilers by +simply loading the appropriate module before building LAMMPS. + +**CMake variables**\ : + + +.. parsed-literal:: + + -D CMAKE_CXX_COMPILER=name # name of C++ compiler + -D CMAKE_C_COMPILER=name # name of C compiler + -D CMAKE_Fortran_COMPILER=name # name of Fortran compiler + + -D CMAKE_CXX_FLAGS=string # flags to use with C++ compiler + -D CMAKE_C_FLAGS=string # flags to use with C compiler + -D CMAKE_Fortran_FLAGS=string # flags to use with Fortran compiler + +By default CMake will use a compiler it finds and it will add +optimization flags appropriate to that compiler and any :doc:`accelerator packages ` you have included in the build. + +You can tell CMake to look for a specific compiler with these variable +settings. Likewise you can specify the FLAGS variables if you want to +experiment with alternate optimization flags. You should specify all +3 compilers, so that the small number of LAMMPS source files written +in C or Fortran are built with a compiler consistent with the one used +for all the C++ files: + + +.. parsed-literal:: + + Building with GNU Compilers: + cmake ../cmake -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++ -DCMAKE_Fortran_COMPILER=gfortran + Building with Intel Compilers: + cmake ../cmake -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc -DCMAKE_Fortran_COMPILER=ifort + Building with LLVM/Clang Compilers: + cmake ../cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_Fortran_COMPILER=flang + +.. note:: + + When the cmake command completes, it prints info to the screen + as to which compilers it is using, and what flags will be used in the + compilation. Note that if the top-level compiler is mpicxx, it is + simply a wrapper on a real compiler. The underlying compiler info is + what will be listed in the CMake output. You should check to insure + you are using the compiler and optimization flags are the ones you + want. + +**Makefile.machine settings**\ : + +Parallel build (see src/MAKE/Makefile.mpi): + + +.. parsed-literal:: + + CC = mpicxx + CCFLAGS = -g -O3 + LINK = mpicxx + LINKFLAGS = -g -O + +Serial build (see src/MAKE/Makefile.serial): + + +.. parsed-literal:: + + CC = g++ + CCFLAGS = -g -O3 + LINK = g++ + LINKFLAGS = -g -O + +The "compiler/linker settings" section of a Makefile.machine lists +compiler and linker settings for your C++ compiler, including +optimization flags. You should always use mpicxx or mpiCC for +a parallel build, since these compiler wrappers will include +a variety of settings appropriate for your MPI installation. + +.. note:: + + If you build LAMMPS with any :doc:`accelerator packages ` included, they have specific + optimization flags that are either required or recommended for optimal + performance. You need to include these in the CCFLAGS and LINKFLAGS + settings above. For details, see the individual package doc pages + listed on the :doc:`Speed packages ` doc page. Or + examine these files in the src/MAKE/OPTIONS directory. They + correspond to each of the 5 accelerator packages and their hardware + variants: + + +.. parsed-literal:: + + Makefile.opt # OPT package + Makefile.omp # USER-OMP package + Makefile.intel_cpu # USER-INTEL package for CPUs + Makefile.intel_coprocessor # USER-INTEL package for KNLs + Makefile.gpu # GPU package + Makefile.kokkos_cuda_mpi # KOKKOS package for GPUs + Makefile.kokkos_omp # KOKKOS package for CPUs (OpenMP) + Makefile.kokkos_phi # KOKKOS package for KNLs (OpenMP) + + +---------- + + +.. _exe: + +Build LAMMPS as an executable or a library +---------------------------------------------------- + +LAMMPS can be built as either an executable or as a static or shared +library. The LAMMPS library can be called from another application or +a scripting language. See the :doc:`Howto couple ` doc +page for more info on coupling LAMMPS to other codes. See the +:doc:`Python ` doc page for more info on wrapping and +running LAMMPS from Python via its library interface. + +**CMake variables**\ : + + +.. parsed-literal:: + + -D BUILD_EXE=value # yes (default) or no + -D BUILD_LIB=value # yes or no (default) + -D BUILD_SHARED_LIBS=value # yes or no (default) + -D LAMMPS_LIB_SUFFIX=name # name = mpi, serial, mybox, titan, laptop, etc + # no default value + +Setting BUILD\_EXE=no will not produce an executable. Setting +BUILD\_LIB=yes will produce a static library named liblammps.a. +Setting both BUILD\_LIB=yes and BUILD\_SHARED\_LIBS=yes will produce a +shared library named liblammps.so. If LAMMPS\_LIB\_SUFFIX is set the generated +libraries will be named liblammps\_name.a or liblammps\_name.so instead. + +**Traditional make**\ : + + +.. parsed-literal:: + + cd lammps/src + make machine # build LAMMPS executable lmp_machine + make mode=lib machine # build LAMMPS static lib liblammps_machine.a + make mode=shlib machine # build LAMMPS shared lib liblammps_machine.so + +The two library builds also create generic soft links, named +liblammps.a and liblammps.so, which point to the liblammps\_machine +files. + +**CMake and make info**\ : + +Note that for a shared library to be usable by a calling program, all +the auxiliary libraries it depends on must also exist as shared +libraries. This will be the case for libraries included with LAMMPS, +such as the dummy MPI library in src/STUBS or any package libraries in +the lib/packages directory, since they are always built as shared +libraries using the -fPIC switch. However, if a library like MPI or +FFTW does not exist as a shared library, the shared library build will +generate an error. This means you will need to install a shared +library version of the auxiliary library. The build instructions for +the library should tell you how to do this. + +As an example, here is how to build and install the `MPICH library `_, a popular open-source version of MPI, distributed by +Argonne National Lab, as a shared library in the default +/usr/local/lib location: + +.. _mpich: http://www-unix.mcs.anl.gov/mpi + + + + +.. parsed-literal:: + + ./configure --enable-shared + make + make install + +You may need to use "sudo make install" in place of the last line if +you do not have write privileges for /usr/local/lib. The end result +should be the file /usr/local/lib/libmpich.so. + + +---------- + + +.. _doc: + +Build the LAMMPS documentation +---------------------------------------- + +**CMake variable**\ : + + +.. parsed-literal:: + + -D BUILD_DOC=value # yes or no (default) + +This will create the HTML doc pages within the CMake build directory. +The reason to do this is if you want to "install" LAMMPS on a system +after the CMake build via "make install", and include the doc pages in +the install. + +**Traditional make**\ : + + +.. parsed-literal:: + + cd lammps/doc + make html # html doc pages + make pdf # single Manual.pdf file + +This will create a lammps/doc/html dir with the HTML doc pages so that +you can browse them locally on your system. Type "make" from the +lammps/doc dir to see other options. + +.. note:: + + You can also download a tarball of the documentation for the + current LAMMPS version (HTML and PDF files), from the website + `download page `_. + + +---------- + + +.. _tools: + +Build LAMMPS tools +------------------------------ + +Some tools described in :doc:`Auxiliary tools ` can be built directly +using CMake or Make. + +**CMake variable**\ : + + +.. parsed-literal:: + + -D BUILD_TOOLS=value # yes or no (default) + +The generated binaries will also become part of the LAMMPS installation (see below) + +**Traditional make**\ : + + +.. parsed-literal:: + + cd lammps/tools + make all # build all binaries of tools + make binary2txt # build only binary2txt tool + make chain # build only chain tool + make micelle2d # build only micelle2d tool + make thermo_extract # build only thermo_extract tool + + +---------- + + +.. _install: + +Install LAMMPS after a build +------------------------------------------ + +After building LAMMPS, you may wish to copy the LAMMPS executable of +library, along with other LAMMPS files (library header, doc files) to +a globally visible place on your system, for others to access. Note +that you may need super-user privileges (e.g. sudo) if the directory +you want to copy files to is protected. + +**CMake variable**\ : + + +.. parsed-literal:: + + cmake -D CMAKE_INSTALL_PREFIX=path [options ...] ../cmake + make # perform make after CMake command + make install # perform the installation into prefix + +**Traditional make**\ : + +There is no "install" option in the src/Makefile for LAMMPS. If you +wish to do this you will need to first build LAMMPS, then manually +copy the desired LAMMPS files to the appropriate system directories. + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/rst/Build_cmake.rst b/doc/rst/Build_cmake.rst new file mode 100644 index 0000000000..78459bb990 --- /dev/null +++ b/doc/rst/Build_cmake.rst @@ -0,0 +1,245 @@ +Build LAMMPS with CMake +======================= + +This page is a short summary of how to use CMake to build LAMMPS. +Details on CMake variables that enable specific LAMMPS build options +are given on the pages linked to from the :doc:`Build ` doc page. + +Richard Berger (Temple U) has also written a `more comprehensive guide `_ +for how to use CMake to build LAMMPS. If you are new to CMake it is a +good place to start. + + +---------- + + +Building LAMMPS with CMake is a two-step process. First you use CMake +to create a build environment in a new directory. On Linux systems, +this will be based on makefiles for use with make. Then you use the +make command to build LAMMPS, which uses the created +Makefile(s). Example: + + +.. parsed-literal:: + + cd lammps # change to the LAMMPS distribution directory + mkdir build; cd build # create a new directory (folder) for build + cmake [options ...] ../cmake # configuration with (command-line) cmake + make # compilation + +The cmake command will detect available features, enable selected +packages and options, and will generate the build environment. By default +this build environment will be created for "Unix Makefiles" on most +platforms and particularly on Linux. However, alternate build tools +(e.g. Ninja) and support files for Integrated Development Environments +(IDE) like Eclipse, CodeBlocks, or Kate can be generated, too. This is +selected via the "-G" command line flag. For the rest of the documentation +we will assume that the build environment is generated for makefiles +and thus the make command will be used to compile and link LAMMPS as +indicated above, producing (by default) an executable called "lmp" and +a library called "liblammps.a" in the "build" folder. When generating +a build environment for the "Ninja" build tool, the build command would +be "ninja" instead of "make". + +If your machine has multiple CPU cores (most do these days), using a +command like "make -jN" (with N being the number of available local +CPU cores) can be much faster. If you plan to do development on +LAMMPS or need to re-compile LAMMPS repeatedly, installation of the +ccache (= Compiler Cache) software may speed up repeated compilation +even more. + +After compilation, you may optionally install the LAMMPS executable into +your system with: + + +.. parsed-literal:: + + make install # optional, copy LAMMPS executable & library elsewhere + +This will install the lammps executable and library (if requested), some +tools (if configured) and additional files like library API headers, +manpages, potential and force field files. The location of the installation +tree is set by the CMake variable "CMAKE\_INSTALL\_PREFIX" which defaults +to ${HOME}/.local + + +---------- + + +There are 3 variants of CMake: a command-line version (cmake), a text mode +UI version (ccmake), and a graphical GUI version (cmake-GUI). You can use +any of them interchangeably to configure and create the LAMMPS build +environment. On Linux all the versions produce a Makefile as their +output. See more details on each below. + +You can specify a variety of options with any of the 3 versions, which +affect how the build is performed and what is included in the LAMMPS +executable. Links to pages explaining all the options are listed on +the :doc:`Build ` doc page. + +You must perform the CMake build system generation and compilation in +a new directory you create. It can be anywhere on your local machine. +In these Build pages we assume that you are building in a directory +called "lammps/build". You can perform separate builds independently +with different options, so long as you perform each of them in a +separate directory you create. All the auxiliary files created by one +build process (executable, object files, log files, etc) are stored in +this directory or sub-directories within it that CMake creates. + +.. note:: + + To perform a CMake build, no packages can be installed or a + build been previously attempted in the LAMMPS src directory by using + "make" commands to :doc:`perform a conventional LAMMPS build `. CMake detects if this is the case and + generates an error, telling you to type "make no-all purge" in the src + directory to un-install all packages. The purge removes all the \*.h + files auto-generated by make. + +You must have CMake version 2.8 or later on your system to build +LAMMPS. A handful of LAMMPS packages (KOKKOS, LATTE, MSCG) require a +later version. CMake will print a message telling you if a later +version is required. Installation instructions for CMake are below. + +After the initial build, if you edit LAMMPS source files, or add your +own new files to the source directory, you can just re-type make from +your build directory and it will re-compile only the files that have +changed. If you want to change CMake options you can run cmake (or +ccmake or cmake-gui) again from the same build directory and alter +various options; see details below. Or you can remove the entire build +folder, recreate the directory and start over. + + +---------- + + +**Command-line version of CMake**\ : + + +.. parsed-literal:: + + cmake [options ...] /path/to/lammps/cmake # build from any dir + cmake [options ...] ../cmake # build from lammps/build + +The cmake command takes one required argument, which is the LAMMPS +cmake directory which contains the CMakeLists.txt file. + +The argument can be preceeded or followed by various CMake +command-line options. Several useful ones are: + + +.. parsed-literal:: + + -D CMAKE_INSTALL_PREFIX=path # where to install LAMMPS executable/lib if desired + -D CMAKE_BUILD_TYPE=type # type = RelWithDebInfo (default), Release, MinSizeRel, or Debug + -G output # style of output CMake generates + -DVARIABLE=value # setting for a LAMMPS feature to enable + -D VARIABLE=value # ditto, but cannot come after CMakeLists.txt dir + -C path/to/preset/file # load some CMake settings before configuring + +All the LAMMPS-specific -D variables that a LAMMPS build supports are +described on the pages linked to from the :doc:`Build ` doc page. +All of these variable names are upper-case and their values are +lower-case, e.g. -D LAMMPS\_SIZES=smallbig. For boolean values, any of +these forms can be used: yes/no, on/off, 1/0. + +On Unix/Linux machines, CMake generates a Makefile by default to +perform the LAMMPS build. Alternate forms of build info can be +generated via the -G switch, e.g. Visual Studio on a Windows machine, +Xcode on MacOS, or KDevelop on Linux. Type "cmake --help" to see the +"Generator" styles of output your system supports. + +.. note:: + + When CMake runs, it prints configuration info to the screen. + You should review this to verify all the features you requested were + enabled, including packages. You can also see what compilers and + compile options will be used for the build. Any errors in CMake + variable syntax will also be flagged, e.g. mis-typed variable names or + variable values. + +CMake creates a CMakeCache.txt file when it runs. This stores all the +settings, so that when running CMake again you can use the current +folder '.' instead of the path to the LAMMPS cmake folder as the +required argument to the CMake command. Either way the existing +settings will be inherited unless the CMakeCache.txt file is removed. + +If you later want to change a setting you can rerun cmake in the build +directory with different setting. Please note that some automatically +detected variables will not change their value when you rerun cmake. +In these cases it is usually better to first remove all the +files/directories in the build directory, or start with a fresh build +directory. + + +---------- + + +**Curses version (terminal-style menu) of CMake**\ : + + +.. parsed-literal:: + + ccmake ../cmake + +You initiate the configuration and build environment generation steps +separately. For the first you have to type **c**\ , for the second you +have to type **g**\ . You may need to type **c** multiple times, and may be +required to edit some of the entries of CMake configuration variables +in between. Please see the `ccmake manual `_ for +more information. + + +---------- + + +**GUI version of CMake**\ : + + +.. parsed-literal:: + + cmake-gui ../cmake + +You initiate the configuration and build environment generation steps +separately. For the first you have to click on the **Configure** button, +for the second you have to click on the **Generate** button. You may +need to click on **Configure** multiple times, and may be required to +edit some of the entries of CMake configuration variables in between. +Please see the `cmake-gui manual `_ +for more information. + + +---------- + + +**Installing CMake** + +Check if your machine already has CMake installed: + + +.. parsed-literal:: + + which cmake # do you have it? + which cmake3 # version 3 may have this name + cmake --version # what specific version you have + +On clusters or supercomputers which use environment modules to manage +software packages, do this: + + +.. parsed-literal:: + + module list # is a cmake module already loaded? + module avail # is a cmake module available? + module load cmake3 # load cmake module with appropriate name + +Most Linux distributions offer pre-compiled cmake packages through +their package management system. If you do not have CMake or a new +enough version, you can download the latest version at +`https://cmake.org/download/ `_. +Instructions on how to install it on various platforms can be found +`on this page `_. + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/rst/Build_development.rst b/doc/rst/Build_development.rst new file mode 100644 index 0000000000..7286caf7b3 --- /dev/null +++ b/doc/rst/Build_development.rst @@ -0,0 +1,120 @@ +Development build options (CMake only) +====================================== + +The CMake build of LAMMPS has a few extra options which are useful during +development, testing or debugging. + + +---------- + + +.. _compilation: + +Verify compilation flags +------------------------------------------ + +Sometimes it is necessary to verify the complete sequence of compilation flags +generated by the CMake build. To enable a more verbose output during +compilation you can use the following option. + + +.. parsed-literal:: + + -D CMAKE_VERBOSE_MAKEFILE=value # value = no (default) or yes + +Another way of doing this without reconfiguration is calling make with variable VERBOSE set to 1: + + +.. parsed-literal:: + + make VERBOSE=1 + + +---------- + + +.. _sanitizer: + +Address, Undefined Behavior, and Thread Sanitizer Support +------------------------------------------------------------------------- + +Compilers such as GCC and Clang support generating binaries which use different +sanitizers to detect problems in code during run-time. They can detect `memory leaks `_, +code that runs into `undefined behavior `_ of the +language and `data races `_ in threaded code. + +The following settings allow you enable these features if your compiler supports +it. Please note that they come with a performance hit. However, they are +usually faster than using tools like Valgrind. + + +.. parsed-literal:: + + -D ENABLE_SANITIZE_ADDRESS=value # enable Address Sanitizer, value = no (default) or yes + -D ENABLE_SANITIZE_UNDEFINED=value # enable Undefined Behaviour Sanitizer, value = no (default) or yes + -D ENABLE_SANITIZE_THREAD=value # enable Thread Sanitizer, value = no (default) or yes + + +---------- + + +.. _testing: + +Code Coverage and Testing +--------------------------------------- + +We do extensive regression testing of the LAMMPS code base on a continuous +basis. Some of the logic to do this has been added to the CMake build so +developers can run the tests directly on their workstation. + +.. note:: + + this is incomplete and only represents a small subset of tests that we run + + +.. parsed-literal:: + + -D ENABLE_TESTING=value # enable simple run tests of LAMMPS, value = no (default) or yes + -D LAMMPS_TESTING_SOURCE_DIR=path # path to lammps-testing repository (option if in custom location) + -D LAMMPS_TESTING_GIT_TAG=value # version of lammps-testing repository that should be used, value = master (default) or custom git commit or tag + +If you enable testing in the CMake build it will create an additional target called "test". You can run them with: + + +.. parsed-literal:: + + make test + +The test cases used come from the lammps-testing repository. They are +derivatives of the examples folder with some modifications to make the run +faster. + +You can also collect code coverage metrics while running the tests by enabling +coverage support during building. + + +.. parsed-literal:: + + -D ENABLE_COVERAGE=value # enable coverage measurements, value = no (default) or yes + +This will also add the following targets to generate coverage reports after running the LAMMPS executable: + + +.. parsed-literal:: + + make test # run tests first! + make gen_coverage_html # generate coverage report in HTML format + make gen_coverage_xml # generate coverage report in XML format + +These reports require GCOVR to be installed. The easiest way to do this to install it via pip: + + +.. parsed-literal:: + + pip install git+https://github.com/gcovr/gcovr.git + + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/rst/Build_extras.rst b/doc/rst/Build_extras.rst new file mode 100644 index 0000000000..88b4bc2764 --- /dev/null +++ b/doc/rst/Build_extras.rst @@ -0,0 +1,1369 @@ +Packages with extra build options +================================= + +When building with some packages, additional steps may be required, +in addition to: + + +.. parsed-literal:: + + -D PKG_NAME=yes # CMake + make yes-name # make + +as described on the :doc:`Build\_package ` doc page. + +For a CMake build there may be additional optional or required +variables to set. For a build with make, a provided library under the +lammps/lib directory may need to be built first. Or an external +library may need to exist on your system or be downloaded and built. +You may need to tell LAMMPS where it is found on your system. + +This is the list of packages that may require additional steps. + ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ +| :ref:`COMPRESS ` | :ref:`GPU ` | :ref:`KIM ` | :ref:`KOKKOS ` | :ref:`LATTE ` | :ref:`MESSAGE ` | ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ +| :ref:`MSCG ` | :ref:`OPT ` | :ref:`POEMS ` | :ref:`PYTHON ` | :ref:`VORONOI ` | :ref:`USER-ADIOS ` | ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ +| :ref:`USER-ATC ` | :ref:`USER-AWPMD ` | :ref:`USER-COLVARS ` | :ref:`USER-H5MD ` | :ref:`USER-INTEL ` | :ref:`USER-MOLFILE ` | ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ +| :ref:`USER-NETCDF ` | :ref:`USER-PLUMED ` | :ref:`USER-OMP ` | :ref:`USER-QMMM ` | :ref:`USER-QUIP ` | :ref:`USER-SCAFACOS ` | ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ +| :ref:`USER-SMD ` | :ref:`USER-VTK ` | | | | | ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ + + +---------- + + +.. _compress: + +COMPRESS package +------------------------------- + +To build with this package you must have the zlib compression library +available on your system. + +**CMake build**\ : + +If CMake cannot find the library, you can set these variables: + + +.. parsed-literal:: + + -D ZLIB_INCLUDE_DIR=path # path to zlib.h header file + -D ZLIB_LIBRARIES=path # path to libz.a (.so) file + +**Traditional make**\ : + +If make cannot find the library, you can edit the +lib/compress/Makefile.lammps file to specify the paths and library +name. + + +---------- + + +.. _gpu: + +GPU package +--------------------- + +To build with this package, you must choose options for precision and +which GPU hardware to build for. + +**CMake build**\ : + + +.. parsed-literal:: + + -D GPU_API=value # value = opencl (default) or cuda + -D GPU_PREC=value # precision setting + # value = double or mixed (default) or single + -D OCL_TUNE=value # hardware choice for GPU_API=opencl + # generic (default) or intel (Intel CPU) or fermi, kepler, cypress (NVIDIA) + -D GPU_ARCH=value # primary GPU hardware choice for GPU_API=cuda + # value = sm_XX, see below + # default is sm_30 + -D CUDPP_OPT=value # optimization setting for GPU_API=cuda + # enables CUDA Performance Primitives Optimizations + # value = yes (default) or no + -D CUDA_MPS_SUPPORT=value # enables some tweaks required to run with active nvidia-cuda-mps daemon + # value = yes or no (default) + +GPU\_ARCH settings for different GPU hardware is as follows: + +* sm\_12 or sm\_13 for GT200 (supported by CUDA 3.2 until CUDA 6.5) +* sm\_20 or sm\_21 for Fermi (supported by CUDA 3.2 until CUDA 7.5) +* sm\_30 or sm\_35 or sm\_37 for Kepler (supported since CUDA 5) +* sm\_50 or sm\_52 for Maxwell (supported since CUDA 6) +* sm\_60 or sm\_61 for Pascal (supported since CUDA 8) +* sm\_70 for Volta (supported since CUDA 9) +* sm\_75 for Turing (supported since CUDA 10) + +A more detailed list can be found, for example, +at `Wikipedia's CUDA article `_ + +CMake can detect which version of the CUDA toolkit is used and thus can +include support for **all** major GPU architectures supported by this toolkit. +Thus the GPU\_ARCH setting is merely an optimization, to have code for +the preferred GPU architecture directly included rather than having to wait +for the JIT compiler of the CUDA driver to translate it. + +**Traditional make**\ : + +Before building LAMMPS, you must build the GPU library in lib/gpu. +You can do this manually if you prefer; follow the instructions in +lib/gpu/README. Note that the GPU library uses MPI calls, so you must +use the same MPI library (or the STUBS library) settings as the main +LAMMPS code. This also applies to the -DLAMMPS\_BIGBIG, +-DLAMMPS\_SMALLBIG, or -DLAMMPS\_SMALLSMALL settings in whichever +Makefile you use. + +You can also build the library in one step from the lammps/src dir, +using a command like these, which simply invoke the lib/gpu/Install.py +script with the specified args: + + +.. parsed-literal:: + + make lib-gpu # print help message + make lib-gpu args="-b" # build GPU library with default Makefile.linux + make lib-gpu args="-m xk7 -p single -o xk7.single" # create new Makefile.xk7.single, altered for single-precision + make lib-gpu args="-m mpi -a sm_60 -p mixed -b" # build GPU library with mixed precision and P100 using other settings in Makefile.mpi + +Note that this procedure starts with a Makefile.machine in lib/gpu, as +specified by the "-m" switch. For your convenience, machine makefiles +for "mpi" and "serial" are provided, which have the same settings as +the corresponding machine makefiles in the main LAMMPS source +folder. In addition you can alter 4 important settings in the +Makefile.machine you start from via the corresponding -c, -a, -p, -e +switches (as in the examples above), and also save a copy of the new +Makefile if desired: + +* CUDA\_HOME = where NVIDIA CUDA software is installed on your system +* CUDA\_ARCH = sm\_XX, what GPU hardware you have, same as CMake GPU\_ARCH above +* CUDA\_PRECISION = precision (double, mixed, single) +* EXTRAMAKE = which Makefile.lammps.\* file to copy to Makefile.lammps + +The file Makefile.linux\_multi is set up to include support for multiple +GPU architectures as supported by the CUDA toolkit in use. This is done +through using the "--gencode " flag, which can be used multiple times and +thus support all GPU architectures supported by your CUDA compiler. + +If the library build is successful, 3 files should be created: +lib/gpu/libgpu.a, lib/gpu/nvc\_get\_devices, and +lib/gpu/Makefile.lammps. The latter has settings that enable LAMMPS +to link with CUDA libraries. If the settings in Makefile.lammps for +your machine are not correct, the LAMMPS build will fail, and +lib/gpu/Makefile.lammps may need to be edited. + +.. note:: + + If you re-build the GPU library in lib/gpu, you should always + un-install the GPU package in lammps/src, then re-install it and + re-build LAMMPS. This is because the compilation of files in the GPU + package uses the library settings from the lib/gpu/Makefile.machine + used to build the GPU library. + + +---------- + + +.. _kim: + +KIM package +--------------------- + +To build with this package, the KIM library with API v2 must be downloaded +and built on your system. It must include the KIM models that you want to +use with LAMMPS. If you want to use the :doc:`kim\_query ` +command, you also need to have libcurl installed with the matching +development headers and the curl-config tool. + +See `Obtaining KIM Models `_ to +learn how to install a pre-build binary of the OpenKIM Repository of Models. +See the list of all KIM models here: https://openkim.org/browse/models + +(Also note that when downloading and installing from source +the KIM API library with all its models, may take a long time (tens of +minutes to hours) to build. Of course you only need to do that once.) + +**CMake build**\ : + + +.. parsed-literal:: + + -D DOWNLOAD_KIM=value # download OpenKIM API v2 for build, value = no (default) or yes + +If DOWNLOAD\_KIM is set, the KIM library will be downloaded and built +inside the CMake build directory. If the KIM library is already on +your system (in a location CMake cannot find it), set the PKG\_CONFIG\_PATH +environment variable so that libkim-api can be found. + +**Traditional make**\ : + +You can download and build the KIM library manually if you prefer; +follow the instructions in lib/kim/README. You can also do it in one +step from the lammps/src dir, using a command like these, which simply +invoke the lib/kim/Install.py script with the specified args. + + +.. parsed-literal:: + + make lib-kim # print help message + make lib-kim args="-b " # (re-)install KIM API lib with only example models + make lib-kim args="-b -a Glue_Ercolessi_Adams_Al__MO_324507536345_001" # ditto plus one model + make lib-kim args="-b -a everything" # install KIM API lib with all models + make lib-kim args="-n -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # add one model or model driver + make lib-kim args="-p /usr/local" # use an existing KIM API installation at the provided location + make lib-kim args="-p /usr/local -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # ditto but add one model or driver + + +---------- + + +.. _kokkos: + +KOKKOS package +--------------------------- + +To build with this package, you must choose which hardware you want to +build for, either CPUs (multi-threading via OpenMP) or KNLs (OpenMP) +or GPUs (NVIDIA Cuda). + +For a CMake or make build, these are the possible choices for the +KOKKOS\_ARCH settings described below. Note that for CMake, these are +really Kokkos variables, not LAMMPS variables. Hence you must use +case-sensitive values, e.g. BDW, not bdw. + +* ARMv80 = ARMv8.0 Compatible CPU +* ARMv81 = ARMv8.1 Compatible CPU +* ARMv8-ThunderX = ARMv8 Cavium ThunderX CPU +* BGQ = IBM Blue Gene/Q CPUs +* Power8 = IBM POWER8 CPUs +* Power9 = IBM POWER9 CPUs +* SNB = Intel Sandy/Ivy Bridge CPUs +* HSW = Intel Haswell CPUs +* BDW = Intel Broadwell Xeon E-class CPUs +* SKX = Intel Sky Lake Xeon E-class HPC CPUs (AVX512) +* KNC = Intel Knights Corner Xeon Phi +* KNL = Intel Knights Landing Xeon Phi +* Kepler30 = NVIDIA Kepler generation CC 3.0 +* Kepler32 = NVIDIA Kepler generation CC 3.2 +* Kepler35 = NVIDIA Kepler generation CC 3.5 +* Kepler37 = NVIDIA Kepler generation CC 3.7 +* Maxwell50 = NVIDIA Maxwell generation CC 5.0 +* Maxwell52 = NVIDIA Maxwell generation CC 5.2 +* Maxwell53 = NVIDIA Maxwell generation CC 5.3 +* Pascal60 = NVIDIA Pascal generation CC 6.0 +* Pascal61 = NVIDIA Pascal generation CC 6.1 +* Volta70 = NVIDIA Volta generation CC 7.0 +* Volta72 = NVIDIA Volta generation CC 7.2 +* Turing75 = NVIDIA Turing generation CC 7.5 + +**CMake build**\ : + +For multicore CPUs using OpenMP, set these 2 variables. + + +.. parsed-literal:: + + -D KOKKOS_ARCH=archCPU # archCPU = CPU from list above + -D KOKKOS_ENABLE_OPENMP=yes + +For Intel KNLs using OpenMP, set these 2 variables: + + +.. parsed-literal:: + + -D KOKKOS_ARCH=KNL + -D KOKKOS_ENABLE_OPENMP=yes + +For NVIDIA GPUs using CUDA, set these 4 variables: + + +.. parsed-literal:: + + -D KOKKOS_ARCH="archCPU;archGPU" # archCPU = CPU from list above that is hosting the GPU + # archGPU = GPU from list above + -D KOKKOS_ENABLE_CUDA=yes + -D KOKKOS_ENABLE_OPENMP=yes + -D CMAKE_CXX_COMPILER=wrapper # wrapper = full path to Cuda nvcc wrapper + +The wrapper value is the Cuda nvcc compiler wrapper provided in the +Kokkos library: lib/kokkos/bin/nvcc\_wrapper. The setting should +include the full path name to the wrapper, e.g. + + +.. parsed-literal:: + + -D CMAKE_CXX_COMPILER=/home/username/lammps/lib/kokkos/bin/nvcc_wrapper + +**Traditional make**\ : + +Choose which hardware to support in Makefile.machine via +KOKKOS\_DEVICES and KOKKOS\_ARCH settings. See the +src/MAKE/OPTIONS/Makefile.kokkos\* files for examples. + +For multicore CPUs using OpenMP: + + +.. parsed-literal:: + + KOKKOS_DEVICES = OpenMP + KOKKOS_ARCH = archCPU # archCPU = CPU from list above + +For Intel KNLs using OpenMP: + + +.. parsed-literal:: + + KOKKOS_DEVICES = OpenMP + KOKKOS_ARCH = KNL + +For NVIDIA GPUs using CUDA: + + +.. parsed-literal:: + + KOKKOS_DEVICES = Cuda + KOKKOS_ARCH = archCPU,archGPU # archCPU = CPU from list above that is hosting the GPU + # archGPU = GPU from list above + +For GPUs, you also need these 2 lines in your Makefile.machine before +the CC line is defined, in this case for use with OpenMPI mpicxx. The +2 lines define a nvcc wrapper compiler, which will use nvcc for +compiling CUDA files and use a C++ compiler for non-Kokkos, non-CUDA +files. + + +.. parsed-literal:: + + KOKKOS_ABSOLUTE_PATH = $(shell cd $(KOKKOS_PATH); pwd) + export OMPI_CXX = $(KOKKOS_ABSOLUTE_PATH)/config/nvcc_wrapper + CC = mpicxx + + +---------- + + +.. _latte: + +LATTE package +------------------------- + +To build with this package, you must download and build the LATTE +library. + +**CMake build**\ : + + +.. parsed-literal:: + + -D DOWNLOAD_LATTE=value # download LATTE for build, value = no (default) or yes + -D LATTE_LIBRARY=path # LATTE library file (only needed if a custom location) + +If DOWNLOAD\_LATTE is set, the LATTE library will be downloaded and +built inside the CMake build directory. If the LATTE library is +already on your system (in a location CMake cannot find it), +LATTE\_LIBRARY is the filename (plus path) of the LATTE library file, +not the directory the library file is in. + +**Traditional make**\ : + +You can download and build the LATTE library manually if you prefer; +follow the instructions in lib/latte/README. You can also do it in +one step from the lammps/src dir, using a command like these, which +simply invokes the lib/latte/Install.py script with the specified +args: + + +.. parsed-literal:: + + make lib-latte # print help message + make lib-latte args="-b" # download and build in lib/latte/LATTE-master + make lib-latte args="-p $HOME/latte" # use existing LATTE installation in $HOME/latte + make lib-latte args="-b -m gfortran" # download and build in lib/latte and + # copy Makefile.lammps.gfortran to Makefile.lammps + +Note that 3 symbolic (soft) links, "includelink" and "liblink" and +"filelink.o", are created in lib/latte to point into the LATTE home +dir. When LAMMPS itself is built it will use these links. You should +also check that the Makefile.lammps file you create is appropriate for +the compiler you use on your system to build LATTE. + + +---------- + + +.. _message: + +MESSAGE package +----------------------------- + +This package can optionally include support for messaging via sockets, +using the open-source `ZeroMQ library `_, which must +be installed on your system. + +**CMake build**\ : + + +.. parsed-literal:: + + -D MESSAGE_ZMQ=value # build with ZeroMQ support, value = no (default) or yes + -D ZMQ_LIBRARY=path # ZMQ library file (only needed if a custom location) + -D ZMQ_INCLUDE_DIR=path # ZMQ include directory (only needed if a custom location) + +**Traditional make**\ : + +Before building LAMMPS, you must build the CSlib library in +lib/message. You can build the CSlib library manually if you prefer; +follow the instructions in lib/message/README. You can also do it in +one step from the lammps/src dir, using a command like these, which +simply invoke the lib/message/Install.py script with the specified args: + + +.. parsed-literal:: + + make lib-message # print help message + make lib-message args="-m -z" # build with MPI and socket (ZMQ) support + make lib-message args="-s" # build as serial lib with no ZMQ support + +The build should produce two files: lib/message/cslib/src/libmessage.a +and lib/message/Makefile.lammps. The latter is copied from an +existing Makefile.lammps.\* and has settings to link with the ZeroMQ +library if requested in the build. + + +---------- + + +.. _mscg: + +MSCG package +----------------------- + +To build with this package, you must download and build the MS-CG +library. Building the MS-CG library and using it from LAMMPS requires +a C++11 compatible compiler and that the GSL (GNU Scientific Library) +headers and libraries are installed on your machine. See the +lib/mscg/README and MSCG/Install files for more details. + +**CMake build**\ : + + +.. parsed-literal:: + + -D DOWNLOAD_MSCG=value # download MSCG for build, value = no (default) or yes + -D MSCG_LIBRARY=path # MSCG library file (only needed if a custom location) + -D MSCG_INCLUDE_DIR=path # MSCG include directory (only needed if a custom location) + +If DOWNLOAD\_MSCG is set, the MSCG library will be downloaded and built +inside the CMake build directory. If the MSCG library is already on +your system (in a location CMake cannot find it), MSCG\_LIBRARY is the +filename (plus path) of the MSCG library file, not the directory the +library file is in. MSCG\_INCLUDE\_DIR is the directory the MSCG +include file is in. + +**Traditional make**\ : + +You can download and build the MS-CG library manually if you prefer; +follow the instructions in lib/mscg/README. You can also do it in one +step from the lammps/src dir, using a command like these, which simply +invoke the lib/mscg/Install.py script with the specified args: + + +.. parsed-literal:: + + make lib-mscg # print help message + make lib-mscg args="-b -m serial" # download and build in lib/mscg/MSCG-release-master + # with the settings compatible with "make serial" + make lib-mscg args="-b -m mpi" # download and build in lib/mscg/MSCG-release-master + # with the settings compatible with "make mpi" + make lib-mscg args="-p /usr/local/mscg-release" # use the existing MS-CG installation in /usr/local/mscg-release + +Note that 2 symbolic (soft) links, "includelink" and "liblink", will +be created in lib/mscg to point to the MS-CG src/installation dir. +When LAMMPS is built in src it will use these links. You should not +need to edit the lib/mscg/Makefile.lammps file. + + +---------- + + +.. _opt: + +OPT package +--------------------- + +**CMake build**\ : + +No additional settings are needed besides "-D PKG\_OPT=yes". + +**Traditional make**\ : + +The compile flag "-restrict" must be used to build LAMMPS with the OPT +package when using Intel compilers. It should be added to the CCFLAGS +line of your Makefile.machine. See src/MAKE/OPTIONS/Makefile.opt for +an example. + + +---------- + + +.. _poems: + +POEMS package +------------------------- + +**CMake build**\ : + +No additional settings are needed besides "-D PKG\_OPT=yes". + +**Traditional make**\ : + +Before building LAMMPS, you must build the POEMS library in lib/poems. +You can do this manually if you prefer; follow the instructions in +lib/poems/README. You can also do it in one step from the lammps/src +dir, using a command like these, which simply invoke the +lib/poems/Install.py script with the specified args: + + +.. parsed-literal:: + + make lib-poems # print help message + make lib-poems args="-m serial" # build with GNU g++ compiler (settings as with "make serial") + make lib-poems args="-m mpi" # build with default MPI C++ compiler (settings as with "make mpi") + make lib-poems args="-m icc" # build with Intel icc compiler + +The build should produce two files: lib/poems/libpoems.a and +lib/poems/Makefile.lammps. The latter is copied from an existing +Makefile.lammps.\* and has settings needed to build LAMMPS with the +POEMS library (though typically the settings are just blank). If +necessary, you can edit/create a new lib/poems/Makefile.machine file +for your system, which should define an EXTRAMAKE variable to specify +a corresponding Makefile.lammps.machine file. + + +---------- + + +.. _python: + +PYTHON package +--------------------------- + +Building with the PYTHON package requires you have a Python shared +library available on your system, which needs to be a Python 2 +version, 2.6 or later. Python 3 is not yet supported. See +lib/python/README for more details. + +**CMake build**\ : + + +.. parsed-literal:: + + -D PYTHON_EXECUTABLE=path # path to Python executable to use + +Without this setting, CMake will guess the default Python on your +system. To use a different Python version, you can either create a +virtualenv, activate it and then run cmake. Or you can set the +PYTHON\_EXECUTABLE variable to specify which Python interpreter should +be used. Note note that you will also need to have the development +headers installed for this version, e.g. python2-devel. + +**Traditional make**\ : + +The build uses the lib/python/Makefile.lammps file in the compile/link +process to find Python. You should only need to create a new +Makefile.lammps.\* file (and copy it to Makefile.lammps) if the LAMMPS +build fails. + + +---------- + + +.. _voronoi: + +VORONOI package +----------------------------- + +To build with this package, you must download and build the `Voro++ library `_. + +.. _voro-home: http://math.lbl.gov/voro++ + + + +**CMake build**\ : + + +.. parsed-literal:: + + -D DOWNLOAD_VORO=value # download Voro++ for build, value = no (default) or yes + -D VORO_LIBRARY=path # Voro++ library file (only needed if at custom location) + -D VORO_INCLUDE_DIR=path # Voro++ include directory (only needed if at custom location) + +If DOWNLOAD\_VORO is set, the Voro++ library will be downloaded and +built inside the CMake build directory. If the Voro++ library is +already on your system (in a location CMake cannot find it), +VORO\_LIBRARY is the filename (plus path) of the Voro++ library file, +not the directory the library file is in. VORO\_INCLUDE\_DIR is the +directory the Voro++ include file is in. + +**Traditional make**\ : + +You can download and build the Voro++ library manually if you prefer; +follow the instructions in lib/voronoi/README. You can also do it in +one step from the lammps/src dir, using a command like these, which +simply invoke the lib/voronoi/Install.py script with the specified +args: + + +.. parsed-literal:: + + make lib-voronoi # print help message + make lib-voronoi args="-b" # download and build the default version in lib/voronoi/voro++- + make lib-voronoi args="-p $HOME/voro++" # use existing Voro++ installation in $HOME/voro++ + make lib-voronoi args="-b -v voro++0.4.6" # download and build the 0.4.6 version in lib/voronoi/voro++-0.4.6 + +Note that 2 symbolic (soft) links, "includelink" and "liblink", are +created in lib/voronoi to point to the Voro++ src dir. When LAMMPS +builds in src it will use these links. You should not need to edit +the lib/voronoi/Makefile.lammps file. + + +---------- + + +.. _user-adios: + +USER-ADIOS package +----------------------------------- + +The USER-ADIOS package requires the `ADIOS I/O library `_, +version 2.3.1 or newer. Make sure that you have ADIOS built either with or +without MPI to match if you build LAMMPS with or without MPI. +ADIOS compilation settings for LAMMPS are automatically detected, if the PATH +and LD\_LIBRARY\_PATH environment variables have been updated for the local ADIOS +installation and the instructions below are followed for the respective build systems. + +**CMake build**\ : + + +.. parsed-literal:: + + -D ADIOS2_DIR=path # path is where ADIOS 2.x is installed + -D PKG_USER-ADIOS=yes + +**Traditional make**\ : + +Turn on the USER-ADIOS package before building LAMMPS. If the ADIOS 2.x software is installed in PATH, there is nothing else to do: + + +.. parsed-literal:: + + make yes-user-adios + +otherwise, set ADIOS2\_DIR environment variable when turning on the package: + + +.. parsed-literal:: + + ADIOS2_DIR=path make yes-user-adios # path is where ADIOS 2.x is installed + + +---------- + + +.. _user-atc: + +USER-ATC package +------------------------------- + +The USER-ATC package requires the MANYBODY package also be installed. + +**CMake build**\ : + +No additional settings are needed besides "-D PKG\_USER-ATC=yes" +and "-D PKG\_MANYBODY=yes". + +**Traditional make**\ : + +Before building LAMMPS, you must build the ATC library in lib/atc. +You can do this manually if you prefer; follow the instructions in +lib/atc/README. You can also do it in one step from the lammps/src +dir, using a command like these, which simply invoke the +lib/atc/Install.py script with the specified args: + + +.. parsed-literal:: + + make lib-atc # print help message + make lib-atc args="-m serial" # build with GNU g++ compiler and MPI STUBS (settings as with "make serial") + make lib-atc args="-m mpi" # build with default MPI compiler (settings as with "make mpi") + make lib-atc args="-m icc" # build with Intel icc compiler + +The build should produce two files: lib/atc/libatc.a and +lib/atc/Makefile.lammps. The latter is copied from an existing +Makefile.lammps.\* and has settings needed to build LAMMPS with the ATC +library. If necessary, you can edit/create a new +lib/atc/Makefile.machine file for your system, which should define an +EXTRAMAKE variable to specify a corresponding Makefile.lammps.machine +file. + +Note that the Makefile.lammps file has settings for the BLAS and +LAPACK linear algebra libraries. As explained in lib/atc/README these +can either exist on your system, or you can use the files provided in +lib/linalg. In the latter case you also need to build the library in +lib/linalg with a command like these: + + +.. parsed-literal:: + + make lib-linalg # print help message + make lib-linalg args="-m serial" # build with GNU Fortran compiler (settings as with "make serial") + make lib-linalg args="-m mpi" # build with default MPI Fortran compiler (settings as with "make mpi") + make lib-linalg args="-m gfortran" # build with GNU Fortran compiler + + +---------- + + +.. _user-awpmd: + +USER-AWPMD package +----------------------------------- + +**CMake build**\ : + +No additional settings are needed besides "-D PKG\_USER-AQPMD=yes". + +**Traditional make**\ : + +Before building LAMMPS, you must build the AWPMD library in lib/awpmd. +You can do this manually if you prefer; follow the instructions in +lib/awpmd/README. You can also do it in one step from the lammps/src +dir, using a command like these, which simply invoke the +lib/awpmd/Install.py script with the specified args: + + +.. parsed-literal:: + + make lib-awpmd # print help message + make lib-awpmd args="-m serial" # build with GNU g++ compiler and MPI STUBS (settings as with "make serial") + make lib-awpmd args="-m mpi" # build with default MPI compiler (settings as with "make mpi") + make lib-awpmd args="-m icc" # build with Intel icc compiler + +The build should produce two files: lib/awpmd/libawpmd.a and +lib/awpmd/Makefile.lammps. The latter is copied from an existing +Makefile.lammps.\* and has settings needed to build LAMMPS with the +AWPMD library. If necessary, you can edit/create a new +lib/awpmd/Makefile.machine file for your system, which should define +an EXTRAMAKE variable to specify a corresponding +Makefile.lammps.machine file. + +Note that the Makefile.lammps file has settings for the BLAS and +LAPACK linear algebra libraries. As explained in lib/awpmd/README +these can either exist on your system, or you can use the files +provided in lib/linalg. In the latter case you also need to build the +library in lib/linalg with a command like these: + + +.. parsed-literal:: + + make lib-linalg # print help message + make lib-linalg args="-m serial" # build with GNU Fortran compiler (settings as with "make serial") + make lib-linalg args="-m mpi" # build with default MPI Fortran compiler (settings as with "make mpi") + make lib-linalg args="-m gfortran" # build with GNU Fortran compiler + + +---------- + + +.. _user-colvars: + +USER-COLVARS package +--------------------------------------- + +**CMake build**\ : + +No additional settings are needed besides "-D PKG\_USER-COLVARS=yes". + +**Traditional make**\ : + +Before building LAMMPS, you must build the COLVARS library in +lib/colvars. You can do this manually if you prefer; follow the +instructions in lib/colvars/README. You can also do it in one step +from the lammps/src dir, using a command like these, which simply +invoke the lib/colvars/Install.py script with the specified args: + + +.. parsed-literal:: + + make lib-colvars # print help message + make lib-colvars args="-m serial" # build with GNU g++ compiler (settings as with "make serial") + make lib-colvars args="-m mpi" # build with default MPI compiler (settings as with "make mpi") + make lib-colvars args="-m g++-debug" # build with GNU g++ compiler and colvars debugging enabled + +The build should produce two files: lib/colvars/libcolvars.a and +lib/colvars/Makefile.lammps. The latter is copied from an existing +Makefile.lammps.\* and has settings needed to build LAMMPS with the +COLVARS library (though typically the settings are just blank). If +necessary, you can edit/create a new lib/colvars/Makefile.machine file +for your system, which should define an EXTRAMAKE variable to specify +a corresponding Makefile.lammps.machine file. + + +---------- + + +.. _user-plumed: + +USER-PLUMED package +------------------------------------- + +.. _plumedinstall: http://plumed.github.io/doc-master/user-doc/html/\_installation.html + +Before building LAMMPS with this package, you must first build PLUMED. +PLUMED can be built as part of the LAMMPS build or installed separately +from LAMMPS using the generic `plumed installation instructions `_. + + +PLUMED can be linked into MD codes in three different modes: static, +shared, and runtime. With the "static" mode, all the code that PLUMED +requires is linked statically into LAMMPS. LAMMPS is then fully +independent from the PLUMED installation, but you have to rebuild/relink +it in order to update the PLUMED code inside it. With the "shared" +linkage mode, LAMMPS is linked to a shared library that contains the +PLUMED code. This library should preferably be installed in a globally +accessible location. When PLUMED is linked in this way the same library +can be used by multiple MD packages. Furthermore, the PLUMED library +LAMMPS uses can be updated without the need for a recompile of LAMMPS +for as long as the shared PLUMED library is ABI-compatible. + +The third linkage mode is "runtime" which allows the user to specify +which PLUMED kernel should be used at runtime by using the PLUMED\_KERNEL +environment variable. This variable should point to the location of the +libplumedKernel.so dynamical shared object, which is then loaded at +runtime. This mode of linking is particularly convenient for doing +PLUMED development and comparing multiple PLUMED versions as these sorts +of comparisons can be done without recompiling the hosting MD code. All +three linkage modes are supported by LAMMPS on selected operating +systems (e.g. Linux) and using either CMake or traditional make +build. The "static" mode should be the most portable, while the +"runtime" mode support in LAMMPS makes the most assumptions about +operating system and compiler environment. If one mode does not work, +try a different one, switch to a different build system, consider a +global PLUMED installation or consider downloading PLUMED during the +LAMMPS build. + +**CMake build**\ : + +When the "-D PKG\_USER-PLUMED" flag is included in the cmake command you +must ensure that GSL is installed in locations that are specified in +your environment. There are then two additional commands that control +the manner in which PLUMED is obtained and linked into LAMMPS. + + +.. parsed-literal:: + + -D DOWNLOAD_PLUMED=value # download PLUMED for build, value = no (default) or yes + -D PLUMED_MODE=value # Linkage mode for PLUMED, value = static (default), shared, or runtime + +If DOWNLOAD\_PLUMED is set to "yes", the PLUMED library will be +downloaded (the version of PLUMED that will be downloaded is hard-coded +to a vetted version of PLUMED, usually a recent stable release version) +and built inside the CMake build directory. If DOWNLOAD\_PLUMED is set +to "no" (the default), CMake will try to detect and link to an installed +version of PLUMED. For this to work, the PLUMED library has to be +installed into a location where the pkg-config tool can find it or the +PKG\_CONFIG\_PATH environment variable has to be set up accordingly. +PLUMED should be installed in such a location if you compile it using +the default make; make install commands. + +The PLUMED\_MODE setting determines the linkage mode for the PLUMED +library. The allowed values for this flag are "static" (default), +"shared", or "runtime". For a discussion of PLUMED linkage modes, +please see above. When DOWNLOAD\_PLUMED is enabled the static linkage +mode is recommended. + +**Traditional make**\ : + +PLUMED needs to be installed before the USER-PLUMED package is installed +so that LAMMPS can find the right settings when compiling and linking +the LAMMPS executable. You can either download and build PLUMED inside +the LAMMPS plumed library folder or use a previously installed PLUMED +library and point LAMMPS to its location. You also have to choose the +linkage mode: "static" (default), "shared" or "runtime". For a +discussion of PLUMED linkage modes, please see above. + +Download/compilation/configuration of the plumed library can be done +from the src folder through the following make args: + + +.. parsed-literal:: + + make lib-plumed # print help message + make lib-plumed args="-b" # download and build PLUMED in lib/plumed/plumed2 + make lib-plumed args="-p $HOME/.local" # use existing PLUMED installation in $HOME/.local + make lib-plumed args="-p /usr/local -m shared" # use existing PLUMED installation in + # /usr/local and use shared linkage mode + +Note that 2 symbolic (soft) links, "includelink" and "liblink" are +created in lib/plumed that point to the location of the PLUMED build to +use. A new file lib/plumed/Makefile.lammps is also created with settings +suitable for LAMMPS to compile and link PLUMED using the desired linkage +mode. After this step is completed, you can install the USER-PLUMED +package and compile LAMMPS in the usual manner: + + +.. parsed-literal:: + + make yes-user-plumed + make machine + +Once this compilation completes you should be able to run LAMMPS in the +usual way. For shared linkage mode, libplumed.so must be found by the +LAMMPS executable, which on many operating systems means, you have to +set the LD\_LIBRARY\_PATH environment variable accordingly. + +Support for the different linkage modes in LAMMPS varies for different +operating systems, using the static linkage is expected to be the most +portable, and thus set to be the default. + +If you want to change the linkage mode, you have to re-run "make +lib-plumed" with the desired settings **and** do a re-install if the +USER-PLUMED package with "make yes-user-plumed" to update the required +makefile settings with the changes in the lib/plumed folder. + + +---------- + + +.. _user-h5md: + +USER-H5MD package +--------------------------------- + +To build with this package you must have the HDF5 software package +installed on your system, which should include the h5cc compiler and +the HDF5 library. + +**CMake build**\ : + +No additional settings are needed besides "-D PKG\_USER-H5MD=yes". + +This should auto-detect the H5MD library on your system. Several +advanced CMake H5MD options exist if you need to specify where it is +installed. Use the ccmake (terminal window) or cmake-gui (graphical) +tools to see these options and set them interactively from their user +interfaces. + +**Traditional make**\ : + +Before building LAMMPS, you must build the CH5MD library in lib/h5md. +You can do this manually if you prefer; follow the instructions in +lib/h5md/README. You can also do it in one step from the lammps/src +dir, using a command like these, which simply invoke the +lib/h5md/Install.py script with the specified args: + + +.. parsed-literal:: + + make lib-h5md # print help message + make lib-hm5d args="-m h5cc" # build with h5cc compiler + +The build should produce two files: lib/h5md/libch5md.a and +lib/h5md/Makefile.lammps. The latter is copied from an existing +Makefile.lammps.\* and has settings needed to build LAMMPS with the +system HDF5 library. If necessary, you can edit/create a new +lib/h5md/Makefile.machine file for your system, which should define an +EXTRAMAKE variable to specify a corresponding Makefile.lammps.machine +file. + + +---------- + + +.. _user-intel: + +USER-INTEL package +----------------------------------- + +To build with this package, you must choose which hardware you want to +build for, either x86 CPUs or Intel KNLs in offload mode. You should +also typically :ref:`install the USER-OMP package `, as it can be +used in tandem with the USER-INTEL package to good effect, as explained +on the :doc:`Speed intel ` doc page. + +**CMake build**\ : + + +.. parsed-literal:: + + -D INTEL_ARCH=value # value = cpu (default) or knl + -D INTEL_LRT_MODE=value # value = threads, none, or c++11 + +In Long-range thread mode (LRT) a modified verlet style is used, that +operates the Kspace calculation in a separate thread concurrently to +other calculations. This has to be enabled in the :doc:`package intel ` +command at runtime. With the setting "threads" it used the pthreads +library, while c++11 will use the built-in thread support of C++11 +compilers. The option "none" skips compilation of this feature. The +default is to use "threads" if pthreads is available and otherwise "none". + +Best performance is achieved with Intel hardware, Intel compilers, as well as +the Intel TBB and MKL libraries. However, the code also compiles, links, and +runs with other compilers and without TBB and MKL. + +**Traditional make**\ : + +Choose which hardware to compile for in Makefile.machine via the +following settings. See src/MAKE/OPTIONS/Makefile.intel\_cpu\* and +Makefile.knl files for examples. and src/USER-INTEL/README for +additional information. + +For CPUs: + + +.. parsed-literal:: + + OPTFLAGS = -xHost -O2 -fp-model fast=2 -no-prec-div -qoverride-limits -qopt-zmm-usage=high + CCFLAGS = -g -qopenmp -DLAMMPS_MEMALIGN=64 -no-offload -fno-alias -ansi-alias -restrict $(OPTFLAGS) + LINKFLAGS = -g -qopenmp $(OPTFLAGS) + LIB = -ltbbmalloc + +For KNLs: + + +.. parsed-literal:: + + OPTFLAGS = -xMIC-AVX512 -O2 -fp-model fast=2 -no-prec-div -qoverride-limits + CCFLAGS = -g -qopenmp -DLAMMPS_MEMALIGN=64 -no-offload -fno-alias -ansi-alias -restrict $(OPTFLAGS) + LINKFLAGS = -g -qopenmp $(OPTFLAGS) + LIB = -ltbbmalloc + + +---------- + + +.. _user-molfile: + +USER-MOLFILE package +--------------------------------------- + +**CMake build**\ : + + +.. parsed-literal:: + + -D MOLFILE_INCLUDE_DIRS=path # (optional) path where VMD molfile plugin headers are installed + -D PKG_USER-MOLFILE=yes + +Using "-D PKG\_USER-MOLFILE=yes" enables the package, and setting +"-D MOLFILE\_INCLUDE DIRS" allows to provide a custom location for +the molfile plugin header files. These should match the ABI of the +plugin files used, and thus one typically sets them to include +folder of the local VMD installation in use. LAMMPS ships with a +couple of default header files that correspond to a popular VMD +version, usually the latest release. + +**Traditional make**\ : + +The lib/molfile/Makefile.lammps file has a setting for a dynamic +loading library libdl.a that is typically present on all systems. It +is required for LAMMPS to link with this package. If the setting is +not valid for your system, you will need to edit the Makefile.lammps +file. See lib/molfile/README and lib/molfile/Makefile.lammps for +details. It is also possible to configure a different folder with +the VMD molfile plugin header files. LAMMPS ships with a couple of +default headers, but these are not compatible with all VMD versions, +so it is often best to change this setting to the location of the +same include files of the local VMD installation in use. + + +---------- + + +.. _user-netcdf: + +USER-NETCDF package +------------------------------------- + +To build with this package you must have the NetCDF library installed +on your system. + +**CMake build**\ : + +No additional settings are needed besides "-D PKG\_USER-NETCDF=yes". + +This should auto-detect the NETCDF library if it is installed on your +system at standard locations. Several advanced CMake NETCDF options +exist if you need to specify where it was installed. Use the ccmake +(terminal window) or cmake-gui (graphical) tools to see these options +and set them interactively from their user interfaces. + +**Traditional make**\ : + +The lib/netcdf/Makefile.lammps file has settings for NetCDF include +and library files which LAMMPS needs to build with this package. If +the settings are not valid for your system, you will need to edit the +Makefile.lammps file. See lib/netcdf/README for details. + + +---------- + + +.. _user-omp: + +USER-OMP package +------------------------------- + +**CMake build**\ : + +No additional settings are required besides "-D PKG\_USER-OMP=yes". If +CMake detects OpenMP support, the USER-OMP code will be compiled with +multi-threading support enabled, otherwise as optimized serial code. + +**Traditional make**\ : + +To enable multi-threading support in the USER-OMP package (and other +styles supporting OpenMP) the following compile and link flags must +be added to your Makefile.machine file. +See src/MAKE/OPTIONS/Makefile.omp for an example. + + +.. parsed-literal:: + + CCFLAGS: -fopenmp # for GNU Compilers + CCFLAGS: -qopenmp -restrict # for Intel compilers on Linux + LINKFLAGS: -fopenmp # for GNU Compilers + LINKFLAGS: -qopenmp # for Intel compilers on Linux + +For other platforms and compilers, please consult the documentation +about OpenMP support for your compiler. Please see the note about +how to address compatibility :ref:`issues with the 'default(none)' directive ` of some compilers. + + +---------- + + +.. _user-qmmm: + +USER-QMMM package +--------------------------------- + +.. note:: + + The LAMMPS executable these steps produce is not yet functional + for a QM/MM simulation. You must also build Quantum ESPRESSO and + create a new executable (pwqmmm.x) which links LAMMPS and Quantum + ESPRESSO together. These are steps 3 and 4 described in the + lib/qmmm/README file. Unfortunately, the Quantum ESPRESSO developers + have been breaking the interface that the QM/MM code in LAMMPS is using, + so that currently (Summer 2018) using this feature requires either + correcting the library interface feature in recent Quantum ESPRESSO + releases, or using an outdated version of QE. The last version of + Quantum ESPRESSO known to work with this QM/MM interface was version + 5.4.1 from 2016. + +**CMake build**\ : + +The CMake build system currently does not support building the full +QM/MM-capable hybrid executable of LAMMPS and QE called pwqmmm.x. +You must use the traditional make build for this package. + +**Traditional make**\ : + +Before building LAMMPS, you must build the QMMM library in lib/qmmm. +You can do this manually if you prefer; follow the first two steps +explained in lib/qmmm/README. You can also do it in one step from the +lammps/src dir, using a command like these, which simply invoke the +lib/qmmm/Install.py script with the specified args: + + +.. parsed-literal:: + + make lib-qmmm # print help message + make lib-qmmm args="-m serial" # build with GNU Fortran compiler (settings as in "make serial") + make lib-qmmm args="-m mpi" # build with default MPI compiler (settings as in "make mpi") + make lib-qmmm args="-m gfortran" # build with GNU Fortran compiler + +The build should produce two files: lib/qmmm/libqmmm.a and +lib/qmmm/Makefile.lammps. The latter is copied from an existing +Makefile.lammps.\* and has settings needed to build LAMMPS with the +QMMM library (though typically the settings are just blank). If +necessary, you can edit/create a new lib/qmmm/Makefile.machine file +for your system, which should define an EXTRAMAKE variable to specify +a corresponding Makefile.lammps.machine file. + +You can then install QMMM package and build LAMMPS in the usual +manner. After completing the LAMMPS build and compiling Quantum +ESPRESSO with external library support, go back to the lib/qmmm folder +and follow the instructions on the README file to build the combined +LAMMPS/QE QM/MM executable (pwqmmm.x) in the lib/qmmm folder. + + +---------- + + +.. _user-quip: + +USER-QUIP package +--------------------------------- + +To build with this package, you must download and build the QUIP +library. It can be obtained from GitHub. For support of GAP +potentials, additional files with specific licensing conditions need +to be downloaded and configured. See step 1 and step 1.1 in the +lib/quip/README file for details on how to do this. + +**CMake build**\ : + + +.. parsed-literal:: + + -D QUIP_LIBRARIES=path # path to libquip.a (only needed if a custom location) + +CMake will not download and build the QUIP library. But once you have +done that, a CMake build of LAMMPS with "-D PKG\_USER-QUIP=yes" should +work. Set QUIP\_LIBRARIES if CMake cannot find the QUIP library. + +**Traditional make**\ : + +The download/build procedure for the QUIP library, described in +lib/quip/README file requires setting two environment variables, +QUIP\_ROOT and QUIP\_ARCH. These are accessed by the +lib/quip/Makefile.lammps file which is used when you compile and link +LAMMPS with this package. You should only need to edit +Makefile.lammps if the LAMMPS build can not use its settings to +successfully build on your system. + + +---------- + + +.. _user-scafacos: + +USER-SCAFACOS package +----------------------------------------- + +To build with this package, you must download and build the `ScaFaCoS Coulomb solver library `_ + +.. _scafacos-home: http://www.scafacos.de + + + +**CMake build**\ : + + +.. parsed-literal:: + + -D DOWNLOAD_SCAFACOS=value # download ScaFaCoS for build, value = no (default) or yes + -D SCAFACOS_LIBRARY=path # ScaFaCos library file (only needed if at custom location) + -D SCAFACOS_INCLUDE_DIR=path # ScaFaCoS include directory (only needed if at custom location) + +If DOWNLOAD\_SCAFACOS is set, the ScaFaCoS library will be downloaded +and built inside the CMake build directory. If the ScaFaCoS library +is already on your system (in a location CMake cannot find it), +SCAFACOS\_LIBRARY is the filename (plus path) of the ScaFaCoS library +file, not the directory the library file is in. SCAFACOS\_INCLUDE\_DIR +is the directory the ScaFaCoS include file is in. + +**Traditional make**\ : + +You can download and build the ScaFaCoS library manually if you +prefer; follow the instructions in lib/scafacos/README. You can also +do it in one step from the lammps/src dir, using a command like these, +which simply invoke the lib/scafacos/Install.py script with the +specified args: + +make lib-scafacos # print help message +make lib-scafacos args="-b" # download and build in lib/scafacos/scafacos- +make lib-scafacos args="-p $HOME/scafacos # use existing ScaFaCoS installation in $HOME/scafacos + +Note that 2 symbolic (soft) links, "includelink" and "liblink", are +created in lib/scafacos to point to the ScaFaCoS src dir. When LAMMPS +builds in src it will use these links. You should not need to edit +the lib/scafacos/Makefile.lammps file. + + +---------- + + +.. _user-smd: + +USER-SMD package +------------------------------- + +To build with this package, you must download the Eigen3 library. +Eigen3 is a template library, so you do not need to build it. + +**CMake build**\ : + + +.. parsed-literal:: + + -D DOWNLOAD_EIGEN3 # download Eigen3, value = no (default) or yes + -D EIGEN3_INCLUDE_DIR=path # path to Eigen library (only needed if a custom location) + +If DOWNLOAD\_EIGEN3 is set, the Eigen3 library will be downloaded and +inside the CMake build directory. If the Eigen3 library is already on +your system (in a location CMake cannot find it), EIGEN3\_INCLUDE\_DIR +is the directory the Eigen3++ include file is in. + +**Traditional make**\ : + +You can download the Eigen3 library manually if you prefer; follow the +instructions in lib/smd/README. You can also do it in one step from +the lammps/src dir, using a command like these, which simply invoke +the lib/smd/Install.py script with the specified args: + + +.. parsed-literal:: + + make lib-smd # print help message + make lib-smd args="-b" # download to lib/smd/eigen3 + make lib-smd args="-p /usr/include/eigen3" # use existing Eigen installation in /usr/include/eigen3 + +Note that a symbolic (soft) link named "includelink" is created in +lib/smd to point to the Eigen dir. When LAMMPS builds it will use +this link. You should not need to edit the lib/smd/Makefile.lammps +file. + + +---------- + + +.. _user-vtk: + +USER-VTK package +------------------------------- + +To build with this package you must have the VTK library installed on +your system. + +**CMake build**\ : + +No additional settings are needed besides "-D PKG\_USER-VTK=yes". + +This should auto-detect the VTK library if it is installed on your +system at standard locations. Several advanced VTK options exist if +you need to specify where it was installed. Use the ccmake (terminal +window) or cmake-gui (graphical) tools to see these options and set +them interactively from their user interfaces. + +**Traditional make**\ : + +The lib/vtk/Makefile.lammps file has settings for accessing VTK files +and its library, which LAMMPS needs to build with this package. If +the settings are not valid for your system, check if one of the other +lib/vtk/Makefile.lammps.\* files is compatible and copy it to +Makefile.lammps. If none of the provided files work, you will need to +edit the Makefile.lammps file. See lib/vtk/README for details. + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/rst/Build_link.rst b/doc/rst/Build_link.rst new file mode 100644 index 0000000000..8306fcb86f --- /dev/null +++ b/doc/rst/Build_link.rst @@ -0,0 +1,91 @@ +Link LAMMPS as a library to another code +======================================== + +LAMMPS can be used as a library by another application, including +Python scripts. The files src/library.cpp and library.h define the +C-style API for using LAMMPS as a library. See the :doc:`Howto library ` doc page for a description of the +interface and how to extend it for your needs. + +The :doc:`Build basics ` doc page explains how to build +LAMMPS as either a shared or static library. This results in one of +these 2 files: + +liblammps.so # shared library +liblammps.a # static library + + +---------- + + +**Link with LAMMPS as a static library**\ : + +The calling application can link to LAMMPS as a static library with a +link command like this: + +g++ caller.o -L/home/sjplimp/lammps/src -llammps -o caller + +The -L argument is the path to where the liblammps.a file is. The +-llammps argument is shorthand for the file liblammps.a. + + +---------- + + +**Link with LAMMPS as a shared library**\ : + +If you wish to link to liblammps.so, the operating system finds shared +libraries to load at run-time using the environment variable +LD\_LIBRARY\_PATH. To enable this you can do one of two things: + +(1) Copy the liblammps.so file to a location the system can find it, +such as /usr/local/lib. I.e. a directory already listed in your +LD\_LIBRARY\_PATH variable. You can type + + +.. parsed-literal:: + + printenv LD_LIBRARY_PATH + +to see what directories are in that list. + +(2) Add the LAMMPS src directory (or the directory you perform CMake +build in) to your LD\_LIBRARY\_PATH, so that the current version of the +shared library is always available to programs that use it. + +For the csh or tcsh shells, you would add something like this to your +~/.cshrc file: + + +.. parsed-literal:: + + setenv LD_LIBRARY_PATH ${LD_LIBRARY_PATH}:/home/sjplimp/lammps/src + + +---------- + + +**Calling the LAMMPS library**\ : + +Either flavor of library (static or shared) allows one or more LAMMPS +objects to be instantiated from the calling program. + +When used from a C++ program, all of LAMMPS is wrapped in a LAMMPS\_NS +namespace; you can safely use any of its classes and methods from +within the calling code, as needed. + +When used from a C or Fortran program, the library has a simple +C-style interface, provided in src/library.cpp and src/library.h. + +See the :doc:`Python library ` doc page for a +description of the Python interface to LAMMPS, which wraps the C-style +interface. + +See the sample codes in examples/COUPLE/simple for examples of C++ and +C and Fortran codes that invoke LAMMPS through its library interface. +Other examples in the COUPLE directory use coupling ideas discussed on +the :doc:`Howto couple ` doc page. + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/rst/Build_make.rst b/doc/rst/Build_make.rst new file mode 100644 index 0000000000..8f1966f101 --- /dev/null +++ b/doc/rst/Build_make.rst @@ -0,0 +1,94 @@ +Build LAMMPS with make +====================== + +Building LAMMPS with traditional makefiles requires that you have a +Makefile."machine" file appropriate for your system in the src/MAKE, +src/MAKE/MACHINES, src/MAKE/OPTIONS, or src/MAKE/MINE directory (see +below). It can include various options for customizing your LAMMPS +build with a number of global compilation options and features. + +To include LAMMPS packages (i.e. optional commands and styles) you +must install them first, as discussed on the :doc:`Build package ` doc page. If the packages require +provided or external libraries, you must build those libraries before +building LAMMPS. Building :doc:`LAMMPS with CMake ` can +automate all of this for many types of machines, especially +workstations, desktops and laptops, so we suggest you try it first. + +These commands perform a default LAMMPS build, producing the LAMMPS +executable lmp\_serial or lmp\_mpi in lammps/src: + + +.. parsed-literal:: + + cd lammps/src + make serial # build a serial LAMMPS executable + make mpi # build a parallel LAMMPS executable with MPI + make # see a variety of make options + +This initial compilation can take a long time, since LAMMPS is a large +project with many features. If your machine has multiple CPU cores +(most do these days), using a command like "make -jN mpi" (with N = +the number of available CPU cores) can be much faster. If you plan to +do development on LAMMPS or need to re-compile LAMMPS repeatedly, the +installation of the ccache (= Compiler Cache) software may speed up +compilation even more. + +After the initial build, whenever you edit LAMMPS source files, or add +or remove new files to the source directory (e.g. by installing or +uninstalling packages), you must re-compile and relink the LAMMPS +executable with the same "make" command. This makefiles dependencies +should insure that only the subset of files that need to be are +re-compiled. + +.. note:: + + When you build LAMMPS for the first time, a long list of \*.d + files will be printed out rapidly. This is not an error; it is the + Makefile doing its normal creation of dependencies. + + +---------- + + +The lammps/src/MAKE tree contains all the Makefile.machine files +included in the LAMMPS distribution. Typing "make machine" uses +Makefile.machine. Thus the "make serial" or "make mpi" lines above +use Makefile.serial and Makefile.mpi. Others are in these dirs: + + +.. parsed-literal:: + + OPTIONS # Makefiles which enable specific options + MACHINES # Makefiles for specific machines + MINE # customized Makefiles you create (you may need to create this folder) + +Typing "make" lists all the available Makefile.machine files. A file +with the same name can appear in multiple folders (not a good idea). +The order the dirs are searched is as follows: src/MAKE/MINE, +src/MAKE, src/MAKE/OPTIONS, src/MAKE/MACHINES. This gives preference +to a customized file you put in src/MAKE/MINE. + +Makefiles you may wish to try include these (some require a package +first be installed). Many of these include specific compiler flags +for optimized performance. Please note, however, that some of these +customized machine Makefile are contributed by users. Since both +compilers, OS configurations, and LAMMPS itself keep changing, their +settings may become outdated: + + +.. parsed-literal:: + + make mac # build serial LAMMPS on a Mac + make mac_mpi # build parallel LAMMPS on a Mac + make intel_cpu # build with the USER-INTEL package optimized for CPUs + make knl # build with the USER-INTEL package optimized for KNLs + make opt # build with the OPT package optimized for CPUs + make omp # build with the USER-OMP package optimized for OpenMP + make kokkos_omp # build with the KOKKOS package for OpenMP + make kokkos_cuda_mpi # build with the KOKKOS package for GPUs + make kokkos_phi # build with the KOKKOS package for KNLs + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/rst/Build_package.rst b/doc/rst/Build_package.rst new file mode 100644 index 0000000000..9f56f3f329 --- /dev/null +++ b/doc/rst/Build_package.rst @@ -0,0 +1,265 @@ +Include packages in build +========================= + +In LAMMPS, a package is a group of files that enable a specific set of +features. For example, force fields for molecular systems or +rigid-body constraints are in packages. In the src directory, each +package is a sub-directory with the package name in capital letters. + +An overview of packages is given on the :doc:`Packages ` doc +page. Brief overviews of each package are on the :doc:`Packages details ` doc page. + +When building LAMMPS, you can choose to include or exclude each +package. In general there is no need to include a package if you +never plan to use its features. + +If you get a run-time error that a LAMMPS command or style is +"Unknown", it is often because the command is contained in a package, +and your build did not include that package. Running LAMMPS with the +:doc:`-h command-line switch ` will print all the included +packages and commands for that executable. + +For the majority of packages, if you follow the single step below to +include it, you can then build LAMMPS exactly the same as you would +without any packages installed. A few packages may require additional +steps, as explained on the :doc:`Build extras ` doc page. + +These links take you to the extra instructions for those select +packages: + ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ +| :ref:`COMPRESS ` | :ref:`GPU ` | :ref:`KIM ` | :ref:`KOKKOS ` | :ref:`LATTE ` | :ref:`MESSAGE ` | ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ +| :ref:`MSCG ` | :ref:`OPT ` | :ref:`POEMS ` | :ref:`PYTHON ` | :ref:`VORONOI ` | :ref:`USER-ADIOS ` | ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ +| :ref:`USER-ATC ` | :ref:`USER-AWPMD ` | :ref:`USER-COLVARS ` | :ref:`USER-H5MD ` | :ref:`USER-INTEL ` | :ref:`USER-MOLFILE ` | ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ +| :ref:`USER-NETCDF ` | :ref:`USER-PLUMED ` | :ref:`USER-OMP ` | :ref:`USER-QMMM ` | :ref:`USER-QUIP ` | :ref:`USER-SCAFACOS ` | ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ +| :ref:`USER-SMD ` | :ref:`USER-VTK ` | | | | | ++----------------------------------+----------------------------------+------------------------------------+------------------------------+--------------------------------+--------------------------------------+ + +The mechanism for including packages is simple but different for CMake +versus make. + +**CMake variables**\ : + + +.. parsed-literal:: + + -D PKG_NAME=value # yes or no (default) + +Examples: + + +.. parsed-literal:: + + -D PKG_MANYBODY=yes + -D PKG_USER-INTEL=yes + +All standard and user packages are included the same way. Note that +USER packages have a hyphen between USER and the rest of the package +name, not an underscore. + +See the shortcut section below for how to install many packages at +once with CMake. + +.. note:: + + If you toggle back and forth between building with CMake vs + make, no packages in the src directory can be installed when you + invoke cmake. CMake will give an error if that is not the case, + indicating how you can un-install all packages in the src dir. + +**Traditional make**\ : + + +.. parsed-literal:: + + cd lammps/src + make ps # check which packages are currently installed + make yes-name # install a package with name + make no-name # un-install a package with name + make mpi # build LAMMPS with whatever packages are now installed + +Examples: + + +.. parsed-literal:: + + make no-rigid + make yes-user-intel + +All standard and user packages are included the same way. + +See the shortcut section below for how to install many packages at +once with make. + +.. note:: + + You must always re-build LAMMPS (via make) after installing or + un-installing a package, for the action to take effect. + +.. note:: + + You cannot install or un-install packages and build LAMMPS in a + single make command with multiple targets, e.g. make yes-colloid mpi. + This is because the make procedure creates a list of source files that + will be out-of-date for the build if the package configuration changes + within the same command. You can include or exclude multiple packages + in a single make command, e.g. make yes-colloid no-manybody. + +**CMake and make info**\ : + +Any package can be included or excluded in a LAMMPS build, independent +of all other packages. However, some packages include files derived +from files in other packages. LAMMPS checks for this and does the +right thing. Individual files are only included if their dependencies +are already included. Likewise, if a package is excluded, other files +dependent on that package are also excluded. + +When you download a LAMMPS tarball or download LAMMPS source files +from the Git or SVN repositories, no packages are pre-installed in the +src directory. + +.. note:: + + Prior to Aug 2018, if you downloaded a tarball, 3 packages + (KSPACE, MANYBODY, MOLECULE) were pre-installed in the src directory. + That is no longer the case, so that CMake will build as-is without the + need to un-install those packages. + + +---------- + + +**CMake shortcuts for installing many packages**\ : + +Instead of specifying all the CMake options via the command-line, +CMake allows initializing the variable cache using script files. These +are regular CMake files which can manipulate and set variables, and +can also contain control flow constructs. + +LAMMPS includes several of these files to define configuration +"presets", similar to the options that exist for the Make based +system. Using these files you can enable/disable portions of the +available packages in LAMMPS. If you need a custom preset you can take +one of them as a starting point and customize it to your needs. + ++-------------------------------------------------------------+-----------------------------------------------------------+ +| cmake -C ../cmake/presets/all\_on.cmake [OPTIONS] ../cmake | enable all packages | ++-------------------------------------------------------------+-----------------------------------------------------------+ +| cmake -C ../cmake/presets/all\_off.cmake [OPTIONS] ../cmake | disable all packages | ++-------------------------------------------------------------+-----------------------------------------------------------+ +| cmake -C ../cmake/presets/minimal.cmake [OPTIONS] ../cmake | enable just a few core packages | ++-------------------------------------------------------------+-----------------------------------------------------------+ +| cmake -C ../cmake/presets/most.cmake [OPTIONS] ../cmake | enable most common packages | ++-------------------------------------------------------------+-----------------------------------------------------------+ +| cmake -C ../cmake/presets/nolib.cmake [OPTIONS] ../cmake | disable packages that do require extra libraries or tools | ++-------------------------------------------------------------+-----------------------------------------------------------+ +| cmake -C ../cmake/presets/clang.cmake [OPTIONS] ../cmake | change settings to use the Clang compilers by default | ++-------------------------------------------------------------+-----------------------------------------------------------+ +| cmake -C ../cmake/presets/mingw.cmake [OPTIONS] ../cmake | enable all packages compatible with MinGW compilers | ++-------------------------------------------------------------+-----------------------------------------------------------+ + +.. note:: + + Running cmake this way manipulates the variable cache in your + current build directory. You can combine multiple presets and options + in a single cmake run, or change settings incrementally by running + cmake with new flags. + +**Example:** + + +.. parsed-literal:: + + # build LAMMPS with most commonly used packages, but then remove + # those requiring additional library or tools, but still enable + # GPU package and configure it for using CUDA. You can run. + mkdir build + cd build + cmake -C ../cmake/presets/most.cmake -C ../cmake/presets/nolib.cmake -D PKG_GPU=on -D GPU_API=cuda ../cmake + + # to add another package, say BODY to the previous configuration you can run: + cmake -D PKG_BODY=on . + + # to reset the package selection from above to the default of no packages + # but leaving all other settings untouched. You can run: + cmake -C ../cmake/presets/no_all.cmake . + + +---------- + + +**Make shortcuts for installing many packages**\ : + +The following commands are useful for managing package source files +and their installation when building LAMMPS via traditional make. +Just type "make" in lammps/src to see a one-line summary. + +These commands install/un-install sets of packages: + ++-----------------------------------+-----------------------------------------------------+ +| make yes-all | install all packages | ++-----------------------------------+-----------------------------------------------------+ +| make no-all | un-install all packages | ++-----------------------------------+-----------------------------------------------------+ +| make yes-standard or make yes-std | install standard packages | ++-----------------------------------+-----------------------------------------------------+ +| make no-standard or make no-std | un-install standard packages | ++-----------------------------------+-----------------------------------------------------+ +| make yes-user | install user packages | ++-----------------------------------+-----------------------------------------------------+ +| make no-user | un-install user packages | ++-----------------------------------+-----------------------------------------------------+ +| make yes-lib | install packages that require extra libraries | ++-----------------------------------+-----------------------------------------------------+ +| make no-lib | un-install packages that require extra libraries | ++-----------------------------------+-----------------------------------------------------+ +| make yes-ext | install packages that require external libraries | ++-----------------------------------+-----------------------------------------------------+ +| make no-ext | un-install packages that require external libraries | ++-----------------------------------+-----------------------------------------------------+ + +which install/un-install various sets of packages. Typing "make +package" will list all the these commands. + +.. note:: + + Installing or un-installing a package works by simply copying + files back and forth between the main src directory and + sub-directories with the package name (e.g. src/KSPACE, src/USER-ATC), + so that the files are included or excluded when LAMMPS is built. + +The following make commands help manage files that exist in both the +src directory and in package sub-directories. You do not normally +need to use these commands unless you are editing LAMMPS files or are +:doc:`installing a patch ` downloaded from the LAMMPS web +site. + +Type "make package-status" or "make ps" to show which packages are +currently installed. For those that are installed, it will list any +files that are different in the src directory and package +sub-directory. + +Type "make package-installed" or "make pi" to show which packages are +currently installed, without listing the status of packages that are +not installed. + +Type "make package-update" or "make pu" to overwrite src files with +files from the package sub-directories if the package is installed. +It should be used after a :doc:`patch has been applied `, +since patches only update the files in the package sub-directory, but +not the src files. + +Type "make package-overwrite" to overwrite files in the package +sub-directories with src files. + +Type "make package-diff" to list all differences between pairs of +files in both the src dir and a package dir. + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/rst/Build_settings.rst b/doc/rst/Build_settings.rst new file mode 100644 index 0000000000..e80afd482f --- /dev/null +++ b/doc/rst/Build_settings.rst @@ -0,0 +1,437 @@ +Optional build settings +======================= + +LAMMPS can be built with several optional settings. Each sub-section +explain how to do this for building both with CMake and make. + +| :ref:`FFT library ` for use with the :doc:`kspace\_style pppm ` command +| :ref:`Size of LAMMPS data types ` +| :ref:`Read or write compressed files ` +| :ref:`Output of JPG and PNG files ` via the :doc:`dump image ` command +| :ref:`Output of movie files ` via the :doc:`dump\_movie ` command +| :ref:`Memory allocation alignment ` +| :ref:`Workaround for long long integers ` +| :ref:`Error handling exceptions ` when using LAMMPS as a library +| + + +---------- + + +.. _fft: + +FFT library +--------------------- + +When the KSPACE package is included in a LAMMPS build, the +:doc:`kspace\_style pppm ` command performs 3d FFTs which +require use of an FFT library to compute 1d FFTs. The KISS FFT +library is included with LAMMPS but other libraries can be faster. +LAMMPS can use them if they are available on your system. + +**CMake variables**\ : + + +.. parsed-literal:: + + -D FFT=value # FFTW3 or MKL or KISS, default is FFTW3 if found, else KISS + -D FFT_SINGLE=value # yes or no (default), no = double precision + -D FFT_PACK=value # array (default) or pointer or memcpy + +.. note:: + + The values for the FFT variable must be in upper-case. This is + an exception to the rule that all CMake variables can be specified + with lower-case values. + +Usually these settings are all that is needed. If CMake cannot find +the FFT library, you can set these variables: + + +.. parsed-literal:: + + -D FFTW3_INCLUDE_DIRS=path # path to FFTW3 include files + -D FFTW3_LIBRARIES=path # path to FFTW3 libraries + -D MKL_INCLUDE_DIRS=path # ditto for Intel MKL library + -D MKL_LIBRARIES=path + +**Makefile.machine settings**\ : + + +.. parsed-literal:: + + FFT_INC = -DFFT_FFTW3 # -DFFT_FFTW3, -DFFT_FFTW (same as -DFFT_FFTW3), -DFFT_MKL, or -DFFT_KISS + # default is KISS if not specified + FFT_INC = -DFFT_SINGLE # do not specify for double precision + FFT_INC = -DFFT_PACK_ARRAY # or -DFFT_PACK_POINTER or -DFFT_PACK_MEMCPY + +# default is FFT\_PACK\_ARRAY if not specified + + +.. parsed-literal:: + + FFT_INC = -I/usr/local/include + FFT_PATH = -L/usr/local/lib + FFT_LIB = -lfftw3 # FFTW3 double precision + FFT_LIB = -lfftw3 -lfftw3f # FFTW3 single precision + FFT_LIB = -lmkl_intel_lp64 -lmkl_sequential -lmkl_core # MKL with Intel compiler + FFT_LIB = -lmkl_gf_lp64 -lmkl_sequential -lmkl_core # MKL with GNU compier + +As with CMake, you do not need to set paths in FFT\_INC or FFT\_PATH, if +make can find the FFT header and library files. You must specify +FFT\_LIB with the appropriate FFT libraries to include in the link. + +**CMake and make info**\ : + +The `KISS FFT library `_ is included in the LAMMPS +distribution. It is portable across all platforms. Depending on the +size of the FFTs and the number of processors used, the other +libraries listed here can be faster. + +However, note that long-range Coulombics are only a portion of the +per-timestep CPU cost, FFTs are only a portion of long-range +Coulombics, and 1d FFTs are only a portion of the FFT cost (parallel +communication can be costly). A breakdown of these timings is printed +to the screen at the end of a run using the :doc:`kspace\_style pppm ` command. The :doc:`Run output ` +doc page gives more details. + +FFTW is a fast, portable FFT library that should also work on any +platform and can be faster than the KISS FFT library. You can +download it from `www.fftw.org `_. LAMMPS requires +version 3.X; the legacy version 2.1.X is no longer supported. + +Building FFTW for your box should be as simple as ./configure; make; +make install. The install command typically requires root privileges +(e.g. invoke it via sudo), unless you specify a local directory with +the "--prefix" option of configure. Type "./configure --help" to see +various options. + +The Intel MKL math library is part of the Intel compiler suite. It +can be used with the Intel or GNU compiler (see FFT\_LIB setting above). + +Performing 3d FFTs in parallel can be time consuming due to data +access and required communication. This cost can be reduced by +performing single-precision FFTs instead of double precision. Single +precision means the real and imaginary parts of a complex datum are +4-byte floats. Double precision means they are 8-byte doubles. Note +that Fourier transform and related PPPM operations are somewhat less +sensitive to floating point truncation errors and thus the resulting +error is less than the difference in precision. Using the -DFFT\_SINGLE +setting trades off a little accuracy for reduced memory use and +parallel communication costs for transposing 3d FFT data. + +When using -DFFT\_SINGLE with FFTW3 you may need to build the FFTW +library a second time with support for single-precision. + +For FFTW3, do the following, which should produce the additional +library libfftw3f.a + + +.. parsed-literal:: + + make clean + ./configure --enable-single; make; make install + +Performing 3d FFTs requires communication to transpose the 3d FFT +grid. The data packing/unpacking for this can be done in one of 3 +modes (ARRAY, POINTER, MEMCPY) as set by the FFT\_PACK syntax above. +Depending on the machine, the size of the FFT grid, the number of +processors used, one option may be slightly faster. The default is +ARRAY mode. + + +---------- + + +.. _size: + +Size of LAMMPS data types +------------------------------------ + +LAMMPS has a few integer data types which can be defined as 4-byte or +8-byte integers. The default setting of "smallbig" is almost always +adequate. + +**CMake variable**\ : + + +.. parsed-literal:: + + -D LAMMPS_SIZES=value # smallbig (default) or bigbig or smallsmall + +**Makefile.machine setting**\ : + + +.. parsed-literal:: + + LMP_INC = -DLAMMPS_SMALLBIG # or -DLAMMPS_BIGBIG or -DLAMMPS_SMALLSMALL + +# default is LAMMPS\_SMALLBIG if not specified +**CMake and make info**\ : + +The default "smallbig" setting allows for simulations with: + +* total atom count = 2\^63 atoms (about 9e18) +* total timesteps = 2\^63 (about 9e18) +* atom IDs = 2\^31 (about 2 billion) +* image flags = roll over at 512 + +The "bigbig" setting increases the latter two limits. It allows for: + +* total atom count = 2\^63 atoms (about 9e18) +* total timesteps = 2\^63 (about 9e18) +* atom IDs = 2\^63 (about 9e18) +* image flags = roll over at about 1 million (2\^20) + +The "smallsmall" setting is only needed if your machine does not +support 8-byte integers. It allows for: + +* total atom count = 2\^31 atoms (about 2 billion) +* total timesteps = 2\^31 (about 2 billion) +* atom IDs = 2\^31 (about 2 billion) +* image flags = roll over at 512 (2\^9) + +Atom IDs are not required for atomic systems which do not store bond +topology information, though IDs are enabled by default. The +:doc:`atom\_modify id no ` command will turn them off. Atom +IDs are required for molecular systems with bond topology (bonds, +angles, dihedrals, etc). Thus if you model a molecular system with +more than 2 billion atoms, you need the "bigbig" setting. + +Image flags store 3 values per atom which count the number of times an +atom has moved through the periodic box in each dimension. See the +:doc:`dump ` doc page for a discussion. If an atom moves through +the periodic box more than this limit, the value will "roll over", +e.g. from 511 to -512, which can cause diagnostics like the +mean-squared displacement, as calculated by the :doc:`compute msd ` command, to be faulty. + +Note that the USER-ATC package and the USER-INTEL package are currently +not compatible with the "bigbig" setting. Also, there are limitations +when using the library interface. Some functions with known issues +have been replaced by dummy calls printing a corresponding error rather +than crashing randomly or corrupting data. + +Also note that the GPU package requires its lib/gpu library to be +compiled with the same size setting, or the link will fail. A CMake +build does this automatically. When building with make, the setting +in whichever lib/gpu/Makefile is used must be the same as above. + + +---------- + + +.. _graphics: + +Output of JPG, PNG, and movie files +-------------------------------------------------- + +The :doc:`dump image ` command has options to output JPEG or +PNG image files. Likewise the :doc:`dump movie ` command +outputs movie files in MPEG format. Using these options requires the +following settings: + +**CMake variables**\ : + + +.. parsed-literal:: + + -D WITH_JPEG=value # yes or no + # default = yes if CMake finds JPEG files, else no + -D WITH_PNG=value # yes or no + # default = yes if CMake finds PNG and ZLIB files, else no + -D WITH_FFMPEG=value # yes or no + # default = yes if CMake can find ffmpeg, else no + +Usually these settings are all that is needed. If CMake cannot find +the graphics header, library, executable files, you can set these +variables: + + +.. parsed-literal:: + + -D JPEG_INCLUDE_DIR=path # path to jpeglib.h header file + -D JPEG_LIBRARIES=path # path to libjpeg.a (.so) file + -D PNG_INCLUDE_DIR=path # path to png.h header file + -D PNG_LIBRARIES=path # path to libpng.a (.so) file + -D ZLIB_INCLUDE_DIR=path # path to zlib.h header file + -D ZLIB_LIBRARIES=path # path to libz.a (.so) file + -D FFMPEG_EXECUTABLE=path # path to ffmpeg executable + +**Makefile.machine settings**\ : + + +.. parsed-literal:: + + LMP_INC = -DLAMMPS_JPEG + LMP_INC = -DLAMMPS_PNG + LMP_INC = -DLAMMPS_FFMPEG + + JPG_INC = -I/usr/local/include # path to jpeglib.h, png.h, zlib.h header files if make cannot find them + JPG_PATH = -L/usr/lib # paths to libjpeg.a, libpng.a, libz.a (.so) files if make cannot find them + JPG_LIB = -ljpeg -lpng -lz # library names + +As with CMake, you do not need to set JPG\_INC or JPG\_PATH, if make can +find the graphics header and library files. You must specify JPG\_LIB +with a list of graphics libraries to include in the link. You must +insure ffmpeg is in a directory where LAMMPS can find it at runtime, +i.e. a dir in your PATH environment variable. + +**CMake and make info**\ : + +Using ffmpeg to output movie files requires that your machine +supports the "popen" function in the standard runtime library. + +.. note:: + + On some clusters with high-speed networks, using the fork() + library calls (required by popen()) can interfere with the fast + communication library and lead to simulations using ffmpeg to hang or + crash. + + +---------- + + +.. _gzip: + +Read or write compressed files +----------------------------------------- + +If this option is enabled, large files can be read or written with +gzip compression by several LAMMPS commands, including +:doc:`read\_data `, :doc:`rerun `, and :doc:`dump `. + +**CMake variables**\ : + + +.. parsed-literal:: + + -D WITH_GZIP=value # yes or no + # default is yes if CMake can find gzip, else no + -D GZIP_EXECUTABLE=path # path to gzip executable if CMake cannot find it + +**Makefile.machine setting**\ : + + +.. parsed-literal:: + + LMP_INC = -DLAMMPS_GZIP + +**CMake and make info**\ : + +This option requires that your machine supports the "popen()" function +in the standard runtime library and that a gzip executable can be +found by LAMMPS during a run. + +.. note:: + + On some clusters with high-speed networks, using the fork() + library calls (required by popen()) can interfere with the fast + communication library and lead to simulations using compressed output + or input to hang or crash. For selected operations, compressed file + I/O is also available using a compression library instead, which is + what the :ref:`COMPRESS package ` enables. + + +---------- + + +.. _align: + +Memory allocation alignment +--------------------------------------- + +This setting enables the use of the posix\_memalign() call instead of +malloc() when LAMMPS allocates large chunks or memory. This can make +vector instructions on CPUs more efficient, if dynamically allocated +memory is aligned on larger-than-default byte boundaries. +On most current systems, the malloc() implementation returns +pointers that are aligned to 16-byte boundaries. Using SSE vector +instructions efficiently, however, requires memory blocks being +aligned on 64-byte boundaries. + +**CMake variable**\ : + + +.. parsed-literal:: + + -D LAMMPS_MEMALIGN=value # 0, 8, 16, 32, 64 (default) + +Use a LAMMPS\_MEMALIGN value of 0 to disable using posix\_memalign() +and revert to using the malloc() C-library function instead. When +compiling LAMMPS for Windows systems, malloc() will always be used +and this setting ignored. + +**Makefile.machine setting**\ : + + +.. parsed-literal:: + + LMP_INC = -DLAMMPS_MEMALIGN=value # 8, 16, 32, 64 + +Do not set -DLAMMPS\_MEMALIGN, if you want to have memory allocated +with the malloc() function call instead. -DLAMMPS\_MEMALIGN **cannot** +be used on Windows, as it does use different function calls for +allocating aligned memory, that are not compatible with how LAMMPS +manages its dynamical memory. + + +---------- + + +.. _longlong: + +Workaround for long long integers +------------------------------------------------ + +If your system or MPI version does not recognize "long long" data +types, the following setting will be needed. It converts "long long" +to a "long" data type, which should be the desired 8-byte integer on +those systems: + +**CMake variable**\ : + + +.. parsed-literal:: + + -D LAMMPS_LONGLONG_TO_LONG=value # yes or no (default) + +**Makefile.machine setting**\ : + + +.. parsed-literal:: + + LMP_INC = -DLAMMPS_LONGLONG_TO_LONG + + +---------- + + +.. _exceptions: + +Exception handling when using LAMMPS as a library +------------------------------------------------------------------ + +This setting is useful when external codes drive LAMMPS as a library. +With this option enabled LAMMPS errors do not kill the caller. +Instead, the call stack is unwound and control returns to the caller, +e.g. to Python. + +**CMake variable**\ : + + +.. parsed-literal:: + + -D LAMMPS_EXCEPTIONS=value # yes or no (default) + +**Makefile.machine setting**\ : + + +.. parsed-literal:: + + LMP_INC = -DLAMMPS_EXCEPTIONS + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/rst/Build_windows.rst b/doc/rst/Build_windows.rst new file mode 100644 index 0000000000..fd96b37983 --- /dev/null +++ b/doc/rst/Build_windows.rst @@ -0,0 +1,111 @@ +Notes for building LAMMPS on Windows +==================================== + +* :ref:`General remarks ` +* :ref:`Running Linux on Windows ` +* :ref:`Using GNU GCC ported to Windows ` +* :ref:`Using a cross-compiler ` + + +---------- + + +.. _generic: + +General remarks +----------------------------- + +LAMMPS is developed and tested primarily on Linux machines. The vast +majority of HPC clusters and supercomputers today runs on Linux as well. +Thus portability to other platforms is desired, but not always achieved. +The LAMMPS developers strongly rely on LAMMPS users giving feedback and +providing assistance in resolving portability issues. This particularly +true for compiling LAMMPS on Windows, since this platform has significant +differences with some low-level functionality. + +.. _linux: + +Running Linux on Windows +------------------------------------ + +So before trying to build LAMMPS on Windows, please consider if using +the pre-compiled Windows binary packages are sufficient for your needs +(as an aside, those packages themselves are build on a Linux machine +using cross-compilers). If it is necessary for your to compile LAMMPS +on a Windows machine (e.g. because it is your main desktop), please also +consider using a virtual machine software and run a Linux virtual machine, +or - if have a recently updated Windows 10 installation - consider using +the Windows subsystem for Linux, which allows to run a bash shell from +Ubuntu and from there on, you can pretty much use that shell like you +are running on an Ubuntu Linux machine (e.g. installing software via +apt-get). For more details on that, please see :doc:`this tutorial ` + +.. _gnu: + +Using GNU GCC ported to Windows +----------------------------------------- + +One option for compiling LAMMPS on Windows natively, that has been known +to work in the past is to install a bash shell, unix shell utilities, +perl, GNU make, and a GNU compiler ported to Windows. The Cygwin package +provides a unix/linux interface to low-level Windows functions, so LAMMPS +can be compiled on Windows. The necessary (minor) modifications to LAMMPS +are included, but may not always up-to-date for recently added functionality +and the corresponding new code. A machine makefile for using cygwin for +the old build system is provided. Using CMake for this mode of compilation +is untested and not likely to work. + +When compiling for Windows do **not** set the -DLAMMPS\_MEMALIGN define +in the LMP\_INC makefile variable and add -lwsock32 -lpsapi to the linker +flags in LIB makefile variable. Try adding -static-libgcc or -static or +both to the linker flags when your resulting LAMMPS Windows executable +complains about missing .dll files. The CMake configuration should set +this up automatically, but is untested. + +In case of problems, you are recommended to contact somebody with +experience in using cygwin. If you do come across portability problems +requiring changes to the LAMMPS source code, or figure out corrections +yourself, please report them on the lammps-users mailing list, or file +them as an issue or pull request on the LAMMPS GitHub project. + +.. _cross: + +Using a cross-compiler +---------------------------------- + +If you need to provide custom LAMMPS binaries for Windows, but do not +need to do the compilation on Windows, please consider using a Linux +to Windows cross-compiler. This is how currently the Windows binary +packages are created by the LAMMPS developers. Because of that, this is +probably the currently best tested and supported way to build LAMMPS +executables for Windows. There are makefiles provided for the +traditional build system, but CMake has also been successfully tested +using the mingw32-cmake and mingw64-cmake wrappers that are bundled +with the cross-compiler environment on Fedora machines. A CMake preset +selecting all packages compatible with this cross-compilation build +is provided. You likely need to disable the GPU package unless you +download and install the contents of the pre-compiled `OpenCL ICD loader library `_ +into your MinGW64 cross-compiler environment. The cross-compilation +currently will only produce non-MPI serial binaries. + +Please keep in mind, though, that this only applies to compiling LAMMPS. +Whether the resulting binaries do work correctly is no tested by the +LAMMPS developers. We instead rely on the feedback of the users +of these pre-compiled LAMMPS packages for Windows. We will try to resolve +issues to the best of our abilities if we become aware of them. However +this is subject to time constraints and focus on HPC platforms. + +.. _native: + +Native Visual C++ support +-------------------------------------- + +Support for the Visual C++ compilers is currently not available. The +CMake build system is capable of creating suitable a Visual Studio +style build environment, but the LAMMPS code itself is not fully ported +to support Visual C++. Volunteers to take on this task are welcome. + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/rst/Commands.rst b/doc/rst/Commands.rst new file mode 100644 index 0000000000..e845faa903 --- /dev/null +++ b/doc/rst/Commands.rst @@ -0,0 +1,34 @@ +Commands +******** + +These pages describe how a LAMMPS input script is formatted and the +commands in it are used to define a LAMMPS simulation. + + +.. toctree:: + :maxdepth: 1 + + Commands_input + Commands_parse + Commands_structure + Commands_category + +.. toctree:: + :maxdepth: 1 + + Commands_all + Commands_fix + Commands_compute + Commands_pair + Commands_bond + Commands_kspace + +.. toctree:: + :maxdepth: 1 + + Commands_removed + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/rst/Commands_all.rst b/doc/rst/Commands_all.rst new file mode 100644 index 0000000000..fcd6cdd689 --- /dev/null +++ b/doc/rst/Commands_all.rst @@ -0,0 +1,59 @@ ++----------------------------------------+------------------------------------+------------------------------------------+ +| :doc:`General commands ` | :doc:`Fix styles ` | :doc:`Compute styles ` | ++----------------------------------------+------------------------------------+------------------------------------------+ +| :doc:`Pair styles ` | :doc:`Bond styles ` | :ref:`Angle styles ` | ++----------------------------------------+------------------------------------+------------------------------------------+ +| :ref:`Dihedral styles ` | :ref:`Improper styles ` | :doc:`KSpace styles ` | ++----------------------------------------+------------------------------------+------------------------------------------+ + +General commands +================ + +An alphabetic list of all general LAMMPS commands. + ++-----------------------------------------+-----------------------------------------+-----------------------------------------+-----------------------------------------+---------------------------------------------+-----------------------------------------+ +| :doc:`angle\_coeff ` | :doc:`angle\_style ` | :doc:`atom\_modify ` | :doc:`atom\_style ` | :doc:`balance ` | :doc:`bond\_coeff ` | ++-----------------------------------------+-----------------------------------------+-----------------------------------------+-----------------------------------------+---------------------------------------------+-----------------------------------------+ +| :doc:`bond\_style ` | :doc:`bond\_write ` | :doc:`boundary ` | :doc:`box ` | :doc:`change\_box ` | :doc:`clear ` | ++-----------------------------------------+-----------------------------------------+-----------------------------------------+-----------------------------------------+---------------------------------------------+-----------------------------------------+ +| :doc:`comm\_modify ` | :doc:`comm\_style ` | :doc:`compute ` | :doc:`compute\_modify ` | :doc:`create\_atoms ` | :doc:`create\_bonds ` | ++-----------------------------------------+-----------------------------------------+-----------------------------------------+-----------------------------------------+---------------------------------------------+-----------------------------------------+ +| :doc:`create\_box ` | :doc:`delete\_atoms ` | :doc:`delete\_bonds ` | :doc:`dielectric ` | :doc:`dihedral\_coeff ` | :doc:`dihedral\_style ` | ++-----------------------------------------+-----------------------------------------+-----------------------------------------+-----------------------------------------+---------------------------------------------+-----------------------------------------+ +| :doc:`dimension ` | :doc:`displace\_atoms ` | :doc:`dump ` | :doc:`dump adios ` | :doc:`dump image ` | :doc:`dump movie ` | ++-----------------------------------------+-----------------------------------------+-----------------------------------------+-----------------------------------------+---------------------------------------------+-----------------------------------------+ +| :doc:`dump netcdf ` | :doc:`dump netcdf/mpiio ` | :doc:`dump vtk ` | :doc:`dump\_modify ` | :doc:`dynamical\_matrix ` | :doc:`echo ` | ++-----------------------------------------+-----------------------------------------+-----------------------------------------+-----------------------------------------+---------------------------------------------+-----------------------------------------+ +| :doc:`fix ` | :doc:`fix\_modify ` | :doc:`group ` | :doc:`group2ndx ` | :doc:`hyper ` | :doc:`if ` | ++-----------------------------------------+-----------------------------------------+-----------------------------------------+-----------------------------------------+---------------------------------------------+-----------------------------------------+ +| :doc:`info ` | :doc:`improper\_coeff ` | :doc:`improper\_style ` | :doc:`include ` | :doc:`jump ` | :doc:`kim\_init ` | ++-----------------------------------------+-----------------------------------------+-----------------------------------------+-----------------------------------------+---------------------------------------------+-----------------------------------------+ +| :doc:`kim\_interactions ` | :doc:`kim\_query ` | :doc:`kspace\_modify ` | :doc:`kspace\_style ` | :doc:`label

txt2html - a text to HTML conversion tool -

-

txt2html is a simple tool for converting text files into HTML files. -Text files can contain simple formatting and mark-up commands that -txt2html converts into HTML. -

-

txt2html was written by Steve Plimpton. I use it for -documentation and WWW pages. Anna Reese added the table -formatting options. -

-

See the example.txt and example.html -files in the txt2html directory for examples of what all the -formatting commands and mark-up syntax end up looking like in HTML. -

- - - - - - -
- -

Syntax: -

-
txt2html file -
read from text file, write HTML to standard output -
txt2html file1 file2 file3 ... -
read each argument as text file, write one HTML file per argument -
-

Input files are first opened with the specified name. If that fails, -a ".txt" suffix is added. Output files are created with an ".html" -suffix, which is either added or replaces the ".txt" suffix. -

-
- -

Compiling: -

-

The source for txt2html is a single C++ file. Compile it by typing: -

-
g++ -o txt2html txt2html.cpp 
-
-
- -

How the tool works: -

-

txt2html reads a text file, one paragraph at a time. A paragraph -ends with: -

-
  • a blank line -
  • a line whose final word starts with ":" (a format string) -
  • the end of the file -
-

Any line in the paragraph which ends with "\" is concatenated to the -following line by removing the "\" character and following newline. -This can be useful for some of the formatting commands described below -that operate on individual lines in the paragraph. -

-

If a paragraph starts with a "<" character and ends with a ">" -character, it is treated as raw HTML and is written directly into the -output file. -

-

If a paragraph does not end with a format string, then it is -surrounded with HTML paragraph markers (<P> and </P>), -mark-up is performed, and the paragraph is written to the -output file. -

-

If the paragraph ends with a format string, then formatting -is performed, mark-up is performed, and the paragraph is -written to the output file. -

-
- -Formatting: - -

A format string is the last word of a paragraph if it starts with a -":" character. A format string contains one or more comma-separated -commands, like ":ulb,l" or ":c,h3". Note that a format string cannot -contain spaces, else it would not be the last word. An individual -command can have 0 or more arguments: -

-
  • b or line() = 0 arguments -
  • image(file) = 1 argument -
  • link(alias,value) = 2 or more comma-separated arguments -
-

Format commands add HTML markers at the beginning or end of the -paragraph and individual lines. Commands are processed in the order -they appear in the format string. Thus if two commands add HTML -markers to the beginning of the paragraph, the 2nd command's marker -will appear 2nd. The reverse is true at the end of the paragraph; the -2nd command's marker will appear 1st. Some comands, like line or -image make most sense if used as stand-alone commands without an -accompanying paragraph. -

-

Commands that format the entire paragraph: -

-
  • p --> surround the paragraph with <P> </P> -
  • b --> put <BR> at the end of the paragraph -
  • pre --> surround the paragraph with <PRE> </PRE> -
  • c --> surround the paragraph with <CENTER> </CENTER> -
  • h1,h2,h3,h4,h5,h6 --> surround the paragraph with <H1> </H1>, etc -
-

Commands that format the lines of the paragraph as a list: -

-
  • ul --> surround the paragraph with <UL> </UL>, put <LI> at start of every line -
  • ol --> surround the paragraph with <OL> </OL>, put <LI> at start of every line -
  • dl --> surround the paragraph with <DL> </DL>, alternate <DT> and <DD> at start of every line -
-

Commands that treat the paragraph as one entry in a list: -

-
  • l --> put <LI> at the beginning of the paragraph -
  • dt --> put <DT> at the beginning of the paragraph -
  • dd --> put <DD> at the beginning of the paragraph -
  • ulb --> put <UL> at the beginning of the paragraph -
  • ule --> put </UL> at the end of the paragraph -
  • olb --> put <OL> at the beginning of the paragraph -
  • ole --> put </OL> at the end of the paragraph -
  • dlb --> put <DL> at the beginning of the paragraph -
  • dle --> put </DL> at the end of the paragraph -
-

Commands applied to each line of the paragraph: -

-
  • all(p) --> surround each line with <P> </P> -
  • all(c) --> surround each line with <CENTER> </CENTER> -
  • all(b) --> append a <BR> to each line -
  • all(l) --> prepend a <LI> to each line -
-

Special commands (all HTML is inserted at beginning of paragraph): -

-
  • line --> insert a horizontal line = <HR> -
  • image(file) --> insert an image = <IMG SRC = "file"> -
  • image(file,link) --> insert an image that when clicked on goes to link -
  • link(name) --> insert a named link that can be referred to elsewhere (see mark-up) = <A NAME = "name"></A> -
  • link(alias,value) --> define a link alias that can be used elsewhere in this file (see mark-up) -
-

Table command: -

-
  • tb(c=3,b=5,w=100%,a=c) --> format the paragraph as a table -
-

Arguments within tb() can appear in any order and are all optional, -since they each have default values. -

-
  • c=N --> Make an N-column table. Treat the paragraph as one - long list of entries (separated by the separator character) and put - them into N columns one after the other. If N = 0, treat each line - of the paragraph as one row of the table with as many columns as - there are maximum entries in any line. Default is c=0. - -
  • s=: --> Use the character string following the equal sign as - the separator between entries. Default separator is a comma "," which - you cannot specify directly since the comma delimits the tb() arguments - -
  • b=N --> Create a border N pixels wide. If N is 0, there is no - border between or outside the cells. If N is 1, there is a minimal - border between and outside all cells. For N > 1, the border between - cells does not change but the outside border gets wider. Default is - b=1. - -
  • w=N or w=N% --> The first form makes each cell of the table at - least N pixels wide. The second form makes the entire table take up - N% of the width of the browser window. Default is w=0 which means - each cell will be just as wide as the text it contains. - -
  • a=X --> Align the entire table at the left, center, or right of the - browser window, for X = "l", "c", or "r". Default is a=c. - -
  • ea=X --> Align the text in each entry at the left, center, or - right of its cell, for X = "l", "c", or "r". Default is browser's - default (typically left). - -
  • eva=X --> Vertically align the text in each entry at the - top, middle, baseline, or bottom of its cell, for X = "t", "m", "ba", - or "bo". Default is browser's default (typically middle). - -
  • cwM=N or cwM=N% --> The first form makes column M be at least - N pixels wide. The second form makes column M take up N% of the - width of the browser window. This setting overrides the "w" - argument for column M. Only one column per table can be tweaked - with this argument. Default is no settings for any column. - -
  • caM=X --> Align the text in each entry of column M at the left, - center, or right of its cell, for X = "l", "c", or "r". This - setting overrides the "ea" argument for column M. Only one column - per table can be tweaked with this argument. Default is no settings - for any column. - -
  • cvaM=X --> Vertically align the text in each entry of column m - at the top, middle, baseline, or bottom of its cell, for X = "t", - "m", "ba", or "bo". This setting overrides the "eva" argument for - column M. Only one column per table can be tweaked with this - argument. Default is no settings for any column. -
-
- -Mark-up: - -

The text of the paragraph is scanned for special mark-up characters -which are converted into HTML. -

-

Bold and italic characters: -

-
  • "[" (left brace) --> turn-on bold by inserting a <B> -
  • "]" (right brace) --> turn-off bold by inserting a </B> -
  • "{" (left bracket) --> turn-on italics by inserting a <I> -
  • "}" (right bracket) --> turn-off italics by - inserting a </I>
- -

If a backspace '\' precedes any of the bold/italic mark-up characters, -then mark-up is not performed; the mark-up character is simply left in -the text. -

-

Links are inserted by enclosing a section of text in double quotes, -and appending an underscore to the ending quote, followed by the link. -The link ends when whitespace is found, except that trailing -punctuation characters (comma, period, semi-colon, colon, question -mark, exclamation point, parenthesis) are not considered part of the -link. -

-

A link of the form "text"_link becomes <A HREF = -"link">text</A> in the HTML output. The only exception is if -"link" is defined elsewhere in the file as an alias (see the link -command above). In that case, the value is used instead of the alias -name.

- -

With these rules, links can take several forms. -

-
  • "This links"_#abc to another part of this file which is -labeled with a :link(abc) command.
    -
  • "This links"_other.html to another file named other.html.
    -
  • "This links"_other.html#abc to another file which has an "abc" -location defined internally.
    -
  • "This links"_http://www.google.com to a WWW site.
    -
  • "This"_M12 could be used in place of any of the above forms. It -requires an alias like :link(M12,http://www.google.com) to be defined -elsewhere in the file.
- - diff --git a/doc/utils/txt2html/txt2html b/doc/utils/txt2html/txt2html deleted file mode 100755 index 023631eac1b472cdcaf4e8c4757c72c386446ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68760 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 diff --git a/doc/utils/txt2html/txt2html.cpp b/doc/utils/txt2html/txt2html.cpp deleted file mode 100644 index ff71c262c8..0000000000 --- a/doc/utils/txt2html/txt2html.cpp +++ /dev/null @@ -1,940 +0,0 @@ -// txt2html - written by Steve Plimpton, May 2004 -// table formatting by Anna Reese, Jul 2004 -// Sandia National Labs, www.cs.sandia.gov/~sjplimp -// -// txt2html converts a text file with simple formatting & markup into HTML -// formatting & markup specification is given in README -// -// Syntax: txt2html options file read one file, write to stdout -// txt2html optoins file1 file2 ... read files, write files.html -// -// options: -// -b = add a page-break comment to end of each HTML file -// useful when set of HTML files will be converted to PDF -// -x file = skip a file even if it appears in file list -// specify full file name of input file -// input files are first opened as-is -// if that fails a .txt suffix is added -// output files have an .html suffix added or replaced -// (unless written to stdout) - -#include -#include -#include - -#include -#include -#include - -using namespace std; - -#define MAXLINE 1024 - -// function prototypes - -static int next_paragraph(FILE *fp, string ¶graph); -static int index_of_first_char_of_last_word(string ¶graph); -static void process_commands(int flag, string &s, string &pre, string &post); -static void substitute(string &s); -static string td_tag(int currentc); -static long find_n(string &s, int nend, int &n1); -static void file_open(int npair, string &infile, FILE **in, FILE **out); - -// global variables for links, tables, lists, all command - -vector alias1; -vector alias2; -int nlink; - -int tableflag; // makes a table if tb command specified -int rowquit; // number of cols per row if c=N specified (default = 0) -string dwidth; // width for all of the columns -string tabledelim; // speciallized separator -string tablealign; // alignment for the table as an image -string dataalign; // alignment for data in table -string rowvalign; // vertical alignment for table - -int ncnum; // # of columns with specified width -vector cnum; // column IDs -vector cwidth; // column widths - -int ncalign; // # of columns with specified alignment -vector acolnum; // column IDs -vector colalign ; // column alignment - -int ncvalign; // # of columns with specified vertical alignment -vector vacolnum; // column IDs -vector colvalign ; // column vertical alignment - -string listflag; -string allflag; - -// main program - -int main(int narg, char **arg) -{ - int npair; - size_t n; - string *infile; - FILE *in,*out; - int style,ifirst,ilast; - string raw,pre,post,body,commands,final; - - // parse command-line options and args - // setup list of files to process - // npair = # of files to process - // infile = input file names - - if (narg == 1) { - fprintf(stderr,"Syntax: txt2html options file\n"); - fprintf(stderr," txt2html options file1 file2 ...\n"); - exit(1); - } - - int breakflag = 0; - int nskip = 0; - char **skipfiles = NULL; - - int iarg = 1; - while (arg[iarg][0] == '-') { - if (strcmp(arg[iarg],"-b") == 0) breakflag = 1; - else if (strcmp(arg[iarg],"-x") == 0) { - skipfiles = (char **) realloc(skipfiles,(nskip+1)*sizeof(char *)); - n = strlen(arg[iarg+1]) + 1; - skipfiles[nskip] = new char[n]; - strcpy(skipfiles[nskip],arg[iarg+1]); - nskip++; - iarg++; - } else { - fprintf(stderr,"Syntax: txt2html options file\n"); - fprintf(stderr," txt2html options file1 file2 ...\n"); - exit(1); - } - iarg++; - } - - if (narg-iarg == 1) { - npair = 1; - infile = new string[npair]; - infile[0] = arg[narg-1]; - } else { - npair = narg-iarg; - infile = new string[npair]; - for (int i = 0; i < npair; i++) infile[i] = arg[i+iarg]; - } - - // loop over files - - for (int ipair = 0; ipair < npair; ipair++) { - - // skip file if matches -x switch - - int flag = 0; - for (int i = 0; i < nskip; i++) - if (strcmp(infile[ipair].c_str(),skipfiles[i]) == 0) flag = 1; - if (flag) continue; - - // clear global variables before processing file - - alias1.clear(); - alias2.clear(); - nlink = 0; - tableflag = 0; - listflag = ""; - allflag = ""; - - // open files & message to screen - - file_open(0,infile[ipair],&in,&out); - fprintf(stderr,"Converting %s ...\n",infile[ipair].c_str()); - - // scan file for link definitions - // read file one paragraph at a time - // process commands, looking only for link definitions - - while ((style = next_paragraph(in,raw))) { - - if (style == 2) { - int n = index_of_first_char_of_last_word(raw); - commands = raw.substr(n+1); - process_commands(0,commands,pre,post); - } - - raw.erase(); - } - - // close & reopen files - - fclose(in); - file_open(npair,infile[ipair],&in,&out); - - // write leading - - fprintf(out,"\n"); - - // process entire file - // read file one paragraph at a time - // delete newlines when line-continuation char at end-of-line - // process commands for each paragraph - // substitute text for each paragraph - // write HTML to output file - - int rstflag = 0; - - while ((style = next_paragraph(in,raw))) { - - if (rstflag && raw.find("END_RST -->") != string::npos) { - rstflag = 0; - raw.erase(); - continue; - } else if (rstflag == 0 && raw.find("\n"); - fprintf(out,"\n"); - - // close files - - fclose(in); - if (out != stdout) fclose(out); - } - - // clean up memory - - for (int i = 0; i < nskip; i++) delete [] skipfiles[i]; - if (skipfiles) free(skipfiles); - delete [] infile; -} - -// return next paragraph as string -// discard leading blank lines -// paragraph is terminated by: -// EOF or blank line or line ending with command that starts with ":" -// return 0 if EOF and no paragraph -// return 1 if no trailing command -// return 2 if trailing command - -int next_paragraph(FILE *fp, string ¶graph) -{ - char *ptr; - char str[MAXLINE]; - int first = 1; - int len = 0; - - while (1) { - ptr = fgets(str,MAXLINE,fp); - if (ptr == NULL && first) return 0; - if (ptr == NULL) return 1; - len = strlen(str); - if (len == MAXLINE-1) { - fprintf(stderr,"ERROR: File has too-long a string - increase MAXLINE\n"); - exit(1); - } - - // check for valid 7-bit ascii characters - bool nonascii = false; - for (int i=0; i < len; ++i) { - char c = str[i]; - if (c != '\n' && c != '\t' && (c < ' ' || c > '~')) - nonascii = true; - } - if (nonascii) - fprintf(stderr,"WARNING: Non-portable characters in line: %s",ptr); - - if (strspn(str," \t\n") == strlen(str) && first) continue; - if (strspn(str," \t\n") == strlen(str)) return 1; - first = 0; - - paragraph += str; - if (paragraph[index_of_first_char_of_last_word(paragraph)] == ':') - return 2; - } -} - -// return index of first char in last word of paragraph string - -int index_of_first_char_of_last_word(string ¶graph) -{ - size_t n = paragraph.find_last_not_of(" \t\n"); - size_t m = paragraph.find_last_of(" \t\n",n); - if (m == string::npos) return 0; - else return m+1; -} - -// apply commands one after the other to the paragraph - -void process_commands(int flag, string &s, string &pre, string &post) -{ - size_t start,stop,last; - int narg; - string command; - vector arg; - - start = 0; - last = s.find_last_not_of(" \t\n"); - if (last == string::npos) return; - - while (start <= last) { - - // grab a single command with optional arguments - // command = name of command - // narg = # of args - // arg = list of argument strings - - stop = s.find_first_of(",( \t\n",start); - if (s[stop] == '(') { - command = s.substr(start,stop-start); - start = stop+1; - narg = 0; - while (1) { - stop = s.find_first_of(",)",start); - if (stop == string::npos) { - fprintf(stderr,"ERROR: No trailing parenthesis in %s\n",s.c_str()); - exit(1); - } - arg.resize(narg+1); - arg[narg] = s.substr(start,stop-start); - narg++; - start = stop+1; - if (s[stop] == ')') { - start++; - break; - } - } - } else { - command = s.substr(start,stop-start); - start = stop+1; - narg = 0; - } - - // if only in scan mode, just operate on link command - - if (flag == 0) { - if (command == "link" && narg == 2) { - // s.erase(s.length()-1,1); - for (int i = 0; i < nlink; i++) - if (alias1[i] == arg[0]) { - fprintf(stderr,"ERROR: Link %s appears more than once\n", - arg[0].c_str()); - exit(1); - } - alias1.resize(nlink+1); - alias2.resize(nlink+1); - alias1[nlink] = arg[0]; - alias2[nlink] = arg[1]; - nlink++; - } else continue; - } - - // process the command - - if (command == "line") { - pre.append("
"); - } else if (command == "p") { - pre.append("

"); - post.insert(0,"

"); - } else if (command == "pre") { - pre.append("
");
-      post.insert(0,"
"); - } else if (command == "c") { - pre.append("
"); - post.insert(0,"
"); - } else if (command == "h1") { - pre.append("

"); - post.insert(0,"

"); - } else if (command == "h2") { - pre.append("

"); - post.insert(0,"

"); - } else if (command == "h3") { - pre.append("

"); - post.insert(0,"

"); - } else if (command == "h4") { - pre.append("

"); - post.insert(0,"

"); - } else if (command == "h5") { - pre.append("
"); - post.insert(0,"
"); - } else if (command == "h6") { - pre.append("
"); - post.insert(0,"
"); - } else if (command == "b") { - post.insert(0,"
"); - } else if (command == "ulb") { - pre.append("
    "); - } else if (command == "ule") { - post.insert(0,"
"); - } else if (command == "olb") { - pre.append("
    "); - } else if (command == "ole") { - post.insert(0,"
"); - } else if (command == "dlb") { - pre.append("
"); - } else if (command == "dle") { - post.insert(0,"
"); - } else if (command == "l") { - pre.append("
  • "); - } else if (command == "dt") { - pre.append("
    "); - } else if (command == "dd") { - pre.append("
    "); - } else if (command == "ul") { - listflag = command; - pre.append("
      "); - post.insert(0,"
    "); - } else if (command == "ol") { - listflag = command; - pre.append("
      "); - post.insert(0,"
    "); - } else if (command == "dl") { - listflag = command; - pre.append("
    "); - post.insert(0,"
    "); - } else if (command == "link") { - if (narg == 1) { - string aname = "
    "; - pre.append(aname); - } - } else if (command == "image") { - if (narg == 1) { - string img = ""; - pre.append(img); - } else if (narg == 2) { - string img = "" + - "" + ""; - pre.append(img); - } - } else if (command == "tb") { // read the table command and set settings - tableflag = 1; - - string tableborder = "1"; // these are the table defaults - rowquit = 0; - tablealign = "c"; - dataalign = "0"; - rowvalign = "0"; - - ncnum = 0; - ncalign = 0; - ncvalign = 0; - - cnum.clear(); - acolnum.clear(); - vacolnum.clear(); - - cwidth.clear(); - colalign.clear(); - colvalign.clear(); - - tabledelim = ","; - string tw = ""; - dwidth = "0"; - - for (int i = 0; i < narg; i++) { // loop through each tb() arg - int tbstop; - string tbcommand; - tbstop = 0; - tbstop = arg[i].find("="); - tbcommand = arg[i].substr(0,tbstop); - int n = arg[i].length(); - if (tbstop == -1) { - continue; - } else if (tbcommand == "c") { - string collumn= arg[i].substr (tbstop+1,n-(tbstop+1)); - rowquit = atoi(collumn.c_str()); - } else if (tbcommand == "s") { - tabledelim= arg[i].substr (tbstop+1,n-(tbstop+1)); - } else if (tbcommand == "b") { - tableborder= arg[i].substr (tbstop+1,n-(tbstop+1)); - } else if (tbcommand == "w") { - string width = "0"; - if (arg[i].substr (n-1,1) == "%") { - string width = arg[i].substr (tbstop+1,n-(tbstop+1)); - tw = " WIDTH=\"" + width + "\""; - } else - dwidth = arg[i].substr (tbstop+1,n-(tbstop+1)); - } else if (tbcommand == "ea") { - dataalign= arg[i].substr (tbstop+1,n-(tbstop+1)); - } else if (tbcommand == "eva") { - rowvalign= arg[i].substr (tbstop+1,n-(tbstop+1)); - } else if (tbcommand == "a") { - tablealign= arg[i].substr (tbstop+1,n-(tbstop+1)); - } else if (tbcommand.substr(0,2) == "cw") { - string cwnum= tbcommand.substr(2,tbstop-1); - cnum.resize(ncnum+1); - cnum[ncnum] = atoi(cwnum.c_str()); - cwidth.resize(ncnum+1); - cwidth[ncnum]= arg[i].substr(tbstop+1,n-(tbstop+1)); - ncnum++; - } else if (tbcommand.substr(0,2) == "ca") { - string canum= tbcommand.substr(2,tbstop-1); - acolnum.resize(ncalign+1); - acolnum[ncalign] = atoi(canum.c_str()); - colalign.resize(ncalign+1); - colalign[ncalign]= arg[i].substr(tbstop+1,n-(tbstop+1)); - ncalign++; - } else if (tbcommand.substr(0,3) == "cva") { - string cvanum= tbcommand.substr(2,tbstop-1); - vacolnum.resize(ncvalign+1); - vacolnum[ncvalign] = atoi(cvanum.c_str()); - colvalign.resize(ncvalign+1); - colvalign[ncvalign]= arg[i].substr(tbstop+1,n-(tbstop+1)); - ncvalign++; - } else { - fprintf(stderr, - "ERROR: Unrecognized table command %s\n",tbcommand.c_str()); - exit(1); - } - - tbstop = s.find("="); - } - - string align; - if (tablealign=="c") align="center"; - else if (tablealign=="r") align="right "; - else if (tablealign=="l") align="left "; - else align="center"; - string tablea = "
    " ; - pre.append(tablea); - pre.append("\n"; - pre.append(border); - post.insert(0,"
    \n"); - - } else if (command == "all") { - if (narg == 1) allflag = arg[0]; - - } else { - fprintf(stderr,"ERROR: Unrecognized command %s\n",command.c_str()); - exit(1); - } - } -} - -// perform substitutions within text of paragraph - -void substitute(string &s) -{ - size_t n,m,p; - char c; - string text,link,href; - string punctuation = ".,?!;:()"; - - // substitute for bold & italic markers - // if preceded by \ char, then leave markers in text - - n = s.find_first_of("[]{}"); - while (n != string::npos) { - c = s[n]; - if (n > 0 && s[n-1] == '\\') s.erase(n-1,1); - else { - s.erase(n,1); - if (c == '[') s.insert(n,""); - else if (c == ']') s.insert(n,""); - else if (c == '{') s.insert(n,""); - else if (c == '}') s.insert(n,""); - } - n = s.find_first_of("[]{}",n); - } - - // substitute for links - - n = s.find("\"_"); - while (n != string::npos) { - m = s.rfind("\"",n-1); - if (m == string::npos) { - fprintf(stderr,"ERROR: Could not find matching \" for \"_ in %s\n", - s.c_str()); - exit(1); - } - - p = s.find_first_of(" \t\n",n) - 1; - if (p == string::npos) { - fprintf(stderr,"ERROR: Could not find end-of-link in %s\n",s.c_str()); - exit(1); - } - while (s.find_first_of(".,?!;:()",p) == p) p--; - - text = s.substr(m+1,n-m-1); - link = s.substr(n+2,p-n-1); - for (int i = 0; i < nlink; i++) - if (alias1[i] == link) { - link = alias2[i]; - break; - } - - s.erase(m,p-m+1); - href = "" + text + ""; - s.insert(m,href); - n = s.find("\"_"); - } - - // format the paragraph as a table - - if (tableflag) { - tableflag = 0; - - string DT; - - // set up tag - // alignment for data in rows - - string tbalign; - if (dataalign != "0"){ - string align; - if (dataalign=="c") align="\"center\""; - else if (dataalign=="r") align="\"right\""; - else if (dataalign=="l") align="\"left\""; - else { - fprintf(stderr, - "ERROR: Unrecognized table alignment argument %s for ea=X\n", - dataalign.c_str()); - exit(1); - } - tbalign = " ALIGN=" + align; - } else tbalign=""; - - // set up vertical alignment for particular columns - - string va; - if (rowvalign != "0"){ - string valign; - if (rowvalign == "t") valign= "top"; - else if (rowvalign == "m") valign= "middle"; - else if (rowvalign == "ba") valign= "baseline"; - else if (rowvalign == "bo") valign= "bottom"; - else { - fprintf(stderr, - "ERROR: Unrecognized table alignment argument %s for eva=X\n", - rowvalign.c_str()); - exit(1); - } - va = " VALIGN =\"" + valign + "\""; - } else va=""; - - //tr_tag is keyword for data in rows - - string tr_tag= ""; - - //declare integers to help with counting and finding position - - int currentc=0; // current column - int nend = 0; - int n1=0; - long n = find_n(s,nend,n1); - - // if there are no separators, go to the end of the string - - if (n < 0) n = s.length(); - - // while n exists: - - while (n != static_cast(string::npos)) { - - // ignore = 0 when pass by \n because looking for delimiters only - // when ignore==0 do not put in a - int ignore=1; - - // For each loop starts nend at n - nend=n; - - // current column is 0, (very first loop), insert first - if (currentc == 0){ - currentc++; - DT=td_tag(currentc); - s.insert(0,tr_tag); - s.insert(tr_tag.length(),DT); - nend=nend+tr_tag.length()+DT.length(); - n = find_n(s,nend,n1); - if (n==n1) currentc++; - else { - // currentc will remain one if rowquit==0 - if (rowquit>0){ - s.erase(n,1); - n = find_n(s,nend,n1); - currentc++; - } - } - } else { - - // if n is separator - if (n == n1){ - s.erase(n,tabledelim.length()); - if(currentc==(rowquit+1)&& rowquit!=0){ - s.insert(nend,"\n"); - nend=nend+11; - // set current column back to one to start new line - currentc=1; - }else{ - DT= td_tag(currentc); - s.insert (nend,""); - nend=nend+5; - s.insert (nend,DT); - nend=nend+DT.length(); - // add one so current column is updated - currentc++; - n = find_n(s,nend,n1); - } - - } - //if n is newline character - else{ - s.erase(n,1); - // if columns == 0 means ARE searching for newlines - // else erase and ignore insert later and - // search for next separator - - if (rowquit==0){ - s.insert(nend,"\n"); - nend=nend+11; - // set current column back to one to start new line - currentc=1; - }else{ - ignore=0; - n = find_n(s,nend,n1); - } - } - - // if we are at the beginning of the row then insert - - if (currentc==1&&ignore) { - DT = td_tag(currentc); // find DT for currentc=1 - s.insert(nend,tr_tag); - nend=nend+tr_tag.length(); - s.insert(nend,DT); - n = find_n(s,nend,n1); // search for next separator - currentc++; - } - } // end to else statement - } // end to while loop - } // end to if tableflag - - // if listflag is set, put list marker at beginning of every line - - if (listflag != "") { - string marker; - int toggle = 0; - - n = s.find('\n'); - while (n != string::npos) { - m = s.rfind('\n',n-1); - if (listflag == "dl" && toggle == 0) marker = "
    "; - else if (listflag == "dl" && toggle == 1) marker = "
    "; - else marker = "
  • "; - if (m == string::npos) s.insert(0,marker); - else s.insert(m+1,marker); - n = s.find('\n',m+1); - n = s.find('\n',n+1); - if (toggle) toggle = 0; - else toggle = 1; - } - - listflag = ""; - } - - // if allflag is set, add markers to every line - - if (allflag != "") { - string marker1,marker2; - if (allflag == "p") { - marker1 = "

    "; - marker2 = "

    "; - } else if (allflag == "c") { - marker1 = "
    "; - marker2 = "
    "; - } else if (allflag == "b") { - marker1 = ""; - marker2 = "
    "; - } else if (allflag == "l") { - marker1 = "
  • "; - marker2 = ""; - } else marker1 = marker2 = ""; - - n = s.find('\n'); - while (n != string::npos) { - m = s.rfind('\n',n-1); - if (m == string::npos) s.insert(0,marker1); - else s.insert(m+1,marker1); - n = s.find('\n',m+1); - s.insert(n,marker2); - n = s.find('\n',n); - n = s.find('\n',n+1); - } - - allflag = ""; - } -} - -// open input file as-is or as file.txt -// if npair = 0, don't open output file (is just initial pass thru input) -// if npair = 1, open output file as stdout -// if npair > 1, open output file with .html suffix -// either replace .txt in input file, or append .html - -void file_open(int npair, string &infile, FILE **in, FILE **out) -{ - *in = fopen(infile.c_str(),"r"); - if (*in == NULL) { - string root = infile; - infile = infile + ".txt"; - *in = fopen(infile.c_str(),"r"); - if (*in == NULL) { - fprintf(stderr,"ERROR: Could not open %s or %s\n", - root.c_str(),infile.c_str()); - exit(1); - } - } - - if (npair == 0) return; - else if (npair == 1) *out = stdout; - else { - string outfile; - size_t pos = infile.rfind(".txt"); - if (pos == infile.length()-4) outfile = infile.substr(0,pos) + ".html"; - else outfile = infile + ".html"; - *out = fopen(outfile.c_str(),"w"); - if (*out == NULL) { - fprintf(stderr,"ERROR: Could not open %s\n",outfile.c_str()); - exit(1); - } - } -} - -// for tables: -// build string (DT) based on current column - -string td_tag(int currentc) { - - // eacolumn gives the alignment printout of a specific column - string eacolumn; - // va gives vertical alignment to a specific column - string va; - // DT is the complete tag, with width and align - string DT; - // dw is the width for tables. It is also the
    tag beginning - string dw; - - // set up alignment for particular columns - - for (int counter=0; counter < ncalign; counter++){ - if (ncalign != 0 && acolnum[counter] == currentc){ - string align; - if (colalign[counter] == "l") align= "left"; - else if (colalign[counter] == "r") align= "right"; - else if (colalign[counter] == "c") align= "center"; - else { - fprintf(stderr, - "ERROR: Unrecognized table alignment argument %s for caM=X\n", - colalign[counter].c_str()); - exit(1); - } - eacolumn= " ALIGN =\"" + align +"\""; - }else eacolumn= ""; - } - - // set up vertical alignment for particular columns - - for (int counter=0; counter < ncvalign; counter++){ - if (ncvalign != 0 && vacolnum[counter] == currentc){ - string valign; - if (colvalign[counter] == "t") valign= "top"; - else if (colvalign[counter] == "m") valign= "middle"; - else if (colvalign[counter] == "ba") valign= "baseline"; - else if (colvalign[counter] == "bo") valign= "bottom"; - else { - fprintf(stderr, - "ERROR: Unrecognized table alignment argument %s for cvaM=X\n", - colvalign[counter].c_str()); - exit(1); - } - va = " VALIGN =\"" + valign + "\""; - } else va = " "; - } - - // put in special width if specified - // new code - // if dwidth has not been set, dw is blank - // if dwidth has been set, dw has that... unless - - if (dwidth=="0") dw = " "; - else dw =" WIDTH=\""+ dwidth + "\""; - - for (int counter = 0; counter < ncnum; counter++){ - // if it is the right column, dw = cwidth property - if (cnum[counter] == currentc) dw= " WIDTH=\"" + cwidth[counter] + "\""; - } - - // DT is set for all of this particular separator : reset next separator - - DT = ""; - - return DT; -} - -// for tables: -// find the next separator starting at nend(the end of the last .insert) -// if there is either a delim or newline -// decide which is first -// set n = to that position -// nsep is position of the next separator. changes in here. - -long find_n(string &s, int nend, int &nsep) - // nsep is position of the next separator. changes in here. -{ - long n; - nsep = s.find(tabledelim,nend); - long n2 = s.find('\n',nend); - long m = s.length() - 1; - if (nsep >= 0 && n2 >= 0) { - if (nsep <= n2) n = nsep; - else n = n2; - } else { - if (nsep >= 0) n = nsep; - else{ - if (n2 < m) n = n2; - else n = string::npos; - } - } - - return n; -} From 9e7ca428aade7fdfad8254c63833a390e2f983a7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 3 Nov 2019 10:57:18 -0500 Subject: [PATCH 384/418] whitespace cleanup: remove (evil) tabs --- src/BODY/body_rounded_polygon.cpp | 8 +- src/BODY/body_rounded_polyhedron.cpp | 4 +- src/CLASS2/pair_lj_class2.cpp | 20 +- src/CLASS2/pair_lj_class2_coul_long.cpp | 36 +-- src/KOKKOS/atom_vec_sphere_kokkos.cpp | 144 ++++++------ src/KOKKOS/fix_enforce2d_kokkos.cpp | 4 +- src/KOKKOS/fix_neigh_history_kokkos.cpp | 44 ++-- src/KOKKOS/npair_kokkos.cpp | 208 +++++++++--------- src/KOKKOS/pair_gran_hooke_history_kokkos.cpp | 148 ++++++------- src/KOKKOS/verlet_kokkos.cpp | 4 +- src/KSPACE/ewald_disp.cpp | 2 +- src/KSPACE/pppm_disp.cpp | 4 +- src/SPIN/atom_vec_spin.h | 12 +- src/SPIN/fix_langevin_spin.h | 16 +- src/SPIN/fix_neb_spin.h | 24 +- src/SPIN/fix_nve_spin.cpp | 8 +- src/SPIN/fix_nve_spin.h | 36 +-- src/SPIN/fix_precession_spin.cpp | 8 +- src/SPIN/fix_precession_spin.h | 14 +- src/SPIN/min_spin.cpp | 6 +- src/SPIN/min_spin_cg.cpp | 12 +- src/SPIN/min_spin_cg.h | 30 +-- src/SPIN/min_spin_lbfgs.cpp | 8 +- src/SPIN/min_spin_lbfgs.h | 32 +-- src/SPIN/neb_spin.cpp | 108 ++++----- src/SPIN/pair_spin.h | 4 +- src/SPIN/pair_spin_dipole_cut.cpp | 42 ++-- src/SPIN/pair_spin_dipole_cut.h | 14 +- src/SPIN/pair_spin_dipole_long.h | 14 +- src/SPIN/pair_spin_dmi.h | 10 +- src/SPIN/pair_spin_exchange.h | 8 +- src/SPIN/pair_spin_magelec.h | 8 +- src/SPIN/pair_spin_neel.h | 12 +- src/USER-MISC/compute_hma.cpp | 2 +- src/USER-MISC/fix_bond_react.cpp | 12 +- src/USER-MISC/pair_ilp_graphene_hbn.cpp | 14 +- src/USER-MISC/pair_kolmogorov_crespi_full.cpp | 28 +-- src/USER-MISC/pair_lj_expand_coul_long.cpp | 4 +- src/USER-MISC/pair_local_density.cpp | 88 ++++---- src/USER-MISC/pair_local_density.h | 12 +- src/USER-OMP/reaxc_init_md_omp.cpp | 4 +- src/USER-REAXC/reaxc_ffield.cpp | 2 +- src/force.cpp | 6 +- src/min.h | 8 +- src/min_cg.cpp | 8 +- src/min_fire.cpp | 6 +- src/min_sd.cpp | 6 +- 47 files changed, 626 insertions(+), 626 deletions(-) diff --git a/src/BODY/body_rounded_polygon.cpp b/src/BODY/body_rounded_polygon.cpp index d60372781a..d855c5aea7 100644 --- a/src/BODY/body_rounded_polygon.cpp +++ b/src/BODY/body_rounded_polygon.cpp @@ -116,7 +116,7 @@ double BodyRoundedPolygon::enclosing_radius(struct AtomVecBody::Bonus *bonus) { int nvertices = bonus->ivalue[0]; if (nvertices == 1 || nvertices == 2) - return *(bonus->dvalue+3*nsub(bonus)+2); + return *(bonus->dvalue+3*nsub(bonus)+2); return *(bonus->dvalue + 3*nsub(bonus) + 2*nsub(bonus)); } @@ -126,7 +126,7 @@ double BodyRoundedPolygon::rounded_radius(struct AtomVecBody::Bonus *bonus) { int nvertices = bonus->ivalue[0]; if (nvertices == 1 || nvertices == 2) - return *(bonus->dvalue+3*nsub(bonus)+2+1); + return *(bonus->dvalue+3*nsub(bonus)+2+1); return *(bonus->dvalue + 3*nsub(bonus) + 2*nsub(bonus)+1); } @@ -156,7 +156,7 @@ int BodyRoundedPolygon::unpack_border_body(AtomVecBody::Bonus *bonus, ------------------------------------------------------------------------- */ void BodyRoundedPolygon::data_body(int ibonus, int ninteger, int ndouble, - int *ifile, double *dfile) + int *ifile, double *dfile) { AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; @@ -327,7 +327,7 @@ void BodyRoundedPolygon::data_body(int ibonus, int ninteger, int ndouble, ------------------------------------------------------------------------- */ double BodyRoundedPolygon::radius_body(int /*ninteger*/, int ndouble, - int *ifile, double *dfile) + int *ifile, double *dfile) { int nsub = ifile[0]; if (nsub < 1) diff --git a/src/BODY/body_rounded_polyhedron.cpp b/src/BODY/body_rounded_polyhedron.cpp index 49ec6f1d78..a82404ab15 100644 --- a/src/BODY/body_rounded_polyhedron.cpp +++ b/src/BODY/body_rounded_polyhedron.cpp @@ -134,7 +134,7 @@ double BodyRoundedPolyhedron::enclosing_radius(struct AtomVecBody::Bonus *bonus) { int nvertices = bonus->ivalue[0]; if (nvertices == 1 || nvertices == 2) - return *(bonus->dvalue+3*nsub(bonus)+2); + return *(bonus->dvalue+3*nsub(bonus)+2); return *(bonus->dvalue+3*nsub(bonus) + 2*nedges(bonus) + MAX_FACE_SIZE*nfaces(bonus)); } @@ -385,7 +385,7 @@ void BodyRoundedPolyhedron::data_body(int ibonus, int ninteger, int ndouble, ------------------------------------------------------------------------- */ double BodyRoundedPolyhedron::radius_body(int /*ninteger*/, int ndouble, - int *ifile, double *dfile) + int *ifile, double *dfile) { int nsub = ifile[0]; int ned = ifile[1]; diff --git a/src/CLASS2/pair_lj_class2.cpp b/src/CLASS2/pair_lj_class2.cpp index 641ca67226..c930173864 100644 --- a/src/CLASS2/pair_lj_class2.cpp +++ b/src/CLASS2/pair_lj_class2.cpp @@ -188,8 +188,8 @@ void PairLJClass2::compute_inner() if (rsq < cut_out_off_sq) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; r6inv = r3inv*r3inv; jtype = type[j]; forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); @@ -268,8 +268,8 @@ void PairLJClass2::compute_middle() if (rsq < cut_out_off_sq && rsq > cut_in_off_sq) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; r6inv = r3inv*r3inv; jtype = type[j]; forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); @@ -352,8 +352,8 @@ void PairLJClass2::compute_outer(int eflag, int vflag) if (rsq < cutsq[itype][jtype]) { if (rsq > cut_in_off_sq) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; r6inv = r3inv*r3inv; forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); fpair = factor_lj*forcelj*r2inv; @@ -374,8 +374,8 @@ void PairLJClass2::compute_outer(int eflag, int vflag) if (eflag) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; r6inv = r3inv*r3inv; evdwl = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - offset[itype][jtype]; @@ -385,8 +385,8 @@ void PairLJClass2::compute_outer(int eflag, int vflag) if (vflag) { if (rsq <= cut_in_off_sq) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; r6inv = r3inv*r3inv; forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); fpair = factor_lj*forcelj*r2inv; diff --git a/src/CLASS2/pair_lj_class2_coul_long.cpp b/src/CLASS2/pair_lj_class2_coul_long.cpp index 5487878f27..c2b127fa58 100644 --- a/src/CLASS2/pair_lj_class2_coul_long.cpp +++ b/src/CLASS2/pair_lj_class2_coul_long.cpp @@ -262,8 +262,8 @@ void PairLJClass2CoulLong::compute_inner() jtype = type[j]; if (rsq < cut_ljsq[itype][jtype]) { - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; r6inv = r3inv*r3inv; forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); } else forcelj = 0.0; @@ -354,8 +354,8 @@ void PairLJClass2CoulLong::compute_middle() jtype = type[j]; if (rsq < cut_ljsq[itype][jtype]) { - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; r6inv = r3inv*r3inv; forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); } else forcelj = 0.0; @@ -487,9 +487,9 @@ void PairLJClass2CoulLong::compute_outer(int eflag, int vflag) } else forcecoul = 0.0; if (rsq < cut_ljsq[itype][jtype] && rsq > cut_in_off_sq) { - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); if (rsq < cut_in_on_sq) { rsw = (sqrt(rsq) - cut_in_off)/cut_in_diff; @@ -525,9 +525,9 @@ void PairLJClass2CoulLong::compute_outer(int eflag, int vflag) } else ecoul = 0.0; if (rsq < cut_ljsq[itype][jtype]) { - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; evdwl = r6inv*(lj3[itype][jtype]*r3inv-lj4[itype][jtype]) - offset[itype][jtype]; evdwl *= factor_lj; @@ -552,13 +552,13 @@ void PairLJClass2CoulLong::compute_outer(int eflag, int vflag) if (rsq <= cut_in_off_sq) { rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); } else if (rsq <= cut_in_on_sq) { - rinv = sqrt(r2inv); - r3inv = r2inv*rinv; - r6inv = r3inv*r3inv; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + r6inv = r3inv*r3inv; forcelj = r6inv * (lj1[itype][jtype]*r3inv - lj2[itype][jtype]); } fpair = (forcecoul + factor_lj*forcelj) * r2inv; @@ -672,14 +672,14 @@ void PairLJClass2CoulLong::init_style() if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; - if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; + if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; } irequest = neighbor->request(this,instance_me); if (respa >= 1) { neighbor->requests[irequest]->respaouter = 1; - neighbor->requests[irequest]->respainner = 1; + neighbor->requests[irequest]->respainner = 1; } if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; @@ -690,7 +690,7 @@ void PairLJClass2CoulLong::init_style() if (strstr(update->integrate_style,"respa") && ((Respa *) update->integrate)->level_inner >= 0) cut_respa = ((Respa *) update->integrate)->cutoff; - else cut_respa = NULL; + else cut_respa = NULL; // insure use of KSpace long-range solver, set g_ewald diff --git a/src/KOKKOS/atom_vec_sphere_kokkos.cpp b/src/KOKKOS/atom_vec_sphere_kokkos.cpp index 7e217df2a6..67aaa32c21 100644 --- a/src/KOKKOS/atom_vec_sphere_kokkos.cpp +++ b/src/KOKKOS/atom_vec_sphere_kokkos.cpp @@ -247,13 +247,13 @@ struct AtomVecSphereKokkos_PackComm { _buf(i,2) = _x(j,2); } else { if (TRICLINIC == 0) { - _buf(i,0) = _x(j,0) + _pbc[0]*_xprd; - _buf(i,1) = _x(j,1) + _pbc[1]*_yprd; - _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; + _buf(i,0) = _x(j,0) + _pbc[0]*_xprd; + _buf(i,1) = _x(j,1) + _pbc[1]*_yprd; + _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; } else { - _buf(i,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; - _buf(i,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; - _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; + _buf(i,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; + _buf(i,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; + _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; } } _buf(i,3) = _radius(j); @@ -419,13 +419,13 @@ struct AtomVecSphereKokkos_PackCommVel { _buf(i,2) = _x(j,2); } else { if (TRICLINIC == 0) { - _buf(i,0) = _x(j,0) + _pbc[0]*_xprd; - _buf(i,1) = _x(j,1) + _pbc[1]*_yprd; - _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; + _buf(i,0) = _x(j,0) + _pbc[0]*_xprd; + _buf(i,1) = _x(j,1) + _pbc[1]*_yprd; + _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; } else { - _buf(i,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; - _buf(i,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; - _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; + _buf(i,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; + _buf(i,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; + _buf(i,2) = _x(j,2) + _pbc[2]*_zprd; } } if (DEFORM_VREMAP == 0) { @@ -772,13 +772,13 @@ struct AtomVecSphereKokkos_PackCommSelf { _xw(i+_nfirst,2) = _x(j,2); } else { if (TRICLINIC == 0) { - _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd; - _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd; - _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; + _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd; + _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd; + _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; } else { - _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; - _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; - _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; + _xw(i+_nfirst,0) = _x(j,0) + _pbc[0]*_xprd + _pbc[5]*_xy + _pbc[4]*_xz; + _xw(i+_nfirst,1) = _x(j,1) + _pbc[1]*_yprd + _pbc[3]*_yz; + _xw(i+_nfirst,2) = _x(j,2) + _pbc[2]*_zprd; } } _radius(i+_nfirst) = _radius(j); @@ -799,39 +799,39 @@ int AtomVecSphereKokkos::pack_comm_self( atomKK->modified(Host,X_MASK|RADIUS_MASK|RMASS_MASK); if(pbc_flag) { if(domain->triclinic) { - struct AtomVecSphereKokkos_PackCommSelf f( + struct AtomVecSphereKokkos_PackCommSelf f( atomKK->k_x, - atomKK->k_radius,atomKK->k_rmass, - nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); + atomKK->k_radius,atomKK->k_rmass, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); } else { - struct AtomVecSphereKokkos_PackCommSelf f( + struct AtomVecSphereKokkos_PackCommSelf f( atomKK->k_x, - atomKK->k_radius,atomKK->k_rmass, - nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); + atomKK->k_radius,atomKK->k_rmass, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); } } else { if(domain->triclinic) { - struct AtomVecSphereKokkos_PackCommSelf f( + struct AtomVecSphereKokkos_PackCommSelf f( atomKK->k_x, - atomKK->k_radius,atomKK->k_rmass, - nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); + atomKK->k_radius,atomKK->k_rmass, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); } else { - struct AtomVecSphereKokkos_PackCommSelf f( + struct AtomVecSphereKokkos_PackCommSelf f( atomKK->k_x, - atomKK->k_radius,atomKK->k_rmass, - nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); + atomKK->k_radius,atomKK->k_rmass, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); } } } else { @@ -839,39 +839,39 @@ int AtomVecSphereKokkos::pack_comm_self( atomKK->modified(Device,X_MASK|RADIUS_MASK|RMASS_MASK); if(pbc_flag) { if(domain->triclinic) { - struct AtomVecSphereKokkos_PackCommSelf f( + struct AtomVecSphereKokkos_PackCommSelf f( atomKK->k_x, - atomKK->k_radius,atomKK->k_rmass, - nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); + atomKK->k_radius,atomKK->k_rmass, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); } else { - struct AtomVecSphereKokkos_PackCommSelf f( + struct AtomVecSphereKokkos_PackCommSelf f( atomKK->k_x, - atomKK->k_radius,atomKK->k_rmass, - nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); + atomKK->k_radius,atomKK->k_rmass, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); } } else { if(domain->triclinic) { - struct AtomVecSphereKokkos_PackCommSelf f( + struct AtomVecSphereKokkos_PackCommSelf f( atomKK->k_x, - atomKK->k_radius,atomKK->k_rmass, - nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); + atomKK->k_radius,atomKK->k_rmass, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); } else { - struct AtomVecSphereKokkos_PackCommSelf f( + struct AtomVecSphereKokkos_PackCommSelf f( atomKK->k_x, - atomKK->k_radius,atomKK->k_rmass, - nfirst,list,iswap, - domain->xprd,domain->yprd,domain->zprd, - domain->xy,domain->xz,domain->yz,pbc); - Kokkos::parallel_for(n,f); + atomKK->k_radius,atomKK->k_rmass, + nfirst,list,iswap, + domain->xprd,domain->yprd,domain->zprd, + domain->xy,domain->xz,domain->yz,pbc); + Kokkos::parallel_for(n,f); } } } @@ -1037,7 +1037,7 @@ void AtomVecSphereKokkos::unpack_comm_vel_kokkos( /* ---------------------------------------------------------------------- */ int AtomVecSphereKokkos::pack_comm(int n, int *list, double *buf, - int pbc_flag, int *pbc) + int pbc_flag, int *pbc) { int i,j,m; double dx,dy,dz; @@ -1109,7 +1109,7 @@ int AtomVecSphereKokkos::pack_comm(int n, int *list, double *buf, /* ---------------------------------------------------------------------- */ int AtomVecSphereKokkos::pack_comm_vel(int n, int *list, double *buf, - int pbc_flag, int *pbc) + int pbc_flag, int *pbc) { int i,j,m; double dx,dy,dz,dvx,dvy,dvz; @@ -1926,7 +1926,7 @@ struct AtomVecSphereKokkos_UnpackBorder { /* ---------------------------------------------------------------------- */ void AtomVecSphereKokkos::unpack_border_kokkos(const int &n, const int &first, - const DAT::tdual_xfloat_2d &buf,ExecutionSpace space) { + const DAT::tdual_xfloat_2d &buf,ExecutionSpace space) { while (first+n >= nmax) grow(0); if(space==Host) { struct AtomVecSphereKokkos_UnpackBorder f(buf.view(), @@ -1943,7 +1943,7 @@ void AtomVecSphereKokkos::unpack_border_kokkos(const int &n, const int &first, } atomKK->modified(space,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK| - RADIUS_MASK|RMASS_MASK); + RADIUS_MASK|RMASS_MASK); } /* ---------------------------------------------------------------------- */ @@ -2053,7 +2053,7 @@ void AtomVecSphereKokkos::unpack_border_vel_kokkos( } atomKK->modified(space,X_MASK|TAG_MASK|TYPE_MASK|MASK_MASK| - RADIUS_MASK|RMASS_MASK|V_MASK|OMEGA_MASK); + RADIUS_MASK|RMASS_MASK|V_MASK|OMEGA_MASK); } /* ---------------------------------------------------------------------- */ @@ -2496,7 +2496,7 @@ int AtomVecSphereKokkos::unpack_restart(double *buf) atomKK->modified(Host,X_MASK | TAG_MASK | TYPE_MASK | MASK_MASK | IMAGE_MASK | V_MASK | - RADIUS_MASK | RMASS_MASK | OMEGA_MASK); + RADIUS_MASK | RMASS_MASK | OMEGA_MASK); atom->nlocal++; return m; diff --git a/src/KOKKOS/fix_enforce2d_kokkos.cpp b/src/KOKKOS/fix_enforce2d_kokkos.cpp index bf2a882539..205451d96f 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.cpp +++ b/src/KOKKOS/fix_enforce2d_kokkos.cpp @@ -34,10 +34,10 @@ FixEnforce2DKokkos::FixEnforce2DKokkos(LAMMPS *lmp, int narg, char * execution_space = ExecutionSpaceFromDevice::space; datamask_read = V_MASK | F_MASK | OMEGA_MASK | MASK_MASK - | TORQUE_MASK | ANGMOM_MASK; + | TORQUE_MASK | ANGMOM_MASK; datamask_modify = V_MASK | F_MASK | OMEGA_MASK - | TORQUE_MASK | ANGMOM_MASK; + | TORQUE_MASK | ANGMOM_MASK; } diff --git a/src/KOKKOS/fix_neigh_history_kokkos.cpp b/src/KOKKOS/fix_neigh_history_kokkos.cpp index 8cfe7111dd..7906d37cc3 100644 --- a/src/KOKKOS/fix_neigh_history_kokkos.cpp +++ b/src/KOKKOS/fix_neigh_history_kokkos.cpp @@ -122,21 +122,21 @@ void FixNeighHistoryKokkos::pre_exchange_item(const int &ii) const j &= NEIGHMASK; int m = Kokkos::atomic_fetch_add(&d_npartner[i],1); if (m < maxpartner) { - d_partner(i,m) = tag[j]; - for (int k = 0; k < dnum; k++) - d_valuepartner(i,dnum*m+k) = d_firstvalue(i,dnum*jj+k); + d_partner(i,m) = tag[j]; + for (int k = 0; k < dnum; k++) + d_valuepartner(i,dnum*m+k) = d_firstvalue(i,dnum*jj+k); } else { - d_resize() = 1; + d_resize() = 1; } if (j < nlocal_neigh) { - m = Kokkos::atomic_fetch_add(&d_npartner[j],1); - if (m < maxpartner) { - d_partner(j,m) = tag[i]; - for (int k = 0; k < dnum; k++) - d_valuepartner(j,dnum*m+k) = d_firstvalue(i,dnum*jj+k); - } else { - d_resize() = 1; - } + m = Kokkos::atomic_fetch_add(&d_npartner[j],1); + if (m < maxpartner) { + d_partner(j,m) = tag[i]; + for (int k = 0; k < dnum; k++) + d_valuepartner(j,dnum*m+k) = d_firstvalue(i,dnum*jj+k); + } else { + d_resize() = 1; + } } } } @@ -205,22 +205,22 @@ void FixNeighHistoryKokkos::post_neighbor_item(const int &ii) const if (rflag) { int jtag = tag(j); for (m = 0; m < np; m++) - if (d_partner(i, m) == jtag) break; + if (d_partner(i, m) == jtag) break; if (m < np) { - d_firstflag(i,jj) = 1; - for (int k = 0; k < dnum; k++) { - d_firstvalue(i, dnum*jj+k) = d_valuepartner(i, dnum*m+k); - } + d_firstflag(i,jj) = 1; + for (int k = 0; k < dnum; k++) { + d_firstvalue(i, dnum*jj+k) = d_valuepartner(i, dnum*m+k); + } } else { - d_firstflag(i,jj) = 0; - for (int k = 0; k < dnum; k++) { - d_firstvalue(i, dnum*jj+k) = 0; - } + d_firstflag(i,jj) = 0; + for (int k = 0; k < dnum; k++) { + d_firstvalue(i, dnum*jj+k) = 0; + } } } else { d_firstflag(i,jj) = 0; for (int k = 0; k < dnum; k++) { - d_firstvalue(i, dnum*jj+k) = 0; + d_firstvalue(i, dnum*jj+k) = 0; } } } diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 4daf4b84c5..5470001967 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -224,49 +224,49 @@ void NPairKokkos::build(NeighList *list_) Kokkos::parallel_for(nall, f); } else { if (newton_pair) { - if (SIZE) { - NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + if (SIZE) { + NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); #ifdef KOKKOS_ENABLE_CUDA - if (ExecutionSpaceFromDevice::space == Device) - Kokkos::parallel_for(config, f); - else - Kokkos::parallel_for(nall, f); + if (ExecutionSpaceFromDevice::space == Device) + Kokkos::parallel_for(config, f); + else + Kokkos::parallel_for(nall, f); #else - Kokkos::parallel_for(nall, f); + Kokkos::parallel_for(nall, f); #endif - } else { - NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + } else { + NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); #ifdef KOKKOS_ENABLE_CUDA - if (ExecutionSpaceFromDevice::space == Device) - Kokkos::parallel_for(config, f); - else - Kokkos::parallel_for(nall, f); + if (ExecutionSpaceFromDevice::space == Device) + Kokkos::parallel_for(config, f); + else + Kokkos::parallel_for(nall, f); #else - Kokkos::parallel_for(nall, f); + Kokkos::parallel_for(nall, f); #endif - } + } } else { - if (SIZE) { - NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + if (SIZE) { + NPairKokkosBuildFunctorSize f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); #ifdef KOKKOS_ENABLE_CUDA - if (ExecutionSpaceFromDevice::space == Device) - Kokkos::parallel_for(config, f); - else - Kokkos::parallel_for(nall, f); + if (ExecutionSpaceFromDevice::space == Device) + Kokkos::parallel_for(config, f); + else + Kokkos::parallel_for(nall, f); #else - Kokkos::parallel_for(nall, f); + Kokkos::parallel_for(nall, f); #endif - } else { - NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); + } else { + NPairKokkosBuildFunctor f(data,atoms_per_bin * 5 * sizeof(X_FLOAT) * factor); #ifdef KOKKOS_ENABLE_CUDA - if (ExecutionSpaceFromDevice::space == Device) - Kokkos::parallel_for(config, f); - else - Kokkos::parallel_for(nall, f); + if (ExecutionSpaceFromDevice::space == Device) + Kokkos::parallel_for(config, f); + else + Kokkos::parallel_for(nall, f); #else - Kokkos::parallel_for(nall, f); + Kokkos::parallel_for(nall, f); #endif - } + } } } Kokkos::deep_copy(h_scalars, d_scalars); @@ -871,8 +871,8 @@ void NeighborKokkosExecute:: if(rsq <= cutsq) { if(n:: if(HalfNeigh && !Newton && (j < i)) continue; if(!HalfNeigh && j==i) continue; if(Tri) { - if (x(j,2) < ztmp) continue; - if (x(j,2) == ztmp) { - if (x(j,1) < ytmp) continue; - if (x(j,1) == ytmp) { - if (x(j,0) < xtmp) continue; - if (x(j,0) == xtmp && j <= i) continue; - } - } + if (x(j,2) < ztmp) continue; + if (x(j,2) == ztmp) { + if (x(j,1) < ytmp) continue; + if (x(j,1) == ytmp) { + if (x(j,0) < xtmp) continue; + if (x(j,0) == xtmp && j <= i) continue; + } + } } if(exclude && exclusion(i,j,itype,jtype)) continue; @@ -911,11 +911,11 @@ void NeighborKokkosExecute:: const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); if(rsq <= cutsq) { - if(n::build_ItemSizeCuda(typename Kokkos::Team if(i >= 0 && i < nlocal) { #pragma unroll 4 for(int m = 0; m < bincount_current; m++) { - int j = other_id[m]; - const int jtype = other_x[m + 3 * atoms_per_bin]; + int j = other_id[m]; + const int jtype = other_x[m + 3 * atoms_per_bin]; - //for same bin as atom i skip j if i==j and skip atoms "below and to the left" if using halfneighborlists - if((j == i) || - (HalfNeigh && !Newton && (j < i)) || - (HalfNeigh && Newton && + //for same bin as atom i skip j if i==j and skip atoms "below and to the left" if using halfneighborlists + if((j == i) || + (HalfNeigh && !Newton && (j < i)) || + (HalfNeigh && Newton && ((j < i) || - ((j >= nlocal) && ((x(j, 2) < ztmp) || (x(j, 2) == ztmp && x(j, 1) < ytmp) || - (x(j, 2) == ztmp && x(j, 1) == ytmp && x(j, 0) < xtmp))))) - ) continue; + ((j >= nlocal) && ((x(j, 2) < ztmp) || (x(j, 2) == ztmp && x(j, 1) < ytmp) || + (x(j, 2) == ztmp && x(j, 1) == ytmp && x(j, 0) < xtmp))))) + ) continue; if(Tri) { if (x(j,2) < ztmp) continue; if (x(j,2) == ztmp) { @@ -1011,21 +1011,21 @@ void NeighborKokkosExecute::build_ItemSizeCuda(typename Kokkos::Team } } } - if(exclude && exclusion(i,j,itype,jtype)) continue; - const X_FLOAT delx = xtmp - other_x[m]; - const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; - const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; - const X_FLOAT rsq = delx * delx + dely * dely + delz * delz; - const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; - const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); + if(exclude && exclusion(i,j,itype,jtype)) continue; + const X_FLOAT delx = xtmp - other_x[m]; + const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; + const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; + const X_FLOAT rsq = delx * delx + dely * dely + delz * delz; + const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; + const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); - if(rsq <= cutsq) { - if(n::build_ItemSizeCuda(typename Kokkos::Team int j = MY_II < bincount_current ? c_bins(jbin, MY_II) : -1; if(j >= 0) { - other_x[MY_II] = x(j, 0); - other_x[MY_II + atoms_per_bin] = x(j, 1); - other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); - other_x[MY_II + 3 * atoms_per_bin] = type(j); - other_x[MY_II + 4 * atoms_per_bin] = radius(j); + other_x[MY_II] = x(j, 0); + other_x[MY_II + atoms_per_bin] = x(j, 1); + other_x[MY_II + 2 * atoms_per_bin] = x(j, 2); + other_x[MY_II + 3 * atoms_per_bin] = type(j); + other_x[MY_II + 4 * atoms_per_bin] = radius(j); } other_id[MY_II] = j; @@ -1054,40 +1054,40 @@ void NeighborKokkosExecute::build_ItemSizeCuda(typename Kokkos::Team if(i >= 0 && i < nlocal) { #pragma unroll 8 - for(int m = 0; m < bincount_current; m++) { - const int j = other_id[m]; - const int jtype = other_x[m + 3 * atoms_per_bin]; + for(int m = 0; m < bincount_current; m++) { + const int j = other_id[m]; + const int jtype = other_x[m + 3 * atoms_per_bin]; - if(HalfNeigh && (j < i)) continue; - if(HalfNeigh && !Newton && (j < i)) continue; - if(!HalfNeigh && j==i) continue; - if(Tri) { - if (x(j,2) < ztmp) continue; - if (x(j,2) == ztmp) { - if (x(j,1) < ytmp) continue; - if (x(j,1) == ytmp) { - if (x(j,0) < xtmp) continue; - if (x(j,0) == xtmp && j <= i) continue; - } - } - } - if(exclude && exclusion(i,j,itype,jtype)) continue; + if(HalfNeigh && (j < i)) continue; + if(HalfNeigh && !Newton && (j < i)) continue; + if(!HalfNeigh && j==i) continue; + if(Tri) { + if (x(j,2) < ztmp) continue; + if (x(j,2) == ztmp) { + if (x(j,1) < ytmp) continue; + if (x(j,1) == ytmp) { + if (x(j,0) < xtmp) continue; + if (x(j,0) == xtmp && j <= i) continue; + } + } + } + if(exclude && exclusion(i,j,itype,jtype)) continue; - const X_FLOAT delx = xtmp - other_x[m]; - const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; - const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; - const X_FLOAT rsq = delx * delx + dely * dely + delz * delz; - const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; - const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); + const X_FLOAT delx = xtmp - other_x[m]; + const X_FLOAT dely = ytmp - other_x[m + atoms_per_bin]; + const X_FLOAT delz = ztmp - other_x[m + 2 * atoms_per_bin]; + const X_FLOAT rsq = delx * delx + dely * dely + delz * delz; + const X_FLOAT radsum = radi + other_x[m + 4 * atoms_per_bin]; + const X_FLOAT cutsq = (radsum + skin) * (radsum + skin); - if(rsq <= cutsq) { - if(n::compute(int eflag_in, int vflag_in) if (lmp->kokkos->neighflag == HALF) { if (force->newton_pair) { if (vflag_atom) { - if (shearupdate) { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } else { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } + if (shearupdate) { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } else { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } } else if (vflag_global) { - if (shearupdate) { - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); - } else { - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); - } + if (shearupdate) { + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); + } else { + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); + } } else { - if (shearupdate) { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } else { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } + if (shearupdate) { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } else { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } } } else { if (vflag_atom) { - if (shearupdate) { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } else { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } + if (shearupdate) { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } else { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } } else if (vflag_global) { - if (shearupdate) { - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); - } else { - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); - } + if (shearupdate) { + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); + } else { + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); + } } else { - if (shearupdate) { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } else { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } + if (shearupdate) { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } else { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } } } } else { // HALFTHREAD if (force->newton_pair) { if (vflag_atom) { - if (shearupdate) { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } else { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } + if (shearupdate) { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } else { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } } else if (vflag_global) { - if (shearupdate) { - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); - } else { - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); - } + if (shearupdate) { + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); + } else { + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); + } } else { - if (shearupdate) { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } else { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } + if (shearupdate) { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } else { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } } } else { if (vflag_atom) { - if (shearupdate) { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } else { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } + if (shearupdate) { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } else { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } } else if (vflag_global) { - if (shearupdate) { - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); - } else { - Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); - } + if (shearupdate) { + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); + } else { + Kokkos::parallel_reduce(Kokkos::RangePolicy>(0,inum),*this, ev); + } } else { - if (shearupdate) { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } else { - Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); - } + if (shearupdate) { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } else { + Kokkos::parallel_for(Kokkos::RangePolicy>(0,inum),*this); + } } } } @@ -408,7 +408,7 @@ void PairGranHookeHistoryKokkos::operator()(TagPairGranHookeHistoryC shear3 += vtr3*dt; } X_FLOAT shrmag = sqrt(shear1*shear1 + shear2*shear2 + - shear3*shear3); + shear3*shear3); // rotate shear displacements @@ -433,15 +433,15 @@ void PairGranHookeHistoryKokkos::operator()(TagPairGranHookeHistoryC if (fs > fn) { if (shrmag != 0.0) { - shear1 = (fn/fs) * (shear1 + meff*gammat*vtr1/kt) - - meff*gammat*vtr1/kt; - shear2 = (fn/fs) * (shear2 + meff*gammat*vtr2/kt) - - meff*gammat*vtr2/kt; - shear3 = (fn/fs) * (shear3 + meff*gammat*vtr3/kt) - - meff*gammat*vtr3/kt; - fs1 *= fn/fs; - fs2 *= fn/fs; - fs3 *= fn/fs; + shear1 = (fn/fs) * (shear1 + meff*gammat*vtr1/kt) - + meff*gammat*vtr1/kt; + shear2 = (fn/fs) * (shear2 + meff*gammat*vtr2/kt) - + meff*gammat*vtr2/kt; + shear3 = (fn/fs) * (shear3 + meff*gammat*vtr3/kt) - + meff*gammat*vtr3/kt; + fs1 *= fn/fs; + fs2 *= fn/fs; + fs3 *= fn/fs; } else fs1 = fs2 = fs3 = 0.0; } @@ -503,8 +503,8 @@ template template KOKKOS_INLINE_FUNCTION void PairGranHookeHistoryKokkos::ev_tally_xyz(EV_FLOAT &ev, int i, int j, - F_FLOAT fx, F_FLOAT fy, F_FLOAT fz, - X_FLOAT delx, X_FLOAT dely, X_FLOAT delz) const + F_FLOAT fx, F_FLOAT fy, F_FLOAT fz, + X_FLOAT delx, X_FLOAT dely, X_FLOAT delz) const { F_FLOAT v[6]; @@ -546,8 +546,8 @@ template template KOKKOS_INLINE_FUNCTION void PairGranHookeHistoryKokkos::ev_tally_xyz_atom(EV_FLOAT &ev, int i, int j, - F_FLOAT fx, F_FLOAT fy, F_FLOAT fz, - X_FLOAT delx, X_FLOAT dely, X_FLOAT delz) const + F_FLOAT fx, F_FLOAT fy, F_FLOAT fz, + X_FLOAT delx, X_FLOAT dely, X_FLOAT delz) const { Kokkos::View::value> > v_vatom = k_vatom.view(); diff --git a/src/KOKKOS/verlet_kokkos.cpp b/src/KOKKOS/verlet_kokkos.cpp index 23952b71d8..3367e97c6d 100644 --- a/src/KOKKOS/verlet_kokkos.cpp +++ b/src/KOKKOS/verlet_kokkos.cpp @@ -614,8 +614,8 @@ void VerletKokkos::force_clear() atomKK->modified(Device,F_MASK); if (torqueflag) { - Kokkos::parallel_for(range, Zero::t_f_array>(atomKK->k_torque.view())); - atomKK->modified(Device,TORQUE_MASK); + Kokkos::parallel_for(range, Zero::t_f_array>(atomKK->k_torque.view())); + atomKK->modified(Device,TORQUE_MASK); } } } diff --git a/src/KSPACE/ewald_disp.cpp b/src/KSPACE/ewald_disp.cpp index a24ee4203c..a7f0698c0c 100644 --- a/src/KSPACE/ewald_disp.cpp +++ b/src/KSPACE/ewald_disp.cpp @@ -131,7 +131,7 @@ void EwaldDisp::init() else if (ewald_mix==Pair::ARITHMETIC) { k = 2; break; } error->all(FLERR, "Unsupported mixing rule in kspace_style ewald/disp"); - break; + break; default: error->all(FLERR,"Unsupported order in kspace_style ewald/disp"); } diff --git a/src/KSPACE/pppm_disp.cpp b/src/KSPACE/pppm_disp.cpp index abc33b90fa..0d0d4c7eb2 100644 --- a/src/KSPACE/pppm_disp.cpp +++ b/src/KSPACE/pppm_disp.cpp @@ -320,8 +320,8 @@ void PPPMDisp::init() mixflag == 1) && mixflag!= 2) { k = 1; break; } else if (ewald_mix==Pair::ARITHMETIC && mixflag!=2) { k = 2; break; } else if (mixflag == 2) { k = 3; break; } - else error->all(FLERR,"Unsupported mixing rule in kspace_style pppm/disp"); - break; + else error->all(FLERR,"Unsupported mixing rule in kspace_style pppm/disp"); + break; default: sprintf(str, "Unsupported order in kspace_style " "pppm/disp, pair_style %s", force->pair_style); diff --git a/src/SPIN/atom_vec_spin.h b/src/SPIN/atom_vec_spin.h index 1f1c34df52..a31e57bb48 100644 --- a/src/SPIN/atom_vec_spin.h +++ b/src/SPIN/atom_vec_spin.h @@ -67,13 +67,13 @@ class AtomVecSpin : public AtomVec { tagint *tag; int *type,*mask; imageint *image; - double **x,**v,**f; // lattice quantities + double **x,**v,**f; // lattice quantities - // spin quantities - double **sp; // sp[i][0-2] direction of the spin i - // sp[i][3] atomic magnetic moment of the spin i - double **fm; // fm[i][0-2] direction of magnetic precession - double **fm_long; // storage of long-range spin prec. components + // spin quantities + double **sp; // sp[i][0-2] direction of the spin i + // sp[i][3] atomic magnetic moment of the spin i + double **fm; // fm[i][0-2] direction of magnetic precession + double **fm_long; // storage of long-range spin prec. components }; } diff --git a/src/SPIN/fix_langevin_spin.h b/src/SPIN/fix_langevin_spin.h index 5358438396..b581b70d34 100644 --- a/src/SPIN/fix_langevin_spin.h +++ b/src/SPIN/fix_langevin_spin.h @@ -32,17 +32,17 @@ class FixLangevinSpin : public Fix { void init(); void setup(int); void post_force_respa(int, int, int); - void add_tdamping(double spi[3], double fmi[3]); // add transverse damping - void add_temperature(double fmi[3]); // add temperature - int tdamp_flag, ldamp_flag, temp_flag; // damping and temperature flags + void add_tdamping(double spi[3], double fmi[3]); // add transverse damping + void add_temperature(double fmi[3]); // add temperature + int tdamp_flag, ldamp_flag, temp_flag; // damping and temperature flags protected: double *spi, *fmi; - double alpha_t; // transverse mag. damping - double dts; // magnetic timestep - double temp; // spin bath temperature - double D,sigma; // bath intensity var. - double gil_factor; // gilbert's prefactor + double alpha_t; // transverse mag. damping + double dts; // magnetic timestep + double temp; // spin bath temperature + double D,sigma; // bath intensity var. + double gil_factor; // gilbert's prefactor char *id_temp; class Compute *temperature; diff --git a/src/SPIN/fix_neb_spin.h b/src/SPIN/fix_neb_spin.h index 7ac83ddce7..9646684a3a 100644 --- a/src/SPIN/fix_neb_spin.h +++ b/src/SPIN/fix_neb_spin.h @@ -60,20 +60,20 @@ class FixNEBSpin : public Fix { double **spprev,**spnext,**fmnext; double **springF; double **tangent; - double **xsend,**xrecv; // coords to send/recv to/from other replica - double **fsend,**frecv; // coords to send/recv to/from other replica - double **spsend,**sprecv; // sp to send/recv to/from other replica - double **fmsend,**fmrecv; // fm to send/recv to/from other replica - tagint *tagsend,*tagrecv; // ditto for atom IDs + double **xsend,**xrecv; // coords to send/recv to/from other replica + double **fsend,**frecv; // coords to send/recv to/from other replica + double **spsend,**sprecv; // sp to send/recv to/from other replica + double **fmsend,**fmrecv; // fm to send/recv to/from other replica + tagint *tagsend,*tagrecv; // ditto for atom IDs - // info gathered from all procs in my replica - double **xsendall,**xrecvall; // coords to send/recv to/from other replica - double **fsendall,**frecvall; // force to send/recv to/from other replica - double **spsendall,**sprecvall; // sp to send/recv to/from other replica - double **fmsendall,**fmrecvall; // fm to send/recv to/from other replica - tagint *tagsendall,*tagrecvall; // ditto for atom IDs + // info gathered from all procs in my replica + double **xsendall,**xrecvall; // coords to send/recv to/from other replica + double **fsendall,**frecvall; // force to send/recv to/from other replica + double **spsendall,**sprecvall; // sp to send/recv to/from other replica + double **fmsendall,**fmrecvall; // fm to send/recv to/from other replica + tagint *tagsendall,*tagrecvall; // ditto for atom IDs - int *counts,*displacements; // used for MPI_Gather + int *counts,*displacements; // used for MPI_Gather double geodesic_distance(double *, double *); void inter_replica_comm(); diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index 9b4f1916ae..87546ba9da 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -307,7 +307,7 @@ void FixNVESpin::initial_integrate(int /*vflag*/) ComputeInteractionsSpin(i); AdvanceSingleSpin(i); i = forward_stacks[i]; - } + } } } for (int j = nsectors-1; j >= 0; j--) { // advance quarter s for nlocal @@ -318,7 +318,7 @@ void FixNVESpin::initial_integrate(int /*vflag*/) ComputeInteractionsSpin(i); AdvanceSingleSpin(i); i = backward_stacks[i]; - } + } } } } else if (sector_flag == 0) { // serial seq. update @@ -360,7 +360,7 @@ void FixNVESpin::initial_integrate(int /*vflag*/) ComputeInteractionsSpin(i); AdvanceSingleSpin(i); i = forward_stacks[i]; - } + } } } for (int j = nsectors-1; j >= 0; j--) { // advance quarter s for nlocal @@ -371,7 +371,7 @@ void FixNVESpin::initial_integrate(int /*vflag*/) ComputeInteractionsSpin(i); AdvanceSingleSpin(i); i = backward_stacks[i]; - } + } } } } else if (sector_flag == 0) { // serial seq. update diff --git a/src/SPIN/fix_nve_spin.h b/src/SPIN/fix_nve_spin.h index 5871f721be..5aa6b8e4e4 100644 --- a/src/SPIN/fix_nve_spin.h +++ b/src/SPIN/fix_nve_spin.h @@ -34,30 +34,30 @@ friend class PairSpin; virtual void initial_integrate(int); virtual void final_integrate(); - void ComputeInteractionsSpin(int); // compute and advance single spin functions + void ComputeInteractionsSpin(int); // compute and advance single spin functions void AdvanceSingleSpin(int); - void sectoring(); // sectoring operation functions + void sectoring(); // sectoring operation functions int coords2sector(double *); void setup_pre_neighbor(); void pre_neighbor(); - int lattice_flag; // lattice_flag = 0 if spins only - // lattice_flag = 1 if spin-lattice calc. + int lattice_flag; // lattice_flag = 0 if spins only + // lattice_flag = 1 if spin-lattice calc. protected: - int sector_flag; // sector_flag = 0 if serial algorithm - // sector_flag = 1 if parallel algorithm + int sector_flag; // sector_flag = 0 if serial algorithm + // sector_flag = 1 if parallel algorithm - double dtv, dtf, dts; // velocity, force, and spin timesteps + double dtv, dtf, dts; // velocity, force, and spin timesteps - int nlocal_max; // max value of nlocal (for size of lists) + int nlocal_max; // max value of nlocal (for size of lists) - int pair_spin_flag; // magnetic pair flags - int long_spin_flag; // magnetic long-range flag - int precession_spin_flag; // magnetic precession flags - int maglangevin_flag; // magnetic langevin flags + int pair_spin_flag; // magnetic pair flags + int long_spin_flag; // magnetic long-range flag + int precession_spin_flag; // magnetic precession flags + int maglangevin_flag; // magnetic langevin flags int tdamp_flag, temp_flag; int setforce_spin_flag; @@ -69,9 +69,9 @@ friend class PairSpin; // pointers to magnetic pair styles - int npairs, npairspin; // # of pairs, and # of spin pairs + int npairs, npairspin; // # of pairs, and # of spin pairs class Pair *pair; - class PairSpin **spin_pairs; // vector of spin pairs + class PairSpin **spin_pairs; // vector of spin pairs // sectoring variables @@ -80,10 +80,10 @@ friend class PairSpin; // stacking variables for sectoring algorithm - int *stack_head; // index of first atom in backward_stacks - int *stack_foot; // index of first atom in forward_stacks - int *backward_stacks; // index of next atom in backward stack - int *forward_stacks; // index of next atom in forward stack + int *stack_head; // index of first atom in backward_stacks + int *stack_foot; // index of first atom in forward_stacks + int *backward_stacks; // index of next atom in backward stack + int *forward_stacks; // index of next atom in forward stack }; diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index 3296b28228..97dbe7ba6f 100644 --- a/src/SPIN/fix_precession_spin.cpp +++ b/src/SPIN/fix_precession_spin.cpp @@ -236,7 +236,7 @@ void FixPrecessionSpin::post_force(int /* vflag */) if (varflag != CONSTANT) { modify->clearstep_compute(); modify->addstep_compute(update->ntimestep + 1); - set_magneticprecession(); // update mag. field if time-dep. + set_magneticprecession(); // update mag. field if time-dep. } int *mask = atom->mask; @@ -265,9 +265,9 @@ void FixPrecessionSpin::post_force(int /* vflag */) epreci -= compute_anisotropy_energy(spi); } - if (cubic_flag) { // compute cubic anisotropy - compute_cubic(spi,fmi); - epreci -= compute_cubic_energy(spi); + if (cubic_flag) { // compute cubic anisotropy + compute_cubic(spi,fmi); + epreci -= compute_cubic_energy(spi); } eprec += epreci; diff --git a/src/SPIN/fix_precession_spin.h b/src/SPIN/fix_precession_spin.h index 0037784a48..96d89e004e 100644 --- a/src/SPIN/fix_precession_spin.h +++ b/src/SPIN/fix_precession_spin.h @@ -54,7 +54,7 @@ class FixPrecessionSpin : public Fix { double compute_cubic_energy(double *); protected: - int style; // style of the magnetic precession + int style; // style of the magnetic precession double degree2rad; double hbar; @@ -72,19 +72,19 @@ class FixPrecessionSpin : public Fix { double H_field; double nhx, nhy, nhz; - double hx, hy, hz; // temp. force variables + double hx, hy, hz; // temp. force variables // magnetic anisotropy intensity and direction - double Ka; // aniso const. in eV - double Kah; // aniso const. in rad.THz + double Ka; // aniso const. in eV + double Kah; // aniso const. in rad.THz double nax, nay, naz; - double Kax, Kay, Kaz; // temp. force variables + double Kax, Kay, Kaz; // temp. force variables // cubic anisotropy intensity - double k1c,k2c; // cubic const. in eV - double k1ch,k2ch; // cubic const. in rad.THz + double k1c,k2c; // cubic const. in eV + double k1ch,k2ch; // cubic const. in rad.THz double nc1x,nc1y,nc1z; double nc2x,nc2y,nc2z; double nc3x,nc3y,nc3z; diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp index 7315aca056..e39eb18744 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -165,9 +165,9 @@ int MinSpin::iterate(int maxiter) fmdotfm = fmsq = 0.0; if (update->ftol > 0.0) { - if (normstyle == MAX) fmsq = max_torque(); // max torque norm - else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm - else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm + if (normstyle == MAX) fmsq = max_torque(); // max torque norm + else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm + else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm else error->all(FLERR,"Illegal min_modify command"); fmdotfm = fmsq*fmsq; if (update->multireplica == 0) { diff --git a/src/SPIN/min_spin_cg.cpp b/src/SPIN/min_spin_cg.cpp index 95bbcf437b..9c8c814bc4 100644 --- a/src/SPIN/min_spin_cg.cpp +++ b/src/SPIN/min_spin_cg.cpp @@ -270,9 +270,9 @@ int MinSpinCG::iterate(int maxiter) fmdotfm = fmsq = 0.0; if (update->ftol > 0.0) { - if (normstyle == MAX) fmsq = max_torque(); // max torque norm - else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm - else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm + if (normstyle == MAX) fmsq = max_torque(); // max torque norm + else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm + else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm else error->all(FLERR,"Illegal min_modify command"); fmdotfm = fmsq*fmsq; if (update->multireplica == 0) { @@ -347,12 +347,12 @@ void MinSpinCG::calc_search_direction() factor = 0.0; - if (local_iter == 0 || local_iter % 5 == 0){ // steepest descent direction + if (local_iter == 0 || local_iter % 5 == 0){ // steepest descent direction for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = -g_cur[i] * factor; g_old[i] = g_cur[i] * factor; } - } else { // conjugate direction + } else { // conjugate direction for (int i = 0; i < 3 * nlocal; i++) { g2old += g_old[i] * g_old[i]; g2 += g_cur[i] * g_cur[i]; @@ -394,7 +394,7 @@ void MinSpinCG::advance_spins() { int nlocal = atom->nlocal; double **sp = atom->sp; - double rot_mat[9]; // exponential of matrix made of search direction + double rot_mat[9]; // exponential of matrix made of search direction double s_new[3]; // loop on all spins on proc. diff --git a/src/SPIN/min_spin_cg.h b/src/SPIN/min_spin_cg.h index 0eed7a61e6..640721b8ef 100644 --- a/src/SPIN/min_spin_cg.h +++ b/src/SPIN/min_spin_cg.h @@ -35,21 +35,21 @@ class MinSpinCG: public Min { int iterate(int); private: - int local_iter; // for neb - int nlocal_max; // max value of nlocal (for size of lists) - int use_line_search; // use line search or not. - int ireplica,nreplica; // for neb - double dt; // global timestep - double dts; // spin timestep - double discrete_factor; // factor for spin timestep evaluation - double der_e_cur; // current derivative along search dir. - double der_e_pr; // previous derivative along search dir. - double *spvec; // variables for atomic dof, as 1d vector - double *fmvec; // variables for atomic dof, as 1d vector - double *g_old; // gradient vector at previous step - double *g_cur; // current gradient vector - double *p_s; // search direction vector - double **sp_copy; // copy of the spins + int local_iter; // for neb + int nlocal_max; // max value of nlocal (for size of lists) + int use_line_search; // use line search or not. + int ireplica,nreplica; // for neb + double dt; // global timestep + double dts; // spin timestep + double discrete_factor; // factor for spin timestep evaluation + double der_e_cur; // current derivative along search dir. + double der_e_pr; // previous derivative along search dir. + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + double *g_old; // gradient vector at previous step + double *g_cur; // current gradient vector + double *p_s; // search direction vector + double **sp_copy; // copy of the spins void advance_spins(); void calc_gradient(); diff --git a/src/SPIN/min_spin_lbfgs.cpp b/src/SPIN/min_spin_lbfgs.cpp index f86bdd5d48..a1ee010f3f 100644 --- a/src/SPIN/min_spin_lbfgs.cpp +++ b/src/SPIN/min_spin_lbfgs.cpp @@ -285,9 +285,9 @@ int MinSpinLBFGS::iterate(int maxiter) fmdotfm = fmsq = 0.0; if (update->ftol > 0.0) { - if (normstyle == MAX) fmsq = max_torque(); // max torque norm - else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm - else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm + if (normstyle == MAX) fmsq = max_torque(); // max torque norm + else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm + else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm else error->all(FLERR,"Illegal min_modify command"); fmdotfm = fmsq*fmsq; if (update->multireplica == 0) { @@ -372,7 +372,7 @@ void MinSpinLBFGS::calc_search_direction() factor = 1.0; } - if (local_iter == 0){ // steepest descent direction + if (local_iter == 0){ // steepest descent direction //if no line search then calculate maximum rotation if (use_line_search == 0) diff --git a/src/SPIN/min_spin_lbfgs.h b/src/SPIN/min_spin_lbfgs.h index cead605b32..8b470b5d23 100644 --- a/src/SPIN/min_spin_lbfgs.h +++ b/src/SPIN/min_spin_lbfgs.h @@ -35,18 +35,18 @@ class MinSpinLBFGS: public Min { int iterate(int); private: - int local_iter; // for neb - int use_line_search; // use line search or not. - int nlocal_max; // max value of nlocal (for size of lists) - int ireplica,nreplica; // for neb - double der_e_cur; // current derivative along search dir. - double der_e_pr; // previous derivative along search dir. + int local_iter; // for neb + int use_line_search; // use line search or not. + int nlocal_max; // max value of nlocal (for size of lists) + int ireplica,nreplica; // for neb + double der_e_cur; // current derivative along search dir. + double der_e_pr; // previous derivative along search dir. double maxepsrot; - double *spvec; // variables for atomic dof, as 1d vector - double *fmvec; // variables for atomic dof, as 1d vector - double *g_old; // gradient vector at previous step - double *g_cur; // current gradient vector - double *p_s; // search direction vector + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + double *g_old; // gradient vector at previous step + double *g_cur; // current gradient vector + double *p_s; // search direction vector void advance_spins(); void calc_gradient(); @@ -58,11 +58,11 @@ class MinSpinLBFGS: public Min { int adescent(double, double); double maximum_rotation(double *); - double *rho; // estimation of curvature - double **ds; // change in rotation matrix between two iterations, da - double **dy; // change in gradients between two iterations, dg - double **sp_copy; // copy of the spins - int num_mem; // number of stored steps + double *rho; // estimation of curvature + double **ds; // change in rotation matrix between two iterations, da + double **dy; // change in gradients between two iterations, dg + double **sp_copy; // copy of the spins + int num_mem; // number of stored steps bigint last_negative; }; diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index 559fd1cb49..075850d1af 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -179,7 +179,7 @@ void NEBSpin::run() update->whichflag = 2; update->etol = etol; - update->ftol = ttol; // update->ftol is a torque tolerance + update->ftol = ttol; // update->ftol is a torque tolerance update->multireplica = 1; lmp->init(); @@ -214,7 +214,7 @@ void NEBSpin::run() fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN " - "GradV0dottan DN0 ... GradVNdottan DNN\n"); + "GradV0dottan DN0 ... GradVNdottan DNN\n"); } else { fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " @@ -224,10 +224,10 @@ void NEBSpin::run() if (ulogfile) { if (verbose) { - fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " - "GradV0 GradV1 GradVc EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN " - "GradV0dottan DN0 ... GradVNdottan DNN\n"); + fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " + "GradV0 GradV1 GradVc EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN " + "GradV0dottan DN0 ... GradVNdottan DNN\n"); } else { fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " @@ -301,7 +301,7 @@ void NEBSpin::run() fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN " - "GradV0dottan DN0... GradVNdottan DNN\n"); + "GradV0dottan DN0... GradVNdottan DNN\n"); } else { fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc " @@ -311,10 +311,10 @@ void NEBSpin::run() } if (ulogfile) { if (verbose) { - fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " - "GradV0 GradV1 GradVc EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN " - "GradV0dottan DN0 ... GradVNdottan DNN\n"); + fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " + "GradV0 GradV1 GradVc EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN " + "GradV0dottan DN0 ... GradVNdottan DNN\n"); } else { fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc " @@ -472,8 +472,8 @@ void NEBSpin::readfile(char *file, int flag) m = atom->map(tag); if (m >= 0 && m < nlocal) { ncount++; - musp = atof(values[1]); - xx = atof(values[2]); + musp = atof(values[1]); + xx = atof(values[2]); yy = atof(values[3]); zz = atof(values[4]); spx = atof(values[5]); @@ -482,39 +482,39 @@ void NEBSpin::readfile(char *file, int flag) if (flag == 0) { - spinit[0] = sp[m][0]; - spinit[1] = sp[m][1]; - spinit[2] = sp[m][2]; - spfinal[0] = spx; - spfinal[1] = spy; - spfinal[2] = spz; + spinit[0] = sp[m][0]; + spinit[1] = sp[m][1]; + spinit[2] = sp[m][2]; + spfinal[0] = spx; + spfinal[1] = spy; + spfinal[2] = spz; - // interpolate intermediate spin states + // interpolate intermediate spin states - sp[m][3] = musp; - if (fraction == 0.0) { - sp[m][0] = spinit[0]; - sp[m][1] = spinit[1]; - sp[m][2] = spinit[2]; - } else if (fraction == 1.0) { - sp[m][0] = spfinal[0]; - sp[m][1] = spfinal[1]; - sp[m][2] = spfinal[2]; - } else { + sp[m][3] = musp; + if (fraction == 0.0) { + sp[m][0] = spinit[0]; + sp[m][1] = spinit[1]; + sp[m][2] = spinit[2]; + } else if (fraction == 1.0) { + sp[m][0] = spfinal[0]; + sp[m][1] = spfinal[1]; + sp[m][2] = spfinal[2]; + } else { temp_flag = initial_rotation(spinit,spfinal,fraction); rot_flag = MAX(temp_flag,rot_flag); - sp[m][0] = spfinal[0]; - sp[m][1] = spfinal[1]; - sp[m][2] = spfinal[2]; - } + sp[m][0] = spfinal[0]; + sp[m][1] = spfinal[1]; + sp[m][2] = spfinal[2]; + } } else { sp[m][3] = musp; - x[m][0] = xx; + x[m][0] = xx; x[m][1] = yy; x[m][2] = zz; - sp[m][0] = spx; - sp[m][1] = spy; - sp[m][2] = spz; + sp[m][0] = spx; + sp[m][1] = spy; + sp[m][2] = spz; } } @@ -602,24 +602,24 @@ int NEBSpin::initial_rotation(double *spi, double *sploc, double fraction) // Rodrigues' formula breaks, needs to define another axis k if (knormsq == 0.0) { - if (sidotsf > 0.0) { // spins aligned and in same direction + if (sidotsf > 0.0) { // spins aligned and in same direction return 0; - } else if (sidotsf < 0.0) { // spins aligned and in opposite directions + } else if (sidotsf < 0.0) { // spins aligned and in opposite directions // defining a rotation axis // first guess, k = spi x [100] // second guess, k = spi x [010] if (spiy*spiy + spiz*spiz != 0.0) { // spin not along [100] - kx = 0.0; - ky = spiz; - kz = -spiy; - knormsq = ky*ky + kz*kz; + kx = 0.0; + ky = spiz; + kz = -spiy; + knormsq = ky*ky + kz*kz; } else if (spix*spix + spiz*spiz != 0.0) { // spin not along [010] - kx = -spiz; - ky = 0.0; - kz = spix; - knormsq = kx*kx + kz*kz; + kx = -spiz; + ky = 0.0; + kz = spix; + knormsq = kx*kx + kz*kz; } else error->all(FLERR,"Incorrect initial rotation operation"); rot_flag = 1; } @@ -822,9 +822,9 @@ void NEBSpin::print_status() for (int i = 0; i < nreplica; i++) fprintf(uscreen,"%12.8g %12.8g ",rdist[i],all[i][0]); if (verbose) { - for (int i = 0; i < nreplica-1; i++) - fprintf(uscreen,"%12.8g %12.8g ",all[i][2],all[i][5]); - fprintf(uscreen,"%12.8g %12.8g ",NAN,all[nreplica-1][5]); + for (int i = 0; i < nreplica-1; i++) + fprintf(uscreen,"%12.8g %12.8g ",all[i][2],all[i][5]); + fprintf(uscreen,"%12.8g %12.8g ",NAN,all[nreplica-1][5]); } fprintf(uscreen,"\n"); } @@ -838,9 +838,9 @@ void NEBSpin::print_status() for (int i = 0; i < nreplica; i++) fprintf(ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); if (verbose) { - for (int i = 0; i < nreplica-1; i++) - fprintf(ulogfile,"%12.8g %12.8g ",all[i][2],all[i][5]); - fprintf(ulogfile,"%12.8g %12.8g ",NAN,all[nreplica-1][5]); + for (int i = 0; i < nreplica-1; i++) + fprintf(ulogfile,"%12.8g %12.8g ",all[i][2],all[i][5]); + fprintf(ulogfile,"%12.8g %12.8g ",NAN,all[nreplica-1][5]); } fprintf(ulogfile,"\n"); fflush(ulogfile); diff --git a/src/SPIN/pair_spin.h b/src/SPIN/pair_spin.h index 0111814c72..34f12d8d59 100644 --- a/src/SPIN/pair_spin.h +++ b/src/SPIN/pair_spin.h @@ -33,8 +33,8 @@ friend class FixNVESpin; virtual void compute_single_pair(int, double *) {} protected: - double hbar; // Planck constant (eV.ps.rad-1) - int lattice_flag; // flag for mech force computation + double hbar; // Planck constant (eV.ps.rad-1) + int lattice_flag; // flag for mech force computation virtual void allocate() {} }; diff --git a/src/SPIN/pair_spin_dipole_cut.cpp b/src/SPIN/pair_spin_dipole_cut.cpp index 4ff90323f2..bae09689de 100644 --- a/src/SPIN/pair_spin_dipole_cut.cpp +++ b/src/SPIN/pair_spin_dipole_cut.cpp @@ -46,11 +46,11 @@ PairSpinDipoleCut::PairSpinDipoleCut(LAMMPS *lmp) : PairSpin(lmp) { spinflag = 1; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) mub = 9.274e-4; // in A.Ang^2 mu_0 = 785.15; // in eV/Ang/A^2 mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 - //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } @@ -178,7 +178,7 @@ void PairSpinDipoleCut::compute(int eflag, int vflag) double **x = atom->x; double **f = atom->f; double **fm = atom->fm; - double **sp = atom->sp; + double **sp = atom->sp; inum = list->inum; ilist = list->ilist; @@ -228,36 +228,36 @@ void PairSpinDipoleCut::compute(int eflag, int vflag) if (rsq < local_cut2) { r2inv = 1.0/rsq; - r3inv = r2inv*rinv; - - compute_dipolar(i,j,eij,fmi,spi,spj,r3inv); - if (lattice_flag) compute_dipolar_mech(i,j,eij,fi,spi,spj,r2inv); + r3inv = r2inv*rinv; + + compute_dipolar(i,j,eij,fmi,spi,spj,r3inv); + if (lattice_flag) compute_dipolar_mech(i,j,eij,fi,spi,spj,r2inv); } // force accumulation f[i][0] += fi[0]; - f[i][1] += fi[1]; + f[i][1] += fi[1]; f[i][2] += fi[2]; fm[i][0] += fmi[0]; fm[i][1] += fmi[1]; fm[i][2] += fmi[2]; if (newton_pair || j < nlocal) { - f[j][0] -= fi[0]; - f[j][1] -= fi[1]; + f[j][0] -= fi[0]; + f[j][1] -= fi[1]; f[j][2] -= fi[2]; } if (eflag) { - if (rsq <= local_cut2) { - evdwl -= (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); - evdwl *= hbar; - } + if (rsq <= local_cut2) { + evdwl -= (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); + evdwl *= hbar; + } } else evdwl = 0.0; if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, - evdwl,ecoul,fi[0],fi[1],fi[2],rij[0],rij[1],rij[2]); + evdwl,ecoul,fi[0],fi[1],fi[2],rij[0],rij[1],rij[2]); } } @@ -277,7 +277,7 @@ void PairSpinDipoleCut::compute_single_pair(int ii, double fmi[3]) int k,locflag; int *type = atom->type; double **x = atom->x; - double **sp = atom->sp; + double **sp = atom->sp; numneigh = list->numneigh; firstneigh = list->firstneigh; @@ -427,7 +427,7 @@ void PairSpinDipoleCut::write_restart(FILE *fp) for (j = i; j <= atom->ntypes; j++) { fwrite(&setflag[i][j],sizeof(int),1,fp); if (setflag[i][j]) { - fwrite(&cut_spin_long[i][j],sizeof(int),1,fp); + fwrite(&cut_spin_long[i][j],sizeof(int),1,fp); } } } @@ -450,10 +450,10 @@ void PairSpinDipoleCut::read_restart(FILE *fp) if (me == 0) utils::sfread(FLERR,&setflag[i][j],sizeof(int),1,fp,NULL,error); MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world); if (setflag[i][j]) { - if (me == 0) { - utils::sfread(FLERR,&cut_spin_long[i][j],sizeof(int),1,fp,NULL,error); - } - MPI_Bcast(&cut_spin_long[i][j],1,MPI_INT,0,world); + if (me == 0) { + utils::sfread(FLERR,&cut_spin_long[i][j],sizeof(int),1,fp,NULL,error); + } + MPI_Bcast(&cut_spin_long[i][j],1,MPI_INT,0,world); } } } diff --git a/src/SPIN/pair_spin_dipole_cut.h b/src/SPIN/pair_spin_dipole_cut.h index f9159a629f..33f62d1633 100644 --- a/src/SPIN/pair_spin_dipole_cut.h +++ b/src/SPIN/pair_spin_dipole_cut.h @@ -49,16 +49,16 @@ class PairSpinDipoleCut : public PairSpin { void write_restart_settings(FILE *); void read_restart_settings(FILE *); - double cut_spin_long_global; // global long cutoff distance + double cut_spin_long_global; // global long cutoff distance protected: - double hbar; // reduced Planck's constant - double mub; // Bohr's magneton - double mu_0; // vacuum permeability - double mub2mu0; // prefactor for mech force - double mub2mu0hbinv; // prefactor for mag force + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force - double **cut_spin_long; // cutoff distance long + double **cut_spin_long; // cutoff distance long double g_ewald; int ewald_order; diff --git a/src/SPIN/pair_spin_dipole_long.h b/src/SPIN/pair_spin_dipole_long.h index 1997cbbc55..56fd4c7126 100644 --- a/src/SPIN/pair_spin_dipole_long.h +++ b/src/SPIN/pair_spin_dipole_long.h @@ -50,16 +50,16 @@ class PairSpinDipoleLong : public PairSpin { void write_restart_settings(FILE *); void read_restart_settings(FILE *); - double cut_spin_long_global; // global long cutoff distance + double cut_spin_long_global; // global long cutoff distance protected: - double hbar; // reduced Planck's constant - double mub; // Bohr's magneton - double mu_0; // vacuum permeability - double mub2mu0; // prefactor for mech force - double mub2mu0hbinv; // prefactor for mag force + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force - double **cut_spin_long; // cutoff distance long + double **cut_spin_long; // cutoff distance long double g_ewald; int ewald_order; diff --git a/src/SPIN/pair_spin_dmi.h b/src/SPIN/pair_spin_dmi.h index ac2aa387b3..01022623ec 100644 --- a/src/SPIN/pair_spin_dmi.h +++ b/src/SPIN/pair_spin_dmi.h @@ -44,13 +44,13 @@ class PairSpinDmi : public PairSpin { void write_restart_settings(FILE *); void read_restart_settings(FILE *); - double cut_spin_dmi_global; // short range pair cutoff + double cut_spin_dmi_global; // short range pair cutoff protected: - double **DM; // dmi coeff in eV - double **v_dmx, **v_dmy, **v_dmz; // dmi direction - double **vmech_dmx, **vmech_dmy, **vmech_dmz; // dmi mech direction - double **cut_spin_dmi; // cutoff distance dmi + double **DM; // dmi coeff in eV + double **v_dmx, **v_dmy, **v_dmz; // dmi direction + double **vmech_dmx, **vmech_dmy, **vmech_dmz; // dmi mech direction + double **cut_spin_dmi; // cutoff distance dmi void allocate(); }; diff --git a/src/SPIN/pair_spin_exchange.h b/src/SPIN/pair_spin_exchange.h index 5feb99210f..19eafeb5ca 100644 --- a/src/SPIN/pair_spin_exchange.h +++ b/src/SPIN/pair_spin_exchange.h @@ -44,13 +44,13 @@ class PairSpinExchange : public PairSpin { void write_restart_settings(FILE *); void read_restart_settings(FILE *); - double cut_spin_exchange_global; // global exchange cutoff distance + double cut_spin_exchange_global; // global exchange cutoff distance protected: - double **J1_mag; // exchange coeffs in eV - double **J1_mech; // mech exchange coeffs in + double **J1_mag; // exchange coeffs in eV + double **J1_mech; // mech exchange coeffs in double **J2, **J3; // J1 in eV, J2 adim, J3 in Ang - double **cut_spin_exchange; // cutoff distance exchange + double **cut_spin_exchange; // cutoff distance exchange void allocate(); }; diff --git a/src/SPIN/pair_spin_magelec.h b/src/SPIN/pair_spin_magelec.h index b9e820b1d1..4df0078bea 100644 --- a/src/SPIN/pair_spin_magelec.h +++ b/src/SPIN/pair_spin_magelec.h @@ -44,12 +44,12 @@ class PairSpinMagelec : public PairSpin { void write_restart_settings(FILE *); void read_restart_settings(FILE *); - double cut_spin_magelec_global; // global me cutoff + double cut_spin_magelec_global; // global me cutoff protected: - double **ME, **ME_mech; // magelec coeff in eV - double **v_mex, **v_mey, **v_mez; // magelec direction - double **cut_spin_magelec; // magelec cutoff distance + double **ME, **ME_mech; // magelec coeff in eV + double **v_mex, **v_mey, **v_mez; // magelec direction + double **cut_spin_magelec; // magelec cutoff distance void allocate(); }; diff --git a/src/SPIN/pair_spin_neel.h b/src/SPIN/pair_spin_neel.h index 796d8b53f0..5261a7f746 100644 --- a/src/SPIN/pair_spin_neel.h +++ b/src/SPIN/pair_spin_neel.h @@ -44,17 +44,17 @@ class PairSpinNeel : public PairSpin { void write_restart_settings(FILE *); void read_restart_settings(FILE *); - double cut_spin_neel_global; // global neel cutoff distance + double cut_spin_neel_global; // global neel cutoff distance protected: // pseudo-dipolar and pseudo-quadrupolar coeff. - double **g1, **g1_mech; // neel coeffs gij - double **g2, **g3; // g1 in eV, g2 adim, g3 in Ang - double **q1, **q1_mech; // neel coeffs qij - double **q2, **q3; // q1 in eV, q2 adim, q3 in Ang - double **cut_spin_neel; // cutoff distance exchange + double **g1, **g1_mech; // neel coeffs gij + double **g2, **g3; // g1 in eV, g2 adim, g3 in Ang + double **q1, **q1_mech; // neel coeffs qij + double **q2, **q3; // q1 in eV, q2 adim, q3 in Ang + double **cut_spin_neel; // cutoff distance exchange void allocate(); }; diff --git a/src/USER-MISC/compute_hma.cpp b/src/USER-MISC/compute_hma.cpp index f1c2e9ba3a..56103a42b0 100644 --- a/src/USER-MISC/compute_hma.cpp +++ b/src/USER-MISC/compute_hma.cpp @@ -457,7 +457,7 @@ double ComputeHMA::virial_compute(int n) /* ---------------------------------------------------------------------- */ int ComputeHMA::pack_forward_comm(int n, int *list, double *buf, - int /* pbc_flag */, int * /* pbc */) + int /* pbc_flag */, int * /* pbc */) { int m = 0; for (int ii = 0; ii < n; ii++) { diff --git a/src/USER-MISC/fix_bond_react.cpp b/src/USER-MISC/fix_bond_react.cpp index bfa93e178c..33aab5b4ad 100644 --- a/src/USER-MISC/fix_bond_react.cpp +++ b/src/USER-MISC/fix_bond_react.cpp @@ -259,12 +259,12 @@ FixBondReact::FixBondReact(LAMMPS *lmp, int narg, char **arg) : "probability seed must be positive"); iarg += 3; } else if (strcmp(arg[iarg],"max_rxn") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix bond/react command: " - "'max_rxn' has too few arguments"); - max_rxn[rxn] = force->inumeric(FLERR,arg[iarg+1]); - if (max_rxn[rxn] < 0) error->all(FLERR,"Illegal fix bond/react command: " - "'max_rxn' cannot be negative"); - iarg += 2; + if (iarg+2 > narg) error->all(FLERR,"Illegal fix bond/react command: " + "'max_rxn' has too few arguments"); + max_rxn[rxn] = force->inumeric(FLERR,arg[iarg+1]); + if (max_rxn[rxn] < 0) error->all(FLERR,"Illegal fix bond/react command: " + "'max_rxn' cannot be negative"); + iarg += 2; } else if (strcmp(arg[iarg],"stabilize_steps") == 0) { if (stabilization_flag == 0) error->all(FLERR,"Stabilize_steps keyword " "used without stabilization keyword"); diff --git a/src/USER-MISC/pair_ilp_graphene_hbn.cpp b/src/USER-MISC/pair_ilp_graphene_hbn.cpp index e09287ae23..9faa350468 100644 --- a/src/USER-MISC/pair_ilp_graphene_hbn.cpp +++ b/src/USER-MISC/pair_ilp_graphene_hbn.cpp @@ -523,7 +523,7 @@ void PairILPGrapheneHBN::calc_FvdW(int eflag, int /* vflag */) // derivatives fpair = -6.0*p.C6*r8inv/TSvdw + p.C6*p.d/p.seff*(TSvdw-1.0)*TSvdw2inv*r8inv*r; - fsum = fpair*Tap - Vilp*dTap/r; + fsum = fpair*Tap - Vilp*dTap/r; f[i][0] += fsum*delx; f[i][1] += fsum*dely; @@ -634,12 +634,12 @@ void PairILPGrapheneHBN::calc_FRep(int eflag, int /* vflag */) dprodnorm1[0] = dnormdri[0][0][i]*delx + dnormdri[1][0][i]*dely + dnormdri[2][0][i]*delz; dprodnorm1[1] = dnormdri[0][1][i]*delx + dnormdri[1][1][i]*dely + dnormdri[2][1][i]*delz; dprodnorm1[2] = dnormdri[0][2][i]*delx + dnormdri[1][2][i]*dely + dnormdri[2][2][i]*delz; - fp1[0] = prodnorm1*normal[i][0]*fpair1; - fp1[1] = prodnorm1*normal[i][1]*fpair1; - fp1[2] = prodnorm1*normal[i][2]*fpair1; - fprod1[0] = prodnorm1*dprodnorm1[0]*fpair1; - fprod1[1] = prodnorm1*dprodnorm1[1]*fpair1; - fprod1[2] = prodnorm1*dprodnorm1[2]*fpair1; + fp1[0] = prodnorm1*normal[i][0]*fpair1; + fp1[1] = prodnorm1*normal[i][1]*fpair1; + fp1[2] = prodnorm1*normal[i][2]*fpair1; + fprod1[0] = prodnorm1*dprodnorm1[0]*fpair1; + fprod1[1] = prodnorm1*dprodnorm1[1]*fpair1; + fprod1[2] = prodnorm1*dprodnorm1[2]*fpair1; fkcx = (delx*fsum - fp1[0])*Tap - Vilp*dTap*delx/r; fkcy = (dely*fsum - fp1[1])*Tap - Vilp*dTap*dely/r; diff --git a/src/USER-MISC/pair_kolmogorov_crespi_full.cpp b/src/USER-MISC/pair_kolmogorov_crespi_full.cpp index 8ba3dc9db3..d0d8517550 100644 --- a/src/USER-MISC/pair_kolmogorov_crespi_full.cpp +++ b/src/USER-MISC/pair_kolmogorov_crespi_full.cpp @@ -519,11 +519,11 @@ void PairKolmogorovCrespiFull::calc_FvdW(int eflag, int /* vflag */) dTap = calc_dTap(r,Rcut); } else {Tap = 1.0; dTap = 0.0;} - Vkc = -p.A*p.z06*r6inv; + Vkc = -p.A*p.z06*r6inv; // derivatives fpair = -6.0*p.A*p.z06*r8inv; - fsum = fpair*Tap - Vkc*dTap/r; + fsum = fpair*Tap - Vkc*dTap/r; f[i][0] += fsum*delx; f[i][1] += fsum*dely; @@ -607,11 +607,11 @@ void PairKolmogorovCrespiFull::calc_FRep(int eflag, int /* vflag */) r = sqrt(rsq); - // turn on/off taper function - if (tap_flag) { - Tap = calc_Tap(r,sqrt(cutsq[itype][jtype])); - dTap = calc_dTap(r,sqrt(cutsq[itype][jtype])); - } else {Tap = 1.0; dTap = 0.0;} + // turn on/off taper function + if (tap_flag) { + Tap = calc_Tap(r,sqrt(cutsq[itype][jtype])); + dTap = calc_dTap(r,sqrt(cutsq[itype][jtype])); + } else {Tap = 1.0; dTap = 0.0;} // Calculate the transverse distance prodnorm1 = normal[i][0]*delx + normal[i][1]*dely + normal[i][2]*delz; @@ -626,7 +626,7 @@ void PairKolmogorovCrespiFull::calc_FRep(int eflag, int /* vflag */) sumC11 = (p.C2 + 2.0*p.C4*rho_ij)*p.delta2inv; frho_ij = exp1*sumC1; sumCff = 0.5*p.C + frho_ij; - Vkc = exp0*sumCff; + Vkc = exp0*sumCff; // derivatives fpair = p.lambda*exp0/r*sumCff; @@ -653,10 +653,10 @@ void PairKolmogorovCrespiFull::calc_FRep(int eflag, int /* vflag */) f[j][1] -= fkcy; f[j][2] -= fkcz; - // calculate the forces acted on the neighbors of atom i from atom j - KC_neighs_i = KC_firstneigh[i]; - for (kk = 0; kk < KC_numneigh[i]; kk++) { - k = KC_neighs_i[kk]; + // calculate the forces acted on the neighbors of atom i from atom j + KC_neighs_i = KC_firstneigh[i]; + for (kk = 0; kk < KC_numneigh[i]; kk++) { + k = KC_neighs_i[kk]; if (k == i) continue; // derivatives of the product of rij and ni respect to rk, k=0,1,2, where atom k is the neighbors of atom i dprodnorm1[0] = dnormal[0][0][kk][i]*delx + dnormal[1][0][kk][i]*dely + dnormal[2][0][kk][i]*delz; @@ -672,7 +672,7 @@ void PairKolmogorovCrespiFull::calc_FRep(int eflag, int /* vflag */) delkj[1] = x[k][1] - x[j][1]; delkj[2] = x[k][2] - x[j][2]; if (evflag) ev_tally_xyz(k,j,nlocal,newton_pair,0.0,0.0,fk[0],fk[1],fk[2],delkj[0],delkj[1],delkj[2]); - } + } if (eflag) { if (tap_flag) pvector[1] += evdwl = Tap*Vkc; @@ -790,7 +790,7 @@ void PairKolmogorovCrespiFull::calc_normal() memory->create(dnormal,3,3,3,nmax,"KolmogorovCrespiFull:dnormal"); } - inum = list->inum; + inum = list->inum; ilist = list->ilist; //Calculate normals for (ii = 0; ii < inum; ii++) { diff --git a/src/USER-MISC/pair_lj_expand_coul_long.cpp b/src/USER-MISC/pair_lj_expand_coul_long.cpp index 957173bf7f..f52e427c18 100644 --- a/src/USER-MISC/pair_lj_expand_coul_long.cpp +++ b/src/USER-MISC/pair_lj_expand_coul_long.cpp @@ -786,9 +786,9 @@ double PairLJExpandCoulLong::init_one(int i, int j) (1.0/3.0 + 2.0*shift1/(4.0*rc1) + shift2/(5.0*rc2))/rc3); ptail_ij = 16.0*MY_PI*all[0]*all[1]*epsilon[i][j] * sig6 * ((1.0/9.0 + 3.0*shift1/(10.0*rc1) + - 3.0*shift2/(11.0*rc2) + shift3/(12.0*rc3))*2.0*sig6/rc9 - + 3.0*shift2/(11.0*rc2) + shift3/(12.0*rc3))*2.0*sig6/rc9 - (1.0/3.0 + 3.0*shift1/(4.0*rc1) + - 3.0*shift2/(5.0*rc2) + shift3/(6.0*rc3))/rc3); + 3.0*shift2/(5.0*rc2) + shift3/(6.0*rc3))/rc3); } return cut; diff --git a/src/USER-MISC/pair_local_density.cpp b/src/USER-MISC/pair_local_density.cpp index 97aa3dcaca..1e4ad3edf6 100644 --- a/src/USER-MISC/pair_local_density.cpp +++ b/src/USER-MISC/pair_local_density.cpp @@ -61,7 +61,7 @@ static const char cite_pair_local_density[] = PairLocalDensity::PairLocalDensity(LAMMPS *lmp) : Pair(lmp) { restartinfo = 0; - one_coeff = 1; + one_coeff = 1; single_enable = 1; // stuff read from tabulated file @@ -117,7 +117,7 @@ PairLocalDensity::~PairLocalDensity() memory->destroy(rho_min); memory->destroy(rho_max); - memory->destroy(delta_rho); + memory->destroy(delta_rho); memory->destroy(c0); memory->destroy(c2); memory->destroy(c4); @@ -144,7 +144,7 @@ void PairLocalDensity::compute(int eflag, int vflag) double p, *coeff; int *ilist,*jlist,*numneigh,**firstneigh; - phi = uLD = evdwl = fpair = rsqinv = 0.0; + phi = uLD = evdwl = fpair = rsqinv = 0.0; if (eflag || vflag) ev_setup(eflag,vflag); else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; @@ -180,11 +180,11 @@ void PairLocalDensity::compute(int eflag, int vflag) if (newton_pair) { m = nlocal + atom->nghost; for (k = 0; k < nLD; k++) { - for (i = 0; i < m; i++) { + for (i = 0; i < m; i++) { localrho[k][i] = 0.0; fp[k][i] = 0.0; } - } + } } else { for (k = 0; k < nLD; k++){ @@ -209,14 +209,14 @@ void PairLocalDensity::compute(int eflag, int vflag) for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; j &= NEIGHMASK; - jtype = type[j]; + jtype = type[j]; // calculate distance-squared between i,j atom-types delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; + rsq = delx*delx + dely*dely + delz*delz; // calculating LDs based on central and neigh filters @@ -239,7 +239,7 @@ void PairLocalDensity::compute(int eflag, int vflag) localrho[k][j] += (phi * b[k][itype]); } } - } + } } // communicate and sum LDs over all procs @@ -247,10 +247,10 @@ void PairLocalDensity::compute(int eflag, int vflag) // - for (ii = 0; ii < inum; ii++) { + for (ii = 0; ii < inum; ii++) { i = ilist[ii]; itype = type[i]; - uLD = 0.0; + uLD = 0.0; for (k = 0; k < nLD; k++) { @@ -284,7 +284,7 @@ void PairLocalDensity::compute(int eflag, int vflag) if (eflag) { if (eflag_global) eng_vdwl += uLD; - if (eflag_atom) eatom[i] += uLD; + if (eflag_atom) eatom[i] += uLD; } } @@ -306,7 +306,7 @@ void PairLocalDensity::compute(int eflag, int vflag) jnum = numneigh[i]; for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; + j = jlist[jj]; j &= NEIGHMASK; jtype = type[j]; @@ -326,7 +326,7 @@ void PairLocalDensity::compute(int eflag, int vflag) dphi = rsq * (2.0*c2[k] + rsq * (4.0*c4[k] + 6.0*c6[k]*rsq)); fpair += -(a[k][itype]*b[k][jtype]*fp[k][i] + a[k][jtype]*b[k][itype]*fp[k][j]) * dphi; } - } + } fpair *= rsqinv; f[i][0] += delx*fpair; @@ -459,8 +459,8 @@ double PairLocalDensity::init_one(int /* i */, int /* j */) ---------------------------------------------------------------------------*/ double PairLocalDensity::single(int /* i */, int /* j */, int itype, int jtype, - double rsq, double /* factor_coul */, - double /* factor_lj */, double &fforce) + double rsq, double /* factor_coul */, + double /* factor_lj */, double &fforce) { int m, k, index; double rsqinv, p, uLD; @@ -473,7 +473,7 @@ double PairLocalDensity::single(int /* i */, int /* j */, int itype, int jtype, for (k = 0; k < nLD; k++) { LD[k][1] = 0.0; // itype:- 1 LD[k][2] = 0.0; // jtype:- 2 - } + } rsqinv = 1.0/rsq; for (k = 0; k < nLD; k++) { @@ -556,24 +556,24 @@ void PairLocalDensity::interpolate_cbspl(int n, double delta, { /* inputs: n number of interpolating points - - f array containing function values to - be interpolated; f[i] is the function - value corresponding to x[i] - ('x' refers to the independent var) - - delta difference in tabulated values of x + + f array containing function values to + be interpolated; f[i] is the function + value corresponding to x[i] + ('x' refers to the independent var) + + delta difference in tabulated values of x - outputs: (packaged as columns of the coeff matrix) - coeff_b coeffs of linear terms - coeff_c coeffs of quadratic terms - coeff_d coeffs of cubic terms + outputs: (packaged as columns of the coeff matrix) + coeff_b coeffs of linear terms + coeff_c coeffs of quadratic terms + coeff_d coeffs of cubic terms spline matrix that collects b,c,d - - other parameters: - fpa derivative of function at x=a - fpb derivative of function at x=b + + other parameters: + fpa derivative of function at x=a + fpb derivative of function at x=b */ double *dl, *dd, *du; @@ -684,12 +684,12 @@ void PairLocalDensity::parse_file(char *filename) { // broadcast number of LD potentials and number of (rho,frho) pairs if (me == 0) { - // first 2 comment lines ignored + // first 2 comment lines ignored utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); // extract number of potentials and number of (frho, rho) points - utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); + utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); sscanf(line, "%d %d", &nLD, &nrho); utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); } @@ -711,9 +711,9 @@ void PairLocalDensity::parse_file(char *filename) { memory->create(delta_rho, nLD,"pairLD:delta_rho"); memory->create(ftmp, nrho*nLD, "pairLD:ftmp"); - // setting up central and neighbor atom filters + // setting up central and neighbor atom filters memory->create(a, nLD, atom->ntypes+1 , "pairLD:a"); - memory->create(b, nLD, atom->ntypes+1, "pairLD:b"); + memory->create(b, nLD, atom->ntypes+1, "pairLD:b"); if (me == 0) { for (n = 1; n <= atom->ntypes; n++){ for (k = 0; k < nLD; k++) { @@ -721,14 +721,14 @@ void PairLocalDensity::parse_file(char *filename) { b[k][n] = 0; } } - } + } // read file block by block if (me == 0) { for (k = 0; k < nLD; k++) { - // parse upper and lower cut values + // parse upper and lower cut values if (fgets(line,MAXLINE,fptr)==NULL) break; sscanf(line, "%lf %lf", &lowercut[k], &uppercut[k]); @@ -743,7 +743,7 @@ void PairLocalDensity::parse_file(char *filename) { // parse neighbor atom filter utils::sfgets(FLERR,line, MAXLINE, fptr,filename,error); tmp = strtok(line, " /t/n/r/f"); - while (tmp != NULL) { + while (tmp != NULL) { b[k][atoi(tmp)] = 1; tmp = strtok(NULL, " /t/n/r/f"); } @@ -778,7 +778,7 @@ void PairLocalDensity::parse_file(char *filename) { } } - // Broadcast all parsed arrays + // Broadcast all parsed arrays MPI_Bcast(&lowercut[0], nLD, MPI_DOUBLE, 0, world); MPI_Bcast(&uppercut[0], nLD, MPI_DOUBLE, 0, world); MPI_Bcast(&lowercutsq[0], nLD, MPI_DOUBLE, 0, world); @@ -818,16 +818,16 @@ void PairLocalDensity::parse_file(char *filename) { ------------------------------------------------------------------------- */ int PairLocalDensity::pack_comm(int n, int *list, double *buf, - int /* pbc_flag */, int * /* pbc */) { + int /* pbc_flag */, int * /* pbc */) { int i,j,k; - int m; + int m; m = 0; for (i = 0; i < n; i++) { j = list[i]; for (k = 0; k < nLD; k++) { buf[m++] = fp[k][j]; - } + } } return nLD; @@ -845,7 +845,7 @@ void PairLocalDensity::unpack_comm(int n, int first, double *buf) { for (k = 0; k < nLD; k++) { fp[k][i] = buf[m++]; } - } + } } /* ---------------------------------------------------------------------- */ @@ -876,7 +876,7 @@ void PairLocalDensity::unpack_reverse_comm(int n, int *list, double *buf) { j = list[i]; for (k = 0; k < nLD; k++) { localrho[k][j] += buf[m++]; - } + } } } diff --git a/src/USER-MISC/pair_local_density.h b/src/USER-MISC/pair_local_density.h index 77aab1399b..5e37376ece 100644 --- a/src/USER-MISC/pair_local_density.h +++ b/src/USER-MISC/pair_local_density.h @@ -72,13 +72,13 @@ class PairLocalDensity : public Pair { void allocate(); - // read tabulated input file - void parse_file(char *); + // read tabulated input file + void parse_file(char *); - // convert array to spline - void array2spline(); - - // cubic spline interpolation + // convert array to spline + void array2spline(); + + // cubic spline interpolation void interpolate_cbspl(int, double, double *, double **); }; diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index fce23c645f..66f1acf91c 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -46,8 +46,8 @@ extern int Init_Workspace(reax_system*, control_params*, storage*, char*); /* ---------------------------------------------------------------------- */ int Init_ListsOMP(reax_system *system, control_params *control, - simulation_data * /* data */, storage * /* workspace */, - reax_list **lists, mpi_datatypes * /* mpi_data */, char * /* msg */) + simulation_data * /* data */, storage * /* workspace */, + reax_list **lists, mpi_datatypes * /* mpi_data */, char * /* msg */) { int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; int *hb_top, *bond_top; diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index e3a6645fc2..a44c7d5cbd 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -154,7 +154,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity checks */ if (c == 2 && !lgflag) - control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); + control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); if (c < 9) { snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); diff --git a/src/force.cpp b/src/force.cpp index cc121a5f80..63d1fcbe31 100644 --- a/src/force.cpp +++ b/src/force.cpp @@ -204,17 +204,17 @@ void Force::init() if (!bond && (atom->nbonds > 0)) { error->warning(FLERR,"Bonds are defined but no bond style is set"); if ((special_lj[1] != 1.0) || (special_coul[1] != 1.0)) - error->warning(FLERR,"Likewise 1-2 special neighbor interactions != 1.0"); + error->warning(FLERR,"Likewise 1-2 special neighbor interactions != 1.0"); } if (!angle && (atom->nangles > 0)) { error->warning(FLERR,"Angles are defined but no angle style is set"); if ((special_lj[2] != 1.0) || (special_coul[2] != 1.0)) - error->warning(FLERR,"Likewise 1-3 special neighbor interactions != 1.0"); + error->warning(FLERR,"Likewise 1-3 special neighbor interactions != 1.0"); } if (!dihedral && (atom->ndihedrals > 0)) { error->warning(FLERR,"Dihedrals are defined but no dihedral style is set"); if ((special_lj[3] != 1.0) || (special_coul[3] != 1.0)) - error->warning(FLERR,"Likewise 1-4 special neighbor interactions != 1.0"); + error->warning(FLERR,"Likewise 1-4 special neighbor interactions != 1.0"); } if (!improper && (atom->nimpropers > 0)) error->warning(FLERR,"Impropers are defined but no improper style is set"); diff --git a/src/min.h b/src/min.h index 61f9ce0bda..6f3e10d048 100644 --- a/src/min.h +++ b/src/min.h @@ -64,11 +64,11 @@ class Min : protected Pointers { int virial_style; // compute virial explicitly or implicitly int external_force_clear; // clear forces locally or externally - double dmax; // max dist to move any atom in one step - int linestyle; // 0 = backtrack, 1 = quadratic, 2 = forcezero - // 3 = spin_cubic, 4 = spin_none + double dmax; // max dist to move any atom in one step + int linestyle; // 0 = backtrack, 1 = quadratic, 2 = forcezero + // 3 = spin_cubic, 4 = spin_none - int normstyle; // TWO, MAX or INF flag for force norm evaluation + int normstyle; // TWO, MAX or INF flag for force norm evaluation int nelist_global,nelist_atom; // # of PE,virial computes to check int nvlist_global,nvlist_atom; diff --git a/src/min_cg.cpp b/src/min_cg.cpp index 80dde25f51..7b7046ea00 100644 --- a/src/min_cg.cpp +++ b/src/min_cg.cpp @@ -100,7 +100,7 @@ int MinCG::iterate(int maxiter) for (i = 0; i < n; i++) { dot[0] += fatom[i]*fatom[i]; dot[1] += fatom[i]*gatom[i]; - fmax = MAX(fmax,fatom[i]*fatom[i]); + fmax = MAX(fmax,fatom[i]*fatom[i]); } } MPI_Allreduce(dot,dotall,2,MPI_DOUBLE,MPI_SUM,world); @@ -111,13 +111,13 @@ int MinCG::iterate(int maxiter) } fmax = 0.0; - if (normstyle == MAX) { // max force norm + if (normstyle == MAX) { // max force norm fmax = fnorm_max(); if (fmax < update->ftol*update->ftol) return FTOL; - } else if (normstyle == INF) { // infinite force norm + } else if (normstyle == INF) { // infinite force norm fmax = fnorm_inf(); if (fmax < update->ftol*update->ftol) return FTOL; - } else if (normstyle == TWO) { // Euclidean force 2-norm + } else if (normstyle == TWO) { // Euclidean force 2-norm if (dotall[0] < update->ftol*update->ftol) return FTOL; } else error->all(FLERR,"Illegal min_modify command"); diff --git a/src/min_fire.cpp b/src/min_fire.cpp index b4b0f14534..3449f431c9 100644 --- a/src/min_fire.cpp +++ b/src/min_fire.cpp @@ -251,9 +251,9 @@ int MinFire::iterate(int maxiter) // sync across replicas if running multi-replica minimization if (update->ftol > 0.0) { - if (normstyle == MAX) fdotf = fnorm_max(); // max force norm - else if (normstyle == INF) fdotf = fnorm_inf(); // inf force norm - else if (normstyle == TWO) fdotf = fnorm_sqr(); // Euclidean force 2-norm + if (normstyle == MAX) fdotf = fnorm_max(); // max force norm + else if (normstyle == INF) fdotf = fnorm_inf(); // inf force norm + else if (normstyle == TWO) fdotf = fnorm_sqr(); // Euclidean force 2-norm else error->all(FLERR,"Illegal min_modify command"); if (update->multireplica == 0) { if (fdotf < update->ftol*update->ftol) return FTOL; diff --git a/src/min_sd.cpp b/src/min_sd.cpp index 627a3b3cf3..b89682ab5c 100644 --- a/src/min_sd.cpp +++ b/src/min_sd.cpp @@ -78,9 +78,9 @@ int MinSD::iterate(int maxiter) // force tolerance criterion - if (normstyle == MAX) fdotf = fnorm_max(); // max force norm - else if (normstyle == INF) fdotf = fnorm_inf(); // infinite force norm - else if (normstyle == TWO) fdotf = fnorm_sqr(); // Euclidean force 2-norm + if (normstyle == MAX) fdotf = fnorm_max(); // max force norm + else if (normstyle == INF) fdotf = fnorm_inf(); // infinite force norm + else if (normstyle == TWO) fdotf = fnorm_sqr(); // Euclidean force 2-norm else error->all(FLERR,"Illegal min_modify command"); if (fdotf < update->ftol*update->ftol) return FTOL; From b6b022b6107eeb06edcb9c0937e8e4691526ae84 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 3 Nov 2019 11:03:39 -0500 Subject: [PATCH 385/418] whitespace cleanup: remove trailing blanks --- src/CLASS2/pair_lj_class2_coul_long.cpp | 20 +- src/CLASS2/pair_lj_class2_coul_long.h | 2 +- src/KOKKOS/comm_kokkos.cpp | 2 +- src/KOKKOS/domain_kokkos.cpp | 6 +- src/KOKKOS/kokkos.cpp | 2 +- src/KOKKOS/npair_kokkos.cpp | 2 +- src/KOKKOS/pair_kokkos.h | 4 +- src/KOKKOS/pair_snap_kokkos_impl.h | 16 +- src/KOKKOS/sna_kokkos.h | 2 +- src/KOKKOS/sna_kokkos_impl.h | 30 +-- src/KSPACE/ewald_dipole.cpp | 22 +- src/KSPACE/ewald_dipole_spin.cpp | 26 +- src/KSPACE/ewald_dipole_spin.h | 6 +- src/KSPACE/pppm_dipole.cpp | 16 +- src/KSPACE/pppm_dipole.h | 2 +- src/KSPACE/pppm_dipole_spin.cpp | 8 +- src/KSPACE/pppm_dipole_spin.h | 4 +- src/MANYBODY/pair_airebo.cpp | 8 +- src/RIGID/rigid_const.h | 2 +- src/SNAP/pair_snap.cpp | 4 +- src/SNAP/sna.cpp | 40 +-- src/SNAP/sna.h | 4 +- src/SPIN/atom_vec_spin.h | 2 +- src/SPIN/fix_nve_spin.cpp | 2 +- src/SPIN/fix_precession_spin.cpp | 10 +- src/SPIN/fix_precession_spin.h | 4 +- src/SPIN/fix_setforce_spin.cpp | 2 +- src/SPIN/fix_setforce_spin.h | 2 +- src/SPIN/min_spin_cg.cpp | 26 +- src/SPIN/min_spin_lbfgs.cpp | 16 +- src/SPIN/pair_spin.cpp | 2 +- src/SPIN/pair_spin_dipole_cut.cpp | 88 +++---- src/SPIN/pair_spin_dipole_cut.h | 12 +- src/SPIN/pair_spin_dipole_long.cpp | 86 +++---- src/SPIN/pair_spin_dipole_long.h | 12 +- src/USER-CGDNA/pair_oxdna2_excv.cpp | 2 +- src/USER-CGDNA/pair_oxdna_coaxstk.cpp | 2 +- src/USER-CGDNA/pair_oxdna_excv.cpp | 2 +- src/USER-CGDNA/pair_oxdna_hbond.cpp | 2 +- src/USER-CGDNA/pair_oxdna_stk.cpp | 4 +- src/USER-MEAMC/meam_setup_done.cpp | 2 +- src/USER-MISC/compute_gyration_shape.cpp | 2 +- src/USER-MISC/compute_hma.cpp | 58 ++--- src/USER-MISC/compute_hma.h | 2 +- src/USER-MISC/pair_cosine_squared.cpp | 6 +- src/USER-MISC/pair_extep.cpp | 2 +- src/USER-MISC/pair_ilp_graphene_hbn.cpp | 4 +- src/USER-MISC/pair_kolmogorov_crespi_full.cpp | 6 +- src/USER-MISC/pair_local_density.cpp | 230 +++++++++--------- src/USER-MISC/pair_local_density.h | 22 +- src/USER-MOLFILE/reader_molfile.cpp | 2 +- src/USER-PHONON/dynamical_matrix.cpp | 2 +- src/USER-PLUMED/fix_plumed.cpp | 2 +- src/USER-REAXC/reaxc_ffield.cpp | 2 +- .../pair_lj_switch3_coulgauss_long.cpp | 6 +- .../pair_mm3_switch3_coulgauss_long.cpp | 6 +- src/comm.cpp | 2 +- src/compute_bond_local.cpp | 2 +- src/compute_orientorder_atom.cpp | 10 +- src/fix_neigh_history.cpp | 4 +- src/input.h | 2 +- src/lammps.cpp | 2 +- src/min.cpp | 2 +- src/min.h | 6 +- src/min_cg.cpp | 4 +- src/neighbor.cpp | 6 +- src/read_data.cpp | 2 +- src/read_dump.cpp | 2 +- src/reader_native.cpp | 2 +- 69 files changed, 452 insertions(+), 452 deletions(-) diff --git a/src/CLASS2/pair_lj_class2_coul_long.cpp b/src/CLASS2/pair_lj_class2_coul_long.cpp index c2b127fa58..1544232e49 100644 --- a/src/CLASS2/pair_lj_class2_coul_long.cpp +++ b/src/CLASS2/pair_lj_class2_coul_long.cpp @@ -664,19 +664,19 @@ void PairLJClass2CoulLong::init_style() if (!atom->q_flag) error->all(FLERR, "Pair style lj/class2/coul/long requires atom attribute q"); - + // request regular or rRESPA neighbor list - + int irequest; int respa = 0; - + if (update->whichflag == 1 && strstr(update->integrate_style,"respa")) { if (((Respa *) update->integrate)->level_inner >= 0) respa = 1; if (((Respa *) update->integrate)->level_middle >= 0) respa = 2; } - + irequest = neighbor->request(this,instance_me); - + if (respa >= 1) { neighbor->requests[irequest]->respaouter = 1; neighbor->requests[irequest]->respainner = 1; @@ -684,13 +684,13 @@ void PairLJClass2CoulLong::init_style() if (respa == 2) neighbor->requests[irequest]->respamiddle = 1; cut_coulsq = cut_coul * cut_coul; - + // set rRESPA cutoffs - + if (strstr(update->integrate_style,"respa") && ((Respa *) update->integrate)->level_inner >= 0) cut_respa = ((Respa *) update->integrate)->cutoff; - else cut_respa = NULL; + else cut_respa = NULL; // insure use of KSpace long-range solver, set g_ewald @@ -739,9 +739,9 @@ double PairLJClass2CoulLong::init_one(int i, int j) lj3[j][i] = lj3[i][j]; lj4[j][i] = lj4[i][j]; offset[j][i] = offset[i][j]; - + // check interior rRESPA cutoff - + if (cut_respa && MIN(cut_lj[i][j],cut_coul) < cut_respa[3]) error->all(FLERR,"Pair cutoff < Respa interior cutoff"); diff --git a/src/CLASS2/pair_lj_class2_coul_long.h b/src/CLASS2/pair_lj_class2_coul_long.h index 50d7092541..7b68382295 100644 --- a/src/CLASS2/pair_lj_class2_coul_long.h +++ b/src/CLASS2/pair_lj_class2_coul_long.h @@ -40,7 +40,7 @@ class PairLJClass2CoulLong : public Pair { void write_data(FILE *); void write_data_all(FILE *); double single(int, int, int, int, double, double, double, double &); - + void compute_inner(); void compute_middle(); void compute_outer(int, int); diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index d0bd978ae7..774d7040cc 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -210,7 +210,7 @@ void CommKokkos::forward_comm_device(int dummy) MPI_Send(k_buf_send.view().data(), n,MPI_DOUBLE,sendproc[iswap],0,world); } - + if (size_forward_recv[iswap]) { MPI_Wait(&request,MPI_STATUS_IGNORE); atomKK->modified(ExecutionSpaceFromDevice:: diff --git a/src/KOKKOS/domain_kokkos.cpp b/src/KOKKOS/domain_kokkos.cpp index 4cf3e6ab52..cb4eaddfec 100644 --- a/src/KOKKOS/domain_kokkos.cpp +++ b/src/KOKKOS/domain_kokkos.cpp @@ -340,11 +340,11 @@ struct DomainPBCFunctor { void DomainKokkos::pbc() { - + if (lmp->kokkos->exchange_comm_classic) { - + // reduce GPU data movement - + atomKK->sync(Host,X_MASK|V_MASK|MASK_MASK|IMAGE_MASK); Domain::pbc(); atomKK->modified(Host,X_MASK|V_MASK|MASK_MASK|IMAGE_MASK); diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 18dff991b2..720dd3b3b2 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -187,7 +187,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) binsize = 0.0; #ifdef KOKKOS_ENABLE_CUDA - cuda_aware_flag = 1; + cuda_aware_flag = 1; #else cuda_aware_flag = 0; #endif diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 5470001967..dc0efbc193 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -101,7 +101,7 @@ void NPairKokkos::copy_stencil_info() // copy stencil to device as it may have changed int maxstencil = ns->get_maxstencil(); - + if (maxstencil > k_stencil.extent(0)) k_stencil = DAT::tdual_int_1d("neighlist:stencil",maxstencil); for (int k = 0; k < maxstencil; k++) diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 9ca5d9578d..52a05b3991 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -293,7 +293,7 @@ struct PairComputeFunctor { const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; if(rsq < (STACKPARAMS?c.m_cutsq[itype][jtype]:c.d_cutsq(itype,jtype))) { - + const F_FLOAT fpair = factor_lj*c.template compute_fpair(rsq,i,j,itype,jtype); ftmp.x += delx*fpair; @@ -412,7 +412,7 @@ struct PairComputeFunctor { const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; if(rsq < (STACKPARAMS?c.m_cutsq[itype][jtype]:c.d_cutsq(itype,jtype))) { - + const F_FLOAT fpair = factor_lj*c.template compute_fpair(rsq,i,j,itype,jtype); fev_tmp.f[0] += delx*fpair; diff --git a/src/KOKKOS/pair_snap_kokkos_impl.h b/src/KOKKOS/pair_snap_kokkos_impl.h index 02c8554fa5..ef01ec5ea3 100644 --- a/src/KOKKOS/pair_snap_kokkos_impl.h +++ b/src/KOKKOS/pair_snap_kokkos_impl.h @@ -584,7 +584,7 @@ void PairSNAPKokkos::operator() (TagPairSNAPComputeDeidrj,const type const int jj = team.league_rank() / ((inum+team.team_size()-1)/team.team_size()); const int ninside = d_ninside(ii); if (jj >= ninside) return; - + my_sna.compute_deidrj(team,ii,jj); } @@ -619,9 +619,9 @@ void PairSNAPKokkos::operator() (TagPairSNAPComputeForce(ev,i,j, @@ -630,7 +630,7 @@ void PairSNAPKokkos::operator() (TagPairSNAPComputeForce::operator() (TagPairSNAPComputeForce::build_indexlist() for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { - h_idxcg_block(j1,j2,j) = idxcg_count; + h_idxcg_block(j1,j2,j) = idxcg_count; for (int m1 = 0; m1 <= j1; m1++) for (int m2 = 0; m2 <= j2; m2++) idxcg_count++; @@ -98,9 +98,9 @@ void SNAKokkos::build_indexlist() auto h_idxu_block = Kokkos::create_mirror_view(idxu_block); int idxu_count = 0; - + for(int j = 0; j <= twojmax; j++) { - h_idxu_block[j] = idxu_count; + h_idxu_block[j] = idxu_count; for(int mb = 0; mb <= j; mb++) for(int ma = 0; ma <= j; ma++) idxu_count++; @@ -110,16 +110,16 @@ void SNAKokkos::build_indexlist() // index list for beta and B - int idxb_count = 0; + int idxb_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) if (j >= j1) idxb_count++; - + idxb_max = idxb_count; idxb = Kokkos::View("SNAKokkos::idxb",idxb_max); auto h_idxb = Kokkos::create_mirror_view(idxb); - + idxb_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) @@ -142,7 +142,7 @@ void SNAKokkos::build_indexlist() for(int j2 = 0; j2 <= j1; j2++) for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { if (j >= j1) { - h_idxb_block(j1,j2,j) = idxb_count; + h_idxb_block(j1,j2,j) = idxb_count; idxb_count++; } } @@ -158,19 +158,19 @@ void SNAKokkos::build_indexlist() for (int mb = 0; 2*mb <= j; mb++) for (int ma = 0; ma <= j; ma++) idxz_count++; - + idxz_max = idxz_count; idxz = Kokkos::View("SNAKokkos::idxz",idxz_max); auto h_idxz = Kokkos::create_mirror_view(idxz); idxz_block = Kokkos::View("SNAKokkos::idxz_block", jdim,jdim,jdim); auto h_idxz_block = Kokkos::create_mirror_view(idxz_block); - + idxz_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { - h_idxz_block(j1,j2,j) = idxz_count; + h_idxz_block(j1,j2,j) = idxz_count; // find right beta(ii,jjb) entry // multiply and divide by j+1 factors @@ -226,7 +226,7 @@ void SNAKokkos::grow_rij(int newnatom, int newnmax) blist = t_sna_2d("sna:blist",natom,idxb_max); ulisttot = t_sna_2c("sna:ulisttot",natom,idxu_max); - if (!Kokkos::Impl::is_same::value) + if (!Kokkos::Impl::is_same::value) ulisttot_lr = t_sna_2c_lr("sna:ulisttot_lr",natom,idxu_max); zlist = t_sna_2c("sna:zlist",natom,idxz_max); @@ -306,7 +306,7 @@ void SNAKokkos::compute_zi(const int& iter) const double* cgblock = cglist.data() + idxcg_block(j1,j2,j); - zlist(iatom,jjz).re = 0.0; + zlist(iatom,jjz).re = 0.0; zlist(iatom,jjz).im = 0.0; int jju1 = idxu_block[j1] + (j1+1)*mb1min; @@ -419,7 +419,7 @@ void SNAKokkos::compute_yi(int iter, if (j1 == j) { if (j2 == j) betaj = 3*beta(iatom,jjb); else betaj = 2*beta(iatom,jjb); - } else betaj = beta(iatom,jjb); + } else betaj = beta(iatom,jjb); } else if (j >= j2) { const int jjb = idxb_block(j,j2,j1); if (j2 == j) betaj = 2*beta(iatom,jjb)*(j1+1)/(j+1.0); @@ -1176,7 +1176,7 @@ void SNAKokkos::init_clebsch_gordan() factorial((j + cc2) / 2) * factorial((j - cc2) / 2) * (j + 1)); - + h_cglist[idxcg_count] = sum * dcg * sfaccg; idxcg_count++; } @@ -1278,7 +1278,7 @@ double SNAKokkos::memory_usage() if (!Kokkos::Impl::is_same::value) bytes += natom * idxu_max * sizeof(double) * 2; // ulisttot_lr bytes += natom * idxu_max * 3 * sizeof(double) * 2; // dulist - + bytes += natom * idxz_max * sizeof(double) * 2; // zlist bytes += natom * idxb_max * sizeof(double); // blist bytes += natom * idxu_max * sizeof(double) * 2; // ylist diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index a003ce91fd..1939742bfc 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -167,7 +167,7 @@ void EwaldDipole::init() NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; else error->warning(FLERR,"Ewald/disp Newton solver failed, " - "using old method to estimate g_ewald"); + "using old method to estimate g_ewald"); } // setup EwaldDipole coefficients so can print stats @@ -246,7 +246,7 @@ void EwaldDipole::setup() double err; kxmax = 1; kymax = 1; - kzmax = 1; + kzmax = 1; // set kmax in 3 directions to respect accuracy @@ -462,7 +462,7 @@ void EwaldDipole::compute(int eflag, int vflag) vc[k][4] += vcik[4] = -(partial_peratom * mu[i][0] * eg[k][2]); vc[k][5] += vcik[5] = -(partial_peratom * mu[i][1] * eg[k][2]); - // taking re-part of struct_fact x exp(i*k*ri) + // taking re-part of struct_fact x exp(i*k*ri) // (for per-atom energy and virial calc.) if (evflag_atom) { @@ -653,12 +653,12 @@ void EwaldDipole::eik_dot_r() muz = mu[i][2]; // dir 1: (0,l,m) - mudotk = (muy*l*unitk[1] + muz*m*unitk[2]); + mudotk = (muy*l*unitk[1] + muz*m*unitk[2]); cstr1 += mudotk*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); sstr1 += mudotk*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); // dir 2: (0,l,-m) - mudotk = (muy*l*unitk[1] - muz*m*unitk[2]); + mudotk = (muy*l*unitk[1] - muz*m*unitk[2]); cstr2 += mudotk*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); sstr2 += mudotk*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); } @@ -685,12 +685,12 @@ void EwaldDipole::eik_dot_r() muz = mu[i][2]; // dir 1: (k,0,m) - mudotk = (mux*k*unitk[0] + muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] + muz*m*unitk[2]); cstr1 += mudotk*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); sstr1 += mudotk*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); // dir 2: (k,0,-m) - mudotk = (mux*k*unitk[0] - muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] - muz*m*unitk[2]); cstr2 += mudotk*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); sstr2 += mudotk*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); } @@ -724,28 +724,28 @@ void EwaldDipole::eik_dot_r() muz = mu[i][2]; // dir 1: (k,l,m) - mudotk = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; cstr1 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr1 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 2: (k,-l,m) - mudotk = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; cstr2 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr2 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 3: (k,l,-m) - mudotk = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; cstr3 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr3 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 4: (k,-l,-m) - mudotk = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; cstr4 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 531f4cdec5..82832f6e4c 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -36,7 +36,7 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp) : +EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp) : EwaldDipole(lmp) { dipoleflag = 0; @@ -157,7 +157,7 @@ void EwaldDipoleSpin::init() NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; else error->warning(FLERR,"Ewald/disp Newton solver failed, " - "using old method to estimate g_ewald"); + "using old method to estimate g_ewald"); } // setup EwaldDipoleSpin coefficients so can print stats @@ -236,7 +236,7 @@ void EwaldDipoleSpin::setup() double err; kxmax = 1; kymax = 1; - kzmax = 1; + kzmax = 1; // set kmax in 3 directions to respect accuracy @@ -440,7 +440,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) vc[k][4] += vcik[4] = -(partial_peratom * spx * eg[k][2]); vc[k][5] += vcik[5] = -(partial_peratom * spy * eg[k][2]); - // taking re-part of struct_fact x exp(i*k*ri) + // taking re-part of struct_fact x exp(i*k*ri) // (for per-atom energy and virial calc.) if (evflag_atom) { @@ -639,12 +639,12 @@ void EwaldDipoleSpin::eik_dot_r() spz = sp[i][2]*sp[i][3]; // dir 1: (0,l,m) - mudotk = (spy*l*unitk[1] + spz*m*unitk[2]); + mudotk = (spy*l*unitk[1] + spz*m*unitk[2]); cstr1 += mudotk*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); sstr1 += mudotk*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); // dir 2: (0,l,-m) - mudotk = (spy*l*unitk[1] - spz*m*unitk[2]); + mudotk = (spy*l*unitk[1] - spz*m*unitk[2]); cstr2 += mudotk*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); sstr2 += mudotk*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); } @@ -671,12 +671,12 @@ void EwaldDipoleSpin::eik_dot_r() spz = sp[i][2]*sp[i][3]; // dir 1: (k,0,m) - mudotk = (spx*k*unitk[0] + spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] + spz*m*unitk[2]); cstr1 += mudotk*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); sstr1 += mudotk*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); // dir 2: (k,0,-m) - mudotk = (spx*k*unitk[0] - spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] - spz*m*unitk[2]); cstr2 += mudotk*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); sstr2 += mudotk*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); } @@ -710,28 +710,28 @@ void EwaldDipoleSpin::eik_dot_r() spz = sp[i][2]*sp[i][3]; // dir 1: (k,l,m) - mudotk = (spx*k*unitk[0] + spy*l*unitk[1] + spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] + spy*l*unitk[1] + spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; cstr1 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr1 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 2: (k,-l,m) - mudotk = (spx*k*unitk[0] - spy*l*unitk[1] + spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] - spy*l*unitk[1] + spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; cstr2 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr2 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 3: (k,l,-m) - mudotk = (spx*k*unitk[0] + spy*l*unitk[1] - spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] + spy*l*unitk[1] - spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; cstr3 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr3 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 4: (k,-l,-m) - mudotk = (spx*k*unitk[0] - spy*l*unitk[1] - spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] - spy*l*unitk[1] - spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; cstr4 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); @@ -768,7 +768,7 @@ void EwaldDipoleSpin::slabcorr() double spz; int nlocal = atom->nlocal; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < nlocal; i++) { spz = sp[i][2]*sp[i][3]; spin += spz; } diff --git a/src/KSPACE/ewald_dipole_spin.h b/src/KSPACE/ewald_dipole_spin.h index 20852c08c1..32c7ddb5f1 100644 --- a/src/KSPACE/ewald_dipole_spin.h +++ b/src/KSPACE/ewald_dipole_spin.h @@ -33,13 +33,13 @@ class EwaldDipoleSpin : public EwaldDipole { void compute(int, int); protected: - double hbar; // reduced Planck's constant - double mub; // Bohr's magneton + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton double mu_0; // vacuum permeability double mub2mu0; // prefactor for mech force double mub2mu0hbinv; // prefactor for mag force - void spsum_musq(); + void spsum_musq(); virtual void eik_dot_r(); void slabcorr(); diff --git a/src/KSPACE/pppm_dipole.cpp b/src/KSPACE/pppm_dipole.cpp index 5d69ca27b6..40d0c1ac73 100644 --- a/src/KSPACE/pppm_dipole.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -58,19 +58,19 @@ enum{FORWARD_MU,FORWARD_MU_PERATOM}; /* ---------------------------------------------------------------------- */ PPPMDipole::PPPMDipole(LAMMPS *lmp) : PPPM(lmp), - densityx_brick_dipole(NULL), densityy_brick_dipole(NULL), + densityx_brick_dipole(NULL), densityy_brick_dipole(NULL), densityz_brick_dipole(NULL), vdxx_brick_dipole(NULL), vdyy_brick_dipole(NULL), vdzz_brick_dipole(NULL), vdxy_brick_dipole(NULL), vdxz_brick_dipole(NULL), vdyz_brick_dipole(NULL), ux_brick_dipole(NULL), uy_brick_dipole(NULL), uz_brick_dipole(NULL), v0x_brick_dipole(NULL), v1x_brick_dipole(NULL), - v2x_brick_dipole(NULL), v3x_brick_dipole(NULL), v4x_brick_dipole(NULL), - v5x_brick_dipole(NULL), v0y_brick_dipole(NULL), v1y_brick_dipole(NULL), - v2y_brick_dipole(NULL), v3y_brick_dipole(NULL), v4y_brick_dipole(NULL), - v5y_brick_dipole(NULL), v0z_brick_dipole(NULL), v1z_brick_dipole(NULL), - v2z_brick_dipole(NULL), v3z_brick_dipole(NULL), v4z_brick_dipole(NULL), - v5z_brick_dipole(NULL), work3(NULL), work4(NULL), - densityx_fft_dipole(NULL), densityy_fft_dipole(NULL), + v2x_brick_dipole(NULL), v3x_brick_dipole(NULL), v4x_brick_dipole(NULL), + v5x_brick_dipole(NULL), v0y_brick_dipole(NULL), v1y_brick_dipole(NULL), + v2y_brick_dipole(NULL), v3y_brick_dipole(NULL), v4y_brick_dipole(NULL), + v5y_brick_dipole(NULL), v0z_brick_dipole(NULL), v1z_brick_dipole(NULL), + v2z_brick_dipole(NULL), v3z_brick_dipole(NULL), v4z_brick_dipole(NULL), + v5z_brick_dipole(NULL), work3(NULL), work4(NULL), + densityx_fft_dipole(NULL), densityy_fft_dipole(NULL), densityz_fft_dipole(NULL) { dipoleflag = 1; diff --git a/src/KSPACE/pppm_dipole.h b/src/KSPACE/pppm_dipole.h index d06919644b..a767f8b4c2 100644 --- a/src/KSPACE/pppm_dipole.h +++ b/src/KSPACE/pppm_dipole.h @@ -38,7 +38,7 @@ class PPPMDipole : public PPPM { protected: void set_grid_global(); - double newton_raphson_f(); + double newton_raphson_f(); void allocate(); void allocate_peratom(); diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index 38757ced21..7f7745eb3e 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -52,7 +52,7 @@ enum{FORWARD_MU,FORWARD_MU_PERATOM}; /* ---------------------------------------------------------------------- */ -PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp) : +PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp) : PPPMDipole(lmp) { dipoleflag = 0; @@ -147,7 +147,7 @@ void PPPMDipoleSpin::init() // kspace TIP4P not yet supported // qdist = offset only for TIP4P fictitious charge - qdist = 0.0; + qdist = 0.0; if (tip4pflag) error->all(FLERR,"Cannot yet use TIP4P with PPPMDipoleSpin"); @@ -668,7 +668,7 @@ void PPPMDipoleSpin::slabcorr() double spz; int nlocal = atom->nlocal; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < nlocal; i++) { spz = sp[i][2]*sp[i][3]; spin += spz; } @@ -729,7 +729,7 @@ void PPPMDipoleSpin::spsum_spsq() spsqsum_local += spx*spx + spy*spy + spz*spz; } - // store results into pppm_dipole quantities + // store results into pppm_dipole quantities MPI_Allreduce(&spsum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&spsqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); diff --git a/src/KSPACE/pppm_dipole_spin.h b/src/KSPACE/pppm_dipole_spin.h index 2b4a989d5c..fe88fc75ce 100644 --- a/src/KSPACE/pppm_dipole_spin.h +++ b/src/KSPACE/pppm_dipole_spin.h @@ -32,8 +32,8 @@ class PPPMDipoleSpin : public PPPMDipole { void compute(int, int); protected: - double hbar; // reduced Planck's constant - double mub; // Bohr's magneton + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton double mu_0; // vacuum permeability double mub2mu0; // prefactor for mech force double mub2mu0hbinv; // prefactor for mag force diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index 7cdffa7ea9..1d9dd18887 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -3638,9 +3638,9 @@ void PairAIREBO::read_file(char *filename) utils::sfgets(FLERR,s,MAXLINE,fp,filename,error); if (1 != sscanf(s,"%lg",&reqM_HH)) ++cerror; } - + } - + // check for errors parsing global parameters MPI_Bcast(&cerror,1,MPI_INT,0,world); @@ -3654,7 +3654,7 @@ void PairAIREBO::read_file(char *filename) cerror = numpar = 0; if (me == 0) { - + // gC spline utils::sfgets(FLERR,s,MAXLINE,fp,filename,error); @@ -3899,7 +3899,7 @@ void PairAIREBO::read_file(char *filename) fclose(fp); } - + // check for errors parsing spline data MPI_Bcast(&cerror,1,MPI_INT,0,world); diff --git a/src/RIGID/rigid_const.h b/src/RIGID/rigid_const.h index 14db517fcd..3aae988197 100644 --- a/src/RIGID/rigid_const.h +++ b/src/RIGID/rigid_const.h @@ -32,7 +32,7 @@ namespace LAMMPS_NS { ANGMOM = 1<<7, TORQUE = 1<<8 }; - + static const double TOLERANCE = 1.0e-6; static const double EPSILON = 1.0e-7; static const double BIG = 1.0e20; diff --git a/src/SNAP/pair_snap.cpp b/src/SNAP/pair_snap.cpp index 133f0e414b..6f7cf54659 100644 --- a/src/SNAP/pair_snap.cpp +++ b/src/SNAP/pair_snap.cpp @@ -108,7 +108,7 @@ void PairSNAP::compute(int eflag, int vflag) // compute dE_i/dB_i = beta_i for all i in list - if (quadraticflag || eflag) + if (quadraticflag || eflag) compute_bispectrum(); compute_beta(); @@ -165,7 +165,7 @@ void PairSNAP::compute(int eflag, int vflag) snaptr->compute_ui(ninside); // for neighbors of I within cutoff: - // compute Fij = dEi/dRj = -dEi/dRi + // compute Fij = dEi/dRj = -dEi/dRi // add to Fi, subtract from Fj snaptr->compute_yi(beta[ii]); diff --git a/src/SNAP/sna.cpp b/src/SNAP/sna.cpp index 9e8768c477..99834635b7 100644 --- a/src/SNAP/sna.cpp +++ b/src/SNAP/sna.cpp @@ -171,7 +171,7 @@ void SNA::build_indexlist() for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { - idxcg_block[j1][j2][j] = idxcg_count; + idxcg_block[j1][j2][j] = idxcg_count; for (int m1 = 0; m1 <= j1; m1++) for (int m2 = 0; m2 <= j2; m2++) idxcg_count++; @@ -185,9 +185,9 @@ void SNA::build_indexlist() "sna:idxu_block"); int idxu_count = 0; - + for(int j = 0; j <= twojmax; j++) { - idxu_block[j] = idxu_count; + idxu_block[j] = idxu_count; for(int mb = 0; mb <= j; mb++) for(int ma = 0; ma <= j; ma++) idxu_count++; @@ -196,15 +196,15 @@ void SNA::build_indexlist() // index list for beta and B - int idxb_count = 0; + int idxb_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) if (j >= j1) idxb_count++; - + idxb_max = idxb_count; idxb = new SNA_BINDICES[idxb_max]; - + idxb_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) @@ -225,7 +225,7 @@ void SNA::build_indexlist() for(int j2 = 0; j2 <= j1; j2++) for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { if (j >= j1) { - idxb_block[j1][j2][j] = idxb_count; + idxb_block[j1][j2][j] = idxb_count; idxb_count++; } } @@ -240,18 +240,18 @@ void SNA::build_indexlist() for (int mb = 0; 2*mb <= j; mb++) for (int ma = 0; ma <= j; ma++) idxz_count++; - + idxz_max = idxz_count; idxz = new SNA_ZINDICES[idxz_max]; - + memory->create(idxz_block, jdim, jdim, jdim, "sna:idxz_block"); - + idxz_count = 0; for(int j1 = 0; j1 <= twojmax; j1++) for(int j2 = 0; j2 <= j1; j2++) for(int j = j1 - j2; j <= MIN(twojmax, j1 + j2); j += 2) { - idxz_block[j1][j2][j] = idxz_count; + idxz_block[j1][j2][j] = idxz_count; // find right beta[jjb] entry // multiply and divide by j+1 factors @@ -481,7 +481,7 @@ void SNA::compute_yi(const double* beta) if (j1 == j) { if (j2 == j) betaj = 3*beta[jjb]; else betaj = 2*beta[jjb]; - } else betaj = beta[jjb]; + } else betaj = beta[jjb]; } else if (j >= j2) { const int jjb = idxb_block[j][j2][j1]; if (j2 == j) betaj = 2*beta[jjb]*(j1+1)/(j+1.0); @@ -549,7 +549,7 @@ void SNA::compute_deidrj(double* dedr) double jjjmambyarray_i = ylist_i[jju]; for(int k = 0; k < 3; k++) - dedr[k] += + dedr[k] += (dudr_r[k] * jjjmambyarray_r + dudr_i[k] * jjjmambyarray_i)*0.5; jju++; @@ -588,24 +588,24 @@ void SNA::compute_bi() double sumzu = 0.0; for (int mb = 0; 2*mb < j; mb++) for (int ma = 0; ma <= j; ma++) { - sumzu += ulisttot_r[jju]*zlist_r[jjz] + + sumzu += ulisttot_r[jju]*zlist_r[jjz] + ulisttot_i[jju]*zlist_i[jjz]; jjz++; jju++; - } // end loop over ma, mb + } // end loop over ma, mb // For j even, handle middle column if (j%2 == 0) { int mb = j/2; for(int ma = 0; ma < mb; ma++) { - sumzu += ulisttot_r[jju]*zlist_r[jjz] + + sumzu += ulisttot_r[jju]*zlist_r[jjz] + ulisttot_i[jju]*zlist_i[jjz]; jjz++; jju++; } - sumzu += 0.5*(ulisttot_r[jju]*zlist_r[jjz] + + sumzu += 0.5*(ulisttot_r[jju]*zlist_r[jjz] + ulisttot_i[jju]*zlist_i[jjz]); } // end if jeven @@ -1485,7 +1485,7 @@ void SNA::init_clebsch_gordan() factorial((j - j2 + aa2) / 2 + z) * factorial((j - j1 - bb2) / 2 + z)); } - + cc2 = 2 * m - j; dcg = deltacg(j1, j2, j); sfaccg = sqrt(factorial((j1 + aa2) / 2) * @@ -1495,7 +1495,7 @@ void SNA::init_clebsch_gordan() factorial((j + cc2) / 2) * factorial((j - cc2) / 2) * (j + 1)); - + cglist[idxcg_count] = sum * dcg * sfaccg; idxcg_count++; } @@ -1519,7 +1519,7 @@ void SNA::print_clebsch_gordan() for (int j1 = 0; j1 <= twojmax; j1++) for (int j2 = 0; j2 <= j1; j2++) if (j1-j2 <= j && j1+j2 >= j && (j1+j2+j)%2 == 0) { - int idxcg_count = idxcg_block[j1][j2][j]; + int idxcg_count = idxcg_block[j1][j2][j]; for (int m1 = 0; m1 <= j1; m1++) { aa2 = 2*m1-j1; for (int m2 = 0; m2 <= j2; m2++) { diff --git a/src/SNAP/sna.h b/src/SNAP/sna.h index 5ea65fd84b..16d3338277 100644 --- a/src/SNAP/sna.h +++ b/src/SNAP/sna.h @@ -81,8 +81,8 @@ private: int idxcg_max, idxu_max, idxz_max, idxb_max; double** rootpqarray; - double* cglist; - int*** idxcg_block; + double* cglist; + int*** idxcg_block; double* ulisttot_r, * ulisttot_i; double** ulist_r_ij, ** ulist_i_ij; diff --git a/src/SPIN/atom_vec_spin.h b/src/SPIN/atom_vec_spin.h index a31e57bb48..6ce2c9dc7d 100644 --- a/src/SPIN/atom_vec_spin.h +++ b/src/SPIN/atom_vec_spin.h @@ -68,7 +68,7 @@ class AtomVecSpin : public AtomVec { int *type,*mask; imageint *image; double **x,**v,**f; // lattice quantities - + // spin quantities double **sp; // sp[i][0-2] direction of the spin i // sp[i][3] atomic magnetic moment of the spin i diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index 87546ba9da..462a359d99 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -247,7 +247,7 @@ void FixNVESpin::init() locksetforcespin = (FixSetForceSpin *) modify->fix[iforce]; } } - + // setting the sector variables/lists nsectors = 0; diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index 97dbe7ba6f..e1f24e36c2 100644 --- a/src/SPIN/fix_precession_spin.cpp +++ b/src/SPIN/fix_precession_spin.cpp @@ -126,7 +126,7 @@ FixPrecessionSpin::FixPrecessionSpin(LAMMPS *lmp, int narg, char **arg) : Fix(lm nay *= inorm; naz *= inorm; } - + if (cubic_flag) { inorm = 1.0/sqrt(nc1x*nc1x + nc1y*nc1y + nc1z*nc1z); nc1x *= inorm; @@ -244,7 +244,7 @@ void FixPrecessionSpin::post_force(int /* vflag */) double **sp = atom->sp; const int nlocal = atom->nlocal; double spi[3], fmi[3], epreci; - + eflag = 0; eprec = 0.0; for (int i = 0; i < nlocal; i++) { @@ -317,7 +317,7 @@ double FixPrecessionSpin::compute_anisotropy_energy(double spi[3]) double energy = 0.0; double scalar = nax*spi[0] + nay*spi[1] + naz*spi[2]; energy = Ka*scalar*scalar; - return energy; + return energy; } /* ---------------------------------------------------------------------- */ @@ -391,11 +391,11 @@ void FixPrecessionSpin::compute_cubic(double spi[3], double fmi[3]) six1 = 2.0*skx*sky2*skz2; six2 = 2.0*sky*skx2*skz2; six3 = 2.0*skz*skx2*sky2; - + sixx = k2ch*(nc1x*six1 + nc2x*six2 + nc3x*six3); sixy = k2ch*(nc1y*six1 + nc2y*six2 + nc3y*six3); sixz = k2ch*(nc1z*six1 + nc2z*six2 + nc3z*six3); - + fmi[0] += fourx + sixx; fmi[1] += foury + sixy; fmi[2] += fourz + sixz; diff --git a/src/SPIN/fix_precession_spin.h b/src/SPIN/fix_precession_spin.h index 96d89e004e..6ece653ca7 100644 --- a/src/SPIN/fix_precession_spin.h +++ b/src/SPIN/fix_precession_spin.h @@ -42,7 +42,7 @@ class FixPrecessionSpin : public Fix { int zeeman_flag, aniso_flag, cubic_flag; void compute_single_precession(int, double *, double *); void compute_zeeman(int, double *); - + // uniaxial aniso calculations void compute_anisotropy(double *, double *); @@ -52,7 +52,7 @@ class FixPrecessionSpin : public Fix { void compute_cubic(double *, double *); double compute_cubic_energy(double *); - + protected: int style; // style of the magnetic precession diff --git a/src/SPIN/fix_setforce_spin.cpp b/src/SPIN/fix_setforce_spin.cpp index e36a9d260d..ec738b7522 100644 --- a/src/SPIN/fix_setforce_spin.cpp +++ b/src/SPIN/fix_setforce_spin.cpp @@ -140,7 +140,7 @@ void FixSetForceSpin::single_setforce_spin(int i, double fmi[3]) foriginal[0] = foriginal[1] = foriginal[2] = 0.0; force_flag = 0; - + // constant force if (varflag == CONSTANT) { diff --git a/src/SPIN/fix_setforce_spin.h b/src/SPIN/fix_setforce_spin.h index a836911d85..1c5ce54dd3 100644 --- a/src/SPIN/fix_setforce_spin.h +++ b/src/SPIN/fix_setforce_spin.h @@ -29,7 +29,7 @@ class FixSetForceSpin : public FixSetForce { FixSetForceSpin(class LAMMPS *, int, char **); virtual void post_force(int); void post_force_respa(int, int, int); - void single_setforce_spin(int, double *); + void single_setforce_spin(int, double *); }; } diff --git a/src/SPIN/min_spin_cg.cpp b/src/SPIN/min_spin_cg.cpp index 9c8c814bc4..8815ad89db 100644 --- a/src/SPIN/min_spin_cg.cpp +++ b/src/SPIN/min_spin_cg.cpp @@ -16,8 +16,8 @@ Julien Tranchida (SNL) Please cite the related publication: - Ivanov, A. V., Uzdin, V. M., & Jónsson, H. (2019). Fast and Robust - Algorithm for the Minimisation of the Energy of Spin Systems. arXiv + Ivanov, A. V., Uzdin, V. M., & Jónsson, H. (2019). Fast and Robust + Algorithm for the Minimisation of the Energy of Spin Systems. arXiv preprint arXiv:1904.02669. ------------------------------------------------------------------------- */ @@ -105,7 +105,7 @@ void MinSpinCG::init() error->warning(FLERR,"Line search incompatible gneb"); // set back use_line_search to 0 if more than one replica - + if (linestyle == 3 && nreplica == 1){ use_line_search = 1; } @@ -201,10 +201,10 @@ int MinSpinCG::iterate(int maxiter) if (timer->check_timeout(niter)) return TIMEOUT; - + ntimestep = ++update->ntimestep; niter++; - + // optimize timestep accross processes / replicas // need a force calculation for timestep optimization @@ -249,7 +249,7 @@ int MinSpinCG::iterate(int maxiter) // energy tolerance criterion // only check after DELAYSTEP elapsed since velocties reset to 0 // sync across replicas if running multi-replica minimization - + if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { if (update->multireplica == 0) { if (fabs(ecurrent-eprevious) < @@ -365,7 +365,7 @@ void MinSpinCG::calc_search_direction() MPI_Allreduce(&g2old,&g2old_global,1,MPI_DOUBLE,MPI_SUM,world); // Sum over all replicas. Good for GNEB. - + if (nreplica > 1) { g2 = g2_global * factor; g2old = g2old_global * factor; @@ -374,9 +374,9 @@ void MinSpinCG::calc_search_direction() } if (fabs(g2_global) < 1.0e-60) beta = 0.0; else beta = g2_global / g2old_global; - + // calculate conjugate direction - + for (int i = 0; i < 3 * nlocal; i++) { p_s[i] = (beta * p_s[i] - g_cur[i]) * factor; g_old[i] = g_cur[i] * factor; @@ -401,9 +401,9 @@ void MinSpinCG::advance_spins() for (int i = 0; i < nlocal; i++) { rodrigues_rotation(p_s + 3 * i, rot_mat); - + // rotate spins - + vm3(rot_mat, sp[i], s_new); for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; } @@ -414,7 +414,7 @@ void MinSpinCG::advance_spins() (R. Murray, Z. Li, and S. Shankar Sastry, A Mathematical Introduction to Robotic Manipulation (1994), p. 28 and 30). - + upp_tr - vector x, y, z so that one calculate U = exp(A) with A= [[0, x, y], [-x, 0, z], @@ -431,7 +431,7 @@ void MinSpinCG::rodrigues_rotation(const double *upp_tr, double *out) fabs(upp_tr[2]) < 1.0e-40){ // if upp_tr is zero, return unity matrix - + for(int k = 0; k < 3; k++){ for(int m = 0; m < 3; m++){ if (m == k) out[3 * k + m] = 1.0; diff --git a/src/SPIN/min_spin_lbfgs.cpp b/src/SPIN/min_spin_lbfgs.cpp index a1ee010f3f..7f6d7692cd 100644 --- a/src/SPIN/min_spin_lbfgs.cpp +++ b/src/SPIN/min_spin_lbfgs.cpp @@ -16,8 +16,8 @@ Julien Tranchida (SNL) Please cite the related publication: - Ivanov, A. V., Uzdin, V. M., & Jónsson, H. (2019). Fast and Robust - Algorithm for the Minimisation of the Energy of Spin Systems. arXiv + Ivanov, A. V., Uzdin, V. M., & Jónsson, H. (2019). Fast and Robust + Algorithm for the Minimisation of the Energy of Spin Systems. arXiv preprint arXiv:1904.02669. ------------------------------------------------------------------------- */ @@ -213,10 +213,10 @@ int MinSpinLBFGS::iterate(int maxiter) if (timer->check_timeout(niter)) return TIMEOUT; - + ntimestep = ++update->ntimestep; niter++; - + // optimize timestep accross processes / replicas // need a force calculation for timestep optimization @@ -264,7 +264,7 @@ int MinSpinLBFGS::iterate(int maxiter) // energy tolerance criterion // only check after DELAYSTEP elapsed since velocties reset to 0 // sync across replicas if running multi-replica minimization - + if (update->etol > 0.0 && ntimestep-last_negative > DELAYSTEP) { if (update->multireplica == 0) { if (fabs(ecurrent-eprevious) < @@ -526,9 +526,9 @@ void MinSpinLBFGS::advance_spins() for (int i = 0; i < nlocal; i++) { rodrigues_rotation(p_s + 3 * i, rot_mat); - + // rotate spins - + vm3(rot_mat, sp[i], s_new); for (int j = 0; j < 3; j++) sp[i][j] = s_new[j]; } @@ -539,7 +539,7 @@ void MinSpinLBFGS::advance_spins() (R. Murray, Z. Li, and S. Shankar Sastry, A Mathematical Introduction to Robotic Manipulation (1994), p. 28 and 30). - + upp_tr - vector x, y, z so that one calculate U = exp(A) with A= [[0, x, y], [-x, 0, z], diff --git a/src/SPIN/pair_spin.cpp b/src/SPIN/pair_spin.cpp index d956729e60..f167e3455c 100644 --- a/src/SPIN/pair_spin.cpp +++ b/src/SPIN/pair_spin.cpp @@ -82,7 +82,7 @@ void PairSpin::init_style() bool have_fix = ((modify->find_fix_by_style("^nve/spin") != -1) || (modify->find_fix_by_style("^neb/spin") != -1)); - + if (!have_fix && (comm->me == 0)) error->warning(FLERR,"Using spin pair style without nve/spin or neb/spin"); diff --git a/src/SPIN/pair_spin_dipole_cut.cpp b/src/SPIN/pair_spin_dipole_cut.cpp index bae09689de..a393fe7021 100644 --- a/src/SPIN/pair_spin_dipole_cut.cpp +++ b/src/SPIN/pair_spin_dipole_cut.cpp @@ -76,9 +76,9 @@ void PairSpinDipoleCut::settings(int narg, char **arg) PairSpin::settings(narg,arg); cut_spin_long_global = force->numeric(FLERR,arg[0]); - + // reset cutoffs that have been explicitly set - + if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) { @@ -99,10 +99,10 @@ void PairSpinDipoleCut::settings(int narg, char **arg) void PairSpinDipoleCut::coeff(int narg, char **arg) { if (!allocated) allocate(); - - if (narg != 3) + + if (narg != 3) error->all(FLERR,"Incorrect args in pair_style command"); - + int ilo,ihi,jlo,jhi; force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); @@ -128,9 +128,9 @@ void PairSpinDipoleCut::coeff(int narg, char **arg) double PairSpinDipoleCut::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - + cut_spin_long[j][i] = cut_spin_long[i][j]; - + return cut_spin_long_global; } @@ -163,8 +163,8 @@ void *PairSpinDipoleCut::extract(const char *str, int &dim) void PairSpinDipoleCut::compute(int eflag, int vflag) { - int i,j,ii,jj,inum,jnum,itype,jtype; - int *ilist,*jlist,*numneigh,**firstneigh; + int i,j,ii,jj,inum,jnum,itype,jtype; + int *ilist,*jlist,*numneigh,**firstneigh; double rinv,r2inv,r3inv,rsq,local_cut2,evdwl,ecoul; double xi[3],rij[3],eij[3],spi[4],spj[4],fi[3],fmi[3]; @@ -172,13 +172,13 @@ void PairSpinDipoleCut::compute(int eflag, int vflag) if (eflag || vflag) ev_setup(eflag,vflag); else evflag = vflag_fdotr = 0; - int *type = atom->type; - int nlocal = atom->nlocal; + int *type = atom->type; + int nlocal = atom->nlocal; int newton_pair = force->newton_pair; double **x = atom->x; double **f = atom->f; double **fm = atom->fm; - double **sp = atom->sp; + double **sp = atom->sp; inum = list->inum; ilist = list->ilist; @@ -194,9 +194,9 @@ void PairSpinDipoleCut::compute(int eflag, int vflag) xi[1] = x[i][1]; xi[2] = x[i][2]; jlist = firstneigh[i]; - jnum = numneigh[i]; - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; + jnum = numneigh[i]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; spi[2] = sp[i][2]; spi[3] = sp[i][3]; itype = type[i]; @@ -206,15 +206,15 @@ void PairSpinDipoleCut::compute(int eflag, int vflag) j &= NEIGHMASK; jtype = type[j]; - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - spj[3] = sp[j][3]; + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; evdwl = 0.0; fi[0] = fi[1] = fi[2] = 0.0; fmi[0] = fmi[1] = fmi[2] = 0.0; - + rij[0] = x[j][0] - xi[0]; rij[1] = x[j][1] - xi[1]; rij[2] = x[j][2] - xi[2]; @@ -229,23 +229,23 @@ void PairSpinDipoleCut::compute(int eflag, int vflag) if (rsq < local_cut2) { r2inv = 1.0/rsq; r3inv = r2inv*rinv; - + compute_dipolar(i,j,eij,fmi,spi,spj,r3inv); if (lattice_flag) compute_dipolar_mech(i,j,eij,fi,spi,spj,r2inv); } // force accumulation - f[i][0] += fi[0]; - f[i][1] += fi[1]; + f[i][0] += fi[0]; + f[i][1] += fi[1]; f[i][2] += fi[2]; fm[i][0] += fmi[0]; fm[i][1] += fmi[1]; fm[i][2] += fmi[2]; if (newton_pair || j < nlocal) { - f[j][0] -= fi[0]; - f[j][1] -= fi[1]; + f[j][0] -= fi[0]; + f[j][1] -= fi[1]; f[j][2] -= fi[2]; } @@ -269,21 +269,21 @@ void PairSpinDipoleCut::compute(int eflag, int vflag) void PairSpinDipoleCut::compute_single_pair(int ii, double fmi[3]) { - int j,jnum,itype,jtype,ntypes; - int *jlist,*numneigh,**firstneigh; + int j,jnum,itype,jtype,ntypes; + int *jlist,*numneigh,**firstneigh; double rsq,rinv,r2inv,r3inv,local_cut2; double xi[3],rij[3],eij[3],spi[4],spj[4]; int k,locflag; - int *type = atom->type; + int *type = atom->type; double **x = atom->x; - double **sp = atom->sp; + double **sp = atom->sp; numneigh = list->numneigh; firstneigh = list->firstneigh; // check if interaction applies to type of ii - + itype = type[ii]; ntypes = atom->ntypes; locflag = 0; @@ -307,28 +307,28 @@ void PairSpinDipoleCut::compute_single_pair(int ii, double fmi[3]) // if interaction applies to type ii, // locflag = 1 and compute pair interaction - + if (locflag == 1) { xi[0] = x[ii][0]; xi[1] = x[ii][1]; xi[2] = x[ii][2]; - spi[0] = sp[ii][0]; - spi[1] = sp[ii][1]; + spi[0] = sp[ii][0]; + spi[1] = sp[ii][1]; spi[2] = sp[ii][2]; spi[3] = sp[ii][3]; jlist = firstneigh[ii]; - jnum = numneigh[ii]; - + jnum = numneigh[ii]; + for (int jj = 0; jj < jnum; jj++) { j = jlist[jj]; j &= NEIGHMASK; jtype = type[j]; - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - spj[3] = sp[j][3]; + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; rij[0] = x[j][0] - xi[0]; rij[1] = x[j][1] - xi[1]; @@ -344,9 +344,9 @@ void PairSpinDipoleCut::compute_single_pair(int ii, double fmi[3]) if (rsq < local_cut2) { r2inv = 1.0/rsq; r3inv = r2inv*rinv; - + // compute dipolar interaction - + compute_dipolar(ii,j,eij,fmi,spi,spj,r3inv); } } @@ -357,7 +357,7 @@ void PairSpinDipoleCut::compute_single_pair(int ii, double fmi[3]) compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinDipoleCut::compute_dipolar(int /* i */, int /* j */, double eij[3], +void PairSpinDipoleCut::compute_dipolar(int /* i */, int /* j */, double eij[3], double fmi[3], double spi[4], double spj[4], double r3inv) { double sjdotr; @@ -373,7 +373,7 @@ void PairSpinDipoleCut::compute_dipolar(int /* i */, int /* j */, double eij[3], } /* ---------------------------------------------------------------------- - compute the mechanical force due to the dipolar interaction between + compute the mechanical force due to the dipolar interaction between atom i and atom j ------------------------------------------------------------------------- */ @@ -387,7 +387,7 @@ void PairSpinDipoleCut::compute_dipolar_mech(int /* i */, int /* j */, double ei sisj = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; sieij = spi[0]*eij[0] + spi[1]*eij[1] + spi[2]*eij[2]; sjeij = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; - + bij = sisj - 5.0*sieij*sjeij; pre = 3.0*mub2mu0*gigjri4; diff --git a/src/SPIN/pair_spin_dipole_cut.h b/src/SPIN/pair_spin_dipole_cut.h index 33f62d1633..3adceaf1c7 100644 --- a/src/SPIN/pair_spin_dipole_cut.h +++ b/src/SPIN/pair_spin_dipole_cut.h @@ -34,22 +34,22 @@ class PairSpinDipoleCut : public PairSpin { void settings(int, char **); void coeff(int, char **); double init_one(int, int); - void *extract(const char *, int &); - + void *extract(const char *, int &); + void compute(int, int); void compute_single_pair(int, double *); - void compute_dipolar(int, int, double *, double *, double *, + void compute_dipolar(int, int, double *, double *, double *, double *, double); - void compute_dipolar_mech(int, int, double *, double *, double *, + void compute_dipolar_mech(int, int, double *, double *, double *, double *, double); void write_restart(FILE *); void read_restart(FILE *); void write_restart_settings(FILE *); void read_restart_settings(FILE *); - - double cut_spin_long_global; // global long cutoff distance + + double cut_spin_long_global; // global long cutoff distance protected: double hbar; // reduced Planck's constant diff --git a/src/SPIN/pair_spin_dipole_long.cpp b/src/SPIN/pair_spin_dipole_long.cpp index 3805eb3291..356f73a809 100644 --- a/src/SPIN/pair_spin_dipole_long.cpp +++ b/src/SPIN/pair_spin_dipole_long.cpp @@ -81,9 +81,9 @@ void PairSpinDipoleLong::settings(int narg, char **arg) PairSpin::settings(narg,arg); cut_spin_long_global = force->numeric(FLERR,arg[0]); - + // reset cutoffs that have been explicitly set - + if (allocated) { int i,j; for (i = 1; i <= atom->ntypes; i++) { @@ -103,10 +103,10 @@ void PairSpinDipoleLong::settings(int narg, char **arg) void PairSpinDipoleLong::coeff(int narg, char **arg) { if (!allocated) allocate(); - + if (narg != 3) error->all(FLERR,"Incorrect args in pair_style command"); - + int ilo,ihi,jlo,jhi; force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); @@ -148,9 +148,9 @@ void PairSpinDipoleLong::init_style() double PairSpinDipoleLong::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - + cut_spin_long[j][i] = cut_spin_long[i][j]; - + return cut_spin_long_global; } @@ -183,7 +183,7 @@ void *PairSpinDipoleLong::extract(const char *str, int &dim) void PairSpinDipoleLong::compute(int eflag, int vflag) { - int i,j,ii,jj,inum,jnum,itype,jtype; + int i,j,ii,jj,inum,jnum,itype,jtype; double r,rinv,r2inv,rsq; double grij,expm2,t,erfc; double evdwl,ecoul; @@ -193,7 +193,7 @@ void PairSpinDipoleLong::compute(int eflag, int vflag) double fi[3],fmi[3]; double local_cut2; double pre1,pre2,pre3; - int *ilist,*jlist,*numneigh,**firstneigh; + int *ilist,*jlist,*numneigh,**firstneigh; evdwl = ecoul = 0.0; if (eflag || vflag) ev_setup(eflag,vflag); @@ -202,9 +202,9 @@ void PairSpinDipoleLong::compute(int eflag, int vflag) double **x = atom->x; double **f = atom->f; double **fm = atom->fm; - double **sp = atom->sp; - int *type = atom->type; - int nlocal = atom->nlocal; + double **sp = atom->sp; + int *type = atom->type; + int nlocal = atom->nlocal; int newton_pair = force->newton_pair; inum = list->inum; @@ -225,9 +225,9 @@ void PairSpinDipoleLong::compute(int eflag, int vflag) xi[1] = x[i][1]; xi[2] = x[i][2]; jlist = firstneigh[i]; - jnum = numneigh[i]; - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; + jnum = numneigh[i]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; spi[2] = sp[i][2]; spi[3] = sp[i][3]; itype = type[i]; @@ -237,17 +237,17 @@ void PairSpinDipoleLong::compute(int eflag, int vflag) j &= NEIGHMASK; jtype = type[j]; - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - spj[3] = sp[j][3]; + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; evdwl = 0.0; fi[0] = fi[1] = fi[2] = 0.0; fmi[0] = fmi[1] = fmi[2] = 0.0; bij[0] = bij[1] = bij[2] = bij[3] = 0.0; - + rij[0] = x[j][0] - xi[0]; rij[1] = x[j][1] - xi[1]; rij[2] = x[j][2] - xi[2]; @@ -279,22 +279,22 @@ void PairSpinDipoleLong::compute(int eflag, int vflag) // force accumulation - f[i][0] += fi[0]; - f[i][1] += fi[1]; + f[i][0] += fi[0]; + f[i][1] += fi[1]; f[i][2] += fi[2]; - fm[i][0] += fmi[0]; - fm[i][1] += fmi[1]; + fm[i][0] += fmi[0]; + fm[i][1] += fmi[1]; fm[i][2] += fmi[2]; if (newton_pair || j < nlocal) { - f[j][0] -= fi[0]; - f[j][1] -= fi[1]; + f[j][0] -= fi[0]; + f[j][1] -= fi[1]; f[j][2] -= fi[2]; } if (eflag) { if (rsq <= local_cut2) { - evdwl -= spi[0]*fmi[0] + spi[1]*fmi[1] + + evdwl -= spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]; evdwl *= hbar; } @@ -314,21 +314,21 @@ void PairSpinDipoleLong::compute(int eflag, int vflag) void PairSpinDipoleLong::compute_single_pair(int ii, double fmi[3]) { - int j,jj,jnum,itype,jtype,ntypes; + int j,jj,jnum,itype,jtype,ntypes; int k,locflag; - int *jlist,*numneigh,**firstneigh; + int *jlist,*numneigh,**firstneigh; double r,rinv,r2inv,rsq,grij,expm2,t,erfc; double local_cut2,pre1,pre2,pre3; double bij[4],xi[3],rij[3],eij[3],spi[4],spj[4]; - int *type = atom->type; + int *type = atom->type; double **x = atom->x; - double **sp = atom->sp; + double **sp = atom->sp; double **fm_long = atom->fm_long; numneigh = list->numneigh; firstneigh = list->firstneigh; - + // check if interaction applies to type of ii itype = type[ii]; @@ -362,16 +362,16 @@ void PairSpinDipoleLong::compute_single_pair(int ii, double fmi[3]) // computation of the exchange interaction // loop over neighbors of atom i - + xi[0] = x[ii][0]; xi[1] = x[ii][1]; xi[2] = x[ii][2]; - spi[0] = sp[ii][0]; - spi[1] = sp[ii][1]; + spi[0] = sp[ii][0]; + spi[1] = sp[ii][1]; spi[2] = sp[ii][2]; spi[3] = sp[ii][3]; jlist = firstneigh[ii]; - jnum = numneigh[ii]; + jnum = numneigh[ii]; //itype = type[i]; for (jj = 0; jj < jnum; jj++) { @@ -379,14 +379,14 @@ void PairSpinDipoleLong::compute_single_pair(int ii, double fmi[3]) j &= NEIGHMASK; jtype = type[j]; - spj[0] = sp[j][0]; - spj[1] = sp[j][1]; - spj[2] = sp[j][2]; - spj[3] = sp[j][3]; + spj[0] = sp[j][0]; + spj[1] = sp[j][1]; + spj[2] = sp[j][2]; + spj[3] = sp[j][3]; fmi[0] = fmi[1] = fmi[2] = 0.0; bij[0] = bij[1] = bij[2] = bij[3] = 0.0; - + rij[0] = x[j][0] - xi[0]; rij[1] = x[j][1] - xi[1]; rij[2] = x[j][2] - xi[2]; @@ -417,7 +417,7 @@ void PairSpinDipoleLong::compute_single_pair(int ii, double fmi[3]) } // adding the kspace components to fm - + fmi[0] += fm_long[ii][0]; fmi[1] += fm_long[ii][1]; fmi[2] += fm_long[ii][2]; @@ -428,7 +428,7 @@ void PairSpinDipoleLong::compute_single_pair(int ii, double fmi[3]) compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinDipoleLong::compute_long(int /* i */, int /* j */, double eij[3], +void PairSpinDipoleLong::compute_long(int /* i */, int /* j */, double eij[3], double bij[4], double fmi[3], double spi[4], double spj[4]) { double sjeij,pre; @@ -447,7 +447,7 @@ void PairSpinDipoleLong::compute_long(int /* i */, int /* j */, double eij[3], } /* ---------------------------------------------------------------------- - compute the mechanical force due to the dipolar interaction between + compute the mechanical force due to the dipolar interaction between atom i and atom j ------------------------------------------------------------------------- */ diff --git a/src/SPIN/pair_spin_dipole_long.h b/src/SPIN/pair_spin_dipole_long.h index 56fd4c7126..1ec30cdb93 100644 --- a/src/SPIN/pair_spin_dipole_long.h +++ b/src/SPIN/pair_spin_dipole_long.h @@ -35,22 +35,22 @@ class PairSpinDipoleLong : public PairSpin { void coeff(int, char **); void init_style(); double init_one(int, int); - void *extract(const char *, int &); - + void *extract(const char *, int &); + void compute(int, int); void compute_single_pair(int, double *); - void compute_long(int, int, double *, double *, double *, + void compute_long(int, int, double *, double *, double *, double *, double *); - void compute_long_mech(int, int, double *, double *, double *, + void compute_long_mech(int, int, double *, double *, double *, double *, double *); void write_restart(FILE *); void read_restart(FILE *); void write_restart_settings(FILE *); void read_restart_settings(FILE *); - - double cut_spin_long_global; // global long cutoff distance + + double cut_spin_long_global; // global long cutoff distance protected: double hbar; // reduced Planck's constant diff --git a/src/USER-CGDNA/pair_oxdna2_excv.cpp b/src/USER-CGDNA/pair_oxdna2_excv.cpp index d8a263676f..dd0f6c9d68 100644 --- a/src/USER-CGDNA/pair_oxdna2_excv.cpp +++ b/src/USER-CGDNA/pair_oxdna2_excv.cpp @@ -35,7 +35,7 @@ PairOxdna2Excv::~PairOxdna2Excv() /* ---------------------------------------------------------------------- compute vector COM-excluded volume interaction sites in oxDNA2 ------------------------------------------------------------------------- */ -void PairOxdna2Excv::compute_interaction_sites(double e1[3], double e2[3], +void PairOxdna2Excv::compute_interaction_sites(double e1[3], double e2[3], double /*e3*/[3], double rs[3], double rb[3]) { double d_cs_x=-0.34, d_cs_y=+0.3408, d_cb=+0.4; diff --git a/src/USER-CGDNA/pair_oxdna_coaxstk.cpp b/src/USER-CGDNA/pair_oxdna_coaxstk.cpp index f0777fcdbd..750c6c022d 100644 --- a/src/USER-CGDNA/pair_oxdna_coaxstk.cpp +++ b/src/USER-CGDNA/pair_oxdna_coaxstk.cpp @@ -59,7 +59,7 @@ PairOxdnaCoaxstk::~PairOxdnaCoaxstk() memory->destroy(cut_cxst_hi); memory->destroy(cut_cxst_lc); memory->destroy(cut_cxst_hc); - memory->destroy(cutsq_cxst_hc); + memory->destroy(cutsq_cxst_hc); memory->destroy(b_cxst_lo); memory->destroy(b_cxst_hi); diff --git a/src/USER-CGDNA/pair_oxdna_excv.cpp b/src/USER-CGDNA/pair_oxdna_excv.cpp index 8506f5e3d1..e8e2fad020 100644 --- a/src/USER-CGDNA/pair_oxdna_excv.cpp +++ b/src/USER-CGDNA/pair_oxdna_excv.cpp @@ -86,7 +86,7 @@ PairOxdnaExcv::~PairOxdnaExcv() /* ---------------------------------------------------------------------- compute vector COM-excluded volume interaction sites in oxDNA ------------------------------------------------------------------------- */ -void PairOxdnaExcv::compute_interaction_sites(double e1[3], double /*e2*/[3], +void PairOxdnaExcv::compute_interaction_sites(double e1[3], double /*e2*/[3], double /*e3*/[3], double rs[3], double rb[3]) { double d_cs=-0.4, d_cb=+0.4; diff --git a/src/USER-CGDNA/pair_oxdna_hbond.cpp b/src/USER-CGDNA/pair_oxdna_hbond.cpp index 9e4bb1c273..26042339ea 100644 --- a/src/USER-CGDNA/pair_oxdna_hbond.cpp +++ b/src/USER-CGDNA/pair_oxdna_hbond.cpp @@ -42,7 +42,7 @@ PairOxdnaHbond::PairOxdnaHbond(LAMMPS *lmp) : Pair(lmp) // sequence-specific base-pairing strength // A:0 C:1 G:2 T:3, 5'- [i][j] -3' - + alpha_hb[0][0] = 1.00000; alpha_hb[0][1] = 1.00000; alpha_hb[0][2] = 1.00000; diff --git a/src/USER-CGDNA/pair_oxdna_stk.cpp b/src/USER-CGDNA/pair_oxdna_stk.cpp index 9db554366b..4d1c4a7101 100644 --- a/src/USER-CGDNA/pair_oxdna_stk.cpp +++ b/src/USER-CGDNA/pair_oxdna_stk.cpp @@ -43,7 +43,7 @@ PairOxdnaStk::PairOxdnaStk(LAMMPS *lmp) : Pair(lmp) // sequence-specific stacking strength // A:0 C:1 G:2 T:3, 5'- [i][j] -3' - eta_st[0][0] = 1.11960; + eta_st[0][0] = 1.11960; eta_st[0][1] = 1.00852; eta_st[0][2] = 0.96950; eta_st[0][3] = 0.99632; @@ -121,7 +121,7 @@ PairOxdnaStk::~PairOxdnaStk() tally energy and virial into global and per-atom accumulators NOTE: Although this is a pair style interaction, the algorithm below - follows the virial incrementation of the bond style. This is because + follows the virial incrementation of the bond style. This is because the bond topology is used in the main compute loop. ------------------------------------------------------------------------- */ diff --git a/src/USER-MEAMC/meam_setup_done.cpp b/src/USER-MEAMC/meam_setup_done.cpp index 7000eac6ae..37bfce5873 100644 --- a/src/USER-MEAMC/meam_setup_done.cpp +++ b/src/USER-MEAMC/meam_setup_done.cpp @@ -454,7 +454,7 @@ MEAM::phi_meam(double r, int a, int b) F1 = embedding(this->A_meam[a], this->Ec_meam[a][a], rhobar1, dF); F2 = embedding(this->A_meam[b], this->Ec_meam[b][b], rhobar2, dF); - + // compute Rose function, I.16 Eu = erose(r, this->re_meam[a][b], this->alpha_meam[a][b], this->Ec_meam[a][b], this->repuls_meam[a][b], diff --git a/src/USER-MISC/compute_gyration_shape.cpp b/src/USER-MISC/compute_gyration_shape.cpp index 8c660cfb9e..aef5ef91a3 100644 --- a/src/USER-MISC/compute_gyration_shape.cpp +++ b/src/USER-MISC/compute_gyration_shape.cpp @@ -39,7 +39,7 @@ ComputeGyrationShape::ComputeGyrationShape(LAMMPS *lmp, int narg, char **arg) : extscalar = 0; extvector = 0; - // ID of compute gyration + // ID of compute gyration int n = strlen(arg[3]) + 1; id_gyration = new char[n]; strcpy(id_gyration,arg[3]); diff --git a/src/USER-MISC/compute_hma.cpp b/src/USER-MISC/compute_hma.cpp index 56103a42b0..f552126f4f 100644 --- a/src/USER-MISC/compute_hma.cpp +++ b/src/USER-MISC/compute_hma.cpp @@ -78,21 +78,21 @@ using namespace LAMMPS_NS; ComputeHMA::ComputeHMA(LAMMPS *lmp, int narg, char **arg) : Compute(lmp, narg, arg), id_temp(NULL), deltaR(NULL) { - if (narg < 4) error->all(FLERR,"Illegal compute hma command"); + if (narg < 4) error->all(FLERR,"Illegal compute hma command"); if (igroup) error->all(FLERR,"Compute hma must use group all"); - if (strcmp(arg[3],"NULL") == 0) {error->all(FLERR,"fix ID specifying the set temperature of canonical simulation is required");} + if (strcmp(arg[3],"NULL") == 0) {error->all(FLERR,"fix ID specifying the set temperature of canonical simulation is required");} else { - int n = strlen(arg[3]) + 1; - id_temp = new char[n]; - strcpy(id_temp,arg[3]); + int n = strlen(arg[3]) + 1; + id_temp = new char[n]; + strcpy(id_temp,arg[3]); } - - create_attribute = 1; - extscalar = 1; - timeflag = 1; - // (from compute displace/atom) create a new fix STORE style - // our new fix's id (id_fix)= compute-ID + COMPUTE_STORE + create_attribute = 1; + extscalar = 1; + timeflag = 1; + + // (from compute displace/atom) create a new fix STORE style + // our new fix's id (id_fix)= compute-ID + COMPUTE_STORE // our new fix's group = same as compute group int n = strlen(id) + strlen("_COMPUTE_STORE") + 1; @@ -100,30 +100,30 @@ ComputeHMA::ComputeHMA(LAMMPS *lmp, int narg, char **arg) : strcpy(id_fix,id); strcat(id_fix,"_COMPUTE_STORE"); - char **newarg = new char*[6]; + char **newarg = new char*[6]; newarg[0] = id_fix; newarg[1] = group->names[igroup]; - newarg[2] = (char *) "STORE"; + newarg[2] = (char *) "STORE"; newarg[3] = (char *) "peratom"; newarg[4] = (char *) "1"; newarg[5] = (char *) "3"; - modify->add_fix(6,newarg); - fix = (FixStore *) modify->fix[modify->nfix-1]; - - delete [] newarg; + modify->add_fix(6,newarg); + fix = (FixStore *) modify->fix[modify->nfix-1]; + + delete [] newarg; // calculate xu,yu,zu for fix store array // skip if reset from restart file - if (fix->restart_reset) fix->restart_reset = 0; + if (fix->restart_reset) fix->restart_reset = 0; else { - double **xoriginal = fix->astore; + double **xoriginal = fix->astore; double **x = atom->x; imageint *image = atom->image; int nlocal = atom->nlocal; for (int i = 0; i < nlocal; i++) - domain->unmap(x[i],image[i],xoriginal[i]); + domain->unmap(x[i],image[i],xoriginal[i]); } vector_flag = 1; @@ -175,7 +175,7 @@ ComputeHMA::ComputeHMA(LAMMPS *lmp, int narg, char **arg) : memory->create(vector, size_vector, "hma:vector"); if (computeU>-1 || computeCv>-1) { - peflag = 1; + peflag = 1; } if (computeP>-1) { pressflag = 1; @@ -209,9 +209,9 @@ void ComputeHMA::init() { } int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->pair = 0; - neighbor->requests[irequest]->compute = 1; - neighbor->requests[irequest]->occasional = 1; + neighbor->requests[irequest]->pair = 0; + neighbor->requests[irequest]->compute = 1; + neighbor->requests[irequest]->occasional = 1; } void ComputeHMA::init_list(int /* id */, NeighList *ptr) @@ -224,22 +224,22 @@ void ComputeHMA::setup() int dummy=0; int ifix = modify->find_fix(id_temp); if (ifix < 0) error->all(FLERR,"Could not find compute hma temperature ID"); - double * temperat = (double *) modify->fix[ifix]->extract("t_target",dummy); + double * temperat = (double *) modify->fix[ifix]->extract("t_target",dummy); if (temperat==NULL) error->all(FLERR,"Could not find compute hma temperature ID"); - finaltemp = * temperat; + finaltemp = * temperat; // set fix which stores original atom coords int ifix2 = modify->find_fix(id_fix); if (ifix2 < 0) error->all(FLERR,"Could not find hma store fix ID"); - fix = (FixStore *) modify->fix[ifix2]; + fix = (FixStore *) modify->fix[ifix2]; } /* ---------------------------------------------------------------------- */ void ComputeHMA::compute_vector() { - invoked_vector = update->ntimestep; + invoked_vector = update->ntimestep; // grow deltaR array if necessary if (comm_forward>0 && atom->nmax > nmax) { @@ -257,7 +257,7 @@ void ComputeHMA::compute_vector() int nlocal = atom->nlocal; double *h = domain->h; - double xprd = domain->xprd; + double xprd = domain->xprd; double yprd = domain->yprd; double zprd = domain->zprd; diff --git a/src/USER-MISC/compute_hma.h b/src/USER-MISC/compute_hma.h index 233e8bbe57..5fc1130c8b 100644 --- a/src/USER-MISC/compute_hma.h +++ b/src/USER-MISC/compute_hma.h @@ -64,4 +64,4 @@ class ComputeHMA : public Compute { #endif #endif - + diff --git a/src/USER-MISC/pair_cosine_squared.cpp b/src/USER-MISC/pair_cosine_squared.cpp index ffa8a6603c..7c0cb3372d 100644 --- a/src/USER-MISC/pair_cosine_squared.cpp +++ b/src/USER-MISC/pair_cosine_squared.cpp @@ -125,7 +125,7 @@ void PairCosineSquared::coeff(int narg, char **arg) { if (narg < 4 || narg > 6) error->all(FLERR, "Incorrect args for pair coefficients (too few or too many)"); - + if (!allocated) allocate(); @@ -459,7 +459,7 @@ double PairCosineSquared::single(int /* i */, int /* j */, int itype, int jtype, double &fforce) { double r, r2inv, r6inv, cosone, force, energy; - + r = sqrt(rsq); if (r <= sigma[itype][jtype]) { @@ -478,7 +478,7 @@ double PairCosineSquared::single(int /* i */, int /* j */, int itype, int jtype, } } else { cosone = cos(MY_PI*(r-sigma[itype][jtype]) / (2.0*w[itype][jtype])); - force = -(MY_PI*epsilon[itype][jtype] / (2.0*w[itype][jtype])) * + force = -(MY_PI*epsilon[itype][jtype] / (2.0*w[itype][jtype])) * sin(MY_PI*(r-sigma[itype][jtype]) / w[itype][jtype]) / r; energy = -epsilon[itype][jtype]*cosone*cosone; } diff --git a/src/USER-MISC/pair_extep.cpp b/src/USER-MISC/pair_extep.cpp index 8507fd49f6..f7670d30b5 100644 --- a/src/USER-MISC/pair_extep.cpp +++ b/src/USER-MISC/pair_extep.cpp @@ -757,7 +757,7 @@ void PairExTeP::read_file(char *file) // skip line if it is a leftover from the previous section, // which can be identified by having 3 elements (instead of 2) // as first words. - + if (isupper(words[0][0]) && isupper(words[1][0]) && isupper(words[2][0])) continue; diff --git a/src/USER-MISC/pair_ilp_graphene_hbn.cpp b/src/USER-MISC/pair_ilp_graphene_hbn.cpp index 9faa350468..e998abf005 100644 --- a/src/USER-MISC/pair_ilp_graphene_hbn.cpp +++ b/src/USER-MISC/pair_ilp_graphene_hbn.cpp @@ -442,7 +442,7 @@ void PairILPGrapheneHBN::compute(int eflag, int vflag) if (vflag_fdotr) virial_fdotr_compute(); } -/* ---------------------------------------------------------------------- +/* ---------------------------------------------------------------------- van der Waals forces and energy ------------------------------------------------------------------------- */ @@ -540,7 +540,7 @@ void PairILPGrapheneHBN::calc_FvdW(int eflag, int /* vflag */) } } -/* ---------------------------------------------------------------------- +/* ---------------------------------------------------------------------- Repulsive forces and energy ------------------------------------------------------------------------- */ diff --git a/src/USER-MISC/pair_kolmogorov_crespi_full.cpp b/src/USER-MISC/pair_kolmogorov_crespi_full.cpp index d0d8517550..eea0b1261c 100644 --- a/src/USER-MISC/pair_kolmogorov_crespi_full.cpp +++ b/src/USER-MISC/pair_kolmogorov_crespi_full.cpp @@ -444,7 +444,7 @@ void PairKolmogorovCrespiFull::compute(int eflag, int vflag) if (vflag_fdotr) virial_fdotr_compute(); } -/* ---------------------------------------------------------------------- +/* ---------------------------------------------------------------------- van der Waals forces and energy ------------------------------------------------------------------------- */ @@ -540,7 +540,7 @@ void PairKolmogorovCrespiFull::calc_FvdW(int eflag, int /* vflag */) } } -/* ---------------------------------------------------------------------- +/* ---------------------------------------------------------------------- Repulsive forces and energy ------------------------------------------------------------------------- */ @@ -790,7 +790,7 @@ void PairKolmogorovCrespiFull::calc_normal() memory->create(dnormal,3,3,3,nmax,"KolmogorovCrespiFull:dnormal"); } - inum = list->inum; + inum = list->inum; ilist = list->ilist; //Calculate normals for (ii = 0; ii < inum; ii++) { diff --git a/src/USER-MISC/pair_local_density.cpp b/src/USER-MISC/pair_local_density.cpp index 1e4ad3edf6..8ad9793f98 100644 --- a/src/USER-MISC/pair_local_density.cpp +++ b/src/USER-MISC/pair_local_density.cpp @@ -61,9 +61,9 @@ static const char cite_pair_local_density[] = PairLocalDensity::PairLocalDensity(LAMMPS *lmp) : Pair(lmp) { restartinfo = 0; - one_coeff = 1; + one_coeff = 1; single_enable = 1; - + // stuff read from tabulated file nLD = 0; nrho = 0; @@ -81,14 +81,14 @@ PairLocalDensity::PairLocalDensity(LAMMPS *lmp) : Pair(lmp) lowercutsq = NULL; frho = NULL; rho = NULL; - + // splined arrays frho_spline = NULL; - + // per-atom arrays nmax = 0; fp = NULL; - localrho = NULL; + localrho = NULL; // set comm size needed by this pair comm_forward = 1; @@ -114,10 +114,10 @@ PairLocalDensity::~PairLocalDensity() } memory->destroy(frho_spline); - - memory->destroy(rho_min); + + memory->destroy(rho_min); memory->destroy(rho_max); - memory->destroy(delta_rho); + memory->destroy(delta_rho); memory->destroy(c0); memory->destroy(c2); memory->destroy(c4); @@ -137,37 +137,37 @@ PairLocalDensity::~PairLocalDensity() void PairLocalDensity::compute(int eflag, int vflag) { - + int i,j,ii,jj,m,k,inum,jnum,itype,jtype; double xtmp,ytmp,ztmp,delx,dely,delz,rsq; double rsqinv, phi, uLD, dphi, evdwl,fpair; double p, *coeff; int *ilist,*jlist,*numneigh,**firstneigh; - phi = uLD = evdwl = fpair = rsqinv = 0.0; + phi = uLD = evdwl = fpair = rsqinv = 0.0; if (eflag || vflag) ev_setup(eflag,vflag); else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; /* localrho = LD at each atom fp = derivative of embedding energy at each atom for each LD potential - uLD = embedding energy of each atom due to each LD potential*/ - + uLD = embedding energy of each atom due to each LD potential*/ + // grow LD and fp arrays if necessary // need to be atom->nmax in length - + if (atom->nmax > nmax) { memory->destroy(localrho); memory->destroy(fp); - nmax = atom->nmax; + nmax = atom->nmax; memory->create(localrho, nLD, nmax, "pairLD:localrho"); memory->create(fp, nLD, nmax, "pairLD:fp"); } - double **x = atom->x; + double **x = atom->x; double **f = atom->f; - int *type = atom->type; - int nlocal = atom->nlocal; + int *type = atom->type; + int nlocal = atom->nlocal; int newton_pair = force->newton_pair; inum = list->inum; @@ -179,13 +179,13 @@ void PairLocalDensity::compute(int eflag, int vflag) if (newton_pair) { m = nlocal + atom->nghost; - for (k = 0; k < nLD; k++) { - for (i = 0; i < m; i++) { + for (k = 0; k < nLD; k++) { + for (i = 0; i < m; i++) { localrho[k][i] = 0.0; fp[k][i] = 0.0; } - } - } + } + } else { for (k = 0; k < nLD; k++){ for (i = 0; i < nlocal; i++) { @@ -196,7 +196,7 @@ void PairLocalDensity::compute(int eflag, int vflag) } // loop over neighs of central atoms and types of LDs - + for (ii = 0; ii < inum; ii++) { i = ilist[ii]; xtmp = x[i][0]; @@ -205,19 +205,19 @@ void PairLocalDensity::compute(int eflag, int vflag) itype = type[i]; jlist = firstneigh[i]; jnum = numneigh[i]; - + for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; j &= NEIGHMASK; - jtype = type[j]; + jtype = type[j]; // calculate distance-squared between i,j atom-types - + delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - + rsq = delx*delx + dely*dely + delz*delz; + // calculating LDs based on central and neigh filters for (k = 0; k < nLD; k++) { @@ -230,36 +230,36 @@ void PairLocalDensity::compute(int eflag, int vflag) else { phi = c0[k] + rsq * (c2[k] + rsq * (c4[k] + c6[k]*rsq)); } - localrho[k][i] += (phi * b[k][jtype]); - - /*checking for both i,j is necessary + localrho[k][i] += (phi * b[k][jtype]); + + /*checking for both i,j is necessary since a half neighbor list is processed.*/ - + if (newton_pair || jreverse_comm_pair(this); - // + // - for (ii = 0; ii < inum; ii++) { + for (ii = 0; ii < inum; ii++) { i = ilist[ii]; itype = type[i]; - uLD = 0.0; + uLD = 0.0; for (k = 0; k < nLD; k++) { - /*skip over this loop if the LD potential + /*skip over this loop if the LD potential is not intendend for central atomtype */ - if (!(a[k][itype])) continue; - + if (!(a[k][itype])) continue; + // linear extrapolation at rho_min and rho_max - + if (localrho[k][i] <= rho_min[k]) { coeff = frho_spline[k][0]; fp[k][i] = coeff[2]; @@ -284,14 +284,14 @@ void PairLocalDensity::compute(int eflag, int vflag) if (eflag) { if (eflag_global) eng_vdwl += uLD; - if (eflag_atom) eatom[i] += uLD; + if (eflag_atom) eatom[i] += uLD; } } // communicate LD and fp to all procs comm->forward_comm_pair(this); - + // compute forces on each atom // loop over neighbors of my atoms @@ -306,7 +306,7 @@ void PairLocalDensity::compute(int eflag, int vflag) jnum = numneigh[i]; for (jj = 0; jj < jnum; jj++) { - j = jlist[jj]; + j = jlist[jj]; j &= NEIGHMASK; jtype = type[j]; @@ -316,19 +316,19 @@ void PairLocalDensity::compute(int eflag, int vflag) dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; rsq = delx*delx + dely*dely + delz*delz; - - // calculate force between two atoms + + // calculate force between two atoms fpair = 0.0; if (rsq < cutforcesq) { // global cutoff check rsqinv = 1.0/rsq; for (k = 0; k < nLD; k++) { if (rsq >= lowercutsq[k] && rsq < uppercutsq[k]) { dphi = rsq * (2.0*c2[k] + rsq * (4.0*c4[k] + 6.0*c6[k]*rsq)); - fpair += -(a[k][itype]*b[k][jtype]*fp[k][i] + a[k][jtype]*b[k][itype]*fp[k][j]) * dphi; + fpair += -(a[k][itype]*b[k][jtype]*fp[k][i] + a[k][jtype]*b[k][itype]*fp[k][j]) * dphi; } - } - fpair *= rsqinv; - + } + fpair *= rsqinv; + f[i][0] += delx*fpair; f[i][1] += dely*fpair; f[i][2] += delz*fpair; @@ -337,19 +337,19 @@ void PairLocalDensity::compute(int eflag, int vflag) f[j][1] -= dely*fpair; f[j][2] -= delz*fpair; } - - /*eng_vdwl has already been completely built, + + /*eng_vdwl has already been completely built, so no need to add anything here*/ - + if (eflag) evdwl = 0.0; - + if (evflag) ev_tally(i,j,nlocal,newton_pair, evdwl,0.0,fpair,delx,dely,delz); } } } - + if (vflag_fdotr) virial_fdotr_compute(); } @@ -362,7 +362,7 @@ void PairLocalDensity::allocate() { allocated = 1; int n = atom->ntypes; - + memory->create(cutsq,n+1,n+1,"pair:cutsq"); memory->create(setflag,n+1,n+1,"pair:setflag"); @@ -430,7 +430,7 @@ void PairLocalDensity::init_style() // request half neighbor list array2spline(); - + // half neighbor request neighbor->request(this); } @@ -446,7 +446,7 @@ double PairLocalDensity::init_one(int /* i */, int /* j */) cutmax = 0.0; for (int k = 0; k < nLD; k++) cutmax = MAX(cutmax,uppercut[k]); - + cutforcesq = cutmax*cutmax; return cutmax; @@ -454,7 +454,7 @@ double PairLocalDensity::init_one(int /* i */, int /* j */) /*-------------------------------------------------------------------------- - pair_write functionality for this pair style that gives just a snap-shot + pair_write functionality for this pair style that gives just a snap-shot of the LD potential without doing an actual MD run ---------------------------------------------------------------------------*/ @@ -473,7 +473,7 @@ double PairLocalDensity::single(int /* i */, int /* j */, int itype, int jtype, for (k = 0; k < nLD; k++) { LD[k][1] = 0.0; // itype:- 1 LD[k][2] = 0.0; // jtype:- 2 - } + } rsqinv = 1.0/rsq; for (k = 0; k < nLD; k++) { @@ -487,13 +487,13 @@ double PairLocalDensity::single(int /* i */, int /* j */, int itype, int jtype, phi = c0[k] + rsq * (c2[k] + rsq * (c4[k] + c6[k]*rsq)); } LD[k][1] += (phi * b[k][jtype]); - LD[k][2] += (phi * b[k][itype]); + LD[k][2] += (phi * b[k][itype]); } for (k = 0; k < nLD; k++) { if (a[k][itype]) index = 1; if (a[k][jtype]) index = 2; - + if (LD[k][index] <= rho_min[k]) { coeff = frho_spline[k][0]; dFdrho = coeff[2]; @@ -545,43 +545,43 @@ void PairLocalDensity::array2spline() { } -/* ---------------------------------------------------------------------- - (one-dimensional) cubic spline interpolation sub-routine, - which determines the coeffs for a clamped cubic spline +/* ---------------------------------------------------------------------- + (one-dimensional) cubic spline interpolation sub-routine, + which determines the coeffs for a clamped cubic spline given tabulated data ------------------------------------------------------------------------*/ -void PairLocalDensity::interpolate_cbspl(int n, double delta, - double *f, double **spline) +void PairLocalDensity::interpolate_cbspl(int n, double delta, + double *f, double **spline) { /* inputs: n number of interpolating points - + f array containing function values to be interpolated; f[i] is the function value corresponding to x[i] ('x' refers to the independent var) - + delta difference in tabulated values of x - + outputs: (packaged as columns of the coeff matrix) coeff_b coeffs of linear terms coeff_c coeffs of quadratic terms coeff_d coeffs of cubic terms spline matrix that collects b,c,d - - + + other parameters: fpa derivative of function at x=a fpb derivative of function at x=b */ - + double *dl, *dd, *du; double *coeff_b, *coeff_c, *coeff_d; double fpa, fpb; int i; - + coeff_b = new double [n]; coeff_c = new double [n]; coeff_d = new double [n]; @@ -598,11 +598,11 @@ void PairLocalDensity::interpolate_cbspl(int n, double delta, // set slopes at beginning and end fpa = 0.; fpb = 0.; - + for ( i = 0; i < n-1; i++ ) { dl[i] = du[i] = delta; } - + dd[0] = 2.0 * delta; dd[n-1] = 2.0 * delta; coeff_c[0] = ( 3.0 / delta ) * ( f[1] - f[0] ) - 3.0 * fpa; @@ -612,20 +612,20 @@ void PairLocalDensity::interpolate_cbspl(int n, double delta, coeff_c[i+1] = ( 3.0 / delta ) * ( f[i+2] - f[i+1] ) - ( 3.0 / delta ) * ( f[i+1] - f[i] ); } - + // tridiagonal solver for ( i = 0; i < n-1; i++ ) { du[i] /= dd[i]; dd[i+1] -= dl[i]*du[i]; } - + coeff_c[0] /= dd[0]; for ( i = 1; i < n; i++ ) coeff_c[i] = ( coeff_c[i] - dl[i-1] * coeff_c[i-1] ) / dd[i]; - + for ( i = n-2; i >= 0; i-- ) coeff_c[i] -= coeff_c[i+1] * du[i]; - + for ( i = 0; i < n-1; i++ ) { coeff_d[i] = ( coeff_c[i+1] - coeff_c[i] ) / ( 3.0 * delta ); coeff_b[i] = ( f[i+1] - f[i] ) / delta - delta * ( coeff_c[i+1] + 2.0*coeff_c[i] ) / 3.0; @@ -648,7 +648,7 @@ void PairLocalDensity::interpolate_cbspl(int n, double delta, spline[i][1] = 2.0*spline[i][4]/delta; spline[i][0] = 3.0*spline[i][3]/delta; } - + delete [] coeff_b; delete [] coeff_c; delete [] coeff_d; @@ -662,7 +662,7 @@ void PairLocalDensity::interpolate_cbspl(int n, double delta, ------------------------------------------------------------------------- */ void PairLocalDensity::parse_file(char *filename) { - + int k, n; int me = comm->me; FILE *fptr; @@ -680,23 +680,23 @@ void PairLocalDensity::parse_file(char *filename) { } double *ftmp; // tmp var to extract the complete 2D frho array from file - + // broadcast number of LD potentials and number of (rho,frho) pairs if (me == 0) { - - // first 2 comment lines ignored + + // first 2 comment lines ignored utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); - + // extract number of potentials and number of (frho, rho) points - utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); + utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); sscanf(line, "%d %d", &nLD, &nrho); utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); } MPI_Bcast(&nLD,1,MPI_INT,0,world); MPI_Bcast(&nrho,1,MPI_INT,0,world); - + // setting up all arrays to be read from files and broadcasted memory->create(uppercut, nLD, "pairLD:uppercut"); memory->create(lowercut, nLD, "pairLD:lowercut"); @@ -706,14 +706,14 @@ void PairLocalDensity::parse_file(char *filename) { memory->create(c2, nLD, "pairLD:c2"); memory->create(c4, nLD, "pairLD:c4"); memory->create(c6, nLD, "pairLD:c6"); - memory->create(rho_min, nLD, "pairLD:rho_min"); + memory->create(rho_min, nLD, "pairLD:rho_min"); memory->create(rho_max, nLD, "pairLD:rho_max"); memory->create(delta_rho, nLD,"pairLD:delta_rho"); memory->create(ftmp, nrho*nLD, "pairLD:ftmp"); - - // setting up central and neighbor atom filters + + // setting up central and neighbor atom filters memory->create(a, nLD, atom->ntypes+1 , "pairLD:a"); - memory->create(b, nLD, atom->ntypes+1, "pairLD:b"); + memory->create(b, nLD, atom->ntypes+1, "pairLD:b"); if (me == 0) { for (n = 1; n <= atom->ntypes; n++){ for (k = 0; k < nLD; k++) { @@ -721,17 +721,17 @@ void PairLocalDensity::parse_file(char *filename) { b[k][n] = 0; } } - } - + } + // read file block by block - + if (me == 0) { for (k = 0; k < nLD; k++) { - - // parse upper and lower cut values + + // parse upper and lower cut values if (fgets(line,MAXLINE,fptr)==NULL) break; sscanf(line, "%lf %lf", &lowercut[k], &uppercut[k]); - + // parse and broadcast central atom filter utils::sfgets(FLERR,line, MAXLINE, fptr,filename,error); char *tmp = strtok(line, " /t/n/r/f"); @@ -739,27 +739,27 @@ void PairLocalDensity::parse_file(char *filename) { a[k][atoi(tmp)] = 1; tmp = strtok(NULL, " /t/n/r/f"); } - + // parse neighbor atom filter utils::sfgets(FLERR,line, MAXLINE, fptr,filename,error); tmp = strtok(line, " /t/n/r/f"); - while (tmp != NULL) { + while (tmp != NULL) { b[k][atoi(tmp)] = 1; tmp = strtok(NULL, " /t/n/r/f"); } - + // parse min, max and delta rho values utils::sfgets(FLERR,line, MAXLINE, fptr,filename,error); sscanf(line, "%lf %lf %lf", &rho_min[k], &rho_max[k], &delta_rho[k]); // recompute delta_rho from scratch for precision delta_rho[k] = (rho_max[k] - rho_min[k]) / (nrho - 1); - + // parse tabulated frho values from each line into temporary array - for (n = 0; n < nrho; n++) { + for (n = 0; n < nrho; n++) { utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); sscanf(line, "%lf", &ftmp[k*nrho + n]); } - + // ignore blank line at the end of every block utils::sfgets(FLERR,line,MAXLINE,fptr,filename,error); @@ -778,7 +778,7 @@ void PairLocalDensity::parse_file(char *filename) { } } - // Broadcast all parsed arrays + // Broadcast all parsed arrays MPI_Bcast(&lowercut[0], nLD, MPI_DOUBLE, 0, world); MPI_Bcast(&uppercut[0], nLD, MPI_DOUBLE, 0, world); MPI_Bcast(&lowercutsq[0], nLD, MPI_DOUBLE, 0, world); @@ -800,8 +800,8 @@ void PairLocalDensity::parse_file(char *filename) { // set up rho and frho arrays memory->create(rho, nLD, nrho, "pairLD:rho"); - memory->create(frho, nLD, nrho, "pairLD:frho"); - + memory->create(frho, nLD, nrho, "pairLD:frho"); + for (k = 0; k < nLD; k++) { for (n = 0; n < nrho; n++) { rho[k][n] = rho_min[k] + n*delta_rho[k]; @@ -812,7 +812,7 @@ void PairLocalDensity::parse_file(char *filename) { // delete temporary array memory->destroy(ftmp); } - + /* ---------------------------------------------------------------------- communication routines ------------------------------------------------------------------------- */ @@ -820,16 +820,16 @@ void PairLocalDensity::parse_file(char *filename) { int PairLocalDensity::pack_comm(int n, int *list, double *buf, int /* pbc_flag */, int * /* pbc */) { int i,j,k; - int m; + int m; m = 0; for (i = 0; i < n; i++) { - j = list[i]; + j = list[i]; for (k = 0; k < nLD; k++) { - buf[m++] = fp[k][j]; - } + buf[m++] = fp[k][j]; + } } - + return nLD; } @@ -838,14 +838,14 @@ int PairLocalDensity::pack_comm(int n, int *list, double *buf, void PairLocalDensity::unpack_comm(int n, int first, double *buf) { int i,k,m,last; - + m = 0; last = first + n; for (i = first; i < last; i++) { for (k = 0; k < nLD; k++) { fp[k][i] = buf[m++]; } - } + } } /* ---------------------------------------------------------------------- */ @@ -876,7 +876,7 @@ void PairLocalDensity::unpack_reverse_comm(int n, int *list, double *buf) { j = list[i]; for (k = 0; k < nLD; k++) { localrho[k][j] += buf[m++]; - } + } } } diff --git a/src/USER-MISC/pair_local_density.h b/src/USER-MISC/pair_local_density.h index 5e37376ece..e999352680 100644 --- a/src/USER-MISC/pair_local_density.h +++ b/src/USER-MISC/pair_local_density.h @@ -13,8 +13,8 @@ pair_LocalDensity written by: Tanmoy Sanyal and M. Scott Shell from UC Santa Barbara David Rosenberger: TU Darmstadt --------------------------------------------------------------------------*/ - +-------------------------------------------------------------------------*/ + #ifdef PAIR_CLASS @@ -40,7 +40,7 @@ class PairLocalDensity : public Pair { void init_style(); double init_one(int, int); double single(int, int, int, int, double, double, double, double &); - + virtual int pack_comm(int, int *, double *, int, int *); virtual void unpack_comm(int, int, double *); int pack_reverse_comm(int, int, double *); @@ -51,7 +51,7 @@ class PairLocalDensity : public Pair { protected: //------------------------------------------------------------------------ //This information is read from the tabulated input file - + int nLD, nrho; // number of LD types int **a, **b; // central and neigh atom filters double *uppercut, *lowercut; // upper and lower cutoffs @@ -59,25 +59,25 @@ class PairLocalDensity : public Pair { double *c0, *c2, *c4, *c6; // coeffs for indicator function double *rho_min, *rho_max, *delta_rho; // min, max & grid-size for LDs double **rho, **frho; // LD and LD function tables - + //------------------------------------------------------------------------ - + double ***frho_spline; // splined LD potentials double cutmax; // max cutoff for all elements double cutforcesq; // square of global upper cutoff - + int nmax; // max size of per-atom arrays double **localrho; // per-atom LD double **fp; // per-atom LD potential function derivative - + void allocate(); - + // read tabulated input file void parse_file(char *); - + // convert array to spline void array2spline(); - + // cubic spline interpolation void interpolate_cbspl(int, double, double *, double **); }; diff --git a/src/USER-MOLFILE/reader_molfile.cpp b/src/USER-MOLFILE/reader_molfile.cpp index 5cff56753b..292a451a87 100644 --- a/src/USER-MOLFILE/reader_molfile.cpp +++ b/src/USER-MOLFILE/reader_molfile.cpp @@ -282,7 +282,7 @@ bigint ReaderMolfile::read_header(double box[3][3], int &boxinfo, int &triclinic } // if no field info requested, just return - + if (!fieldinfo) return natoms; memory->create(fieldindex,nfield,"read_dump:fieldindex"); diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index fe266fba76..1495219124 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -259,7 +259,7 @@ void DynamicalMatrix::calculateMatrix() fprintf(screen," Atoms in group = " BIGINT_FORMAT "\n", gcount); fprintf(screen," Total dynamical matrix elements = " BIGINT_FORMAT "\n", (dynlen*dynlen) ); } - + // emit dynlen rows of dimalpha*dynlen*dimbeta elements update->nsteps = 0; diff --git a/src/USER-PLUMED/fix_plumed.cpp b/src/USER-PLUMED/fix_plumed.cpp index c75a48f9b4..b02de2af0d 100644 --- a/src/USER-PLUMED/fix_plumed.cpp +++ b/src/USER-PLUMED/fix_plumed.cpp @@ -411,7 +411,7 @@ void FixPlumed::post_force(int /* vflag */) // pass all pointers to plumed: p->cmd("setStep",&step); - int plumedStopCondition=0; + int plumedStopCondition=0; p->cmd("setStopFlag",&plumedStopCondition); p->cmd("setPositions",&atom->x[0][0]); p->cmd("setBox",&box[0][0]); diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index a44c7d5cbd..c8e097eb1c 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -154,7 +154,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity checks */ if (c == 2 && !lgflag) - control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); + control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); if (c < 9) { snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); diff --git a/src/USER-YAFF/pair_lj_switch3_coulgauss_long.cpp b/src/USER-YAFF/pair_lj_switch3_coulgauss_long.cpp index 77a25db7cc..022b93a0d2 100644 --- a/src/USER-YAFF/pair_lj_switch3_coulgauss_long.cpp +++ b/src/USER-YAFF/pair_lj_switch3_coulgauss_long.cpp @@ -133,7 +133,7 @@ void PairLJSwitch3CoulGaussLong::compute(int eflag, int vflag) if (rsq < cutsq[itype][jtype]) { r2inv = 1.0/rsq; - + if (rsq < cut_coulsq) { if (!ncoultablebits || rsq <= tabinnersq) { r = sqrt(rsq); @@ -202,7 +202,7 @@ void PairLJSwitch3CoulGaussLong::compute(int eflag, int vflag) if (r>cut_lj[itype][jtype]-truncw) { trx = (cut_lj[itype][jtype]-r)*truncwi; tr = trx*trx*(3.0-2.0*trx); - ftr = 6.0*trx*(1.0-trx)*r*truncwi; + ftr = 6.0*trx*(1.0-trx)*r*truncwi; forcelj = forcelj*tr + evdwl*ftr; evdwl *= tr; } @@ -683,7 +683,7 @@ double PairLJSwitch3CoulGaussLong::single(int i, int j, int itype, int jtype, if (r>cut_lj[itype][jtype]-truncw) { trx = (cut_lj[itype][jtype]-r)*truncwi; tr = trx*trx*(3.0-2.0*trx); - ftr = 6.0*trx*(1.0-trx)*r*truncwi; + ftr = 6.0*trx*(1.0-trx)*r*truncwi; forcelj = forcelj*tr + evdwl*ftr; evdwl *= tr; } diff --git a/src/USER-YAFF/pair_mm3_switch3_coulgauss_long.cpp b/src/USER-YAFF/pair_mm3_switch3_coulgauss_long.cpp index 3a4a49c880..6b0466cd6d 100644 --- a/src/USER-YAFF/pair_mm3_switch3_coulgauss_long.cpp +++ b/src/USER-YAFF/pair_mm3_switch3_coulgauss_long.cpp @@ -133,7 +133,7 @@ void PairMM3Switch3CoulGaussLong::compute(int eflag, int vflag) if (rsq < cutsq[itype][jtype]) { r2inv = 1.0/rsq; - + if (rsq < cut_coulsq) { if (!ncoultablebits || rsq <= tabinnersq) { r = sqrt(rsq); @@ -204,7 +204,7 @@ void PairMM3Switch3CoulGaussLong::compute(int eflag, int vflag) if (r>cut_lj[itype][jtype]-truncw) { trx = (cut_lj[itype][jtype]-r)*truncwi; tr = trx*trx*(3.0-2.0*trx); - ftr = 6.0*trx*(1.0-trx)*r*truncwi; + ftr = 6.0*trx*(1.0-trx)*r*truncwi; forcelj = forcelj*tr + evdwl*ftr; evdwl *= tr; } @@ -683,7 +683,7 @@ double PairMM3Switch3CoulGaussLong::single(int i, int j, int itype, int jtype, if (r>cut_lj[itype][jtype]-truncw) { trx = (cut_lj[itype][jtype]-r)*truncwi; tr = trx*trx*(3.0-2.0*trx); - ftr = 6.0*trx*(1.0-trx)*r*truncwi; + ftr = 6.0*trx*(1.0-trx)*r*truncwi; forcelj = forcelj*tr + evdwl*ftr; evdwl *= tr; } diff --git a/src/comm.cpp b/src/comm.cpp index fa6790e0ec..9a577c0e4f 100644 --- a/src/comm.cpp +++ b/src/comm.cpp @@ -673,7 +673,7 @@ double Comm::get_comm_cutoff() // cutoff was given and no pair style present. Otherwise print a // warning, if the estimated bond based cutoff is larger than what // is currently used. - + if (!force->pair && (cutghostuser == 0.0)) { maxcommcutoff = MAX(maxcommcutoff,maxbondcutoff); } else { diff --git a/src/compute_bond_local.cpp b/src/compute_bond_local.cpp index e14f188e62..010e8db627 100644 --- a/src/compute_bond_local.cpp +++ b/src/compute_bond_local.cpp @@ -130,7 +130,7 @@ ComputeBondLocal::ComputeBondLocal(LAMMPS *lmp, int narg, char **arg) : singleflag = 0; velflag = 0; for (int i = 0; i < nvalues; i++) { - if (bstyle[i] == ENGPOT || bstyle[i] == FORCE || bstyle[i] == FX || + if (bstyle[i] == ENGPOT || bstyle[i] == FORCE || bstyle[i] == FX || bstyle[i] == FY || bstyle[i] == FZ) singleflag = 1; if (bstyle[i] == VELVIB || bstyle[i] == OMEGA || bstyle[i] == ENGTRANS || bstyle[i] == ENGVIB || bstyle[i] == ENGROT) velflag = 1; diff --git a/src/compute_orientorder_atom.cpp b/src/compute_orientorder_atom.cpp index 0a78356127..dcb104fc3a 100644 --- a/src/compute_orientorder_atom.cpp +++ b/src/compute_orientorder_atom.cpp @@ -493,7 +493,7 @@ void ComputeOrientOrderAtom::calc_boop(double **rlist, } // calculate Q_l - // NOTE: optional W_l_hat and components of Q_qlcomp use these stored Q_l values + // NOTE: optional W_l_hat and components of Q_qlcomp use these stored Q_l values int jj = 0; for (int il = 0; il < nqlist; il++) { @@ -505,7 +505,7 @@ void ComputeOrientOrderAtom::calc_boop(double **rlist, qn[jj++] = qnormfac * sqrt(qm_sum); } - // TODO: + // TODO: // 1. [done]Need to allocate extra memory in qnarray[] for this option // 2. [done]Need to add keyword option // 3. [done]Need to caclulate Clebsch-Gordan/Wigner 3j coefficients @@ -673,7 +673,7 @@ void ComputeOrientOrderAtom::init_clebsch_gordan() for(int m2 = MAX(0,l-m1); m2 < MIN(2*l+1,3*l-m1+1); m2++) { bb2 = m2 - l; m = aa2 + bb2 + l; - + sum = 0.0; for (int z = MAX(0, MAX(-aa2, bb2)); z <= MIN(l, MIN(l - aa2, l + bb2)); z++) { @@ -686,7 +686,7 @@ void ComputeOrientOrderAtom::init_clebsch_gordan() factorial(aa2 + z) * factorial(-bb2 + z)); } - + cc2 = m - l; sfaccg = sqrt(factorial(l + aa2) * factorial(l - aa2) * @@ -695,7 +695,7 @@ void ComputeOrientOrderAtom::init_clebsch_gordan() factorial(l + cc2) * factorial(l - cc2) * (2*l + 1)); - + sfac1 = factorial(3*l + 1); sfac2 = factorial(l); dcg = sqrt(sfac2*sfac2*sfac2 / sfac1); diff --git a/src/fix_neigh_history.cpp b/src/fix_neigh_history.cpp index 673e2b1c06..86865ba316 100644 --- a/src/fix_neigh_history.cpp +++ b/src/fix_neigh_history.cpp @@ -407,7 +407,7 @@ void FixNeighHistory::pre_exchange_newton() m = npartner[j]++; partner[j][m] = tag[i]; jvalues = &valuepartner[j][dnum*m]; - if (pair->nondefault_history_transfer) + if (pair->nondefault_history_transfer) pair->transfer_history(onevalues,jvalues); else for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; } @@ -521,7 +521,7 @@ void FixNeighHistory::pre_exchange_no_newton() m = npartner[j]++; partner[j][m] = tag[i]; jvalues = &valuepartner[j][dnum*m]; - if (pair->nondefault_history_transfer) + if (pair->nondefault_history_transfer) pair->transfer_history(onevalues, jvalues); else for (n = 0; n < dnum; n++) jvalues[n] = -onevalues[n]; } diff --git a/src/input.h b/src/input.h index 4b274c17a9..b4df0f0160 100644 --- a/src/input.h +++ b/src/input.h @@ -39,7 +39,7 @@ class Input : protected Pointers { // substitute for variables in a string int expand_args(int, char **, int, char **&); // expand args due to wildcard void write_echo(const char *); // send text to active echo file pointers - + protected: char *command; // ptr to current command int echo_screen; // 0 = no, 1 = yes diff --git a/src/lammps.cpp b/src/lammps.cpp index b3f420b03d..a2d405855d 100644 --- a/src/lammps.cpp +++ b/src/lammps.cpp @@ -1013,7 +1013,7 @@ void _noopt LAMMPS::init_pkg_lists() #undef REGION_CLASS } -bool LAMMPS::is_installed_pkg(const char *pkg) +bool LAMMPS::is_installed_pkg(const char *pkg) { for (int i=0; installed_packages[i] != NULL; ++i) if (strcmp(installed_packages[i],pkg) == 0) return true; diff --git a/src/min.cpp b/src/min.cpp index 5721d5ab3e..3b60f2c2e6 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -898,7 +898,7 @@ double Min::total_torque() MPI_Allreduce(&ftotsqone,&ftotsqall,1,MPI_DOUBLE,MPI_SUM,world); // multiply it by hbar so that units are in eV - + return sqrt(ftotsqall) * hbar; } diff --git a/src/min.h b/src/min.h index 6f3e10d048..874c7b773d 100644 --- a/src/min.h +++ b/src/min.h @@ -47,8 +47,8 @@ class Min : protected Pointers { // methods for spin minimizers double total_torque(); - double inf_torque(); - double max_torque(); + double inf_torque(); + double max_torque(); virtual void init_style() {} virtual void setup_style() = 0; @@ -65,7 +65,7 @@ class Min : protected Pointers { int external_force_clear; // clear forces locally or externally double dmax; // max dist to move any atom in one step - int linestyle; // 0 = backtrack, 1 = quadratic, 2 = forcezero + int linestyle; // 0 = backtrack, 1 = quadratic, 2 = forcezero // 3 = spin_cubic, 4 = spin_none int normstyle; // TWO, MAX or INF flag for force norm evaluation diff --git a/src/min_cg.cpp b/src/min_cg.cpp index 7b7046ea00..c2c9c1318e 100644 --- a/src/min_cg.cpp +++ b/src/min_cg.cpp @@ -91,7 +91,7 @@ int MinCG::iterate(int maxiter) dot[0] += fvec[i]*fvec[i]; dot[1] += fvec[i]*g[i]; } - + if (nextra_atom) for (m = 0; m < nextra_atom; m++) { fatom = fextra_atom[m]; @@ -119,7 +119,7 @@ int MinCG::iterate(int maxiter) if (fmax < update->ftol*update->ftol) return FTOL; } else if (normstyle == TWO) { // Euclidean force 2-norm if (dotall[0] < update->ftol*update->ftol) return FTOL; - } else error->all(FLERR,"Illegal min_modify command"); + } else error->all(FLERR,"Illegal min_modify command"); // update new search direction h from new f = -Grad(x) and old g // this is Polak-Ribieri formulation diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 2c77a13258..eceb34c437 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -1941,7 +1941,7 @@ int Neighbor::decide() conservative shrink procedure: compute distance each of 8 corners of box has moved since last reneighbor reduce skin distance by sum of 2 largest of the 8 values - if reduced skin distance is negative, set to zero + if reduced skin distance is negative, set to zero new trigger = 1/2 of reduced skin distance for orthogonal box, only need 2 lo/hi corners for triclinic, need all 8 corners since deformations can displace all 8 @@ -1963,7 +1963,7 @@ int Neighbor::check_distance() delz = bboxhi[2] - boxhi_hold[2]; delta2 = sqrt(delx*delx + dely*dely + delz*delz); delta = 0.5 * (skin - (delta1+delta2)); - if (delta < 0.0) delta = 0.0; + if (delta < 0.0) delta = 0.0; deltasq = delta*delta; } else { domain->box_corners(); @@ -1977,7 +1977,7 @@ int Neighbor::check_distance() else if (delta > delta2) delta2 = delta; } delta = 0.5 * (skin - (delta1+delta2)); - if (delta < 0.0) delta = 0.0; + if (delta < 0.0) delta = 0.0; deltasq = delta*delta; } } else deltasq = triggersq; diff --git a/src/read_data.cpp b/src/read_data.cpp index 1208ab4b43..d558b87633 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -2151,7 +2151,7 @@ void ReadData::parse_coeffs(char *line, const char *addstr, // to avoid segfaults on empty lines if (narg == 0) return; - + if (noffset) { int value = force->inumeric(FLERR,arg[0]); sprintf(argoffset1,"%d",value+offset); diff --git a/src/read_dump.cpp b/src/read_dump.cpp index 7316a2f5cd..dd9395c092 100644 --- a/src/read_dump.cpp +++ b/src/read_dump.cpp @@ -503,7 +503,7 @@ void ReadDump::header(int fieldinfo) yhi = box[1][1]; zlo = box[2][0]; zhi = box[2][1]; - + if (triclinic_snap) { xy = box[0][2]; xz = box[1][2]; diff --git a/src/reader_native.cpp b/src/reader_native.cpp index a4b188be5f..da2c97bbe5 100644 --- a/src/reader_native.cpp +++ b/src/reader_native.cpp @@ -113,7 +113,7 @@ void ReaderNative::skip() only called by proc 0 ------------------------------------------------------------------------- */ -bigint ReaderNative::read_header(double box[3][3], int &boxinfo, int &triclinic, +bigint ReaderNative::read_header(double box[3][3], int &boxinfo, int &triclinic, int fieldinfo, int nfield, int *fieldtype, char **fieldlabel, int scaleflag, int wrapflag, int &fieldflag, From 1074884f741c20ac7b5c5b1459bbc4dbfba18ea3 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 4 Nov 2019 09:04:43 -0700 Subject: [PATCH 386/418] Commit JT 110419 - removed fmax uninitialized variable from min_cg.cpp - removed tabs from comments - initialized fdotf variables --- src/SPIN/min_spin.cpp | 6 +++--- src/SPIN/min_spin_cg.cpp | 6 +++--- src/SPIN/min_spin_lbfgs.cpp | 6 +++--- src/min_cg.cpp | 21 +++++++++------------ src/min_fire.cpp | 7 ++++--- src/min_quickmin.cpp | 7 ++++--- src/min_sd.cpp | 13 ++++++++----- 7 files changed, 34 insertions(+), 32 deletions(-) diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp index 7315aca056..e39eb18744 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -165,9 +165,9 @@ int MinSpin::iterate(int maxiter) fmdotfm = fmsq = 0.0; if (update->ftol > 0.0) { - if (normstyle == MAX) fmsq = max_torque(); // max torque norm - else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm - else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm + if (normstyle == MAX) fmsq = max_torque(); // max torque norm + else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm + else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm else error->all(FLERR,"Illegal min_modify command"); fmdotfm = fmsq*fmsq; if (update->multireplica == 0) { diff --git a/src/SPIN/min_spin_cg.cpp b/src/SPIN/min_spin_cg.cpp index 95bbcf437b..d8238c9aee 100644 --- a/src/SPIN/min_spin_cg.cpp +++ b/src/SPIN/min_spin_cg.cpp @@ -270,9 +270,9 @@ int MinSpinCG::iterate(int maxiter) fmdotfm = fmsq = 0.0; if (update->ftol > 0.0) { - if (normstyle == MAX) fmsq = max_torque(); // max torque norm - else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm - else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm + if (normstyle == MAX) fmsq = max_torque(); // max torque norm + else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm + else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm else error->all(FLERR,"Illegal min_modify command"); fmdotfm = fmsq*fmsq; if (update->multireplica == 0) { diff --git a/src/SPIN/min_spin_lbfgs.cpp b/src/SPIN/min_spin_lbfgs.cpp index f86bdd5d48..2c7e658419 100644 --- a/src/SPIN/min_spin_lbfgs.cpp +++ b/src/SPIN/min_spin_lbfgs.cpp @@ -285,9 +285,9 @@ int MinSpinLBFGS::iterate(int maxiter) fmdotfm = fmsq = 0.0; if (update->ftol > 0.0) { - if (normstyle == MAX) fmsq = max_torque(); // max torque norm - else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm - else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm + if (normstyle == MAX) fmsq = max_torque(); // max torque norm + else if (normstyle == INF) fmsq = inf_torque(); // inf torque norm + else if (normstyle == TWO) fmsq = total_torque(); // Euclidean torque 2-norm else error->all(FLERR,"Illegal min_modify command"); fmdotfm = fmsq*fmsq; if (update->multireplica == 0) { diff --git a/src/min_cg.cpp b/src/min_cg.cpp index 80dde25f51..4cf53f08bc 100644 --- a/src/min_cg.cpp +++ b/src/min_cg.cpp @@ -36,7 +36,7 @@ MinCG::MinCG(LAMMPS *lmp) : MinLineSearch(lmp) {} int MinCG::iterate(int maxiter) { int i,m,n,fail,ntimestep; - double beta,gg,dot[2],dotall[2],fmax; + double beta,gg,dot[2],dotall[2],fdotf; double *fatom,*gatom,*hatom; // nlimit = max # of CG iterations before restarting @@ -100,7 +100,6 @@ int MinCG::iterate(int maxiter) for (i = 0; i < n; i++) { dot[0] += fatom[i]*fatom[i]; dot[1] += fatom[i]*gatom[i]; - fmax = MAX(fmax,fatom[i]*fatom[i]); } } MPI_Allreduce(dot,dotall,2,MPI_DOUBLE,MPI_SUM,world); @@ -110,16 +109,14 @@ int MinCG::iterate(int maxiter) dotall[1] += fextra[i]*gextra[i]; } - fmax = 0.0; - if (normstyle == MAX) { // max force norm - fmax = fnorm_max(); - if (fmax < update->ftol*update->ftol) return FTOL; - } else if (normstyle == INF) { // infinite force norm - fmax = fnorm_inf(); - if (fmax < update->ftol*update->ftol) return FTOL; - } else if (normstyle == TWO) { // Euclidean force 2-norm - if (dotall[0] < update->ftol*update->ftol) return FTOL; - } else error->all(FLERR,"Illegal min_modify command"); + fdotf = 0.0; + if (update->ftol > 0.0) { + if (normstyle == MAX) fdotf = fnorm_max(); // max force norm + else if (normstyle == INF) fdotf = fnorm_inf(); // infinite force norm + else if (normstyle == TWO) fdotf = fnorm_sqr(); // Euclidean force 2-norm + else error->all(FLERR,"Illegal min_modify command"); + if (fdotf < update->ftol*update->ftol) return FTOL; + } // update new search direction h from new f = -Grad(x) and old g // this is Polak-Ribieri formulation diff --git a/src/min_fire.cpp b/src/min_fire.cpp index b4b0f14534..ca37e410b8 100644 --- a/src/min_fire.cpp +++ b/src/min_fire.cpp @@ -250,10 +250,11 @@ int MinFire::iterate(int maxiter) // force tolerance criterion // sync across replicas if running multi-replica minimization + fdotf = 0.0; if (update->ftol > 0.0) { - if (normstyle == MAX) fdotf = fnorm_max(); // max force norm - else if (normstyle == INF) fdotf = fnorm_inf(); // inf force norm - else if (normstyle == TWO) fdotf = fnorm_sqr(); // Euclidean force 2-norm + if (normstyle == MAX) fdotf = fnorm_max(); // max force norm + else if (normstyle == INF) fdotf = fnorm_inf(); // inf force norm + else if (normstyle == TWO) fdotf = fnorm_sqr(); // Euclidean force 2-norm else error->all(FLERR,"Illegal min_modify command"); if (update->multireplica == 0) { if (fdotf < update->ftol*update->ftol) return FTOL; diff --git a/src/min_quickmin.cpp b/src/min_quickmin.cpp index 5f3728153a..5e7643bf3b 100644 --- a/src/min_quickmin.cpp +++ b/src/min_quickmin.cpp @@ -215,10 +215,11 @@ int MinQuickMin::iterate(int maxiter) // force tolerance criterion // sync across replicas if running multi-replica minimization + fdotf = 0.0; if (update->ftol > 0.0) { - if (normstyle == MAX) fdotf = fnorm_max(); // max force norm - else if (normstyle == INF) fdotf = fnorm_inf(); // inf force norm - else if (normstyle == TWO) fdotf = fnorm_sqr(); // Euclidean force 2-norm + if (normstyle == MAX) fdotf = fnorm_max(); // max force norm + else if (normstyle == INF) fdotf = fnorm_inf(); // inf force norm + else if (normstyle == TWO) fdotf = fnorm_sqr(); // Euclidean force 2-norm else error->all(FLERR,"Illegal min_modify command"); if (update->multireplica == 0) { if (fdotf < update->ftol*update->ftol) return FTOL; diff --git a/src/min_sd.cpp b/src/min_sd.cpp index 627a3b3cf3..d973ec1c82 100644 --- a/src/min_sd.cpp +++ b/src/min_sd.cpp @@ -78,11 +78,14 @@ int MinSD::iterate(int maxiter) // force tolerance criterion - if (normstyle == MAX) fdotf = fnorm_max(); // max force norm - else if (normstyle == INF) fdotf = fnorm_inf(); // infinite force norm - else if (normstyle == TWO) fdotf = fnorm_sqr(); // Euclidean force 2-norm - else error->all(FLERR,"Illegal min_modify command"); - if (fdotf < update->ftol*update->ftol) return FTOL; + fdotf = 0.0; + if (update->ftol > 0.0) { + if (normstyle == MAX) fdotf = fnorm_max(); // max force norm + else if (normstyle == INF) fdotf = fnorm_inf(); // infinite force norm + else if (normstyle == TWO) fdotf = fnorm_sqr(); // Euclidean force 2-norm + else error->all(FLERR,"Illegal min_modify command"); + if (fdotf < update->ftol*update->ftol) return FTOL; + } // set new search direction h to f = -Grad(x) From 7ec1dccbe0d9a5f3b6339d1d8c08c34471a6e123 Mon Sep 17 00:00:00 2001 From: marian-code Date: Tue, 5 Nov 2019 14:57:44 +0100 Subject: [PATCH 387/418] wrong cmake option for QUIP QUIP cmake option for specifying library path should be QUIP_LIBRARY not QUIP_LIBRARIES --- doc/rst/Build_extras.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/rst/Build_extras.rst b/doc/rst/Build_extras.rst index 1b5fa1672f..49e3d5c801 100644 --- a/doc/rst/Build_extras.rst +++ b/doc/rst/Build_extras.rst @@ -1254,7 +1254,7 @@ lib/quip/README file for details on how to do this. .. parsed-literal:: - -D QUIP_LIBRARIES=path # path to libquip.a (only needed if a custom location) + -D QUIP_LIBRARY=path # path to libquip.a (only needed if a custom location) CMake will not download and build the QUIP library. But once you have done that, a CMake build of LAMMPS with "-D PKG\_USER-QUIP=yes" should From ae4764e61481aadeb54d2a92a53833dfb8c963a3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 5 Nov 2019 11:03:25 -0500 Subject: [PATCH 388/418] address pair match issue with multiple hybrid substyles in exclusion settings --- src/neighbor.cpp | 30 +++++++++++++++++++++++++++--- src/pair_hybrid.h | 1 + 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 2c77a13258..05259c86e0 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -34,6 +34,7 @@ #include "comm.h" #include "force.h" #include "pair.h" +#include "pair_hybrid.h" #include "domain.h" #include "group.h" #include "modify.h" @@ -374,9 +375,32 @@ void Neighbor::init() special_flag[3] = 1; else special_flag[3] = 2; - if (force->kspace || force->pair_match("coul/wolf",0) || - force->pair_match("coul/dsf",0) || force->pair_match("thole",0)) - special_flag[1] = special_flag[2] = special_flag[3] = 2; + // We cannot remove special neighbors with kspace or kspace-like pair styles + // as the exclusion needs to remove the full coulomb and not the damped interaction. + // Special treatment is required for hybrid pair styles since Force::pair_match() + // will only return a non-NULL pointer if there is only one substyle of the kind. + + if (force->kspace) { + special_flag[1] = special_flag[2] = special_flag[3] = 2; + } else { + PairHybrid *ph = reinterpret_cast(force->pair_match("^hybrid",0)); + if (ph) { + int flag=0; + for (int isub=0; isub < ph->nstyles; ++isub) { + if (force->pair_match("coul/wolf",0,isub) + || force->pair_match("coul/dsf",0,isub) + || force->pair_match("thole",0,isub)) + ++flag; + } + if (flag) + special_flag[1] = special_flag[2] = special_flag[3] = 2; + } else { + if (force->pair_match("coul/wolf",0) + || force->pair_match("coul/dsf",0) + || force->pair_match("thole",0)) + special_flag[1] = special_flag[2] = special_flag[3] = 2; + } + } // maxwt = max multiplicative factor on atom indices stored in neigh list diff --git a/src/pair_hybrid.h b/src/pair_hybrid.h index 61e961ddcb..7717d1fd51 100644 --- a/src/pair_hybrid.h +++ b/src/pair_hybrid.h @@ -29,6 +29,7 @@ class PairHybrid : public Pair { friend class FixIntel; friend class FixOMP; friend class Force; + friend class Neighbor; friend class Respa; friend class Info; friend class PairDeprecated; From 74dade3ccb388d36cf10e416a0cc6e6d9070e9ea Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Tue, 5 Nov 2019 14:01:48 -0500 Subject: [PATCH 389/418] Change doc folder src -> txt, rst -> src --- doc/Makefile | 25 +++++++++--------- doc/{rst => src}/.gitignore | 0 doc/{rst => src}/Build.rst | 0 doc/{rst => src}/Build_basics.rst | 0 doc/{rst => src}/Build_cmake.rst | 0 doc/{rst => src}/Build_development.rst | 0 doc/{rst => src}/Build_extras.rst | 0 doc/{rst => src}/Build_link.rst | 0 doc/{rst => src}/Build_make.rst | 0 doc/{rst => src}/Build_package.rst | 0 doc/{rst => src}/Build_settings.rst | 0 doc/{rst => src}/Build_windows.rst | 0 doc/{rst => src}/Commands.rst | 0 doc/{rst => src}/Commands_all.rst | 0 doc/{rst => src}/Commands_bond.rst | 0 doc/{rst => src}/Commands_category.rst | 0 doc/{rst => src}/Commands_compute.rst | 0 doc/{rst => src}/Commands_fix.rst | 0 doc/{rst => src}/Commands_input.rst | 0 doc/{rst => src}/Commands_kspace.rst | 0 doc/{rst => src}/Commands_pair.rst | 0 doc/{rst => src}/Commands_parse.rst | 0 doc/{rst => src}/Commands_removed.rst | 0 doc/{rst => src}/Commands_structure.rst | 0 doc/{rst => src}/Errors.rst | 0 doc/{rst => src}/Errors_bugs.rst | 0 doc/{rst => src}/Errors_common.rst | 0 doc/{rst => src}/Errors_messages.rst | 0 doc/{rst => src}/Errors_warnings.rst | 0 doc/{rst => src}/Examples.rst | 0 doc/{rst => src}/Howto.rst | 0 doc/{rst => src}/Howto_2d.rst | 0 doc/{rst => src}/Howto_barostat.rst | 0 doc/{rst => src}/Howto_bash.rst | 0 doc/{rst => src}/Howto_bioFF.rst | 0 doc/{rst => src}/Howto_body.rst | 0 doc/{rst => src}/Howto_chunk.rst | 0 doc/{rst => src}/Howto_client_server.rst | 0 doc/{rst => src}/Howto_coreshell.rst | 0 doc/{rst => src}/Howto_couple.rst | 0 doc/{rst => src}/Howto_diffusion.rst | 0 doc/{rst => src}/Howto_dispersion.rst | 0 doc/{rst => src}/Howto_drude.rst | 0 doc/{rst => src}/Howto_drude2.rst | 0 doc/{rst => src}/Howto_elastic.rst | 0 doc/{rst => src}/Howto_github.rst | 0 doc/{rst => src}/Howto_granular.rst | 0 doc/{rst => src}/Howto_kappa.rst | 0 doc/{rst => src}/Howto_library.rst | 0 doc/{rst => src}/Howto_manifold.rst | 0 doc/{rst => src}/Howto_multiple.rst | 0 doc/{rst => src}/Howto_nemd.rst | 0 doc/{rst => src}/Howto_output.rst | 0 doc/{rst => src}/Howto_polarizable.rst | 0 doc/{rst => src}/Howto_pylammps.rst | 0 doc/{rst => src}/Howto_replica.rst | 0 doc/{rst => src}/Howto_restart.rst | 0 doc/{rst => src}/Howto_spc.rst | 0 doc/{rst => src}/Howto_spherical.rst | 0 doc/{rst => src}/Howto_spins.rst | 0 doc/{rst => src}/Howto_temperature.rst | 0 doc/{rst => src}/Howto_thermostat.rst | 0 doc/{rst => src}/Howto_tip3p.rst | 0 doc/{rst => src}/Howto_tip4p.rst | 0 doc/{rst => src}/Howto_triclinic.rst | 0 doc/{rst => src}/Howto_viscosity.rst | 0 doc/{rst => src}/Howto_viz.rst | 0 doc/{rst => src}/Howto_walls.rst | 0 doc/{rst => src}/Install.rst | 0 doc/{rst => src}/Install_git.rst | 0 doc/{rst => src}/Install_linux.rst | 0 doc/{rst => src}/Install_mac.rst | 0 doc/{rst => src}/Install_patch.rst | 0 doc/{rst => src}/Install_svn.rst | 0 doc/{rst => src}/Install_tarball.rst | 0 doc/{rst => src}/Install_windows.rst | 0 doc/{rst => src}/Intro.rst | 0 doc/{rst => src}/Intro_authors.rst | 0 doc/{rst => src}/Intro_features.rst | 0 doc/{rst => src}/Intro_nonfeatures.rst | 0 doc/{rst => src}/Intro_opensource.rst | 0 doc/{rst => src}/Intro_overview.rst | 0 doc/{rst => src}/Intro_website.rst | 0 doc/{rst => src}/Manual.rst | 0 doc/{rst => src}/Manual_build.rst | 0 doc/{rst => src}/Manual_version.rst | 0 doc/{rst => src}/Modify.rst | 0 doc/{rst => src}/Modify_atom.rst | 0 doc/{rst => src}/Modify_body.rst | 0 doc/{rst => src}/Modify_bond.rst | 0 doc/{rst => src}/Modify_command.rst | 0 doc/{rst => src}/Modify_compute.rst | 0 doc/{rst => src}/Modify_contribute.rst | 0 doc/{rst => src}/Modify_dump.rst | 0 doc/{rst => src}/Modify_fix.rst | 0 doc/{rst => src}/Modify_kspace.rst | 0 doc/{rst => src}/Modify_min.rst | 0 doc/{rst => src}/Modify_overview.rst | 0 doc/{rst => src}/Modify_pair.rst | 0 doc/{rst => src}/Modify_region.rst | 0 doc/{rst => src}/Modify_thermo.rst | 0 doc/{rst => src}/Modify_variable.rst | 0 doc/{rst => src}/Packages.rst | 0 doc/{rst => src}/Packages_details.rst | 0 doc/{rst => src}/Packages_standard.rst | 0 doc/{rst => src}/Packages_user.rst | 0 doc/{rst => src}/Python_call.rst | 0 doc/{rst => src}/Python_examples.rst | 0 doc/{rst => src}/Python_head.rst | 0 doc/{rst => src}/Python_install.rst | 0 doc/{rst => src}/Python_library.rst | 0 doc/{rst => src}/Python_mpi.rst | 0 doc/{rst => src}/Python_overview.rst | 0 doc/{rst => src}/Python_pylammps.rst | 0 doc/{rst => src}/Python_run.rst | 0 doc/{rst => src}/Python_shlib.rst | 0 doc/{rst => src}/Python_test.rst | 0 doc/{rst => src}/Run_basics.rst | 0 doc/{rst => src}/Run_head.rst | 0 doc/{rst => src}/Run_options.rst | 0 doc/{rst => src}/Run_output.rst | 0 doc/{rst => src}/Run_windows.rst | 0 doc/{rst => src}/Speed.rst | 0 doc/{rst => src}/Speed_bench.rst | 0 doc/{rst => src}/Speed_compare.rst | 0 doc/{rst => src}/Speed_gpu.rst | 0 doc/{rst => src}/Speed_intel.rst | 0 doc/{rst => src}/Speed_kokkos.rst | 0 doc/{rst => src}/Speed_measure.rst | 0 doc/{rst => src}/Speed_omp.rst | 0 doc/{rst => src}/Speed_opt.rst | 0 doc/{rst => src}/Speed_packages.rst | 0 doc/{rst => src}/Speed_tips.rst | 0 doc/{rst => src}/Tools.rst | 0 doc/{rst => src}/angle_charmm.rst | 0 doc/{rst => src}/angle_class2.rst | 0 doc/{rst => src}/angle_coeff.rst | 0 doc/{rst => src}/angle_cosine.rst | 0 doc/{rst => src}/angle_cosine_buck6d.rst | 0 doc/{rst => src}/angle_cosine_delta.rst | 0 doc/{rst => src}/angle_cosine_periodic.rst | 0 doc/{rst => src}/angle_cosine_shift.rst | 0 doc/{rst => src}/angle_cosine_shift_exp.rst | 0 doc/{rst => src}/angle_cosine_squared.rst | 0 doc/{rst => src}/angle_cross.rst | 0 doc/{rst => src}/angle_dipole.rst | 0 doc/{rst => src}/angle_fourier.rst | 0 doc/{rst => src}/angle_fourier_simple.rst | 0 doc/{rst => src}/angle_harmonic.rst | 0 doc/{rst => src}/angle_hybrid.rst | 0 doc/{rst => src}/angle_mm3.rst | 0 doc/{rst => src}/angle_none.rst | 0 doc/{rst => src}/angle_quartic.rst | 0 doc/{rst => src}/angle_sdk.rst | 0 doc/{rst => src}/angle_style.rst | 0 doc/{rst => src}/angle_table.rst | 0 doc/{rst => src}/angle_zero.rst | 0 doc/{rst => src}/angles.rst | 0 doc/{rst => src}/atom_modify.rst | 0 doc/{rst => src}/atom_style.rst | 0 doc/{rst => src}/balance.rst | 0 doc/{rst => src}/bond_class2.rst | 0 doc/{rst => src}/bond_coeff.rst | 0 doc/{rst => src}/bond_fene.rst | 0 doc/{rst => src}/bond_fene_expand.rst | 0 doc/{rst => src}/bond_gromos.rst | 0 doc/{rst => src}/bond_harmonic.rst | 0 doc/{rst => src}/bond_harmonic_shift.rst | 0 doc/{rst => src}/bond_harmonic_shift_cut.rst | 0 doc/{rst => src}/bond_hybrid.rst | 0 doc/{rst => src}/bond_mm3.rst | 0 doc/{rst => src}/bond_morse.rst | 0 doc/{rst => src}/bond_none.rst | 0 doc/{rst => src}/bond_nonlinear.rst | 0 doc/{rst => src}/bond_oxdna.rst | 0 doc/{rst => src}/bond_quartic.rst | 0 doc/{rst => src}/bond_style.rst | 0 doc/{rst => src}/bond_table.rst | 0 doc/{rst => src}/bond_write.rst | 0 doc/{rst => src}/bond_zero.rst | 0 doc/{rst => src}/bonds.rst | 0 doc/{rst => src}/boundary.rst | 0 doc/{rst => src}/box.rst | 0 doc/{rst => src}/change_box.rst | 0 doc/{rst => src}/clear.rst | 0 doc/{rst => src}/comm_modify.rst | 0 doc/{rst => src}/comm_style.rst | 0 doc/{rst => src}/commands_list.rst | 0 doc/{rst => src}/compute.rst | 0 doc/{rst => src}/compute_ackland_atom.rst | 0 doc/{rst => src}/compute_adf.rst | 0 doc/{rst => src}/compute_angle.rst | 0 doc/{rst => src}/compute_angle_local.rst | 0 doc/{rst => src}/compute_angmom_chunk.rst | 0 doc/{rst => src}/compute_basal_atom.rst | 0 doc/{rst => src}/compute_body_local.rst | 0 doc/{rst => src}/compute_bond.rst | 0 doc/{rst => src}/compute_bond_local.rst | 0 doc/{rst => src}/compute_centro_atom.rst | 0 doc/{rst => src}/compute_chunk_atom.rst | 0 .../compute_chunk_spread_atom.rst | 0 doc/{rst => src}/compute_cluster_atom.rst | 0 doc/{rst => src}/compute_cna_atom.rst | 0 doc/{rst => src}/compute_cnp_atom.rst | 0 doc/{rst => src}/compute_com.rst | 0 doc/{rst => src}/compute_com_chunk.rst | 0 doc/{rst => src}/compute_contact_atom.rst | 0 doc/{rst => src}/compute_coord_atom.rst | 0 doc/{rst => src}/compute_damage_atom.rst | 0 doc/{rst => src}/compute_dihedral.rst | 0 doc/{rst => src}/compute_dihedral_local.rst | 0 doc/{rst => src}/compute_dilatation_atom.rst | 0 doc/{rst => src}/compute_dipole_chunk.rst | 0 doc/{rst => src}/compute_displace_atom.rst | 0 doc/{rst => src}/compute_dpd.rst | 0 doc/{rst => src}/compute_dpd_atom.rst | 0 doc/{rst => src}/compute_edpd_temp_atom.rst | 0 doc/{rst => src}/compute_entropy_atom.rst | 0 doc/{rst => src}/compute_erotate_asphere.rst | 0 doc/{rst => src}/compute_erotate_rigid.rst | 0 doc/{rst => src}/compute_erotate_sphere.rst | 0 .../compute_erotate_sphere_atom.rst | 0 doc/{rst => src}/compute_event_displace.rst | 0 doc/{rst => src}/compute_fep.rst | 0 doc/{rst => src}/compute_global_atom.rst | 0 doc/{rst => src}/compute_group_group.rst | 0 doc/{rst => src}/compute_gyration.rst | 0 doc/{rst => src}/compute_gyration_chunk.rst | 0 doc/{rst => src}/compute_gyration_shape.rst | 0 doc/{rst => src}/compute_heat_flux.rst | 0 doc/{rst => src}/compute_hexorder_atom.rst | 0 doc/{rst => src}/compute_hma.rst | 0 doc/{rst => src}/compute_improper.rst | 0 doc/{rst => src}/compute_improper_local.rst | 0 doc/{rst => src}/compute_inertia_chunk.rst | 0 doc/{rst => src}/compute_ke.rst | 0 doc/{rst => src}/compute_ke_atom.rst | 0 doc/{rst => src}/compute_ke_atom_eff.rst | 0 doc/{rst => src}/compute_ke_eff.rst | 0 doc/{rst => src}/compute_ke_rigid.rst | 0 doc/{rst => src}/compute_meso_e_atom.rst | 0 doc/{rst => src}/compute_meso_rho_atom.rst | 0 doc/{rst => src}/compute_meso_t_atom.rst | 0 doc/{rst => src}/compute_modify.rst | 0 doc/{rst => src}/compute_momentum.rst | 0 doc/{rst => src}/compute_msd.rst | 0 doc/{rst => src}/compute_msd_chunk.rst | 0 doc/{rst => src}/compute_msd_nongauss.rst | 0 doc/{rst => src}/compute_omega_chunk.rst | 0 doc/{rst => src}/compute_orientorder_atom.rst | 0 doc/{rst => src}/compute_pair.rst | 0 doc/{rst => src}/compute_pair_local.rst | 0 doc/{rst => src}/compute_pe.rst | 0 doc/{rst => src}/compute_pe_atom.rst | 0 doc/{rst => src}/compute_plasticity_atom.rst | 0 doc/{rst => src}/compute_pressure.rst | 0 .../compute_pressure_cylinder.rst | 0 doc/{rst => src}/compute_pressure_uef.rst | 0 doc/{rst => src}/compute_property_atom.rst | 0 doc/{rst => src}/compute_property_chunk.rst | 0 doc/{rst => src}/compute_property_local.rst | 0 doc/{rst => src}/compute_ptm_atom.rst | 0 doc/{rst => src}/compute_rdf.rst | 0 doc/{rst => src}/compute_reduce.rst | 0 doc/{rst => src}/compute_reduce_chunk.rst | 0 doc/{rst => src}/compute_rigid_local.rst | 0 doc/{rst => src}/compute_saed.rst | 0 doc/{rst => src}/compute_slice.rst | 0 .../compute_smd_contact_radius.rst | 0 doc/{rst => src}/compute_smd_damage.rst | 0 .../compute_smd_hourglass_error.rst | 0 .../compute_smd_internal_energy.rst | 0 .../compute_smd_plastic_strain.rst | 0 .../compute_smd_plastic_strain_rate.rst | 0 doc/{rst => src}/compute_smd_rho.rst | 0 .../compute_smd_tlsph_defgrad.rst | 0 doc/{rst => src}/compute_smd_tlsph_dt.rst | 0 .../compute_smd_tlsph_num_neighs.rst | 0 doc/{rst => src}/compute_smd_tlsph_shape.rst | 0 doc/{rst => src}/compute_smd_tlsph_strain.rst | 0 .../compute_smd_tlsph_strain_rate.rst | 0 doc/{rst => src}/compute_smd_tlsph_stress.rst | 0 .../compute_smd_triangle_vertices.rst | 0 .../compute_smd_ulsph_num_neighs.rst | 0 doc/{rst => src}/compute_smd_ulsph_strain.rst | 0 .../compute_smd_ulsph_strain_rate.rst | 0 doc/{rst => src}/compute_smd_ulsph_stress.rst | 0 doc/{rst => src}/compute_smd_vol.rst | 0 doc/{rst => src}/compute_sna_atom.rst | 0 doc/{rst => src}/compute_spin.rst | 0 doc/{rst => src}/compute_stress_atom.rst | 0 doc/{rst => src}/compute_stress_mop.rst | 0 doc/{rst => src}/compute_tally.rst | 0 doc/{rst => src}/compute_tdpd_cc_atom.rst | 0 doc/{rst => src}/compute_temp.rst | 0 doc/{rst => src}/compute_temp_asphere.rst | 0 doc/{rst => src}/compute_temp_body.rst | 0 doc/{rst => src}/compute_temp_chunk.rst | 0 doc/{rst => src}/compute_temp_com.rst | 0 doc/{rst => src}/compute_temp_cs.rst | 0 doc/{rst => src}/compute_temp_deform.rst | 0 doc/{rst => src}/compute_temp_deform_eff.rst | 0 doc/{rst => src}/compute_temp_drude.rst | 0 doc/{rst => src}/compute_temp_eff.rst | 0 doc/{rst => src}/compute_temp_partial.rst | 0 doc/{rst => src}/compute_temp_profile.rst | 0 doc/{rst => src}/compute_temp_ramp.rst | 0 doc/{rst => src}/compute_temp_region.rst | 0 doc/{rst => src}/compute_temp_region_eff.rst | 0 doc/{rst => src}/compute_temp_rotate.rst | 0 doc/{rst => src}/compute_temp_sphere.rst | 0 doc/{rst => src}/compute_temp_uef.rst | 0 doc/{rst => src}/compute_ti.rst | 0 doc/{rst => src}/compute_torque_chunk.rst | 0 doc/{rst => src}/compute_vacf.rst | 0 doc/{rst => src}/compute_vcm_chunk.rst | 0 doc/{rst => src}/compute_voronoi_atom.rst | 0 doc/{rst => src}/compute_xrd.rst | 0 doc/{rst => src}/computes.rst | 0 doc/{rst => src}/create_atoms.rst | 0 doc/{rst => src}/create_bonds.rst | 0 doc/{rst => src}/create_box.rst | 0 doc/{rst => src}/delete_atoms.rst | 0 doc/{rst => src}/delete_bonds.rst | 0 doc/{rst => src}/dielectric.rst | 0 doc/{rst => src}/dihedral_charmm.rst | 0 doc/{rst => src}/dihedral_class2.rst | 0 doc/{rst => src}/dihedral_coeff.rst | 0 .../dihedral_cosine_shift_exp.rst | 0 doc/{rst => src}/dihedral_fourier.rst | 0 doc/{rst => src}/dihedral_harmonic.rst | 0 doc/{rst => src}/dihedral_helix.rst | 0 doc/{rst => src}/dihedral_hybrid.rst | 0 doc/{rst => src}/dihedral_multi_harmonic.rst | 0 doc/{rst => src}/dihedral_nharmonic.rst | 0 doc/{rst => src}/dihedral_none.rst | 0 doc/{rst => src}/dihedral_opls.rst | 0 doc/{rst => src}/dihedral_quadratic.rst | 0 doc/{rst => src}/dihedral_spherical.rst | 0 doc/{rst => src}/dihedral_style.rst | 0 doc/{rst => src}/dihedral_table.rst | 0 doc/{rst => src}/dihedral_table_cut.rst | 0 doc/{rst => src}/dihedral_zero.rst | 0 doc/{rst => src}/dihedrals.rst | 0 doc/{rst => src}/dimension.rst | 0 doc/{rst => src}/displace_atoms.rst | 0 doc/{rst => src}/dump.rst | 0 doc/{rst => src}/dump_adios.rst | 0 doc/{rst => src}/dump_cfg_uef.rst | 0 doc/{rst => src}/dump_h5md.rst | 0 doc/{rst => src}/dump_image.rst | 0 doc/{rst => src}/dump_modify.rst | 0 doc/{rst => src}/dump_molfile.rst | 0 doc/{rst => src}/dump_netcdf.rst | 0 doc/{rst => src}/dump_vtk.rst | 0 doc/{rst => src}/dynamical_matrix.rst | 0 doc/{rst => src}/echo.rst | 0 doc/{rst => src}/fix.rst | 0 doc/{rst => src}/fix_adapt.rst | 0 doc/{rst => src}/fix_adapt_fep.rst | 0 doc/{rst => src}/fix_addforce.rst | 0 doc/{rst => src}/fix_addtorque.rst | 0 doc/{rst => src}/fix_append_atoms.rst | 0 doc/{rst => src}/fix_atc.rst | 0 doc/{rst => src}/fix_atom_swap.rst | 0 doc/{rst => src}/fix_ave_atom.rst | 0 doc/{rst => src}/fix_ave_chunk.rst | 0 doc/{rst => src}/fix_ave_correlate.rst | 0 doc/{rst => src}/fix_ave_correlate_long.rst | 0 doc/{rst => src}/fix_ave_histo.rst | 0 doc/{rst => src}/fix_ave_time.rst | 0 doc/{rst => src}/fix_aveforce.rst | 0 doc/{rst => src}/fix_balance.rst | 0 doc/{rst => src}/fix_bocs.rst | 0 doc/{rst => src}/fix_bond_break.rst | 0 doc/{rst => src}/fix_bond_create.rst | 0 doc/{rst => src}/fix_bond_react.rst | 0 doc/{rst => src}/fix_bond_swap.rst | 0 doc/{rst => src}/fix_box_relax.rst | 0 doc/{rst => src}/fix_client_md.rst | 0 doc/{rst => src}/fix_cmap.rst | 0 doc/{rst => src}/fix_colvars.rst | 0 doc/{rst => src}/fix_controller.rst | 0 doc/{rst => src}/fix_deform.rst | 0 doc/{rst => src}/fix_deposit.rst | 0 doc/{rst => src}/fix_dpd_energy.rst | 0 doc/{rst => src}/fix_dpd_source.rst | 0 doc/{rst => src}/fix_drag.rst | 0 doc/{rst => src}/fix_drude.rst | 0 doc/{rst => src}/fix_drude_transform.rst | 0 doc/{rst => src}/fix_dt_reset.rst | 0 doc/{rst => src}/fix_efield.rst | 0 doc/{rst => src}/fix_ehex.rst | 0 doc/{rst => src}/fix_electron_stopping.rst | 0 doc/{rst => src}/fix_enforce2d.rst | 0 doc/{rst => src}/fix_eos_cv.rst | 0 doc/{rst => src}/fix_eos_table.rst | 0 doc/{rst => src}/fix_eos_table_rx.rst | 0 doc/{rst => src}/fix_evaporate.rst | 0 doc/{rst => src}/fix_external.rst | 0 doc/{rst => src}/fix_ffl.rst | 0 doc/{rst => src}/fix_filter_corotate.rst | 0 doc/{rst => src}/fix_flow_gauss.rst | 0 doc/{rst => src}/fix_freeze.rst | 0 doc/{rst => src}/fix_gcmc.rst | 0 doc/{rst => src}/fix_gld.rst | 0 doc/{rst => src}/fix_gle.rst | 0 doc/{rst => src}/fix_gravity.rst | 0 doc/{rst => src}/fix_grem.rst | 0 doc/{rst => src}/fix_halt.rst | 0 doc/{rst => src}/fix_heat.rst | 0 doc/{rst => src}/fix_hyper_global.rst | 0 doc/{rst => src}/fix_hyper_local.rst | 0 doc/{rst => src}/fix_imd.rst | 0 doc/{rst => src}/fix_indent.rst | 0 doc/{rst => src}/fix_ipi.rst | 0 doc/{rst => src}/fix_langevin.rst | 0 doc/{rst => src}/fix_langevin_drude.rst | 0 doc/{rst => src}/fix_langevin_eff.rst | 0 doc/{rst => src}/fix_langevin_spin.rst | 0 doc/{rst => src}/fix_latte.rst | 0 doc/{rst => src}/fix_lb_fluid.rst | 0 doc/{rst => src}/fix_lb_momentum.rst | 0 doc/{rst => src}/fix_lb_pc.rst | 0 doc/{rst => src}/fix_lb_rigid_pc_sphere.rst | 0 doc/{rst => src}/fix_lb_viscous.rst | 0 doc/{rst => src}/fix_lineforce.rst | 0 doc/{rst => src}/fix_manifoldforce.rst | 0 doc/{rst => src}/fix_meso.rst | 0 doc/{rst => src}/fix_meso_move.rst | 0 doc/{rst => src}/fix_meso_stationary.rst | 0 doc/{rst => src}/fix_modify.rst | 0 doc/{rst => src}/fix_momentum.rst | 0 doc/{rst => src}/fix_move.rst | 0 doc/{rst => src}/fix_mscg.rst | 0 doc/{rst => src}/fix_msst.rst | 0 doc/{rst => src}/fix_mvv_dpd.rst | 0 doc/{rst => src}/fix_neb.rst | 0 doc/{rst => src}/fix_neb_spin.rst | 0 doc/{rst => src}/fix_nh.rst | 0 doc/{rst => src}/fix_nh_eff.rst | 0 doc/{rst => src}/fix_nh_uef.rst | 0 doc/{rst => src}/fix_nph_asphere.rst | 0 doc/{rst => src}/fix_nph_body.rst | 0 doc/{rst => src}/fix_nph_sphere.rst | 0 doc/{rst => src}/fix_nphug.rst | 0 doc/{rst => src}/fix_npt_asphere.rst | 0 doc/{rst => src}/fix_npt_body.rst | 0 doc/{rst => src}/fix_npt_sphere.rst | 0 doc/{rst => src}/fix_nve.rst | 0 doc/{rst => src}/fix_nve_asphere.rst | 0 doc/{rst => src}/fix_nve_asphere_noforce.rst | 0 doc/{rst => src}/fix_nve_awpmd.rst | 0 doc/{rst => src}/fix_nve_body.rst | 0 doc/{rst => src}/fix_nve_dot.rst | 0 doc/{rst => src}/fix_nve_dotc_langevin.rst | 0 doc/{rst => src}/fix_nve_eff.rst | 0 doc/{rst => src}/fix_nve_limit.rst | 0 doc/{rst => src}/fix_nve_line.rst | 0 doc/{rst => src}/fix_nve_manifold_rattle.rst | 0 doc/{rst => src}/fix_nve_noforce.rst | 0 doc/{rst => src}/fix_nve_sphere.rst | 0 doc/{rst => src}/fix_nve_spin.rst | 0 doc/{rst => src}/fix_nve_tri.rst | 0 doc/{rst => src}/fix_nvk.rst | 0 doc/{rst => src}/fix_nvt_asphere.rst | 0 doc/{rst => src}/fix_nvt_body.rst | 0 doc/{rst => src}/fix_nvt_manifold_rattle.rst | 0 doc/{rst => src}/fix_nvt_sllod.rst | 0 doc/{rst => src}/fix_nvt_sllod_eff.rst | 0 doc/{rst => src}/fix_nvt_sphere.rst | 0 doc/{rst => src}/fix_oneway.rst | 0 doc/{rst => src}/fix_orient.rst | 0 doc/{rst => src}/fix_phonon.rst | 0 doc/{rst => src}/fix_pimd.rst | 0 doc/{rst => src}/fix_planeforce.rst | 0 doc/{rst => src}/fix_plumed.rst | 0 doc/{rst => src}/fix_poems.rst | 0 doc/{rst => src}/fix_pour.rst | 0 doc/{rst => src}/fix_precession_spin.rst | 0 doc/{rst => src}/fix_press_berendsen.rst | 0 doc/{rst => src}/fix_print.rst | 0 doc/{rst => src}/fix_property_atom.rst | 0 doc/{rst => src}/fix_python_invoke.rst | 0 doc/{rst => src}/fix_python_move.rst | 0 doc/{rst => src}/fix_qbmsst.rst | 0 doc/{rst => src}/fix_qeq.rst | 0 doc/{rst => src}/fix_qeq_comb.rst | 0 doc/{rst => src}/fix_qeq_reax.rst | 0 doc/{rst => src}/fix_qmmm.rst | 0 doc/{rst => src}/fix_qtb.rst | 0 doc/{rst => src}/fix_reaxc_bonds.rst | 0 doc/{rst => src}/fix_reaxc_species.rst | 0 doc/{rst => src}/fix_recenter.rst | 0 doc/{rst => src}/fix_restrain.rst | 0 doc/{rst => src}/fix_rhok.rst | 0 doc/{rst => src}/fix_rigid.rst | 0 doc/{rst => src}/fix_rigid_meso.rst | 0 doc/{rst => src}/fix_rx.rst | 0 doc/{rst => src}/fix_saed_vtk.rst | 0 doc/{rst => src}/fix_setforce.rst | 0 doc/{rst => src}/fix_shake.rst | 0 doc/{rst => src}/fix_shardlow.rst | 0 doc/{rst => src}/fix_smd.rst | 0 doc/{rst => src}/fix_smd_adjust_dt.rst | 0 doc/{rst => src}/fix_smd_integrate_tlsph.rst | 0 doc/{rst => src}/fix_smd_integrate_ulsph.rst | 0 .../fix_smd_move_triangulated_surface.rst | 0 doc/{rst => src}/fix_smd_setvel.rst | 0 doc/{rst => src}/fix_smd_wall_surface.rst | 0 doc/{rst => src}/fix_spring.rst | 0 doc/{rst => src}/fix_spring_chunk.rst | 0 doc/{rst => src}/fix_spring_rg.rst | 0 doc/{rst => src}/fix_spring_self.rst | 0 doc/{rst => src}/fix_srd.rst | 0 doc/{rst => src}/fix_store_force.rst | 0 doc/{rst => src}/fix_store_state.rst | 0 doc/{rst => src}/fix_temp_berendsen.rst | 0 doc/{rst => src}/fix_temp_csvr.rst | 0 doc/{rst => src}/fix_temp_rescale.rst | 0 doc/{rst => src}/fix_temp_rescale_eff.rst | 0 doc/{rst => src}/fix_tfmc.rst | 0 doc/{rst => src}/fix_thermal_conductivity.rst | 0 doc/{rst => src}/fix_ti_spring.rst | 0 doc/{rst => src}/fix_tmd.rst | 0 doc/{rst => src}/fix_ttm.rst | 0 doc/{rst => src}/fix_tune_kspace.rst | 0 doc/{rst => src}/fix_vector.rst | 0 doc/{rst => src}/fix_viscosity.rst | 0 doc/{rst => src}/fix_viscous.rst | 0 doc/{rst => src}/fix_wall.rst | 0 doc/{rst => src}/fix_wall_body_polygon.rst | 0 doc/{rst => src}/fix_wall_body_polyhedron.rst | 0 doc/{rst => src}/fix_wall_ees.rst | 0 doc/{rst => src}/fix_wall_gran.rst | 0 doc/{rst => src}/fix_wall_gran_region.rst | 0 doc/{rst => src}/fix_wall_piston.rst | 0 doc/{rst => src}/fix_wall_reflect.rst | 0 doc/{rst => src}/fix_wall_region.rst | 0 doc/{rst => src}/fix_wall_srd.rst | 0 doc/{rst => src}/fixes.rst | 0 doc/{rst => src}/group.rst | 0 doc/{rst => src}/group2ndx.rst | 0 doc/{rst => src}/hyper.rst | 0 doc/{rst => src}/if.rst | 0 doc/{rst => src}/improper_class2.rst | 0 doc/{rst => src}/improper_coeff.rst | 0 doc/{rst => src}/improper_cossq.rst | 0 doc/{rst => src}/improper_cvff.rst | 0 doc/{rst => src}/improper_distance.rst | 0 doc/{rst => src}/improper_distharm.rst | 0 doc/{rst => src}/improper_fourier.rst | 0 doc/{rst => src}/improper_harmonic.rst | 0 doc/{rst => src}/improper_hybrid.rst | 0 .../improper_inversion_harmonic.rst | 0 doc/{rst => src}/improper_none.rst | 0 doc/{rst => src}/improper_ring.rst | 0 doc/{rst => src}/improper_sqdistharm.rst | 0 doc/{rst => src}/improper_style.rst | 0 doc/{rst => src}/improper_umbrella.rst | 0 doc/{rst => src}/improper_zero.rst | 0 doc/{rst => src}/impropers.rst | 0 doc/{rst => src}/include.rst | 0 doc/{rst => src}/info.rst | 0 doc/{rst => src}/jump.rst | 0 doc/{rst => src}/kim_commands.rst | 0 doc/{rst => src}/kspace_modify.rst | 0 doc/{rst => src}/kspace_style.rst | 0 doc/{rst => src}/label.rst | 0 doc/{rst => src}/lattice.rst | 0 doc/{rst => src}/log.rst | 0 doc/{rst => src}/mass.rst | 0 doc/{rst => src}/message.rst | 0 doc/{rst => src}/min_modify.rst | 0 doc/{rst => src}/min_spin.rst | 0 doc/{rst => src}/min_style.rst | 0 doc/{rst => src}/minimize.rst | 0 doc/{rst => src}/molecule.rst | 0 doc/{rst => src}/neb.rst | 0 doc/{rst => src}/neb_spin.rst | 0 doc/{rst => src}/neigh_modify.rst | 0 doc/{rst => src}/neighbor.rst | 0 doc/{rst => src}/newton.rst | 0 doc/{rst => src}/next.rst | 0 doc/{rst => src}/package.rst | 0 doc/{rst => src}/pair_adp.rst | 0 doc/{rst => src}/pair_agni.rst | 0 doc/{rst => src}/pair_airebo.rst | 0 doc/{rst => src}/pair_atm.rst | 0 doc/{rst => src}/pair_awpmd.rst | 0 doc/{rst => src}/pair_beck.rst | 0 doc/{rst => src}/pair_body_nparticle.rst | 0 .../pair_body_rounded_polygon.rst | 0 .../pair_body_rounded_polyhedron.rst | 0 doc/{rst => src}/pair_bop.rst | 0 doc/{rst => src}/pair_born.rst | 0 doc/{rst => src}/pair_brownian.rst | 0 doc/{rst => src}/pair_buck.rst | 0 doc/{rst => src}/pair_buck6d_coul_gauss.rst | 0 doc/{rst => src}/pair_buck_long.rst | 0 doc/{rst => src}/pair_charmm.rst | 0 doc/{rst => src}/pair_class2.rst | 0 doc/{rst => src}/pair_coeff.rst | 0 doc/{rst => src}/pair_colloid.rst | 0 doc/{rst => src}/pair_comb.rst | 0 doc/{rst => src}/pair_cosine_squared.rst | 0 doc/{rst => src}/pair_coul.rst | 0 doc/{rst => src}/pair_coul_diel.rst | 0 doc/{rst => src}/pair_coul_shield.rst | 0 doc/{rst => src}/pair_cs.rst | 0 doc/{rst => src}/pair_dipole.rst | 0 doc/{rst => src}/pair_dpd.rst | 0 doc/{rst => src}/pair_dpd_fdt.rst | 0 doc/{rst => src}/pair_drip.rst | 0 doc/{rst => src}/pair_dsmc.rst | 0 doc/{rst => src}/pair_e3b.rst | 0 doc/{rst => src}/pair_eam.rst | 0 doc/{rst => src}/pair_edip.rst | 0 doc/{rst => src}/pair_eff.rst | 0 doc/{rst => src}/pair_eim.rst | 0 doc/{rst => src}/pair_exp6_rx.rst | 0 doc/{rst => src}/pair_extep.rst | 0 doc/{rst => src}/pair_fep_soft.rst | 0 doc/{rst => src}/pair_gauss.rst | 0 doc/{rst => src}/pair_gayberne.rst | 0 doc/{rst => src}/pair_gran.rst | 0 doc/{rst => src}/pair_granular.rst | 0 doc/{rst => src}/pair_gromacs.rst | 0 doc/{rst => src}/pair_gw.rst | 0 doc/{rst => src}/pair_hbond_dreiding.rst | 0 doc/{rst => src}/pair_hybrid.rst | 0 doc/{rst => src}/pair_ilp_graphene_hbn.rst | 0 doc/{rst => src}/pair_kim.rst | 0 .../pair_kolmogorov_crespi_full.rst | 0 doc/{rst => src}/pair_kolmogorov_crespi_z.rst | 0 doc/{rst => src}/pair_lcbop.rst | 0 doc/{rst => src}/pair_lebedeva_z.rst | 0 doc/{rst => src}/pair_line_lj.rst | 0 doc/{rst => src}/pair_list.rst | 0 doc/{rst => src}/pair_lj.rst | 0 doc/{rst => src}/pair_lj96.rst | 0 doc/{rst => src}/pair_lj_cubic.rst | 0 doc/{rst => src}/pair_lj_expand.rst | 0 doc/{rst => src}/pair_lj_long.rst | 0 doc/{rst => src}/pair_lj_smooth.rst | 0 doc/{rst => src}/pair_lj_smooth_linear.rst | 0 .../pair_lj_switch3_coulgauss.rst | 0 doc/{rst => src}/pair_local_density.rst | 0 doc/{rst => src}/pair_lubricate.rst | 0 doc/{rst => src}/pair_lubricateU.rst | 0 doc/{rst => src}/pair_mdf.rst | 0 doc/{rst => src}/pair_meam_spline.rst | 0 doc/{rst => src}/pair_meam_sw_spline.rst | 0 doc/{rst => src}/pair_meamc.rst | 0 doc/{rst => src}/pair_meso.rst | 0 doc/{rst => src}/pair_mgpt.rst | 0 doc/{rst => src}/pair_mie.rst | 0 .../pair_mm3_switch3_coulgauss.rst | 0 doc/{rst => src}/pair_modify.rst | 0 doc/{rst => src}/pair_momb.rst | 0 doc/{rst => src}/pair_morse.rst | 0 doc/{rst => src}/pair_multi_lucy.rst | 0 doc/{rst => src}/pair_multi_lucy_rx.rst | 0 doc/{rst => src}/pair_nb3b_harmonic.rst | 0 doc/{rst => src}/pair_nm.rst | 0 doc/{rst => src}/pair_none.rst | 0 doc/{rst => src}/pair_oxdna.rst | 0 doc/{rst => src}/pair_oxdna2.rst | 0 doc/{rst => src}/pair_peri.rst | 0 doc/{rst => src}/pair_polymorphic.rst | 0 doc/{rst => src}/pair_python.rst | 0 doc/{rst => src}/pair_quip.rst | 0 doc/{rst => src}/pair_reaxc.rst | 0 doc/{rst => src}/pair_resquared.rst | 0 doc/{rst => src}/pair_sdk.rst | 0 .../pair_sdpd_taitwater_isothermal.rst | 0 doc/{rst => src}/pair_smd_hertz.rst | 0 doc/{rst => src}/pair_smd_tlsph.rst | 0 .../pair_smd_triangulated_surface.rst | 0 doc/{rst => src}/pair_smd_ulsph.rst | 0 doc/{rst => src}/pair_smtbq.rst | 0 doc/{rst => src}/pair_snap.rst | 0 doc/{rst => src}/pair_soft.rst | 0 doc/{rst => src}/pair_sph_heatconduction.rst | 0 doc/{rst => src}/pair_sph_idealgas.rst | 0 doc/{rst => src}/pair_sph_lj.rst | 0 doc/{rst => src}/pair_sph_rhosum.rst | 0 doc/{rst => src}/pair_sph_taitwater.rst | 0 .../pair_sph_taitwater_morris.rst | 0 doc/{rst => src}/pair_spin_dipole.rst | 0 doc/{rst => src}/pair_spin_dmi.rst | 0 doc/{rst => src}/pair_spin_exchange.rst | 0 doc/{rst => src}/pair_spin_magelec.rst | 0 doc/{rst => src}/pair_spin_neel.rst | 0 doc/{rst => src}/pair_srp.rst | 0 doc/{rst => src}/pair_style.rst | 0 doc/{rst => src}/pair_sw.rst | 0 doc/{rst => src}/pair_table.rst | 0 doc/{rst => src}/pair_table_rx.rst | 0 doc/{rst => src}/pair_tersoff.rst | 0 doc/{rst => src}/pair_tersoff_mod.rst | 0 doc/{rst => src}/pair_tersoff_zbl.rst | 0 doc/{rst => src}/pair_thole.rst | 0 doc/{rst => src}/pair_tri_lj.rst | 0 doc/{rst => src}/pair_ufm.rst | 0 doc/{rst => src}/pair_vashishta.rst | 0 doc/{rst => src}/pair_write.rst | 0 doc/{rst => src}/pair_yukawa.rst | 0 doc/{rst => src}/pair_yukawa_colloid.rst | 0 doc/{rst => src}/pair_zbl.rst | 0 doc/{rst => src}/pair_zero.rst | 0 doc/{rst => src}/pairs.rst | 0 doc/{rst => src}/partition.rst | 0 doc/{rst => src}/prd.rst | 0 doc/{rst => src}/print.rst | 0 doc/{rst => src}/processors.rst | 0 doc/{rst => src}/python.rst | 0 doc/{rst => src}/quit.rst | 0 doc/{rst => src}/read_data.rst | 0 doc/{rst => src}/read_dump.rst | 0 doc/{rst => src}/read_restart.rst | 0 doc/{rst => src}/region.rst | 0 doc/{rst => src}/replicate.rst | 0 doc/{rst => src}/rerun.rst | 0 doc/{rst => src}/reset_ids.rst | 0 doc/{rst => src}/reset_timestep.rst | 0 doc/{rst => src}/restart.rst | 0 doc/{rst => src}/run.rst | 0 doc/{rst => src}/run_style.rst | 0 doc/{rst => src}/server.rst | 0 doc/{rst => src}/server_mc.rst | 0 doc/{rst => src}/server_md.rst | 0 doc/{rst => src}/set.rst | 0 doc/{rst => src}/shell.rst | 0 doc/{rst => src}/special_bonds.rst | 0 doc/{rst => src}/suffix.rst | 0 doc/{rst => src}/tad.rst | 0 doc/{rst => src}/temper.rst | 0 doc/{rst => src}/temper_grem.rst | 0 doc/{rst => src}/temper_npt.rst | 0 doc/{rst => src}/thermo.rst | 0 doc/{rst => src}/thermo_modify.rst | 0 doc/{rst => src}/thermo_style.rst | 0 doc/{rst => src}/third_order.rst | 0 doc/{rst => src}/timer.rst | 0 doc/{rst => src}/timestep.rst | 0 doc/{rst => src}/uncompute.rst | 0 doc/{rst => src}/undump.rst | 0 doc/{rst => src}/unfix.rst | 0 doc/{rst => src}/units.rst | 0 doc/{rst => src}/variable.rst | 0 doc/{rst => src}/velocity.rst | 0 doc/{rst => src}/write_coeff.rst | 0 doc/{rst => src}/write_data.rst | 0 doc/{rst => src}/write_dump.rst | 0 doc/{rst => src}/write_restart.rst | 0 doc/{src => txt}/Build.txt | 0 doc/{src => txt}/Build_basics.txt | 0 doc/{src => txt}/Build_cmake.txt | 0 doc/{src => txt}/Build_development.txt | 0 doc/{src => txt}/Build_extras.txt | 0 doc/{src => txt}/Build_link.txt | 0 doc/{src => txt}/Build_make.txt | 0 doc/{src => txt}/Build_package.txt | 0 doc/{src => txt}/Build_settings.txt | 0 doc/{src => txt}/Build_windows.txt | 0 doc/{src => txt}/Commands.txt | 0 doc/{src => txt}/Commands_all.txt | 0 doc/{src => txt}/Commands_bond.txt | 0 doc/{src => txt}/Commands_category.txt | 0 doc/{src => txt}/Commands_compute.txt | 0 doc/{src => txt}/Commands_fix.txt | 0 doc/{src => txt}/Commands_input.txt | 0 doc/{src => txt}/Commands_kspace.txt | 0 doc/{src => txt}/Commands_pair.txt | 0 doc/{src => txt}/Commands_parse.txt | 0 doc/{src => txt}/Commands_removed.txt | 0 doc/{src => txt}/Commands_structure.txt | 0 doc/{src => txt}/Developer/.gitignore | 0 doc/{src => txt}/Developer/classes.fig | 0 doc/{src => txt}/Developer/classes.pdf | Bin doc/{src => txt}/Developer/developer.tex | 0 doc/{src => txt}/Errors.txt | 0 doc/{src => txt}/Errors_bugs.txt | 0 doc/{src => txt}/Errors_common.txt | 0 doc/{src => txt}/Errors_messages.txt | 0 doc/{src => txt}/Errors_warnings.txt | 0 doc/{src => txt}/Examples.txt | 0 doc/{src => txt}/Howto.txt | 0 doc/{src => txt}/Howto_2d.txt | 0 doc/{src => txt}/Howto_barostat.txt | 0 doc/{src => txt}/Howto_bash.txt | 0 doc/{src => txt}/Howto_bioFF.txt | 0 doc/{src => txt}/Howto_body.txt | 0 doc/{src => txt}/Howto_chunk.txt | 0 doc/{src => txt}/Howto_client_server.txt | 0 doc/{src => txt}/Howto_coreshell.txt | 0 doc/{src => txt}/Howto_couple.txt | 0 doc/{src => txt}/Howto_diffusion.txt | 0 doc/{src => txt}/Howto_dispersion.txt | 0 doc/{src => txt}/Howto_drude.txt | 0 doc/{src => txt}/Howto_drude2.txt | 0 doc/{src => txt}/Howto_elastic.txt | 0 doc/{src => txt}/Howto_github.txt | 0 doc/{src => txt}/Howto_granular.txt | 0 doc/{src => txt}/Howto_kappa.txt | 0 doc/{src => txt}/Howto_library.txt | 0 doc/{src => txt}/Howto_manifold.txt | 0 doc/{src => txt}/Howto_multiple.txt | 0 doc/{src => txt}/Howto_nemd.txt | 0 doc/{src => txt}/Howto_output.txt | 0 doc/{src => txt}/Howto_polarizable.txt | 0 doc/{src => txt}/Howto_pylammps.txt | 0 doc/{src => txt}/Howto_replica.txt | 0 doc/{src => txt}/Howto_restart.txt | 0 doc/{src => txt}/Howto_spc.txt | 0 doc/{src => txt}/Howto_spherical.txt | 0 doc/{src => txt}/Howto_spins.txt | 0 doc/{src => txt}/Howto_temperature.txt | 0 doc/{src => txt}/Howto_thermostat.txt | 0 doc/{src => txt}/Howto_tip3p.txt | 0 doc/{src => txt}/Howto_tip4p.txt | 0 doc/{src => txt}/Howto_triclinic.txt | 0 doc/{src => txt}/Howto_viscosity.txt | 0 doc/{src => txt}/Howto_viz.txt | 0 doc/{src => txt}/Howto_walls.txt | 0 doc/{src => txt}/Install.txt | 0 doc/{src => txt}/Install_git.txt | 0 doc/{src => txt}/Install_linux.txt | 0 doc/{src => txt}/Install_mac.txt | 0 doc/{src => txt}/Install_patch.txt | 0 doc/{src => txt}/Install_svn.txt | 0 doc/{src => txt}/Install_tarball.txt | 0 doc/{src => txt}/Install_windows.txt | 0 doc/{src => txt}/Intro.txt | 0 doc/{src => txt}/Intro_authors.txt | 0 doc/{src => txt}/Intro_features.txt | 0 doc/{src => txt}/Intro_nonfeatures.txt | 0 doc/{src => txt}/Intro_opensource.txt | 0 doc/{src => txt}/Intro_overview.txt | 0 doc/{src => txt}/Intro_website.txt | 0 doc/{src => txt}/Manual.txt | 0 doc/{src => txt}/Manual_build.txt | 0 doc/{src => txt}/Manual_version.txt | 0 doc/{src => txt}/Modify.txt | 0 doc/{src => txt}/Modify_atom.txt | 0 doc/{src => txt}/Modify_body.txt | 0 doc/{src => txt}/Modify_bond.txt | 0 doc/{src => txt}/Modify_command.txt | 0 doc/{src => txt}/Modify_compute.txt | 0 doc/{src => txt}/Modify_contribute.txt | 0 doc/{src => txt}/Modify_dump.txt | 0 doc/{src => txt}/Modify_fix.txt | 0 doc/{src => txt}/Modify_kspace.txt | 0 doc/{src => txt}/Modify_min.txt | 0 doc/{src => txt}/Modify_overview.txt | 0 doc/{src => txt}/Modify_pair.txt | 0 doc/{src => txt}/Modify_region.txt | 0 doc/{src => txt}/Modify_thermo.txt | 0 doc/{src => txt}/Modify_variable.txt | 0 doc/{src => txt}/Packages.txt | 0 doc/{src => txt}/Packages_details.txt | 0 doc/{src => txt}/Packages_standard.txt | 0 doc/{src => txt}/Packages_user.txt | 0 doc/{src => txt}/Python_call.txt | 0 doc/{src => txt}/Python_examples.txt | 0 doc/{src => txt}/Python_head.txt | 0 doc/{src => txt}/Python_install.txt | 0 doc/{src => txt}/Python_library.txt | 0 doc/{src => txt}/Python_mpi.txt | 0 doc/{src => txt}/Python_overview.txt | 0 doc/{src => txt}/Python_pylammps.txt | 0 doc/{src => txt}/Python_run.txt | 0 doc/{src => txt}/Python_shlib.txt | 0 doc/{src => txt}/Python_test.txt | 0 doc/{src => txt}/Run_basics.txt | 0 doc/{src => txt}/Run_head.txt | 0 doc/{src => txt}/Run_options.txt | 0 doc/{src => txt}/Run_output.txt | 0 doc/{src => txt}/Run_windows.txt | 0 doc/{src => txt}/Speed.txt | 0 doc/{src => txt}/Speed_bench.txt | 0 doc/{src => txt}/Speed_compare.txt | 0 doc/{src => txt}/Speed_gpu.txt | 0 doc/{src => txt}/Speed_intel.txt | 0 doc/{src => txt}/Speed_kokkos.txt | 0 doc/{src => txt}/Speed_measure.txt | 0 doc/{src => txt}/Speed_omp.txt | 0 doc/{src => txt}/Speed_opt.txt | 0 doc/{src => txt}/Speed_packages.txt | 0 doc/{src => txt}/Speed_tips.txt | 0 doc/{src => txt}/Tools.txt | 0 doc/{src => txt}/angle_charmm.txt | 0 doc/{src => txt}/angle_class2.txt | 0 doc/{src => txt}/angle_coeff.txt | 0 doc/{src => txt}/angle_cosine.txt | 0 doc/{src => txt}/angle_cosine_buck6d.txt | 0 doc/{src => txt}/angle_cosine_delta.txt | 0 doc/{src => txt}/angle_cosine_periodic.txt | 0 doc/{src => txt}/angle_cosine_shift.txt | 0 doc/{src => txt}/angle_cosine_shift_exp.txt | 0 doc/{src => txt}/angle_cosine_squared.txt | 0 doc/{src => txt}/angle_cross.txt | 0 doc/{src => txt}/angle_dipole.txt | 0 doc/{src => txt}/angle_fourier.txt | 0 doc/{src => txt}/angle_fourier_simple.txt | 0 doc/{src => txt}/angle_harmonic.txt | 0 doc/{src => txt}/angle_hybrid.txt | 0 doc/{src => txt}/angle_mm3.txt | 0 doc/{src => txt}/angle_none.txt | 0 doc/{src => txt}/angle_quartic.txt | 0 doc/{src => txt}/angle_sdk.txt | 0 doc/{src => txt}/angle_style.txt | 0 doc/{src => txt}/angle_table.txt | 0 doc/{src => txt}/angle_zero.txt | 0 doc/{src => txt}/angles.txt | 0 doc/{src => txt}/atom_modify.txt | 0 doc/{src => txt}/atom_style.txt | 0 doc/{src => txt}/balance.txt | 0 doc/{src => txt}/bond_class2.txt | 0 doc/{src => txt}/bond_coeff.txt | 0 doc/{src => txt}/bond_fene.txt | 0 doc/{src => txt}/bond_fene_expand.txt | 0 doc/{src => txt}/bond_gromos.txt | 0 doc/{src => txt}/bond_harmonic.txt | 0 doc/{src => txt}/bond_harmonic_shift.txt | 0 doc/{src => txt}/bond_harmonic_shift_cut.txt | 0 doc/{src => txt}/bond_hybrid.txt | 0 doc/{src => txt}/bond_mm3.txt | 0 doc/{src => txt}/bond_morse.txt | 0 doc/{src => txt}/bond_none.txt | 0 doc/{src => txt}/bond_nonlinear.txt | 0 doc/{src => txt}/bond_oxdna.txt | 0 doc/{src => txt}/bond_quartic.txt | 0 doc/{src => txt}/bond_style.txt | 0 doc/{src => txt}/bond_table.txt | 0 doc/{src => txt}/bond_write.txt | 0 doc/{src => txt}/bond_zero.txt | 0 doc/{src => txt}/bonds.txt | 0 doc/{src => txt}/boundary.txt | 0 doc/{src => txt}/box.txt | 0 doc/{src => txt}/change_box.txt | 0 doc/{src => txt}/clear.txt | 0 doc/{src => txt}/comm_modify.txt | 0 doc/{src => txt}/comm_style.txt | 0 doc/{src => txt}/commands_list.txt | 0 doc/{src => txt}/compute.txt | 0 doc/{src => txt}/compute_ackland_atom.txt | 0 doc/{src => txt}/compute_adf.txt | 0 doc/{src => txt}/compute_angle.txt | 0 doc/{src => txt}/compute_angle_local.txt | 0 doc/{src => txt}/compute_angmom_chunk.txt | 0 doc/{src => txt}/compute_basal_atom.txt | 0 doc/{src => txt}/compute_body_local.txt | 0 doc/{src => txt}/compute_bond.txt | 0 doc/{src => txt}/compute_bond_local.txt | 0 doc/{src => txt}/compute_centro_atom.txt | 0 doc/{src => txt}/compute_chunk_atom.txt | 0 .../compute_chunk_spread_atom.txt | 0 doc/{src => txt}/compute_cluster_atom.txt | 0 doc/{src => txt}/compute_cna_atom.txt | 0 doc/{src => txt}/compute_cnp_atom.txt | 0 doc/{src => txt}/compute_com.txt | 0 doc/{src => txt}/compute_com_chunk.txt | 0 doc/{src => txt}/compute_contact_atom.txt | 0 doc/{src => txt}/compute_coord_atom.txt | 0 doc/{src => txt}/compute_damage_atom.txt | 0 doc/{src => txt}/compute_dihedral.txt | 0 doc/{src => txt}/compute_dihedral_local.txt | 0 doc/{src => txt}/compute_dilatation_atom.txt | 0 doc/{src => txt}/compute_dipole_chunk.txt | 0 doc/{src => txt}/compute_displace_atom.txt | 0 doc/{src => txt}/compute_dpd.txt | 0 doc/{src => txt}/compute_dpd_atom.txt | 0 doc/{src => txt}/compute_edpd_temp_atom.txt | 0 doc/{src => txt}/compute_entropy_atom.txt | 0 doc/{src => txt}/compute_erotate_asphere.txt | 0 doc/{src => txt}/compute_erotate_rigid.txt | 0 doc/{src => txt}/compute_erotate_sphere.txt | 0 .../compute_erotate_sphere_atom.txt | 0 doc/{src => txt}/compute_event_displace.txt | 0 doc/{src => txt}/compute_fep.txt | 0 doc/{src => txt}/compute_global_atom.txt | 0 doc/{src => txt}/compute_group_group.txt | 0 doc/{src => txt}/compute_gyration.txt | 0 doc/{src => txt}/compute_gyration_chunk.txt | 0 doc/{src => txt}/compute_gyration_shape.txt | 0 doc/{src => txt}/compute_heat_flux.txt | 0 doc/{src => txt}/compute_hexorder_atom.txt | 0 doc/{src => txt}/compute_hma.txt | 0 doc/{src => txt}/compute_improper.txt | 0 doc/{src => txt}/compute_improper_local.txt | 0 doc/{src => txt}/compute_inertia_chunk.txt | 0 doc/{src => txt}/compute_ke.txt | 0 doc/{src => txt}/compute_ke_atom.txt | 0 doc/{src => txt}/compute_ke_atom_eff.txt | 0 doc/{src => txt}/compute_ke_eff.txt | 0 doc/{src => txt}/compute_ke_rigid.txt | 0 doc/{src => txt}/compute_meso_e_atom.txt | 0 doc/{src => txt}/compute_meso_rho_atom.txt | 0 doc/{src => txt}/compute_meso_t_atom.txt | 0 doc/{src => txt}/compute_modify.txt | 0 doc/{src => txt}/compute_momentum.txt | 0 doc/{src => txt}/compute_msd.txt | 0 doc/{src => txt}/compute_msd_chunk.txt | 0 doc/{src => txt}/compute_msd_nongauss.txt | 0 doc/{src => txt}/compute_omega_chunk.txt | 0 doc/{src => txt}/compute_orientorder_atom.txt | 0 doc/{src => txt}/compute_pair.txt | 0 doc/{src => txt}/compute_pair_local.txt | 0 doc/{src => txt}/compute_pe.txt | 0 doc/{src => txt}/compute_pe_atom.txt | 0 doc/{src => txt}/compute_plasticity_atom.txt | 0 doc/{src => txt}/compute_pressure.txt | 0 .../compute_pressure_cylinder.txt | 0 doc/{src => txt}/compute_pressure_uef.txt | 0 doc/{src => txt}/compute_property_atom.txt | 0 doc/{src => txt}/compute_property_chunk.txt | 0 doc/{src => txt}/compute_property_local.txt | 0 doc/{src => txt}/compute_ptm_atom.txt | 0 doc/{src => txt}/compute_rdf.txt | 0 doc/{src => txt}/compute_reduce.txt | 0 doc/{src => txt}/compute_reduce_chunk.txt | 0 doc/{src => txt}/compute_rigid_local.txt | 0 doc/{src => txt}/compute_saed.txt | 0 doc/{src => txt}/compute_slice.txt | 0 .../compute_smd_contact_radius.txt | 0 doc/{src => txt}/compute_smd_damage.txt | 0 .../compute_smd_hourglass_error.txt | 0 .../compute_smd_internal_energy.txt | 0 .../compute_smd_plastic_strain.txt | 0 .../compute_smd_plastic_strain_rate.txt | 0 doc/{src => txt}/compute_smd_rho.txt | 0 .../compute_smd_tlsph_defgrad.txt | 0 doc/{src => txt}/compute_smd_tlsph_dt.txt | 0 .../compute_smd_tlsph_num_neighs.txt | 0 doc/{src => txt}/compute_smd_tlsph_shape.txt | 0 doc/{src => txt}/compute_smd_tlsph_strain.txt | 0 .../compute_smd_tlsph_strain_rate.txt | 0 doc/{src => txt}/compute_smd_tlsph_stress.txt | 0 .../compute_smd_triangle_vertices.txt | 0 .../compute_smd_ulsph_num_neighs.txt | 0 doc/{src => txt}/compute_smd_ulsph_strain.txt | 0 .../compute_smd_ulsph_strain_rate.txt | 0 doc/{src => txt}/compute_smd_ulsph_stress.txt | 0 doc/{src => txt}/compute_smd_vol.txt | 0 doc/{src => txt}/compute_sna_atom.txt | 0 doc/{src => txt}/compute_spin.txt | 0 doc/{src => txt}/compute_stress_atom.txt | 0 doc/{src => txt}/compute_stress_mop.txt | 0 doc/{src => txt}/compute_tally.txt | 0 doc/{src => txt}/compute_tdpd_cc_atom.txt | 0 doc/{src => txt}/compute_temp.txt | 0 doc/{src => txt}/compute_temp_asphere.txt | 0 doc/{src => txt}/compute_temp_body.txt | 0 doc/{src => txt}/compute_temp_chunk.txt | 0 doc/{src => txt}/compute_temp_com.txt | 0 doc/{src => txt}/compute_temp_cs.txt | 0 doc/{src => txt}/compute_temp_deform.txt | 0 doc/{src => txt}/compute_temp_deform_eff.txt | 0 doc/{src => txt}/compute_temp_drude.txt | 0 doc/{src => txt}/compute_temp_eff.txt | 0 doc/{src => txt}/compute_temp_partial.txt | 0 doc/{src => txt}/compute_temp_profile.txt | 0 doc/{src => txt}/compute_temp_ramp.txt | 0 doc/{src => txt}/compute_temp_region.txt | 0 doc/{src => txt}/compute_temp_region_eff.txt | 0 doc/{src => txt}/compute_temp_rotate.txt | 0 doc/{src => txt}/compute_temp_sphere.txt | 0 doc/{src => txt}/compute_temp_uef.txt | 0 doc/{src => txt}/compute_ti.txt | 0 doc/{src => txt}/compute_torque_chunk.txt | 0 doc/{src => txt}/compute_vacf.txt | 0 doc/{src => txt}/compute_vcm_chunk.txt | 0 doc/{src => txt}/compute_voronoi_atom.txt | 0 doc/{src => txt}/compute_xrd.txt | 0 doc/{src => txt}/computes.txt | 0 doc/{src => txt}/create_atoms.txt | 0 doc/{src => txt}/create_bonds.txt | 0 doc/{src => txt}/create_box.txt | 0 doc/{src => txt}/delete_atoms.txt | 0 doc/{src => txt}/delete_bonds.txt | 0 doc/{src => txt}/dielectric.txt | 0 doc/{src => txt}/dihedral_charmm.txt | 0 doc/{src => txt}/dihedral_class2.txt | 0 doc/{src => txt}/dihedral_coeff.txt | 0 .../dihedral_cosine_shift_exp.txt | 0 doc/{src => txt}/dihedral_fourier.txt | 0 doc/{src => txt}/dihedral_harmonic.txt | 0 doc/{src => txt}/dihedral_helix.txt | 0 doc/{src => txt}/dihedral_hybrid.txt | 0 doc/{src => txt}/dihedral_multi_harmonic.txt | 0 doc/{src => txt}/dihedral_nharmonic.txt | 0 doc/{src => txt}/dihedral_none.txt | 0 doc/{src => txt}/dihedral_opls.txt | 0 doc/{src => txt}/dihedral_quadratic.txt | 0 doc/{src => txt}/dihedral_spherical.txt | 0 doc/{src => txt}/dihedral_style.txt | 0 doc/{src => txt}/dihedral_table.txt | 0 doc/{src => txt}/dihedral_table_cut.txt | 0 doc/{src => txt}/dihedral_zero.txt | 0 doc/{src => txt}/dihedrals.txt | 0 doc/{src => txt}/dimension.txt | 0 doc/{src => txt}/displace_atoms.txt | 0 doc/{src => txt}/dump.txt | 0 doc/{src => txt}/dump_adios.txt | 0 doc/{src => txt}/dump_cfg_uef.txt | 0 doc/{src => txt}/dump_h5md.txt | 0 doc/{src => txt}/dump_image.txt | 0 doc/{src => txt}/dump_modify.txt | 0 doc/{src => txt}/dump_molfile.txt | 0 doc/{src => txt}/dump_netcdf.txt | 0 doc/{src => txt}/dump_vtk.txt | 0 doc/{src => txt}/dynamical_matrix.txt | 0 doc/{src => txt}/echo.txt | 0 doc/{src => txt}/fix.txt | 0 doc/{src => txt}/fix_adapt.txt | 0 doc/{src => txt}/fix_adapt_fep.txt | 0 doc/{src => txt}/fix_addforce.txt | 0 doc/{src => txt}/fix_addtorque.txt | 0 doc/{src => txt}/fix_append_atoms.txt | 0 doc/{src => txt}/fix_atc.txt | 0 doc/{src => txt}/fix_atom_swap.txt | 0 doc/{src => txt}/fix_ave_atom.txt | 0 doc/{src => txt}/fix_ave_chunk.txt | 0 doc/{src => txt}/fix_ave_correlate.txt | 0 doc/{src => txt}/fix_ave_correlate_long.txt | 0 doc/{src => txt}/fix_ave_histo.txt | 0 doc/{src => txt}/fix_ave_time.txt | 0 doc/{src => txt}/fix_aveforce.txt | 0 doc/{src => txt}/fix_balance.txt | 0 doc/{src => txt}/fix_bocs.txt | 0 doc/{src => txt}/fix_bond_break.txt | 0 doc/{src => txt}/fix_bond_create.txt | 0 doc/{src => txt}/fix_bond_react.txt | 0 doc/{src => txt}/fix_bond_swap.txt | 0 doc/{src => txt}/fix_box_relax.txt | 0 doc/{src => txt}/fix_client_md.txt | 0 doc/{src => txt}/fix_cmap.txt | 0 doc/{src => txt}/fix_colvars.txt | 0 doc/{src => txt}/fix_controller.txt | 0 doc/{src => txt}/fix_deform.txt | 0 doc/{src => txt}/fix_deposit.txt | 0 doc/{src => txt}/fix_dpd_energy.txt | 0 doc/{src => txt}/fix_dpd_source.txt | 0 doc/{src => txt}/fix_drag.txt | 0 doc/{src => txt}/fix_drude.txt | 0 doc/{src => txt}/fix_drude_transform.txt | 0 doc/{src => txt}/fix_dt_reset.txt | 0 doc/{src => txt}/fix_efield.txt | 0 doc/{src => txt}/fix_ehex.txt | 0 doc/{src => txt}/fix_electron_stopping.txt | 0 doc/{src => txt}/fix_enforce2d.txt | 0 doc/{src => txt}/fix_eos_cv.txt | 0 doc/{src => txt}/fix_eos_table.txt | 0 doc/{src => txt}/fix_eos_table_rx.txt | 0 doc/{src => txt}/fix_evaporate.txt | 0 doc/{src => txt}/fix_external.txt | 0 doc/{src => txt}/fix_ffl.txt | 0 doc/{src => txt}/fix_filter_corotate.txt | 0 doc/{src => txt}/fix_flow_gauss.txt | 0 doc/{src => txt}/fix_freeze.txt | 0 doc/{src => txt}/fix_gcmc.txt | 0 doc/{src => txt}/fix_gld.txt | 0 doc/{src => txt}/fix_gle.txt | 0 doc/{src => txt}/fix_gravity.txt | 0 doc/{src => txt}/fix_grem.txt | 0 doc/{src => txt}/fix_halt.txt | 0 doc/{src => txt}/fix_heat.txt | 0 doc/{src => txt}/fix_hyper_global.txt | 0 doc/{src => txt}/fix_hyper_local.txt | 0 doc/{src => txt}/fix_imd.txt | 0 doc/{src => txt}/fix_indent.txt | 0 doc/{src => txt}/fix_ipi.txt | 0 doc/{src => txt}/fix_langevin.txt | 0 doc/{src => txt}/fix_langevin_drude.txt | 0 doc/{src => txt}/fix_langevin_eff.txt | 0 doc/{src => txt}/fix_langevin_spin.txt | 0 doc/{src => txt}/fix_latte.txt | 0 doc/{src => txt}/fix_lb_fluid.txt | 0 doc/{src => txt}/fix_lb_momentum.txt | 0 doc/{src => txt}/fix_lb_pc.txt | 0 doc/{src => txt}/fix_lb_rigid_pc_sphere.txt | 0 doc/{src => txt}/fix_lb_viscous.txt | 0 doc/{src => txt}/fix_lineforce.txt | 0 doc/{src => txt}/fix_manifoldforce.txt | 0 doc/{src => txt}/fix_meso.txt | 0 doc/{src => txt}/fix_meso_move.txt | 0 doc/{src => txt}/fix_meso_stationary.txt | 0 doc/{src => txt}/fix_modify.txt | 0 doc/{src => txt}/fix_momentum.txt | 0 doc/{src => txt}/fix_move.txt | 0 doc/{src => txt}/fix_mscg.txt | 0 doc/{src => txt}/fix_msst.txt | 0 doc/{src => txt}/fix_mvv_dpd.txt | 0 doc/{src => txt}/fix_neb.txt | 0 doc/{src => txt}/fix_neb_spin.txt | 0 doc/{src => txt}/fix_nh.txt | 0 doc/{src => txt}/fix_nh_eff.txt | 0 doc/{src => txt}/fix_nh_uef.txt | 0 doc/{src => txt}/fix_nph_asphere.txt | 0 doc/{src => txt}/fix_nph_body.txt | 0 doc/{src => txt}/fix_nph_sphere.txt | 0 doc/{src => txt}/fix_nphug.txt | 0 doc/{src => txt}/fix_npt_asphere.txt | 0 doc/{src => txt}/fix_npt_body.txt | 0 doc/{src => txt}/fix_npt_sphere.txt | 0 doc/{src => txt}/fix_nve.txt | 0 doc/{src => txt}/fix_nve_asphere.txt | 0 doc/{src => txt}/fix_nve_asphere_noforce.txt | 0 doc/{src => txt}/fix_nve_awpmd.txt | 0 doc/{src => txt}/fix_nve_body.txt | 0 doc/{src => txt}/fix_nve_dot.txt | 0 doc/{src => txt}/fix_nve_dotc_langevin.txt | 0 doc/{src => txt}/fix_nve_eff.txt | 0 doc/{src => txt}/fix_nve_limit.txt | 0 doc/{src => txt}/fix_nve_line.txt | 0 doc/{src => txt}/fix_nve_manifold_rattle.txt | 0 doc/{src => txt}/fix_nve_noforce.txt | 0 doc/{src => txt}/fix_nve_sphere.txt | 0 doc/{src => txt}/fix_nve_spin.txt | 0 doc/{src => txt}/fix_nve_tri.txt | 0 doc/{src => txt}/fix_nvk.txt | 0 doc/{src => txt}/fix_nvt_asphere.txt | 0 doc/{src => txt}/fix_nvt_body.txt | 0 doc/{src => txt}/fix_nvt_manifold_rattle.txt | 0 doc/{src => txt}/fix_nvt_sllod.txt | 0 doc/{src => txt}/fix_nvt_sllod_eff.txt | 0 doc/{src => txt}/fix_nvt_sphere.txt | 0 doc/{src => txt}/fix_oneway.txt | 0 doc/{src => txt}/fix_orient.txt | 0 doc/{src => txt}/fix_phonon.txt | 0 doc/{src => txt}/fix_pimd.txt | 0 doc/{src => txt}/fix_planeforce.txt | 0 doc/{src => txt}/fix_plumed.txt | 0 doc/{src => txt}/fix_poems.txt | 0 doc/{src => txt}/fix_pour.txt | 0 doc/{src => txt}/fix_precession_spin.txt | 0 doc/{src => txt}/fix_press_berendsen.txt | 0 doc/{src => txt}/fix_print.txt | 0 doc/{src => txt}/fix_property_atom.txt | 0 doc/{src => txt}/fix_python_invoke.txt | 0 doc/{src => txt}/fix_python_move.txt | 0 doc/{src => txt}/fix_qbmsst.txt | 0 doc/{src => txt}/fix_qeq.txt | 0 doc/{src => txt}/fix_qeq_comb.txt | 0 doc/{src => txt}/fix_qeq_reax.txt | 0 doc/{src => txt}/fix_qmmm.txt | 0 doc/{src => txt}/fix_qtb.txt | 0 doc/{src => txt}/fix_reaxc_bonds.txt | 0 doc/{src => txt}/fix_reaxc_species.txt | 0 doc/{src => txt}/fix_recenter.txt | 0 doc/{src => txt}/fix_restrain.txt | 0 doc/{src => txt}/fix_rhok.txt | 0 doc/{src => txt}/fix_rigid.txt | 0 doc/{src => txt}/fix_rigid_meso.txt | 0 doc/{src => txt}/fix_rx.txt | 0 doc/{src => txt}/fix_saed_vtk.txt | 0 doc/{src => txt}/fix_setforce.txt | 0 doc/{src => txt}/fix_shake.txt | 0 doc/{src => txt}/fix_shardlow.txt | 0 doc/{src => txt}/fix_smd.txt | 0 doc/{src => txt}/fix_smd_adjust_dt.txt | 0 doc/{src => txt}/fix_smd_integrate_tlsph.txt | 0 doc/{src => txt}/fix_smd_integrate_ulsph.txt | 0 .../fix_smd_move_triangulated_surface.txt | 0 doc/{src => txt}/fix_smd_setvel.txt | 0 doc/{src => txt}/fix_smd_wall_surface.txt | 0 doc/{src => txt}/fix_spring.txt | 0 doc/{src => txt}/fix_spring_chunk.txt | 0 doc/{src => txt}/fix_spring_rg.txt | 0 doc/{src => txt}/fix_spring_self.txt | 0 doc/{src => txt}/fix_srd.txt | 0 doc/{src => txt}/fix_store_force.txt | 0 doc/{src => txt}/fix_store_state.txt | 0 doc/{src => txt}/fix_temp_berendsen.txt | 0 doc/{src => txt}/fix_temp_csvr.txt | 0 doc/{src => txt}/fix_temp_rescale.txt | 0 doc/{src => txt}/fix_temp_rescale_eff.txt | 0 doc/{src => txt}/fix_tfmc.txt | 0 doc/{src => txt}/fix_thermal_conductivity.txt | 0 doc/{src => txt}/fix_ti_spring.txt | 0 doc/{src => txt}/fix_tmd.txt | 0 doc/{src => txt}/fix_ttm.txt | 0 doc/{src => txt}/fix_tune_kspace.txt | 0 doc/{src => txt}/fix_vector.txt | 0 doc/{src => txt}/fix_viscosity.txt | 0 doc/{src => txt}/fix_viscous.txt | 0 doc/{src => txt}/fix_wall.txt | 0 doc/{src => txt}/fix_wall_body_polygon.txt | 0 doc/{src => txt}/fix_wall_body_polyhedron.txt | 0 doc/{src => txt}/fix_wall_ees.txt | 0 doc/{src => txt}/fix_wall_gran.txt | 0 doc/{src => txt}/fix_wall_gran_region.txt | 0 doc/{src => txt}/fix_wall_piston.txt | 0 doc/{src => txt}/fix_wall_reflect.txt | 0 doc/{src => txt}/fix_wall_region.txt | 0 doc/{src => txt}/fix_wall_srd.txt | 0 doc/{src => txt}/fixes.txt | 0 doc/{src => txt}/group.txt | 0 doc/{src => txt}/group2ndx.txt | 0 doc/{src => txt}/hyper.txt | 0 doc/{src => txt}/if.txt | 0 doc/{src => txt}/improper_class2.txt | 0 doc/{src => txt}/improper_coeff.txt | 0 doc/{src => txt}/improper_cossq.txt | 0 doc/{src => txt}/improper_cvff.txt | 0 doc/{src => txt}/improper_distance.txt | 0 doc/{src => txt}/improper_distharm.txt | 0 doc/{src => txt}/improper_fourier.txt | 0 doc/{src => txt}/improper_harmonic.txt | 0 doc/{src => txt}/improper_hybrid.txt | 0 .../improper_inversion_harmonic.txt | 0 doc/{src => txt}/improper_none.txt | 0 doc/{src => txt}/improper_ring.txt | 0 doc/{src => txt}/improper_sqdistharm.txt | 0 doc/{src => txt}/improper_style.txt | 0 doc/{src => txt}/improper_umbrella.txt | 0 doc/{src => txt}/improper_zero.txt | 0 doc/{src => txt}/impropers.txt | 0 doc/{src => txt}/include.txt | 0 doc/{src => txt}/info.txt | 0 doc/{src => txt}/jump.txt | 0 doc/{src => txt}/kim_commands.txt | 0 doc/{src => txt}/kspace_modify.txt | 0 doc/{src => txt}/kspace_style.txt | 0 doc/{src => txt}/label.txt | 0 doc/{src => txt}/lammps.book | 0 doc/{src => txt}/lammps_commands.txt | 0 doc/{src => txt}/lammps_commands_angle.txt | 0 doc/{src => txt}/lammps_commands_atc.txt | 0 doc/{src => txt}/lammps_commands_bond.txt | 0 doc/{src => txt}/lammps_commands_compute.txt | 0 doc/{src => txt}/lammps_commands_dihedral.txt | 0 doc/{src => txt}/lammps_commands_fix.txt | 0 doc/{src => txt}/lammps_commands_improper.txt | 0 doc/{src => txt}/lammps_commands_kspace.txt | 0 doc/{src => txt}/lammps_commands_pair.txt | 0 doc/{src => txt}/lattice.txt | 0 doc/{src => txt}/log.txt | 0 doc/{src => txt}/mass.txt | 0 doc/{src => txt}/message.txt | 0 doc/{src => txt}/min_modify.txt | 0 doc/{src => txt}/min_spin.txt | 0 doc/{src => txt}/min_style.txt | 0 doc/{src => txt}/minimize.txt | 0 doc/{src => txt}/molecule.txt | 0 doc/{src => txt}/neb.txt | 0 doc/{src => txt}/neb_spin.txt | 0 doc/{src => txt}/neigh_modify.txt | 0 doc/{src => txt}/neighbor.txt | 0 doc/{src => txt}/newton.txt | 0 doc/{src => txt}/next.txt | 0 doc/{src => txt}/package.txt | 0 doc/{src => txt}/pair_adp.txt | 0 doc/{src => txt}/pair_agni.txt | 0 doc/{src => txt}/pair_airebo.txt | 0 doc/{src => txt}/pair_atm.txt | 0 doc/{src => txt}/pair_awpmd.txt | 0 doc/{src => txt}/pair_beck.txt | 0 doc/{src => txt}/pair_body_nparticle.txt | 0 .../pair_body_rounded_polygon.txt | 0 .../pair_body_rounded_polyhedron.txt | 0 doc/{src => txt}/pair_bop.txt | 0 doc/{src => txt}/pair_born.txt | 0 doc/{src => txt}/pair_brownian.txt | 0 doc/{src => txt}/pair_buck.txt | 0 doc/{src => txt}/pair_buck6d_coul_gauss.txt | 0 doc/{src => txt}/pair_buck_long.txt | 0 doc/{src => txt}/pair_charmm.txt | 0 doc/{src => txt}/pair_class2.txt | 0 doc/{src => txt}/pair_coeff.txt | 0 doc/{src => txt}/pair_colloid.txt | 0 doc/{src => txt}/pair_comb.txt | 0 doc/{src => txt}/pair_cosine_squared.txt | 0 doc/{src => txt}/pair_coul.txt | 0 doc/{src => txt}/pair_coul_diel.txt | 0 doc/{src => txt}/pair_coul_shield.txt | 0 doc/{src => txt}/pair_cs.txt | 0 doc/{src => txt}/pair_dipole.txt | 0 doc/{src => txt}/pair_dpd.txt | 0 doc/{src => txt}/pair_dpd_fdt.txt | 0 doc/{src => txt}/pair_drip.txt | 0 doc/{src => txt}/pair_dsmc.txt | 0 doc/{src => txt}/pair_e3b.txt | 0 doc/{src => txt}/pair_eam.txt | 0 doc/{src => txt}/pair_edip.txt | 0 doc/{src => txt}/pair_eff.txt | 0 doc/{src => txt}/pair_eim.txt | 0 doc/{src => txt}/pair_exp6_rx.txt | 0 doc/{src => txt}/pair_extep.txt | 0 doc/{src => txt}/pair_fep_soft.txt | 0 doc/{src => txt}/pair_gauss.txt | 0 doc/{src => txt}/pair_gayberne.txt | 0 doc/{src => txt}/pair_gran.txt | 0 doc/{src => txt}/pair_granular.txt | 0 doc/{src => txt}/pair_gromacs.txt | 0 doc/{src => txt}/pair_gw.txt | 0 doc/{src => txt}/pair_hbond_dreiding.txt | 0 doc/{src => txt}/pair_hybrid.txt | 0 doc/{src => txt}/pair_ilp_graphene_hbn.txt | 0 doc/{src => txt}/pair_kim.txt | 0 .../pair_kolmogorov_crespi_full.txt | 0 doc/{src => txt}/pair_kolmogorov_crespi_z.txt | 0 doc/{src => txt}/pair_lcbop.txt | 0 doc/{src => txt}/pair_lebedeva_z.txt | 0 doc/{src => txt}/pair_line_lj.txt | 0 doc/{src => txt}/pair_list.txt | 0 doc/{src => txt}/pair_lj.txt | 0 doc/{src => txt}/pair_lj96.txt | 0 doc/{src => txt}/pair_lj_cubic.txt | 0 doc/{src => txt}/pair_lj_expand.txt | 0 doc/{src => txt}/pair_lj_long.txt | 0 doc/{src => txt}/pair_lj_smooth.txt | 0 doc/{src => txt}/pair_lj_smooth_linear.txt | 0 .../pair_lj_switch3_coulgauss.txt | 0 doc/{src => txt}/pair_local_density.txt | 0 doc/{src => txt}/pair_lubricate.txt | 0 doc/{src => txt}/pair_lubricateU.txt | 0 doc/{src => txt}/pair_mdf.txt | 0 doc/{src => txt}/pair_meam_spline.txt | 0 doc/{src => txt}/pair_meam_sw_spline.txt | 0 doc/{src => txt}/pair_meamc.txt | 0 doc/{src => txt}/pair_meso.txt | 0 doc/{src => txt}/pair_mgpt.txt | 0 doc/{src => txt}/pair_mie.txt | 0 .../pair_mm3_switch3_coulgauss.txt | 0 doc/{src => txt}/pair_modify.txt | 0 doc/{src => txt}/pair_momb.txt | 0 doc/{src => txt}/pair_morse.txt | 0 doc/{src => txt}/pair_multi_lucy.txt | 0 doc/{src => txt}/pair_multi_lucy_rx.txt | 0 doc/{src => txt}/pair_nb3b_harmonic.txt | 0 doc/{src => txt}/pair_nm.txt | 0 doc/{src => txt}/pair_none.txt | 0 doc/{src => txt}/pair_oxdna.txt | 0 doc/{src => txt}/pair_oxdna2.txt | 0 doc/{src => txt}/pair_peri.txt | 0 doc/{src => txt}/pair_polymorphic.txt | 0 doc/{src => txt}/pair_python.txt | 0 doc/{src => txt}/pair_quip.txt | 0 doc/{src => txt}/pair_reaxc.txt | 0 doc/{src => txt}/pair_resquared.txt | 0 doc/{src => txt}/pair_sdk.txt | 0 .../pair_sdpd_taitwater_isothermal.txt | 0 doc/{src => txt}/pair_smd_hertz.txt | 0 doc/{src => txt}/pair_smd_tlsph.txt | 0 .../pair_smd_triangulated_surface.txt | 0 doc/{src => txt}/pair_smd_ulsph.txt | 0 doc/{src => txt}/pair_smtbq.txt | 0 doc/{src => txt}/pair_snap.txt | 0 doc/{src => txt}/pair_soft.txt | 0 doc/{src => txt}/pair_sph_heatconduction.txt | 0 doc/{src => txt}/pair_sph_idealgas.txt | 0 doc/{src => txt}/pair_sph_lj.txt | 0 doc/{src => txt}/pair_sph_rhosum.txt | 0 doc/{src => txt}/pair_sph_taitwater.txt | 0 .../pair_sph_taitwater_morris.txt | 0 doc/{src => txt}/pair_spin_dipole.txt | 0 doc/{src => txt}/pair_spin_dmi.txt | 0 doc/{src => txt}/pair_spin_exchange.txt | 0 doc/{src => txt}/pair_spin_magelec.txt | 0 doc/{src => txt}/pair_spin_neel.txt | 0 doc/{src => txt}/pair_srp.txt | 0 doc/{src => txt}/pair_style.txt | 0 doc/{src => txt}/pair_sw.txt | 0 doc/{src => txt}/pair_table.txt | 0 doc/{src => txt}/pair_table_rx.txt | 0 doc/{src => txt}/pair_tersoff.txt | 0 doc/{src => txt}/pair_tersoff_mod.txt | 0 doc/{src => txt}/pair_tersoff_zbl.txt | 0 doc/{src => txt}/pair_thole.txt | 0 doc/{src => txt}/pair_tri_lj.txt | 0 doc/{src => txt}/pair_ufm.txt | 0 doc/{src => txt}/pair_vashishta.txt | 0 doc/{src => txt}/pair_write.txt | 0 doc/{src => txt}/pair_yukawa.txt | 0 doc/{src => txt}/pair_yukawa_colloid.txt | 0 doc/{src => txt}/pair_zbl.txt | 0 doc/{src => txt}/pair_zero.txt | 0 doc/{src => txt}/pairs.txt | 0 doc/{src => txt}/partition.txt | 0 doc/{src => txt}/prd.txt | 0 doc/{src => txt}/print.txt | 0 doc/{src => txt}/processors.txt | 0 doc/{src => txt}/python.txt | 0 doc/{src => txt}/quit.txt | 0 doc/{src => txt}/read_data.txt | 0 doc/{src => txt}/read_dump.txt | 0 doc/{src => txt}/read_restart.txt | 0 doc/{src => txt}/region.txt | 0 doc/{src => txt}/replicate.txt | 0 doc/{src => txt}/rerun.txt | 0 doc/{src => txt}/reset_ids.txt | 0 doc/{src => txt}/reset_timestep.txt | 0 doc/{src => txt}/restart.txt | 0 doc/{src => txt}/run.txt | 0 doc/{src => txt}/run_style.txt | 0 doc/{src => txt}/server.txt | 0 doc/{src => txt}/server_mc.txt | 0 doc/{src => txt}/server_md.txt | 0 doc/{src => txt}/set.txt | 0 doc/{src => txt}/shell.txt | 0 doc/{src => txt}/special_bonds.txt | 0 doc/{src => txt}/suffix.txt | 0 doc/{src => txt}/tad.txt | 0 doc/{src => txt}/temper.txt | 0 doc/{src => txt}/temper_grem.txt | 0 doc/{src => txt}/temper_npt.txt | 0 doc/{src => txt}/thermo.txt | 0 doc/{src => txt}/thermo_modify.txt | 0 doc/{src => txt}/thermo_style.txt | 0 doc/{src => txt}/third_order.txt | 0 doc/{src => txt}/timer.txt | 0 doc/{src => txt}/timestep.txt | 0 doc/{src => txt}/uncompute.txt | 0 doc/{src => txt}/undump.txt | 0 doc/{src => txt}/unfix.txt | 0 doc/{src => txt}/units.txt | 0 doc/{src => txt}/variable.txt | 0 doc/{src => txt}/velocity.txt | 0 doc/{src => txt}/write_coeff.txt | 0 doc/{src => txt}/write_data.txt | 0 doc/{src => txt}/write_dump.txt | 0 doc/{src => txt}/write_restart.txt | 0 1525 files changed, 12 insertions(+), 13 deletions(-) rename doc/{rst => src}/.gitignore (100%) rename doc/{rst => src}/Build.rst (100%) rename doc/{rst => src}/Build_basics.rst (100%) rename doc/{rst => src}/Build_cmake.rst (100%) rename doc/{rst => src}/Build_development.rst (100%) rename doc/{rst => src}/Build_extras.rst (100%) rename doc/{rst => src}/Build_link.rst (100%) rename doc/{rst => src}/Build_make.rst (100%) rename doc/{rst => src}/Build_package.rst (100%) rename doc/{rst => src}/Build_settings.rst (100%) rename doc/{rst => src}/Build_windows.rst (100%) rename doc/{rst => src}/Commands.rst (100%) rename doc/{rst => src}/Commands_all.rst (100%) rename doc/{rst => src}/Commands_bond.rst (100%) rename doc/{rst => src}/Commands_category.rst (100%) rename doc/{rst => src}/Commands_compute.rst (100%) rename doc/{rst => src}/Commands_fix.rst (100%) rename doc/{rst => src}/Commands_input.rst (100%) rename doc/{rst => src}/Commands_kspace.rst (100%) rename doc/{rst => src}/Commands_pair.rst (100%) rename doc/{rst => src}/Commands_parse.rst (100%) rename doc/{rst => src}/Commands_removed.rst (100%) rename doc/{rst => src}/Commands_structure.rst (100%) rename doc/{rst => src}/Errors.rst (100%) rename doc/{rst => src}/Errors_bugs.rst (100%) rename doc/{rst => src}/Errors_common.rst (100%) rename doc/{rst => src}/Errors_messages.rst (100%) rename doc/{rst => src}/Errors_warnings.rst (100%) rename doc/{rst => src}/Examples.rst (100%) rename doc/{rst => src}/Howto.rst (100%) rename doc/{rst => src}/Howto_2d.rst (100%) rename doc/{rst => src}/Howto_barostat.rst (100%) rename doc/{rst => src}/Howto_bash.rst (100%) rename doc/{rst => src}/Howto_bioFF.rst (100%) rename doc/{rst => src}/Howto_body.rst (100%) rename doc/{rst => src}/Howto_chunk.rst (100%) rename doc/{rst => src}/Howto_client_server.rst (100%) rename doc/{rst => src}/Howto_coreshell.rst (100%) rename doc/{rst => src}/Howto_couple.rst (100%) rename doc/{rst => src}/Howto_diffusion.rst (100%) rename doc/{rst => src}/Howto_dispersion.rst (100%) rename doc/{rst => src}/Howto_drude.rst (100%) rename doc/{rst => src}/Howto_drude2.rst (100%) rename doc/{rst => src}/Howto_elastic.rst (100%) rename doc/{rst => src}/Howto_github.rst (100%) rename doc/{rst => src}/Howto_granular.rst (100%) rename doc/{rst => src}/Howto_kappa.rst (100%) rename doc/{rst => src}/Howto_library.rst (100%) rename doc/{rst => src}/Howto_manifold.rst (100%) rename doc/{rst => src}/Howto_multiple.rst (100%) rename doc/{rst => src}/Howto_nemd.rst (100%) rename doc/{rst => src}/Howto_output.rst (100%) rename doc/{rst => src}/Howto_polarizable.rst (100%) rename doc/{rst => src}/Howto_pylammps.rst (100%) rename doc/{rst => src}/Howto_replica.rst (100%) rename doc/{rst => src}/Howto_restart.rst (100%) rename doc/{rst => src}/Howto_spc.rst (100%) rename doc/{rst => src}/Howto_spherical.rst (100%) rename doc/{rst => src}/Howto_spins.rst (100%) rename doc/{rst => src}/Howto_temperature.rst (100%) rename doc/{rst => src}/Howto_thermostat.rst (100%) rename doc/{rst => src}/Howto_tip3p.rst (100%) rename doc/{rst => src}/Howto_tip4p.rst (100%) rename doc/{rst => src}/Howto_triclinic.rst (100%) rename doc/{rst => src}/Howto_viscosity.rst (100%) rename doc/{rst => src}/Howto_viz.rst (100%) rename doc/{rst => src}/Howto_walls.rst (100%) rename doc/{rst => src}/Install.rst (100%) rename doc/{rst => src}/Install_git.rst (100%) rename doc/{rst => src}/Install_linux.rst (100%) rename doc/{rst => src}/Install_mac.rst (100%) rename doc/{rst => src}/Install_patch.rst (100%) rename doc/{rst => src}/Install_svn.rst (100%) rename doc/{rst => src}/Install_tarball.rst (100%) rename doc/{rst => src}/Install_windows.rst (100%) rename doc/{rst => src}/Intro.rst (100%) rename doc/{rst => src}/Intro_authors.rst (100%) rename doc/{rst => src}/Intro_features.rst (100%) rename doc/{rst => src}/Intro_nonfeatures.rst (100%) rename doc/{rst => src}/Intro_opensource.rst (100%) rename doc/{rst => src}/Intro_overview.rst (100%) rename doc/{rst => src}/Intro_website.rst (100%) rename doc/{rst => src}/Manual.rst (100%) rename doc/{rst => src}/Manual_build.rst (100%) rename doc/{rst => src}/Manual_version.rst (100%) rename doc/{rst => src}/Modify.rst (100%) rename doc/{rst => src}/Modify_atom.rst (100%) rename doc/{rst => src}/Modify_body.rst (100%) rename doc/{rst => src}/Modify_bond.rst (100%) rename doc/{rst => src}/Modify_command.rst (100%) rename doc/{rst => src}/Modify_compute.rst (100%) rename doc/{rst => src}/Modify_contribute.rst (100%) rename doc/{rst => src}/Modify_dump.rst (100%) rename doc/{rst => src}/Modify_fix.rst (100%) rename doc/{rst => src}/Modify_kspace.rst (100%) rename doc/{rst => src}/Modify_min.rst (100%) rename doc/{rst => src}/Modify_overview.rst (100%) rename doc/{rst => src}/Modify_pair.rst (100%) rename doc/{rst => src}/Modify_region.rst (100%) rename doc/{rst => src}/Modify_thermo.rst (100%) rename doc/{rst => src}/Modify_variable.rst (100%) rename doc/{rst => src}/Packages.rst (100%) rename doc/{rst => src}/Packages_details.rst (100%) rename doc/{rst => src}/Packages_standard.rst (100%) rename doc/{rst => src}/Packages_user.rst (100%) rename doc/{rst => src}/Python_call.rst (100%) rename doc/{rst => src}/Python_examples.rst (100%) rename doc/{rst => src}/Python_head.rst (100%) rename doc/{rst => src}/Python_install.rst (100%) rename doc/{rst => src}/Python_library.rst (100%) rename doc/{rst => src}/Python_mpi.rst (100%) rename doc/{rst => src}/Python_overview.rst (100%) rename doc/{rst => src}/Python_pylammps.rst (100%) rename doc/{rst => src}/Python_run.rst (100%) rename doc/{rst => src}/Python_shlib.rst (100%) rename doc/{rst => src}/Python_test.rst (100%) rename doc/{rst => src}/Run_basics.rst (100%) rename doc/{rst => src}/Run_head.rst (100%) rename doc/{rst => src}/Run_options.rst (100%) rename doc/{rst => src}/Run_output.rst (100%) rename doc/{rst => src}/Run_windows.rst (100%) rename doc/{rst => src}/Speed.rst (100%) rename doc/{rst => src}/Speed_bench.rst (100%) rename doc/{rst => src}/Speed_compare.rst (100%) rename doc/{rst => src}/Speed_gpu.rst (100%) rename doc/{rst => src}/Speed_intel.rst (100%) rename doc/{rst => src}/Speed_kokkos.rst (100%) rename doc/{rst => src}/Speed_measure.rst (100%) rename doc/{rst => src}/Speed_omp.rst (100%) rename doc/{rst => src}/Speed_opt.rst (100%) rename doc/{rst => src}/Speed_packages.rst (100%) rename doc/{rst => src}/Speed_tips.rst (100%) rename doc/{rst => src}/Tools.rst (100%) rename doc/{rst => src}/angle_charmm.rst (100%) rename doc/{rst => src}/angle_class2.rst (100%) rename doc/{rst => src}/angle_coeff.rst (100%) rename doc/{rst => src}/angle_cosine.rst (100%) rename doc/{rst => src}/angle_cosine_buck6d.rst (100%) rename doc/{rst => src}/angle_cosine_delta.rst (100%) rename doc/{rst => src}/angle_cosine_periodic.rst (100%) rename doc/{rst => src}/angle_cosine_shift.rst (100%) rename doc/{rst => src}/angle_cosine_shift_exp.rst (100%) rename doc/{rst => src}/angle_cosine_squared.rst (100%) rename doc/{rst => src}/angle_cross.rst (100%) rename doc/{rst => src}/angle_dipole.rst (100%) rename doc/{rst => src}/angle_fourier.rst (100%) rename doc/{rst => src}/angle_fourier_simple.rst (100%) rename doc/{rst => src}/angle_harmonic.rst (100%) rename doc/{rst => src}/angle_hybrid.rst (100%) rename doc/{rst => src}/angle_mm3.rst (100%) rename doc/{rst => src}/angle_none.rst (100%) rename doc/{rst => src}/angle_quartic.rst (100%) rename doc/{rst => src}/angle_sdk.rst (100%) rename doc/{rst => src}/angle_style.rst (100%) rename doc/{rst => src}/angle_table.rst (100%) rename doc/{rst => src}/angle_zero.rst (100%) rename doc/{rst => src}/angles.rst (100%) rename doc/{rst => src}/atom_modify.rst (100%) rename doc/{rst => src}/atom_style.rst (100%) rename doc/{rst => src}/balance.rst (100%) rename doc/{rst => src}/bond_class2.rst (100%) rename doc/{rst => src}/bond_coeff.rst (100%) rename doc/{rst => src}/bond_fene.rst (100%) rename doc/{rst => src}/bond_fene_expand.rst (100%) rename doc/{rst => src}/bond_gromos.rst (100%) rename doc/{rst => src}/bond_harmonic.rst (100%) rename doc/{rst => src}/bond_harmonic_shift.rst (100%) rename doc/{rst => src}/bond_harmonic_shift_cut.rst (100%) rename doc/{rst => src}/bond_hybrid.rst (100%) rename doc/{rst => src}/bond_mm3.rst (100%) rename doc/{rst => src}/bond_morse.rst (100%) rename doc/{rst => src}/bond_none.rst (100%) rename doc/{rst => src}/bond_nonlinear.rst (100%) rename doc/{rst => src}/bond_oxdna.rst (100%) rename doc/{rst => src}/bond_quartic.rst (100%) rename doc/{rst => src}/bond_style.rst (100%) rename doc/{rst => src}/bond_table.rst (100%) rename doc/{rst => src}/bond_write.rst (100%) rename doc/{rst => src}/bond_zero.rst (100%) rename doc/{rst => src}/bonds.rst (100%) rename doc/{rst => src}/boundary.rst (100%) rename doc/{rst => src}/box.rst (100%) rename doc/{rst => src}/change_box.rst (100%) rename doc/{rst => src}/clear.rst (100%) rename doc/{rst => src}/comm_modify.rst (100%) rename doc/{rst => src}/comm_style.rst (100%) rename doc/{rst => src}/commands_list.rst (100%) rename doc/{rst => src}/compute.rst (100%) rename doc/{rst => src}/compute_ackland_atom.rst (100%) rename doc/{rst => src}/compute_adf.rst (100%) rename doc/{rst => src}/compute_angle.rst (100%) rename doc/{rst => src}/compute_angle_local.rst (100%) rename doc/{rst => src}/compute_angmom_chunk.rst (100%) rename doc/{rst => src}/compute_basal_atom.rst (100%) rename doc/{rst => src}/compute_body_local.rst (100%) rename doc/{rst => src}/compute_bond.rst (100%) rename doc/{rst => src}/compute_bond_local.rst (100%) rename doc/{rst => src}/compute_centro_atom.rst (100%) rename doc/{rst => src}/compute_chunk_atom.rst (100%) rename doc/{rst => src}/compute_chunk_spread_atom.rst (100%) rename doc/{rst => src}/compute_cluster_atom.rst (100%) rename doc/{rst => src}/compute_cna_atom.rst (100%) rename doc/{rst => src}/compute_cnp_atom.rst (100%) rename doc/{rst => src}/compute_com.rst (100%) rename doc/{rst => src}/compute_com_chunk.rst (100%) rename doc/{rst => src}/compute_contact_atom.rst (100%) rename doc/{rst => src}/compute_coord_atom.rst (100%) rename doc/{rst => src}/compute_damage_atom.rst (100%) rename doc/{rst => src}/compute_dihedral.rst (100%) rename doc/{rst => src}/compute_dihedral_local.rst (100%) rename doc/{rst => src}/compute_dilatation_atom.rst (100%) rename doc/{rst => src}/compute_dipole_chunk.rst (100%) rename doc/{rst => src}/compute_displace_atom.rst (100%) rename doc/{rst => src}/compute_dpd.rst (100%) rename doc/{rst => src}/compute_dpd_atom.rst (100%) rename doc/{rst => src}/compute_edpd_temp_atom.rst (100%) rename doc/{rst => src}/compute_entropy_atom.rst (100%) rename doc/{rst => src}/compute_erotate_asphere.rst (100%) rename doc/{rst => src}/compute_erotate_rigid.rst (100%) rename doc/{rst => src}/compute_erotate_sphere.rst (100%) rename doc/{rst => src}/compute_erotate_sphere_atom.rst (100%) rename doc/{rst => src}/compute_event_displace.rst (100%) rename doc/{rst => src}/compute_fep.rst (100%) rename doc/{rst => src}/compute_global_atom.rst (100%) rename doc/{rst => src}/compute_group_group.rst (100%) rename doc/{rst => src}/compute_gyration.rst (100%) rename doc/{rst => src}/compute_gyration_chunk.rst (100%) rename doc/{rst => src}/compute_gyration_shape.rst (100%) rename doc/{rst => src}/compute_heat_flux.rst (100%) rename doc/{rst => src}/compute_hexorder_atom.rst (100%) rename doc/{rst => src}/compute_hma.rst (100%) rename doc/{rst => src}/compute_improper.rst (100%) rename doc/{rst => src}/compute_improper_local.rst (100%) rename doc/{rst => src}/compute_inertia_chunk.rst (100%) rename doc/{rst => src}/compute_ke.rst (100%) rename doc/{rst => src}/compute_ke_atom.rst (100%) rename doc/{rst => src}/compute_ke_atom_eff.rst (100%) rename doc/{rst => src}/compute_ke_eff.rst (100%) rename doc/{rst => src}/compute_ke_rigid.rst (100%) rename doc/{rst => src}/compute_meso_e_atom.rst (100%) rename doc/{rst => src}/compute_meso_rho_atom.rst (100%) rename doc/{rst => src}/compute_meso_t_atom.rst (100%) rename doc/{rst => src}/compute_modify.rst (100%) rename doc/{rst => src}/compute_momentum.rst (100%) rename doc/{rst => src}/compute_msd.rst (100%) rename doc/{rst => src}/compute_msd_chunk.rst (100%) rename doc/{rst => src}/compute_msd_nongauss.rst (100%) rename doc/{rst => src}/compute_omega_chunk.rst (100%) rename doc/{rst => src}/compute_orientorder_atom.rst (100%) rename doc/{rst => src}/compute_pair.rst (100%) rename doc/{rst => src}/compute_pair_local.rst (100%) rename doc/{rst => src}/compute_pe.rst (100%) rename doc/{rst => src}/compute_pe_atom.rst (100%) rename doc/{rst => src}/compute_plasticity_atom.rst (100%) rename doc/{rst => src}/compute_pressure.rst (100%) rename doc/{rst => src}/compute_pressure_cylinder.rst (100%) rename doc/{rst => src}/compute_pressure_uef.rst (100%) rename doc/{rst => src}/compute_property_atom.rst (100%) rename doc/{rst => src}/compute_property_chunk.rst (100%) rename doc/{rst => src}/compute_property_local.rst (100%) rename doc/{rst => src}/compute_ptm_atom.rst (100%) rename doc/{rst => src}/compute_rdf.rst (100%) rename doc/{rst => src}/compute_reduce.rst (100%) rename doc/{rst => src}/compute_reduce_chunk.rst (100%) rename doc/{rst => src}/compute_rigid_local.rst (100%) rename doc/{rst => src}/compute_saed.rst (100%) rename doc/{rst => src}/compute_slice.rst (100%) rename doc/{rst => src}/compute_smd_contact_radius.rst (100%) rename doc/{rst => src}/compute_smd_damage.rst (100%) rename doc/{rst => src}/compute_smd_hourglass_error.rst (100%) rename doc/{rst => src}/compute_smd_internal_energy.rst (100%) rename doc/{rst => src}/compute_smd_plastic_strain.rst (100%) rename doc/{rst => src}/compute_smd_plastic_strain_rate.rst (100%) rename doc/{rst => src}/compute_smd_rho.rst (100%) rename doc/{rst => src}/compute_smd_tlsph_defgrad.rst (100%) rename doc/{rst => src}/compute_smd_tlsph_dt.rst (100%) rename doc/{rst => src}/compute_smd_tlsph_num_neighs.rst (100%) rename doc/{rst => src}/compute_smd_tlsph_shape.rst (100%) rename doc/{rst => src}/compute_smd_tlsph_strain.rst (100%) rename doc/{rst => src}/compute_smd_tlsph_strain_rate.rst (100%) rename doc/{rst => src}/compute_smd_tlsph_stress.rst (100%) rename doc/{rst => src}/compute_smd_triangle_vertices.rst (100%) rename doc/{rst => src}/compute_smd_ulsph_num_neighs.rst (100%) rename doc/{rst => src}/compute_smd_ulsph_strain.rst (100%) rename doc/{rst => src}/compute_smd_ulsph_strain_rate.rst (100%) rename doc/{rst => src}/compute_smd_ulsph_stress.rst (100%) rename doc/{rst => src}/compute_smd_vol.rst (100%) rename doc/{rst => src}/compute_sna_atom.rst (100%) rename doc/{rst => src}/compute_spin.rst (100%) rename doc/{rst => src}/compute_stress_atom.rst (100%) rename doc/{rst => src}/compute_stress_mop.rst (100%) rename doc/{rst => src}/compute_tally.rst (100%) rename doc/{rst => src}/compute_tdpd_cc_atom.rst (100%) rename doc/{rst => src}/compute_temp.rst (100%) rename doc/{rst => src}/compute_temp_asphere.rst (100%) rename doc/{rst => src}/compute_temp_body.rst (100%) rename doc/{rst => src}/compute_temp_chunk.rst (100%) rename doc/{rst => src}/compute_temp_com.rst (100%) rename doc/{rst => src}/compute_temp_cs.rst (100%) rename doc/{rst => src}/compute_temp_deform.rst (100%) rename doc/{rst => src}/compute_temp_deform_eff.rst (100%) rename doc/{rst => src}/compute_temp_drude.rst (100%) rename doc/{rst => src}/compute_temp_eff.rst (100%) rename doc/{rst => src}/compute_temp_partial.rst (100%) rename doc/{rst => src}/compute_temp_profile.rst (100%) rename doc/{rst => src}/compute_temp_ramp.rst (100%) rename doc/{rst => src}/compute_temp_region.rst (100%) rename doc/{rst => src}/compute_temp_region_eff.rst (100%) rename doc/{rst => src}/compute_temp_rotate.rst (100%) rename doc/{rst => src}/compute_temp_sphere.rst (100%) rename doc/{rst => src}/compute_temp_uef.rst (100%) rename doc/{rst => src}/compute_ti.rst (100%) rename doc/{rst => src}/compute_torque_chunk.rst (100%) rename doc/{rst => src}/compute_vacf.rst (100%) rename doc/{rst => src}/compute_vcm_chunk.rst (100%) rename doc/{rst => src}/compute_voronoi_atom.rst (100%) rename doc/{rst => src}/compute_xrd.rst (100%) rename doc/{rst => src}/computes.rst (100%) rename doc/{rst => src}/create_atoms.rst (100%) rename doc/{rst => src}/create_bonds.rst (100%) rename doc/{rst => src}/create_box.rst (100%) rename doc/{rst => src}/delete_atoms.rst (100%) rename doc/{rst => src}/delete_bonds.rst (100%) rename doc/{rst => src}/dielectric.rst (100%) rename doc/{rst => src}/dihedral_charmm.rst (100%) rename doc/{rst => src}/dihedral_class2.rst (100%) rename doc/{rst => src}/dihedral_coeff.rst (100%) rename doc/{rst => src}/dihedral_cosine_shift_exp.rst (100%) rename doc/{rst => src}/dihedral_fourier.rst (100%) rename doc/{rst => src}/dihedral_harmonic.rst (100%) rename doc/{rst => src}/dihedral_helix.rst (100%) rename doc/{rst => src}/dihedral_hybrid.rst (100%) rename doc/{rst => src}/dihedral_multi_harmonic.rst (100%) rename doc/{rst => src}/dihedral_nharmonic.rst (100%) rename doc/{rst => src}/dihedral_none.rst (100%) rename doc/{rst => src}/dihedral_opls.rst (100%) rename doc/{rst => src}/dihedral_quadratic.rst (100%) rename doc/{rst => src}/dihedral_spherical.rst (100%) rename doc/{rst => src}/dihedral_style.rst (100%) rename doc/{rst => src}/dihedral_table.rst (100%) rename doc/{rst => src}/dihedral_table_cut.rst (100%) rename doc/{rst => src}/dihedral_zero.rst (100%) rename doc/{rst => src}/dihedrals.rst (100%) rename doc/{rst => src}/dimension.rst (100%) rename doc/{rst => src}/displace_atoms.rst (100%) rename doc/{rst => src}/dump.rst (100%) rename doc/{rst => src}/dump_adios.rst (100%) rename doc/{rst => src}/dump_cfg_uef.rst (100%) rename doc/{rst => src}/dump_h5md.rst (100%) rename doc/{rst => src}/dump_image.rst (100%) rename doc/{rst => src}/dump_modify.rst (100%) rename doc/{rst => src}/dump_molfile.rst (100%) rename doc/{rst => src}/dump_netcdf.rst (100%) rename doc/{rst => src}/dump_vtk.rst (100%) rename doc/{rst => src}/dynamical_matrix.rst (100%) rename doc/{rst => src}/echo.rst (100%) rename doc/{rst => src}/fix.rst (100%) rename doc/{rst => src}/fix_adapt.rst (100%) rename doc/{rst => src}/fix_adapt_fep.rst (100%) rename doc/{rst => src}/fix_addforce.rst (100%) rename doc/{rst => src}/fix_addtorque.rst (100%) rename doc/{rst => src}/fix_append_atoms.rst (100%) rename doc/{rst => src}/fix_atc.rst (100%) rename doc/{rst => src}/fix_atom_swap.rst (100%) rename doc/{rst => src}/fix_ave_atom.rst (100%) rename doc/{rst => src}/fix_ave_chunk.rst (100%) rename doc/{rst => src}/fix_ave_correlate.rst (100%) rename doc/{rst => src}/fix_ave_correlate_long.rst (100%) rename doc/{rst => src}/fix_ave_histo.rst (100%) rename doc/{rst => src}/fix_ave_time.rst (100%) rename doc/{rst => src}/fix_aveforce.rst (100%) rename doc/{rst => src}/fix_balance.rst (100%) rename doc/{rst => src}/fix_bocs.rst (100%) rename doc/{rst => src}/fix_bond_break.rst (100%) rename doc/{rst => src}/fix_bond_create.rst (100%) rename doc/{rst => src}/fix_bond_react.rst (100%) rename doc/{rst => src}/fix_bond_swap.rst (100%) rename doc/{rst => src}/fix_box_relax.rst (100%) rename doc/{rst => src}/fix_client_md.rst (100%) rename doc/{rst => src}/fix_cmap.rst (100%) rename doc/{rst => src}/fix_colvars.rst (100%) rename doc/{rst => src}/fix_controller.rst (100%) rename doc/{rst => src}/fix_deform.rst (100%) rename doc/{rst => src}/fix_deposit.rst (100%) rename doc/{rst => src}/fix_dpd_energy.rst (100%) rename doc/{rst => src}/fix_dpd_source.rst (100%) rename doc/{rst => src}/fix_drag.rst (100%) rename doc/{rst => src}/fix_drude.rst (100%) rename doc/{rst => src}/fix_drude_transform.rst (100%) rename doc/{rst => src}/fix_dt_reset.rst (100%) rename doc/{rst => src}/fix_efield.rst (100%) rename doc/{rst => src}/fix_ehex.rst (100%) rename doc/{rst => src}/fix_electron_stopping.rst (100%) rename doc/{rst => src}/fix_enforce2d.rst (100%) rename doc/{rst => src}/fix_eos_cv.rst (100%) rename doc/{rst => src}/fix_eos_table.rst (100%) rename doc/{rst => src}/fix_eos_table_rx.rst (100%) rename doc/{rst => src}/fix_evaporate.rst (100%) rename doc/{rst => src}/fix_external.rst (100%) rename doc/{rst => src}/fix_ffl.rst (100%) rename doc/{rst => src}/fix_filter_corotate.rst (100%) rename doc/{rst => src}/fix_flow_gauss.rst (100%) rename doc/{rst => src}/fix_freeze.rst (100%) rename doc/{rst => src}/fix_gcmc.rst (100%) rename doc/{rst => src}/fix_gld.rst (100%) rename doc/{rst => src}/fix_gle.rst (100%) rename doc/{rst => src}/fix_gravity.rst (100%) rename doc/{rst => src}/fix_grem.rst (100%) rename doc/{rst => src}/fix_halt.rst (100%) rename doc/{rst => src}/fix_heat.rst (100%) rename doc/{rst => src}/fix_hyper_global.rst (100%) rename doc/{rst => src}/fix_hyper_local.rst (100%) rename doc/{rst => src}/fix_imd.rst (100%) rename doc/{rst => src}/fix_indent.rst (100%) rename doc/{rst => src}/fix_ipi.rst (100%) rename doc/{rst => src}/fix_langevin.rst (100%) rename doc/{rst => src}/fix_langevin_drude.rst (100%) rename doc/{rst => src}/fix_langevin_eff.rst (100%) rename doc/{rst => src}/fix_langevin_spin.rst (100%) rename doc/{rst => src}/fix_latte.rst (100%) rename doc/{rst => src}/fix_lb_fluid.rst (100%) rename doc/{rst => src}/fix_lb_momentum.rst (100%) rename doc/{rst => src}/fix_lb_pc.rst (100%) rename doc/{rst => src}/fix_lb_rigid_pc_sphere.rst (100%) rename doc/{rst => src}/fix_lb_viscous.rst (100%) rename doc/{rst => src}/fix_lineforce.rst (100%) rename doc/{rst => src}/fix_manifoldforce.rst (100%) rename doc/{rst => src}/fix_meso.rst (100%) rename doc/{rst => src}/fix_meso_move.rst (100%) rename doc/{rst => src}/fix_meso_stationary.rst (100%) rename doc/{rst => src}/fix_modify.rst (100%) rename doc/{rst => src}/fix_momentum.rst (100%) rename doc/{rst => src}/fix_move.rst (100%) rename doc/{rst => src}/fix_mscg.rst (100%) rename doc/{rst => src}/fix_msst.rst (100%) rename doc/{rst => src}/fix_mvv_dpd.rst (100%) rename doc/{rst => src}/fix_neb.rst (100%) rename doc/{rst => src}/fix_neb_spin.rst (100%) rename doc/{rst => src}/fix_nh.rst (100%) rename doc/{rst => src}/fix_nh_eff.rst (100%) rename doc/{rst => src}/fix_nh_uef.rst (100%) rename doc/{rst => src}/fix_nph_asphere.rst (100%) rename doc/{rst => src}/fix_nph_body.rst (100%) rename doc/{rst => src}/fix_nph_sphere.rst (100%) rename doc/{rst => src}/fix_nphug.rst (100%) rename doc/{rst => src}/fix_npt_asphere.rst (100%) rename doc/{rst => src}/fix_npt_body.rst (100%) rename doc/{rst => src}/fix_npt_sphere.rst (100%) rename doc/{rst => src}/fix_nve.rst (100%) rename doc/{rst => src}/fix_nve_asphere.rst (100%) rename doc/{rst => src}/fix_nve_asphere_noforce.rst (100%) rename doc/{rst => src}/fix_nve_awpmd.rst (100%) rename doc/{rst => src}/fix_nve_body.rst (100%) rename doc/{rst => src}/fix_nve_dot.rst (100%) rename doc/{rst => src}/fix_nve_dotc_langevin.rst (100%) rename doc/{rst => src}/fix_nve_eff.rst (100%) rename doc/{rst => src}/fix_nve_limit.rst (100%) rename doc/{rst => src}/fix_nve_line.rst (100%) rename doc/{rst => src}/fix_nve_manifold_rattle.rst (100%) rename doc/{rst => src}/fix_nve_noforce.rst (100%) rename doc/{rst => src}/fix_nve_sphere.rst (100%) rename doc/{rst => src}/fix_nve_spin.rst (100%) rename doc/{rst => src}/fix_nve_tri.rst (100%) rename doc/{rst => src}/fix_nvk.rst (100%) rename doc/{rst => src}/fix_nvt_asphere.rst (100%) rename doc/{rst => src}/fix_nvt_body.rst (100%) rename doc/{rst => src}/fix_nvt_manifold_rattle.rst (100%) rename doc/{rst => src}/fix_nvt_sllod.rst (100%) rename doc/{rst => src}/fix_nvt_sllod_eff.rst (100%) rename doc/{rst => src}/fix_nvt_sphere.rst (100%) rename doc/{rst => src}/fix_oneway.rst (100%) rename doc/{rst => src}/fix_orient.rst (100%) rename doc/{rst => src}/fix_phonon.rst (100%) rename doc/{rst => src}/fix_pimd.rst (100%) rename doc/{rst => src}/fix_planeforce.rst (100%) rename doc/{rst => src}/fix_plumed.rst (100%) rename doc/{rst => src}/fix_poems.rst (100%) rename doc/{rst => src}/fix_pour.rst (100%) rename doc/{rst => src}/fix_precession_spin.rst (100%) rename doc/{rst => src}/fix_press_berendsen.rst (100%) rename doc/{rst => src}/fix_print.rst (100%) rename doc/{rst => src}/fix_property_atom.rst (100%) rename doc/{rst => src}/fix_python_invoke.rst (100%) rename doc/{rst => src}/fix_python_move.rst (100%) rename doc/{rst => src}/fix_qbmsst.rst (100%) rename doc/{rst => src}/fix_qeq.rst (100%) rename doc/{rst => src}/fix_qeq_comb.rst (100%) rename doc/{rst => src}/fix_qeq_reax.rst (100%) rename doc/{rst => src}/fix_qmmm.rst (100%) rename doc/{rst => src}/fix_qtb.rst (100%) rename doc/{rst => src}/fix_reaxc_bonds.rst (100%) rename doc/{rst => src}/fix_reaxc_species.rst (100%) rename doc/{rst => src}/fix_recenter.rst (100%) rename doc/{rst => src}/fix_restrain.rst (100%) rename doc/{rst => src}/fix_rhok.rst (100%) rename doc/{rst => src}/fix_rigid.rst (100%) rename doc/{rst => src}/fix_rigid_meso.rst (100%) rename doc/{rst => src}/fix_rx.rst (100%) rename doc/{rst => src}/fix_saed_vtk.rst (100%) rename doc/{rst => src}/fix_setforce.rst (100%) rename doc/{rst => src}/fix_shake.rst (100%) rename doc/{rst => src}/fix_shardlow.rst (100%) rename doc/{rst => src}/fix_smd.rst (100%) rename doc/{rst => src}/fix_smd_adjust_dt.rst (100%) rename doc/{rst => src}/fix_smd_integrate_tlsph.rst (100%) rename doc/{rst => src}/fix_smd_integrate_ulsph.rst (100%) rename doc/{rst => src}/fix_smd_move_triangulated_surface.rst (100%) rename doc/{rst => src}/fix_smd_setvel.rst (100%) rename doc/{rst => src}/fix_smd_wall_surface.rst (100%) rename doc/{rst => src}/fix_spring.rst (100%) rename doc/{rst => src}/fix_spring_chunk.rst (100%) rename doc/{rst => src}/fix_spring_rg.rst (100%) rename doc/{rst => src}/fix_spring_self.rst (100%) rename doc/{rst => src}/fix_srd.rst (100%) rename doc/{rst => src}/fix_store_force.rst (100%) rename doc/{rst => src}/fix_store_state.rst (100%) rename doc/{rst => src}/fix_temp_berendsen.rst (100%) rename doc/{rst => src}/fix_temp_csvr.rst (100%) rename doc/{rst => src}/fix_temp_rescale.rst (100%) rename doc/{rst => src}/fix_temp_rescale_eff.rst (100%) rename doc/{rst => src}/fix_tfmc.rst (100%) rename doc/{rst => src}/fix_thermal_conductivity.rst (100%) rename doc/{rst => src}/fix_ti_spring.rst (100%) rename doc/{rst => src}/fix_tmd.rst (100%) rename doc/{rst => src}/fix_ttm.rst (100%) rename doc/{rst => src}/fix_tune_kspace.rst (100%) rename doc/{rst => src}/fix_vector.rst (100%) rename doc/{rst => src}/fix_viscosity.rst (100%) rename doc/{rst => src}/fix_viscous.rst (100%) rename doc/{rst => src}/fix_wall.rst (100%) rename doc/{rst => src}/fix_wall_body_polygon.rst (100%) rename doc/{rst => src}/fix_wall_body_polyhedron.rst (100%) rename doc/{rst => src}/fix_wall_ees.rst (100%) rename doc/{rst => src}/fix_wall_gran.rst (100%) rename doc/{rst => src}/fix_wall_gran_region.rst (100%) rename doc/{rst => src}/fix_wall_piston.rst (100%) rename doc/{rst => src}/fix_wall_reflect.rst (100%) rename doc/{rst => src}/fix_wall_region.rst (100%) rename doc/{rst => src}/fix_wall_srd.rst (100%) rename doc/{rst => src}/fixes.rst (100%) rename doc/{rst => src}/group.rst (100%) rename doc/{rst => src}/group2ndx.rst (100%) rename doc/{rst => src}/hyper.rst (100%) rename doc/{rst => src}/if.rst (100%) rename doc/{rst => src}/improper_class2.rst (100%) rename doc/{rst => src}/improper_coeff.rst (100%) rename doc/{rst => src}/improper_cossq.rst (100%) rename doc/{rst => src}/improper_cvff.rst (100%) rename doc/{rst => src}/improper_distance.rst (100%) rename doc/{rst => src}/improper_distharm.rst (100%) rename doc/{rst => src}/improper_fourier.rst (100%) rename doc/{rst => src}/improper_harmonic.rst (100%) rename doc/{rst => src}/improper_hybrid.rst (100%) rename doc/{rst => src}/improper_inversion_harmonic.rst (100%) rename doc/{rst => src}/improper_none.rst (100%) rename doc/{rst => src}/improper_ring.rst (100%) rename doc/{rst => src}/improper_sqdistharm.rst (100%) rename doc/{rst => src}/improper_style.rst (100%) rename doc/{rst => src}/improper_umbrella.rst (100%) rename doc/{rst => src}/improper_zero.rst (100%) rename doc/{rst => src}/impropers.rst (100%) rename doc/{rst => src}/include.rst (100%) rename doc/{rst => src}/info.rst (100%) rename doc/{rst => src}/jump.rst (100%) rename doc/{rst => src}/kim_commands.rst (100%) rename doc/{rst => src}/kspace_modify.rst (100%) rename doc/{rst => src}/kspace_style.rst (100%) rename doc/{rst => src}/label.rst (100%) rename doc/{rst => src}/lattice.rst (100%) rename doc/{rst => src}/log.rst (100%) rename doc/{rst => src}/mass.rst (100%) rename doc/{rst => src}/message.rst (100%) rename doc/{rst => src}/min_modify.rst (100%) rename doc/{rst => src}/min_spin.rst (100%) rename doc/{rst => src}/min_style.rst (100%) rename doc/{rst => src}/minimize.rst (100%) rename doc/{rst => src}/molecule.rst (100%) rename doc/{rst => src}/neb.rst (100%) rename doc/{rst => src}/neb_spin.rst (100%) rename doc/{rst => src}/neigh_modify.rst (100%) rename doc/{rst => src}/neighbor.rst (100%) rename doc/{rst => src}/newton.rst (100%) rename doc/{rst => src}/next.rst (100%) rename doc/{rst => src}/package.rst (100%) rename doc/{rst => src}/pair_adp.rst (100%) rename doc/{rst => src}/pair_agni.rst (100%) rename doc/{rst => src}/pair_airebo.rst (100%) rename doc/{rst => src}/pair_atm.rst (100%) rename doc/{rst => src}/pair_awpmd.rst (100%) rename doc/{rst => src}/pair_beck.rst (100%) rename doc/{rst => src}/pair_body_nparticle.rst (100%) rename doc/{rst => src}/pair_body_rounded_polygon.rst (100%) rename doc/{rst => src}/pair_body_rounded_polyhedron.rst (100%) rename doc/{rst => src}/pair_bop.rst (100%) rename doc/{rst => src}/pair_born.rst (100%) rename doc/{rst => src}/pair_brownian.rst (100%) rename doc/{rst => src}/pair_buck.rst (100%) rename doc/{rst => src}/pair_buck6d_coul_gauss.rst (100%) rename doc/{rst => src}/pair_buck_long.rst (100%) rename doc/{rst => src}/pair_charmm.rst (100%) rename doc/{rst => src}/pair_class2.rst (100%) rename doc/{rst => src}/pair_coeff.rst (100%) rename doc/{rst => src}/pair_colloid.rst (100%) rename doc/{rst => src}/pair_comb.rst (100%) rename doc/{rst => src}/pair_cosine_squared.rst (100%) rename doc/{rst => src}/pair_coul.rst (100%) rename doc/{rst => src}/pair_coul_diel.rst (100%) rename doc/{rst => src}/pair_coul_shield.rst (100%) rename doc/{rst => src}/pair_cs.rst (100%) rename doc/{rst => src}/pair_dipole.rst (100%) rename doc/{rst => src}/pair_dpd.rst (100%) rename doc/{rst => src}/pair_dpd_fdt.rst (100%) rename doc/{rst => src}/pair_drip.rst (100%) rename doc/{rst => src}/pair_dsmc.rst (100%) rename doc/{rst => src}/pair_e3b.rst (100%) rename doc/{rst => src}/pair_eam.rst (100%) rename doc/{rst => src}/pair_edip.rst (100%) rename doc/{rst => src}/pair_eff.rst (100%) rename doc/{rst => src}/pair_eim.rst (100%) rename doc/{rst => src}/pair_exp6_rx.rst (100%) rename doc/{rst => src}/pair_extep.rst (100%) rename doc/{rst => src}/pair_fep_soft.rst (100%) rename doc/{rst => src}/pair_gauss.rst (100%) rename doc/{rst => src}/pair_gayberne.rst (100%) rename doc/{rst => src}/pair_gran.rst (100%) rename doc/{rst => src}/pair_granular.rst (100%) rename doc/{rst => src}/pair_gromacs.rst (100%) rename doc/{rst => src}/pair_gw.rst (100%) rename doc/{rst => src}/pair_hbond_dreiding.rst (100%) rename doc/{rst => src}/pair_hybrid.rst (100%) rename doc/{rst => src}/pair_ilp_graphene_hbn.rst (100%) rename doc/{rst => src}/pair_kim.rst (100%) rename doc/{rst => src}/pair_kolmogorov_crespi_full.rst (100%) rename doc/{rst => src}/pair_kolmogorov_crespi_z.rst (100%) rename doc/{rst => src}/pair_lcbop.rst (100%) rename doc/{rst => src}/pair_lebedeva_z.rst (100%) rename doc/{rst => src}/pair_line_lj.rst (100%) rename doc/{rst => src}/pair_list.rst (100%) rename doc/{rst => src}/pair_lj.rst (100%) rename doc/{rst => src}/pair_lj96.rst (100%) rename doc/{rst => src}/pair_lj_cubic.rst (100%) rename doc/{rst => src}/pair_lj_expand.rst (100%) rename doc/{rst => src}/pair_lj_long.rst (100%) rename doc/{rst => src}/pair_lj_smooth.rst (100%) rename doc/{rst => src}/pair_lj_smooth_linear.rst (100%) rename doc/{rst => src}/pair_lj_switch3_coulgauss.rst (100%) rename doc/{rst => src}/pair_local_density.rst (100%) rename doc/{rst => src}/pair_lubricate.rst (100%) rename doc/{rst => src}/pair_lubricateU.rst (100%) rename doc/{rst => src}/pair_mdf.rst (100%) rename doc/{rst => src}/pair_meam_spline.rst (100%) rename doc/{rst => src}/pair_meam_sw_spline.rst (100%) rename doc/{rst => src}/pair_meamc.rst (100%) rename doc/{rst => src}/pair_meso.rst (100%) rename doc/{rst => src}/pair_mgpt.rst (100%) rename doc/{rst => src}/pair_mie.rst (100%) rename doc/{rst => src}/pair_mm3_switch3_coulgauss.rst (100%) rename doc/{rst => src}/pair_modify.rst (100%) rename doc/{rst => src}/pair_momb.rst (100%) rename doc/{rst => src}/pair_morse.rst (100%) rename doc/{rst => src}/pair_multi_lucy.rst (100%) rename doc/{rst => src}/pair_multi_lucy_rx.rst (100%) rename doc/{rst => src}/pair_nb3b_harmonic.rst (100%) rename doc/{rst => src}/pair_nm.rst (100%) rename doc/{rst => src}/pair_none.rst (100%) rename doc/{rst => src}/pair_oxdna.rst (100%) rename doc/{rst => src}/pair_oxdna2.rst (100%) rename doc/{rst => src}/pair_peri.rst (100%) rename doc/{rst => src}/pair_polymorphic.rst (100%) rename doc/{rst => src}/pair_python.rst (100%) rename doc/{rst => src}/pair_quip.rst (100%) rename doc/{rst => src}/pair_reaxc.rst (100%) rename doc/{rst => src}/pair_resquared.rst (100%) rename doc/{rst => src}/pair_sdk.rst (100%) rename doc/{rst => src}/pair_sdpd_taitwater_isothermal.rst (100%) rename doc/{rst => src}/pair_smd_hertz.rst (100%) rename doc/{rst => src}/pair_smd_tlsph.rst (100%) rename doc/{rst => src}/pair_smd_triangulated_surface.rst (100%) rename doc/{rst => src}/pair_smd_ulsph.rst (100%) rename doc/{rst => src}/pair_smtbq.rst (100%) rename doc/{rst => src}/pair_snap.rst (100%) rename doc/{rst => src}/pair_soft.rst (100%) rename doc/{rst => src}/pair_sph_heatconduction.rst (100%) rename doc/{rst => src}/pair_sph_idealgas.rst (100%) rename doc/{rst => src}/pair_sph_lj.rst (100%) rename doc/{rst => src}/pair_sph_rhosum.rst (100%) rename doc/{rst => src}/pair_sph_taitwater.rst (100%) rename doc/{rst => src}/pair_sph_taitwater_morris.rst (100%) rename doc/{rst => src}/pair_spin_dipole.rst (100%) rename doc/{rst => src}/pair_spin_dmi.rst (100%) rename doc/{rst => src}/pair_spin_exchange.rst (100%) rename doc/{rst => src}/pair_spin_magelec.rst (100%) rename doc/{rst => src}/pair_spin_neel.rst (100%) rename doc/{rst => src}/pair_srp.rst (100%) rename doc/{rst => src}/pair_style.rst (100%) rename doc/{rst => src}/pair_sw.rst (100%) rename doc/{rst => src}/pair_table.rst (100%) rename doc/{rst => src}/pair_table_rx.rst (100%) rename doc/{rst => src}/pair_tersoff.rst (100%) rename doc/{rst => src}/pair_tersoff_mod.rst (100%) rename doc/{rst => src}/pair_tersoff_zbl.rst (100%) rename doc/{rst => src}/pair_thole.rst (100%) rename doc/{rst => src}/pair_tri_lj.rst (100%) rename doc/{rst => src}/pair_ufm.rst (100%) rename doc/{rst => src}/pair_vashishta.rst (100%) rename doc/{rst => src}/pair_write.rst (100%) rename doc/{rst => src}/pair_yukawa.rst (100%) rename doc/{rst => src}/pair_yukawa_colloid.rst (100%) rename doc/{rst => src}/pair_zbl.rst (100%) rename doc/{rst => src}/pair_zero.rst (100%) rename doc/{rst => src}/pairs.rst (100%) rename doc/{rst => src}/partition.rst (100%) rename doc/{rst => src}/prd.rst (100%) rename doc/{rst => src}/print.rst (100%) rename doc/{rst => src}/processors.rst (100%) rename doc/{rst => src}/python.rst (100%) rename doc/{rst => src}/quit.rst (100%) rename doc/{rst => src}/read_data.rst (100%) rename doc/{rst => src}/read_dump.rst (100%) rename doc/{rst => src}/read_restart.rst (100%) rename doc/{rst => src}/region.rst (100%) rename doc/{rst => src}/replicate.rst (100%) rename doc/{rst => src}/rerun.rst (100%) rename doc/{rst => src}/reset_ids.rst (100%) rename doc/{rst => src}/reset_timestep.rst (100%) rename doc/{rst => src}/restart.rst (100%) rename doc/{rst => src}/run.rst (100%) rename doc/{rst => src}/run_style.rst (100%) rename doc/{rst => src}/server.rst (100%) rename doc/{rst => src}/server_mc.rst (100%) rename doc/{rst => src}/server_md.rst (100%) rename doc/{rst => src}/set.rst (100%) rename doc/{rst => src}/shell.rst (100%) rename doc/{rst => src}/special_bonds.rst (100%) rename doc/{rst => src}/suffix.rst (100%) rename doc/{rst => src}/tad.rst (100%) rename doc/{rst => src}/temper.rst (100%) rename doc/{rst => src}/temper_grem.rst (100%) rename doc/{rst => src}/temper_npt.rst (100%) rename doc/{rst => src}/thermo.rst (100%) rename doc/{rst => src}/thermo_modify.rst (100%) rename doc/{rst => src}/thermo_style.rst (100%) rename doc/{rst => src}/third_order.rst (100%) rename doc/{rst => src}/timer.rst (100%) rename doc/{rst => src}/timestep.rst (100%) rename doc/{rst => src}/uncompute.rst (100%) rename doc/{rst => src}/undump.rst (100%) rename doc/{rst => src}/unfix.rst (100%) rename doc/{rst => src}/units.rst (100%) rename doc/{rst => src}/variable.rst (100%) rename doc/{rst => src}/velocity.rst (100%) rename doc/{rst => src}/write_coeff.rst (100%) rename doc/{rst => src}/write_data.rst (100%) rename doc/{rst => src}/write_dump.rst (100%) rename doc/{rst => src}/write_restart.rst (100%) rename doc/{src => txt}/Build.txt (100%) rename doc/{src => txt}/Build_basics.txt (100%) rename doc/{src => txt}/Build_cmake.txt (100%) rename doc/{src => txt}/Build_development.txt (100%) rename doc/{src => txt}/Build_extras.txt (100%) rename doc/{src => txt}/Build_link.txt (100%) rename doc/{src => txt}/Build_make.txt (100%) rename doc/{src => txt}/Build_package.txt (100%) rename doc/{src => txt}/Build_settings.txt (100%) rename doc/{src => txt}/Build_windows.txt (100%) rename doc/{src => txt}/Commands.txt (100%) rename doc/{src => txt}/Commands_all.txt (100%) rename doc/{src => txt}/Commands_bond.txt (100%) rename doc/{src => txt}/Commands_category.txt (100%) rename doc/{src => txt}/Commands_compute.txt (100%) rename doc/{src => txt}/Commands_fix.txt (100%) rename doc/{src => txt}/Commands_input.txt (100%) rename doc/{src => txt}/Commands_kspace.txt (100%) rename doc/{src => txt}/Commands_pair.txt (100%) rename doc/{src => txt}/Commands_parse.txt (100%) rename doc/{src => txt}/Commands_removed.txt (100%) rename doc/{src => txt}/Commands_structure.txt (100%) rename doc/{src => txt}/Developer/.gitignore (100%) rename doc/{src => txt}/Developer/classes.fig (100%) rename doc/{src => txt}/Developer/classes.pdf (100%) rename doc/{src => txt}/Developer/developer.tex (100%) rename doc/{src => txt}/Errors.txt (100%) rename doc/{src => txt}/Errors_bugs.txt (100%) rename doc/{src => txt}/Errors_common.txt (100%) rename doc/{src => txt}/Errors_messages.txt (100%) rename doc/{src => txt}/Errors_warnings.txt (100%) rename doc/{src => txt}/Examples.txt (100%) rename doc/{src => txt}/Howto.txt (100%) rename doc/{src => txt}/Howto_2d.txt (100%) rename doc/{src => txt}/Howto_barostat.txt (100%) rename doc/{src => txt}/Howto_bash.txt (100%) rename doc/{src => txt}/Howto_bioFF.txt (100%) rename doc/{src => txt}/Howto_body.txt (100%) rename doc/{src => txt}/Howto_chunk.txt (100%) rename doc/{src => txt}/Howto_client_server.txt (100%) rename doc/{src => txt}/Howto_coreshell.txt (100%) rename doc/{src => txt}/Howto_couple.txt (100%) rename doc/{src => txt}/Howto_diffusion.txt (100%) rename doc/{src => txt}/Howto_dispersion.txt (100%) rename doc/{src => txt}/Howto_drude.txt (100%) rename doc/{src => txt}/Howto_drude2.txt (100%) rename doc/{src => txt}/Howto_elastic.txt (100%) rename doc/{src => txt}/Howto_github.txt (100%) rename doc/{src => txt}/Howto_granular.txt (100%) rename doc/{src => txt}/Howto_kappa.txt (100%) rename doc/{src => txt}/Howto_library.txt (100%) rename doc/{src => txt}/Howto_manifold.txt (100%) rename doc/{src => txt}/Howto_multiple.txt (100%) rename doc/{src => txt}/Howto_nemd.txt (100%) rename doc/{src => txt}/Howto_output.txt (100%) rename doc/{src => txt}/Howto_polarizable.txt (100%) rename doc/{src => txt}/Howto_pylammps.txt (100%) rename doc/{src => txt}/Howto_replica.txt (100%) rename doc/{src => txt}/Howto_restart.txt (100%) rename doc/{src => txt}/Howto_spc.txt (100%) rename doc/{src => txt}/Howto_spherical.txt (100%) rename doc/{src => txt}/Howto_spins.txt (100%) rename doc/{src => txt}/Howto_temperature.txt (100%) rename doc/{src => txt}/Howto_thermostat.txt (100%) rename doc/{src => txt}/Howto_tip3p.txt (100%) rename doc/{src => txt}/Howto_tip4p.txt (100%) rename doc/{src => txt}/Howto_triclinic.txt (100%) rename doc/{src => txt}/Howto_viscosity.txt (100%) rename doc/{src => txt}/Howto_viz.txt (100%) rename doc/{src => txt}/Howto_walls.txt (100%) rename doc/{src => txt}/Install.txt (100%) rename doc/{src => txt}/Install_git.txt (100%) rename doc/{src => txt}/Install_linux.txt (100%) rename doc/{src => txt}/Install_mac.txt (100%) rename doc/{src => txt}/Install_patch.txt (100%) rename doc/{src => txt}/Install_svn.txt (100%) rename doc/{src => txt}/Install_tarball.txt (100%) rename doc/{src => txt}/Install_windows.txt (100%) rename doc/{src => txt}/Intro.txt (100%) rename doc/{src => txt}/Intro_authors.txt (100%) rename doc/{src => txt}/Intro_features.txt (100%) rename doc/{src => txt}/Intro_nonfeatures.txt (100%) rename doc/{src => txt}/Intro_opensource.txt (100%) rename doc/{src => txt}/Intro_overview.txt (100%) rename doc/{src => txt}/Intro_website.txt (100%) rename doc/{src => txt}/Manual.txt (100%) rename doc/{src => txt}/Manual_build.txt (100%) rename doc/{src => txt}/Manual_version.txt (100%) rename doc/{src => txt}/Modify.txt (100%) rename doc/{src => txt}/Modify_atom.txt (100%) rename doc/{src => txt}/Modify_body.txt (100%) rename doc/{src => txt}/Modify_bond.txt (100%) rename doc/{src => txt}/Modify_command.txt (100%) rename doc/{src => txt}/Modify_compute.txt (100%) rename doc/{src => txt}/Modify_contribute.txt (100%) rename doc/{src => txt}/Modify_dump.txt (100%) rename doc/{src => txt}/Modify_fix.txt (100%) rename doc/{src => txt}/Modify_kspace.txt (100%) rename doc/{src => txt}/Modify_min.txt (100%) rename doc/{src => txt}/Modify_overview.txt (100%) rename doc/{src => txt}/Modify_pair.txt (100%) rename doc/{src => txt}/Modify_region.txt (100%) rename doc/{src => txt}/Modify_thermo.txt (100%) rename doc/{src => txt}/Modify_variable.txt (100%) rename doc/{src => txt}/Packages.txt (100%) rename doc/{src => txt}/Packages_details.txt (100%) rename doc/{src => txt}/Packages_standard.txt (100%) rename doc/{src => txt}/Packages_user.txt (100%) rename doc/{src => txt}/Python_call.txt (100%) rename doc/{src => txt}/Python_examples.txt (100%) rename doc/{src => txt}/Python_head.txt (100%) rename doc/{src => txt}/Python_install.txt (100%) rename doc/{src => txt}/Python_library.txt (100%) rename doc/{src => txt}/Python_mpi.txt (100%) rename doc/{src => txt}/Python_overview.txt (100%) rename doc/{src => txt}/Python_pylammps.txt (100%) rename doc/{src => txt}/Python_run.txt (100%) rename doc/{src => txt}/Python_shlib.txt (100%) rename doc/{src => txt}/Python_test.txt (100%) rename doc/{src => txt}/Run_basics.txt (100%) rename doc/{src => txt}/Run_head.txt (100%) rename doc/{src => txt}/Run_options.txt (100%) rename doc/{src => txt}/Run_output.txt (100%) rename doc/{src => txt}/Run_windows.txt (100%) rename doc/{src => txt}/Speed.txt (100%) rename doc/{src => txt}/Speed_bench.txt (100%) rename doc/{src => txt}/Speed_compare.txt (100%) rename doc/{src => txt}/Speed_gpu.txt (100%) rename doc/{src => txt}/Speed_intel.txt (100%) rename doc/{src => txt}/Speed_kokkos.txt (100%) rename doc/{src => txt}/Speed_measure.txt (100%) rename doc/{src => txt}/Speed_omp.txt (100%) rename doc/{src => txt}/Speed_opt.txt (100%) rename doc/{src => txt}/Speed_packages.txt (100%) rename doc/{src => txt}/Speed_tips.txt (100%) rename doc/{src => txt}/Tools.txt (100%) rename doc/{src => txt}/angle_charmm.txt (100%) rename doc/{src => txt}/angle_class2.txt (100%) rename doc/{src => txt}/angle_coeff.txt (100%) rename doc/{src => txt}/angle_cosine.txt (100%) rename doc/{src => txt}/angle_cosine_buck6d.txt (100%) rename doc/{src => txt}/angle_cosine_delta.txt (100%) rename doc/{src => txt}/angle_cosine_periodic.txt (100%) rename doc/{src => txt}/angle_cosine_shift.txt (100%) rename doc/{src => txt}/angle_cosine_shift_exp.txt (100%) rename doc/{src => txt}/angle_cosine_squared.txt (100%) rename doc/{src => txt}/angle_cross.txt (100%) rename doc/{src => txt}/angle_dipole.txt (100%) rename doc/{src => txt}/angle_fourier.txt (100%) rename doc/{src => txt}/angle_fourier_simple.txt (100%) rename doc/{src => txt}/angle_harmonic.txt (100%) rename doc/{src => txt}/angle_hybrid.txt (100%) rename doc/{src => txt}/angle_mm3.txt (100%) rename doc/{src => txt}/angle_none.txt (100%) rename doc/{src => txt}/angle_quartic.txt (100%) rename doc/{src => txt}/angle_sdk.txt (100%) rename doc/{src => txt}/angle_style.txt (100%) rename doc/{src => txt}/angle_table.txt (100%) rename doc/{src => txt}/angle_zero.txt (100%) rename doc/{src => txt}/angles.txt (100%) rename doc/{src => txt}/atom_modify.txt (100%) rename doc/{src => txt}/atom_style.txt (100%) rename doc/{src => txt}/balance.txt (100%) rename doc/{src => txt}/bond_class2.txt (100%) rename doc/{src => txt}/bond_coeff.txt (100%) rename doc/{src => txt}/bond_fene.txt (100%) rename doc/{src => txt}/bond_fene_expand.txt (100%) rename doc/{src => txt}/bond_gromos.txt (100%) rename doc/{src => txt}/bond_harmonic.txt (100%) rename doc/{src => txt}/bond_harmonic_shift.txt (100%) rename doc/{src => txt}/bond_harmonic_shift_cut.txt (100%) rename doc/{src => txt}/bond_hybrid.txt (100%) rename doc/{src => txt}/bond_mm3.txt (100%) rename doc/{src => txt}/bond_morse.txt (100%) rename doc/{src => txt}/bond_none.txt (100%) rename doc/{src => txt}/bond_nonlinear.txt (100%) rename doc/{src => txt}/bond_oxdna.txt (100%) rename doc/{src => txt}/bond_quartic.txt (100%) rename doc/{src => txt}/bond_style.txt (100%) rename doc/{src => txt}/bond_table.txt (100%) rename doc/{src => txt}/bond_write.txt (100%) rename doc/{src => txt}/bond_zero.txt (100%) rename doc/{src => txt}/bonds.txt (100%) rename doc/{src => txt}/boundary.txt (100%) rename doc/{src => txt}/box.txt (100%) rename doc/{src => txt}/change_box.txt (100%) rename doc/{src => txt}/clear.txt (100%) rename doc/{src => txt}/comm_modify.txt (100%) rename doc/{src => txt}/comm_style.txt (100%) rename doc/{src => txt}/commands_list.txt (100%) rename doc/{src => txt}/compute.txt (100%) rename doc/{src => txt}/compute_ackland_atom.txt (100%) rename doc/{src => txt}/compute_adf.txt (100%) rename doc/{src => txt}/compute_angle.txt (100%) rename doc/{src => txt}/compute_angle_local.txt (100%) rename doc/{src => txt}/compute_angmom_chunk.txt (100%) rename doc/{src => txt}/compute_basal_atom.txt (100%) rename doc/{src => txt}/compute_body_local.txt (100%) rename doc/{src => txt}/compute_bond.txt (100%) rename doc/{src => txt}/compute_bond_local.txt (100%) rename doc/{src => txt}/compute_centro_atom.txt (100%) rename doc/{src => txt}/compute_chunk_atom.txt (100%) rename doc/{src => txt}/compute_chunk_spread_atom.txt (100%) rename doc/{src => txt}/compute_cluster_atom.txt (100%) rename doc/{src => txt}/compute_cna_atom.txt (100%) rename doc/{src => txt}/compute_cnp_atom.txt (100%) rename doc/{src => txt}/compute_com.txt (100%) rename doc/{src => txt}/compute_com_chunk.txt (100%) rename doc/{src => txt}/compute_contact_atom.txt (100%) rename doc/{src => txt}/compute_coord_atom.txt (100%) rename doc/{src => txt}/compute_damage_atom.txt (100%) rename doc/{src => txt}/compute_dihedral.txt (100%) rename doc/{src => txt}/compute_dihedral_local.txt (100%) rename doc/{src => txt}/compute_dilatation_atom.txt (100%) rename doc/{src => txt}/compute_dipole_chunk.txt (100%) rename doc/{src => txt}/compute_displace_atom.txt (100%) rename doc/{src => txt}/compute_dpd.txt (100%) rename doc/{src => txt}/compute_dpd_atom.txt (100%) rename doc/{src => txt}/compute_edpd_temp_atom.txt (100%) rename doc/{src => txt}/compute_entropy_atom.txt (100%) rename doc/{src => txt}/compute_erotate_asphere.txt (100%) rename doc/{src => txt}/compute_erotate_rigid.txt (100%) rename doc/{src => txt}/compute_erotate_sphere.txt (100%) rename doc/{src => txt}/compute_erotate_sphere_atom.txt (100%) rename doc/{src => txt}/compute_event_displace.txt (100%) rename doc/{src => txt}/compute_fep.txt (100%) rename doc/{src => txt}/compute_global_atom.txt (100%) rename doc/{src => txt}/compute_group_group.txt (100%) rename doc/{src => txt}/compute_gyration.txt (100%) rename doc/{src => txt}/compute_gyration_chunk.txt (100%) rename doc/{src => txt}/compute_gyration_shape.txt (100%) rename doc/{src => txt}/compute_heat_flux.txt (100%) rename doc/{src => txt}/compute_hexorder_atom.txt (100%) rename doc/{src => txt}/compute_hma.txt (100%) rename doc/{src => txt}/compute_improper.txt (100%) rename doc/{src => txt}/compute_improper_local.txt (100%) rename doc/{src => txt}/compute_inertia_chunk.txt (100%) rename doc/{src => txt}/compute_ke.txt (100%) rename doc/{src => txt}/compute_ke_atom.txt (100%) rename doc/{src => txt}/compute_ke_atom_eff.txt (100%) rename doc/{src => txt}/compute_ke_eff.txt (100%) rename doc/{src => txt}/compute_ke_rigid.txt (100%) rename doc/{src => txt}/compute_meso_e_atom.txt (100%) rename doc/{src => txt}/compute_meso_rho_atom.txt (100%) rename doc/{src => txt}/compute_meso_t_atom.txt (100%) rename doc/{src => txt}/compute_modify.txt (100%) rename doc/{src => txt}/compute_momentum.txt (100%) rename doc/{src => txt}/compute_msd.txt (100%) rename doc/{src => txt}/compute_msd_chunk.txt (100%) rename doc/{src => txt}/compute_msd_nongauss.txt (100%) rename doc/{src => txt}/compute_omega_chunk.txt (100%) rename doc/{src => txt}/compute_orientorder_atom.txt (100%) rename doc/{src => txt}/compute_pair.txt (100%) rename doc/{src => txt}/compute_pair_local.txt (100%) rename doc/{src => txt}/compute_pe.txt (100%) rename doc/{src => txt}/compute_pe_atom.txt (100%) rename doc/{src => txt}/compute_plasticity_atom.txt (100%) rename doc/{src => txt}/compute_pressure.txt (100%) rename doc/{src => txt}/compute_pressure_cylinder.txt (100%) rename doc/{src => txt}/compute_pressure_uef.txt (100%) rename doc/{src => txt}/compute_property_atom.txt (100%) rename doc/{src => txt}/compute_property_chunk.txt (100%) rename doc/{src => txt}/compute_property_local.txt (100%) rename doc/{src => txt}/compute_ptm_atom.txt (100%) rename doc/{src => txt}/compute_rdf.txt (100%) rename doc/{src => txt}/compute_reduce.txt (100%) rename doc/{src => txt}/compute_reduce_chunk.txt (100%) rename doc/{src => txt}/compute_rigid_local.txt (100%) rename doc/{src => txt}/compute_saed.txt (100%) rename doc/{src => txt}/compute_slice.txt (100%) rename doc/{src => txt}/compute_smd_contact_radius.txt (100%) rename doc/{src => txt}/compute_smd_damage.txt (100%) rename doc/{src => txt}/compute_smd_hourglass_error.txt (100%) rename doc/{src => txt}/compute_smd_internal_energy.txt (100%) rename doc/{src => txt}/compute_smd_plastic_strain.txt (100%) rename doc/{src => txt}/compute_smd_plastic_strain_rate.txt (100%) rename doc/{src => txt}/compute_smd_rho.txt (100%) rename doc/{src => txt}/compute_smd_tlsph_defgrad.txt (100%) rename doc/{src => txt}/compute_smd_tlsph_dt.txt (100%) rename doc/{src => txt}/compute_smd_tlsph_num_neighs.txt (100%) rename doc/{src => txt}/compute_smd_tlsph_shape.txt (100%) rename doc/{src => txt}/compute_smd_tlsph_strain.txt (100%) rename doc/{src => txt}/compute_smd_tlsph_strain_rate.txt (100%) rename doc/{src => txt}/compute_smd_tlsph_stress.txt (100%) rename doc/{src => txt}/compute_smd_triangle_vertices.txt (100%) rename doc/{src => txt}/compute_smd_ulsph_num_neighs.txt (100%) rename doc/{src => txt}/compute_smd_ulsph_strain.txt (100%) rename doc/{src => txt}/compute_smd_ulsph_strain_rate.txt (100%) rename doc/{src => txt}/compute_smd_ulsph_stress.txt (100%) rename doc/{src => txt}/compute_smd_vol.txt (100%) rename doc/{src => txt}/compute_sna_atom.txt (100%) rename doc/{src => txt}/compute_spin.txt (100%) rename doc/{src => txt}/compute_stress_atom.txt (100%) rename doc/{src => txt}/compute_stress_mop.txt (100%) rename doc/{src => txt}/compute_tally.txt (100%) rename doc/{src => txt}/compute_tdpd_cc_atom.txt (100%) rename doc/{src => txt}/compute_temp.txt (100%) rename doc/{src => txt}/compute_temp_asphere.txt (100%) rename doc/{src => txt}/compute_temp_body.txt (100%) rename doc/{src => txt}/compute_temp_chunk.txt (100%) rename doc/{src => txt}/compute_temp_com.txt (100%) rename doc/{src => txt}/compute_temp_cs.txt (100%) rename doc/{src => txt}/compute_temp_deform.txt (100%) rename doc/{src => txt}/compute_temp_deform_eff.txt (100%) rename doc/{src => txt}/compute_temp_drude.txt (100%) rename doc/{src => txt}/compute_temp_eff.txt (100%) rename doc/{src => txt}/compute_temp_partial.txt (100%) rename doc/{src => txt}/compute_temp_profile.txt (100%) rename doc/{src => txt}/compute_temp_ramp.txt (100%) rename doc/{src => txt}/compute_temp_region.txt (100%) rename doc/{src => txt}/compute_temp_region_eff.txt (100%) rename doc/{src => txt}/compute_temp_rotate.txt (100%) rename doc/{src => txt}/compute_temp_sphere.txt (100%) rename doc/{src => txt}/compute_temp_uef.txt (100%) rename doc/{src => txt}/compute_ti.txt (100%) rename doc/{src => txt}/compute_torque_chunk.txt (100%) rename doc/{src => txt}/compute_vacf.txt (100%) rename doc/{src => txt}/compute_vcm_chunk.txt (100%) rename doc/{src => txt}/compute_voronoi_atom.txt (100%) rename doc/{src => txt}/compute_xrd.txt (100%) rename doc/{src => txt}/computes.txt (100%) rename doc/{src => txt}/create_atoms.txt (100%) rename doc/{src => txt}/create_bonds.txt (100%) rename doc/{src => txt}/create_box.txt (100%) rename doc/{src => txt}/delete_atoms.txt (100%) rename doc/{src => txt}/delete_bonds.txt (100%) rename doc/{src => txt}/dielectric.txt (100%) rename doc/{src => txt}/dihedral_charmm.txt (100%) rename doc/{src => txt}/dihedral_class2.txt (100%) rename doc/{src => txt}/dihedral_coeff.txt (100%) rename doc/{src => txt}/dihedral_cosine_shift_exp.txt (100%) rename doc/{src => txt}/dihedral_fourier.txt (100%) rename doc/{src => txt}/dihedral_harmonic.txt (100%) rename doc/{src => txt}/dihedral_helix.txt (100%) rename doc/{src => txt}/dihedral_hybrid.txt (100%) rename doc/{src => txt}/dihedral_multi_harmonic.txt (100%) rename doc/{src => txt}/dihedral_nharmonic.txt (100%) rename doc/{src => txt}/dihedral_none.txt (100%) rename doc/{src => txt}/dihedral_opls.txt (100%) rename doc/{src => txt}/dihedral_quadratic.txt (100%) rename doc/{src => txt}/dihedral_spherical.txt (100%) rename doc/{src => txt}/dihedral_style.txt (100%) rename doc/{src => txt}/dihedral_table.txt (100%) rename doc/{src => txt}/dihedral_table_cut.txt (100%) rename doc/{src => txt}/dihedral_zero.txt (100%) rename doc/{src => txt}/dihedrals.txt (100%) rename doc/{src => txt}/dimension.txt (100%) rename doc/{src => txt}/displace_atoms.txt (100%) rename doc/{src => txt}/dump.txt (100%) rename doc/{src => txt}/dump_adios.txt (100%) rename doc/{src => txt}/dump_cfg_uef.txt (100%) rename doc/{src => txt}/dump_h5md.txt (100%) rename doc/{src => txt}/dump_image.txt (100%) rename doc/{src => txt}/dump_modify.txt (100%) rename doc/{src => txt}/dump_molfile.txt (100%) rename doc/{src => txt}/dump_netcdf.txt (100%) rename doc/{src => txt}/dump_vtk.txt (100%) rename doc/{src => txt}/dynamical_matrix.txt (100%) rename doc/{src => txt}/echo.txt (100%) rename doc/{src => txt}/fix.txt (100%) rename doc/{src => txt}/fix_adapt.txt (100%) rename doc/{src => txt}/fix_adapt_fep.txt (100%) rename doc/{src => txt}/fix_addforce.txt (100%) rename doc/{src => txt}/fix_addtorque.txt (100%) rename doc/{src => txt}/fix_append_atoms.txt (100%) rename doc/{src => txt}/fix_atc.txt (100%) rename doc/{src => txt}/fix_atom_swap.txt (100%) rename doc/{src => txt}/fix_ave_atom.txt (100%) rename doc/{src => txt}/fix_ave_chunk.txt (100%) rename doc/{src => txt}/fix_ave_correlate.txt (100%) rename doc/{src => txt}/fix_ave_correlate_long.txt (100%) rename doc/{src => txt}/fix_ave_histo.txt (100%) rename doc/{src => txt}/fix_ave_time.txt (100%) rename doc/{src => txt}/fix_aveforce.txt (100%) rename doc/{src => txt}/fix_balance.txt (100%) rename doc/{src => txt}/fix_bocs.txt (100%) rename doc/{src => txt}/fix_bond_break.txt (100%) rename doc/{src => txt}/fix_bond_create.txt (100%) rename doc/{src => txt}/fix_bond_react.txt (100%) rename doc/{src => txt}/fix_bond_swap.txt (100%) rename doc/{src => txt}/fix_box_relax.txt (100%) rename doc/{src => txt}/fix_client_md.txt (100%) rename doc/{src => txt}/fix_cmap.txt (100%) rename doc/{src => txt}/fix_colvars.txt (100%) rename doc/{src => txt}/fix_controller.txt (100%) rename doc/{src => txt}/fix_deform.txt (100%) rename doc/{src => txt}/fix_deposit.txt (100%) rename doc/{src => txt}/fix_dpd_energy.txt (100%) rename doc/{src => txt}/fix_dpd_source.txt (100%) rename doc/{src => txt}/fix_drag.txt (100%) rename doc/{src => txt}/fix_drude.txt (100%) rename doc/{src => txt}/fix_drude_transform.txt (100%) rename doc/{src => txt}/fix_dt_reset.txt (100%) rename doc/{src => txt}/fix_efield.txt (100%) rename doc/{src => txt}/fix_ehex.txt (100%) rename doc/{src => txt}/fix_electron_stopping.txt (100%) rename doc/{src => txt}/fix_enforce2d.txt (100%) rename doc/{src => txt}/fix_eos_cv.txt (100%) rename doc/{src => txt}/fix_eos_table.txt (100%) rename doc/{src => txt}/fix_eos_table_rx.txt (100%) rename doc/{src => txt}/fix_evaporate.txt (100%) rename doc/{src => txt}/fix_external.txt (100%) rename doc/{src => txt}/fix_ffl.txt (100%) rename doc/{src => txt}/fix_filter_corotate.txt (100%) rename doc/{src => txt}/fix_flow_gauss.txt (100%) rename doc/{src => txt}/fix_freeze.txt (100%) rename doc/{src => txt}/fix_gcmc.txt (100%) rename doc/{src => txt}/fix_gld.txt (100%) rename doc/{src => txt}/fix_gle.txt (100%) rename doc/{src => txt}/fix_gravity.txt (100%) rename doc/{src => txt}/fix_grem.txt (100%) rename doc/{src => txt}/fix_halt.txt (100%) rename doc/{src => txt}/fix_heat.txt (100%) rename doc/{src => txt}/fix_hyper_global.txt (100%) rename doc/{src => txt}/fix_hyper_local.txt (100%) rename doc/{src => txt}/fix_imd.txt (100%) rename doc/{src => txt}/fix_indent.txt (100%) rename doc/{src => txt}/fix_ipi.txt (100%) rename doc/{src => txt}/fix_langevin.txt (100%) rename doc/{src => txt}/fix_langevin_drude.txt (100%) rename doc/{src => txt}/fix_langevin_eff.txt (100%) rename doc/{src => txt}/fix_langevin_spin.txt (100%) rename doc/{src => txt}/fix_latte.txt (100%) rename doc/{src => txt}/fix_lb_fluid.txt (100%) rename doc/{src => txt}/fix_lb_momentum.txt (100%) rename doc/{src => txt}/fix_lb_pc.txt (100%) rename doc/{src => txt}/fix_lb_rigid_pc_sphere.txt (100%) rename doc/{src => txt}/fix_lb_viscous.txt (100%) rename doc/{src => txt}/fix_lineforce.txt (100%) rename doc/{src => txt}/fix_manifoldforce.txt (100%) rename doc/{src => txt}/fix_meso.txt (100%) rename doc/{src => txt}/fix_meso_move.txt (100%) rename doc/{src => txt}/fix_meso_stationary.txt (100%) rename doc/{src => txt}/fix_modify.txt (100%) rename doc/{src => txt}/fix_momentum.txt (100%) rename doc/{src => txt}/fix_move.txt (100%) rename doc/{src => txt}/fix_mscg.txt (100%) rename doc/{src => txt}/fix_msst.txt (100%) rename doc/{src => txt}/fix_mvv_dpd.txt (100%) rename doc/{src => txt}/fix_neb.txt (100%) rename doc/{src => txt}/fix_neb_spin.txt (100%) rename doc/{src => txt}/fix_nh.txt (100%) rename doc/{src => txt}/fix_nh_eff.txt (100%) rename doc/{src => txt}/fix_nh_uef.txt (100%) rename doc/{src => txt}/fix_nph_asphere.txt (100%) rename doc/{src => txt}/fix_nph_body.txt (100%) rename doc/{src => txt}/fix_nph_sphere.txt (100%) rename doc/{src => txt}/fix_nphug.txt (100%) rename doc/{src => txt}/fix_npt_asphere.txt (100%) rename doc/{src => txt}/fix_npt_body.txt (100%) rename doc/{src => txt}/fix_npt_sphere.txt (100%) rename doc/{src => txt}/fix_nve.txt (100%) rename doc/{src => txt}/fix_nve_asphere.txt (100%) rename doc/{src => txt}/fix_nve_asphere_noforce.txt (100%) rename doc/{src => txt}/fix_nve_awpmd.txt (100%) rename doc/{src => txt}/fix_nve_body.txt (100%) rename doc/{src => txt}/fix_nve_dot.txt (100%) rename doc/{src => txt}/fix_nve_dotc_langevin.txt (100%) rename doc/{src => txt}/fix_nve_eff.txt (100%) rename doc/{src => txt}/fix_nve_limit.txt (100%) rename doc/{src => txt}/fix_nve_line.txt (100%) rename doc/{src => txt}/fix_nve_manifold_rattle.txt (100%) rename doc/{src => txt}/fix_nve_noforce.txt (100%) rename doc/{src => txt}/fix_nve_sphere.txt (100%) rename doc/{src => txt}/fix_nve_spin.txt (100%) rename doc/{src => txt}/fix_nve_tri.txt (100%) rename doc/{src => txt}/fix_nvk.txt (100%) rename doc/{src => txt}/fix_nvt_asphere.txt (100%) rename doc/{src => txt}/fix_nvt_body.txt (100%) rename doc/{src => txt}/fix_nvt_manifold_rattle.txt (100%) rename doc/{src => txt}/fix_nvt_sllod.txt (100%) rename doc/{src => txt}/fix_nvt_sllod_eff.txt (100%) rename doc/{src => txt}/fix_nvt_sphere.txt (100%) rename doc/{src => txt}/fix_oneway.txt (100%) rename doc/{src => txt}/fix_orient.txt (100%) rename doc/{src => txt}/fix_phonon.txt (100%) rename doc/{src => txt}/fix_pimd.txt (100%) rename doc/{src => txt}/fix_planeforce.txt (100%) rename doc/{src => txt}/fix_plumed.txt (100%) rename doc/{src => txt}/fix_poems.txt (100%) rename doc/{src => txt}/fix_pour.txt (100%) rename doc/{src => txt}/fix_precession_spin.txt (100%) rename doc/{src => txt}/fix_press_berendsen.txt (100%) rename doc/{src => txt}/fix_print.txt (100%) rename doc/{src => txt}/fix_property_atom.txt (100%) rename doc/{src => txt}/fix_python_invoke.txt (100%) rename doc/{src => txt}/fix_python_move.txt (100%) rename doc/{src => txt}/fix_qbmsst.txt (100%) rename doc/{src => txt}/fix_qeq.txt (100%) rename doc/{src => txt}/fix_qeq_comb.txt (100%) rename doc/{src => txt}/fix_qeq_reax.txt (100%) rename doc/{src => txt}/fix_qmmm.txt (100%) rename doc/{src => txt}/fix_qtb.txt (100%) rename doc/{src => txt}/fix_reaxc_bonds.txt (100%) rename doc/{src => txt}/fix_reaxc_species.txt (100%) rename doc/{src => txt}/fix_recenter.txt (100%) rename doc/{src => txt}/fix_restrain.txt (100%) rename doc/{src => txt}/fix_rhok.txt (100%) rename doc/{src => txt}/fix_rigid.txt (100%) rename doc/{src => txt}/fix_rigid_meso.txt (100%) rename doc/{src => txt}/fix_rx.txt (100%) rename doc/{src => txt}/fix_saed_vtk.txt (100%) rename doc/{src => txt}/fix_setforce.txt (100%) rename doc/{src => txt}/fix_shake.txt (100%) rename doc/{src => txt}/fix_shardlow.txt (100%) rename doc/{src => txt}/fix_smd.txt (100%) rename doc/{src => txt}/fix_smd_adjust_dt.txt (100%) rename doc/{src => txt}/fix_smd_integrate_tlsph.txt (100%) rename doc/{src => txt}/fix_smd_integrate_ulsph.txt (100%) rename doc/{src => txt}/fix_smd_move_triangulated_surface.txt (100%) rename doc/{src => txt}/fix_smd_setvel.txt (100%) rename doc/{src => txt}/fix_smd_wall_surface.txt (100%) rename doc/{src => txt}/fix_spring.txt (100%) rename doc/{src => txt}/fix_spring_chunk.txt (100%) rename doc/{src => txt}/fix_spring_rg.txt (100%) rename doc/{src => txt}/fix_spring_self.txt (100%) rename doc/{src => txt}/fix_srd.txt (100%) rename doc/{src => txt}/fix_store_force.txt (100%) rename doc/{src => txt}/fix_store_state.txt (100%) rename doc/{src => txt}/fix_temp_berendsen.txt (100%) rename doc/{src => txt}/fix_temp_csvr.txt (100%) rename doc/{src => txt}/fix_temp_rescale.txt (100%) rename doc/{src => txt}/fix_temp_rescale_eff.txt (100%) rename doc/{src => txt}/fix_tfmc.txt (100%) rename doc/{src => txt}/fix_thermal_conductivity.txt (100%) rename doc/{src => txt}/fix_ti_spring.txt (100%) rename doc/{src => txt}/fix_tmd.txt (100%) rename doc/{src => txt}/fix_ttm.txt (100%) rename doc/{src => txt}/fix_tune_kspace.txt (100%) rename doc/{src => txt}/fix_vector.txt (100%) rename doc/{src => txt}/fix_viscosity.txt (100%) rename doc/{src => txt}/fix_viscous.txt (100%) rename doc/{src => txt}/fix_wall.txt (100%) rename doc/{src => txt}/fix_wall_body_polygon.txt (100%) rename doc/{src => txt}/fix_wall_body_polyhedron.txt (100%) rename doc/{src => txt}/fix_wall_ees.txt (100%) rename doc/{src => txt}/fix_wall_gran.txt (100%) rename doc/{src => txt}/fix_wall_gran_region.txt (100%) rename doc/{src => txt}/fix_wall_piston.txt (100%) rename doc/{src => txt}/fix_wall_reflect.txt (100%) rename doc/{src => txt}/fix_wall_region.txt (100%) rename doc/{src => txt}/fix_wall_srd.txt (100%) rename doc/{src => txt}/fixes.txt (100%) rename doc/{src => txt}/group.txt (100%) rename doc/{src => txt}/group2ndx.txt (100%) rename doc/{src => txt}/hyper.txt (100%) rename doc/{src => txt}/if.txt (100%) rename doc/{src => txt}/improper_class2.txt (100%) rename doc/{src => txt}/improper_coeff.txt (100%) rename doc/{src => txt}/improper_cossq.txt (100%) rename doc/{src => txt}/improper_cvff.txt (100%) rename doc/{src => txt}/improper_distance.txt (100%) rename doc/{src => txt}/improper_distharm.txt (100%) rename doc/{src => txt}/improper_fourier.txt (100%) rename doc/{src => txt}/improper_harmonic.txt (100%) rename doc/{src => txt}/improper_hybrid.txt (100%) rename doc/{src => txt}/improper_inversion_harmonic.txt (100%) rename doc/{src => txt}/improper_none.txt (100%) rename doc/{src => txt}/improper_ring.txt (100%) rename doc/{src => txt}/improper_sqdistharm.txt (100%) rename doc/{src => txt}/improper_style.txt (100%) rename doc/{src => txt}/improper_umbrella.txt (100%) rename doc/{src => txt}/improper_zero.txt (100%) rename doc/{src => txt}/impropers.txt (100%) rename doc/{src => txt}/include.txt (100%) rename doc/{src => txt}/info.txt (100%) rename doc/{src => txt}/jump.txt (100%) rename doc/{src => txt}/kim_commands.txt (100%) rename doc/{src => txt}/kspace_modify.txt (100%) rename doc/{src => txt}/kspace_style.txt (100%) rename doc/{src => txt}/label.txt (100%) rename doc/{src => txt}/lammps.book (100%) rename doc/{src => txt}/lammps_commands.txt (100%) rename doc/{src => txt}/lammps_commands_angle.txt (100%) rename doc/{src => txt}/lammps_commands_atc.txt (100%) rename doc/{src => txt}/lammps_commands_bond.txt (100%) rename doc/{src => txt}/lammps_commands_compute.txt (100%) rename doc/{src => txt}/lammps_commands_dihedral.txt (100%) rename doc/{src => txt}/lammps_commands_fix.txt (100%) rename doc/{src => txt}/lammps_commands_improper.txt (100%) rename doc/{src => txt}/lammps_commands_kspace.txt (100%) rename doc/{src => txt}/lammps_commands_pair.txt (100%) rename doc/{src => txt}/lattice.txt (100%) rename doc/{src => txt}/log.txt (100%) rename doc/{src => txt}/mass.txt (100%) rename doc/{src => txt}/message.txt (100%) rename doc/{src => txt}/min_modify.txt (100%) rename doc/{src => txt}/min_spin.txt (100%) rename doc/{src => txt}/min_style.txt (100%) rename doc/{src => txt}/minimize.txt (100%) rename doc/{src => txt}/molecule.txt (100%) rename doc/{src => txt}/neb.txt (100%) rename doc/{src => txt}/neb_spin.txt (100%) rename doc/{src => txt}/neigh_modify.txt (100%) rename doc/{src => txt}/neighbor.txt (100%) rename doc/{src => txt}/newton.txt (100%) rename doc/{src => txt}/next.txt (100%) rename doc/{src => txt}/package.txt (100%) rename doc/{src => txt}/pair_adp.txt (100%) rename doc/{src => txt}/pair_agni.txt (100%) rename doc/{src => txt}/pair_airebo.txt (100%) rename doc/{src => txt}/pair_atm.txt (100%) rename doc/{src => txt}/pair_awpmd.txt (100%) rename doc/{src => txt}/pair_beck.txt (100%) rename doc/{src => txt}/pair_body_nparticle.txt (100%) rename doc/{src => txt}/pair_body_rounded_polygon.txt (100%) rename doc/{src => txt}/pair_body_rounded_polyhedron.txt (100%) rename doc/{src => txt}/pair_bop.txt (100%) rename doc/{src => txt}/pair_born.txt (100%) rename doc/{src => txt}/pair_brownian.txt (100%) rename doc/{src => txt}/pair_buck.txt (100%) rename doc/{src => txt}/pair_buck6d_coul_gauss.txt (100%) rename doc/{src => txt}/pair_buck_long.txt (100%) rename doc/{src => txt}/pair_charmm.txt (100%) rename doc/{src => txt}/pair_class2.txt (100%) rename doc/{src => txt}/pair_coeff.txt (100%) rename doc/{src => txt}/pair_colloid.txt (100%) rename doc/{src => txt}/pair_comb.txt (100%) rename doc/{src => txt}/pair_cosine_squared.txt (100%) rename doc/{src => txt}/pair_coul.txt (100%) rename doc/{src => txt}/pair_coul_diel.txt (100%) rename doc/{src => txt}/pair_coul_shield.txt (100%) rename doc/{src => txt}/pair_cs.txt (100%) rename doc/{src => txt}/pair_dipole.txt (100%) rename doc/{src => txt}/pair_dpd.txt (100%) rename doc/{src => txt}/pair_dpd_fdt.txt (100%) rename doc/{src => txt}/pair_drip.txt (100%) rename doc/{src => txt}/pair_dsmc.txt (100%) rename doc/{src => txt}/pair_e3b.txt (100%) rename doc/{src => txt}/pair_eam.txt (100%) rename doc/{src => txt}/pair_edip.txt (100%) rename doc/{src => txt}/pair_eff.txt (100%) rename doc/{src => txt}/pair_eim.txt (100%) rename doc/{src => txt}/pair_exp6_rx.txt (100%) rename doc/{src => txt}/pair_extep.txt (100%) rename doc/{src => txt}/pair_fep_soft.txt (100%) rename doc/{src => txt}/pair_gauss.txt (100%) rename doc/{src => txt}/pair_gayberne.txt (100%) rename doc/{src => txt}/pair_gran.txt (100%) rename doc/{src => txt}/pair_granular.txt (100%) rename doc/{src => txt}/pair_gromacs.txt (100%) rename doc/{src => txt}/pair_gw.txt (100%) rename doc/{src => txt}/pair_hbond_dreiding.txt (100%) rename doc/{src => txt}/pair_hybrid.txt (100%) rename doc/{src => txt}/pair_ilp_graphene_hbn.txt (100%) rename doc/{src => txt}/pair_kim.txt (100%) rename doc/{src => txt}/pair_kolmogorov_crespi_full.txt (100%) rename doc/{src => txt}/pair_kolmogorov_crespi_z.txt (100%) rename doc/{src => txt}/pair_lcbop.txt (100%) rename doc/{src => txt}/pair_lebedeva_z.txt (100%) rename doc/{src => txt}/pair_line_lj.txt (100%) rename doc/{src => txt}/pair_list.txt (100%) rename doc/{src => txt}/pair_lj.txt (100%) rename doc/{src => txt}/pair_lj96.txt (100%) rename doc/{src => txt}/pair_lj_cubic.txt (100%) rename doc/{src => txt}/pair_lj_expand.txt (100%) rename doc/{src => txt}/pair_lj_long.txt (100%) rename doc/{src => txt}/pair_lj_smooth.txt (100%) rename doc/{src => txt}/pair_lj_smooth_linear.txt (100%) rename doc/{src => txt}/pair_lj_switch3_coulgauss.txt (100%) rename doc/{src => txt}/pair_local_density.txt (100%) rename doc/{src => txt}/pair_lubricate.txt (100%) rename doc/{src => txt}/pair_lubricateU.txt (100%) rename doc/{src => txt}/pair_mdf.txt (100%) rename doc/{src => txt}/pair_meam_spline.txt (100%) rename doc/{src => txt}/pair_meam_sw_spline.txt (100%) rename doc/{src => txt}/pair_meamc.txt (100%) rename doc/{src => txt}/pair_meso.txt (100%) rename doc/{src => txt}/pair_mgpt.txt (100%) rename doc/{src => txt}/pair_mie.txt (100%) rename doc/{src => txt}/pair_mm3_switch3_coulgauss.txt (100%) rename doc/{src => txt}/pair_modify.txt (100%) rename doc/{src => txt}/pair_momb.txt (100%) rename doc/{src => txt}/pair_morse.txt (100%) rename doc/{src => txt}/pair_multi_lucy.txt (100%) rename doc/{src => txt}/pair_multi_lucy_rx.txt (100%) rename doc/{src => txt}/pair_nb3b_harmonic.txt (100%) rename doc/{src => txt}/pair_nm.txt (100%) rename doc/{src => txt}/pair_none.txt (100%) rename doc/{src => txt}/pair_oxdna.txt (100%) rename doc/{src => txt}/pair_oxdna2.txt (100%) rename doc/{src => txt}/pair_peri.txt (100%) rename doc/{src => txt}/pair_polymorphic.txt (100%) rename doc/{src => txt}/pair_python.txt (100%) rename doc/{src => txt}/pair_quip.txt (100%) rename doc/{src => txt}/pair_reaxc.txt (100%) rename doc/{src => txt}/pair_resquared.txt (100%) rename doc/{src => txt}/pair_sdk.txt (100%) rename doc/{src => txt}/pair_sdpd_taitwater_isothermal.txt (100%) rename doc/{src => txt}/pair_smd_hertz.txt (100%) rename doc/{src => txt}/pair_smd_tlsph.txt (100%) rename doc/{src => txt}/pair_smd_triangulated_surface.txt (100%) rename doc/{src => txt}/pair_smd_ulsph.txt (100%) rename doc/{src => txt}/pair_smtbq.txt (100%) rename doc/{src => txt}/pair_snap.txt (100%) rename doc/{src => txt}/pair_soft.txt (100%) rename doc/{src => txt}/pair_sph_heatconduction.txt (100%) rename doc/{src => txt}/pair_sph_idealgas.txt (100%) rename doc/{src => txt}/pair_sph_lj.txt (100%) rename doc/{src => txt}/pair_sph_rhosum.txt (100%) rename doc/{src => txt}/pair_sph_taitwater.txt (100%) rename doc/{src => txt}/pair_sph_taitwater_morris.txt (100%) rename doc/{src => txt}/pair_spin_dipole.txt (100%) rename doc/{src => txt}/pair_spin_dmi.txt (100%) rename doc/{src => txt}/pair_spin_exchange.txt (100%) rename doc/{src => txt}/pair_spin_magelec.txt (100%) rename doc/{src => txt}/pair_spin_neel.txt (100%) rename doc/{src => txt}/pair_srp.txt (100%) rename doc/{src => txt}/pair_style.txt (100%) rename doc/{src => txt}/pair_sw.txt (100%) rename doc/{src => txt}/pair_table.txt (100%) rename doc/{src => txt}/pair_table_rx.txt (100%) rename doc/{src => txt}/pair_tersoff.txt (100%) rename doc/{src => txt}/pair_tersoff_mod.txt (100%) rename doc/{src => txt}/pair_tersoff_zbl.txt (100%) rename doc/{src => txt}/pair_thole.txt (100%) rename doc/{src => txt}/pair_tri_lj.txt (100%) rename doc/{src => txt}/pair_ufm.txt (100%) rename doc/{src => txt}/pair_vashishta.txt (100%) rename doc/{src => txt}/pair_write.txt (100%) rename doc/{src => txt}/pair_yukawa.txt (100%) rename doc/{src => txt}/pair_yukawa_colloid.txt (100%) rename doc/{src => txt}/pair_zbl.txt (100%) rename doc/{src => txt}/pair_zero.txt (100%) rename doc/{src => txt}/pairs.txt (100%) rename doc/{src => txt}/partition.txt (100%) rename doc/{src => txt}/prd.txt (100%) rename doc/{src => txt}/print.txt (100%) rename doc/{src => txt}/processors.txt (100%) rename doc/{src => txt}/python.txt (100%) rename doc/{src => txt}/quit.txt (100%) rename doc/{src => txt}/read_data.txt (100%) rename doc/{src => txt}/read_dump.txt (100%) rename doc/{src => txt}/read_restart.txt (100%) rename doc/{src => txt}/region.txt (100%) rename doc/{src => txt}/replicate.txt (100%) rename doc/{src => txt}/rerun.txt (100%) rename doc/{src => txt}/reset_ids.txt (100%) rename doc/{src => txt}/reset_timestep.txt (100%) rename doc/{src => txt}/restart.txt (100%) rename doc/{src => txt}/run.txt (100%) rename doc/{src => txt}/run_style.txt (100%) rename doc/{src => txt}/server.txt (100%) rename doc/{src => txt}/server_mc.txt (100%) rename doc/{src => txt}/server_md.txt (100%) rename doc/{src => txt}/set.txt (100%) rename doc/{src => txt}/shell.txt (100%) rename doc/{src => txt}/special_bonds.txt (100%) rename doc/{src => txt}/suffix.txt (100%) rename doc/{src => txt}/tad.txt (100%) rename doc/{src => txt}/temper.txt (100%) rename doc/{src => txt}/temper_grem.txt (100%) rename doc/{src => txt}/temper_npt.txt (100%) rename doc/{src => txt}/thermo.txt (100%) rename doc/{src => txt}/thermo_modify.txt (100%) rename doc/{src => txt}/thermo_style.txt (100%) rename doc/{src => txt}/third_order.txt (100%) rename doc/{src => txt}/timer.txt (100%) rename doc/{src => txt}/timestep.txt (100%) rename doc/{src => txt}/uncompute.txt (100%) rename doc/{src => txt}/undump.txt (100%) rename doc/{src => txt}/unfix.txt (100%) rename doc/{src => txt}/units.txt (100%) rename doc/{src => txt}/variable.txt (100%) rename doc/{src => txt}/velocity.txt (100%) rename doc/{src => txt}/write_coeff.txt (100%) rename doc/{src => txt}/write_data.txt (100%) rename doc/{src => txt}/write_dump.txt (100%) rename doc/{src => txt}/write_restart.txt (100%) diff --git a/doc/Makefile b/doc/Makefile index fc5e930121..5dcb070f4f 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,11 +1,12 @@ # Makefile for LAMMPS documentation SHELL = /bin/bash -BUILDDIR = ${PWD} -RSTDIR = $(BUILDDIR)/rst +BUILDDIR = ${CURDIR} +RSTDIR = $(BUILDDIR)/src +TXTDIR = $(BUILDDIR)/txt VENV = $(BUILDDIR)/docenv TXT2RST = $(VENV)/bin/txt2rst -ANCHORCHECK = $(VENV)/bin/doc_anchor_check +ANCHORCHECK = $(VENV)/bin/rst_anchor_check PYTHON = $(shell which python3) VIRTUALENV = virtualenv @@ -27,8 +28,8 @@ HAS_VIRTUALENV = YES endif SPHINXEXTRA = -j $(shell $(PYTHON) -c 'import multiprocessing;print(multiprocessing.cpu_count())') -SOURCES=$(filter-out $(wildcard src/lammps_commands*.txt) src/lammps_support.txt src/lammps_tutorials.txt,$(wildcard src/*.txt)) -OBJECTS=$(SOURCES:src/%.txt=$(RSTDIR)/%.rst) +SOURCES=$(filter-out $(wildcard $(TXTDIR)/lammps_commands*.txt) $(TXTDIR)/lammps_support.txt $(TXTDIR)/lammps_tutorials.txt,$(wildcard $(TXTDIR)/*.txt)) +OBJECTS=$(SOURCES:$(TXTDIR)/%.txt=$(RSTDIR)/%.rst) .PHONY: help clean-all clean epub mobi rst html pdf venv spelling anchor_check @@ -53,7 +54,7 @@ clean-all: clean rm -rf $(BUILDDIR)/docenv $(BUILDDIR)/doctrees clean: - rm -rf $(RSTDIR)/{Eqs,JPG,*.rst} html epub latex + rm -rf html epub latex rm -rf spelling clean-spelling: @@ -64,12 +65,10 @@ rst: clean $(OBJECTS) $(ANCHORCHECK) html: $(OBJECTS) $(ANCHORCHECK) @(\ . $(VENV)/bin/activate ;\ - cp -r src/JPG $(RSTDIR)/ ;\ - cp -r src/Eqs $(RSTDIR)/ ;\ sphinx-build $(SPHINXEXTRA) -b html -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) html ;\ echo "############################################" ;\ - doc_anchor_check src/*.txt ;\ - env LC_ALL=C grep -n '[^ -~]' src/*.txt ;\ + rst_anchor_check src/*.rst ;\ + env LC_ALL=C grep -n '[^ -~]' $(RSTDIR)/*.rst ;\ echo "############################################" ;\ deactivate ;\ ) @@ -89,7 +88,7 @@ spelling: $(OBJECTS) utils/sphinx-config/false_positives.txt @(\ . $(VENV)/bin/activate ;\ pip install sphinxcontrib-spelling ;\ - cp utils/sphinx-config/false_positives.txt $(RSTDIR)/ ;\ + cp utils/sphinx-config/false_positives.txt $(RSTDIR)/ ;\ sphinx-build -b spelling -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) spelling ;\ deactivate ;\ ) @@ -126,7 +125,7 @@ pdf: $(OBJECTS) $(ANCHORCHECK) . $(VENV)/bin/activate ;\ sphinx-build $(SPHINXEXTRA) -b latex -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) latex ;\ echo "############################################" ;\ - doc_anchor_check src/*.txt ;\ + rst_anchor_check src/*.rst ;\ echo "############################################" ;\ deactivate ;\ ) @@ -163,7 +162,7 @@ fetch: anchor_check : $(ANCHORCHECK) @(\ . $(VENV)/bin/activate ;\ - doc_anchor_check src/*.txt ;\ + rst_anchor_check src/*.txt ;\ deactivate ;\ ) diff --git a/doc/rst/.gitignore b/doc/src/.gitignore similarity index 100% rename from doc/rst/.gitignore rename to doc/src/.gitignore diff --git a/doc/rst/Build.rst b/doc/src/Build.rst similarity index 100% rename from doc/rst/Build.rst rename to doc/src/Build.rst diff --git a/doc/rst/Build_basics.rst b/doc/src/Build_basics.rst similarity index 100% rename from doc/rst/Build_basics.rst rename to doc/src/Build_basics.rst diff --git a/doc/rst/Build_cmake.rst b/doc/src/Build_cmake.rst similarity index 100% rename from doc/rst/Build_cmake.rst rename to doc/src/Build_cmake.rst diff --git a/doc/rst/Build_development.rst b/doc/src/Build_development.rst similarity index 100% rename from doc/rst/Build_development.rst rename to doc/src/Build_development.rst diff --git a/doc/rst/Build_extras.rst b/doc/src/Build_extras.rst similarity index 100% rename from doc/rst/Build_extras.rst rename to doc/src/Build_extras.rst diff --git a/doc/rst/Build_link.rst b/doc/src/Build_link.rst similarity index 100% rename from doc/rst/Build_link.rst rename to doc/src/Build_link.rst diff --git a/doc/rst/Build_make.rst b/doc/src/Build_make.rst similarity index 100% rename from doc/rst/Build_make.rst rename to doc/src/Build_make.rst diff --git a/doc/rst/Build_package.rst b/doc/src/Build_package.rst similarity index 100% rename from doc/rst/Build_package.rst rename to doc/src/Build_package.rst diff --git a/doc/rst/Build_settings.rst b/doc/src/Build_settings.rst similarity index 100% rename from doc/rst/Build_settings.rst rename to doc/src/Build_settings.rst diff --git a/doc/rst/Build_windows.rst b/doc/src/Build_windows.rst similarity index 100% rename from doc/rst/Build_windows.rst rename to doc/src/Build_windows.rst diff --git a/doc/rst/Commands.rst b/doc/src/Commands.rst similarity index 100% rename from doc/rst/Commands.rst rename to doc/src/Commands.rst diff --git a/doc/rst/Commands_all.rst b/doc/src/Commands_all.rst similarity index 100% rename from doc/rst/Commands_all.rst rename to doc/src/Commands_all.rst diff --git a/doc/rst/Commands_bond.rst b/doc/src/Commands_bond.rst similarity index 100% rename from doc/rst/Commands_bond.rst rename to doc/src/Commands_bond.rst diff --git a/doc/rst/Commands_category.rst b/doc/src/Commands_category.rst similarity index 100% rename from doc/rst/Commands_category.rst rename to doc/src/Commands_category.rst diff --git a/doc/rst/Commands_compute.rst b/doc/src/Commands_compute.rst similarity index 100% rename from doc/rst/Commands_compute.rst rename to doc/src/Commands_compute.rst diff --git a/doc/rst/Commands_fix.rst b/doc/src/Commands_fix.rst similarity index 100% rename from doc/rst/Commands_fix.rst rename to doc/src/Commands_fix.rst diff --git a/doc/rst/Commands_input.rst b/doc/src/Commands_input.rst similarity index 100% rename from doc/rst/Commands_input.rst rename to doc/src/Commands_input.rst diff --git a/doc/rst/Commands_kspace.rst b/doc/src/Commands_kspace.rst similarity index 100% rename from doc/rst/Commands_kspace.rst rename to doc/src/Commands_kspace.rst diff --git a/doc/rst/Commands_pair.rst b/doc/src/Commands_pair.rst similarity index 100% rename from doc/rst/Commands_pair.rst rename to doc/src/Commands_pair.rst diff --git a/doc/rst/Commands_parse.rst b/doc/src/Commands_parse.rst similarity index 100% rename from doc/rst/Commands_parse.rst rename to doc/src/Commands_parse.rst diff --git a/doc/rst/Commands_removed.rst b/doc/src/Commands_removed.rst similarity index 100% rename from doc/rst/Commands_removed.rst rename to doc/src/Commands_removed.rst diff --git a/doc/rst/Commands_structure.rst b/doc/src/Commands_structure.rst similarity index 100% rename from doc/rst/Commands_structure.rst rename to doc/src/Commands_structure.rst diff --git a/doc/rst/Errors.rst b/doc/src/Errors.rst similarity index 100% rename from doc/rst/Errors.rst rename to doc/src/Errors.rst diff --git a/doc/rst/Errors_bugs.rst b/doc/src/Errors_bugs.rst similarity index 100% rename from doc/rst/Errors_bugs.rst rename to doc/src/Errors_bugs.rst diff --git a/doc/rst/Errors_common.rst b/doc/src/Errors_common.rst similarity index 100% rename from doc/rst/Errors_common.rst rename to doc/src/Errors_common.rst diff --git a/doc/rst/Errors_messages.rst b/doc/src/Errors_messages.rst similarity index 100% rename from doc/rst/Errors_messages.rst rename to doc/src/Errors_messages.rst diff --git a/doc/rst/Errors_warnings.rst b/doc/src/Errors_warnings.rst similarity index 100% rename from doc/rst/Errors_warnings.rst rename to doc/src/Errors_warnings.rst diff --git a/doc/rst/Examples.rst b/doc/src/Examples.rst similarity index 100% rename from doc/rst/Examples.rst rename to doc/src/Examples.rst diff --git a/doc/rst/Howto.rst b/doc/src/Howto.rst similarity index 100% rename from doc/rst/Howto.rst rename to doc/src/Howto.rst diff --git a/doc/rst/Howto_2d.rst b/doc/src/Howto_2d.rst similarity index 100% rename from doc/rst/Howto_2d.rst rename to doc/src/Howto_2d.rst diff --git a/doc/rst/Howto_barostat.rst b/doc/src/Howto_barostat.rst similarity index 100% rename from doc/rst/Howto_barostat.rst rename to doc/src/Howto_barostat.rst diff --git a/doc/rst/Howto_bash.rst b/doc/src/Howto_bash.rst similarity index 100% rename from doc/rst/Howto_bash.rst rename to doc/src/Howto_bash.rst diff --git a/doc/rst/Howto_bioFF.rst b/doc/src/Howto_bioFF.rst similarity index 100% rename from doc/rst/Howto_bioFF.rst rename to doc/src/Howto_bioFF.rst diff --git a/doc/rst/Howto_body.rst b/doc/src/Howto_body.rst similarity index 100% rename from doc/rst/Howto_body.rst rename to doc/src/Howto_body.rst diff --git a/doc/rst/Howto_chunk.rst b/doc/src/Howto_chunk.rst similarity index 100% rename from doc/rst/Howto_chunk.rst rename to doc/src/Howto_chunk.rst diff --git a/doc/rst/Howto_client_server.rst b/doc/src/Howto_client_server.rst similarity index 100% rename from doc/rst/Howto_client_server.rst rename to doc/src/Howto_client_server.rst diff --git a/doc/rst/Howto_coreshell.rst b/doc/src/Howto_coreshell.rst similarity index 100% rename from doc/rst/Howto_coreshell.rst rename to doc/src/Howto_coreshell.rst diff --git a/doc/rst/Howto_couple.rst b/doc/src/Howto_couple.rst similarity index 100% rename from doc/rst/Howto_couple.rst rename to doc/src/Howto_couple.rst diff --git a/doc/rst/Howto_diffusion.rst b/doc/src/Howto_diffusion.rst similarity index 100% rename from doc/rst/Howto_diffusion.rst rename to doc/src/Howto_diffusion.rst diff --git a/doc/rst/Howto_dispersion.rst b/doc/src/Howto_dispersion.rst similarity index 100% rename from doc/rst/Howto_dispersion.rst rename to doc/src/Howto_dispersion.rst diff --git a/doc/rst/Howto_drude.rst b/doc/src/Howto_drude.rst similarity index 100% rename from doc/rst/Howto_drude.rst rename to doc/src/Howto_drude.rst diff --git a/doc/rst/Howto_drude2.rst b/doc/src/Howto_drude2.rst similarity index 100% rename from doc/rst/Howto_drude2.rst rename to doc/src/Howto_drude2.rst diff --git a/doc/rst/Howto_elastic.rst b/doc/src/Howto_elastic.rst similarity index 100% rename from doc/rst/Howto_elastic.rst rename to doc/src/Howto_elastic.rst diff --git a/doc/rst/Howto_github.rst b/doc/src/Howto_github.rst similarity index 100% rename from doc/rst/Howto_github.rst rename to doc/src/Howto_github.rst diff --git a/doc/rst/Howto_granular.rst b/doc/src/Howto_granular.rst similarity index 100% rename from doc/rst/Howto_granular.rst rename to doc/src/Howto_granular.rst diff --git a/doc/rst/Howto_kappa.rst b/doc/src/Howto_kappa.rst similarity index 100% rename from doc/rst/Howto_kappa.rst rename to doc/src/Howto_kappa.rst diff --git a/doc/rst/Howto_library.rst b/doc/src/Howto_library.rst similarity index 100% rename from doc/rst/Howto_library.rst rename to doc/src/Howto_library.rst diff --git a/doc/rst/Howto_manifold.rst b/doc/src/Howto_manifold.rst similarity index 100% rename from doc/rst/Howto_manifold.rst rename to doc/src/Howto_manifold.rst diff --git a/doc/rst/Howto_multiple.rst b/doc/src/Howto_multiple.rst similarity index 100% rename from doc/rst/Howto_multiple.rst rename to doc/src/Howto_multiple.rst diff --git a/doc/rst/Howto_nemd.rst b/doc/src/Howto_nemd.rst similarity index 100% rename from doc/rst/Howto_nemd.rst rename to doc/src/Howto_nemd.rst diff --git a/doc/rst/Howto_output.rst b/doc/src/Howto_output.rst similarity index 100% rename from doc/rst/Howto_output.rst rename to doc/src/Howto_output.rst diff --git a/doc/rst/Howto_polarizable.rst b/doc/src/Howto_polarizable.rst similarity index 100% rename from doc/rst/Howto_polarizable.rst rename to doc/src/Howto_polarizable.rst diff --git a/doc/rst/Howto_pylammps.rst b/doc/src/Howto_pylammps.rst similarity index 100% rename from doc/rst/Howto_pylammps.rst rename to doc/src/Howto_pylammps.rst diff --git a/doc/rst/Howto_replica.rst b/doc/src/Howto_replica.rst similarity index 100% rename from doc/rst/Howto_replica.rst rename to doc/src/Howto_replica.rst diff --git a/doc/rst/Howto_restart.rst b/doc/src/Howto_restart.rst similarity index 100% rename from doc/rst/Howto_restart.rst rename to doc/src/Howto_restart.rst diff --git a/doc/rst/Howto_spc.rst b/doc/src/Howto_spc.rst similarity index 100% rename from doc/rst/Howto_spc.rst rename to doc/src/Howto_spc.rst diff --git a/doc/rst/Howto_spherical.rst b/doc/src/Howto_spherical.rst similarity index 100% rename from doc/rst/Howto_spherical.rst rename to doc/src/Howto_spherical.rst diff --git a/doc/rst/Howto_spins.rst b/doc/src/Howto_spins.rst similarity index 100% rename from doc/rst/Howto_spins.rst rename to doc/src/Howto_spins.rst diff --git a/doc/rst/Howto_temperature.rst b/doc/src/Howto_temperature.rst similarity index 100% rename from doc/rst/Howto_temperature.rst rename to doc/src/Howto_temperature.rst diff --git a/doc/rst/Howto_thermostat.rst b/doc/src/Howto_thermostat.rst similarity index 100% rename from doc/rst/Howto_thermostat.rst rename to doc/src/Howto_thermostat.rst diff --git a/doc/rst/Howto_tip3p.rst b/doc/src/Howto_tip3p.rst similarity index 100% rename from doc/rst/Howto_tip3p.rst rename to doc/src/Howto_tip3p.rst diff --git a/doc/rst/Howto_tip4p.rst b/doc/src/Howto_tip4p.rst similarity index 100% rename from doc/rst/Howto_tip4p.rst rename to doc/src/Howto_tip4p.rst diff --git a/doc/rst/Howto_triclinic.rst b/doc/src/Howto_triclinic.rst similarity index 100% rename from doc/rst/Howto_triclinic.rst rename to doc/src/Howto_triclinic.rst diff --git a/doc/rst/Howto_viscosity.rst b/doc/src/Howto_viscosity.rst similarity index 100% rename from doc/rst/Howto_viscosity.rst rename to doc/src/Howto_viscosity.rst diff --git a/doc/rst/Howto_viz.rst b/doc/src/Howto_viz.rst similarity index 100% rename from doc/rst/Howto_viz.rst rename to doc/src/Howto_viz.rst diff --git a/doc/rst/Howto_walls.rst b/doc/src/Howto_walls.rst similarity index 100% rename from doc/rst/Howto_walls.rst rename to doc/src/Howto_walls.rst diff --git a/doc/rst/Install.rst b/doc/src/Install.rst similarity index 100% rename from doc/rst/Install.rst rename to doc/src/Install.rst diff --git a/doc/rst/Install_git.rst b/doc/src/Install_git.rst similarity index 100% rename from doc/rst/Install_git.rst rename to doc/src/Install_git.rst diff --git a/doc/rst/Install_linux.rst b/doc/src/Install_linux.rst similarity index 100% rename from doc/rst/Install_linux.rst rename to doc/src/Install_linux.rst diff --git a/doc/rst/Install_mac.rst b/doc/src/Install_mac.rst similarity index 100% rename from doc/rst/Install_mac.rst rename to doc/src/Install_mac.rst diff --git a/doc/rst/Install_patch.rst b/doc/src/Install_patch.rst similarity index 100% rename from doc/rst/Install_patch.rst rename to doc/src/Install_patch.rst diff --git a/doc/rst/Install_svn.rst b/doc/src/Install_svn.rst similarity index 100% rename from doc/rst/Install_svn.rst rename to doc/src/Install_svn.rst diff --git a/doc/rst/Install_tarball.rst b/doc/src/Install_tarball.rst similarity index 100% rename from doc/rst/Install_tarball.rst rename to doc/src/Install_tarball.rst diff --git a/doc/rst/Install_windows.rst b/doc/src/Install_windows.rst similarity index 100% rename from doc/rst/Install_windows.rst rename to doc/src/Install_windows.rst diff --git a/doc/rst/Intro.rst b/doc/src/Intro.rst similarity index 100% rename from doc/rst/Intro.rst rename to doc/src/Intro.rst diff --git a/doc/rst/Intro_authors.rst b/doc/src/Intro_authors.rst similarity index 100% rename from doc/rst/Intro_authors.rst rename to doc/src/Intro_authors.rst diff --git a/doc/rst/Intro_features.rst b/doc/src/Intro_features.rst similarity index 100% rename from doc/rst/Intro_features.rst rename to doc/src/Intro_features.rst diff --git a/doc/rst/Intro_nonfeatures.rst b/doc/src/Intro_nonfeatures.rst similarity index 100% rename from doc/rst/Intro_nonfeatures.rst rename to doc/src/Intro_nonfeatures.rst diff --git a/doc/rst/Intro_opensource.rst b/doc/src/Intro_opensource.rst similarity index 100% rename from doc/rst/Intro_opensource.rst rename to doc/src/Intro_opensource.rst diff --git a/doc/rst/Intro_overview.rst b/doc/src/Intro_overview.rst similarity index 100% rename from doc/rst/Intro_overview.rst rename to doc/src/Intro_overview.rst diff --git a/doc/rst/Intro_website.rst b/doc/src/Intro_website.rst similarity index 100% rename from doc/rst/Intro_website.rst rename to doc/src/Intro_website.rst diff --git a/doc/rst/Manual.rst b/doc/src/Manual.rst similarity index 100% rename from doc/rst/Manual.rst rename to doc/src/Manual.rst diff --git a/doc/rst/Manual_build.rst b/doc/src/Manual_build.rst similarity index 100% rename from doc/rst/Manual_build.rst rename to doc/src/Manual_build.rst diff --git a/doc/rst/Manual_version.rst b/doc/src/Manual_version.rst similarity index 100% rename from doc/rst/Manual_version.rst rename to doc/src/Manual_version.rst diff --git a/doc/rst/Modify.rst b/doc/src/Modify.rst similarity index 100% rename from doc/rst/Modify.rst rename to doc/src/Modify.rst diff --git a/doc/rst/Modify_atom.rst b/doc/src/Modify_atom.rst similarity index 100% rename from doc/rst/Modify_atom.rst rename to doc/src/Modify_atom.rst diff --git a/doc/rst/Modify_body.rst b/doc/src/Modify_body.rst similarity index 100% rename from doc/rst/Modify_body.rst rename to doc/src/Modify_body.rst diff --git a/doc/rst/Modify_bond.rst b/doc/src/Modify_bond.rst similarity index 100% rename from doc/rst/Modify_bond.rst rename to doc/src/Modify_bond.rst diff --git a/doc/rst/Modify_command.rst b/doc/src/Modify_command.rst similarity index 100% rename from doc/rst/Modify_command.rst rename to doc/src/Modify_command.rst diff --git a/doc/rst/Modify_compute.rst b/doc/src/Modify_compute.rst similarity index 100% rename from doc/rst/Modify_compute.rst rename to doc/src/Modify_compute.rst diff --git a/doc/rst/Modify_contribute.rst b/doc/src/Modify_contribute.rst similarity index 100% rename from doc/rst/Modify_contribute.rst rename to doc/src/Modify_contribute.rst diff --git a/doc/rst/Modify_dump.rst b/doc/src/Modify_dump.rst similarity index 100% rename from doc/rst/Modify_dump.rst rename to doc/src/Modify_dump.rst diff --git a/doc/rst/Modify_fix.rst b/doc/src/Modify_fix.rst similarity index 100% rename from doc/rst/Modify_fix.rst rename to doc/src/Modify_fix.rst diff --git a/doc/rst/Modify_kspace.rst b/doc/src/Modify_kspace.rst similarity index 100% rename from doc/rst/Modify_kspace.rst rename to doc/src/Modify_kspace.rst diff --git a/doc/rst/Modify_min.rst b/doc/src/Modify_min.rst similarity index 100% rename from doc/rst/Modify_min.rst rename to doc/src/Modify_min.rst diff --git a/doc/rst/Modify_overview.rst b/doc/src/Modify_overview.rst similarity index 100% rename from doc/rst/Modify_overview.rst rename to doc/src/Modify_overview.rst diff --git a/doc/rst/Modify_pair.rst b/doc/src/Modify_pair.rst similarity index 100% rename from doc/rst/Modify_pair.rst rename to doc/src/Modify_pair.rst diff --git a/doc/rst/Modify_region.rst b/doc/src/Modify_region.rst similarity index 100% rename from doc/rst/Modify_region.rst rename to doc/src/Modify_region.rst diff --git a/doc/rst/Modify_thermo.rst b/doc/src/Modify_thermo.rst similarity index 100% rename from doc/rst/Modify_thermo.rst rename to doc/src/Modify_thermo.rst diff --git a/doc/rst/Modify_variable.rst b/doc/src/Modify_variable.rst similarity index 100% rename from doc/rst/Modify_variable.rst rename to doc/src/Modify_variable.rst diff --git a/doc/rst/Packages.rst b/doc/src/Packages.rst similarity index 100% rename from doc/rst/Packages.rst rename to doc/src/Packages.rst diff --git a/doc/rst/Packages_details.rst b/doc/src/Packages_details.rst similarity index 100% rename from doc/rst/Packages_details.rst rename to doc/src/Packages_details.rst diff --git a/doc/rst/Packages_standard.rst b/doc/src/Packages_standard.rst similarity index 100% rename from doc/rst/Packages_standard.rst rename to doc/src/Packages_standard.rst diff --git a/doc/rst/Packages_user.rst b/doc/src/Packages_user.rst similarity index 100% rename from doc/rst/Packages_user.rst rename to doc/src/Packages_user.rst diff --git a/doc/rst/Python_call.rst b/doc/src/Python_call.rst similarity index 100% rename from doc/rst/Python_call.rst rename to doc/src/Python_call.rst diff --git a/doc/rst/Python_examples.rst b/doc/src/Python_examples.rst similarity index 100% rename from doc/rst/Python_examples.rst rename to doc/src/Python_examples.rst diff --git a/doc/rst/Python_head.rst b/doc/src/Python_head.rst similarity index 100% rename from doc/rst/Python_head.rst rename to doc/src/Python_head.rst diff --git a/doc/rst/Python_install.rst b/doc/src/Python_install.rst similarity index 100% rename from doc/rst/Python_install.rst rename to doc/src/Python_install.rst diff --git a/doc/rst/Python_library.rst b/doc/src/Python_library.rst similarity index 100% rename from doc/rst/Python_library.rst rename to doc/src/Python_library.rst diff --git a/doc/rst/Python_mpi.rst b/doc/src/Python_mpi.rst similarity index 100% rename from doc/rst/Python_mpi.rst rename to doc/src/Python_mpi.rst diff --git a/doc/rst/Python_overview.rst b/doc/src/Python_overview.rst similarity index 100% rename from doc/rst/Python_overview.rst rename to doc/src/Python_overview.rst diff --git a/doc/rst/Python_pylammps.rst b/doc/src/Python_pylammps.rst similarity index 100% rename from doc/rst/Python_pylammps.rst rename to doc/src/Python_pylammps.rst diff --git a/doc/rst/Python_run.rst b/doc/src/Python_run.rst similarity index 100% rename from doc/rst/Python_run.rst rename to doc/src/Python_run.rst diff --git a/doc/rst/Python_shlib.rst b/doc/src/Python_shlib.rst similarity index 100% rename from doc/rst/Python_shlib.rst rename to doc/src/Python_shlib.rst diff --git a/doc/rst/Python_test.rst b/doc/src/Python_test.rst similarity index 100% rename from doc/rst/Python_test.rst rename to doc/src/Python_test.rst diff --git a/doc/rst/Run_basics.rst b/doc/src/Run_basics.rst similarity index 100% rename from doc/rst/Run_basics.rst rename to doc/src/Run_basics.rst diff --git a/doc/rst/Run_head.rst b/doc/src/Run_head.rst similarity index 100% rename from doc/rst/Run_head.rst rename to doc/src/Run_head.rst diff --git a/doc/rst/Run_options.rst b/doc/src/Run_options.rst similarity index 100% rename from doc/rst/Run_options.rst rename to doc/src/Run_options.rst diff --git a/doc/rst/Run_output.rst b/doc/src/Run_output.rst similarity index 100% rename from doc/rst/Run_output.rst rename to doc/src/Run_output.rst diff --git a/doc/rst/Run_windows.rst b/doc/src/Run_windows.rst similarity index 100% rename from doc/rst/Run_windows.rst rename to doc/src/Run_windows.rst diff --git a/doc/rst/Speed.rst b/doc/src/Speed.rst similarity index 100% rename from doc/rst/Speed.rst rename to doc/src/Speed.rst diff --git a/doc/rst/Speed_bench.rst b/doc/src/Speed_bench.rst similarity index 100% rename from doc/rst/Speed_bench.rst rename to doc/src/Speed_bench.rst diff --git a/doc/rst/Speed_compare.rst b/doc/src/Speed_compare.rst similarity index 100% rename from doc/rst/Speed_compare.rst rename to doc/src/Speed_compare.rst diff --git a/doc/rst/Speed_gpu.rst b/doc/src/Speed_gpu.rst similarity index 100% rename from doc/rst/Speed_gpu.rst rename to doc/src/Speed_gpu.rst diff --git a/doc/rst/Speed_intel.rst b/doc/src/Speed_intel.rst similarity index 100% rename from doc/rst/Speed_intel.rst rename to doc/src/Speed_intel.rst diff --git a/doc/rst/Speed_kokkos.rst b/doc/src/Speed_kokkos.rst similarity index 100% rename from doc/rst/Speed_kokkos.rst rename to doc/src/Speed_kokkos.rst diff --git a/doc/rst/Speed_measure.rst b/doc/src/Speed_measure.rst similarity index 100% rename from doc/rst/Speed_measure.rst rename to doc/src/Speed_measure.rst diff --git a/doc/rst/Speed_omp.rst b/doc/src/Speed_omp.rst similarity index 100% rename from doc/rst/Speed_omp.rst rename to doc/src/Speed_omp.rst diff --git a/doc/rst/Speed_opt.rst b/doc/src/Speed_opt.rst similarity index 100% rename from doc/rst/Speed_opt.rst rename to doc/src/Speed_opt.rst diff --git a/doc/rst/Speed_packages.rst b/doc/src/Speed_packages.rst similarity index 100% rename from doc/rst/Speed_packages.rst rename to doc/src/Speed_packages.rst diff --git a/doc/rst/Speed_tips.rst b/doc/src/Speed_tips.rst similarity index 100% rename from doc/rst/Speed_tips.rst rename to doc/src/Speed_tips.rst diff --git a/doc/rst/Tools.rst b/doc/src/Tools.rst similarity index 100% rename from doc/rst/Tools.rst rename to doc/src/Tools.rst diff --git a/doc/rst/angle_charmm.rst b/doc/src/angle_charmm.rst similarity index 100% rename from doc/rst/angle_charmm.rst rename to doc/src/angle_charmm.rst diff --git a/doc/rst/angle_class2.rst b/doc/src/angle_class2.rst similarity index 100% rename from doc/rst/angle_class2.rst rename to doc/src/angle_class2.rst diff --git a/doc/rst/angle_coeff.rst b/doc/src/angle_coeff.rst similarity index 100% rename from doc/rst/angle_coeff.rst rename to doc/src/angle_coeff.rst diff --git a/doc/rst/angle_cosine.rst b/doc/src/angle_cosine.rst similarity index 100% rename from doc/rst/angle_cosine.rst rename to doc/src/angle_cosine.rst diff --git a/doc/rst/angle_cosine_buck6d.rst b/doc/src/angle_cosine_buck6d.rst similarity index 100% rename from doc/rst/angle_cosine_buck6d.rst rename to doc/src/angle_cosine_buck6d.rst diff --git a/doc/rst/angle_cosine_delta.rst b/doc/src/angle_cosine_delta.rst similarity index 100% rename from doc/rst/angle_cosine_delta.rst rename to doc/src/angle_cosine_delta.rst diff --git a/doc/rst/angle_cosine_periodic.rst b/doc/src/angle_cosine_periodic.rst similarity index 100% rename from doc/rst/angle_cosine_periodic.rst rename to doc/src/angle_cosine_periodic.rst diff --git a/doc/rst/angle_cosine_shift.rst b/doc/src/angle_cosine_shift.rst similarity index 100% rename from doc/rst/angle_cosine_shift.rst rename to doc/src/angle_cosine_shift.rst diff --git a/doc/rst/angle_cosine_shift_exp.rst b/doc/src/angle_cosine_shift_exp.rst similarity index 100% rename from doc/rst/angle_cosine_shift_exp.rst rename to doc/src/angle_cosine_shift_exp.rst diff --git a/doc/rst/angle_cosine_squared.rst b/doc/src/angle_cosine_squared.rst similarity index 100% rename from doc/rst/angle_cosine_squared.rst rename to doc/src/angle_cosine_squared.rst diff --git a/doc/rst/angle_cross.rst b/doc/src/angle_cross.rst similarity index 100% rename from doc/rst/angle_cross.rst rename to doc/src/angle_cross.rst diff --git a/doc/rst/angle_dipole.rst b/doc/src/angle_dipole.rst similarity index 100% rename from doc/rst/angle_dipole.rst rename to doc/src/angle_dipole.rst diff --git a/doc/rst/angle_fourier.rst b/doc/src/angle_fourier.rst similarity index 100% rename from doc/rst/angle_fourier.rst rename to doc/src/angle_fourier.rst diff --git a/doc/rst/angle_fourier_simple.rst b/doc/src/angle_fourier_simple.rst similarity index 100% rename from doc/rst/angle_fourier_simple.rst rename to doc/src/angle_fourier_simple.rst diff --git a/doc/rst/angle_harmonic.rst b/doc/src/angle_harmonic.rst similarity index 100% rename from doc/rst/angle_harmonic.rst rename to doc/src/angle_harmonic.rst diff --git a/doc/rst/angle_hybrid.rst b/doc/src/angle_hybrid.rst similarity index 100% rename from doc/rst/angle_hybrid.rst rename to doc/src/angle_hybrid.rst diff --git a/doc/rst/angle_mm3.rst b/doc/src/angle_mm3.rst similarity index 100% rename from doc/rst/angle_mm3.rst rename to doc/src/angle_mm3.rst diff --git a/doc/rst/angle_none.rst b/doc/src/angle_none.rst similarity index 100% rename from doc/rst/angle_none.rst rename to doc/src/angle_none.rst diff --git a/doc/rst/angle_quartic.rst b/doc/src/angle_quartic.rst similarity index 100% rename from doc/rst/angle_quartic.rst rename to doc/src/angle_quartic.rst diff --git a/doc/rst/angle_sdk.rst b/doc/src/angle_sdk.rst similarity index 100% rename from doc/rst/angle_sdk.rst rename to doc/src/angle_sdk.rst diff --git a/doc/rst/angle_style.rst b/doc/src/angle_style.rst similarity index 100% rename from doc/rst/angle_style.rst rename to doc/src/angle_style.rst diff --git a/doc/rst/angle_table.rst b/doc/src/angle_table.rst similarity index 100% rename from doc/rst/angle_table.rst rename to doc/src/angle_table.rst diff --git a/doc/rst/angle_zero.rst b/doc/src/angle_zero.rst similarity index 100% rename from doc/rst/angle_zero.rst rename to doc/src/angle_zero.rst diff --git a/doc/rst/angles.rst b/doc/src/angles.rst similarity index 100% rename from doc/rst/angles.rst rename to doc/src/angles.rst diff --git a/doc/rst/atom_modify.rst b/doc/src/atom_modify.rst similarity index 100% rename from doc/rst/atom_modify.rst rename to doc/src/atom_modify.rst diff --git a/doc/rst/atom_style.rst b/doc/src/atom_style.rst similarity index 100% rename from doc/rst/atom_style.rst rename to doc/src/atom_style.rst diff --git a/doc/rst/balance.rst b/doc/src/balance.rst similarity index 100% rename from doc/rst/balance.rst rename to doc/src/balance.rst diff --git a/doc/rst/bond_class2.rst b/doc/src/bond_class2.rst similarity index 100% rename from doc/rst/bond_class2.rst rename to doc/src/bond_class2.rst diff --git a/doc/rst/bond_coeff.rst b/doc/src/bond_coeff.rst similarity index 100% rename from doc/rst/bond_coeff.rst rename to doc/src/bond_coeff.rst diff --git a/doc/rst/bond_fene.rst b/doc/src/bond_fene.rst similarity index 100% rename from doc/rst/bond_fene.rst rename to doc/src/bond_fene.rst diff --git a/doc/rst/bond_fene_expand.rst b/doc/src/bond_fene_expand.rst similarity index 100% rename from doc/rst/bond_fene_expand.rst rename to doc/src/bond_fene_expand.rst diff --git a/doc/rst/bond_gromos.rst b/doc/src/bond_gromos.rst similarity index 100% rename from doc/rst/bond_gromos.rst rename to doc/src/bond_gromos.rst diff --git a/doc/rst/bond_harmonic.rst b/doc/src/bond_harmonic.rst similarity index 100% rename from doc/rst/bond_harmonic.rst rename to doc/src/bond_harmonic.rst diff --git a/doc/rst/bond_harmonic_shift.rst b/doc/src/bond_harmonic_shift.rst similarity index 100% rename from doc/rst/bond_harmonic_shift.rst rename to doc/src/bond_harmonic_shift.rst diff --git a/doc/rst/bond_harmonic_shift_cut.rst b/doc/src/bond_harmonic_shift_cut.rst similarity index 100% rename from doc/rst/bond_harmonic_shift_cut.rst rename to doc/src/bond_harmonic_shift_cut.rst diff --git a/doc/rst/bond_hybrid.rst b/doc/src/bond_hybrid.rst similarity index 100% rename from doc/rst/bond_hybrid.rst rename to doc/src/bond_hybrid.rst diff --git a/doc/rst/bond_mm3.rst b/doc/src/bond_mm3.rst similarity index 100% rename from doc/rst/bond_mm3.rst rename to doc/src/bond_mm3.rst diff --git a/doc/rst/bond_morse.rst b/doc/src/bond_morse.rst similarity index 100% rename from doc/rst/bond_morse.rst rename to doc/src/bond_morse.rst diff --git a/doc/rst/bond_none.rst b/doc/src/bond_none.rst similarity index 100% rename from doc/rst/bond_none.rst rename to doc/src/bond_none.rst diff --git a/doc/rst/bond_nonlinear.rst b/doc/src/bond_nonlinear.rst similarity index 100% rename from doc/rst/bond_nonlinear.rst rename to doc/src/bond_nonlinear.rst diff --git a/doc/rst/bond_oxdna.rst b/doc/src/bond_oxdna.rst similarity index 100% rename from doc/rst/bond_oxdna.rst rename to doc/src/bond_oxdna.rst diff --git a/doc/rst/bond_quartic.rst b/doc/src/bond_quartic.rst similarity index 100% rename from doc/rst/bond_quartic.rst rename to doc/src/bond_quartic.rst diff --git a/doc/rst/bond_style.rst b/doc/src/bond_style.rst similarity index 100% rename from doc/rst/bond_style.rst rename to doc/src/bond_style.rst diff --git a/doc/rst/bond_table.rst b/doc/src/bond_table.rst similarity index 100% rename from doc/rst/bond_table.rst rename to doc/src/bond_table.rst diff --git a/doc/rst/bond_write.rst b/doc/src/bond_write.rst similarity index 100% rename from doc/rst/bond_write.rst rename to doc/src/bond_write.rst diff --git a/doc/rst/bond_zero.rst b/doc/src/bond_zero.rst similarity index 100% rename from doc/rst/bond_zero.rst rename to doc/src/bond_zero.rst diff --git a/doc/rst/bonds.rst b/doc/src/bonds.rst similarity index 100% rename from doc/rst/bonds.rst rename to doc/src/bonds.rst diff --git a/doc/rst/boundary.rst b/doc/src/boundary.rst similarity index 100% rename from doc/rst/boundary.rst rename to doc/src/boundary.rst diff --git a/doc/rst/box.rst b/doc/src/box.rst similarity index 100% rename from doc/rst/box.rst rename to doc/src/box.rst diff --git a/doc/rst/change_box.rst b/doc/src/change_box.rst similarity index 100% rename from doc/rst/change_box.rst rename to doc/src/change_box.rst diff --git a/doc/rst/clear.rst b/doc/src/clear.rst similarity index 100% rename from doc/rst/clear.rst rename to doc/src/clear.rst diff --git a/doc/rst/comm_modify.rst b/doc/src/comm_modify.rst similarity index 100% rename from doc/rst/comm_modify.rst rename to doc/src/comm_modify.rst diff --git a/doc/rst/comm_style.rst b/doc/src/comm_style.rst similarity index 100% rename from doc/rst/comm_style.rst rename to doc/src/comm_style.rst diff --git a/doc/rst/commands_list.rst b/doc/src/commands_list.rst similarity index 100% rename from doc/rst/commands_list.rst rename to doc/src/commands_list.rst diff --git a/doc/rst/compute.rst b/doc/src/compute.rst similarity index 100% rename from doc/rst/compute.rst rename to doc/src/compute.rst diff --git a/doc/rst/compute_ackland_atom.rst b/doc/src/compute_ackland_atom.rst similarity index 100% rename from doc/rst/compute_ackland_atom.rst rename to doc/src/compute_ackland_atom.rst diff --git a/doc/rst/compute_adf.rst b/doc/src/compute_adf.rst similarity index 100% rename from doc/rst/compute_adf.rst rename to doc/src/compute_adf.rst diff --git a/doc/rst/compute_angle.rst b/doc/src/compute_angle.rst similarity index 100% rename from doc/rst/compute_angle.rst rename to doc/src/compute_angle.rst diff --git a/doc/rst/compute_angle_local.rst b/doc/src/compute_angle_local.rst similarity index 100% rename from doc/rst/compute_angle_local.rst rename to doc/src/compute_angle_local.rst diff --git a/doc/rst/compute_angmom_chunk.rst b/doc/src/compute_angmom_chunk.rst similarity index 100% rename from doc/rst/compute_angmom_chunk.rst rename to doc/src/compute_angmom_chunk.rst diff --git a/doc/rst/compute_basal_atom.rst b/doc/src/compute_basal_atom.rst similarity index 100% rename from doc/rst/compute_basal_atom.rst rename to doc/src/compute_basal_atom.rst diff --git a/doc/rst/compute_body_local.rst b/doc/src/compute_body_local.rst similarity index 100% rename from doc/rst/compute_body_local.rst rename to doc/src/compute_body_local.rst diff --git a/doc/rst/compute_bond.rst b/doc/src/compute_bond.rst similarity index 100% rename from doc/rst/compute_bond.rst rename to doc/src/compute_bond.rst diff --git a/doc/rst/compute_bond_local.rst b/doc/src/compute_bond_local.rst similarity index 100% rename from doc/rst/compute_bond_local.rst rename to doc/src/compute_bond_local.rst diff --git a/doc/rst/compute_centro_atom.rst b/doc/src/compute_centro_atom.rst similarity index 100% rename from doc/rst/compute_centro_atom.rst rename to doc/src/compute_centro_atom.rst diff --git a/doc/rst/compute_chunk_atom.rst b/doc/src/compute_chunk_atom.rst similarity index 100% rename from doc/rst/compute_chunk_atom.rst rename to doc/src/compute_chunk_atom.rst diff --git a/doc/rst/compute_chunk_spread_atom.rst b/doc/src/compute_chunk_spread_atom.rst similarity index 100% rename from doc/rst/compute_chunk_spread_atom.rst rename to doc/src/compute_chunk_spread_atom.rst diff --git a/doc/rst/compute_cluster_atom.rst b/doc/src/compute_cluster_atom.rst similarity index 100% rename from doc/rst/compute_cluster_atom.rst rename to doc/src/compute_cluster_atom.rst diff --git a/doc/rst/compute_cna_atom.rst b/doc/src/compute_cna_atom.rst similarity index 100% rename from doc/rst/compute_cna_atom.rst rename to doc/src/compute_cna_atom.rst diff --git a/doc/rst/compute_cnp_atom.rst b/doc/src/compute_cnp_atom.rst similarity index 100% rename from doc/rst/compute_cnp_atom.rst rename to doc/src/compute_cnp_atom.rst diff --git a/doc/rst/compute_com.rst b/doc/src/compute_com.rst similarity index 100% rename from doc/rst/compute_com.rst rename to doc/src/compute_com.rst diff --git a/doc/rst/compute_com_chunk.rst b/doc/src/compute_com_chunk.rst similarity index 100% rename from doc/rst/compute_com_chunk.rst rename to doc/src/compute_com_chunk.rst diff --git a/doc/rst/compute_contact_atom.rst b/doc/src/compute_contact_atom.rst similarity index 100% rename from doc/rst/compute_contact_atom.rst rename to doc/src/compute_contact_atom.rst diff --git a/doc/rst/compute_coord_atom.rst b/doc/src/compute_coord_atom.rst similarity index 100% rename from doc/rst/compute_coord_atom.rst rename to doc/src/compute_coord_atom.rst diff --git a/doc/rst/compute_damage_atom.rst b/doc/src/compute_damage_atom.rst similarity index 100% rename from doc/rst/compute_damage_atom.rst rename to doc/src/compute_damage_atom.rst diff --git a/doc/rst/compute_dihedral.rst b/doc/src/compute_dihedral.rst similarity index 100% rename from doc/rst/compute_dihedral.rst rename to doc/src/compute_dihedral.rst diff --git a/doc/rst/compute_dihedral_local.rst b/doc/src/compute_dihedral_local.rst similarity index 100% rename from doc/rst/compute_dihedral_local.rst rename to doc/src/compute_dihedral_local.rst diff --git a/doc/rst/compute_dilatation_atom.rst b/doc/src/compute_dilatation_atom.rst similarity index 100% rename from doc/rst/compute_dilatation_atom.rst rename to doc/src/compute_dilatation_atom.rst diff --git a/doc/rst/compute_dipole_chunk.rst b/doc/src/compute_dipole_chunk.rst similarity index 100% rename from doc/rst/compute_dipole_chunk.rst rename to doc/src/compute_dipole_chunk.rst diff --git a/doc/rst/compute_displace_atom.rst b/doc/src/compute_displace_atom.rst similarity index 100% rename from doc/rst/compute_displace_atom.rst rename to doc/src/compute_displace_atom.rst diff --git a/doc/rst/compute_dpd.rst b/doc/src/compute_dpd.rst similarity index 100% rename from doc/rst/compute_dpd.rst rename to doc/src/compute_dpd.rst diff --git a/doc/rst/compute_dpd_atom.rst b/doc/src/compute_dpd_atom.rst similarity index 100% rename from doc/rst/compute_dpd_atom.rst rename to doc/src/compute_dpd_atom.rst diff --git a/doc/rst/compute_edpd_temp_atom.rst b/doc/src/compute_edpd_temp_atom.rst similarity index 100% rename from doc/rst/compute_edpd_temp_atom.rst rename to doc/src/compute_edpd_temp_atom.rst diff --git a/doc/rst/compute_entropy_atom.rst b/doc/src/compute_entropy_atom.rst similarity index 100% rename from doc/rst/compute_entropy_atom.rst rename to doc/src/compute_entropy_atom.rst diff --git a/doc/rst/compute_erotate_asphere.rst b/doc/src/compute_erotate_asphere.rst similarity index 100% rename from doc/rst/compute_erotate_asphere.rst rename to doc/src/compute_erotate_asphere.rst diff --git a/doc/rst/compute_erotate_rigid.rst b/doc/src/compute_erotate_rigid.rst similarity index 100% rename from doc/rst/compute_erotate_rigid.rst rename to doc/src/compute_erotate_rigid.rst diff --git a/doc/rst/compute_erotate_sphere.rst b/doc/src/compute_erotate_sphere.rst similarity index 100% rename from doc/rst/compute_erotate_sphere.rst rename to doc/src/compute_erotate_sphere.rst diff --git a/doc/rst/compute_erotate_sphere_atom.rst b/doc/src/compute_erotate_sphere_atom.rst similarity index 100% rename from doc/rst/compute_erotate_sphere_atom.rst rename to doc/src/compute_erotate_sphere_atom.rst diff --git a/doc/rst/compute_event_displace.rst b/doc/src/compute_event_displace.rst similarity index 100% rename from doc/rst/compute_event_displace.rst rename to doc/src/compute_event_displace.rst diff --git a/doc/rst/compute_fep.rst b/doc/src/compute_fep.rst similarity index 100% rename from doc/rst/compute_fep.rst rename to doc/src/compute_fep.rst diff --git a/doc/rst/compute_global_atom.rst b/doc/src/compute_global_atom.rst similarity index 100% rename from doc/rst/compute_global_atom.rst rename to doc/src/compute_global_atom.rst diff --git a/doc/rst/compute_group_group.rst b/doc/src/compute_group_group.rst similarity index 100% rename from doc/rst/compute_group_group.rst rename to doc/src/compute_group_group.rst diff --git a/doc/rst/compute_gyration.rst b/doc/src/compute_gyration.rst similarity index 100% rename from doc/rst/compute_gyration.rst rename to doc/src/compute_gyration.rst diff --git a/doc/rst/compute_gyration_chunk.rst b/doc/src/compute_gyration_chunk.rst similarity index 100% rename from doc/rst/compute_gyration_chunk.rst rename to doc/src/compute_gyration_chunk.rst diff --git a/doc/rst/compute_gyration_shape.rst b/doc/src/compute_gyration_shape.rst similarity index 100% rename from doc/rst/compute_gyration_shape.rst rename to doc/src/compute_gyration_shape.rst diff --git a/doc/rst/compute_heat_flux.rst b/doc/src/compute_heat_flux.rst similarity index 100% rename from doc/rst/compute_heat_flux.rst rename to doc/src/compute_heat_flux.rst diff --git a/doc/rst/compute_hexorder_atom.rst b/doc/src/compute_hexorder_atom.rst similarity index 100% rename from doc/rst/compute_hexorder_atom.rst rename to doc/src/compute_hexorder_atom.rst diff --git a/doc/rst/compute_hma.rst b/doc/src/compute_hma.rst similarity index 100% rename from doc/rst/compute_hma.rst rename to doc/src/compute_hma.rst diff --git a/doc/rst/compute_improper.rst b/doc/src/compute_improper.rst similarity index 100% rename from doc/rst/compute_improper.rst rename to doc/src/compute_improper.rst diff --git a/doc/rst/compute_improper_local.rst b/doc/src/compute_improper_local.rst similarity index 100% rename from doc/rst/compute_improper_local.rst rename to doc/src/compute_improper_local.rst diff --git a/doc/rst/compute_inertia_chunk.rst b/doc/src/compute_inertia_chunk.rst similarity index 100% rename from doc/rst/compute_inertia_chunk.rst rename to doc/src/compute_inertia_chunk.rst diff --git a/doc/rst/compute_ke.rst b/doc/src/compute_ke.rst similarity index 100% rename from doc/rst/compute_ke.rst rename to doc/src/compute_ke.rst diff --git a/doc/rst/compute_ke_atom.rst b/doc/src/compute_ke_atom.rst similarity index 100% rename from doc/rst/compute_ke_atom.rst rename to doc/src/compute_ke_atom.rst diff --git a/doc/rst/compute_ke_atom_eff.rst b/doc/src/compute_ke_atom_eff.rst similarity index 100% rename from doc/rst/compute_ke_atom_eff.rst rename to doc/src/compute_ke_atom_eff.rst diff --git a/doc/rst/compute_ke_eff.rst b/doc/src/compute_ke_eff.rst similarity index 100% rename from doc/rst/compute_ke_eff.rst rename to doc/src/compute_ke_eff.rst diff --git a/doc/rst/compute_ke_rigid.rst b/doc/src/compute_ke_rigid.rst similarity index 100% rename from doc/rst/compute_ke_rigid.rst rename to doc/src/compute_ke_rigid.rst diff --git a/doc/rst/compute_meso_e_atom.rst b/doc/src/compute_meso_e_atom.rst similarity index 100% rename from doc/rst/compute_meso_e_atom.rst rename to doc/src/compute_meso_e_atom.rst diff --git a/doc/rst/compute_meso_rho_atom.rst b/doc/src/compute_meso_rho_atom.rst similarity index 100% rename from doc/rst/compute_meso_rho_atom.rst rename to doc/src/compute_meso_rho_atom.rst diff --git a/doc/rst/compute_meso_t_atom.rst b/doc/src/compute_meso_t_atom.rst similarity index 100% rename from doc/rst/compute_meso_t_atom.rst rename to doc/src/compute_meso_t_atom.rst diff --git a/doc/rst/compute_modify.rst b/doc/src/compute_modify.rst similarity index 100% rename from doc/rst/compute_modify.rst rename to doc/src/compute_modify.rst diff --git a/doc/rst/compute_momentum.rst b/doc/src/compute_momentum.rst similarity index 100% rename from doc/rst/compute_momentum.rst rename to doc/src/compute_momentum.rst diff --git a/doc/rst/compute_msd.rst b/doc/src/compute_msd.rst similarity index 100% rename from doc/rst/compute_msd.rst rename to doc/src/compute_msd.rst diff --git a/doc/rst/compute_msd_chunk.rst b/doc/src/compute_msd_chunk.rst similarity index 100% rename from doc/rst/compute_msd_chunk.rst rename to doc/src/compute_msd_chunk.rst diff --git a/doc/rst/compute_msd_nongauss.rst b/doc/src/compute_msd_nongauss.rst similarity index 100% rename from doc/rst/compute_msd_nongauss.rst rename to doc/src/compute_msd_nongauss.rst diff --git a/doc/rst/compute_omega_chunk.rst b/doc/src/compute_omega_chunk.rst similarity index 100% rename from doc/rst/compute_omega_chunk.rst rename to doc/src/compute_omega_chunk.rst diff --git a/doc/rst/compute_orientorder_atom.rst b/doc/src/compute_orientorder_atom.rst similarity index 100% rename from doc/rst/compute_orientorder_atom.rst rename to doc/src/compute_orientorder_atom.rst diff --git a/doc/rst/compute_pair.rst b/doc/src/compute_pair.rst similarity index 100% rename from doc/rst/compute_pair.rst rename to doc/src/compute_pair.rst diff --git a/doc/rst/compute_pair_local.rst b/doc/src/compute_pair_local.rst similarity index 100% rename from doc/rst/compute_pair_local.rst rename to doc/src/compute_pair_local.rst diff --git a/doc/rst/compute_pe.rst b/doc/src/compute_pe.rst similarity index 100% rename from doc/rst/compute_pe.rst rename to doc/src/compute_pe.rst diff --git a/doc/rst/compute_pe_atom.rst b/doc/src/compute_pe_atom.rst similarity index 100% rename from doc/rst/compute_pe_atom.rst rename to doc/src/compute_pe_atom.rst diff --git a/doc/rst/compute_plasticity_atom.rst b/doc/src/compute_plasticity_atom.rst similarity index 100% rename from doc/rst/compute_plasticity_atom.rst rename to doc/src/compute_plasticity_atom.rst diff --git a/doc/rst/compute_pressure.rst b/doc/src/compute_pressure.rst similarity index 100% rename from doc/rst/compute_pressure.rst rename to doc/src/compute_pressure.rst diff --git a/doc/rst/compute_pressure_cylinder.rst b/doc/src/compute_pressure_cylinder.rst similarity index 100% rename from doc/rst/compute_pressure_cylinder.rst rename to doc/src/compute_pressure_cylinder.rst diff --git a/doc/rst/compute_pressure_uef.rst b/doc/src/compute_pressure_uef.rst similarity index 100% rename from doc/rst/compute_pressure_uef.rst rename to doc/src/compute_pressure_uef.rst diff --git a/doc/rst/compute_property_atom.rst b/doc/src/compute_property_atom.rst similarity index 100% rename from doc/rst/compute_property_atom.rst rename to doc/src/compute_property_atom.rst diff --git a/doc/rst/compute_property_chunk.rst b/doc/src/compute_property_chunk.rst similarity index 100% rename from doc/rst/compute_property_chunk.rst rename to doc/src/compute_property_chunk.rst diff --git a/doc/rst/compute_property_local.rst b/doc/src/compute_property_local.rst similarity index 100% rename from doc/rst/compute_property_local.rst rename to doc/src/compute_property_local.rst diff --git a/doc/rst/compute_ptm_atom.rst b/doc/src/compute_ptm_atom.rst similarity index 100% rename from doc/rst/compute_ptm_atom.rst rename to doc/src/compute_ptm_atom.rst diff --git a/doc/rst/compute_rdf.rst b/doc/src/compute_rdf.rst similarity index 100% rename from doc/rst/compute_rdf.rst rename to doc/src/compute_rdf.rst diff --git a/doc/rst/compute_reduce.rst b/doc/src/compute_reduce.rst similarity index 100% rename from doc/rst/compute_reduce.rst rename to doc/src/compute_reduce.rst diff --git a/doc/rst/compute_reduce_chunk.rst b/doc/src/compute_reduce_chunk.rst similarity index 100% rename from doc/rst/compute_reduce_chunk.rst rename to doc/src/compute_reduce_chunk.rst diff --git a/doc/rst/compute_rigid_local.rst b/doc/src/compute_rigid_local.rst similarity index 100% rename from doc/rst/compute_rigid_local.rst rename to doc/src/compute_rigid_local.rst diff --git a/doc/rst/compute_saed.rst b/doc/src/compute_saed.rst similarity index 100% rename from doc/rst/compute_saed.rst rename to doc/src/compute_saed.rst diff --git a/doc/rst/compute_slice.rst b/doc/src/compute_slice.rst similarity index 100% rename from doc/rst/compute_slice.rst rename to doc/src/compute_slice.rst diff --git a/doc/rst/compute_smd_contact_radius.rst b/doc/src/compute_smd_contact_radius.rst similarity index 100% rename from doc/rst/compute_smd_contact_radius.rst rename to doc/src/compute_smd_contact_radius.rst diff --git a/doc/rst/compute_smd_damage.rst b/doc/src/compute_smd_damage.rst similarity index 100% rename from doc/rst/compute_smd_damage.rst rename to doc/src/compute_smd_damage.rst diff --git a/doc/rst/compute_smd_hourglass_error.rst b/doc/src/compute_smd_hourglass_error.rst similarity index 100% rename from doc/rst/compute_smd_hourglass_error.rst rename to doc/src/compute_smd_hourglass_error.rst diff --git a/doc/rst/compute_smd_internal_energy.rst b/doc/src/compute_smd_internal_energy.rst similarity index 100% rename from doc/rst/compute_smd_internal_energy.rst rename to doc/src/compute_smd_internal_energy.rst diff --git a/doc/rst/compute_smd_plastic_strain.rst b/doc/src/compute_smd_plastic_strain.rst similarity index 100% rename from doc/rst/compute_smd_plastic_strain.rst rename to doc/src/compute_smd_plastic_strain.rst diff --git a/doc/rst/compute_smd_plastic_strain_rate.rst b/doc/src/compute_smd_plastic_strain_rate.rst similarity index 100% rename from doc/rst/compute_smd_plastic_strain_rate.rst rename to doc/src/compute_smd_plastic_strain_rate.rst diff --git a/doc/rst/compute_smd_rho.rst b/doc/src/compute_smd_rho.rst similarity index 100% rename from doc/rst/compute_smd_rho.rst rename to doc/src/compute_smd_rho.rst diff --git a/doc/rst/compute_smd_tlsph_defgrad.rst b/doc/src/compute_smd_tlsph_defgrad.rst similarity index 100% rename from doc/rst/compute_smd_tlsph_defgrad.rst rename to doc/src/compute_smd_tlsph_defgrad.rst diff --git a/doc/rst/compute_smd_tlsph_dt.rst b/doc/src/compute_smd_tlsph_dt.rst similarity index 100% rename from doc/rst/compute_smd_tlsph_dt.rst rename to doc/src/compute_smd_tlsph_dt.rst diff --git a/doc/rst/compute_smd_tlsph_num_neighs.rst b/doc/src/compute_smd_tlsph_num_neighs.rst similarity index 100% rename from doc/rst/compute_smd_tlsph_num_neighs.rst rename to doc/src/compute_smd_tlsph_num_neighs.rst diff --git a/doc/rst/compute_smd_tlsph_shape.rst b/doc/src/compute_smd_tlsph_shape.rst similarity index 100% rename from doc/rst/compute_smd_tlsph_shape.rst rename to doc/src/compute_smd_tlsph_shape.rst diff --git a/doc/rst/compute_smd_tlsph_strain.rst b/doc/src/compute_smd_tlsph_strain.rst similarity index 100% rename from doc/rst/compute_smd_tlsph_strain.rst rename to doc/src/compute_smd_tlsph_strain.rst diff --git a/doc/rst/compute_smd_tlsph_strain_rate.rst b/doc/src/compute_smd_tlsph_strain_rate.rst similarity index 100% rename from doc/rst/compute_smd_tlsph_strain_rate.rst rename to doc/src/compute_smd_tlsph_strain_rate.rst diff --git a/doc/rst/compute_smd_tlsph_stress.rst b/doc/src/compute_smd_tlsph_stress.rst similarity index 100% rename from doc/rst/compute_smd_tlsph_stress.rst rename to doc/src/compute_smd_tlsph_stress.rst diff --git a/doc/rst/compute_smd_triangle_vertices.rst b/doc/src/compute_smd_triangle_vertices.rst similarity index 100% rename from doc/rst/compute_smd_triangle_vertices.rst rename to doc/src/compute_smd_triangle_vertices.rst diff --git a/doc/rst/compute_smd_ulsph_num_neighs.rst b/doc/src/compute_smd_ulsph_num_neighs.rst similarity index 100% rename from doc/rst/compute_smd_ulsph_num_neighs.rst rename to doc/src/compute_smd_ulsph_num_neighs.rst diff --git a/doc/rst/compute_smd_ulsph_strain.rst b/doc/src/compute_smd_ulsph_strain.rst similarity index 100% rename from doc/rst/compute_smd_ulsph_strain.rst rename to doc/src/compute_smd_ulsph_strain.rst diff --git a/doc/rst/compute_smd_ulsph_strain_rate.rst b/doc/src/compute_smd_ulsph_strain_rate.rst similarity index 100% rename from doc/rst/compute_smd_ulsph_strain_rate.rst rename to doc/src/compute_smd_ulsph_strain_rate.rst diff --git a/doc/rst/compute_smd_ulsph_stress.rst b/doc/src/compute_smd_ulsph_stress.rst similarity index 100% rename from doc/rst/compute_smd_ulsph_stress.rst rename to doc/src/compute_smd_ulsph_stress.rst diff --git a/doc/rst/compute_smd_vol.rst b/doc/src/compute_smd_vol.rst similarity index 100% rename from doc/rst/compute_smd_vol.rst rename to doc/src/compute_smd_vol.rst diff --git a/doc/rst/compute_sna_atom.rst b/doc/src/compute_sna_atom.rst similarity index 100% rename from doc/rst/compute_sna_atom.rst rename to doc/src/compute_sna_atom.rst diff --git a/doc/rst/compute_spin.rst b/doc/src/compute_spin.rst similarity index 100% rename from doc/rst/compute_spin.rst rename to doc/src/compute_spin.rst diff --git a/doc/rst/compute_stress_atom.rst b/doc/src/compute_stress_atom.rst similarity index 100% rename from doc/rst/compute_stress_atom.rst rename to doc/src/compute_stress_atom.rst diff --git a/doc/rst/compute_stress_mop.rst b/doc/src/compute_stress_mop.rst similarity index 100% rename from doc/rst/compute_stress_mop.rst rename to doc/src/compute_stress_mop.rst diff --git a/doc/rst/compute_tally.rst b/doc/src/compute_tally.rst similarity index 100% rename from doc/rst/compute_tally.rst rename to doc/src/compute_tally.rst diff --git a/doc/rst/compute_tdpd_cc_atom.rst b/doc/src/compute_tdpd_cc_atom.rst similarity index 100% rename from doc/rst/compute_tdpd_cc_atom.rst rename to doc/src/compute_tdpd_cc_atom.rst diff --git a/doc/rst/compute_temp.rst b/doc/src/compute_temp.rst similarity index 100% rename from doc/rst/compute_temp.rst rename to doc/src/compute_temp.rst diff --git a/doc/rst/compute_temp_asphere.rst b/doc/src/compute_temp_asphere.rst similarity index 100% rename from doc/rst/compute_temp_asphere.rst rename to doc/src/compute_temp_asphere.rst diff --git a/doc/rst/compute_temp_body.rst b/doc/src/compute_temp_body.rst similarity index 100% rename from doc/rst/compute_temp_body.rst rename to doc/src/compute_temp_body.rst diff --git a/doc/rst/compute_temp_chunk.rst b/doc/src/compute_temp_chunk.rst similarity index 100% rename from doc/rst/compute_temp_chunk.rst rename to doc/src/compute_temp_chunk.rst diff --git a/doc/rst/compute_temp_com.rst b/doc/src/compute_temp_com.rst similarity index 100% rename from doc/rst/compute_temp_com.rst rename to doc/src/compute_temp_com.rst diff --git a/doc/rst/compute_temp_cs.rst b/doc/src/compute_temp_cs.rst similarity index 100% rename from doc/rst/compute_temp_cs.rst rename to doc/src/compute_temp_cs.rst diff --git a/doc/rst/compute_temp_deform.rst b/doc/src/compute_temp_deform.rst similarity index 100% rename from doc/rst/compute_temp_deform.rst rename to doc/src/compute_temp_deform.rst diff --git a/doc/rst/compute_temp_deform_eff.rst b/doc/src/compute_temp_deform_eff.rst similarity index 100% rename from doc/rst/compute_temp_deform_eff.rst rename to doc/src/compute_temp_deform_eff.rst diff --git a/doc/rst/compute_temp_drude.rst b/doc/src/compute_temp_drude.rst similarity index 100% rename from doc/rst/compute_temp_drude.rst rename to doc/src/compute_temp_drude.rst diff --git a/doc/rst/compute_temp_eff.rst b/doc/src/compute_temp_eff.rst similarity index 100% rename from doc/rst/compute_temp_eff.rst rename to doc/src/compute_temp_eff.rst diff --git a/doc/rst/compute_temp_partial.rst b/doc/src/compute_temp_partial.rst similarity index 100% rename from doc/rst/compute_temp_partial.rst rename to doc/src/compute_temp_partial.rst diff --git a/doc/rst/compute_temp_profile.rst b/doc/src/compute_temp_profile.rst similarity index 100% rename from doc/rst/compute_temp_profile.rst rename to doc/src/compute_temp_profile.rst diff --git a/doc/rst/compute_temp_ramp.rst b/doc/src/compute_temp_ramp.rst similarity index 100% rename from doc/rst/compute_temp_ramp.rst rename to doc/src/compute_temp_ramp.rst diff --git a/doc/rst/compute_temp_region.rst b/doc/src/compute_temp_region.rst similarity index 100% rename from doc/rst/compute_temp_region.rst rename to doc/src/compute_temp_region.rst diff --git a/doc/rst/compute_temp_region_eff.rst b/doc/src/compute_temp_region_eff.rst similarity index 100% rename from doc/rst/compute_temp_region_eff.rst rename to doc/src/compute_temp_region_eff.rst diff --git a/doc/rst/compute_temp_rotate.rst b/doc/src/compute_temp_rotate.rst similarity index 100% rename from doc/rst/compute_temp_rotate.rst rename to doc/src/compute_temp_rotate.rst diff --git a/doc/rst/compute_temp_sphere.rst b/doc/src/compute_temp_sphere.rst similarity index 100% rename from doc/rst/compute_temp_sphere.rst rename to doc/src/compute_temp_sphere.rst diff --git a/doc/rst/compute_temp_uef.rst b/doc/src/compute_temp_uef.rst similarity index 100% rename from doc/rst/compute_temp_uef.rst rename to doc/src/compute_temp_uef.rst diff --git a/doc/rst/compute_ti.rst b/doc/src/compute_ti.rst similarity index 100% rename from doc/rst/compute_ti.rst rename to doc/src/compute_ti.rst diff --git a/doc/rst/compute_torque_chunk.rst b/doc/src/compute_torque_chunk.rst similarity index 100% rename from doc/rst/compute_torque_chunk.rst rename to doc/src/compute_torque_chunk.rst diff --git a/doc/rst/compute_vacf.rst b/doc/src/compute_vacf.rst similarity index 100% rename from doc/rst/compute_vacf.rst rename to doc/src/compute_vacf.rst diff --git a/doc/rst/compute_vcm_chunk.rst b/doc/src/compute_vcm_chunk.rst similarity index 100% rename from doc/rst/compute_vcm_chunk.rst rename to doc/src/compute_vcm_chunk.rst diff --git a/doc/rst/compute_voronoi_atom.rst b/doc/src/compute_voronoi_atom.rst similarity index 100% rename from doc/rst/compute_voronoi_atom.rst rename to doc/src/compute_voronoi_atom.rst diff --git a/doc/rst/compute_xrd.rst b/doc/src/compute_xrd.rst similarity index 100% rename from doc/rst/compute_xrd.rst rename to doc/src/compute_xrd.rst diff --git a/doc/rst/computes.rst b/doc/src/computes.rst similarity index 100% rename from doc/rst/computes.rst rename to doc/src/computes.rst diff --git a/doc/rst/create_atoms.rst b/doc/src/create_atoms.rst similarity index 100% rename from doc/rst/create_atoms.rst rename to doc/src/create_atoms.rst diff --git a/doc/rst/create_bonds.rst b/doc/src/create_bonds.rst similarity index 100% rename from doc/rst/create_bonds.rst rename to doc/src/create_bonds.rst diff --git a/doc/rst/create_box.rst b/doc/src/create_box.rst similarity index 100% rename from doc/rst/create_box.rst rename to doc/src/create_box.rst diff --git a/doc/rst/delete_atoms.rst b/doc/src/delete_atoms.rst similarity index 100% rename from doc/rst/delete_atoms.rst rename to doc/src/delete_atoms.rst diff --git a/doc/rst/delete_bonds.rst b/doc/src/delete_bonds.rst similarity index 100% rename from doc/rst/delete_bonds.rst rename to doc/src/delete_bonds.rst diff --git a/doc/rst/dielectric.rst b/doc/src/dielectric.rst similarity index 100% rename from doc/rst/dielectric.rst rename to doc/src/dielectric.rst diff --git a/doc/rst/dihedral_charmm.rst b/doc/src/dihedral_charmm.rst similarity index 100% rename from doc/rst/dihedral_charmm.rst rename to doc/src/dihedral_charmm.rst diff --git a/doc/rst/dihedral_class2.rst b/doc/src/dihedral_class2.rst similarity index 100% rename from doc/rst/dihedral_class2.rst rename to doc/src/dihedral_class2.rst diff --git a/doc/rst/dihedral_coeff.rst b/doc/src/dihedral_coeff.rst similarity index 100% rename from doc/rst/dihedral_coeff.rst rename to doc/src/dihedral_coeff.rst diff --git a/doc/rst/dihedral_cosine_shift_exp.rst b/doc/src/dihedral_cosine_shift_exp.rst similarity index 100% rename from doc/rst/dihedral_cosine_shift_exp.rst rename to doc/src/dihedral_cosine_shift_exp.rst diff --git a/doc/rst/dihedral_fourier.rst b/doc/src/dihedral_fourier.rst similarity index 100% rename from doc/rst/dihedral_fourier.rst rename to doc/src/dihedral_fourier.rst diff --git a/doc/rst/dihedral_harmonic.rst b/doc/src/dihedral_harmonic.rst similarity index 100% rename from doc/rst/dihedral_harmonic.rst rename to doc/src/dihedral_harmonic.rst diff --git a/doc/rst/dihedral_helix.rst b/doc/src/dihedral_helix.rst similarity index 100% rename from doc/rst/dihedral_helix.rst rename to doc/src/dihedral_helix.rst diff --git a/doc/rst/dihedral_hybrid.rst b/doc/src/dihedral_hybrid.rst similarity index 100% rename from doc/rst/dihedral_hybrid.rst rename to doc/src/dihedral_hybrid.rst diff --git a/doc/rst/dihedral_multi_harmonic.rst b/doc/src/dihedral_multi_harmonic.rst similarity index 100% rename from doc/rst/dihedral_multi_harmonic.rst rename to doc/src/dihedral_multi_harmonic.rst diff --git a/doc/rst/dihedral_nharmonic.rst b/doc/src/dihedral_nharmonic.rst similarity index 100% rename from doc/rst/dihedral_nharmonic.rst rename to doc/src/dihedral_nharmonic.rst diff --git a/doc/rst/dihedral_none.rst b/doc/src/dihedral_none.rst similarity index 100% rename from doc/rst/dihedral_none.rst rename to doc/src/dihedral_none.rst diff --git a/doc/rst/dihedral_opls.rst b/doc/src/dihedral_opls.rst similarity index 100% rename from doc/rst/dihedral_opls.rst rename to doc/src/dihedral_opls.rst diff --git a/doc/rst/dihedral_quadratic.rst b/doc/src/dihedral_quadratic.rst similarity index 100% rename from doc/rst/dihedral_quadratic.rst rename to doc/src/dihedral_quadratic.rst diff --git a/doc/rst/dihedral_spherical.rst b/doc/src/dihedral_spherical.rst similarity index 100% rename from doc/rst/dihedral_spherical.rst rename to doc/src/dihedral_spherical.rst diff --git a/doc/rst/dihedral_style.rst b/doc/src/dihedral_style.rst similarity index 100% rename from doc/rst/dihedral_style.rst rename to doc/src/dihedral_style.rst diff --git a/doc/rst/dihedral_table.rst b/doc/src/dihedral_table.rst similarity index 100% rename from doc/rst/dihedral_table.rst rename to doc/src/dihedral_table.rst diff --git a/doc/rst/dihedral_table_cut.rst b/doc/src/dihedral_table_cut.rst similarity index 100% rename from doc/rst/dihedral_table_cut.rst rename to doc/src/dihedral_table_cut.rst diff --git a/doc/rst/dihedral_zero.rst b/doc/src/dihedral_zero.rst similarity index 100% rename from doc/rst/dihedral_zero.rst rename to doc/src/dihedral_zero.rst diff --git a/doc/rst/dihedrals.rst b/doc/src/dihedrals.rst similarity index 100% rename from doc/rst/dihedrals.rst rename to doc/src/dihedrals.rst diff --git a/doc/rst/dimension.rst b/doc/src/dimension.rst similarity index 100% rename from doc/rst/dimension.rst rename to doc/src/dimension.rst diff --git a/doc/rst/displace_atoms.rst b/doc/src/displace_atoms.rst similarity index 100% rename from doc/rst/displace_atoms.rst rename to doc/src/displace_atoms.rst diff --git a/doc/rst/dump.rst b/doc/src/dump.rst similarity index 100% rename from doc/rst/dump.rst rename to doc/src/dump.rst diff --git a/doc/rst/dump_adios.rst b/doc/src/dump_adios.rst similarity index 100% rename from doc/rst/dump_adios.rst rename to doc/src/dump_adios.rst diff --git a/doc/rst/dump_cfg_uef.rst b/doc/src/dump_cfg_uef.rst similarity index 100% rename from doc/rst/dump_cfg_uef.rst rename to doc/src/dump_cfg_uef.rst diff --git a/doc/rst/dump_h5md.rst b/doc/src/dump_h5md.rst similarity index 100% rename from doc/rst/dump_h5md.rst rename to doc/src/dump_h5md.rst diff --git a/doc/rst/dump_image.rst b/doc/src/dump_image.rst similarity index 100% rename from doc/rst/dump_image.rst rename to doc/src/dump_image.rst diff --git a/doc/rst/dump_modify.rst b/doc/src/dump_modify.rst similarity index 100% rename from doc/rst/dump_modify.rst rename to doc/src/dump_modify.rst diff --git a/doc/rst/dump_molfile.rst b/doc/src/dump_molfile.rst similarity index 100% rename from doc/rst/dump_molfile.rst rename to doc/src/dump_molfile.rst diff --git a/doc/rst/dump_netcdf.rst b/doc/src/dump_netcdf.rst similarity index 100% rename from doc/rst/dump_netcdf.rst rename to doc/src/dump_netcdf.rst diff --git a/doc/rst/dump_vtk.rst b/doc/src/dump_vtk.rst similarity index 100% rename from doc/rst/dump_vtk.rst rename to doc/src/dump_vtk.rst diff --git a/doc/rst/dynamical_matrix.rst b/doc/src/dynamical_matrix.rst similarity index 100% rename from doc/rst/dynamical_matrix.rst rename to doc/src/dynamical_matrix.rst diff --git a/doc/rst/echo.rst b/doc/src/echo.rst similarity index 100% rename from doc/rst/echo.rst rename to doc/src/echo.rst diff --git a/doc/rst/fix.rst b/doc/src/fix.rst similarity index 100% rename from doc/rst/fix.rst rename to doc/src/fix.rst diff --git a/doc/rst/fix_adapt.rst b/doc/src/fix_adapt.rst similarity index 100% rename from doc/rst/fix_adapt.rst rename to doc/src/fix_adapt.rst diff --git a/doc/rst/fix_adapt_fep.rst b/doc/src/fix_adapt_fep.rst similarity index 100% rename from doc/rst/fix_adapt_fep.rst rename to doc/src/fix_adapt_fep.rst diff --git a/doc/rst/fix_addforce.rst b/doc/src/fix_addforce.rst similarity index 100% rename from doc/rst/fix_addforce.rst rename to doc/src/fix_addforce.rst diff --git a/doc/rst/fix_addtorque.rst b/doc/src/fix_addtorque.rst similarity index 100% rename from doc/rst/fix_addtorque.rst rename to doc/src/fix_addtorque.rst diff --git a/doc/rst/fix_append_atoms.rst b/doc/src/fix_append_atoms.rst similarity index 100% rename from doc/rst/fix_append_atoms.rst rename to doc/src/fix_append_atoms.rst diff --git a/doc/rst/fix_atc.rst b/doc/src/fix_atc.rst similarity index 100% rename from doc/rst/fix_atc.rst rename to doc/src/fix_atc.rst diff --git a/doc/rst/fix_atom_swap.rst b/doc/src/fix_atom_swap.rst similarity index 100% rename from doc/rst/fix_atom_swap.rst rename to doc/src/fix_atom_swap.rst diff --git a/doc/rst/fix_ave_atom.rst b/doc/src/fix_ave_atom.rst similarity index 100% rename from doc/rst/fix_ave_atom.rst rename to doc/src/fix_ave_atom.rst diff --git a/doc/rst/fix_ave_chunk.rst b/doc/src/fix_ave_chunk.rst similarity index 100% rename from doc/rst/fix_ave_chunk.rst rename to doc/src/fix_ave_chunk.rst diff --git a/doc/rst/fix_ave_correlate.rst b/doc/src/fix_ave_correlate.rst similarity index 100% rename from doc/rst/fix_ave_correlate.rst rename to doc/src/fix_ave_correlate.rst diff --git a/doc/rst/fix_ave_correlate_long.rst b/doc/src/fix_ave_correlate_long.rst similarity index 100% rename from doc/rst/fix_ave_correlate_long.rst rename to doc/src/fix_ave_correlate_long.rst diff --git a/doc/rst/fix_ave_histo.rst b/doc/src/fix_ave_histo.rst similarity index 100% rename from doc/rst/fix_ave_histo.rst rename to doc/src/fix_ave_histo.rst diff --git a/doc/rst/fix_ave_time.rst b/doc/src/fix_ave_time.rst similarity index 100% rename from doc/rst/fix_ave_time.rst rename to doc/src/fix_ave_time.rst diff --git a/doc/rst/fix_aveforce.rst b/doc/src/fix_aveforce.rst similarity index 100% rename from doc/rst/fix_aveforce.rst rename to doc/src/fix_aveforce.rst diff --git a/doc/rst/fix_balance.rst b/doc/src/fix_balance.rst similarity index 100% rename from doc/rst/fix_balance.rst rename to doc/src/fix_balance.rst diff --git a/doc/rst/fix_bocs.rst b/doc/src/fix_bocs.rst similarity index 100% rename from doc/rst/fix_bocs.rst rename to doc/src/fix_bocs.rst diff --git a/doc/rst/fix_bond_break.rst b/doc/src/fix_bond_break.rst similarity index 100% rename from doc/rst/fix_bond_break.rst rename to doc/src/fix_bond_break.rst diff --git a/doc/rst/fix_bond_create.rst b/doc/src/fix_bond_create.rst similarity index 100% rename from doc/rst/fix_bond_create.rst rename to doc/src/fix_bond_create.rst diff --git a/doc/rst/fix_bond_react.rst b/doc/src/fix_bond_react.rst similarity index 100% rename from doc/rst/fix_bond_react.rst rename to doc/src/fix_bond_react.rst diff --git a/doc/rst/fix_bond_swap.rst b/doc/src/fix_bond_swap.rst similarity index 100% rename from doc/rst/fix_bond_swap.rst rename to doc/src/fix_bond_swap.rst diff --git a/doc/rst/fix_box_relax.rst b/doc/src/fix_box_relax.rst similarity index 100% rename from doc/rst/fix_box_relax.rst rename to doc/src/fix_box_relax.rst diff --git a/doc/rst/fix_client_md.rst b/doc/src/fix_client_md.rst similarity index 100% rename from doc/rst/fix_client_md.rst rename to doc/src/fix_client_md.rst diff --git a/doc/rst/fix_cmap.rst b/doc/src/fix_cmap.rst similarity index 100% rename from doc/rst/fix_cmap.rst rename to doc/src/fix_cmap.rst diff --git a/doc/rst/fix_colvars.rst b/doc/src/fix_colvars.rst similarity index 100% rename from doc/rst/fix_colvars.rst rename to doc/src/fix_colvars.rst diff --git a/doc/rst/fix_controller.rst b/doc/src/fix_controller.rst similarity index 100% rename from doc/rst/fix_controller.rst rename to doc/src/fix_controller.rst diff --git a/doc/rst/fix_deform.rst b/doc/src/fix_deform.rst similarity index 100% rename from doc/rst/fix_deform.rst rename to doc/src/fix_deform.rst diff --git a/doc/rst/fix_deposit.rst b/doc/src/fix_deposit.rst similarity index 100% rename from doc/rst/fix_deposit.rst rename to doc/src/fix_deposit.rst diff --git a/doc/rst/fix_dpd_energy.rst b/doc/src/fix_dpd_energy.rst similarity index 100% rename from doc/rst/fix_dpd_energy.rst rename to doc/src/fix_dpd_energy.rst diff --git a/doc/rst/fix_dpd_source.rst b/doc/src/fix_dpd_source.rst similarity index 100% rename from doc/rst/fix_dpd_source.rst rename to doc/src/fix_dpd_source.rst diff --git a/doc/rst/fix_drag.rst b/doc/src/fix_drag.rst similarity index 100% rename from doc/rst/fix_drag.rst rename to doc/src/fix_drag.rst diff --git a/doc/rst/fix_drude.rst b/doc/src/fix_drude.rst similarity index 100% rename from doc/rst/fix_drude.rst rename to doc/src/fix_drude.rst diff --git a/doc/rst/fix_drude_transform.rst b/doc/src/fix_drude_transform.rst similarity index 100% rename from doc/rst/fix_drude_transform.rst rename to doc/src/fix_drude_transform.rst diff --git a/doc/rst/fix_dt_reset.rst b/doc/src/fix_dt_reset.rst similarity index 100% rename from doc/rst/fix_dt_reset.rst rename to doc/src/fix_dt_reset.rst diff --git a/doc/rst/fix_efield.rst b/doc/src/fix_efield.rst similarity index 100% rename from doc/rst/fix_efield.rst rename to doc/src/fix_efield.rst diff --git a/doc/rst/fix_ehex.rst b/doc/src/fix_ehex.rst similarity index 100% rename from doc/rst/fix_ehex.rst rename to doc/src/fix_ehex.rst diff --git a/doc/rst/fix_electron_stopping.rst b/doc/src/fix_electron_stopping.rst similarity index 100% rename from doc/rst/fix_electron_stopping.rst rename to doc/src/fix_electron_stopping.rst diff --git a/doc/rst/fix_enforce2d.rst b/doc/src/fix_enforce2d.rst similarity index 100% rename from doc/rst/fix_enforce2d.rst rename to doc/src/fix_enforce2d.rst diff --git a/doc/rst/fix_eos_cv.rst b/doc/src/fix_eos_cv.rst similarity index 100% rename from doc/rst/fix_eos_cv.rst rename to doc/src/fix_eos_cv.rst diff --git a/doc/rst/fix_eos_table.rst b/doc/src/fix_eos_table.rst similarity index 100% rename from doc/rst/fix_eos_table.rst rename to doc/src/fix_eos_table.rst diff --git a/doc/rst/fix_eos_table_rx.rst b/doc/src/fix_eos_table_rx.rst similarity index 100% rename from doc/rst/fix_eos_table_rx.rst rename to doc/src/fix_eos_table_rx.rst diff --git a/doc/rst/fix_evaporate.rst b/doc/src/fix_evaporate.rst similarity index 100% rename from doc/rst/fix_evaporate.rst rename to doc/src/fix_evaporate.rst diff --git a/doc/rst/fix_external.rst b/doc/src/fix_external.rst similarity index 100% rename from doc/rst/fix_external.rst rename to doc/src/fix_external.rst diff --git a/doc/rst/fix_ffl.rst b/doc/src/fix_ffl.rst similarity index 100% rename from doc/rst/fix_ffl.rst rename to doc/src/fix_ffl.rst diff --git a/doc/rst/fix_filter_corotate.rst b/doc/src/fix_filter_corotate.rst similarity index 100% rename from doc/rst/fix_filter_corotate.rst rename to doc/src/fix_filter_corotate.rst diff --git a/doc/rst/fix_flow_gauss.rst b/doc/src/fix_flow_gauss.rst similarity index 100% rename from doc/rst/fix_flow_gauss.rst rename to doc/src/fix_flow_gauss.rst diff --git a/doc/rst/fix_freeze.rst b/doc/src/fix_freeze.rst similarity index 100% rename from doc/rst/fix_freeze.rst rename to doc/src/fix_freeze.rst diff --git a/doc/rst/fix_gcmc.rst b/doc/src/fix_gcmc.rst similarity index 100% rename from doc/rst/fix_gcmc.rst rename to doc/src/fix_gcmc.rst diff --git a/doc/rst/fix_gld.rst b/doc/src/fix_gld.rst similarity index 100% rename from doc/rst/fix_gld.rst rename to doc/src/fix_gld.rst diff --git a/doc/rst/fix_gle.rst b/doc/src/fix_gle.rst similarity index 100% rename from doc/rst/fix_gle.rst rename to doc/src/fix_gle.rst diff --git a/doc/rst/fix_gravity.rst b/doc/src/fix_gravity.rst similarity index 100% rename from doc/rst/fix_gravity.rst rename to doc/src/fix_gravity.rst diff --git a/doc/rst/fix_grem.rst b/doc/src/fix_grem.rst similarity index 100% rename from doc/rst/fix_grem.rst rename to doc/src/fix_grem.rst diff --git a/doc/rst/fix_halt.rst b/doc/src/fix_halt.rst similarity index 100% rename from doc/rst/fix_halt.rst rename to doc/src/fix_halt.rst diff --git a/doc/rst/fix_heat.rst b/doc/src/fix_heat.rst similarity index 100% rename from doc/rst/fix_heat.rst rename to doc/src/fix_heat.rst diff --git a/doc/rst/fix_hyper_global.rst b/doc/src/fix_hyper_global.rst similarity index 100% rename from doc/rst/fix_hyper_global.rst rename to doc/src/fix_hyper_global.rst diff --git a/doc/rst/fix_hyper_local.rst b/doc/src/fix_hyper_local.rst similarity index 100% rename from doc/rst/fix_hyper_local.rst rename to doc/src/fix_hyper_local.rst diff --git a/doc/rst/fix_imd.rst b/doc/src/fix_imd.rst similarity index 100% rename from doc/rst/fix_imd.rst rename to doc/src/fix_imd.rst diff --git a/doc/rst/fix_indent.rst b/doc/src/fix_indent.rst similarity index 100% rename from doc/rst/fix_indent.rst rename to doc/src/fix_indent.rst diff --git a/doc/rst/fix_ipi.rst b/doc/src/fix_ipi.rst similarity index 100% rename from doc/rst/fix_ipi.rst rename to doc/src/fix_ipi.rst diff --git a/doc/rst/fix_langevin.rst b/doc/src/fix_langevin.rst similarity index 100% rename from doc/rst/fix_langevin.rst rename to doc/src/fix_langevin.rst diff --git a/doc/rst/fix_langevin_drude.rst b/doc/src/fix_langevin_drude.rst similarity index 100% rename from doc/rst/fix_langevin_drude.rst rename to doc/src/fix_langevin_drude.rst diff --git a/doc/rst/fix_langevin_eff.rst b/doc/src/fix_langevin_eff.rst similarity index 100% rename from doc/rst/fix_langevin_eff.rst rename to doc/src/fix_langevin_eff.rst diff --git a/doc/rst/fix_langevin_spin.rst b/doc/src/fix_langevin_spin.rst similarity index 100% rename from doc/rst/fix_langevin_spin.rst rename to doc/src/fix_langevin_spin.rst diff --git a/doc/rst/fix_latte.rst b/doc/src/fix_latte.rst similarity index 100% rename from doc/rst/fix_latte.rst rename to doc/src/fix_latte.rst diff --git a/doc/rst/fix_lb_fluid.rst b/doc/src/fix_lb_fluid.rst similarity index 100% rename from doc/rst/fix_lb_fluid.rst rename to doc/src/fix_lb_fluid.rst diff --git a/doc/rst/fix_lb_momentum.rst b/doc/src/fix_lb_momentum.rst similarity index 100% rename from doc/rst/fix_lb_momentum.rst rename to doc/src/fix_lb_momentum.rst diff --git a/doc/rst/fix_lb_pc.rst b/doc/src/fix_lb_pc.rst similarity index 100% rename from doc/rst/fix_lb_pc.rst rename to doc/src/fix_lb_pc.rst diff --git a/doc/rst/fix_lb_rigid_pc_sphere.rst b/doc/src/fix_lb_rigid_pc_sphere.rst similarity index 100% rename from doc/rst/fix_lb_rigid_pc_sphere.rst rename to doc/src/fix_lb_rigid_pc_sphere.rst diff --git a/doc/rst/fix_lb_viscous.rst b/doc/src/fix_lb_viscous.rst similarity index 100% rename from doc/rst/fix_lb_viscous.rst rename to doc/src/fix_lb_viscous.rst diff --git a/doc/rst/fix_lineforce.rst b/doc/src/fix_lineforce.rst similarity index 100% rename from doc/rst/fix_lineforce.rst rename to doc/src/fix_lineforce.rst diff --git a/doc/rst/fix_manifoldforce.rst b/doc/src/fix_manifoldforce.rst similarity index 100% rename from doc/rst/fix_manifoldforce.rst rename to doc/src/fix_manifoldforce.rst diff --git a/doc/rst/fix_meso.rst b/doc/src/fix_meso.rst similarity index 100% rename from doc/rst/fix_meso.rst rename to doc/src/fix_meso.rst diff --git a/doc/rst/fix_meso_move.rst b/doc/src/fix_meso_move.rst similarity index 100% rename from doc/rst/fix_meso_move.rst rename to doc/src/fix_meso_move.rst diff --git a/doc/rst/fix_meso_stationary.rst b/doc/src/fix_meso_stationary.rst similarity index 100% rename from doc/rst/fix_meso_stationary.rst rename to doc/src/fix_meso_stationary.rst diff --git a/doc/rst/fix_modify.rst b/doc/src/fix_modify.rst similarity index 100% rename from doc/rst/fix_modify.rst rename to doc/src/fix_modify.rst diff --git a/doc/rst/fix_momentum.rst b/doc/src/fix_momentum.rst similarity index 100% rename from doc/rst/fix_momentum.rst rename to doc/src/fix_momentum.rst diff --git a/doc/rst/fix_move.rst b/doc/src/fix_move.rst similarity index 100% rename from doc/rst/fix_move.rst rename to doc/src/fix_move.rst diff --git a/doc/rst/fix_mscg.rst b/doc/src/fix_mscg.rst similarity index 100% rename from doc/rst/fix_mscg.rst rename to doc/src/fix_mscg.rst diff --git a/doc/rst/fix_msst.rst b/doc/src/fix_msst.rst similarity index 100% rename from doc/rst/fix_msst.rst rename to doc/src/fix_msst.rst diff --git a/doc/rst/fix_mvv_dpd.rst b/doc/src/fix_mvv_dpd.rst similarity index 100% rename from doc/rst/fix_mvv_dpd.rst rename to doc/src/fix_mvv_dpd.rst diff --git a/doc/rst/fix_neb.rst b/doc/src/fix_neb.rst similarity index 100% rename from doc/rst/fix_neb.rst rename to doc/src/fix_neb.rst diff --git a/doc/rst/fix_neb_spin.rst b/doc/src/fix_neb_spin.rst similarity index 100% rename from doc/rst/fix_neb_spin.rst rename to doc/src/fix_neb_spin.rst diff --git a/doc/rst/fix_nh.rst b/doc/src/fix_nh.rst similarity index 100% rename from doc/rst/fix_nh.rst rename to doc/src/fix_nh.rst diff --git a/doc/rst/fix_nh_eff.rst b/doc/src/fix_nh_eff.rst similarity index 100% rename from doc/rst/fix_nh_eff.rst rename to doc/src/fix_nh_eff.rst diff --git a/doc/rst/fix_nh_uef.rst b/doc/src/fix_nh_uef.rst similarity index 100% rename from doc/rst/fix_nh_uef.rst rename to doc/src/fix_nh_uef.rst diff --git a/doc/rst/fix_nph_asphere.rst b/doc/src/fix_nph_asphere.rst similarity index 100% rename from doc/rst/fix_nph_asphere.rst rename to doc/src/fix_nph_asphere.rst diff --git a/doc/rst/fix_nph_body.rst b/doc/src/fix_nph_body.rst similarity index 100% rename from doc/rst/fix_nph_body.rst rename to doc/src/fix_nph_body.rst diff --git a/doc/rst/fix_nph_sphere.rst b/doc/src/fix_nph_sphere.rst similarity index 100% rename from doc/rst/fix_nph_sphere.rst rename to doc/src/fix_nph_sphere.rst diff --git a/doc/rst/fix_nphug.rst b/doc/src/fix_nphug.rst similarity index 100% rename from doc/rst/fix_nphug.rst rename to doc/src/fix_nphug.rst diff --git a/doc/rst/fix_npt_asphere.rst b/doc/src/fix_npt_asphere.rst similarity index 100% rename from doc/rst/fix_npt_asphere.rst rename to doc/src/fix_npt_asphere.rst diff --git a/doc/rst/fix_npt_body.rst b/doc/src/fix_npt_body.rst similarity index 100% rename from doc/rst/fix_npt_body.rst rename to doc/src/fix_npt_body.rst diff --git a/doc/rst/fix_npt_sphere.rst b/doc/src/fix_npt_sphere.rst similarity index 100% rename from doc/rst/fix_npt_sphere.rst rename to doc/src/fix_npt_sphere.rst diff --git a/doc/rst/fix_nve.rst b/doc/src/fix_nve.rst similarity index 100% rename from doc/rst/fix_nve.rst rename to doc/src/fix_nve.rst diff --git a/doc/rst/fix_nve_asphere.rst b/doc/src/fix_nve_asphere.rst similarity index 100% rename from doc/rst/fix_nve_asphere.rst rename to doc/src/fix_nve_asphere.rst diff --git a/doc/rst/fix_nve_asphere_noforce.rst b/doc/src/fix_nve_asphere_noforce.rst similarity index 100% rename from doc/rst/fix_nve_asphere_noforce.rst rename to doc/src/fix_nve_asphere_noforce.rst diff --git a/doc/rst/fix_nve_awpmd.rst b/doc/src/fix_nve_awpmd.rst similarity index 100% rename from doc/rst/fix_nve_awpmd.rst rename to doc/src/fix_nve_awpmd.rst diff --git a/doc/rst/fix_nve_body.rst b/doc/src/fix_nve_body.rst similarity index 100% rename from doc/rst/fix_nve_body.rst rename to doc/src/fix_nve_body.rst diff --git a/doc/rst/fix_nve_dot.rst b/doc/src/fix_nve_dot.rst similarity index 100% rename from doc/rst/fix_nve_dot.rst rename to doc/src/fix_nve_dot.rst diff --git a/doc/rst/fix_nve_dotc_langevin.rst b/doc/src/fix_nve_dotc_langevin.rst similarity index 100% rename from doc/rst/fix_nve_dotc_langevin.rst rename to doc/src/fix_nve_dotc_langevin.rst diff --git a/doc/rst/fix_nve_eff.rst b/doc/src/fix_nve_eff.rst similarity index 100% rename from doc/rst/fix_nve_eff.rst rename to doc/src/fix_nve_eff.rst diff --git a/doc/rst/fix_nve_limit.rst b/doc/src/fix_nve_limit.rst similarity index 100% rename from doc/rst/fix_nve_limit.rst rename to doc/src/fix_nve_limit.rst diff --git a/doc/rst/fix_nve_line.rst b/doc/src/fix_nve_line.rst similarity index 100% rename from doc/rst/fix_nve_line.rst rename to doc/src/fix_nve_line.rst diff --git a/doc/rst/fix_nve_manifold_rattle.rst b/doc/src/fix_nve_manifold_rattle.rst similarity index 100% rename from doc/rst/fix_nve_manifold_rattle.rst rename to doc/src/fix_nve_manifold_rattle.rst diff --git a/doc/rst/fix_nve_noforce.rst b/doc/src/fix_nve_noforce.rst similarity index 100% rename from doc/rst/fix_nve_noforce.rst rename to doc/src/fix_nve_noforce.rst diff --git a/doc/rst/fix_nve_sphere.rst b/doc/src/fix_nve_sphere.rst similarity index 100% rename from doc/rst/fix_nve_sphere.rst rename to doc/src/fix_nve_sphere.rst diff --git a/doc/rst/fix_nve_spin.rst b/doc/src/fix_nve_spin.rst similarity index 100% rename from doc/rst/fix_nve_spin.rst rename to doc/src/fix_nve_spin.rst diff --git a/doc/rst/fix_nve_tri.rst b/doc/src/fix_nve_tri.rst similarity index 100% rename from doc/rst/fix_nve_tri.rst rename to doc/src/fix_nve_tri.rst diff --git a/doc/rst/fix_nvk.rst b/doc/src/fix_nvk.rst similarity index 100% rename from doc/rst/fix_nvk.rst rename to doc/src/fix_nvk.rst diff --git a/doc/rst/fix_nvt_asphere.rst b/doc/src/fix_nvt_asphere.rst similarity index 100% rename from doc/rst/fix_nvt_asphere.rst rename to doc/src/fix_nvt_asphere.rst diff --git a/doc/rst/fix_nvt_body.rst b/doc/src/fix_nvt_body.rst similarity index 100% rename from doc/rst/fix_nvt_body.rst rename to doc/src/fix_nvt_body.rst diff --git a/doc/rst/fix_nvt_manifold_rattle.rst b/doc/src/fix_nvt_manifold_rattle.rst similarity index 100% rename from doc/rst/fix_nvt_manifold_rattle.rst rename to doc/src/fix_nvt_manifold_rattle.rst diff --git a/doc/rst/fix_nvt_sllod.rst b/doc/src/fix_nvt_sllod.rst similarity index 100% rename from doc/rst/fix_nvt_sllod.rst rename to doc/src/fix_nvt_sllod.rst diff --git a/doc/rst/fix_nvt_sllod_eff.rst b/doc/src/fix_nvt_sllod_eff.rst similarity index 100% rename from doc/rst/fix_nvt_sllod_eff.rst rename to doc/src/fix_nvt_sllod_eff.rst diff --git a/doc/rst/fix_nvt_sphere.rst b/doc/src/fix_nvt_sphere.rst similarity index 100% rename from doc/rst/fix_nvt_sphere.rst rename to doc/src/fix_nvt_sphere.rst diff --git a/doc/rst/fix_oneway.rst b/doc/src/fix_oneway.rst similarity index 100% rename from doc/rst/fix_oneway.rst rename to doc/src/fix_oneway.rst diff --git a/doc/rst/fix_orient.rst b/doc/src/fix_orient.rst similarity index 100% rename from doc/rst/fix_orient.rst rename to doc/src/fix_orient.rst diff --git a/doc/rst/fix_phonon.rst b/doc/src/fix_phonon.rst similarity index 100% rename from doc/rst/fix_phonon.rst rename to doc/src/fix_phonon.rst diff --git a/doc/rst/fix_pimd.rst b/doc/src/fix_pimd.rst similarity index 100% rename from doc/rst/fix_pimd.rst rename to doc/src/fix_pimd.rst diff --git a/doc/rst/fix_planeforce.rst b/doc/src/fix_planeforce.rst similarity index 100% rename from doc/rst/fix_planeforce.rst rename to doc/src/fix_planeforce.rst diff --git a/doc/rst/fix_plumed.rst b/doc/src/fix_plumed.rst similarity index 100% rename from doc/rst/fix_plumed.rst rename to doc/src/fix_plumed.rst diff --git a/doc/rst/fix_poems.rst b/doc/src/fix_poems.rst similarity index 100% rename from doc/rst/fix_poems.rst rename to doc/src/fix_poems.rst diff --git a/doc/rst/fix_pour.rst b/doc/src/fix_pour.rst similarity index 100% rename from doc/rst/fix_pour.rst rename to doc/src/fix_pour.rst diff --git a/doc/rst/fix_precession_spin.rst b/doc/src/fix_precession_spin.rst similarity index 100% rename from doc/rst/fix_precession_spin.rst rename to doc/src/fix_precession_spin.rst diff --git a/doc/rst/fix_press_berendsen.rst b/doc/src/fix_press_berendsen.rst similarity index 100% rename from doc/rst/fix_press_berendsen.rst rename to doc/src/fix_press_berendsen.rst diff --git a/doc/rst/fix_print.rst b/doc/src/fix_print.rst similarity index 100% rename from doc/rst/fix_print.rst rename to doc/src/fix_print.rst diff --git a/doc/rst/fix_property_atom.rst b/doc/src/fix_property_atom.rst similarity index 100% rename from doc/rst/fix_property_atom.rst rename to doc/src/fix_property_atom.rst diff --git a/doc/rst/fix_python_invoke.rst b/doc/src/fix_python_invoke.rst similarity index 100% rename from doc/rst/fix_python_invoke.rst rename to doc/src/fix_python_invoke.rst diff --git a/doc/rst/fix_python_move.rst b/doc/src/fix_python_move.rst similarity index 100% rename from doc/rst/fix_python_move.rst rename to doc/src/fix_python_move.rst diff --git a/doc/rst/fix_qbmsst.rst b/doc/src/fix_qbmsst.rst similarity index 100% rename from doc/rst/fix_qbmsst.rst rename to doc/src/fix_qbmsst.rst diff --git a/doc/rst/fix_qeq.rst b/doc/src/fix_qeq.rst similarity index 100% rename from doc/rst/fix_qeq.rst rename to doc/src/fix_qeq.rst diff --git a/doc/rst/fix_qeq_comb.rst b/doc/src/fix_qeq_comb.rst similarity index 100% rename from doc/rst/fix_qeq_comb.rst rename to doc/src/fix_qeq_comb.rst diff --git a/doc/rst/fix_qeq_reax.rst b/doc/src/fix_qeq_reax.rst similarity index 100% rename from doc/rst/fix_qeq_reax.rst rename to doc/src/fix_qeq_reax.rst diff --git a/doc/rst/fix_qmmm.rst b/doc/src/fix_qmmm.rst similarity index 100% rename from doc/rst/fix_qmmm.rst rename to doc/src/fix_qmmm.rst diff --git a/doc/rst/fix_qtb.rst b/doc/src/fix_qtb.rst similarity index 100% rename from doc/rst/fix_qtb.rst rename to doc/src/fix_qtb.rst diff --git a/doc/rst/fix_reaxc_bonds.rst b/doc/src/fix_reaxc_bonds.rst similarity index 100% rename from doc/rst/fix_reaxc_bonds.rst rename to doc/src/fix_reaxc_bonds.rst diff --git a/doc/rst/fix_reaxc_species.rst b/doc/src/fix_reaxc_species.rst similarity index 100% rename from doc/rst/fix_reaxc_species.rst rename to doc/src/fix_reaxc_species.rst diff --git a/doc/rst/fix_recenter.rst b/doc/src/fix_recenter.rst similarity index 100% rename from doc/rst/fix_recenter.rst rename to doc/src/fix_recenter.rst diff --git a/doc/rst/fix_restrain.rst b/doc/src/fix_restrain.rst similarity index 100% rename from doc/rst/fix_restrain.rst rename to doc/src/fix_restrain.rst diff --git a/doc/rst/fix_rhok.rst b/doc/src/fix_rhok.rst similarity index 100% rename from doc/rst/fix_rhok.rst rename to doc/src/fix_rhok.rst diff --git a/doc/rst/fix_rigid.rst b/doc/src/fix_rigid.rst similarity index 100% rename from doc/rst/fix_rigid.rst rename to doc/src/fix_rigid.rst diff --git a/doc/rst/fix_rigid_meso.rst b/doc/src/fix_rigid_meso.rst similarity index 100% rename from doc/rst/fix_rigid_meso.rst rename to doc/src/fix_rigid_meso.rst diff --git a/doc/rst/fix_rx.rst b/doc/src/fix_rx.rst similarity index 100% rename from doc/rst/fix_rx.rst rename to doc/src/fix_rx.rst diff --git a/doc/rst/fix_saed_vtk.rst b/doc/src/fix_saed_vtk.rst similarity index 100% rename from doc/rst/fix_saed_vtk.rst rename to doc/src/fix_saed_vtk.rst diff --git a/doc/rst/fix_setforce.rst b/doc/src/fix_setforce.rst similarity index 100% rename from doc/rst/fix_setforce.rst rename to doc/src/fix_setforce.rst diff --git a/doc/rst/fix_shake.rst b/doc/src/fix_shake.rst similarity index 100% rename from doc/rst/fix_shake.rst rename to doc/src/fix_shake.rst diff --git a/doc/rst/fix_shardlow.rst b/doc/src/fix_shardlow.rst similarity index 100% rename from doc/rst/fix_shardlow.rst rename to doc/src/fix_shardlow.rst diff --git a/doc/rst/fix_smd.rst b/doc/src/fix_smd.rst similarity index 100% rename from doc/rst/fix_smd.rst rename to doc/src/fix_smd.rst diff --git a/doc/rst/fix_smd_adjust_dt.rst b/doc/src/fix_smd_adjust_dt.rst similarity index 100% rename from doc/rst/fix_smd_adjust_dt.rst rename to doc/src/fix_smd_adjust_dt.rst diff --git a/doc/rst/fix_smd_integrate_tlsph.rst b/doc/src/fix_smd_integrate_tlsph.rst similarity index 100% rename from doc/rst/fix_smd_integrate_tlsph.rst rename to doc/src/fix_smd_integrate_tlsph.rst diff --git a/doc/rst/fix_smd_integrate_ulsph.rst b/doc/src/fix_smd_integrate_ulsph.rst similarity index 100% rename from doc/rst/fix_smd_integrate_ulsph.rst rename to doc/src/fix_smd_integrate_ulsph.rst diff --git a/doc/rst/fix_smd_move_triangulated_surface.rst b/doc/src/fix_smd_move_triangulated_surface.rst similarity index 100% rename from doc/rst/fix_smd_move_triangulated_surface.rst rename to doc/src/fix_smd_move_triangulated_surface.rst diff --git a/doc/rst/fix_smd_setvel.rst b/doc/src/fix_smd_setvel.rst similarity index 100% rename from doc/rst/fix_smd_setvel.rst rename to doc/src/fix_smd_setvel.rst diff --git a/doc/rst/fix_smd_wall_surface.rst b/doc/src/fix_smd_wall_surface.rst similarity index 100% rename from doc/rst/fix_smd_wall_surface.rst rename to doc/src/fix_smd_wall_surface.rst diff --git a/doc/rst/fix_spring.rst b/doc/src/fix_spring.rst similarity index 100% rename from doc/rst/fix_spring.rst rename to doc/src/fix_spring.rst diff --git a/doc/rst/fix_spring_chunk.rst b/doc/src/fix_spring_chunk.rst similarity index 100% rename from doc/rst/fix_spring_chunk.rst rename to doc/src/fix_spring_chunk.rst diff --git a/doc/rst/fix_spring_rg.rst b/doc/src/fix_spring_rg.rst similarity index 100% rename from doc/rst/fix_spring_rg.rst rename to doc/src/fix_spring_rg.rst diff --git a/doc/rst/fix_spring_self.rst b/doc/src/fix_spring_self.rst similarity index 100% rename from doc/rst/fix_spring_self.rst rename to doc/src/fix_spring_self.rst diff --git a/doc/rst/fix_srd.rst b/doc/src/fix_srd.rst similarity index 100% rename from doc/rst/fix_srd.rst rename to doc/src/fix_srd.rst diff --git a/doc/rst/fix_store_force.rst b/doc/src/fix_store_force.rst similarity index 100% rename from doc/rst/fix_store_force.rst rename to doc/src/fix_store_force.rst diff --git a/doc/rst/fix_store_state.rst b/doc/src/fix_store_state.rst similarity index 100% rename from doc/rst/fix_store_state.rst rename to doc/src/fix_store_state.rst diff --git a/doc/rst/fix_temp_berendsen.rst b/doc/src/fix_temp_berendsen.rst similarity index 100% rename from doc/rst/fix_temp_berendsen.rst rename to doc/src/fix_temp_berendsen.rst diff --git a/doc/rst/fix_temp_csvr.rst b/doc/src/fix_temp_csvr.rst similarity index 100% rename from doc/rst/fix_temp_csvr.rst rename to doc/src/fix_temp_csvr.rst diff --git a/doc/rst/fix_temp_rescale.rst b/doc/src/fix_temp_rescale.rst similarity index 100% rename from doc/rst/fix_temp_rescale.rst rename to doc/src/fix_temp_rescale.rst diff --git a/doc/rst/fix_temp_rescale_eff.rst b/doc/src/fix_temp_rescale_eff.rst similarity index 100% rename from doc/rst/fix_temp_rescale_eff.rst rename to doc/src/fix_temp_rescale_eff.rst diff --git a/doc/rst/fix_tfmc.rst b/doc/src/fix_tfmc.rst similarity index 100% rename from doc/rst/fix_tfmc.rst rename to doc/src/fix_tfmc.rst diff --git a/doc/rst/fix_thermal_conductivity.rst b/doc/src/fix_thermal_conductivity.rst similarity index 100% rename from doc/rst/fix_thermal_conductivity.rst rename to doc/src/fix_thermal_conductivity.rst diff --git a/doc/rst/fix_ti_spring.rst b/doc/src/fix_ti_spring.rst similarity index 100% rename from doc/rst/fix_ti_spring.rst rename to doc/src/fix_ti_spring.rst diff --git a/doc/rst/fix_tmd.rst b/doc/src/fix_tmd.rst similarity index 100% rename from doc/rst/fix_tmd.rst rename to doc/src/fix_tmd.rst diff --git a/doc/rst/fix_ttm.rst b/doc/src/fix_ttm.rst similarity index 100% rename from doc/rst/fix_ttm.rst rename to doc/src/fix_ttm.rst diff --git a/doc/rst/fix_tune_kspace.rst b/doc/src/fix_tune_kspace.rst similarity index 100% rename from doc/rst/fix_tune_kspace.rst rename to doc/src/fix_tune_kspace.rst diff --git a/doc/rst/fix_vector.rst b/doc/src/fix_vector.rst similarity index 100% rename from doc/rst/fix_vector.rst rename to doc/src/fix_vector.rst diff --git a/doc/rst/fix_viscosity.rst b/doc/src/fix_viscosity.rst similarity index 100% rename from doc/rst/fix_viscosity.rst rename to doc/src/fix_viscosity.rst diff --git a/doc/rst/fix_viscous.rst b/doc/src/fix_viscous.rst similarity index 100% rename from doc/rst/fix_viscous.rst rename to doc/src/fix_viscous.rst diff --git a/doc/rst/fix_wall.rst b/doc/src/fix_wall.rst similarity index 100% rename from doc/rst/fix_wall.rst rename to doc/src/fix_wall.rst diff --git a/doc/rst/fix_wall_body_polygon.rst b/doc/src/fix_wall_body_polygon.rst similarity index 100% rename from doc/rst/fix_wall_body_polygon.rst rename to doc/src/fix_wall_body_polygon.rst diff --git a/doc/rst/fix_wall_body_polyhedron.rst b/doc/src/fix_wall_body_polyhedron.rst similarity index 100% rename from doc/rst/fix_wall_body_polyhedron.rst rename to doc/src/fix_wall_body_polyhedron.rst diff --git a/doc/rst/fix_wall_ees.rst b/doc/src/fix_wall_ees.rst similarity index 100% rename from doc/rst/fix_wall_ees.rst rename to doc/src/fix_wall_ees.rst diff --git a/doc/rst/fix_wall_gran.rst b/doc/src/fix_wall_gran.rst similarity index 100% rename from doc/rst/fix_wall_gran.rst rename to doc/src/fix_wall_gran.rst diff --git a/doc/rst/fix_wall_gran_region.rst b/doc/src/fix_wall_gran_region.rst similarity index 100% rename from doc/rst/fix_wall_gran_region.rst rename to doc/src/fix_wall_gran_region.rst diff --git a/doc/rst/fix_wall_piston.rst b/doc/src/fix_wall_piston.rst similarity index 100% rename from doc/rst/fix_wall_piston.rst rename to doc/src/fix_wall_piston.rst diff --git a/doc/rst/fix_wall_reflect.rst b/doc/src/fix_wall_reflect.rst similarity index 100% rename from doc/rst/fix_wall_reflect.rst rename to doc/src/fix_wall_reflect.rst diff --git a/doc/rst/fix_wall_region.rst b/doc/src/fix_wall_region.rst similarity index 100% rename from doc/rst/fix_wall_region.rst rename to doc/src/fix_wall_region.rst diff --git a/doc/rst/fix_wall_srd.rst b/doc/src/fix_wall_srd.rst similarity index 100% rename from doc/rst/fix_wall_srd.rst rename to doc/src/fix_wall_srd.rst diff --git a/doc/rst/fixes.rst b/doc/src/fixes.rst similarity index 100% rename from doc/rst/fixes.rst rename to doc/src/fixes.rst diff --git a/doc/rst/group.rst b/doc/src/group.rst similarity index 100% rename from doc/rst/group.rst rename to doc/src/group.rst diff --git a/doc/rst/group2ndx.rst b/doc/src/group2ndx.rst similarity index 100% rename from doc/rst/group2ndx.rst rename to doc/src/group2ndx.rst diff --git a/doc/rst/hyper.rst b/doc/src/hyper.rst similarity index 100% rename from doc/rst/hyper.rst rename to doc/src/hyper.rst diff --git a/doc/rst/if.rst b/doc/src/if.rst similarity index 100% rename from doc/rst/if.rst rename to doc/src/if.rst diff --git a/doc/rst/improper_class2.rst b/doc/src/improper_class2.rst similarity index 100% rename from doc/rst/improper_class2.rst rename to doc/src/improper_class2.rst diff --git a/doc/rst/improper_coeff.rst b/doc/src/improper_coeff.rst similarity index 100% rename from doc/rst/improper_coeff.rst rename to doc/src/improper_coeff.rst diff --git a/doc/rst/improper_cossq.rst b/doc/src/improper_cossq.rst similarity index 100% rename from doc/rst/improper_cossq.rst rename to doc/src/improper_cossq.rst diff --git a/doc/rst/improper_cvff.rst b/doc/src/improper_cvff.rst similarity index 100% rename from doc/rst/improper_cvff.rst rename to doc/src/improper_cvff.rst diff --git a/doc/rst/improper_distance.rst b/doc/src/improper_distance.rst similarity index 100% rename from doc/rst/improper_distance.rst rename to doc/src/improper_distance.rst diff --git a/doc/rst/improper_distharm.rst b/doc/src/improper_distharm.rst similarity index 100% rename from doc/rst/improper_distharm.rst rename to doc/src/improper_distharm.rst diff --git a/doc/rst/improper_fourier.rst b/doc/src/improper_fourier.rst similarity index 100% rename from doc/rst/improper_fourier.rst rename to doc/src/improper_fourier.rst diff --git a/doc/rst/improper_harmonic.rst b/doc/src/improper_harmonic.rst similarity index 100% rename from doc/rst/improper_harmonic.rst rename to doc/src/improper_harmonic.rst diff --git a/doc/rst/improper_hybrid.rst b/doc/src/improper_hybrid.rst similarity index 100% rename from doc/rst/improper_hybrid.rst rename to doc/src/improper_hybrid.rst diff --git a/doc/rst/improper_inversion_harmonic.rst b/doc/src/improper_inversion_harmonic.rst similarity index 100% rename from doc/rst/improper_inversion_harmonic.rst rename to doc/src/improper_inversion_harmonic.rst diff --git a/doc/rst/improper_none.rst b/doc/src/improper_none.rst similarity index 100% rename from doc/rst/improper_none.rst rename to doc/src/improper_none.rst diff --git a/doc/rst/improper_ring.rst b/doc/src/improper_ring.rst similarity index 100% rename from doc/rst/improper_ring.rst rename to doc/src/improper_ring.rst diff --git a/doc/rst/improper_sqdistharm.rst b/doc/src/improper_sqdistharm.rst similarity index 100% rename from doc/rst/improper_sqdistharm.rst rename to doc/src/improper_sqdistharm.rst diff --git a/doc/rst/improper_style.rst b/doc/src/improper_style.rst similarity index 100% rename from doc/rst/improper_style.rst rename to doc/src/improper_style.rst diff --git a/doc/rst/improper_umbrella.rst b/doc/src/improper_umbrella.rst similarity index 100% rename from doc/rst/improper_umbrella.rst rename to doc/src/improper_umbrella.rst diff --git a/doc/rst/improper_zero.rst b/doc/src/improper_zero.rst similarity index 100% rename from doc/rst/improper_zero.rst rename to doc/src/improper_zero.rst diff --git a/doc/rst/impropers.rst b/doc/src/impropers.rst similarity index 100% rename from doc/rst/impropers.rst rename to doc/src/impropers.rst diff --git a/doc/rst/include.rst b/doc/src/include.rst similarity index 100% rename from doc/rst/include.rst rename to doc/src/include.rst diff --git a/doc/rst/info.rst b/doc/src/info.rst similarity index 100% rename from doc/rst/info.rst rename to doc/src/info.rst diff --git a/doc/rst/jump.rst b/doc/src/jump.rst similarity index 100% rename from doc/rst/jump.rst rename to doc/src/jump.rst diff --git a/doc/rst/kim_commands.rst b/doc/src/kim_commands.rst similarity index 100% rename from doc/rst/kim_commands.rst rename to doc/src/kim_commands.rst diff --git a/doc/rst/kspace_modify.rst b/doc/src/kspace_modify.rst similarity index 100% rename from doc/rst/kspace_modify.rst rename to doc/src/kspace_modify.rst diff --git a/doc/rst/kspace_style.rst b/doc/src/kspace_style.rst similarity index 100% rename from doc/rst/kspace_style.rst rename to doc/src/kspace_style.rst diff --git a/doc/rst/label.rst b/doc/src/label.rst similarity index 100% rename from doc/rst/label.rst rename to doc/src/label.rst diff --git a/doc/rst/lattice.rst b/doc/src/lattice.rst similarity index 100% rename from doc/rst/lattice.rst rename to doc/src/lattice.rst diff --git a/doc/rst/log.rst b/doc/src/log.rst similarity index 100% rename from doc/rst/log.rst rename to doc/src/log.rst diff --git a/doc/rst/mass.rst b/doc/src/mass.rst similarity index 100% rename from doc/rst/mass.rst rename to doc/src/mass.rst diff --git a/doc/rst/message.rst b/doc/src/message.rst similarity index 100% rename from doc/rst/message.rst rename to doc/src/message.rst diff --git a/doc/rst/min_modify.rst b/doc/src/min_modify.rst similarity index 100% rename from doc/rst/min_modify.rst rename to doc/src/min_modify.rst diff --git a/doc/rst/min_spin.rst b/doc/src/min_spin.rst similarity index 100% rename from doc/rst/min_spin.rst rename to doc/src/min_spin.rst diff --git a/doc/rst/min_style.rst b/doc/src/min_style.rst similarity index 100% rename from doc/rst/min_style.rst rename to doc/src/min_style.rst diff --git a/doc/rst/minimize.rst b/doc/src/minimize.rst similarity index 100% rename from doc/rst/minimize.rst rename to doc/src/minimize.rst diff --git a/doc/rst/molecule.rst b/doc/src/molecule.rst similarity index 100% rename from doc/rst/molecule.rst rename to doc/src/molecule.rst diff --git a/doc/rst/neb.rst b/doc/src/neb.rst similarity index 100% rename from doc/rst/neb.rst rename to doc/src/neb.rst diff --git a/doc/rst/neb_spin.rst b/doc/src/neb_spin.rst similarity index 100% rename from doc/rst/neb_spin.rst rename to doc/src/neb_spin.rst diff --git a/doc/rst/neigh_modify.rst b/doc/src/neigh_modify.rst similarity index 100% rename from doc/rst/neigh_modify.rst rename to doc/src/neigh_modify.rst diff --git a/doc/rst/neighbor.rst b/doc/src/neighbor.rst similarity index 100% rename from doc/rst/neighbor.rst rename to doc/src/neighbor.rst diff --git a/doc/rst/newton.rst b/doc/src/newton.rst similarity index 100% rename from doc/rst/newton.rst rename to doc/src/newton.rst diff --git a/doc/rst/next.rst b/doc/src/next.rst similarity index 100% rename from doc/rst/next.rst rename to doc/src/next.rst diff --git a/doc/rst/package.rst b/doc/src/package.rst similarity index 100% rename from doc/rst/package.rst rename to doc/src/package.rst diff --git a/doc/rst/pair_adp.rst b/doc/src/pair_adp.rst similarity index 100% rename from doc/rst/pair_adp.rst rename to doc/src/pair_adp.rst diff --git a/doc/rst/pair_agni.rst b/doc/src/pair_agni.rst similarity index 100% rename from doc/rst/pair_agni.rst rename to doc/src/pair_agni.rst diff --git a/doc/rst/pair_airebo.rst b/doc/src/pair_airebo.rst similarity index 100% rename from doc/rst/pair_airebo.rst rename to doc/src/pair_airebo.rst diff --git a/doc/rst/pair_atm.rst b/doc/src/pair_atm.rst similarity index 100% rename from doc/rst/pair_atm.rst rename to doc/src/pair_atm.rst diff --git a/doc/rst/pair_awpmd.rst b/doc/src/pair_awpmd.rst similarity index 100% rename from doc/rst/pair_awpmd.rst rename to doc/src/pair_awpmd.rst diff --git a/doc/rst/pair_beck.rst b/doc/src/pair_beck.rst similarity index 100% rename from doc/rst/pair_beck.rst rename to doc/src/pair_beck.rst diff --git a/doc/rst/pair_body_nparticle.rst b/doc/src/pair_body_nparticle.rst similarity index 100% rename from doc/rst/pair_body_nparticle.rst rename to doc/src/pair_body_nparticle.rst diff --git a/doc/rst/pair_body_rounded_polygon.rst b/doc/src/pair_body_rounded_polygon.rst similarity index 100% rename from doc/rst/pair_body_rounded_polygon.rst rename to doc/src/pair_body_rounded_polygon.rst diff --git a/doc/rst/pair_body_rounded_polyhedron.rst b/doc/src/pair_body_rounded_polyhedron.rst similarity index 100% rename from doc/rst/pair_body_rounded_polyhedron.rst rename to doc/src/pair_body_rounded_polyhedron.rst diff --git a/doc/rst/pair_bop.rst b/doc/src/pair_bop.rst similarity index 100% rename from doc/rst/pair_bop.rst rename to doc/src/pair_bop.rst diff --git a/doc/rst/pair_born.rst b/doc/src/pair_born.rst similarity index 100% rename from doc/rst/pair_born.rst rename to doc/src/pair_born.rst diff --git a/doc/rst/pair_brownian.rst b/doc/src/pair_brownian.rst similarity index 100% rename from doc/rst/pair_brownian.rst rename to doc/src/pair_brownian.rst diff --git a/doc/rst/pair_buck.rst b/doc/src/pair_buck.rst similarity index 100% rename from doc/rst/pair_buck.rst rename to doc/src/pair_buck.rst diff --git a/doc/rst/pair_buck6d_coul_gauss.rst b/doc/src/pair_buck6d_coul_gauss.rst similarity index 100% rename from doc/rst/pair_buck6d_coul_gauss.rst rename to doc/src/pair_buck6d_coul_gauss.rst diff --git a/doc/rst/pair_buck_long.rst b/doc/src/pair_buck_long.rst similarity index 100% rename from doc/rst/pair_buck_long.rst rename to doc/src/pair_buck_long.rst diff --git a/doc/rst/pair_charmm.rst b/doc/src/pair_charmm.rst similarity index 100% rename from doc/rst/pair_charmm.rst rename to doc/src/pair_charmm.rst diff --git a/doc/rst/pair_class2.rst b/doc/src/pair_class2.rst similarity index 100% rename from doc/rst/pair_class2.rst rename to doc/src/pair_class2.rst diff --git a/doc/rst/pair_coeff.rst b/doc/src/pair_coeff.rst similarity index 100% rename from doc/rst/pair_coeff.rst rename to doc/src/pair_coeff.rst diff --git a/doc/rst/pair_colloid.rst b/doc/src/pair_colloid.rst similarity index 100% rename from doc/rst/pair_colloid.rst rename to doc/src/pair_colloid.rst diff --git a/doc/rst/pair_comb.rst b/doc/src/pair_comb.rst similarity index 100% rename from doc/rst/pair_comb.rst rename to doc/src/pair_comb.rst diff --git a/doc/rst/pair_cosine_squared.rst b/doc/src/pair_cosine_squared.rst similarity index 100% rename from doc/rst/pair_cosine_squared.rst rename to doc/src/pair_cosine_squared.rst diff --git a/doc/rst/pair_coul.rst b/doc/src/pair_coul.rst similarity index 100% rename from doc/rst/pair_coul.rst rename to doc/src/pair_coul.rst diff --git a/doc/rst/pair_coul_diel.rst b/doc/src/pair_coul_diel.rst similarity index 100% rename from doc/rst/pair_coul_diel.rst rename to doc/src/pair_coul_diel.rst diff --git a/doc/rst/pair_coul_shield.rst b/doc/src/pair_coul_shield.rst similarity index 100% rename from doc/rst/pair_coul_shield.rst rename to doc/src/pair_coul_shield.rst diff --git a/doc/rst/pair_cs.rst b/doc/src/pair_cs.rst similarity index 100% rename from doc/rst/pair_cs.rst rename to doc/src/pair_cs.rst diff --git a/doc/rst/pair_dipole.rst b/doc/src/pair_dipole.rst similarity index 100% rename from doc/rst/pair_dipole.rst rename to doc/src/pair_dipole.rst diff --git a/doc/rst/pair_dpd.rst b/doc/src/pair_dpd.rst similarity index 100% rename from doc/rst/pair_dpd.rst rename to doc/src/pair_dpd.rst diff --git a/doc/rst/pair_dpd_fdt.rst b/doc/src/pair_dpd_fdt.rst similarity index 100% rename from doc/rst/pair_dpd_fdt.rst rename to doc/src/pair_dpd_fdt.rst diff --git a/doc/rst/pair_drip.rst b/doc/src/pair_drip.rst similarity index 100% rename from doc/rst/pair_drip.rst rename to doc/src/pair_drip.rst diff --git a/doc/rst/pair_dsmc.rst b/doc/src/pair_dsmc.rst similarity index 100% rename from doc/rst/pair_dsmc.rst rename to doc/src/pair_dsmc.rst diff --git a/doc/rst/pair_e3b.rst b/doc/src/pair_e3b.rst similarity index 100% rename from doc/rst/pair_e3b.rst rename to doc/src/pair_e3b.rst diff --git a/doc/rst/pair_eam.rst b/doc/src/pair_eam.rst similarity index 100% rename from doc/rst/pair_eam.rst rename to doc/src/pair_eam.rst diff --git a/doc/rst/pair_edip.rst b/doc/src/pair_edip.rst similarity index 100% rename from doc/rst/pair_edip.rst rename to doc/src/pair_edip.rst diff --git a/doc/rst/pair_eff.rst b/doc/src/pair_eff.rst similarity index 100% rename from doc/rst/pair_eff.rst rename to doc/src/pair_eff.rst diff --git a/doc/rst/pair_eim.rst b/doc/src/pair_eim.rst similarity index 100% rename from doc/rst/pair_eim.rst rename to doc/src/pair_eim.rst diff --git a/doc/rst/pair_exp6_rx.rst b/doc/src/pair_exp6_rx.rst similarity index 100% rename from doc/rst/pair_exp6_rx.rst rename to doc/src/pair_exp6_rx.rst diff --git a/doc/rst/pair_extep.rst b/doc/src/pair_extep.rst similarity index 100% rename from doc/rst/pair_extep.rst rename to doc/src/pair_extep.rst diff --git a/doc/rst/pair_fep_soft.rst b/doc/src/pair_fep_soft.rst similarity index 100% rename from doc/rst/pair_fep_soft.rst rename to doc/src/pair_fep_soft.rst diff --git a/doc/rst/pair_gauss.rst b/doc/src/pair_gauss.rst similarity index 100% rename from doc/rst/pair_gauss.rst rename to doc/src/pair_gauss.rst diff --git a/doc/rst/pair_gayberne.rst b/doc/src/pair_gayberne.rst similarity index 100% rename from doc/rst/pair_gayberne.rst rename to doc/src/pair_gayberne.rst diff --git a/doc/rst/pair_gran.rst b/doc/src/pair_gran.rst similarity index 100% rename from doc/rst/pair_gran.rst rename to doc/src/pair_gran.rst diff --git a/doc/rst/pair_granular.rst b/doc/src/pair_granular.rst similarity index 100% rename from doc/rst/pair_granular.rst rename to doc/src/pair_granular.rst diff --git a/doc/rst/pair_gromacs.rst b/doc/src/pair_gromacs.rst similarity index 100% rename from doc/rst/pair_gromacs.rst rename to doc/src/pair_gromacs.rst diff --git a/doc/rst/pair_gw.rst b/doc/src/pair_gw.rst similarity index 100% rename from doc/rst/pair_gw.rst rename to doc/src/pair_gw.rst diff --git a/doc/rst/pair_hbond_dreiding.rst b/doc/src/pair_hbond_dreiding.rst similarity index 100% rename from doc/rst/pair_hbond_dreiding.rst rename to doc/src/pair_hbond_dreiding.rst diff --git a/doc/rst/pair_hybrid.rst b/doc/src/pair_hybrid.rst similarity index 100% rename from doc/rst/pair_hybrid.rst rename to doc/src/pair_hybrid.rst diff --git a/doc/rst/pair_ilp_graphene_hbn.rst b/doc/src/pair_ilp_graphene_hbn.rst similarity index 100% rename from doc/rst/pair_ilp_graphene_hbn.rst rename to doc/src/pair_ilp_graphene_hbn.rst diff --git a/doc/rst/pair_kim.rst b/doc/src/pair_kim.rst similarity index 100% rename from doc/rst/pair_kim.rst rename to doc/src/pair_kim.rst diff --git a/doc/rst/pair_kolmogorov_crespi_full.rst b/doc/src/pair_kolmogorov_crespi_full.rst similarity index 100% rename from doc/rst/pair_kolmogorov_crespi_full.rst rename to doc/src/pair_kolmogorov_crespi_full.rst diff --git a/doc/rst/pair_kolmogorov_crespi_z.rst b/doc/src/pair_kolmogorov_crespi_z.rst similarity index 100% rename from doc/rst/pair_kolmogorov_crespi_z.rst rename to doc/src/pair_kolmogorov_crespi_z.rst diff --git a/doc/rst/pair_lcbop.rst b/doc/src/pair_lcbop.rst similarity index 100% rename from doc/rst/pair_lcbop.rst rename to doc/src/pair_lcbop.rst diff --git a/doc/rst/pair_lebedeva_z.rst b/doc/src/pair_lebedeva_z.rst similarity index 100% rename from doc/rst/pair_lebedeva_z.rst rename to doc/src/pair_lebedeva_z.rst diff --git a/doc/rst/pair_line_lj.rst b/doc/src/pair_line_lj.rst similarity index 100% rename from doc/rst/pair_line_lj.rst rename to doc/src/pair_line_lj.rst diff --git a/doc/rst/pair_list.rst b/doc/src/pair_list.rst similarity index 100% rename from doc/rst/pair_list.rst rename to doc/src/pair_list.rst diff --git a/doc/rst/pair_lj.rst b/doc/src/pair_lj.rst similarity index 100% rename from doc/rst/pair_lj.rst rename to doc/src/pair_lj.rst diff --git a/doc/rst/pair_lj96.rst b/doc/src/pair_lj96.rst similarity index 100% rename from doc/rst/pair_lj96.rst rename to doc/src/pair_lj96.rst diff --git a/doc/rst/pair_lj_cubic.rst b/doc/src/pair_lj_cubic.rst similarity index 100% rename from doc/rst/pair_lj_cubic.rst rename to doc/src/pair_lj_cubic.rst diff --git a/doc/rst/pair_lj_expand.rst b/doc/src/pair_lj_expand.rst similarity index 100% rename from doc/rst/pair_lj_expand.rst rename to doc/src/pair_lj_expand.rst diff --git a/doc/rst/pair_lj_long.rst b/doc/src/pair_lj_long.rst similarity index 100% rename from doc/rst/pair_lj_long.rst rename to doc/src/pair_lj_long.rst diff --git a/doc/rst/pair_lj_smooth.rst b/doc/src/pair_lj_smooth.rst similarity index 100% rename from doc/rst/pair_lj_smooth.rst rename to doc/src/pair_lj_smooth.rst diff --git a/doc/rst/pair_lj_smooth_linear.rst b/doc/src/pair_lj_smooth_linear.rst similarity index 100% rename from doc/rst/pair_lj_smooth_linear.rst rename to doc/src/pair_lj_smooth_linear.rst diff --git a/doc/rst/pair_lj_switch3_coulgauss.rst b/doc/src/pair_lj_switch3_coulgauss.rst similarity index 100% rename from doc/rst/pair_lj_switch3_coulgauss.rst rename to doc/src/pair_lj_switch3_coulgauss.rst diff --git a/doc/rst/pair_local_density.rst b/doc/src/pair_local_density.rst similarity index 100% rename from doc/rst/pair_local_density.rst rename to doc/src/pair_local_density.rst diff --git a/doc/rst/pair_lubricate.rst b/doc/src/pair_lubricate.rst similarity index 100% rename from doc/rst/pair_lubricate.rst rename to doc/src/pair_lubricate.rst diff --git a/doc/rst/pair_lubricateU.rst b/doc/src/pair_lubricateU.rst similarity index 100% rename from doc/rst/pair_lubricateU.rst rename to doc/src/pair_lubricateU.rst diff --git a/doc/rst/pair_mdf.rst b/doc/src/pair_mdf.rst similarity index 100% rename from doc/rst/pair_mdf.rst rename to doc/src/pair_mdf.rst diff --git a/doc/rst/pair_meam_spline.rst b/doc/src/pair_meam_spline.rst similarity index 100% rename from doc/rst/pair_meam_spline.rst rename to doc/src/pair_meam_spline.rst diff --git a/doc/rst/pair_meam_sw_spline.rst b/doc/src/pair_meam_sw_spline.rst similarity index 100% rename from doc/rst/pair_meam_sw_spline.rst rename to doc/src/pair_meam_sw_spline.rst diff --git a/doc/rst/pair_meamc.rst b/doc/src/pair_meamc.rst similarity index 100% rename from doc/rst/pair_meamc.rst rename to doc/src/pair_meamc.rst diff --git a/doc/rst/pair_meso.rst b/doc/src/pair_meso.rst similarity index 100% rename from doc/rst/pair_meso.rst rename to doc/src/pair_meso.rst diff --git a/doc/rst/pair_mgpt.rst b/doc/src/pair_mgpt.rst similarity index 100% rename from doc/rst/pair_mgpt.rst rename to doc/src/pair_mgpt.rst diff --git a/doc/rst/pair_mie.rst b/doc/src/pair_mie.rst similarity index 100% rename from doc/rst/pair_mie.rst rename to doc/src/pair_mie.rst diff --git a/doc/rst/pair_mm3_switch3_coulgauss.rst b/doc/src/pair_mm3_switch3_coulgauss.rst similarity index 100% rename from doc/rst/pair_mm3_switch3_coulgauss.rst rename to doc/src/pair_mm3_switch3_coulgauss.rst diff --git a/doc/rst/pair_modify.rst b/doc/src/pair_modify.rst similarity index 100% rename from doc/rst/pair_modify.rst rename to doc/src/pair_modify.rst diff --git a/doc/rst/pair_momb.rst b/doc/src/pair_momb.rst similarity index 100% rename from doc/rst/pair_momb.rst rename to doc/src/pair_momb.rst diff --git a/doc/rst/pair_morse.rst b/doc/src/pair_morse.rst similarity index 100% rename from doc/rst/pair_morse.rst rename to doc/src/pair_morse.rst diff --git a/doc/rst/pair_multi_lucy.rst b/doc/src/pair_multi_lucy.rst similarity index 100% rename from doc/rst/pair_multi_lucy.rst rename to doc/src/pair_multi_lucy.rst diff --git a/doc/rst/pair_multi_lucy_rx.rst b/doc/src/pair_multi_lucy_rx.rst similarity index 100% rename from doc/rst/pair_multi_lucy_rx.rst rename to doc/src/pair_multi_lucy_rx.rst diff --git a/doc/rst/pair_nb3b_harmonic.rst b/doc/src/pair_nb3b_harmonic.rst similarity index 100% rename from doc/rst/pair_nb3b_harmonic.rst rename to doc/src/pair_nb3b_harmonic.rst diff --git a/doc/rst/pair_nm.rst b/doc/src/pair_nm.rst similarity index 100% rename from doc/rst/pair_nm.rst rename to doc/src/pair_nm.rst diff --git a/doc/rst/pair_none.rst b/doc/src/pair_none.rst similarity index 100% rename from doc/rst/pair_none.rst rename to doc/src/pair_none.rst diff --git a/doc/rst/pair_oxdna.rst b/doc/src/pair_oxdna.rst similarity index 100% rename from doc/rst/pair_oxdna.rst rename to doc/src/pair_oxdna.rst diff --git a/doc/rst/pair_oxdna2.rst b/doc/src/pair_oxdna2.rst similarity index 100% rename from doc/rst/pair_oxdna2.rst rename to doc/src/pair_oxdna2.rst diff --git a/doc/rst/pair_peri.rst b/doc/src/pair_peri.rst similarity index 100% rename from doc/rst/pair_peri.rst rename to doc/src/pair_peri.rst diff --git a/doc/rst/pair_polymorphic.rst b/doc/src/pair_polymorphic.rst similarity index 100% rename from doc/rst/pair_polymorphic.rst rename to doc/src/pair_polymorphic.rst diff --git a/doc/rst/pair_python.rst b/doc/src/pair_python.rst similarity index 100% rename from doc/rst/pair_python.rst rename to doc/src/pair_python.rst diff --git a/doc/rst/pair_quip.rst b/doc/src/pair_quip.rst similarity index 100% rename from doc/rst/pair_quip.rst rename to doc/src/pair_quip.rst diff --git a/doc/rst/pair_reaxc.rst b/doc/src/pair_reaxc.rst similarity index 100% rename from doc/rst/pair_reaxc.rst rename to doc/src/pair_reaxc.rst diff --git a/doc/rst/pair_resquared.rst b/doc/src/pair_resquared.rst similarity index 100% rename from doc/rst/pair_resquared.rst rename to doc/src/pair_resquared.rst diff --git a/doc/rst/pair_sdk.rst b/doc/src/pair_sdk.rst similarity index 100% rename from doc/rst/pair_sdk.rst rename to doc/src/pair_sdk.rst diff --git a/doc/rst/pair_sdpd_taitwater_isothermal.rst b/doc/src/pair_sdpd_taitwater_isothermal.rst similarity index 100% rename from doc/rst/pair_sdpd_taitwater_isothermal.rst rename to doc/src/pair_sdpd_taitwater_isothermal.rst diff --git a/doc/rst/pair_smd_hertz.rst b/doc/src/pair_smd_hertz.rst similarity index 100% rename from doc/rst/pair_smd_hertz.rst rename to doc/src/pair_smd_hertz.rst diff --git a/doc/rst/pair_smd_tlsph.rst b/doc/src/pair_smd_tlsph.rst similarity index 100% rename from doc/rst/pair_smd_tlsph.rst rename to doc/src/pair_smd_tlsph.rst diff --git a/doc/rst/pair_smd_triangulated_surface.rst b/doc/src/pair_smd_triangulated_surface.rst similarity index 100% rename from doc/rst/pair_smd_triangulated_surface.rst rename to doc/src/pair_smd_triangulated_surface.rst diff --git a/doc/rst/pair_smd_ulsph.rst b/doc/src/pair_smd_ulsph.rst similarity index 100% rename from doc/rst/pair_smd_ulsph.rst rename to doc/src/pair_smd_ulsph.rst diff --git a/doc/rst/pair_smtbq.rst b/doc/src/pair_smtbq.rst similarity index 100% rename from doc/rst/pair_smtbq.rst rename to doc/src/pair_smtbq.rst diff --git a/doc/rst/pair_snap.rst b/doc/src/pair_snap.rst similarity index 100% rename from doc/rst/pair_snap.rst rename to doc/src/pair_snap.rst diff --git a/doc/rst/pair_soft.rst b/doc/src/pair_soft.rst similarity index 100% rename from doc/rst/pair_soft.rst rename to doc/src/pair_soft.rst diff --git a/doc/rst/pair_sph_heatconduction.rst b/doc/src/pair_sph_heatconduction.rst similarity index 100% rename from doc/rst/pair_sph_heatconduction.rst rename to doc/src/pair_sph_heatconduction.rst diff --git a/doc/rst/pair_sph_idealgas.rst b/doc/src/pair_sph_idealgas.rst similarity index 100% rename from doc/rst/pair_sph_idealgas.rst rename to doc/src/pair_sph_idealgas.rst diff --git a/doc/rst/pair_sph_lj.rst b/doc/src/pair_sph_lj.rst similarity index 100% rename from doc/rst/pair_sph_lj.rst rename to doc/src/pair_sph_lj.rst diff --git a/doc/rst/pair_sph_rhosum.rst b/doc/src/pair_sph_rhosum.rst similarity index 100% rename from doc/rst/pair_sph_rhosum.rst rename to doc/src/pair_sph_rhosum.rst diff --git a/doc/rst/pair_sph_taitwater.rst b/doc/src/pair_sph_taitwater.rst similarity index 100% rename from doc/rst/pair_sph_taitwater.rst rename to doc/src/pair_sph_taitwater.rst diff --git a/doc/rst/pair_sph_taitwater_morris.rst b/doc/src/pair_sph_taitwater_morris.rst similarity index 100% rename from doc/rst/pair_sph_taitwater_morris.rst rename to doc/src/pair_sph_taitwater_morris.rst diff --git a/doc/rst/pair_spin_dipole.rst b/doc/src/pair_spin_dipole.rst similarity index 100% rename from doc/rst/pair_spin_dipole.rst rename to doc/src/pair_spin_dipole.rst diff --git a/doc/rst/pair_spin_dmi.rst b/doc/src/pair_spin_dmi.rst similarity index 100% rename from doc/rst/pair_spin_dmi.rst rename to doc/src/pair_spin_dmi.rst diff --git a/doc/rst/pair_spin_exchange.rst b/doc/src/pair_spin_exchange.rst similarity index 100% rename from doc/rst/pair_spin_exchange.rst rename to doc/src/pair_spin_exchange.rst diff --git a/doc/rst/pair_spin_magelec.rst b/doc/src/pair_spin_magelec.rst similarity index 100% rename from doc/rst/pair_spin_magelec.rst rename to doc/src/pair_spin_magelec.rst diff --git a/doc/rst/pair_spin_neel.rst b/doc/src/pair_spin_neel.rst similarity index 100% rename from doc/rst/pair_spin_neel.rst rename to doc/src/pair_spin_neel.rst diff --git a/doc/rst/pair_srp.rst b/doc/src/pair_srp.rst similarity index 100% rename from doc/rst/pair_srp.rst rename to doc/src/pair_srp.rst diff --git a/doc/rst/pair_style.rst b/doc/src/pair_style.rst similarity index 100% rename from doc/rst/pair_style.rst rename to doc/src/pair_style.rst diff --git a/doc/rst/pair_sw.rst b/doc/src/pair_sw.rst similarity index 100% rename from doc/rst/pair_sw.rst rename to doc/src/pair_sw.rst diff --git a/doc/rst/pair_table.rst b/doc/src/pair_table.rst similarity index 100% rename from doc/rst/pair_table.rst rename to doc/src/pair_table.rst diff --git a/doc/rst/pair_table_rx.rst b/doc/src/pair_table_rx.rst similarity index 100% rename from doc/rst/pair_table_rx.rst rename to doc/src/pair_table_rx.rst diff --git a/doc/rst/pair_tersoff.rst b/doc/src/pair_tersoff.rst similarity index 100% rename from doc/rst/pair_tersoff.rst rename to doc/src/pair_tersoff.rst diff --git a/doc/rst/pair_tersoff_mod.rst b/doc/src/pair_tersoff_mod.rst similarity index 100% rename from doc/rst/pair_tersoff_mod.rst rename to doc/src/pair_tersoff_mod.rst diff --git a/doc/rst/pair_tersoff_zbl.rst b/doc/src/pair_tersoff_zbl.rst similarity index 100% rename from doc/rst/pair_tersoff_zbl.rst rename to doc/src/pair_tersoff_zbl.rst diff --git a/doc/rst/pair_thole.rst b/doc/src/pair_thole.rst similarity index 100% rename from doc/rst/pair_thole.rst rename to doc/src/pair_thole.rst diff --git a/doc/rst/pair_tri_lj.rst b/doc/src/pair_tri_lj.rst similarity index 100% rename from doc/rst/pair_tri_lj.rst rename to doc/src/pair_tri_lj.rst diff --git a/doc/rst/pair_ufm.rst b/doc/src/pair_ufm.rst similarity index 100% rename from doc/rst/pair_ufm.rst rename to doc/src/pair_ufm.rst diff --git a/doc/rst/pair_vashishta.rst b/doc/src/pair_vashishta.rst similarity index 100% rename from doc/rst/pair_vashishta.rst rename to doc/src/pair_vashishta.rst diff --git a/doc/rst/pair_write.rst b/doc/src/pair_write.rst similarity index 100% rename from doc/rst/pair_write.rst rename to doc/src/pair_write.rst diff --git a/doc/rst/pair_yukawa.rst b/doc/src/pair_yukawa.rst similarity index 100% rename from doc/rst/pair_yukawa.rst rename to doc/src/pair_yukawa.rst diff --git a/doc/rst/pair_yukawa_colloid.rst b/doc/src/pair_yukawa_colloid.rst similarity index 100% rename from doc/rst/pair_yukawa_colloid.rst rename to doc/src/pair_yukawa_colloid.rst diff --git a/doc/rst/pair_zbl.rst b/doc/src/pair_zbl.rst similarity index 100% rename from doc/rst/pair_zbl.rst rename to doc/src/pair_zbl.rst diff --git a/doc/rst/pair_zero.rst b/doc/src/pair_zero.rst similarity index 100% rename from doc/rst/pair_zero.rst rename to doc/src/pair_zero.rst diff --git a/doc/rst/pairs.rst b/doc/src/pairs.rst similarity index 100% rename from doc/rst/pairs.rst rename to doc/src/pairs.rst diff --git a/doc/rst/partition.rst b/doc/src/partition.rst similarity index 100% rename from doc/rst/partition.rst rename to doc/src/partition.rst diff --git a/doc/rst/prd.rst b/doc/src/prd.rst similarity index 100% rename from doc/rst/prd.rst rename to doc/src/prd.rst diff --git a/doc/rst/print.rst b/doc/src/print.rst similarity index 100% rename from doc/rst/print.rst rename to doc/src/print.rst diff --git a/doc/rst/processors.rst b/doc/src/processors.rst similarity index 100% rename from doc/rst/processors.rst rename to doc/src/processors.rst diff --git a/doc/rst/python.rst b/doc/src/python.rst similarity index 100% rename from doc/rst/python.rst rename to doc/src/python.rst diff --git a/doc/rst/quit.rst b/doc/src/quit.rst similarity index 100% rename from doc/rst/quit.rst rename to doc/src/quit.rst diff --git a/doc/rst/read_data.rst b/doc/src/read_data.rst similarity index 100% rename from doc/rst/read_data.rst rename to doc/src/read_data.rst diff --git a/doc/rst/read_dump.rst b/doc/src/read_dump.rst similarity index 100% rename from doc/rst/read_dump.rst rename to doc/src/read_dump.rst diff --git a/doc/rst/read_restart.rst b/doc/src/read_restart.rst similarity index 100% rename from doc/rst/read_restart.rst rename to doc/src/read_restart.rst diff --git a/doc/rst/region.rst b/doc/src/region.rst similarity index 100% rename from doc/rst/region.rst rename to doc/src/region.rst diff --git a/doc/rst/replicate.rst b/doc/src/replicate.rst similarity index 100% rename from doc/rst/replicate.rst rename to doc/src/replicate.rst diff --git a/doc/rst/rerun.rst b/doc/src/rerun.rst similarity index 100% rename from doc/rst/rerun.rst rename to doc/src/rerun.rst diff --git a/doc/rst/reset_ids.rst b/doc/src/reset_ids.rst similarity index 100% rename from doc/rst/reset_ids.rst rename to doc/src/reset_ids.rst diff --git a/doc/rst/reset_timestep.rst b/doc/src/reset_timestep.rst similarity index 100% rename from doc/rst/reset_timestep.rst rename to doc/src/reset_timestep.rst diff --git a/doc/rst/restart.rst b/doc/src/restart.rst similarity index 100% rename from doc/rst/restart.rst rename to doc/src/restart.rst diff --git a/doc/rst/run.rst b/doc/src/run.rst similarity index 100% rename from doc/rst/run.rst rename to doc/src/run.rst diff --git a/doc/rst/run_style.rst b/doc/src/run_style.rst similarity index 100% rename from doc/rst/run_style.rst rename to doc/src/run_style.rst diff --git a/doc/rst/server.rst b/doc/src/server.rst similarity index 100% rename from doc/rst/server.rst rename to doc/src/server.rst diff --git a/doc/rst/server_mc.rst b/doc/src/server_mc.rst similarity index 100% rename from doc/rst/server_mc.rst rename to doc/src/server_mc.rst diff --git a/doc/rst/server_md.rst b/doc/src/server_md.rst similarity index 100% rename from doc/rst/server_md.rst rename to doc/src/server_md.rst diff --git a/doc/rst/set.rst b/doc/src/set.rst similarity index 100% rename from doc/rst/set.rst rename to doc/src/set.rst diff --git a/doc/rst/shell.rst b/doc/src/shell.rst similarity index 100% rename from doc/rst/shell.rst rename to doc/src/shell.rst diff --git a/doc/rst/special_bonds.rst b/doc/src/special_bonds.rst similarity index 100% rename from doc/rst/special_bonds.rst rename to doc/src/special_bonds.rst diff --git a/doc/rst/suffix.rst b/doc/src/suffix.rst similarity index 100% rename from doc/rst/suffix.rst rename to doc/src/suffix.rst diff --git a/doc/rst/tad.rst b/doc/src/tad.rst similarity index 100% rename from doc/rst/tad.rst rename to doc/src/tad.rst diff --git a/doc/rst/temper.rst b/doc/src/temper.rst similarity index 100% rename from doc/rst/temper.rst rename to doc/src/temper.rst diff --git a/doc/rst/temper_grem.rst b/doc/src/temper_grem.rst similarity index 100% rename from doc/rst/temper_grem.rst rename to doc/src/temper_grem.rst diff --git a/doc/rst/temper_npt.rst b/doc/src/temper_npt.rst similarity index 100% rename from doc/rst/temper_npt.rst rename to doc/src/temper_npt.rst diff --git a/doc/rst/thermo.rst b/doc/src/thermo.rst similarity index 100% rename from doc/rst/thermo.rst rename to doc/src/thermo.rst diff --git a/doc/rst/thermo_modify.rst b/doc/src/thermo_modify.rst similarity index 100% rename from doc/rst/thermo_modify.rst rename to doc/src/thermo_modify.rst diff --git a/doc/rst/thermo_style.rst b/doc/src/thermo_style.rst similarity index 100% rename from doc/rst/thermo_style.rst rename to doc/src/thermo_style.rst diff --git a/doc/rst/third_order.rst b/doc/src/third_order.rst similarity index 100% rename from doc/rst/third_order.rst rename to doc/src/third_order.rst diff --git a/doc/rst/timer.rst b/doc/src/timer.rst similarity index 100% rename from doc/rst/timer.rst rename to doc/src/timer.rst diff --git a/doc/rst/timestep.rst b/doc/src/timestep.rst similarity index 100% rename from doc/rst/timestep.rst rename to doc/src/timestep.rst diff --git a/doc/rst/uncompute.rst b/doc/src/uncompute.rst similarity index 100% rename from doc/rst/uncompute.rst rename to doc/src/uncompute.rst diff --git a/doc/rst/undump.rst b/doc/src/undump.rst similarity index 100% rename from doc/rst/undump.rst rename to doc/src/undump.rst diff --git a/doc/rst/unfix.rst b/doc/src/unfix.rst similarity index 100% rename from doc/rst/unfix.rst rename to doc/src/unfix.rst diff --git a/doc/rst/units.rst b/doc/src/units.rst similarity index 100% rename from doc/rst/units.rst rename to doc/src/units.rst diff --git a/doc/rst/variable.rst b/doc/src/variable.rst similarity index 100% rename from doc/rst/variable.rst rename to doc/src/variable.rst diff --git a/doc/rst/velocity.rst b/doc/src/velocity.rst similarity index 100% rename from doc/rst/velocity.rst rename to doc/src/velocity.rst diff --git a/doc/rst/write_coeff.rst b/doc/src/write_coeff.rst similarity index 100% rename from doc/rst/write_coeff.rst rename to doc/src/write_coeff.rst diff --git a/doc/rst/write_data.rst b/doc/src/write_data.rst similarity index 100% rename from doc/rst/write_data.rst rename to doc/src/write_data.rst diff --git a/doc/rst/write_dump.rst b/doc/src/write_dump.rst similarity index 100% rename from doc/rst/write_dump.rst rename to doc/src/write_dump.rst diff --git a/doc/rst/write_restart.rst b/doc/src/write_restart.rst similarity index 100% rename from doc/rst/write_restart.rst rename to doc/src/write_restart.rst diff --git a/doc/src/Build.txt b/doc/txt/Build.txt similarity index 100% rename from doc/src/Build.txt rename to doc/txt/Build.txt diff --git a/doc/src/Build_basics.txt b/doc/txt/Build_basics.txt similarity index 100% rename from doc/src/Build_basics.txt rename to doc/txt/Build_basics.txt diff --git a/doc/src/Build_cmake.txt b/doc/txt/Build_cmake.txt similarity index 100% rename from doc/src/Build_cmake.txt rename to doc/txt/Build_cmake.txt diff --git a/doc/src/Build_development.txt b/doc/txt/Build_development.txt similarity index 100% rename from doc/src/Build_development.txt rename to doc/txt/Build_development.txt diff --git a/doc/src/Build_extras.txt b/doc/txt/Build_extras.txt similarity index 100% rename from doc/src/Build_extras.txt rename to doc/txt/Build_extras.txt diff --git a/doc/src/Build_link.txt b/doc/txt/Build_link.txt similarity index 100% rename from doc/src/Build_link.txt rename to doc/txt/Build_link.txt diff --git a/doc/src/Build_make.txt b/doc/txt/Build_make.txt similarity index 100% rename from doc/src/Build_make.txt rename to doc/txt/Build_make.txt diff --git a/doc/src/Build_package.txt b/doc/txt/Build_package.txt similarity index 100% rename from doc/src/Build_package.txt rename to doc/txt/Build_package.txt diff --git a/doc/src/Build_settings.txt b/doc/txt/Build_settings.txt similarity index 100% rename from doc/src/Build_settings.txt rename to doc/txt/Build_settings.txt diff --git a/doc/src/Build_windows.txt b/doc/txt/Build_windows.txt similarity index 100% rename from doc/src/Build_windows.txt rename to doc/txt/Build_windows.txt diff --git a/doc/src/Commands.txt b/doc/txt/Commands.txt similarity index 100% rename from doc/src/Commands.txt rename to doc/txt/Commands.txt diff --git a/doc/src/Commands_all.txt b/doc/txt/Commands_all.txt similarity index 100% rename from doc/src/Commands_all.txt rename to doc/txt/Commands_all.txt diff --git a/doc/src/Commands_bond.txt b/doc/txt/Commands_bond.txt similarity index 100% rename from doc/src/Commands_bond.txt rename to doc/txt/Commands_bond.txt diff --git a/doc/src/Commands_category.txt b/doc/txt/Commands_category.txt similarity index 100% rename from doc/src/Commands_category.txt rename to doc/txt/Commands_category.txt diff --git a/doc/src/Commands_compute.txt b/doc/txt/Commands_compute.txt similarity index 100% rename from doc/src/Commands_compute.txt rename to doc/txt/Commands_compute.txt diff --git a/doc/src/Commands_fix.txt b/doc/txt/Commands_fix.txt similarity index 100% rename from doc/src/Commands_fix.txt rename to doc/txt/Commands_fix.txt diff --git a/doc/src/Commands_input.txt b/doc/txt/Commands_input.txt similarity index 100% rename from doc/src/Commands_input.txt rename to doc/txt/Commands_input.txt diff --git a/doc/src/Commands_kspace.txt b/doc/txt/Commands_kspace.txt similarity index 100% rename from doc/src/Commands_kspace.txt rename to doc/txt/Commands_kspace.txt diff --git a/doc/src/Commands_pair.txt b/doc/txt/Commands_pair.txt similarity index 100% rename from doc/src/Commands_pair.txt rename to doc/txt/Commands_pair.txt diff --git a/doc/src/Commands_parse.txt b/doc/txt/Commands_parse.txt similarity index 100% rename from doc/src/Commands_parse.txt rename to doc/txt/Commands_parse.txt diff --git a/doc/src/Commands_removed.txt b/doc/txt/Commands_removed.txt similarity index 100% rename from doc/src/Commands_removed.txt rename to doc/txt/Commands_removed.txt diff --git a/doc/src/Commands_structure.txt b/doc/txt/Commands_structure.txt similarity index 100% rename from doc/src/Commands_structure.txt rename to doc/txt/Commands_structure.txt diff --git a/doc/src/Developer/.gitignore b/doc/txt/Developer/.gitignore similarity index 100% rename from doc/src/Developer/.gitignore rename to doc/txt/Developer/.gitignore diff --git a/doc/src/Developer/classes.fig b/doc/txt/Developer/classes.fig similarity index 100% rename from doc/src/Developer/classes.fig rename to doc/txt/Developer/classes.fig diff --git a/doc/src/Developer/classes.pdf b/doc/txt/Developer/classes.pdf similarity index 100% rename from doc/src/Developer/classes.pdf rename to doc/txt/Developer/classes.pdf diff --git a/doc/src/Developer/developer.tex b/doc/txt/Developer/developer.tex similarity index 100% rename from doc/src/Developer/developer.tex rename to doc/txt/Developer/developer.tex diff --git a/doc/src/Errors.txt b/doc/txt/Errors.txt similarity index 100% rename from doc/src/Errors.txt rename to doc/txt/Errors.txt diff --git a/doc/src/Errors_bugs.txt b/doc/txt/Errors_bugs.txt similarity index 100% rename from doc/src/Errors_bugs.txt rename to doc/txt/Errors_bugs.txt diff --git a/doc/src/Errors_common.txt b/doc/txt/Errors_common.txt similarity index 100% rename from doc/src/Errors_common.txt rename to doc/txt/Errors_common.txt diff --git a/doc/src/Errors_messages.txt b/doc/txt/Errors_messages.txt similarity index 100% rename from doc/src/Errors_messages.txt rename to doc/txt/Errors_messages.txt diff --git a/doc/src/Errors_warnings.txt b/doc/txt/Errors_warnings.txt similarity index 100% rename from doc/src/Errors_warnings.txt rename to doc/txt/Errors_warnings.txt diff --git a/doc/src/Examples.txt b/doc/txt/Examples.txt similarity index 100% rename from doc/src/Examples.txt rename to doc/txt/Examples.txt diff --git a/doc/src/Howto.txt b/doc/txt/Howto.txt similarity index 100% rename from doc/src/Howto.txt rename to doc/txt/Howto.txt diff --git a/doc/src/Howto_2d.txt b/doc/txt/Howto_2d.txt similarity index 100% rename from doc/src/Howto_2d.txt rename to doc/txt/Howto_2d.txt diff --git a/doc/src/Howto_barostat.txt b/doc/txt/Howto_barostat.txt similarity index 100% rename from doc/src/Howto_barostat.txt rename to doc/txt/Howto_barostat.txt diff --git a/doc/src/Howto_bash.txt b/doc/txt/Howto_bash.txt similarity index 100% rename from doc/src/Howto_bash.txt rename to doc/txt/Howto_bash.txt diff --git a/doc/src/Howto_bioFF.txt b/doc/txt/Howto_bioFF.txt similarity index 100% rename from doc/src/Howto_bioFF.txt rename to doc/txt/Howto_bioFF.txt diff --git a/doc/src/Howto_body.txt b/doc/txt/Howto_body.txt similarity index 100% rename from doc/src/Howto_body.txt rename to doc/txt/Howto_body.txt diff --git a/doc/src/Howto_chunk.txt b/doc/txt/Howto_chunk.txt similarity index 100% rename from doc/src/Howto_chunk.txt rename to doc/txt/Howto_chunk.txt diff --git a/doc/src/Howto_client_server.txt b/doc/txt/Howto_client_server.txt similarity index 100% rename from doc/src/Howto_client_server.txt rename to doc/txt/Howto_client_server.txt diff --git a/doc/src/Howto_coreshell.txt b/doc/txt/Howto_coreshell.txt similarity index 100% rename from doc/src/Howto_coreshell.txt rename to doc/txt/Howto_coreshell.txt diff --git a/doc/src/Howto_couple.txt b/doc/txt/Howto_couple.txt similarity index 100% rename from doc/src/Howto_couple.txt rename to doc/txt/Howto_couple.txt diff --git a/doc/src/Howto_diffusion.txt b/doc/txt/Howto_diffusion.txt similarity index 100% rename from doc/src/Howto_diffusion.txt rename to doc/txt/Howto_diffusion.txt diff --git a/doc/src/Howto_dispersion.txt b/doc/txt/Howto_dispersion.txt similarity index 100% rename from doc/src/Howto_dispersion.txt rename to doc/txt/Howto_dispersion.txt diff --git a/doc/src/Howto_drude.txt b/doc/txt/Howto_drude.txt similarity index 100% rename from doc/src/Howto_drude.txt rename to doc/txt/Howto_drude.txt diff --git a/doc/src/Howto_drude2.txt b/doc/txt/Howto_drude2.txt similarity index 100% rename from doc/src/Howto_drude2.txt rename to doc/txt/Howto_drude2.txt diff --git a/doc/src/Howto_elastic.txt b/doc/txt/Howto_elastic.txt similarity index 100% rename from doc/src/Howto_elastic.txt rename to doc/txt/Howto_elastic.txt diff --git a/doc/src/Howto_github.txt b/doc/txt/Howto_github.txt similarity index 100% rename from doc/src/Howto_github.txt rename to doc/txt/Howto_github.txt diff --git a/doc/src/Howto_granular.txt b/doc/txt/Howto_granular.txt similarity index 100% rename from doc/src/Howto_granular.txt rename to doc/txt/Howto_granular.txt diff --git a/doc/src/Howto_kappa.txt b/doc/txt/Howto_kappa.txt similarity index 100% rename from doc/src/Howto_kappa.txt rename to doc/txt/Howto_kappa.txt diff --git a/doc/src/Howto_library.txt b/doc/txt/Howto_library.txt similarity index 100% rename from doc/src/Howto_library.txt rename to doc/txt/Howto_library.txt diff --git a/doc/src/Howto_manifold.txt b/doc/txt/Howto_manifold.txt similarity index 100% rename from doc/src/Howto_manifold.txt rename to doc/txt/Howto_manifold.txt diff --git a/doc/src/Howto_multiple.txt b/doc/txt/Howto_multiple.txt similarity index 100% rename from doc/src/Howto_multiple.txt rename to doc/txt/Howto_multiple.txt diff --git a/doc/src/Howto_nemd.txt b/doc/txt/Howto_nemd.txt similarity index 100% rename from doc/src/Howto_nemd.txt rename to doc/txt/Howto_nemd.txt diff --git a/doc/src/Howto_output.txt b/doc/txt/Howto_output.txt similarity index 100% rename from doc/src/Howto_output.txt rename to doc/txt/Howto_output.txt diff --git a/doc/src/Howto_polarizable.txt b/doc/txt/Howto_polarizable.txt similarity index 100% rename from doc/src/Howto_polarizable.txt rename to doc/txt/Howto_polarizable.txt diff --git a/doc/src/Howto_pylammps.txt b/doc/txt/Howto_pylammps.txt similarity index 100% rename from doc/src/Howto_pylammps.txt rename to doc/txt/Howto_pylammps.txt diff --git a/doc/src/Howto_replica.txt b/doc/txt/Howto_replica.txt similarity index 100% rename from doc/src/Howto_replica.txt rename to doc/txt/Howto_replica.txt diff --git a/doc/src/Howto_restart.txt b/doc/txt/Howto_restart.txt similarity index 100% rename from doc/src/Howto_restart.txt rename to doc/txt/Howto_restart.txt diff --git a/doc/src/Howto_spc.txt b/doc/txt/Howto_spc.txt similarity index 100% rename from doc/src/Howto_spc.txt rename to doc/txt/Howto_spc.txt diff --git a/doc/src/Howto_spherical.txt b/doc/txt/Howto_spherical.txt similarity index 100% rename from doc/src/Howto_spherical.txt rename to doc/txt/Howto_spherical.txt diff --git a/doc/src/Howto_spins.txt b/doc/txt/Howto_spins.txt similarity index 100% rename from doc/src/Howto_spins.txt rename to doc/txt/Howto_spins.txt diff --git a/doc/src/Howto_temperature.txt b/doc/txt/Howto_temperature.txt similarity index 100% rename from doc/src/Howto_temperature.txt rename to doc/txt/Howto_temperature.txt diff --git a/doc/src/Howto_thermostat.txt b/doc/txt/Howto_thermostat.txt similarity index 100% rename from doc/src/Howto_thermostat.txt rename to doc/txt/Howto_thermostat.txt diff --git a/doc/src/Howto_tip3p.txt b/doc/txt/Howto_tip3p.txt similarity index 100% rename from doc/src/Howto_tip3p.txt rename to doc/txt/Howto_tip3p.txt diff --git a/doc/src/Howto_tip4p.txt b/doc/txt/Howto_tip4p.txt similarity index 100% rename from doc/src/Howto_tip4p.txt rename to doc/txt/Howto_tip4p.txt diff --git a/doc/src/Howto_triclinic.txt b/doc/txt/Howto_triclinic.txt similarity index 100% rename from doc/src/Howto_triclinic.txt rename to doc/txt/Howto_triclinic.txt diff --git a/doc/src/Howto_viscosity.txt b/doc/txt/Howto_viscosity.txt similarity index 100% rename from doc/src/Howto_viscosity.txt rename to doc/txt/Howto_viscosity.txt diff --git a/doc/src/Howto_viz.txt b/doc/txt/Howto_viz.txt similarity index 100% rename from doc/src/Howto_viz.txt rename to doc/txt/Howto_viz.txt diff --git a/doc/src/Howto_walls.txt b/doc/txt/Howto_walls.txt similarity index 100% rename from doc/src/Howto_walls.txt rename to doc/txt/Howto_walls.txt diff --git a/doc/src/Install.txt b/doc/txt/Install.txt similarity index 100% rename from doc/src/Install.txt rename to doc/txt/Install.txt diff --git a/doc/src/Install_git.txt b/doc/txt/Install_git.txt similarity index 100% rename from doc/src/Install_git.txt rename to doc/txt/Install_git.txt diff --git a/doc/src/Install_linux.txt b/doc/txt/Install_linux.txt similarity index 100% rename from doc/src/Install_linux.txt rename to doc/txt/Install_linux.txt diff --git a/doc/src/Install_mac.txt b/doc/txt/Install_mac.txt similarity index 100% rename from doc/src/Install_mac.txt rename to doc/txt/Install_mac.txt diff --git a/doc/src/Install_patch.txt b/doc/txt/Install_patch.txt similarity index 100% rename from doc/src/Install_patch.txt rename to doc/txt/Install_patch.txt diff --git a/doc/src/Install_svn.txt b/doc/txt/Install_svn.txt similarity index 100% rename from doc/src/Install_svn.txt rename to doc/txt/Install_svn.txt diff --git a/doc/src/Install_tarball.txt b/doc/txt/Install_tarball.txt similarity index 100% rename from doc/src/Install_tarball.txt rename to doc/txt/Install_tarball.txt diff --git a/doc/src/Install_windows.txt b/doc/txt/Install_windows.txt similarity index 100% rename from doc/src/Install_windows.txt rename to doc/txt/Install_windows.txt diff --git a/doc/src/Intro.txt b/doc/txt/Intro.txt similarity index 100% rename from doc/src/Intro.txt rename to doc/txt/Intro.txt diff --git a/doc/src/Intro_authors.txt b/doc/txt/Intro_authors.txt similarity index 100% rename from doc/src/Intro_authors.txt rename to doc/txt/Intro_authors.txt diff --git a/doc/src/Intro_features.txt b/doc/txt/Intro_features.txt similarity index 100% rename from doc/src/Intro_features.txt rename to doc/txt/Intro_features.txt diff --git a/doc/src/Intro_nonfeatures.txt b/doc/txt/Intro_nonfeatures.txt similarity index 100% rename from doc/src/Intro_nonfeatures.txt rename to doc/txt/Intro_nonfeatures.txt diff --git a/doc/src/Intro_opensource.txt b/doc/txt/Intro_opensource.txt similarity index 100% rename from doc/src/Intro_opensource.txt rename to doc/txt/Intro_opensource.txt diff --git a/doc/src/Intro_overview.txt b/doc/txt/Intro_overview.txt similarity index 100% rename from doc/src/Intro_overview.txt rename to doc/txt/Intro_overview.txt diff --git a/doc/src/Intro_website.txt b/doc/txt/Intro_website.txt similarity index 100% rename from doc/src/Intro_website.txt rename to doc/txt/Intro_website.txt diff --git a/doc/src/Manual.txt b/doc/txt/Manual.txt similarity index 100% rename from doc/src/Manual.txt rename to doc/txt/Manual.txt diff --git a/doc/src/Manual_build.txt b/doc/txt/Manual_build.txt similarity index 100% rename from doc/src/Manual_build.txt rename to doc/txt/Manual_build.txt diff --git a/doc/src/Manual_version.txt b/doc/txt/Manual_version.txt similarity index 100% rename from doc/src/Manual_version.txt rename to doc/txt/Manual_version.txt diff --git a/doc/src/Modify.txt b/doc/txt/Modify.txt similarity index 100% rename from doc/src/Modify.txt rename to doc/txt/Modify.txt diff --git a/doc/src/Modify_atom.txt b/doc/txt/Modify_atom.txt similarity index 100% rename from doc/src/Modify_atom.txt rename to doc/txt/Modify_atom.txt diff --git a/doc/src/Modify_body.txt b/doc/txt/Modify_body.txt similarity index 100% rename from doc/src/Modify_body.txt rename to doc/txt/Modify_body.txt diff --git a/doc/src/Modify_bond.txt b/doc/txt/Modify_bond.txt similarity index 100% rename from doc/src/Modify_bond.txt rename to doc/txt/Modify_bond.txt diff --git a/doc/src/Modify_command.txt b/doc/txt/Modify_command.txt similarity index 100% rename from doc/src/Modify_command.txt rename to doc/txt/Modify_command.txt diff --git a/doc/src/Modify_compute.txt b/doc/txt/Modify_compute.txt similarity index 100% rename from doc/src/Modify_compute.txt rename to doc/txt/Modify_compute.txt diff --git a/doc/src/Modify_contribute.txt b/doc/txt/Modify_contribute.txt similarity index 100% rename from doc/src/Modify_contribute.txt rename to doc/txt/Modify_contribute.txt diff --git a/doc/src/Modify_dump.txt b/doc/txt/Modify_dump.txt similarity index 100% rename from doc/src/Modify_dump.txt rename to doc/txt/Modify_dump.txt diff --git a/doc/src/Modify_fix.txt b/doc/txt/Modify_fix.txt similarity index 100% rename from doc/src/Modify_fix.txt rename to doc/txt/Modify_fix.txt diff --git a/doc/src/Modify_kspace.txt b/doc/txt/Modify_kspace.txt similarity index 100% rename from doc/src/Modify_kspace.txt rename to doc/txt/Modify_kspace.txt diff --git a/doc/src/Modify_min.txt b/doc/txt/Modify_min.txt similarity index 100% rename from doc/src/Modify_min.txt rename to doc/txt/Modify_min.txt diff --git a/doc/src/Modify_overview.txt b/doc/txt/Modify_overview.txt similarity index 100% rename from doc/src/Modify_overview.txt rename to doc/txt/Modify_overview.txt diff --git a/doc/src/Modify_pair.txt b/doc/txt/Modify_pair.txt similarity index 100% rename from doc/src/Modify_pair.txt rename to doc/txt/Modify_pair.txt diff --git a/doc/src/Modify_region.txt b/doc/txt/Modify_region.txt similarity index 100% rename from doc/src/Modify_region.txt rename to doc/txt/Modify_region.txt diff --git a/doc/src/Modify_thermo.txt b/doc/txt/Modify_thermo.txt similarity index 100% rename from doc/src/Modify_thermo.txt rename to doc/txt/Modify_thermo.txt diff --git a/doc/src/Modify_variable.txt b/doc/txt/Modify_variable.txt similarity index 100% rename from doc/src/Modify_variable.txt rename to doc/txt/Modify_variable.txt diff --git a/doc/src/Packages.txt b/doc/txt/Packages.txt similarity index 100% rename from doc/src/Packages.txt rename to doc/txt/Packages.txt diff --git a/doc/src/Packages_details.txt b/doc/txt/Packages_details.txt similarity index 100% rename from doc/src/Packages_details.txt rename to doc/txt/Packages_details.txt diff --git a/doc/src/Packages_standard.txt b/doc/txt/Packages_standard.txt similarity index 100% rename from doc/src/Packages_standard.txt rename to doc/txt/Packages_standard.txt diff --git a/doc/src/Packages_user.txt b/doc/txt/Packages_user.txt similarity index 100% rename from doc/src/Packages_user.txt rename to doc/txt/Packages_user.txt diff --git a/doc/src/Python_call.txt b/doc/txt/Python_call.txt similarity index 100% rename from doc/src/Python_call.txt rename to doc/txt/Python_call.txt diff --git a/doc/src/Python_examples.txt b/doc/txt/Python_examples.txt similarity index 100% rename from doc/src/Python_examples.txt rename to doc/txt/Python_examples.txt diff --git a/doc/src/Python_head.txt b/doc/txt/Python_head.txt similarity index 100% rename from doc/src/Python_head.txt rename to doc/txt/Python_head.txt diff --git a/doc/src/Python_install.txt b/doc/txt/Python_install.txt similarity index 100% rename from doc/src/Python_install.txt rename to doc/txt/Python_install.txt diff --git a/doc/src/Python_library.txt b/doc/txt/Python_library.txt similarity index 100% rename from doc/src/Python_library.txt rename to doc/txt/Python_library.txt diff --git a/doc/src/Python_mpi.txt b/doc/txt/Python_mpi.txt similarity index 100% rename from doc/src/Python_mpi.txt rename to doc/txt/Python_mpi.txt diff --git a/doc/src/Python_overview.txt b/doc/txt/Python_overview.txt similarity index 100% rename from doc/src/Python_overview.txt rename to doc/txt/Python_overview.txt diff --git a/doc/src/Python_pylammps.txt b/doc/txt/Python_pylammps.txt similarity index 100% rename from doc/src/Python_pylammps.txt rename to doc/txt/Python_pylammps.txt diff --git a/doc/src/Python_run.txt b/doc/txt/Python_run.txt similarity index 100% rename from doc/src/Python_run.txt rename to doc/txt/Python_run.txt diff --git a/doc/src/Python_shlib.txt b/doc/txt/Python_shlib.txt similarity index 100% rename from doc/src/Python_shlib.txt rename to doc/txt/Python_shlib.txt diff --git a/doc/src/Python_test.txt b/doc/txt/Python_test.txt similarity index 100% rename from doc/src/Python_test.txt rename to doc/txt/Python_test.txt diff --git a/doc/src/Run_basics.txt b/doc/txt/Run_basics.txt similarity index 100% rename from doc/src/Run_basics.txt rename to doc/txt/Run_basics.txt diff --git a/doc/src/Run_head.txt b/doc/txt/Run_head.txt similarity index 100% rename from doc/src/Run_head.txt rename to doc/txt/Run_head.txt diff --git a/doc/src/Run_options.txt b/doc/txt/Run_options.txt similarity index 100% rename from doc/src/Run_options.txt rename to doc/txt/Run_options.txt diff --git a/doc/src/Run_output.txt b/doc/txt/Run_output.txt similarity index 100% rename from doc/src/Run_output.txt rename to doc/txt/Run_output.txt diff --git a/doc/src/Run_windows.txt b/doc/txt/Run_windows.txt similarity index 100% rename from doc/src/Run_windows.txt rename to doc/txt/Run_windows.txt diff --git a/doc/src/Speed.txt b/doc/txt/Speed.txt similarity index 100% rename from doc/src/Speed.txt rename to doc/txt/Speed.txt diff --git a/doc/src/Speed_bench.txt b/doc/txt/Speed_bench.txt similarity index 100% rename from doc/src/Speed_bench.txt rename to doc/txt/Speed_bench.txt diff --git a/doc/src/Speed_compare.txt b/doc/txt/Speed_compare.txt similarity index 100% rename from doc/src/Speed_compare.txt rename to doc/txt/Speed_compare.txt diff --git a/doc/src/Speed_gpu.txt b/doc/txt/Speed_gpu.txt similarity index 100% rename from doc/src/Speed_gpu.txt rename to doc/txt/Speed_gpu.txt diff --git a/doc/src/Speed_intel.txt b/doc/txt/Speed_intel.txt similarity index 100% rename from doc/src/Speed_intel.txt rename to doc/txt/Speed_intel.txt diff --git a/doc/src/Speed_kokkos.txt b/doc/txt/Speed_kokkos.txt similarity index 100% rename from doc/src/Speed_kokkos.txt rename to doc/txt/Speed_kokkos.txt diff --git a/doc/src/Speed_measure.txt b/doc/txt/Speed_measure.txt similarity index 100% rename from doc/src/Speed_measure.txt rename to doc/txt/Speed_measure.txt diff --git a/doc/src/Speed_omp.txt b/doc/txt/Speed_omp.txt similarity index 100% rename from doc/src/Speed_omp.txt rename to doc/txt/Speed_omp.txt diff --git a/doc/src/Speed_opt.txt b/doc/txt/Speed_opt.txt similarity index 100% rename from doc/src/Speed_opt.txt rename to doc/txt/Speed_opt.txt diff --git a/doc/src/Speed_packages.txt b/doc/txt/Speed_packages.txt similarity index 100% rename from doc/src/Speed_packages.txt rename to doc/txt/Speed_packages.txt diff --git a/doc/src/Speed_tips.txt b/doc/txt/Speed_tips.txt similarity index 100% rename from doc/src/Speed_tips.txt rename to doc/txt/Speed_tips.txt diff --git a/doc/src/Tools.txt b/doc/txt/Tools.txt similarity index 100% rename from doc/src/Tools.txt rename to doc/txt/Tools.txt diff --git a/doc/src/angle_charmm.txt b/doc/txt/angle_charmm.txt similarity index 100% rename from doc/src/angle_charmm.txt rename to doc/txt/angle_charmm.txt diff --git a/doc/src/angle_class2.txt b/doc/txt/angle_class2.txt similarity index 100% rename from doc/src/angle_class2.txt rename to doc/txt/angle_class2.txt diff --git a/doc/src/angle_coeff.txt b/doc/txt/angle_coeff.txt similarity index 100% rename from doc/src/angle_coeff.txt rename to doc/txt/angle_coeff.txt diff --git a/doc/src/angle_cosine.txt b/doc/txt/angle_cosine.txt similarity index 100% rename from doc/src/angle_cosine.txt rename to doc/txt/angle_cosine.txt diff --git a/doc/src/angle_cosine_buck6d.txt b/doc/txt/angle_cosine_buck6d.txt similarity index 100% rename from doc/src/angle_cosine_buck6d.txt rename to doc/txt/angle_cosine_buck6d.txt diff --git a/doc/src/angle_cosine_delta.txt b/doc/txt/angle_cosine_delta.txt similarity index 100% rename from doc/src/angle_cosine_delta.txt rename to doc/txt/angle_cosine_delta.txt diff --git a/doc/src/angle_cosine_periodic.txt b/doc/txt/angle_cosine_periodic.txt similarity index 100% rename from doc/src/angle_cosine_periodic.txt rename to doc/txt/angle_cosine_periodic.txt diff --git a/doc/src/angle_cosine_shift.txt b/doc/txt/angle_cosine_shift.txt similarity index 100% rename from doc/src/angle_cosine_shift.txt rename to doc/txt/angle_cosine_shift.txt diff --git a/doc/src/angle_cosine_shift_exp.txt b/doc/txt/angle_cosine_shift_exp.txt similarity index 100% rename from doc/src/angle_cosine_shift_exp.txt rename to doc/txt/angle_cosine_shift_exp.txt diff --git a/doc/src/angle_cosine_squared.txt b/doc/txt/angle_cosine_squared.txt similarity index 100% rename from doc/src/angle_cosine_squared.txt rename to doc/txt/angle_cosine_squared.txt diff --git a/doc/src/angle_cross.txt b/doc/txt/angle_cross.txt similarity index 100% rename from doc/src/angle_cross.txt rename to doc/txt/angle_cross.txt diff --git a/doc/src/angle_dipole.txt b/doc/txt/angle_dipole.txt similarity index 100% rename from doc/src/angle_dipole.txt rename to doc/txt/angle_dipole.txt diff --git a/doc/src/angle_fourier.txt b/doc/txt/angle_fourier.txt similarity index 100% rename from doc/src/angle_fourier.txt rename to doc/txt/angle_fourier.txt diff --git a/doc/src/angle_fourier_simple.txt b/doc/txt/angle_fourier_simple.txt similarity index 100% rename from doc/src/angle_fourier_simple.txt rename to doc/txt/angle_fourier_simple.txt diff --git a/doc/src/angle_harmonic.txt b/doc/txt/angle_harmonic.txt similarity index 100% rename from doc/src/angle_harmonic.txt rename to doc/txt/angle_harmonic.txt diff --git a/doc/src/angle_hybrid.txt b/doc/txt/angle_hybrid.txt similarity index 100% rename from doc/src/angle_hybrid.txt rename to doc/txt/angle_hybrid.txt diff --git a/doc/src/angle_mm3.txt b/doc/txt/angle_mm3.txt similarity index 100% rename from doc/src/angle_mm3.txt rename to doc/txt/angle_mm3.txt diff --git a/doc/src/angle_none.txt b/doc/txt/angle_none.txt similarity index 100% rename from doc/src/angle_none.txt rename to doc/txt/angle_none.txt diff --git a/doc/src/angle_quartic.txt b/doc/txt/angle_quartic.txt similarity index 100% rename from doc/src/angle_quartic.txt rename to doc/txt/angle_quartic.txt diff --git a/doc/src/angle_sdk.txt b/doc/txt/angle_sdk.txt similarity index 100% rename from doc/src/angle_sdk.txt rename to doc/txt/angle_sdk.txt diff --git a/doc/src/angle_style.txt b/doc/txt/angle_style.txt similarity index 100% rename from doc/src/angle_style.txt rename to doc/txt/angle_style.txt diff --git a/doc/src/angle_table.txt b/doc/txt/angle_table.txt similarity index 100% rename from doc/src/angle_table.txt rename to doc/txt/angle_table.txt diff --git a/doc/src/angle_zero.txt b/doc/txt/angle_zero.txt similarity index 100% rename from doc/src/angle_zero.txt rename to doc/txt/angle_zero.txt diff --git a/doc/src/angles.txt b/doc/txt/angles.txt similarity index 100% rename from doc/src/angles.txt rename to doc/txt/angles.txt diff --git a/doc/src/atom_modify.txt b/doc/txt/atom_modify.txt similarity index 100% rename from doc/src/atom_modify.txt rename to doc/txt/atom_modify.txt diff --git a/doc/src/atom_style.txt b/doc/txt/atom_style.txt similarity index 100% rename from doc/src/atom_style.txt rename to doc/txt/atom_style.txt diff --git a/doc/src/balance.txt b/doc/txt/balance.txt similarity index 100% rename from doc/src/balance.txt rename to doc/txt/balance.txt diff --git a/doc/src/bond_class2.txt b/doc/txt/bond_class2.txt similarity index 100% rename from doc/src/bond_class2.txt rename to doc/txt/bond_class2.txt diff --git a/doc/src/bond_coeff.txt b/doc/txt/bond_coeff.txt similarity index 100% rename from doc/src/bond_coeff.txt rename to doc/txt/bond_coeff.txt diff --git a/doc/src/bond_fene.txt b/doc/txt/bond_fene.txt similarity index 100% rename from doc/src/bond_fene.txt rename to doc/txt/bond_fene.txt diff --git a/doc/src/bond_fene_expand.txt b/doc/txt/bond_fene_expand.txt similarity index 100% rename from doc/src/bond_fene_expand.txt rename to doc/txt/bond_fene_expand.txt diff --git a/doc/src/bond_gromos.txt b/doc/txt/bond_gromos.txt similarity index 100% rename from doc/src/bond_gromos.txt rename to doc/txt/bond_gromos.txt diff --git a/doc/src/bond_harmonic.txt b/doc/txt/bond_harmonic.txt similarity index 100% rename from doc/src/bond_harmonic.txt rename to doc/txt/bond_harmonic.txt diff --git a/doc/src/bond_harmonic_shift.txt b/doc/txt/bond_harmonic_shift.txt similarity index 100% rename from doc/src/bond_harmonic_shift.txt rename to doc/txt/bond_harmonic_shift.txt diff --git a/doc/src/bond_harmonic_shift_cut.txt b/doc/txt/bond_harmonic_shift_cut.txt similarity index 100% rename from doc/src/bond_harmonic_shift_cut.txt rename to doc/txt/bond_harmonic_shift_cut.txt diff --git a/doc/src/bond_hybrid.txt b/doc/txt/bond_hybrid.txt similarity index 100% rename from doc/src/bond_hybrid.txt rename to doc/txt/bond_hybrid.txt diff --git a/doc/src/bond_mm3.txt b/doc/txt/bond_mm3.txt similarity index 100% rename from doc/src/bond_mm3.txt rename to doc/txt/bond_mm3.txt diff --git a/doc/src/bond_morse.txt b/doc/txt/bond_morse.txt similarity index 100% rename from doc/src/bond_morse.txt rename to doc/txt/bond_morse.txt diff --git a/doc/src/bond_none.txt b/doc/txt/bond_none.txt similarity index 100% rename from doc/src/bond_none.txt rename to doc/txt/bond_none.txt diff --git a/doc/src/bond_nonlinear.txt b/doc/txt/bond_nonlinear.txt similarity index 100% rename from doc/src/bond_nonlinear.txt rename to doc/txt/bond_nonlinear.txt diff --git a/doc/src/bond_oxdna.txt b/doc/txt/bond_oxdna.txt similarity index 100% rename from doc/src/bond_oxdna.txt rename to doc/txt/bond_oxdna.txt diff --git a/doc/src/bond_quartic.txt b/doc/txt/bond_quartic.txt similarity index 100% rename from doc/src/bond_quartic.txt rename to doc/txt/bond_quartic.txt diff --git a/doc/src/bond_style.txt b/doc/txt/bond_style.txt similarity index 100% rename from doc/src/bond_style.txt rename to doc/txt/bond_style.txt diff --git a/doc/src/bond_table.txt b/doc/txt/bond_table.txt similarity index 100% rename from doc/src/bond_table.txt rename to doc/txt/bond_table.txt diff --git a/doc/src/bond_write.txt b/doc/txt/bond_write.txt similarity index 100% rename from doc/src/bond_write.txt rename to doc/txt/bond_write.txt diff --git a/doc/src/bond_zero.txt b/doc/txt/bond_zero.txt similarity index 100% rename from doc/src/bond_zero.txt rename to doc/txt/bond_zero.txt diff --git a/doc/src/bonds.txt b/doc/txt/bonds.txt similarity index 100% rename from doc/src/bonds.txt rename to doc/txt/bonds.txt diff --git a/doc/src/boundary.txt b/doc/txt/boundary.txt similarity index 100% rename from doc/src/boundary.txt rename to doc/txt/boundary.txt diff --git a/doc/src/box.txt b/doc/txt/box.txt similarity index 100% rename from doc/src/box.txt rename to doc/txt/box.txt diff --git a/doc/src/change_box.txt b/doc/txt/change_box.txt similarity index 100% rename from doc/src/change_box.txt rename to doc/txt/change_box.txt diff --git a/doc/src/clear.txt b/doc/txt/clear.txt similarity index 100% rename from doc/src/clear.txt rename to doc/txt/clear.txt diff --git a/doc/src/comm_modify.txt b/doc/txt/comm_modify.txt similarity index 100% rename from doc/src/comm_modify.txt rename to doc/txt/comm_modify.txt diff --git a/doc/src/comm_style.txt b/doc/txt/comm_style.txt similarity index 100% rename from doc/src/comm_style.txt rename to doc/txt/comm_style.txt diff --git a/doc/src/commands_list.txt b/doc/txt/commands_list.txt similarity index 100% rename from doc/src/commands_list.txt rename to doc/txt/commands_list.txt diff --git a/doc/src/compute.txt b/doc/txt/compute.txt similarity index 100% rename from doc/src/compute.txt rename to doc/txt/compute.txt diff --git a/doc/src/compute_ackland_atom.txt b/doc/txt/compute_ackland_atom.txt similarity index 100% rename from doc/src/compute_ackland_atom.txt rename to doc/txt/compute_ackland_atom.txt diff --git a/doc/src/compute_adf.txt b/doc/txt/compute_adf.txt similarity index 100% rename from doc/src/compute_adf.txt rename to doc/txt/compute_adf.txt diff --git a/doc/src/compute_angle.txt b/doc/txt/compute_angle.txt similarity index 100% rename from doc/src/compute_angle.txt rename to doc/txt/compute_angle.txt diff --git a/doc/src/compute_angle_local.txt b/doc/txt/compute_angle_local.txt similarity index 100% rename from doc/src/compute_angle_local.txt rename to doc/txt/compute_angle_local.txt diff --git a/doc/src/compute_angmom_chunk.txt b/doc/txt/compute_angmom_chunk.txt similarity index 100% rename from doc/src/compute_angmom_chunk.txt rename to doc/txt/compute_angmom_chunk.txt diff --git a/doc/src/compute_basal_atom.txt b/doc/txt/compute_basal_atom.txt similarity index 100% rename from doc/src/compute_basal_atom.txt rename to doc/txt/compute_basal_atom.txt diff --git a/doc/src/compute_body_local.txt b/doc/txt/compute_body_local.txt similarity index 100% rename from doc/src/compute_body_local.txt rename to doc/txt/compute_body_local.txt diff --git a/doc/src/compute_bond.txt b/doc/txt/compute_bond.txt similarity index 100% rename from doc/src/compute_bond.txt rename to doc/txt/compute_bond.txt diff --git a/doc/src/compute_bond_local.txt b/doc/txt/compute_bond_local.txt similarity index 100% rename from doc/src/compute_bond_local.txt rename to doc/txt/compute_bond_local.txt diff --git a/doc/src/compute_centro_atom.txt b/doc/txt/compute_centro_atom.txt similarity index 100% rename from doc/src/compute_centro_atom.txt rename to doc/txt/compute_centro_atom.txt diff --git a/doc/src/compute_chunk_atom.txt b/doc/txt/compute_chunk_atom.txt similarity index 100% rename from doc/src/compute_chunk_atom.txt rename to doc/txt/compute_chunk_atom.txt diff --git a/doc/src/compute_chunk_spread_atom.txt b/doc/txt/compute_chunk_spread_atom.txt similarity index 100% rename from doc/src/compute_chunk_spread_atom.txt rename to doc/txt/compute_chunk_spread_atom.txt diff --git a/doc/src/compute_cluster_atom.txt b/doc/txt/compute_cluster_atom.txt similarity index 100% rename from doc/src/compute_cluster_atom.txt rename to doc/txt/compute_cluster_atom.txt diff --git a/doc/src/compute_cna_atom.txt b/doc/txt/compute_cna_atom.txt similarity index 100% rename from doc/src/compute_cna_atom.txt rename to doc/txt/compute_cna_atom.txt diff --git a/doc/src/compute_cnp_atom.txt b/doc/txt/compute_cnp_atom.txt similarity index 100% rename from doc/src/compute_cnp_atom.txt rename to doc/txt/compute_cnp_atom.txt diff --git a/doc/src/compute_com.txt b/doc/txt/compute_com.txt similarity index 100% rename from doc/src/compute_com.txt rename to doc/txt/compute_com.txt diff --git a/doc/src/compute_com_chunk.txt b/doc/txt/compute_com_chunk.txt similarity index 100% rename from doc/src/compute_com_chunk.txt rename to doc/txt/compute_com_chunk.txt diff --git a/doc/src/compute_contact_atom.txt b/doc/txt/compute_contact_atom.txt similarity index 100% rename from doc/src/compute_contact_atom.txt rename to doc/txt/compute_contact_atom.txt diff --git a/doc/src/compute_coord_atom.txt b/doc/txt/compute_coord_atom.txt similarity index 100% rename from doc/src/compute_coord_atom.txt rename to doc/txt/compute_coord_atom.txt diff --git a/doc/src/compute_damage_atom.txt b/doc/txt/compute_damage_atom.txt similarity index 100% rename from doc/src/compute_damage_atom.txt rename to doc/txt/compute_damage_atom.txt diff --git a/doc/src/compute_dihedral.txt b/doc/txt/compute_dihedral.txt similarity index 100% rename from doc/src/compute_dihedral.txt rename to doc/txt/compute_dihedral.txt diff --git a/doc/src/compute_dihedral_local.txt b/doc/txt/compute_dihedral_local.txt similarity index 100% rename from doc/src/compute_dihedral_local.txt rename to doc/txt/compute_dihedral_local.txt diff --git a/doc/src/compute_dilatation_atom.txt b/doc/txt/compute_dilatation_atom.txt similarity index 100% rename from doc/src/compute_dilatation_atom.txt rename to doc/txt/compute_dilatation_atom.txt diff --git a/doc/src/compute_dipole_chunk.txt b/doc/txt/compute_dipole_chunk.txt similarity index 100% rename from doc/src/compute_dipole_chunk.txt rename to doc/txt/compute_dipole_chunk.txt diff --git a/doc/src/compute_displace_atom.txt b/doc/txt/compute_displace_atom.txt similarity index 100% rename from doc/src/compute_displace_atom.txt rename to doc/txt/compute_displace_atom.txt diff --git a/doc/src/compute_dpd.txt b/doc/txt/compute_dpd.txt similarity index 100% rename from doc/src/compute_dpd.txt rename to doc/txt/compute_dpd.txt diff --git a/doc/src/compute_dpd_atom.txt b/doc/txt/compute_dpd_atom.txt similarity index 100% rename from doc/src/compute_dpd_atom.txt rename to doc/txt/compute_dpd_atom.txt diff --git a/doc/src/compute_edpd_temp_atom.txt b/doc/txt/compute_edpd_temp_atom.txt similarity index 100% rename from doc/src/compute_edpd_temp_atom.txt rename to doc/txt/compute_edpd_temp_atom.txt diff --git a/doc/src/compute_entropy_atom.txt b/doc/txt/compute_entropy_atom.txt similarity index 100% rename from doc/src/compute_entropy_atom.txt rename to doc/txt/compute_entropy_atom.txt diff --git a/doc/src/compute_erotate_asphere.txt b/doc/txt/compute_erotate_asphere.txt similarity index 100% rename from doc/src/compute_erotate_asphere.txt rename to doc/txt/compute_erotate_asphere.txt diff --git a/doc/src/compute_erotate_rigid.txt b/doc/txt/compute_erotate_rigid.txt similarity index 100% rename from doc/src/compute_erotate_rigid.txt rename to doc/txt/compute_erotate_rigid.txt diff --git a/doc/src/compute_erotate_sphere.txt b/doc/txt/compute_erotate_sphere.txt similarity index 100% rename from doc/src/compute_erotate_sphere.txt rename to doc/txt/compute_erotate_sphere.txt diff --git a/doc/src/compute_erotate_sphere_atom.txt b/doc/txt/compute_erotate_sphere_atom.txt similarity index 100% rename from doc/src/compute_erotate_sphere_atom.txt rename to doc/txt/compute_erotate_sphere_atom.txt diff --git a/doc/src/compute_event_displace.txt b/doc/txt/compute_event_displace.txt similarity index 100% rename from doc/src/compute_event_displace.txt rename to doc/txt/compute_event_displace.txt diff --git a/doc/src/compute_fep.txt b/doc/txt/compute_fep.txt similarity index 100% rename from doc/src/compute_fep.txt rename to doc/txt/compute_fep.txt diff --git a/doc/src/compute_global_atom.txt b/doc/txt/compute_global_atom.txt similarity index 100% rename from doc/src/compute_global_atom.txt rename to doc/txt/compute_global_atom.txt diff --git a/doc/src/compute_group_group.txt b/doc/txt/compute_group_group.txt similarity index 100% rename from doc/src/compute_group_group.txt rename to doc/txt/compute_group_group.txt diff --git a/doc/src/compute_gyration.txt b/doc/txt/compute_gyration.txt similarity index 100% rename from doc/src/compute_gyration.txt rename to doc/txt/compute_gyration.txt diff --git a/doc/src/compute_gyration_chunk.txt b/doc/txt/compute_gyration_chunk.txt similarity index 100% rename from doc/src/compute_gyration_chunk.txt rename to doc/txt/compute_gyration_chunk.txt diff --git a/doc/src/compute_gyration_shape.txt b/doc/txt/compute_gyration_shape.txt similarity index 100% rename from doc/src/compute_gyration_shape.txt rename to doc/txt/compute_gyration_shape.txt diff --git a/doc/src/compute_heat_flux.txt b/doc/txt/compute_heat_flux.txt similarity index 100% rename from doc/src/compute_heat_flux.txt rename to doc/txt/compute_heat_flux.txt diff --git a/doc/src/compute_hexorder_atom.txt b/doc/txt/compute_hexorder_atom.txt similarity index 100% rename from doc/src/compute_hexorder_atom.txt rename to doc/txt/compute_hexorder_atom.txt diff --git a/doc/src/compute_hma.txt b/doc/txt/compute_hma.txt similarity index 100% rename from doc/src/compute_hma.txt rename to doc/txt/compute_hma.txt diff --git a/doc/src/compute_improper.txt b/doc/txt/compute_improper.txt similarity index 100% rename from doc/src/compute_improper.txt rename to doc/txt/compute_improper.txt diff --git a/doc/src/compute_improper_local.txt b/doc/txt/compute_improper_local.txt similarity index 100% rename from doc/src/compute_improper_local.txt rename to doc/txt/compute_improper_local.txt diff --git a/doc/src/compute_inertia_chunk.txt b/doc/txt/compute_inertia_chunk.txt similarity index 100% rename from doc/src/compute_inertia_chunk.txt rename to doc/txt/compute_inertia_chunk.txt diff --git a/doc/src/compute_ke.txt b/doc/txt/compute_ke.txt similarity index 100% rename from doc/src/compute_ke.txt rename to doc/txt/compute_ke.txt diff --git a/doc/src/compute_ke_atom.txt b/doc/txt/compute_ke_atom.txt similarity index 100% rename from doc/src/compute_ke_atom.txt rename to doc/txt/compute_ke_atom.txt diff --git a/doc/src/compute_ke_atom_eff.txt b/doc/txt/compute_ke_atom_eff.txt similarity index 100% rename from doc/src/compute_ke_atom_eff.txt rename to doc/txt/compute_ke_atom_eff.txt diff --git a/doc/src/compute_ke_eff.txt b/doc/txt/compute_ke_eff.txt similarity index 100% rename from doc/src/compute_ke_eff.txt rename to doc/txt/compute_ke_eff.txt diff --git a/doc/src/compute_ke_rigid.txt b/doc/txt/compute_ke_rigid.txt similarity index 100% rename from doc/src/compute_ke_rigid.txt rename to doc/txt/compute_ke_rigid.txt diff --git a/doc/src/compute_meso_e_atom.txt b/doc/txt/compute_meso_e_atom.txt similarity index 100% rename from doc/src/compute_meso_e_atom.txt rename to doc/txt/compute_meso_e_atom.txt diff --git a/doc/src/compute_meso_rho_atom.txt b/doc/txt/compute_meso_rho_atom.txt similarity index 100% rename from doc/src/compute_meso_rho_atom.txt rename to doc/txt/compute_meso_rho_atom.txt diff --git a/doc/src/compute_meso_t_atom.txt b/doc/txt/compute_meso_t_atom.txt similarity index 100% rename from doc/src/compute_meso_t_atom.txt rename to doc/txt/compute_meso_t_atom.txt diff --git a/doc/src/compute_modify.txt b/doc/txt/compute_modify.txt similarity index 100% rename from doc/src/compute_modify.txt rename to doc/txt/compute_modify.txt diff --git a/doc/src/compute_momentum.txt b/doc/txt/compute_momentum.txt similarity index 100% rename from doc/src/compute_momentum.txt rename to doc/txt/compute_momentum.txt diff --git a/doc/src/compute_msd.txt b/doc/txt/compute_msd.txt similarity index 100% rename from doc/src/compute_msd.txt rename to doc/txt/compute_msd.txt diff --git a/doc/src/compute_msd_chunk.txt b/doc/txt/compute_msd_chunk.txt similarity index 100% rename from doc/src/compute_msd_chunk.txt rename to doc/txt/compute_msd_chunk.txt diff --git a/doc/src/compute_msd_nongauss.txt b/doc/txt/compute_msd_nongauss.txt similarity index 100% rename from doc/src/compute_msd_nongauss.txt rename to doc/txt/compute_msd_nongauss.txt diff --git a/doc/src/compute_omega_chunk.txt b/doc/txt/compute_omega_chunk.txt similarity index 100% rename from doc/src/compute_omega_chunk.txt rename to doc/txt/compute_omega_chunk.txt diff --git a/doc/src/compute_orientorder_atom.txt b/doc/txt/compute_orientorder_atom.txt similarity index 100% rename from doc/src/compute_orientorder_atom.txt rename to doc/txt/compute_orientorder_atom.txt diff --git a/doc/src/compute_pair.txt b/doc/txt/compute_pair.txt similarity index 100% rename from doc/src/compute_pair.txt rename to doc/txt/compute_pair.txt diff --git a/doc/src/compute_pair_local.txt b/doc/txt/compute_pair_local.txt similarity index 100% rename from doc/src/compute_pair_local.txt rename to doc/txt/compute_pair_local.txt diff --git a/doc/src/compute_pe.txt b/doc/txt/compute_pe.txt similarity index 100% rename from doc/src/compute_pe.txt rename to doc/txt/compute_pe.txt diff --git a/doc/src/compute_pe_atom.txt b/doc/txt/compute_pe_atom.txt similarity index 100% rename from doc/src/compute_pe_atom.txt rename to doc/txt/compute_pe_atom.txt diff --git a/doc/src/compute_plasticity_atom.txt b/doc/txt/compute_plasticity_atom.txt similarity index 100% rename from doc/src/compute_plasticity_atom.txt rename to doc/txt/compute_plasticity_atom.txt diff --git a/doc/src/compute_pressure.txt b/doc/txt/compute_pressure.txt similarity index 100% rename from doc/src/compute_pressure.txt rename to doc/txt/compute_pressure.txt diff --git a/doc/src/compute_pressure_cylinder.txt b/doc/txt/compute_pressure_cylinder.txt similarity index 100% rename from doc/src/compute_pressure_cylinder.txt rename to doc/txt/compute_pressure_cylinder.txt diff --git a/doc/src/compute_pressure_uef.txt b/doc/txt/compute_pressure_uef.txt similarity index 100% rename from doc/src/compute_pressure_uef.txt rename to doc/txt/compute_pressure_uef.txt diff --git a/doc/src/compute_property_atom.txt b/doc/txt/compute_property_atom.txt similarity index 100% rename from doc/src/compute_property_atom.txt rename to doc/txt/compute_property_atom.txt diff --git a/doc/src/compute_property_chunk.txt b/doc/txt/compute_property_chunk.txt similarity index 100% rename from doc/src/compute_property_chunk.txt rename to doc/txt/compute_property_chunk.txt diff --git a/doc/src/compute_property_local.txt b/doc/txt/compute_property_local.txt similarity index 100% rename from doc/src/compute_property_local.txt rename to doc/txt/compute_property_local.txt diff --git a/doc/src/compute_ptm_atom.txt b/doc/txt/compute_ptm_atom.txt similarity index 100% rename from doc/src/compute_ptm_atom.txt rename to doc/txt/compute_ptm_atom.txt diff --git a/doc/src/compute_rdf.txt b/doc/txt/compute_rdf.txt similarity index 100% rename from doc/src/compute_rdf.txt rename to doc/txt/compute_rdf.txt diff --git a/doc/src/compute_reduce.txt b/doc/txt/compute_reduce.txt similarity index 100% rename from doc/src/compute_reduce.txt rename to doc/txt/compute_reduce.txt diff --git a/doc/src/compute_reduce_chunk.txt b/doc/txt/compute_reduce_chunk.txt similarity index 100% rename from doc/src/compute_reduce_chunk.txt rename to doc/txt/compute_reduce_chunk.txt diff --git a/doc/src/compute_rigid_local.txt b/doc/txt/compute_rigid_local.txt similarity index 100% rename from doc/src/compute_rigid_local.txt rename to doc/txt/compute_rigid_local.txt diff --git a/doc/src/compute_saed.txt b/doc/txt/compute_saed.txt similarity index 100% rename from doc/src/compute_saed.txt rename to doc/txt/compute_saed.txt diff --git a/doc/src/compute_slice.txt b/doc/txt/compute_slice.txt similarity index 100% rename from doc/src/compute_slice.txt rename to doc/txt/compute_slice.txt diff --git a/doc/src/compute_smd_contact_radius.txt b/doc/txt/compute_smd_contact_radius.txt similarity index 100% rename from doc/src/compute_smd_contact_radius.txt rename to doc/txt/compute_smd_contact_radius.txt diff --git a/doc/src/compute_smd_damage.txt b/doc/txt/compute_smd_damage.txt similarity index 100% rename from doc/src/compute_smd_damage.txt rename to doc/txt/compute_smd_damage.txt diff --git a/doc/src/compute_smd_hourglass_error.txt b/doc/txt/compute_smd_hourglass_error.txt similarity index 100% rename from doc/src/compute_smd_hourglass_error.txt rename to doc/txt/compute_smd_hourglass_error.txt diff --git a/doc/src/compute_smd_internal_energy.txt b/doc/txt/compute_smd_internal_energy.txt similarity index 100% rename from doc/src/compute_smd_internal_energy.txt rename to doc/txt/compute_smd_internal_energy.txt diff --git a/doc/src/compute_smd_plastic_strain.txt b/doc/txt/compute_smd_plastic_strain.txt similarity index 100% rename from doc/src/compute_smd_plastic_strain.txt rename to doc/txt/compute_smd_plastic_strain.txt diff --git a/doc/src/compute_smd_plastic_strain_rate.txt b/doc/txt/compute_smd_plastic_strain_rate.txt similarity index 100% rename from doc/src/compute_smd_plastic_strain_rate.txt rename to doc/txt/compute_smd_plastic_strain_rate.txt diff --git a/doc/src/compute_smd_rho.txt b/doc/txt/compute_smd_rho.txt similarity index 100% rename from doc/src/compute_smd_rho.txt rename to doc/txt/compute_smd_rho.txt diff --git a/doc/src/compute_smd_tlsph_defgrad.txt b/doc/txt/compute_smd_tlsph_defgrad.txt similarity index 100% rename from doc/src/compute_smd_tlsph_defgrad.txt rename to doc/txt/compute_smd_tlsph_defgrad.txt diff --git a/doc/src/compute_smd_tlsph_dt.txt b/doc/txt/compute_smd_tlsph_dt.txt similarity index 100% rename from doc/src/compute_smd_tlsph_dt.txt rename to doc/txt/compute_smd_tlsph_dt.txt diff --git a/doc/src/compute_smd_tlsph_num_neighs.txt b/doc/txt/compute_smd_tlsph_num_neighs.txt similarity index 100% rename from doc/src/compute_smd_tlsph_num_neighs.txt rename to doc/txt/compute_smd_tlsph_num_neighs.txt diff --git a/doc/src/compute_smd_tlsph_shape.txt b/doc/txt/compute_smd_tlsph_shape.txt similarity index 100% rename from doc/src/compute_smd_tlsph_shape.txt rename to doc/txt/compute_smd_tlsph_shape.txt diff --git a/doc/src/compute_smd_tlsph_strain.txt b/doc/txt/compute_smd_tlsph_strain.txt similarity index 100% rename from doc/src/compute_smd_tlsph_strain.txt rename to doc/txt/compute_smd_tlsph_strain.txt diff --git a/doc/src/compute_smd_tlsph_strain_rate.txt b/doc/txt/compute_smd_tlsph_strain_rate.txt similarity index 100% rename from doc/src/compute_smd_tlsph_strain_rate.txt rename to doc/txt/compute_smd_tlsph_strain_rate.txt diff --git a/doc/src/compute_smd_tlsph_stress.txt b/doc/txt/compute_smd_tlsph_stress.txt similarity index 100% rename from doc/src/compute_smd_tlsph_stress.txt rename to doc/txt/compute_smd_tlsph_stress.txt diff --git a/doc/src/compute_smd_triangle_vertices.txt b/doc/txt/compute_smd_triangle_vertices.txt similarity index 100% rename from doc/src/compute_smd_triangle_vertices.txt rename to doc/txt/compute_smd_triangle_vertices.txt diff --git a/doc/src/compute_smd_ulsph_num_neighs.txt b/doc/txt/compute_smd_ulsph_num_neighs.txt similarity index 100% rename from doc/src/compute_smd_ulsph_num_neighs.txt rename to doc/txt/compute_smd_ulsph_num_neighs.txt diff --git a/doc/src/compute_smd_ulsph_strain.txt b/doc/txt/compute_smd_ulsph_strain.txt similarity index 100% rename from doc/src/compute_smd_ulsph_strain.txt rename to doc/txt/compute_smd_ulsph_strain.txt diff --git a/doc/src/compute_smd_ulsph_strain_rate.txt b/doc/txt/compute_smd_ulsph_strain_rate.txt similarity index 100% rename from doc/src/compute_smd_ulsph_strain_rate.txt rename to doc/txt/compute_smd_ulsph_strain_rate.txt diff --git a/doc/src/compute_smd_ulsph_stress.txt b/doc/txt/compute_smd_ulsph_stress.txt similarity index 100% rename from doc/src/compute_smd_ulsph_stress.txt rename to doc/txt/compute_smd_ulsph_stress.txt diff --git a/doc/src/compute_smd_vol.txt b/doc/txt/compute_smd_vol.txt similarity index 100% rename from doc/src/compute_smd_vol.txt rename to doc/txt/compute_smd_vol.txt diff --git a/doc/src/compute_sna_atom.txt b/doc/txt/compute_sna_atom.txt similarity index 100% rename from doc/src/compute_sna_atom.txt rename to doc/txt/compute_sna_atom.txt diff --git a/doc/src/compute_spin.txt b/doc/txt/compute_spin.txt similarity index 100% rename from doc/src/compute_spin.txt rename to doc/txt/compute_spin.txt diff --git a/doc/src/compute_stress_atom.txt b/doc/txt/compute_stress_atom.txt similarity index 100% rename from doc/src/compute_stress_atom.txt rename to doc/txt/compute_stress_atom.txt diff --git a/doc/src/compute_stress_mop.txt b/doc/txt/compute_stress_mop.txt similarity index 100% rename from doc/src/compute_stress_mop.txt rename to doc/txt/compute_stress_mop.txt diff --git a/doc/src/compute_tally.txt b/doc/txt/compute_tally.txt similarity index 100% rename from doc/src/compute_tally.txt rename to doc/txt/compute_tally.txt diff --git a/doc/src/compute_tdpd_cc_atom.txt b/doc/txt/compute_tdpd_cc_atom.txt similarity index 100% rename from doc/src/compute_tdpd_cc_atom.txt rename to doc/txt/compute_tdpd_cc_atom.txt diff --git a/doc/src/compute_temp.txt b/doc/txt/compute_temp.txt similarity index 100% rename from doc/src/compute_temp.txt rename to doc/txt/compute_temp.txt diff --git a/doc/src/compute_temp_asphere.txt b/doc/txt/compute_temp_asphere.txt similarity index 100% rename from doc/src/compute_temp_asphere.txt rename to doc/txt/compute_temp_asphere.txt diff --git a/doc/src/compute_temp_body.txt b/doc/txt/compute_temp_body.txt similarity index 100% rename from doc/src/compute_temp_body.txt rename to doc/txt/compute_temp_body.txt diff --git a/doc/src/compute_temp_chunk.txt b/doc/txt/compute_temp_chunk.txt similarity index 100% rename from doc/src/compute_temp_chunk.txt rename to doc/txt/compute_temp_chunk.txt diff --git a/doc/src/compute_temp_com.txt b/doc/txt/compute_temp_com.txt similarity index 100% rename from doc/src/compute_temp_com.txt rename to doc/txt/compute_temp_com.txt diff --git a/doc/src/compute_temp_cs.txt b/doc/txt/compute_temp_cs.txt similarity index 100% rename from doc/src/compute_temp_cs.txt rename to doc/txt/compute_temp_cs.txt diff --git a/doc/src/compute_temp_deform.txt b/doc/txt/compute_temp_deform.txt similarity index 100% rename from doc/src/compute_temp_deform.txt rename to doc/txt/compute_temp_deform.txt diff --git a/doc/src/compute_temp_deform_eff.txt b/doc/txt/compute_temp_deform_eff.txt similarity index 100% rename from doc/src/compute_temp_deform_eff.txt rename to doc/txt/compute_temp_deform_eff.txt diff --git a/doc/src/compute_temp_drude.txt b/doc/txt/compute_temp_drude.txt similarity index 100% rename from doc/src/compute_temp_drude.txt rename to doc/txt/compute_temp_drude.txt diff --git a/doc/src/compute_temp_eff.txt b/doc/txt/compute_temp_eff.txt similarity index 100% rename from doc/src/compute_temp_eff.txt rename to doc/txt/compute_temp_eff.txt diff --git a/doc/src/compute_temp_partial.txt b/doc/txt/compute_temp_partial.txt similarity index 100% rename from doc/src/compute_temp_partial.txt rename to doc/txt/compute_temp_partial.txt diff --git a/doc/src/compute_temp_profile.txt b/doc/txt/compute_temp_profile.txt similarity index 100% rename from doc/src/compute_temp_profile.txt rename to doc/txt/compute_temp_profile.txt diff --git a/doc/src/compute_temp_ramp.txt b/doc/txt/compute_temp_ramp.txt similarity index 100% rename from doc/src/compute_temp_ramp.txt rename to doc/txt/compute_temp_ramp.txt diff --git a/doc/src/compute_temp_region.txt b/doc/txt/compute_temp_region.txt similarity index 100% rename from doc/src/compute_temp_region.txt rename to doc/txt/compute_temp_region.txt diff --git a/doc/src/compute_temp_region_eff.txt b/doc/txt/compute_temp_region_eff.txt similarity index 100% rename from doc/src/compute_temp_region_eff.txt rename to doc/txt/compute_temp_region_eff.txt diff --git a/doc/src/compute_temp_rotate.txt b/doc/txt/compute_temp_rotate.txt similarity index 100% rename from doc/src/compute_temp_rotate.txt rename to doc/txt/compute_temp_rotate.txt diff --git a/doc/src/compute_temp_sphere.txt b/doc/txt/compute_temp_sphere.txt similarity index 100% rename from doc/src/compute_temp_sphere.txt rename to doc/txt/compute_temp_sphere.txt diff --git a/doc/src/compute_temp_uef.txt b/doc/txt/compute_temp_uef.txt similarity index 100% rename from doc/src/compute_temp_uef.txt rename to doc/txt/compute_temp_uef.txt diff --git a/doc/src/compute_ti.txt b/doc/txt/compute_ti.txt similarity index 100% rename from doc/src/compute_ti.txt rename to doc/txt/compute_ti.txt diff --git a/doc/src/compute_torque_chunk.txt b/doc/txt/compute_torque_chunk.txt similarity index 100% rename from doc/src/compute_torque_chunk.txt rename to doc/txt/compute_torque_chunk.txt diff --git a/doc/src/compute_vacf.txt b/doc/txt/compute_vacf.txt similarity index 100% rename from doc/src/compute_vacf.txt rename to doc/txt/compute_vacf.txt diff --git a/doc/src/compute_vcm_chunk.txt b/doc/txt/compute_vcm_chunk.txt similarity index 100% rename from doc/src/compute_vcm_chunk.txt rename to doc/txt/compute_vcm_chunk.txt diff --git a/doc/src/compute_voronoi_atom.txt b/doc/txt/compute_voronoi_atom.txt similarity index 100% rename from doc/src/compute_voronoi_atom.txt rename to doc/txt/compute_voronoi_atom.txt diff --git a/doc/src/compute_xrd.txt b/doc/txt/compute_xrd.txt similarity index 100% rename from doc/src/compute_xrd.txt rename to doc/txt/compute_xrd.txt diff --git a/doc/src/computes.txt b/doc/txt/computes.txt similarity index 100% rename from doc/src/computes.txt rename to doc/txt/computes.txt diff --git a/doc/src/create_atoms.txt b/doc/txt/create_atoms.txt similarity index 100% rename from doc/src/create_atoms.txt rename to doc/txt/create_atoms.txt diff --git a/doc/src/create_bonds.txt b/doc/txt/create_bonds.txt similarity index 100% rename from doc/src/create_bonds.txt rename to doc/txt/create_bonds.txt diff --git a/doc/src/create_box.txt b/doc/txt/create_box.txt similarity index 100% rename from doc/src/create_box.txt rename to doc/txt/create_box.txt diff --git a/doc/src/delete_atoms.txt b/doc/txt/delete_atoms.txt similarity index 100% rename from doc/src/delete_atoms.txt rename to doc/txt/delete_atoms.txt diff --git a/doc/src/delete_bonds.txt b/doc/txt/delete_bonds.txt similarity index 100% rename from doc/src/delete_bonds.txt rename to doc/txt/delete_bonds.txt diff --git a/doc/src/dielectric.txt b/doc/txt/dielectric.txt similarity index 100% rename from doc/src/dielectric.txt rename to doc/txt/dielectric.txt diff --git a/doc/src/dihedral_charmm.txt b/doc/txt/dihedral_charmm.txt similarity index 100% rename from doc/src/dihedral_charmm.txt rename to doc/txt/dihedral_charmm.txt diff --git a/doc/src/dihedral_class2.txt b/doc/txt/dihedral_class2.txt similarity index 100% rename from doc/src/dihedral_class2.txt rename to doc/txt/dihedral_class2.txt diff --git a/doc/src/dihedral_coeff.txt b/doc/txt/dihedral_coeff.txt similarity index 100% rename from doc/src/dihedral_coeff.txt rename to doc/txt/dihedral_coeff.txt diff --git a/doc/src/dihedral_cosine_shift_exp.txt b/doc/txt/dihedral_cosine_shift_exp.txt similarity index 100% rename from doc/src/dihedral_cosine_shift_exp.txt rename to doc/txt/dihedral_cosine_shift_exp.txt diff --git a/doc/src/dihedral_fourier.txt b/doc/txt/dihedral_fourier.txt similarity index 100% rename from doc/src/dihedral_fourier.txt rename to doc/txt/dihedral_fourier.txt diff --git a/doc/src/dihedral_harmonic.txt b/doc/txt/dihedral_harmonic.txt similarity index 100% rename from doc/src/dihedral_harmonic.txt rename to doc/txt/dihedral_harmonic.txt diff --git a/doc/src/dihedral_helix.txt b/doc/txt/dihedral_helix.txt similarity index 100% rename from doc/src/dihedral_helix.txt rename to doc/txt/dihedral_helix.txt diff --git a/doc/src/dihedral_hybrid.txt b/doc/txt/dihedral_hybrid.txt similarity index 100% rename from doc/src/dihedral_hybrid.txt rename to doc/txt/dihedral_hybrid.txt diff --git a/doc/src/dihedral_multi_harmonic.txt b/doc/txt/dihedral_multi_harmonic.txt similarity index 100% rename from doc/src/dihedral_multi_harmonic.txt rename to doc/txt/dihedral_multi_harmonic.txt diff --git a/doc/src/dihedral_nharmonic.txt b/doc/txt/dihedral_nharmonic.txt similarity index 100% rename from doc/src/dihedral_nharmonic.txt rename to doc/txt/dihedral_nharmonic.txt diff --git a/doc/src/dihedral_none.txt b/doc/txt/dihedral_none.txt similarity index 100% rename from doc/src/dihedral_none.txt rename to doc/txt/dihedral_none.txt diff --git a/doc/src/dihedral_opls.txt b/doc/txt/dihedral_opls.txt similarity index 100% rename from doc/src/dihedral_opls.txt rename to doc/txt/dihedral_opls.txt diff --git a/doc/src/dihedral_quadratic.txt b/doc/txt/dihedral_quadratic.txt similarity index 100% rename from doc/src/dihedral_quadratic.txt rename to doc/txt/dihedral_quadratic.txt diff --git a/doc/src/dihedral_spherical.txt b/doc/txt/dihedral_spherical.txt similarity index 100% rename from doc/src/dihedral_spherical.txt rename to doc/txt/dihedral_spherical.txt diff --git a/doc/src/dihedral_style.txt b/doc/txt/dihedral_style.txt similarity index 100% rename from doc/src/dihedral_style.txt rename to doc/txt/dihedral_style.txt diff --git a/doc/src/dihedral_table.txt b/doc/txt/dihedral_table.txt similarity index 100% rename from doc/src/dihedral_table.txt rename to doc/txt/dihedral_table.txt diff --git a/doc/src/dihedral_table_cut.txt b/doc/txt/dihedral_table_cut.txt similarity index 100% rename from doc/src/dihedral_table_cut.txt rename to doc/txt/dihedral_table_cut.txt diff --git a/doc/src/dihedral_zero.txt b/doc/txt/dihedral_zero.txt similarity index 100% rename from doc/src/dihedral_zero.txt rename to doc/txt/dihedral_zero.txt diff --git a/doc/src/dihedrals.txt b/doc/txt/dihedrals.txt similarity index 100% rename from doc/src/dihedrals.txt rename to doc/txt/dihedrals.txt diff --git a/doc/src/dimension.txt b/doc/txt/dimension.txt similarity index 100% rename from doc/src/dimension.txt rename to doc/txt/dimension.txt diff --git a/doc/src/displace_atoms.txt b/doc/txt/displace_atoms.txt similarity index 100% rename from doc/src/displace_atoms.txt rename to doc/txt/displace_atoms.txt diff --git a/doc/src/dump.txt b/doc/txt/dump.txt similarity index 100% rename from doc/src/dump.txt rename to doc/txt/dump.txt diff --git a/doc/src/dump_adios.txt b/doc/txt/dump_adios.txt similarity index 100% rename from doc/src/dump_adios.txt rename to doc/txt/dump_adios.txt diff --git a/doc/src/dump_cfg_uef.txt b/doc/txt/dump_cfg_uef.txt similarity index 100% rename from doc/src/dump_cfg_uef.txt rename to doc/txt/dump_cfg_uef.txt diff --git a/doc/src/dump_h5md.txt b/doc/txt/dump_h5md.txt similarity index 100% rename from doc/src/dump_h5md.txt rename to doc/txt/dump_h5md.txt diff --git a/doc/src/dump_image.txt b/doc/txt/dump_image.txt similarity index 100% rename from doc/src/dump_image.txt rename to doc/txt/dump_image.txt diff --git a/doc/src/dump_modify.txt b/doc/txt/dump_modify.txt similarity index 100% rename from doc/src/dump_modify.txt rename to doc/txt/dump_modify.txt diff --git a/doc/src/dump_molfile.txt b/doc/txt/dump_molfile.txt similarity index 100% rename from doc/src/dump_molfile.txt rename to doc/txt/dump_molfile.txt diff --git a/doc/src/dump_netcdf.txt b/doc/txt/dump_netcdf.txt similarity index 100% rename from doc/src/dump_netcdf.txt rename to doc/txt/dump_netcdf.txt diff --git a/doc/src/dump_vtk.txt b/doc/txt/dump_vtk.txt similarity index 100% rename from doc/src/dump_vtk.txt rename to doc/txt/dump_vtk.txt diff --git a/doc/src/dynamical_matrix.txt b/doc/txt/dynamical_matrix.txt similarity index 100% rename from doc/src/dynamical_matrix.txt rename to doc/txt/dynamical_matrix.txt diff --git a/doc/src/echo.txt b/doc/txt/echo.txt similarity index 100% rename from doc/src/echo.txt rename to doc/txt/echo.txt diff --git a/doc/src/fix.txt b/doc/txt/fix.txt similarity index 100% rename from doc/src/fix.txt rename to doc/txt/fix.txt diff --git a/doc/src/fix_adapt.txt b/doc/txt/fix_adapt.txt similarity index 100% rename from doc/src/fix_adapt.txt rename to doc/txt/fix_adapt.txt diff --git a/doc/src/fix_adapt_fep.txt b/doc/txt/fix_adapt_fep.txt similarity index 100% rename from doc/src/fix_adapt_fep.txt rename to doc/txt/fix_adapt_fep.txt diff --git a/doc/src/fix_addforce.txt b/doc/txt/fix_addforce.txt similarity index 100% rename from doc/src/fix_addforce.txt rename to doc/txt/fix_addforce.txt diff --git a/doc/src/fix_addtorque.txt b/doc/txt/fix_addtorque.txt similarity index 100% rename from doc/src/fix_addtorque.txt rename to doc/txt/fix_addtorque.txt diff --git a/doc/src/fix_append_atoms.txt b/doc/txt/fix_append_atoms.txt similarity index 100% rename from doc/src/fix_append_atoms.txt rename to doc/txt/fix_append_atoms.txt diff --git a/doc/src/fix_atc.txt b/doc/txt/fix_atc.txt similarity index 100% rename from doc/src/fix_atc.txt rename to doc/txt/fix_atc.txt diff --git a/doc/src/fix_atom_swap.txt b/doc/txt/fix_atom_swap.txt similarity index 100% rename from doc/src/fix_atom_swap.txt rename to doc/txt/fix_atom_swap.txt diff --git a/doc/src/fix_ave_atom.txt b/doc/txt/fix_ave_atom.txt similarity index 100% rename from doc/src/fix_ave_atom.txt rename to doc/txt/fix_ave_atom.txt diff --git a/doc/src/fix_ave_chunk.txt b/doc/txt/fix_ave_chunk.txt similarity index 100% rename from doc/src/fix_ave_chunk.txt rename to doc/txt/fix_ave_chunk.txt diff --git a/doc/src/fix_ave_correlate.txt b/doc/txt/fix_ave_correlate.txt similarity index 100% rename from doc/src/fix_ave_correlate.txt rename to doc/txt/fix_ave_correlate.txt diff --git a/doc/src/fix_ave_correlate_long.txt b/doc/txt/fix_ave_correlate_long.txt similarity index 100% rename from doc/src/fix_ave_correlate_long.txt rename to doc/txt/fix_ave_correlate_long.txt diff --git a/doc/src/fix_ave_histo.txt b/doc/txt/fix_ave_histo.txt similarity index 100% rename from doc/src/fix_ave_histo.txt rename to doc/txt/fix_ave_histo.txt diff --git a/doc/src/fix_ave_time.txt b/doc/txt/fix_ave_time.txt similarity index 100% rename from doc/src/fix_ave_time.txt rename to doc/txt/fix_ave_time.txt diff --git a/doc/src/fix_aveforce.txt b/doc/txt/fix_aveforce.txt similarity index 100% rename from doc/src/fix_aveforce.txt rename to doc/txt/fix_aveforce.txt diff --git a/doc/src/fix_balance.txt b/doc/txt/fix_balance.txt similarity index 100% rename from doc/src/fix_balance.txt rename to doc/txt/fix_balance.txt diff --git a/doc/src/fix_bocs.txt b/doc/txt/fix_bocs.txt similarity index 100% rename from doc/src/fix_bocs.txt rename to doc/txt/fix_bocs.txt diff --git a/doc/src/fix_bond_break.txt b/doc/txt/fix_bond_break.txt similarity index 100% rename from doc/src/fix_bond_break.txt rename to doc/txt/fix_bond_break.txt diff --git a/doc/src/fix_bond_create.txt b/doc/txt/fix_bond_create.txt similarity index 100% rename from doc/src/fix_bond_create.txt rename to doc/txt/fix_bond_create.txt diff --git a/doc/src/fix_bond_react.txt b/doc/txt/fix_bond_react.txt similarity index 100% rename from doc/src/fix_bond_react.txt rename to doc/txt/fix_bond_react.txt diff --git a/doc/src/fix_bond_swap.txt b/doc/txt/fix_bond_swap.txt similarity index 100% rename from doc/src/fix_bond_swap.txt rename to doc/txt/fix_bond_swap.txt diff --git a/doc/src/fix_box_relax.txt b/doc/txt/fix_box_relax.txt similarity index 100% rename from doc/src/fix_box_relax.txt rename to doc/txt/fix_box_relax.txt diff --git a/doc/src/fix_client_md.txt b/doc/txt/fix_client_md.txt similarity index 100% rename from doc/src/fix_client_md.txt rename to doc/txt/fix_client_md.txt diff --git a/doc/src/fix_cmap.txt b/doc/txt/fix_cmap.txt similarity index 100% rename from doc/src/fix_cmap.txt rename to doc/txt/fix_cmap.txt diff --git a/doc/src/fix_colvars.txt b/doc/txt/fix_colvars.txt similarity index 100% rename from doc/src/fix_colvars.txt rename to doc/txt/fix_colvars.txt diff --git a/doc/src/fix_controller.txt b/doc/txt/fix_controller.txt similarity index 100% rename from doc/src/fix_controller.txt rename to doc/txt/fix_controller.txt diff --git a/doc/src/fix_deform.txt b/doc/txt/fix_deform.txt similarity index 100% rename from doc/src/fix_deform.txt rename to doc/txt/fix_deform.txt diff --git a/doc/src/fix_deposit.txt b/doc/txt/fix_deposit.txt similarity index 100% rename from doc/src/fix_deposit.txt rename to doc/txt/fix_deposit.txt diff --git a/doc/src/fix_dpd_energy.txt b/doc/txt/fix_dpd_energy.txt similarity index 100% rename from doc/src/fix_dpd_energy.txt rename to doc/txt/fix_dpd_energy.txt diff --git a/doc/src/fix_dpd_source.txt b/doc/txt/fix_dpd_source.txt similarity index 100% rename from doc/src/fix_dpd_source.txt rename to doc/txt/fix_dpd_source.txt diff --git a/doc/src/fix_drag.txt b/doc/txt/fix_drag.txt similarity index 100% rename from doc/src/fix_drag.txt rename to doc/txt/fix_drag.txt diff --git a/doc/src/fix_drude.txt b/doc/txt/fix_drude.txt similarity index 100% rename from doc/src/fix_drude.txt rename to doc/txt/fix_drude.txt diff --git a/doc/src/fix_drude_transform.txt b/doc/txt/fix_drude_transform.txt similarity index 100% rename from doc/src/fix_drude_transform.txt rename to doc/txt/fix_drude_transform.txt diff --git a/doc/src/fix_dt_reset.txt b/doc/txt/fix_dt_reset.txt similarity index 100% rename from doc/src/fix_dt_reset.txt rename to doc/txt/fix_dt_reset.txt diff --git a/doc/src/fix_efield.txt b/doc/txt/fix_efield.txt similarity index 100% rename from doc/src/fix_efield.txt rename to doc/txt/fix_efield.txt diff --git a/doc/src/fix_ehex.txt b/doc/txt/fix_ehex.txt similarity index 100% rename from doc/src/fix_ehex.txt rename to doc/txt/fix_ehex.txt diff --git a/doc/src/fix_electron_stopping.txt b/doc/txt/fix_electron_stopping.txt similarity index 100% rename from doc/src/fix_electron_stopping.txt rename to doc/txt/fix_electron_stopping.txt diff --git a/doc/src/fix_enforce2d.txt b/doc/txt/fix_enforce2d.txt similarity index 100% rename from doc/src/fix_enforce2d.txt rename to doc/txt/fix_enforce2d.txt diff --git a/doc/src/fix_eos_cv.txt b/doc/txt/fix_eos_cv.txt similarity index 100% rename from doc/src/fix_eos_cv.txt rename to doc/txt/fix_eos_cv.txt diff --git a/doc/src/fix_eos_table.txt b/doc/txt/fix_eos_table.txt similarity index 100% rename from doc/src/fix_eos_table.txt rename to doc/txt/fix_eos_table.txt diff --git a/doc/src/fix_eos_table_rx.txt b/doc/txt/fix_eos_table_rx.txt similarity index 100% rename from doc/src/fix_eos_table_rx.txt rename to doc/txt/fix_eos_table_rx.txt diff --git a/doc/src/fix_evaporate.txt b/doc/txt/fix_evaporate.txt similarity index 100% rename from doc/src/fix_evaporate.txt rename to doc/txt/fix_evaporate.txt diff --git a/doc/src/fix_external.txt b/doc/txt/fix_external.txt similarity index 100% rename from doc/src/fix_external.txt rename to doc/txt/fix_external.txt diff --git a/doc/src/fix_ffl.txt b/doc/txt/fix_ffl.txt similarity index 100% rename from doc/src/fix_ffl.txt rename to doc/txt/fix_ffl.txt diff --git a/doc/src/fix_filter_corotate.txt b/doc/txt/fix_filter_corotate.txt similarity index 100% rename from doc/src/fix_filter_corotate.txt rename to doc/txt/fix_filter_corotate.txt diff --git a/doc/src/fix_flow_gauss.txt b/doc/txt/fix_flow_gauss.txt similarity index 100% rename from doc/src/fix_flow_gauss.txt rename to doc/txt/fix_flow_gauss.txt diff --git a/doc/src/fix_freeze.txt b/doc/txt/fix_freeze.txt similarity index 100% rename from doc/src/fix_freeze.txt rename to doc/txt/fix_freeze.txt diff --git a/doc/src/fix_gcmc.txt b/doc/txt/fix_gcmc.txt similarity index 100% rename from doc/src/fix_gcmc.txt rename to doc/txt/fix_gcmc.txt diff --git a/doc/src/fix_gld.txt b/doc/txt/fix_gld.txt similarity index 100% rename from doc/src/fix_gld.txt rename to doc/txt/fix_gld.txt diff --git a/doc/src/fix_gle.txt b/doc/txt/fix_gle.txt similarity index 100% rename from doc/src/fix_gle.txt rename to doc/txt/fix_gle.txt diff --git a/doc/src/fix_gravity.txt b/doc/txt/fix_gravity.txt similarity index 100% rename from doc/src/fix_gravity.txt rename to doc/txt/fix_gravity.txt diff --git a/doc/src/fix_grem.txt b/doc/txt/fix_grem.txt similarity index 100% rename from doc/src/fix_grem.txt rename to doc/txt/fix_grem.txt diff --git a/doc/src/fix_halt.txt b/doc/txt/fix_halt.txt similarity index 100% rename from doc/src/fix_halt.txt rename to doc/txt/fix_halt.txt diff --git a/doc/src/fix_heat.txt b/doc/txt/fix_heat.txt similarity index 100% rename from doc/src/fix_heat.txt rename to doc/txt/fix_heat.txt diff --git a/doc/src/fix_hyper_global.txt b/doc/txt/fix_hyper_global.txt similarity index 100% rename from doc/src/fix_hyper_global.txt rename to doc/txt/fix_hyper_global.txt diff --git a/doc/src/fix_hyper_local.txt b/doc/txt/fix_hyper_local.txt similarity index 100% rename from doc/src/fix_hyper_local.txt rename to doc/txt/fix_hyper_local.txt diff --git a/doc/src/fix_imd.txt b/doc/txt/fix_imd.txt similarity index 100% rename from doc/src/fix_imd.txt rename to doc/txt/fix_imd.txt diff --git a/doc/src/fix_indent.txt b/doc/txt/fix_indent.txt similarity index 100% rename from doc/src/fix_indent.txt rename to doc/txt/fix_indent.txt diff --git a/doc/src/fix_ipi.txt b/doc/txt/fix_ipi.txt similarity index 100% rename from doc/src/fix_ipi.txt rename to doc/txt/fix_ipi.txt diff --git a/doc/src/fix_langevin.txt b/doc/txt/fix_langevin.txt similarity index 100% rename from doc/src/fix_langevin.txt rename to doc/txt/fix_langevin.txt diff --git a/doc/src/fix_langevin_drude.txt b/doc/txt/fix_langevin_drude.txt similarity index 100% rename from doc/src/fix_langevin_drude.txt rename to doc/txt/fix_langevin_drude.txt diff --git a/doc/src/fix_langevin_eff.txt b/doc/txt/fix_langevin_eff.txt similarity index 100% rename from doc/src/fix_langevin_eff.txt rename to doc/txt/fix_langevin_eff.txt diff --git a/doc/src/fix_langevin_spin.txt b/doc/txt/fix_langevin_spin.txt similarity index 100% rename from doc/src/fix_langevin_spin.txt rename to doc/txt/fix_langevin_spin.txt diff --git a/doc/src/fix_latte.txt b/doc/txt/fix_latte.txt similarity index 100% rename from doc/src/fix_latte.txt rename to doc/txt/fix_latte.txt diff --git a/doc/src/fix_lb_fluid.txt b/doc/txt/fix_lb_fluid.txt similarity index 100% rename from doc/src/fix_lb_fluid.txt rename to doc/txt/fix_lb_fluid.txt diff --git a/doc/src/fix_lb_momentum.txt b/doc/txt/fix_lb_momentum.txt similarity index 100% rename from doc/src/fix_lb_momentum.txt rename to doc/txt/fix_lb_momentum.txt diff --git a/doc/src/fix_lb_pc.txt b/doc/txt/fix_lb_pc.txt similarity index 100% rename from doc/src/fix_lb_pc.txt rename to doc/txt/fix_lb_pc.txt diff --git a/doc/src/fix_lb_rigid_pc_sphere.txt b/doc/txt/fix_lb_rigid_pc_sphere.txt similarity index 100% rename from doc/src/fix_lb_rigid_pc_sphere.txt rename to doc/txt/fix_lb_rigid_pc_sphere.txt diff --git a/doc/src/fix_lb_viscous.txt b/doc/txt/fix_lb_viscous.txt similarity index 100% rename from doc/src/fix_lb_viscous.txt rename to doc/txt/fix_lb_viscous.txt diff --git a/doc/src/fix_lineforce.txt b/doc/txt/fix_lineforce.txt similarity index 100% rename from doc/src/fix_lineforce.txt rename to doc/txt/fix_lineforce.txt diff --git a/doc/src/fix_manifoldforce.txt b/doc/txt/fix_manifoldforce.txt similarity index 100% rename from doc/src/fix_manifoldforce.txt rename to doc/txt/fix_manifoldforce.txt diff --git a/doc/src/fix_meso.txt b/doc/txt/fix_meso.txt similarity index 100% rename from doc/src/fix_meso.txt rename to doc/txt/fix_meso.txt diff --git a/doc/src/fix_meso_move.txt b/doc/txt/fix_meso_move.txt similarity index 100% rename from doc/src/fix_meso_move.txt rename to doc/txt/fix_meso_move.txt diff --git a/doc/src/fix_meso_stationary.txt b/doc/txt/fix_meso_stationary.txt similarity index 100% rename from doc/src/fix_meso_stationary.txt rename to doc/txt/fix_meso_stationary.txt diff --git a/doc/src/fix_modify.txt b/doc/txt/fix_modify.txt similarity index 100% rename from doc/src/fix_modify.txt rename to doc/txt/fix_modify.txt diff --git a/doc/src/fix_momentum.txt b/doc/txt/fix_momentum.txt similarity index 100% rename from doc/src/fix_momentum.txt rename to doc/txt/fix_momentum.txt diff --git a/doc/src/fix_move.txt b/doc/txt/fix_move.txt similarity index 100% rename from doc/src/fix_move.txt rename to doc/txt/fix_move.txt diff --git a/doc/src/fix_mscg.txt b/doc/txt/fix_mscg.txt similarity index 100% rename from doc/src/fix_mscg.txt rename to doc/txt/fix_mscg.txt diff --git a/doc/src/fix_msst.txt b/doc/txt/fix_msst.txt similarity index 100% rename from doc/src/fix_msst.txt rename to doc/txt/fix_msst.txt diff --git a/doc/src/fix_mvv_dpd.txt b/doc/txt/fix_mvv_dpd.txt similarity index 100% rename from doc/src/fix_mvv_dpd.txt rename to doc/txt/fix_mvv_dpd.txt diff --git a/doc/src/fix_neb.txt b/doc/txt/fix_neb.txt similarity index 100% rename from doc/src/fix_neb.txt rename to doc/txt/fix_neb.txt diff --git a/doc/src/fix_neb_spin.txt b/doc/txt/fix_neb_spin.txt similarity index 100% rename from doc/src/fix_neb_spin.txt rename to doc/txt/fix_neb_spin.txt diff --git a/doc/src/fix_nh.txt b/doc/txt/fix_nh.txt similarity index 100% rename from doc/src/fix_nh.txt rename to doc/txt/fix_nh.txt diff --git a/doc/src/fix_nh_eff.txt b/doc/txt/fix_nh_eff.txt similarity index 100% rename from doc/src/fix_nh_eff.txt rename to doc/txt/fix_nh_eff.txt diff --git a/doc/src/fix_nh_uef.txt b/doc/txt/fix_nh_uef.txt similarity index 100% rename from doc/src/fix_nh_uef.txt rename to doc/txt/fix_nh_uef.txt diff --git a/doc/src/fix_nph_asphere.txt b/doc/txt/fix_nph_asphere.txt similarity index 100% rename from doc/src/fix_nph_asphere.txt rename to doc/txt/fix_nph_asphere.txt diff --git a/doc/src/fix_nph_body.txt b/doc/txt/fix_nph_body.txt similarity index 100% rename from doc/src/fix_nph_body.txt rename to doc/txt/fix_nph_body.txt diff --git a/doc/src/fix_nph_sphere.txt b/doc/txt/fix_nph_sphere.txt similarity index 100% rename from doc/src/fix_nph_sphere.txt rename to doc/txt/fix_nph_sphere.txt diff --git a/doc/src/fix_nphug.txt b/doc/txt/fix_nphug.txt similarity index 100% rename from doc/src/fix_nphug.txt rename to doc/txt/fix_nphug.txt diff --git a/doc/src/fix_npt_asphere.txt b/doc/txt/fix_npt_asphere.txt similarity index 100% rename from doc/src/fix_npt_asphere.txt rename to doc/txt/fix_npt_asphere.txt diff --git a/doc/src/fix_npt_body.txt b/doc/txt/fix_npt_body.txt similarity index 100% rename from doc/src/fix_npt_body.txt rename to doc/txt/fix_npt_body.txt diff --git a/doc/src/fix_npt_sphere.txt b/doc/txt/fix_npt_sphere.txt similarity index 100% rename from doc/src/fix_npt_sphere.txt rename to doc/txt/fix_npt_sphere.txt diff --git a/doc/src/fix_nve.txt b/doc/txt/fix_nve.txt similarity index 100% rename from doc/src/fix_nve.txt rename to doc/txt/fix_nve.txt diff --git a/doc/src/fix_nve_asphere.txt b/doc/txt/fix_nve_asphere.txt similarity index 100% rename from doc/src/fix_nve_asphere.txt rename to doc/txt/fix_nve_asphere.txt diff --git a/doc/src/fix_nve_asphere_noforce.txt b/doc/txt/fix_nve_asphere_noforce.txt similarity index 100% rename from doc/src/fix_nve_asphere_noforce.txt rename to doc/txt/fix_nve_asphere_noforce.txt diff --git a/doc/src/fix_nve_awpmd.txt b/doc/txt/fix_nve_awpmd.txt similarity index 100% rename from doc/src/fix_nve_awpmd.txt rename to doc/txt/fix_nve_awpmd.txt diff --git a/doc/src/fix_nve_body.txt b/doc/txt/fix_nve_body.txt similarity index 100% rename from doc/src/fix_nve_body.txt rename to doc/txt/fix_nve_body.txt diff --git a/doc/src/fix_nve_dot.txt b/doc/txt/fix_nve_dot.txt similarity index 100% rename from doc/src/fix_nve_dot.txt rename to doc/txt/fix_nve_dot.txt diff --git a/doc/src/fix_nve_dotc_langevin.txt b/doc/txt/fix_nve_dotc_langevin.txt similarity index 100% rename from doc/src/fix_nve_dotc_langevin.txt rename to doc/txt/fix_nve_dotc_langevin.txt diff --git a/doc/src/fix_nve_eff.txt b/doc/txt/fix_nve_eff.txt similarity index 100% rename from doc/src/fix_nve_eff.txt rename to doc/txt/fix_nve_eff.txt diff --git a/doc/src/fix_nve_limit.txt b/doc/txt/fix_nve_limit.txt similarity index 100% rename from doc/src/fix_nve_limit.txt rename to doc/txt/fix_nve_limit.txt diff --git a/doc/src/fix_nve_line.txt b/doc/txt/fix_nve_line.txt similarity index 100% rename from doc/src/fix_nve_line.txt rename to doc/txt/fix_nve_line.txt diff --git a/doc/src/fix_nve_manifold_rattle.txt b/doc/txt/fix_nve_manifold_rattle.txt similarity index 100% rename from doc/src/fix_nve_manifold_rattle.txt rename to doc/txt/fix_nve_manifold_rattle.txt diff --git a/doc/src/fix_nve_noforce.txt b/doc/txt/fix_nve_noforce.txt similarity index 100% rename from doc/src/fix_nve_noforce.txt rename to doc/txt/fix_nve_noforce.txt diff --git a/doc/src/fix_nve_sphere.txt b/doc/txt/fix_nve_sphere.txt similarity index 100% rename from doc/src/fix_nve_sphere.txt rename to doc/txt/fix_nve_sphere.txt diff --git a/doc/src/fix_nve_spin.txt b/doc/txt/fix_nve_spin.txt similarity index 100% rename from doc/src/fix_nve_spin.txt rename to doc/txt/fix_nve_spin.txt diff --git a/doc/src/fix_nve_tri.txt b/doc/txt/fix_nve_tri.txt similarity index 100% rename from doc/src/fix_nve_tri.txt rename to doc/txt/fix_nve_tri.txt diff --git a/doc/src/fix_nvk.txt b/doc/txt/fix_nvk.txt similarity index 100% rename from doc/src/fix_nvk.txt rename to doc/txt/fix_nvk.txt diff --git a/doc/src/fix_nvt_asphere.txt b/doc/txt/fix_nvt_asphere.txt similarity index 100% rename from doc/src/fix_nvt_asphere.txt rename to doc/txt/fix_nvt_asphere.txt diff --git a/doc/src/fix_nvt_body.txt b/doc/txt/fix_nvt_body.txt similarity index 100% rename from doc/src/fix_nvt_body.txt rename to doc/txt/fix_nvt_body.txt diff --git a/doc/src/fix_nvt_manifold_rattle.txt b/doc/txt/fix_nvt_manifold_rattle.txt similarity index 100% rename from doc/src/fix_nvt_manifold_rattle.txt rename to doc/txt/fix_nvt_manifold_rattle.txt diff --git a/doc/src/fix_nvt_sllod.txt b/doc/txt/fix_nvt_sllod.txt similarity index 100% rename from doc/src/fix_nvt_sllod.txt rename to doc/txt/fix_nvt_sllod.txt diff --git a/doc/src/fix_nvt_sllod_eff.txt b/doc/txt/fix_nvt_sllod_eff.txt similarity index 100% rename from doc/src/fix_nvt_sllod_eff.txt rename to doc/txt/fix_nvt_sllod_eff.txt diff --git a/doc/src/fix_nvt_sphere.txt b/doc/txt/fix_nvt_sphere.txt similarity index 100% rename from doc/src/fix_nvt_sphere.txt rename to doc/txt/fix_nvt_sphere.txt diff --git a/doc/src/fix_oneway.txt b/doc/txt/fix_oneway.txt similarity index 100% rename from doc/src/fix_oneway.txt rename to doc/txt/fix_oneway.txt diff --git a/doc/src/fix_orient.txt b/doc/txt/fix_orient.txt similarity index 100% rename from doc/src/fix_orient.txt rename to doc/txt/fix_orient.txt diff --git a/doc/src/fix_phonon.txt b/doc/txt/fix_phonon.txt similarity index 100% rename from doc/src/fix_phonon.txt rename to doc/txt/fix_phonon.txt diff --git a/doc/src/fix_pimd.txt b/doc/txt/fix_pimd.txt similarity index 100% rename from doc/src/fix_pimd.txt rename to doc/txt/fix_pimd.txt diff --git a/doc/src/fix_planeforce.txt b/doc/txt/fix_planeforce.txt similarity index 100% rename from doc/src/fix_planeforce.txt rename to doc/txt/fix_planeforce.txt diff --git a/doc/src/fix_plumed.txt b/doc/txt/fix_plumed.txt similarity index 100% rename from doc/src/fix_plumed.txt rename to doc/txt/fix_plumed.txt diff --git a/doc/src/fix_poems.txt b/doc/txt/fix_poems.txt similarity index 100% rename from doc/src/fix_poems.txt rename to doc/txt/fix_poems.txt diff --git a/doc/src/fix_pour.txt b/doc/txt/fix_pour.txt similarity index 100% rename from doc/src/fix_pour.txt rename to doc/txt/fix_pour.txt diff --git a/doc/src/fix_precession_spin.txt b/doc/txt/fix_precession_spin.txt similarity index 100% rename from doc/src/fix_precession_spin.txt rename to doc/txt/fix_precession_spin.txt diff --git a/doc/src/fix_press_berendsen.txt b/doc/txt/fix_press_berendsen.txt similarity index 100% rename from doc/src/fix_press_berendsen.txt rename to doc/txt/fix_press_berendsen.txt diff --git a/doc/src/fix_print.txt b/doc/txt/fix_print.txt similarity index 100% rename from doc/src/fix_print.txt rename to doc/txt/fix_print.txt diff --git a/doc/src/fix_property_atom.txt b/doc/txt/fix_property_atom.txt similarity index 100% rename from doc/src/fix_property_atom.txt rename to doc/txt/fix_property_atom.txt diff --git a/doc/src/fix_python_invoke.txt b/doc/txt/fix_python_invoke.txt similarity index 100% rename from doc/src/fix_python_invoke.txt rename to doc/txt/fix_python_invoke.txt diff --git a/doc/src/fix_python_move.txt b/doc/txt/fix_python_move.txt similarity index 100% rename from doc/src/fix_python_move.txt rename to doc/txt/fix_python_move.txt diff --git a/doc/src/fix_qbmsst.txt b/doc/txt/fix_qbmsst.txt similarity index 100% rename from doc/src/fix_qbmsst.txt rename to doc/txt/fix_qbmsst.txt diff --git a/doc/src/fix_qeq.txt b/doc/txt/fix_qeq.txt similarity index 100% rename from doc/src/fix_qeq.txt rename to doc/txt/fix_qeq.txt diff --git a/doc/src/fix_qeq_comb.txt b/doc/txt/fix_qeq_comb.txt similarity index 100% rename from doc/src/fix_qeq_comb.txt rename to doc/txt/fix_qeq_comb.txt diff --git a/doc/src/fix_qeq_reax.txt b/doc/txt/fix_qeq_reax.txt similarity index 100% rename from doc/src/fix_qeq_reax.txt rename to doc/txt/fix_qeq_reax.txt diff --git a/doc/src/fix_qmmm.txt b/doc/txt/fix_qmmm.txt similarity index 100% rename from doc/src/fix_qmmm.txt rename to doc/txt/fix_qmmm.txt diff --git a/doc/src/fix_qtb.txt b/doc/txt/fix_qtb.txt similarity index 100% rename from doc/src/fix_qtb.txt rename to doc/txt/fix_qtb.txt diff --git a/doc/src/fix_reaxc_bonds.txt b/doc/txt/fix_reaxc_bonds.txt similarity index 100% rename from doc/src/fix_reaxc_bonds.txt rename to doc/txt/fix_reaxc_bonds.txt diff --git a/doc/src/fix_reaxc_species.txt b/doc/txt/fix_reaxc_species.txt similarity index 100% rename from doc/src/fix_reaxc_species.txt rename to doc/txt/fix_reaxc_species.txt diff --git a/doc/src/fix_recenter.txt b/doc/txt/fix_recenter.txt similarity index 100% rename from doc/src/fix_recenter.txt rename to doc/txt/fix_recenter.txt diff --git a/doc/src/fix_restrain.txt b/doc/txt/fix_restrain.txt similarity index 100% rename from doc/src/fix_restrain.txt rename to doc/txt/fix_restrain.txt diff --git a/doc/src/fix_rhok.txt b/doc/txt/fix_rhok.txt similarity index 100% rename from doc/src/fix_rhok.txt rename to doc/txt/fix_rhok.txt diff --git a/doc/src/fix_rigid.txt b/doc/txt/fix_rigid.txt similarity index 100% rename from doc/src/fix_rigid.txt rename to doc/txt/fix_rigid.txt diff --git a/doc/src/fix_rigid_meso.txt b/doc/txt/fix_rigid_meso.txt similarity index 100% rename from doc/src/fix_rigid_meso.txt rename to doc/txt/fix_rigid_meso.txt diff --git a/doc/src/fix_rx.txt b/doc/txt/fix_rx.txt similarity index 100% rename from doc/src/fix_rx.txt rename to doc/txt/fix_rx.txt diff --git a/doc/src/fix_saed_vtk.txt b/doc/txt/fix_saed_vtk.txt similarity index 100% rename from doc/src/fix_saed_vtk.txt rename to doc/txt/fix_saed_vtk.txt diff --git a/doc/src/fix_setforce.txt b/doc/txt/fix_setforce.txt similarity index 100% rename from doc/src/fix_setforce.txt rename to doc/txt/fix_setforce.txt diff --git a/doc/src/fix_shake.txt b/doc/txt/fix_shake.txt similarity index 100% rename from doc/src/fix_shake.txt rename to doc/txt/fix_shake.txt diff --git a/doc/src/fix_shardlow.txt b/doc/txt/fix_shardlow.txt similarity index 100% rename from doc/src/fix_shardlow.txt rename to doc/txt/fix_shardlow.txt diff --git a/doc/src/fix_smd.txt b/doc/txt/fix_smd.txt similarity index 100% rename from doc/src/fix_smd.txt rename to doc/txt/fix_smd.txt diff --git a/doc/src/fix_smd_adjust_dt.txt b/doc/txt/fix_smd_adjust_dt.txt similarity index 100% rename from doc/src/fix_smd_adjust_dt.txt rename to doc/txt/fix_smd_adjust_dt.txt diff --git a/doc/src/fix_smd_integrate_tlsph.txt b/doc/txt/fix_smd_integrate_tlsph.txt similarity index 100% rename from doc/src/fix_smd_integrate_tlsph.txt rename to doc/txt/fix_smd_integrate_tlsph.txt diff --git a/doc/src/fix_smd_integrate_ulsph.txt b/doc/txt/fix_smd_integrate_ulsph.txt similarity index 100% rename from doc/src/fix_smd_integrate_ulsph.txt rename to doc/txt/fix_smd_integrate_ulsph.txt diff --git a/doc/src/fix_smd_move_triangulated_surface.txt b/doc/txt/fix_smd_move_triangulated_surface.txt similarity index 100% rename from doc/src/fix_smd_move_triangulated_surface.txt rename to doc/txt/fix_smd_move_triangulated_surface.txt diff --git a/doc/src/fix_smd_setvel.txt b/doc/txt/fix_smd_setvel.txt similarity index 100% rename from doc/src/fix_smd_setvel.txt rename to doc/txt/fix_smd_setvel.txt diff --git a/doc/src/fix_smd_wall_surface.txt b/doc/txt/fix_smd_wall_surface.txt similarity index 100% rename from doc/src/fix_smd_wall_surface.txt rename to doc/txt/fix_smd_wall_surface.txt diff --git a/doc/src/fix_spring.txt b/doc/txt/fix_spring.txt similarity index 100% rename from doc/src/fix_spring.txt rename to doc/txt/fix_spring.txt diff --git a/doc/src/fix_spring_chunk.txt b/doc/txt/fix_spring_chunk.txt similarity index 100% rename from doc/src/fix_spring_chunk.txt rename to doc/txt/fix_spring_chunk.txt diff --git a/doc/src/fix_spring_rg.txt b/doc/txt/fix_spring_rg.txt similarity index 100% rename from doc/src/fix_spring_rg.txt rename to doc/txt/fix_spring_rg.txt diff --git a/doc/src/fix_spring_self.txt b/doc/txt/fix_spring_self.txt similarity index 100% rename from doc/src/fix_spring_self.txt rename to doc/txt/fix_spring_self.txt diff --git a/doc/src/fix_srd.txt b/doc/txt/fix_srd.txt similarity index 100% rename from doc/src/fix_srd.txt rename to doc/txt/fix_srd.txt diff --git a/doc/src/fix_store_force.txt b/doc/txt/fix_store_force.txt similarity index 100% rename from doc/src/fix_store_force.txt rename to doc/txt/fix_store_force.txt diff --git a/doc/src/fix_store_state.txt b/doc/txt/fix_store_state.txt similarity index 100% rename from doc/src/fix_store_state.txt rename to doc/txt/fix_store_state.txt diff --git a/doc/src/fix_temp_berendsen.txt b/doc/txt/fix_temp_berendsen.txt similarity index 100% rename from doc/src/fix_temp_berendsen.txt rename to doc/txt/fix_temp_berendsen.txt diff --git a/doc/src/fix_temp_csvr.txt b/doc/txt/fix_temp_csvr.txt similarity index 100% rename from doc/src/fix_temp_csvr.txt rename to doc/txt/fix_temp_csvr.txt diff --git a/doc/src/fix_temp_rescale.txt b/doc/txt/fix_temp_rescale.txt similarity index 100% rename from doc/src/fix_temp_rescale.txt rename to doc/txt/fix_temp_rescale.txt diff --git a/doc/src/fix_temp_rescale_eff.txt b/doc/txt/fix_temp_rescale_eff.txt similarity index 100% rename from doc/src/fix_temp_rescale_eff.txt rename to doc/txt/fix_temp_rescale_eff.txt diff --git a/doc/src/fix_tfmc.txt b/doc/txt/fix_tfmc.txt similarity index 100% rename from doc/src/fix_tfmc.txt rename to doc/txt/fix_tfmc.txt diff --git a/doc/src/fix_thermal_conductivity.txt b/doc/txt/fix_thermal_conductivity.txt similarity index 100% rename from doc/src/fix_thermal_conductivity.txt rename to doc/txt/fix_thermal_conductivity.txt diff --git a/doc/src/fix_ti_spring.txt b/doc/txt/fix_ti_spring.txt similarity index 100% rename from doc/src/fix_ti_spring.txt rename to doc/txt/fix_ti_spring.txt diff --git a/doc/src/fix_tmd.txt b/doc/txt/fix_tmd.txt similarity index 100% rename from doc/src/fix_tmd.txt rename to doc/txt/fix_tmd.txt diff --git a/doc/src/fix_ttm.txt b/doc/txt/fix_ttm.txt similarity index 100% rename from doc/src/fix_ttm.txt rename to doc/txt/fix_ttm.txt diff --git a/doc/src/fix_tune_kspace.txt b/doc/txt/fix_tune_kspace.txt similarity index 100% rename from doc/src/fix_tune_kspace.txt rename to doc/txt/fix_tune_kspace.txt diff --git a/doc/src/fix_vector.txt b/doc/txt/fix_vector.txt similarity index 100% rename from doc/src/fix_vector.txt rename to doc/txt/fix_vector.txt diff --git a/doc/src/fix_viscosity.txt b/doc/txt/fix_viscosity.txt similarity index 100% rename from doc/src/fix_viscosity.txt rename to doc/txt/fix_viscosity.txt diff --git a/doc/src/fix_viscous.txt b/doc/txt/fix_viscous.txt similarity index 100% rename from doc/src/fix_viscous.txt rename to doc/txt/fix_viscous.txt diff --git a/doc/src/fix_wall.txt b/doc/txt/fix_wall.txt similarity index 100% rename from doc/src/fix_wall.txt rename to doc/txt/fix_wall.txt diff --git a/doc/src/fix_wall_body_polygon.txt b/doc/txt/fix_wall_body_polygon.txt similarity index 100% rename from doc/src/fix_wall_body_polygon.txt rename to doc/txt/fix_wall_body_polygon.txt diff --git a/doc/src/fix_wall_body_polyhedron.txt b/doc/txt/fix_wall_body_polyhedron.txt similarity index 100% rename from doc/src/fix_wall_body_polyhedron.txt rename to doc/txt/fix_wall_body_polyhedron.txt diff --git a/doc/src/fix_wall_ees.txt b/doc/txt/fix_wall_ees.txt similarity index 100% rename from doc/src/fix_wall_ees.txt rename to doc/txt/fix_wall_ees.txt diff --git a/doc/src/fix_wall_gran.txt b/doc/txt/fix_wall_gran.txt similarity index 100% rename from doc/src/fix_wall_gran.txt rename to doc/txt/fix_wall_gran.txt diff --git a/doc/src/fix_wall_gran_region.txt b/doc/txt/fix_wall_gran_region.txt similarity index 100% rename from doc/src/fix_wall_gran_region.txt rename to doc/txt/fix_wall_gran_region.txt diff --git a/doc/src/fix_wall_piston.txt b/doc/txt/fix_wall_piston.txt similarity index 100% rename from doc/src/fix_wall_piston.txt rename to doc/txt/fix_wall_piston.txt diff --git a/doc/src/fix_wall_reflect.txt b/doc/txt/fix_wall_reflect.txt similarity index 100% rename from doc/src/fix_wall_reflect.txt rename to doc/txt/fix_wall_reflect.txt diff --git a/doc/src/fix_wall_region.txt b/doc/txt/fix_wall_region.txt similarity index 100% rename from doc/src/fix_wall_region.txt rename to doc/txt/fix_wall_region.txt diff --git a/doc/src/fix_wall_srd.txt b/doc/txt/fix_wall_srd.txt similarity index 100% rename from doc/src/fix_wall_srd.txt rename to doc/txt/fix_wall_srd.txt diff --git a/doc/src/fixes.txt b/doc/txt/fixes.txt similarity index 100% rename from doc/src/fixes.txt rename to doc/txt/fixes.txt diff --git a/doc/src/group.txt b/doc/txt/group.txt similarity index 100% rename from doc/src/group.txt rename to doc/txt/group.txt diff --git a/doc/src/group2ndx.txt b/doc/txt/group2ndx.txt similarity index 100% rename from doc/src/group2ndx.txt rename to doc/txt/group2ndx.txt diff --git a/doc/src/hyper.txt b/doc/txt/hyper.txt similarity index 100% rename from doc/src/hyper.txt rename to doc/txt/hyper.txt diff --git a/doc/src/if.txt b/doc/txt/if.txt similarity index 100% rename from doc/src/if.txt rename to doc/txt/if.txt diff --git a/doc/src/improper_class2.txt b/doc/txt/improper_class2.txt similarity index 100% rename from doc/src/improper_class2.txt rename to doc/txt/improper_class2.txt diff --git a/doc/src/improper_coeff.txt b/doc/txt/improper_coeff.txt similarity index 100% rename from doc/src/improper_coeff.txt rename to doc/txt/improper_coeff.txt diff --git a/doc/src/improper_cossq.txt b/doc/txt/improper_cossq.txt similarity index 100% rename from doc/src/improper_cossq.txt rename to doc/txt/improper_cossq.txt diff --git a/doc/src/improper_cvff.txt b/doc/txt/improper_cvff.txt similarity index 100% rename from doc/src/improper_cvff.txt rename to doc/txt/improper_cvff.txt diff --git a/doc/src/improper_distance.txt b/doc/txt/improper_distance.txt similarity index 100% rename from doc/src/improper_distance.txt rename to doc/txt/improper_distance.txt diff --git a/doc/src/improper_distharm.txt b/doc/txt/improper_distharm.txt similarity index 100% rename from doc/src/improper_distharm.txt rename to doc/txt/improper_distharm.txt diff --git a/doc/src/improper_fourier.txt b/doc/txt/improper_fourier.txt similarity index 100% rename from doc/src/improper_fourier.txt rename to doc/txt/improper_fourier.txt diff --git a/doc/src/improper_harmonic.txt b/doc/txt/improper_harmonic.txt similarity index 100% rename from doc/src/improper_harmonic.txt rename to doc/txt/improper_harmonic.txt diff --git a/doc/src/improper_hybrid.txt b/doc/txt/improper_hybrid.txt similarity index 100% rename from doc/src/improper_hybrid.txt rename to doc/txt/improper_hybrid.txt diff --git a/doc/src/improper_inversion_harmonic.txt b/doc/txt/improper_inversion_harmonic.txt similarity index 100% rename from doc/src/improper_inversion_harmonic.txt rename to doc/txt/improper_inversion_harmonic.txt diff --git a/doc/src/improper_none.txt b/doc/txt/improper_none.txt similarity index 100% rename from doc/src/improper_none.txt rename to doc/txt/improper_none.txt diff --git a/doc/src/improper_ring.txt b/doc/txt/improper_ring.txt similarity index 100% rename from doc/src/improper_ring.txt rename to doc/txt/improper_ring.txt diff --git a/doc/src/improper_sqdistharm.txt b/doc/txt/improper_sqdistharm.txt similarity index 100% rename from doc/src/improper_sqdistharm.txt rename to doc/txt/improper_sqdistharm.txt diff --git a/doc/src/improper_style.txt b/doc/txt/improper_style.txt similarity index 100% rename from doc/src/improper_style.txt rename to doc/txt/improper_style.txt diff --git a/doc/src/improper_umbrella.txt b/doc/txt/improper_umbrella.txt similarity index 100% rename from doc/src/improper_umbrella.txt rename to doc/txt/improper_umbrella.txt diff --git a/doc/src/improper_zero.txt b/doc/txt/improper_zero.txt similarity index 100% rename from doc/src/improper_zero.txt rename to doc/txt/improper_zero.txt diff --git a/doc/src/impropers.txt b/doc/txt/impropers.txt similarity index 100% rename from doc/src/impropers.txt rename to doc/txt/impropers.txt diff --git a/doc/src/include.txt b/doc/txt/include.txt similarity index 100% rename from doc/src/include.txt rename to doc/txt/include.txt diff --git a/doc/src/info.txt b/doc/txt/info.txt similarity index 100% rename from doc/src/info.txt rename to doc/txt/info.txt diff --git a/doc/src/jump.txt b/doc/txt/jump.txt similarity index 100% rename from doc/src/jump.txt rename to doc/txt/jump.txt diff --git a/doc/src/kim_commands.txt b/doc/txt/kim_commands.txt similarity index 100% rename from doc/src/kim_commands.txt rename to doc/txt/kim_commands.txt diff --git a/doc/src/kspace_modify.txt b/doc/txt/kspace_modify.txt similarity index 100% rename from doc/src/kspace_modify.txt rename to doc/txt/kspace_modify.txt diff --git a/doc/src/kspace_style.txt b/doc/txt/kspace_style.txt similarity index 100% rename from doc/src/kspace_style.txt rename to doc/txt/kspace_style.txt diff --git a/doc/src/label.txt b/doc/txt/label.txt similarity index 100% rename from doc/src/label.txt rename to doc/txt/label.txt diff --git a/doc/src/lammps.book b/doc/txt/lammps.book similarity index 100% rename from doc/src/lammps.book rename to doc/txt/lammps.book diff --git a/doc/src/lammps_commands.txt b/doc/txt/lammps_commands.txt similarity index 100% rename from doc/src/lammps_commands.txt rename to doc/txt/lammps_commands.txt diff --git a/doc/src/lammps_commands_angle.txt b/doc/txt/lammps_commands_angle.txt similarity index 100% rename from doc/src/lammps_commands_angle.txt rename to doc/txt/lammps_commands_angle.txt diff --git a/doc/src/lammps_commands_atc.txt b/doc/txt/lammps_commands_atc.txt similarity index 100% rename from doc/src/lammps_commands_atc.txt rename to doc/txt/lammps_commands_atc.txt diff --git a/doc/src/lammps_commands_bond.txt b/doc/txt/lammps_commands_bond.txt similarity index 100% rename from doc/src/lammps_commands_bond.txt rename to doc/txt/lammps_commands_bond.txt diff --git a/doc/src/lammps_commands_compute.txt b/doc/txt/lammps_commands_compute.txt similarity index 100% rename from doc/src/lammps_commands_compute.txt rename to doc/txt/lammps_commands_compute.txt diff --git a/doc/src/lammps_commands_dihedral.txt b/doc/txt/lammps_commands_dihedral.txt similarity index 100% rename from doc/src/lammps_commands_dihedral.txt rename to doc/txt/lammps_commands_dihedral.txt diff --git a/doc/src/lammps_commands_fix.txt b/doc/txt/lammps_commands_fix.txt similarity index 100% rename from doc/src/lammps_commands_fix.txt rename to doc/txt/lammps_commands_fix.txt diff --git a/doc/src/lammps_commands_improper.txt b/doc/txt/lammps_commands_improper.txt similarity index 100% rename from doc/src/lammps_commands_improper.txt rename to doc/txt/lammps_commands_improper.txt diff --git a/doc/src/lammps_commands_kspace.txt b/doc/txt/lammps_commands_kspace.txt similarity index 100% rename from doc/src/lammps_commands_kspace.txt rename to doc/txt/lammps_commands_kspace.txt diff --git a/doc/src/lammps_commands_pair.txt b/doc/txt/lammps_commands_pair.txt similarity index 100% rename from doc/src/lammps_commands_pair.txt rename to doc/txt/lammps_commands_pair.txt diff --git a/doc/src/lattice.txt b/doc/txt/lattice.txt similarity index 100% rename from doc/src/lattice.txt rename to doc/txt/lattice.txt diff --git a/doc/src/log.txt b/doc/txt/log.txt similarity index 100% rename from doc/src/log.txt rename to doc/txt/log.txt diff --git a/doc/src/mass.txt b/doc/txt/mass.txt similarity index 100% rename from doc/src/mass.txt rename to doc/txt/mass.txt diff --git a/doc/src/message.txt b/doc/txt/message.txt similarity index 100% rename from doc/src/message.txt rename to doc/txt/message.txt diff --git a/doc/src/min_modify.txt b/doc/txt/min_modify.txt similarity index 100% rename from doc/src/min_modify.txt rename to doc/txt/min_modify.txt diff --git a/doc/src/min_spin.txt b/doc/txt/min_spin.txt similarity index 100% rename from doc/src/min_spin.txt rename to doc/txt/min_spin.txt diff --git a/doc/src/min_style.txt b/doc/txt/min_style.txt similarity index 100% rename from doc/src/min_style.txt rename to doc/txt/min_style.txt diff --git a/doc/src/minimize.txt b/doc/txt/minimize.txt similarity index 100% rename from doc/src/minimize.txt rename to doc/txt/minimize.txt diff --git a/doc/src/molecule.txt b/doc/txt/molecule.txt similarity index 100% rename from doc/src/molecule.txt rename to doc/txt/molecule.txt diff --git a/doc/src/neb.txt b/doc/txt/neb.txt similarity index 100% rename from doc/src/neb.txt rename to doc/txt/neb.txt diff --git a/doc/src/neb_spin.txt b/doc/txt/neb_spin.txt similarity index 100% rename from doc/src/neb_spin.txt rename to doc/txt/neb_spin.txt diff --git a/doc/src/neigh_modify.txt b/doc/txt/neigh_modify.txt similarity index 100% rename from doc/src/neigh_modify.txt rename to doc/txt/neigh_modify.txt diff --git a/doc/src/neighbor.txt b/doc/txt/neighbor.txt similarity index 100% rename from doc/src/neighbor.txt rename to doc/txt/neighbor.txt diff --git a/doc/src/newton.txt b/doc/txt/newton.txt similarity index 100% rename from doc/src/newton.txt rename to doc/txt/newton.txt diff --git a/doc/src/next.txt b/doc/txt/next.txt similarity index 100% rename from doc/src/next.txt rename to doc/txt/next.txt diff --git a/doc/src/package.txt b/doc/txt/package.txt similarity index 100% rename from doc/src/package.txt rename to doc/txt/package.txt diff --git a/doc/src/pair_adp.txt b/doc/txt/pair_adp.txt similarity index 100% rename from doc/src/pair_adp.txt rename to doc/txt/pair_adp.txt diff --git a/doc/src/pair_agni.txt b/doc/txt/pair_agni.txt similarity index 100% rename from doc/src/pair_agni.txt rename to doc/txt/pair_agni.txt diff --git a/doc/src/pair_airebo.txt b/doc/txt/pair_airebo.txt similarity index 100% rename from doc/src/pair_airebo.txt rename to doc/txt/pair_airebo.txt diff --git a/doc/src/pair_atm.txt b/doc/txt/pair_atm.txt similarity index 100% rename from doc/src/pair_atm.txt rename to doc/txt/pair_atm.txt diff --git a/doc/src/pair_awpmd.txt b/doc/txt/pair_awpmd.txt similarity index 100% rename from doc/src/pair_awpmd.txt rename to doc/txt/pair_awpmd.txt diff --git a/doc/src/pair_beck.txt b/doc/txt/pair_beck.txt similarity index 100% rename from doc/src/pair_beck.txt rename to doc/txt/pair_beck.txt diff --git a/doc/src/pair_body_nparticle.txt b/doc/txt/pair_body_nparticle.txt similarity index 100% rename from doc/src/pair_body_nparticle.txt rename to doc/txt/pair_body_nparticle.txt diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/txt/pair_body_rounded_polygon.txt similarity index 100% rename from doc/src/pair_body_rounded_polygon.txt rename to doc/txt/pair_body_rounded_polygon.txt diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/txt/pair_body_rounded_polyhedron.txt similarity index 100% rename from doc/src/pair_body_rounded_polyhedron.txt rename to doc/txt/pair_body_rounded_polyhedron.txt diff --git a/doc/src/pair_bop.txt b/doc/txt/pair_bop.txt similarity index 100% rename from doc/src/pair_bop.txt rename to doc/txt/pair_bop.txt diff --git a/doc/src/pair_born.txt b/doc/txt/pair_born.txt similarity index 100% rename from doc/src/pair_born.txt rename to doc/txt/pair_born.txt diff --git a/doc/src/pair_brownian.txt b/doc/txt/pair_brownian.txt similarity index 100% rename from doc/src/pair_brownian.txt rename to doc/txt/pair_brownian.txt diff --git a/doc/src/pair_buck.txt b/doc/txt/pair_buck.txt similarity index 100% rename from doc/src/pair_buck.txt rename to doc/txt/pair_buck.txt diff --git a/doc/src/pair_buck6d_coul_gauss.txt b/doc/txt/pair_buck6d_coul_gauss.txt similarity index 100% rename from doc/src/pair_buck6d_coul_gauss.txt rename to doc/txt/pair_buck6d_coul_gauss.txt diff --git a/doc/src/pair_buck_long.txt b/doc/txt/pair_buck_long.txt similarity index 100% rename from doc/src/pair_buck_long.txt rename to doc/txt/pair_buck_long.txt diff --git a/doc/src/pair_charmm.txt b/doc/txt/pair_charmm.txt similarity index 100% rename from doc/src/pair_charmm.txt rename to doc/txt/pair_charmm.txt diff --git a/doc/src/pair_class2.txt b/doc/txt/pair_class2.txt similarity index 100% rename from doc/src/pair_class2.txt rename to doc/txt/pair_class2.txt diff --git a/doc/src/pair_coeff.txt b/doc/txt/pair_coeff.txt similarity index 100% rename from doc/src/pair_coeff.txt rename to doc/txt/pair_coeff.txt diff --git a/doc/src/pair_colloid.txt b/doc/txt/pair_colloid.txt similarity index 100% rename from doc/src/pair_colloid.txt rename to doc/txt/pair_colloid.txt diff --git a/doc/src/pair_comb.txt b/doc/txt/pair_comb.txt similarity index 100% rename from doc/src/pair_comb.txt rename to doc/txt/pair_comb.txt diff --git a/doc/src/pair_cosine_squared.txt b/doc/txt/pair_cosine_squared.txt similarity index 100% rename from doc/src/pair_cosine_squared.txt rename to doc/txt/pair_cosine_squared.txt diff --git a/doc/src/pair_coul.txt b/doc/txt/pair_coul.txt similarity index 100% rename from doc/src/pair_coul.txt rename to doc/txt/pair_coul.txt diff --git a/doc/src/pair_coul_diel.txt b/doc/txt/pair_coul_diel.txt similarity index 100% rename from doc/src/pair_coul_diel.txt rename to doc/txt/pair_coul_diel.txt diff --git a/doc/src/pair_coul_shield.txt b/doc/txt/pair_coul_shield.txt similarity index 100% rename from doc/src/pair_coul_shield.txt rename to doc/txt/pair_coul_shield.txt diff --git a/doc/src/pair_cs.txt b/doc/txt/pair_cs.txt similarity index 100% rename from doc/src/pair_cs.txt rename to doc/txt/pair_cs.txt diff --git a/doc/src/pair_dipole.txt b/doc/txt/pair_dipole.txt similarity index 100% rename from doc/src/pair_dipole.txt rename to doc/txt/pair_dipole.txt diff --git a/doc/src/pair_dpd.txt b/doc/txt/pair_dpd.txt similarity index 100% rename from doc/src/pair_dpd.txt rename to doc/txt/pair_dpd.txt diff --git a/doc/src/pair_dpd_fdt.txt b/doc/txt/pair_dpd_fdt.txt similarity index 100% rename from doc/src/pair_dpd_fdt.txt rename to doc/txt/pair_dpd_fdt.txt diff --git a/doc/src/pair_drip.txt b/doc/txt/pair_drip.txt similarity index 100% rename from doc/src/pair_drip.txt rename to doc/txt/pair_drip.txt diff --git a/doc/src/pair_dsmc.txt b/doc/txt/pair_dsmc.txt similarity index 100% rename from doc/src/pair_dsmc.txt rename to doc/txt/pair_dsmc.txt diff --git a/doc/src/pair_e3b.txt b/doc/txt/pair_e3b.txt similarity index 100% rename from doc/src/pair_e3b.txt rename to doc/txt/pair_e3b.txt diff --git a/doc/src/pair_eam.txt b/doc/txt/pair_eam.txt similarity index 100% rename from doc/src/pair_eam.txt rename to doc/txt/pair_eam.txt diff --git a/doc/src/pair_edip.txt b/doc/txt/pair_edip.txt similarity index 100% rename from doc/src/pair_edip.txt rename to doc/txt/pair_edip.txt diff --git a/doc/src/pair_eff.txt b/doc/txt/pair_eff.txt similarity index 100% rename from doc/src/pair_eff.txt rename to doc/txt/pair_eff.txt diff --git a/doc/src/pair_eim.txt b/doc/txt/pair_eim.txt similarity index 100% rename from doc/src/pair_eim.txt rename to doc/txt/pair_eim.txt diff --git a/doc/src/pair_exp6_rx.txt b/doc/txt/pair_exp6_rx.txt similarity index 100% rename from doc/src/pair_exp6_rx.txt rename to doc/txt/pair_exp6_rx.txt diff --git a/doc/src/pair_extep.txt b/doc/txt/pair_extep.txt similarity index 100% rename from doc/src/pair_extep.txt rename to doc/txt/pair_extep.txt diff --git a/doc/src/pair_fep_soft.txt b/doc/txt/pair_fep_soft.txt similarity index 100% rename from doc/src/pair_fep_soft.txt rename to doc/txt/pair_fep_soft.txt diff --git a/doc/src/pair_gauss.txt b/doc/txt/pair_gauss.txt similarity index 100% rename from doc/src/pair_gauss.txt rename to doc/txt/pair_gauss.txt diff --git a/doc/src/pair_gayberne.txt b/doc/txt/pair_gayberne.txt similarity index 100% rename from doc/src/pair_gayberne.txt rename to doc/txt/pair_gayberne.txt diff --git a/doc/src/pair_gran.txt b/doc/txt/pair_gran.txt similarity index 100% rename from doc/src/pair_gran.txt rename to doc/txt/pair_gran.txt diff --git a/doc/src/pair_granular.txt b/doc/txt/pair_granular.txt similarity index 100% rename from doc/src/pair_granular.txt rename to doc/txt/pair_granular.txt diff --git a/doc/src/pair_gromacs.txt b/doc/txt/pair_gromacs.txt similarity index 100% rename from doc/src/pair_gromacs.txt rename to doc/txt/pair_gromacs.txt diff --git a/doc/src/pair_gw.txt b/doc/txt/pair_gw.txt similarity index 100% rename from doc/src/pair_gw.txt rename to doc/txt/pair_gw.txt diff --git a/doc/src/pair_hbond_dreiding.txt b/doc/txt/pair_hbond_dreiding.txt similarity index 100% rename from doc/src/pair_hbond_dreiding.txt rename to doc/txt/pair_hbond_dreiding.txt diff --git a/doc/src/pair_hybrid.txt b/doc/txt/pair_hybrid.txt similarity index 100% rename from doc/src/pair_hybrid.txt rename to doc/txt/pair_hybrid.txt diff --git a/doc/src/pair_ilp_graphene_hbn.txt b/doc/txt/pair_ilp_graphene_hbn.txt similarity index 100% rename from doc/src/pair_ilp_graphene_hbn.txt rename to doc/txt/pair_ilp_graphene_hbn.txt diff --git a/doc/src/pair_kim.txt b/doc/txt/pair_kim.txt similarity index 100% rename from doc/src/pair_kim.txt rename to doc/txt/pair_kim.txt diff --git a/doc/src/pair_kolmogorov_crespi_full.txt b/doc/txt/pair_kolmogorov_crespi_full.txt similarity index 100% rename from doc/src/pair_kolmogorov_crespi_full.txt rename to doc/txt/pair_kolmogorov_crespi_full.txt diff --git a/doc/src/pair_kolmogorov_crespi_z.txt b/doc/txt/pair_kolmogorov_crespi_z.txt similarity index 100% rename from doc/src/pair_kolmogorov_crespi_z.txt rename to doc/txt/pair_kolmogorov_crespi_z.txt diff --git a/doc/src/pair_lcbop.txt b/doc/txt/pair_lcbop.txt similarity index 100% rename from doc/src/pair_lcbop.txt rename to doc/txt/pair_lcbop.txt diff --git a/doc/src/pair_lebedeva_z.txt b/doc/txt/pair_lebedeva_z.txt similarity index 100% rename from doc/src/pair_lebedeva_z.txt rename to doc/txt/pair_lebedeva_z.txt diff --git a/doc/src/pair_line_lj.txt b/doc/txt/pair_line_lj.txt similarity index 100% rename from doc/src/pair_line_lj.txt rename to doc/txt/pair_line_lj.txt diff --git a/doc/src/pair_list.txt b/doc/txt/pair_list.txt similarity index 100% rename from doc/src/pair_list.txt rename to doc/txt/pair_list.txt diff --git a/doc/src/pair_lj.txt b/doc/txt/pair_lj.txt similarity index 100% rename from doc/src/pair_lj.txt rename to doc/txt/pair_lj.txt diff --git a/doc/src/pair_lj96.txt b/doc/txt/pair_lj96.txt similarity index 100% rename from doc/src/pair_lj96.txt rename to doc/txt/pair_lj96.txt diff --git a/doc/src/pair_lj_cubic.txt b/doc/txt/pair_lj_cubic.txt similarity index 100% rename from doc/src/pair_lj_cubic.txt rename to doc/txt/pair_lj_cubic.txt diff --git a/doc/src/pair_lj_expand.txt b/doc/txt/pair_lj_expand.txt similarity index 100% rename from doc/src/pair_lj_expand.txt rename to doc/txt/pair_lj_expand.txt diff --git a/doc/src/pair_lj_long.txt b/doc/txt/pair_lj_long.txt similarity index 100% rename from doc/src/pair_lj_long.txt rename to doc/txt/pair_lj_long.txt diff --git a/doc/src/pair_lj_smooth.txt b/doc/txt/pair_lj_smooth.txt similarity index 100% rename from doc/src/pair_lj_smooth.txt rename to doc/txt/pair_lj_smooth.txt diff --git a/doc/src/pair_lj_smooth_linear.txt b/doc/txt/pair_lj_smooth_linear.txt similarity index 100% rename from doc/src/pair_lj_smooth_linear.txt rename to doc/txt/pair_lj_smooth_linear.txt diff --git a/doc/src/pair_lj_switch3_coulgauss.txt b/doc/txt/pair_lj_switch3_coulgauss.txt similarity index 100% rename from doc/src/pair_lj_switch3_coulgauss.txt rename to doc/txt/pair_lj_switch3_coulgauss.txt diff --git a/doc/src/pair_local_density.txt b/doc/txt/pair_local_density.txt similarity index 100% rename from doc/src/pair_local_density.txt rename to doc/txt/pair_local_density.txt diff --git a/doc/src/pair_lubricate.txt b/doc/txt/pair_lubricate.txt similarity index 100% rename from doc/src/pair_lubricate.txt rename to doc/txt/pair_lubricate.txt diff --git a/doc/src/pair_lubricateU.txt b/doc/txt/pair_lubricateU.txt similarity index 100% rename from doc/src/pair_lubricateU.txt rename to doc/txt/pair_lubricateU.txt diff --git a/doc/src/pair_mdf.txt b/doc/txt/pair_mdf.txt similarity index 100% rename from doc/src/pair_mdf.txt rename to doc/txt/pair_mdf.txt diff --git a/doc/src/pair_meam_spline.txt b/doc/txt/pair_meam_spline.txt similarity index 100% rename from doc/src/pair_meam_spline.txt rename to doc/txt/pair_meam_spline.txt diff --git a/doc/src/pair_meam_sw_spline.txt b/doc/txt/pair_meam_sw_spline.txt similarity index 100% rename from doc/src/pair_meam_sw_spline.txt rename to doc/txt/pair_meam_sw_spline.txt diff --git a/doc/src/pair_meamc.txt b/doc/txt/pair_meamc.txt similarity index 100% rename from doc/src/pair_meamc.txt rename to doc/txt/pair_meamc.txt diff --git a/doc/src/pair_meso.txt b/doc/txt/pair_meso.txt similarity index 100% rename from doc/src/pair_meso.txt rename to doc/txt/pair_meso.txt diff --git a/doc/src/pair_mgpt.txt b/doc/txt/pair_mgpt.txt similarity index 100% rename from doc/src/pair_mgpt.txt rename to doc/txt/pair_mgpt.txt diff --git a/doc/src/pair_mie.txt b/doc/txt/pair_mie.txt similarity index 100% rename from doc/src/pair_mie.txt rename to doc/txt/pair_mie.txt diff --git a/doc/src/pair_mm3_switch3_coulgauss.txt b/doc/txt/pair_mm3_switch3_coulgauss.txt similarity index 100% rename from doc/src/pair_mm3_switch3_coulgauss.txt rename to doc/txt/pair_mm3_switch3_coulgauss.txt diff --git a/doc/src/pair_modify.txt b/doc/txt/pair_modify.txt similarity index 100% rename from doc/src/pair_modify.txt rename to doc/txt/pair_modify.txt diff --git a/doc/src/pair_momb.txt b/doc/txt/pair_momb.txt similarity index 100% rename from doc/src/pair_momb.txt rename to doc/txt/pair_momb.txt diff --git a/doc/src/pair_morse.txt b/doc/txt/pair_morse.txt similarity index 100% rename from doc/src/pair_morse.txt rename to doc/txt/pair_morse.txt diff --git a/doc/src/pair_multi_lucy.txt b/doc/txt/pair_multi_lucy.txt similarity index 100% rename from doc/src/pair_multi_lucy.txt rename to doc/txt/pair_multi_lucy.txt diff --git a/doc/src/pair_multi_lucy_rx.txt b/doc/txt/pair_multi_lucy_rx.txt similarity index 100% rename from doc/src/pair_multi_lucy_rx.txt rename to doc/txt/pair_multi_lucy_rx.txt diff --git a/doc/src/pair_nb3b_harmonic.txt b/doc/txt/pair_nb3b_harmonic.txt similarity index 100% rename from doc/src/pair_nb3b_harmonic.txt rename to doc/txt/pair_nb3b_harmonic.txt diff --git a/doc/src/pair_nm.txt b/doc/txt/pair_nm.txt similarity index 100% rename from doc/src/pair_nm.txt rename to doc/txt/pair_nm.txt diff --git a/doc/src/pair_none.txt b/doc/txt/pair_none.txt similarity index 100% rename from doc/src/pair_none.txt rename to doc/txt/pair_none.txt diff --git a/doc/src/pair_oxdna.txt b/doc/txt/pair_oxdna.txt similarity index 100% rename from doc/src/pair_oxdna.txt rename to doc/txt/pair_oxdna.txt diff --git a/doc/src/pair_oxdna2.txt b/doc/txt/pair_oxdna2.txt similarity index 100% rename from doc/src/pair_oxdna2.txt rename to doc/txt/pair_oxdna2.txt diff --git a/doc/src/pair_peri.txt b/doc/txt/pair_peri.txt similarity index 100% rename from doc/src/pair_peri.txt rename to doc/txt/pair_peri.txt diff --git a/doc/src/pair_polymorphic.txt b/doc/txt/pair_polymorphic.txt similarity index 100% rename from doc/src/pair_polymorphic.txt rename to doc/txt/pair_polymorphic.txt diff --git a/doc/src/pair_python.txt b/doc/txt/pair_python.txt similarity index 100% rename from doc/src/pair_python.txt rename to doc/txt/pair_python.txt diff --git a/doc/src/pair_quip.txt b/doc/txt/pair_quip.txt similarity index 100% rename from doc/src/pair_quip.txt rename to doc/txt/pair_quip.txt diff --git a/doc/src/pair_reaxc.txt b/doc/txt/pair_reaxc.txt similarity index 100% rename from doc/src/pair_reaxc.txt rename to doc/txt/pair_reaxc.txt diff --git a/doc/src/pair_resquared.txt b/doc/txt/pair_resquared.txt similarity index 100% rename from doc/src/pair_resquared.txt rename to doc/txt/pair_resquared.txt diff --git a/doc/src/pair_sdk.txt b/doc/txt/pair_sdk.txt similarity index 100% rename from doc/src/pair_sdk.txt rename to doc/txt/pair_sdk.txt diff --git a/doc/src/pair_sdpd_taitwater_isothermal.txt b/doc/txt/pair_sdpd_taitwater_isothermal.txt similarity index 100% rename from doc/src/pair_sdpd_taitwater_isothermal.txt rename to doc/txt/pair_sdpd_taitwater_isothermal.txt diff --git a/doc/src/pair_smd_hertz.txt b/doc/txt/pair_smd_hertz.txt similarity index 100% rename from doc/src/pair_smd_hertz.txt rename to doc/txt/pair_smd_hertz.txt diff --git a/doc/src/pair_smd_tlsph.txt b/doc/txt/pair_smd_tlsph.txt similarity index 100% rename from doc/src/pair_smd_tlsph.txt rename to doc/txt/pair_smd_tlsph.txt diff --git a/doc/src/pair_smd_triangulated_surface.txt b/doc/txt/pair_smd_triangulated_surface.txt similarity index 100% rename from doc/src/pair_smd_triangulated_surface.txt rename to doc/txt/pair_smd_triangulated_surface.txt diff --git a/doc/src/pair_smd_ulsph.txt b/doc/txt/pair_smd_ulsph.txt similarity index 100% rename from doc/src/pair_smd_ulsph.txt rename to doc/txt/pair_smd_ulsph.txt diff --git a/doc/src/pair_smtbq.txt b/doc/txt/pair_smtbq.txt similarity index 100% rename from doc/src/pair_smtbq.txt rename to doc/txt/pair_smtbq.txt diff --git a/doc/src/pair_snap.txt b/doc/txt/pair_snap.txt similarity index 100% rename from doc/src/pair_snap.txt rename to doc/txt/pair_snap.txt diff --git a/doc/src/pair_soft.txt b/doc/txt/pair_soft.txt similarity index 100% rename from doc/src/pair_soft.txt rename to doc/txt/pair_soft.txt diff --git a/doc/src/pair_sph_heatconduction.txt b/doc/txt/pair_sph_heatconduction.txt similarity index 100% rename from doc/src/pair_sph_heatconduction.txt rename to doc/txt/pair_sph_heatconduction.txt diff --git a/doc/src/pair_sph_idealgas.txt b/doc/txt/pair_sph_idealgas.txt similarity index 100% rename from doc/src/pair_sph_idealgas.txt rename to doc/txt/pair_sph_idealgas.txt diff --git a/doc/src/pair_sph_lj.txt b/doc/txt/pair_sph_lj.txt similarity index 100% rename from doc/src/pair_sph_lj.txt rename to doc/txt/pair_sph_lj.txt diff --git a/doc/src/pair_sph_rhosum.txt b/doc/txt/pair_sph_rhosum.txt similarity index 100% rename from doc/src/pair_sph_rhosum.txt rename to doc/txt/pair_sph_rhosum.txt diff --git a/doc/src/pair_sph_taitwater.txt b/doc/txt/pair_sph_taitwater.txt similarity index 100% rename from doc/src/pair_sph_taitwater.txt rename to doc/txt/pair_sph_taitwater.txt diff --git a/doc/src/pair_sph_taitwater_morris.txt b/doc/txt/pair_sph_taitwater_morris.txt similarity index 100% rename from doc/src/pair_sph_taitwater_morris.txt rename to doc/txt/pair_sph_taitwater_morris.txt diff --git a/doc/src/pair_spin_dipole.txt b/doc/txt/pair_spin_dipole.txt similarity index 100% rename from doc/src/pair_spin_dipole.txt rename to doc/txt/pair_spin_dipole.txt diff --git a/doc/src/pair_spin_dmi.txt b/doc/txt/pair_spin_dmi.txt similarity index 100% rename from doc/src/pair_spin_dmi.txt rename to doc/txt/pair_spin_dmi.txt diff --git a/doc/src/pair_spin_exchange.txt b/doc/txt/pair_spin_exchange.txt similarity index 100% rename from doc/src/pair_spin_exchange.txt rename to doc/txt/pair_spin_exchange.txt diff --git a/doc/src/pair_spin_magelec.txt b/doc/txt/pair_spin_magelec.txt similarity index 100% rename from doc/src/pair_spin_magelec.txt rename to doc/txt/pair_spin_magelec.txt diff --git a/doc/src/pair_spin_neel.txt b/doc/txt/pair_spin_neel.txt similarity index 100% rename from doc/src/pair_spin_neel.txt rename to doc/txt/pair_spin_neel.txt diff --git a/doc/src/pair_srp.txt b/doc/txt/pair_srp.txt similarity index 100% rename from doc/src/pair_srp.txt rename to doc/txt/pair_srp.txt diff --git a/doc/src/pair_style.txt b/doc/txt/pair_style.txt similarity index 100% rename from doc/src/pair_style.txt rename to doc/txt/pair_style.txt diff --git a/doc/src/pair_sw.txt b/doc/txt/pair_sw.txt similarity index 100% rename from doc/src/pair_sw.txt rename to doc/txt/pair_sw.txt diff --git a/doc/src/pair_table.txt b/doc/txt/pair_table.txt similarity index 100% rename from doc/src/pair_table.txt rename to doc/txt/pair_table.txt diff --git a/doc/src/pair_table_rx.txt b/doc/txt/pair_table_rx.txt similarity index 100% rename from doc/src/pair_table_rx.txt rename to doc/txt/pair_table_rx.txt diff --git a/doc/src/pair_tersoff.txt b/doc/txt/pair_tersoff.txt similarity index 100% rename from doc/src/pair_tersoff.txt rename to doc/txt/pair_tersoff.txt diff --git a/doc/src/pair_tersoff_mod.txt b/doc/txt/pair_tersoff_mod.txt similarity index 100% rename from doc/src/pair_tersoff_mod.txt rename to doc/txt/pair_tersoff_mod.txt diff --git a/doc/src/pair_tersoff_zbl.txt b/doc/txt/pair_tersoff_zbl.txt similarity index 100% rename from doc/src/pair_tersoff_zbl.txt rename to doc/txt/pair_tersoff_zbl.txt diff --git a/doc/src/pair_thole.txt b/doc/txt/pair_thole.txt similarity index 100% rename from doc/src/pair_thole.txt rename to doc/txt/pair_thole.txt diff --git a/doc/src/pair_tri_lj.txt b/doc/txt/pair_tri_lj.txt similarity index 100% rename from doc/src/pair_tri_lj.txt rename to doc/txt/pair_tri_lj.txt diff --git a/doc/src/pair_ufm.txt b/doc/txt/pair_ufm.txt similarity index 100% rename from doc/src/pair_ufm.txt rename to doc/txt/pair_ufm.txt diff --git a/doc/src/pair_vashishta.txt b/doc/txt/pair_vashishta.txt similarity index 100% rename from doc/src/pair_vashishta.txt rename to doc/txt/pair_vashishta.txt diff --git a/doc/src/pair_write.txt b/doc/txt/pair_write.txt similarity index 100% rename from doc/src/pair_write.txt rename to doc/txt/pair_write.txt diff --git a/doc/src/pair_yukawa.txt b/doc/txt/pair_yukawa.txt similarity index 100% rename from doc/src/pair_yukawa.txt rename to doc/txt/pair_yukawa.txt diff --git a/doc/src/pair_yukawa_colloid.txt b/doc/txt/pair_yukawa_colloid.txt similarity index 100% rename from doc/src/pair_yukawa_colloid.txt rename to doc/txt/pair_yukawa_colloid.txt diff --git a/doc/src/pair_zbl.txt b/doc/txt/pair_zbl.txt similarity index 100% rename from doc/src/pair_zbl.txt rename to doc/txt/pair_zbl.txt diff --git a/doc/src/pair_zero.txt b/doc/txt/pair_zero.txt similarity index 100% rename from doc/src/pair_zero.txt rename to doc/txt/pair_zero.txt diff --git a/doc/src/pairs.txt b/doc/txt/pairs.txt similarity index 100% rename from doc/src/pairs.txt rename to doc/txt/pairs.txt diff --git a/doc/src/partition.txt b/doc/txt/partition.txt similarity index 100% rename from doc/src/partition.txt rename to doc/txt/partition.txt diff --git a/doc/src/prd.txt b/doc/txt/prd.txt similarity index 100% rename from doc/src/prd.txt rename to doc/txt/prd.txt diff --git a/doc/src/print.txt b/doc/txt/print.txt similarity index 100% rename from doc/src/print.txt rename to doc/txt/print.txt diff --git a/doc/src/processors.txt b/doc/txt/processors.txt similarity index 100% rename from doc/src/processors.txt rename to doc/txt/processors.txt diff --git a/doc/src/python.txt b/doc/txt/python.txt similarity index 100% rename from doc/src/python.txt rename to doc/txt/python.txt diff --git a/doc/src/quit.txt b/doc/txt/quit.txt similarity index 100% rename from doc/src/quit.txt rename to doc/txt/quit.txt diff --git a/doc/src/read_data.txt b/doc/txt/read_data.txt similarity index 100% rename from doc/src/read_data.txt rename to doc/txt/read_data.txt diff --git a/doc/src/read_dump.txt b/doc/txt/read_dump.txt similarity index 100% rename from doc/src/read_dump.txt rename to doc/txt/read_dump.txt diff --git a/doc/src/read_restart.txt b/doc/txt/read_restart.txt similarity index 100% rename from doc/src/read_restart.txt rename to doc/txt/read_restart.txt diff --git a/doc/src/region.txt b/doc/txt/region.txt similarity index 100% rename from doc/src/region.txt rename to doc/txt/region.txt diff --git a/doc/src/replicate.txt b/doc/txt/replicate.txt similarity index 100% rename from doc/src/replicate.txt rename to doc/txt/replicate.txt diff --git a/doc/src/rerun.txt b/doc/txt/rerun.txt similarity index 100% rename from doc/src/rerun.txt rename to doc/txt/rerun.txt diff --git a/doc/src/reset_ids.txt b/doc/txt/reset_ids.txt similarity index 100% rename from doc/src/reset_ids.txt rename to doc/txt/reset_ids.txt diff --git a/doc/src/reset_timestep.txt b/doc/txt/reset_timestep.txt similarity index 100% rename from doc/src/reset_timestep.txt rename to doc/txt/reset_timestep.txt diff --git a/doc/src/restart.txt b/doc/txt/restart.txt similarity index 100% rename from doc/src/restart.txt rename to doc/txt/restart.txt diff --git a/doc/src/run.txt b/doc/txt/run.txt similarity index 100% rename from doc/src/run.txt rename to doc/txt/run.txt diff --git a/doc/src/run_style.txt b/doc/txt/run_style.txt similarity index 100% rename from doc/src/run_style.txt rename to doc/txt/run_style.txt diff --git a/doc/src/server.txt b/doc/txt/server.txt similarity index 100% rename from doc/src/server.txt rename to doc/txt/server.txt diff --git a/doc/src/server_mc.txt b/doc/txt/server_mc.txt similarity index 100% rename from doc/src/server_mc.txt rename to doc/txt/server_mc.txt diff --git a/doc/src/server_md.txt b/doc/txt/server_md.txt similarity index 100% rename from doc/src/server_md.txt rename to doc/txt/server_md.txt diff --git a/doc/src/set.txt b/doc/txt/set.txt similarity index 100% rename from doc/src/set.txt rename to doc/txt/set.txt diff --git a/doc/src/shell.txt b/doc/txt/shell.txt similarity index 100% rename from doc/src/shell.txt rename to doc/txt/shell.txt diff --git a/doc/src/special_bonds.txt b/doc/txt/special_bonds.txt similarity index 100% rename from doc/src/special_bonds.txt rename to doc/txt/special_bonds.txt diff --git a/doc/src/suffix.txt b/doc/txt/suffix.txt similarity index 100% rename from doc/src/suffix.txt rename to doc/txt/suffix.txt diff --git a/doc/src/tad.txt b/doc/txt/tad.txt similarity index 100% rename from doc/src/tad.txt rename to doc/txt/tad.txt diff --git a/doc/src/temper.txt b/doc/txt/temper.txt similarity index 100% rename from doc/src/temper.txt rename to doc/txt/temper.txt diff --git a/doc/src/temper_grem.txt b/doc/txt/temper_grem.txt similarity index 100% rename from doc/src/temper_grem.txt rename to doc/txt/temper_grem.txt diff --git a/doc/src/temper_npt.txt b/doc/txt/temper_npt.txt similarity index 100% rename from doc/src/temper_npt.txt rename to doc/txt/temper_npt.txt diff --git a/doc/src/thermo.txt b/doc/txt/thermo.txt similarity index 100% rename from doc/src/thermo.txt rename to doc/txt/thermo.txt diff --git a/doc/src/thermo_modify.txt b/doc/txt/thermo_modify.txt similarity index 100% rename from doc/src/thermo_modify.txt rename to doc/txt/thermo_modify.txt diff --git a/doc/src/thermo_style.txt b/doc/txt/thermo_style.txt similarity index 100% rename from doc/src/thermo_style.txt rename to doc/txt/thermo_style.txt diff --git a/doc/src/third_order.txt b/doc/txt/third_order.txt similarity index 100% rename from doc/src/third_order.txt rename to doc/txt/third_order.txt diff --git a/doc/src/timer.txt b/doc/txt/timer.txt similarity index 100% rename from doc/src/timer.txt rename to doc/txt/timer.txt diff --git a/doc/src/timestep.txt b/doc/txt/timestep.txt similarity index 100% rename from doc/src/timestep.txt rename to doc/txt/timestep.txt diff --git a/doc/src/uncompute.txt b/doc/txt/uncompute.txt similarity index 100% rename from doc/src/uncompute.txt rename to doc/txt/uncompute.txt diff --git a/doc/src/undump.txt b/doc/txt/undump.txt similarity index 100% rename from doc/src/undump.txt rename to doc/txt/undump.txt diff --git a/doc/src/unfix.txt b/doc/txt/unfix.txt similarity index 100% rename from doc/src/unfix.txt rename to doc/txt/unfix.txt diff --git a/doc/src/units.txt b/doc/txt/units.txt similarity index 100% rename from doc/src/units.txt rename to doc/txt/units.txt diff --git a/doc/src/variable.txt b/doc/txt/variable.txt similarity index 100% rename from doc/src/variable.txt rename to doc/txt/variable.txt diff --git a/doc/src/velocity.txt b/doc/txt/velocity.txt similarity index 100% rename from doc/src/velocity.txt rename to doc/txt/velocity.txt diff --git a/doc/src/write_coeff.txt b/doc/txt/write_coeff.txt similarity index 100% rename from doc/src/write_coeff.txt rename to doc/txt/write_coeff.txt diff --git a/doc/src/write_data.txt b/doc/txt/write_data.txt similarity index 100% rename from doc/src/write_data.txt rename to doc/txt/write_data.txt diff --git a/doc/src/write_dump.txt b/doc/txt/write_dump.txt similarity index 100% rename from doc/src/write_dump.txt rename to doc/txt/write_dump.txt diff --git a/doc/src/write_restart.txt b/doc/txt/write_restart.txt similarity index 100% rename from doc/src/write_restart.txt rename to doc/txt/write_restart.txt From 423a3bb99f9f8f294670c2f5a0f2516b3cd0c190 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Tue, 5 Nov 2019 14:22:17 -0500 Subject: [PATCH 390/418] Add initial version of updated tools from #1533 --- .../lammpsdoc/eqImg2mathjaxInline.py | 238 ++++++++++++++++++ .../converters/lammpsdoc/rst_anchor_check.py | 64 +++++ doc/utils/converters/setup.py | 2 +- 3 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 doc/utils/converters/lammpsdoc/eqImg2mathjaxInline.py create mode 100644 doc/utils/converters/lammpsdoc/rst_anchor_check.py diff --git a/doc/utils/converters/lammpsdoc/eqImg2mathjaxInline.py b/doc/utils/converters/lammpsdoc/eqImg2mathjaxInline.py new file mode 100644 index 0000000000..6db83da7fd --- /dev/null +++ b/doc/utils/converters/lammpsdoc/eqImg2mathjaxInline.py @@ -0,0 +1,238 @@ +#! /usr/bin/env python3 +# LAMMPS Documentation Utilities +# +# Scan for duplicate anchor labels in documentation files +# +# Copyright (C) 2019 E. Anne Gunn +# Based largely on doc_anchor_check.py by Richard Berger +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +import argparse +import os +import re +import sys + + +# We only want to replace image lines where image is +# pulled from Eqs subfolder +image_pattern = re.compile(r'.*image:: Eqs/(.*)\.jpg') +tex_eq_pattern = re.compile(r'\$\$') +latex_begin_eq_pattern = re.compile(r'\\begin{equation}') +latex_end_eq_pattern = re.compile(r'\\end{equation}') +latex_begin_eqArray_pattern = re.compile(r'\\begin{eqnarray\*}') +latex_end_eqArray_pattern = re.compile(r'\\end{eqnarray\*}') + +imageMarker = ">>>image was here" +image_marker_pattern = re.compile(r'>>>image was here') +align_pattern = re.compile(r'.*:align: center') + +modifiedFileFolder = "src/modifiedRst/" +# Since this is a proof of concept implementation, +# skip any rst files that are known to cause problems +skipFileList = ["pair_tersoff_zbl.rst"] + +runReport = { +} + + +def checkForEquationStart(texLine): + eqType = None + texMatch = tex_eq_pattern.match(texLine) + if texMatch: + eqType = "texMatch" + else: + eqMatch = latex_begin_eq_pattern.match(texLine) + if eqMatch: + eqType = "eqMatch" + else: + eqArrayMatch = latex_begin_eqArray_pattern.match(texLine) + if eqArrayMatch: + eqType = "eqArrayMatch" + return eqType + + +def checkForEquationEnd(texLine, eqType): + endPattern = tex_eq_pattern + if eqType == "texMatch": + endPattern = tex_eq_pattern + elif eqType == "eqMatch": + endPattern = latex_end_eq_pattern + elif eqType == "eqArrayMatch": + endPattern = latex_end_eqArray_pattern + else: + print("***error: unexpected eqType %s, will look for tex delimiter" % eqType) + + endMatch = endPattern.match(texLine) + endFound = endMatch is not None + if endFound: + print("found pattern end, line: %s" % texLine) + return endFound + + +def startMathjax(): + mathjaxLines = [] + mathjaxLines.append(".. math::\n\n") + return mathjaxLines + + +def endMathjax(mathjaxLines): + mathjaxLines.append("\n") + mathjaxLines.append("%s\n" % imageMarker) + return mathjaxLines + + +def processFile(filename): + print("in processFile for filename: %s" % filename) + imageCount = 0 + + modifiedFileLines = [] + doWriteModifiedFile = False + with open(filename, 'rt') as f: + for line_number, line in enumerate(f): + m = image_pattern.match(line) + if m: + fileroot = m.group(1) + print("fileroot: {0}".format(fileroot)) + imageCount += 1 + texFilename = "src/Eqs/{0}.tex".format(fileroot) + print("will try to open %s" % texFilename) + eqType = None + eqLines = [] + try: + with open(texFilename, 'rt', encoding='utf-8') as t: + print("%s file opened ok" % texFilename) + eqLines = startMathjax() + try: + for dummy, texLine in enumerate(t): + #print(texLine) + if eqType == None: + eqType = checkForEquationStart(texLine) + if eqType != None: + print("equation type: {0}".format(eqType)) + else: + endFound = checkForEquationEnd(texLine, eqType) + if endFound != True: + eqLines.append(texLine) + else: + eqType = None + eqLines = endMathjax(eqLines) + print("Equation lines will be:") + print("-----------------------------") + print(*eqLines, sep="\n") + print("-----------------------------") + except UnicodeDecodeError: + print("UnicodeDecodeError reading file file %s, image markup will be left in place" % texFilename) + break + except EnvironmentError: + error = "could not open source tex file {0}, line: {1}".format(texFilename, line) + print(error) + print("image markup will be left in place") + if filename not in runReport: + runReport[filename] = [] + runReport[filename].append(error) + # put the image line we could not replace back into the output + eqLines.append(line) + if len(eqLines) > 0: + modifiedFileLines.extend(eqLines) + doWriteModifiedFile = True + eqLines = [] + else: + # not an equation line, so simply queue it up for output as is + modifiedFileLines.append(line) + if doWriteModifiedFile: + #print(*modifiedFileLines, sep="\n") + print("modifiedFileLines has %d lines before align center cleanup" % len(modifiedFileLines)) + # First, go through the file and pull out the lines where there is + # now an image file marker followed by an align center directive + deleteLines = [] + for lineNumber, line in enumerate(modifiedFileLines): + m = image_marker_pattern.match(line) + if m: + print("found image marker in line %d" % lineNumber) + n = align_pattern.match(modifiedFileLines[lineNumber+1]) + if n: + print("found align center") + deleteLines.append(lineNumber) + deleteLines.append(lineNumber+1) + #When deleting, always work from the back of the list to the front + for lineNumber in reversed(deleteLines): + print(lineNumber) + del modifiedFileLines[lineNumber] + print("modifiedFileLines has %d lines after align center cleanup" % len(modifiedFileLines)) + # Now we can actually write out the new contents + try: + if not os.path.exists(modifiedFileFolder): + os.makedirs(modifiedFileFolder) + nameParts = filename.split("/") + filenamePos = len(nameParts) - 1 + modFilePath = "{0}{1}".format(modifiedFileFolder, nameParts[filenamePos]) + modRst = open(modFilePath, "w") + for rstLine in modifiedFileLines: + modRst.write(rstLine) + modRst.close() + except OSError: + print('Error: Creating directory. ' + modifiedFileFolder) + return imageCount + + +def main(): + fileCount = 0 + totalImageCount = 0 + + parser = argparse.ArgumentParser(description='replace image markup in rst files with inline mathjax markup from .txt source of images') + parser.add_argument('files', metavar='file', nargs='+', help='one or more files to scan') + parsed_args = parser.parse_args() + + # TODO: make originalRst folder and copy src/*.rst files into it + + # Because we may decide to add files to the skip list between runs, + # if we have more than one file to process, + # remove the modified file folder so we don't end up with + # zombie modifications + if len(parsed_args.files) > 1: + for outputFile in os.listdir(modifiedFileFolder): + filePath = os.path.join(modifiedFileFolder, outputFile) + try: + if os.path.isfile(filePath): + os.unlink(filePath) + except Exception as e: + print(e) + sys.exit(1) + + for filename in parsed_args.files: + doSkip = False + for skipName in skipFileList: + if filename.find(skipName) != -1: + print("skipping file: %s" % filename) + doSkip = True + runReport[filename] = ["skipped based on skipFileList"] + break + if not doSkip: + fileCount += 1 + ic = processFile(filename) + totalImageCount += ic + + print("============================================") + print("Processed %d rst files." % fileCount) + print("Found %d image lines." % totalImageCount) + + for fileKey in runReport: + print("--------------------------------------------") + print("run report for %s:" % fileKey) + print(*runReport[fileKey], sep="\n") + + print("============================================") + +if __name__ == "__main__": + main() diff --git a/doc/utils/converters/lammpsdoc/rst_anchor_check.py b/doc/utils/converters/lammpsdoc/rst_anchor_check.py new file mode 100644 index 0000000000..9c097e7d0e --- /dev/null +++ b/doc/utils/converters/lammpsdoc/rst_anchor_check.py @@ -0,0 +1,64 @@ +#! /usr/bin/env python3 +# LAMMPS Documentation Utilities +# +# Scan for duplicate anchor labels in documentation files +# +# Copyright (C) 2017 Richard Berger +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +import re +import sys +import argparse + +def main(): + parser = argparse.ArgumentParser(description='scan for duplicate anchor labels in documentation files') + parser.add_argument('files', metavar='file', nargs='+', help='one or more files to scan') + parsed_args = parser.parse_args() + + anchor_pattern = re.compile(r'^\.\. _(.*):$') + anchors = {} + + for filename in parsed_args.files: + #print("filename: %s" % filename) + with open(filename, 'rt') as f: + for line_number, line in enumerate(f): + m = anchor_pattern.match(line) + if m: + label = m.group(1) + #print("found label: %s" % label) + if label in anchors: + anchors[label].append((filename, line_number+1)) + else: + anchors[label] = [(filename, line_number+1)] + + print("found %d anchor labels" % len(anchors)) + + count = 0 + + for label in sorted(anchors.keys()): + if len(anchors[label]) > 1: + print(label) + count += 1 + for filename, line_number in anchors[label]: + print(" - %s:%d" % (filename, line_number)) + + + if count > 0: + print("Found %d anchor label errors." % count) + sys.exit(1) + else: + print("No anchor label errors.") + +if __name__ == "__main__": + main() diff --git a/doc/utils/converters/setup.py b/doc/utils/converters/setup.py index f4656a7f69..d85669bcc1 100644 --- a/doc/utils/converters/setup.py +++ b/doc/utils/converters/setup.py @@ -13,6 +13,6 @@ setup(name='LAMMPS Documentation Utilities', entry_points = { "console_scripts": ['txt2html = lammpsdoc.txt2html:main', 'txt2rst = lammpsdoc.txt2rst:main', - 'doc_anchor_check = lammpsdoc.doc_anchor_check:main '] + 'rst_anchor_check = lammpsdoc.rst_anchor_check:main '] }, ) From 5e6694f3bcda89237fe8cb96903abfdd81413df2 Mon Sep 17 00:00:00 2001 From: Anne Gunn Date: Fri, 21 Jun 2019 08:34:32 -0600 Subject: [PATCH 391/418] Re-enabled conversion of equations arrays. Disabled works even worse --- .../lammpsdoc/eqImg2mathjaxInline.py | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/doc/utils/converters/lammpsdoc/eqImg2mathjaxInline.py b/doc/utils/converters/lammpsdoc/eqImg2mathjaxInline.py index 6db83da7fd..353eed8b6e 100644 --- a/doc/utils/converters/lammpsdoc/eqImg2mathjaxInline.py +++ b/doc/utils/converters/lammpsdoc/eqImg2mathjaxInline.py @@ -21,6 +21,7 @@ import argparse import os import re +import shutil import sys @@ -37,7 +38,8 @@ imageMarker = ">>>image was here" image_marker_pattern = re.compile(r'>>>image was here') align_pattern = re.compile(r'.*:align: center') -modifiedFileFolder = "src/modifiedRst/" +modifiedRstFolder = "src/modifiedRst/" +safeRstFolder = "src/safeRst/" # Since this is a proof of concept implementation, # skip any rst files that are known to cause problems skipFileList = ["pair_tersoff_zbl.rst"] @@ -151,7 +153,13 @@ def processFile(filename): # not an equation line, so simply queue it up for output as is modifiedFileLines.append(line) if doWriteModifiedFile: - #print(*modifiedFileLines, sep="\n") + # We're going to write out a modified file, so first copy the original rst + # file into the original file folder. + nameParts = filename.split("/") + filenamePos = len(nameParts) - 1 + safeFilePath = "{0}{1}".format(safeRstFolder, nameParts[filenamePos]) + shutil.copyfile(filename, safeFilePath) + print("modifiedFileLines has %d lines before align center cleanup" % len(modifiedFileLines)) # First, go through the file and pull out the lines where there is # now an image file marker followed by an align center directive @@ -172,17 +180,13 @@ def processFile(filename): print("modifiedFileLines has %d lines after align center cleanup" % len(modifiedFileLines)) # Now we can actually write out the new contents try: - if not os.path.exists(modifiedFileFolder): - os.makedirs(modifiedFileFolder) - nameParts = filename.split("/") - filenamePos = len(nameParts) - 1 - modFilePath = "{0}{1}".format(modifiedFileFolder, nameParts[filenamePos]) + modFilePath = "{0}{1}".format(modifiedRstFolder, nameParts[filenamePos]) modRst = open(modFilePath, "w") for rstLine in modifiedFileLines: modRst.write(rstLine) modRst.close() except OSError: - print('Error: Creating directory. ' + modifiedFileFolder) + print('Error: Creating directory. ' + modifiedRstFolder) return imageCount @@ -193,16 +197,28 @@ def main(): parser = argparse.ArgumentParser(description='replace image markup in rst files with inline mathjax markup from .txt source of images') parser.add_argument('files', metavar='file', nargs='+', help='one or more files to scan') parsed_args = parser.parse_args() + print(parsed_args) - # TODO: make originalRst folder and copy src/*.rst files into it + if not os.path.exists(safeRstFolder): + os.makedirs(safeRstFolder) + if not os.path.exists(modifiedRstFolder): + os.makedirs(modifiedRstFolder) # Because we may decide to add files to the skip list between runs, # if we have more than one file to process, - # remove the modified file folder so we don't end up with + # files from both original and modified folders # zombie modifications if len(parsed_args.files) > 1: - for outputFile in os.listdir(modifiedFileFolder): - filePath = os.path.join(modifiedFileFolder, outputFile) + for outputFile in os.listdir(modifiedRstFolder): + filePath = os.path.join(modifiedRstFolder, outputFile) + try: + if os.path.isfile(filePath): + os.unlink(filePath) + except Exception as e: + print(e) + sys.exit(1) + for safeFile in os.listdir(safeRstFolder): + filePath = os.path.join(safeRstFolder, safeFile) try: if os.path.isfile(filePath): os.unlink(filePath) @@ -211,6 +227,7 @@ def main(): sys.exit(1) for filename in parsed_args.files: + print("filename: %s" % filename) doSkip = False for skipName in skipFileList: if filename.find(skipName) != -1: From c756e472aeab235f7ea7e939b45dba5abccddb73 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Tue, 5 Nov 2019 15:34:57 -0500 Subject: [PATCH 392/418] Remove Manual.txt and use variable for version --- doc/src/Manual.rst | 4 +- doc/txt/Manual.txt | 124 --------------------------------------------- 2 files changed, 2 insertions(+), 126 deletions(-) delete mode 100644 doc/txt/Manual.txt diff --git a/doc/src/Manual.rst b/doc/src/Manual.rst index c5485271e1..dd67a13427 100644 --- a/doc/src/Manual.rst +++ b/doc/src/Manual.rst @@ -1,8 +1,8 @@ LAMMPS Documentation #################### -30 Oct 2019 version -******************* +|version| version +***************** :doc:`What is a LAMMPS version? ` diff --git a/doc/txt/Manual.txt b/doc/txt/Manual.txt deleted file mode 100644 index 041a481547..0000000000 --- a/doc/txt/Manual.txt +++ /dev/null @@ -1,124 +0,0 @@ - - -LAMMPS Users Manual - - - - - - - -

    - - - -"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Commands_all.html#comm) - -:line - -LAMMPS Documentation :c,h1 -30 Oct 2019 version :c,h2 - -"What is a LAMMPS version?"_Manual_version.html - -LAMMPS stands for Large-scale Atomic/Molecular Massively Parallel -Simulator. - -LAMMPS is a classical molecular dynamics simulation code with a focus -on materials modeling. It was designed to run efficiently on parallel -computers. It was developed originally at Sandia National -Laboratories, a US Department of Energy facility. The majority of -funding for LAMMPS has come from the US Department of Energy (DOE). -LAMMPS is an open-source code, distributed freely under the terms of -the GNU Public License (GPL). - -The "LAMMPS website"_lws has a variety of information about the code. -It includes links to an on-line version of this manual, a "mailing -list"_http://lammps.sandia.gov/mail.html where users can post -questions, and a "GitHub site"_https://github.com/lammps/lammps where -all LAMMPS development is coordinated. - -:line - -The content for this manual is part of the LAMMPS distribution. You -can build a local copy of the Manual as HTML pages or a PDF file, by -following the steps on the "Manual build"_Manual_build.html doc page. -There is also a "Developer.pdf"_Developer.pdf document which gives -a brief description of the basic code structure of LAMMPS. - -:line - -Once you are familiar with LAMMPS, you may want to bookmark "this -page"_Commands.html since it gives quick access to a doc page for -every LAMMPS command. - - - - -"Introduction"_Intro.html :olb,l -"Install LAMMPS"_Install.html :l -"Build LAMMPS"_Build.html :l -"Run LAMMPS"_Run_head.html :l -"Commands"_Commands.html :l -"Optional packages"_Packages.html :l -"Accelerate performance"_Speed.html :l -"How-to discussions"_Howto.html :l -"Example scripts"_Examples.html :l -"Auxiliary tools"_Tools.html :l -"Modify & extend LAMMPS"_Modify.html :l -"Use Python with LAMMPS"_Python_head.html :l -"Errors"_Errors.html :l -"Building the LAMMPS manual"_Manual_build.html :l -:ole - - - - From c3e52c3c8cced95f63fcf87b14c1e96aec362175 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Tue, 5 Nov 2019 15:48:00 -0500 Subject: [PATCH 393/418] Use globs for style lists --- doc/src/angles.rst | 24 +----- doc/src/bonds.rst | 19 +---- doc/src/computes.rst | 131 +---------------------------- doc/src/dihedrals.rst | 34 +------- doc/src/fixes.rst | 184 +--------------------------------------- doc/src/impropers.rst | 17 +--- doc/src/pairs.rst | 125 +-------------------------- doc/txt/angles.txt | 30 ------- doc/txt/bonds.txt | 25 ------ doc/txt/dihedrals.txt | 40 --------- doc/txt/fixes.txt | 190 ------------------------------------------ doc/txt/pairs.txt | 131 ----------------------------- 12 files changed, 14 insertions(+), 936 deletions(-) delete mode 100644 doc/txt/angles.txt delete mode 100644 doc/txt/bonds.txt delete mode 100644 doc/txt/dihedrals.txt delete mode 100644 doc/txt/fixes.txt delete mode 100644 doc/txt/pairs.txt diff --git a/doc/src/angles.rst b/doc/src/angles.rst index 84a8fad6a8..79c52a5525 100644 --- a/doc/src/angles.rst +++ b/doc/src/angles.rst @@ -4,26 +4,6 @@ Angle Styles .. toctree:: :maxdepth: 1 + :glob: - angle_charmm - angle_class2 - angle_cosine - angle_cosine_buck6d - angle_cosine_delta - angle_cosine_periodic - angle_cosine_shift - angle_cosine_shift_exp - angle_cosine_squared - angle_cross - angle_dipole - angle_fourier - angle_fourier_simple - angle_harmonic - angle_hybrid - angle_mm3 - angle_none - angle_quartic - angle_sdk - angle_table - angle_zero - + angle_* diff --git a/doc/src/bonds.rst b/doc/src/bonds.rst index 55c9702171..3019e0c177 100644 --- a/doc/src/bonds.rst +++ b/doc/src/bonds.rst @@ -4,21 +4,6 @@ Bond Styles .. toctree:: :maxdepth: 1 + :glob: - bond_class2 - bond_fene - bond_fene_expand - bond_gromos - bond_harmonic - bond_harmonic_shift - bond_harmonic_shift_cut - bond_hybrid - bond_mm3 - bond_morse - bond_none - bond_nonlinear - bond_oxdna - bond_quartic - bond_table - bond_zero - + bond_* diff --git a/doc/src/computes.rst b/doc/src/computes.rst index 1bb603f39c..1c1819a444 100644 --- a/doc/src/computes.rst +++ b/doc/src/computes.rst @@ -4,133 +4,6 @@ Computes .. toctree:: :maxdepth: 1 + :glob: - compute_ackland_atom - compute_adf - compute_angle - compute_angle_local - compute_angmom_chunk - compute_basal_atom - compute_body_local - compute_bond - compute_bond_local - compute_centro_atom - compute_chunk_atom - compute_chunk_spread_atom - compute_cluster_atom - compute_cna_atom - compute_cnp_atom - compute_com - compute_com_chunk - compute_contact_atom - compute_coord_atom - compute_damage_atom - compute_dihedral - compute_dihedral_local - compute_dilatation_atom - compute_dipole_chunk - compute_displace_atom - compute_dpd - compute_dpd_atom - compute_edpd_temp_atom - compute_entropy_atom - compute_erotate_asphere - compute_erotate_rigid - compute_erotate_sphere - compute_erotate_sphere_atom - compute_event_displace - compute_fep - compute_global_atom - compute_group_group - compute_gyration - compute_gyration_chunk - compute_gyration_shape - compute_heat_flux - compute_hexorder_atom - compute_hma - compute_improper - compute_improper_local - compute_inertia_chunk - compute_ke - compute_ke_atom - compute_ke_atom_eff - compute_ke_eff - compute_ke_rigid - compute_meso_e_atom - compute_meso_rho_atom - compute_meso_t_atom - compute_momentum - compute_msd - compute_msd_chunk - compute_msd_nongauss - compute_omega_chunk - compute_orientorder_atom - compute_pair - compute_pair_local - compute_pe - compute_pe_atom - compute_plasticity_atom - compute_pressure - compute_pressure_cylinder - compute_pressure_uef - compute_property_atom - compute_property_chunk - compute_property_local - compute_ptm_atom - compute_rdf - compute_reduce - compute_reduce_chunk - compute_rigid_local - compute_saed - compute_slice - compute_smd_contact_radius - compute_smd_damage - compute_smd_hourglass_error - compute_smd_internal_energy - compute_smd_plastic_strain - compute_smd_plastic_strain_rate - compute_smd_rho - compute_smd_tlsph_defgrad - compute_smd_tlsph_dt - compute_smd_tlsph_num_neighs - compute_smd_tlsph_shape - compute_smd_tlsph_strain - compute_smd_tlsph_strain_rate - compute_smd_tlsph_stress - compute_smd_triangle_vertices - compute_smd_ulsph_num_neighs - compute_smd_ulsph_strain - compute_smd_ulsph_strain_rate - compute_smd_ulsph_stress - compute_smd_vol - compute_sna_atom - compute_spin - compute_stress_atom - compute_stress_mop - compute_tally - compute_tdpd_cc_atom - compute_temp - compute_temp_asphere - compute_temp_body - compute_temp_chunk - compute_temp_com - compute_temp_cs - compute_temp_deform - compute_temp_deform_eff - compute_temp_drude - compute_temp_eff - compute_temp_partial - compute_temp_profile - compute_temp_ramp - compute_temp_region - compute_temp_region_eff - compute_temp_rotate - compute_temp_sphere - compute_temp_uef - compute_ti - compute_torque_chunk - compute_vacf - compute_vcm_chunk - compute_voronoi_atom - compute_xrd - + compute_* diff --git a/doc/src/dihedrals.rst b/doc/src/dihedrals.rst index e14399fcb6..bab913f1c2 100644 --- a/doc/src/dihedrals.rst +++ b/doc/src/dihedrals.rst @@ -4,36 +4,6 @@ Dihedral Styles .. toctree:: :maxdepth: 1 + :glob: - dihedral_charmm - dihedral_class2 - dihedral_cosine_shift_exp - dihedral_fourier - dihedral_harmonic - dihedral_helix - dihedral_hybrid - dihedral_multi_harmonic - dihedral_nharmonic - dihedral_none - dihedral_opls - dihedral_quadratic - dihedral_spherical - dihedral_table - dihedral_table_cut - dihedral_zero - dihedral_charmm - dihedral_class2 - dihedral_cosine_shift_exp - dihedral_fourier - dihedral_harmonic - dihedral_helix - dihedral_hybrid - dihedral_multi_harmonic - dihedral_nharmonic - dihedral_none - dihedral_opls - dihedral_quadratic - dihedral_spherical - dihedral_table - dihedral_zero - + dihedral_* diff --git a/doc/src/fixes.rst b/doc/src/fixes.rst index 3678fcc853..5a85738c45 100644 --- a/doc/src/fixes.rst +++ b/doc/src/fixes.rst @@ -4,186 +4,6 @@ Fixes .. toctree:: :maxdepth: 1 + :glob: - fix_adapt - fix_adapt_fep - fix_addforce - fix_addtorque - fix_append_atoms - fix_atc - fix_atom_swap - fix_ave_atom - fix_ave_chunk - fix_ave_correlate - fix_ave_correlate_long - fix_ave_histo - fix_ave_time - fix_aveforce - fix_balance - fix_bocs - fix_bond_break - fix_bond_create - fix_bond_swap - fix_bond_react - fix_box_relax - fix_client_md - fix_cmap - fix_colvars - fix_controller - fix_deform - fix_deposit - fix_drag - fix_drude - fix_drude_transform - fix_dpd_energy - fix_dpd_source - fix_dt_reset - fix_efield - fix_ehex - fix_electron_stopping - fix_enforce2d - fix_eos_cv - fix_eos_table - fix_eos_table_rx - fix_evaporate - fix_external - fix_ffl - fix_filter_corotate - fix_flow_gauss - fix_freeze - fix_gcmc - fix_gld - fix_gle - fix_gravity - fix_grem - fix_halt - fix_heat - fix_hyper_global - fix_hyper_local - fix_imd - fix_indent - fix_ipi - fix_langevin - fix_langevin_drude - fix_langevin_eff - fix_langevin_spin - fix_latte - fix_lb_fluid - fix_lb_momentum - fix_lb_pc - fix_lb_rigid_pc_sphere - fix_lb_viscous - fix_lineforce - fix_manifoldforce - fix_meso - fix_meso_move - fix_meso_stationary - fix_momentum - fix_move - fix_mscg - fix_msst - fix_mvv_dpd - fix_neb - fix_neb_spin - fix_nh - fix_nh_eff - fix_nh_uef - fix_nph_asphere - fix_nph_body - fix_nph_sphere - fix_nphug - fix_npt_asphere - fix_npt_body - fix_npt_sphere - fix_nve - fix_nve_asphere - fix_nve_asphere_noforce - fix_nve_awpmd - fix_nve_body - fix_nve_dot - fix_nve_dotc_langevin - fix_nve_eff - fix_nve_limit - fix_nve_line - fix_nve_manifold_rattle - fix_nve_noforce - fix_nve_sphere - fix_nve_spin - fix_nve_tri - fix_nvk - fix_nvt_asphere - fix_nvt_body - fix_nvt_manifold_rattle - fix_nvt_sllod - fix_nvt_sllod_eff - fix_nvt_sphere - fix_oneway - fix_orient - fix_phonon - fix_pimd - fix_planeforce - fix_plumed - fix_poems - fix_pour - fix_precession_spin - fix_press_berendsen - fix_print - fix_property_atom - fix_python_invoke - fix_python_move - fix_qbmsst - fix_qeq - fix_qeq_comb - fix_qeq_reax - fix_qmmm - fix_qtb - fix_reaxc_bonds - fix_reaxc_species - fix_recenter - fix_restrain - fix_rhok - fix_rigid - fix_rigid_meso - fix_rx - fix_saed_vtk - fix_setforce - fix_shake - fix_shardlow - fix_smd - fix_smd_adjust_dt - fix_smd_integrate_tlsph - fix_smd_integrate_ulsph - fix_smd_move_triangulated_surface - fix_smd_setvel - fix_smd_wall_surface - fix_spring - fix_spring_chunk - fix_spring_rg - fix_spring_self - fix_srd - fix_store_force - fix_store_state - fix_temp_berendsen - fix_temp_csvr - fix_temp_rescale - fix_temp_rescale_eff - fix_tfmc - fix_thermal_conductivity - fix_ti_spring - fix_tmd - fix_ttm - fix_tune_kspace - fix_vector - fix_viscosity - fix_viscous - fix_wall - fix_wall_body_polygon - fix_wall_body_polyhedron - fix_wall_ees - fix_wall_gran - fix_wall_gran_region - fix_wall_piston - fix_wall_reflect - fix_wall_region - fix_wall_srd - + fix_* diff --git a/doc/src/impropers.rst b/doc/src/impropers.rst index c524004fc4..93b4776d2c 100644 --- a/doc/src/impropers.rst +++ b/doc/src/impropers.rst @@ -4,19 +4,6 @@ Improper Styles .. toctree:: :maxdepth: 1 + :glob: - improper_class2 - improper_cossq - improper_cvff - improper_distance - improper_distharm - improper_fourier - improper_harmonic - improper_hybrid - improper_inversion_harmonic - improper_none - improper_ring - improper_umbrella - improper_sqdistharm - improper_zero - + improper_* diff --git a/doc/src/pairs.rst b/doc/src/pairs.rst index 9124013161..4fdf2b2c69 100644 --- a/doc/src/pairs.rst +++ b/doc/src/pairs.rst @@ -4,127 +4,6 @@ Pair Styles .. toctree:: :maxdepth: 1 + :glob: - pair_adp - pair_agni - pair_airebo - pair_atm - pair_awpmd - pair_beck - pair_body_nparticle - pair_body_rounded_polygon - pair_body_rounded_polyhedron - pair_bop - pair_born - pair_brownian - pair_buck - pair_buck_long - pair_buck6d_coul_gauss - pair_charmm - pair_class2 - pair_colloid - pair_comb - pair_cosine_squared - pair_coul - pair_coul_diel - pair_coul_shield - pair_cs - pair_dipole - pair_dpd - pair_dpd_fdt - pair_drip - pair_dsmc - pair_e3b - pair_eam - pair_edip - pair_eff - pair_eim - pair_exp6_rx - pair_extep - pair_fep_soft - pair_gauss - pair_gayberne - pair_gran - pair_granular - pair_gromacs - pair_gw - pair_hbond_dreiding - pair_hybrid - pair_ilp_graphene_hbn - pair_kim - pair_kolmogorov_crespi_full - pair_kolmogorov_crespi_z - pair_lcbop - pair_lebedeva_z - pair_line_lj - pair_list - pair_lj - pair_lj96 - pair_lj_cubic - pair_lj_expand - pair_lj_long - pair_lj_smooth - pair_lj_smooth_linear - pair_lj_switch3_coulgauss - pair_local_density - pair_lubricate - pair_lubricateU - pair_mdf - pair_meamc - pair_meam_spline - pair_meam_sw_spline - pair_meso - pair_mgpt - pair_mie - pair_mm3_switch3_coulgauss - pair_momb - pair_morse - pair_multi_lucy - pair_multi_lucy_rx - pair_nb3b_harmonic - pair_nm - pair_none - pair_oxdna - pair_oxdna2 - pair_peri - pair_polymorphic - pair_python - pair_quip - pair_reaxc - pair_resquared - pair_sdk - pair_sdpd_taitwater_isothermal - pair_smd_hertz - pair_smd_tlsph - pair_smd_triangulated_surface - pair_smd_ulsph - pair_smtbq - pair_snap - pair_soft - pair_sph_heatconduction - pair_sph_idealgas - pair_sph_lj - pair_sph_rhosum - pair_sph_taitwater - pair_sph_taitwater_morris - pair_spin_dipole - pair_spin_dmi - pair_spin_exchange - pair_spin_magelec - pair_spin_neel - pair_srp - pair_sw - pair_table - pair_table_rx - pair_tersoff - pair_tersoff_mod - pair_tersoff_zbl - pair_thole - pair_tri_lj - pair_ufm - pair_vashishta - pair_yukawa - pair_yukawa_colloid - pair_zbl - pair_zero - + pair_* diff --git a/doc/txt/angles.txt b/doc/txt/angles.txt deleted file mode 100644 index 3d8a47b2eb..0000000000 --- a/doc/txt/angles.txt +++ /dev/null @@ -1,30 +0,0 @@ -Angle Styles :h1 - - diff --git a/doc/txt/bonds.txt b/doc/txt/bonds.txt deleted file mode 100644 index 48896e711c..0000000000 --- a/doc/txt/bonds.txt +++ /dev/null @@ -1,25 +0,0 @@ -Bond Styles :h1 - - diff --git a/doc/txt/dihedrals.txt b/doc/txt/dihedrals.txt deleted file mode 100644 index a862bf50a0..0000000000 --- a/doc/txt/dihedrals.txt +++ /dev/null @@ -1,40 +0,0 @@ -Dihedral Styles :h1 - - diff --git a/doc/txt/fixes.txt b/doc/txt/fixes.txt deleted file mode 100644 index d966b9a225..0000000000 --- a/doc/txt/fixes.txt +++ /dev/null @@ -1,190 +0,0 @@ -Fixes :h1 - - diff --git a/doc/txt/pairs.txt b/doc/txt/pairs.txt deleted file mode 100644 index 1f8f130e48..0000000000 --- a/doc/txt/pairs.txt +++ /dev/null @@ -1,131 +0,0 @@ -Pair Styles :h1 - - From 729eabd77146592763f3dd3ad4234cb428905c49 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 6 Nov 2019 08:32:07 -0500 Subject: [PATCH 394/418] make QUIP_LIBRARY setting consistent and backport change to .rst file only --- doc/rst/Build_extras.rst | 2 +- doc/src/Build_extras.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/rst/Build_extras.rst b/doc/rst/Build_extras.rst index 49e3d5c801..6162940015 100644 --- a/doc/rst/Build_extras.rst +++ b/doc/rst/Build_extras.rst @@ -1258,7 +1258,7 @@ lib/quip/README file for details on how to do this. CMake will not download and build the QUIP library. But once you have done that, a CMake build of LAMMPS with "-D PKG\_USER-QUIP=yes" should -work. Set QUIP\_LIBRARIES if CMake cannot find the QUIP library. +work. Set QUIP\_LIBRARY if CMake cannot find the QUIP library. **Traditional make**\ : diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index b315e244c5..114aeda7af 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -1034,11 +1034,11 @@ lib/quip/README file for details on how to do this. [CMake build]: --D QUIP_LIBRARIES=path # path to libquip.a (only needed if a custom location) :pre +-D QUIP_LIBRARY=path # path to libquip.a (only needed if a custom location) :pre CMake will not download and build the QUIP library. But once you have done that, a CMake build of LAMMPS with "-D PKG_USER-QUIP=yes" should -work. Set QUIP_LIBRARIES if CMake cannot find the QUIP library. +work. Set QUIP_LIBRARY if CMake cannot find the QUIP library. [Traditional make]: From 2fd9a2790263c5641540efd8b0e6d47f1dc9abdd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 6 Nov 2019 08:33:05 -0500 Subject: [PATCH 395/418] update kim_commands.rst from .txt file --- doc/rst/kim_commands.rst | 352 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 326 insertions(+), 26 deletions(-) diff --git a/doc/rst/kim_commands.rst b/doc/rst/kim_commands.rst index e9393200d7..9f0b5a6775 100644 --- a/doc/rst/kim_commands.rst +++ b/doc/rst/kim_commands.rst @@ -9,6 +9,9 @@ kim\_interactions command kim\_query command ================== +kim\_param command +================== + Syntax """""" @@ -18,15 +21,36 @@ Syntax kim_init model user_units unitarg kim_interactions typeargs kim_query variable formatarg query_function queryargs + kim_param get param_name index_range variables formatarg + kim_param set param_name index_range values + +.. _formatarg\_options: + + * model = name of the KIM interatomic model (the KIM ID for models archived in OpenKIM) * user\_units = the LAMMPS :doc:`units ` style assumed in the LAMMPS input script * unitarg = *unit\_conversion\_mode* (optional) * typeargs = atom type to species mapping (one entry per atom type) or *fixed\_types* for models with a preset fixed mapping -* variable = name of a (string style) variable where the result of the query is stored -* formatarg = *split* (optional) +* variable(s) = single name or list of names of (string style) LAMMPS variable(s) where a query result or parameter get result is stored. Variables that do not exist will be created by the command. +* formatarg = *list, split, or explicit* (optional): + + .. parsed-literal:: + + *list* = returns a single string with a list of space separated values + (e.g. "1.0 2.0 3.0"), which is placed in a LAMMPS variable as + defined by the *variable* argument. [default for *kim_query*] + *split* = returns the values separately in new variables with names based + on the prefix specified in *variable* and a number appended to + indicate which element in the list of values is in the variable. + *explicit* = returns the values separately in one more more variable names + provided as arguments that preceed *formatarg*\ . [default for *kim_param*] + * query\_function = name of the OpenKIM web API query function to be used * queryargs = a series of *keyword=value* pairs that represent the web query; supported keywords depend on the query function +* param\_name = name of a KIM portable model parameter +* index\_range = KIM portable model parameter index range (an integer for a single element, or pair of integers separated by a colon for a range of elements) +* values = new value(s) to replace the current value(s) of a KIM portable model parameter Examples """""""" @@ -39,9 +63,11 @@ Examples kim_init Sim_LAMMPS_ReaxFF_StrachanVanDuinChakraborty_2003_CHNO__SM_107643900657_000 real kim_init Sim_LAMMPS_ReaxFF_StrachanVanDuinChakraborty_2003_CHNO__SM_107643900657_000 metal unit_conversion_mode kim_interactions C H O - Sim_LAMMPS_IFF_PCFF_HeinzMishraLinEmami_2015Ver1v5_FccmetalsMineralsSolvents Polymers__SM_039297821658_000 real + kim_init Sim_LAMMPS_IFF_PCFF_HeinzMishraLinEmami_2015Ver1v5_FccmetalsMineralsSolventsPolymers__SM_039297821658_000 real kim_interactions fixed_types kim_query a0 get_lattice_constant_cubic crystal=["fcc"] species=["Al"] units=["angstrom"] + kim_param get gamma 1 varGamma + kim_param set gamma 1 3.0 Description """"""""""" @@ -90,6 +116,10 @@ Types of IMs in OpenKIM There are two types of IMs archived in OpenKIM: +.. _PM\_type: + + + 1. The first type is called a *KIM Portable Model* (PM). A KIM PM is an independent computer implementation of an IM written in one of the languages supported by KIM (C, C++, Fortran) that conforms to the KIM Application Programming Interface (`KIM API `_) Portable Model Interface (PMI) standard. A KIM PM will work seamlessly with any simulation code that supports the KIM API/PMI standard (including LAMMPS; see `complete list of supported codes `_). 2. The second type is called a *KIM Simulator Model* (SM). A KIM SM is an IM that is implemented natively within a simulation code (\ *simulator*\ ) that supports the KIM API Simulator Model Interface (SMI); in this case LAMMPS. A separate SM package is archived in OpenKIM for each parameterization of the IM, which includes all of the necessary parameter files, LAMMPS commands, and metadata (supported species, units, etc.) needed to run the IM in LAMMPS. @@ -126,7 +156,7 @@ The URL for the Model Page is constructed from the https://openkim.org/id/extended_KIM_ID -For example for the Stillinger-Weber potential +For example, for the Stillinger--Weber potential listed above the Model Page is located at: @@ -224,7 +254,8 @@ potential for Al: The above script will end with an error in the *kim\_init* line if the IM is changed to another potential for Al that does not work with *metal* -units. To address this *kim\_init* offers the *unit\_conversion\_mode*. +units. To address this *kim\_init* offers the *unit\_conversion\_mode* +as shown below. If unit conversion mode *is* active, then *kim\_init* calls the LAMMPS :doc:`units ` command to set the units to the IM's required or preferred units. Conversion factors between the IM's units and the *user\_units* @@ -284,7 +315,7 @@ will work correctly for any IM for Al (KIM PM or SM) selected by the *kim\_init* command. Care must be taken to apply unit conversion to dimensional variables read in -from a file. For example if a configuration of atoms is read in from a +from a file. For example, if a configuration of atoms is read in from a dump file using the :doc:`read\_dump ` command, the following can be done to convert the box and all atomic positions to the correct units: @@ -408,14 +439,40 @@ Using OpenKIM Web Queries in LAMMPS (*kim\_query*) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The *kim\_query* command performs a web query to retrieve the predictions -of the IM set by *kim\_init* for material properties archived in -`OpenKIM `_. The *kim\_query* command must be preceded -by a *kim\_init* command. The result of the query is stored in a -:doc:`string style variable `, the name of which is given as the first -argument of the *kim\_query command*. (For the case of multiple -return values, the optional *split* keyword can be used after the -variable name to separate the results into multiple variables; see -the :ref:`example ` below.) +of an IM set by *kim\_init* for material properties archived in +`OpenKIM `_. + +.. note:: + + The *kim\_query* command must be preceded by a *kim\_init* command. + +The syntax for the *kim\_query* command is as follows: + + +.. parsed-literal:: + + kim_query variable formatarg query_function queryargs + +The result of the query is stored in one or more +:doc:`string style variables ` as determined by the +optional *formatarg* argument :ref:`documented above `. +For the "list" setting of *formatarg* (or if *formatarg* is not +specified), the result is returned as a space-separated list of +values in *variable*\ . +The *formatarg* keyword "split" separates the result values into +individual variables of the form *prefix\_I*, where *prefix* is set to the +*kim\_query* *variable* argument and *I* ranges from 1 to the number of +returned values. The number and order of the returned values is determined +by the type of query performed. (Note that the "explicit" setting of +*formatarg* is not supported by *kim\_query*.) + +.. note:: + + *kim\_query* only supports queries that return a single result or + an array of values. More complex queries that return a JSON structure + are not currently supported. An attempt to use *kim\_query* in such + cases will generate an error. + The second required argument *query\_function* is the name of the query function to be called (e.g. *get\_lattice\_constant\_cubic*). All following :doc:`arguments ` are parameters handed over to @@ -443,8 +500,8 @@ is available on the OpenKIM webpage at `query documentation `_ to see which methods are available for a given *query function*\ . -*kim\_query* Usage Examples and Further Clarifications: -""""""""""""""""""""""""""""""""""""""""""""""""""""""" +*kim\_query* Usage Examples and Further Clarifications +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The data obtained by *kim\_query* commands can be used as part of the setup or analysis phases of LAMMPS simulations. Some examples are given below. @@ -473,10 +530,6 @@ Note that in *unit\_conversion\_mode* the results obtained from a For example, in the above script, the lattice command would need to be changed to: "lattice fcc ${a0}\*${\_u_distance}". -.. _split\_example: - - - **Define an equilibrium hcp crystal** @@ -494,12 +547,11 @@ changed to: "lattice fcc ${a0}\*${\_u_distance}". In this case the *kim\_query* returns two arguments (since the hexagonal close packed (hcp) structure has two independent lattice constants). -The default behavior of *kim\_query* returns the result as a string -with the values separated by commas. The optional keyword *split* -separates the result values into individual variables of the form -*prefix\_I*, where *prefix* is set to the the *kim\_query* *variable* argument -and *I* ranges from 1 to the number of returned values. The number and order of -the returned values is determined by the type of query performed. +The *formatarg* keyword "split" places the two values into +the variables *latconst\_1* and *latconst\_2*. (These variables are +created if they do not already exist.) For convenience the variables +*a0* and *c0* are created in order to make the remainder of the +input script more readable. **Define a crystal at finite temperature accounting for thermal expansion** @@ -560,6 +612,254 @@ ideal fcc cohesive energy of the atoms in the system obtained from from these programs are queried is tracked. No other information about the nature of the query or its source is recorded. +Accessing KIM Model Parameters from LAMMPS (*kim\_param*) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +All IMs are functional forms containing a set of +parameters. The values of these parameters are typically +selected to best reproduce a training set of quantum mechanical +calculations or available experimental data. For example, a +Lennard-Jones potential intended to model argon might have the values of +its two parameters, epsilon and sigma, fit to the +dimer dissociation energy or thermodynamic properties at a critical point +of the phase diagram. + +Normally a user employing an IM should not modify its parameters since, +as noted above, these are selected to reproduce material properties. +However, there are cases where accessing and modifying IM parameters +is desired, such as for assessing uncertainty, fitting an IM, +or working with an ensemble of IMs. As explained :ref:`above `, +IMs archived in OpenKIM are either Portable Models (PMs) or +Simulator Models (SMs). KIM PMs are complete independent implementations +of an IM, whereas KIM SMs are wrappers to an IM implemented within LAMMPS. +Two different mechanisms are provided for accessing IM parameters in these +two cases: + +* For a KIM PM, the *kim\_param* command can be used to *get* and *set* the values of the PM's parameters as explained below. +* For a KIM SM, the user should consult the documentation page for the specific IM and follow instructions there for how to modify its parameters (if possible). + +The *kim\_param get* and *kim\_param set* commands provide an interface +to access and change the parameters of a KIM PM that "publishes" its +parameters and makes them publicly available (see the +`KIM API documentation `_ +for details). + +.. note:: + + The *kim\_param get/set* commands must be preceded by *kim\_init*. + The *kim\_param set* command must additionally be preceded by a + *kim\_interactions* command (or alternatively by a *pair\_style kim* + and *pair\_coeff* commands). The *kim\_param set* command may be used wherever a *pair\_coeff* command may occur. + +The syntax for the *kim\_param* command is as follows: + + +.. parsed-literal:: + + kim_param get param_name index_range variable formatarg + kim_param set param_name index_range values + +Here, *param\_name* is the name of a KIM PM parameter (which is published +by the PM and available for access). The specific string used to identify +a parameter is defined by the PM. For example, for the +`Stillinger--Weber (SW) potential in OpenKIM `_, +the parameter names are *A, B, p, q, sigma, gamma, cutoff, lambda, costheta0*\ . + +.. note:: + + The list of all the parameters that a PM exposes for access/mutation are + automatically written to the lammps log file when *kim\_init* is called. + +Each published parameter of a KIM PM takes the form of an array of +numerical values. The array can contain one element for a single-valued +parameter, or a set of values. For example, the +`multispecies SW potential for the Zn-Cd-Hg-S-Se-Te system `_ +has the same parameter names as the +`single-species SW potential `_, +but each parameter array contains 21 entries that correspond to the parameter +values used for each pairwise combination of the model's six supported species +(this model does not have parameters specific to individual ternary +combinations of its supported species). + +The *index\_range* argument may either be an integer referring to +a specific element within the array associated with the parameter +specified by *param\_name*, or a pair of integers separated by a colon +that refer to a slice of this array. In both cases, one-based indexing is +used to refer to the entries of the array. + +The result of a *get* operation for a specific *index\_range* is stored in +one or more :doc:`LAMMPS string style variables ` as determined +by the optional *formatarg* argument :ref:`documented above. ` +If not specified, the default for *formatarg* is "explicit" for the +*kim\_param* command. + +For the case where the result is an array with multiple values +(i.e. *index\_range* contains a range), the optional "split" or "explicit" +*formatarg* keywords can be used to separate the results into multiple +variables; see the examples below. +Multiple parameters can be retrieved with a single call to *kim\_param get* +by repeating the argument list following *get*\ . + +For a *set* operation, the *values* argument contains the new value(s) +for the element(s) of the parameter specified by *index\_range*. For the case +where multiple values are being set, *values* contains a set of values +separated by spaces. Multiple parameters can be set with a single call to +*kim\_param set* by repeating the argument list following *set*\ . + +*kim\_param* Usage Examples and Further Clarifications +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Examples of getting and setting KIM PM parameters with further +clarifications are provided below. + +**Getting a scalar parameter** + + +.. parsed-literal:: + + kim_init SW_StillingerWeber_1985_Si__MO_405512056662_005 metal + ... + kim_param get A 1 VARA + +In this case, the value of the SW *A* parameter is retrieved and placed +in the LAMMPS variable *VARA*\ . The variable *VARA* can be used +in the remainder of the input script in the same manner as any other +LAMMPS variable. + +**Getting multiple scalar parameters with a single call** + + +.. parsed-literal:: + + kim_init SW_StillingerWeber_1985_Si__MO_405512056662_005 metal + ... + kim_param get A 1 VARA B 1 VARB + +This retrieves the *A* and *B* parameters of the SW potential and stores +them in the LAMMPS variables *VARA* and *VARB*\ . + +**Getting a range of values from a parameter** + +There are several options when getting a range of values from a parameter +determined by the *formatarg* argument. + + +.. parsed-literal:: + + kim_init SW_ZhouWardMartin_2013_CdTeZnSeHgS__MO_503261197030_002 metal + ... + kim_param get lambda 7:9 LAM_TeTe LAM_TeZn LAM_TeSe + +In this case, *formatarg* is not specified and therefore the default +"explicit" mode is used. (The behavior would be the same if the word +*explicit* were added after *LAM\_TeSe*.) Elements 7, 8 and 9 of parameter +lambda retrieved by the *get* operation are placed in the LAMMPS variables +*LAM\_TeTe*, *LAM\_TeZn* and *LAM\_TeSe*, respectively. + +.. note:: + + In the above example, elements 7--9 of the lambda parameter correspond + to Te-Te, Te-Zm and Te-Se interactions. This can be determined by visiting + the `model page for the specified potential `_ + and looking at its parameter file linked to at the bottom of the page + (file with .param ending) and consulting the README documentation + provided with the driver for the PM being used. A link to the driver + is provided at the top of the model page. + + +.. parsed-literal:: + + kim_init SW_ZhouWardMartin_2013_CdTeZnSeHgS__MO_503261197030_002 metal + ... + kim_param get lambda 15:17 LAMS list + variable LAM_VALUE index ${LAMS} + label loop_on_lambda + ... + ... do something with current value of lambda + ... + next LAM_VALUE + jump SELF loop_on_lambda + +In this case, the "list" mode of *formatarg* is used. +The result of the *get* operation is stored in the LAMMPS variable +*LAMS* as a string containing the three retrieved values separated +by spaces, e.g "1.0 2.0 3.0". This can be used in LAMMPS with an +*index* variable to access the values one at a time within a loop +as shown in the example. At each iteration of the loop *LAM\_VALUE* +contains the current value of lambda. + + +.. parsed-literal:: + + kim_init SW_ZhouWardMartin_2013_CdTeZnSeHgS__MO_503261197030_002 metal + ... + kim_param get lambda 15:17 LAM split + +In this case, the "split" mode of *formatarg* is used. +The three values retrieved by the *get* operation are stored in +the three LAMMPS variables *LAM\_15*, *LAM\_16* and *LAM\_17*. +The provided name "LAM" is used as prefix and the location in +the lambda array is appended to create the variable names. + +**Setting a scalar parameter** + + +.. parsed-literal:: + + kim_init SW_StillingerWeber_1985_Si__MO_405512056662_005 metal + ... + kim_interactions Si + kim_param set gamma 1 2.6 + +Here, the SW potential's gamma parameter is set to 2.6. Note that the *get* +and *set* commands work together, so that a *get* following a *set* +operation will return the new value that was set. For example: + + +.. parsed-literal:: + + ... + kim_interactions Si + kim_param get gamma 1 ORIG_GAMMA + kim_param set gamma 1 2.6 + kim_param get gamma 1 NEW_GAMMA + ... + print "original gamma = ${ORIG_GAMMA}, new gamma = ${NEW_GAMMA}" + +Here, *ORIG\_GAMMA* will contain the original gamma value for the SW +potential, while *NEW\_GAMMA* will contain the value 2.6. + +**Setting multiple scalar parameters with a single call** + + +.. parsed-literal:: + + kim_init SW_ZhouWardMartin_2013_CdTeZnSeHgS__MO_503261197030_002 metal + ... + kim_interactions Cd Te + variable VARG equal 2.6 + variable VARS equal 2.0951 + kim_param set gamma 1 ${VARG} sigma 3 ${VARS} + +In this case, the first element of the *gamma* parameter and +third element of the *sigma* parameter are set to 2.6 and 2.0951, +respectively. This example also shows how LAMMPS variables can +be used when setting parameters. + +**Setting a range of values of a parameter** + + +.. parsed-literal:: + + kim_init SW_ZhouWardMartin_2013_CdTeZnSeHgS__MO_503261197030_002 metal + ... + kim_interactions Cd Te Zn Se Hg S + kim_param set sigma 2:6 2.35214 2.23869 2.04516 2.43269 1.80415 + +In this case, elements 2 through 6 of the parameter *sigma* +are set to the values 2.35214, 2.23869, 2.04516, 2.43269 and 1.80415 in +order. + Citation of OpenKIM IMs ----------------------- From eaef8089a1f3b714dca4d46513446f5ac9af2079 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 6 Nov 2019 16:53:43 -0500 Subject: [PATCH 396/418] Add LAMMPSLexer for LAMMPS code-blocks in docs --- doc/src/Commands_input.rst | 4 +- doc/src/Commands_parse.rst | 14 ++- doc/txt/Commands_input.txt | 60 ----------- doc/txt/Commands_parse.txt | 136 ------------------------- doc/utils/sphinx-config/LAMMPSLexer.py | 57 +++++++++++ doc/utils/sphinx-config/conf.py | 6 ++ 6 files changed, 74 insertions(+), 203 deletions(-) delete mode 100644 doc/txt/Commands_input.txt delete mode 100644 doc/txt/Commands_parse.txt create mode 100644 doc/utils/sphinx-config/LAMMPSLexer.py diff --git a/doc/src/Commands_input.rst b/doc/src/Commands_input.rst index 39b11d2639..ce93f65d81 100644 --- a/doc/src/Commands_input.rst +++ b/doc/src/Commands_input.rst @@ -17,7 +17,7 @@ one line at a time and each command takes effect when it is read. Thus this sequence of commands: -.. parsed-literal:: +.. code-block:: LAMMPS timestep 0.5 run 100 @@ -26,7 +26,7 @@ Thus this sequence of commands: does something different than this sequence: -.. parsed-literal:: +.. code-block:: LAMMPS run 100 timestep 0.5 diff --git a/doc/src/Commands_parse.rst b/doc/src/Commands_parse.rst index c79dcab4e1..91a11089a8 100644 --- a/doc/src/Commands_parse.rst +++ b/doc/src/Commands_parse.rst @@ -22,6 +22,10 @@ comment after a trailing "&" character will prevent the command from continuing on the next line. Also note that for multi-line commands a single leading "#" will comment out the entire command. +.. code-block:: LAMMPS + + # this is a comment + (3) The line is searched repeatedly for $ characters, which indicate variables that are replaced with a text string. See an exception in (6). @@ -47,7 +51,7 @@ to use numeric formulas in an input script without having to assign them to variable names. For example, these 3 input script lines: -.. parsed-literal:: +.. code-block:: LAMMPS variable X equal (xlo+xhi)/2+sqrt(v_area) region 1 block $X 2 INF INF EDGE EDGE @@ -56,7 +60,7 @@ them to variable names. For example, these 3 input script lines: can be replaced by -.. parsed-literal:: +.. code-block:: LAMMPS region 1 block $((xlo+xhi)/2+sqrt(v_area)) 2 INF INF EDGE EDGE @@ -72,7 +76,7 @@ specified a high-precision "%.20g" is used as the default. This can be useful for formatting print output to a desired precision: -.. parsed-literal:: +.. code-block:: LAMMPS print "Final energy per atom: $(pe/atoms:%10.3f) eV/atom" @@ -81,7 +85,7 @@ contain nested $ characters for other variables to substitute for. Thus you cannot do this: -.. parsed-literal:: +.. code-block:: LAMMPS variable a equal 2 variable b2 equal 4 @@ -113,7 +117,7 @@ can be enclosed in triple quotes, in which case "&" characters are not needed. For example: -.. parsed-literal:: +.. code-block:: LAMMPS print "Volume = $v" print 'Volume = $v' diff --git a/doc/txt/Commands_input.txt b/doc/txt/Commands_input.txt deleted file mode 100644 index 8b3dda741b..0000000000 --- a/doc/txt/Commands_input.txt +++ /dev/null @@ -1,60 +0,0 @@ -"Higher level section"_Commands.html - "LAMMPS WWW Site"_lws - "LAMMPS -Documentation"_ld - "LAMMPS Commands"_lc :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Commands_all.html) - -:line - -LAMMPS input scripts :h3 - -LAMMPS executes by reading commands from a input script (text file), -one line at a time. When the input script ends, LAMMPS exits. Each -command causes LAMMPS to take some action. It may set an internal -variable, read in a file, or run a simulation. Most commands have -default settings, which means you only need to use the command if you -wish to change the default. - -In many cases, the ordering of commands in an input script is not -important. However the following rules apply: - -(1) LAMMPS does not read your entire input script and then perform a -simulation with all the settings. Rather, the input script is read -one line at a time and each command takes effect when it is read. -Thus this sequence of commands: - -timestep 0.5 -run 100 -run 100 :pre - -does something different than this sequence: - -run 100 -timestep 0.5 -run 100 :pre - -In the first case, the specified timestep (0.5 fs) is used for two -simulations of 100 timesteps each. In the 2nd case, the default -timestep (1.0 fs) is used for the 1st 100 step simulation and a 0.5 fs -timestep is used for the 2nd one. - -(2) Some commands are only valid when they follow other commands. For -example you cannot set the temperature of a group of atoms until atoms -have been defined and a group command is used to define which atoms -belong to the group. - -(3) Sometimes command B will use values that can be set by command A. -This means command A must precede command B in the input script if it -is to have the desired effect. For example, the -"read_data"_read_data.html command initializes the system by setting -up the simulation box and assigning atoms to processors. If default -values are not desired, the "processors"_processors.html and -"boundary"_boundary.html commands need to be used before read_data to -tell LAMMPS how to map processors to the simulation box. - -Many input script errors are detected by LAMMPS and an ERROR or -WARNING message is printed. The "Errors"_Errors.html doc page gives -more information on what errors mean. The documentation for each -command lists restrictions on how the command can be used. - diff --git a/doc/txt/Commands_parse.txt b/doc/txt/Commands_parse.txt deleted file mode 100644 index 13a4c2699d..0000000000 --- a/doc/txt/Commands_parse.txt +++ /dev/null @@ -1,136 +0,0 @@ -"Higher level section"_Commands.html - "LAMMPS WWW Site"_lws - "LAMMPS -Documentation"_ld - "LAMMPS Commands"_lc :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Commands_all.html) - -:line - -Parsing rules for input scripts :h3 - -Each non-blank line in the input script is treated as a command. -LAMMPS commands are case sensitive. Command names are lower-case, as -are specified command arguments. Upper case letters may be used in -file names or user-chosen ID strings. - -Here are 6 rules for how each line in the input script is parsed by -LAMMPS: - -(1) If the last printable character on the line is a "&" character, -the command is assumed to continue on the next line. The next line is -concatenated to the previous line by removing the "&" character and -line break. This allows long commands to be continued across two or -more lines. See the discussion of triple quotes in (6) for how to -continue a command across multiple line without using "&" characters. - -(2) All characters from the first "#" character onward are treated as -comment and discarded. See an exception in (6). Note that a -comment after a trailing "&" character will prevent the command from -continuing on the next line. Also note that for multi-line commands a -single leading "#" will comment out the entire command. - -(3) The line is searched repeatedly for $ characters, which indicate -variables that are replaced with a text string. See an exception in -(6). - -If the $ is followed by curly brackets, then the variable name is the -text inside the curly brackets. If no curly brackets follow the $, -then the variable name is the single character immediately following -the $. Thus $\{myTemp\} and $x refer to variable names "myTemp" and -"x". - -How the variable is converted to a text string depends on what style -of variable it is; see the "variable"_variable.html doc page for details. -It can be a variable that stores multiple text strings, and return one -of them. The returned text string can be multiple "words" (space -separated) which will then be interpreted as multiple arguments in the -input command. The variable can also store a numeric formula which -will be evaluated and its numeric result returned as a string. - -As a special case, if the $ is followed by parenthesis, then the text -inside the parenthesis is treated as an "immediate" variable and -evaluated as an "equal-style variable"_variable.html. This is a way -to use numeric formulas in an input script without having to assign -them to variable names. For example, these 3 input script lines: - -variable X equal (xlo+xhi)/2+sqrt(v_area) -region 1 block $X 2 INF INF EDGE EDGE -variable X delete :pre - -can be replaced by - -region 1 block $((xlo+xhi)/2+sqrt(v_area)) 2 INF INF EDGE EDGE :pre - -so that you do not have to define (or discard) a temporary variable X. - -Additionally, the "immediate" variable expression may be followed by a -colon, followed by a C-style format string, e.g. ":%f" or ":%.10g". -The format string must be appropriate for a double-precision -floating-point value. The format string is used to output the result -of the variable expression evaluation. If a format string is not -specified a high-precision "%.20g" is used as the default. - -This can be useful for formatting print output to a desired precision: - -print "Final energy per atom: $(pe/atoms:%10.3f) eV/atom" :pre - -Note that neither the curly-bracket or immediate form of variables can -contain nested $ characters for other variables to substitute for. -Thus you cannot do this: - -variable a equal 2 -variable b2 equal 4 -print "B2 = $\{b$a\}" :pre - -Nor can you specify this $($x-1.0) for an immediate variable, but -you could use $(v_x-1.0), since the latter is valid syntax for an -"equal-style variable"_variable.html. - -See the "variable"_variable.html command for more details of how -strings are assigned to variables and evaluated, and how they can be -used in input script commands. - -(4) The line is broken into "words" separated by white-space (tabs, -spaces). Note that words can thus contain letters, digits, -underscores, or punctuation characters. - -(5) The first word is the command name. All successive words in the -line are arguments. - -(6) If you want text with spaces to be treated as a single argument, -it can be enclosed in either single or double or triple quotes. A -long single argument enclosed in single or double quotes can span -multiple lines if the "&" character is used, as described above. When -the lines are concatenated together (and the "&" characters and line -breaks removed), the text will become a single line. If you want -multiple lines of an argument to retain their line breaks, the text -can be enclosed in triple quotes, in which case "&" characters are not -needed. For example: - -print "Volume = $v" -print 'Volume = $v' -if "$\{steps\} > 1000" then quit -variable a string "red green blue & - purple orange cyan" -print """ -System volume = $v -System temperature = $t -""" :pre - -In each case, the single, double, or triple quotes are removed when -the single argument they enclose is stored internally. - -See the "dump modify format"_dump_modify.html, "print"_print.html, -"if"_if.html, and "python"_python.html commands for examples. - -A "#" or "$" character that is between quotes will not be treated as a -comment indicator in (2) or substituted for as a variable in (3). - -NOTE: If the argument is itself a command that requires a quoted -argument (e.g. using a "print"_print.html command as part of an -"if"_if.html or "run every"_run.html command), then single, double, or -triple quotes can be nested in the usual manner. See the doc pages -for those commands for examples. Only one of level of nesting is -allowed, but that should be sufficient for most use cases. - diff --git a/doc/utils/sphinx-config/LAMMPSLexer.py b/doc/utils/sphinx-config/LAMMPSLexer.py new file mode 100644 index 0000000000..6436be410d --- /dev/null +++ b/doc/utils/sphinx-config/LAMMPSLexer.py @@ -0,0 +1,57 @@ +from pygments.lexer import RegexLexer, words +from pygments.token import * + +LAMMPS_COMMANDS = ("angle_coeff", "angle_style", "atom_modify", "atom_style", +"balance", "bond_coeff", "bond_style", "bond_write", "boundary", "box", +"change_box", "clear", "comm_modify", "comm_style", "compute", +"compute_modify", "create_atoms", "create_bonds", "create_box", "delete_atoms", +"delete_bonds", "dielectric", "dihedral_coeff", "dihedral_style", "dimension", +"displace_atoms", "dump", "dump_modify", "dynamical_matrix", "echo", "fix", +"fix_modify", "group", "group2ndx", "hyper", "if", "improper_coeff", +"improper_style", "include", "info", "jump", "kim_init", "kim_interactions", +"kim_param", "kim_query", "kspace_modify", "kspace_style", "label", "lattice", +"log", "mass", "message", "minimize", "min_modify", "min_style", "molecule", +"ndx2group", "neb", "neb/spin", "neighbor", "neigh_modify", "newton", "next", +"package", "pair_coeff", "pair_modify", "pair_style", "pair_write", +"partition", "prd", "print", "processors", "python", "quit", "read_data", +"read_dump", "read_restart", "region", "replicate", "rerun", "reset_ids", +"reset_timestep", "restart", "run", "run_style", "server", "set", "shell", +"special_bonds", "suffix", "tad", "temper", "temper/grem", "temper/npt", +"thermo", "thermo_modify", "thermo_style", "then", "third_order", "timer", "timestep", +"uncompute", "undump", "unfix", "units", "variable", "velocity", "write_coeff", +"write_data", "write_dump", "write_restart") + +class LAMMPSLexer(RegexLexer): + name = 'LAMMPS' + tokens = { + 'root': [ + (words(LAMMPS_COMMANDS, suffix=r'\b', prefix=r'^'), Keyword), + (r'#.*?\n', Comment), + ('"', String, 'string'), + ('\'', String, 'single_quote_string'), + (r'[0-9]+(\.[0-9]+)?([eE]\-?[0-9]+)?', Number), + ('\$?\(', Name.Variable, 'expression'), + ('\$\{', Name.Variable, 'variable'), + (r'[\w_\.\[\]]+', Name), + (r'\$[\w_]+', Name.Variable), + (r'\s+', Whitespace), + (r'[\+\-\*\/&=<>]', Operator), + ], + 'variable' : [ + ('[^\}]+', Name.Variable), + ('\}', Name.Variable, '#pop'), + ], + 'string' : [ + ('[^"]+', String), + ('"', String, '#pop'), + ], + 'single_quote_string' : [ + ('[^\']+', String), + ('\'', String, '#pop'), + ], + 'expression' : [ + ('[^\(\)]+', Name.Variable), + ('\(', Name.Variable, 'expression'), + ('\)', Name.Variable, '#pop'), + ] + } diff --git a/doc/utils/sphinx-config/conf.py b/doc/utils/sphinx-config/conf.py index 727a5f7612..70a96e1614 100644 --- a/doc/utils/sphinx-config/conf.py +++ b/doc/utils/sphinx-config/conf.py @@ -317,3 +317,9 @@ if spelling_spec: spelling_lang='en_US' spelling_word_list_filename='false_positives.txt' + +sys.path.append(os.path.join(os.path.dirname(__file__), '.')) +import LAMMPSLexer +from sphinx.highlighting import lexers + +lexers['LAMMPS'] = LAMMPSLexer.LAMMPSLexer(startinline=True) From 3f10c4fcdc378c07349529fde661467694e4d84b Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 6 Nov 2019 23:33:14 -0500 Subject: [PATCH 397/418] Update Manual_build.rst and remove Manual_build.txt --- doc/src/Manual_build.rst | 58 +++++------------ doc/txt/Manual_build.txt | 133 --------------------------------------- 2 files changed, 17 insertions(+), 174 deletions(-) delete mode 100644 doc/txt/Manual_build.txt diff --git a/doc/src/Manual_build.rst b/doc/src/Manual_build.rst index 2580ee6b93..a8bc093812 100644 --- a/doc/src/Manual_build.rst +++ b/doc/src/Manual_build.rst @@ -20,28 +20,20 @@ directories and files should be included. If you downloaded LAMMPS from the public SVN or Git repositories, then the HTML and PDF files are not included. Instead you need to create -them, in one of three ways: +them, in one of two ways: -(a) You can "fetch" the current HTML and PDF files from the LAMMPS web -site. Just type "make fetch". This should create a html\_www dir and -Manual\_www.pdf/Developer\_www.pdf files. Note that if new LAMMPS -features have been added more recently than the date of your version, -the fetched documentation will include those changes (but your source -code will not, unless you update your local repository). - -(b) You can build the HTML and PDF files yourself, by typing "make -html" followed by "make pdf". Note that the PDF make requires the -HTML files already exist. This requires various tools including -Sphinx, which the build process will attempt to download and install -on your system, if not already available. See more details below. - -(c) You can generate an older, simpler, less-fancy style of HTML -documentation by typing "make old". This will create an "old" -directory. This can be useful if (b) does not work on your box for -some reason, or you want to quickly view the HTML version of a doc -page you have created or edited yourself within the src directory. -E.g. if you are planning to submit a new feature to LAMMPS. +a. You can "fetch" the current HTML and PDF files from the LAMMPS web site. + Just type "make fetch". This should create a html\_www dir and + Manual\_www.pdf/Developer\_www.pdf files. Note that if new LAMMPS features + have been added more recently than the date of your version, the fetched + documentation will include those changes (but your source code will not, unless + you update your local repository). +b. You can build the HTML and PDF files yourself, by typing "make + html" followed by "make pdf". Note that the PDF make requires the + HTML files already exist. This requires various tools including + Sphinx, which the build process will attempt to download and install + on your system, if not already available. See more details below. ---------- @@ -50,14 +42,13 @@ The generation of all documentation is managed by the Makefile in the doc dir. -.. parsed-literal:: +.. code-block:: bash Documentation Build Options: make html # generate HTML in html dir using Sphinx make pdf # generate 2 PDF files (Manual.pdf,Developer.pdf) # in doc dir via htmldoc and pdflatex - make old # generate old-style HTML pages in old dir via txt2html make fetch # fetch HTML doc pages and 2 PDF files from web site # as a tarball and unpack into html dir and 2 PDFs make epub # generate LAMMPS.epub in ePUB format using Sphinx @@ -82,7 +73,7 @@ Ubuntu ------ -.. parsed-literal:: +.. code-block:: bash sudo apt-get install python-virtualenv @@ -90,7 +81,7 @@ Fedora (up to version 21) and Red Hat Enterprise Linux or CentOS (up to version ------------------------------------------------------------------------------------ -.. parsed-literal:: +.. code-block:: bash sudo yum install python3-virtualenv @@ -98,7 +89,7 @@ Fedora (since version 22) ------------------------- -.. parsed-literal:: +.. code-block:: bash sudo dnf install python3-virtualenv @@ -119,7 +110,7 @@ virtualenv Once Python 3 is installed, open a Terminal and type -.. parsed-literal:: +.. code-block:: bash pip3 install virtualenv @@ -129,21 +120,6 @@ This will install virtualenv from the Python Package Index. ---------- -Installing prerequisites for PDF build - -Building the PDF manual requires a working C++ compiler (to -compile the txt2html tool and a working installation of -`HTMLDOC `_ -HTMLDOC has its own list of prerequisites, but in most cases -you can install a binary package of it either through your -Linux package manager or MacOS (dmg) and Windows installer -(msi) packages from its -`GitHub releases page at `_ - - ----------- - - Installing prerequisites for epub build ======================================= diff --git a/doc/txt/Manual_build.txt b/doc/txt/Manual_build.txt deleted file mode 100644 index e9df0d2cfc..0000000000 --- a/doc/txt/Manual_build.txt +++ /dev/null @@ -1,133 +0,0 @@ -"Previous Section"_Errors.html - "LAMMPS WWW Site"_lws - -"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next -Section"_Manual.html :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Commands_all.html) - -:line - -Building the LAMMPS manual :h2 - -Depending on how you obtained LAMMPS, the doc directory has 2 or 3 -sub-directories and optionally 2 PDF files and 2 e-book format files: - -src # content files for LAMMPS documentation -html # HTML version of the LAMMPS manual (see html/Manual.html) -tools # tools and settings for building the documentation -Manual.pdf # large PDF version of entire manual -Developer.pdf # small PDF with info about how LAMMPS is structured -LAMMPS.epub # Manual in ePUB e-book format -LAMMPS.mobi # Manual in MOBI e-book format :pre - -If you downloaded LAMMPS as a tarball from the web site, all these -directories and files should be included. - -If you downloaded LAMMPS from the public SVN or Git repositories, then -the HTML and PDF files are not included. Instead you need to create -them, in one of three ways: - -(a) You can "fetch" the current HTML and PDF files from the LAMMPS web -site. Just type "make fetch". This should create a html_www dir and -Manual_www.pdf/Developer_www.pdf files. Note that if new LAMMPS -features have been added more recently than the date of your version, -the fetched documentation will include those changes (but your source -code will not, unless you update your local repository). - -(b) You can build the HTML and PDF files yourself, by typing "make -html" followed by "make pdf". Note that the PDF make requires the -HTML files already exist. This requires various tools including -Sphinx, which the build process will attempt to download and install -on your system, if not already available. See more details below. - -(c) You can generate an older, simpler, less-fancy style of HTML -documentation by typing "make old". This will create an "old" -directory. This can be useful if (b) does not work on your box for -some reason, or you want to quickly view the HTML version of a doc -page you have created or edited yourself within the src directory. -E.g. if you are planning to submit a new feature to LAMMPS. - -:line - -The generation of all documentation is managed by the Makefile in -the doc dir. - -Documentation Build Options: :pre - -make html # generate HTML in html dir using Sphinx -make pdf # generate 2 PDF files (Manual.pdf,Developer.pdf) - # in doc dir via htmldoc and pdflatex -make old # generate old-style HTML pages in old dir via txt2html -make fetch # fetch HTML doc pages and 2 PDF files from web site - # as a tarball and unpack into html dir and 2 PDFs -make epub # generate LAMMPS.epub in ePUB format using Sphinx -make mobi # generate LAMMPS.mobi in MOBI format using ebook-convert -make clean # remove intermediate RST files created by HTML build -make clean-all # remove entire build folder and any cached data :pre -make anchor_check # check for duplicate anchor labels -make spelling # spell-check the manual - -:line - -Installing prerequisites for HTML build :h3 - -To run the HTML documentation build toolchain, Python 3 and virtualenv -have to be installed. Here are instructions for common setups: - -Ubuntu :h4 - -sudo apt-get install python-virtualenv :pre - -Fedora (up to version 21) and Red Hat Enterprise Linux or CentOS (up to version 7.x) :h4 - -sudo yum install python3-virtualenv :pre - -Fedora (since version 22) :h4 - -sudo dnf install python3-virtualenv :pre - -MacOS X :h4 - -Python 3 :h5 - -Download the latest Python 3 MacOS X package from -"https://www.python.org"_https://www.python.org -and install it. This will install both Python 3 -and pip3. - -virtualenv :h5 - -Once Python 3 is installed, open a Terminal and type - -pip3 install virtualenv :pre - -This will install virtualenv from the Python Package Index. - -:line - -Installing prerequisites for PDF build - -Building the PDF manual requires a working C++ compiler (to -compile the txt2html tool and a working installation of -"HTMLDOC"_https://www.msweet.org/htmldoc/ -HTMLDOC has its own list of prerequisites, but in most cases -you can install a binary package of it either through your -Linux package manager or MacOS (dmg) and Windows installer -(msi) packages from its -"GitHub releases page at"_https://github.com/michaelrsweet/htmldoc/releases - -:line - -Installing prerequisites for epub build :h3 - -ePUB :h4 - -Same as for HTML. This uses the same tools and configuration -files as the HTML tree. - -For converting the generated ePUB file to a MOBI format file -(for e-book readers like Kindle, that cannot read ePUB), you -also need to have the 'ebook-convert' tool from the "calibre" -software installed. "http://calibre-ebook.com/"_http://calibre-ebook.com/ -You first create the ePUB file and then convert it with 'make mobi' From d2da55f5e3c17b876c97e67a9a1775532d01ac18 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 6 Nov 2019 23:52:04 -0500 Subject: [PATCH 398/418] Update Howto_pylammps.rst and remove Howto_pylammps.txt --- doc/src/Howto_pylammps.rst | 58 ++--- doc/txt/Howto_pylammps.txt | 481 ------------------------------------- 2 files changed, 29 insertions(+), 510 deletions(-) delete mode 100644 doc/txt/Howto_pylammps.txt diff --git a/doc/src/Howto_pylammps.rst b/doc/src/Howto_pylammps.rst index 98c14c547d..64f1cc6036 100644 --- a/doc/src/Howto_pylammps.rst +++ b/doc/src/Howto_pylammps.rst @@ -57,7 +57,7 @@ output support enabled. Step 1a: For the CMake based build system, the steps are: -.. parsed-literal:: +.. code-block:: bash mkdir $LAMMPS_DIR/build-shared cd $LAMMPS_DIR/build-shared @@ -69,7 +69,7 @@ Step 1a: For the CMake based build system, the steps are: Step 1b: For the legacy, make based build system, the steps are: -.. parsed-literal:: +.. code-block:: bash cd $LAMMPS_DIR/src @@ -86,7 +86,7 @@ PyLammps is part of the lammps Python package. To install it simply install that package into your current Python installation with: -.. parsed-literal:: +.. code-block:: bash make install-python @@ -111,7 +111,7 @@ Benefits of using a virtualenv **Prerequisite (e.g. on Ubuntu)** -.. parsed-literal:: +.. code-block:: bash apt-get install python-virtualenv @@ -119,7 +119,7 @@ Creating a virtualenv with lammps installed """"""""""""""""""""""""""""""""""""""""""" -.. parsed-literal:: +.. code-block:: bash # create virtualenv named 'testing' virtualenv $HOME/python/testing @@ -133,7 +133,7 @@ need to re-run CMake to update the location of the python executable to the location in the virtual environment with: -.. parsed-literal:: +.. code-block:: bash cmake . -DPYTHON_EXECUTABLE=$(which python) @@ -155,7 +155,7 @@ To create a PyLammps object you need to first import the class from the lammps module. By using the default constructor, a new *lammps* instance is created. -.. parsed-literal:: +.. code-block:: Python from lammps import PyLammps L = PyLammps() @@ -163,7 +163,7 @@ module. By using the default constructor, a new *lammps* instance is created. You can also initialize PyLammps on top of this existing *lammps* object: -.. parsed-literal:: +.. code-block:: Python from lammps import lammps, PyLammps lmp = lammps() @@ -178,7 +178,7 @@ the command method of the lammps object instance. For instance, let's take the following LAMMPS command: -.. parsed-literal:: +.. code-block:: LAMMPS region box block 0 10 0 5 -0.5 0.5 @@ -186,7 +186,7 @@ In the original interface this command can be executed with the following Python code if *L* was a lammps instance: -.. parsed-literal:: +.. code-block:: Python L.command("region box block 0 10 0 5 -0.5 0.5") @@ -194,7 +194,7 @@ With the PyLammps interface, any command can be split up into arbitrary parts separated by white-space, passed as individual arguments to a region method. -.. parsed-literal:: +.. code-block:: Python L.region("box block", 0, 10, 0, 5, -0.5, 0.5) @@ -207,7 +207,7 @@ parameterization. In the original interface parameterization needed to be done manually by creating formatted strings. -.. parsed-literal:: +.. code-block:: Python L.command("region box block %f %f %f %f %f %f" % (xlo, xhi, ylo, yhi, zlo, zhi)) @@ -215,7 +215,7 @@ In contrast, methods of PyLammps accept parameters directly and will convert them automatically to a final command string. -.. parsed-literal:: +.. code-block:: Python L.region("box block", xlo, xhi, ylo, yhi, zlo, zhi) @@ -270,7 +270,7 @@ LAMMPS variables can be both defined and accessed via the PyLammps interface. To define a variable you can use the :doc:`variable ` command: -.. parsed-literal:: +.. code-block:: Python L.variable("a index 2") @@ -280,7 +280,7 @@ you can access an individual variable by retrieving a variable object from the L.variables dictionary by name -.. parsed-literal:: +.. code-block:: Python a = L.variables['a'] @@ -288,7 +288,7 @@ The variable value can then be easily read and written by accessing the value property of this object. -.. parsed-literal:: +.. code-block:: Python print(a.value) a.value = 4 @@ -301,7 +301,7 @@ passed string parameter can be any expression containing global thermo values, variables, compute or fix data. -.. parsed-literal:: +.. code-block:: Python result = L.eval("ke") # kinetic energy result = L.eval("pe") # potential energy @@ -316,7 +316,7 @@ Each element of this list is an object which exposes its properties (id, type, position, velocity, force, etc.). -.. parsed-literal:: +.. code-block:: Python # access first atom L.atoms[0].id @@ -330,7 +330,7 @@ position, velocity, force, etc.). Some properties can also be used to set: -.. parsed-literal:: +.. code-block:: Python # set position in 2D simulation L.atoms[0].position = (1.0, 0.0) @@ -348,7 +348,7 @@ The first element is the output of the first run, the second element that of the second run. -.. parsed-literal:: +.. code-block:: Python L.run(1000) L.runs[0] # data of first 1000 time steps @@ -360,7 +360,7 @@ Each run contains a dictionary of all trajectories. Each trajectory is accessible through its thermo name: -.. parsed-literal:: +.. code-block:: Python L.runs[0].step # list of time steps in first run L.runs[0].ke # list of kinetic energy values in first run @@ -370,7 +370,7 @@ Together with matplotlib plotting data out of LAMMPS becomes simple: import matplotlib.plot as plt -.. parsed-literal:: +.. code-block:: Python steps = L.runs[0].step ke = L.runs[0].ke @@ -408,7 +408,7 @@ To launch an instance of Jupyter simply run the following command inside your Python environment (this assumes you followed the Quick Start instructions): -.. parsed-literal:: +.. code-block:: bash jupyter notebook @@ -431,7 +431,7 @@ them using a datafile. Then one of the atoms is rotated along the central axis b setting its position from Python, which changes the dihedral angle. -.. parsed-literal:: +.. code-block:: Python phi = [d \* math.pi / 180 for d in range(360)] @@ -465,7 +465,7 @@ Initially, a 2D system is created in a state with minimal energy. It is then disordered by moving each atom by a random delta. -.. parsed-literal:: +.. code-block:: Python random.seed(27848) deltaperturb = 0.2 @@ -485,7 +485,7 @@ Finally, the Monte Carlo algorithm is implemented in Python. It continuously moves random atoms by a random delta and only accepts certain moves. -.. parsed-literal:: +.. code-block:: Python estart = L.eval("pe") elast = estart @@ -538,7 +538,7 @@ Using PyLammps and mpi4py (Experimental) PyLammps can be run in parallel using mpi4py. This python package can be installed using -.. parsed-literal:: +.. code-block:: bash pip install mpi4py @@ -546,7 +546,7 @@ The following is a short example which reads in an existing LAMMPS input file an executes it in parallel. You can find in.melt in the examples/melt folder. -.. parsed-literal:: +.. code-block:: Python from mpi4py import MPI from lammps import PyLammps @@ -563,7 +563,7 @@ To run this script (melt.py) in parallel using 4 MPI processes we invoke the following mpirun command: -.. parsed-literal:: +.. code-block:: bash mpirun -np 4 python melt.py diff --git a/doc/txt/Howto_pylammps.txt b/doc/txt/Howto_pylammps.txt deleted file mode 100644 index 54f17d912a..0000000000 --- a/doc/txt/Howto_pylammps.txt +++ /dev/null @@ -1,481 +0,0 @@ -"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Commands_all.html) - -:line - -PyLammps Tutorial :h3 - - - -Overview :h4 - -PyLammps is a Python wrapper class which can be created on its own or -use an existing lammps Python object. It creates a simpler, -Python-like interface to common LAMMPS functionality, in contrast to -the lammps.py wrapper on the C-style LAMMPS library interface which is -written using Python ctypes. The lammps.py wrapper is discussed on -the "Python library"_Python_library.html doc page. - -Unlike the flat ctypes interface, PyLammps exposes a discoverable API. -It no longer requires knowledge of the underlying C++ code -implementation. Finally, the IPyLammps wrapper builds on top of -PyLammps and adds some additional features for IPython integration -into IPython notebooks, e.g. for embedded visualization output from -dump/image. - -Comparison of lammps and PyLammps interfaces :h5 - -lammps.lammps :h6 - -uses C-Types -direct memory access to native C++ data -provides functions to send and receive data to LAMMPS -requires knowledge of how LAMMPS internally works (C pointers, etc) :ul - -lammps.PyLammps :h6 - -higher-level abstraction built on top of original C-Types interface -manipulation of Python objects -communication with LAMMPS is hidden from API user -shorter, more concise Python -better IPython integration, designed for quick prototyping :ul - -Quick Start :h4 - -System-wide Installation :h5 - -Step 1: Building LAMMPS as a shared library :h6 - -To use LAMMPS inside of Python it has to be compiled as shared library. This -library is then loaded by the Python interface. In this example we enable the -MOLECULE package and compile LAMMPS with C++ exceptions, PNG, JPEG and FFMPEG -output support enabled. - -Step 1a: For the CMake based build system, the steps are: - -mkdir $LAMMPS_DIR/build-shared -cd $LAMMPS_DIR/build-shared :pre - -# MPI, PNG, Jpeg, FFMPEG are auto-detected -cmake ../cmake -DPKG_MOLECULE=yes -DLAMMPS_EXCEPTIONS=yes -DBUILD_LIB=yes -DBUILD_SHARED_LIBS=yes -make :pre - -Step 1b: For the legacy, make based build system, the steps are: - -cd $LAMMPS_DIR/src :pre - -# add packages if necessary -make yes-MOLECULE :pre - -# compile shared library using Makefile -make mpi mode=shlib LMP_INC="-DLAMMPS_PNG -DLAMMPS_JPEG -DLAMMPS_FFMPEG -DLAMMPS_EXCEPTIONS" JPG_LIB="-lpng -ljpeg" :pre - -Step 2: Installing the LAMMPS Python package :h6 - -PyLammps is part of the lammps Python package. To install it simply install -that package into your current Python installation with: - -make install-python :pre - -NOTE: Recompiling the shared library requires re-installing the Python package - - -Installation inside of a virtualenv :h5 - -You can use virtualenv to create a custom Python environment specifically tuned -for your workflow. - -Benefits of using a virtualenv :h6 - -isolation of your system Python installation from your development installation -installation can happen in your user directory without root access (useful for HPC clusters) -installing packages through pip allows you to get newer versions of packages than e.g., through apt-get or yum package managers (and without root access) -you can even install specific old versions of a package if necessary :ul - -[Prerequisite (e.g. on Ubuntu)] - -apt-get install python-virtualenv :pre - -Creating a virtualenv with lammps installed :h6 - -# create virtualenv named 'testing' -virtualenv $HOME/python/testing :pre - -# activate 'testing' environment -source $HOME/python/testing/bin/activate :pre - -Now configure and compile the LAMMPS shared library as outlined above. -When using CMake and the shared library has already been build, you -need to re-run CMake to update the location of the python executable -to the location in the virtual environment with: - -cmake . -DPYTHON_EXECUTABLE=$(which python) :pre - -# install LAMMPS package in virtualenv -(testing) make install-python :pre - -# install other useful packages -(testing) pip install matplotlib jupyter mpi4py :pre - -... :pre - -# return to original shell -(testing) deactivate :pre - - -Creating a new instance of PyLammps :h4 - -To create a PyLammps object you need to first import the class from the lammps -module. By using the default constructor, a new {lammps} instance is created. - -from lammps import PyLammps -L = PyLammps() :pre - -You can also initialize PyLammps on top of this existing {lammps} object: - -from lammps import lammps, PyLammps -lmp = lammps() -L = PyLammps(ptr=lmp) :pre - -Commands :h4 - -Sending a LAMMPS command with the existing library interfaces is done using -the command method of the lammps object instance. - -For instance, let's take the following LAMMPS command: - -region box block 0 10 0 5 -0.5 0.5 :pre - -In the original interface this command can be executed with the following -Python code if {L} was a lammps instance: - -L.command("region box block 0 10 0 5 -0.5 0.5") :pre - -With the PyLammps interface, any command can be split up into arbitrary parts -separated by white-space, passed as individual arguments to a region method. - -L.region("box block", 0, 10, 0, 5, -0.5, 0.5) :pre - -Note that each parameter is set as Python literal floating-point number. In the -PyLammps interface, each command takes an arbitrary parameter list and transparently -merges it to a single command string, separating individual parameters by white-space. - -The benefit of this approach is avoiding redundant command calls and easier -parameterization. In the original interface parameterization needed to be done -manually by creating formatted strings. - -L.command("region box block %f %f %f %f %f %f" % (xlo, xhi, ylo, yhi, zlo, zhi)) :pre - -In contrast, methods of PyLammps accept parameters directly and will convert -them automatically to a final command string. - -L.region("box block", xlo, xhi, ylo, yhi, zlo, zhi) :pre - -System state :h4 - -In addition to dispatching commands directly through the PyLammps object, it -also provides several properties which allow you to query the system state. - -:dlb - -L.system :dt - -Is a dictionary describing the system such as the bounding box or number of atoms :dd - -L.system.xlo, L.system.xhi :dt - -bounding box limits along x-axis :dd - -L.system.ylo, L.system.yhi :dt - -bounding box limits along y-axis :dd - -L.system.zlo, L.system.zhi :dt - -bounding box limits along z-axis :dd - -L.communication :dt - -configuration of communication subsystem, such as the number of threads or processors :dd - -L.communication.nthreads :dt - -number of threads used by each LAMMPS process :dd - -L.communication.nprocs :dt - -number of MPI processes used by LAMMPS :dd - -L.fixes :dt - -List of fixes in the current system :dd - -L.computes :dt - -List of active computes in the current system :dd - -L.dump :dt - -List of active dumps in the current system :dd - -L.groups :dt - -List of groups present in the current system :dd - -:dle - -Working with LAMMPS variables :h4 - -LAMMPS variables can be both defined and accessed via the PyLammps interface. - -To define a variable you can use the "variable"_variable.html command: - -L.variable("a index 2") :pre - -A dictionary of all variables is returned by L.variables - -you can access an individual variable by retrieving a variable object from the -L.variables dictionary by name - -a = L.variables\['a'\] :pre - -The variable value can then be easily read and written by accessing the value -property of this object. - -print(a.value) -a.value = 4 :pre - -Retrieving the value of an arbitrary LAMMPS expressions :h4 - -LAMMPS expressions can be immediately evaluated by using the eval method. The -passed string parameter can be any expression containing global thermo values, -variables, compute or fix data. - -result = L.eval("ke") # kinetic energy -result = L.eval("pe") # potential energy :pre - -result = L.eval("v_t/2.0") :pre - -Accessing atom data :h4 - -All atoms in the current simulation can be accessed by using the L.atoms list. -Each element of this list is an object which exposes its properties (id, type, -position, velocity, force, etc.). - -# access first atom -L.atoms\[0\].id -L.atoms\[0\].type :pre - -# access second atom -L.atoms\[1\].position -L.atoms\[1\].velocity -L.atoms\[1\].force :pre - -Some properties can also be used to set: - -# set position in 2D simulation -L.atoms\[0\].position = (1.0, 0.0) :pre - -# set position in 3D simulation -L.atoms\[0\].position = (1.0, 0.0, 1.) :pre - -Evaluating thermo data :h4 - -Each simulation run usually produces thermo output based on system state, -computes, fixes or variables. The trajectories of these values can be queried -after a run via the L.runs list. This list contains a growing list of run data. -The first element is the output of the first run, the second element that of -the second run. - -L.run(1000) -L.runs\[0\] # data of first 1000 time steps :pre - -L.run(1000) -L.runs\[1\] # data of second 1000 time steps :pre - -Each run contains a dictionary of all trajectories. Each trajectory is -accessible through its thermo name: - -L.runs\[0\].step # list of time steps in first run -L.runs\[0\].ke # list of kinetic energy values in first run :pre - -Together with matplotlib plotting data out of LAMMPS becomes simple: - -import matplotlib.plot as plt - -steps = L.runs\[0\].step -ke = L.runs\[0\].ke -plt.plot(steps, ke) :pre - -Error handling with PyLammps :h4 - -Compiling the shared library with C++ exception support provides a better error -handling experience. Without exceptions the LAMMPS code will terminate the -current Python process with an error message. C++ exceptions allow capturing -them on the C++ side and rethrowing them on the Python side. This way you -can handle LAMMPS errors through the Python exception handling mechanism. - -IMPORTANT NOTE: Capturing a LAMMPS exception in Python can still mean that the -current LAMMPS process is in an illegal state and must be terminated. It is -advised to save your data and terminate the Python instance as quickly as -possible. - -Using PyLammps in IPython notebooks and Jupyter :h4 - -If the LAMMPS Python package is installed for the same Python interpreter as -IPython, you can use PyLammps directly inside of an IPython notebook inside of -Jupyter. Jupyter is a powerful integrated development environment (IDE) for -many dynamic languages like Python, Julia and others, which operates inside of -any web browser. Besides auto-completion and syntax highlighting it allows you -to create formatted documents using Markup, mathematical formulas, graphics and -animations intermixed with executable Python code. It is a great format for -tutorials and showcasing your latest research. - -To launch an instance of Jupyter simply run the following command inside your -Python environment (this assumes you followed the Quick Start instructions): - -jupyter notebook :pre - -IPyLammps Examples :h4 - -Examples of IPython notebooks can be found in the python/examples/pylammps -sub-directory. To open these notebooks launch {jupyter notebook} inside this -directory and navigate to one of them. If you compiled and installed -a LAMMPS shared library with exceptions, PNG, JPEG and FFMPEG support -you should be able to rerun all of these notebooks. - -Validating a dihedral potential :h5 - -This example showcases how an IPython Notebook can be used to compare a simple -LAMMPS simulation of a harmonic dihedral potential to its analytical solution. -Four atoms are placed in the simulation and the dihedral potential is applied on -them using a datafile. Then one of the atoms is rotated along the central axis by -setting its position from Python, which changes the dihedral angle. - -phi = \[d * math.pi / 180 for d in range(360)\] :pre - -pos = \[(1.0, math.cos(p), math.sin(p)) for p in phi\] :pre - -pe = \[\] -for p in pos: - L.atoms\[3\].position = p - L.run(0) - pe.append(L.eval("pe")) :pre - -By evaluating the potential energy for each position we can verify that -trajectory with the analytical formula. To compare both solutions, we plot -both trajectories over each other using matplotlib, which embeds the generated -plot inside the IPython notebook. - -:c,image(JPG/pylammps_dihedral.jpg) - -Running a Monte Carlo relaxation :h5 - -This second example shows how to use PyLammps to create a 2D Monte Carlo Relaxation -simulation, computing and plotting energy terms and even embedding video output. - -Initially, a 2D system is created in a state with minimal energy. - -:c,image(JPG/pylammps_mc_minimum.jpg) - -It is then disordered by moving each atom by a random delta. - -random.seed(27848) -deltaperturb = 0.2 :pre - -for i in range(L.system.natoms): - x, y = L.atoms\[i\].position - dx = deltaperturb * random.uniform(-1, 1) - dy = deltaperturb * random.uniform(-1, 1) - L.atoms\[i\].position = (x+dx, y+dy) :pre - -L.run(0) :pre - -:c,image(JPG/pylammps_mc_disordered.jpg) - -Finally, the Monte Carlo algorithm is implemented in Python. It continuously -moves random atoms by a random delta and only accepts certain moves. - -estart = L.eval("pe") -elast = estart :pre - -naccept = 0 -energies = \[estart\] :pre - -niterations = 3000 -deltamove = 0.1 -kT = 0.05 :pre - -natoms = L.system.natoms :pre - -for i in range(niterations): - iatom = random.randrange(0, natoms) - current_atom = L.atoms\[iatom\] :pre - - x0, y0 = current_atom.position :pre - - dx = deltamove * random.uniform(-1, 1) - dy = deltamove * random.uniform(-1, 1) :pre - - current_atom.position = (x0+dx, y0+dy) :pre - - L.run(1, "pre no post no") :pre - - e = L.eval("pe") - energies.append(e) :pre - - if e <= elast: - naccept += 1 - elast = e - elif random.random() <= math.exp(natoms*(elast-e)/kT): - naccept += 1 - elast = e - else: - current_atom.position = (x0, y0) :pre - -The energies of each iteration are collected in a Python list and finally plotted using matplotlib. - -:c,image(JPG/pylammps_mc_energies_plot.jpg) - -The IPython notebook also shows how to use dump commands and embed video files -inside of the IPython notebook. - -Using PyLammps and mpi4py (Experimental) :h4 - -PyLammps can be run in parallel using mpi4py. This python package can be installed using - -pip install mpi4py :pre - -The following is a short example which reads in an existing LAMMPS input file and -executes it in parallel. You can find in.melt in the examples/melt folder. - -from mpi4py import MPI -from lammps import PyLammps :pre - -L = PyLammps() -L.file("in.melt") :pre - -if MPI.COMM_WORLD.rank == 0: - print("Potential energy: ", L.eval("pe")) :pre - -MPI.Finalize() :pre - -To run this script (melt.py) in parallel using 4 MPI processes we invoke the -following mpirun command: - -mpirun -np 4 python melt.py :pre - -IMPORTANT NOTE: Any command must be executed by all MPI processes. However, evaluations and querying the system state is only available on rank 0. - -Feedback and Contributing :h4 - -If you find this Python interface useful, please feel free to provide feedback -and ideas on how to improve it to Richard Berger (richard.berger@temple.edu). We also -want to encourage people to write tutorial style IPython notebooks showcasing LAMMPS usage -and maybe their latest research results. From e5dd154366dbb7649640559eef8193e3cef92601 Mon Sep 17 00:00:00 2001 From: Jared Wood Date: Mon, 14 Oct 2019 11:13:58 +1100 Subject: [PATCH 399/418] Make max/min prevent moves already outside the bounds Previously allowed free movement outside the bounds until they were reached. Now forces movement towards the bounds --- src/MC/fix_gcmc.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index 818ed01fba..516fe2521d 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -269,7 +269,7 @@ void FixGCMC::options(int narg, char **arg) overlap_cutoffsq = 0.0; overlap_flag = 0; min_ngas = -1; - max_ngas = -1; + max_ngas = INT_MAX; int iarg = 0; while (iarg < narg) { @@ -903,7 +903,7 @@ void FixGCMC::attempt_atomic_deletion() { ndeletion_attempts += 1.0; - if (ngas == 0 || ngas == min_ngas) return; + if (ngas == 0 || ngas <= min_ngas) return; int i = pick_random_gas_atom(); @@ -944,7 +944,7 @@ void FixGCMC::attempt_atomic_insertion() ninsertion_attempts += 1.0; - if (ngas == max_ngas) return; + if (ngas >= max_ngas) return; // pick coordinates for insertion point @@ -1260,7 +1260,7 @@ void FixGCMC::attempt_molecule_deletion() { ndeletion_attempts += 1.0; - if (ngas == 0 || ngas == min_ngas) return; + if (ngas == 0 || ngas <= min_ngas) return; // work-around to avoid n=0 problem with fix rigid/nvt/small @@ -1299,7 +1299,7 @@ void FixGCMC::attempt_molecule_insertion() double lamda[3]; ninsertion_attempts += 1.0; - if (ngas == max_ngas) return; + if (ngas >= max_ngas) return; double com_coord[3]; if (regionflag) { @@ -1584,7 +1584,7 @@ void FixGCMC::attempt_atomic_deletion_full() ndeletion_attempts += 1.0; - if (ngas == 0 || ngas == min_ngas) return; + if (ngas == 0 || ngas <= min_ngas) return; double energy_before = energy_stored; @@ -1633,7 +1633,7 @@ void FixGCMC::attempt_atomic_insertion_full() double lamda[3]; ninsertion_attempts += 1.0; - if (ngas == max_ngas) return; + if (ngas >= max_ngas) return; double energy_before = energy_stored; @@ -1930,7 +1930,7 @@ void FixGCMC::attempt_molecule_deletion_full() { ndeletion_attempts += 1.0; - if (ngas == 0 || ngas == min_ngas) return; + if (ngas == 0 || ngas <= min_ngas) return; // work-around to avoid n=0 problem with fix rigid/nvt/small @@ -2013,7 +2013,7 @@ void FixGCMC::attempt_molecule_insertion_full() double lamda[3]; ninsertion_attempts += 1.0; - if (ngas == max_ngas) return; + if (ngas >= max_ngas) return; double energy_before = energy_stored; From a2eec80f259d615567538f84b86d916eae5bacfc Mon Sep 17 00:00:00 2001 From: Jared Wood Date: Tue, 5 Nov 2019 16:32:35 +1100 Subject: [PATCH 400/418] add max and min to documentation --- doc/src/fix_gcmc.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/src/fix_gcmc.txt b/doc/src/fix_gcmc.txt index 3c0f2c2f17..f28cb5771f 100644 --- a/doc/src/fix_gcmc.txt +++ b/doc/src/fix_gcmc.txt @@ -48,7 +48,9 @@ keyword = {mol}, {region}, {maxangle}, {pressure}, {fugacity_coeff}, {full_energ group-ID = group-ID for inserted atoms (string) {intra_energy} value = intramolecular energy (energy units) {tfac_insert} value = scale up/down temperature of inserted atoms (unitless) - {overlap_cutoff} value = maximum pair distance for overlap rejection (distance units) :pre + {overlap_cutoff} value = maximum pair distance for overlap rejection (distance units) + {max} value = Maximum number of molecules allowed in the system + {min} value = Minimum number of molecules allowed in the system :pre :ule [Examples:] @@ -364,6 +366,12 @@ assigning an infinite positive energy to all new configurations that place any pair of atoms closer than the specified overlap cutoff distance. +The {max} and {min} keywords allow for the restriction of the number +of atoms in the simulation. They automatically reject all insertion +or deletion moves that would take the system beyond the set boundaries. +Should the system already be beyond the boundary, only moves that bring +the system closer to the bounds may be accepted. + The {group} keyword adds all inserted atoms to the "group"_group.html of the group-ID value. The {grouptype} keyword adds all inserted atoms of the specified type to the From d37ee59296576c89994350a61c9b81be658d8ae9 Mon Sep 17 00:00:00 2001 From: Jared Wood Date: Thu, 7 Nov 2019 09:24:01 +1100 Subject: [PATCH 401/418] Add example of fix gcmc max behaviour --- examples/gcmc/in.gcmc.lj.max | 70 ++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 examples/gcmc/in.gcmc.lj.max diff --git a/examples/gcmc/in.gcmc.lj.max b/examples/gcmc/in.gcmc.lj.max new file mode 100644 index 0000000000..519ac162fa --- /dev/null +++ b/examples/gcmc/in.gcmc.lj.max @@ -0,0 +1,70 @@ +# GCMC for LJ simple fluid, no dynamics +# T = 2.0 +# rho ~ 0.5 +# p ~ 1.5 +# mu_ex ~ 0.0 +# comparable to Frenkel and Smit GCMC Case Study, Figure 5.8 + +# variables modifiable using -var command line switch + +variable mu index -1.25 +variable temp index 2.0 +variable disp index 1.0 +variable lbox index 5.0 + +# global model settings + +units lj +atom_style atomic +pair_style lj/cut 3.0 +pair_modify tail no # turn of to avoid triggering full_energy + +# box + +region box block 0 ${lbox} 0 ${lbox} 0 ${lbox} +create_box 1 box + +# lj parameters + +pair_coeff * * 1.0 1.0 +mass * 1.0 + +# we recommend setting up a dedicated group for gcmc + +group gcmcgroup type 1 + +# gcmc + +fix mygcmc gcmcgroup gcmc 1 100 100 1 29494 ${temp} ${mu} ${disp} max 50 + +# atom count + +variable type1 atom "type==1" +group type1 dynamic gcmcgroup var type1 +variable n1 equal count(type1) + +# averaging + +variable rho equal density +variable p equal press +variable nugget equal 1.0e-8 +variable lambda equal 1.0 +variable muex equal ${mu}-${temp}*ln(density*${lambda}+${nugget}) +fix ave all ave/time 10 100 1000 v_rho v_p v_muex v_n1 ave one file rho_vs_p.dat +variable rhoav equal f_ave[1] +variable pav equal f_ave[2] +variable muexav equal f_ave[3] +variable n1av equal f_ave[4] + +# output + +variable tacc equal f_mygcmc[2]/(f_mygcmc[1]+${nugget}) +variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+${nugget}) +variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+${nugget}) +compute_modify thermo_temp dynamic yes +thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av +thermo 1000 + +# run + +run 10000 From c5b0f0afcfe38e0e6dc400f277fbe0632a60923e Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 7 Nov 2019 17:06:38 -0700 Subject: [PATCH 402/418] add documention to FixPour::outside(), simplify logic a bit --- src/GRANULAR/fix_pour.cpp | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/GRANULAR/fix_pour.cpp b/src/GRANULAR/fix_pour.cpp index 41bc3c93d5..2b33b988b8 100644 --- a/src/GRANULAR/fix_pour.cpp +++ b/src/GRANULAR/fix_pour.cpp @@ -54,7 +54,8 @@ FixPour::FixPour(LAMMPS *lmp, int narg, char **arg) : { if (narg < 6) error->all(FLERR,"Illegal fix pour command"); - if (lmp->kokkos) error->all(FLERR,"Cannot yet use fix pour with the KOKKOS package"); + if (lmp->kokkos) + error->all(FLERR,"Cannot yet use fix pour with the KOKKOS package"); time_depend = 1; @@ -789,23 +790,30 @@ bool FixPour::outside(int dim, double value, double lo, double hi) { double boxlo = domain->boxlo[dim]; double boxhi = domain->boxhi[dim]; - bool outside_pbc_range = true; - bool outside_regular_range = (value < lo || value > hi); - if (domain->periodicity[dim]) { - if ((lo < boxlo && hi > boxhi) || (hi - lo) > domain->prd[dim]) { - // value is always inside - outside_pbc_range = false; - } else if (lo < boxlo) { - // lower boundary crosses periodic boundary - outside_pbc_range = (value > hi && value < lo + domain->prd[dim]); - } else if (hi > boxhi) { - // upper boundary crosses periodic boundary - outside_pbc_range = (value < lo && value > hi - domain->prd[dim]); - } + // check for value inside/outside range, ignoring periodicity + // if inside or dim is non-periodic, only this test is needed + + bool outside_range = (value < lo || value > hi); + if (!outside_range || !domain->periodicity[dim]) return outside_range; + + // for periodic dimension: + // must perform additional tests if range wraps around the periodic box + + bool outside_pbc_range = true; + + if ((lo < boxlo && hi > boxhi) || (hi - lo) > domain->prd[dim]) { + // value is always inside + outside_pbc_range = false; + } else if (lo < boxlo) { + // lower boundary crosses periodic boundary + outside_pbc_range = (value > hi && value < lo + domain->prd[dim]); + } else if (hi > boxhi) { + // upper boundary crosses periodic boundary + outside_pbc_range = (value < lo && value > hi - domain->prd[dim]); } - return (outside_pbc_range && outside_regular_range); + return outside_pbc_range; } /* ---------------------------------------------------------------------- */ From ce6893e7175f838efa22f8ed77a21880855ac444 Mon Sep 17 00:00:00 2001 From: Jared Wood Date: Fri, 8 Nov 2019 12:59:39 +1100 Subject: [PATCH 403/418] Add max/min changes to documentation again --- doc/src/fix_gcmc.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/src/fix_gcmc.rst b/doc/src/fix_gcmc.rst index 0bb59d3afc..9f64be8699 100644 --- a/doc/src/fix_gcmc.rst +++ b/doc/src/fix_gcmc.rst @@ -51,6 +51,8 @@ Syntax *intra_energy* value = intramolecular energy (energy units) *tfac_insert* value = scale up/down temperature of inserted atoms (unitless) *overlap_cutoff* value = maximum pair distance for overlap rejection (distance units) + *max* value = Maximum number of molecules allowed in the system + *min* value = Minimum number of molecules allowed in the system @@ -385,6 +387,12 @@ assigning an infinite positive energy to all new configurations that place any pair of atoms closer than the specified overlap cutoff distance. +The *max* and *min* keywords allow for the restriction of the number +of atoms in the simulation. They automatically reject all insertion +or deletion moves that would take the system beyond the set boundaries. +Should the system already be beyond the boundary, only moves that bring +the system closer to the bounds may be accepted. + The *group* keyword adds all inserted atoms to the :doc:`group ` of the group-ID value. The *grouptype* keyword adds all inserted atoms of the specified type to the From 83f0eb0058dbd39974dc9166c707cc0bbd4e72fd Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Thu, 7 Nov 2019 21:47:02 -0500 Subject: [PATCH 404/418] Remove unnecessary files --- doc/txt/computes.txt | 137 ------------------------------------------ doc/txt/impropers.txt | 23 ------- 2 files changed, 160 deletions(-) delete mode 100644 doc/txt/computes.txt delete mode 100644 doc/txt/impropers.txt diff --git a/doc/txt/computes.txt b/doc/txt/computes.txt deleted file mode 100644 index b24387e856..0000000000 --- a/doc/txt/computes.txt +++ /dev/null @@ -1,137 +0,0 @@ -Computes :h1 - - diff --git a/doc/txt/impropers.txt b/doc/txt/impropers.txt deleted file mode 100644 index ce829197fe..0000000000 --- a/doc/txt/impropers.txt +++ /dev/null @@ -1,23 +0,0 @@ -Improper Styles :h1 - - From 81e92de83875a1b79551924d2ba9d7f9e5b3d5f9 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Thu, 7 Nov 2019 21:47:29 -0500 Subject: [PATCH 405/418] Fix doc Makefile --- doc/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/Makefile b/doc/Makefile index 5dcb070f4f..eceae88da6 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -168,7 +168,7 @@ anchor_check : $(ANCHORCHECK) # ------------------------------------------ -$(RSTDIR)/%.rst : src/%.txt $(TXT2RST) +$(RSTDIR)/%.rst : $(TXTDIR)/%.txt $(TXT2RST) @(\ mkdir -p $(RSTDIR) ; \ . $(VENV)/bin/activate ;\ From 02a1ef06306f4f6f6b02088725ca6a6f3e0a235c Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 8 Nov 2019 09:25:08 -0700 Subject: [PATCH 406/418] add compute hma to list of computes --- doc/src/Commands_compute.rst | 68 ------------------------------------ doc/txt/Commands_compute.txt | 1 + 2 files changed, 1 insertion(+), 68 deletions(-) delete mode 100644 doc/src/Commands_compute.rst diff --git a/doc/src/Commands_compute.rst b/doc/src/Commands_compute.rst deleted file mode 100644 index 0a155965ef..0000000000 --- a/doc/src/Commands_compute.rst +++ /dev/null @@ -1,68 +0,0 @@ -+----------------------------------------+------------------------------------+------------------------------------------+ -| :doc:`General commands ` | :doc:`Fix styles ` | :doc:`Compute styles ` | -+----------------------------------------+------------------------------------+------------------------------------------+ -| :doc:`Pair styles ` | :doc:`Bond styles ` | :ref:`Angle styles ` | -+----------------------------------------+------------------------------------+------------------------------------------+ -| :ref:`Dihedral styles ` | :ref:`Improper styles ` | :doc:`KSpace styles ` | -+----------------------------------------+------------------------------------+------------------------------------------+ - -Compute commands -================ - -An alphabetic list of all LAMMPS :doc:`compute ` commands. -Some styles have accelerated versions. This is indicated by -additional letters in parenthesis: g = GPU, i = USER-INTEL, k = -KOKKOS, o = USER-OMP, t = OPT. - -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`ackland/atom ` | :doc:`adf ` | :doc:`aggregate/atom ` | :doc:`angle ` | :doc:`angle/local ` | :doc:`angmom/chunk ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`basal/atom ` | :doc:`body/local ` | :doc:`bond ` | :doc:`bond/local ` | :doc:`centro/atom ` | :doc:`chunk/atom ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`chunk/spread/atom ` | :doc:`cluster/atom ` | :doc:`cna/atom ` | :doc:`cnp/atom ` | :doc:`com ` | :doc:`com/chunk ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`contact/atom ` | :doc:`coord/atom ` | :doc:`damage/atom ` | :doc:`dihedral ` | :doc:`dihedral/local ` | :doc:`dilatation/atom ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`dipole/chunk ` | :doc:`displace/atom ` | :doc:`dpd ` | :doc:`dpd/atom ` | :doc:`edpd/temp/atom ` | :doc:`entropy/atom ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`erotate/asphere ` | :doc:`erotate/rigid ` | :doc:`erotate/sphere ` | :doc:`erotate/sphere/atom ` | :doc:`event/displace ` | :doc:`fep ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`force/tally ` | :doc:`fragment/atom ` | :doc:`global/atom ` | :doc:`group/group ` | :doc:`gyration ` | :doc:`gyration/chunk ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`gyration/shape ` | :doc:`heat/flux ` | :doc:`heat/flux/tally ` | :doc:`hexorder/atom ` | :doc:`improper ` | :doc:`improper/local ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`inertia/chunk ` | :doc:`ke ` | :doc:`ke/atom ` | :doc:`ke/atom/eff ` | :doc:`ke/eff ` | :doc:`ke/rigid ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`meso/e/atom ` | :doc:`meso/rho/atom ` | :doc:`meso/t/atom ` | :doc:`momentum ` | :doc:`msd ` | :doc:`msd/chunk ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`msd/nongauss ` | :doc:`omega/chunk ` | :doc:`orientorder/atom ` | :doc:`pair ` | :doc:`pair/local ` | :doc:`pe ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`pe/atom ` | :doc:`pe/mol/tally ` | :doc:`pe/tally ` | :doc:`plasticity/atom ` | :doc:`pressure ` | :doc:`pressure/cylinder ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`pressure/uef ` | :doc:`property/atom ` | :doc:`property/chunk ` | :doc:`property/local ` | :doc:`ptm/atom ` | :doc:`rdf ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`reduce ` | :doc:`reduce/chunk ` | :doc:`reduce/region ` | :doc:`rigid/local ` | :doc:`saed ` | :doc:`slice ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`smd/contact/radius ` | :doc:`smd/damage ` | :doc:`smd/hourglass/error ` | :doc:`smd/internal/energy ` | :doc:`smd/plastic/strain ` | :doc:`smd/plastic/strain/rate ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`smd/rho ` | :doc:`smd/tlsph/defgrad ` | :doc:`smd/tlsph/dt ` | :doc:`smd/tlsph/num/neighs ` | :doc:`smd/tlsph/shape ` | :doc:`smd/tlsph/strain ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`smd/tlsph/strain/rate ` | :doc:`smd/tlsph/stress ` | :doc:`smd/triangle/vertices ` | :doc:`smd/ulsph/num/neighs ` | :doc:`smd/ulsph/strain ` | :doc:`smd/ulsph/strain/rate ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`smd/ulsph/stress ` | :doc:`smd/vol ` | :doc:`sna/atom ` | :doc:`snad/atom ` | :doc:`snav/atom ` | :doc:`spin ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`stress/atom ` | :doc:`stress/mop ` | :doc:`stress/mop/profile ` | :doc:`stress/tally ` | :doc:`tdpd/cc/atom ` | :doc:`temp (k) ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`temp/asphere ` | :doc:`temp/body ` | :doc:`temp/chunk ` | :doc:`temp/com ` | :doc:`temp/cs ` | :doc:`temp/deform ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`temp/deform/eff ` | :doc:`temp/drude ` | :doc:`temp/eff ` | :doc:`temp/partial ` | :doc:`temp/profile ` | :doc:`temp/ramp ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`temp/region ` | :doc:`temp/region/eff ` | :doc:`temp/rotate ` | :doc:`temp/sphere ` | :doc:`temp/uef ` | :doc:`ti ` | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ -| :doc:`torque/chunk ` | :doc:`vacf ` | :doc:`vcm/chunk ` | :doc:`voronoi/atom ` | :doc:`xrd ` | | -+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+------------------------------------------------------------------+ - - -.. _lws: http://lammps.sandia.gov -.. _ld: Manual.html -.. _lc: Commands_all.html diff --git a/doc/txt/Commands_compute.txt b/doc/txt/Commands_compute.txt index e035eb8431..f9ef9d1dec 100644 --- a/doc/txt/Commands_compute.txt +++ b/doc/txt/Commands_compute.txt @@ -70,6 +70,7 @@ KOKKOS, o = USER-OMP, t = OPT. "heat/flux"_compute_heat_flux.html, "heat/flux/tally"_compute_tally.html, "hexorder/atom"_compute_hexorder_atom.html, +"hma"_compute_hma.html, "improper"_compute_improper.html, "improper/local"_compute_improper_local.html, "inertia/chunk"_compute_inertia_chunk.html, From 0583fb6ae03386f89d500ddb5b7b7d5add97a66e Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 8 Nov 2019 09:46:49 -0700 Subject: [PATCH 407/418] update rst file also --- doc/src/Commands_compute.rst | 68 ++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 doc/src/Commands_compute.rst diff --git a/doc/src/Commands_compute.rst b/doc/src/Commands_compute.rst new file mode 100644 index 0000000000..63926b6d61 --- /dev/null +++ b/doc/src/Commands_compute.rst @@ -0,0 +1,68 @@ ++----------------------------------------+------------------------------------+------------------------------------------+ +| :doc:`General commands ` | :doc:`Fix styles ` | :doc:`Compute styles ` | ++----------------------------------------+------------------------------------+------------------------------------------+ +| :doc:`Pair styles ` | :doc:`Bond styles ` | :ref:`Angle styles ` | ++----------------------------------------+------------------------------------+------------------------------------------+ +| :ref:`Dihedral styles ` | :ref:`Improper styles ` | :doc:`KSpace styles ` | ++----------------------------------------+------------------------------------+------------------------------------------+ + +Compute commands +================ + +An alphabetic list of all LAMMPS :doc:`compute ` commands. +Some styles have accelerated versions. This is indicated by +additional letters in parenthesis: g = GPU, i = USER-INTEL, k = +KOKKOS, o = USER-OMP, t = OPT. + ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`ackland/atom ` | :doc:`adf ` | :doc:`aggregate/atom ` | :doc:`angle ` | :doc:`angle/local ` | :doc:`angmom/chunk ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`basal/atom ` | :doc:`body/local ` | :doc:`bond ` | :doc:`bond/local ` | :doc:`centro/atom ` | :doc:`chunk/atom ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`chunk/spread/atom ` | :doc:`cluster/atom ` | :doc:`cna/atom ` | :doc:`cnp/atom ` | :doc:`com ` | :doc:`com/chunk ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`contact/atom ` | :doc:`coord/atom ` | :doc:`damage/atom ` | :doc:`dihedral ` | :doc:`dihedral/local ` | :doc:`dilatation/atom ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`dipole/chunk ` | :doc:`displace/atom ` | :doc:`dpd ` | :doc:`dpd/atom ` | :doc:`edpd/temp/atom ` | :doc:`entropy/atom ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`erotate/asphere ` | :doc:`erotate/rigid ` | :doc:`erotate/sphere ` | :doc:`erotate/sphere/atom ` | :doc:`event/displace ` | :doc:`fep ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`force/tally ` | :doc:`fragment/atom ` | :doc:`global/atom ` | :doc:`group/group ` | :doc:`gyration ` | :doc:`gyration/chunk ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`gyration/shape ` | :doc:`heat/flux ` | :doc:`heat/flux/tally ` | :doc:`hexorder/atom ` | :doc:`hma ` | :doc:`improper ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`improper/local ` | :doc:`inertia/chunk ` | :doc:`ke ` | :doc:`ke/atom ` | :doc:`ke/atom/eff ` | :doc:`ke/eff ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`ke/rigid ` | :doc:`meso/e/atom ` | :doc:`meso/rho/atom ` | :doc:`meso/t/atom ` | :doc:`momentum ` | :doc:`msd ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`msd/chunk ` | :doc:`msd/nongauss ` | :doc:`omega/chunk ` | :doc:`orientorder/atom ` | :doc:`pair ` | :doc:`pair/local ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`pe ` | :doc:`pe/atom ` | :doc:`pe/mol/tally ` | :doc:`pe/tally ` | :doc:`plasticity/atom ` | :doc:`pressure ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`pressure/cylinder ` | :doc:`pressure/uef ` | :doc:`property/atom ` | :doc:`property/chunk ` | :doc:`property/local ` | :doc:`ptm/atom ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`rdf ` | :doc:`reduce ` | :doc:`reduce/chunk ` | :doc:`reduce/region ` | :doc:`rigid/local ` | :doc:`saed ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`slice ` | :doc:`smd/contact/radius ` | :doc:`smd/damage ` | :doc:`smd/hourglass/error ` | :doc:`smd/internal/energy ` | :doc:`smd/plastic/strain ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`smd/plastic/strain/rate ` | :doc:`smd/rho ` | :doc:`smd/tlsph/defgrad ` | :doc:`smd/tlsph/dt ` | :doc:`smd/tlsph/num/neighs ` | :doc:`smd/tlsph/shape ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`smd/tlsph/strain ` | :doc:`smd/tlsph/strain/rate ` | :doc:`smd/tlsph/stress ` | :doc:`smd/triangle/vertices ` | :doc:`smd/ulsph/num/neighs ` | :doc:`smd/ulsph/strain ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`smd/ulsph/strain/rate ` | :doc:`smd/ulsph/stress ` | :doc:`smd/vol ` | :doc:`sna/atom ` | :doc:`snad/atom ` | :doc:`snav/atom ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`spin ` | :doc:`stress/atom ` | :doc:`stress/mop ` | :doc:`stress/mop/profile ` | :doc:`stress/tally ` | :doc:`tdpd/cc/atom ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`temp (k) ` | :doc:`temp/asphere ` | :doc:`temp/body ` | :doc:`temp/chunk ` | :doc:`temp/com ` | :doc:`temp/cs ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`temp/deform ` | :doc:`temp/deform/eff ` | :doc:`temp/drude ` | :doc:`temp/eff ` | :doc:`temp/partial ` | :doc:`temp/profile ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`temp/ramp ` | :doc:`temp/region ` | :doc:`temp/region/eff ` | :doc:`temp/rotate ` | :doc:`temp/sphere ` | :doc:`temp/uef ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ +| :doc:`ti ` | :doc:`torque/chunk ` | :doc:`vacf ` | :doc:`vcm/chunk ` | :doc:`voronoi/atom ` | :doc:`xrd ` | ++------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html From 6623169d97b731e4d672152b10afd3e2b3ef1fca Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 8 Nov 2019 15:00:26 -0500 Subject: [PATCH 408/418] Delete example file on request of @athomps --- examples/gcmc/in.gcmc.lj.max | 70 ------------------------------------ 1 file changed, 70 deletions(-) delete mode 100644 examples/gcmc/in.gcmc.lj.max diff --git a/examples/gcmc/in.gcmc.lj.max b/examples/gcmc/in.gcmc.lj.max deleted file mode 100644 index 519ac162fa..0000000000 --- a/examples/gcmc/in.gcmc.lj.max +++ /dev/null @@ -1,70 +0,0 @@ -# GCMC for LJ simple fluid, no dynamics -# T = 2.0 -# rho ~ 0.5 -# p ~ 1.5 -# mu_ex ~ 0.0 -# comparable to Frenkel and Smit GCMC Case Study, Figure 5.8 - -# variables modifiable using -var command line switch - -variable mu index -1.25 -variable temp index 2.0 -variable disp index 1.0 -variable lbox index 5.0 - -# global model settings - -units lj -atom_style atomic -pair_style lj/cut 3.0 -pair_modify tail no # turn of to avoid triggering full_energy - -# box - -region box block 0 ${lbox} 0 ${lbox} 0 ${lbox} -create_box 1 box - -# lj parameters - -pair_coeff * * 1.0 1.0 -mass * 1.0 - -# we recommend setting up a dedicated group for gcmc - -group gcmcgroup type 1 - -# gcmc - -fix mygcmc gcmcgroup gcmc 1 100 100 1 29494 ${temp} ${mu} ${disp} max 50 - -# atom count - -variable type1 atom "type==1" -group type1 dynamic gcmcgroup var type1 -variable n1 equal count(type1) - -# averaging - -variable rho equal density -variable p equal press -variable nugget equal 1.0e-8 -variable lambda equal 1.0 -variable muex equal ${mu}-${temp}*ln(density*${lambda}+${nugget}) -fix ave all ave/time 10 100 1000 v_rho v_p v_muex v_n1 ave one file rho_vs_p.dat -variable rhoav equal f_ave[1] -variable pav equal f_ave[2] -variable muexav equal f_ave[3] -variable n1av equal f_ave[4] - -# output - -variable tacc equal f_mygcmc[2]/(f_mygcmc[1]+${nugget}) -variable iacc equal f_mygcmc[4]/(f_mygcmc[3]+${nugget}) -variable dacc equal f_mygcmc[6]/(f_mygcmc[5]+${nugget}) -compute_modify thermo_temp dynamic yes -thermo_style custom step temp press pe ke density atoms v_iacc v_dacc v_tacc v_rhoav v_pav v_muexav v_n1av -thermo 1000 - -# run - -run 10000 From b9648884bbedacb43cd8ea738be84d64e1927be7 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Fri, 8 Nov 2019 15:28:12 -0500 Subject: [PATCH 409/418] Add rst versions of new documentation --- doc/src/Commands_compute.rst | 96 +++++++++++++++--------------- doc/src/compute.rst | 3 +- doc/src/compute_gyration_shape.rst | 20 ++++--- 3 files changed, 62 insertions(+), 57 deletions(-) diff --git a/doc/src/Commands_compute.rst b/doc/src/Commands_compute.rst index 63926b6d61..351eca3709 100644 --- a/doc/src/Commands_compute.rst +++ b/doc/src/Commands_compute.rst @@ -14,53 +14,55 @@ Some styles have accelerated versions. This is indicated by additional letters in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`ackland/atom ` | :doc:`adf ` | :doc:`aggregate/atom ` | :doc:`angle ` | :doc:`angle/local ` | :doc:`angmom/chunk ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`basal/atom ` | :doc:`body/local ` | :doc:`bond ` | :doc:`bond/local ` | :doc:`centro/atom ` | :doc:`chunk/atom ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`chunk/spread/atom ` | :doc:`cluster/atom ` | :doc:`cna/atom ` | :doc:`cnp/atom ` | :doc:`com ` | :doc:`com/chunk ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`contact/atom ` | :doc:`coord/atom ` | :doc:`damage/atom ` | :doc:`dihedral ` | :doc:`dihedral/local ` | :doc:`dilatation/atom ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`dipole/chunk ` | :doc:`displace/atom ` | :doc:`dpd ` | :doc:`dpd/atom ` | :doc:`edpd/temp/atom ` | :doc:`entropy/atom ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`erotate/asphere ` | :doc:`erotate/rigid ` | :doc:`erotate/sphere ` | :doc:`erotate/sphere/atom ` | :doc:`event/displace ` | :doc:`fep ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`force/tally ` | :doc:`fragment/atom ` | :doc:`global/atom ` | :doc:`group/group ` | :doc:`gyration ` | :doc:`gyration/chunk ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`gyration/shape ` | :doc:`heat/flux ` | :doc:`heat/flux/tally ` | :doc:`hexorder/atom ` | :doc:`hma ` | :doc:`improper ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`improper/local ` | :doc:`inertia/chunk ` | :doc:`ke ` | :doc:`ke/atom ` | :doc:`ke/atom/eff ` | :doc:`ke/eff ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`ke/rigid ` | :doc:`meso/e/atom ` | :doc:`meso/rho/atom ` | :doc:`meso/t/atom ` | :doc:`momentum ` | :doc:`msd ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`msd/chunk ` | :doc:`msd/nongauss ` | :doc:`omega/chunk ` | :doc:`orientorder/atom ` | :doc:`pair ` | :doc:`pair/local ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`pe ` | :doc:`pe/atom ` | :doc:`pe/mol/tally ` | :doc:`pe/tally ` | :doc:`plasticity/atom ` | :doc:`pressure ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`pressure/cylinder ` | :doc:`pressure/uef ` | :doc:`property/atom ` | :doc:`property/chunk ` | :doc:`property/local ` | :doc:`ptm/atom ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`rdf ` | :doc:`reduce ` | :doc:`reduce/chunk ` | :doc:`reduce/region ` | :doc:`rigid/local ` | :doc:`saed ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`slice ` | :doc:`smd/contact/radius ` | :doc:`smd/damage ` | :doc:`smd/hourglass/error ` | :doc:`smd/internal/energy ` | :doc:`smd/plastic/strain ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`smd/plastic/strain/rate ` | :doc:`smd/rho ` | :doc:`smd/tlsph/defgrad ` | :doc:`smd/tlsph/dt ` | :doc:`smd/tlsph/num/neighs ` | :doc:`smd/tlsph/shape ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`smd/tlsph/strain ` | :doc:`smd/tlsph/strain/rate ` | :doc:`smd/tlsph/stress ` | :doc:`smd/triangle/vertices ` | :doc:`smd/ulsph/num/neighs ` | :doc:`smd/ulsph/strain ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`smd/ulsph/strain/rate ` | :doc:`smd/ulsph/stress ` | :doc:`smd/vol ` | :doc:`sna/atom ` | :doc:`snad/atom ` | :doc:`snav/atom ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`spin ` | :doc:`stress/atom ` | :doc:`stress/mop ` | :doc:`stress/mop/profile ` | :doc:`stress/tally ` | :doc:`tdpd/cc/atom ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`temp (k) ` | :doc:`temp/asphere ` | :doc:`temp/body ` | :doc:`temp/chunk ` | :doc:`temp/com ` | :doc:`temp/cs ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`temp/deform ` | :doc:`temp/deform/eff ` | :doc:`temp/drude ` | :doc:`temp/eff ` | :doc:`temp/partial ` | :doc:`temp/profile ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`temp/ramp ` | :doc:`temp/region ` | :doc:`temp/region/eff ` | :doc:`temp/rotate ` | :doc:`temp/sphere ` | :doc:`temp/uef ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ -| :doc:`ti ` | :doc:`torque/chunk ` | :doc:`vacf ` | :doc:`vcm/chunk ` | :doc:`voronoi/atom ` | :doc:`xrd ` | -+------------------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+--------------------------------------------------------+ ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`ackland/atom ` | :doc:`adf ` | :doc:`aggregate/atom ` | :doc:`angle ` | :doc:`angle/local ` | :doc:`angmom/chunk ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`basal/atom ` | :doc:`body/local ` | :doc:`bond ` | :doc:`bond/local ` | :doc:`centro/atom ` | :doc:`chunk/atom ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`chunk/spread/atom ` | :doc:`cluster/atom ` | :doc:`cna/atom ` | :doc:`cnp/atom ` | :doc:`com ` | :doc:`com/chunk ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`contact/atom ` | :doc:`coord/atom ` | :doc:`damage/atom ` | :doc:`dihedral ` | :doc:`dihedral/local ` | :doc:`dilatation/atom ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`dipole/chunk ` | :doc:`displace/atom ` | :doc:`dpd ` | :doc:`dpd/atom ` | :doc:`edpd/temp/atom ` | :doc:`entropy/atom ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`erotate/asphere ` | :doc:`erotate/rigid ` | :doc:`erotate/sphere ` | :doc:`erotate/sphere/atom ` | :doc:`event/displace ` | :doc:`fep ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`force/tally ` | :doc:`fragment/atom ` | :doc:`global/atom ` | :doc:`group/group ` | :doc:`gyration ` | :doc:`gyration/chunk ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`gyration/shape ` | :doc:`gyration/shape/chunk ` | :doc:`heat/flux ` | :doc:`heat/flux/tally ` | :doc:`hexorder/atom ` | :doc:`hma ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`improper ` | :doc:`improper/local ` | :doc:`inertia/chunk ` | :doc:`ke ` | :doc:`ke/atom ` | :doc:`ke/atom/eff ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`ke/eff ` | :doc:`ke/rigid ` | :doc:`meso/e/atom ` | :doc:`meso/rho/atom ` | :doc:`meso/t/atom ` | :doc:`momentum ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`msd ` | :doc:`msd/chunk ` | :doc:`msd/nongauss ` | :doc:`omega/chunk ` | :doc:`orientorder/atom ` | :doc:`pair ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`pair/local ` | :doc:`pe ` | :doc:`pe/atom ` | :doc:`pe/mol/tally ` | :doc:`pe/tally ` | :doc:`plasticity/atom ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`pressure ` | :doc:`pressure/cylinder ` | :doc:`pressure/uef ` | :doc:`property/atom ` | :doc:`property/chunk ` | :doc:`property/local ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`ptm/atom ` | :doc:`rdf ` | :doc:`reduce ` | :doc:`reduce/chunk ` | :doc:`reduce/region ` | :doc:`rigid/local ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`saed ` | :doc:`slice ` | :doc:`smd/contact/radius ` | :doc:`smd/damage ` | :doc:`smd/hourglass/error ` | :doc:`smd/internal/energy ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`smd/plastic/strain ` | :doc:`smd/plastic/strain/rate ` | :doc:`smd/rho ` | :doc:`smd/tlsph/defgrad ` | :doc:`smd/tlsph/dt ` | :doc:`smd/tlsph/num/neighs ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`smd/tlsph/shape ` | :doc:`smd/tlsph/strain ` | :doc:`smd/tlsph/strain/rate ` | :doc:`smd/tlsph/stress ` | :doc:`smd/triangle/vertices ` | :doc:`smd/ulsph/num/neighs ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`smd/ulsph/strain ` | :doc:`smd/ulsph/strain/rate ` | :doc:`smd/ulsph/stress ` | :doc:`smd/vol ` | :doc:`sna/atom ` | :doc:`snad/atom ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`snav/atom ` | :doc:`spin ` | :doc:`stress/atom ` | :doc:`stress/mop ` | :doc:`stress/mop/profile ` | :doc:`stress/tally ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`tdpd/cc/atom ` | :doc:`temp (k) ` | :doc:`temp/asphere ` | :doc:`temp/body ` | :doc:`temp/chunk ` | :doc:`temp/com ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`temp/cs ` | :doc:`temp/deform ` | :doc:`temp/deform/eff ` | :doc:`temp/drude ` | :doc:`temp/eff ` | :doc:`temp/partial ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`temp/profile ` | :doc:`temp/ramp ` | :doc:`temp/region ` | :doc:`temp/region/eff ` | :doc:`temp/rotate ` | :doc:`temp/sphere ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`temp/uef ` | :doc:`ti ` | :doc:`torque/chunk ` | :doc:`vacf ` | :doc:`vcm/chunk ` | :doc:`voronoi/atom ` | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ +| :doc:`xrd ` | | | | | | ++--------------------------------------------------------+------------------------------------------------------------------+--------------------------------------------------------------+----------------------------------------------------------+--------------------------------------------------------------+------------------------------------------------------------+ .. _lws: http://lammps.sandia.gov diff --git a/doc/src/compute.rst b/doc/src/compute.rst index f95e8a3f32..419352a9ac 100644 --- a/doc/src/compute.rst +++ b/doc/src/compute.rst @@ -222,7 +222,8 @@ The individual style names on the :doc:`Commands compute ` doc * :doc:`group/group ` - energy/force between two groups of atoms * :doc:`gyration ` - radius of gyration of group of atoms * :doc:`gyration/chunk ` - radius of gyration for each chunk -* :doc:`gyration/shape ` - compute shape parameters from radius of gyration tensor +* :doc:`gyration/shape ` - shape parameters from gyration tensor +* :doc:`gyration/shape/chunk ` - shape parameters from gyration tensor for each chunk * :doc:`heat/flux ` - heat flux through a group of atoms * :doc:`heat/flux/tally ` - * :doc:`hexorder/atom ` - bond orientational order parameter q6 diff --git a/doc/src/compute_gyration_shape.rst b/doc/src/compute_gyration_shape.rst index 68c16f2511..5461825923 100644 --- a/doc/src/compute_gyration_shape.rst +++ b/doc/src/compute_gyration_shape.rst @@ -9,7 +9,7 @@ Syntax .. parsed-literal:: - compute ID group-ID gyration compute-ID + compute ID group-ID gyration/shape compute-ID * ID, group-ID are documented in :doc:`compute ` command * gyration/shape = style name of this compute command @@ -36,7 +36,9 @@ and the relative shape anisotropy, k: .. image:: Eqs/compute_shape_parameters.jpg :align: center -where lx <= ly <= lz are the three eigenvalues of the gyration tensor. +where lx <= ly <= lz are the three eigenvalues of the gyration tensor. A general description +of these parameters is provided in :ref:`(Mattice) ` while an application to polymer systems +can be found in :ref:`(Theodorou) `. The asphericity is always non-negative and zero only when the three principal moments are equal. This zero condition is met when the distribution of particles is spherically symmetric (hence the name asphericity) but also whenever the particle @@ -91,18 +93,18 @@ Related commands ---------- -.. _Theodorou: - - - -**(Theodorou)** Theodorou, Suter, Macromolecules, 18, 1206 (1985). - -.. _Mattice: +.. _Mattice1: **(Mattice)** Mattice, Suter, Conformational Theory of Large Molecules, Wiley, New York, 1994. +.. _Theodorou1: + + + +**(Theodorou)** Theodorou, Suter, Macromolecules, 18, 1206 (1985). + .. _lws: http://lammps.sandia.gov .. _ld: Manual.html From 29b2dc7043d3f23bd9d84b30cd6e3142206f89be Mon Sep 17 00:00:00 2001 From: lucienPan Date: Fri, 8 Nov 2019 16:11:34 -0500 Subject: [PATCH 410/418] Patch of class2 dihedral Fix the nan problem when any two bonds are nearly parallel --- src/CLASS2/dihedral_class2.cpp | 70 ++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/src/CLASS2/dihedral_class2.cpp b/src/CLASS2/dihedral_class2.cpp index 11faefee8f..0854c007a0 100644 --- a/src/CLASS2/dihedral_class2.cpp +++ b/src/CLASS2/dihedral_class2.cpp @@ -27,7 +27,6 @@ #include "math_const.h" #include "memory.h" #include "error.h" -#include "utils.h" using namespace LAMMPS_NS; using namespace MathConst; @@ -182,6 +181,11 @@ void DihedralClass2::compute(int eflag, int vflag) costh13 = c0; costh23 = (vb2xm*vb3x + vb2ym*vb3y + vb2zm*vb3z) * r12c2; + costh12 = MAX(MIN(costh12, 1.0), -1.0); + costh13 = MAX(MIN(costh12, 1.0), -1.0); + costh23 = MAX(MIN(costh12, 1.0), -1.0); + c0 = costh13; + // cos and sin of 2 angles and final c sin2 = MAX(1.0 - costh12*costh12,0.0); @@ -836,45 +840,45 @@ void DihedralClass2::read_restart(FILE *fp) allocate(); if (comm->me == 0) { - utils::sfread(FLERR,&k1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&k2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&k3[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&phi1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&phi2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&phi3[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&k1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&k2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&k3[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&phi1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&phi2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&phi3[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&mbt_f1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&mbt_f2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&mbt_f3[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&mbt_r0[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&mbt_f1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&mbt_f2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&mbt_f3[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&mbt_r0[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&ebt_f1_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_f2_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_f3_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_r0_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&ebt_f1_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_f2_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_f3_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_r0_1[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&ebt_f1_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_f2_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_f3_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_r0_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&ebt_f1_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_f2_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_f3_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_r0_2[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&at_f1_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_f2_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_f3_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&at_f1_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_f2_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_f3_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&at_f1_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_f2_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_f3_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&at_f1_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_f2_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_f3_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&aat_k[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&aat_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&aat_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&aat_k[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&aat_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&aat_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&bb13t_k[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&bb13t_r10[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&bb13t_r30[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&bb13t_k[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&bb13t_r10[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&bb13t_r30[1],sizeof(double),atom->ndihedraltypes,fp); } MPI_Bcast(&k1[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); From e5933ecc4abf20fe36d644775135aaaa52e4d48e Mon Sep 17 00:00:00 2001 From: lucienPan Date: Fri, 8 Nov 2019 16:22:57 -0500 Subject: [PATCH 411/418] Fix previous submission of nan problem --- src/CLASS2/dihedral_class2.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CLASS2/dihedral_class2.cpp b/src/CLASS2/dihedral_class2.cpp index 0854c007a0..7204e58e7a 100644 --- a/src/CLASS2/dihedral_class2.cpp +++ b/src/CLASS2/dihedral_class2.cpp @@ -182,8 +182,8 @@ void DihedralClass2::compute(int eflag, int vflag) costh23 = (vb2xm*vb3x + vb2ym*vb3y + vb2zm*vb3z) * r12c2; costh12 = MAX(MIN(costh12, 1.0), -1.0); - costh13 = MAX(MIN(costh12, 1.0), -1.0); - costh23 = MAX(MIN(costh12, 1.0), -1.0); + costh13 = MAX(MIN(costh13, 1.0), -1.0); + costh23 = MAX(MIN(costh23, 1.0), -1.0); c0 = costh13; // cos and sin of 2 angles and final c From 4baa665a80a7e96d5ad409f897d8e7f05fadd963 Mon Sep 17 00:00:00 2001 From: lucienPan Date: Fri, 8 Nov 2019 16:11:34 -0500 Subject: [PATCH 412/418] Patch of class2 dihedral Fix the NAN problem when any two bonds are nearly parallel --- src/CLASS2/dihedral_class2.cpp | 70 ++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/src/CLASS2/dihedral_class2.cpp b/src/CLASS2/dihedral_class2.cpp index 11faefee8f..7204e58e7a 100644 --- a/src/CLASS2/dihedral_class2.cpp +++ b/src/CLASS2/dihedral_class2.cpp @@ -27,7 +27,6 @@ #include "math_const.h" #include "memory.h" #include "error.h" -#include "utils.h" using namespace LAMMPS_NS; using namespace MathConst; @@ -182,6 +181,11 @@ void DihedralClass2::compute(int eflag, int vflag) costh13 = c0; costh23 = (vb2xm*vb3x + vb2ym*vb3y + vb2zm*vb3z) * r12c2; + costh12 = MAX(MIN(costh12, 1.0), -1.0); + costh13 = MAX(MIN(costh13, 1.0), -1.0); + costh23 = MAX(MIN(costh23, 1.0), -1.0); + c0 = costh13; + // cos and sin of 2 angles and final c sin2 = MAX(1.0 - costh12*costh12,0.0); @@ -836,45 +840,45 @@ void DihedralClass2::read_restart(FILE *fp) allocate(); if (comm->me == 0) { - utils::sfread(FLERR,&k1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&k2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&k3[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&phi1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&phi2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&phi3[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&k1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&k2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&k3[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&phi1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&phi2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&phi3[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&mbt_f1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&mbt_f2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&mbt_f3[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&mbt_r0[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&mbt_f1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&mbt_f2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&mbt_f3[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&mbt_r0[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&ebt_f1_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_f2_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_f3_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_r0_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&ebt_f1_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_f2_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_f3_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_r0_1[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&ebt_f1_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_f2_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_f3_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&ebt_r0_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&ebt_f1_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_f2_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_f3_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&ebt_r0_2[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&at_f1_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_f2_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_f3_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&at_f1_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_f2_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_f3_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&at_f1_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_f2_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_f3_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&at_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&at_f1_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_f2_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_f3_2[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&at_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&aat_k[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&aat_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&aat_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&aat_k[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&aat_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&aat_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp); - utils::sfread(FLERR,&bb13t_k[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&bb13t_r10[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - utils::sfread(FLERR,&bb13t_r30[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + fread(&bb13t_k[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&bb13t_r10[1],sizeof(double),atom->ndihedraltypes,fp); + fread(&bb13t_r30[1],sizeof(double),atom->ndihedraltypes,fp); } MPI_Bcast(&k1[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); From 59b5ef8fb0f762db5b3933fa3401a36021e0321c Mon Sep 17 00:00:00 2001 From: lucienPan Date: Fri, 8 Nov 2019 17:17:01 -0500 Subject: [PATCH 413/418] Patch of Dihedral class2 --- src/CLASS2/dihedral_class2.cpp | 70 +++++++++++++++++----------------- 1 file changed, 34 insertions(+), 36 deletions(-) diff --git a/src/CLASS2/dihedral_class2.cpp b/src/CLASS2/dihedral_class2.cpp index 7204e58e7a..a164edcb6d 100644 --- a/src/CLASS2/dihedral_class2.cpp +++ b/src/CLASS2/dihedral_class2.cpp @@ -2,12 +2,10 @@ LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator http://lammps.sandia.gov, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov - Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. This software is distributed under the GNU General Public License. - See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ @@ -27,6 +25,7 @@ #include "math_const.h" #include "memory.h" #include "error.h" +#include "utils.h" using namespace LAMMPS_NS; using namespace MathConst; @@ -840,45 +839,45 @@ void DihedralClass2::read_restart(FILE *fp) allocate(); if (comm->me == 0) { - fread(&k1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&k2[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&k3[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&phi1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&phi2[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&phi3[1],sizeof(double),atom->ndihedraltypes,fp); + utils::sfread(FLERR,&k1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&k2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&k3[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&phi1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&phi2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&phi3[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - fread(&mbt_f1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&mbt_f2[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&mbt_f3[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&mbt_r0[1],sizeof(double),atom->ndihedraltypes,fp); + utils::sfread(FLERR,&mbt_f1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&mbt_f2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&mbt_f3[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&mbt_r0[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - fread(&ebt_f1_1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&ebt_f2_1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&ebt_f3_1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&ebt_r0_1[1],sizeof(double),atom->ndihedraltypes,fp); + utils::sfread(FLERR,&ebt_f1_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&ebt_f2_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&ebt_f3_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&ebt_r0_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - fread(&ebt_f1_2[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&ebt_f2_2[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&ebt_f3_2[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&ebt_r0_2[1],sizeof(double),atom->ndihedraltypes,fp); + utils::sfread(FLERR,&ebt_f1_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&ebt_f2_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&ebt_f3_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&ebt_r0_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - fread(&at_f1_1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&at_f2_1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&at_f3_1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&at_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp); + utils::sfread(FLERR,&at_f1_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&at_f2_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&at_f3_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&at_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - fread(&at_f1_2[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&at_f2_2[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&at_f3_2[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&at_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp); + utils::sfread(FLERR,&at_f1_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&at_f2_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&at_f3_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&at_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - fread(&aat_k[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&aat_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&aat_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp); + utils::sfread(FLERR,&aat_k[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&aat_theta0_1[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&aat_theta0_2[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); - fread(&bb13t_k[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&bb13t_r10[1],sizeof(double),atom->ndihedraltypes,fp); - fread(&bb13t_r30[1],sizeof(double),atom->ndihedraltypes,fp); + utils::sfread(FLERR,&bb13t_k[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&bb13t_r10[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); + utils::sfread(FLERR,&bb13t_r30[1],sizeof(double),atom->ndihedraltypes,fp,NULL,error); } MPI_Bcast(&k1[1],atom->ndihedraltypes,MPI_DOUBLE,0,world); @@ -962,5 +961,4 @@ void DihedralClass2::write_data(FILE *fp) at_f1_1[i],at_f2_1[i],at_f3_1[i], at_f1_2[i],at_f2_2[i],at_f3_2[i], at_theta0_1[i]*180.0/MY_PI,at_theta0_2[i]*180.0/MY_PI); -} - +} \ No newline at end of file From 599a189545b184c5d159bdde29ecc380b7eff6e7 Mon Sep 17 00:00:00 2001 From: lucienPan Date: Fri, 8 Nov 2019 17:28:49 -0500 Subject: [PATCH 414/418] Patch of class2 dihedral --- src/CLASS2/dihedral_class2.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/CLASS2/dihedral_class2.cpp b/src/CLASS2/dihedral_class2.cpp index a164edcb6d..6b43257908 100644 --- a/src/CLASS2/dihedral_class2.cpp +++ b/src/CLASS2/dihedral_class2.cpp @@ -2,10 +2,12 @@ LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator http://lammps.sandia.gov, Sandia National Laboratories Steve Plimpton, sjplimp@sandia.gov + Copyright (2003) Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. This software is distributed under the GNU General Public License. + See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ @@ -961,4 +963,5 @@ void DihedralClass2::write_data(FILE *fp) at_f1_1[i],at_f2_1[i],at_f3_1[i], at_f1_2[i],at_f2_2[i],at_f3_2[i], at_theta0_1[i]*180.0/MY_PI,at_theta0_2[i]*180.0/MY_PI); -} \ No newline at end of file +} + From 02791e0b4d180d9aa1821e7360b603d6bf0941f1 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sun, 10 Nov 2019 17:49:15 -0600 Subject: [PATCH 415/418] Add Install_conda doc --- doc/src/Install.rst | 1 + doc/src/Install_conda.rst | 53 +++++++++++++++++++++++++++++++ doc/src/Install_mac.rst | 8 ++--- doc/txt/Install.txt | 65 --------------------------------------- doc/txt/Install_mac.txt | 43 -------------------------- 5 files changed, 58 insertions(+), 112 deletions(-) create mode 100644 doc/src/Install_conda.rst delete mode 100644 doc/txt/Install.txt delete mode 100644 doc/txt/Install_mac.txt diff --git a/doc/src/Install.rst b/doc/src/Install.rst index 52f7a43503..4a403a336d 100644 --- a/doc/src/Install.rst +++ b/doc/src/Install.rst @@ -15,6 +15,7 @@ need the source code. Install_linux Install_mac Install_windows + Install_conda Install_tarball Install_git diff --git a/doc/src/Install_conda.rst b/doc/src/Install_conda.rst new file mode 100644 index 0000000000..04b8054353 --- /dev/null +++ b/doc/src/Install_conda.rst @@ -0,0 +1,53 @@ +Download an executable for Linux or Mac via Conda +================================================= + +Binaries are available for macOS or Linux via `Conda `_. + +First, one must setup the Conda package manager on your system. Follow the +instructions to install `Miniconda `_, then create a conda +environment (named `my-lammps-env` or whatever you prefer) for your lammps +install: + +.. parsed-literal:: + + % conda config --add channels conda-forge + % conda create -n my-lammps-env + +Then, you can install lammps on your system with the following command: + +.. parsed-literal:: + + % conda activate my-lammps-env + % conda install lammps + +The LAMMPS binary is built with the :ref:`KIM package ` which +results in Conda also installing the `kim-api` binaries when LAMMPS is +installed. In order to use potentials from `openkim.org `_, you can +install the `openkim-models` package + + +.. parsed-literal:: + + % conda install openkim-models + +If you have problems with the installation you can post issues to +`this link `_. + +.. _conda_forge_lammps: https://github.com/conda-forge/lammps-feedstock/issues + +Thanks to Jan Janssen (Max-Planck-Institut für Eisenforschung) for setting +up the Conda capability. + + +.. _openkim: https://openkim.org + +.. _conda: https://docs.conda.io/en/latest/index.html + +.. _mini_conda_install: https://docs.conda.io/en/latest/miniconda.html + + + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/src/Install_mac.rst b/doc/src/Install_mac.rst index 52e059b6b9..cc8bbc9a92 100644 --- a/doc/src/Install_mac.rst +++ b/doc/src/Install_mac.rst @@ -2,9 +2,10 @@ Download an executable for Mac ============================== LAMMPS can be downloaded, built, and configured for OS X on a Mac with -`Homebrew `_. The following LAMMPS packages are unavailable at this -time because of additional needs not yet met: GPU, KOKKOS, LATTE, MSCG, -MESSAGE, MPIIO POEMS VORONOI. +`Homebrew `_. (Alternatively, see the install instructions for +:doc:`Download an executable via Conda `.) The following LAMMPS +packages are unavailable at this time because of additional needs not yet met: +GPU, KOKKOS, LATTE, MSCG, MESSAGE, MPIIO POEMS VORONOI. After installing Homebrew, you can install LAMMPS on your system with the following commands: @@ -48,7 +49,6 @@ up the Homebrew capability. - .. _lws: http://lammps.sandia.gov .. _ld: Manual.html .. _lc: Commands_all.html diff --git a/doc/txt/Install.txt b/doc/txt/Install.txt deleted file mode 100644 index 0a2e870a5d..0000000000 --- a/doc/txt/Install.txt +++ /dev/null @@ -1,65 +0,0 @@ -"Previous Section"_Intro.html - "LAMMPS WWW Site"_lws - "LAMMPS -Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Build.html -:c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Commands_all.html) - -:line - -Install LAMMPS :h2 - -You can download LAMMPS as an executable or as source code. - -With source code, you also have to "build LAMMPS"_Build.html. But you -have more flexibility as to what features to include or exclude in the -build. If you plan to "modify or extend LAMMPS"_Modify.html, then you -need the source code. - - - - - -"Download an executable for Linux"_Install_linux.html -"Download an executable for Mac"_Install_mac.html -"Download an executable for Windows"_Install_windows.html :all(b) - -"Download source as a tarball"_Install_tarball.html -"Donwload source via Git"_Install_git.html -"Donwload source via SVN"_Install_svn.html -"Install patch files"_Install_patch.html :all(b) - - - -These are the files and sub-directories in the LAMMPS distribution: - -README: text file -LICENSE: GNU General Public License (GPL) -bench: benchmark problems -cmake: CMake build files -doc: documentation -examples: simple test problems -lib: additional provided or external libraries -potentials: interatomic potential files -python: Python wrapper on LAMMPS -src: source files -tools: pre- and post-processing tools :tb(s=:,a=l) - -You will have all of these if you download source. You will only have -some of them if you download executables, as explained on the pages -listed above. diff --git a/doc/txt/Install_mac.txt b/doc/txt/Install_mac.txt deleted file mode 100644 index 773c9ec93a..0000000000 --- a/doc/txt/Install_mac.txt +++ /dev/null @@ -1,43 +0,0 @@ -"Higher level section"_Install.html - "LAMMPS WWW Site"_lws - "LAMMPS -Documentation"_ld - "LAMMPS Commands"_lc :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Commands_all.html) - -:line - -Download an executable for Mac :h3 - -LAMMPS can be downloaded, built, and configured for OS X on a Mac with -"Homebrew"_homebrew. The following LAMMPS packages are unavailable at this -time because of additional needs not yet met: GPU, KOKKOS, LATTE, MSCG, -MESSAGE, MPIIO POEMS VORONOI. - -After installing Homebrew, you can install LAMMPS on your system with -the following commands: - -% brew install lammps :pre - -This will install the executables "lammps_serial" and "lammps_mpi", as well as -the LAMMPS "doc", "potentials", "tools", "bench", and "examples" directories. - -Once LAMMPS is installed, you can test the installation with the -Lennard-Jones benchmark file: - -% brew test lammps -v :pre - -The LAMMPS binary is built with the "KIM package"_Build_extras#kim which -results in Homebrew also installing the `kim-api` binaries when LAMMPS is -installed. In order to use potentials from "openkim.org"_openkim, you can -install the `openkim-models` package - -% brew install openkim-models :pre - -If you have problems with the installation you can post issues to -"this link"_homebrew. - -Thanks to Derek Thomas (derekt at cello.t.u-tokyo.ac.jp) for setting -up the Homebrew capability. -:link(homebrew,https://github.com/Homebrew/homebrew-core/issues) -:link(openkim,https://openkim.org) From 16f67ee56a863601fdb750a7179c5a5bcaa95218 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 11 Nov 2019 15:26:48 -0500 Subject: [PATCH 416/418] Add new words to false-positives.txt --- doc/utils/sphinx-config/false_positives.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index c9396984f6..5b3020c7d1 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -413,6 +413,8 @@ computable compute concat cond +conda +Conda Condens conf config @@ -712,6 +714,7 @@ Eike eim eimp Eindhoven +Eisenforschung Ejtehadi El elaplong @@ -930,6 +933,7 @@ funcs functionalities functionals funroll +für fx fy fz @@ -1175,6 +1179,7 @@ initio initializations InP inregion +Institut integrators Integrators intel @@ -1251,6 +1256,7 @@ Jacobsen jagreat Jalalvand james +Janssen Janssens Jaramillo Jarzynski @@ -1543,6 +1549,7 @@ Mackay Mackrodt Macromolecules macroparticle +macOS Madura Magda Magdeburg From 22a033f5d414bb9c993fa02f9c78acfb08625d9c Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 11 Nov 2019 15:32:09 -0500 Subject: [PATCH 417/418] Move compute_gyration_shape_chunk.txt into txt/ folder --- doc/{src => txt}/compute_gyration_shape_chunk.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/{src => txt}/compute_gyration_shape_chunk.txt (100%) diff --git a/doc/src/compute_gyration_shape_chunk.txt b/doc/txt/compute_gyration_shape_chunk.txt similarity index 100% rename from doc/src/compute_gyration_shape_chunk.txt rename to doc/txt/compute_gyration_shape_chunk.txt From 0018a88f459463bb5dcd1fb10f9b7444c30817bf Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 11 Nov 2019 15:32:48 -0500 Subject: [PATCH 418/418] Only keep RST version of compute_gyration_shape_chunk --- doc/src/compute_gyration_shape_chunk.rst | 113 +++++++++++++++++++++++ doc/txt/compute_gyration_shape_chunk.txt | 93 ------------------- 2 files changed, 113 insertions(+), 93 deletions(-) create mode 100644 doc/src/compute_gyration_shape_chunk.rst delete mode 100644 doc/txt/compute_gyration_shape_chunk.txt diff --git a/doc/src/compute_gyration_shape_chunk.rst b/doc/src/compute_gyration_shape_chunk.rst new file mode 100644 index 0000000000..fa839aea35 --- /dev/null +++ b/doc/src/compute_gyration_shape_chunk.rst @@ -0,0 +1,113 @@ +.. index:: compute gyration/shape/chunk + +compute gyration/shape/chunk command +==================================== + +Syntax +"""""" + + +.. parsed-literal:: + + compute ID group-ID gyration/shape/chunk compute-ID + +* ID, group-ID are documented in :doc:`compute ` command +* gyration/shape/chunk = style name of this compute command +* compute-ID = ID of :doc:`compute gyration/chunk ` command + +Examples +"""""""" + + +.. parsed-literal:: + + compute 1 molecule gyration/shape/chunk pe + +Description +""""""""""" + +Define a computation that calculates the eigenvalues of the gyration tensor and +three shape parameters of multiple chunks of atoms. The computation includes +all effects due to atoms passing through periodic boundaries. + +The three computed shape parameters are the asphericity, b, the acylindricity, c, +and the relative shape anisotropy, k: + +.. image:: Eqs/compute_shape_parameters.jpg + :align: center + +where lx <= ly <= lz are the three eigenvalues of the gyration tensor. A general description +of these parameters is provided in :ref:`(Mattice) ` while an application to polymer systems +can be found in :ref:`(Theodorou) `. The asphericity is always non-negative and zero +only when the three principal moments are equal. This zero condition is met when the distribution +of particles is spherically symmetric (hence the name asphericity) but also whenever the particle +distribution is symmetric with respect to the three coordinate axes, e.g., +when the particles are distributed uniformly on a cube, tetrahedron or other Platonic +solid. The acylindricity is always non-negative and zero only when the two principal +moments are equal. This zero condition is met when the distribution of particles is +cylindrically symmetric (hence the name, acylindricity), but also whenever the particle +distribution is symmetric with respect to the two coordinate axes, e.g., when the +particles are distributed uniformly on a regular prism. the relative shape anisotropy +is bounded between zero (if all points are spherically symmetric) and one +(if all points lie on a line). + +The tensor keyword must be specified in the compute gyration/chunk command. + +.. note:: + + The coordinates of an atom contribute to the gyration tensor in + "unwrapped" form, by using the image flags associated with each atom. + See the :doc:`dump custom ` command for a discussion of "unwrapped" + coordinates. See the Atoms section of the :doc:`read\_data ` + command for a discussion of image flags and how they are set for each + atom. You can reset the image flags (e.g. to 0) before invoking this + compute by using the :doc:`set image ` command. + +**Output info:** + +This compute calculates a global array with six columns, +which can be accessed by indices 1-6. The first three columns are the +eigenvalues of the gyration tensor followed by the asphericity, the acylindricity +and the relative shape anisotropy. The computed values can be used by any command +that uses global array values from a compute as input. See the :doc:`Howto output ` doc page for an overview of LAMMPS output +options. + +The array calculated by this compute is +"intensive". The first five columns will be in +distance\^2 :doc:`units ` while the sixth one is dimensionless. + +Restrictions +"""""""""""" + + +This compute is part of the USER-MISC package. It is only enabled if +LAMMPS was built with that package. See the :doc:`Build package ` doc page for more info. + +Related commands +"""""""""""""""" + +:doc:`compute gyration/chunk ` +:doc:`compute gyration/shape ` + +**Default:** none + + +---------- + + +.. _Mattice2: + + + +**(Mattice)** Mattice, Suter, Conformational Theory of Large Molecules, Wiley, New York, 1994. + +.. _Theodorou2: + + + +**(Theodorou)** Theodorou, Suter, Macromolecules, 18, 1206 (1985). + + +.. _lws: http://lammps.sandia.gov +.. _ld: Manual.html +.. _lc: Commands_all.html diff --git a/doc/txt/compute_gyration_shape_chunk.txt b/doc/txt/compute_gyration_shape_chunk.txt deleted file mode 100644 index c74d571007..0000000000 --- a/doc/txt/compute_gyration_shape_chunk.txt +++ /dev/null @@ -1,93 +0,0 @@ -"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Commands_all.html) - -:line - -compute gyration/shape/chunk command :h3 - -[Syntax:] - -compute ID group-ID gyration/shape/chunk compute-ID :pre - -ID, group-ID are documented in "compute"_compute.html command -gyration/shape/chunk = style name of this compute command -compute-ID = ID of "compute gyration/chunk"_compute_gyration_chunk.html command :ul - -[Examples:] - -compute 1 molecule gyration/shape/chunk pe :pre - -[Description:] - -Define a computation that calculates the eigenvalues of the gyration tensor and -three shape parameters of multiple chunks of atoms. The computation includes -all effects due to atoms passing through periodic boundaries. - -The three computed shape parameters are the asphericity, b, the acylindricity, c, -and the relative shape anisotropy, k: - -:c,image(Eqs/compute_shape_parameters.jpg) - -where lx <= ly <= lz are the three eigenvalues of the gyration tensor. A general description -of these parameters is provided in "(Mattice)"_#Mattice2 while an application to polymer systems -can be found in "(Theodorou)"_#Theodorou2. The asphericity is always non-negative and zero -only when the three principal moments are equal. This zero condition is met when the distribution -of particles is spherically symmetric (hence the name asphericity) but also whenever the particle -distribution is symmetric with respect to the three coordinate axes, e.g., -when the particles are distributed uniformly on a cube, tetrahedron or other Platonic -solid. The acylindricity is always non-negative and zero only when the two principal -moments are equal. This zero condition is met when the distribution of particles is -cylindrically symmetric (hence the name, acylindricity), but also whenever the particle -distribution is symmetric with respect to the two coordinate axes, e.g., when the -particles are distributed uniformly on a regular prism. the relative shape anisotropy -is bounded between zero (if all points are spherically symmetric) and one -(if all points lie on a line). - -The tensor keyword must be specified in the compute gyration/chunk command. - -NOTE: The coordinates of an atom contribute to the gyration tensor in -"unwrapped" form, by using the image flags associated with each atom. -See the "dump custom"_dump.html command for a discussion of "unwrapped" -coordinates. See the Atoms section of the "read_data"_read_data.html -command for a discussion of image flags and how they are set for each -atom. You can reset the image flags (e.g. to 0) before invoking this -compute by using the "set image"_set.html command. - -[Output info:] - -This compute calculates a global array with six columns, -which can be accessed by indices 1-6. The first three columns are the -eigenvalues of the gyration tensor followed by the asphericity, the acylindricity -and the relative shape anisotropy. The computed values can be used by any command -that uses global array values from a compute as input. See the "Howto -output"_Howto_output.html doc page for an overview of LAMMPS output -options. - -The array calculated by this compute is -"intensive". The first five columns will be in -distance^2 "units"_units.html while the sixth one is dimensionless. - -[Restrictions:] - -This compute is part of the USER-MISC package. It is only enabled if -LAMMPS was built with that package. See the "Build -package"_Build_package.html doc page for more info. - -[Related commands:] - -"compute gyration/chunk"_compute_gyration_chunk.html -"compute gyration/shape"_compute_gyration_shape.html - -[Default:] none - -:line - -:link(Mattice2) -[(Mattice)] Mattice, Suter, Conformational Theory of Large Molecules, Wiley, New York, 1994. - -:link(Theodorou2) -[(Theodorou)] Theodorou, Suter, Macromolecules, 18, 1206 (1985). -