From 41687a84a4f8c17e597634978bfcb98a25455043 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 24 May 2018 22:55:49 -0500 Subject: [PATCH 001/123] Added body and pair styles for rounded/polygon and rounded polyhedra, wall fixesthat are compatible with these body styles --- src/BODY/body_rounded_polygon.cpp | 452 ++++ src/BODY/body_rounded_polygon.h | 86 + src/BODY/body_rounded_polyhedron.cpp | 523 +++++ src/BODY/body_rounded_polyhedron.h | 88 + src/BODY/fix_wall_body_polygon.cpp | 831 ++++++++ src/BODY/fix_wall_body_polygon.h | 129 ++ src/BODY/fix_wall_body_polyhedron.cpp | 944 +++++++++ src/BODY/fix_wall_body_polyhedron.h | 143 ++ src/BODY/pair_body_rounded_polygon.cpp | 1359 ++++++++++++ src/BODY/pair_body_rounded_polygon.h | 128 ++ src/BODY/pair_body_rounded_polyhedron.cpp | 2348 +++++++++++++++++++++ src/BODY/pair_body_rounded_polyhedron.h | 176 ++ 12 files changed, 7207 insertions(+) create mode 100644 src/BODY/body_rounded_polygon.cpp create mode 100644 src/BODY/body_rounded_polygon.h create mode 100644 src/BODY/body_rounded_polyhedron.cpp create mode 100644 src/BODY/body_rounded_polyhedron.h create mode 100644 src/BODY/fix_wall_body_polygon.cpp create mode 100644 src/BODY/fix_wall_body_polygon.h create mode 100644 src/BODY/fix_wall_body_polyhedron.cpp create mode 100644 src/BODY/fix_wall_body_polyhedron.h create mode 100644 src/BODY/pair_body_rounded_polygon.cpp create mode 100644 src/BODY/pair_body_rounded_polygon.h create mode 100644 src/BODY/pair_body_rounded_polyhedron.cpp create mode 100644 src/BODY/pair_body_rounded_polyhedron.h diff --git a/src/BODY/body_rounded_polygon.cpp b/src/BODY/body_rounded_polygon.cpp new file mode 100644 index 0000000000..d848a8fa95 --- /dev/null +++ b/src/BODY/body_rounded_polygon.cpp @@ -0,0 +1,452 @@ +/* ---------------------------------------------------------------------- + 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 author: Trung Dac Nguyen (ndactrung@gmail.com) +------------------------------------------------------------------------- */ + +#include +#include "body_rounded_polygon.h" +#include "atom_vec_body.h" +#include "atom.h" +#include "force.h" +#include "domain.h" +#include "math_extra.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +#define EPSILON 1.0e-7 +enum{SPHERE,LINE}; // also in DumpImage + +/* ---------------------------------------------------------------------- */ + +BodyRoundedPolygon::BodyRoundedPolygon(LAMMPS *lmp, int narg, char **arg) : + Body(lmp, narg, arg) +{ + if (narg != 3) error->all(FLERR,"Invalid body rounded/polygon command"); + + if (domain->dimension != 2) + error->all(FLERR,"Atom_style body rounded/polygon " + "can only be used in 2d simulations"); + + // nmin and nmax are minimum and maximum number of vertices + + int nmin = force->inumeric(FLERR,arg[1]); + int nmax = force->inumeric(FLERR,arg[2]); + if (nmin <= 0 || nmin > nmax) + error->all(FLERR,"Invalid body rounded/polygon command"); + + size_forward = 0; + + // 1 integer for number of vertices, + // 3*nmax doubles for vertex coordinates + 2*nmax doubles for edge ends + // 1 double for the enclosing radius + // 1 double for the rounded radius + + size_border = 1 + 3*nmax + 2*nmax + 1 + 1; + + // NOTE: need to set appropriate nnbin param for dcp + + icp = new MyPoolChunk(1,1); + dcp = new MyPoolChunk(3*nmin+2*nmin+1+1,3*nmax+2*nmax+1+1); + + memory->create(imflag,nmax,"body/rounded/polygon:imflag"); + memory->create(imdata,nmax,7,"body/nparticle:imdata"); +} + +/* ---------------------------------------------------------------------- */ + +BodyRoundedPolygon::~BodyRoundedPolygon() +{ + delete icp; + delete dcp; + memory->destroy(imflag); + memory->destroy(imdata); +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolygon::nsub(AtomVecBody::Bonus *bonus) +{ + return bonus->ivalue[0]; +} + +/* ---------------------------------------------------------------------- */ + +double *BodyRoundedPolygon::coords(AtomVecBody::Bonus *bonus) +{ + return bonus->dvalue; +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolygon::nedges(AtomVecBody::Bonus *bonus) +{ + int nvertices = bonus->ivalue[0]; + if (nvertices == 1) return 0; + else if (nvertices == 2) return 1; + return nvertices; +} + +/* ---------------------------------------------------------------------- */ + +double *BodyRoundedPolygon::edges(AtomVecBody::Bonus *bonus) +{ + return bonus->dvalue+3*nsub(bonus); +} + +/* ---------------------------------------------------------------------- */ + +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*nsub(bonus)); +} + +/* ---------------------------------------------------------------------- */ + +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*nsub(bonus)+1); +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolygon::pack_border_body(AtomVecBody::Bonus *bonus, double *buf) +{ + int nsub = bonus->ivalue[0]; + buf[0] = nsub; + memcpy(&buf[1],bonus->dvalue,(3*nsub+2*nsub+1+1)*sizeof(double)); + return 1+(3*nsub+2*nsub+1+1); +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolygon::unpack_border_body(AtomVecBody::Bonus *bonus, + double *buf) +{ + int nsub = static_cast (buf[0]); + bonus->ivalue[0] = nsub; + memcpy(bonus->dvalue,&buf[1],(3*nsub+2*nsub+1+1)*sizeof(double)); + return 1+(3*nsub+2*nsub+1+1); +} + +/* ---------------------------------------------------------------------- + populate bonus data structure with data file values +------------------------------------------------------------------------- */ + +void BodyRoundedPolygon::data_body(int ibonus, int ninteger, int ndouble, + int *ifile, double *dfile) +{ + AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; + + // set ninteger, ndouble in bonus and allocate 2 vectors of ints, doubles + + if (ninteger != 1) + error->one(FLERR,"Incorrect # of integer values in " + "Bodies section of data file"); + int nsub = ifile[0]; + if (nsub < 1) + error->one(FLERR,"Incorrect integer value in " + "Bodies section of data file"); + + // nentries = number of double entries to be read from Body section: + // 6 for inertia + 3*nsub for vertex coords + 1 for rounded radius + + int nentries = 6 + 3*nsub + 1; + if (ndouble != nentries) + error->one(FLERR,"Incorrect # of floating-point values in " + "Bodies section of data file"); + + bonus->ninteger = 1; + bonus->ivalue = icp->get(bonus->iindex); + bonus->ivalue[0] = nsub; + bonus->ndouble = 3*nsub + 2*nsub + 1 + 1; + bonus->dvalue = dcp->get(bonus->ndouble,bonus->dindex); + + // diagonalize inertia tensor + + double tensor[3][3]; + tensor[0][0] = dfile[0]; + tensor[1][1] = dfile[1]; + tensor[2][2] = dfile[2]; + tensor[0][1] = tensor[1][0] = dfile[3]; + tensor[0][2] = tensor[2][0] = dfile[4]; + tensor[1][2] = tensor[2][1] = dfile[5]; + + double *inertia = bonus->inertia; + double evectors[3][3]; + int ierror = MathExtra::jacobi(tensor,inertia,evectors); + if (ierror) error->one(FLERR, + "Insufficient Jacobi rotations for body nparticle"); + + // if any principal moment < scaled EPSILON, set to 0.0 + + double max; + max = MAX(inertia[0],inertia[1]); + max = MAX(max,inertia[2]); + + if (inertia[0] < EPSILON*max) inertia[0] = 0.0; + if (inertia[1] < EPSILON*max) inertia[1] = 0.0; + if (inertia[2] < EPSILON*max) inertia[2] = 0.0; + + // exyz_space = principal axes in space frame + + double ex_space[3],ey_space[3],ez_space[3]; + + ex_space[0] = evectors[0][0]; + ex_space[1] = evectors[1][0]; + ex_space[2] = evectors[2][0]; + ey_space[0] = evectors[0][1]; + ey_space[1] = evectors[1][1]; + ey_space[2] = evectors[2][1]; + ez_space[0] = evectors[0][2]; + ez_space[1] = evectors[1][2]; + ez_space[2] = evectors[2][2]; + + // enforce 3 evectors as a right-handed coordinate system + // flip 3rd vector if needed + + double cross[3]; + MathExtra::cross3(ex_space,ey_space,cross); + if (MathExtra::dot3(cross,ez_space) < 0.0) MathExtra::negate3(ez_space); + + // create initial quaternion + + MathExtra::exyz_to_q(ex_space,ey_space,ez_space,bonus->quat); + + // bonus->dvalue = the first 3*nsub elements are sub-particle displacements + // find the enclosing radius of the body from the maximum displacement + + int i,m; + double delta[3], rsq, erad, rrad; + double erad2 = 0; + int j = 6; + int k = 0; + for (i = 0; i < nsub; i++) { + delta[0] = dfile[j]; + delta[1] = dfile[j+1]; + delta[2] = dfile[j+2]; + MathExtra::transpose_matvec(ex_space,ey_space,ez_space, + delta,&bonus->dvalue[k]); + rsq = delta[0] * delta[0] + delta[1] * delta[1] + + delta[2] * delta[2]; + if (rsq > erad2) erad2 = rsq; + j += 3; + k += 3; + } + + // .. the next 2*nsub elements are edge ends + + int nedges; + if (nsub == 1) { // spheres + nedges = 0; + bonus->dvalue[k] = 0; + *(&bonus->dvalue[k]+1) = 0; + k += 2; + + // the last element of bonus->dvalue is the rounded & enclosing radius + + rrad = 0.5 * dfile[j]; + bonus->dvalue[k] = rrad; + erad = rrad; + + k++; + bonus->dvalue[k] = rrad; + + atom->radius[bonus->ilocal] = erad; + + } else if (nsub == 2) { // rods + nedges = 1; + for (i = 0; i < nedges; i++) { + bonus->dvalue[k] = 0; + *(&bonus->dvalue[k]+1) = 1; + k += 2; + } + + erad = sqrt(erad2); + bonus->dvalue[k] = erad; + + // the last element of bonus->dvalue is the rounded radius + + rrad = 0.5 * dfile[j]; + k++; + bonus->dvalue[k] = rrad; + + atom->radius[bonus->ilocal] = erad + rrad; + + } else { // polygons + nedges = nsub; + for (i = 0; i < nedges; i++) { + bonus->dvalue[k] = i; + m = i+1; + if (m == nedges) m = 0; + *(&bonus->dvalue[k]+1) = m; + k += 2; + } + + // the next to last element is the enclosing radius + + erad = sqrt(erad2); + bonus->dvalue[k] = erad; + + // the last element of bonus->dvalue is the rounded radius + + rrad = 0.5 * dfile[j]; + k++; + bonus->dvalue[k] = rrad; + + atom->radius[bonus->ilocal] = erad + rrad; + } +} + +/* ---------------------------------------------------------------------- + return radius of body particle defined by ifile/dfile params + params are ordered as in data file + called by Molecule class which needs single body size +------------------------------------------------------------------------- */ + +double BodyRoundedPolygon::radius_body(int ninteger, int ndouble, + int *ifile, double *dfile) +{ + int nsub = ifile[0]; + if (nsub < 1) + error->one(FLERR,"Incorrect integer value in " + "Bodies section of data file"); + if (ndouble != 6 + 3*nsub + 1) + error->one(FLERR,"Incorrect # of floating-point values in " + "Bodies section of data file"); + + // sub-particle coords are relative to body center at (0,0,0) + // offset = 6 for sub-particle coords + + double onerad; + double maxrad = 0.0; + double delta[3]; + + int offset = 6; + for (int i = 0; i < nsub; i++) { + delta[0] = dfile[offset]; + delta[1] = dfile[offset+1]; + delta[2] = dfile[offset+2]; + offset += 3; + onerad = MathExtra::len3(delta); + maxrad = MAX(maxrad,onerad); + } + + // add in radius of rounded corners + + return maxrad + 0.5*dfile[offset]; +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolygon::noutcol() +{ + // the number of columns for the vertex coordinates + + return 3; +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolygon::noutrow(int ibonus) +{ + // only return the first nsub rows for the vertex coordinates + + return avec->bonus[ibonus].ivalue[0]; +} + +/* ---------------------------------------------------------------------- */ + +void BodyRoundedPolygon::output(int ibonus, int m, double *values) +{ + AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; + + double p[3][3]; + MathExtra::quat_to_mat(bonus->quat,p); + MathExtra::matvec(p,&bonus->dvalue[3*m],values); + + double *x = atom->x[bonus->ilocal]; + values[0] += x[0]; + values[1] += x[1]; + values[2] += x[2]; +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolygon::image(int ibonus, double flag1, double flag2, + int *&ivec, double **&darray) +{ + int j; + double p[3][3]; + double *x, rrad; + + AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; + int n = bonus->ivalue[0]; + + if (n == 1) { + for (int i = 0; i < n; i++) { + imflag[i] = SPHERE; + MathExtra::quat_to_mat(bonus->quat,p); + MathExtra::matvec(p,&bonus->dvalue[3*i],imdata[i]); + + rrad = enclosing_radius(bonus); + x = atom->x[bonus->ilocal]; + imdata[i][0] += x[0]; + imdata[i][1] += x[1]; + imdata[i][2] += x[2]; + if (flag1 <= 0) imdata[i][3] = 2*rrad; + else imdata[i][3] = flag1; + } + + } else { + + // first end pt of each line + + for (int i = 0; i < n; i++) { + imflag[i] = LINE; + MathExtra::quat_to_mat(bonus->quat,p); + MathExtra::matvec(p,&bonus->dvalue[3*i],imdata[i]); + + rrad = rounded_radius(bonus); + x = atom->x[bonus->ilocal]; + imdata[i][0] += x[0]; + imdata[i][1] += x[1]; + imdata[i][2] += x[2]; + if (flag1 <= 0) imdata[i][6] = 2*rrad; + else imdata[i][6] = flag1; + } + + // second end pt of each line + + for (int i = 0; i < n; i++) { + j = i+1; + if (j == n) j = 0; + imdata[i][3] = imdata[j][0]; + imdata[i][4] = imdata[j][1]; + imdata[i][5] = imdata[j][2]; + } + } + + ivec = imflag; + darray = imdata; + return n; +} diff --git a/src/BODY/body_rounded_polygon.h b/src/BODY/body_rounded_polygon.h new file mode 100644 index 0000000000..b6f45c5cf5 --- /dev/null +++ b/src/BODY/body_rounded_polygon.h @@ -0,0 +1,86 @@ +/* -*- 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 BODY_CLASS + +BodyStyle(rounded/polygon,BodyRoundedPolygon) + +#else + +#ifndef LMP_BODY_ROUNDED_POLYGON_H +#define LMP_BODY_ROUNDED_POLYGON_H + +#include "body.h" +#include "atom_vec_body.h" + +namespace LAMMPS_NS { + +class BodyRoundedPolygon : public Body { + public: + BodyRoundedPolygon(class LAMMPS *, int, char **); + ~BodyRoundedPolygon(); + int nsub(struct AtomVecBody::Bonus *); + double *coords(struct AtomVecBody::Bonus *); + int nedges(struct AtomVecBody::Bonus *); + double *edges(struct AtomVecBody::Bonus *); + double enclosing_radius(struct AtomVecBody::Bonus *); + double rounded_radius(struct AtomVecBody::Bonus *); + + int pack_border_body(struct AtomVecBody::Bonus *, double *); + int unpack_border_body(struct AtomVecBody::Bonus *, double *); + void data_body(int, int, int, int *, double *); + double radius_body(int, int, int *, double *); + + int noutrow(int); + int noutcol(); + void output(int, int, double *); + int image(int, double, double, int *&, double **&); + + private: + int *imflag; + double **imdata; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Invalid body rounded/polygon command + +Arguments in atom-style command are not correct. + +E: Invalid format in Bodies section of data file + +The specified number of integer or floating point values does not +appear. + +E: Incorrect # of integer values in Bodies section of data file + +See doc page for body style. + +E: Incorrect integer value in Bodies section of data file + +See doc page for body style. + +E: Incorrect # of floating-point values in Bodies section of data file + +See doc page for body style. + +E: Insufficient Jacobi rotations for body nparticle + +Eigensolve for rigid body was not sufficiently accurate. + +*/ diff --git a/src/BODY/body_rounded_polyhedron.cpp b/src/BODY/body_rounded_polyhedron.cpp new file mode 100644 index 0000000000..a26b6d0cbd --- /dev/null +++ b/src/BODY/body_rounded_polyhedron.cpp @@ -0,0 +1,523 @@ +/* ---------------------------------------------------------------------- + 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 author: Trung Dac Nguyen (ndactrung@gmail.com) +------------------------------------------------------------------------- */ + +#include +#include "body_rounded_polyhedron.h" +#include "atom_vec_body.h" +#include "atom.h" +#include "force.h" +#include "domain.h" +#include "math_extra.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +#define EPSILON 1.0e-7 +#define MAX_FACE_SIZE 4 // maximum number of vertices per face (for now) + +enum{SPHERE,LINE}; // also in DumpImage + +/* ---------------------------------------------------------------------- */ + +BodyRoundedPolyhedron::BodyRoundedPolyhedron(LAMMPS *lmp, int narg, char **arg) : + Body(lmp, narg, arg) +{ + if (narg != 3) error->all(FLERR,"Invalid body rounded/polygon command"); + + // nmin and nmax are minimum and maximum number of vertices + + int nmin = force->inumeric(FLERR,arg[1]); + int nmax = force->inumeric(FLERR,arg[2]); + if (nmin <= 0 || nmin > nmax) + error->all(FLERR,"Invalid body rounded/polyhedron command"); + + size_forward = 0; + + // 1 integer for number of vertices, + // 3*nmax doubles for vertex coordinates + 2*nmax doubles for edge ends + + // (MAX_FACE_SIZE+1)*nmax for faces + // 1 double for the enclosing radius + // 1 double for the rounded radius + + size_border = 1 + 3*nmax + 2*nmax + MAX_FACE_SIZE*nmax + 1 + 1; + + // NOTE: need to set appropriate nnbin param for dcp + + icp = new MyPoolChunk(1,3); + dcp = new MyPoolChunk(3*nmin+2+1+1, + 3*nmax+2*nmax+MAX_FACE_SIZE*nmax+1+1); + + memory->create(imflag,2*nmax,"body/rounded/polyhedron:imflag"); + memory->create(imdata,2*nmax,7,"body/polyhedron:imdata"); +} + +/* ---------------------------------------------------------------------- */ + +BodyRoundedPolyhedron::~BodyRoundedPolyhedron() +{ + delete icp; + delete dcp; + memory->destroy(imflag); + memory->destroy(imdata); +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolyhedron::nsub(AtomVecBody::Bonus *bonus) +{ + return bonus->ivalue[0]; +} + +/* ---------------------------------------------------------------------- */ + +double *BodyRoundedPolyhedron::coords(AtomVecBody::Bonus *bonus) +{ + return bonus->dvalue; +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolyhedron::nedges(AtomVecBody::Bonus *bonus) +{ + int nvertices = bonus->ivalue[0]; + int nedges = bonus->ivalue[1]; + int nfaces = bonus->ivalue[2]; + if (nvertices == 1) return 0; + else if (nvertices == 2) return 1; + return nedges; //(nvertices+nfaces-2); // Euler's polyon formula: V-E+F=2 +} + +/* ---------------------------------------------------------------------- */ + +double *BodyRoundedPolyhedron::edges(AtomVecBody::Bonus *bonus) +{ + return bonus->dvalue+3*nsub(bonus); +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolyhedron::nfaces(AtomVecBody::Bonus *bonus) +{ + return bonus->ivalue[2]; +} + +/* ---------------------------------------------------------------------- */ + +double *BodyRoundedPolyhedron::faces(AtomVecBody::Bonus *bonus) +{ + int nvertices = bonus->ivalue[0]; + if (nvertices == 1 || nvertices == 2) return NULL; + return bonus->dvalue+3*nsub(bonus)+2*nedges(bonus); +} + +/* ---------------------------------------------------------------------- */ + +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*nedges(bonus)+MAX_FACE_SIZE*nfaces(bonus)); +} + +/* ---------------------------------------------------------------------- */ + +double BodyRoundedPolyhedron::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*nedges(bonus)+MAX_FACE_SIZE*nfaces(bonus)+1); +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolyhedron::pack_border_body(AtomVecBody::Bonus *bonus, double *buf) +{ + int nsub = bonus->ivalue[0]; + int ned = bonus->ivalue[1]; + int nfac = bonus->ivalue[2]; + buf[0] = nsub; + buf[1] = ned; + buf[2] = nfac; + int ndouble; + if (nsub == 1 || nsub == 2) ndouble = 3*nsub+2+MAX_FACE_SIZE*nfac+1+1; + else ndouble = 3*nsub+2*nedges(bonus)+MAX_FACE_SIZE*nfac+1+1; + memcpy(&buf[3],bonus->dvalue,ndouble*sizeof(double)); + return 3+ndouble; +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolyhedron::unpack_border_body(AtomVecBody::Bonus *bonus, + double *buf) +{ + int nsub = static_cast (buf[0]); + int ned = static_cast (buf[1]); + int nfac = static_cast (buf[2]); + bonus->ivalue[0] = nsub; + bonus->ivalue[1] = ned; + bonus->ivalue[2] = nfac; + int ndouble; + if (nsub == 1 || nsub == 2) ndouble = 3*nsub+2+MAX_FACE_SIZE*nfac+1+1; + else ndouble = 3*nsub+2*nedges(bonus)+MAX_FACE_SIZE*nfac+1+1; + memcpy(bonus->dvalue,&buf[3],ndouble*sizeof(double)); + return 3+ndouble; +} + +/* ---------------------------------------------------------------------- + populate bonus data structure with data file values +------------------------------------------------------------------------- */ + +void BodyRoundedPolyhedron::data_body(int ibonus, int ninteger, int ndouble, + int *ifile, double *dfile) +{ + AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; + + // set ninteger, ndouble in bonus and allocate 2 vectors of ints, doubles + + if (ninteger != 3) + error->one(FLERR,"Incorrect # of integer values in " + "Bodies section of data file"); + int nsub = ifile[0]; + int ned = ifile[1]; + int nfac = ifile[2]; + if (nsub < 1) + error->one(FLERR,"Incorrect integer value in " + "Bodies section of data file"); + + // nentries = number of double entries to be read from Body section: + // nsub == 1 || nsub == 2 || nsub == 3: + // 6 for inertia + 3*nsub for vertex coords + 1 for rounded radius + // nsub > 3: + // 6 for inertia + 3*nsub for vertex coords + 2*nsub for edges + 3*nfaces + 1 for rounded radius + + int nedges,nentries; + if (nsub == 1 || nsub == 2) { + nentries = 6 + 3*nsub + 1; + } else { + nedges = ned; //nsub + nfac - 2; + nentries = 6 + 3*nsub + 2*nedges + MAX_FACE_SIZE*nfac + 1; + } + if (ndouble != nentries) + error->one(FLERR,"Incorrect # of floating-point values in " + "Bodies section of data file"); + + bonus->ninteger = 3; + bonus->ivalue = icp->get(bonus->iindex); + bonus->ivalue[0] = nsub; + bonus->ivalue[1] = ned; + bonus->ivalue[2] = nfac; + if (nsub == 1 || nsub == 2) bonus->ndouble = 3*nsub + 2*nsub + 1 + 1; + else bonus->ndouble = 3*nsub + 2*nedges + MAX_FACE_SIZE*nfac + 1 + 1; + bonus->dvalue = dcp->get(bonus->ndouble,bonus->dindex); + + // diagonalize inertia tensor + + double tensor[3][3]; + tensor[0][0] = dfile[0]; + tensor[1][1] = dfile[1]; + tensor[2][2] = dfile[2]; + tensor[0][1] = tensor[1][0] = dfile[3]; + tensor[0][2] = tensor[2][0] = dfile[4]; + tensor[1][2] = tensor[2][1] = dfile[5]; + + double *inertia = bonus->inertia; + double evectors[3][3]; + int ierror = MathExtra::jacobi(tensor,inertia,evectors); + if (ierror) error->one(FLERR, + "Insufficient Jacobi rotations for body nparticle"); + + // if any principal moment < scaled EPSILON, set to 0.0 + + double max; + max = MAX(inertia[0],inertia[1]); + max = MAX(max,inertia[2]); + + if (inertia[0] < EPSILON*max) inertia[0] = 0.0; + if (inertia[1] < EPSILON*max) inertia[1] = 0.0; + if (inertia[2] < EPSILON*max) inertia[2] = 0.0; + + // exyz_space = principal axes in space frame + + double ex_space[3],ey_space[3],ez_space[3]; + + ex_space[0] = evectors[0][0]; + ex_space[1] = evectors[1][0]; + ex_space[2] = evectors[2][0]; + ey_space[0] = evectors[0][1]; + ey_space[1] = evectors[1][1]; + ey_space[2] = evectors[2][1]; + ez_space[0] = evectors[0][2]; + ez_space[1] = evectors[1][2]; + ez_space[2] = evectors[2][2]; + + // enforce 3 evectors as a right-handed coordinate system + // flip 3rd vector if needed + + double cross[3]; + MathExtra::cross3(ex_space,ey_space,cross); + if (MathExtra::dot3(cross,ez_space) < 0.0) MathExtra::negate3(ez_space); + + // create initial quaternion + + MathExtra::exyz_to_q(ex_space,ey_space,ez_space,bonus->quat); + + // bonus->dvalue = the first 3*nsub elements are sub-particle displacements + // find the enclosing radius of the body from the maximum displacement + + int i,m; + double delta[3], rsq, erad, rrad; + double erad2 = 0; + int j = 6; + int k = 0; + for (i = 0; i < nsub; i++) { + delta[0] = dfile[j]; + delta[1] = dfile[j+1]; + delta[2] = dfile[j+2]; + MathExtra::transpose_matvec(ex_space,ey_space,ez_space, + delta,&bonus->dvalue[k]); + rsq = delta[0] * delta[0] + delta[1] * delta[1] + + delta[2] * delta[2]; + if (rsq > erad2) erad2 = rsq; + j += 3; + k += 3; + } + + // .. the next 2*nsub elements are edge ends + + if (nsub == 1) { // spheres + nedges = 0; + bonus->dvalue[k] = 0; + *(&bonus->dvalue[k]+1) = 0; + k += 2; + + rrad = 0.5 * dfile[j]; + bonus->dvalue[k] = rrad; + erad = rrad; // enclosing radius = rounded_radius + + // the last element of bonus->dvalue is the rounded radius + + k++; + bonus->dvalue[k] = rrad; + + atom->radius[bonus->ilocal] = erad; + + } else if (nsub == 2) { // rods + nedges = 1; + for (i = 0; i < nedges; i++) { + bonus->dvalue[k] = 0; + *(&bonus->dvalue[k]+1) = 1; + k += 2; + } + + erad = sqrt(erad2); + bonus->dvalue[k] = erad; + + // the last element of bonus->dvalue is the rounded radius + + rrad = 0.5 * dfile[j]; + k++; + bonus->dvalue[k] = rrad; + + atom->radius[bonus->ilocal] = erad + rrad; + + } else { // polyhedra + + // edges + + for (i = 0; i < nedges; i++) { + bonus->dvalue[k] = dfile[j]; + *(&bonus->dvalue[k]+1) = dfile[j+1]; + k += 2; + j += 2; + } + + // faces + + for (i = 0; i < nfac; i++) { + for (m = 0; m < MAX_FACE_SIZE; m++) + *(&bonus->dvalue[k]+m) = dfile[j+m]; + k += MAX_FACE_SIZE; + j += MAX_FACE_SIZE; + } + + // the next to last element is the enclosing radius + + erad = sqrt(erad2); + bonus->dvalue[k] = erad; + + // the last element bonus-> dvalue is the rounded radius + + rrad = 0.5 * dfile[j]; + k++; + bonus->dvalue[k] = rrad; + + atom->radius[bonus->ilocal] = erad + rrad; + } +} + +/* ---------------------------------------------------------------------- + return radius of body particle defined by ifile/dfile params + params are ordered as in data file + called by Molecule class which needs single body size +------------------------------------------------------------------------- */ + +double BodyRoundedPolyhedron::radius_body(int ninteger, int ndouble, + int *ifile, double *dfile) +{ + int nsub = ifile[0]; + int ned = ifile[1]; + int nfac = ifile[2]; + int nedges = ned; //nsub + nfac - 2; + + int nentries; + if (nsub == 1 || nsub == 2) nentries = 6 + 3*nsub + 1; + else nentries = 6 + 3*nsub + 2*nedges + MAX_FACE_SIZE*nfac + 1; + + if (nsub < 1) + error->one(FLERR,"Incorrect integer value in " + "Bodies section of data file"); + if (ndouble != nentries) + error->one(FLERR,"Incorrect # of floating-point values in " + "Bodies section of data file"); + + // sub-particle coords are relative to body center at (0,0,0) + // offset = 6 for sub-particle coords + + double onerad; + double maxrad = 0.0; + double delta[3]; + + int offset = 6; + for (int i = 0; i < nsub; i++) { + delta[0] = dfile[offset]; + delta[1] = dfile[offset+1]; + delta[2] = dfile[offset+2]; + offset += 3; + onerad = MathExtra::len3(delta); + maxrad = MAX(maxrad,onerad); + } + + if (nsub > 2) offset += (2*nedges+MAX_FACE_SIZE*nfac); + + // add in radius of rounded corners + + return maxrad + 0.5*dfile[offset]; +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolyhedron::noutcol() +{ + // the number of columns for the vertex coordinates + + return 3; +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolyhedron::noutrow(int ibonus) +{ + // only return the first nsub rows for the vertex coordinates + + return avec->bonus[ibonus].ivalue[0]; +} + +/* ---------------------------------------------------------------------- */ + +void BodyRoundedPolyhedron::output(int ibonus, int m, double *values) +{ + AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; + + double p[3][3]; + MathExtra::quat_to_mat(bonus->quat,p); + MathExtra::matvec(p,&bonus->dvalue[3*m],values); + + double *x = atom->x[bonus->ilocal]; + values[0] += x[0]; + values[1] += x[1]; + values[2] += x[2]; +} + +/* ---------------------------------------------------------------------- */ + +int BodyRoundedPolyhedron::image(int ibonus, double flag1, double flag2, + int *&ivec, double **&darray) +{ + int j, nelements; + double p[3][3]; + double *x, rrad; + + AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; + int nvertices = bonus->ivalue[0]; + + if (nvertices == 1) { // spheres + + for (int i = 0; i < nvertices; i++) { + imflag[i] = SPHERE; + MathExtra::quat_to_mat(bonus->quat,p); + MathExtra::matvec(p,&bonus->dvalue[3*i],imdata[i]); + + rrad = enclosing_radius(bonus); + x = atom->x[bonus->ilocal]; + imdata[i][0] += x[0]; + imdata[i][1] += x[1]; + imdata[i][2] += x[2]; + if (flag1 <= 0) imdata[i][3] = 2*rrad; + else imdata[i][3] = flag1; + } + + nelements = nvertices; + } else { + int nfaces = bonus->ivalue[2]; + int nedges = bonus->ivalue[1]; //nvertices + nfaces - 2; + if (nvertices == 2) nedges = 1; // special case: rods + double* edge_ends = &bonus->dvalue[3*nvertices]; + int pt1, pt2; + + for (int i = 0; i < nedges; i++) { + imflag[i] = LINE; + + pt1 = static_cast(edge_ends[2*i]); + pt2 = static_cast(edge_ends[2*i+1]); + + MathExtra::quat_to_mat(bonus->quat,p); + MathExtra::matvec(p,&bonus->dvalue[3*pt1],imdata[i]); + MathExtra::matvec(p,&bonus->dvalue[3*pt2],&imdata[i][3]); + + rrad = rounded_radius(bonus); + x = atom->x[bonus->ilocal]; + imdata[i][0] += x[0]; + imdata[i][1] += x[1]; + imdata[i][2] += x[2]; + imdata[i][3] += x[0]; + imdata[i][4] += x[1]; + imdata[i][5] += x[2]; + + if (flag1 <= 0) imdata[i][6] = 2*rrad; + else imdata[i][6] = flag1; + } + + nelements = nedges; + } + + ivec = imflag; + darray = imdata; + return nelements; +} diff --git a/src/BODY/body_rounded_polyhedron.h b/src/BODY/body_rounded_polyhedron.h new file mode 100644 index 0000000000..e5b15fd8f9 --- /dev/null +++ b/src/BODY/body_rounded_polyhedron.h @@ -0,0 +1,88 @@ +/* -*- 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 BODY_CLASS + +BodyStyle(rounded/polyhedron,BodyRoundedPolyhedron) + +#else + +#ifndef LMP_BODY_ROUNDED_POLYHEDRON_H +#define LMP_BODY_ROUNDED_POLYHEDRON_H + +#include "body.h" +#include "atom_vec_body.h" + +namespace LAMMPS_NS { + +class BodyRoundedPolyhedron : public Body { + public: + BodyRoundedPolyhedron(class LAMMPS *, int, char **); + ~BodyRoundedPolyhedron(); + int nsub(struct AtomVecBody::Bonus *); + double *coords(struct AtomVecBody::Bonus *); + int nedges(struct AtomVecBody::Bonus *); + double *edges(struct AtomVecBody::Bonus *); + int nfaces(struct AtomVecBody::Bonus *); + double *faces(struct AtomVecBody::Bonus *); + double enclosing_radius(struct AtomVecBody::Bonus *); + double rounded_radius(struct AtomVecBody::Bonus *); + + int pack_border_body(struct AtomVecBody::Bonus *, double *); + int unpack_border_body(struct AtomVecBody::Bonus *, double *); + void data_body(int, int, int, int *, double *); + double radius_body(int, int, int *, double *); + + int noutrow(int); + int noutcol(); + void output(int, int, double *); + int image(int, double, double, int *&, double **&); + + private: + int *imflag; + double **imdata; +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Invalid body rounded/polyhedron command + +Arguments in atom-style command are not correct. + +E: Invalid format in Bodies section of data file + +The specified number of integer or floating point values does not +appear. + +E: Incorrect # of integer values in Bodies section of data file + +See doc page for body style. + +E: Incorrect integer value in Bodies section of data file + +See doc page for body style. + +E: Incorrect # of floating-point values in Bodies section of data file + +See doc page for body style. + +E: Insufficient Jacobi rotations for body rounded/polyhedron + +Eigensolve for rigid body was not sufficiently accurate. + +*/ diff --git a/src/BODY/fix_wall_body_polygon.cpp b/src/BODY/fix_wall_body_polygon.cpp new file mode 100644 index 0000000000..ea81ae26df --- /dev/null +++ b/src/BODY/fix_wall_body_polygon.cpp @@ -0,0 +1,831 @@ +/* ---------------------------------------------------------------------- + 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: Trung Dac Nguyen (ndactrung@gmail.com) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "fix_wall_body_polygon.h" +#include "atom.h" +#include "atom_vec_body.h" +#include "body_rounded_polygon.h" +#include "domain.h" +#include "update.h" +#include "force.h" +#include "pair.h" +#include "modify.h" +#include "respa.h" +#include "math_const.h" +#include "math_extra.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace FixConst; +using namespace MathConst; + +enum{XPLANE=0,YPLANE=1,ZCYLINDER}; // XYZ PLANE need to be 0,1,2 +enum{HOOKE,HOOKE_HISTORY}; + +enum {INVALID=0,NONE=1,VERTEX=2}; +enum {FAR=0,XLO,XHI,YLO,YHI}; + +//#define _POLYGON_DEBUG +#define DELTA 10000 +#define EPSILON 1e-2 +#define BIG 1.0e20 +#define MAX_CONTACTS 4 // maximum number of contacts for 2D models +#define EFF_CONTACTS 2 // effective contacts for 2D models + +/* ---------------------------------------------------------------------- */ + +FixWallBodyPolygon::FixWallBodyPolygon(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + if (narg < 7) error->all(FLERR,"Illegal fix wall/body/polygon command"); + + if (!atom->body_flag) + error->all(FLERR,"Fix wall/body/polygon requires atom style body/rounded/polygon"); + + restart_peratom = 1; + create_attribute = 1; + + // wall/particle coefficients + + kn = force->numeric(FLERR,arg[3]); + + c_n = force->numeric(FLERR,arg[4]); + if (strcmp(arg[5],"NULL") == 0) c_t = 0.5 * c_n; + else c_t = force->numeric(FLERR,arg[5]); + + if (kn < 0.0 || c_n < 0.0 || c_t < 0.0) + error->all(FLERR,"Illegal fix wall/body/polygon command"); + + // wallstyle args + + int iarg = 6; + if (strcmp(arg[iarg],"xplane") == 0) { + if (narg < iarg+3) error->all(FLERR,"Illegal fix wall/body/polygon command"); + wallstyle = XPLANE; + if (strcmp(arg[iarg+1],"NULL") == 0) lo = -BIG; + else lo = force->numeric(FLERR,arg[iarg+1]); + if (strcmp(arg[iarg+2],"NULL") == 0) hi = BIG; + else hi = force->numeric(FLERR,arg[iarg+2]); + iarg += 3; + } else if (strcmp(arg[iarg],"yplane") == 0) { + if (narg < iarg+3) error->all(FLERR,"Illegal fix wall/body/polygon command"); + wallstyle = YPLANE; + if (strcmp(arg[iarg+1],"NULL") == 0) lo = -BIG; + else lo = force->numeric(FLERR,arg[iarg+1]); + if (strcmp(arg[iarg+2],"NULL") == 0) hi = BIG; + else hi = force->numeric(FLERR,arg[iarg+2]); + iarg += 3; + } else if (strcmp(arg[iarg],"zcylinder") == 0) { + if (narg < iarg+2) error->all(FLERR,"Illegal fix wall/body/polygon command"); + wallstyle = ZCYLINDER; + lo = hi = 0.0; + cylradius = force->numeric(FLERR,arg[iarg+1]); + iarg += 2; + } + + // check for trailing keyword/values + + wiggle = 0; + + while (iarg < narg) { + if (strcmp(arg[iarg],"wiggle") == 0) { + if (iarg+4 > narg) error->all(FLERR,"Illegal fix wall/body/polygon command"); + if (strcmp(arg[iarg+1],"x") == 0) axis = 0; + else if (strcmp(arg[iarg+1],"y") == 0) axis = 1; + else if (strcmp(arg[iarg+1],"z") == 0) axis = 2; + else error->all(FLERR,"Illegal fix wall/body/polygon command"); + amplitude = force->numeric(FLERR,arg[iarg+2]); + period = force->numeric(FLERR,arg[iarg+3]); + wiggle = 1; + iarg += 4; + } else error->all(FLERR,"Illegal fix wall/body/polygon command"); + } + + if (wallstyle == XPLANE && domain->xperiodic) + error->all(FLERR,"Cannot use wall in periodic dimension"); + if (wallstyle == YPLANE && domain->yperiodic) + error->all(FLERR,"Cannot use wall in periodic dimension"); + if (wallstyle == ZCYLINDER && (domain->xperiodic || domain->yperiodic)) + error->all(FLERR,"Cannot use wall in periodic dimension"); + + if (wiggle && wallstyle == ZCYLINDER && axis != 2) + error->all(FLERR,"Invalid wiggle direction for fix wall/body/polygon"); + + // setup oscillations + + if (wiggle) omega = 2.0*MY_PI / period; + + time_origin = update->ntimestep; + + dmax = nmax = 0; + discrete = NULL; + dnum = dfirst = NULL; + + edmax = ednummax = 0; + edge = NULL; + ednum = edfirst = NULL; + + enclosing_radius = NULL; + rounded_radius = NULL; +} + +/* ---------------------------------------------------------------------- */ + +FixWallBodyPolygon::~FixWallBodyPolygon() +{ + memory->destroy(discrete); + memory->destroy(dnum); + memory->destroy(dfirst); + + memory->destroy(edge); + memory->destroy(ednum); + memory->destroy(edfirst); + + memory->destroy(enclosing_radius); + memory->destroy(rounded_radius); +} + +/* ---------------------------------------------------------------------- */ + +int FixWallBodyPolygon::setmask() +{ + int mask = 0; + mask |= POST_FORCE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixWallBodyPolygon::init() +{ + dt = update->dt; + + avec = (AtomVecBody *) atom->style_match("body"); + if (!avec) + error->all(FLERR,"Pair body/rounded/polygon requires atom style body"); + if (strcmp(avec->bptr->style,"rounded/polygon") != 0) + error->all(FLERR,"Pair body/rounded/polygon requires body style rounded/polygon"); + bptr = (BodyRoundedPolygon *) avec->bptr; + + // set pairstyle from body/polygonular pair style + + if (force->pair_match("body/rounded/polygon",1)) + pairstyle = HOOKE; + else error->all(FLERR,"Fix wall/body/polygon is incompatible with Pair style"); +} + +/* ---------------------------------------------------------------------- */ + +void FixWallBodyPolygon::setup(int vflag) +{ + if (strstr(update->integrate_style,"verlet")) + post_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixWallBodyPolygon::post_force(int vflag) +{ + double vwall[3],dx,dy,dz,del1,del2,delxy,delr,rsq,eradi,rradi,wall_pos; + int i,ni,npi,ifirst,nei,iefirst,side; + double facc[3]; + + // set position of wall to initial settings and velocity to 0.0 + // if wiggle, set wall position and velocity accordingly + + double wlo = lo; + double whi = hi; + vwall[0] = vwall[1] = vwall[2] = 0.0; + if (wiggle) { + double arg = omega * (update->ntimestep - time_origin) * dt; + if (wallstyle == axis) { + wlo = lo + amplitude - amplitude*cos(arg); + whi = hi + amplitude - amplitude*cos(arg); + } + vwall[axis] = amplitude*omega*sin(arg); + } + + // loop over all my atoms + // rsq = distance from wall + // dx,dy,dz = signed distance from wall + // for rotating cylinder, reset vwall based on particle position + // skip atom if not close enough to wall + // if wall was set to NULL, it's skipped since lo/hi are infinity + // compute force and torque on atom if close enough to wall + // via wall potential matched to pair potential + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + int *body = atom->body; + double *radius = atom->radius; + double **torque = atom->torque; + double **angmom = atom->angmom; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + // grow the per-atom lists if necessary and initialize + + if (atom->nmax > nmax) { + memory->destroy(dnum); + memory->destroy(dfirst); + memory->destroy(ednum); + memory->destroy(edfirst); + memory->destroy(enclosing_radius); + memory->destroy(rounded_radius); + nmax = atom->nmax; + memory->create(dnum,nmax,"fix:dnum"); + memory->create(dfirst,nmax,"fix:dfirst"); + memory->create(ednum,nmax,"fix:ednum"); + memory->create(edfirst,nmax,"fix:edfirst"); + memory->create(enclosing_radius,nmax,"fix:enclosing_radius"); + memory->create(rounded_radius,nmax,"fix:rounded_radius"); + } + + ndiscrete = nedge = 0; + for (i = 0; i < nlocal; i++) + dnum[i] = ednum[i] = 0; + + for (i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + + if (body[i] < 0) continue; + + dx = dy = dz = 0.0; + side = FAR; + if (wallstyle == XPLANE) { + del1 = x[i][0] - wlo; + del2 = whi - x[i][0]; + if (del1 < del2) { + dx = del1; + wall_pos = wlo; + side = XLO; + } else { + dx = -del2; + wall_pos = whi; + side = XHI; + } + } else if (wallstyle == YPLANE) { + del1 = x[i][1] - wlo; + del2 = whi - x[i][1]; + if (del1 < del2) { + dy = del1; + wall_pos = wlo; + side = YLO; + } else { + dy = -del2; + wall_pos = whi; + side = YHI; + } + } else if (wallstyle == ZCYLINDER) { + delxy = sqrt(x[i][0]*x[i][0] + x[i][1]*x[i][1]); + delr = cylradius - delxy; + if (delr > eradi) dz = cylradius; + else { + dx = -delr/delxy * x[i][0]; + dy = -delr/delxy * x[i][1]; + } + } + + rsq = dx*dx + dy*dy + dz*dz; + if (rsq > radius[i]*radius[i]) continue; + + double r = sqrt(rsq); + double rsqinv = 1.0 / rsq; + + if (dnum[i] == 0) body2space(i); + npi = dnum[i]; + ifirst = dfirst[i]; + nei = ednum[i]; + iefirst = edfirst[i]; + eradi = enclosing_radius[i]; + rradi = rounded_radius[i]; + + // reset vertex and edge forces + + for (ni = 0; ni < npi; ni++) { + discrete[ifirst+ni][3] = 0; + discrete[ifirst+ni][4] = 0; + discrete[ifirst+ni][5] = 0; + } + + for (ni = 0; ni < nei; ni++) { + edge[iefirst+ni][2] = 0; + edge[iefirst+ni][3] = 0; + edge[iefirst+ni][4] = 0; + } + + int interact, num_contacts, done; + double delta_a, delta_ua, j_a; + Contact contact_list[MAX_CONTACTS]; + + num_contacts = 0; + facc[0] = facc[1] = facc[2] = 0; + interact = vertex_against_wall(i, wall_pos, x, f, torque, side, + contact_list, num_contacts, facc); + + if (num_contacts >= 2) { + + // find the first two distinct contacts + + done = 0; + for (int m = 0; m < num_contacts-1; m++) { + for (int n = m+1; n < num_contacts; n++) { + delta_a = contact_separation(contact_list[m], contact_list[n]); + if (delta_a > 0) { + delta_ua = 1.0; + j_a = delta_a / (EFF_CONTACTS * delta_ua); + if (j_a < 1.0) j_a = 1.0; + + // scale the force at both contacts + + contact_forces(contact_list[m], j_a, x, v, angmom, f, torque, + vwall, facc); + contact_forces(contact_list[n], j_a, x, v, angmom, f, torque, + vwall, facc); + done = 1; + break; + } + } + if (done == 1) break; + } + + } else if (num_contacts == 1) { + + // if there's only one contact, it should be handled here + // since forces/torques have not been accumulated from vertex2wall() + + contact_forces(contact_list[0], 1.0, x, v, angmom, f, torque, + vwall, facc); + } + } // group bit + } +} + +/* ---------------------------------------------------------------------- */ + +void FixWallBodyPolygon::reset_dt() +{ + dt = update->dt; +} + +/* ---------------------------------------------------------------------- + convert N sub-particles in body I to space frame using current quaternion + store sub-particle space-frame displacements from COM in discrete list +------------------------------------------------------------------------- */ + +void FixWallBodyPolygon::body2space(int i) +{ + int ibonus = atom->body[i]; + AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; + int nsub = bptr->nsub(bonus); + double *coords = bptr->coords(bonus); + int body_num_edges = bptr->nedges(bonus); + double* vertices = bptr->edges(bonus); + double eradius = bptr->enclosing_radius(bonus); + double rradius = bptr->rounded_radius(bonus); + + // get the number of sub-particles (vertices) + // and the index of the first vertex of my body in the list + + dnum[i] = nsub; + dfirst[i] = ndiscrete; + + // grow the vertex list if necessary + // the first 3 columns are for coords, the last 3 for forces + + if (ndiscrete + nsub > dmax) { + dmax += DELTA; + memory->grow(discrete,dmax,6,"fix:discrete"); + } + + double p[3][3]; + MathExtra::quat_to_mat(bonus->quat,p); + + for (int m = 0; m < nsub; m++) { + MathExtra::matvec(p,&coords[3*m],discrete[ndiscrete]); + discrete[ndiscrete][3] = 0; + discrete[ndiscrete][4] = 0; + discrete[ndiscrete][5] = 0; + ndiscrete++; + } + + // get the number of edges (vertices) + // and the index of the first edge of my body in the list + + ednum[i] = body_num_edges; + edfirst[i] = nedge; + + // grow the edge list if necessary + // the first 2 columns are for vertex indices within body, + // the last 3 for forces + + if (nedge + body_num_edges > edmax) { + edmax += DELTA; + memory->grow(edge,edmax,5,"fix:edge"); + } + + for (int m = 0; m < body_num_edges; m++) { + edge[nedge][0] = static_cast(vertices[2*m+0]); + edge[nedge][1] = static_cast(vertices[2*m+1]); + edge[nedge][2] = 0; + edge[nedge][3] = 0; + edge[nedge][4] = 0; + nedge++; + } + + enclosing_radius[i] = eradius; + rounded_radius[i] = rradius; +} + +/* ---------------------------------------------------------------------- + Determine the interaction mode between i's vertices against the wall + + i = atom i (body i) + x = atoms' coordinates + f = atoms' forces + torque = atoms' torques + Return: + contact_list = list of contacts between i and the wall + num_contacts = number of contacts between i's vertices and the wall + interact = 0 no interaction with the wall + 1 there's at least one vertex of i interacts + with the wall +---------------------------------------------------------------------- */ + +int FixWallBodyPolygon::vertex_against_wall(int i, double wall_pos, + double** x, double** f, double** torque, int side, + Contact* contact_list, int &num_contacts, double* facc) +{ + int ni, npi, ifirst, interact; + double xpi[3], xpj[3], dist, eradi, rradi; + double fx, fy, fz, rx, ry, rz; + int nlocal = atom->nlocal; + + npi = dnum[i]; + ifirst = dfirst[i]; + eradi = enclosing_radius[i]; + rradi = rounded_radius[i]; + + interact = 0; + + // loop through body i's vertices + + for (ni = 0; ni < npi; ni++) { + + // convert body-fixed coordinates to space-fixed, xi + + xpi[0] = x[i][0] + discrete[ifirst+ni][0]; + xpi[1] = x[i][1] + discrete[ifirst+ni][1]; + xpi[2] = x[i][2] + discrete[ifirst+ni][2]; + + int mode, contact, p2vertex; + double d, R, hi[3], t, delx, dely, delz, fpair, shift; + double xj[3], rij; + + // compute the distance from the vertex xpi to the wall + + mode = compute_distance_to_wall(xpi, rradi, wall_pos, side, + d, hi, contact); + + if (mode == INVALID || mode == NONE) continue; + + if (mode == VERTEX) { + + interact = 1; + + // vertex i interacts with the wall + + delx = xpi[0] - hi[0]; + dely = xpi[1] - hi[1]; + delz = xpi[2] - hi[2]; + + // R = surface separation = d shifted by the rounded radius + // R = d - p1.rounded_radius; + // note: the force is defined for R, not for d + // R > 0: no interaction + // R <= 0: deformation between vertex i and the wall + + rij = sqrt(delx*delx + dely*dely + delz*delz); + R = rij - rradi; + + // the normal frictional term -c_n * vn will be added later + + if (R <= 0) { // deformation occurs + fpair = -kn * R; + } else fpair = 0.0; + + fx = delx*fpair/rij; + fy = dely*fpair/rij; + fz = delz*fpair/rij; + + #ifdef _POLYGON_DEBUG + printf(" Interaction between vertex %d of %d and wall:", ni); + printf(" mode = %d; contact = %d; d = %f; rij = %f\n", + mode, contact, d, rij); + printf(" R = %f\n", R); + printf(" fpair = %f\n", fpair); + #endif + + if (contact == 1) { + + // vertex ni of body i contacts with edge nj of body j + + contact_list[num_contacts].ibody = i; + contact_list[num_contacts].jbody = -1; + contact_list[num_contacts].vertex = ni; + contact_list[num_contacts].edge = -1; + contact_list[num_contacts].xv[0] = xpi[0]; + contact_list[num_contacts].xv[1] = xpi[1]; + contact_list[num_contacts].xv[2] = xpi[2]; + contact_list[num_contacts].xe[0] = hi[0]; + contact_list[num_contacts].xe[1] = hi[1]; + contact_list[num_contacts].xe[2] = hi[2]; + contact_list[num_contacts].separation = R; + num_contacts++; + + // store forces to vertex ni to be rescaled later, + // if there are 2 contacts + + discrete[ifirst+ni][3] = fx; + discrete[ifirst+ni][4] = fy; + discrete[ifirst+ni][5] = fz; + + #ifdef _POLYGON_DEBUG + printf(" Stored forces at vertex and edge for accumulating later.\n"); + #endif + + } else { // no contact + + // accumulate force and torque to the body directly + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + sum_torque(x[i], xpi, fx, fy, fz, torque[i]); + + } // end if contact + + } // end if mode + + } // end for looping through the vertices of body i + + return interact; +} + +/* ------------------------------------------------------------------------- + Compute the distance between a vertex to the wall + another body + Input: + x0 = coordinate of the tested vertex + rradi = rounded radius of the vertex + wall_pos = position of the wall + Output: + d = Distance from a point x0 to an wall + hi = coordinates of the projection of x0 on the wall + contact = 0 no contact between the queried vertex and the wall + 1 contact detected + return NONE if there is no interaction + EDGE if the tested vertex interacts with the wall +------------------------------------------------------------------------- */ + +int FixWallBodyPolygon::compute_distance_to_wall(double* x0, double rradi, + double wall_pos, int side, double &d, double hi[3], int &contact) +{ + int mode; + double delxy; + + // h0 = position of the projection of x0 on the wall + if (wallstyle == XPLANE) { + hi[0] = wall_pos; + hi[1] = x0[1]; + hi[2] = x0[2]; + } else if (wallstyle == YPLANE) { + hi[0] = x0[0]; + hi[1] = wall_pos; + hi[2] = x0[2]; + } else if (wallstyle == ZCYLINDER) { + delxy = sqrt(x0[0]*x0[0] + x0[1]*x0[1]); + hi[0] = x0[0]*cylradius/delxy; + hi[1] = x0[1]*cylradius/delxy; + hi[2] = x0[2]; + } + + // distance from x0 to the wall = distance from x0 to hi + + distance(hi, x0, d); + + // determine the interaction mode + + if (d < rradi) { + mode = VERTEX; + contact = 1; + } else { + if (side == XLO) { + if (x0[0] < wall_pos) mode = VERTEX; + else mode = NONE; + } else if (side == XHI) { + if (x0[0] > wall_pos) mode = VERTEX; + else mode = NONE; + } else if (side == YLO) { + if (x0[1] < wall_pos) mode = VERTEX; + else mode = NONE; + } else if (side == YHI) { + if (x0[1] > wall_pos) mode = VERTEX; + else mode = NONE; + } + } + + if (mode == NONE) contact = 0; + else contact = 1; + + return mode; +} + +/* ---------------------------------------------------------------------- + Compute the contact forces between two bodies + modify the force stored at the vertex and edge in contact by j_a + sum forces and torque to the corresponding bodies + fn = normal friction component + ft = tangential friction component (-c_t * vrt) +------------------------------------------------------------------------- */ + +void FixWallBodyPolygon::contact_forces(Contact& contact, double j_a, + double** x, double** v, double** angmom, double** f, + double** torque, double* vwall, double* facc) +{ + int ibody,ibonus,ifirst, jefirst, ni; + double fx,fy,fz,delx,dely,delz,rsq,rsqinv; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double fn[3],ft[3],vi[3]; + double *quat, *inertia; + AtomVecBody::Bonus *bonus; + + ibody = contact.ibody; + + // compute the velocity of the vertex in the space-fixed frame + + ibonus = atom->body[ibody]; + bonus = &avec->bonus[ibonus]; + quat = bonus->quat; + inertia = bonus->inertia; + total_velocity(contact.xv, x[ibody], v[ibody], angmom[ibody], + inertia, quat, vi); + + // vector pointing from the vertex to the point on the wall + + delx = contact.xv[0] - contact.xe[0]; + dely = contact.xv[1] - contact.xe[1]; + delz = contact.xv[2] - contact.xe[2]; + rsq = delx*delx + dely*dely + delz*delz; + rsqinv = 1.0/rsq; + + // relative translational velocity + + vr1 = vi[0] - vwall[0]; + vr2 = vi[1] - vwall[1]; + vr3 = vi[2] - vwall[2]; + + // normal component + + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // normal friction term at contact + + fn[0] = -c_n * vn1; + fn[1] = -c_n * vn2; + fn[2] = -c_n * vn3; + + // tangential friction term at contact + // excluding the tangential deformation term for now + + ft[0] = -c_t * vt1; + ft[1] = -c_t * vt2; + ft[2] = -c_t * vt3; + + // only the cohesive force is scaled by j_a + + ifirst = dfirst[ibody]; + ni = contact.vertex; + + fx = discrete[ifirst+ni][3] * j_a + fn[0] + ft[0]; + fy = discrete[ifirst+ni][4] * j_a + fn[1] + ft[1]; + fz = discrete[ifirst+ni][5] * j_a + fn[2] + ft[2]; + f[ibody][0] += fx; + f[ibody][1] += fy; + f[ibody][2] += fz; + sum_torque(x[ibody], contact.xv, fx, fy, fz, torque[ibody]); + + // accumulate forces to the vertex only + + facc[0] += fx; facc[1] += fy; facc[2] += fz; + + #ifdef _POLYGON_DEBUG + printf("From contact forces: vertex fx %f fy %f fz %f\n" + " torque body %d: %f %f %f\n", + discrete[ifirst+ni][3], discrete[ifirst+ni][4], discrete[ifirst+ni][5], + atom->tag[ibody],torque[ibody][0],torque[ibody][1],torque[ibody][2]); + #endif +} + +/* ---------------------------------------------------------------------- + Determine the length of the contact segment, i.e. the separation between + 2 contacts +------------------------------------------------------------------------- */ + +double FixWallBodyPolygon::contact_separation(const Contact& c1, + const Contact& c2) +{ + double x1 = c1.xv[0]; + double y1 = c1.xv[1]; + double x2 = c1.xe[0]; + double y2 = c1.xe[1]; + double x3 = c2.xv[0]; + double y3 = c2.xv[1]; + + double delta_a = 0.0; + if (fabs(x2 - x1) > EPSILON) { + double A = (y2 - y1) / (x2 - x1); + delta_a = fabs(y1 - A * x1 - y3 + A * x3) / sqrt(1 + A * A); + } else { + delta_a = fabs(x1 - x3); + } + + return delta_a; +} + +/* ---------------------------------------------------------------------- + Accumulate torque to body from the force f=(fx,fy,fz) acting at point x +------------------------------------------------------------------------- */ + +void FixWallBodyPolygon::sum_torque(double* xm, double *x, double fx, + double fy, double fz, double* torque) +{ + double rx = x[0] - xm[0]; + double ry = x[1] - xm[1]; + double rz = x[2] - xm[2]; + double tx = ry * fz - rz * fy; + double ty = rz * fx - rx * fz; + double tz = rx * fy - ry * fx; + torque[0] += tx; + torque[1] += ty; + torque[2] += tz; +} + +/* ---------------------------------------------------------------------- + Calculate the total velocity of a point (vertex, a point on an edge): + vi = vcm + omega ^ (p - xcm) +------------------------------------------------------------------------- */ + +void FixWallBodyPolygon::total_velocity(double* p, double *xcm, + double* vcm, double *angmom, double *inertia, + double *quat, double* vi) +{ + double r[3],omega[3],ex_space[3],ey_space[3],ez_space[3]; + r[0] = p[0] - xcm[0]; + r[1] = p[1] - xcm[1]; + r[2] = p[2] - xcm[2]; + MathExtra::q_to_exyz(quat,ex_space,ey_space,ez_space); + MathExtra::angmom_to_omega(angmom,ex_space,ey_space,ez_space, + inertia,omega); + vi[0] = omega[1]*r[2] - omega[2]*r[1] + vcm[0]; + vi[1] = omega[2]*r[0] - omega[0]*r[2] + vcm[1]; + vi[2] = omega[0]*r[1] - omega[1]*r[0] + vcm[2]; +} + +/* ---------------------------------------------------------------------- */ + +void FixWallBodyPolygon::distance(const double* x2, const double* x1, + double& r) { + r = sqrt((x2[0] - x1[0]) * (x2[0] - x1[0]) + + (x2[1] - x1[1]) * (x2[1] - x1[1]) + + (x2[2] - x1[2]) * (x2[2] - x1[2])); +} + diff --git a/src/BODY/fix_wall_body_polygon.h b/src/BODY/fix_wall_body_polygon.h new file mode 100644 index 0000000000..3521c6c797 --- /dev/null +++ b/src/BODY/fix_wall_body_polygon.h @@ -0,0 +1,129 @@ +/* -*- 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 FIX_CLASS + +FixStyle(wall/body/polygon,FixWallBodyPolygon) + +#else + +#ifndef LMP_FIX_WALL_BODY_POLYGON_H +#define LMP_FIX_WALL_BODY_POLYGON_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixWallBodyPolygon : public Fix { + public: + FixWallBodyPolygon(class LAMMPS *, int, char **); + virtual ~FixWallBodyPolygon(); + int setmask(); + void init(); + void setup(int); + virtual void post_force(int); + void reset_dt(); + + struct Contact { + int ibody, jbody; // body (i.e. atom) indices (not tags) + int vertex; // vertex of the first polygon + int edge; // edge of the second polygon + double xv[3]; // coordinates of the vertex + double xe[3]; // coordinates of the projection of the vertex on the edge + double separation;// separation at contact + }; + + protected: + int wallstyle,pairstyle,wiggle,axis; + double kn,c_n,c_t; + double lo,hi,cylradius; + double amplitude,period,omega; + double dt; + int time_origin; + + class AtomVecBody *avec; + class BodyRoundedPolygon *bptr; + + double **discrete; // list of all sub-particles for all bodies + int ndiscrete; // number of discretes in list + int dmax; // allocated size of discrete list + int *dnum; // number of discretes per line, 0 if uninit + int *dfirst; // index of first discrete per each line + int nmax; // allocated size of dnum,dfirst vectors + + double **edge; // list of all edge for all bodies + int nedge; // number of edge in list + int edmax; // allocated size of edge list + int *ednum; // number of edges per line, 0 if uninit + int *edfirst; // index of first edge per each line + int ednummax; // allocated size of ednum,edfirst vectors + + double *enclosing_radius; // enclosing radii for all bodies + double *rounded_radius; // rounded radii for all bodies + + void body2space(int); + + int vertex_against_wall(int ibody, double wall_pos, double** x, + double** f, double** torque, int side, + Contact* contact_list, int &num_contacts, + double* facc); + + int compute_distance_to_wall(double* x0, double rradi, double wall_pos, + int side, double &d, double hi[3], int &contact); + double contact_separation(const Contact& c1, const Contact& c2); + void contact_forces(Contact& contact, double j_a, double** x, + double** v, double** angmom, double** f, double** torque, + double* vwall, double* facc); + void sum_torque(double* xm, double *x, double fx, + double fy, double fz, double* torque); + void total_velocity(double* p, double *xcm, double* vcm, double *angmom, + double *inertia, double *quat, double* vi); + void distance(const double* x2, const double* x1, double& r); + +}; + +} + +#endif +#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 wall/body/polygon requires atom style body rounded/polygon + +Self-explanatory. + +E: Cannot use wall in periodic dimension + +Self-explanatory. + +E: Cannot wiggle and shear fix wall/body/polygon + +Cannot specify both options at the same time. + +E: Invalid wiggle direction for fix wall/body/polygon + +Self-explanatory. + +E: Fix wall/body/polygon is incompatible with Pair style + +Must use a body pair style to define the parameters needed for +this fix. + +*/ diff --git a/src/BODY/fix_wall_body_polyhedron.cpp b/src/BODY/fix_wall_body_polyhedron.cpp new file mode 100644 index 0000000000..4806da9673 --- /dev/null +++ b/src/BODY/fix_wall_body_polyhedron.cpp @@ -0,0 +1,944 @@ +/* ---------------------------------------------------------------------- + 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: Trung Dac Nguyen (ndactrung@gmail.com) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "fix_wall_body_polyhedron.h" +#include "atom.h" +#include "atom_vec_body.h" +#include "body_rounded_polyhedron.h" +#include "domain.h" +#include "update.h" +#include "force.h" +#include "pair.h" +#include "modify.h" +#include "respa.h" +#include "math_const.h" +#include "math_extra.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; +using namespace FixConst; +using namespace MathConst; + +enum{XPLANE=0,YPLANE=1,ZPLANE}; // XYZ PLANE need to be 0,1,2 +enum{HOOKE,HOOKE_HISTORY}; + +enum {INVALID=0,NONE=1,VERTEX=2}; +enum {FAR=0,XLO,XHI,YLO,YHI,ZLO,ZHI}; + +//#define _POLYHEDRON_DEBUG +#define DELTA 10000 +#define EPSILON 1e-2 +#define BIG 1.0e20 +#define MAX_CONTACTS 4 // maximum number of contacts for 2D models +#define EFF_CONTACTS 2 // effective contacts for 2D models + +/* ---------------------------------------------------------------------- */ + +FixWallBodyPolyhedron::FixWallBodyPolyhedron(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + if (narg < 7) error->all(FLERR,"Illegal fix wall/body/polyhedron command"); + + if (!atom->body_flag) + error->all(FLERR,"Fix wall/body/polyhedron requires atom style body/rounded/polyhedron"); + + restart_peratom = 1; + create_attribute = 1; + + // wall/particle coefficients + + kn = force->numeric(FLERR,arg[3]); + + c_n = force->numeric(FLERR,arg[4]); + if (strcmp(arg[5],"NULL") == 0) c_t = 0.5 * c_n; + else c_t = force->numeric(FLERR,arg[5]); + + if (kn < 0.0 || c_n < 0.0 || c_t < 0.0) + error->all(FLERR,"Illegal fix wall/body/polyhedron command"); + + // wallstyle args + + int iarg = 6; + if (strcmp(arg[iarg],"xplane") == 0) { + if (narg < iarg+3) error->all(FLERR,"Illegal fix wall/body/polyhedron command"); + wallstyle = XPLANE; + if (strcmp(arg[iarg+1],"NULL") == 0) lo = -BIG; + else lo = force->numeric(FLERR,arg[iarg+1]); + if (strcmp(arg[iarg+2],"NULL") == 0) hi = BIG; + else hi = force->numeric(FLERR,arg[iarg+2]); + iarg += 3; + } else if (strcmp(arg[iarg],"yplane") == 0) { + if (narg < iarg+3) error->all(FLERR,"Illegal fix wall/body/polyhedron command"); + wallstyle = YPLANE; + if (strcmp(arg[iarg+1],"NULL") == 0) lo = -BIG; + else lo = force->numeric(FLERR,arg[iarg+1]); + if (strcmp(arg[iarg+2],"NULL") == 0) hi = BIG; + else hi = force->numeric(FLERR,arg[iarg+2]); + iarg += 3; + } else if (strcmp(arg[iarg],"zplane") == 0) { + if (narg < iarg+3) error->all(FLERR,"Illegal fix wall/body/polyhedron command"); + wallstyle = ZPLANE; + if (strcmp(arg[iarg+1],"NULL") == 0) lo = -BIG; + else lo = force->numeric(FLERR,arg[iarg+1]); + if (strcmp(arg[iarg+2],"NULL") == 0) hi = BIG; + else hi = force->numeric(FLERR,arg[iarg+2]); + iarg += 3; + } + + // check for trailing keyword/values + + wiggle = 0; + + while (iarg < narg) { + if (strcmp(arg[iarg],"wiggle") == 0) { + if (iarg+4 > narg) error->all(FLERR,"Illegal fix wall/body/polyhedron command"); + if (strcmp(arg[iarg+1],"x") == 0) axis = 0; + else if (strcmp(arg[iarg+1],"y") == 0) axis = 1; + else if (strcmp(arg[iarg+1],"z") == 0) axis = 2; + else error->all(FLERR,"Illegal fix wall/body/polyhedron command"); + amplitude = force->numeric(FLERR,arg[iarg+2]); + period = force->numeric(FLERR,arg[iarg+3]); + wiggle = 1; + iarg += 4; + } else error->all(FLERR,"Illegal fix wall/body/polyhedron command"); + } + + if (wallstyle == XPLANE && domain->xperiodic) + error->all(FLERR,"Cannot use wall in periodic dimension"); + if (wallstyle == YPLANE && domain->yperiodic) + error->all(FLERR,"Cannot use wall in periodic dimension"); + if (wallstyle == ZPLANE && domain->zperiodic) + error->all(FLERR,"Cannot use wall in periodic dimension"); + + // setup oscillations + + if (wiggle) omega = 2.0*MY_PI / period; + + time_origin = update->ntimestep; + + dmax = nmax = 0; + discrete = NULL; + dnum = dfirst = NULL; + + edmax = ednummax = 0; + edge = NULL; + ednum = edfirst = NULL; + + facmax = facnummax = 0; + face = NULL; + facnum = facfirst = NULL; + + enclosing_radius = NULL; + rounded_radius = NULL; +} + +/* ---------------------------------------------------------------------- */ + +FixWallBodyPolyhedron::~FixWallBodyPolyhedron() +{ + memory->destroy(discrete); + memory->destroy(dnum); + memory->destroy(dfirst); + + memory->destroy(edge); + memory->destroy(ednum); + memory->destroy(edfirst); + + memory->destroy(face); + memory->destroy(facnum); + memory->destroy(facfirst); + + memory->destroy(enclosing_radius); + memory->destroy(rounded_radius); +} + +/* ---------------------------------------------------------------------- */ + +int FixWallBodyPolyhedron::setmask() +{ + int mask = 0; + mask |= POST_FORCE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixWallBodyPolyhedron::init() +{ + dt = update->dt; + + avec = (AtomVecBody *) atom->style_match("body"); + if (!avec) + error->all(FLERR,"Pair body/rounded/polyhedron requires atom style body"); + if (strcmp(avec->bptr->style,"rounded/polyhedron") != 0) + error->all(FLERR,"Pair body/rounded/polyhedron requires body style rounded/polyhedron"); + bptr = (BodyRoundedPolyhedron *) avec->bptr; + + // set pairstyle from body/polyhedronular pair style + + if (force->pair_match("body/rounded/polyhedron",1)) + pairstyle = HOOKE; + else error->all(FLERR,"Fix wall/body/polyhedron is incompatible with Pair style"); +} + +/* ---------------------------------------------------------------------- */ + +void FixWallBodyPolyhedron::setup(int vflag) +{ + if (strstr(update->integrate_style,"verlet")) + post_force(vflag); +} + +/* ---------------------------------------------------------------------- */ + +void FixWallBodyPolyhedron::post_force(int vflag) +{ + double vwall[3],dx,dy,dz,del1,del2,delxy,delr,rsq,eradi,rradi,wall_pos; + int i,ni,npi,ifirst,nei,iefirst,nfi,iffirst,side; + double facc[3]; + + // set position of wall to initial settings and velocity to 0.0 + // if wiggle, set wall position and velocity accordingly + + double wlo = lo; + double whi = hi; + vwall[0] = vwall[1] = vwall[2] = 0.0; + if (wiggle) { + double arg = omega * (update->ntimestep - time_origin) * dt; + if (wallstyle == axis) { + wlo = lo + amplitude - amplitude*cos(arg); + whi = hi + amplitude - amplitude*cos(arg); + } + vwall[axis] = amplitude*omega*sin(arg); + } + + // loop over all my atoms + // rsq = distance from wall + // dx,dy,dz = signed distance from wall + // for rotating cylinder, reset vwall based on particle position + // skip atom if not close enough to wall + // if wall was set to NULL, it's skipped since lo/hi are infinity + // compute force and torque on atom if close enough to wall + // via wall potential matched to pair potential + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + int *body = atom->body; + double *radius = atom->radius; + double **torque = atom->torque; + double **angmom = atom->angmom; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + // grow the per-atom lists if necessary and initialize + + if (atom->nmax > nmax) { + memory->destroy(dnum); + memory->destroy(dfirst); + memory->destroy(ednum); + memory->destroy(edfirst); + memory->destroy(facnum); + memory->destroy(facfirst); + memory->destroy(enclosing_radius); + memory->destroy(rounded_radius); + nmax = atom->nmax; + memory->create(dnum,nmax,"fix:dnum"); + memory->create(dfirst,nmax,"fix:dfirst"); + memory->create(ednum,nmax,"fix:ednum"); + memory->create(edfirst,nmax,"fix:edfirst"); + memory->create(facnum,nmax,"fix:facnum"); + memory->create(facfirst,nmax,"fix:facfirst"); + memory->create(enclosing_radius,nmax,"fix:enclosing_radius"); + memory->create(rounded_radius,nmax,"fix:rounded_radius"); + } + + ndiscrete = nedge = nface = 0; + for (i = 0; i < nlocal; i++) + dnum[i] = ednum[i] = facnum[i] = 0; + + for (i = 0; i < nlocal; i++) { + if (mask[i] & groupbit) { + + if (body[i] < 0) continue; + + dx = dy = dz = 0.0; + side = FAR; + if (wallstyle == XPLANE) { + del1 = x[i][0] - wlo; + del2 = whi - x[i][0]; + if (del1 < del2) { + dx = del1; + wall_pos = wlo; + side = XLO; + } else { + dx = -del2; + wall_pos = whi; + side = XHI; + } + } else if (wallstyle == YPLANE) { + del1 = x[i][1] - wlo; + del2 = whi - x[i][1]; + if (del1 < del2) { + dy = del1; + wall_pos = wlo; + side = YLO; + } else { + dy = -del2; + wall_pos = whi; + side = YHI; + } + } else if (wallstyle == ZPLANE) { + del1 = x[i][2] - wlo; + del2 = whi - x[i][2]; + if (del1 < del2) { + dy = del1; + wall_pos = wlo; + side = ZLO; + } else { + dy = -del2; + wall_pos = whi; + side = ZHI; + } + } + + rsq = dx*dx + dy*dy + dz*dz; + if (rsq > radius[i]*radius[i]) continue; + + double r = sqrt(rsq); + double rsqinv = 1.0 / rsq; + + if (dnum[i] == 0) body2space(i); + npi = dnum[i]; + ifirst = dfirst[i]; + nei = ednum[i]; + iefirst = edfirst[i]; + nfi = facnum[i]; + iffirst = facfirst[i]; + eradi = enclosing_radius[i]; + rradi = rounded_radius[i]; + + if (npi == 1) { + sphere_against_wall(i, wall_pos, side, vwall, x, v, f, angmom, torque); + continue; + } + + // reset vertex and edge forces + + for (ni = 0; ni < npi; ni++) { + discrete[ifirst+ni][3] = 0; + discrete[ifirst+ni][4] = 0; + discrete[ifirst+ni][5] = 0; + discrete[ifirst+ni][6] = 0; + } + + for (ni = 0; ni < nei; ni++) { + edge[iefirst+ni][2] = 0; + edge[iefirst+ni][3] = 0; + edge[iefirst+ni][4] = 0; + edge[iefirst+ni][5] = 0; + } + + int interact, num_contacts, done; + double delta_a, delta_ua, j_a; + Contact contact_list[MAX_CONTACTS]; + + num_contacts = 0; + facc[0] = facc[1] = facc[2] = 0; + interact = edge_against_wall(i, wall_pos, side, vwall, x, f, torque, + contact_list, num_contacts, facc); + + } // group bit + } +} + +/* ---------------------------------------------------------------------- */ + +void FixWallBodyPolyhedron::reset_dt() +{ + dt = update->dt; +} + +/* ---------------------------------------------------------------------- + convert N sub-particles in body I to space frame using current quaternion + store sub-particle space-frame displacements from COM in discrete list +------------------------------------------------------------------------- */ + +void FixWallBodyPolyhedron::body2space(int i) +{ + int ibonus = atom->body[i]; + AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; + int nsub = bptr->nsub(bonus); + double *coords = bptr->coords(bonus); + int body_num_edges = bptr->nedges(bonus); + double* edge_ends = bptr->edges(bonus); + int body_num_faces = bptr->nfaces(bonus); + double* face_pts = bptr->faces(bonus); + double eradius = bptr->enclosing_radius(bonus); + double rradius = bptr->rounded_radius(bonus); + + // get the number of sub-particles (vertices) + // and the index of the first vertex of my body in the list + + dnum[i] = nsub; + dfirst[i] = ndiscrete; + + // grow the vertex list if necessary + // the first 3 columns are for coords, the last 3 for forces + + if (ndiscrete + nsub > dmax) { + dmax += DELTA; + memory->grow(discrete,dmax,7,"fix:discrete"); + } + + double p[3][3]; + MathExtra::quat_to_mat(bonus->quat,p); + + for (int m = 0; m < nsub; m++) { + MathExtra::matvec(p,&coords[3*m],discrete[ndiscrete]); + discrete[ndiscrete][3] = 0; + discrete[ndiscrete][4] = 0; + discrete[ndiscrete][5] = 0; + discrete[ndiscrete][6] = 0; + ndiscrete++; + } + + // get the number of edges (vertices) + // and the index of the first edge of my body in the list + + ednum[i] = body_num_edges; + edfirst[i] = nedge; + + // grow the edge list if necessary + // the first 2 columns are for vertex indices within body, + // the last 3 for forces + + if (nedge + body_num_edges > edmax) { + edmax += DELTA; + memory->grow(edge,edmax,6,"fix:edge"); + } + + for (int m = 0; m < body_num_edges; m++) { + edge[nedge][0] = static_cast(edge_ends[2*m+0]); + edge[nedge][1] = static_cast(edge_ends[2*m+1]); + edge[nedge][2] = 0; + edge[nedge][3] = 0; + edge[nedge][4] = 0; + edge[nedge][5] = 0; + nedge++; + } + + // get the number of faces and the index of the first face + + facnum[i] = body_num_faces; + facfirst[i] = nface; + + // grow the face list if necessary + // the first 3 columns are for vertex indices within body, the last 3 for forces + + if (nface + body_num_faces > facmax) { + facmax += DELTA; + memory->grow(face,facmax,6,"pair:face"); + } + + for (int m = 0; m < body_num_faces; m++) { + face[nface][0] = static_cast(face_pts[3*m+0]); + face[nface][1] = static_cast(face_pts[3*m+1]); + face[nface][2] = static_cast(face_pts[3*m+2]); + face[nface][3] = 0; + face[nface][4] = 0; + face[nface][5] = 0; + nface++; + } + + enclosing_radius[i] = eradius; + rounded_radius[i] = rradius; +} + +/* ---------------------------------------------------------------------- + Determine the interaction mode between a sphere against the wall + + i = atom i (body i) + x = atoms' coordinates + f = atoms' forces + torque = atoms' torques +---------------------------------------------------------------------- */ + +int FixWallBodyPolyhedron::sphere_against_wall(int i, double wall_pos, + int side, double* vwall, double** x, double** v, double** f, + double** angmom, double** torque) +{ + int mode; + double rradi,hi[3],d,delx,dely,delz,R,fpair,fx,fy,fz; + + rradi = rounded_radius[i]; + mode = NONE; + + if (wallstyle == XPLANE) { + hi[0] = wall_pos; + hi[1] = x[i][1]; + hi[2] = x[i][2]; + } else if (wallstyle == YPLANE) { + hi[0] = x[i][0]; + hi[1] = wall_pos; + hi[2] = x[i][2]; + } else if (wallstyle == ZPLANE) { + hi[0] = x[i][0]; + hi[1] = x[i][1]; + hi[2] = wall_pos; + } + + distance(hi, x[i], d); + + if (d <= rradi) { + delx = x[i][0] - hi[0]; + dely = x[i][1] - hi[1]; + delz = x[i][2] - hi[2]; + R = d - rradi; + + fpair = -kn * R; + + fx = delx*fpair/d; + fy = dely*fpair/d; + fz = delz*fpair/d; + + contact_forces(i, 1.0, x[i], hi, delx, dely, delz, + fx, fy, fz, x, v, angmom, f, torque, vwall); + mode = VERTEX; + } + + return mode; +} + +/* ---------------------------------------------------------------------- + Determine the interaction mode between i's vertices against the wall + + i = atom i (body i) + x = atoms' coordinates + f = atoms' forces + torque = atoms' torques + Output: + contact_list = list of contacts between i and the wall + num_contacts = number of contacts between i's vertices and the wall + Return: + number of contacts of the edge to the wall (0, 1 or 2) +---------------------------------------------------------------------- */ + +int FixWallBodyPolyhedron::edge_against_wall(int i, double wall_pos, + int side, double* vwall, double** x, double** f, double** torque, + Contact* contact_list, int &num_contacts, double* facc) +{ + int ni, nei, mode, contact; + double rradi; + int nlocal = atom->nlocal; + + nei = ednum[i]; + rradi = rounded_radius[i]; + + contact = 0; + + // loop through body i's edges + + for (ni = 0; ni < nei; ni++) + mode = compute_distance_to_wall(i, ni, x[i], rradi, wall_pos, side, vwall, + contact); + + return contact; +} + +/* ------------------------------------------------------------------------- + Compute the distance between a vertex to the wall + another body + Input: + x0 = coordinate of the tested vertex + rradi = rounded radius of the vertex + wall_pos = position of the wall + Output: + d = Distance from a point x0 to an wall + hi = coordinates of the projection of x0 on the wall + contact = 0 no contact between the queried vertex and the wall + 1 contact detected + return NONE if there is no interaction + VERTEX if the tested vertex interacts with the wall +------------------------------------------------------------------------- */ + +int FixWallBodyPolyhedron::compute_distance_to_wall(int ibody, int edge_index, + double *xmi, double rounded_radius_i, double wall_pos, + int side, double* vwall, int &contact) +{ + int mode,ifirst,iefirst,npi1,npi2; + double d1,d2,xpi1[3],xpi2[3],hi[3]; + double fx,fy,fz,fpair,delx,dely,delz,R; + + double** x = atom->x; + double** v = atom->v; + double** f = atom->f; + double** torque = atom->torque; + double** angmom = atom->angmom; + + // two ends of the edge from body i + + ifirst = dfirst[ibody]; + iefirst = edfirst[ibody]; + npi1 = static_cast(edge[iefirst+edge_index][0]); + npi2 = static_cast(edge[iefirst+edge_index][1]); + + xpi1[0] = xmi[0] + discrete[ifirst+npi1][0]; + xpi1[1] = xmi[1] + discrete[ifirst+npi1][1]; + xpi1[2] = xmi[2] + discrete[ifirst+npi1][2]; + + xpi2[0] = xmi[0] + discrete[ifirst+npi2][0]; + xpi2[1] = xmi[1] + discrete[ifirst+npi2][1]; + xpi2[2] = xmi[2] + discrete[ifirst+npi2][2]; + + // determine the intersection of the edge to the wall + + mode = NONE; + double j_a = 1.0; + + if (wallstyle == XPLANE) { + hi[0] = wall_pos; + hi[1] = xpi1[1]; + hi[2] = xpi1[2]; + } else if (wallstyle == YPLANE) { + hi[0] = xpi1[0]; + hi[1] = wall_pos; + hi[2] = xpi1[2]; + } else if (wallstyle == ZPLANE) { + hi[0] = xpi1[0]; + hi[1] = xpi1[1]; + hi[2] = wall_pos; + } + + distance(hi, xpi1, d1); + + if (d1 <= rounded_radius_i && static_cast(discrete[ifirst+npi1][6]) == 0) { + delx = xpi1[0] - hi[0]; + dely = xpi1[1] - hi[1]; + delz = xpi1[2] - hi[2]; + R = d1 - rounded_radius_i; + + fpair = -kn * R; + + fx = delx*fpair/d1; + fy = dely*fpair/d1; + fz = delz*fpair/d1; + + contact_forces(ibody, j_a, xpi1, hi, delx, dely, delz, + fx, fy, fz, x, v, angmom, f, torque, vwall); + discrete[ifirst+npi1][6] = 1; + contact++; + mode = VERTEX; + } + + if (wallstyle == XPLANE) { + hi[0] = wall_pos; + hi[1] = xpi2[1]; + hi[2] = xpi2[2]; + } else if (wallstyle == YPLANE) { + hi[0] = xpi2[0]; + hi[1] = wall_pos; + hi[2] = xpi2[2]; + } else if (wallstyle == ZPLANE) { + hi[0] = xpi2[0]; + hi[1] = xpi2[1]; + hi[2] = wall_pos; + } + + distance(hi, xpi2, d2); + + if (d2 <= rounded_radius_i && static_cast(discrete[ifirst+npi2][6]) == 0) { + delx = xpi2[0] - hi[0]; + dely = xpi2[1] - hi[1]; + delz = xpi2[2] - hi[2]; + R = d2 - rounded_radius_i; + + fpair = -kn * R; + + fx = delx*fpair/d2; + fy = dely*fpair/d2; + fz = delz*fpair/d2; + + contact_forces(ibody, j_a, xpi2, hi, delx, dely, delz, + fx, fy, fz, x, v, angmom, f, torque, vwall); + discrete[ifirst+npi2][6] = 1; + contact++; + mode = VERTEX; + } + + return mode; +} + +/* ---------------------------------------------------------------------- + Compute contact forces between two bodies + modify the force stored at the vertex and edge in contact by j_a + sum forces and torque to the corresponding bodies + fn = normal friction component + ft = tangential friction component (-c_t * v_t) +------------------------------------------------------------------------- */ + +void FixWallBodyPolyhedron::contact_forces(int ibody, + double j_a, double *xi, double *xj, double delx, double dely, double delz, + double fx, double fy, double fz, double** x, double** v, double** angmom, + double** f, double** torque, double* vwall) +{ + int ibonus,jbonus; + double fxt,fyt,fzt,rsq,rsqinv; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double fn[3],ft[3],vi[3],vj[3]; + double *quat, *inertia; + AtomVecBody::Bonus *bonus; + + // compute the velocity of the vertex in the space-fixed frame + + ibonus = atom->body[ibody]; + bonus = &avec->bonus[ibonus]; + quat = bonus->quat; + inertia = bonus->inertia; + total_velocity(xi, x[ibody], v[ibody], angmom[ibody], + inertia, quat, vi); + + // vector pointing from the contact point on ibody to the wall + + rsq = delx*delx + dely*dely + delz*delz; + rsqinv = 1.0/rsq; + + // relative translational velocity + + vr1 = vi[0] - vwall[0]; + vr2 = vi[1] - vwall[1]; + vr3 = vi[2] - vwall[2]; + + // normal component + + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // normal friction term at contact + + fn[0] = -c_n * vn1; + fn[1] = -c_n * vn2; + fn[2] = -c_n * vn3; + + // tangential friction term at contact + // excluding the tangential deformation term for now + + ft[0] = -c_t * vt1; + ft[1] = -c_t * vt2; + ft[2] = -c_t * vt3; + + fxt = fx; fyt = fy; fzt = fz; + fx = fxt * j_a + fn[0] + ft[0]; + fy = fyt * j_a + fn[1] + ft[1]; + fz = fzt * j_a + fn[2] + ft[2]; + + f[ibody][0] += fx; + f[ibody][1] += fy; + f[ibody][2] += fz; + sum_torque(x[ibody], xi, fx, fy, fz, torque[ibody]); + + #ifdef _POLYHEDRON_DEBUG + printf("From contact forces: vertex fx %f fy %f fz %f\n" + " torque body %d: %f %f %f\n" + " torque body %d: %f %f %f\n", + fxt, fyt, fzt, + atom->tag[ibody],torque[ibody][0],torque[ibody][1],torque[ibody][2], + atom->tag[jbody],torque[jbody][0],torque[jbody][1],torque[jbody][2]); + #endif +} + +/* ---------------------------------------------------------------------- + Compute the contact forces between two bodies + modify the force stored at the vertex and edge in contact by j_a + sum forces and torque to the corresponding bodies + fn = normal friction component + ft = tangential friction component (-c_t * vrt) +------------------------------------------------------------------------- */ + +void FixWallBodyPolyhedron::contact_forces(Contact& contact, double j_a, + double** x, double** v, double** angmom, double** f, + double** torque, double* vwall, double* facc) +{ + int ibody,ibonus,ifirst, jefirst, ni; + double fx,fy,fz,delx,dely,delz,rsq,rsqinv; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double fn[3],ft[3],vi[3]; + double *quat, *inertia; + AtomVecBody::Bonus *bonus; + + ibody = contact.ibody; + + // compute the velocity of the vertex in the space-fixed frame + + ibonus = atom->body[ibody]; + bonus = &avec->bonus[ibonus]; + quat = bonus->quat; + inertia = bonus->inertia; + total_velocity(contact.xv, x[ibody], v[ibody], angmom[ibody], + inertia, quat, vi); + + // vector pointing from the vertex to the point on the wall + + delx = contact.xv[0] - contact.xe[0]; + dely = contact.xv[1] - contact.xe[1]; + delz = contact.xv[2] - contact.xe[2]; + rsq = delx*delx + dely*dely + delz*delz; + rsqinv = 1.0/rsq; + + // relative translational velocity + + vr1 = vi[0] - vwall[0]; + vr2 = vi[1] - vwall[1]; + vr3 = vi[2] - vwall[2]; + + // normal component + + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // normal friction term at contact + + fn[0] = -c_n * vn1; + fn[1] = -c_n * vn2; + fn[2] = -c_n * vn3; + + // tangential friction term at contact + // excluding the tangential deformation term for now + + ft[0] = -c_t * vt1; + ft[1] = -c_t * vt2; + ft[2] = -c_t * vt3; + + // only the cohesive force is scaled by j_a + + ifirst = dfirst[ibody]; + ni = contact.vertex; + + fx = discrete[ifirst+ni][3] * j_a + fn[0] + ft[0]; + fy = discrete[ifirst+ni][4] * j_a + fn[1] + ft[1]; + fz = discrete[ifirst+ni][5] * j_a + fn[2] + ft[2]; + f[ibody][0] += fx; + f[ibody][1] += fy; + f[ibody][2] += fz; + sum_torque(x[ibody], contact.xv, fx, fy, fz, torque[ibody]); + + // accumulate forces to the vertex only + + facc[0] += fx; facc[1] += fy; facc[2] += fz; + + #ifdef _POLYHEDRON_DEBUG + printf("From contact forces: vertex fx %f fy %f fz %f\n" + " torque body %d: %f %f %f\n", + discrete[ifirst+ni][3], discrete[ifirst+ni][4], discrete[ifirst+ni][5], + atom->tag[ibody],torque[ibody][0],torque[ibody][1],torque[ibody][2]); + #endif +} + +/* ---------------------------------------------------------------------- + Determine the length of the contact segment, i.e. the separation between + 2 contacts +------------------------------------------------------------------------- */ + +double FixWallBodyPolyhedron::contact_separation(const Contact& c1, + const Contact& c2) +{ + double x1 = c1.xv[0]; + double y1 = c1.xv[1]; + double x2 = c1.xe[0]; + double y2 = c1.xe[1]; + double x3 = c2.xv[0]; + double y3 = c2.xv[1]; + + double delta_a = 0.0; + if (fabs(x2 - x1) > EPSILON) { + double A = (y2 - y1) / (x2 - x1); + delta_a = fabs(y1 - A * x1 - y3 + A * x3) / sqrt(1 + A * A); + } else { + delta_a = fabs(x1 - x3); + } + + return delta_a; +} + +/* ---------------------------------------------------------------------- + Accumulate torque to body from the force f=(fx,fy,fz) acting at point x +------------------------------------------------------------------------- */ + +void FixWallBodyPolyhedron::sum_torque(double* xm, double *x, double fx, + double fy, double fz, double* torque) +{ + double rx = x[0] - xm[0]; + double ry = x[1] - xm[1]; + double rz = x[2] - xm[2]; + double tx = ry * fz - rz * fy; + double ty = rz * fx - rx * fz; + double tz = rx * fy - ry * fx; + torque[0] += tx; + torque[1] += ty; + torque[2] += tz; +} + +/* ---------------------------------------------------------------------- + Calculate the total velocity of a point (vertex, a point on an edge): + vi = vcm + omega ^ (p - xcm) +------------------------------------------------------------------------- */ + +void FixWallBodyPolyhedron::total_velocity(double* p, double *xcm, + double* vcm, double *angmom, double *inertia, + double *quat, double* vi) +{ + double r[3],omega[3],ex_space[3],ey_space[3],ez_space[3]; + r[0] = p[0] - xcm[0]; + r[1] = p[1] - xcm[1]; + r[2] = p[2] - xcm[2]; + MathExtra::q_to_exyz(quat,ex_space,ey_space,ez_space); + MathExtra::angmom_to_omega(angmom,ex_space,ey_space,ez_space, + inertia,omega); + vi[0] = omega[1]*r[2] - omega[2]*r[1] + vcm[0]; + vi[1] = omega[2]*r[0] - omega[0]*r[2] + vcm[1]; + vi[2] = omega[0]*r[1] - omega[1]*r[0] + vcm[2]; +} + +/* ---------------------------------------------------------------------- */ + +void FixWallBodyPolyhedron::distance(const double* x2, const double* x1, + double& r) { + r = sqrt((x2[0] - x1[0]) * (x2[0] - x1[0]) + + (x2[1] - x1[1]) * (x2[1] - x1[1]) + + (x2[2] - x1[2]) * (x2[2] - x1[2])); +} + diff --git a/src/BODY/fix_wall_body_polyhedron.h b/src/BODY/fix_wall_body_polyhedron.h new file mode 100644 index 0000000000..ff7b7ca7cf --- /dev/null +++ b/src/BODY/fix_wall_body_polyhedron.h @@ -0,0 +1,143 @@ +/* -*- 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 FIX_CLASS + +FixStyle(wall/body/polyhedron,FixWallBodyPolyhedron) + +#else + +#ifndef LMP_FIX_WALL_BODY_POLYHERON_H +#define LMP_FIX_WALL_BODY_POLYHERON_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixWallBodyPolyhedron : public Fix { + public: + FixWallBodyPolyhedron(class LAMMPS *, int, char **); + virtual ~FixWallBodyPolyhedron(); + int setmask(); + void init(); + void setup(int); + virtual void post_force(int); + void reset_dt(); + + struct Contact { + int ibody, jbody; // body (i.e. atom) indices (not tags) + int vertex; // vertex of the first polygon + int edge; // edge of the second polygon + double xv[3]; // coordinates of the vertex + double xe[3]; // coordinates of the projection of the vertex on the edge + double separation;// separation at contact + }; + + protected: + int wallstyle,pairstyle,wiggle,axis; + double kn,c_n,c_t; + double lo,hi,cylradius; + double amplitude,period,omega; + double dt; + int time_origin; + + class AtomVecBody *avec; + class BodyRoundedPolyhedron *bptr; + + double **discrete; // list of all sub-particles for all bodies + int ndiscrete; // number of discretes in list + int dmax; // allocated size of discrete list + int *dnum; // number of discretes per line, 0 if uninit + int *dfirst; // index of first discrete per each line + int nmax; // allocated size of dnum,dfirst vectors + + double **edge; // list of all edge for all bodies + int nedge; // number of edge in list + int edmax; // allocated size of edge list + int *ednum; // number of edges per line, 0 if uninit + int *edfirst; // index of first edge per each line + int ednummax; // allocated size of ednum,edfirst vectors + + double **face; // list of all edge for all bodies + int nface; // number of faces in list + int facmax; // allocated size of face list + int *facnum; // number of faces per line, 0 if uninit + int *facfirst; // index of first face per each line + int facnummax; // allocated size of facnum,facfirst vectors + + double *enclosing_radius; // enclosing radii for all bodies + double *rounded_radius; // rounded radii for all bodies + + void body2space(int); + + int edge_against_wall(int ibody, double wall_pos, int side, double* vwall, + double** x, double** f, double** torque, Contact* contact_list, + int &num_contacts, double* facc); + int sphere_against_wall(int i, double wall_pos, int side, double* vwall, + double** x, double** v, double** f, double** angmom, double** torque); + + int compute_distance_to_wall(int ibody, int edge_index, double *xmi, + double rounded_radius_i, double wall_pos, int side, + double* vwall, int &contact); + double contact_separation(const Contact& c1, const Contact& c2); + void contact_forces(int ibody, double j_a, double *xi, double *xj, + double delx, double dely, double delz, + double fx, double fy, double fz, double** x, double** v, + double** angmom, double** f, double** torque, double* vwall); + + void contact_forces(Contact& contact, double j_a, double** x, + double** v, double** angmom, double** f, double** torque, + double* vwall, double* facc); + void sum_torque(double* xm, double *x, double fx, + double fy, double fz, double* torque); + void total_velocity(double* p, double *xcm, double* vcm, double *angmom, + double *inertia, double *quat, double* vi); + void distance(const double* x2, const double* x1, double& r); + +}; + +} + +#endif +#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 wall/body/polyhedron requires atom style body rounded/polyhedron + +Self-explanatory. + +E: Cannot use wall in periodic dimension + +Self-explanatory. + +E: Cannot wiggle and shear fix wall/body/polygon + +Cannot specify both options at the same time. + +E: Invalid wiggle direction for fix wall/body/polygon + +Self-explanatory. + +E: Fix wall/body/polygon is incompatible with Pair style + +Must use a body pair style to define the parameters needed for +this fix. + +*/ diff --git a/src/BODY/pair_body_rounded_polygon.cpp b/src/BODY/pair_body_rounded_polygon.cpp new file mode 100644 index 0000000000..72591d2bd0 --- /dev/null +++ b/src/BODY/pair_body_rounded_polygon.cpp @@ -0,0 +1,1359 @@ +/* ---------------------------------------------------------------------- + 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 author: Trung Dac Nguyen (ndactrung@gmail.com) + Ref: Fraige, Langston, Matchett and Dodds, Particuology 2008, 6:455-466 + Note: The current implementation has not taken into account + the contact history for friction forces. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_body_rounded_polygon.h" +#include "math_extra.h" +#include "atom.h" +#include "atom_vec_body.h" +#include "body_rounded_polygon.h" +#include "comm.h" +#include "force.h" +#include "fix.h" +#include "modify.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "memory.h" +#include "error.h" + +using namespace LAMMPS_NS; + +//#define _POLYGON_DEBUG +#define DELTA 10000 +#define EPSILON 1e-3 +#define MAX_CONTACTS 4 // maximum number of contacts for 2D models +#define EFF_CONTACTS 2 // effective contacts for 2D models + +enum {INVALID=0,NONE=1,VERTEXI=2,VERTEXJ=3,EDGE=4}; + +/* ---------------------------------------------------------------------- */ + +PairBodyRoundedPolygon::PairBodyRoundedPolygon(LAMMPS *lmp) : Pair(lmp) +{ + dmax = nmax = 0; + discrete = NULL; + dnum = dfirst = NULL; + + edmax = ednummax = 0; + edge = NULL; + ednum = edfirst = NULL; + + enclosing_radius = NULL; + rounded_radius = NULL; + maxerad = NULL; + + single_enable = 0; + restartinfo = 0; + + c_n = 0.1; + c_t = 0.2; + mu = 0.0; + delta_ua = 1.0; +} + +/* ---------------------------------------------------------------------- */ + +PairBodyRoundedPolygon::~PairBodyRoundedPolygon() +{ + memory->destroy(discrete); + memory->destroy(dnum); + memory->destroy(dfirst); + + memory->destroy(edge); + memory->destroy(ednum); + memory->destroy(edfirst); + + memory->destroy(enclosing_radius); + memory->destroy(rounded_radius); + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(k_n); + memory->destroy(k_na); + memory->destroy(maxerad); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairBodyRoundedPolygon::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + int ni,nj,npi,npj,ifirst,jfirst; + int nei,nej,iefirst,jefirst; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fx,fy,fz; + double rsq,rsqinv,r,radi,radj,eradi,eradj,rradi,rradj,k_nij,k_naij; + double xi[3],xj[3],fi[3],fj[3],ti[3],tj[3],facc[3]; + double *dxi,*dxj; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double **torque = atom->torque; + double **angmom = atom->angmom; + double *radius = atom->radius; + tagint* tag = atom->tag; + int *body = atom->body; + int *type = atom->type; + int nlocal = atom->nlocal; + int nall = nlocal + atom->nghost; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // grow the per-atom lists if necessary and initialize + + if (atom->nmax > nmax) { + memory->destroy(dnum); + memory->destroy(dfirst); + memory->destroy(ednum); + memory->destroy(edfirst); + memory->destroy(enclosing_radius); + memory->destroy(rounded_radius); + nmax = atom->nmax; + memory->create(dnum,nmax,"pair:dnum"); + memory->create(dfirst,nmax,"pair:dfirst"); + memory->create(ednum,nmax,"pair:ednum"); + memory->create(edfirst,nmax,"pair:edfirst"); + memory->create(enclosing_radius,nmax,"pair:enclosing_radius"); + memory->create(rounded_radius,nmax,"pair:rounded_radius"); + } + + ndiscrete = nedge = 0; + for (i = 0; i < nall; i++) + dnum[i] = ednum[i] = 0; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + radi = radius[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + if (body[i] >= 0) { + if (dnum[i] == 0) body2space(i); + npi = dnum[i]; + ifirst = dfirst[i]; + nei = ednum[i]; + iefirst = edfirst[i]; + eradi = enclosing_radius[i]; + rradi = rounded_radius[i]; + } + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + radj = radius[j]; + + // body/body interactions + + evdwl = 0.0; + facc[0] = facc[1] = facc[2] = 0; + + if (body[i] < 0 || body[j] < 0) continue; + + if (dnum[j] == 0) body2space(j); + npj = dnum[j]; + jfirst = dfirst[j]; + nej = ednum[j]; + jefirst = edfirst[j]; + eradj = enclosing_radius[j]; + rradj = rounded_radius[j]; + + k_nij = k_n[itype][jtype]; + k_naij = k_na[itype][jtype]; + + // no interaction + + r = sqrt(rsq); + if (r > radi + radj + cut_inner) continue; + rsqinv = 1.0 / rsq; + + if (npi == 1 && npj == 1) { + sphere_against_sphere(i, j, delx, dely, delz, rsq, + k_nij, k_naij, x, v, f, evflag); + continue; + } + + // reset vertex and edge forces + + for (ni = 0; ni < npi; ni++) { + discrete[ifirst+ni][3] = 0; + discrete[ifirst+ni][4] = 0; + discrete[ifirst+ni][5] = 0; + } + + for (nj = 0; nj < npj; nj++) { + discrete[jfirst+nj][3] = 0; + discrete[jfirst+nj][4] = 0; + discrete[jfirst+nj][5] = 0; + } + + for (ni = 0; ni < nei; ni++) { + edge[iefirst+ni][2] = 0; + edge[iefirst+ni][3] = 0; + edge[iefirst+ni][4] = 0; + } + + for (nj = 0; nj < nej; nj++) { + edge[jefirst+nj][2] = 0; + edge[jefirst+nj][3] = 0; + edge[jefirst+nj][4] = 0; + } + + int interact, num_contacts, done; + double delta_a, j_a; + Contact contact_list[MAX_CONTACTS]; + + num_contacts = 0; + + // check interaction between i's vertices and j' edges + + interact = vertex_against_edge(i, j, k_nij, k_naij, + x, f, torque, tag, contact_list, + num_contacts, evdwl, facc); + + // check interaction between j's vertices and i' edges + + interact = vertex_against_edge(j, i, k_nij, k_naij, + x, f, torque, tag, contact_list, + num_contacts, evdwl, facc); + + if (num_contacts >= 2) { + + // find the first two distinct contacts + + done = 0; + for (int m = 0; m < num_contacts-1; m++) { + for (int n = m+1; n < num_contacts; n++) { + delta_a = contact_separation(contact_list[m], contact_list[n]); + if (delta_a > 0) { + j_a = delta_a / (EFF_CONTACTS * delta_ua); + if (j_a < 1.0) j_a = 1.0; + + // scale the force at both contacts + + contact_forces(contact_list[m], j_a, x, v, angmom, f, torque, evdwl, facc); + contact_forces(contact_list[n], j_a, x, v, angmom, f, torque, evdwl, facc); + done = 1; + + #ifdef _POLYGON_DEBUG + printf(" Two separate contacts %d and %d: delta_a = %f; j_a = %f\n", + m, n, delta_a, j_a); + printf(" %d: vertex %d of body %d and edge %d of body %d; " + "xv = %f %f %f; xe = %f %f %f\n", + m, contact_list[m].vertex, contact_list[m].ibody, + contact_list[m].edge, contact_list[m].jbody, + contact_list[m].xv[0], contact_list[m].xv[1], contact_list[m].xv[2], + contact_list[m].xe[0], contact_list[m].xe[1], contact_list[m].xe[2]); + printf(" %d: vertex %d of body %d and edge %d of body %d; " + "xv = %f %f %f; xe = %f %f %f\n", + n, contact_list[n].vertex, contact_list[n].ibody, + contact_list[n].edge, contact_list[n].jbody, + contact_list[n].xv[0], contact_list[n].xv[1], contact_list[n].xv[2], + contact_list[n].xe[0], contact_list[n].xe[1], contact_list[n].xe[2]); + #endif + + break; + } + } + if (done == 1) break; + } + + + } else if (num_contacts == 1) { + + // if there's only one contact, it should be handled here + // since forces/torques have not been accumulated from vertex2edge() + + contact_forces(contact_list[0], 1.0, x, v, angmom, f, torque, evdwl, facc); + + #ifdef _POLYGON_DEBUG + printf("One contact between vertex %d of body %d and edge %d of body %d:\n", + contact_list[0].vertex, tag[contact_list[0].ibody], + contact_list[0].edge, tag[contact_list[0].jbody]); + printf("xv = %f %f %f; xe = %f %f %f\n", + contact_list[0].xv[0], contact_list[0].xv[1], contact_list[0].xv[2], + contact_list[0].xe[0], contact_list[0].xe[1], contact_list[0].xe[2]); + #endif + } + + #ifdef _POLYGON_DEBUG + int num_overlapping_contacts = 0; + for (int m = 0; m < num_contacts-1; m++) { + for (int n = m+1; n < num_contacts; n++) { + double l = contact_separation(contact_list[m], contact_list[n]); + if (l < EPSILON) num_overlapping_contacts++; + } + } + printf("There are %d contacts detected, %d of which overlap.\n", + num_contacts, num_overlapping_contacts); + #endif + + if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0.0, + facc[0],facc[1],facc[2],delx,dely,delz); + + } // end for jj + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolygon::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + + memory->create(k_n,n+1,n+1,"pair:k_n"); + memory->create(k_na,n+1,n+1,"pair:k_na"); + memory->create(maxerad,n+1,"pair:maxerad"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolygon::settings(int narg, char **arg) +{ + if (narg < 5) error->all(FLERR,"Illegal pair_style command"); + + c_n = force->numeric(FLERR,arg[0]); + c_t = force->numeric(FLERR,arg[1]); + mu = force->numeric(FLERR,arg[2]); + delta_ua = force->numeric(FLERR,arg[3]); + cut_inner = force->numeric(FLERR,arg[4]); +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolygon::coeff(int narg, char **arg) +{ + if (narg < 4 || narg > 5) + error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double k_n_one = force->numeric(FLERR,arg[2]); + double k_na_one = force->numeric(FLERR,arg[3]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + k_n[i][j] = k_n_one; + k_na[i][j] = k_na_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolygon::init_style() +{ + avec = (AtomVecBody *) atom->style_match("body"); + if (!avec) error->all(FLERR,"Pair body/rounded/polygon requires atom style body"); + if (strcmp(avec->bptr->style,"rounded/polygon") != 0) + error->all(FLERR,"Pair body/rounded/polygon requires body style rounded/polygon"); + bptr = (BodyRoundedPolygon *) avec->bptr; + + if (comm->ghost_velocity == 0) + error->all(FLERR,"Pair body/rounded/polygon requires ghost atoms store velocity"); + + neighbor->request(this); + + // find the maximum enclosing radius for each atom type + + int i, itype; + double eradi; + int* body = atom->body; + int* type = atom->type; + int ntypes = atom->ntypes; + int nlocal = atom->nlocal; + + if (atom->nmax > nmax) { + memory->destroy(dnum); + memory->destroy(dfirst); + memory->destroy(ednum); + memory->destroy(edfirst); + memory->destroy(enclosing_radius); + memory->destroy(rounded_radius); + nmax = atom->nmax; + memory->create(dnum,nmax,"pair:dnum"); + memory->create(dfirst,nmax,"pair:dfirst"); + memory->create(ednum,nmax,"pair:ednum"); + memory->create(edfirst,nmax,"pair:edfirst"); + memory->create(enclosing_radius,nmax,"pair:enclosing_radius"); + memory->create(rounded_radius,nmax,"pair:rounded_radius"); + } + + ndiscrete = nedge = 0; + for (i = 0; i < nlocal; i++) + dnum[i] = ednum[i] = 0; + + double *merad = NULL; + memory->create(merad,ntypes+1,"pair:merad"); + for (i = 1; i <= ntypes; i++) + maxerad[i] = merad[i] = 0; + + int ipour; + for (ipour = 0; ipour < modify->nfix; ipour++) + if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; + if (ipour == modify->nfix) ipour = -1; + + int idep; + for (idep = 0; idep < modify->nfix; idep++) + if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; + if (idep == modify->nfix) idep = -1; + + for (i = 1; i <= ntypes; i++) { + merad[i] = 0.0; + if (ipour >= 0) { + itype = i; + merad[i] = + *((double *) modify->fix[ipour]->extract("radius",itype)); + } + if (idep >= 0) { + itype = i; + merad[i] = + *((double *) modify->fix[idep]->extract("radius",itype)); + } + } + + for (i = 0; i < nlocal; i++) { + itype = type[i]; + if (body[i] >= 0) { + if (dnum[i] == 0) body2space(i); + eradi = enclosing_radius[i]; + if (eradi > merad[itype]) merad[itype] = eradi; + } else + merad[itype] = 0; + } + + MPI_Allreduce(&merad[1],&maxerad[1],ntypes,MPI_DOUBLE,MPI_MAX,world); + + memory->destroy(merad); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairBodyRoundedPolygon::init_one(int i, int j) +{ + k_n[j][i] = k_n[i][j]; + k_na[j][i] = k_na[i][j]; + + return (maxerad[i]+maxerad[j]); +} + +/* ---------------------------------------------------------------------- + convert N sub-particles in body I to space frame using current quaternion + store sub-particle space-frame displacements from COM in discrete list +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolygon::body2space(int i) +{ + int ibonus = atom->body[i]; + AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; + int nsub = bptr->nsub(bonus); + double *coords = bptr->coords(bonus); + int body_num_edges = bptr->nedges(bonus); + double* edge_ends = bptr->edges(bonus); + double eradius = bptr->enclosing_radius(bonus); + double rradius = bptr->rounded_radius(bonus); + + // get the number of sub-particles (vertices) + // and the index of the first vertex of my body in the list + + dnum[i] = nsub; + dfirst[i] = ndiscrete; + + // grow the vertex list if necessary + // the first 3 columns are for coords, the last 3 for forces + + if (ndiscrete + nsub > dmax) { + dmax += DELTA; + memory->grow(discrete,dmax,6,"pair:discrete"); + } + + double p[3][3]; + MathExtra::quat_to_mat(bonus->quat,p); + + for (int m = 0; m < nsub; m++) { + MathExtra::matvec(p,&coords[3*m],discrete[ndiscrete]); + discrete[ndiscrete][3] = 0; + discrete[ndiscrete][4] = 0; + discrete[ndiscrete][5] = 0; + ndiscrete++; + } + + // get the number of edges (vertices) + // and the index of the first edge of my body in the list + + ednum[i] = body_num_edges; + edfirst[i] = nedge; + + // grow the edge list if necessary + // the first 2 columns are for vertex indices within body, the last 3 for forces + + if (nedge + body_num_edges > edmax) { + edmax += DELTA; + memory->grow(edge,edmax,5,"pair:edge"); + } + + for (int m = 0; m < body_num_edges; m++) { + edge[nedge][0] = static_cast(edge_ends[2*m+0]); + edge[nedge][1] = static_cast(edge_ends[2*m+1]); + edge[nedge][2] = 0; + edge[nedge][3] = 0; + edge[nedge][4] = 0; + nedge++; + } + + enclosing_radius[i] = eradius; + rounded_radius[i] = rradius; +} + +/* ---------------------------------------------------------------------- + Interaction between two spheres with different radii + according to the 2D model from Fraige et al. +---------------------------------------------------------------------- */ + +void PairBodyRoundedPolygon::sphere_against_sphere(int i, int j, + double delx, double dely, double delz, double rsq, + double k_n, double k_na, double** x, double** v, + double** f, int evflag) +{ + double eradi,eradj,rradi,rradj; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double rij,rsqinv,R,fx,fy,fz,fn[3],ft[3],fpair,shift,energy; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + eradi = enclosing_radius[i]; + rradi = rounded_radius[i]; + + eradj = enclosing_radius[j]; + rradj = rounded_radius[j]; + + rsqinv = 1.0/rsq; + rij = sqrt(rsq); + R = rij - (rradi + rradj); + shift = k_na * cut_inner; + + energy = 0; + + if (R <= 0) { // deformation occurs + fpair = -k_n * R - shift; + energy = (0.5 * k_n * R + shift) * R; + } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap + fpair = k_na * R - shift; + energy = (-0.5 * k_na * R + shift) * R; + } else fpair = 0.0; + + fx = delx*fpair/rij; + fy = dely*fpair/rij; + fz = delz*fpair/rij; + + if (R <= EPSILON) { // in contact + + // relative translational velocity + + vr1 = v[i][0] - v[j][0]; + vr2 = v[i][1] - v[j][1]; + vr3 = v[i][2] - v[j][2]; + + // normal component + + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // normal friction term at contact + + fn[0] = -c_n * vn1; + fn[1] = -c_n * vn2; + fn[2] = -c_n * vn3; + + // tangential friction term at contact + // excluding the tangential deformation term + + ft[0] = -c_t * vt1; + ft[1] = -c_t * vt2; + ft[2] = -c_t * vt3; + } + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + + if (newton_pair || j < nlocal) { + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + } + + if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair, + energy,0.0,fx,fy,fz,delx,dely,delz); +} + +/* ---------------------------------------------------------------------- + Determine the interaction mode between i's vertices against j's edges + + i = atom i (body i) + j = atom j (body j) + x = atoms' coordinates + f = atoms' forces + torque = atoms' torques + tag = atoms' tags + contact_list = list of contacts + num_contacts = number of contacts between i's vertices and j's edges + Return: + interact = 0 no interaction at all + 1 there's at least one case where i's vertices interacts + with j's edges +---------------------------------------------------------------------- */ + +int PairBodyRoundedPolygon::vertex_against_edge(int i, int j, + double k_n, double k_na, + double** x, double** f, + double** torque, tagint* tag, + Contact* contact_list, + int &num_contacts, + double &evdwl, double* facc) +{ + int ni, npi, ifirst, nei, iefirst; + int nj, npj, jfirst, nej, jefirst; + double xpi[3], xpj[3], dist, eradi, eradj, rradi, rradj; + double fx, fy, fz, rx, ry, rz, energy; + int interact; + int nlocal = atom->nlocal; + + npi = dnum[i]; + ifirst = dfirst[i]; + nei = ednum[i]; + iefirst = edfirst[i]; + eradi = enclosing_radius[i]; + rradi = rounded_radius[i]; + + npj = dnum[j]; + jfirst = dfirst[j]; + nej = ednum[j]; + jefirst = edfirst[j]; + eradj = enclosing_radius[j]; + rradj = rounded_radius[j]; + + energy = 0; + interact = 0; + + // loop through body i's vertices + + for (ni = 0; ni < npi; ni++) { + + // convert body-fixed coordinates to space-fixed, xi + + xpi[0] = x[i][0] + discrete[ifirst+ni][0]; + xpi[1] = x[i][1] + discrete[ifirst+ni][1]; + xpi[2] = x[i][2] + discrete[ifirst+ni][2]; + + // compute the distance from the vertex to the COM of body j + + distance(xpi, x[j], dist); + + #ifdef _POLYGON_DEBUG + printf("Distance between vertex %d of body %d (%0.1f %0.1f %0.1f) " + "to body %d's COM: %f (cut = %0.1f)\n", + ni, xpi[0], xpi[1], xpi[2], atom->tag[i], atom->tag[j], dist, + eradj + rradi + rradj + cut_inner); + #endif + + // the vertex is within the enclosing circle (sphere) of body j, + // possibly interacting + + if (dist > eradj + rradj + rradi + cut_inner) continue; + + int mode, contact, p2vertex; + double d, R, hi[3], t, delx, dely, delz, fpair, shift; + double xj[3], rij; + + // loop through body j's edges + + for (nj = 0; nj < nej; nj++) { + + // compute the distance between the edge nj to the vertex xpi + + mode = compute_distance_to_vertex(j, nj, x[j], rradj, + xpi, rradi, cut_inner, + d, hi, t, contact); + + if (mode == INVALID || mode == NONE) continue; + + if (mode == VERTEXI || mode == VERTEXJ) { + + interact = 1; + + // vertex i interacts with a vertex of the edge, but does not contact + + if (mode == VERTEXI) p2vertex = edge[jefirst+nj][0]; + else if (mode == VERTEXJ) p2vertex = edge[jefirst+nj][1]; + + // p2.body2space(p2vertex, xj); + xpj[0] = x[j][0] + discrete[jfirst+p2vertex][0]; + xpj[1] = x[j][1] + discrete[jfirst+p2vertex][1]; + xpj[2] = x[j][2] + discrete[jfirst+p2vertex][2]; + + delx = xpi[0] - xpj[0]; + dely = xpi[1] - xpj[1]; + delz = xpi[2] - xpj[2]; + + // R = surface separation = rij shifted by the rounded radii + // R = rij - (p1.rounded_radius + p2.rounded_radius); + // note: the force is defined for R, not for rij + // R > rc: no interaction between vertex ni and p2vertex + // 0 < R < rc: cohesion between vertex ni and p2vertex + // R < 0: deformation between vertex ni and p2vertex + + rij = sqrt(delx*delx + dely*dely + delz*delz); + R = rij - (rradi + rradj); + shift = k_na * cut_inner; + + // the normal frictional term -c_n * vn will be added later + + if (R <= 0) { // deformation occurs + fpair = -k_n * R - shift; + energy += (0.5 * k_n * R + shift) * R; + } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap + fpair = k_na * R - shift; + energy += (-0.5 * k_na * R + shift) * R; + } else fpair = 0.0; + + fx = delx*fpair/rij; + fy = dely*fpair/rij; + fz = delz*fpair/rij; + + #ifdef _POLYGON_DEBUG + printf(" Interaction between vertex %d of %d and vertex %d of %d:", + ni, tag[i], p2vertex, tag[j]); + printf(" mode = %d; contact = %d; d = %f; rij = %f, t = %f\n", + mode, contact, d, rij, t); + printf(" R = %f; cut_inner = %f\n", R, cut_inner); + printf(" fpair = %f\n", fpair); + #endif + + // add forces to body i and body j directly + // avoid double counts this pair of vertices + // i and j can be either local or ghost atoms (bodies) + // probably need more work here when the vertices' interaction + // are not symmetric, e.g. j interacts with the edge + // consisting of i but in mode = EDGE instead of VERTEX*. + // OR, for the time being assume that the edge length is + // sufficiently greater than the rounded radius to distinguish + // vertex-vertex from vertex-edge contact modes. + // Special case: when i is a sphere, also accumulate + + if (tag[i] < tag[j] || npi == 1) { + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + sum_torque(x[i], xpi, fx, fy, fz, torque[i]); + + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + sum_torque(x[j], xpj, -fx, -fy, -fz, torque[j]); + + facc[0] += fx; facc[1] += fy; facc[2] += fz; + + #ifdef _POLYGON_DEBUG + printf(" from vertex-vertex: " + "force on vertex %d of body %d: fx %f fy %f fz %f\n" + " torque body %d: %f %f %f\n" + " torque body %d: %f %f %f\n", ni, tag[i], fx, fy, fz, + tag[i],torque[i][0],torque[i][1],torque[i][2], + tag[j],torque[j][0],torque[j][1],torque[j][2]); + #endif + } + + // done with the edges from body j, + // given that vertex ni interacts with only one vertex from one edge of body j + +// break; + + } else if (mode == EDGE) { + + interact = 1; + + // vertex i interacts with the edge + + delx = xpi[0] - hi[0]; + dely = xpi[1] - hi[1]; + delz = xpi[2] - hi[2]; + + // R = surface separation = d shifted by the rounded radii + // R = d - (p1.rounded_radius + p2.rounded_radius); + // Note: the force is defined for R, not for d + // R > rc: no interaction between vertex i and edge j + // 0 < R < rc: cohesion between vertex i and edge j + // R < 0: deformation between vertex i and edge j + // rij = sqrt(delx*delx + dely*dely + delz*delz); + + R = d - (rradi + rradj); + shift = k_na * cut_inner; + + // the normal frictional term -c_n * vn will be added later + + if (R <= 0) { // deformation occurs + fpair = -k_n * R - shift; + energy += (0.5 * k_n * R + shift) * R; + } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap + fpair = k_na * R - shift; + energy += (-0.5 * k_na * R + shift) * R; + } else fpair = 0.0; + + fx = delx*fpair/d; + fy = dely*fpair/d; + fz = delz*fpair/d; + + #ifdef _POLYGON_DEBUG + printf(" Interaction between vertex %d of %d and edge %d of %d:", + ni, tag[i], nj, tag[j]); + printf(" mode = %d; contact = %d; d = %f; t = %f\n", + mode, contact, d, t); + printf(" R = %f; cut_inner = %f\n", R, cut_inner); + printf(" fpair = %f\n", fpair); + #endif + + if (contact == 1) { + + // vertex ni of body i contacts with edge nj of body j + + contact_list[num_contacts].ibody = i; + contact_list[num_contacts].jbody = j; + contact_list[num_contacts].vertex = ni; + contact_list[num_contacts].edge = nj; + contact_list[num_contacts].xv[0] = xpi[0]; + contact_list[num_contacts].xv[1] = xpi[1]; + contact_list[num_contacts].xv[2] = xpi[2]; + contact_list[num_contacts].xe[0] = hi[0]; + contact_list[num_contacts].xe[1] = hi[1]; + contact_list[num_contacts].xe[2] = hi[2]; + contact_list[num_contacts].separation = R; + num_contacts++; + + // store forces to vertex ni and the edge nj + // to be rescaled later + + discrete[ifirst+ni][3] = fx; + discrete[ifirst+ni][4] = fy; + discrete[ifirst+ni][5] = fz; + + edge[jefirst+nj][2] = -fx; + edge[jefirst+nj][3] = -fy; + edge[jefirst+nj][4] = -fz; + + #ifdef _POLYGON_DEBUG + printf(" Stored forces at vertex and edge for accumulating later.\n"); + #endif + + } else { // no contact + + // accumulate force and torque to both bodies directly + + f[i][0] += fx; + f[i][1] += fy; + f[i][2] += fz; + sum_torque(x[i], xpi, fx, fy, fz, torque[i]); + + f[j][0] -= fx; + f[j][1] -= fy; + f[j][2] -= fz; + sum_torque(x[j], hi, -fx, -fy, -fz, torque[j]); + + facc[0] += fx; facc[1] += fy; facc[2] += fz; + + #ifdef _POLYGON_DEBUG + printf(" from vertex-edge, no contact: " + "force on vertex %d of body %d: fx %f fy %f fz %f\n" + " torque body %d: %f %f %f\n" + " torque body %d: %f %f %f\n", ni, tag[i], fx, fy, fz, + tag[i],torque[i][0],torque[i][1],torque[i][2], + tag[j],torque[j][0],torque[j][1],torque[j][2]); + #endif + } // end if contact + + // done with the edges from body j, + // given that vertex ni interacts with only one edge from body j + +// break; + + } // end if mode + + } // end for looping through the edges of body j + + } // end for looping through the vertices of body i + + evdwl += energy; + + return interact; +} + +/* ------------------------------------------------------------------------- + Compute the distance between an edge of body i and a vertex from + another body + Input: + ibody = body i (i.e. atom i) + edge_index = edge index of body i + xmi = atom i's coordinates (body i's center of mass) + x0 = coordinate of the tested vertex from another body + x0_rounded_radius = rounded radius of the tested vertex + cut_inner = cutoff for vertex-vertex and vertex-edge interaction + Output: + d = Distance from a point x0 to an edge + hi = coordinates of the projection of x0 on the edge + t = ratio to determine the relative position of hi + wrt xi and xj on the segment + contact = 0 no contact between the queried vertex and the edge + 1 contact detected + return + INVALID if the edge index is invalid + NONE if there is no interaction + VERTEXI if the tested vertex interacts with the first vertex of the edge + VERTEXJ if the tested vertex interacts with the second vertex of the edge + EDGE if the tested vertex interacts with the edge +------------------------------------------------------------------------- */ + +int PairBodyRoundedPolygon::compute_distance_to_vertex(int ibody, + int edge_index, + double *xmi, + double rounded_radius, + double* x0, + double x0_rounded_radius, + double cut_inner, + double &d, + double hi[3], + double &t, + int &contact) +{ + if (edge_index >= ednum[ibody]) return INVALID; + + int mode,ifirst,iefirst,npi1,npi2; + double xi1[3],xi2[3],u[3],v[3],uij[3]; + double udotv, magv, magucostheta; + double delx,dely,delz; + + ifirst = dfirst[ibody]; + iefirst = edfirst[ibody]; + npi1 = static_cast(edge[iefirst+edge_index][0]); + npi2 = static_cast(edge[iefirst+edge_index][1]); + + // compute the space-fixed coordinates for the vertices of the edge + + xi1[0] = xmi[0] + discrete[ifirst+npi1][0]; + xi1[1] = xmi[1] + discrete[ifirst+npi1][1]; + xi1[2] = xmi[2] + discrete[ifirst+npi1][2]; + + xi2[0] = xmi[0] + discrete[ifirst+npi2][0]; + xi2[1] = xmi[1] + discrete[ifirst+npi2][1]; + xi2[2] = xmi[2] + discrete[ifirst+npi2][2]; + + // u = x0 - xi1 + + u[0] = x0[0] - xi1[0]; + u[1] = x0[1] - xi1[1]; + u[2] = x0[2] - xi1[2]; + + // v = xi2 - xi1 + + v[0] = xi2[0] - xi1[0]; + v[1] = xi2[1] - xi1[1]; + v[2] = xi2[2] - xi1[2]; + + // dot product between u and v = magu * magv * costheta + + udotv = u[0] * v[0] + u[1] * v[1] + u[2] * v[2]; + magv = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + magucostheta = udotv / magv; + + // uij is the unit vector pointing from xi to xj + + uij[0] = v[0] / magv; + uij[1] = v[1] / magv; + uij[2] = v[2] / magv; + + // position of the projection of x0 on the line (xi, xj) + + hi[0] = xi1[0] + magucostheta * uij[0]; + hi[1] = xi1[1] + magucostheta * uij[1]; + hi[2] = xi1[2] + magucostheta * uij[2]; + + // distance from x0 to the line (xi, xj) = distance from x0 to hi + + distance(hi, x0, d); + + // determine the interaction mode + // for 2D: a vertex can interact with one edge at most + // for 3D: a vertex can interact with one face at most + + mode = NONE; + contact = 0; + + if (d > rounded_radius + x0_rounded_radius + cut_inner) { + + // if the vertex is far away from the edge + + mode = NONE; + + } else { + + // check if x0 (the queried vertex) and xmi (the body's center of mass) + // are on the different sides of the edge + + int m = opposite_sides(xi1, xi2, x0, xmi); + + if (m == 0) { + + // x0 and xmi are on not the opposite sides of the edge + // leave xpi for another edge to detect + + mode = NONE; + + } else { + + // x0 and xmi are on the different sides + // t is the ratio to detect if x0 is closer to the vertices xi or xj + + if (fabs(xi2[0] - xi1[0]) > EPSILON) + t = (hi[0] - xi1[0]) / (xi2[0] - xi1[0]); + else if (fabs(xi2[1] - xi1[1]) > EPSILON) + t = (hi[1] - xi1[1]) / (xi2[1] - xi1[1]); + else if (fabs(xi2[2] - xi1[2]) > EPSILON) + t = (hi[2] - xi1[2]) / (xi2[2] - xi1[2]); + + double contact_dist = rounded_radius + x0_rounded_radius; + if (t >= 0 && t <= 1) { + mode = EDGE; + if (d < contact_dist + EPSILON) + contact = 1; + + } else { // t < 0 || t > 1: closer to either vertices of the edge + + if (t < 0) { + // measure the distance from x0 to xi1 + delx = x0[0] - xi1[0]; + dely = x0[1] - xi1[1]; + delz = x0[2] - xi1[2]; + double dx0xi1 = sqrt(delx*delx + dely*dely + delz*delz); + if (dx0xi1 > contact_dist + cut_inner) + mode = NONE; + else + mode = VERTEXI; + } else { + // measure the distance from x0 to xi2 + delx = x0[0] - xi2[0]; + dely = x0[1] - xi2[1]; + delz = x0[2] - xi2[2]; + double dx0xi2 = sqrt(delx*delx + dely*dely + delz*delz); + if (dx0xi2 > contact_dist + cut_inner) + mode = NONE; + else + mode = VERTEXJ; + } + } // end if t >= 0 && t <= 1 + } // end if x0 and xmi are on the same side of the edge + } + + return mode; +} + +/* ---------------------------------------------------------------------- + Compute contact forces between two bodies + modify the force stored at the vertex and edge in contact by j_a + sum forces and torque to the corresponding bodies + fn = normal friction component + ft = tangential friction component (-c_t * v_t) +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolygon::contact_forces(Contact& contact, double j_a, + double** x, double** v, double** angmom, double** f, + double** torque, double &evdwl, double* facc) +{ + int ibody,jbody,ibonus,jbonus,ifirst,jefirst,ni,nj; + double fx,fy,fz,delx,dely,delz,rsq,rsqinv; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double fn[3],ft[3],vi[3],vj[3]; + double *quat, *inertia; + AtomVecBody::Bonus *bonus; + + ibody = contact.ibody; + jbody = contact.jbody; + + // compute the velocity of the vertex in the space-fixed frame + + ibonus = atom->body[ibody]; + bonus = &avec->bonus[ibonus]; + quat = bonus->quat; + inertia = bonus->inertia; + total_velocity(contact.xv, x[ibody], v[ibody], angmom[ibody], + inertia, quat, vi); + + // compute the velocity of the point on the edge in the space-fixed frame + + jbonus = atom->body[jbody]; + bonus = &avec->bonus[jbonus]; + quat = bonus->quat; + inertia = bonus->inertia; + total_velocity(contact.xe, x[jbody], v[jbody], angmom[jbody], + inertia, quat, vj); + + // vector pointing from the vertex to the point on the edge + + delx = contact.xv[0] - contact.xe[0]; + dely = contact.xv[1] - contact.xe[1]; + delz = contact.xv[2] - contact.xe[2]; + rsq = delx*delx + dely*dely + delz*delz; + rsqinv = 1.0/rsq; + + // relative translational velocity + + vr1 = vi[0] - vj[0]; + vr2 = vi[1] - vj[1]; + vr3 = vi[2] - vj[2]; + + // normal component + + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // normal friction term at contact + + fn[0] = -c_n * vn1; + fn[1] = -c_n * vn2; + fn[2] = -c_n * vn3; + + // tangential friction term at contact + // excluding the tangential deformation term for now + + ft[0] = -c_t * vt1; + ft[1] = -c_t * vt2; + ft[2] = -c_t * vt3; + + // only the cohesive force is scaled by j_a + // mu * fne = tangential friction deformation during gross sliding + // see Eq. 4, Fraige et al. + + ifirst = dfirst[ibody]; + ni = contact.vertex; + + fx = discrete[ifirst+ni][3] * j_a + fn[0] + ft[0] + + mu * discrete[ifirst+ni][3]; + fy = discrete[ifirst+ni][4] * j_a + fn[1] + ft[1] + + mu * discrete[ifirst+ni][4]; + fz = discrete[ifirst+ni][5] * j_a + fn[2] + ft[2] + + mu * discrete[ifirst+ni][5]; + f[ibody][0] += fx; + f[ibody][1] += fy; + f[ibody][2] += fz; + sum_torque(x[ibody], contact.xv, fx, fy, fz, torque[ibody]); + + // accumulate forces to the vertex only + + facc[0] += fx; facc[1] += fy; facc[2] += fz; + + // only the cohesive force is scaled by j_a + // mu * fne = tangential friction deformation during gross sliding + // Eq. 4, Fraige et al. + + jefirst = edfirst[jbody]; + nj = contact.edge; + + fx = edge[jefirst+nj][2] * j_a - fn[0] - ft[0] + + mu * edge[jefirst+nj][2]; + fy = edge[jefirst+nj][3] * j_a - fn[1] - ft[1] + + mu * edge[jefirst+nj][3]; + fz = edge[jefirst+nj][4] * j_a - fn[2] - ft[2] + + mu * edge[jefirst+nj][4]; + f[jbody][0] += fx; + f[jbody][1] += fy; + f[jbody][2] += fz; + sum_torque(x[jbody], contact.xe, fx, fy, fz, torque[jbody]); + + #ifdef _POLYGON_DEBUG + printf("From contact forces: vertex fx %f fy %f fz %f\n" + " torque body %d: %f %f %f\n" + " torque body %d: %f %f %f\n", + discrete[ifirst+ni][3], discrete[ifirst+ni][4], discrete[ifirst+ni][5], + atom->tag[ibody],torque[ibody][0],torque[ibody][1],torque[ibody][2], + atom->tag[jbody],torque[jbody][0],torque[jbody][1],torque[jbody][2]); + #endif +} + +/* ---------------------------------------------------------------------- + Determine the length of the contact segment, i.e. the separation between + 2 contacts, should be extended for 3D models. +------------------------------------------------------------------------- */ + +double PairBodyRoundedPolygon::contact_separation(const Contact& c1, + const Contact& c2) +{ + double x1 = c1.xv[0]; + double y1 = c1.xv[1]; + double x2 = c1.xe[0]; + double y2 = c1.xe[1]; + double x3 = c2.xv[0]; + double y3 = c2.xv[1]; + + double delta_a = 0.0; + if (fabs(x2 - x1) > EPSILON) { + double A = (y2 - y1) / (x2 - x1); + delta_a = fabs(y1 - A * x1 - y3 + A * x3) / sqrt(1 + A * A); + } else { + delta_a = fabs(x1 - x3); + } + + return delta_a; +} + +/* ---------------------------------------------------------------------- + Accumulate torque to body from the force f=(fx,fy,fz) acting at point x +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolygon::sum_torque(double* xm, double *x, double fx, + double fy, double fz, double* torque) +{ + double rx = x[0] - xm[0]; + double ry = x[1] - xm[1]; + double rz = x[2] - xm[2]; + double tx = ry * fz - rz * fy; + double ty = rz * fx - rx * fz; + double tz = rx * fy - ry * fx; + torque[0] += tx; + torque[1] += ty; + torque[2] += tz; +} + +/* ---------------------------------------------------------------------- + Test if two points a and b are in opposite sides of the line that + connects two points x1 and x2 +------------------------------------------------------------------------- */ + +int PairBodyRoundedPolygon::opposite_sides(double* x1, double* x2, + double* a, double* b) +{ + double m_a = (x1[1] - x2[1])*(a[0] - x1[0]) + (x2[0] - x1[0])*(a[1] - x1[1]); + double m_b = (x1[1] - x2[1])*(b[0] - x1[0]) + (x2[0] - x1[0])*(b[1] - x1[1]); + // equal to zero when either a or b is inline with the line x1-x2 + if (m_a * m_b <= 0) + return 1; + else + return 0; +} + +/* ---------------------------------------------------------------------- + Calculate the total velocity of a point (vertex, a point on an edge): + vi = vcm + omega ^ (p - xcm) +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolygon::total_velocity(double* p, double *xcm, + double* vcm, double *angmom, double *inertia, + double *quat, double* vi) +{ + double r[3],omega[3],ex_space[3],ey_space[3],ez_space[3]; + r[0] = p[0] - xcm[0]; + r[1] = p[1] - xcm[1]; + r[2] = p[2] - xcm[2]; + MathExtra::q_to_exyz(quat,ex_space,ey_space,ez_space); + MathExtra::angmom_to_omega(angmom,ex_space,ey_space,ez_space, + inertia,omega); + vi[0] = omega[1]*r[2] - omega[2]*r[1] + vcm[0]; + vi[1] = omega[2]*r[0] - omega[0]*r[2] + vcm[1]; + vi[2] = omega[0]*r[1] - omega[1]*r[0] + vcm[2]; +} + +/* ---------------------------------------------------------------------- */ + +void PairBodyRoundedPolygon::distance(const double* x2, const double* x1, + double& r) +{ + r = sqrt((x2[0] - x1[0]) * (x2[0] - x1[0]) + + (x2[1] - x1[1]) * (x2[1] - x1[1]) + + (x2[2] - x1[2]) * (x2[2] - x1[2])); +} + diff --git a/src/BODY/pair_body_rounded_polygon.h b/src/BODY/pair_body_rounded_polygon.h new file mode 100644 index 0000000000..09c93b832e --- /dev/null +++ b/src/BODY/pair_body_rounded_polygon.h @@ -0,0 +1,128 @@ +/* -*- 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 PAIR_CLASS + +PairStyle(body/rounded/polygon,PairBodyRoundedPolygon) + +#else + +#ifndef LMP_PAIR_BODY_ROUNDED_POLYGON_H +#define LMP_PAIR_BODY_ROUNDED_POLYGON_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairBodyRoundedPolygon : public Pair { + public: + PairBodyRoundedPolygon(class LAMMPS *); + ~PairBodyRoundedPolygon(); + void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + void init_style(); + double init_one(int, int); + + struct Contact { + int ibody, jbody; // body (i.e. atom) indices (not tags) + int vertex; // vertex of the first polygon + int edge; // edge of the second polygon + double xv[3]; // coordinates of the vertex + double xe[3]; // coordinates of the projection of the vertex on the edge + double separation;// separation at contact + }; + + protected: + double **k_n; // normal repulsion strength + double **k_na; // normal attraction strength + double c_n; // normal damping coefficient + double c_t; // tangential damping coefficient + double mu; // normal friction coefficient during gross sliding + double delta_ua; // contact line (area for 3D models) modification factor + double cut_inner; // cutoff for interaction between vertex-edge surfaces + + class AtomVecBody *avec; + class BodyRoundedPolygon *bptr; + + double **discrete; // list of all sub-particles for all bodies + int ndiscrete; // number of discretes in list + int dmax; // allocated size of discrete list + int *dnum; // number of discretes per line, 0 if uninit + int *dfirst; // index of first discrete per each line + int nmax; // allocated size of dnum,dfirst vectors + + double **edge; // list of all edge for all bodies + int nedge; // number of edge in list + int edmax; // allocated size of edge list + int *ednum; // number of edges per line, 0 if uninit + int *edfirst; // index of first edge per each line + int ednummax; // allocated size of ednum,edfirst vectors + + double *enclosing_radius; // enclosing radii for all bodies + double *rounded_radius; // rounded radii for all bodies + double *maxerad; // per-type maximum enclosing radius + + void allocate(); + void body2space(int); + + int vertex_against_edge(int i, int j, double k_n, double k_na, + double** x, double** f, double** torque, + tagint* tag, Contact* contact_list, + int &num_contacts, double &evdwl, double* facc); + void sphere_against_sphere(int i, int j, double delx, double dely, double delz, + double rsq, double k_n, double k_na, + double** x, double** v, double** f, int evflag); + int compute_distance_to_vertex(int ibody, int edge_index, double* xmi, + double rounded_radius, double* x0, + double x0_rounded_radius, double cut_inner, + double &d, double hi[3], double &t, + int &contact); + double contact_separation(const Contact& c1, const Contact& c2); + void contact_forces(Contact& contact, double j_a, double** x, + double** v, double** f, double** angmom, + double** torque, double &evdwl, double* facc); + void sum_torque(double* xm, double *x, double fx, + double fy, double fz, double* torque); + int opposite_sides(double* x1, double* x2, double* a, double* b); + void total_velocity(double* p, double *xcm, double* vcm, double *angmom, + double *inertia, double *quat, double* vi); + inline void distance(const double* x2, const double* x1, double& r); +}; + +} + +#endif +#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: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair body/rounded/polygon requires atom style body rounded/polygon + +Self-explanatory. + +E: Pair body requires body style rounded/polygon + +This pair style is specific to the rounded/polygon body style. + +*/ diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp new file mode 100644 index 0000000000..8d5f9ec72c --- /dev/null +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -0,0 +1,2348 @@ +/* ---------------------------------------------------------------------- + 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 author: Trung Dac Nguyen (ndactrung@gmail.com) + Ref: Wang, Yu, Langston, Fraige, Particle shape effects in discrete + element modelling of cohesive angular particles, Granular Matter 2011, + 13:1-12. + Note: The current implementation has not taken into account + the contact history for friction forces. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include "pair_body_rounded_polyhedron.h" +#include "math_extra.h" +#include "atom.h" +#include "atom_vec_body.h" +#include "body_rounded_polyhedron.h" +#include "comm.h" +#include "force.h" +#include "fix.h" +#include "modify.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "memory.h" +#include "error.h" +#include "math_extra.h" +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace MathExtra; +using namespace MathConst; + +#define DELTA 10000 +#define EPSILON 1e-3 +#define MAX_FACE_SIZE 4 // maximum number of vertices per face (same as BodyRoundedPolyhedron) +#define MAX_CONTACTS 16 // for 3D models + +//#define _POLYHEDRON_DEBUG + +enum {EE_INVALID=0,EE_NONE,EE_INTERACT}; +enum {EF_INVALID=0,EF_NONE,EF_PARALLEL,EF_SAME_SIDE_OF_FACE, + EF_INTERSECT_INSIDE,EF_INTERSECT_OUTSIDE}; + +/* ---------------------------------------------------------------------- */ + +PairBodyRoundedPolyhedron::PairBodyRoundedPolyhedron(LAMMPS *lmp) : Pair(lmp) +{ + dmax = nmax = 0; + discrete = NULL; + dnum = dfirst = NULL; + + edmax = ednummax = 0; + edge = NULL; + ednum = edfirst = NULL; + + facmax = facnummax = 0; + face = NULL; + facnum = facfirst = NULL; + + enclosing_radius = NULL; + rounded_radius = NULL; + maxerad = NULL; + + single_enable = 0; + restartinfo = 0; + + c_n = 0.1; + c_t = 0.2; + mu = 0.0; + A_ua = 1.0; +} + +/* ---------------------------------------------------------------------- */ + +PairBodyRoundedPolyhedron::~PairBodyRoundedPolyhedron() +{ + memory->destroy(discrete); + memory->destroy(dnum); + memory->destroy(dfirst); + + memory->destroy(edge); + memory->destroy(ednum); + memory->destroy(edfirst); + + memory->destroy(face); + memory->destroy(facnum); + memory->destroy(facfirst); + + memory->destroy(enclosing_radius); + memory->destroy(rounded_radius); + memory->destroy(maxerad); + + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + + memory->destroy(k_n); + memory->destroy(k_na); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + int ni,nj,npi,npj,ifirst,jfirst,nei,nej,iefirst,jefirst; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,facc[3]; + double rsq,eradi,eradj,k_nij,k_naij; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double **torque = atom->torque; + double **angmom = atom->angmom; + int *body = atom->body; + int *type = atom->type; + int nlocal = atom->nlocal; + int nall = nlocal + atom->nghost; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // grow the per-atom lists if necessary and initialize + + if (atom->nmax > nmax) { + memory->destroy(dnum); + memory->destroy(dfirst); + memory->destroy(ednum); + memory->destroy(edfirst); + memory->destroy(facnum); + memory->destroy(facfirst); + memory->destroy(enclosing_radius); + memory->destroy(rounded_radius); + nmax = atom->nmax; + memory->create(dnum,nmax,"pair:dnum"); + memory->create(dfirst,nmax,"pair:dfirst"); + memory->create(ednum,nmax,"pair:ednum"); + memory->create(edfirst,nmax,"pair:edfirst"); + memory->create(facnum,nmax,"pair:facnum"); + memory->create(facfirst,nmax,"pair:facfirst"); + memory->create(enclosing_radius,nmax,"pair:enclosing_radius"); + memory->create(rounded_radius,nmax,"pair:rounded_radius"); + } + + ndiscrete = nedge = nface = 0; + for (i = 0; i < nall; i++) + dnum[i] = ednum[i] = facnum[i] = 0; + + // loop over neighbors of my atoms + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + if (body[i] >= 0) { + if (dnum[i] == 0) body2space(i); + npi = dnum[i]; + ifirst = dfirst[i]; + nei = ednum[i]; + iefirst = edfirst[i]; + eradi = enclosing_radius[i]; + } + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + jtype = type[j]; + + // body/body interactions + + evdwl = 0.0; + facc[0] = facc[1] = facc[2] = 0; + + if (body[i] < 0 || body[j] < 0) continue; + + if (dnum[j] == 0) body2space(j); + npj = dnum[j]; + jfirst = dfirst[j]; + nej = ednum[j]; + jefirst = edfirst[j]; + eradj = enclosing_radius[j]; + + k_nij = k_n[itype][jtype]; + k_naij = k_na[itype][jtype]; + + // no interaction + + double r = sqrt(rsq); + if (r > eradi + eradj + cut_inner) continue; + + // sphere-sphere interaction + + if (npi == 1 && npj == 1) { + sphere_against_sphere(i, j, delx, dely, delz, rsq, + k_nij, k_naij, v, f, evflag); + continue; + } + + // reset vertex and edge forces + + for (ni = 0; ni < npi; ni++) { + discrete[ifirst+ni][3] = 0; + discrete[ifirst+ni][4] = 0; + discrete[ifirst+ni][5] = 0; + discrete[ifirst+ni][6] = 0; + } + + for (nj = 0; nj < npj; nj++) { + discrete[jfirst+nj][3] = 0; + discrete[jfirst+nj][4] = 0; + discrete[jfirst+nj][5] = 0; + discrete[jfirst+nj][6] = 0; + } + + for (ni = 0; ni < nei; ni++) { + edge[iefirst+ni][2] = 0; + edge[iefirst+ni][3] = 0; + edge[iefirst+ni][4] = 0; + edge[iefirst+ni][5] = 0; + } + + for (nj = 0; nj < nej; nj++) { + edge[jefirst+nj][2] = 0; + edge[jefirst+nj][3] = 0; + edge[jefirst+nj][4] = 0; + edge[jefirst+nj][5] = 0; + } + + // one of the two bodies is a sphere + + if (npj == 1) { + sphere_against_face(i, j, k_nij, k_naij, x, v, f, torque, + angmom, evflag); + sphere_against_edge(i, j, k_nij, k_naij, x, v, f, torque, + angmom, evflag); + continue; + } else if (npi == 1) { + sphere_against_face(j, i, k_nij, k_naij, x, v, f, torque, + angmom, evflag); + sphere_against_edge(j, i, k_nij, k_naij, x, v, f, torque, + angmom, evflag); + continue; + } + + int interact, num_contacts; + Contact contact_list[MAX_CONTACTS]; + + num_contacts = 0; + + // check interaction between i's edges and j' faces + #ifdef _POLYHEDRON_DEBUG + printf("INTERACTION between edges of %d vs. faces of %d:\n", i, j); + #endif + interact = edge_against_face(i, j, k_nij, k_naij, x, contact_list, + num_contacts, evdwl, facc); + + // check interaction between j's edges and i' faces + #ifdef _POLYHEDRON_DEBUG + printf("\nINTERACTION between edges of %d vs. faces of %d:\n", j, i); + #endif + interact = edge_against_face(j, i, k_nij, k_naij, x, contact_list, + num_contacts, evdwl, facc); + + // check interaction between i's edges and j' edges + #ifdef _POLYHEDRON_DEBUG + printf("INTERACTION between edges of %d vs. edges of %d:\n", i, j); + #endif + interact = edge_against_edge(i, j, k_nij, k_naij, x, contact_list, + num_contacts, evdwl, facc); + + // estimate the contact area + // also consider point contacts and line contacts + + if (num_contacts > 0) { + double contact_area; + if (num_contacts == 1) { + contact_area = 0; + } else if (num_contacts == 2) { + contact_area = num_contacts * A_ua; + } else { + int m; + double xc[3],dx,dy,dz; + xc[0] = xc[1] = xc[2] = 0; + for (m = 0; m < num_contacts; m++) { + xc[0] += contact_list[m].xi[0]; + xc[1] += contact_list[m].xi[1]; + xc[2] += contact_list[m].xi[2]; + } + + xc[0] /= (double)num_contacts; + xc[1] /= (double)num_contacts; + xc[2] /= (double)num_contacts; + + contact_area = 0.0; + for (m = 0; m < num_contacts; m++) { + dx = contact_list[m].xi[0] - xc[0]; + dy = contact_list[m].xi[1] - xc[1]; + dz = contact_list[m].xi[2] - xc[2]; + contact_area += (dx*dx + dy*dy + dz*dz); + } + contact_area *= (MY_PI/(double)num_contacts); + } + rescale_cohesive_forces(x, f, torque, contact_list, num_contacts, + contact_area, k_nij, k_naij, facc); + } + + if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0.0, + facc[0],facc[1],facc[2],delx,dely,delz); + + } // end for jj + } + + if (vflag_fdotr) virial_fdotr_compute(); +} + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::allocate() +{ + allocated = 1; + int n = atom->ntypes; + + memory->create(setflag,n+1,n+1,"pair:setflag"); + for (int i = 1; i <= n; i++) + for (int j = i; j <= n; j++) + setflag[i][j] = 0; + + memory->create(cutsq,n+1,n+1,"pair:cutsq"); + + memory->create(k_n,n+1,n+1,"pair:k_n"); + memory->create(k_na,n+1,n+1,"pair:k_na"); + memory->create(maxerad,n+1,"pair:maxerad"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::settings(int narg, char **arg) +{ + if (narg < 5) error->all(FLERR,"Illegal pair_style command"); + + c_n = force->numeric(FLERR,arg[0]); + c_t = force->numeric(FLERR,arg[1]); + mu = force->numeric(FLERR,arg[2]); + A_ua = force->numeric(FLERR,arg[3]); + cut_inner = force->numeric(FLERR,arg[4]); +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::coeff(int narg, char **arg) +{ + if (narg < 4 || narg > 5) + error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double k_n_one = force->numeric(FLERR,arg[2]); + double k_na_one = force->numeric(FLERR,arg[3]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + k_n[i][j] = k_n_one; + k_na[i][j] = k_na_one; + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::init_style() +{ + avec = (AtomVecBody *) atom->style_match("body"); + if (!avec) error->all(FLERR,"Pair body/rounded/polyhedron requires atom style body"); + if (strcmp(avec->bptr->style,"rounded/polyhedron") != 0) + error->all(FLERR,"Pair body/rounded/polyhedron requires body style rounded/polyhedron"); + bptr = (BodyRoundedPolyhedron *) avec->bptr; + + if (comm->ghost_velocity == 0) + error->all(FLERR,"Pair body/rounded/polyhedron requires ghost atoms store velocity"); + + neighbor->request(this); + + // find the maximum enclosing radius for each atom type + + int i, itype; + double eradi; + int* body = atom->body; + int* type = atom->type; + int ntypes = atom->ntypes; + int nlocal = atom->nlocal; + + if (atom->nmax > nmax) { + memory->destroy(dnum); + memory->destroy(dfirst); + memory->destroy(ednum); + memory->destroy(edfirst); + memory->destroy(facnum); + memory->destroy(facfirst); + memory->destroy(enclosing_radius); + memory->destroy(rounded_radius); + nmax = atom->nmax; + memory->create(dnum,nmax,"pair:dnum"); + memory->create(dfirst,nmax,"pair:dfirst"); + memory->create(ednum,nmax,"pair:ednum"); + memory->create(edfirst,nmax,"pair:edfirst"); + memory->create(facnum,nmax,"pair:facnum"); + memory->create(facfirst,nmax,"pair:facfirst"); + memory->create(enclosing_radius,nmax,"pair:enclosing_radius"); + memory->create(rounded_radius,nmax,"pair:rounded_radius"); + } + + ndiscrete = nedge = nface = 0; + for (i = 0; i < nlocal; i++) + dnum[i] = ednum[i] = facnum[i] = 0; + + double *merad = NULL; + memory->create(merad,ntypes+1,"pair:merad"); + for (i = 1; i <= ntypes; i++) + maxerad[i] = merad[i] = 0; + + int ipour; + for (ipour = 0; ipour < modify->nfix; ipour++) + if (strcmp(modify->fix[ipour]->style,"pour") == 0) break; + if (ipour == modify->nfix) ipour = -1; + + int idep; + for (idep = 0; idep < modify->nfix; idep++) + if (strcmp(modify->fix[idep]->style,"deposit") == 0) break; + if (idep == modify->nfix) idep = -1; + + for (i = 1; i <= ntypes; i++) { + merad[i] = 0.0; + if (ipour >= 0) { + itype = i; + merad[i] = + *((double *) modify->fix[ipour]->extract("radius",itype)); + } + if (idep >= 0) { + itype = i; + merad[i] = + *((double *) modify->fix[idep]->extract("radius",itype)); + } + } + + for (i = 0; i < nlocal; i++) { + itype = type[i]; + if (body[i] >= 0) { + if (dnum[i] == 0) body2space(i); + eradi = enclosing_radius[i]; + if (eradi > merad[itype]) merad[itype] = eradi; + } else + merad[itype] = 0; + } + + MPI_Allreduce(&merad[1],&maxerad[1],ntypes,MPI_DOUBLE,MPI_MAX,world); + + memory->destroy(merad); + + sanity_check(); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairBodyRoundedPolyhedron::init_one(int i, int j) +{ + k_n[j][i] = k_n[i][j]; + k_na[j][i] = k_na[i][j]; + + return (maxerad[i]+maxerad[j]); +} + +/* ---------------------------------------------------------------------- + convert N sub-particles in body I to space frame using current quaternion + store sub-particle space-frame displacements from COM in discrete list +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::body2space(int i) +{ + int ibonus = atom->body[i]; + AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; + int nsub = bptr->nsub(bonus); + double *coords = bptr->coords(bonus); + int body_num_edges = bptr->nedges(bonus); + double* edge_ends = bptr->edges(bonus); + int body_num_faces = bptr->nfaces(bonus); + double* face_pts = bptr->faces(bonus); + double eradius = bptr->enclosing_radius(bonus); + double rradius = bptr->rounded_radius(bonus); + + // get the number of sub-particles (vertices) + // and the index of the first vertex of my body in the list + + dnum[i] = nsub; + dfirst[i] = ndiscrete; + + // grow the vertex list if necessary + // the first 3 columns are for coords, the last 3 for forces + + if (ndiscrete + nsub > dmax) { + dmax += DELTA; + memory->grow(discrete,dmax,7,"pair:discrete"); + } + + double p[3][3]; + MathExtra::quat_to_mat(bonus->quat,p); + + for (int m = 0; m < nsub; m++) { + MathExtra::matvec(p,&coords[3*m],discrete[ndiscrete]); + discrete[ndiscrete][3] = 0; + discrete[ndiscrete][4] = 0; + discrete[ndiscrete][5] = 0; + discrete[ndiscrete][6] = 0; + ndiscrete++; + } + + // get the number of edges (vertices) + // and the index of the first edge of my body in the list + + ednum[i] = body_num_edges; + edfirst[i] = nedge; + + // grow the edge list if necessary + // the first 2 columns are for vertex indices within body, the last 3 for forces + + if (nedge + body_num_edges > edmax) { + edmax += DELTA; + memory->grow(edge,edmax,6,"pair:edge"); + } + + for (int m = 0; m < body_num_edges; m++) { + edge[nedge][0] = static_cast(edge_ends[2*m+0]); + edge[nedge][1] = static_cast(edge_ends[2*m+1]); + edge[nedge][2] = 0; + edge[nedge][3] = 0; + edge[nedge][4] = 0; + edge[nedge][5] = 0; + nedge++; + } + + // get the number of faces and the index of the first face + + facnum[i] = body_num_faces; + facfirst[i] = nface; + + // grow the face list if necessary + // the first 3 columns are for vertex indices within body, the last 3 for forces + + if (nface + body_num_faces > facmax) { + facmax += DELTA; + memory->grow(face,facmax,MAX_FACE_SIZE,"pair:face"); + } + + for (int m = 0; m < body_num_faces; m++) { + for (int k = 0; k < MAX_FACE_SIZE; k++) + face[nface][k] = static_cast(face_pts[MAX_FACE_SIZE*m+k]); + nface++; + } + + enclosing_radius[i] = eradius; + rounded_radius[i] = rradius; +} + +/* ---------------------------------------------------------------------- + Interaction between two spheres with different radii + according to the 2D model from Fraige et al. +---------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::sphere_against_sphere(int ibody, int jbody, + double delx, double dely, double delz, double rsq, + double k_n, double k_na, double** v, double** f, + int evflag) +{ + double rradi,rradj,contact_dist; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double rij,rsqinv,R,fx,fy,fz,fn[3],ft[3],fpair,shift,energy; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + rradi = rounded_radius[ibody]; + rradj = rounded_radius[jbody]; + contact_dist = rradi + rradj; + + rij = sqrt(rsq); + R = rij - contact_dist; + shift = k_na * cut_inner; + + energy = 0; + + if (R <= 0) { // deformation occurs + fpair = -k_n * R - shift; + energy = (0.5 * k_n * R + shift) * R; + } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap + fpair = k_na * R - shift; + energy = (-0.5 * k_na * R + shift) * R; + } else fpair = 0.0; + + fx = delx*fpair/rij; + fy = dely*fpair/rij; + fz = delz*fpair/rij; + + if (R <= 0) { // in contact + + // relative translational velocity + + vr1 = v[ibody][0] - v[jbody][0]; + vr2 = v[ibody][1] - v[jbody][1]; + vr3 = v[ibody][2] - v[jbody][2]; + + // normal component + + rsqinv = 1.0/rsq; + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // normal friction term at contact + + fn[0] = -c_n * vn1; + fn[1] = -c_n * vn2; + fn[2] = -c_n * vn3; + + // tangential friction term at contact, + // excluding the tangential deformation term for now + + ft[0] = -c_t * vt1; + ft[1] = -c_t * vt2; + ft[2] = -c_t * vt3; + + fx += fn[0] + ft[0]; + fy += fn[1] + ft[1]; + fz += fn[2] + ft[2]; + } + + f[ibody][0] += fx; + f[ibody][1] += fy; + f[ibody][2] += fz; + + if (newton_pair || jbody < nlocal) { + f[jbody][0] -= fx; + f[jbody][1] -= fy; + f[jbody][2] -= fz; + } + + if (evflag) ev_tally_xyz(ibody,jbody,nlocal,newton_pair, + energy,0.0,fx,fy,fz,delx,dely,delz); +} + +/* ---------------------------------------------------------------------- + Interaction bt the faces of a polyhedron (ibody) and a sphere (jbody) +---------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::sphere_against_face(int ibody, int jbody, + double k_n, double k_na, double** x, double** v, + double** f, double** torque, double** angmom, + int evflag) +{ + int ni,nfi,inside,ifirst,iffirst,npi1,npi2,npi3,ibonus,tmp; + double xi1[3],xi2[3],xi3[3],ui[3],vi[3],vti[3],n[3],h[3],fn[3],ft[3],d; + double delx,dely,delz,rsq,rij,rsqinv,R,fx,fy,fz,fpair,shift,energy; + double rradi,rradj,contact_dist; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double *quat, *inertia; + AtomVecBody::Bonus *bonus; + + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + ifirst = dfirst[ibody]; + iffirst = facfirst[ibody]; + nfi = facnum[ibody]; + + rradi = rounded_radius[ibody]; + rradj = rounded_radius[jbody]; + contact_dist = rradi + rradj; + + for (ni = 0; ni < nfi; ni++) { + + npi1 = static_cast(face[iffirst+ni][0]); + npi2 = static_cast(face[iffirst+ni][1]); + npi3 = static_cast(face[iffirst+ni][2]); + + // compute the space-fixed coordinates for the vertices of the face + + xi1[0] = x[ibody][0] + discrete[ifirst+npi1][0]; + xi1[1] = x[ibody][1] + discrete[ifirst+npi1][1]; + xi1[2] = x[ibody][2] + discrete[ifirst+npi1][2]; + + xi2[0] = x[ibody][0] + discrete[ifirst+npi2][0]; + xi2[1] = x[ibody][1] + discrete[ifirst+npi2][1]; + xi2[2] = x[ibody][2] + discrete[ifirst+npi2][2]; + + xi3[0] = x[ibody][0] + discrete[ifirst+npi3][0]; + xi3[1] = x[ibody][1] + discrete[ifirst+npi3][1]; + xi3[2] = x[ibody][2] + discrete[ifirst+npi3][2]; + + // find the normal unit vector of the face + + MathExtra::sub3(xi2, xi1, ui); + MathExtra::sub3(xi3, xi1, vi); + MathExtra::cross3(ui, vi, n); + MathExtra::norm3(n); + + // skip if the COM of the two bodies are in the same side of the face + + if (opposite_sides(n, xi1, x[ibody], x[jbody]) == 0) continue; + + // find the projection of the sphere on the face + + project_pt_plane(x[jbody], xi1, xi2, xi3, h, d, inside); + + inside_polygon(ibody, ni, x[ibody], h, NULL, inside, tmp); + if (inside == 0) continue; + + delx = h[0] - x[jbody][0]; + dely = h[1] - x[jbody][1]; + delz = h[2] - x[jbody][2]; + rsq = delx*delx + dely*dely + delz*delz; + rij = sqrt(rsq); + R = rij - contact_dist; + shift = k_na * cut_inner; + + energy = 0; + + if (R <= 0) { // deformation occurs + fpair = -k_n * R - shift; + energy = (0.5 * k_n * R + shift) * R; + } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap + fpair = k_na * R - shift; + energy = (-0.5 * k_na * R + shift) * R; + } else fpair = 0.0; + + fx = delx*fpair/rij; + fy = dely*fpair/rij; + fz = delz*fpair/rij; + + if (R <= 0) { // in contact + + // compute the velocity of the vertex in the space-fixed frame + + ibonus = atom->body[ibody]; + bonus = &avec->bonus[ibonus]; + quat = bonus->quat; + inertia = bonus->inertia; + total_velocity(h, x[ibody], v[ibody], angmom[ibody], + inertia, quat, vti); + + // relative translational velocity + + vr1 = vti[0] - v[jbody][0]; + vr2 = vti[1] - v[jbody][1]; + vr3 = vti[2] - v[jbody][2]; + + // normal component + + rsqinv = 1.0/rsq; + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // normal friction term at contact + + fn[0] = -c_n * vn1; + fn[1] = -c_n * vn2; + fn[2] = -c_n * vn3; + + // tangential friction term at contact, + // excluding the tangential deformation term for now + + ft[0] = -c_t * vt1; + ft[1] = -c_t * vt2; + ft[2] = -c_t * vt3; + + fx += fn[0] + ft[0]; + fy += fn[1] + ft[1]; + fz += fn[2] + ft[2]; + } + + f[ibody][0] += fx; + f[ibody][1] += fy; + f[ibody][2] += fz; + sum_torque(x[ibody], h, fx, fy, fz, torque[ibody]); + + if (newton_pair || jbody < nlocal) { + f[jbody][0] -= fx; + f[jbody][1] -= fy; + f[jbody][2] -= fz; + } + + if (evflag) ev_tally_xyz(ibody,jbody,nlocal,newton_pair, + energy,0.0,fx,fy,fz,delx,dely,delz); + } +} + +/* ---------------------------------------------------------------------- + Interaction bt the edges of a polyhedron (ibody) and a sphere (jbody) +---------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::sphere_against_edge(int ibody, int jbody, + double k_n, double k_na, double** x, double** v, + double** f, double** torque, double** angmom, + int evflag) +{ + int ni,nei,ifirst,iefirst,npi1,npi2,ibonus; + double xi1[3],xi2[3],vti[3],h[3],fn[3],ft[3],d,t; + double delx,dely,delz,rij,rsqinv,R,fx,fy,fz,fpair,shift,energy; + double rradi,rradj,contact_dist; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double *quat, *inertia; + AtomVecBody::Bonus *bonus; + + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + ifirst = dfirst[ibody]; + iefirst = edfirst[ibody]; + nei = ednum[ibody]; + + rradi = rounded_radius[ibody]; + rradj = rounded_radius[jbody]; + contact_dist = rradi + rradj; + + for (ni = 0; ni < nei; ni++) { + + npi1 = static_cast(edge[iefirst+ni][0]); + npi2 = static_cast(edge[iefirst+ni][1]); + + // compute the space-fixed coordinates for the vertices of the face + + xi1[0] = x[ibody][0] + discrete[ifirst+npi1][0]; + xi1[1] = x[ibody][1] + discrete[ifirst+npi1][1]; + xi1[2] = x[ibody][2] + discrete[ifirst+npi1][2]; + + xi2[0] = x[ibody][0] + discrete[ifirst+npi2][0]; + xi2[1] = x[ibody][1] + discrete[ifirst+npi2][1]; + xi2[2] = x[ibody][2] + discrete[ifirst+npi2][2]; + + // find the projection of the jbody's COM on the edge + + project_pt_line(x[jbody], xi1, xi2, h, d, t); + + if (d > contact_dist + cut_inner) continue; + if (t < 0 || t > 1) continue; + + if (fabs(t) < EPSILON) { + if (static_cast(discrete[ifirst+npi1][6]) == 1) + continue; + else { + h[0] = xi1[0]; + h[1] = xi1[1]; + h[2] = xi1[2]; + discrete[ifirst+npi1][6] = 1; + } + } + + if (fabs(t-1) < EPSILON) { + if (static_cast(discrete[ifirst+npi2][6]) == 1) + continue; + else { + h[0] = xi2[0]; + h[1] = xi2[1]; + h[2] = xi2[2]; + discrete[ifirst+npi2][6] = 1; + } + } + + delx = h[0] - x[jbody][0]; + dely = h[1] - x[jbody][1]; + delz = h[2] - x[jbody][2]; + rij = sqrt(delx*delx + dely*dely + delz*delz); + R = rij - contact_dist; + shift = k_na * cut_inner; + + energy = 0; + + if (R <= 0) { // deformation occurs + fpair = -k_n * R - shift; + energy = (0.5 * k_n * R + shift) * R; + } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap + fpair = k_na * R - shift; + energy = (-0.5 * k_na * R + shift) * R; + } else fpair = 0.0; + + fx = delx*fpair/rij; + fy = dely*fpair/rij; + fz = delz*fpair/rij; + + if (R <= 0) { // in contact + + // compute the velocity of the vertex in the space-fixed frame + + ibonus = atom->body[ibody]; + bonus = &avec->bonus[ibonus]; + quat = bonus->quat; + inertia = bonus->inertia; + total_velocity(h, x[ibody], v[ibody], angmom[ibody], + inertia, quat, vti); + + // relative translational velocity + + vr1 = vti[0] - v[jbody][0]; + vr2 = vti[1] - v[jbody][1]; + vr3 = vti[2] - v[jbody][2]; + + // normal component + + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // normal friction term at contact + + fn[0] = -c_n * vn1; + fn[1] = -c_n * vn2; + fn[2] = -c_n * vn3; + + // tangential friction term at contact, excluding the tangential deformation term + + ft[0] = -c_t * vt1; + ft[1] = -c_t * vt2; + ft[2] = -c_t * vt3; + + fx += fn[0] + ft[0]; + fy += fn[1] + ft[1]; + fz += fn[2] + ft[2]; + } + + f[ibody][0] += fx; + f[ibody][1] += fy; + f[ibody][2] += fz; + sum_torque(x[ibody], h, fx, fy, fz, torque[ibody]); + + if (newton_pair || jbody < nlocal) { + f[jbody][0] -= fx; + f[jbody][1] -= fy; + f[jbody][2] -= fz; + } + + if (evflag) ev_tally_xyz(ibody,jbody,nlocal,newton_pair, + energy,0.0,fx,fy,fz,delx,dely,delz); + } + +} + +/* ---------------------------------------------------------------------- + Determine the interaction mode between i's edges against j's faces + + i = atom i (body i) + j = atom j (body j) + x = atoms' coordinates + f = atoms' forces + torque = atoms' torques + tag = atoms' tags + contact_list = list of contacts + num_contacts = number of contacts between i's edges and j's faces + Return: + +---------------------------------------------------------------------- */ + +int PairBodyRoundedPolyhedron::edge_against_face(int ibody, int jbody, + double k_n, double k_na, double** x, Contact* contact_list, + int &num_contacts, double &evdwl, double* facc) +{ + int ni,nei,nj,nfj,contact,interact; + double rradi,rradj,energy; + + nei = ednum[ibody]; + rradi = rounded_radius[ibody]; + nfj = facnum[jbody]; + rradj = rounded_radius[jbody]; + + energy = 0; + interact = EF_NONE; + + // loop through body i's edges + + for (ni = 0; ni < nei; ni++) { + + // loop through body j's faces + + for (nj = 0; nj < nfj; nj++) { + + // compute the distance between the face nj to the edge ni + #ifdef _POLYHEDRON_DEBUG + printf("Compute interaction between face %d of body %d with edge %d of body %d:\n", + nj, jbody, ni, ibody); + #endif + + interact = interaction_face_to_edge(jbody, nj, x[jbody], rradj, + ibody, ni, x[ibody], rradi, + k_n, k_na, cut_inner, + contact_list, num_contacts, + energy, facc); + } + + } // end for looping through the edges of body i + + evdwl += energy; + + return interact; +} + +/* ---------------------------------------------------------------------- + Determine the interaction mode between i's edges against j's edges + + i = atom i (body i) + j = atom j (body j) + x = atoms' coordinates + f = atoms' forces + torque = atoms' torques + tag = atoms' tags + contact_list = list of contacts + num_contacts = number of contacts between i's edges and j's edges + Return: + +---------------------------------------------------------------------- */ + +int PairBodyRoundedPolyhedron::edge_against_edge(int ibody, int jbody, + double k_n, double k_na, double** x, Contact* contact_list, + int &num_contacts, double &evdwl, double* facc) +{ + int ni,nei,nj,nej,contact,interact; + double rradi,rradj,energy; + + nei = ednum[ibody]; + rradi = rounded_radius[ibody]; + nej = ednum[jbody]; + rradj = rounded_radius[jbody]; + + energy = 0; + interact = EE_NONE; + + // loop through body i's edges + + for (ni = 0; ni < nei; ni++) { + + for (nj = 0; nj < nej; nj++) { + + // compute the distance between the edge nj to the edge ni + #ifdef _POLYHEDRON_DEBUG + printf("Compute interaction between edge %d of body %d with edge %d of body %d:\n", + nj, jbody, ni, ibody); + #endif + + interact = interaction_edge_to_edge(ibody, ni, x[ibody], rradi, + jbody, nj, x[jbody], rradj, + k_n, k_na, cut_inner, + contact_list, num_contacts, + energy, facc); + } + + } // end for looping through the edges of body i + + evdwl += energy; + + return interact; +} + +/* ------------------------------------------------------------------------- + Compute the interaction between a face of body i and an edge from + another body + Input: + ibody = body i (i.e. atom i) + face_index = face index of body i + xmi = atom i's coordinates (body i's center of mass) + rounded_radius_i = rounded radius of the body i + jbody = body i (i.e. atom j) + edge_index = coordinate of the tested edge from another body + xmj = atom j's coordinates (body j's center of mass) + rounded_radius_j = rounded radius of the body j + cut_inner = cutoff for vertex-vertex and vertex-edge interaction + Output: + d = Distance from a point x0 to an edge + hi = coordinates of the projection of x0 on the edge + + contact = 0 no contact between the queried edge and the face + 1 contact detected + return + INVALID if the face index is invalid + NONE if there is no interaction +------------------------------------------------------------------------- */ + +int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, + int face_index, + double *xmi, + double rounded_radius_i, + int jbody, + int edge_index, + double *xmj, + double rounded_radius_j, + double k_n, + double k_na, + double cut_inner, + Contact* contact_list, + int &num_contacts, + double &energy, + double* facc) +{ + if (face_index >= facnum[ibody]) return EF_INVALID; + + int ifirst,iffirst,jfirst,npi1,npi2,npi3; + int jefirst,npj1,npj2; + double xi1[3],xi2[3],xi3[3],xpj1[3],xpj2[3],ui[3],vi[3],n[3]; + + double** x = atom->x; + double** v = atom->v; + double** f = atom->f; + double** torque = atom->torque; + double** angmom = atom->angmom; + + ifirst = dfirst[ibody]; + iffirst = facfirst[ibody]; + npi1 = static_cast(face[iffirst+face_index][0]); + npi2 = static_cast(face[iffirst+face_index][1]); + npi3 = static_cast(face[iffirst+face_index][2]); + + // compute the space-fixed coordinates for the vertices of the face + + xi1[0] = xmi[0] + discrete[ifirst+npi1][0]; + xi1[1] = xmi[1] + discrete[ifirst+npi1][1]; + xi1[2] = xmi[2] + discrete[ifirst+npi1][2]; + + xi2[0] = xmi[0] + discrete[ifirst+npi2][0]; + xi2[1] = xmi[1] + discrete[ifirst+npi2][1]; + xi2[2] = xmi[2] + discrete[ifirst+npi2][2]; + + xi3[0] = xmi[0] + discrete[ifirst+npi3][0]; + xi3[1] = xmi[1] + discrete[ifirst+npi3][1]; + xi3[2] = xmi[2] + discrete[ifirst+npi3][2]; + + // find the normal unit vector of the face, ensure it point outward of the body + + MathExtra::sub3(xi2, xi1, ui); + MathExtra::sub3(xi3, xi1, vi); + MathExtra::cross3(ui, vi, n); + MathExtra::norm3(n); + + double xc[3], dot, ans[3]; + xc[0] = (xi1[0] + xi2[0] + xi3[0])/3.0; + xc[1] = (xi1[1] + xi2[1] + xi3[1])/3.0; + xc[2] = (xi1[2] + xi2[2] + xi3[2])/3.0; + MathExtra::sub3(xc, xmi, ans); + dot = MathExtra::dot3(ans, n); + if (dot < 0) MathExtra::negate3(n); + + // two ends of the edge from body j + + jfirst = dfirst[jbody]; + jefirst = edfirst[jbody]; + npj1 = static_cast(edge[jefirst+edge_index][0]); + npj2 = static_cast(edge[jefirst+edge_index][1]); + + xpj1[0] = xmj[0] + discrete[jfirst+npj1][0]; + xpj1[1] = xmj[1] + discrete[jfirst+npj1][1]; + xpj1[2] = xmj[2] + discrete[jfirst+npj1][2]; + + xpj2[0] = xmj[0] + discrete[jfirst+npj2][0]; + xpj2[1] = xmj[1] + discrete[jfirst+npj2][1]; + xpj2[2] = xmj[2] + discrete[jfirst+npj2][2]; + + // no interaction if two ends of the edge are on the same side with the COM wrt the face + + if (opposite_sides(n, xi1, xmi, xpj1) == 0 && + opposite_sides(n, xi1, xmi, xpj2) == 0) + return EF_NONE; + + // determine the intersection of the edge to the face + + double hi1[3], hi2[3], d1, d2, contact_dist, shift; + int inside1 = 0; + int inside2 = 0; + + // enum {EF_PARALLEL=0,EF_SAME_SIDE_OF_FACE,EF_INTERSECT_INSIDE,EF_INTERSECT_OUTSIDE}; + int interact = edge_face_intersect(xi1, xi2, xi3, xpj1, xpj2, + hi1, hi2, d1, d2, inside1, inside2); + + inside_polygon(ibody, face_index, xmi, hi1, hi2, inside1, inside2); + + contact_dist = rounded_radius_i + rounded_radius_j; + shift = k_na * cut_inner; + + // both endpoints are on the same side of, or parallel to, the face + // and both are out of the interaction zone + + if (interact == EF_SAME_SIDE_OF_FACE || interact == EF_PARALLEL) { + + if (d1 > contact_dist + cut_inner && d2 > contact_dist + cut_inner) + return EF_NONE; + + int num_outside = 0; + int jflag = 1; + + #ifdef _POLYHEDRON_DEBUG + if (interact == EF_SAME_SIDE_OF_FACE) + printf(" - same side of face\n"); + else if (interact == EF_PARALLEL) + printf(" - parallel\n"); + printf(" face: xi1 (%f %f %f) xi2 (%f %f %f) xi3 (%f %f %f)\n", + xi1[0], xi1[1], xi1[2], xi2[0], xi2[1], xi2[2], xi3[0], xi3[1], xi3[2]); + printf(" edge: xpj1 (%f %f %f) xpj2 (%f %f %f)\n", + xpj1[0], xpj1[1], xpj1[2], xpj2[0], xpj2[1], xpj2[2]); + #endif + + // xpj1 is in the interaction zone + // and its projection on the face is inside the triangle + // compute vertex-face interaction and accumulate force/torque to both bodies + + if (d1 <= contact_dist + cut_inner) { + if (inside1) { + if (static_cast(discrete[jfirst+npj1][6]) == 0) { + pair_force_and_torque(jbody, ibody, xpj1, hi1, d1, contact_dist, + k_n, k_na, shift, x, v, f, torque, angmom, + jflag, energy, facc); + #ifdef _POLYHEDRON_DEBUG + printf(" - compute pair force between vertex %d from edge %d of body %d " + "with face %d of body %d: d1 = %f\n", + npj1, edge_index, jbody, face_index, ibody, d1); + #endif + + if (d1 <= contact_dist) { + // store the contact info + contact_list[num_contacts].ibody = ibody; + contact_list[num_contacts].jbody = jbody; + contact_list[num_contacts].xi[0] = hi1[0]; + contact_list[num_contacts].xi[1] = hi1[1]; + contact_list[num_contacts].xi[2] = hi1[2]; + contact_list[num_contacts].xj[0] = xpj1[0]; + contact_list[num_contacts].xj[1] = xpj1[1]; + contact_list[num_contacts].xj[2] = xpj1[2]; + contact_list[num_contacts].type = 0; + contact_list[num_contacts].separation = d1 - contact_dist; + num_contacts++; + } + + discrete[jfirst+npj1][6] = 1; + } + } else { + num_outside++; + } + } + + // xpj2 is in the interaction zone + // and its projection on the face is inside the triangle + // compute vertex-face interaction and accumulate force/torque to both bodies + + if (d2 <= contact_dist + cut_inner) { + if (inside2) { + if (static_cast(discrete[jfirst+npj2][6]) == 0) { + pair_force_and_torque(jbody, ibody, xpj2, hi2, d2, contact_dist, + k_n, k_na, shift, x, v, f, torque, angmom, + jflag, energy, facc); + #ifdef _POLYHEDRON_DEBUG + printf(" - compute pair force between vertex %d from edge %d of body %d " + "with face %d of body %d: d2 = %f\n", + npj2, edge_index, jbody, face_index, ibody, d2); + #endif + + if (d2 <= contact_dist) { + // store the contact info + contact_list[num_contacts].ibody = ibody; + contact_list[num_contacts].jbody = jbody; + contact_list[num_contacts].xi[0] = hi2[0]; + contact_list[num_contacts].xi[1] = hi2[1]; + contact_list[num_contacts].xi[2] = hi2[2]; + contact_list[num_contacts].xj[0] = xpj2[0]; + contact_list[num_contacts].xj[1] = xpj2[1]; + contact_list[num_contacts].xj[2] = xpj2[2]; + contact_list[num_contacts].type = 0; + contact_list[num_contacts].separation = d2 - contact_dist; + num_contacts++; + } + discrete[jfirst+npj2][6] = 1; + } + } else { + num_outside++; + } + } + + // both ends have projection outside of the face + // compute interaction between the edge with the three edges of the face + + if (num_outside == 2) { + + #ifdef _POLYHEDRON_DEBUG + printf(" - outside = 2\n"); + printf(" - compute pair force between edge %d of body %d " + "with 3 edges of face %d of body %d\n", + edge_index, jbody, face_index, ibody); + #endif + + interact = EF_INTERSECT_OUTSIDE; + + } + + } else if (interact == EF_INTERSECT_OUTSIDE) { + + // compute interaction between the edge with the three edges of the face + + #ifdef _POLYHEDRON_DEBUG + printf(" - intersect outside triangle\n"); + printf(" - compute pair force between edge %d of body %d " + "with face %d of body %d\n", edge_index, jbody, face_index, ibody); + printf(" face: xi1 (%f %f %f) xi2 (%f %f %f) xi3 (%f %f %f)\n", + xi1[0], xi1[1], xi1[2], xi2[0], xi2[1], xi2[2], xi3[0], xi3[1], xi3[2]); + printf(" edge: xpj1 (%f %f %f) xpj2 (%f %f %f)\n", + xpj1[0], xpj1[1], xpj1[2], xpj2[0], xpj2[1], xpj2[2]); + + #endif + } else if (interact == EF_INTERSECT_INSIDE) { + + } + + return interact; +} + +/* ------------------------------------------------------------------------- + Compute the distance between an edge of body i and an edge from + another body + Input: + ibody = body i (i.e. atom i) + face_index = face index of body i + xmi = atom i's coordinates (body i's center of mass) + rounded_radius_i = rounded radius of the body i + jbody = body i (i.e. atom j) + edge_index = coordinate of the tested edge from another body + xmj = atom j's coordinates (body j's center of mass) + rounded_radius_j = rounded radius of the body j + cut_inner = cutoff for vertex-vertex and vertex-edge interaction + Output: + d = Distance from a point x0 to an edge + hi = coordinates of the projection of x0 on the edge + + contact = 0 no contact between the queried edge and the face + 1 contact detected + return + INVALID if the face index is invalid + NONE if there is no interaction +------------------------------------------------------------------------- */ + +int PairBodyRoundedPolyhedron::interaction_edge_to_edge(int ibody, + int edge_index_i, + double *xmi, + double rounded_radius_i, + int jbody, + int edge_index_j, + double *xmj, + double rounded_radius_j, + double k_n, + double k_na, + double cut_inner, + Contact* contact_list, + int &num_contacts, + double &energy, + double* facc) +{ + int ifirst,iefirst,jfirst,jefirst,npi1,npi2,npj1,npj2,interact; + double xi1[3],xi2[3],xpj1[3],xpj2[3]; + double r,t1,t2,h1[3],h2[3]; + double contact_dist, shift; + + double** x = atom->x; + double** v = atom->v; + double** f = atom->f; + double** torque = atom->torque; + double** angmom = atom->angmom; + + ifirst = dfirst[ibody]; + iefirst = edfirst[ibody]; + npi1 = static_cast(edge[iefirst+edge_index_i][0]); + npi2 = static_cast(edge[iefirst+edge_index_i][1]); + + // compute the space-fixed coordinates for the edge ends + + xi1[0] = xmi[0] + discrete[ifirst+npi1][0]; + xi1[1] = xmi[1] + discrete[ifirst+npi1][1]; + xi1[2] = xmi[2] + discrete[ifirst+npi1][2]; + + xi2[0] = xmi[0] + discrete[ifirst+npi2][0]; + xi2[1] = xmi[1] + discrete[ifirst+npi2][1]; + xi2[2] = xmi[2] + discrete[ifirst+npi2][2]; + + // two ends of the edge from body j + + jfirst = dfirst[jbody]; + jefirst = edfirst[jbody]; + npj1 = static_cast(edge[jefirst+edge_index_j][0]); + npj2 = static_cast(edge[jefirst+edge_index_j][1]); + + xpj1[0] = xmj[0] + discrete[jfirst+npj1][0]; + xpj1[1] = xmj[1] + discrete[jfirst+npj1][1]; + xpj1[2] = xmj[2] + discrete[jfirst+npj1][2]; + + xpj2[0] = xmj[0] + discrete[jfirst+npj2][0]; + xpj2[1] = xmj[1] + discrete[jfirst+npj2][1]; + xpj2[2] = xmj[2] + discrete[jfirst+npj2][2]; + + contact_dist = rounded_radius_i + rounded_radius_j; + shift = k_na * cut_inner; + + int jflag = 1; + distance_bt_edges(xpj1, xpj2, xi1, xi2, h1, h2, t1, t2, r); + + #ifdef _POLYHEDRON_DEBUG + double ui[3],uj[3]; + MathExtra::sub3(xi1,xi2,ui); + MathExtra::norm3(ui); + MathExtra::sub3(xpj1,xpj2,uj); + MathExtra::norm3(uj); + double dot = MathExtra::dot3(ui, uj); + printf(" edge npi1 = %d (%f %f %f); npi2 = %d (%f %f %f) vs." + " edge npj1 = %d (%f %f %f); npj2 = %d (%f %f %f): " + "t1 = %f; t2 = %f; r = %f; dot = %f\n", + npi1, xi1[0], xi1[1], xi1[2], npi2, xi2[0], xi2[1], xi2[2], + npj1, xpj1[0], xpj1[1], xpj1[2], npj2, xpj2[0], xpj2[1], xpj2[2], + t1, t2, r, dot); + #endif + + interact = EE_NONE; + + // singularity case, ignore interactions + + if (r < EPSILON) return interact; + + // include the vertices for interactions + + if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1 && + r < contact_dist + cut_inner) { + pair_force_and_torque(jbody, ibody, h1, h2, r, contact_dist, + k_n, k_na, shift, x, v, f, torque, angmom, + jflag, energy, facc); + + interact = EE_INTERACT; + if (r <= contact_dist) { + // store the contact info + contact_list[num_contacts].ibody = ibody; + contact_list[num_contacts].jbody = jbody; + contact_list[num_contacts].xi[0] = h2[0]; + contact_list[num_contacts].xi[1] = h2[1]; + contact_list[num_contacts].xi[2] = h2[2]; + contact_list[num_contacts].xj[0] = h1[0]; + contact_list[num_contacts].xj[1] = h1[1]; + contact_list[num_contacts].xj[2] = h1[2]; + contact_list[num_contacts].type = 1; + contact_list[num_contacts].separation = r - contact_dist; + num_contacts++; + } + } else { + + } + + return interact; +} + +/* ---------------------------------------------------------------------- + Compute forces and torques between two bodies caused by the interaction + between a pair of points on either bodies (similar to sphere-sphere) +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::pair_force_and_torque(int ibody, int jbody, + double* pi, double* pj, double r, double contact_dist, + double k_n, double k_na, double shift, double** x, + double** v, double** f, double** torque, double** angmom, + int jflag, double& energy, double* facc) +{ + double delx,dely,delz,R,fx,fy,fz,fpair; + + delx = pi[0] - pj[0]; + dely = pi[1] - pj[1]; + delz = pi[2] - pj[2]; + R = r - contact_dist; + if (R <= 0) { // deformation occurs + fpair = -k_n * R - shift; + energy += (0.5 * k_n * R + shift) * R; + } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap + fpair = k_na * R - shift; + energy += (-0.5 * k_na * R + shift) * R; + } else fpair = 0.0; + + fx = delx*fpair/r; + fy = dely*fpair/r; + fz = delz*fpair/r; + + #ifdef _POLYHEDRON_DEBUG + printf(" - R = %f; r = %f; k_na = %f; shift = %f; fpair = %f;" + " energy = %f; jflag = %d\n", R, r, k_na, shift, fpair, + energy, jflag); + #endif + + if (R <= 0) { + + // contact: accumulate normal and tangential contact force components + + contact_forces(ibody, jbody, pi, pj, delx, dely, delz, fx, fy, fz, + x, v, angmom, f, torque, facc); + } else { + + // accumulate force and torque to both bodies directly + + f[ibody][0] += fx; + f[ibody][1] += fy; + f[ibody][2] += fz; + sum_torque(x[ibody], pi, fx, fy, fz, torque[ibody]); + + facc[0] += fx; facc[1] += fy; facc[2] += fz; + + if (jflag) { + f[jbody][0] -= fx; + f[jbody][1] -= fy; + f[jbody][2] -= fz; + sum_torque(x[jbody], pj, -fx, -fy, -fz, torque[jbody]); + } + } +} + +/* ---------------------------------------------------------------------- + Compute contact forces between two bodies + modify the force stored at the vertex and edge in contact by j_a + sum forces and torque to the corresponding bodies + fx,fy,fz = unscaled cohesive forces + fn = normal friction component + ft = tangential friction component (-c_t * v_t) +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::contact_forces(int ibody, int jbody, + double *xi, double *xj, double delx, double dely, double delz, + double fx, double fy, double fz, double** x, double** v, double** angmom, + double** f, double** torque, double* facc) +{ + int ibonus,jbonus; + double rsq,rsqinv,vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double fn[3],ft[3],vi[3],vj[3]; + double *quat, *inertia; + AtomVecBody::Bonus *bonus; + + // compute the velocity of the vertex in the space-fixed frame + + ibonus = atom->body[ibody]; + bonus = &avec->bonus[ibonus]; + quat = bonus->quat; + inertia = bonus->inertia; + total_velocity(xi, x[ibody], v[ibody], angmom[ibody], + inertia, quat, vi); + + // compute the velocity of the point on the edge in the space-fixed frame + + jbonus = atom->body[jbody]; + bonus = &avec->bonus[jbonus]; + quat = bonus->quat; + inertia = bonus->inertia; + total_velocity(xj, x[jbody], v[jbody], angmom[jbody], + inertia, quat, vj); + + // vector pointing from the contact point on ibody to that on jbody + + rsq = delx*delx + dely*dely + delz*delz; + rsqinv = 1.0/rsq; + + // relative translational velocity + + vr1 = vi[0] - vj[0]; + vr2 = vi[1] - vj[1]; + vr3 = vi[2] - vj[2]; + + // normal component + + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // normal friction term at contact + + fn[0] = -c_n * vn1; + fn[1] = -c_n * vn2; + fn[2] = -c_n * vn3; + + // tangential friction term at contact + // excluding the tangential deformation term for now + + ft[0] = -c_t * vt1; + ft[1] = -c_t * vt2; + ft[2] = -c_t * vt3; + + // cohesive forces will be scaled by j_a after contact area is computed + // mu * fne = tangential friction deformation during gross sliding + // see Eq. 4, Fraige et al. + + fx = fn[0] + ft[0] + mu * fx; + fy = fn[1] + ft[1] + mu * fy; + fz = fn[2] + ft[2] + mu * fz; + + f[ibody][0] += fx; + f[ibody][1] += fy; + f[ibody][2] += fz; + sum_torque(x[ibody], xi, fx, fy, fz, torque[ibody]); + + f[jbody][0] -= fx; + f[jbody][1] -= fy; + f[jbody][2] -= fz; + sum_torque(x[jbody], xj, -fx, -fy, -fz, torque[jbody]); + + facc[0] += fx; facc[1] += fy; facc[2] += fz; + + #ifdef _POLYHEDRON_DEBUG + printf("contact ibody = %d: f = %f %f %f; torque = %f %f %f\n", ibody, + f[ibody][0], f[ibody][1], f[ibody][2], + torque[ibody][0], torque[ibody][1], torque[ibody][2]); + printf("contact jbody = %d: f = %f %f %f; torque = %f %f %f\n", jbody, + f[jbody][0], f[jbody][1], f[jbody][2], + torque[jbody][0], torque[jbody][1], torque[jbody][2]); + #endif +} + +/* ---------------------------------------------------------------------- + Rescale the forces and torques for all the contacts +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::rescale_cohesive_forces(double** x, + double** f, double** torque, Contact* contact_list, int &num_contacts, + double contact_area, double k_n, double k_na, double* facc) +{ + int m,ibody,jbody; + double delx,dely,delz,fx,fy,fz,R,fpair,r,shift; + double j_a = contact_area / (num_contacts * A_ua); + if (j_a < 1.0) j_a = 1.0; + + shift = k_na * cut_inner; + + for (m = 0; m < num_contacts; m++) { + ibody = contact_list[m].ibody; + jbody = contact_list[m].jbody; + + delx = contact_list[m].xi[0] - contact_list[m].xj[0]; + dely = contact_list[m].xi[1] - contact_list[m].xj[1]; + delz = contact_list[m].xi[2] - contact_list[m].xj[2]; + r = sqrt(delx*delx + dely*dely + delz*delz); + R = contact_list[m].separation; + if (R <= 0) { // deformation occurs + fpair = -k_n * R - shift; + } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap + fpair = k_na * R - shift; + } else fpair = 0.0; + + fpair *= j_a; + fx = delx*fpair/r; + fy = dely*fpair/r; + fz = delz*fpair/r; + + f[ibody][0] += fx; + f[ibody][1] += fy; + f[ibody][2] += fz; + sum_torque(x[ibody], contact_list[m].xi, fx, fy, fz, torque[ibody]); + + f[jbody][0] -= fx; + f[jbody][1] -= fy; + f[jbody][2] -= fz; + sum_torque(x[jbody], contact_list[m].xj, -fx, -fy, -fz, torque[jbody]); + + facc[0] += fx; facc[1] += fy; facc[2] += fz; + } +} + +/* ---------------------------------------------------------------------- + Accumulate torque to body from the force f=(fx,fy,fz) acting at point x +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::sum_torque(double* xm, double *x, double fx, + double fy, double fz, double* torque) +{ + double rx = x[0] - xm[0]; + double ry = x[1] - xm[1]; + double rz = x[2] - xm[2]; + double tx = ry * fz - rz * fy; + double ty = rz * fx - rx * fz; + double tz = rx * fy - ry * fx; + torque[0] += tx; + torque[1] += ty; + torque[2] += tz; +} + +/* ---------------------------------------------------------------------- + Test if two points a and b are in opposite sides of a plane defined by + a normal vector n and a point x0 +------------------------------------------------------------------------- */ + +int PairBodyRoundedPolyhedron::opposite_sides(double* n, double* x0, + double* a, double* b) +{ + double m_a = n[0]*(a[0] - x0[0])+n[1]*(a[1] - x0[1])+n[2]*(a[2] - x0[2]); + double m_b = n[0]*(b[0] - x0[0])+n[1]*(b[1] - x0[1])+n[2]*(b[2] - x0[2]); + // equal to zero when either a or b is on the plane + if (m_a * m_b <= 0) + return 1; + else + return 0; +} + +/* ---------------------------------------------------------------------- + Test if a line segment defined by two points a and b intersects with + a triangle defined by three points x1, x2 and x3 +------------------------------------------------------------------------- */ + +int PairBodyRoundedPolyhedron::edge_face_intersect(double* x1, double* x2, + double* x3, double* a, double* b, double* h_a, double* h_b, + double& d_a, double& d_b, int& inside_a, int& inside_b) +{ + double s[3], u[3], v[3], n[3]; + + // line director + + MathExtra::sub3(b, a, s); + + // plane normal vector + + MathExtra::sub3(x2, x1, u); + MathExtra::sub3(x3, x1, v); + MathExtra::cross3(u, v, n); + MathExtra::norm3(n); + + // find the projection of a and b to the plane and the corresponding distances + + project_pt_plane(a, x1, x2, x3, h_a, d_a, inside_a); + + project_pt_plane(b, x1, x2, x3, h_b, d_b, inside_b); + + // check if the line segment is parallel to the plane + + double dot = MathExtra::dot3(s, n); + if (fabs(dot) < EPSILON) return EF_PARALLEL; + + // solve for the intersection between the line and the plane + + double m[3][3], invm[3][3], p[3], ans[3]; + m[0][0] = -s[0]; + m[0][1] = u[0]; + m[0][2] = v[0]; + + m[1][0] = -s[1]; + m[1][1] = u[1]; + m[1][2] = v[1]; + + m[2][0] = -s[2]; + m[2][1] = u[2]; + m[2][2] = v[2]; + + MathExtra::sub3(a, x1, p); + MathExtra::invert3(m, invm); + MathExtra::matvec(invm, p, ans); + + // p is reused for the intersection point + // s = b - a + + double t = ans[0]; + p[0] = a[0] + s[0] * t; + p[1] = a[1] + s[1] * t; + p[2] = a[2] + s[2] * t; + + // check if p is inside the triangle, excluding the edges and vertices + // the edge-edge and edge-vertices are handled separately + + int inside = 0; + if (ans[1] > 0 && ans[2] > 0 && ans[1] + ans[2] < 1) + inside = 1; + + int interact; + if (t < 0 || t > 1) { + interact = EF_SAME_SIDE_OF_FACE; + } else { + if (inside == 1) + interact = EF_INTERSECT_INSIDE; + else + interact = EF_INTERSECT_OUTSIDE; + } + + return interact; +} + +/* ---------------------------------------------------------------------- + Find the projection of q on the plane defined by point p and the normal + unit vector n: q_proj = q - dot(q - p, n) * n + and the distance d from q to the plane +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::project_pt_plane(const double* q, + const double* p, const double* n, + double* q_proj, double &d) +{ + double dot, ans[3], n_p[3]; + n_p[0] = n[0]; n_p[1] = n[1]; n_p[2] = n[2]; + MathExtra::sub3(q, p, ans); + dot = MathExtra::dot3(ans, n_p); + MathExtra::scale3(dot, n_p); + MathExtra::sub3(q, n_p, q_proj); + MathExtra::sub3(q, q_proj, ans); + d = MathExtra::len3(ans); +} + +/* ---------------------------------------------------------------------- + Check if points q1 and q2 are inside a convex polygon, i.e. a face of + a polyhedron + ibody = atom i's index + face_index = face index of the body + xmi = atom i's coordinates + q1 = tested point on the face (e.g. the projection of a point) + q2 = another point (can be NULL) for face-edge intersection + Output: + inside1 = 1 if q1 is inside the polygon, 0 otherwise + inside2 = 1 if q2 is inside the polygon, 0 otherwise +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::inside_polygon(int ibody, int face_index, + double* xmi, const double* q1, const double* q2, + int& inside1, int& inside2) + +{ + int i,n,ifirst,iffirst,npi1,npi2; + double xi1[3],xi2[3],u[3],v[3],costheta,anglesum1,anglesum2,magu,magv; + + ifirst = dfirst[ibody]; + iffirst = facfirst[ibody]; + anglesum1 = anglesum2 = 0;; + for (i = 0; i < MAX_FACE_SIZE; i++) { + npi1 = static_cast(face[iffirst+face_index][i]); + if (npi1 < 0) break; + n = i + 1; + if (n <= MAX_FACE_SIZE - 1) { + npi2 = static_cast(face[iffirst+face_index][n]); + if (npi2 < 0) npi2 = static_cast(face[iffirst+face_index][0]); + } else { + npi2 = static_cast(face[iffirst+face_index][0]); + } + + xi1[0] = xmi[0] + discrete[ifirst+npi1][0]; + xi1[1] = xmi[1] + discrete[ifirst+npi1][1]; + xi1[2] = xmi[2] + discrete[ifirst+npi1][2]; + + xi2[0] = xmi[0] + discrete[ifirst+npi2][0]; + xi2[1] = xmi[1] + discrete[ifirst+npi2][1]; + xi2[2] = xmi[2] + discrete[ifirst+npi2][2]; + + MathExtra::sub3(xi1,q1,u); + MathExtra::sub3(xi2,q1,v); + magu = MathExtra::len3(u); + magv = MathExtra::len3(v); + + // the point is at either vertices + + if (magu * magv < EPSILON) inside1 = 1; + else { + costheta = MathExtra::dot3(u,v)/(magu*magv); + anglesum1 += acos(costheta); + } + + if (q2 != NULL) { + MathExtra::sub3(xi1,q2,u); + MathExtra::sub3(xi2,q2,v); + magu = MathExtra::len3(u); + magv = MathExtra::len3(v); + if (magu * magv < EPSILON) inside2 = 1; + else { + costheta = MathExtra::dot3(u,v)/(magu*magv); + anglesum2 += acos(costheta); + } + } + } + + if (fabs(anglesum1 - MY_2PI) < EPSILON) inside1 = 1; + else inside1 = 0; + + if (q2 != NULL) { + if (fabs(anglesum2 - MY_2PI) < EPSILON) inside2 = 1; + else inside2 = 0; + } +} + +/* ---------------------------------------------------------------------- + Find the projection of q on the plane defined by 3 points x1, x2 and x3 + returns the distance d from q to the plane and whether the projected + point is inside the triangle defined by (x1, x2, x3) +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::project_pt_plane(const double* q, + const double* x1, const double* x2, const double* x3, double* q_proj, + double &d, int& inside) +{ + double u[3],v[3],n[3]; + + // plane normal vector + + MathExtra::sub3(x2, x1, u); + MathExtra::sub3(x3, x1, v); + MathExtra::cross3(u, v, n); + MathExtra::norm3(n); + + // solve for the intersection between the line and the plane + + double m[3][3], invm[3][3], p[3], ans[3]; + m[0][0] = -n[0]; + m[0][1] = u[0]; + m[0][2] = v[0]; + + m[1][0] = -n[1]; + m[1][1] = u[1]; + m[1][2] = v[1]; + + m[2][0] = -n[2]; + m[2][1] = u[2]; + m[2][2] = v[2]; + + MathExtra::sub3(q, x1, p); + MathExtra::invert3(m, invm); + MathExtra::matvec(invm, p, ans); + + double t = ans[0]; + q_proj[0] = q[0] + n[0] * t; + q_proj[1] = q[1] + n[1] * t; + q_proj[2] = q[2] + n[2] * t; + + // check if the projection point is inside the triangle + // exclude the edges and vertices + // edge-sphere and sphere-sphere interactions are handled separately + + inside = 0; + if (ans[1] > 0 && ans[2] > 0 && ans[1] + ans[2] < 1) { + inside = 1; + } + + // distance from q to q_proj + + MathExtra::sub3(q, q_proj, ans); + d = MathExtra::len3(ans); +} + +/* ---------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::project_pt_line(const double* q, + const double* xi1, const double* xi2, double* h, double& d, double& t) +{ + double u[3],v[3],r[3],s; + + MathExtra::sub3(xi2, xi1, u); + MathExtra::norm3(u); + MathExtra::sub3(q, xi1, v); + + s = MathExtra::dot3(u, v); + h[0] = xi1[0] + s * u[0]; + h[1] = xi1[1] + s * u[1]; + h[2] = xi1[2] + s * u[2]; + + MathExtra::sub3(q, h, r); + d = MathExtra::len3(r); + + if (fabs(xi2[0] - xi1[0]) > 0) + t = (h[0] - xi1[0])/(xi2[0] - xi1[0]); + else if (fabs(xi2[1] - xi1[1]) > 0) + t = (h[1] - xi1[1])/(xi2[1] - xi1[1]); + else if (fabs(xi2[2] - xi1[2]) > 0) + t = (h[2] - xi1[2])/(xi2[2] - xi1[2]); +} + +/* ---------------------------------------------------------------------- + compute the shortest distance between two edges (line segments) + x1, x2: two endpoints of the first edge + x3, x4: two endpoints of the second edge + h1: the end point of the shortest segment perpendicular to both edges + on the line (x1;x2) + h2: the end point of the shortest segment perpendicular to both edges + on the line (x3;x4) + t1: fraction of h1 in the segment (x1,x2) + t2: fraction of h2 in the segment (x3,x4) +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::distance_bt_edges(const double* x1, + const double* x2, const double* x3, const double* x4, + double* h1, double* h2, double& t1, double& t2, double& r) +{ + double u[3],v[3],n[3],dot; + + // set the default returned values + + t1 = -2; + t2 = 2; + r = 0; + + // find the edge unit directors and their dot product + + MathExtra::sub3(x2, x1, u); + MathExtra::norm3(u); + MathExtra::sub3(x4, x3, v); + MathExtra::norm3(v); + dot = MathExtra::dot3(u,v); + dot = fabs(dot); + + // check if two edges are parallel + // find the two ends of the overlapping segment, if any + + if (fabs(dot - 1.0) < EPSILON) { + + double s1,s2,x13[3],x23[3],x13h[3]; + double t13,t23,t31,t41,x31[3],x41[3]; + + MathExtra::sub3(x1,x3,x13); // x13 = x1 - x3 + MathExtra::sub3(x2,x3,x23); // x23 = x2 - x3 + + s1 = MathExtra::dot3(x13,v); + x13h[0] = x13[0] - s1*v[0]; + x13h[1] = x13[1] - s1*v[1]; + x13h[2] = x13[2] - s1*v[2]; + r = MathExtra::len3(x13h); + + // x13 is the projection of x1 on x3-x4 + + x13[0] = x3[0] + s1*v[0]; + x13[1] = x3[1] + s1*v[1]; + x13[2] = x3[2] + s1*v[2]; + + // x23 is the projection of x2 on x3-x4 + + s2 = MathExtra::dot3(x23,v); + x23[0] = x3[0] + s2*v[0]; + x23[1] = x3[1] + s2*v[1]; + x23[2] = x3[2] + s2*v[2]; + + // find the fraction of the projection points on the edges + + if (fabs(x4[0] - x3[0]) > 0) + t13 = (x13[0] - x3[0])/(x4[0] - x3[0]); + else if (fabs(x4[1] - x3[1]) > 0) + t13 = (x13[1] - x3[1])/(x4[1] - x3[1]); + else if (fabs(x4[2] - x3[2]) > 0) + t13 = (x13[2] - x3[2])/(x4[2] - x3[2]); + + if (fabs(x4[0] - x3[0]) > 0) + t23 = (x23[0] - x3[0])/(x4[0] - x3[0]); + else if (fabs(x4[1] - x3[1]) > 0) + t23 = (x23[1] - x3[1])/(x4[1] - x3[1]); + else if (fabs(x4[2] - x3[2]) > 0) + t23 = (x23[2] - x3[2])/(x4[2] - x3[2]); + + if (fabs(x23[0] - x13[0]) > 0) + t31 = (x3[0] - x13[0])/(x23[0] - x13[0]); + else if (fabs(x23[1] - x13[1]) > 0) + t31 = (x3[1] - x13[1])/(x23[1] - x13[1]); + else if (fabs(x23[2] - x13[2]) > 0) + t31 = (x3[2] - x13[2])/(x23[2] - x13[2]); + + // x31 is the projection of x3 on x1-x2 + + x31[0] = x1[0] + t31*(x2[0] - x1[0]); + x31[1] = x1[1] + t31*(x2[1] - x1[1]); + x31[2] = x1[2] + t31*(x2[2] - x1[2]); + + if (fabs(x23[0] - x13[0]) > 0) + t41 = (x4[0] - x13[0])/(x23[0] - x13[0]); + else if (fabs(x23[1] - x13[1]) > 0) + t41 = (x4[1] - x13[1])/(x23[1] - x13[1]); + else if (fabs(x23[2] - x13[2]) > 0) + t41 = (x4[2] - x13[2])/(x23[2] - x13[2]); + + // x41 is the projection of x4 on x1-x2 + + x41[0] = x1[0] + t41*(x2[0] - x1[0]); + x41[1] = x1[1] + t41*(x2[1] - x1[1]); + x41[2] = x1[2] + t41*(x2[2] - x1[2]); + + // determine two ends from the overlapping segments + + int n1 = 0; + int n2 = 0; + if (t13 >= 0 && t13 <= 1) { + h1[0] = x1[0]; + h1[1] = x1[1]; + h1[2] = x1[2]; + h2[0] = x13[0]; + h2[1] = x13[1]; + h2[2] = x13[2]; + t1 = 0; + t2 = t13; + n1++; + n2++; + } + if (t23 >= 0 && t23 <= 1) { + if (n1 == 0) { + h1[0] = x2[0]; + h1[1] = x2[1]; + h1[2] = x2[2]; + h2[0] = x23[0]; + h2[1] = x23[1]; + h2[2] = x23[2]; + t1 = 1; + t2 = t23; + n1++; + n2++; + } else { + h1[0] = (x1[0]+x2[0])/2; + h1[1] = (x1[1]+x2[1])/2; + h1[2] = (x1[2]+x2[2])/2; + h2[0] = (x13[0]+x23[0])/2; + h2[1] = (x13[1]+x23[1])/2; + h2[2] = (x13[2]+x23[2])/2; + t1 = 0.5; + t2 = (t13+t23)/2; + n1++; + n2++; + } + } + + if (n1 == 0 && n2 == 0) { + if (t31 >= 0 && t31 <= 1) { + h1[0] = x31[0]; + h1[1] = x31[1]; + h1[2] = x31[2]; + h2[0] = x3[0]; + h2[1] = x3[1]; + h2[2] = x3[2]; + t1 = t31; + t2 = 0; + n1++; + n2++; + } + if (t41 >= 0 && t41 <= 1) { + if (n1 == 0) { + h1[0] = x41[0]; + h1[1] = x41[1]; + h1[2] = x41[2]; + h2[0] = x4[0]; + h2[1] = x4[1]; + h2[2] = x4[2]; + t1 = t41; + t2 = 1; + n1++; + n2++; + } else { + h1[0] = (x31[0]+x41[0])/2; + h1[1] = (x31[1]+x41[1])/2; + h1[2] = (x31[2]+x41[2])/2; + h2[0] = (x3[0]+x4[0])/2; + h2[1] = (x3[1]+x4[1])/2; + h2[2] = (x3[2]+x4[2])/2; + t1 = (t31+t41)/2; + t2 = 0.5; + n1++; + n2++; + } + } + } + + // if n1 == 0 and n2 == 0 at this point, + // which means no overlapping segments bt two parallel edges, + // return the default values of t1 and t2 + + return; + + } + + // find the vector n perpendicular to both edges + + MathExtra::cross3(u, v, n); + MathExtra::norm3(n); + + // find the intersection of the line (x3,x4) and the plane (x1,x2,n) + // s = director of the line (x3,x4) + // n_p = plane normal vector of the plane (x1,x2,n) + + double s[3], n_p[3]; + MathExtra::sub3(x4, x3, s); + MathExtra::sub3(x2, x1, u); + MathExtra::cross3(u, n, n_p); + MathExtra::norm3(n_p); + + // solve for the intersection between the line and the plane + + double m[3][3], invm[3][3], p[3], ans[3]; + m[0][0] = -s[0]; + m[0][1] = u[0]; + m[0][2] = n[0]; + + m[1][0] = -s[1]; + m[1][1] = u[1]; + m[1][2] = n[1]; + + m[2][0] = -s[2]; + m[2][1] = u[2]; + m[2][2] = n[2]; + + MathExtra::sub3(x3, x1, p); + MathExtra::invert3(m, invm); + MathExtra::matvec(invm, p, ans); + + t2 = ans[0]; + h2[0] = x3[0] + s[0] * t2; + h2[1] = x3[1] + s[1] * t2; + h2[2] = x3[2] + s[2] * t2; + + project_pt_plane(h2, x1, n, h1, r); + + if (fabs(x2[0] - x1[0]) > 0) + t1 = (h1[0] - x1[0])/(x2[0] - x1[0]); + else if (fabs(x2[1] - x1[1]) > 0) + t1 = (h1[1] - x1[1])/(x2[1] - x1[1]); + else if (fabs(x2[2] - x1[2]) > 0) + t1 = (h1[2] - x1[2])/(x2[2] - x1[2]); +} + +/* ---------------------------------------------------------------------- + Calculate the total velocity of a point (vertex, a point on an edge): + vi = vcm + omega ^ (p - xcm) +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::total_velocity(double* p, double *xcm, + double* vcm, double *angmom, double *inertia, double *quat, double* vi) +{ + double r[3],omega[3],ex_space[3],ey_space[3],ez_space[3]; + r[0] = p[0] - xcm[0]; + r[1] = p[1] - xcm[1]; + r[2] = p[2] - xcm[2]; + MathExtra::q_to_exyz(quat,ex_space,ey_space,ez_space); + MathExtra::angmom_to_omega(angmom,ex_space,ey_space,ez_space, + inertia,omega); + vi[0] = omega[1]*r[2] - omega[2]*r[1] + vcm[0]; + vi[1] = omega[2]*r[0] - omega[0]*r[2] + vcm[1]; + vi[2] = omega[0]*r[1] - omega[1]*r[0] + vcm[2]; +} + +/* ---------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::sanity_check() +{ + + double x1[3],x2[3],x3[3],x4[3],h_a[3],h_b[3],d_a,d_b,u[3],v[3],n[3]; + double a[3],b[3],t_a,t_b; + int inside_a, inside_b; + + x1[0] = 0; x1[1] = 3; x1[2] = 0; + x2[0] = 3; x2[1] = 0; x2[2] = 0; + x3[0] = 4; x3[1] = 3; x3[2] = 0; + x4[0] = 5; x4[1] = 3; x4[2] = 0; + + a[0] = 0; a[1] = 0; a[2] = 0; + b[0] = 4; b[1] = 0; b[2] = 0; + + project_pt_line(a, x1, x2, h_a, d_a, t_a); + project_pt_line(b, x1, x2, h_b, d_b, t_b); +/* + printf("h_a: %f %f %f; h_b: %f %f %f; t_a = %f; t_b = %f; d = %f; d_b = %f\n", + h_a[0], h_a[1], h_a[2], h_b[0], h_b[1], h_b[2], t_a, t_b, d_a, d_b); +*/ +/* + int mode = edge_face_intersect(x1, x2, x3, a, b, h_a, h_b, d_a, d_b, + inside_a, inside_b); + + MathExtra::sub3(x2, x1, u); + MathExtra::sub3(x3, x1, v); + MathExtra::cross3(u, v, n); + MathExtra::norm3(n); +*/ +/* + project_pt_plane(a, x1, x2, x3, h_a, d_a, inside_a); + printf("h_a: %f %f %f; d = %f: inside %d\n", + h_a[0], h_a[1], h_a[2], d_a, inside_a); + project_pt_plane(b, x1, x2, x3, h_b, d_b, inside_b); + printf("h_b: %f %f %f; d = %f: inside %d\n", + h_b[0], h_b[1], h_b[2], d_b, inside_b); +*/ +/* + distance_bt_edges(x1, x2, x3, x4, h_a, h_b, t_a, t_b, d_a); + printf("h_a: %f %f %f; h_b: %f %f %f; t_a = %f; t_b = %f; d = %f\n", + h_a[0], h_a[1], h_a[2], h_b[0], h_b[1], h_b[2], t_a, t_b, d_a); +*/ +} + diff --git a/src/BODY/pair_body_rounded_polyhedron.h b/src/BODY/pair_body_rounded_polyhedron.h new file mode 100644 index 0000000000..d7ee1f013e --- /dev/null +++ b/src/BODY/pair_body_rounded_polyhedron.h @@ -0,0 +1,176 @@ +/* -*- 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 PAIR_CLASS + +PairStyle(body/rounded/polyhedron,PairBodyRoundedPolyhedron) + +#else + +#ifndef LMP_PAIR_BODY_ROUNDED_POLYHEDRON_H +#define LMP_PAIR_BODY_ROUNDED_POLYHEDRON_H + +#include "pair.h" + +namespace LAMMPS_NS { + +class PairBodyRoundedPolyhedron : public Pair { + public: + PairBodyRoundedPolyhedron(class LAMMPS *); + ~PairBodyRoundedPolyhedron(); + void compute(int, int); + void settings(int, char **); + void coeff(int, char **); + void init_style(); + double init_one(int, int); + + struct Contact { + int ibody, jbody; // body (i.e. atom) indices (not tags) + int type; // 0 = VERTEX-FACE; 1 = EDGE-EDGE + double fx,fy,fz; // unscaled cohesive forces at contact + double xi[3]; // coordinates of the contact point on ibody + double xj[3]; // coordinates of the contact point on jbody + double separation; // contact surface separation + }; + + protected: + double **k_n; // normal repulsion strength + double **k_na; // normal attraction strength + double c_n; // normal damping coefficient + double c_t; // tangential damping coefficient + double mu; // normal friction coefficient during gross sliding + double A_ua; // characteristic contact area + double cut_inner; // cutoff for interaction between vertex-edge surfaces + + class AtomVecBody *avec; + class BodyRoundedPolyhedron *bptr; + + double **discrete; // list of all sub-particles for all bodies + int ndiscrete; // number of discretes in list + int dmax; // allocated size of discrete list + int *dnum; // number of discretes per line, 0 if uninit + int *dfirst; // index of first discrete per each line + int nmax; // allocated size of dnum,dfirst vectors + + double **edge; // list of all edge for all bodies + int nedge; // number of edge in list + int edmax; // allocated size of edge list + int *ednum; // number of edges per line, 0 if uninit + int *edfirst; // index of first edge per each line + int ednummax; // allocated size of ednum,edfirst vectors + + double **face; // list of all edge for all bodies + int nface; // number of faces in list + int facmax; // allocated size of face list + int *facnum; // number of faces per line, 0 if uninit + int *facfirst; // index of first face per each line + int facnummax; // allocated size of facnum,facfirst vectors + + double *enclosing_radius; // enclosing radii for all bodies + double *rounded_radius; // rounded radii for all bodies + double *maxerad; // per-type maximum enclosing radius + + void allocate(); + void body2space(int); + + int edge_against_face(int ibody, int jbody, double k_n, double k_na, + double** x, Contact* contact_list, int &num_contacts, + double &evdwl, double* facc); + int edge_against_edge(int ibody, int jbody, double k_n, double k_na, + double** x,Contact* contact_list, int &num_contacts, + double &evdwl, double* facc); + void sphere_against_sphere(int ibody, int jbody, double delx, double dely, double delz, + double rsq, double k_n, double k_na, + double** v, double** f, int evflag); + void sphere_against_face(int ibody, int jbody, + double k_n, double k_na, double** x, double** v, + double** f, double** torque, double** angmom, int evflag); + void sphere_against_edge(int ibody, int jbody, + double k_n, double k_na, double** x, double** v, + double** f, double** torque, double** angmom, int evflag); + + int interaction_face_to_edge(int ibody, int face_index, double* xmi, + double rounded_radius_i, int jbody, int edge_index, + double* xmj, double rounded_radius_j, + double k_n, double k_na, double cut_inner, + Contact* contact_list, int &num_contacts, + double& energy, double* facc); + int interaction_edge_to_edge(int ibody, int edge_index_i, double* xmi, + double rounded_radius_i, int jbody, int edge_index_j, + double* xmj, double rounded_radius_j, + double k_n, double k_na, double cut_inner, + Contact* contact_list, int &num_contacts, + double& energy, double* facc); + + void contact_forces(int ibody, int jbody, double *xi, double *xj, + double delx, double dely, double delz, double fx, double fy, double fz, + double** x, double** v, double** angmom, double** f, double** torque, + double* facc); + + void pair_force_and_torque(int ibody, int jbody, double* pi, double* pj, + double r, double contact_dist, double k_n, + double k_na, double shift, double** x, double** v, + double** f, double** torque, double** angmom, + int jflag, double& energy, double* facc); + void rescale_cohesive_forces(double** x, double** f, double** torque, + Contact* contact_list, int &num_contacts, + double contact_area, double k_n, double k_na, double* facc); + + void sum_torque(double* xm, double *x, double fx, double fy, double fz, double* torque); + int opposite_sides(double* n, double* x0, double* a, double* b); + int edge_face_intersect(double* x1, double* x2, double* x3, double* a, double* b, + double* hi1, double* hi2, double& d1, double& d2, + int& inside_a, int& inside_b); + void project_pt_plane(const double* q, const double* p, + const double* n, double* q_proj, double &d); + void project_pt_plane(const double* q, const double* x1, const double* x2, + const double* x3, double* q_proj, double &d, int& inside); + void project_pt_line(const double* q, const double* xi1, const double* xi2, + double* h, double& d, double& t); + void inside_polygon(int ibody, int face_index, double* xmi, + const double* q1, const double* q2, int& inside1, int& inside2); + + void distance_bt_edges(const double* x1, const double* x2, + const double* x3, const double* x4, + double* h1, double* h2, double& t1, double& t2, double& r); + void total_velocity(double* p, double *xcm, double* vcm, double *angmom, + double *inertia, double *quat, double* vi); + void sanity_check(); +}; + +} + +#endif +#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: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair body/rounded/polyhedron requires atom style body rounded/polyhedron + +Self-explanatory. + +E: Pair body requires body style rounded/polyhedron + +This pair style is specific to the rounded/polyhedron body style. + +*/ From 4308f005ab4b0ab2b943eb7c083f3a2f548efcb1 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 24 May 2018 23:12:01 -0500 Subject: [PATCH 002/123] Updated pair body rounded/polygon --- src/BODY/pair_body_rounded_polygon.cpp | 6 ++++-- src/BODY/pair_body_rounded_polyhedron.cpp | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/BODY/pair_body_rounded_polygon.cpp b/src/BODY/pair_body_rounded_polygon.cpp index 72591d2bd0..9f9cdea31b 100644 --- a/src/BODY/pair_body_rounded_polygon.cpp +++ b/src/BODY/pair_body_rounded_polygon.cpp @@ -374,6 +374,8 @@ void PairBodyRoundedPolygon::settings(int narg, char **arg) mu = force->numeric(FLERR,arg[2]); delta_ua = force->numeric(FLERR,arg[3]); cut_inner = force->numeric(FLERR,arg[4]); + + if (delta_ua < 0) delta_ua = 1; } /* ---------------------------------------------------------------------- @@ -1078,12 +1080,12 @@ int PairBodyRoundedPolygon::compute_distance_to_vertex(int ibody, // check if x0 (the queried vertex) and xmi (the body's center of mass) // are on the different sides of the edge - int m = opposite_sides(xi1, xi2, x0, xmi); + int m = 1;//opposite_sides(xi1, xi2, x0, xmi); if (m == 0) { // x0 and xmi are on not the opposite sides of the edge - // leave xpi for another edge to detect + // leave xpi for another edge to detect -- for convex shapes only mode = NONE; diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index 8d5f9ec72c..bc94b9cc80 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -82,6 +82,9 @@ PairBodyRoundedPolyhedron::PairBodyRoundedPolyhedron(LAMMPS *lmp) : Pair(lmp) c_t = 0.2; mu = 0.0; A_ua = 1.0; + + k_n = NULL; + k_na = NULL; } /* ---------------------------------------------------------------------- */ From 4bd4b2a1c75cfc6ea1f9ec90275cd4d947d76571 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 24 May 2018 23:35:49 -0500 Subject: [PATCH 003/123] Updated pair body rounded/polygon and rounded/polyhedron --- src/BODY/pair_body_rounded_polygon.cpp | 6 +- src/BODY/pair_body_rounded_polyhedron.cpp | 124 ++++++++++++++++------ src/BODY/pair_body_rounded_polyhedron.h | 17 +-- 3 files changed, 105 insertions(+), 42 deletions(-) diff --git a/src/BODY/pair_body_rounded_polygon.cpp b/src/BODY/pair_body_rounded_polygon.cpp index 9f9cdea31b..62a6d77a01 100644 --- a/src/BODY/pair_body_rounded_polygon.cpp +++ b/src/BODY/pair_body_rounded_polygon.cpp @@ -848,6 +848,7 @@ int PairBodyRoundedPolygon::vertex_against_edge(int i, int j, // done with the edges from body j, // given that vertex ni interacts with only one vertex from one edge of body j + // comment out this break to take into account concave shapes // break; @@ -955,6 +956,7 @@ int PairBodyRoundedPolygon::vertex_against_edge(int i, int j, // done with the edges from body j, // given that vertex ni interacts with only one edge from body j + // comment out this break to take into account concave shapes // break; @@ -1080,12 +1082,12 @@ int PairBodyRoundedPolygon::compute_distance_to_vertex(int ibody, // check if x0 (the queried vertex) and xmi (the body's center of mass) // are on the different sides of the edge - int m = 1;//opposite_sides(xi1, xi2, x0, xmi); + int m = opposite_sides(xi1, xi2, x0, xmi); if (m == 0) { // x0 and xmi are on not the opposite sides of the edge - // leave xpi for another edge to detect -- for convex shapes only + // leave xpi for another edge to detect mode = NONE; diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index bc94b9cc80..02c2abe1e3 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -47,7 +47,7 @@ using namespace MathConst; #define DELTA 10000 #define EPSILON 1e-3 #define MAX_FACE_SIZE 4 // maximum number of vertices per face (same as BodyRoundedPolyhedron) -#define MAX_CONTACTS 16 // for 3D models +#define MAX_CONTACTS 32 // for 3D models //#define _POLYHEDRON_DEBUG @@ -308,36 +308,8 @@ void PairBodyRoundedPolyhedron::compute(int eflag, int vflag) // also consider point contacts and line contacts if (num_contacts > 0) { - double contact_area; - if (num_contacts == 1) { - contact_area = 0; - } else if (num_contacts == 2) { - contact_area = num_contacts * A_ua; - } else { - int m; - double xc[3],dx,dy,dz; - xc[0] = xc[1] = xc[2] = 0; - for (m = 0; m < num_contacts; m++) { - xc[0] += contact_list[m].xi[0]; - xc[1] += contact_list[m].xi[1]; - xc[2] += contact_list[m].xi[2]; - } - - xc[0] /= (double)num_contacts; - xc[1] /= (double)num_contacts; - xc[2] /= (double)num_contacts; - - contact_area = 0.0; - for (m = 0; m < num_contacts; m++) { - dx = contact_list[m].xi[0] - xc[0]; - dy = contact_list[m].xi[1] - xc[1]; - dz = contact_list[m].xi[2] - xc[2]; - contact_area += (dx*dx + dy*dy + dz*dz); - } - contact_area *= (MY_PI/(double)num_contacts); - } rescale_cohesive_forces(x, f, torque, contact_list, num_contacts, - contact_area, k_nij, k_naij, facc); + k_nij, k_naij, facc); } if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0.0, @@ -383,6 +355,8 @@ void PairBodyRoundedPolyhedron::settings(int narg, char **arg) mu = force->numeric(FLERR,arg[2]); A_ua = force->numeric(FLERR,arg[3]); cut_inner = force->numeric(FLERR,arg[4]); + + if (A_ua < 0) A_ua = 1; } /* ---------------------------------------------------------------------- @@ -1381,7 +1355,17 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, #endif } else if (interact == EF_INTERSECT_INSIDE) { - + // need to do something here to resolve overlap!! + // p is the intersection between the edge and the face + int jflag = 1; + if (d1 < d2) + pair_force_and_torque(jbody, ibody, xpj1, hi1, d1, contact_dist, + k_n, k_na, shift, x, v, f, torque, angmom, + jflag, energy, facc); + else + pair_force_and_torque(jbody, ibody, xpj2, hi2, d2, contact_dist, + k_n, k_na, shift, x, v, f, torque, angmom, + jflag, energy, facc); } return interact; @@ -1661,6 +1645,7 @@ void PairBodyRoundedPolyhedron::contact_forces(int ibody, int jbody, ft[1] = -c_t * vt2; ft[2] = -c_t * vt3; + // these are contact forces (F_n, F_t and F_ne) only // cohesive forces will be scaled by j_a after contact area is computed // mu * fne = tangential friction deformation during gross sliding // see Eq. 4, Fraige et al. @@ -1697,13 +1682,49 @@ void PairBodyRoundedPolyhedron::contact_forces(int ibody, int jbody, void PairBodyRoundedPolyhedron::rescale_cohesive_forces(double** x, double** f, double** torque, Contact* contact_list, int &num_contacts, - double contact_area, double k_n, double k_na, double* facc) + double k_n, double k_na, double* facc) { int m,ibody,jbody; - double delx,dely,delz,fx,fy,fz,R,fpair,r,shift; + double delx,dely,delz,fx,fy,fz,R,fpair,r,shift,contact_area; + + int num_unique_contacts = 0; + if (num_contacts == 1) { + num_unique_contacts = 1; + contact_area = 0; + } else if (num_contacts == 2) { + num_unique_contacts = 2; + contact_area = num_contacts * A_ua; + } else { + find_unique_contacts(contact_list, num_contacts); + + double xc[3],dx,dy,dz; + xc[0] = xc[1] = xc[2] = 0; + num_unique_contacts = 0; + for (int m = 0; m < num_contacts; m++) { + if (contact_list[m].unique == 0) continue; + xc[0] += contact_list[m].xi[0]; + xc[1] += contact_list[m].xi[1]; + xc[2] += contact_list[m].xi[2]; + num_unique_contacts++; + } + + xc[0] /= (double)num_unique_contacts; + xc[1] /= (double)num_unique_contacts; + xc[2] /= (double)num_unique_contacts; + + contact_area = 0.0; + for (int m = 0; m < num_contacts; m++) { + if (contact_list[m].unique == 0) continue; + dx = contact_list[m].xi[0] - xc[0]; + dy = contact_list[m].xi[1] - xc[1]; + dz = contact_list[m].xi[2] - xc[2]; + contact_area += (dx*dx + dy*dy + dz*dz); + } + contact_area *= (MY_PI/(double)num_unique_contacts); + } + double j_a = contact_area / (num_contacts * A_ua); if (j_a < 1.0) j_a = 1.0; - shift = k_na * cut_inner; for (m = 0; m < num_contacts; m++) { @@ -2302,6 +2323,41 @@ void PairBodyRoundedPolyhedron::total_velocity(double* p, double *xcm, vi[2] = omega[0]*r[1] - omega[1]*r[0] + vcm[2]; } +/* ---------------------------------------------------------------------- + Determine the length of the contact segment, i.e. the separation between + 2 contacts, should be extended for 3D models. +------------------------------------------------------------------------- */ + +double PairBodyRoundedPolyhedron::contact_separation(const Contact& c1, + const Contact& c2) +{ + double x1 = 0.5*(c1.xi[0] + c1.xj[0]); + double y1 = 0.5*(c1.xi[1] + c1.xj[1]); + double z1 = 0.5*(c1.xi[2] + c1.xj[2]); + double x2 = 0.5*(c2.xi[0] + c2.xj[0]); + double y2 = 0.5*(c2.xi[1] + c2.xj[1]); + double z2 = 0.5*(c2.xi[2] + c2.xj[2]); + double rsq = (x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1) + (z2 - z1)*(z2 - z1); + return rsq; +} + +/* ---------------------------------------------------------------------- + find the number of unique contacts +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::find_unique_contacts(Contact* contact_list, int& num_contacts) +{ + int n = num_contacts; + for (int i = 0; i < n - 1; i++) { + + for (int j = i + 1; j < n; j++) { + if (contact_list[i].unique == 0) continue; + double d = contact_separation(contact_list[i], contact_list[j]); + if (d < EPSILON) contact_list[j].unique = 0; + } + } +} + /* ---------------------------------------------------------------------- */ void PairBodyRoundedPolyhedron::sanity_check() diff --git a/src/BODY/pair_body_rounded_polyhedron.h b/src/BODY/pair_body_rounded_polyhedron.h index d7ee1f013e..05985ef813 100644 --- a/src/BODY/pair_body_rounded_polyhedron.h +++ b/src/BODY/pair_body_rounded_polyhedron.h @@ -35,12 +35,13 @@ class PairBodyRoundedPolyhedron : public Pair { double init_one(int, int); struct Contact { - int ibody, jbody; // body (i.e. atom) indices (not tags) - int type; // 0 = VERTEX-FACE; 1 = EDGE-EDGE - double fx,fy,fz; // unscaled cohesive forces at contact - double xi[3]; // coordinates of the contact point on ibody - double xj[3]; // coordinates of the contact point on jbody + int ibody, jbody; // body (i.e. atom) indices (not tags) + int type; // 0 = VERTEX-FACE; 1 = EDGE-EDGE + double fx,fy,fz; // unscaled cohesive forces at contact + double xi[3]; // coordinates of the contact point on ibody + double xj[3]; // coordinates of the contact point on jbody double separation; // contact surface separation + int unique; }; protected: @@ -124,7 +125,11 @@ class PairBodyRoundedPolyhedron : public Pair { int jflag, double& energy, double* facc); void rescale_cohesive_forces(double** x, double** f, double** torque, Contact* contact_list, int &num_contacts, - double contact_area, double k_n, double k_na, double* facc); + double k_n, double k_na, double* facc); + + double contact_separation(const Contact& c1, const Contact& c2); + + void find_unique_contacts(Contact* contact_list, int& num_contacts); void sum_torque(double* xm, double *x, double fx, double fy, double fz, double* torque); int opposite_sides(double* n, double* x0, double* a, double* b); From dd3278ea07597016886198f9bbeaf3b12ba1017b Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 24 May 2018 23:54:50 -0500 Subject: [PATCH 004/123] Added examples for body rounded/polygon and rounded/polyhedron --- examples/body/data.cubes | 76 ++++++++++++++++++++++++++++++++++ examples/body/in.cubes | 53 ++++++++++++++++++++++++ examples/body/in.pour3d | 57 +++++++++++++++++++++++++ examples/body/molecule.cube | 52 +++++++++++++++++++++++ examples/body/molecule.point3d | 26 ++++++++++++ examples/body/molecule.rod3d | 27 ++++++++++++ examples/body/molecule.tetra | 39 +++++++++++++++++ 7 files changed, 330 insertions(+) create mode 100644 examples/body/data.cubes create mode 100644 examples/body/in.cubes create mode 100644 examples/body/in.pour3d create mode 100644 examples/body/molecule.cube create mode 100644 examples/body/molecule.point3d create mode 100644 examples/body/molecule.rod3d create mode 100644 examples/body/molecule.tetra diff --git a/examples/body/data.cubes b/examples/body/data.cubes new file mode 100644 index 0000000000..c1323ca350 --- /dev/null +++ b/examples/body/data.cubes @@ -0,0 +1,76 @@ +LAMMPS data file for polygons: cubes, moment of inertia I = m edge^2/ 6 +2 atoms +2 bodies +1 atom types +0 6 xlo xhi +0 6 ylo yhi +0 6 zlo zhi + +Atoms + +1 1 1 1 1.5 1.5 1.5 +2 1 1 1 4.0 4.0 4.0 + +Bodies + +1 3 79 +8 12 6 +0.667 0.667 0.667 0 0 0 +1 1 1 +1 -1 1 +-1 -1 1 +-1 1 1 +1 1 -1 +1 -1 -1 +-1 -1 -1 +-1 1 -1 +0 1 +1 2 +2 3 +3 0 +4 5 +5 6 +6 7 +7 4 +0 4 +1 5 +2 6 +3 7 +0 1 2 3 +4 5 6 7 +0 1 5 4 +1 2 6 5 +2 3 7 6 +3 0 4 7 +0.5 +2 3 79 +8 12 6 +0.667 0.667 0.667 0 0 0 +1 1 1 +1 -1 1 +-1 -1 1 +-1 1 1 +1 1 -1 +1 -1 -1 +-1 -1 -1 +-1 1 -1 +0 1 +1 2 +2 3 +3 0 +4 5 +5 6 +6 7 +7 4 +0 4 +1 5 +2 6 +3 7 +0 1 2 3 +4 5 6 7 +0 1 5 4 +1 2 6 5 +2 3 7 6 +3 0 4 7 +0.5 + diff --git a/examples/body/in.cubes b/examples/body/in.cubes new file mode 100644 index 0000000000..3aeaa70af9 --- /dev/null +++ b/examples/body/in.cubes @@ -0,0 +1,53 @@ +# 3d rounded cubes + +variable r index 3 +variable steps index 10000 + +units lj +dimension 3 + +atom_style body rounded/polyhedron 1 10 + +read_data data.cubes + +replicate $r $r $r + +velocity all create 1.2 187287 dist gaussian mom yes rot yes + +variable cut_inner equal 0.5 +variable k_n equal 100 +variable k_na equal 1 +variable c_n equal 20 +variable c_t equal 5 +variable mu equal 0 +variable A_ua equal 1 + +pair_style body/rounded/polyhedron ${c_n} ${c_t} ${mu} ${A_ua} ${cut_inner} +pair_coeff * * ${k_n} ${k_na} + +comm_modify vel yes + +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.001 + +#fix 1 all nve/body +fix 1 all nvt/body temp 1.2 1.2 0.1 +#fix 1 all npt/body temp 1.2 1.2 0.1 iso 0.002 0.02 1.0 + +compute p2 all pressure 1_temp + +compute 1 all body/local id 1 2 3 +dump 1 all local 1000 dump.* index c_1[1] c_1[2] c_1[3] c_1[4] + +#dump 2 all image 1000 image.*.jpg type type & +# zoom 1.5 adiam 1.5 body yes 0 0 view 60 15 +#dump_modify 2 pad 6 + +thermo_style custom step ke pe etotal c_p2 c_1_temp + +thermo 1000 + +run ${steps} + diff --git a/examples/body/in.pour3d b/examples/body/in.pour3d new file mode 100644 index 0000000000..290f2052c8 --- /dev/null +++ b/examples/body/in.pour3d @@ -0,0 +1,57 @@ +# pouring 3d rounded polyhedron bodies + +variable steps index 6000 + +units lj +boundary p p fm +comm_modify vel yes + +atom_style body rounded/polyhedron 1 8 +atom_modify map array + +region reg block 0 50 0 50 0 50 units box +create_box 4 reg + +variable cut_inner equal 0.5 +variable k_n equal 100 +variable k_na equal 5 +variable c_n equal 20 +variable c_t equal 5 +variable mu equal 0 +variable A_ua equal 1 + +pair_style body/rounded/polyhedron ${c_n} ${c_t} ${mu} ${A_ua} ${cut_inner} +pair_coeff * * ${k_n} ${k_na} + +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.001 + +fix 1 all nve/body +fix 2 all gravity 1.0 spherical 0.0 -180.0 + +molecule object molecule.cube molecule.tetra toff 1 & + molecule.rod3d toff 2 molecule.point3d toff 3 + +region slab block 5 45 5 45 25 35 units box +fix ins all pour 500 0 4767548 vol 0.4 10 region slab mol object & + molfrac 0.25 0.25 0.25 0.25 + +fix 4 all wall/body/polyhedron 2000 50 50 zplane 0.0 NULL + +#compute 1 all body/local type 1 2 3 +#dump 1 all local 1000 dump.polyhedron index c_1[1] c_1[2] c_1[3] c_1[4] +#dump 10 all custom 1000 tmp.dump id type x y z radius + +thermo_style custom step atoms ke pe etotal press + +thermo 1000 + +#dump 2 all image 500 image.*.jpg type type & +# zoom 1.5 adiam 1.5 body yes 0 0 view 75 15 +#dump_modify 2 pad 6 + +run ${steps} + + diff --git a/examples/body/molecule.cube b/examples/body/molecule.cube new file mode 100644 index 0000000000..2a8a7bca50 --- /dev/null +++ b/examples/body/molecule.cube @@ -0,0 +1,52 @@ +# 3d polygon body: cubes, moment of inertia I = m edge^2/ 6 + +1 atoms +3 79 body + +Coords + +1 0 0 0 + +Types + +1 1 + +Masses + +1 1.0 + +Body Integers + +8 12 6 + +Body Doubles + +0.667 0.667 0.667 0 0 0 +1 1 1 +1 -1 1 +-1 -1 1 +-1 1 1 +1 1 -1 +1 -1 -1 +-1 -1 -1 +-1 1 -1 +0 1 +1 2 +2 3 +3 0 +4 5 +5 6 +6 7 +7 4 +0 4 +1 5 +2 6 +3 7 +0 1 2 3 +4 5 6 7 +0 1 5 4 +1 2 6 5 +2 3 7 6 +3 0 4 7 +0.5 + diff --git a/examples/body/molecule.point3d b/examples/body/molecule.point3d new file mode 100644 index 0000000000..d22bfbe6fa --- /dev/null +++ b/examples/body/molecule.point3d @@ -0,0 +1,26 @@ +# 2d polygon body: disks Izz = 1/2 m radius^2 + +1 atoms +3 10 body + +Coords + +1 0 0 0 + +Types + +1 1 + +Masses + +1 1.0 + +Body Integers + +1 0 0 + +Body Doubles + +1 1 1.125 0 0 0 +0 0 0 +3.0 diff --git a/examples/body/molecule.rod3d b/examples/body/molecule.rod3d new file mode 100644 index 0000000000..1c8a0a8cd3 --- /dev/null +++ b/examples/body/molecule.rod3d @@ -0,0 +1,27 @@ +# 2d polygon body: rods Izz = 1/12 m length^2 + +1 atoms +3 13 body + +Coords + +1 0 0 0 + +Types + +1 1 + +Masses + +1 1.0 + +Body Integers + +2 1 0 + +Body Doubles + +1 1 1.333 0 0 0 +-2 0 0 +2 0 0 +0.5 diff --git a/examples/body/molecule.tetra b/examples/body/molecule.tetra new file mode 100644 index 0000000000..d67ec906c6 --- /dev/null +++ b/examples/body/molecule.tetra @@ -0,0 +1,39 @@ +# 3d polygon body: regular tetrahedra, moment of inertia I = m edge^2/ 20 + +1 atoms +3 47 body + +Coords + +1 0 0 0 + +Types + +1 1 + +Masses + +1 1.0 + +Body Integers + +4 6 4 + +Body Doubles + +0.4 0.4 0.4 0 0 0 +1 1 1 +1 -1 -1 +-1 1 -1 +-1 -1 1 +0 1 +0 2 +0 3 +1 2 +2 3 +3 1 +0 1 2 -1 +0 1 3 -1 +0 2 3 -1 +1 2 3 -1 +0.5 From 5a23342934b350bd88de7d335b40c1bb3c7427d2 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 26 May 2018 00:39:55 -0500 Subject: [PATCH 005/123] Refactored pair body rounded/polyhedron so that other kernel force models can be implemented in the future --- src/BODY/pair_body_rounded_polyhedron.cpp | 725 +++++++++++----------- src/BODY/pair_body_rounded_polyhedron.h | 41 +- 2 files changed, 409 insertions(+), 357 deletions(-) diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index 02c2abe1e3..42c107d68e 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -610,10 +610,10 @@ void PairBodyRoundedPolyhedron::sphere_against_sphere(int ibody, int jbody, rij = sqrt(rsq); R = rij - contact_dist; - shift = k_na * cut_inner; energy = 0; - + kernel_force(R, k_n, k_na, energy, fpair); +/* if (R <= 0) { // deformation occurs fpair = -k_n * R - shift; energy = (0.5 * k_n * R + shift) * R; @@ -621,6 +621,7 @@ void PairBodyRoundedPolyhedron::sphere_against_sphere(int ibody, int jbody, fpair = k_na * R - shift; energy = (-0.5 * k_na * R + shift) * R; } else fpair = 0.0; +*/ fx = delx*fpair/rij; fy = dely*fpair/rij; @@ -680,159 +681,6 @@ void PairBodyRoundedPolyhedron::sphere_against_sphere(int ibody, int jbody, energy,0.0,fx,fy,fz,delx,dely,delz); } -/* ---------------------------------------------------------------------- - Interaction bt the faces of a polyhedron (ibody) and a sphere (jbody) ----------------------------------------------------------------------- */ - -void PairBodyRoundedPolyhedron::sphere_against_face(int ibody, int jbody, - double k_n, double k_na, double** x, double** v, - double** f, double** torque, double** angmom, - int evflag) -{ - int ni,nfi,inside,ifirst,iffirst,npi1,npi2,npi3,ibonus,tmp; - double xi1[3],xi2[3],xi3[3],ui[3],vi[3],vti[3],n[3],h[3],fn[3],ft[3],d; - double delx,dely,delz,rsq,rij,rsqinv,R,fx,fy,fz,fpair,shift,energy; - double rradi,rradj,contact_dist; - double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; - double *quat, *inertia; - AtomVecBody::Bonus *bonus; - - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; - - ifirst = dfirst[ibody]; - iffirst = facfirst[ibody]; - nfi = facnum[ibody]; - - rradi = rounded_radius[ibody]; - rradj = rounded_radius[jbody]; - contact_dist = rradi + rradj; - - for (ni = 0; ni < nfi; ni++) { - - npi1 = static_cast(face[iffirst+ni][0]); - npi2 = static_cast(face[iffirst+ni][1]); - npi3 = static_cast(face[iffirst+ni][2]); - - // compute the space-fixed coordinates for the vertices of the face - - xi1[0] = x[ibody][0] + discrete[ifirst+npi1][0]; - xi1[1] = x[ibody][1] + discrete[ifirst+npi1][1]; - xi1[2] = x[ibody][2] + discrete[ifirst+npi1][2]; - - xi2[0] = x[ibody][0] + discrete[ifirst+npi2][0]; - xi2[1] = x[ibody][1] + discrete[ifirst+npi2][1]; - xi2[2] = x[ibody][2] + discrete[ifirst+npi2][2]; - - xi3[0] = x[ibody][0] + discrete[ifirst+npi3][0]; - xi3[1] = x[ibody][1] + discrete[ifirst+npi3][1]; - xi3[2] = x[ibody][2] + discrete[ifirst+npi3][2]; - - // find the normal unit vector of the face - - MathExtra::sub3(xi2, xi1, ui); - MathExtra::sub3(xi3, xi1, vi); - MathExtra::cross3(ui, vi, n); - MathExtra::norm3(n); - - // skip if the COM of the two bodies are in the same side of the face - - if (opposite_sides(n, xi1, x[ibody], x[jbody]) == 0) continue; - - // find the projection of the sphere on the face - - project_pt_plane(x[jbody], xi1, xi2, xi3, h, d, inside); - - inside_polygon(ibody, ni, x[ibody], h, NULL, inside, tmp); - if (inside == 0) continue; - - delx = h[0] - x[jbody][0]; - dely = h[1] - x[jbody][1]; - delz = h[2] - x[jbody][2]; - rsq = delx*delx + dely*dely + delz*delz; - rij = sqrt(rsq); - R = rij - contact_dist; - shift = k_na * cut_inner; - - energy = 0; - - if (R <= 0) { // deformation occurs - fpair = -k_n * R - shift; - energy = (0.5 * k_n * R + shift) * R; - } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap - fpair = k_na * R - shift; - energy = (-0.5 * k_na * R + shift) * R; - } else fpair = 0.0; - - fx = delx*fpair/rij; - fy = dely*fpair/rij; - fz = delz*fpair/rij; - - if (R <= 0) { // in contact - - // compute the velocity of the vertex in the space-fixed frame - - ibonus = atom->body[ibody]; - bonus = &avec->bonus[ibonus]; - quat = bonus->quat; - inertia = bonus->inertia; - total_velocity(h, x[ibody], v[ibody], angmom[ibody], - inertia, quat, vti); - - // relative translational velocity - - vr1 = vti[0] - v[jbody][0]; - vr2 = vti[1] - v[jbody][1]; - vr3 = vti[2] - v[jbody][2]; - - // normal component - - rsqinv = 1.0/rsq; - vnnr = vr1*delx + vr2*dely + vr3*delz; - vn1 = delx*vnnr * rsqinv; - vn2 = dely*vnnr * rsqinv; - vn3 = delz*vnnr * rsqinv; - - // tangential component - - vt1 = vr1 - vn1; - vt2 = vr2 - vn2; - vt3 = vr3 - vn3; - - // normal friction term at contact - - fn[0] = -c_n * vn1; - fn[1] = -c_n * vn2; - fn[2] = -c_n * vn3; - - // tangential friction term at contact, - // excluding the tangential deformation term for now - - ft[0] = -c_t * vt1; - ft[1] = -c_t * vt2; - ft[2] = -c_t * vt3; - - fx += fn[0] + ft[0]; - fy += fn[1] + ft[1]; - fz += fn[2] + ft[2]; - } - - f[ibody][0] += fx; - f[ibody][1] += fy; - f[ibody][2] += fz; - sum_torque(x[ibody], h, fx, fy, fz, torque[ibody]); - - if (newton_pair || jbody < nlocal) { - f[jbody][0] -= fx; - f[jbody][1] -= fy; - f[jbody][2] -= fz; - } - - if (evflag) ev_tally_xyz(ibody,jbody,nlocal,newton_pair, - energy,0.0,fx,fy,fz,delx,dely,delz); - } -} - /* ---------------------------------------------------------------------- Interaction bt the edges of a polyhedron (ibody) and a sphere (jbody) ---------------------------------------------------------------------- */ @@ -910,10 +758,10 @@ void PairBodyRoundedPolyhedron::sphere_against_edge(int ibody, int jbody, delz = h[2] - x[jbody][2]; rij = sqrt(delx*delx + dely*dely + delz*delz); R = rij - contact_dist; - shift = k_na * cut_inner; energy = 0; - + kernel_force(R, k_n, k_na, energy, fpair); +/* if (R <= 0) { // deformation occurs fpair = -k_n * R - shift; energy = (0.5 * k_n * R + shift) * R; @@ -921,6 +769,8 @@ void PairBodyRoundedPolyhedron::sphere_against_edge(int ibody, int jbody, fpair = k_na * R - shift; energy = (-0.5 * k_na * R + shift) * R; } else fpair = 0.0; +*/ + fx = delx*fpair/rij; fy = dely*fpair/rij; @@ -987,7 +837,216 @@ void PairBodyRoundedPolyhedron::sphere_against_edge(int ibody, int jbody, if (evflag) ev_tally_xyz(ibody,jbody,nlocal,newton_pair, energy,0.0,fx,fy,fz,delx,dely,delz); } +} +/* ---------------------------------------------------------------------- + Interaction bt the faces of a polyhedron (ibody) and a sphere (jbody) +---------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::sphere_against_face(int ibody, int jbody, + double k_n, double k_na, double** x, double** v, + double** f, double** torque, double** angmom, + int evflag) +{ + int ni,nfi,inside,ifirst,iffirst,npi1,npi2,npi3,ibonus,tmp; + double xi1[3],xi2[3],xi3[3],ui[3],vi[3],vti[3],n[3],h[3],fn[3],ft[3],d; + double delx,dely,delz,rsq,rij,rsqinv,R,fx,fy,fz,fpair,shift,energy; + double rradi,rradj,contact_dist; + double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; + double *quat, *inertia; + AtomVecBody::Bonus *bonus; + + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + ifirst = dfirst[ibody]; + iffirst = facfirst[ibody]; + nfi = facnum[ibody]; + + rradi = rounded_radius[ibody]; + rradj = rounded_radius[jbody]; + contact_dist = rradi + rradj; + + for (ni = 0; ni < nfi; ni++) { + + npi1 = static_cast(face[iffirst+ni][0]); + npi2 = static_cast(face[iffirst+ni][1]); + npi3 = static_cast(face[iffirst+ni][2]); + + // compute the space-fixed coordinates for the vertices of the face + + xi1[0] = x[ibody][0] + discrete[ifirst+npi1][0]; + xi1[1] = x[ibody][1] + discrete[ifirst+npi1][1]; + xi1[2] = x[ibody][2] + discrete[ifirst+npi1][2]; + + xi2[0] = x[ibody][0] + discrete[ifirst+npi2][0]; + xi2[1] = x[ibody][1] + discrete[ifirst+npi2][1]; + xi2[2] = x[ibody][2] + discrete[ifirst+npi2][2]; + + xi3[0] = x[ibody][0] + discrete[ifirst+npi3][0]; + xi3[1] = x[ibody][1] + discrete[ifirst+npi3][1]; + xi3[2] = x[ibody][2] + discrete[ifirst+npi3][2]; + + // find the normal unit vector of the face + + MathExtra::sub3(xi2, xi1, ui); + MathExtra::sub3(xi3, xi1, vi); + MathExtra::cross3(ui, vi, n); + MathExtra::norm3(n); + + // skip if the COM of the two bodies are in the same side of the face + + if (opposite_sides(n, xi1, x[ibody], x[jbody]) == 0) continue; + + // find the projection of the sphere on the face + + project_pt_plane(x[jbody], xi1, xi2, xi3, h, d, inside); + + inside_polygon(ibody, ni, x[ibody], h, NULL, inside, tmp); + if (inside == 0) continue; + + delx = h[0] - x[jbody][0]; + dely = h[1] - x[jbody][1]; + delz = h[2] - x[jbody][2]; + rsq = delx*delx + dely*dely + delz*delz; + rij = sqrt(rsq); + R = rij - contact_dist; + + energy = 0; + kernel_force(R, k_n, k_na, energy, fpair); +/* + if (R <= 0) { // deformation occurs + fpair = -k_n * R - shift; + energy = (0.5 * k_n * R + shift) * R; + } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap + fpair = k_na * R - shift; + energy = (-0.5 * k_na * R + shift) * R; + } else fpair = 0.0; +*/ + + fx = delx*fpair/rij; + fy = dely*fpair/rij; + fz = delz*fpair/rij; + + if (R <= 0) { // in contact + + // compute the velocity of the vertex in the space-fixed frame + + ibonus = atom->body[ibody]; + bonus = &avec->bonus[ibonus]; + quat = bonus->quat; + inertia = bonus->inertia; + total_velocity(h, x[ibody], v[ibody], angmom[ibody], + inertia, quat, vti); + + // relative translational velocity + + vr1 = vti[0] - v[jbody][0]; + vr2 = vti[1] - v[jbody][1]; + vr3 = vti[2] - v[jbody][2]; + + // normal component + + rsqinv = 1.0/rsq; + vnnr = vr1*delx + vr2*dely + vr3*delz; + vn1 = delx*vnnr * rsqinv; + vn2 = dely*vnnr * rsqinv; + vn3 = delz*vnnr * rsqinv; + + // tangential component + + vt1 = vr1 - vn1; + vt2 = vr2 - vn2; + vt3 = vr3 - vn3; + + // normal friction term at contact + + fn[0] = -c_n * vn1; + fn[1] = -c_n * vn2; + fn[2] = -c_n * vn3; + + // tangential friction term at contact, + // excluding the tangential deformation term for now + + ft[0] = -c_t * vt1; + ft[1] = -c_t * vt2; + ft[2] = -c_t * vt3; + + fx += fn[0] + ft[0]; + fy += fn[1] + ft[1]; + fz += fn[2] + ft[2]; + } + + f[ibody][0] += fx; + f[ibody][1] += fy; + f[ibody][2] += fz; + sum_torque(x[ibody], h, fx, fy, fz, torque[ibody]); + + if (newton_pair || jbody < nlocal) { + f[jbody][0] -= fx; + f[jbody][1] -= fy; + f[jbody][2] -= fz; + } + + if (evflag) ev_tally_xyz(ibody,jbody,nlocal,newton_pair, + energy,0.0,fx,fy,fz,delx,dely,delz); + } +} + +/* ---------------------------------------------------------------------- + Determine the interaction mode between i's edges against j's edges + + i = atom i (body i) + j = atom j (body j) + x = atoms' coordinates + f = atoms' forces + torque = atoms' torques + tag = atoms' tags + contact_list = list of contacts + num_contacts = number of contacts between i's edges and j's edges + Return: + +---------------------------------------------------------------------- */ + +int PairBodyRoundedPolyhedron::edge_against_edge(int ibody, int jbody, + double k_n, double k_na, double** x, Contact* contact_list, + int &num_contacts, double &evdwl, double* facc) +{ + int ni,nei,nj,nej,contact,interact; + double rradi,rradj,energy; + + nei = ednum[ibody]; + rradi = rounded_radius[ibody]; + nej = ednum[jbody]; + rradj = rounded_radius[jbody]; + + energy = 0; + interact = EE_NONE; + + // loop through body i's edges + + for (ni = 0; ni < nei; ni++) { + + for (nj = 0; nj < nej; nj++) { + + // compute the distance between the edge nj to the edge ni + #ifdef _POLYHEDRON_DEBUG + printf("Compute interaction between edge %d of body %d with edge %d of body %d:\n", + nj, jbody, ni, ibody); + #endif + + interact = interaction_edge_to_edge(ibody, ni, x[ibody], rradi, + jbody, nj, x[jbody], rradj, + k_n, k_na, cut_inner, + contact_list, num_contacts, + energy, facc); + } + + } // end for looping through the edges of body i + + evdwl += energy; + + return interact; } /* ---------------------------------------------------------------------- @@ -1048,58 +1107,140 @@ int PairBodyRoundedPolyhedron::edge_against_face(int ibody, int jbody, return interact; } -/* ---------------------------------------------------------------------- - Determine the interaction mode between i's edges against j's edges +/* ------------------------------------------------------------------------- + Compute the distance between an edge of body i and an edge from + another body + Input: + ibody = body i (i.e. atom i) + face_index = face index of body i + xmi = atom i's coordinates (body i's center of mass) + rounded_radius_i = rounded radius of the body i + jbody = body i (i.e. atom j) + edge_index = coordinate of the tested edge from another body + xmj = atom j's coordinates (body j's center of mass) + rounded_radius_j = rounded radius of the body j + cut_inner = cutoff for vertex-vertex and vertex-edge interaction + Output: + d = Distance from a point x0 to an edge + hi = coordinates of the projection of x0 on the edge - i = atom i (body i) - j = atom j (body j) - x = atoms' coordinates - f = atoms' forces - torque = atoms' torques - tag = atoms' tags - contact_list = list of contacts - num_contacts = number of contacts between i's edges and j's edges - Return: + contact = 0 no contact between the queried edge and the face + 1 contact detected + return + INVALID if the face index is invalid + NONE if there is no interaction +------------------------------------------------------------------------- */ ----------------------------------------------------------------------- */ - -int PairBodyRoundedPolyhedron::edge_against_edge(int ibody, int jbody, - double k_n, double k_na, double** x, Contact* contact_list, - int &num_contacts, double &evdwl, double* facc) +int PairBodyRoundedPolyhedron::interaction_edge_to_edge(int ibody, + int edge_index_i, + double *xmi, + double rounded_radius_i, + int jbody, + int edge_index_j, + double *xmj, + double rounded_radius_j, + double k_n, + double k_na, + double cut_inner, + Contact* contact_list, + int &num_contacts, + double &energy, + double* facc) { - int ni,nei,nj,nej,contact,interact; - double rradi,rradj,energy; + int ifirst,iefirst,jfirst,jefirst,npi1,npi2,npj1,npj2,interact; + double xi1[3],xi2[3],xpj1[3],xpj2[3]; + double r,t1,t2,h1[3],h2[3]; + double contact_dist, shift; - nei = ednum[ibody]; - rradi = rounded_radius[ibody]; - nej = ednum[jbody]; - rradj = rounded_radius[jbody]; + double** x = atom->x; + double** v = atom->v; + double** f = atom->f; + double** torque = atom->torque; + double** angmom = atom->angmom; + + ifirst = dfirst[ibody]; + iefirst = edfirst[ibody]; + npi1 = static_cast(edge[iefirst+edge_index_i][0]); + npi2 = static_cast(edge[iefirst+edge_index_i][1]); + + // compute the space-fixed coordinates for the edge ends + + xi1[0] = xmi[0] + discrete[ifirst+npi1][0]; + xi1[1] = xmi[1] + discrete[ifirst+npi1][1]; + xi1[2] = xmi[2] + discrete[ifirst+npi1][2]; + + xi2[0] = xmi[0] + discrete[ifirst+npi2][0]; + xi2[1] = xmi[1] + discrete[ifirst+npi2][1]; + xi2[2] = xmi[2] + discrete[ifirst+npi2][2]; + + // two ends of the edge from body j + + jfirst = dfirst[jbody]; + jefirst = edfirst[jbody]; + npj1 = static_cast(edge[jefirst+edge_index_j][0]); + npj2 = static_cast(edge[jefirst+edge_index_j][1]); + + xpj1[0] = xmj[0] + discrete[jfirst+npj1][0]; + xpj1[1] = xmj[1] + discrete[jfirst+npj1][1]; + xpj1[2] = xmj[2] + discrete[jfirst+npj1][2]; + + xpj2[0] = xmj[0] + discrete[jfirst+npj2][0]; + xpj2[1] = xmj[1] + discrete[jfirst+npj2][1]; + xpj2[2] = xmj[2] + discrete[jfirst+npj2][2]; + + contact_dist = rounded_radius_i + rounded_radius_j; + + int jflag = 1; + distance_bt_edges(xpj1, xpj2, xi1, xi2, h1, h2, t1, t2, r); + + #ifdef _POLYHEDRON_DEBUG + double ui[3],uj[3]; + MathExtra::sub3(xi1,xi2,ui); + MathExtra::norm3(ui); + MathExtra::sub3(xpj1,xpj2,uj); + MathExtra::norm3(uj); + double dot = MathExtra::dot3(ui, uj); + printf(" edge npi1 = %d (%f %f %f); npi2 = %d (%f %f %f) vs." + " edge npj1 = %d (%f %f %f); npj2 = %d (%f %f %f): " + "t1 = %f; t2 = %f; r = %f; dot = %f\n", + npi1, xi1[0], xi1[1], xi1[2], npi2, xi2[0], xi2[1], xi2[2], + npj1, xpj1[0], xpj1[1], xpj1[2], npj2, xpj2[0], xpj2[1], xpj2[2], + t1, t2, r, dot); + #endif - energy = 0; interact = EE_NONE; - // loop through body i's edges + // singularity case, ignore interactions - for (ni = 0; ni < nei; ni++) { + if (r < EPSILON) return interact; - for (nj = 0; nj < nej; nj++) { + // include the vertices for interactions - // compute the distance between the edge nj to the edge ni - #ifdef _POLYHEDRON_DEBUG - printf("Compute interaction between edge %d of body %d with edge %d of body %d:\n", - nj, jbody, ni, ibody); - #endif + if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1 && + r < contact_dist + cut_inner) { + pair_force_and_torque(jbody, ibody, h1, h2, r, contact_dist, + k_n, k_na, x, v, f, torque, angmom, + jflag, energy, facc); - interact = interaction_edge_to_edge(ibody, ni, x[ibody], rradi, - jbody, nj, x[jbody], rradj, - k_n, k_na, cut_inner, - contact_list, num_contacts, - energy, facc); + interact = EE_INTERACT; + if (r <= contact_dist) { + // store the contact info + contact_list[num_contacts].ibody = ibody; + contact_list[num_contacts].jbody = jbody; + contact_list[num_contacts].xi[0] = h2[0]; + contact_list[num_contacts].xi[1] = h2[1]; + contact_list[num_contacts].xi[2] = h2[2]; + contact_list[num_contacts].xj[0] = h1[0]; + contact_list[num_contacts].xj[1] = h1[1]; + contact_list[num_contacts].xj[2] = h1[2]; + contact_list[num_contacts].type = 1; + contact_list[num_contacts].separation = r - contact_dist; + contact_list[num_contacts].unique = 1; + num_contacts++; } + } else { - } // end for looping through the edges of body i - - evdwl += energy; + } return interact; } @@ -1225,7 +1366,6 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, inside_polygon(ibody, face_index, xmi, hi1, hi2, inside1, inside2); contact_dist = rounded_radius_i + rounded_radius_j; - shift = k_na * cut_inner; // both endpoints are on the same side of, or parallel to, the face // and both are out of the interaction zone @@ -1257,7 +1397,7 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, if (inside1) { if (static_cast(discrete[jfirst+npj1][6]) == 0) { pair_force_and_torque(jbody, ibody, xpj1, hi1, d1, contact_dist, - k_n, k_na, shift, x, v, f, torque, angmom, + k_n, k_na, x, v, f, torque, angmom, jflag, energy, facc); #ifdef _POLYHEDRON_DEBUG printf(" - compute pair force between vertex %d from edge %d of body %d " @@ -1277,6 +1417,7 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, contact_list[num_contacts].xj[2] = xpj1[2]; contact_list[num_contacts].type = 0; contact_list[num_contacts].separation = d1 - contact_dist; + contact_list[num_contacts].unique = 1; num_contacts++; } @@ -1295,7 +1436,7 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, if (inside2) { if (static_cast(discrete[jfirst+npj2][6]) == 0) { pair_force_and_torque(jbody, ibody, xpj2, hi2, d2, contact_dist, - k_n, k_na, shift, x, v, f, torque, angmom, + k_n, k_na, x, v, f, torque, angmom, jflag, energy, facc); #ifdef _POLYHEDRON_DEBUG printf(" - compute pair force between vertex %d from edge %d of body %d " @@ -1315,6 +1456,7 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, contact_list[num_contacts].xj[2] = xpj2[2]; contact_list[num_contacts].type = 0; contact_list[num_contacts].separation = d2 - contact_dist; + contact_list[num_contacts].unique = 1; num_contacts++; } discrete[jfirst+npj2][6] = 1; @@ -1360,155 +1502,17 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, int jflag = 1; if (d1 < d2) pair_force_and_torque(jbody, ibody, xpj1, hi1, d1, contact_dist, - k_n, k_na, shift, x, v, f, torque, angmom, + k_n, k_na, x, v, f, torque, angmom, jflag, energy, facc); else pair_force_and_torque(jbody, ibody, xpj2, hi2, d2, contact_dist, - k_n, k_na, shift, x, v, f, torque, angmom, + k_n, k_na, x, v, f, torque, angmom, jflag, energy, facc); } return interact; } -/* ------------------------------------------------------------------------- - Compute the distance between an edge of body i and an edge from - another body - Input: - ibody = body i (i.e. atom i) - face_index = face index of body i - xmi = atom i's coordinates (body i's center of mass) - rounded_radius_i = rounded radius of the body i - jbody = body i (i.e. atom j) - edge_index = coordinate of the tested edge from another body - xmj = atom j's coordinates (body j's center of mass) - rounded_radius_j = rounded radius of the body j - cut_inner = cutoff for vertex-vertex and vertex-edge interaction - Output: - d = Distance from a point x0 to an edge - hi = coordinates of the projection of x0 on the edge - - contact = 0 no contact between the queried edge and the face - 1 contact detected - return - INVALID if the face index is invalid - NONE if there is no interaction -------------------------------------------------------------------------- */ - -int PairBodyRoundedPolyhedron::interaction_edge_to_edge(int ibody, - int edge_index_i, - double *xmi, - double rounded_radius_i, - int jbody, - int edge_index_j, - double *xmj, - double rounded_radius_j, - double k_n, - double k_na, - double cut_inner, - Contact* contact_list, - int &num_contacts, - double &energy, - double* facc) -{ - int ifirst,iefirst,jfirst,jefirst,npi1,npi2,npj1,npj2,interact; - double xi1[3],xi2[3],xpj1[3],xpj2[3]; - double r,t1,t2,h1[3],h2[3]; - double contact_dist, shift; - - double** x = atom->x; - double** v = atom->v; - double** f = atom->f; - double** torque = atom->torque; - double** angmom = atom->angmom; - - ifirst = dfirst[ibody]; - iefirst = edfirst[ibody]; - npi1 = static_cast(edge[iefirst+edge_index_i][0]); - npi2 = static_cast(edge[iefirst+edge_index_i][1]); - - // compute the space-fixed coordinates for the edge ends - - xi1[0] = xmi[0] + discrete[ifirst+npi1][0]; - xi1[1] = xmi[1] + discrete[ifirst+npi1][1]; - xi1[2] = xmi[2] + discrete[ifirst+npi1][2]; - - xi2[0] = xmi[0] + discrete[ifirst+npi2][0]; - xi2[1] = xmi[1] + discrete[ifirst+npi2][1]; - xi2[2] = xmi[2] + discrete[ifirst+npi2][2]; - - // two ends of the edge from body j - - jfirst = dfirst[jbody]; - jefirst = edfirst[jbody]; - npj1 = static_cast(edge[jefirst+edge_index_j][0]); - npj2 = static_cast(edge[jefirst+edge_index_j][1]); - - xpj1[0] = xmj[0] + discrete[jfirst+npj1][0]; - xpj1[1] = xmj[1] + discrete[jfirst+npj1][1]; - xpj1[2] = xmj[2] + discrete[jfirst+npj1][2]; - - xpj2[0] = xmj[0] + discrete[jfirst+npj2][0]; - xpj2[1] = xmj[1] + discrete[jfirst+npj2][1]; - xpj2[2] = xmj[2] + discrete[jfirst+npj2][2]; - - contact_dist = rounded_radius_i + rounded_radius_j; - shift = k_na * cut_inner; - - int jflag = 1; - distance_bt_edges(xpj1, xpj2, xi1, xi2, h1, h2, t1, t2, r); - - #ifdef _POLYHEDRON_DEBUG - double ui[3],uj[3]; - MathExtra::sub3(xi1,xi2,ui); - MathExtra::norm3(ui); - MathExtra::sub3(xpj1,xpj2,uj); - MathExtra::norm3(uj); - double dot = MathExtra::dot3(ui, uj); - printf(" edge npi1 = %d (%f %f %f); npi2 = %d (%f %f %f) vs." - " edge npj1 = %d (%f %f %f); npj2 = %d (%f %f %f): " - "t1 = %f; t2 = %f; r = %f; dot = %f\n", - npi1, xi1[0], xi1[1], xi1[2], npi2, xi2[0], xi2[1], xi2[2], - npj1, xpj1[0], xpj1[1], xpj1[2], npj2, xpj2[0], xpj2[1], xpj2[2], - t1, t2, r, dot); - #endif - - interact = EE_NONE; - - // singularity case, ignore interactions - - if (r < EPSILON) return interact; - - // include the vertices for interactions - - if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1 && - r < contact_dist + cut_inner) { - pair_force_and_torque(jbody, ibody, h1, h2, r, contact_dist, - k_n, k_na, shift, x, v, f, torque, angmom, - jflag, energy, facc); - - interact = EE_INTERACT; - if (r <= contact_dist) { - // store the contact info - contact_list[num_contacts].ibody = ibody; - contact_list[num_contacts].jbody = jbody; - contact_list[num_contacts].xi[0] = h2[0]; - contact_list[num_contacts].xi[1] = h2[1]; - contact_list[num_contacts].xi[2] = h2[2]; - contact_list[num_contacts].xj[0] = h1[0]; - contact_list[num_contacts].xj[1] = h1[1]; - contact_list[num_contacts].xj[2] = h1[2]; - contact_list[num_contacts].type = 1; - contact_list[num_contacts].separation = r - contact_dist; - num_contacts++; - } - } else { - - } - - return interact; -} - /* ---------------------------------------------------------------------- Compute forces and torques between two bodies caused by the interaction between a pair of points on either bodies (similar to sphere-sphere) @@ -1516,7 +1520,7 @@ int PairBodyRoundedPolyhedron::interaction_edge_to_edge(int ibody, void PairBodyRoundedPolyhedron::pair_force_and_torque(int ibody, int jbody, double* pi, double* pj, double r, double contact_dist, - double k_n, double k_na, double shift, double** x, + double k_n, double k_na, double** x, double** v, double** f, double** torque, double** angmom, int jflag, double& energy, double* facc) { @@ -1525,7 +1529,10 @@ void PairBodyRoundedPolyhedron::pair_force_and_torque(int ibody, int jbody, delx = pi[0] - pj[0]; dely = pi[1] - pj[1]; delz = pi[2] - pj[2]; - R = r - contact_dist; + R = r - contact_dist; + + kernel_force(R, k_n, k_na, energy, fpair); +/* if (R <= 0) { // deformation occurs fpair = -k_n * R - shift; energy += (0.5 * k_n * R + shift) * R; @@ -1533,6 +1540,7 @@ void PairBodyRoundedPolyhedron::pair_force_and_torque(int ibody, int jbody, fpair = k_na * R - shift; energy += (-0.5 * k_na * R + shift) * R; } else fpair = 0.0; +*/ fx = delx*fpair/r; fy = dely*fpair/r; @@ -1570,6 +1578,26 @@ void PairBodyRoundedPolyhedron::pair_force_and_torque(int ibody, int jbody, } } +/* ---------------------------------------------------------------------- + Kernel force is model-dependent and can be derived for other styles + here is the harmonic potential (linear piece-wise forces) in Wang et al. +------------------------------------------------------------------------- */ + +void PairBodyRoundedPolyhedron::kernel_force(double R, double k_n, double k_na, + double& energy, double& fpair) +{ + double shift = k_na * cut_inner; + double e = 0; + if (R <= 0) { // deformation occurs + fpair = -k_n * R - shift; + e = (0.5 * k_n * R + shift) * R; + } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap + fpair = k_na * R - shift; + e = (-0.5 * k_na * R + shift) * R; + } else fpair = 0.0; + energy += e; +} + /* ---------------------------------------------------------------------- Compute contact forces between two bodies modify the force stored at the vertex and edge in contact by j_a @@ -1685,7 +1713,7 @@ void PairBodyRoundedPolyhedron::rescale_cohesive_forces(double** x, double k_n, double k_na, double* facc) { int m,ibody,jbody; - double delx,dely,delz,fx,fy,fz,R,fpair,r,shift,contact_area; + double delx,dely,delz,fx,fy,fz,R,fpair,r,contact_area; int num_unique_contacts = 0; if (num_contacts == 1) { @@ -1723,11 +1751,11 @@ void PairBodyRoundedPolyhedron::rescale_cohesive_forces(double** x, contact_area *= (MY_PI/(double)num_unique_contacts); } - double j_a = contact_area / (num_contacts * A_ua); + double j_a = contact_area / (num_unique_contacts * A_ua); if (j_a < 1.0) j_a = 1.0; - shift = k_na * cut_inner; - for (m = 0; m < num_contacts; m++) { + if (contact_list[m].unique == 0) continue; + ibody = contact_list[m].ibody; jbody = contact_list[m].jbody; @@ -1735,12 +1763,17 @@ void PairBodyRoundedPolyhedron::rescale_cohesive_forces(double** x, dely = contact_list[m].xi[1] - contact_list[m].xj[1]; delz = contact_list[m].xi[2] - contact_list[m].xj[2]; r = sqrt(delx*delx + dely*dely + delz*delz); - R = contact_list[m].separation; + R = contact_list[m].separation; + + double energy = 0; + kernel_force(R, k_n, k_na, energy, fpair); +/* if (R <= 0) { // deformation occurs fpair = -k_n * R - shift; } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap fpair = k_na * R - shift; } else fpair = 0.0; +*/ fpair *= j_a; fx = delx*fpair/r; diff --git a/src/BODY/pair_body_rounded_polyhedron.h b/src/BODY/pair_body_rounded_polyhedron.h index 05985ef813..f59faf9ba6 100644 --- a/src/BODY/pair_body_rounded_polyhedron.h +++ b/src/BODY/pair_body_rounded_polyhedron.h @@ -34,6 +34,9 @@ class PairBodyRoundedPolyhedron : public Pair { void init_style(); double init_one(int, int); + virtual void kernel_force(double R, double k_n, double k_na, + double& energy, double& fpair); + struct Contact { int ibody, jbody; // body (i.e. atom) indices (not tags) int type; // 0 = VERTEX-FACE; 1 = EDGE-EDGE @@ -84,28 +87,35 @@ class PairBodyRoundedPolyhedron : public Pair { void allocate(); void body2space(int); - int edge_against_face(int ibody, int jbody, double k_n, double k_na, - double** x, Contact* contact_list, int &num_contacts, - double &evdwl, double* facc); - int edge_against_edge(int ibody, int jbody, double k_n, double k_na, - double** x,Contact* contact_list, int &num_contacts, - double &evdwl, double* facc); + // sphere-sphere interaction void sphere_against_sphere(int ibody, int jbody, double delx, double dely, double delz, double rsq, double k_n, double k_na, double** v, double** f, int evflag); - void sphere_against_face(int ibody, int jbody, - double k_n, double k_na, double** x, double** v, - double** f, double** torque, double** angmom, int evflag); + // sphere-edge interaction void sphere_against_edge(int ibody, int jbody, double k_n, double k_na, double** x, double** v, double** f, double** torque, double** angmom, int evflag); + // sphere-face interaction + void sphere_against_face(int ibody, int jbody, + double k_n, double k_na, double** x, double** v, + double** f, double** torque, double** angmom, int evflag); + // edge-edge interactions + int edge_against_edge(int ibody, int jbody, double k_n, double k_na, + double** x,Contact* contact_list, int &num_contacts, + double &evdwl, double* facc); + // edge-face interactions + int edge_against_face(int ibody, int jbody, double k_n, double k_na, + double** x, Contact* contact_list, int &num_contacts, + double &evdwl, double* facc); + // a face vs. a single edge int interaction_face_to_edge(int ibody, int face_index, double* xmi, double rounded_radius_i, int jbody, int edge_index, double* xmj, double rounded_radius_j, double k_n, double k_na, double cut_inner, Contact* contact_list, int &num_contacts, double& energy, double* facc); + // an edge vs. an edge from another body int interaction_edge_to_edge(int ibody, int edge_index_i, double* xmi, double rounded_radius_i, int jbody, int edge_index_j, double* xmj, double rounded_radius_j, @@ -113,29 +123,38 @@ class PairBodyRoundedPolyhedron : public Pair { Contact* contact_list, int &num_contacts, double& energy, double* facc); + // compute contact forces if contact points are detected void contact_forces(int ibody, int jbody, double *xi, double *xj, double delx, double dely, double delz, double fx, double fy, double fz, double** x, double** v, double** angmom, double** f, double** torque, double* facc); + // compute force and torque between two bodies given a pair of interacting points void pair_force_and_torque(int ibody, int jbody, double* pi, double* pj, double r, double contact_dist, double k_n, - double k_na, double shift, double** x, double** v, + double k_na, double** x, double** v, double** f, double** torque, double** angmom, int jflag, double& energy, double* facc); + // rescale the cohesive forces if a contact area is detected void rescale_cohesive_forces(double** x, double** f, double** torque, Contact* contact_list, int &num_contacts, double k_n, double k_na, double* facc); + // compute the separation between two contacts double contact_separation(const Contact& c1, const Contact& c2); + // detect the unique contact points (as there may be double counts) void find_unique_contacts(Contact* contact_list, int& num_contacts); + // accumulate torque to a body given a force at a given point void sum_torque(double* xm, double *x, double fx, double fy, double fz, double* torque); - int opposite_sides(double* n, double* x0, double* a, double* b); + + // find the intersection point (if any) between an edge and a face int edge_face_intersect(double* x1, double* x2, double* x3, double* a, double* b, double* hi1, double* hi2, double& d1, double& d2, int& inside_a, int& inside_b); + // helper functions + int opposite_sides(double* n, double* x0, double* a, double* b); void project_pt_plane(const double* q, const double* p, const double* n, double* q_proj, double &d); void project_pt_plane(const double* q, const double* x1, const double* x2, From 179dcd68953adb0b45b6b91a990c0c222689a8f0 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 26 May 2018 10:02:53 -0500 Subject: [PATCH 006/123] Updated pair body rounded/polygon and rounded/polyhedron --- src/BODY/pair_body_rounded_polygon.cpp | 21 +++++++++++++-------- src/BODY/pair_body_rounded_polyhedron.cpp | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/BODY/pair_body_rounded_polygon.cpp b/src/BODY/pair_body_rounded_polygon.cpp index 62a6d77a01..22300091ae 100644 --- a/src/BODY/pair_body_rounded_polygon.cpp +++ b/src/BODY/pair_body_rounded_polygon.cpp @@ -38,12 +38,14 @@ using namespace LAMMPS_NS; -//#define _POLYGON_DEBUG #define DELTA 10000 #define EPSILON 1e-3 #define MAX_CONTACTS 4 // maximum number of contacts for 2D models #define EFF_CONTACTS 2 // effective contacts for 2D models +//#define _CONVEX_POLYGON +//#define _POLYGON_DEBUG + enum {INVALID=0,NONE=1,VERTEXI=2,VERTEXJ=3,EDGE=4}; /* ---------------------------------------------------------------------- */ @@ -846,11 +848,11 @@ int PairBodyRoundedPolygon::vertex_against_edge(int i, int j, #endif } + #ifdef _CONVEX_POLYGON // done with the edges from body j, // given that vertex ni interacts with only one vertex from one edge of body j - // comment out this break to take into account concave shapes - -// break; + break; + #endif } else if (mode == EDGE) { @@ -954,12 +956,11 @@ int PairBodyRoundedPolygon::vertex_against_edge(int i, int j, #endif } // end if contact + #ifdef _CONVEX_POLYGON // done with the edges from body j, // given that vertex ni interacts with only one edge from body j - // comment out this break to take into account concave shapes - -// break; - + break; + #endif } // end if mode } // end for looping through the edges of body j @@ -1082,7 +1083,11 @@ int PairBodyRoundedPolygon::compute_distance_to_vertex(int ibody, // check if x0 (the queried vertex) and xmi (the body's center of mass) // are on the different sides of the edge + #ifdef _CONVEX_POLYGON int m = opposite_sides(xi1, xi2, x0, xmi); + #else + int m = 1; + #endif if (m == 0) { diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index 42c107d68e..d0690335df 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -46,8 +46,8 @@ using namespace MathConst; #define DELTA 10000 #define EPSILON 1e-3 -#define MAX_FACE_SIZE 4 // maximum number of vertices per face (same as BodyRoundedPolyhedron) -#define MAX_CONTACTS 32 // for 3D models +#define MAX_FACE_SIZE 4 // maximum number of vertices per face (same as BodyRoundedPolyhedron) +#define MAX_CONTACTS 32 // for 3D models (including duplicated counts) //#define _POLYHEDRON_DEBUG From 4ca870b2a9f3107e7bf26e75f542c3ce893313de Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 26 May 2018 11:41:15 -0500 Subject: [PATCH 007/123] Updated doc page for pair body rounded/polygon --- doc/src/body.txt | 78 +++++++++++++++++++++------ doc/src/pair_body_rounded_polygon.txt | 48 ++++++++++++++++- src/BODY/pair_body_rounded_polygon.h | 17 ++++-- 3 files changed, 120 insertions(+), 23 deletions(-) diff --git a/doc/src/body.txt b/doc/src/body.txt index 8d49efdae4..b76ca1090c 100644 --- a/doc/src/body.txt +++ b/doc/src/body.txt @@ -28,16 +28,14 @@ column is used as the {bstyle} argument for the "atom_style body"_atom_style.html command. {nparticle} | rigid body with N sub-particles | -{rounded/polygon} | 2d convex polygon with N vertices :tb(c=2,s=|) +{rounded/polygon} | 2d polygons with N vertices :tb(c=2,s=|) +{rounded/polyhedron} | 3d polyhedra with N vertices, E edges and F faces :tb(c=2,s=|) The body style determines what attributes are stored for each body and thus how they can be used to compute pairwise body/body or bond/non-body (point particle) interactions. More details of each style are described below. -NOTE: The rounded/polygon style listed in the table above and -described below has not yet been relesed in LAMMPS. It will be soon. - We hope to add more styles in the future. See "Section 10.12"_Section_modify.html#mod_12 for details on how to add a new body style to the code. @@ -175,13 +173,11 @@ The {bflag2} argument is ignored. [Specifics of body style rounded/polygon:] -NOTE: Aug 2016 - This body style has not yet been added to LAMMPS. -The info below is a placeholder. - -The {rounded/polygon} body style represents body particles as a convex -polygon with a variable number N > 2 of vertices, which can only be -used for 2d models. One example use of this body style is for 2d -discrete element models, as described in "Fraige"_#Fraige. Similar to +The {rounded/polygon} body style represents body particles as +a polygon with a variable number N of vertices, which can only be +used for 2d models. Special cases for N = 1 (spheres) and N = 2 +(rods) are also included. One example use of this body style is for 2d +discrete element models, as described in "Fraige"_#Fraige. Similar to body style {nparticle}, the atom_style body command for this body style takes two additional arguments: @@ -203,15 +199,14 @@ x1 y1 z1 ... xN yN zN i j j k k ... -radius :pre +diameter :pre N is the number of vertices in the body particle. M = 6 + 3*N + 2*N + 1. The integer line has a single value N. The floating point line(s) list 6 moments of inertia followed by the coordinates of the N vertices (x1 to zN) as 3N values, followed by 2N vertex indices corresponding to the end points of the N edges, followed by a single -radius value = the smallest circle encompassing the polygon. That -last value is used to facilitate the body/body contact detection. +diameter value = the rounded diameter of the vertices. These floating-point values can be listed on as many lines as you wish; see the "read_data"_read_data.html command for more details. @@ -235,7 +230,10 @@ particles whose edge length is sqrt(2): -0.7071 0.7071 0 0.7071 0.7071 0 0.7071 -0.7071 0 -0 1 1 2 2 3 3 0 +0 1 +1 2 +2 3 +3 0 1.0 :pre The "pair_style body/rounded/polygon"_pair_body_rounded_polygon.html @@ -257,8 +255,8 @@ the body particle itself. These values are calculated using the current COM and orientation of the body particle. For images created by the "dump image"_dump_image.html command, if the -{body} keyword is set, then each body particle is drawn as a convex -polygon consisting of N line segments. Note that the line segments +{body} keyword is set, then each body particle is drawn as a polygon +consisting of N line segments. Note that the line segments are drawn between the N vertices, which does not correspond exactly to the physical extent of the body (because the "pair_style rounded/polygon"_pair_body_rounded_polygon.html defines finite-size @@ -267,6 +265,52 @@ tangent to the spheres). The drawn diameter of each line segment is determined by the {bflag1} parameter for the {body} keyword. The {bflag2} argument is ignored. +The {rounded/polyhedon} body style represents body particles as +a polyhedron with N vertices, E edges and F faces. +Special cases for N = 1 (spheres) and N = 2 (rods) are also valid. +Similar to body style {rounded/polygon}, the atom_style body command for this body +style takes two additional arguments: + +atom_style body rounded/polyhedron Nmin Nmax +Nmin = minimum # of vertices in any body in the system +Nmax = maximum # of vertices in any body in the system :pre + +The Nmin and Nmax arguments are used to bound the size of data +structures used internally by each particle. + +When the "read_data"_read_data.html command reads a data file for this +body style, the following information must be provided for each entry +in the {Bodies} section of the data file: + +atom-ID 3 M +N E F +ixx iyy izz ixy ixz iyz +x1 y1 z1 +... +xN yN zN +0 1 +1 2 +2 3 +... +0 1 2 -1 +0 2 3 -1 +... +1 2 3 4 +diameter :pre + +N is the number of vertices in the body particle. M = 6 + 3*N + 2*E ++ 4*F + 1. The integer line has three values: number of vertices (N), +number of edges (E) and number of faces (F). The floating point line(s) +list 6 moments of inertia followed by the coordinates of the N +vertices (x1 to zN) as 3N values, followed by 2N vertex indices +corresponding to the end points of the E edges, 4*F vertex indices defining F faces. +The last value is the radius value = the rounded diameter of the vertices. +These floating-point values can be listed on as many lines as you +wish; see the "read_data"_read_data.html command for more details. +Because the maxmimum vertices per face is hard-coded to be 4 (i.e. quadrilaterals), +faces with more than 4 vertices need to be split into triangles or quadrilaterals. +For triangular faces, the last index should be set to -1. + :line :link(Fraige) diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index b6dc2e37b5..32f698d9f7 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -8,12 +8,58 @@ pair_style body/rounded/polygon command :h3 +[Syntax:] + +pair_style body/rounded/polygon c_n c_t mu delta_ua cutoff :pre +c_n = normal damping coefficient +c_t = tangential damping coefficient +mu = normal friction coefficient during gross sliding +delta_ua = multiple contact scaling factor +cutoff = global sepration cutoff for interactions (distance units), see below for definition + +[Examples:] + +pair_style body/rounded/polygon ${c_n} ${c_t} ${mu} ${delta_ua} ${cutoff} +pair_coeff * * 100.0 1.0 +pair_coeff 1 1 100.0 1.0 :pre + [Description:] -Note: This feature is not yet implemented. +Style {body/rounded/polygon} is for use with body particles and calculates pairwise +body/body interactions as well as interactions between body and +point-particles. See "Section 6.14"_Section_howto.html#howto_14 +of the manual and the "body"_body.html doc page for more details on +using body particles. + +This pair style is designed for use with the "body/rounded/polygon" body style, +which is specified as an argument to the "atom-style body" command. +See the "body/rounded/polygon"_body.html doc page for more details about the body +styles LAMMPS supports. The pairwise interaction between the rounded polygons is described +in "Fraige"_#Fraige, where the polygons are rounded at the vertices and edges +by circles of diameter a. + +Because the polygons can have different rounded diameters, the cutoff specified in +the pair style command is for the surface separation between two interacting entities +(e.g. vertex-vertex, vertex-edge or edge-edge) excluding their rounded diameters, +i.e. separation = center-center distance - (rounded diameter of i + rounded diameter of j)/2. +The interaction forces and energies are also defined with respect to the rounded surface separation, +instead of center-center distance. + +For style {body/rounded/polygon}, the following coefficients must be defined for each +pair of atoms types via the "pair_coeff"_pair_coeff.html command as in +the examples above, or in the data file or restart files read by the +"read_data"_read_data.html or "read_restart"_read_restart.html +commands: + +k_n (energy/distance^2) +k_na (energy/distance^2) :ul [Related commands:] "pair_style body"_pair_body.html [Default:] none + +:link(Fraige) +[(Fraige)] F. Y. Fraige, P. A. Langston, A. J. Matchett, J. Dodds, +Particuology, 6, 455 (2008). diff --git a/src/BODY/pair_body_rounded_polygon.h b/src/BODY/pair_body_rounded_polygon.h index 09c93b832e..919552305a 100644 --- a/src/BODY/pair_body_rounded_polygon.h +++ b/src/BODY/pair_body_rounded_polygon.h @@ -76,24 +76,31 @@ class PairBodyRoundedPolygon : public Pair { void allocate(); void body2space(int); + // sphere-sphere interaction + void sphere_against_sphere(int i, int j, double delx, double dely, double delz, + double rsq, double k_n, double k_na, + double** x, double** v, double** f, int evflag); + // vertex-edge interaction int vertex_against_edge(int i, int j, double k_n, double k_na, double** x, double** f, double** torque, tagint* tag, Contact* contact_list, int &num_contacts, double &evdwl, double* facc); - void sphere_against_sphere(int i, int j, double delx, double dely, double delz, - double rsq, double k_n, double k_na, - double** x, double** v, double** f, int evflag); + // compute distance between a point and an edge from another body int compute_distance_to_vertex(int ibody, int edge_index, double* xmi, double rounded_radius, double* x0, double x0_rounded_radius, double cut_inner, double &d, double hi[3], double &t, int &contact); - double contact_separation(const Contact& c1, const Contact& c2); + // compute contact forces if contact points are detected void contact_forces(Contact& contact, double j_a, double** x, - double** v, double** f, double** angmom, + double** v, double** f, double** angmom, + // compute the separation between two contacts + double contact_separation(const Contact& c1, const Contact& c2); double** torque, double &evdwl, double* facc); + // accumulate torque to a body given a force at a given point void sum_torque(double* xm, double *x, double fx, double fy, double fz, double* torque); + // helper functions int opposite_sides(double* x1, double* x2, double* a, double* b); void total_velocity(double* p, double *xcm, double* vcm, double *angmom, double *inertia, double *quat, double* vi); From 6b9637eaa3277e134f3d717990966fe03395dfb4 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 26 May 2018 12:34:07 -0500 Subject: [PATCH 008/123] Added doc page for pair body rounded/polyhedron and updated related pages --- doc/src/body.txt | 58 +++++++++++--------- doc/src/pair_body_rounded_polygon.txt | 14 +++-- doc/src/pair_body_rounded_polyhedron.txt | 67 ++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 29 deletions(-) create mode 100644 doc/src/pair_body_rounded_polyhedron.txt diff --git a/doc/src/body.txt b/doc/src/body.txt index b76ca1090c..e936f5409c 100644 --- a/doc/src/body.txt +++ b/doc/src/body.txt @@ -240,34 +240,14 @@ The "pair_style body/rounded/polygon"_pair_body_rounded_polygon.html command can be used with this body style to compute body/body interactions. -For output purposes via the "compute -body/local"_compute_body_local.html and "dump local"_dump.html -commands, this body style produces one datum for each of the N -sub-particles in a body particle. The datum has 3 values: +:line -1 = x position of vertex -2 = y position of vertex -3 = z position of vertex :pre +[Specifics of body style rounded/polyhedron:] -These values are the current position of the vertex within the -simulation domain, not a displacement from the center-of-mass (COM) of -the body particle itself. These values are calculated using the -current COM and orientation of the body particle. - -For images created by the "dump image"_dump_image.html command, if the -{body} keyword is set, then each body particle is drawn as a polygon -consisting of N line segments. Note that the line segments -are drawn between the N vertices, which does not correspond exactly to -the physical extent of the body (because the "pair_style -rounded/polygon"_pair_body_rounded_polygon.html defines finite-size -spheres at those point and the line segments between the spheres are -tangent to the spheres). The drawn diameter of each line segment is -determined by the {bflag1} parameter for the {body} keyword. The -{bflag2} argument is ignored. - -The {rounded/polyhedon} body style represents body particles as +The {rounded/polyhedron} body style represents body particles as a polyhedron with N vertices, E edges and F faces. Special cases for N = 1 (spheres) and N = 2 (rods) are also valid. +This body style is for 3d discrete element models, as described in "Wang"_#Wang. Similar to body style {rounded/polygon}, the atom_style body command for this body style takes two additional arguments: @@ -313,6 +293,36 @@ For triangular faces, the last index should be set to -1. :line +For output purposes via the "compute +body/local"_compute_body_local.html and "dump local"_dump.html +commands, this body style produces one datum for each of the N +sub-particles in a body particle. The datum has 3 values: + +1 = x position of vertex +2 = y position of vertex +3 = z position of vertex :pre + +These values are the current position of the vertex within the +simulation domain, not a displacement from the center-of-mass (COM) of +the body particle itself. These values are calculated using the +current COM and orientation of the body particle. + +For images created by the "dump image"_dump_image.html command, if the +{body} keyword is set, then each body particle is drawn as a polygon +consisting of N line segments. Note that the line segments +are drawn between the N vertices, which does not correspond exactly to +the physical extent of the body (because the "pair_style +rounded/polygon"_pair_body_rounded_polygon.html defines finite-size +spheres at those point and the line segments between the spheres are +tangent to the spheres). The drawn diameter of each line segment is +determined by the {bflag1} parameter for the {body} keyword. The +{bflag2} argument is ignored. + +:line + :link(Fraige) [(Fraige)] F. Y. Fraige, P. A. Langston, A. J. Matchett, J. Dodds, Particuology, 6, 455 (2008). + +:link(Wang) +[(Wang)] J. Wang, H. S. Yu, P. A. Langston, F. Y. Fraige, Granular Matter, 13, 1 (2011). diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index 32f698d9f7..5352f695b0 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -11,15 +11,16 @@ pair_style body/rounded/polygon command :h3 [Syntax:] pair_style body/rounded/polygon c_n c_t mu delta_ua cutoff :pre + c_n = normal damping coefficient c_t = tangential damping coefficient mu = normal friction coefficient during gross sliding delta_ua = multiple contact scaling factor -cutoff = global sepration cutoff for interactions (distance units), see below for definition +cutoff = global sepration cutoff for interactions (distance units), see below for definition :pre [Examples:] -pair_style body/rounded/polygon ${c_n} ${c_t} ${mu} ${delta_ua} ${cutoff} +pair_style body/rounded/polygon 20.0 5.0 0.0 1.0 0.5 pair_coeff * * 100.0 1.0 pair_coeff 1 1 100.0 1.0 :pre @@ -36,12 +37,13 @@ which is specified as an argument to the "atom-style body" command. See the "body/rounded/polygon"_body.html doc page for more details about the body styles LAMMPS supports. The pairwise interaction between the rounded polygons is described in "Fraige"_#Fraige, where the polygons are rounded at the vertices and edges -by circles of diameter a. +by circles of diameter a. This is a version of discrete element models (DEM) +with multiple contact points. Because the polygons can have different rounded diameters, the cutoff specified in the pair style command is for the surface separation between two interacting entities (e.g. vertex-vertex, vertex-edge or edge-edge) excluding their rounded diameters, -i.e. separation = center-center distance - (rounded diameter of i + rounded diameter of j)/2. +i.e. separation = center-center distance - (rounded diameter of entity i + rounded diameter of entity j)/2. The interaction forces and energies are also defined with respect to the rounded surface separation, instead of center-center distance. @@ -56,10 +58,12 @@ k_na (energy/distance^2) :ul [Related commands:] -"pair_style body"_pair_body.html +"pair_coeff"_pair_coeff.html [Default:] none :link(Fraige) [(Fraige)] F. Y. Fraige, P. A. Langston, A. J. Matchett, J. Dodds, Particuology, 6, 455 (2008). + + diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/src/pair_body_rounded_polyhedron.txt new file mode 100644 index 0000000000..cfab0e6d15 --- /dev/null +++ b/doc/src/pair_body_rounded_polyhedron.txt @@ -0,0 +1,67 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +pair_style body/rounded/polyhedron command :h3 + +[Syntax:] + +pair_style body/rounded/polyhedron c_n c_t mu delta_ua cutoff :pre + +c_n = normal damping coefficient +c_t = tangential damping coefficient +mu = normal friction coefficient during gross sliding +delta_ua = multiple contact scaling factor +cutoff = global sepration cutoff for interactions (distance units), see below for definition :pre + +[Examples:] + +pair_style body/rounded/polyhedron 20.0 5.0 0.0 1.0 0.5 +pair_coeff * * 100.0 1.0 +pair_coeff 1 1 100.0 1.0 :pre + +[Description:] + +Style {body/rounded/polyhedron} is for use with body particles and calculates pairwise +body/body interactions as well as interactions between body and +point-particles. See "Section 6.14"_Section_howto.html#howto_14 +of the manual and the "body"_body.html doc page for more details on +using body particles. + +This pair style is designed for use with the "body/rounded/polyhedron" body style, +which is specified as an argument to the "atom-style body" command. +See the "body/rounded/polyhedron"_body.html doc page for more details about the body +styles LAMMPS supports. The pairwise interaction between the rounded polygons is described +in "Wang"_#Wang, where the polygons are rounded at the vertices and edges +by circles of diameter a. This is a version of discrete element models (DEM) +with multiple contact points. + +Because the polygons can have different rounded diameters, the cutoff specified in +the pair style command is for the surface separation between two interacting entities +(e.g. vertex-vertex, vertex-edge, vertex-face and edge-edge) excluding their rounded diameters, +i.e. separation = center-center distance - (rounded diameter of entity i + rounded diameter of entity j)/2. +The interaction forces and energies are also defined with respect to the rounded surface separation, +instead of center-center distance. + +For style {body/rounded/polyhedron}, the following coefficients must be defined for each +pair of atoms types via the "pair_coeff"_pair_coeff.html command as in +the examples above, or in the data file or restart files read by the +"read_data"_read_data.html or "read_restart"_read_restart.html +commands: + +k_n (energy/distance^2) +k_na (energy/distance^2) :ul + +[Related commands:] + +"pair_coeff"_pair_coeff.html + +[Default:] none + +:link(Wang) +[(Wang)] J. Wang, H. S. Yu, P. A. Langston, F. Y. Fraige, Granular Matter, 13, 1 (2011). + From 6438cffa5748b27347ca3e748235885e18cf91ec Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 26 May 2018 13:39:43 -0500 Subject: [PATCH 009/123] Added examples for body rounded/polygon --- examples/body/data.squares | 32 ++++++++++++++++++++++ examples/body/in.squares | 56 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100755 examples/body/data.squares create mode 100755 examples/body/in.squares diff --git a/examples/body/data.squares b/examples/body/data.squares new file mode 100755 index 0000000000..55a3dd09a0 --- /dev/null +++ b/examples/body/data.squares @@ -0,0 +1,32 @@ +LAMMPS data file for polygons: squares of edge length L: Izz = 1/6mL^2 +2 atoms +2 bodies +1 atom types +-6 6 xlo xhi +-6 6 ylo yhi +-0.5 0.5 zlo zhi + +Atoms + +1 1 1 1 0 0 0 +2 1 1 1 5 1 0 + +Bodies + +1 1 19 +4 +1 1 2.67 0 0 0 +-2 -2 0 +-2 2 0 +2 2 0 +2 -2 0 +0.5 +2 1 19 +4 +1 1 2.67 0 0 0 +-2 -2 0 +-2 2 0 +2 2 0 +2 -2 0 +0.5 + diff --git a/examples/body/in.squares b/examples/body/in.squares new file mode 100755 index 0000000000..146ba497e6 --- /dev/null +++ b/examples/body/in.squares @@ -0,0 +1,56 @@ +# 2d rounded polygon bodies + +variable r index 3 +variable steps index 100000 +variable T index 0.5 +variable P index 0.2 +variable seed index 980411 + +units lj +dimension 2 + +atom_style body rounded/polygon 1 6 +atom_modify map array +read_data data.squares + +replicate $r $r 1 + +velocity all create $T ${seed} dist gaussian mom yes rot yes + +variable cut_inner equal 0.5 +variable k_n equal 100 +variable k_na equal 2 +variable c_n equal 0.1 +variable c_t equal 0.1 +variable mu equal 0.1 +variable delta_ua equal 0.5 + +pair_style body/rounded/polygon ${c_n} ${c_t} ${mu} ${delta_ua} ${cut_inner} +pair_coeff * * ${k_n} ${k_na} + +comm_modify vel yes + +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.001 + +#fix 1 all nve/body +#fix 1 all nvt/body temp $T $T 1.0 +fix 1 all npt/body temp $T $T 1.0 x 0.001 $P 1.0 & + y 0.001 $P 1.0 couple xy + +fix 2 all enforce2d + +compute 1 all body/local id 1 2 3 +dump 1 all local 100000 dump.polygon.* index c_1[1] c_1[2] c_1[3] c_1[4] + +thermo_style custom step ke pe etotal press +thermo 1000 + +restart 100000 restart1.bin restart2.bin + +#dump 2 all image 10000 image.*.jpg type type zoom 2.0 adiam 1.5 body yes 0 0 +#dump_modify 2 pad 6 + +run ${steps} From f2c302c2c4b7516660eab58d2f022fca9220b8b5 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 26 May 2018 14:59:40 -0500 Subject: [PATCH 010/123] Added fix wall/body/polygon and related doc pages --- doc/src/fix_wall_body_polygon.txt | 100 +++++++++++++++++++++++ doc/src/fix_wall_body_polyhedron.txt | 100 +++++++++++++++++++++++ doc/src/pair_body_rounded_polygon.txt | 4 +- doc/src/pair_body_rounded_polyhedron.txt | 4 +- src/BODY/fix_wall_body_polygon.h | 4 +- 5 files changed, 207 insertions(+), 5 deletions(-) create mode 100644 doc/src/fix_wall_body_polygon.txt create mode 100644 doc/src/fix_wall_body_polyhedron.txt diff --git a/doc/src/fix_wall_body_polygon.txt b/doc/src/fix_wall_body_polygon.txt new file mode 100644 index 0000000000..00d23c207c --- /dev/null +++ b/doc/src/fix_wall_body_polygon.txt @@ -0,0 +1,100 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +fix wall/body/polygon command :h3 + +[Syntax:] + +fix ID group-ID wall/body/polygon k_n c_n c_t wallstyle args keyword values ... :pre + +ID, group-ID are documented in "fix"_fix.html command :ulb,l +wall/body/polygon = style name of this fix command :l +k_n = normal repulsion strength (force/distance units or pressure units - see discussion below) :l +c_n = normal damping coefficient (force/distance units or pressure units - see discussion below) :l +c_t = tangential damping coefficient (force/distance units or pressure units - see discussion below) :l +wallstyle = {xplane} or {yplane} or {zplane} or {zcylinder} :l +args = list of arguments for a particular style :l + {xplane} or {yplane} args = lo hi + lo,hi = position of lower and upper plane (distance units), either can be NULL) + {zcylinder} args = radius + radius = cylinder radius (distance units) :pre +zero or more keyword/value pairs may be appended to args :l +keyword = {wiggle} :l + {wiggle} values = dim amplitude period + dim = {x} or {y} or {z} + amplitude = size of oscillation (distance units) + period = time of oscillation (time units) :pre +:ule + +[Examples:] + +fix 1 all wall/body/polygon 1000.0 20.0 5.0 xplane -10.0 10.0 + +[Description:] + +Bound the simulation domain of systems of body particles of style +body/rounded/polygon with wall(s). All particles in the group interact +with the wall when they are close enough to touch it. +The nature of the interaction between the wall and the polygons is +the same as that between the polygons themselves, which is similar to the Hookean potential. + +This fix is designed for use with the "body/rounded/polygon" body style, +which is specified as an argument to the "atom-style body" command. +The parameters {k_n}, {c_n}, {c_t} have the same meaning and units as those specified with the +"pair_style body/rounded/polygon"_pair_body_rounded_polygon.html commands. + +The {wallstyle} can be planar or cylindrical. The 3 planar options +specify a pair of walls in a dimension. Wall positions are given by +{lo} and {hi}. Either of the values can be specified as NULL if a +single wall is desired. For a {zcylinder} wallstyle, the cylinder's +axis is at x = y = 0.0, and the radius of the cylinder is specified. + +Optionally, the wall can be moving, if the {wiggle} keyword is appended. + +For the {wiggle} keyword, the wall oscillates sinusoidally, similar to +the oscillations of particles which can be specified by the +"fix move"_fix_move.html command. This is useful in packing +simulations of particles. The arguments to the {wiggle} +keyword specify a dimension for the motion, as well as it's +{amplitude} and {period}. Note that if the dimension is in the plane +of the wall, this is effectively a shearing motion. If the dimension +is perpendicular to the wall, it is more of a shaking motion. A +{zcylinder} wall can only be wiggled in the z dimension. + +Each timestep, the position of a wiggled wall in the appropriate {dim} +is set according to this equation: + +position = coord + A - A cos (omega * delta) :pre + +where {coord} is the specified initial position of the wall, {A} is +the {amplitude}, {omega} is 2 PI / {period}, and {delta} is the time +elapsed since the fix was specified. The velocity of the wall is set +to the derivative of this expression. + +[Restart, fix_modify, output, run start/stop, minimize info:] + +None of the "fix_modify"_fix_modify.html options are relevant to this +fix. No global or per-atom quantities are stored by this fix for +access by various "output commands"_Section_howto.html#howto_15. No +parameter of this fix can be used with the {start/stop} keywords of +the "run"_run.html command. This fix is not invoked during "energy +minimization"_minimize.html. + +[Restrictions:] + +This fix is part of the BODY package. It is only enabled if +LAMMPS was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +Any dimension (xyz) that has a wall must be non-periodic. + +[Related commands:] + +"pair_style body/rounded/polygon"_pair_body_rounded_polygon.html + +[Default:] none diff --git a/doc/src/fix_wall_body_polyhedron.txt b/doc/src/fix_wall_body_polyhedron.txt new file mode 100644 index 0000000000..a1eef4df07 --- /dev/null +++ b/doc/src/fix_wall_body_polyhedron.txt @@ -0,0 +1,100 @@ +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +fix wall/body/polyhedron command :h3 + +[Syntax:] + +fix ID group-ID wall/body/polyhedron k_n c_n c_t wallstyle args keyword values ... :pre + +ID, group-ID are documented in "fix"_fix.html command :ulb,l +wall/body/polyhedron = style name of this fix command :l +k_n = normal repulsion strength (force/distance units or pressure units - see discussion below) :l +c_n = normal damping coefficient (force/distance units or pressure units - see discussion below) :l +c_t = tangential damping coefficient (force/distance units or pressure units - see discussion below) :l +wallstyle = {xplane} or {yplane} or {zplane} or {zcylinder} :l +args = list of arguments for a particular style :l + {xplane} or {yplane} args = lo hi + lo,hi = position of lower and upper plane (distance units), either can be NULL) + {zcylinder} args = radius + radius = cylinder radius (distance units) :pre +zero or more keyword/value pairs may be appended to args :l +keyword = {wiggle} :l + {wiggle} values = dim amplitude period + dim = {x} or {y} or {z} + amplitude = size of oscillation (distance units) + period = time of oscillation (time units) :pre +:ule + +[Examples:] + +fix 1 all wall/body/polyhedron 1000.0 20.0 5.0 xplane -10.0 10.0 + +[Description:] + +Bound the simulation domain of systems of body particles of style +body/rounded/polyhedron with wall(s). All particles in the group interact +with the wall when they are close enough to touch it. +The nature of the interaction between the wall and the polygons is +the same as that between the polygons themselves, which is similar to the Hookean potential. + +This fix is designed for use with the "body/rounded/polyhedron" body style, +which is specified as an argument to the "atom-style body" command. +The parameters {k_n}, {c_n}, {c_t} have the same meaning and units as those specified with the +"pair_style body/rounded/polyhedron"_pair_body_rounded_polygon.html commands. + +The {wallstyle} can be planar or cylindrical. The 3 planar options +specify a pair of walls in a dimension. Wall positions are given by +{lo} and {hi}. Either of the values can be specified as NULL if a +single wall is desired. For a {zcylinder} wallstyle, the cylinder's +axis is at x = y = 0.0, and the radius of the cylinder is specified. + +Optionally, the wall can be moving, if the {wiggle} keyword is appended. + +For the {wiggle} keyword, the wall oscillates sinusoidally, similar to +the oscillations of particles which can be specified by the +"fix move"_fix_move.html command. This is useful in packing +simulations of particles. The arguments to the {wiggle} +keyword specify a dimension for the motion, as well as it's +{amplitude} and {period}. Note that if the dimension is in the plane +of the wall, this is effectively a shearing motion. If the dimension +is perpendicular to the wall, it is more of a shaking motion. A +{zcylinder} wall can only be wiggled in the z dimension. + +Each timestep, the position of a wiggled wall in the appropriate {dim} +is set according to this equation: + +position = coord + A - A cos (omega * delta) :pre + +where {coord} is the specified initial position of the wall, {A} is +the {amplitude}, {omega} is 2 PI / {period}, and {delta} is the time +elapsed since the fix was specified. The velocity of the wall is set +to the derivative of this expression. + +[Restart, fix_modify, output, run start/stop, minimize info:] + +None of the "fix_modify"_fix_modify.html options are relevant to this +fix. No global or per-atom quantities are stored by this fix for +access by various "output commands"_Section_howto.html#howto_15. No +parameter of this fix can be used with the {start/stop} keywords of +the "run"_run.html command. This fix is not invoked during "energy +minimization"_minimize.html. + +[Restrictions:] + +This fix is part of the BODY package. It is only enabled if +LAMMPS was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +Any dimension (xyz) that has a wall must be non-periodic. + +[Related commands:] + +"pair_style body/rounded/polyhedron"_pair_body_rounded_polygon.html + +[Default:] none diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index 5352f695b0..00896b4c7b 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -53,8 +53,8 @@ the examples above, or in the data file or restart files read by the "read_data"_read_data.html or "read_restart"_read_restart.html commands: -k_n (energy/distance^2) -k_na (energy/distance^2) :ul +k_n (energy/distance^2 units) +k_na (energy/distance^2 units) :ul [Related commands:] diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/src/pair_body_rounded_polyhedron.txt index cfab0e6d15..9a5c20ddb6 100644 --- a/doc/src/pair_body_rounded_polyhedron.txt +++ b/doc/src/pair_body_rounded_polyhedron.txt @@ -53,8 +53,8 @@ the examples above, or in the data file or restart files read by the "read_data"_read_data.html or "read_restart"_read_restart.html commands: -k_n (energy/distance^2) -k_na (energy/distance^2) :ul +k_n (energy/distance^2 units) +k_na (energy/distance^2 units) :ul [Related commands:] diff --git a/src/BODY/fix_wall_body_polygon.h b/src/BODY/fix_wall_body_polygon.h index 3521c6c797..b71dcb0683 100644 --- a/src/BODY/fix_wall_body_polygon.h +++ b/src/BODY/fix_wall_body_polygon.h @@ -45,7 +45,9 @@ class FixWallBodyPolygon : public Fix { protected: int wallstyle,pairstyle,wiggle,axis; - double kn,c_n,c_t; + double kn; // normal repulsion strength + double c_n; // normal damping coefficient + double c_t; // tangential damping coefficient double lo,hi,cylradius; double amplitude,period,omega; double dt; From 7aab9327318b3fb61b058b8c1a840791c5a3628f Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 29 May 2018 15:49:15 -0500 Subject: [PATCH 011/123] Fixed typos in pair body rounded/polygon header file --- src/BODY/pair_body_rounded_polygon.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/BODY/pair_body_rounded_polygon.h b/src/BODY/pair_body_rounded_polygon.h index 919552305a..aabe86270c 100644 --- a/src/BODY/pair_body_rounded_polygon.h +++ b/src/BODY/pair_body_rounded_polygon.h @@ -92,11 +92,13 @@ class PairBodyRoundedPolygon : public Pair { double &d, double hi[3], double &t, int &contact); // compute contact forces if contact points are detected - void contact_forces(Contact& contact, double j_a, double** x, - double** v, double** f, double** angmom, + void contact_forces(Contact& contact, double j_a, + double** x, double** v, double** angmom, double** f, + double** torque, double &evdwl, double* facc); + // compute the separation between two contacts double contact_separation(const Contact& c1, const Contact& c2); - double** torque, double &evdwl, double* facc); + // accumulate torque to a body given a force at a given point void sum_torque(double* xm, double *x, double fx, double fy, double fz, double* torque); From d4cca615fb558d84411232f45d6de4758bc3f73e Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 29 May 2018 23:42:03 -0500 Subject: [PATCH 012/123] Refactored pair body rounded/polyhedron so that kernel_force() can be derived for other styles --- examples/body/in.squares | 8 +- src/BODY/pair_body_rounded_polyhedron.cpp | 126 +++++++++------------- src/BODY/pair_body_rounded_polyhedron.h | 36 +++---- 3 files changed, 72 insertions(+), 98 deletions(-) diff --git a/examples/body/in.squares b/examples/body/in.squares index 146ba497e6..c812b4e0be 100755 --- a/examples/body/in.squares +++ b/examples/body/in.squares @@ -1,9 +1,9 @@ # 2d rounded polygon bodies -variable r index 3 +variable r index 4 variable steps index 100000 variable T index 0.5 -variable P index 0.2 +variable P index 0.1 variable seed index 980411 units lj @@ -48,9 +48,7 @@ dump 1 all local 100000 dump.polygon.* index c_1[1] c_1[2] c_1[3] c_1[4] thermo_style custom step ke pe etotal press thermo 1000 -restart 100000 restart1.bin restart2.bin - #dump 2 all image 10000 image.*.jpg type type zoom 2.0 adiam 1.5 body yes 0 0 #dump_modify 2 pad 6 -run ${steps} +run ${steps} diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index d0690335df..4c65f69530 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -123,7 +123,7 @@ void PairBodyRoundedPolyhedron::compute(int eflag, int vflag) int i,j,ii,jj,inum,jnum,itype,jtype; int ni,nj,npi,npj,ifirst,jfirst,nei,nej,iefirst,jefirst; double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,facc[3]; - double rsq,eradi,eradj,k_nij,k_naij; + double rsq,eradi,eradj; int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; @@ -215,9 +215,6 @@ void PairBodyRoundedPolyhedron::compute(int eflag, int vflag) nej = ednum[j]; jefirst = edfirst[j]; eradj = enclosing_radius[j]; - - k_nij = k_n[itype][jtype]; - k_naij = k_na[itype][jtype]; // no interaction @@ -227,8 +224,8 @@ void PairBodyRoundedPolyhedron::compute(int eflag, int vflag) // sphere-sphere interaction if (npi == 1 && npj == 1) { - sphere_against_sphere(i, j, delx, dely, delz, rsq, - k_nij, k_naij, v, f, evflag); + sphere_against_sphere(i, j, itype, jtype, delx, dely, delz, + rsq, v, f, evflag); continue; } @@ -265,15 +262,15 @@ void PairBodyRoundedPolyhedron::compute(int eflag, int vflag) // one of the two bodies is a sphere if (npj == 1) { - sphere_against_face(i, j, k_nij, k_naij, x, v, f, torque, + sphere_against_face(i, j, itype, jtype, x, v, f, torque, angmom, evflag); - sphere_against_edge(i, j, k_nij, k_naij, x, v, f, torque, + sphere_against_edge(i, j, itype, jtype, x, v, f, torque, angmom, evflag); continue; } else if (npi == 1) { - sphere_against_face(j, i, k_nij, k_naij, x, v, f, torque, + sphere_against_face(j, i, jtype, itype, x, v, f, torque, angmom, evflag); - sphere_against_edge(j, i, k_nij, k_naij, x, v, f, torque, + sphere_against_edge(j, i, jtype, itype, x, v, f, torque, angmom, evflag); continue; } @@ -287,21 +284,21 @@ void PairBodyRoundedPolyhedron::compute(int eflag, int vflag) #ifdef _POLYHEDRON_DEBUG printf("INTERACTION between edges of %d vs. faces of %d:\n", i, j); #endif - interact = edge_against_face(i, j, k_nij, k_naij, x, contact_list, + interact = edge_against_face(i, j, itype, jtype, x, contact_list, num_contacts, evdwl, facc); // check interaction between j's edges and i' faces #ifdef _POLYHEDRON_DEBUG printf("\nINTERACTION between edges of %d vs. faces of %d:\n", j, i); #endif - interact = edge_against_face(j, i, k_nij, k_naij, x, contact_list, + interact = edge_against_face(j, i, jtype, itype, x, contact_list, num_contacts, evdwl, facc); // check interaction between i's edges and j' edges #ifdef _POLYHEDRON_DEBUG printf("INTERACTION between edges of %d vs. edges of %d:\n", i, j); #endif - interact = edge_against_edge(i, j, k_nij, k_naij, x, contact_list, + interact = edge_against_edge(i, j, itype, jtype, x, contact_list, num_contacts, evdwl, facc); // estimate the contact area @@ -309,7 +306,7 @@ void PairBodyRoundedPolyhedron::compute(int eflag, int vflag) if (num_contacts > 0) { rescale_cohesive_forces(x, f, torque, contact_list, num_contacts, - k_nij, k_naij, facc); + itype, jtype, facc); } if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0.0, @@ -594,9 +591,8 @@ void PairBodyRoundedPolyhedron::body2space(int i) ---------------------------------------------------------------------- */ void PairBodyRoundedPolyhedron::sphere_against_sphere(int ibody, int jbody, - double delx, double dely, double delz, double rsq, - double k_n, double k_na, double** v, double** f, - int evflag) + int itype, int jtype, double delx, double dely, double delz, double rsq, + double** v, double** f, int evflag) { double rradi,rradj,contact_dist; double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; @@ -612,7 +608,7 @@ void PairBodyRoundedPolyhedron::sphere_against_sphere(int ibody, int jbody, R = rij - contact_dist; energy = 0; - kernel_force(R, k_n, k_na, energy, fpair); + kernel_force(R, itype, jtype, energy, fpair); /* if (R <= 0) { // deformation occurs fpair = -k_n * R - shift; @@ -686,9 +682,8 @@ void PairBodyRoundedPolyhedron::sphere_against_sphere(int ibody, int jbody, ---------------------------------------------------------------------- */ void PairBodyRoundedPolyhedron::sphere_against_edge(int ibody, int jbody, - double k_n, double k_na, double** x, double** v, - double** f, double** torque, double** angmom, - int evflag) + int itype, int jtype, double** x, double** v, double** f, double** torque, + double** angmom, int evflag) { int ni,nei,ifirst,iefirst,npi1,npi2,ibonus; double xi1[3],xi2[3],vti[3],h[3],fn[3],ft[3],d,t; @@ -760,7 +755,7 @@ void PairBodyRoundedPolyhedron::sphere_against_edge(int ibody, int jbody, R = rij - contact_dist; energy = 0; - kernel_force(R, k_n, k_na, energy, fpair); + kernel_force(R, itype, jtype, energy, fpair); /* if (R <= 0) { // deformation occurs fpair = -k_n * R - shift; @@ -844,9 +839,8 @@ void PairBodyRoundedPolyhedron::sphere_against_edge(int ibody, int jbody, ---------------------------------------------------------------------- */ void PairBodyRoundedPolyhedron::sphere_against_face(int ibody, int jbody, - double k_n, double k_na, double** x, double** v, - double** f, double** torque, double** angmom, - int evflag) + int itype, int jtype, double** x, double** v, double** f, double** torque, + double** angmom, int evflag) { int ni,nfi,inside,ifirst,iffirst,npi1,npi2,npi3,ibonus,tmp; double xi1[3],xi2[3],xi3[3],ui[3],vi[3],vti[3],n[3],h[3],fn[3],ft[3],d; @@ -913,7 +907,7 @@ void PairBodyRoundedPolyhedron::sphere_against_face(int ibody, int jbody, R = rij - contact_dist; energy = 0; - kernel_force(R, k_n, k_na, energy, fpair); + kernel_force(R, itype, jtype, energy, fpair); /* if (R <= 0) { // deformation occurs fpair = -k_n * R - shift; @@ -1009,8 +1003,8 @@ void PairBodyRoundedPolyhedron::sphere_against_face(int ibody, int jbody, ---------------------------------------------------------------------- */ int PairBodyRoundedPolyhedron::edge_against_edge(int ibody, int jbody, - double k_n, double k_na, double** x, Contact* contact_list, - int &num_contacts, double &evdwl, double* facc) + int itype, int jtype, double** x, Contact* contact_list, int &num_contacts, + double &evdwl, double* facc) { int ni,nei,nj,nej,contact,interact; double rradi,rradj,energy; @@ -1037,7 +1031,7 @@ int PairBodyRoundedPolyhedron::edge_against_edge(int ibody, int jbody, interact = interaction_edge_to_edge(ibody, ni, x[ibody], rradi, jbody, nj, x[jbody], rradj, - k_n, k_na, cut_inner, + itype, jtype, cut_inner, contact_list, num_contacts, energy, facc); } @@ -1065,8 +1059,8 @@ int PairBodyRoundedPolyhedron::edge_against_edge(int ibody, int jbody, ---------------------------------------------------------------------- */ int PairBodyRoundedPolyhedron::edge_against_face(int ibody, int jbody, - double k_n, double k_na, double** x, Contact* contact_list, - int &num_contacts, double &evdwl, double* facc) + int itype, int jtype, double** x, Contact* contact_list, int &num_contacts, + double &evdwl, double* facc) { int ni,nei,nj,nfj,contact,interact; double rradi,rradj,energy; @@ -1095,7 +1089,7 @@ int PairBodyRoundedPolyhedron::edge_against_face(int ibody, int jbody, interact = interaction_face_to_edge(jbody, nj, x[jbody], rradj, ibody, ni, x[ibody], rradi, - k_n, k_na, cut_inner, + itype, jtype, cut_inner, contact_list, num_contacts, energy, facc); } @@ -1132,20 +1126,10 @@ int PairBodyRoundedPolyhedron::edge_against_face(int ibody, int jbody, ------------------------------------------------------------------------- */ int PairBodyRoundedPolyhedron::interaction_edge_to_edge(int ibody, - int edge_index_i, - double *xmi, - double rounded_radius_i, - int jbody, - int edge_index_j, - double *xmj, - double rounded_radius_j, - double k_n, - double k_na, - double cut_inner, - Contact* contact_list, - int &num_contacts, - double &energy, - double* facc) + int edge_index_i, double *xmi, double rounded_radius_i, + int jbody, int edge_index_j, double *xmj, double rounded_radius_j, + int itype, int jtype, double cut_inner, + Contact* contact_list, int &num_contacts, double &energy, double* facc) { int ifirst,iefirst,jfirst,jefirst,npi1,npi2,npj1,npj2,interact; double xi1[3],xi2[3],xpj1[3],xpj2[3]; @@ -1219,7 +1203,7 @@ int PairBodyRoundedPolyhedron::interaction_edge_to_edge(int ibody, if (t1 >= 0 && t1 <= 1 && t2 >= 0 && t2 <= 1 && r < contact_dist + cut_inner) { pair_force_and_torque(jbody, ibody, h1, h2, r, contact_dist, - k_n, k_na, x, v, f, torque, angmom, + jtype, itype, x, v, f, torque, angmom, jflag, energy, facc); interact = EE_INTERACT; @@ -1270,20 +1254,10 @@ int PairBodyRoundedPolyhedron::interaction_edge_to_edge(int ibody, ------------------------------------------------------------------------- */ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, - int face_index, - double *xmi, - double rounded_radius_i, - int jbody, - int edge_index, - double *xmj, - double rounded_radius_j, - double k_n, - double k_na, - double cut_inner, - Contact* contact_list, - int &num_contacts, - double &energy, - double* facc) + int face_index, double *xmi, double rounded_radius_i, + int jbody, int edge_index, double *xmj, double rounded_radius_j, + int itype, int jtype, double cut_inner, + Contact* contact_list, int &num_contacts, double &energy, double* facc) { if (face_index >= facnum[ibody]) return EF_INVALID; @@ -1397,7 +1371,7 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, if (inside1) { if (static_cast(discrete[jfirst+npj1][6]) == 0) { pair_force_and_torque(jbody, ibody, xpj1, hi1, d1, contact_dist, - k_n, k_na, x, v, f, torque, angmom, + jtype, itype, x, v, f, torque, angmom, jflag, energy, facc); #ifdef _POLYHEDRON_DEBUG printf(" - compute pair force between vertex %d from edge %d of body %d " @@ -1436,7 +1410,7 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, if (inside2) { if (static_cast(discrete[jfirst+npj2][6]) == 0) { pair_force_and_torque(jbody, ibody, xpj2, hi2, d2, contact_dist, - k_n, k_na, x, v, f, torque, angmom, + jtype, itype, x, v, f, torque, angmom, jflag, energy, facc); #ifdef _POLYHEDRON_DEBUG printf(" - compute pair force between vertex %d from edge %d of body %d " @@ -1502,11 +1476,11 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, int jflag = 1; if (d1 < d2) pair_force_and_torque(jbody, ibody, xpj1, hi1, d1, contact_dist, - k_n, k_na, x, v, f, torque, angmom, + jtype, itype, x, v, f, torque, angmom, jflag, energy, facc); else pair_force_and_torque(jbody, ibody, xpj2, hi2, d2, contact_dist, - k_n, k_na, x, v, f, torque, angmom, + jtype, itype, x, v, f, torque, angmom, jflag, energy, facc); } @@ -1520,7 +1494,7 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, void PairBodyRoundedPolyhedron::pair_force_and_torque(int ibody, int jbody, double* pi, double* pj, double r, double contact_dist, - double k_n, double k_na, double** x, + int itype, int jtype, double** x, double** v, double** f, double** torque, double** angmom, int jflag, double& energy, double* facc) { @@ -1531,7 +1505,7 @@ void PairBodyRoundedPolyhedron::pair_force_and_torque(int ibody, int jbody, delz = pi[2] - pj[2]; R = r - contact_dist; - kernel_force(R, k_n, k_na, energy, fpair); + kernel_force(R, itype, jtype, energy, fpair); /* if (R <= 0) { // deformation occurs fpair = -k_n * R - shift; @@ -1583,17 +1557,19 @@ void PairBodyRoundedPolyhedron::pair_force_and_torque(int ibody, int jbody, here is the harmonic potential (linear piece-wise forces) in Wang et al. ------------------------------------------------------------------------- */ -void PairBodyRoundedPolyhedron::kernel_force(double R, double k_n, double k_na, +void PairBodyRoundedPolyhedron::kernel_force(double R, int itype, int jtype, double& energy, double& fpair) { - double shift = k_na * cut_inner; + double kn = k_n[itype][jtype]; + double kna = k_na[itype][jtype]; + double shift = kna * cut_inner; double e = 0; if (R <= 0) { // deformation occurs - fpair = -k_n * R - shift; - e = (0.5 * k_n * R + shift) * R; + fpair = -kn * R - shift; + e = (0.5 * kn * R + shift) * R; } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap - fpair = k_na * R - shift; - e = (-0.5 * k_na * R + shift) * R; + fpair = kna * R - shift; + e = (-0.5 * kna * R + shift) * R; } else fpair = 0.0; energy += e; } @@ -1710,7 +1686,7 @@ void PairBodyRoundedPolyhedron::contact_forces(int ibody, int jbody, void PairBodyRoundedPolyhedron::rescale_cohesive_forces(double** x, double** f, double** torque, Contact* contact_list, int &num_contacts, - double k_n, double k_na, double* facc) + int itype, int jtype, double* facc) { int m,ibody,jbody; double delx,dely,delz,fx,fy,fz,R,fpair,r,contact_area; @@ -1766,7 +1742,7 @@ void PairBodyRoundedPolyhedron::rescale_cohesive_forces(double** x, R = contact_list[m].separation; double energy = 0; - kernel_force(R, k_n, k_na, energy, fpair); + kernel_force(R, itype, jtype, energy, fpair); /* if (R <= 0) { // deformation occurs fpair = -k_n * R - shift; diff --git a/src/BODY/pair_body_rounded_polyhedron.h b/src/BODY/pair_body_rounded_polyhedron.h index f59faf9ba6..71c04ff966 100644 --- a/src/BODY/pair_body_rounded_polyhedron.h +++ b/src/BODY/pair_body_rounded_polyhedron.h @@ -34,7 +34,7 @@ class PairBodyRoundedPolyhedron : public Pair { void init_style(); double init_one(int, int); - virtual void kernel_force(double R, double k_n, double k_na, + virtual void kernel_force(double R, int itype, int jtype, double& energy, double& fpair); struct Contact { @@ -88,23 +88,23 @@ class PairBodyRoundedPolyhedron : public Pair { void body2space(int); // sphere-sphere interaction - void sphere_against_sphere(int ibody, int jbody, double delx, double dely, double delz, - double rsq, double k_n, double k_na, + void sphere_against_sphere(int ibody, int jbody, int itype, int jtype, + double delx, double dely, double delz, double rsq, double** v, double** f, int evflag); // sphere-edge interaction - void sphere_against_edge(int ibody, int jbody, - double k_n, double k_na, double** x, double** v, - double** f, double** torque, double** angmom, int evflag); + void sphere_against_edge(int ibody, int jbody, int itype, int jtype, + double** x, double** v, double** f, double** torque, + double** angmom, int evflag); // sphere-face interaction - void sphere_against_face(int ibody, int jbody, - double k_n, double k_na, double** x, double** v, - double** f, double** torque, double** angmom, int evflag); + void sphere_against_face(int ibody, int jbody, int itype, int jtype, + double** x, double** v, double** f, double** torque, + double** angmom, int evflag); // edge-edge interactions - int edge_against_edge(int ibody, int jbody, double k_n, double k_na, + int edge_against_edge(int ibody, int jbody, int itype, int jtype, double** x,Contact* contact_list, int &num_contacts, double &evdwl, double* facc); // edge-face interactions - int edge_against_face(int ibody, int jbody, double k_n, double k_na, + int edge_against_face(int ibody, int jbody, int itype, int jtype, double** x, Contact* contact_list, int &num_contacts, double &evdwl, double* facc); @@ -112,14 +112,14 @@ class PairBodyRoundedPolyhedron : public Pair { int interaction_face_to_edge(int ibody, int face_index, double* xmi, double rounded_radius_i, int jbody, int edge_index, double* xmj, double rounded_radius_j, - double k_n, double k_na, double cut_inner, + int itype, int jtype, double cut_inner, Contact* contact_list, int &num_contacts, double& energy, double* facc); // an edge vs. an edge from another body int interaction_edge_to_edge(int ibody, int edge_index_i, double* xmi, double rounded_radius_i, int jbody, int edge_index_j, double* xmj, double rounded_radius_j, - double k_n, double k_na, double cut_inner, + int itype, int jtype, double cut_inner, Contact* contact_list, int &num_contacts, double& energy, double* facc); @@ -131,14 +131,14 @@ class PairBodyRoundedPolyhedron : public Pair { // compute force and torque between two bodies given a pair of interacting points void pair_force_and_torque(int ibody, int jbody, double* pi, double* pj, - double r, double contact_dist, double k_n, - double k_na, double** x, double** v, - double** f, double** torque, double** angmom, - int jflag, double& energy, double* facc); + double r, double contact_dist, int itype, int jtype, + double** x, double** v, double** f, double** torque, + double** angmom, int jflag, double& energy, double* facc); + // rescale the cohesive forces if a contact area is detected void rescale_cohesive_forces(double** x, double** f, double** torque, Contact* contact_list, int &num_contacts, - double k_n, double k_na, double* facc); + int itype, int jtype, double* facc); // compute the separation between two contacts double contact_separation(const Contact& c1, const Contact& c2); From 1fbd4fffd41e5e997fff63deb969eb89e1ed4fe1 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 29 May 2018 23:50:43 -0500 Subject: [PATCH 013/123] Updated rounded/polygon example --- examples/body/data.squares | 8 ++++---- examples/body/in.squares | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/body/data.squares b/examples/body/data.squares index 55a3dd09a0..6b198fd422 100755 --- a/examples/body/data.squares +++ b/examples/body/data.squares @@ -2,14 +2,14 @@ LAMMPS data file for polygons: squares of edge length L: Izz = 1/6mL^2 2 atoms 2 bodies 1 atom types --6 6 xlo xhi --6 6 ylo yhi +0 12 xlo xhi +0 12 ylo yhi -0.5 0.5 zlo zhi Atoms -1 1 1 1 0 0 0 -2 1 1 1 5 1 0 +1 1 1 1 4 5 0 +2 1 1 1 9 6 0 Bodies diff --git a/examples/body/in.squares b/examples/body/in.squares index c812b4e0be..8f949f2cdf 100755 --- a/examples/body/in.squares +++ b/examples/body/in.squares @@ -38,7 +38,7 @@ timestep 0.001 #fix 1 all nve/body #fix 1 all nvt/body temp $T $T 1.0 fix 1 all npt/body temp $T $T 1.0 x 0.001 $P 1.0 & - y 0.001 $P 1.0 couple xy + y 0.001 $P 1.0 couple xy fixedpoint 0 0 0 fix 2 all enforce2d From f5e9b1e021e57b0bc7c81a68964915aee623c9ca Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 29 May 2018 23:59:58 -0500 Subject: [PATCH 014/123] Added example input for fix wall rounded/polygon --- examples/body/in.squares | 4 +-- examples/body/in.wall2d | 56 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100755 examples/body/in.wall2d diff --git a/examples/body/in.squares b/examples/body/in.squares index 8f949f2cdf..f771c15381 100755 --- a/examples/body/in.squares +++ b/examples/body/in.squares @@ -20,8 +20,8 @@ velocity all create $T ${seed} dist gaussian mom yes rot yes variable cut_inner equal 0.5 variable k_n equal 100 variable k_na equal 2 -variable c_n equal 0.1 -variable c_t equal 0.1 +variable c_n equal 1 +variable c_t equal 1 variable mu equal 0.1 variable delta_ua equal 0.5 diff --git a/examples/body/in.wall2d b/examples/body/in.wall2d new file mode 100755 index 0000000000..19788a9dcd --- /dev/null +++ b/examples/body/in.wall2d @@ -0,0 +1,56 @@ +# 2d rounded polygon bodies + +variable r index 4 +variable steps index 100000 +variable T index 0.5 +variable P index 0.1 +variable seed index 980411 + +units lj +dimension 2 + +atom_style body rounded/polygon 1 6 +atom_modify map array +read_data data.squares + +replicate $r $r 1 + +velocity all create $T ${seed} dist gaussian mom yes rot yes + +change_box all boundary p f p + +variable cut_inner equal 0.5 +variable k_n equal 100 +variable k_na equal 2 +variable c_n equal 0.1 +variable c_t equal 0.1 +variable mu equal 0.1 +variable delta_ua equal 0.5 + +pair_style body/rounded/polygon ${c_n} ${c_t} ${mu} ${delta_ua} ${cut_inner} +pair_coeff * * ${k_n} ${k_na} + +comm_modify vel yes + +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.001 + +#fix 1 all nve/body +#fix 1 all nvt/body temp $T $T 1.0 +fix 1 all npt/body temp $T $T 1.0 x 0.001 $P 1.0 fixedpoint 0 0 0 + +fix 2 all enforce2d +fix 3 all wall/body/polygon 2000 50 50 yplane 0.0 48.0 + +compute 1 all body/local id 1 2 3 +dump 1 all local 100000 dump.polygon.* index c_1[1] c_1[2] c_1[3] c_1[4] + +thermo_style custom step ke pe etotal press +thermo 1000 + +#dump 2 all image 10000 image.*.jpg type type zoom 2.0 adiam 1.5 body yes 0 0 +#dump_modify 2 pad 6 + +run ${steps} From 82b1ab2ac4b522d4b04db558b8959428873d01f0 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Wed, 30 May 2018 00:04:48 -0500 Subject: [PATCH 015/123] Cleaned up pair body rounded/polyhedron --- src/BODY/fix_wall_body_polygon.cpp | 2 +- src/BODY/fix_wall_body_polyhedron.cpp | 2 +- src/BODY/pair_body_rounded_polyhedron.cpp | 44 ----------------------- 3 files changed, 2 insertions(+), 46 deletions(-) diff --git a/src/BODY/fix_wall_body_polygon.cpp b/src/BODY/fix_wall_body_polygon.cpp index ea81ae26df..72a60b22d0 100644 --- a/src/BODY/fix_wall_body_polygon.cpp +++ b/src/BODY/fix_wall_body_polygon.cpp @@ -12,7 +12,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing authors: Trung Dac Nguyen (ndactrung@gmail.com) + Contributing author: Trung Dac Nguyen (ndactrung@gmail.com) ------------------------------------------------------------------------- */ #include diff --git a/src/BODY/fix_wall_body_polyhedron.cpp b/src/BODY/fix_wall_body_polyhedron.cpp index 4806da9673..879289ea42 100644 --- a/src/BODY/fix_wall_body_polyhedron.cpp +++ b/src/BODY/fix_wall_body_polyhedron.cpp @@ -12,7 +12,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing authors: Trung Dac Nguyen (ndactrung@gmail.com) + Contributing author: Trung Dac Nguyen (ndactrung@gmail.com) ------------------------------------------------------------------------- */ #include diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index 4c65f69530..96307a0ab1 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -609,15 +609,6 @@ void PairBodyRoundedPolyhedron::sphere_against_sphere(int ibody, int jbody, energy = 0; kernel_force(R, itype, jtype, energy, fpair); -/* - if (R <= 0) { // deformation occurs - fpair = -k_n * R - shift; - energy = (0.5 * k_n * R + shift) * R; - } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap - fpair = k_na * R - shift; - energy = (-0.5 * k_na * R + shift) * R; - } else fpair = 0.0; -*/ fx = delx*fpair/rij; fy = dely*fpair/rij; @@ -756,16 +747,6 @@ void PairBodyRoundedPolyhedron::sphere_against_edge(int ibody, int jbody, energy = 0; kernel_force(R, itype, jtype, energy, fpair); -/* - if (R <= 0) { // deformation occurs - fpair = -k_n * R - shift; - energy = (0.5 * k_n * R + shift) * R; - } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap - fpair = k_na * R - shift; - energy = (-0.5 * k_na * R + shift) * R; - } else fpair = 0.0; -*/ - fx = delx*fpair/rij; fy = dely*fpair/rij; @@ -908,15 +889,6 @@ void PairBodyRoundedPolyhedron::sphere_against_face(int ibody, int jbody, energy = 0; kernel_force(R, itype, jtype, energy, fpair); -/* - if (R <= 0) { // deformation occurs - fpair = -k_n * R - shift; - energy = (0.5 * k_n * R + shift) * R; - } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap - fpair = k_na * R - shift; - energy = (-0.5 * k_na * R + shift) * R; - } else fpair = 0.0; -*/ fx = delx*fpair/rij; fy = dely*fpair/rij; @@ -1506,15 +1478,6 @@ void PairBodyRoundedPolyhedron::pair_force_and_torque(int ibody, int jbody, R = r - contact_dist; kernel_force(R, itype, jtype, energy, fpair); -/* - if (R <= 0) { // deformation occurs - fpair = -k_n * R - shift; - energy += (0.5 * k_n * R + shift) * R; - } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap - fpair = k_na * R - shift; - energy += (-0.5 * k_na * R + shift) * R; - } else fpair = 0.0; -*/ fx = delx*fpair/r; fy = dely*fpair/r; @@ -1743,13 +1706,6 @@ void PairBodyRoundedPolyhedron::rescale_cohesive_forces(double** x, double energy = 0; kernel_force(R, itype, jtype, energy, fpair); -/* - if (R <= 0) { // deformation occurs - fpair = -k_n * R - shift; - } else if (R <= cut_inner) { // not deforming but cohesive ranges overlap - fpair = k_na * R - shift; - } else fpair = 0.0; -*/ fpair *= j_a; fx = delx*fpair/r; From 1ee85e59c3f25bb9fb70c8c703417cbac6b818bc Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Fri, 1 Jun 2018 14:50:41 -0400 Subject: [PATCH 016/123] Removed obsolete changes to fix_nve-manifold_rattle --- src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp b/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp index 543d49278d..4dcc3f9704 100644 --- a/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp +++ b/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp @@ -513,6 +513,7 @@ void FixNVEManifoldRattle::rattle_manifold_x(double *x, double *v, const double c_inv = 1.0 / c; + while ( 1 ) { v[0] = vt[0] - l*no_dt[0]; v[1] = vt[1] - l*no_dt[1]; @@ -650,10 +651,10 @@ void FixNVEManifoldRattle::rattle_manifold_v(double *v, double *f, }while( (res > tolerance) && (iters < max_iter) ); if( iters >= max_iter && res >= tolerance ){ - char msg[2048]; - sprintf(msg,"Failed to constrain atom %d (x = (%f, %f, %f)! res = %e, iters = %d\n", - tagi, x[0], x[1], x[2], res, iters); - error->all(FLERR,msg); + char msg[2048]; + sprintf(msg,"Failed to constrain atom %d (x = (%f, %f, %f)! res = %e, iters = %d\n", + tagi, x[0], x[1], x[2], res, iters); + error->all(FLERR,msg); } stats.v_iters += iters; From 962946ee45df30722b1288afde0f7be334049842 Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Fri, 1 Jun 2018 14:52:34 -0400 Subject: [PATCH 017/123] Ported fix enforce2d to Kokkos. --- doc/src/fix_enforce2d.txt | 1 + src/KOKKOS/fix_enforce2d_kokkos.cpp | 102 ++++++++++++++++++++++++++++ src/KOKKOS/fix_enforce2d_kokkos.h | 92 +++++++++++++++++++++++++ 3 files changed, 195 insertions(+) create mode 100644 src/KOKKOS/fix_enforce2d_kokkos.cpp create mode 100644 src/KOKKOS/fix_enforce2d_kokkos.h diff --git a/doc/src/fix_enforce2d.txt b/doc/src/fix_enforce2d.txt index 5d04e96677..01840254b6 100644 --- a/doc/src/fix_enforce2d.txt +++ b/doc/src/fix_enforce2d.txt @@ -7,6 +7,7 @@ :line fix enforce2d command :h3 +fix enforce2d/kk command :h3 [Syntax:] diff --git a/src/KOKKOS/fix_enforce2d_kokkos.cpp b/src/KOKKOS/fix_enforce2d_kokkos.cpp new file mode 100644 index 0000000000..b5fb964ea8 --- /dev/null +++ b/src/KOKKOS/fix_enforce2d_kokkos.cpp @@ -0,0 +1,102 @@ +/* -*- 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. +------------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + Contributing authors: Stefan Paquay (Brandeis University) +------------------------------------------------------------------------- */ + +#include "atom_masks.h" +#include "atom_kokkos.h" +#include "fix_enforce2d_kokkos.h" + +using namespace LAMMPS_NS; + + +template +FixEnforce2DKokkos::FixEnforce2DKokkos(LAMMPS *lmp, int narg, char **arg) : + FixEnforce2D(lmp, narg, arg) +{ + kokkosable = 1; + atomKK = (AtomKokkos *) atom; + execution_space = ExecutionSpaceFromDevice::space; + + datamask_read = X_MASK | V_MASK | F_MASK | MASK_MASK; + datamask_modify = X_MASK | V_MASK | F_MASK; +} + + +template +void FixEnforce2DKokkos::setup(int vflag) +{ + post_force(vflag); +} + + +template +void FixEnforce2DKokkos::post_force(int vflag) +{ + atomKK->sync(execution_space,datamask_read); + atomKK->modified(execution_space,datamask_modify); + + x = atomKK->k_x.view(); + v = atomKK->k_v.view(); + f = atomKK->k_f.view(); + + mask = atomKK->k_mask.view(); + + int nlocal = atomKK->nlocal; + if (igroup == atomKK->firstgroup) nlocal = atomKK->nfirst; + + FixEnforce2DKokkosPostForceFunctor functor(this); + Kokkos::parallel_for(nlocal,functor); + + // Probably sync here again? + atomKK->sync(execution_space,datamask_read); + atomKK->modified(execution_space,datamask_modify); + + for (int m = 0; m < nfixlist; m++) + flist[m]->enforce2d(); + + +} + + +template +void FixEnforce2DKokkos::post_force_item( int i ) const +{ + + if (mask[i] & groupbit){ + v(i,2) = 0; + x(i,2) = 0; + f(i,2) = 0; + + // Add for omega, angmom, torque... + } + +} + + +template +void FixEnforce2DKokkos::cleanup_copy() +{ + id = style = NULL; + vatom = NULL; +} + + +namespace LAMMPS_NS { +template class FixEnforce2DKokkos; +#ifdef KOKKOS_HAVE_CUDA +template class FixEnforce2DKokkos; +#endif +} diff --git a/src/KOKKOS/fix_enforce2d_kokkos.h b/src/KOKKOS/fix_enforce2d_kokkos.h new file mode 100644 index 0000000000..11cb213210 --- /dev/null +++ b/src/KOKKOS/fix_enforce2d_kokkos.h @@ -0,0 +1,92 @@ +/* -*- 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 FIX_CLASS + +FixStyle(enforce2d/kk,FixEnforce2DKokkos) +FixStyle(enforce2d/kk/device,FixEnforce2DKokkos) +FixStyle(enforce2d/kk/host,FixEnforce2DKokkos) + +#else + +#ifndef LMP_FIX_ENFORCE2D_KOKKOS_H +#define LMP_FIX_ENFORCE2D_KOKKOS_H + +#include "fix_enforce2d.h" +#include "kokkos_type.h" + +namespace LAMMPS_NS { + +template +class FixEnforce2DKokkos : public FixEnforce2D { + public: + FixEnforce2DKokkos(class LAMMPS *, int, char **); + // ~FixEnforce2DKokkos() {} + // void init(); + void cleanup_copy(); + void setup(int); + void post_force(int); + + KOKKOS_INLINE_FUNCTION + void post_force_item(int) const; + + // void min_setup(int); Kokkos does not support minimization (yet) + // void min_post_force(int); Kokkos does not support minimization (yet) + // void post_force_respa(int, int, int); No RRESPA support yet. + + private: + + typename ArrayTypes::t_x_array x; + typename ArrayTypes::t_v_array v; + typename ArrayTypes::t_f_array f; + + typename ArrayTypes::t_int_1d mask; +}; + + +template +struct FixEnforce2DKokkosPostForceFunctor { + typedef DeviceType device_type; + FixEnforce2DKokkos c; + + FixEnforce2DKokkosPostForceFunctor(FixEnforce2DKokkos* c_ptr): + c(*c_ptr) {c.cleanup_copy();}; + KOKKOS_INLINE_FUNCTION + void operator()(const int i) const { + c.post_force_item(i); + } +}; + + +} + +#endif +#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: Cannot use fix enforce2d with 3d simulation + +Self-explanatory. + +E: Fix enforce2d must be defined after fix %s + +UNDOCUMENTED + +*/ From 031077b4fa2c62d59da6720b68c7dd633eb87377 Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Fri, 1 Jun 2018 17:19:53 -0400 Subject: [PATCH 018/123] Made enforce2d also set rotations to in-plane. --- src/KOKKOS/fix_enforce2d_kokkos.cpp | 104 ++++++++++++++++++++++++---- src/KOKKOS/fix_enforce2d_kokkos.h | 15 ++-- 2 files changed, 102 insertions(+), 17 deletions(-) diff --git a/src/KOKKOS/fix_enforce2d_kokkos.cpp b/src/KOKKOS/fix_enforce2d_kokkos.cpp index b5fb964ea8..88291ead6e 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.cpp +++ b/src/KOKKOS/fix_enforce2d_kokkos.cpp @@ -12,13 +12,16 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing authors: Stefan Paquay (Brandeis University) + Contributing authors: Stefan Paquay & Matthew Peterson (Brandeis University) ------------------------------------------------------------------------- */ #include "atom_masks.h" #include "atom_kokkos.h" +#include "comm.h" +#include "error.h" #include "fix_enforce2d_kokkos.h" + using namespace LAMMPS_NS; @@ -30,14 +33,21 @@ FixEnforce2DKokkos::FixEnforce2DKokkos(LAMMPS *lmp, int narg, char * atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; - datamask_read = X_MASK | V_MASK | F_MASK | MASK_MASK; - datamask_modify = X_MASK | V_MASK | F_MASK; + datamask_read = X_MASK | V_MASK | F_MASK | OMEGA_MASK | MASK_MASK; + /* TORQUE_MASK | ANGMOM_MASK | */ // MASK_MASK; + + datamask_modify = X_MASK | V_MASK | F_MASK | OMEGA_MASK; // | + /* TORQUE_MASK | ANGMOM_MASK */ ; } template void FixEnforce2DKokkos::setup(int vflag) { + if( comm->me == 0 ){ + fprintf(screen, "omega, angmom and torque flags are %d, %d, %d\n", + atomKK->omega_flag, atomKK->angmom_flag, atomKK->torque_flag ); + } post_force(vflag); } @@ -52,13 +62,71 @@ void FixEnforce2DKokkos::post_force(int vflag) v = atomKK->k_v.view(); f = atomKK->k_f.view(); + if( atomKK->omega_flag ) + omega = atomKK->k_omega.view(); + + if( atomKK->angmom_flag ) + angmom = atomKK->k_angmom.view(); + + if( atomKK->torque_flag ) + torque = atomKK->k_torque.view(); + + mask = atomKK->k_mask.view(); int nlocal = atomKK->nlocal; if (igroup == atomKK->firstgroup) nlocal = atomKK->nfirst; - FixEnforce2DKokkosPostForceFunctor functor(this); - Kokkos::parallel_for(nlocal,functor); + int flag_mask = 0; + if( atomKK->omega_flag ) flag_mask |= 1; + if( atomKK->angmom_flag ) flag_mask |= 2; + if( atomKK->torque_flag ) flag_mask |= 4; + + switch( flag_mask ){ + case 0:{ + FixEnforce2DKokkosPostForceFunctor functor(this); + Kokkos::parallel_for(nlocal,functor); + break; + } + case 1:{ + FixEnforce2DKokkosPostForceFunctor functor(this); + Kokkos::parallel_for(nlocal,functor); + break; + } + case 2:{ + FixEnforce2DKokkosPostForceFunctor functor(this); + Kokkos::parallel_for(nlocal,functor); + break; + } + case 3:{ + FixEnforce2DKokkosPostForceFunctor functor(this); + Kokkos::parallel_for(nlocal,functor); + break; + } + case 4:{ + FixEnforce2DKokkosPostForceFunctor functor(this); + Kokkos::parallel_for(nlocal,functor); + break; + } + case 5:{ + FixEnforce2DKokkosPostForceFunctor functor(this); + Kokkos::parallel_for(nlocal,functor); + break; + } + case 6:{ + FixEnforce2DKokkosPostForceFunctor functor(this); + Kokkos::parallel_for(nlocal,functor); + break; + } + case 7:{ + FixEnforce2DKokkosPostForceFunctor functor(this); + Kokkos::parallel_for(nlocal,functor); + break; + } + default: + error->all(FLERR, "flag_mask outside of what it should be"); + } + // Probably sync here again? atomKK->sync(execution_space,datamask_read); @@ -66,23 +134,33 @@ void FixEnforce2DKokkos::post_force(int vflag) for (int m = 0; m < nfixlist; m++) flist[m]->enforce2d(); - - } template +template void FixEnforce2DKokkos::post_force_item( int i ) const { - if (mask[i] & groupbit){ - v(i,2) = 0; - x(i,2) = 0; - f(i,2) = 0; + // x(i,2) = 0; // Enforce2d does not set x[2] to zero either... :/ + v(i,2) = 0.0; + f(i,2) = 0.0; - // Add for omega, angmom, torque... + if(omega_flag){ + omega(i,0) = 0.0; + omega(i,1) = 0.0; + } + + if(angmom_flag){ + angmom(i,0) = 0.0; + angmom(i,1) = 0.0; + } + + if(torque_flag){ + torque(i,0) = 0.0; + torque(i,1) = 0.0; + } } - } diff --git a/src/KOKKOS/fix_enforce2d_kokkos.h b/src/KOKKOS/fix_enforce2d_kokkos.h index 11cb213210..4130797f2c 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.h +++ b/src/KOKKOS/fix_enforce2d_kokkos.h @@ -37,8 +37,9 @@ class FixEnforce2DKokkos : public FixEnforce2D { void setup(int); void post_force(int); + template KOKKOS_INLINE_FUNCTION - void post_force_item(int) const; + void post_force_item(const int i) const; // void min_setup(int); Kokkos does not support minimization (yet) // void min_post_force(int); Kokkos does not support minimization (yet) @@ -50,20 +51,26 @@ class FixEnforce2DKokkos : public FixEnforce2D { typename ArrayTypes::t_v_array v; typename ArrayTypes::t_f_array f; + typename ArrayTypes::t_v_array omega; + typename ArrayTypes::t_v_array angmom; + typename ArrayTypes::t_f_array torque; + typename ArrayTypes::t_int_1d mask; }; -template -struct FixEnforce2DKokkosPostForceFunctor { +template +struct FixEnforce2DKokkosPostForceFunctor { typedef DeviceType device_type; FixEnforce2DKokkos c; FixEnforce2DKokkosPostForceFunctor(FixEnforce2DKokkos* c_ptr): c(*c_ptr) {c.cleanup_copy();}; + KOKKOS_INLINE_FUNCTION void operator()(const int i) const { - c.post_force_item(i); + // c.template? Really C++? + c.template post_force_item (i); } }; From 0e9691831321c8d2c4f03614b3076eaa34f48f2f Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Fri, 1 Jun 2018 17:22:25 -0400 Subject: [PATCH 019/123] Made enforce2d_kokkos actually set data masks. --- src/KOKKOS/fix_enforce2d_kokkos.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/KOKKOS/fix_enforce2d_kokkos.cpp b/src/KOKKOS/fix_enforce2d_kokkos.cpp index 88291ead6e..e9a42e5c31 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.cpp +++ b/src/KOKKOS/fix_enforce2d_kokkos.cpp @@ -33,11 +33,11 @@ FixEnforce2DKokkos::FixEnforce2DKokkos(LAMMPS *lmp, int narg, char * atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; - datamask_read = X_MASK | V_MASK | F_MASK | OMEGA_MASK | MASK_MASK; - /* TORQUE_MASK | ANGMOM_MASK | */ // MASK_MASK; + datamask_read = X_MASK | V_MASK | F_MASK | OMEGA_MASK | MASK_MASK + | TORQUE_MASK | ANGMOM_MASK; // | */ // MASK_MASK; - datamask_modify = X_MASK | V_MASK | F_MASK | OMEGA_MASK; // | - /* TORQUE_MASK | ANGMOM_MASK */ ; + datamask_modify = X_MASK | V_MASK | F_MASK | OMEGA_MASK + | TORQUE_MASK | ANGMOM_MASK; } From 824a21a661fe679fadaf3ef7f43e954a9e35e7a6 Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Mon, 4 Jun 2018 12:28:06 -0400 Subject: [PATCH 020/123] Removed debug printing from setup. --- src/KOKKOS/fix_enforce2d_kokkos.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/KOKKOS/fix_enforce2d_kokkos.cpp b/src/KOKKOS/fix_enforce2d_kokkos.cpp index e9a42e5c31..8ba68a0c0c 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.cpp +++ b/src/KOKKOS/fix_enforce2d_kokkos.cpp @@ -44,10 +44,6 @@ FixEnforce2DKokkos::FixEnforce2DKokkos(LAMMPS *lmp, int narg, char * template void FixEnforce2DKokkos::setup(int vflag) { - if( comm->me == 0 ){ - fprintf(screen, "omega, angmom and torque flags are %d, %d, %d\n", - atomKK->omega_flag, atomKK->angmom_flag, atomKK->torque_flag ); - } post_force(vflag); } From 4bf9a93c11c9f2baf4290dea63b6db6e7ad199cb Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Wed, 6 Jun 2018 10:47:07 -0400 Subject: [PATCH 021/123] Removed x dependency from enforce2d_kokkos. --- src/KOKKOS/fix_enforce2d_kokkos.cpp | 9 ++++++--- src/KOKKOS/fix_enforce2d_kokkos.h | 2 -- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/KOKKOS/fix_enforce2d_kokkos.cpp b/src/KOKKOS/fix_enforce2d_kokkos.cpp index 8ba68a0c0c..da33455978 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.cpp +++ b/src/KOKKOS/fix_enforce2d_kokkos.cpp @@ -33,10 +33,10 @@ FixEnforce2DKokkos::FixEnforce2DKokkos(LAMMPS *lmp, int narg, char * atomKK = (AtomKokkos *) atom; execution_space = ExecutionSpaceFromDevice::space; - datamask_read = X_MASK | V_MASK | F_MASK | OMEGA_MASK | MASK_MASK + datamask_read = V_MASK | F_MASK | OMEGA_MASK | MASK_MASK | TORQUE_MASK | ANGMOM_MASK; // | */ // MASK_MASK; - datamask_modify = X_MASK | V_MASK | F_MASK | OMEGA_MASK + datamask_modify = V_MASK | F_MASK | OMEGA_MASK | TORQUE_MASK | ANGMOM_MASK; } @@ -44,6 +44,10 @@ FixEnforce2DKokkos::FixEnforce2DKokkos(LAMMPS *lmp, int narg, char * template void FixEnforce2DKokkos::setup(int vflag) { + if( comm->me == 0 ){ + fprintf(screen, "omega, angmom and torque flags are %d, %d, %d\n", + atomKK->omega_flag, atomKK->angmom_flag, atomKK->torque_flag ); + } post_force(vflag); } @@ -54,7 +58,6 @@ void FixEnforce2DKokkos::post_force(int vflag) atomKK->sync(execution_space,datamask_read); atomKK->modified(execution_space,datamask_modify); - x = atomKK->k_x.view(); v = atomKK->k_v.view(); f = atomKK->k_f.view(); diff --git a/src/KOKKOS/fix_enforce2d_kokkos.h b/src/KOKKOS/fix_enforce2d_kokkos.h index 4130797f2c..d8a13d281f 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.h +++ b/src/KOKKOS/fix_enforce2d_kokkos.h @@ -46,8 +46,6 @@ class FixEnforce2DKokkos : public FixEnforce2D { // void post_force_respa(int, int, int); No RRESPA support yet. private: - - typename ArrayTypes::t_x_array x; typename ArrayTypes::t_v_array v; typename ArrayTypes::t_f_array f; From e08ccd0a7c62b71fa8cb8f3cd4f54b83ca2ed7de Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Fri, 29 Jun 2018 11:58:27 -0400 Subject: [PATCH 022/123] Forgot to include change in fix_enforce2d to access fixlist in kokkos port. --- src/fix_enforce2d.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fix_enforce2d.h b/src/fix_enforce2d.h index cdead78f6a..a3f79309dc 100644 --- a/src/fix_enforce2d.h +++ b/src/fix_enforce2d.h @@ -36,7 +36,7 @@ class FixEnforce2D : public Fix { void post_force_respa(int, int, int); void min_post_force(int); - private: + protected: int nfixlist; class Fix **flist; }; From 24405217d04153ba8eaf9d204d595e0a428cb6f7 Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Thu, 5 Jul 2018 11:20:27 -0400 Subject: [PATCH 023/123] Updated Install.sh in KOKKOS. --- src/KOKKOS/Install.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/KOKKOS/Install.sh b/src/KOKKOS/Install.sh index c6fab2a1b1..08c7468a49 100755 --- a/src/KOKKOS/Install.sh +++ b/src/KOKKOS/Install.sh @@ -93,6 +93,8 @@ action domain_kokkos.cpp action domain_kokkos.h action fix_deform_kokkos.cpp action fix_deform_kokkos.h +action fix_enforce2d_kokkos.cpp +action fix_enforce2d_kokkos.h action fix_eos_table_rx_kokkos.cpp fix_eos_table_rx.cpp action fix_eos_table_rx_kokkos.h fix_eos_table_rx.h action fix_langevin_kokkos.cpp From db75232957d5964f07df7dc6d1f774ca089fc3b8 Mon Sep 17 00:00:00 2001 From: Stefan Paquay Date: Fri, 6 Jul 2018 11:31:48 -0400 Subject: [PATCH 024/123] Removed debug print and comment. --- src/KOKKOS/fix_enforce2d_kokkos.cpp | 4 ---- src/KOKKOS/fix_enforce2d_kokkos.h | 1 - 2 files changed, 5 deletions(-) diff --git a/src/KOKKOS/fix_enforce2d_kokkos.cpp b/src/KOKKOS/fix_enforce2d_kokkos.cpp index da33455978..f2c313b2fe 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.cpp +++ b/src/KOKKOS/fix_enforce2d_kokkos.cpp @@ -44,10 +44,6 @@ FixEnforce2DKokkos::FixEnforce2DKokkos(LAMMPS *lmp, int narg, char * template void FixEnforce2DKokkos::setup(int vflag) { - if( comm->me == 0 ){ - fprintf(screen, "omega, angmom and torque flags are %d, %d, %d\n", - atomKK->omega_flag, atomKK->angmom_flag, atomKK->torque_flag ); - } post_force(vflag); } diff --git a/src/KOKKOS/fix_enforce2d_kokkos.h b/src/KOKKOS/fix_enforce2d_kokkos.h index d8a13d281f..ae8183acf1 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.h +++ b/src/KOKKOS/fix_enforce2d_kokkos.h @@ -67,7 +67,6 @@ struct FixEnforce2DKokkosPostForceFunctor { KOKKOS_INLINE_FUNCTION void operator()(const int i) const { - // c.template? Really C++? c.template post_force_item (i); } }; From 0c1dcfb617e9b0f4aeb3a38919d14b20ab09b357 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Fri, 6 Jul 2018 17:06:37 -0600 Subject: [PATCH 025/123] Favor copymode instead of cleanup_copy --- src/KOKKOS/fix_enforce2d_kokkos.cpp | 11 ++--------- src/KOKKOS/fix_enforce2d_kokkos.h | 3 +-- src/fix_enforce2d.cpp | 2 ++ 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/KOKKOS/fix_enforce2d_kokkos.cpp b/src/KOKKOS/fix_enforce2d_kokkos.cpp index f2c313b2fe..33aa39e2f6 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.cpp +++ b/src/KOKKOS/fix_enforce2d_kokkos.cpp @@ -77,6 +77,7 @@ void FixEnforce2DKokkos::post_force(int vflag) if( atomKK->angmom_flag ) flag_mask |= 2; if( atomKK->torque_flag ) flag_mask |= 4; + copymode = 1; switch( flag_mask ){ case 0:{ FixEnforce2DKokkosPostForceFunctor functor(this); @@ -121,7 +122,7 @@ void FixEnforce2DKokkos::post_force(int vflag) default: error->all(FLERR, "flag_mask outside of what it should be"); } - + copymode = 0; // Probably sync here again? atomKK->sync(execution_space,datamask_read); @@ -159,14 +160,6 @@ void FixEnforce2DKokkos::post_force_item( int i ) const } -template -void FixEnforce2DKokkos::cleanup_copy() -{ - id = style = NULL; - vatom = NULL; -} - - namespace LAMMPS_NS { template class FixEnforce2DKokkos; #ifdef KOKKOS_HAVE_CUDA diff --git a/src/KOKKOS/fix_enforce2d_kokkos.h b/src/KOKKOS/fix_enforce2d_kokkos.h index ae8183acf1..1ed3cf3ef8 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.h +++ b/src/KOKKOS/fix_enforce2d_kokkos.h @@ -33,7 +33,6 @@ class FixEnforce2DKokkos : public FixEnforce2D { FixEnforce2DKokkos(class LAMMPS *, int, char **); // ~FixEnforce2DKokkos() {} // void init(); - void cleanup_copy(); void setup(int); void post_force(int); @@ -63,7 +62,7 @@ struct FixEnforce2DKokkosPostForceFunctor { FixEnforce2DKokkos c; FixEnforce2DKokkosPostForceFunctor(FixEnforce2DKokkos* c_ptr): - c(*c_ptr) {c.cleanup_copy();}; + c(*c_ptr) {}; KOKKOS_INLINE_FUNCTION void operator()(const int i) const { diff --git a/src/fix_enforce2d.cpp b/src/fix_enforce2d.cpp index 4ffd2ca7ac..791a52c50c 100644 --- a/src/fix_enforce2d.cpp +++ b/src/fix_enforce2d.cpp @@ -38,6 +38,8 @@ FixEnforce2D::FixEnforce2D(LAMMPS *lmp, int narg, char **arg) : FixEnforce2D::~FixEnforce2D() { + if (copymode) return; + delete [] flist; } From 13338bf8cbfb7fcb047a43b39b49d6506b7e6e48 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Mon, 9 Jul 2018 16:15:15 -0600 Subject: [PATCH 026/123] small changes to Trung body files --- doc/src/body.txt | 162 ++++++++++---- doc/src/fix_wall_body_polygon.txt | 56 ++--- doc/src/fix_wall_body_polyhedron.txt | 39 ++-- doc/src/pair_body_rounded_polygon.txt | 91 +++++--- doc/src/pair_body_rounded_polyhedron.txt | 91 ++++++-- examples/body/in.cubes | 6 +- examples/body/in.pour3d | 2 +- examples/body/in.squares | 7 +- examples/body/in.wall2d | 7 +- examples/body/log.9Jul18.body.cubes.g++.1 | 125 +++++++++++ examples/body/log.9Jul18.body.cubes.g++.4 | 125 +++++++++++ examples/body/log.9Jul18.body.pour3d.g++.1 | 138 ++++++++++++ examples/body/log.9Jul18.body.squares.g++.1 | 221 +++++++++++++++++++ examples/body/log.9Jul18.body.squares.g++.4 | 221 +++++++++++++++++++ examples/body/log.9Jul18.body.wall2d.g++.1 | 223 ++++++++++++++++++++ examples/body/log.9Jul18.body.wall2d.g++.4 | 223 ++++++++++++++++++++ src/BODY/body_rounded_polygon.cpp | 4 +- src/BODY/body_rounded_polyhedron.cpp | 9 +- src/BODY/fix_wall_body_polygon.cpp | 7 +- src/BODY/fix_wall_body_polyhedron.cpp | 7 +- src/BODY/pair_body_rounded_polygon.cpp | 36 ++-- src/BODY/pair_body_rounded_polyhedron.cpp | 28 ++- 22 files changed, 1646 insertions(+), 182 deletions(-) create mode 100644 examples/body/log.9Jul18.body.cubes.g++.1 create mode 100644 examples/body/log.9Jul18.body.cubes.g++.4 create mode 100644 examples/body/log.9Jul18.body.pour3d.g++.1 create mode 100644 examples/body/log.9Jul18.body.squares.g++.1 create mode 100644 examples/body/log.9Jul18.body.squares.g++.4 create mode 100644 examples/body/log.9Jul18.body.wall2d.g++.1 create mode 100644 examples/body/log.9Jul18.body.wall2d.g++.4 diff --git a/doc/src/body.txt b/doc/src/body.txt index e936f5409c..c272f48ad1 100644 --- a/doc/src/body.txt +++ b/doc/src/body.txt @@ -36,7 +36,7 @@ thus how they can be used to compute pairwise body/body or bond/non-body (point particle) interactions. More details of each style are described below. -We hope to add more styles in the future. See "Section +More styles ma be added in the future. See "Section 10.12"_Section_modify.html#mod_12 for details on how to add a new body style to the code. @@ -59,7 +59,7 @@ the simple particles. By contrast, when body particles are used, LAMMPS treats an entire body as a single particle for purposes of computing pairwise interactions, building neighbor lists, migrating particles between -processors, outputting particles to a dump file, etc. This means that +processors, output of particles to a dump file, etc. This means that interactions between pairs of bodies or between a body and non-body (point) particle need to be encoded in an appropriate pair style. If such a pair style were to mimic the "fix rigid"_fix_rigid.html model, @@ -70,17 +70,20 @@ single body/body interaction was computed. Thus it only makes sense to use body particles and develop such a pair style, when particle/particle interactions are more complex than what the "fix rigid"_fix_rigid.html command can already calculate. For -example, if particles have one or more of the following attributes: +example, consider particles with one or more of the following +attributes: represented by a surface mesh represented by a collection of geometric entities (e.g. planes + spheres) deformable internal stress that induces fragmentation :ul -then the interaction between pairs of particles is likely to be more -complex than the summation of simple sub-particle interactions. An -example is contact or frictional forces between particles with planar -surfaces that inter-penetrate. +For these models, the interaction between pairs of particles is likely +to be more complex than the summation of simple pairwise interactions. +An example is contact or frictional forces between particles with +planar surfaces that inter-penetrate. Likewise, the body particle may +store internal state, such as a stress tensor used to compute a +fracture criterion. These are additional LAMMPS commands that can be used with body particles of different styles @@ -128,7 +131,9 @@ x1 y1 z1 ... xN yN zN :pre -N is the number of sub-particles in the body particle. M = 6 + 3*N. +where M = 6 + 3*N, and N is the number of sub-particles in the body +particle. + The integer line has a single value N. The floating point line(s) list 6 moments of inertia followed by the coordinates of the N sub-particles (x1 to zN) as 3N values. These values can be listed on @@ -173,13 +178,18 @@ The {bflag2} argument is ignored. [Specifics of body style rounded/polygon:] -The {rounded/polygon} body style represents body particles as -a polygon with a variable number N of vertices, which can only be -used for 2d models. Special cases for N = 1 (spheres) and N = 2 -(rods) are also included. One example use of this body style is for 2d -discrete element models, as described in "Fraige"_#Fraige. Similar to -body style {nparticle}, the atom_style body command for this body -style takes two additional arguments: +The {rounded/polygon} body style represents body particles as a 2d +polygon with a variable number of N vertices. This style can only be +used for 2d models; see the "boundary"_boundary.html command. + +NOTE: include a diagram of a a rounded polygon body particle + +Special cases for N = 1 (spheres) and N = 2 (rods) are also included. +One use of this body style is for 2d discrete element models, as +described in "Fraige"_#Fraige. + +Similar to body style {nparticle}, the atom_style body command for +this body style takes two additional arguments: atom_style body rounded/polygon Nmin Nmax Nmin = minimum # of vertices in any body in the system @@ -201,14 +211,19 @@ xN yN zN i j j k k ... diameter :pre -N is the number of vertices in the body particle. M = 6 + 3*N + 2*N + -1. The integer line has a single value N. The floating point line(s) +where M = 6 + 3*N + 2*N + 1, and N is the number of vertices in the +body particle. + +The integer line has a single value N. The floating point line(s) list 6 moments of inertia followed by the coordinates of the N -vertices (x1 to zN) as 3N values, followed by 2N vertex indices -corresponding to the end points of the N edges, followed by a single -diameter value = the rounded diameter of the vertices. -These floating-point values can be listed on as many lines as you -wish; see the "read_data"_read_data.html command for more details. +vertices (x1 to zN) as 3N values (with z = 0.0 for each), followed by +2N vertex indices corresponding to the end points of the N edges, +followed by a single diameter value = the rounded diameter of the +circle that surrounds each vertex. These floating-point values can be +listed on as many lines as you wish; see the +"read_data"_read_data.html command for more details. + +NOTE: can the diameter value be different for each body particle? The 6 moments of inertia (ixx,iyy,izz,ixy,ixz,iyz) should be the values consistent with the current orientation of the rigid body @@ -220,8 +235,10 @@ from the center-of-mass of the body particle. The center-of-mass position of the particle is specified by the x,y,z values in the {Atoms} section of the data file. -For example, the following information would specify a square -particles whose edge length is sqrt(2): +For example, the following information would specify a square particle +whose edge length is sqrt(2): + +NOTE: oriented how? 3 1 27 4 @@ -238,18 +255,31 @@ particles whose edge length is sqrt(2): The "pair_style body/rounded/polygon"_pair_body_rounded_polygon.html command can be used with this body style to compute body/body -interactions. +interactions. The "fix wall/body/polygon"_fix_wall_body_polygon.html +command can be used with this body style to compute the interaction of +body particles with a wall. :line [Specifics of body style rounded/polyhedron:] -The {rounded/polyhedron} body style represents body particles as -a polyhedron with N vertices, E edges and F faces. +The {rounded/polyhedron} body style represents body particles as a 3d +polyhedron with a variable number of N vertices, E edges and F faces. +This style can only be used for 3d models; see the +"boundary"_boundary.html command. + +NOTE: include a diagram of a a rounded polyhedron body particle + Special cases for N = 1 (spheres) and N = 2 (rods) are also valid. -This body style is for 3d discrete element models, as described in "Wang"_#Wang. -Similar to body style {rounded/polygon}, the atom_style body command for this body -style takes two additional arguments: + +NOTE: can 2d objects also be specified as a special case, e.g. a +triangle? + +This body style is for 3d discrete element models, as described in +"Wang"_#Wang. + +Similar to body style {rounded/polygon}, the atom_style body command +for this body style takes two additional arguments: atom_style body rounded/polyhedron Nmin Nmax Nmin = minimum # of vertices in any body in the system @@ -278,18 +308,57 @@ xN yN zN 1 2 3 4 diameter :pre -N is the number of vertices in the body particle. M = 6 + 3*N + 2*E -+ 4*F + 1. The integer line has three values: number of vertices (N), -number of edges (E) and number of faces (F). The floating point line(s) -list 6 moments of inertia followed by the coordinates of the N -vertices (x1 to zN) as 3N values, followed by 2N vertex indices -corresponding to the end points of the E edges, 4*F vertex indices defining F faces. -The last value is the radius value = the rounded diameter of the vertices. -These floating-point values can be listed on as many lines as you -wish; see the "read_data"_read_data.html command for more details. -Because the maxmimum vertices per face is hard-coded to be 4 (i.e. quadrilaterals), -faces with more than 4 vertices need to be split into triangles or quadrilaterals. -For triangular faces, the last index should be set to -1. +where M = 6 + 3*N + 2*E + 4*F + 1, and N is the number of vertices in +the body particle, E = number of edges, F = number of faces. + +The integer line has three values: number of vertices (N), number of +edges (E) and number of faces (F). The floating point line(s) list 6 +moments of inertia followed by the coordinates of the N vertices (x1 +to zN) as 3N values, followed by 2N vertex indices corresponding to +the end points of the E edges, then 4*F vertex indices defining F +faces. The last value is the radius value = the rounded diameter of +the sphere that surrounds each vertex. These floating-point values +can be listed on as many lines as you wish; see the +"read_data"_read_data.html command for more details. Because the +maxmimum vertices per face is hard-coded to be 4 +(i.e. quadrilaterals), faces with more than 4 vertices need to be +split into triangles or quadrilaterals. For triangular faces, the +last vertex index should be set to -1. + +NOTE: is there some right-hand rule for the ordering of the 4 vertices +within each face? + +NOTE: can the diameter value be different for each body particle? + +The 6 moments of inertia (ixx,iyy,izz,ixy,ixz,iyz) should be the +values consistent with the current orientation of the rigid body +around its center of mass. The values are with respect to the +simulation box XYZ axes, not with respect to the principal axes of the +rigid body itself. LAMMPS performs the latter calculation internally. +The coordinates of each vertex are specified as its x,y,z displacement +from the center-of-mass of the body particle. The center-of-mass +position of the particle is specified by the x,y,z values in the +{Atoms} section of the data file. + +For example, the following information would specify a cubic particle +whose edge length is 1.0: + +NOTE: oriented how? + +NOTE: fill in these values correctly + +3 1 27 +4 +1 1 4 0 0 0 +-0.7071 -0.7071 0 +-0.7071 0.7071 0 +0.7071 0.7071 0 +0.7071 -0.7071 0 +0 1 +1 2 +2 3 +3 0 +1.0 :pre :line @@ -309,9 +378,9 @@ current COM and orientation of the body particle. For images created by the "dump image"_dump_image.html command, if the {body} keyword is set, then each body particle is drawn as a polygon -consisting of N line segments. Note that the line segments -are drawn between the N vertices, which does not correspond exactly to -the physical extent of the body (because the "pair_style +consisting of N line segments. Note that the line segments are drawn +between the N vertices, which does not correspond exactly to the +physical extent of the body (because the "pair_style rounded/polygon"_pair_body_rounded_polygon.html defines finite-size spheres at those point and the line segments between the spheres are tangent to the spheres). The drawn diameter of each line segment is @@ -325,4 +394,5 @@ determined by the {bflag1} parameter for the {body} keyword. The Particuology, 6, 455 (2008). :link(Wang) -[(Wang)] J. Wang, H. S. Yu, P. A. Langston, F. Y. Fraige, Granular Matter, 13, 1 (2011). +[(Wang)] J. Wang, H. S. Yu, P. A. Langston, F. Y. Fraige, Granular +Matter, 13, 1 (2011). diff --git a/doc/src/fix_wall_body_polygon.txt b/doc/src/fix_wall_body_polygon.txt index 00d23c207c..4ba16b56c7 100644 --- a/doc/src/fix_wall_body_polygon.txt +++ b/doc/src/fix_wall_body_polygon.txt @@ -14,9 +14,9 @@ fix ID group-ID wall/body/polygon k_n c_n c_t wallstyle args keyword values ... ID, group-ID are documented in "fix"_fix.html command :ulb,l wall/body/polygon = style name of this fix command :l -k_n = normal repulsion strength (force/distance units or pressure units - see discussion below) :l -c_n = normal damping coefficient (force/distance units or pressure units - see discussion below) :l -c_t = tangential damping coefficient (force/distance units or pressure units - see discussion below) :l +k_n = normal repulsion strength (force/distance or pressure units) :l +c_n = normal damping coefficient (force/distance or pressure units) :l +c_t = tangential damping coefficient (force/distance or pressure units) :l wallstyle = {xplane} or {yplane} or {zplane} or {zcylinder} :l args = list of arguments for a particular style :l {xplane} or {yplane} args = lo hi @@ -37,34 +37,37 @@ fix 1 all wall/body/polygon 1000.0 20.0 5.0 xplane -10.0 10.0 [Description:] -Bound the simulation domain of systems of body particles of style -body/rounded/polygon with wall(s). All particles in the group interact -with the wall when they are close enough to touch it. -The nature of the interaction between the wall and the polygons is -the same as that between the polygons themselves, which is similar to the Hookean potential. +This fix is for use with 2d models of body particles of style +{rounded/polygon}. It bounds the simulation domain with wall(s). All +particles in the group interact with the wall when they are close +enough to touch it. The nature of the interaction between the wall +and the polygon particles is the same as that between the polygon +particles themselves, which is similar to a Hookean potential. See +"Section 6.14"_Section_howto.html#howto_14 of the manual and the +"body"_body.html doc page for more details on using body particles. -This fix is designed for use with the "body/rounded/polygon" body style, -which is specified as an argument to the "atom-style body" command. -The parameters {k_n}, {c_n}, {c_t} have the same meaning and units as those specified with the -"pair_style body/rounded/polygon"_pair_body_rounded_polygon.html commands. +The parameters {k_n}, {c_n}, {c_t} have the same meaning and units as +those specified with the "pair_style +body/rounded/polygon"_pair_body_rounded_polygon.html command. -The {wallstyle} can be planar or cylindrical. The 3 planar options +The {wallstyle} can be planar or cylindrical. The 2 planar options specify a pair of walls in a dimension. Wall positions are given by {lo} and {hi}. Either of the values can be specified as NULL if a single wall is desired. For a {zcylinder} wallstyle, the cylinder's axis is at x = y = 0.0, and the radius of the cylinder is specified. -Optionally, the wall can be moving, if the {wiggle} keyword is appended. +Optionally, the wall can be moving, if the {wiggle} keyword is +appended. For the {wiggle} keyword, the wall oscillates sinusoidally, similar to -the oscillations of particles which can be specified by the -"fix move"_fix_move.html command. This is useful in packing -simulations of particles. The arguments to the {wiggle} -keyword specify a dimension for the motion, as well as it's -{amplitude} and {period}. Note that if the dimension is in the plane -of the wall, this is effectively a shearing motion. If the dimension -is perpendicular to the wall, it is more of a shaking motion. A -{zcylinder} wall can only be wiggled in the z dimension. +the oscillations of particles which can be specified by the "fix +move"_fix_move.html command. This is useful in packing simulations of +particles. The arguments to the {wiggle} keyword specify a dimension +for the motion, as well as it's {amplitude} and {period}. Note that +if the dimension is in the plane of the wall, this is effectively a +shearing motion. If the dimension is perpendicular to the wall, it is +more of a shaking motion. A {zcylinder} wall can only be wiggled in +the z dimension. Each timestep, the position of a wiggled wall in the appropriate {dim} is set according to this equation: @@ -87,14 +90,15 @@ minimization"_minimize.html. [Restrictions:] -This fix is part of the BODY package. It is only enabled if -LAMMPS was built with that package. See the "Making +This fix is part of the BODY package. It is only enabled if LAMMPS +was built with that package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info. -Any dimension (xyz) that has a wall must be non-periodic. +Any dimension (xy) that has a wall must be non-periodic. [Related commands:] -"pair_style body/rounded/polygon"_pair_body_rounded_polygon.html +"atom_style body"_atom_style.html, "pair_style +body/rounded/polygon"_pair_body_rounded_polygon.html [Default:] none diff --git a/doc/src/fix_wall_body_polyhedron.txt b/doc/src/fix_wall_body_polyhedron.txt index a1eef4df07..c937cbdbbc 100644 --- a/doc/src/fix_wall_body_polyhedron.txt +++ b/doc/src/fix_wall_body_polyhedron.txt @@ -37,16 +37,18 @@ fix 1 all wall/body/polyhedron 1000.0 20.0 5.0 xplane -10.0 10.0 [Description:] -Bound the simulation domain of systems of body particles of style -body/rounded/polyhedron with wall(s). All particles in the group interact -with the wall when they are close enough to touch it. -The nature of the interaction between the wall and the polygons is -the same as that between the polygons themselves, which is similar to the Hookean potential. +This fix is for use with 3d models of body particles of style +{rounded/polyhedron}. It bounds the simulation domain with wall(s). +All particles in the group interact with the wall when they are close +enough to touch it. The nature of the interaction between the wall +and the polygon particles is the same as that between the polygon +particles themselves, which is similar to a Hookean potential. See +"Section 6.14"_Section_howto.html#howto_14 of the manual and the +"body"_body.html doc page for more details on using body particles. -This fix is designed for use with the "body/rounded/polyhedron" body style, -which is specified as an argument to the "atom-style body" command. -The parameters {k_n}, {c_n}, {c_t} have the same meaning and units as those specified with the -"pair_style body/rounded/polyhedron"_pair_body_rounded_polygon.html commands. +The parameters {k_n}, {c_n}, {c_t} have the same meaning and units as +those specified with the "pair_style +body/rounded/polyhedron"_pair_body_rounded_polyhedron.html command. The {wallstyle} can be planar or cylindrical. The 3 planar options specify a pair of walls in a dimension. Wall positions are given by @@ -57,14 +59,14 @@ axis is at x = y = 0.0, and the radius of the cylinder is specified. Optionally, the wall can be moving, if the {wiggle} keyword is appended. For the {wiggle} keyword, the wall oscillates sinusoidally, similar to -the oscillations of particles which can be specified by the -"fix move"_fix_move.html command. This is useful in packing -simulations of particles. The arguments to the {wiggle} -keyword specify a dimension for the motion, as well as it's -{amplitude} and {period}. Note that if the dimension is in the plane -of the wall, this is effectively a shearing motion. If the dimension -is perpendicular to the wall, it is more of a shaking motion. A -{zcylinder} wall can only be wiggled in the z dimension. +the oscillations of particles which can be specified by the "fix +move"_fix_move.html command. This is useful in packing simulations of +particles. The arguments to the {wiggle} keyword specify a dimension +for the motion, as well as it's {amplitude} and {period}. Note that +if the dimension is in the plane of the wall, this is effectively a +shearing motion. If the dimension is perpendicular to the wall, it is +more of a shaking motion. A {zcylinder} wall can only be wiggled in +the z dimension. Each timestep, the position of a wiggled wall in the appropriate {dim} is set according to this equation: @@ -95,6 +97,7 @@ Any dimension (xyz) that has a wall must be non-periodic. [Related commands:] -"pair_style body/rounded/polyhedron"_pair_body_rounded_polygon.html +"atom_style body"_atom_style.html, "pair_style +body/rounded/polyhedron"_pair_body_rounded_polyhedron.html [Default:] none diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index 00896b4c7b..15817f10f8 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -16,7 +16,9 @@ c_n = normal damping coefficient c_t = tangential damping coefficient mu = normal friction coefficient during gross sliding delta_ua = multiple contact scaling factor -cutoff = global sepration cutoff for interactions (distance units), see below for definition :pre +cutoff = global separation cutoff for interactions (distance units), see below for definition :pre + +NOTE: what does gross sliding mean? [Examples:] @@ -26,36 +28,77 @@ pair_coeff 1 1 100.0 1.0 :pre [Description:] -Style {body/rounded/polygon} is for use with body particles and calculates pairwise +Style {body/rounded/polygon} is for use with 2d models of body +particles of style {rounded/polygon}. It calculates pairwise body/body interactions as well as interactions between body and -point-particles. See "Section 6.14"_Section_howto.html#howto_14 -of the manual and the "body"_body.html doc page for more details on -using body particles. +point-particles. See "Section 6.14"_Section_howto.html#howto_14 of +the manual and the "body"_body.html doc page for more details on using +body particles. -This pair style is designed for use with the "body/rounded/polygon" body style, -which is specified as an argument to the "atom-style body" command. -See the "body/rounded/polygon"_body.html doc page for more details about the body -styles LAMMPS supports. The pairwise interaction between the rounded polygons is described -in "Fraige"_#Fraige, where the polygons are rounded at the vertices and edges -by circles of diameter a. This is a version of discrete element models (DEM) -with multiple contact points. +This pairwise interaction between rounded polygons is described in +"Fraige"_#Fraige, where a polygon does not have sharp corners, but is +rounded at its vertices by circles centered on each vertex with a +specified diameter. The edges of the polygon are defined bewteen +pairs of adjacent vertices. The circle diameter for each polygon is +specified in the data file read by the "read data"_read_data.html +command. This is a 2d discrete element model (DEM) which allows for +multiple contact points. -Because the polygons can have different rounded diameters, the cutoff specified in -the pair style command is for the surface separation between two interacting entities -(e.g. vertex-vertex, vertex-edge or edge-edge) excluding their rounded diameters, -i.e. separation = center-center distance - (rounded diameter of entity i + rounded diameter of entity j)/2. -The interaction forces and energies are also defined with respect to the rounded surface separation, -instead of center-center distance. +Note that when two particles interact, the effective surface of each +polygon particle is displaced outward from each of its vertices and +edges by half its circle diameter. The interaction forces and +energies bewteen two particles are defined with respect to the +separation of their respective rounded surfaces, not by the separation +of the vertices and edges themselves. -For style {body/rounded/polygon}, the following coefficients must be defined for each -pair of atoms types via the "pair_coeff"_pair_coeff.html command as in -the examples above, or in the data file or restart files read by the -"read_data"_read_data.html or "read_restart"_read_restart.html -commands: +This means that the specified cutoff in the pair_style command should +be large enough to encompass the center-to-center distance between two +particles (at any orientation) which would produce a surface-surface +overlap. For example, consider two square particles with edge length += 1.0 and circle diameter 0.2. The maximum distance of one polygon's +surface from its center is not sqrt(2)/2, but (sqrt(2)+0.1)/2. Thus +the cutoff distance should be sqrt(2) + 0.1, since the surfaces of two +particles that far apart could be touching. + +NOTE: Do we need a diagram of 2 overlapping polygon particles that +explains how contact is defined? Do we need an equation(s) that +explain what the params in pair style and coeff mean, for damping and +spring constants? Or do we just want to reference the paper for that? + +NOTE: say something about no frictional history ? + +The following coefficients must be defined for each pair of atom types +via the "pair_coeff"_pair_coeff.html command as in the examples above, +or in the data file read by the "read_data"_read_data.html command: k_n (energy/distance^2 units) k_na (energy/distance^2 units) :ul +[Mixing, shift, table, tail correction, restart, rRESPA info]: + +This pair style does not support the "pair_modify"_pair_modify.html +mix, shift, table, and tail options. + +This pair style does not write its information to "binary restart +files"_restart.html. Thus, you need to re-specify the pair_style and +pair_coeff commands in an input script that reads a restart file. + +This pair style can only be used via the {pair} keyword of the +"run_style respa"_run_style.html command. It does not support the +{inner}, {middle}, {outer} keywords. + +[Restrictions:] + +These pair styles are part of the BODY package. They are only enabled +if LAMMPS was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +NOTE: is there a newton on or off requirement for using this pair style? +If so, say something like this: + +This pair style requires the "newton"_newton.html setting to be "on" +for pair interactions. + [Related commands:] "pair_coeff"_pair_coeff.html @@ -65,5 +108,3 @@ k_na (energy/distance^2 units) :ul :link(Fraige) [(Fraige)] F. Y. Fraige, P. A. Langston, A. J. Matchett, J. Dodds, Particuology, 6, 455 (2008). - - diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/src/pair_body_rounded_polyhedron.txt index 9a5c20ddb6..29fa90d2cf 100644 --- a/doc/src/pair_body_rounded_polyhedron.txt +++ b/doc/src/pair_body_rounded_polyhedron.txt @@ -18,6 +18,8 @@ mu = normal friction coefficient during gross sliding delta_ua = multiple contact scaling factor cutoff = global sepration cutoff for interactions (distance units), see below for definition :pre +NOTE: what does gross sliding mean? + [Examples:] pair_style body/rounded/polyhedron 20.0 5.0 0.0 1.0 0.5 @@ -26,36 +28,78 @@ pair_coeff 1 1 100.0 1.0 :pre [Description:] -Style {body/rounded/polyhedron} is for use with body particles and calculates pairwise +Style {body/rounded/polygon} is for use with 3d models of body +particles of style {rounded/polyhedron}. It calculates pairwise body/body interactions as well as interactions between body and -point-particles. See "Section 6.14"_Section_howto.html#howto_14 -of the manual and the "body"_body.html doc page for more details on -using body particles. +point-particles. See "Section 6.14"_Section_howto.html#howto_14 of +the manual and the "body"_body.html doc page for more details on using +body particles. -This pair style is designed for use with the "body/rounded/polyhedron" body style, -which is specified as an argument to the "atom-style body" command. -See the "body/rounded/polyhedron"_body.html doc page for more details about the body -styles LAMMPS supports. The pairwise interaction between the rounded polygons is described -in "Wang"_#Wang, where the polygons are rounded at the vertices and edges -by circles of diameter a. This is a version of discrete element models (DEM) -with multiple contact points. +This pairwise interaction between rounded polyhedra is described in +"Wang"_#Wang, where a polyhedron does not have sharp corners and +edges, but is rounded at its vertices and edges by spheres centered on +each vertex with a specified diameter. The edges if the polyhedron +are defined bewteen pairs of adjacent vertices. Its faces are defined +by a loop of edges. The sphere diameter for each polygon is specified +in the data file read by the "read data"_read_data.html command. This +is a discrete element model (DEM) which allows for multiple contact +points. -Because the polygons can have different rounded diameters, the cutoff specified in -the pair style command is for the surface separation between two interacting entities -(e.g. vertex-vertex, vertex-edge, vertex-face and edge-edge) excluding their rounded diameters, -i.e. separation = center-center distance - (rounded diameter of entity i + rounded diameter of entity j)/2. -The interaction forces and energies are also defined with respect to the rounded surface separation, -instead of center-center distance. +Note that when two particles interaact, the effective surface of each +polyhedron particle is displaced outward from each of its vertices, +edges, and faces by half its sphere diameter. The interaction forces +and energies bewteen two particles are defined with respect to the +separation of their respective rounded surfaces, not by the separation +of the vertices, edges, and faces themselves. -For style {body/rounded/polyhedron}, the following coefficients must be defined for each -pair of atoms types via the "pair_coeff"_pair_coeff.html command as in -the examples above, or in the data file or restart files read by the -"read_data"_read_data.html or "read_restart"_read_restart.html -commands: +This means that the specified cutoff in the pair_style command should +be large enough to encompass the center-to-center distance between two +particles (at any orientation) which would produce a surface-surface +overlap. For example, consider two cubic particles with edge length = +1.0 and sphere diameter 0.2. The maximum distance of one polygon's +surface from its center is not sqrt(3)/2, but (sqrt(3)+0.1)/2. Thus +the cutoff distance should be sqrt(3) + 0.1, since the surfaces of two +particles that far apart could be touching. + +NOTE: Do we need a diagram of 2 overlapping polyhedron particles that +explains how contact is defined? Do we need an equation(s) that +explain what the params in pair style and coeff mean, for damping and +spring constants? Or do we just want to reference the paper for that? + +NOTE: say something about no frictional history ? + +The following coefficients must be defined for each pair of atom types +via the "pair_coeff"_pair_coeff.html command as in the examples above, +or in the data file read by the "read_data"_read_data.html command: k_n (energy/distance^2 units) k_na (energy/distance^2 units) :ul +[Mixing, shift, table, tail correction, restart, rRESPA info]: + +This pair style does not support the "pair_modify"_pair_modify.html +mix, shift, table, and tail options. + +This pair style does not write its information to "binary restart +files"_restart.html. Thus, you need to re-specify the pair_style and +pair_coeff commands in an input script that reads a restart file. + +This pair style can only be used via the {pair} keyword of the +"run_style respa"_run_style.html command. It does not support the +{inner}, {middle}, {outer} keywords. + +[Restrictions:] + +These pair styles are part of the BODY package. They are only enabled +if LAMMPS was built with that package. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info. + +NOTE: is there a newton on or off requirement for using this pair style? +If so, say something like this: + +This pair style requires the "newton"_newton.html setting to be "on" +for pair interactions. + [Related commands:] "pair_coeff"_pair_coeff.html @@ -63,5 +107,6 @@ k_na (energy/distance^2 units) :ul [Default:] none :link(Wang) -[(Wang)] J. Wang, H. S. Yu, P. A. Langston, F. Y. Fraige, Granular Matter, 13, 1 (2011). +[(Wang)] J. Wang, H. S. Yu, P. A. Langston, F. Y. Fraige, Granular +Matter, 13, 1 (2011). diff --git a/examples/body/in.cubes b/examples/body/in.cubes index 3aeaa70af9..a22599fe96 100644 --- a/examples/body/in.cubes +++ b/examples/body/in.cubes @@ -38,11 +38,11 @@ fix 1 all nvt/body temp 1.2 1.2 0.1 compute p2 all pressure 1_temp -compute 1 all body/local id 1 2 3 -dump 1 all local 1000 dump.* index c_1[1] c_1[2] c_1[3] c_1[4] +#compute 1 all body/local id 1 2 3 +#dump 1 all local 1000 dump.* index c_1[1] c_1[2] c_1[3] c_1[4] #dump 2 all image 1000 image.*.jpg type type & -# zoom 1.5 adiam 1.5 body yes 0 0 view 60 15 +# zoom 1.5 adiam 1.5 body type 0 0 view 60 15 #dump_modify 2 pad 6 thermo_style custom step ke pe etotal c_p2 c_1_temp diff --git a/examples/body/in.pour3d b/examples/body/in.pour3d index 290f2052c8..bcba950e59 100644 --- a/examples/body/in.pour3d +++ b/examples/body/in.pour3d @@ -49,7 +49,7 @@ thermo_style custom step atoms ke pe etotal press thermo 1000 #dump 2 all image 500 image.*.jpg type type & -# zoom 1.5 adiam 1.5 body yes 0 0 view 75 15 +# zoom 1.5 adiam 1.5 body type 0 0 view 75 15 #dump_modify 2 pad 6 run ${steps} diff --git a/examples/body/in.squares b/examples/body/in.squares index f771c15381..3b05b5cead 100755 --- a/examples/body/in.squares +++ b/examples/body/in.squares @@ -42,13 +42,14 @@ fix 1 all npt/body temp $T $T 1.0 x 0.001 $P 1.0 & fix 2 all enforce2d -compute 1 all body/local id 1 2 3 -dump 1 all local 100000 dump.polygon.* index c_1[1] c_1[2] c_1[3] c_1[4] +#compute 1 all body/local id 1 2 3 +#dump 1 all local 100000 dump.polygon.* index c_1[1] c_1[2] c_1[3] c_1[4] thermo_style custom step ke pe etotal press thermo 1000 -#dump 2 all image 10000 image.*.jpg type type zoom 2.0 adiam 1.5 body yes 0 0 +#dump 2 all image 10000 image.*.jpg type type zoom 2.0 & +# adiam 1.5 body type 0 0 #dump_modify 2 pad 6 run ${steps} diff --git a/examples/body/in.wall2d b/examples/body/in.wall2d index 19788a9dcd..04e7f31cb6 100755 --- a/examples/body/in.wall2d +++ b/examples/body/in.wall2d @@ -44,13 +44,14 @@ fix 1 all npt/body temp $T $T 1.0 x 0.001 $P 1.0 fixedpoint 0 0 0 fix 2 all enforce2d fix 3 all wall/body/polygon 2000 50 50 yplane 0.0 48.0 -compute 1 all body/local id 1 2 3 -dump 1 all local 100000 dump.polygon.* index c_1[1] c_1[2] c_1[3] c_1[4] +#compute 1 all body/local id 1 2 3 +#dump 1 all local 100000 dump.polygon.* index c_1[1] c_1[2] c_1[3] c_1[4] thermo_style custom step ke pe etotal press thermo 1000 -#dump 2 all image 10000 image.*.jpg type type zoom 2.0 adiam 1.5 body yes 0 0 +#dump 2 all image 10000 image.*.jpg type type zoom 2.0 & +# adiam 1.5 body type 0 0 #dump_modify 2 pad 6 run ${steps} diff --git a/examples/body/log.9Jul18.body.cubes.g++.1 b/examples/body/log.9Jul18.body.cubes.g++.1 new file mode 100644 index 0000000000..c9a799c0b5 --- /dev/null +++ b/examples/body/log.9Jul18.body.cubes.g++.1 @@ -0,0 +1,125 @@ +LAMMPS (29 Jun 2018) +# 3d rounded cubes + +variable r index 3 +variable steps index 10000 + +units lj +dimension 3 + +atom_style body rounded/polyhedron 1 10 + +read_data data.cubes + orthogonal box = (0 0 0) to (6 6 6) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 2 atoms + 2 bodies + +replicate $r $r $r +replicate 3 $r $r +replicate 3 3 $r +replicate 3 3 3 + orthogonal box = (0 0 0) to (18 18 18) + 1 by 1 by 1 MPI processor grid + 54 atoms + Time spent = 0.000217915 secs + +velocity all create 1.2 187287 dist gaussian mom yes rot yes + +variable cut_inner equal 0.5 +variable k_n equal 100 +variable k_na equal 1 +variable c_n equal 20 +variable c_t equal 5 +variable mu equal 0 +variable A_ua equal 1 + +pair_style body/rounded/polyhedron ${c_n} ${c_t} ${mu} ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 ${c_t} ${mu} ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 5 ${mu} ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 5 0 ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 5 0 1 ${cut_inner} +pair_style body/rounded/polyhedron 20 5 0 1 0.5 +pair_coeff * * ${k_n} ${k_na} +pair_coeff * * 100 ${k_na} +pair_coeff * * 100 1 + +comm_modify vel yes + +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.001 + +#fix 1 all nve/body +fix 1 all nvt/body temp 1.2 1.2 0.1 +#fix 1 all npt/body temp 1.2 1.2 0.1 iso 0.002 0.02 1.0 + +compute p2 all pressure 1_temp + +#compute 1 all body/local id 1 2 3 +#dump 1 all local 1000 dump.* index c_1[1] c_1[2] c_1[3] c_1[4] + +#dump 2 all image 1000 image.*.jpg type type # zoom 1.5 adiam 1.5 body type 0 0 view 60 15 +#dump_modify 2 pad 6 + +thermo_style custom step ke pe etotal c_p2 c_1_temp + +thermo 1000 + +run ${steps} +run 10000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.9641 + ghost atom cutoff = 3.9641 + binsize = 1.98205, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair body/rounded/polyhedron, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.952 | 4.952 | 4.952 Mbytes +Step KinEng PotEng TotEng c_p2 c_1_temp + 0 1.7666667 0 1.7666667 0.01090535 0.59439252 + 1000 3.1462962 0.17392649 3.3202227 0.02361912 1.1654694 + 2000 2.9311648 0.13836102 3.0695258 0.021748224 1.1950624 + 3000 3.090491 0.16511199 3.255603 0.018691142 1.23672 + 4000 2.7401565 0.17792155 2.9180781 0.015093853 1.1180839 + 5000 3.0880849 0.17587085 3.2639557 0.030563042 1.2831154 + 6000 3.2180776 0.19732251 3.4154001 0.028338151 1.258839 + 7000 2.9514882 0.25088882 3.202377 0.025296925 1.1746326 + 8000 3.0101226 0.28825968 3.2983823 0.027273454 1.2138056 + 9000 3.0164253 0.1901733 3.2065986 0.033228915 1.3095914 + 10000 2.3780401 0.34082434 2.7188644 0.031838531 1.0208679 +Loop time of 38.5686 on 1 procs for 10000 steps with 54 atoms + +Performance: 22401.653 tau/day, 259.278 timesteps/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 38.426 | 38.426 | 38.426 | 0.0 | 99.63 +Neigh | 0.0043154 | 0.0043154 | 0.0043154 | 0.0 | 0.01 +Comm | 0.047616 | 0.047616 | 0.047616 | 0.0 | 0.12 +Output | 0.00017595 | 0.00017595 | 0.00017595 | 0.0 | 0.00 +Modify | 0.082948 | 0.082948 | 0.082948 | 0.0 | 0.22 +Other | | 0.007761 | | | 0.02 + +Nlocal: 54 ave 54 max 54 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 96 ave 96 max 96 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 100 ave 100 max 100 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 100 +Ave neighs/atom = 1.85185 +Neighbor list builds = 268 +Dangerous builds = 0 + +Total wall time: 0:00:38 diff --git a/examples/body/log.9Jul18.body.cubes.g++.4 b/examples/body/log.9Jul18.body.cubes.g++.4 new file mode 100644 index 0000000000..e2407e9725 --- /dev/null +++ b/examples/body/log.9Jul18.body.cubes.g++.4 @@ -0,0 +1,125 @@ +LAMMPS (29 Jun 2018) +# 3d rounded cubes + +variable r index 3 +variable steps index 10000 + +units lj +dimension 3 + +atom_style body rounded/polyhedron 1 10 + +read_data data.cubes + orthogonal box = (0 0 0) to (6 6 6) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 2 atoms + 2 bodies + +replicate $r $r $r +replicate 3 $r $r +replicate 3 3 $r +replicate 3 3 3 + orthogonal box = (0 0 0) to (18 18 18) + 1 by 2 by 2 MPI processor grid + 54 atoms + Time spent = 0.00103807 secs + +velocity all create 1.2 187287 dist gaussian mom yes rot yes + +variable cut_inner equal 0.5 +variable k_n equal 100 +variable k_na equal 1 +variable c_n equal 20 +variable c_t equal 5 +variable mu equal 0 +variable A_ua equal 1 + +pair_style body/rounded/polyhedron ${c_n} ${c_t} ${mu} ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 ${c_t} ${mu} ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 5 ${mu} ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 5 0 ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 5 0 1 ${cut_inner} +pair_style body/rounded/polyhedron 20 5 0 1 0.5 +pair_coeff * * ${k_n} ${k_na} +pair_coeff * * 100 ${k_na} +pair_coeff * * 100 1 + +comm_modify vel yes + +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.001 + +#fix 1 all nve/body +fix 1 all nvt/body temp 1.2 1.2 0.1 +#fix 1 all npt/body temp 1.2 1.2 0.1 iso 0.002 0.02 1.0 + +compute p2 all pressure 1_temp + +#compute 1 all body/local id 1 2 3 +#dump 1 all local 1000 dump.* index c_1[1] c_1[2] c_1[3] c_1[4] + +#dump 2 all image 1000 image.*.jpg type type # zoom 1.5 adiam 1.5 body type 0 0 view 60 15 +#dump_modify 2 pad 6 + +thermo_style custom step ke pe etotal c_p2 c_1_temp + +thermo 1000 + +run ${steps} +run 10000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3.9641 + ghost atom cutoff = 3.9641 + binsize = 1.98205, bins = 10 10 10 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair body/rounded/polyhedron, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.879 | 5.068 | 5.256 Mbytes +Step KinEng PotEng TotEng c_p2 c_1_temp + 0 1.7666667 0 1.7666667 0.01090535 0.59439252 + 1000 3.1462962 0.17392649 3.3202227 0.02361912 1.1654694 + 2000 2.9311648 0.13836102 3.0695258 0.021748224 1.1950624 + 3000 3.090491 0.16511199 3.255603 0.018691142 1.23672 + 4000 2.7401565 0.17792155 2.9180781 0.015093853 1.1180839 + 5000 3.0880849 0.17587085 3.2639557 0.030563042 1.2831154 + 6000 3.2180776 0.19732251 3.4154001 0.028338151 1.258839 + 7000 2.9514882 0.25088882 3.202377 0.025296925 1.1746326 + 8000 3.0101226 0.28825968 3.2983823 0.027273454 1.2138056 + 9000 3.0164253 0.1901733 3.2065986 0.033228915 1.3095914 + 10000 2.3780401 0.34082434 2.7188644 0.031838531 1.0208679 +Loop time of 20.5306 on 4 procs for 10000 steps with 54 atoms + +Performance: 42083.509 tau/day, 487.078 timesteps/s +100.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 7.5288 | 10.878 | 19.952 | 159.0 | 52.98 +Neigh | 0.0014424 | 0.0016552 | 0.0021195 | 0.7 | 0.01 +Comm | 0.50623 | 9.5805 | 12.93 | 169.4 | 46.66 +Output | 0.00011921 | 0.00014341 | 0.00021386 | 0.0 | 0.00 +Modify | 0.044663 | 0.047684 | 0.05382 | 1.6 | 0.23 +Other | | 0.023 | | | 0.11 + +Nlocal: 13.5 ave 17 max 9 min +Histogram: 1 0 0 1 0 0 0 0 1 1 +Nghost: 63.5 ave 68 max 58 min +Histogram: 1 0 0 1 0 0 0 0 0 2 +Neighs: 25 ave 38 max 6 min +Histogram: 1 0 0 0 0 1 0 0 1 1 + +Total # of neighbors = 100 +Ave neighs/atom = 1.85185 +Neighbor list builds = 268 +Dangerous builds = 0 + +Total wall time: 0:00:20 diff --git a/examples/body/log.9Jul18.body.pour3d.g++.1 b/examples/body/log.9Jul18.body.pour3d.g++.1 new file mode 100644 index 0000000000..213dd2e18f --- /dev/null +++ b/examples/body/log.9Jul18.body.pour3d.g++.1 @@ -0,0 +1,138 @@ +LAMMPS (29 Jun 2018) +# pouring 3d rounded polyhedron bodies + +variable steps index 6000 + +units lj +boundary p p fm +comm_modify vel yes + +atom_style body rounded/polyhedron 1 8 +atom_modify map array + +region reg block 0 50 0 50 0 50 units box +create_box 4 reg +Created orthogonal box = (0 0 0) to (50 50 50) + 1 by 1 by 1 MPI processor grid + +variable cut_inner equal 0.5 +variable k_n equal 100 +variable k_na equal 5 +variable c_n equal 20 +variable c_t equal 5 +variable mu equal 0 +variable A_ua equal 1 + +pair_style body/rounded/polyhedron ${c_n} ${c_t} ${mu} ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 ${c_t} ${mu} ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 5 ${mu} ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 5 0 ${A_ua} ${cut_inner} +pair_style body/rounded/polyhedron 20 5 0 1 ${cut_inner} +pair_style body/rounded/polyhedron 20 5 0 1 0.5 +pair_coeff * * ${k_n} ${k_na} +pair_coeff * * 100 ${k_na} +pair_coeff * * 100 5 + +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.001 + +fix 1 all nve/body +fix 2 all gravity 1.0 spherical 0.0 -180.0 + +molecule object molecule.cube molecule.tetra toff 1 molecule.rod3d toff 2 molecule.point3d toff 3 +Read molecule object: + 1 atoms with max type 1 + 0 bonds with max type 0 + 0 angles with max type 0 + 0 dihedrals with max type 0 + 0 impropers with max type 0 +Read molecule object: + 1 atoms with max type 2 + 0 bonds with max type 0 + 0 angles with max type 0 + 0 dihedrals with max type 0 + 0 impropers with max type 0 +Read molecule object: + 1 atoms with max type 3 + 0 bonds with max type 0 + 0 angles with max type 0 + 0 dihedrals with max type 0 + 0 impropers with max type 0 +Read molecule object: + 1 atoms with max type 4 + 0 bonds with max type 0 + 0 angles with max type 0 + 0 dihedrals with max type 0 + 0 impropers with max type 0 + +region slab block 5 45 5 45 25 35 units box +fix ins all pour 500 0 4767548 vol 0.4 10 region slab mol object molfrac 0.25 0.25 0.25 0.25 +Particle insertion: 134 every 4472 steps, 500 by step 13417 + +fix 4 all wall/body/polyhedron 2000 50 50 zplane 0.0 NULL + +#compute 1 all body/local type 1 2 3 +#dump 1 all local 1000 dump.polyhedron index c_1[1] c_1[2] c_1[3] c_1[4] +#dump 10 all custom 1000 tmp.dump id type x y z radius + +thermo_style custom step atoms ke pe etotal press + +thermo 1000 + +#dump 2 all image 500 image.*.jpg type type # zoom 1.5 adiam 1.5 body type 0 0 view 75 15 +#dump_modify 2 pad 6 + +run ${steps} +run 6000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5 + ghost atom cutoff = 5 + binsize = 2.5, bins = 20 20 20 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair body/rounded/polyhedron, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 0.5065 | 0.5065 | 0.5065 Mbytes +Step Atoms KinEng PotEng TotEng Press + 0 0 -0 0 0 0 + 1000 134 -0 0.00083010524 0.00083010524 -2.1515152e-06 + 2000 134 -0 -0.00069962476 -0.00069962476 -1.4170663e-08 + 3000 134 -0 -0.00069962687 -0.00069962687 -4.1478181e-11 + 4000 134 -0 -0.00069962687 -0.00069962687 -1.2141026e-13 + 5000 268 -0 0.014969705 0.014969705 3.0797164e-05 + 6000 268 -0 0.042467887 0.042467887 0.00056148005 +Loop time of 0.634737 on 1 procs for 6000 steps with 268 atoms + +Performance: 816716.196 tau/day, 9452.734 timesteps/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.41391 | 0.41391 | 0.41391 | 0.0 | 65.21 +Neigh | 0.010547 | 0.010547 | 0.010547 | 0.0 | 1.66 +Comm | 0.0030921 | 0.0030921 | 0.0030921 | 0.0 | 0.49 +Output | 0.00011492 | 0.00011492 | 0.00011492 | 0.0 | 0.02 +Modify | 0.19736 | 0.19736 | 0.19736 | 0.0 | 31.09 +Other | | 0.009719 | | | 1.53 + +Nlocal: 268 ave 268 max 268 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 3 ave 3 max 3 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 68 ave 68 max 68 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 68 +Ave neighs/atom = 0.253731 +Neighbor list builds = 168 +Dangerous builds = 0 + + +Total wall time: 0:00:00 diff --git a/examples/body/log.9Jul18.body.squares.g++.1 b/examples/body/log.9Jul18.body.squares.g++.1 new file mode 100644 index 0000000000..7b539797bd --- /dev/null +++ b/examples/body/log.9Jul18.body.squares.g++.1 @@ -0,0 +1,221 @@ +LAMMPS (29 Jun 2018) +# 2d rounded polygon bodies + +variable r index 4 +variable steps index 100000 +variable T index 0.5 +variable P index 0.1 +variable seed index 980411 + +units lj +dimension 2 + +atom_style body rounded/polygon 1 6 +atom_modify map array +read_data data.squares + orthogonal box = (0 0 -0.5) to (12 12 0.5) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 2 atoms + 2 bodies + +replicate $r $r 1 +replicate 4 $r 1 +replicate 4 4 1 + orthogonal box = (0 0 -0.5) to (48 48 0.5) + 1 by 1 by 1 MPI processor grid + 32 atoms + Time spent = 0.00020504 secs + +velocity all create $T ${seed} dist gaussian mom yes rot yes +velocity all create 0.5 ${seed} dist gaussian mom yes rot yes +velocity all create 0.5 980411 dist gaussian mom yes rot yes + +variable cut_inner equal 0.5 +variable k_n equal 100 +variable k_na equal 2 +variable c_n equal 1 +variable c_t equal 1 +variable mu equal 0.1 +variable delta_ua equal 0.5 + +pair_style body/rounded/polygon ${c_n} ${c_t} ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 1 ${c_t} ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 1 1 ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 1 1 0.1 ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 1 1 0.1 0.5 ${cut_inner} +pair_style body/rounded/polygon 1 1 0.1 0.5 0.5 +pair_coeff * * ${k_n} ${k_na} +pair_coeff * * 100 ${k_na} +pair_coeff * * 100 2 + +comm_modify vel yes + +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.001 + +#fix 1 all nve/body +#fix 1 all nvt/body temp $T $T 1.0 +fix 1 all npt/body temp $T $T 1.0 x 0.001 $P 1.0 y 0.001 $P 1.0 couple xy fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 $T 1.0 x 0.001 $P 1.0 y 0.001 $P 1.0 couple xy fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 0.5 1.0 x 0.001 $P 1.0 y 0.001 $P 1.0 couple xy fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 0.5 1.0 x 0.001 0.1 1.0 y 0.001 $P 1.0 couple xy fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 0.5 1.0 x 0.001 0.1 1.0 y 0.001 0.1 1.0 couple xy fixedpoint 0 0 0 + +fix 2 all enforce2d + +#compute 1 all body/local id 1 2 3 +#dump 1 all local 100000 dump.polygon.* index c_1[1] c_1[2] c_1[3] c_1[4] + +thermo_style custom step ke pe etotal press +thermo 1000 + +#dump 2 all image 10000 image.*.jpg type type zoom 2.0 # adiam 1.5 body type 0 0 +#dump_modify 2 pad 6 + +run ${steps} +run 100000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.15685 + ghost atom cutoff = 6.15685 + binsize = 3.07843, bins = 16 16 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair body/rounded/polygon, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.781 | 4.781 | 4.781 Mbytes +Step KinEng PotEng TotEng Press + 0 0.484375 0.25 0.734375 0.0067274306 + 1000 0.39423376 0.0017918048 0.39602557 0.0021941612 + 2000 0.42284177 0.01346585 0.43630762 0.0029377883 + 3000 0.58154405 0.011321689 0.59286574 0.003667871 + 4000 0.73518304 0.034603175 0.76978621 0.0018689207 + 5000 0.84367476 0.025292163 0.86896692 0.0089161373 + 6000 0.70803236 0.0085631016 0.71659546 0.0045552895 + 7000 0.56206452 0.10453031 0.66659483 0.010255161 + 8000 0.64538994 0.088817673 0.73420761 0.0037633655 + 9000 0.90540819 0.063696004 0.96910419 0.0077673359 + 10000 0.68632042 0.093265016 0.77958544 0.0057864838 + 11000 0.59118074 0.025654748 0.61683549 0.012518759 + 12000 0.67522767 0.038176401 0.71340407 0.01741153 + 13000 0.7644843 0.10429844 0.86878274 0.013161339 + 14000 0.56152694 0.067836655 0.62936359 0.016852121 + 15000 0.41895506 0.019513348 0.43846841 0.015225695 + 16000 0.55799421 0.1564559 0.71445011 0.011703561 + 17000 0.59391964 0.034450221 0.62836986 0.026215002 + 18000 0.75911858 0.030885726 0.7900043 0.018396366 + 19000 0.64417995 0.12110912 0.76528907 0.010247952 + 20000 0.57751435 0.16965651 0.74717086 0.023392323 + 21000 0.7613368 0.13405354 0.89539034 0.021498982 + 22000 0.57676692 0.18011879 0.75688571 0.024469161 + 23000 0.54043723 0.11842026 0.65885749 0.019799067 + 24000 0.62276061 0.038967924 0.66172853 0.019080086 + 25000 0.53157536 0.11651937 0.64809473 0.017019298 + 26000 0.72213293 0.039012448 0.76114538 0.015434904 + 27000 0.62157832 0.13697494 0.75855326 0.028711011 + 28000 0.41323738 0.16301101 0.57624839 0.041792632 + 29000 0.45774328 0.17569066 0.63343394 0.019975231 + 30000 0.78901796 0.099791386 0.88880934 0.024116947 + 31000 0.85205397 0.11977547 0.97182945 0.026667489 + 32000 0.37137095 0.1232622 0.49463315 0.00087637364 + 33000 0.26860871 0.26056381 0.52917252 0.036110517 + 34000 0.3018636 0.21336905 0.51523265 0.040315549 + 35000 0.39915129 0.28245957 0.68161085 0.034876856 + 36000 0.25761236 0.2352705 0.49288286 0.022772767 + 37000 0.1071233 0.31692858 0.42405188 0.017994666 + 38000 0.083729577 0.28473145 0.36846103 -0.0045370431 + 39000 0.070355565 0.26682083 0.33717639 0.017921556 + 40000 0.075894079 0.20077896 0.27667304 0.014873186 + 41000 0.05891028 0.15989064 0.21880092 0.025547873 + 42000 0.1225107 0.16583605 0.28834675 0.038842785 + 43000 0.17049189 0.14323991 0.3137318 0.029550161 + 44000 0.26823939 0.15208257 0.42032196 0.028113612 + 45000 0.10172203 0.1729706 0.27469264 -0.013769913 + 46000 0.14841355 0.19085074 0.33926429 -0.00073741985 + 47000 0.27654927 0.19097937 0.46752864 0.04021431 + 48000 0.53432331 0.080769923 0.61509323 0.029932845 + 49000 0.69111634 0.13064951 0.82176585 0.028985406 + 50000 0.24520806 0.18317453 0.42838258 0.05179746 + 51000 0.23541368 0.14281364 0.37822732 0.071884238 + 52000 0.25464996 0.095730242 0.3503802 0.034488204 + 53000 0.53677633 0.1058745 0.64265084 0.059932498 + 54000 0.32970921 0.27979128 0.60950049 0.062869716 + 55000 0.49094054 0.096735015 0.58767556 0.04728005 + 56000 0.54398249 0.2216472 0.76562969 0.056712022 + 57000 0.60869068 0.2338422 0.84253288 0.077143302 + 58000 0.72175509 0.18687368 0.90862877 0.019357656 + 59000 0.79442757 0.092502981 0.88693055 0.066882632 + 60000 0.6810555 0.077699385 0.75875488 0.095975173 + 61000 0.63178834 0.05071143 0.68249977 0.043586668 + 62000 0.76589344 0.044615704 0.81050914 0.085718411 + 63000 0.84815889 0.030527848 0.87868674 0.053072795 + 64000 0.7309043 0.051938637 0.78284294 0.058887766 + 65000 0.62498816 0.034474465 0.65946262 0.068446407 + 66000 0.69817494 0.068546004 0.76672094 0.062634433 + 67000 0.86444275 0.010184259 0.87462701 0.073635055 + 68000 0.77820319 0.0079319524 0.78613515 0.090330925 + 69000 0.56938919 0.0092629332 0.57865213 0.061838729 + 70000 0.61870712 0.010047381 0.6287545 0.066501338 + 71000 0.71651803 0.0088366199 0.72535465 0.079136316 + 72000 0.76278925 0.008828151 0.77161741 0.063672771 + 73000 0.75447428 0.0083985526 0.76287283 0.078256913 + 74000 0.66185251 0.0091910052 0.67104351 0.069840511 + 75000 0.58458829 0.0097671568 0.59435544 0.076123422 + 76000 0.7487564 0.0100022 0.7587586 0.076171741 + 77000 0.89505465 0.009250681 0.90430533 0.074921699 + 78000 0.73738164 0.0092029279 0.74658457 0.078835344 + 79000 0.65735281 0.010099528 0.66745233 0.077940627 + 80000 0.70247542 0.010306464 0.71278189 0.079560093 + 81000 0.74839505 0.010199092 0.75859415 0.080835104 + 82000 0.75193767 0.010274058 0.76221173 0.081086684 + 83000 0.71392598 0.010495573 0.72442156 0.082746145 + 84000 0.58498928 0.011027388 0.59601667 0.08356465 + 85000 0.59022869 0.011729474 0.60195817 0.084519397 + 86000 0.81753578 0.011208964 0.82874475 0.085490261 + 87000 0.83480682 0.010542579 0.8453494 0.086268527 + 88000 0.67322538 0.011170734 0.68439611 0.08751623 + 89000 0.62637389 0.012033316 0.6384072 0.088548094 + 90000 0.92828557 0.011750388 0.94003596 0.089199823 + 91000 0.96072564 0.010324509 0.97105015 0.090204803 + 92000 0.72105071 0.011484152 0.73253486 0.09140819 + 93000 0.65762527 0.012558219 0.67018349 0.092453474 + 94000 0.73991591 0.01261909 0.752535 0.093373477 + 95000 0.91791653 0.011980455 0.92989699 0.094182136 + 96000 0.76562561 0.011807085 0.7774327 0.095323684 + 97000 0.57292104 0.013610205 0.58653124 0.096505977 + 98000 0.68141076 0.013863204 0.69527396 0.097380069 + 99000 0.82390969 0.013002341 0.83691203 0.098235926 + 100000 0.77639728 0.012989342 0.78938662 0.099274147 +Loop time of 3.88899 on 1 procs for 100000 steps with 32 atoms + +Performance: 2221655.884 tau/day, 25713.610 timesteps/s +99.9% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 3.056 | 3.056 | 3.056 | 0.0 | 78.58 +Neigh | 0.0051048 | 0.0051048 | 0.0051048 | 0.0 | 0.13 +Comm | 0.091444 | 0.091444 | 0.091444 | 0.0 | 2.35 +Output | 0.0011995 | 0.0011995 | 0.0011995 | 0.0 | 0.03 +Modify | 0.69909 | 0.69909 | 0.69909 | 0.0 | 17.98 +Other | | 0.03616 | | | 0.93 + +Nlocal: 32 ave 32 max 32 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 21 ave 21 max 21 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 57 ave 57 max 57 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 57 +Ave neighs/atom = 1.78125 +Neighbor list builds = 1445 +Dangerous builds = 0 +Total wall time: 0:00:03 diff --git a/examples/body/log.9Jul18.body.squares.g++.4 b/examples/body/log.9Jul18.body.squares.g++.4 new file mode 100644 index 0000000000..56d7734b7b --- /dev/null +++ b/examples/body/log.9Jul18.body.squares.g++.4 @@ -0,0 +1,221 @@ +LAMMPS (29 Jun 2018) +# 2d rounded polygon bodies + +variable r index 4 +variable steps index 100000 +variable T index 0.5 +variable P index 0.1 +variable seed index 980411 + +units lj +dimension 2 + +atom_style body rounded/polygon 1 6 +atom_modify map array +read_data data.squares + orthogonal box = (0 0 -0.5) to (12 12 0.5) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 2 atoms + 2 bodies + +replicate $r $r 1 +replicate 4 $r 1 +replicate 4 4 1 + orthogonal box = (0 0 -0.5) to (48 48 0.5) + 2 by 2 by 1 MPI processor grid + 32 atoms + Time spent = 0.000324011 secs + +velocity all create $T ${seed} dist gaussian mom yes rot yes +velocity all create 0.5 ${seed} dist gaussian mom yes rot yes +velocity all create 0.5 980411 dist gaussian mom yes rot yes + +variable cut_inner equal 0.5 +variable k_n equal 100 +variable k_na equal 2 +variable c_n equal 1 +variable c_t equal 1 +variable mu equal 0.1 +variable delta_ua equal 0.5 + +pair_style body/rounded/polygon ${c_n} ${c_t} ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 1 ${c_t} ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 1 1 ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 1 1 0.1 ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 1 1 0.1 0.5 ${cut_inner} +pair_style body/rounded/polygon 1 1 0.1 0.5 0.5 +pair_coeff * * ${k_n} ${k_na} +pair_coeff * * 100 ${k_na} +pair_coeff * * 100 2 + +comm_modify vel yes + +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.001 + +#fix 1 all nve/body +#fix 1 all nvt/body temp $T $T 1.0 +fix 1 all npt/body temp $T $T 1.0 x 0.001 $P 1.0 y 0.001 $P 1.0 couple xy fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 $T 1.0 x 0.001 $P 1.0 y 0.001 $P 1.0 couple xy fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 0.5 1.0 x 0.001 $P 1.0 y 0.001 $P 1.0 couple xy fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 0.5 1.0 x 0.001 0.1 1.0 y 0.001 $P 1.0 couple xy fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 0.5 1.0 x 0.001 0.1 1.0 y 0.001 0.1 1.0 couple xy fixedpoint 0 0 0 + +fix 2 all enforce2d + +#compute 1 all body/local id 1 2 3 +#dump 1 all local 100000 dump.polygon.* index c_1[1] c_1[2] c_1[3] c_1[4] + +thermo_style custom step ke pe etotal press +thermo 1000 + +#dump 2 all image 10000 image.*.jpg type type zoom 2.0 # adiam 1.5 body type 0 0 +#dump_modify 2 pad 6 + +run ${steps} +run 100000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.15685 + ghost atom cutoff = 6.15685 + binsize = 3.07843, bins = 16 16 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair body/rounded/polygon, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.774 | 4.774 | 4.774 Mbytes +Step KinEng PotEng TotEng Press + 0 0.484375 0.25 0.734375 0.0067274306 + 1000 0.39423376 0.0017918048 0.39602557 0.0021941612 + 2000 0.42284177 0.01346585 0.43630762 0.0029377883 + 3000 0.58154405 0.011321689 0.59286574 0.003667871 + 4000 0.73518304 0.034603175 0.76978621 0.0018689207 + 5000 0.84367476 0.025292163 0.86896692 0.0089161373 + 6000 0.70803236 0.0085631016 0.71659546 0.0045552895 + 7000 0.56206452 0.10453031 0.66659483 0.010255161 + 8000 0.64538994 0.088817673 0.73420761 0.0037633655 + 9000 0.90540819 0.063696004 0.96910419 0.0077673359 + 10000 0.68632042 0.093265016 0.77958544 0.0057864837 + 11000 0.59118074 0.025654748 0.61683549 0.012518759 + 12000 0.67522767 0.038176401 0.71340407 0.01741153 + 13000 0.7644843 0.10429844 0.86878274 0.013161339 + 14000 0.56152694 0.067836656 0.6293636 0.016852113 + 15000 0.41895505 0.019513353 0.43846841 0.015225696 + 16000 0.55799443 0.15645637 0.7144508 0.011703646 + 17000 0.59385248 0.03451986 0.62837234 0.025482966 + 18000 0.75902169 0.031103586 0.79012527 0.018263354 + 19000 0.64266826 0.12535314 0.76802141 0.014884119 + 20000 0.57836261 0.16581188 0.74417449 0.024667165 + 21000 0.78281936 0.11877527 0.90159464 -0.0090089213 + 22000 0.5312006 0.13300874 0.66420934 0.025797278 + 23000 0.56458861 0.084369128 0.64895774 0.024630917 + 24000 0.65126875 0.06122992 0.71249867 0.034377198 + 25000 0.55173441 0.15694886 0.70868327 0.021634086 + 26000 0.59121615 0.17071182 0.76192797 0.024758366 + 27000 0.6394843 0.17442949 0.81391378 0.034919937 + 28000 0.31144221 0.41243036 0.72387256 0.074115225 + 29000 0.13516917 0.3075419 0.44271107 0.023861298 + 30000 0.14094934 0.24407203 0.38502137 0.037030438 + 31000 0.26313749 0.087395422 0.35053291 0.042347005 + 32000 0.51602457 0.063012079 0.57903664 0.018550299 + 33000 0.55628829 0.200213 0.75650129 0.026507686 + 34000 0.97399408 0.082504517 1.0564986 0.037889878 + 35000 0.64710533 0.17662002 0.82372535 0.058295508 + 36000 0.45769083 0.08241194 0.54010277 0.014957415 + 37000 0.72850105 0.053874061 0.78237512 0.037194593 + 38000 0.44177995 0.28939498 0.73117493 0.045194029 + 39000 0.46828451 0.077630686 0.54591519 0.089849009 + 40000 0.46786451 0.092828423 0.56069294 0.028042052 + 41000 0.71861856 0.097085715 0.81570427 0.036473296 + 42000 0.74121021 0.10553127 0.84674148 0.054058843 + 43000 0.62945489 0.12770673 0.75716161 0.047267994 + 44000 0.49900638 0.085150056 0.58415644 0.054798793 + 45000 0.70199572 0.063415877 0.7654116 0.038363546 + 46000 0.49513142 0.10649384 0.60162526 0.059392561 + 47000 0.3858898 0.079458749 0.46534855 0.051825764 + 48000 0.62585854 0.028585902 0.65444444 0.054074424 + 49000 0.65934482 0.51865062 1.1779954 -0.035272836 + 50000 0.5420438 0.082056756 0.62410056 0.031187494 + 51000 0.36685223 0.14224019 0.50909241 0.073790397 + 52000 0.19044627 0.15368389 0.34413016 0.059034266 + 53000 0.26847678 0.075693324 0.3441701 0.032276915 + 54000 0.3593711 0.19034549 0.54971659 0.070827883 + 55000 0.21659198 0.1929074 0.40949939 0.035916364 + 56000 0.28242715 0.12313241 0.40555956 0.062083926 + 57000 0.34067475 0.14711992 0.48779467 0.059321458 + 58000 0.4842796 0.16143425 0.64571385 0.059048247 + 59000 0.84438871 0.076546849 0.92093556 0.048046901 + 60000 0.92794849 0.054331626 0.98228012 0.058392272 + 61000 0.6916736 0.076168342 0.76784194 0.058654987 + 62000 0.63317965 0.094506389 0.72768604 0.061044719 + 63000 0.63317266 0.038785593 0.67195825 0.097236147 + 64000 0.81696668 0.121811 0.93877769 0.064935373 + 65000 0.82644758 0.25188344 1.078331 0.093352359 + 66000 0.64975019 0.17930857 0.82905876 0.058805254 + 67000 0.63487678 0.16877059 0.80364737 0.070254696 + 68000 0.79140717 0.11631004 0.9077172 0.064646394 + 69000 0.85687272 0.057835331 0.91470805 0.071057291 + 70000 0.67785976 0.040686768 0.71854653 0.074687222 + 71000 0.60594577 0.032193155 0.63813893 0.069349268 + 72000 0.77586745 0.024068533 0.79993598 0.083394193 + 73000 0.88877625 0.025746326 0.91452258 0.081511105 + 74000 0.73507888 0.036574786 0.77165367 0.075360233 + 75000 0.68787782 0.042098622 0.72997644 0.068651098 + 76000 0.72515745 0.04360868 0.76876613 0.069594624 + 77000 0.77580944 0.041826702 0.81763614 0.071937144 + 78000 0.76640394 0.039285046 0.80568899 0.074274921 + 79000 0.62504309 0.039593585 0.66463667 0.076443295 + 80000 0.60001642 0.043468215 0.64348464 0.094547719 + 81000 0.82175037 0.045608873 0.86735924 0.080186295 + 82000 0.85783276 0.042692576 0.90052534 0.081576548 + 83000 0.71367707 0.042172193 0.75584926 0.08256625 + 84000 0.68532406 0.044724759 0.73004882 0.083672013 + 85000 0.72576789 0.046982462 0.77275035 0.084789331 + 86000 0.75597701 0.04765086 0.80362787 0.085758056 + 87000 0.74190598 0.047629096 0.78953507 0.086679976 + 88000 0.60967704 0.049906172 0.65958321 0.085526191 + 89000 0.54490288 0.054768238 0.59967112 0.090604027 + 90000 0.75398341 0.057153453 0.81113686 0.091900858 + 91000 0.84577472 0.052753512 0.89852823 0.091913909 + 92000 0.7176235 0.050677427 0.76830093 0.092032507 + 93000 0.61699446 0.054097013 0.67109147 0.092071275 + 94000 0.76330752 0.057398618 0.82070614 0.092435043 + 95000 0.98754458 0.053801311 1.0413459 0.093526707 + 96000 0.7405897 0.052135628 0.79272533 0.095011929 + 97000 0.65587599 0.057011962 0.71288795 0.096692123 + 98000 0.72345634 0.060700171 0.78415651 0.097510345 + 99000 0.88283624 0.061795247 0.94463149 0.09799633 + 100000 0.86303812 0.058912988 0.92195111 0.09892993 +Loop time of 2.80074 on 4 procs for 100000 steps with 32 atoms + +Performance: 3084895.573 tau/day, 35704.810 timesteps/s +99.9% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.81169 | 0.89466 | 0.97669 | 8.4 | 31.94 +Neigh | 0.0017524 | 0.0018129 | 0.0018773 | 0.1 | 0.06 +Comm | 0.91307 | 0.99193 | 1.0691 | 7.3 | 35.42 +Output | 0.00076914 | 0.00093722 | 0.0013936 | 0.0 | 0.03 +Modify | 0.75335 | 0.75779 | 0.76346 | 0.4 | 27.06 +Other | | 0.1536 | | | 5.48 + +Nlocal: 8 ave 10 max 4 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Nghost: 17.25 ave 19 max 15 min +Histogram: 1 0 1 0 0 0 0 0 0 2 +Neighs: 13.5 ave 21 max 5 min +Histogram: 1 0 0 0 1 0 1 0 0 1 + +Total # of neighbors = 54 +Ave neighs/atom = 1.6875 +Neighbor list builds = 1443 +Dangerous builds = 0 +Total wall time: 0:00:02 diff --git a/examples/body/log.9Jul18.body.wall2d.g++.1 b/examples/body/log.9Jul18.body.wall2d.g++.1 new file mode 100644 index 0000000000..f22c366380 --- /dev/null +++ b/examples/body/log.9Jul18.body.wall2d.g++.1 @@ -0,0 +1,223 @@ +LAMMPS (29 Jun 2018) +# 2d rounded polygon bodies + +variable r index 4 +variable steps index 100000 +variable T index 0.5 +variable P index 0.1 +variable seed index 980411 + +units lj +dimension 2 + +atom_style body rounded/polygon 1 6 +atom_modify map array +read_data data.squares + orthogonal box = (0 0 -0.5) to (12 12 0.5) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 2 atoms + 2 bodies + +replicate $r $r 1 +replicate 4 $r 1 +replicate 4 4 1 + orthogonal box = (0 0 -0.5) to (48 48 0.5) + 1 by 1 by 1 MPI processor grid + 32 atoms + Time spent = 0.00029707 secs + +velocity all create $T ${seed} dist gaussian mom yes rot yes +velocity all create 0.5 ${seed} dist gaussian mom yes rot yes +velocity all create 0.5 980411 dist gaussian mom yes rot yes + +change_box all boundary p f p + +variable cut_inner equal 0.5 +variable k_n equal 100 +variable k_na equal 2 +variable c_n equal 0.1 +variable c_t equal 0.1 +variable mu equal 0.1 +variable delta_ua equal 0.5 + +pair_style body/rounded/polygon ${c_n} ${c_t} ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 0.1 ${c_t} ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 0.1 0.1 ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 0.1 0.1 0.1 ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 0.1 0.1 0.1 0.5 ${cut_inner} +pair_style body/rounded/polygon 0.1 0.1 0.1 0.5 0.5 +pair_coeff * * ${k_n} ${k_na} +pair_coeff * * 100 ${k_na} +pair_coeff * * 100 2 + +comm_modify vel yes + +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.001 + +#fix 1 all nve/body +#fix 1 all nvt/body temp $T $T 1.0 +fix 1 all npt/body temp $T $T 1.0 x 0.001 $P 1.0 fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 $T 1.0 x 0.001 $P 1.0 fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 0.5 1.0 x 0.001 $P 1.0 fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 0.5 1.0 x 0.001 0.1 1.0 fixedpoint 0 0 0 + +fix 2 all enforce2d +fix 3 all wall/body/polygon 2000 50 50 yplane 0.0 48.0 + +#compute 1 all body/local id 1 2 3 +#dump 1 all local 100000 dump.polygon.* index c_1[1] c_1[2] c_1[3] c_1[4] + +thermo_style custom step ke pe etotal press +thermo 1000 + +#dump 2 all image 10000 image.*.jpg type type zoom 2.0 # adiam 1.5 body type 0 0 +#dump_modify 2 pad 6 + +run ${steps} +run 100000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.15685 + ghost atom cutoff = 6.15685 + binsize = 3.07843, bins = 16 16 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair body/rounded/polygon, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.771 | 4.771 | 4.771 Mbytes +Step KinEng PotEng TotEng Press + 0 0.484375 0.25 0.734375 0.0067274306 + 1000 0.49241101 0.0031318767 0.49554289 0.017768281 + 2000 0.56118632 0.0026068888 0.56379321 0.003410416 + 3000 0.75565115 0.025578366 0.78122951 0.0071862988 + 4000 0.72298647 0.093150646 0.81613712 0.003190158 + 5000 0.51684166 0.049164868 0.56600653 0.0096960168 + 6000 0.56627905 0.048132853 0.6144119 0.020733586 + 7000 0.58122129 0.018223718 0.59944501 0.0038160759 + 8000 0.64297977 0.025934821 0.66891459 0.0041091784 + 9000 0.41748404 0.0077890042 0.42527305 0.0039270065 + 10000 0.35738377 0.078487805 0.43587158 3.9079782e-05 + 11000 0.41529308 0.13619284 0.55148592 -0.0067482285 + 12000 0.43274718 0.071315497 0.50406268 0.007006378 + 13000 0.4748331 0.069904647 0.54473775 0.0010384372 + 14000 0.6287791 0.12721033 0.75598943 0.0047792448 + 15000 0.4692413 0.12344005 0.59268136 0.018033616 + 16000 0.43157074 0.14306789 0.57463862 0.042356676 + 17000 0.53085999 0.22126296 0.75212294 0.027509646 + 18000 0.52688968 0.13225282 0.6591425 0.0021558013 + 19000 0.55032328 0.12513047 0.67545375 0.025036251 + 20000 0.48465097 0.1431055 0.62775647 0.017193781 + 21000 0.53166734 0.21928574 0.75095307 0.011564317 + 22000 0.62177353 0.09296159 0.71473512 0.017660922 + 23000 0.6972939 0.12434123 0.82163514 0.024432327 + 24000 0.42767372 0.22152311 0.64919684 -0.013712449 + 25000 0.4816037 0.19272865 0.67433236 0.052386055 + 26000 0.72642579 0.19697046 0.92339625 0.020407694 + 27000 0.39649144 0.15058326 0.5470747 0.023705766 + 28000 0.44896324 0.18500106 0.6339643 -0.0089410286 + 29000 0.5565759 0.11085772 0.66743362 0.048437166 + 30000 0.58173584 0.21773281 0.79946865 0.0057357773 + 31000 0.49199415 0.23601982 0.72801397 0.046744152 + 32000 0.55665496 0.20542161 0.76207658 -0.0038756805 + 33000 0.62730739 0.24460524 0.87191263 0.045330682 + 34000 0.58107044 0.16395278 0.74502322 -0.0049496051 + 35000 0.56838849 0.21842922 0.78681771 0.0062086036 + 36000 0.45910273 0.28464172 0.74374445 -0.011700747 + 37000 0.37092037 0.27646862 0.647389 0.022305679 + 38000 0.7278047 0.30674438 1.0345491 0.07698342 + 39000 0.5132923 0.27395066 0.78724295 0.026898634 + 40000 0.62348649 0.24424644 0.86773293 0.039403899 + 41000 0.3658401 0.15512326 0.52096337 0.022559003 + 42000 0.4912253 0.35712978 0.84835508 -0.010336341 + 43000 0.70225957 0.36314638 1.0654059 0.004148866 + 44000 0.56958157 0.25488927 0.82447084 0.067537066 + 45000 0.45854352 0.30149439 0.76003791 -0.017002401 + 46000 0.62787247 0.34567995 0.97355242 0.11894801 + 47000 0.61348914 0.29378625 0.90727539 0.067873976 + 48000 0.71301829 0.34135284 1.0543711 0.021077736 + 49000 0.53520804 0.30593196 0.84113999 0.0059257647 + 50000 0.44966403 0.35370793 0.80337195 0.0020395669 + 51000 0.5236113 0.32296924 0.84658054 -0.051011506 + 52000 0.53905573 0.351771 0.89082672 0.013720106 + 53000 0.55978158 0.41293947 0.97272106 0.068558589 + 54000 0.52170459 0.2718066 0.7935112 0.0093138985 + 55000 0.61078876 0.43353897 1.0443277 0.045377392 + 56000 0.51300655 0.33182278 0.84482933 -0.018418487 + 57000 0.54882822 0.38380093 0.93262915 0.10249946 + 58000 0.72106212 0.45361279 1.1746749 0.030313481 + 59000 0.55871447 0.63823029 1.1969448 0.019079703 + 60000 0.49395192 0.58283102 1.0767829 0.0179349 + 61000 0.45991079 0.62540573 1.0853165 0.074398804 + 62000 0.4655788 0.60862262 1.0742014 0.11472976 + 63000 0.55634524 0.63069255 1.1870378 -0.0025676135 + 64000 0.57688903 0.45435264 1.0312417 0.0083813852 + 65000 0.57168922 0.42217005 0.99385927 0.044931269 + 66000 0.6206044 0.46727538 1.0878798 0.019686229 + 67000 0.61037155 0.41840109 1.0287726 0.0195109 + 68000 0.63848598 0.41305347 1.0515395 0.072940144 + 69000 0.49244916 0.3834095 0.87585866 0.07963677 + 70000 0.41847062 0.51907975 0.93755037 0.18447904 + 71000 0.45198986 0.52973709 0.98172695 0.078419371 + 72000 0.47064262 0.37808165 0.84872427 -0.00046308054 + 73000 0.6690143 0.37549359 1.0445079 0.061208432 + 74000 0.60444955 0.33779636 0.94224592 -0.068840321 + 75000 0.61762382 0.3916421 1.0092659 0.16253292 + 76000 0.63657961 0.50277989 1.1393595 0.013857508 + 77000 0.52524028 0.43597896 0.96121924 -0.03296482 + 78000 0.43803533 0.33172284 0.76975817 0.078763029 + 79000 0.67156089 0.55272177 1.2242827 0.080822223 + 80000 0.68678238 0.46061627 1.1473987 0.0027036992 + 81000 0.64956678 0.44959229 1.0991591 0.11201483 + 82000 0.51060477 0.43508342 0.9456882 0.028000608 + 83000 0.59550548 0.69026083 1.2857663 -0.0015809004 + 84000 0.64222145 0.38768816 1.0299096 0.014153173 + 85000 0.7661229 0.43445261 1.2005755 0.048034534 + 86000 0.60025257 0.53027929 1.1305319 0.0056865157 + 87000 0.46220939 0.47470035 0.93690974 0.075311946 + 88000 0.54123847 0.62899839 1.1702369 0.13260162 + 89000 0.61212272 0.6114241 1.2235468 0.033284822 + 90000 0.63924773 0.6916249 1.3308726 0.045088296 + 91000 0.49316865 0.51037033 1.003539 0.023203598 + 92000 0.57572123 0.43496319 1.0106844 0.297092 + 93000 0.65187559 0.56815972 1.2200353 0.1538215 + 94000 0.64107331 0.58948521 1.2305585 0.031117778 + 95000 0.64584158 0.6364688 1.2823104 0.096154676 + 96000 0.60509093 0.601487 1.2065779 0.03457172 + 97000 0.68837218 0.77974186 1.468114 0.17801164 + 98000 0.62725266 0.64137144 1.2686241 0.17449001 + 99000 0.46861221 0.67000291 1.1386151 0.2429588 + 100000 0.5879119 0.7140612 1.3019731 0.064634257 +Loop time of 2.50594 on 1 procs for 100000 steps with 32 atoms + +Performance: 3447804.126 tau/day, 39905.140 timesteps/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.5639 | 1.5639 | 1.5639 | 0.0 | 62.41 +Neigh | 0.0086911 | 0.0086911 | 0.0086911 | 0.0 | 0.35 +Comm | 0.058926 | 0.058926 | 0.058926 | 0.0 | 2.35 +Output | 0.0012379 | 0.0012379 | 0.0012379 | 0.0 | 0.05 +Modify | 0.83537 | 0.83537 | 0.83537 | 0.0 | 33.34 +Other | | 0.03781 | | | 1.51 + +Nlocal: 32 ave 32 max 32 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 20 ave 20 max 20 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 57 ave 57 max 57 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 57 +Ave neighs/atom = 1.78125 +Neighbor list builds = 2705 +Dangerous builds = 0 +Total wall time: 0:00:02 diff --git a/examples/body/log.9Jul18.body.wall2d.g++.4 b/examples/body/log.9Jul18.body.wall2d.g++.4 new file mode 100644 index 0000000000..7239fd4dcd --- /dev/null +++ b/examples/body/log.9Jul18.body.wall2d.g++.4 @@ -0,0 +1,223 @@ +LAMMPS (29 Jun 2018) +# 2d rounded polygon bodies + +variable r index 4 +variable steps index 100000 +variable T index 0.5 +variable P index 0.1 +variable seed index 980411 + +units lj +dimension 2 + +atom_style body rounded/polygon 1 6 +atom_modify map array +read_data data.squares + orthogonal box = (0 0 -0.5) to (12 12 0.5) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 2 atoms + 2 bodies + +replicate $r $r 1 +replicate 4 $r 1 +replicate 4 4 1 + orthogonal box = (0 0 -0.5) to (48 48 0.5) + 2 by 2 by 1 MPI processor grid + 32 atoms + Time spent = 0.000386 secs + +velocity all create $T ${seed} dist gaussian mom yes rot yes +velocity all create 0.5 ${seed} dist gaussian mom yes rot yes +velocity all create 0.5 980411 dist gaussian mom yes rot yes + +change_box all boundary p f p + +variable cut_inner equal 0.5 +variable k_n equal 100 +variable k_na equal 2 +variable c_n equal 0.1 +variable c_t equal 0.1 +variable mu equal 0.1 +variable delta_ua equal 0.5 + +pair_style body/rounded/polygon ${c_n} ${c_t} ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 0.1 ${c_t} ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 0.1 0.1 ${mu} ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 0.1 0.1 0.1 ${delta_ua} ${cut_inner} +pair_style body/rounded/polygon 0.1 0.1 0.1 0.5 ${cut_inner} +pair_style body/rounded/polygon 0.1 0.1 0.1 0.5 0.5 +pair_coeff * * ${k_n} ${k_na} +pair_coeff * * 100 ${k_na} +pair_coeff * * 100 2 + +comm_modify vel yes + +neighbor 0.5 bin +neigh_modify every 1 delay 0 check yes + +timestep 0.001 + +#fix 1 all nve/body +#fix 1 all nvt/body temp $T $T 1.0 +fix 1 all npt/body temp $T $T 1.0 x 0.001 $P 1.0 fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 $T 1.0 x 0.001 $P 1.0 fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 0.5 1.0 x 0.001 $P 1.0 fixedpoint 0 0 0 +fix 1 all npt/body temp 0.5 0.5 1.0 x 0.001 0.1 1.0 fixedpoint 0 0 0 + +fix 2 all enforce2d +fix 3 all wall/body/polygon 2000 50 50 yplane 0.0 48.0 + +#compute 1 all body/local id 1 2 3 +#dump 1 all local 100000 dump.polygon.* index c_1[1] c_1[2] c_1[3] c_1[4] + +thermo_style custom step ke pe etotal press +thermo 1000 + +#dump 2 all image 10000 image.*.jpg type type zoom 2.0 # adiam 1.5 body type 0 0 +#dump_modify 2 pad 6 + +run ${steps} +run 100000 +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.15685 + ghost atom cutoff = 6.15685 + binsize = 3.07843, bins = 16 16 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair body/rounded/polygon, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.773 | 4.773 | 4.773 Mbytes +Step KinEng PotEng TotEng Press + 0 0.484375 0.25 0.734375 0.0067274306 + 1000 0.49241101 0.0031318767 0.49554289 0.017768281 + 2000 0.56118632 0.0026068888 0.56379321 0.003410416 + 3000 0.75565115 0.025578366 0.78122951 0.0071862988 + 4000 0.72298647 0.093150646 0.81613712 0.003190158 + 5000 0.51684166 0.049164868 0.56600653 0.0096960168 + 6000 0.56627905 0.048132853 0.6144119 0.020733586 + 7000 0.58122129 0.018223718 0.59944501 0.0038160759 + 8000 0.64297977 0.025934821 0.66891459 0.0041091784 + 9000 0.41748404 0.0077890042 0.42527305 0.0039270065 + 10000 0.35738377 0.078487805 0.43587158 3.9079865e-05 + 11000 0.41529307 0.13619284 0.55148591 -0.0067482285 + 12000 0.43274718 0.071315527 0.50406271 0.007006369 + 13000 0.4748324 0.069905666 0.54473807 0.0010385254 + 14000 0.62603727 0.098905625 0.7249429 0.0048876764 + 15000 0.44512086 0.10415235 0.54927321 0.01902062 + 16000 0.47460177 0.18053316 0.65513493 0.045013976 + 17000 0.52742676 0.10110706 0.62853382 0.013615471 + 18000 0.46111734 0.096118795 0.55723613 0.0073676834 + 19000 0.59668439 0.13652292 0.73320731 0.029403553 + 20000 0.46840192 0.11611719 0.58451911 -0.00034412499 + 21000 0.53550533 0.096457461 0.6319628 0.0019785732 + 22000 0.46599715 0.13206373 0.59806087 0.031970672 + 23000 0.49280776 0.20404726 0.69685501 0.03657433 + 24000 0.60901688 0.18255214 0.79156902 0.044955017 + 25000 0.47345185 0.13671357 0.61016542 0.020313539 + 26000 0.47653832 0.12448225 0.60102057 0.01878099 + 27000 0.50008212 0.24740634 0.74748845 0.021862639 + 28000 0.41627204 0.2519463 0.66821834 0.054683701 + 29000 0.55608273 0.23100212 0.78708485 -0.0043318497 + 30000 0.53884537 0.3001584 0.83900377 -0.012838186 + 31000 0.53036238 0.2300328 0.76039518 -0.0061688449 + 32000 0.42666792 0.20536256 0.63203048 0.045305282 + 33000 0.62908185 0.1652033 0.79428515 0.0072777588 + 34000 0.47028154 0.388736 0.85901754 0.04332288 + 35000 0.54602322 0.2775624 0.82358562 0.02898206 + 36000 0.59860544 0.21824655 0.81685199 0.0025936194 + 37000 0.62467827 0.11983499 0.74451326 0.050052743 + 38000 0.72594229 0.36584781 1.0917901 0.04280621 + 39000 0.51129656 0.23859043 0.74988699 0.050817447 + 40000 0.53263836 0.24212889 0.77476725 0.036245922 + 41000 0.50288088 0.36668283 0.86956371 0.018381415 + 42000 0.46653688 0.21974887 0.68628574 0.012661062 + 43000 0.61738785 0.32131037 0.93869821 0.012709433 + 44000 0.56603903 0.26515554 0.83119457 0.03315102 + 45000 0.56231638 0.32111693 0.88343331 0.06079756 + 46000 0.7096208 0.2570131 0.96663391 0.048770468 + 47000 0.588755 0.1880748 0.7768298 0.035962604 + 48000 0.56296339 0.25783519 0.82079858 0.053019928 + 49000 0.419885 0.42328618 0.84317118 0.038105269 + 50000 0.63073351 0.41426285 1.0449964 0.0015271048 + 51000 0.59357935 0.184222 0.77780136 0.015996218 + 52000 0.60608471 0.36247533 0.96856003 0.10984665 + 53000 0.5227842 0.27686739 0.79965159 0.02761699 + 54000 0.39435923 0.34197355 0.73633278 0.061183263 + 55000 0.46748455 0.34230903 0.80979358 0.077441382 + 56000 0.59819827 0.29212061 0.89031889 0.043772353 + 57000 0.61682559 0.32788566 0.94471124 0.03992069 + 58000 0.52702478 0.24891506 0.77593984 0.058480883 + 59000 0.66925719 0.4109031 1.0801603 0.072434423 + 60000 0.66807714 0.39233068 1.0604078 0.082370324 + 61000 0.5724275 0.43308567 1.0055132 0.0072945426 + 62000 0.49433556 0.38453743 0.87887299 0.0036097443 + 63000 0.57575143 0.54067119 1.1164226 0.073339638 + 64000 0.68045383 0.38246533 1.0629192 0.025314593 + 65000 0.59843527 0.42928622 1.0277215 -0.030096445 + 66000 0.60274797 0.50186417 1.1046121 0.069797184 + 67000 0.47450407 0.52689807 1.0014021 0.008758012 + 68000 0.5514135 0.64113187 1.1925454 0.093863314 + 69000 0.52008074 0.45749565 0.97757639 -0.066061381 + 70000 0.69042662 0.50416006 1.1945867 0.014128617 + 71000 0.63925854 0.35153425 0.9907928 -0.01134957 + 72000 0.52088835 0.47626986 0.99715821 0.10198133 + 73000 0.46333852 0.5515537 1.0148922 0.00060582772 + 74000 0.53481418 0.50409531 1.0389095 0.00919451 + 75000 0.67182749 0.50380162 1.1756291 0.043301985 + 76000 0.70492289 0.4112122 1.1161351 0.14880484 + 77000 0.59781817 0.50197661 1.0997948 -0.057111711 + 78000 0.51677429 0.4348232 0.95159749 -0.0074619446 + 79000 0.50663297 0.55000424 1.0566372 0.0052071216 + 80000 0.59392006 0.48394003 1.0778601 -0.018990234 + 81000 0.66323593 0.40358336 1.0668193 -0.02961345 + 82000 0.61596979 0.49177944 1.1077492 0.1314853 + 83000 0.63917554 0.61656584 1.2557414 0.11908351 + 84000 0.49305291 0.46161646 0.95466937 0.033558488 + 85000 0.52552044 0.54250555 1.068026 0.13015174 + 86000 0.55140914 0.38924725 0.94065638 0.047412499 + 87000 0.60952504 0.52603688 1.1355619 0.039230066 + 88000 0.50119735 0.547539 1.0487364 0.019659933 + 89000 0.40331401 0.50331134 0.90662535 -0.056906034 + 90000 0.47067839 0.51306911 0.9837475 0.11918166 + 91000 0.45564995 0.38693455 0.8425845 0.12040045 + 92000 0.64163032 0.34232532 0.98395564 0.0057051641 + 93000 0.70375593 0.53646186 1.2402178 0.16044241 + 94000 0.53378112 0.51971406 1.0534952 0.11389004 + 95000 0.47055342 0.50396004 0.97451346 0.079424215 + 96000 0.59543473 0.40204536 0.99748009 0.096813093 + 97000 0.64821917 0.50051728 1.1487365 0.054071312 + 98000 0.55723937 0.4945909 1.0518303 0.047316424 + 99000 0.56044424 0.50773312 1.0681774 0.0149959 + 100000 0.68254229 0.32704484 1.0095871 0.0069212661 +Loop time of 2.20043 on 4 procs for 100000 steps with 32 atoms + +Performance: 3926501.701 tau/day, 45445.622 timesteps/s +100.0% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 0.41008 | 0.41366 | 0.41719 | 0.4 | 18.80 +Neigh | 0.0027823 | 0.0030481 | 0.0034747 | 0.5 | 0.14 +Comm | 0.74581 | 0.7675 | 0.78684 | 2.0 | 34.88 +Output | 0.00082111 | 0.0010884 | 0.0016899 | 1.1 | 0.05 +Modify | 0.83828 | 0.85329 | 0.86656 | 1.4 | 38.78 +Other | | 0.1618 | | | 7.36 + +Nlocal: 8 ave 9 max 7 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +Nghost: 12.75 ave 14 max 12 min +Histogram: 2 0 0 0 0 1 0 0 0 1 +Neighs: 11 ave 19 max 5 min +Histogram: 1 0 0 2 0 0 0 0 0 1 + +Total # of neighbors = 44 +Ave neighs/atom = 1.375 +Neighbor list builds = 2663 +Dangerous builds = 0 +Total wall time: 0:00:02 diff --git a/src/BODY/body_rounded_polygon.cpp b/src/BODY/body_rounded_polygon.cpp index d848a8fa95..1e232f0f3f 100644 --- a/src/BODY/body_rounded_polygon.cpp +++ b/src/BODY/body_rounded_polygon.cpp @@ -114,7 +114,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*nsub(bonus)); + return *(bonus->dvalue + 3*nsub(bonus) + 2*nsub(bonus)); } /* ---------------------------------------------------------------------- */ @@ -124,7 +124,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*nsub(bonus)+1); + return *(bonus->dvalue + 3*nsub(bonus) + 2*nsub(bonus)+1); } /* ---------------------------------------------------------------------- */ diff --git a/src/BODY/body_rounded_polyhedron.cpp b/src/BODY/body_rounded_polyhedron.cpp index a26b6d0cbd..fb0be7c1be 100644 --- a/src/BODY/body_rounded_polyhedron.cpp +++ b/src/BODY/body_rounded_polyhedron.cpp @@ -132,7 +132,8 @@ 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*nedges(bonus)+MAX_FACE_SIZE*nfaces(bonus)); + return *(bonus->dvalue+3*nsub(bonus) + 2*nedges(bonus) + + MAX_FACE_SIZE*nfaces(bonus)); } /* ---------------------------------------------------------------------- */ @@ -142,7 +143,8 @@ double BodyRoundedPolyhedron::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*nedges(bonus)+MAX_FACE_SIZE*nfaces(bonus)+1); + return *(bonus->dvalue+3*nsub(bonus) + 2*nedges(bonus) + + MAX_FACE_SIZE*nfaces(bonus)+1); } /* ---------------------------------------------------------------------- */ @@ -205,7 +207,8 @@ void BodyRoundedPolyhedron::data_body(int ibonus, int ninteger, int ndouble, // nsub == 1 || nsub == 2 || nsub == 3: // 6 for inertia + 3*nsub for vertex coords + 1 for rounded radius // nsub > 3: - // 6 for inertia + 3*nsub for vertex coords + 2*nsub for edges + 3*nfaces + 1 for rounded radius + // 6 for inertia + 3*nsub for vertex coords + 2*nsub for edges + + // 3*nfaces + 1 for rounded radius int nedges,nentries; if (nsub == 1 || nsub == 2) { diff --git a/src/BODY/fix_wall_body_polygon.cpp b/src/BODY/fix_wall_body_polygon.cpp index 72a60b22d0..5ec5a7cca8 100644 --- a/src/BODY/fix_wall_body_polygon.cpp +++ b/src/BODY/fix_wall_body_polygon.cpp @@ -58,7 +58,8 @@ FixWallBodyPolygon::FixWallBodyPolygon(LAMMPS *lmp, int narg, char **arg) : if (narg < 7) error->all(FLERR,"Illegal fix wall/body/polygon command"); if (!atom->body_flag) - error->all(FLERR,"Fix wall/body/polygon requires atom style body/rounded/polygon"); + error->all(FLERR,"Fix wall/body/polygon requires " + "atom style body/rounded/polygon"); restart_peratom = 1; create_attribute = 1; @@ -182,7 +183,8 @@ void FixWallBodyPolygon::init() if (!avec) error->all(FLERR,"Pair body/rounded/polygon requires atom style body"); if (strcmp(avec->bptr->style,"rounded/polygon") != 0) - error->all(FLERR,"Pair body/rounded/polygon requires body style rounded/polygon"); + error->all(FLERR,"Pair body/rounded/polygon requires " + "body style rounded/polygon"); bptr = (BodyRoundedPolygon *) avec->bptr; // set pairstyle from body/polygonular pair style @@ -828,4 +830,3 @@ void FixWallBodyPolygon::distance(const double* x2, const double* x1, + (x2[1] - x1[1]) * (x2[1] - x1[1]) + (x2[2] - x1[2]) * (x2[2] - x1[2])); } - diff --git a/src/BODY/fix_wall_body_polyhedron.cpp b/src/BODY/fix_wall_body_polyhedron.cpp index 879289ea42..17e9f0b8b5 100644 --- a/src/BODY/fix_wall_body_polyhedron.cpp +++ b/src/BODY/fix_wall_body_polyhedron.cpp @@ -58,7 +58,8 @@ FixWallBodyPolyhedron::FixWallBodyPolyhedron(LAMMPS *lmp, int narg, char **arg) if (narg < 7) error->all(FLERR,"Illegal fix wall/body/polyhedron command"); if (!atom->body_flag) - error->all(FLERR,"Fix wall/body/polyhedron requires atom style body/rounded/polyhedron"); + error->all(FLERR,"Fix wall/body/polyhedron requires " + "atom style body/rounded/polyhedron"); restart_peratom = 1; create_attribute = 1; @@ -189,7 +190,8 @@ void FixWallBodyPolyhedron::init() if (!avec) error->all(FLERR,"Pair body/rounded/polyhedron requires atom style body"); if (strcmp(avec->bptr->style,"rounded/polyhedron") != 0) - error->all(FLERR,"Pair body/rounded/polyhedron requires body style rounded/polyhedron"); + error->all(FLERR,"Pair body/rounded/polyhedron requires " + "body style rounded/polyhedron"); bptr = (BodyRoundedPolyhedron *) avec->bptr; // set pairstyle from body/polyhedronular pair style @@ -941,4 +943,3 @@ void FixWallBodyPolyhedron::distance(const double* x2, const double* x1, + (x2[1] - x1[1]) * (x2[1] - x1[1]) + (x2[2] - x1[2]) * (x2[2] - x1[2])); } - diff --git a/src/BODY/pair_body_rounded_polygon.cpp b/src/BODY/pair_body_rounded_polygon.cpp index 22300091ae..c4c09fd677 100644 --- a/src/BODY/pair_body_rounded_polygon.cpp +++ b/src/BODY/pair_body_rounded_polygon.cpp @@ -276,8 +276,10 @@ void PairBodyRoundedPolygon::compute(int eflag, int vflag) // scale the force at both contacts - contact_forces(contact_list[m], j_a, x, v, angmom, f, torque, evdwl, facc); - contact_forces(contact_list[n], j_a, x, v, angmom, f, torque, evdwl, facc); + contact_forces(contact_list[m], j_a, x, v, angmom, f, torque, + evdwl, facc); + contact_forces(contact_list[n], j_a, x, v, angmom, f, torque, + evdwl, facc); done = 1; #ifdef _POLYGON_DEBUG @@ -285,16 +287,18 @@ void PairBodyRoundedPolygon::compute(int eflag, int vflag) m, n, delta_a, j_a); printf(" %d: vertex %d of body %d and edge %d of body %d; " "xv = %f %f %f; xe = %f %f %f\n", - m, contact_list[m].vertex, contact_list[m].ibody, - contact_list[m].edge, contact_list[m].jbody, - contact_list[m].xv[0], contact_list[m].xv[1], contact_list[m].xv[2], - contact_list[m].xe[0], contact_list[m].xe[1], contact_list[m].xe[2]); + m, contact_list[m].vertex, contact_list[m].ibody, + contact_list[m].edge, contact_list[m].jbody, + contact_list[m].xv[0], contact_list[m].xv[1], + contact_list[m].xv[2], contact_list[m].xe[0], + contact_list[m].xe[1], contact_list[m].xe[2]); printf(" %d: vertex %d of body %d and edge %d of body %d; " "xv = %f %f %f; xe = %f %f %f\n", - n, contact_list[n].vertex, contact_list[n].ibody, - contact_list[n].edge, contact_list[n].jbody, - contact_list[n].xv[0], contact_list[n].xv[1], contact_list[n].xv[2], - contact_list[n].xe[0], contact_list[n].xe[1], contact_list[n].xe[2]); + n, contact_list[n].vertex, contact_list[n].ibody, + contact_list[n].edge, contact_list[n].jbody, + contact_list[n].xv[0], contact_list[n].xv[1], + contact_list[n].xv[2], contact_list[n].xe[0], + contact_list[n].xe[1], contact_list[n].xe[2]); #endif break; @@ -417,13 +421,16 @@ void PairBodyRoundedPolygon::coeff(int narg, char **arg) void PairBodyRoundedPolygon::init_style() { avec = (AtomVecBody *) atom->style_match("body"); - if (!avec) error->all(FLERR,"Pair body/rounded/polygon requires atom style body"); + if (!avec) + error->all(FLERR,"Pair body/rounded/polygon requires atom style body"); if (strcmp(avec->bptr->style,"rounded/polygon") != 0) - error->all(FLERR,"Pair body/rounded/polygon requires body style rounded/polygon"); + error->all(FLERR,"Pair body/rounded/polygon requires " + "body style rounded/polygon"); bptr = (BodyRoundedPolygon *) avec->bptr; if (comm->ghost_velocity == 0) - error->all(FLERR,"Pair body/rounded/polygon requires ghost atoms store velocity"); + error->all(FLERR,"Pair body/rounded/polygon requires " + "ghost atoms store velocity"); neighbor->request(this); @@ -850,7 +857,8 @@ int PairBodyRoundedPolygon::vertex_against_edge(int i, int j, #ifdef _CONVEX_POLYGON // done with the edges from body j, - // given that vertex ni interacts with only one vertex from one edge of body j + // given that vertex ni interacts with only one vertex + // from one edge of body j break; #endif diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index 96307a0ab1..0d73d249b9 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -393,13 +393,16 @@ void PairBodyRoundedPolyhedron::coeff(int narg, char **arg) void PairBodyRoundedPolyhedron::init_style() { avec = (AtomVecBody *) atom->style_match("body"); - if (!avec) error->all(FLERR,"Pair body/rounded/polyhedron requires atom style body"); + if (!avec) error->all(FLERR,"Pair body/rounded/polyhedron requires " + "atom style body"); if (strcmp(avec->bptr->style,"rounded/polyhedron") != 0) - error->all(FLERR,"Pair body/rounded/polyhedron requires body style rounded/polyhedron"); + error->all(FLERR,"Pair body/rounded/polyhedron requires " + "body style rounded/polyhedron"); bptr = (BodyRoundedPolyhedron *) avec->bptr; if (comm->ghost_velocity == 0) - error->all(FLERR,"Pair body/rounded/polyhedron requires ghost atoms store velocity"); + error->all(FLERR,"Pair body/rounded/polyhedron requires " + "ghost atoms store velocity"); neighbor->request(this); @@ -788,7 +791,8 @@ void PairBodyRoundedPolyhedron::sphere_against_edge(int ibody, int jbody, fn[1] = -c_n * vn2; fn[2] = -c_n * vn3; - // tangential friction term at contact, excluding the tangential deformation term + // tangential friction term at contact, + // excluding the tangential deformation term ft[0] = -c_t * vt1; ft[1] = -c_t * vt2; @@ -997,7 +1001,8 @@ int PairBodyRoundedPolyhedron::edge_against_edge(int ibody, int jbody, // compute the distance between the edge nj to the edge ni #ifdef _POLYHEDRON_DEBUG - printf("Compute interaction between edge %d of body %d with edge %d of body %d:\n", + printf("Compute interaction between edge %d of body %d " + "with edge %d of body %d:\n", nj, jbody, ni, ibody); #endif @@ -1055,7 +1060,8 @@ int PairBodyRoundedPolyhedron::edge_against_face(int ibody, int jbody, // compute the distance between the face nj to the edge ni #ifdef _POLYHEDRON_DEBUG - printf("Compute interaction between face %d of body %d with edge %d of body %d:\n", + printf("Compute interaction between face %d of body %d with " + "edge %d of body %d:\n", nj, jbody, ni, ibody); #endif @@ -1293,7 +1299,8 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, xpj2[1] = xmj[1] + discrete[jfirst+npj2][1]; xpj2[2] = xmj[2] + discrete[jfirst+npj2][2]; - // no interaction if two ends of the edge are on the same side with the COM wrt the face + // no interaction if two ends of the edge + // are on the same side with the COM wrt the face if (opposite_sides(n, xi1, xmi, xpj1) == 0 && opposite_sides(n, xi1, xmi, xpj2) == 0) @@ -1305,7 +1312,9 @@ int PairBodyRoundedPolyhedron::interaction_face_to_edge(int ibody, int inside1 = 0; int inside2 = 0; - // enum {EF_PARALLEL=0,EF_SAME_SIDE_OF_FACE,EF_INTERSECT_INSIDE,EF_INTERSECT_OUTSIDE}; + // enum {EF_PARALLEL=0,EF_SAME_SIDE_OF_FACE, + // EF_INTERSECT_INSIDE,EF_INTERSECT_OUTSIDE}; + int interact = edge_face_intersect(xi1, xi2, xi3, xpj1, xpj2, hi1, hi2, d1, d2, inside1, inside2); @@ -2310,7 +2319,8 @@ double PairBodyRoundedPolyhedron::contact_separation(const Contact& c1, find the number of unique contacts ------------------------------------------------------------------------- */ -void PairBodyRoundedPolyhedron::find_unique_contacts(Contact* contact_list, int& num_contacts) +void PairBodyRoundedPolyhedron::find_unique_contacts(Contact* contact_list, + int& num_contacts) { int n = num_contacts; for (int i = 0; i < n - 1; i++) { From ad4f61a5ce6abdf69c5cff22dec3d563ead95c35 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 10 Jul 2018 09:07:54 -0400 Subject: [PATCH 027/123] update fatbin makefile for libgpu.a to latest additions --- lib/gpu/Nvidia.makefile_multi | 46 +++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/lib/gpu/Nvidia.makefile_multi b/lib/gpu/Nvidia.makefile_multi index 5fb35cce3c..94cfd4af6b 100644 --- a/lib/gpu/Nvidia.makefile_multi +++ b/lib/gpu/Nvidia.makefile_multi @@ -79,7 +79,10 @@ OBJS = $(OBJ_DIR)/lal_atom.o $(OBJ_DIR)/lal_ans.o \ $(OBJ_DIR)/lal_lj_cubic.o $(OBJ_DIR)/lal_lj_cubic_ext.o \ $(OBJ_DIR)/lal_ufm.o $(OBJ_DIR)/lal_ufm_ext.o \ $(OBJ_DIR)/lal_dipole_long_lj.o $(OBJ_DIR)/lal_dipole_long_lj_ext.o \ - $(OBJ_DIR)/lal_lj_expand_coul_long.o $(OBJ_DIR)/lal_lj_expand_coul_long_ext.o + $(OBJ_DIR)/lal_lj_expand_coul_long.o $(OBJ_DIR)/lal_lj_expand_coul_long_ext.o \ + $(OBJ_DIR)/lal_coul_long_cs.o $(OBJ_DIR)/lal_coul_long_cs_ext.o \ + $(OBJ_DIR)/lal_born_coul_long_cs.o $(OBJ_DIR)/lal_born_coul_long_cs_ext.o \ + $(OBJ_DIR)/lal_born_coul_wolf_cs.o $(OBJ_DIR)/lal_born_coul_wolf_cs_ext.o CBNS = $(OBJ_DIR)/device.cubin $(OBJ_DIR)/device_cubin.h \ $(OBJ_DIR)/atom.cubin $(OBJ_DIR)/atom_cubin.h \ @@ -137,7 +140,10 @@ CBNS = $(OBJ_DIR)/device.cubin $(OBJ_DIR)/device_cubin.h \ $(OBJ_DIR)/lj_cubic.cubin $(OBJ_DIR)/lj_cubic_cubin.h \ $(OBJ_DIR)/ufm.cubin $(OBJ_DIR)/ufm_cubin.h \ $(OBJ_DIR)/dipole_long_lj.cubin $(OBJ_DIR)/dipole_long_lj_cubin.h \ - $(OBJ_DIR)/lj_expand_coul_long.cubin $(OBJ_DIR)/lj_expand_coul_long_cubin.h + $(OBJ_DIR)/lj_expand_coul_long.cubin $(OBJ_DIR)/lj_expand_coul_long_cubin.h \ + $(OBJ_DIR)/coul_long_cs.cubin $(OBJ_DIR)/coul_long_cs_cubin.h \ + $(OBJ_DIR)/born_coul_long_cs.cubin $(OBJ_DIR)/born_coul_long_cs_cubin.h \ + $(OBJ_DIR)/born_coul_wolf_cs.cubin $(OBJ_DIR)/born_coul_wolf_cs_cubin.h all: $(OBJ_DIR) $(GPU_LIB) $(EXECS) @@ -837,6 +843,42 @@ $(OBJ_DIR)/lal_lj_expand_coul_long.o: $(ALL_H) lal_lj_expand_coul_long.h lal_lj_ $(OBJ_DIR)/lal_lj_expand_coul_long_ext.o: $(ALL_H) lal_lj_expand_coul_long.h lal_lj_expand_coul_long_ext.cpp lal_base_charge.h $(CUDR) -o $@ -c lal_lj_expand_coul_long_ext.cpp -I$(OBJ_DIR) +$(OBJ_DIR)/coul_long_cs.cubin: lal_coul_long_cs.cu lal_precision.h lal_preprocessor.h + $(CUDA) --fatbin -DNV_KERNEL -o $@ lal_coul_long_cs.cu + +$(OBJ_DIR)/coul_long_cs_cubin.h: $(OBJ_DIR)/coul_long_cs.cubin $(OBJ_DIR)/coul_long_cs.cubin + $(BIN2C) -c -n coul_long_cs $(OBJ_DIR)/coul_long_cs.cubin > $(OBJ_DIR)/coul_long_cs_cubin.h + +$(OBJ_DIR)/lal_coul_long_cs.o: $(ALL_H) lal_coul_long_cs.h lal_coul_long_cs.cpp $(OBJ_DIR)/coul_long_cs_cubin.h $(OBJ_DIR)/lal_base_charge.o $(OBJ_DIR)/lal_coul_long.o + $(CUDR) -o $@ -c lal_coul_long_cs.cpp -I$(OBJ_DIR) + +$(OBJ_DIR)/lal_coul_long_cs_ext.o: $(ALL_H) lal_coul_long_cs.h lal_coul_long_cs_ext.cpp lal_coul_long.h + $(CUDR) -o $@ -c lal_coul_long_cs_ext.cpp -I$(OBJ_DIR) + +$(OBJ_DIR)/born_coul_long_cs.cubin: lal_born_coul_long_cs.cu lal_precision.h lal_preprocessor.h + $(CUDA) --fatbin -DNV_KERNEL -o $@ lal_born_coul_long_cs.cu + +$(OBJ_DIR)/born_coul_long_cs_cubin.h: $(OBJ_DIR)/born_coul_long_cs.cubin $(OBJ_DIR)/born_coul_long_cs.cubin + $(BIN2C) -c -n born_coul_long_cs $(OBJ_DIR)/born_coul_long_cs.cubin > $(OBJ_DIR)/born_coul_long_cs_cubin.h + +$(OBJ_DIR)/lal_born_coul_long_cs.o: $(ALL_H) lal_born_coul_long_cs.h lal_born_coul_long_cs.cpp $(OBJ_DIR)/born_coul_long_cs_cubin.h $(OBJ_DIR)/lal_base_charge.o $(OBJ_DIR)/lal_born_coul_long.o + $(CUDR) -o $@ -c lal_born_coul_long_cs.cpp -I$(OBJ_DIR) + +$(OBJ_DIR)/lal_born_coul_long_cs_ext.o: $(ALL_H) lal_born_coul_long_cs.h lal_born_coul_long_cs_ext.cpp lal_born_coul_long.h + $(CUDR) -o $@ -c lal_born_coul_long_cs_ext.cpp -I$(OBJ_DIR) + +$(OBJ_DIR)/born_coul_wolf_cs.cubin: lal_born_coul_wolf_cs.cu lal_precision.h lal_preprocessor.h + $(CUDA) --fatbin -DNV_KERNEL -o $@ lal_born_coul_wolf_cs.cu + +$(OBJ_DIR)/born_coul_wolf_cs_cubin.h: $(OBJ_DIR)/born_coul_wolf_cs.cubin $(OBJ_DIR)/born_coul_wolf_cs.cubin + $(BIN2C) -c -n born_coul_wolf_cs $(OBJ_DIR)/born_coul_wolf_cs.cubin > $(OBJ_DIR)/born_coul_wolf_cs_cubin.h + +$(OBJ_DIR)/lal_born_coul_wolf_cs.o: $(ALL_H) lal_born_coul_wolf_cs.h lal_born_coul_wolf_cs.cpp $(OBJ_DIR)/born_coul_wolf_cs_cubin.h $(OBJ_DIR)/lal_base_charge.o $(OBJ_DIR)/lal_born_coul_wolf.o + $(CUDR) -o $@ -c lal_born_coul_wolf_cs.cpp -I$(OBJ_DIR) + +$(OBJ_DIR)/lal_born_coul_wolf_cs_ext.o: $(ALL_H) lal_born_coul_wolf_cs.h lal_born_coul_wolf_cs_ext.cpp lal_born_coul_wolf.h + $(CUDR) -o $@ -c lal_born_coul_wolf_cs_ext.cpp -I$(OBJ_DIR) + $(BIN_DIR)/nvc_get_devices: ./geryon/ucl_get_devices.cpp $(NVD_H) $(CUDR) -o $@ ./geryon/ucl_get_devices.cpp -DUCL_CUDADR $(CUDA_LIB) -lcuda From 199c96f985bae537e7b43dc49b7a41570cf8b905 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 10 Jul 2018 09:22:41 -0400 Subject: [PATCH 028/123] update and clarify the choice of atom ids for angle style dipole (which is not really an angle potential) --- doc/src/angle_dipole.txt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/doc/src/angle_dipole.txt b/doc/src/angle_dipole.txt index d91f260d51..34cc8c153c 100644 --- a/doc/src/angle_dipole.txt +++ b/doc/src/angle_dipole.txt @@ -96,16 +96,17 @@ USER-MISC package. See the "Making LAMMPS"_Section_start.html#start_2_3 section for more info on packages. NOTE: In the "Angles" section of the data file, the atom ID 'j' -corresponding to the dipole to restrain must come before the atom ID -of the reference atom 'i'. A third atom ID 'k' must also be provided, -although 'k' is just a 'dummy' atom which can be any atom; it may be -useful to choose a convention (e.g., 'k'='i') and adhere to it. For -example, if ID=1 for the dipolar atom to restrain, and ID=2 for the -reference atom, the corresponding line in the "Angles" section of the -data file would read: X X 1 2 2 +defining the direction of the dipole vector to restrain must come +before the atom ID of the reference atom 'i'. A third atom ID 'k' must +also be provided to comply with the requirement of a valid angle +definition. This atom ID k should be chosen to be that of an atom +bonded to atom 'i' to avoid errors with "lost angle atoms" when running +in parallel. Since the LAMMPS code checks for valid angle definitions, +cannot use the same atom ID of either 'i' or 'j' (this was allowed +and recommended with older LAMMPS versions). The "newton" command for intramolecular interactions must be "on" -(which is the default). +(which is the default except when using some accelerator packages). This angle style should not be used with SHAKE. From 9d5dc561ca45967c445f472bca92e253bca3d33d Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 9 Jul 2018 10:24:55 -0600 Subject: [PATCH 029/123] Commit1 JT 070918 - created README in examples/SPIN - modified doc/src/set.txt to define 'spin' and 'spin/random' keywords --- doc/src/set.txt | 17 +++++++++++++++++ examples/SPIN/README | 20 ++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 examples/SPIN/README diff --git a/doc/src/set.txt b/doc/src/set.txt index 4757d1c575..d05660dc42 100644 --- a/doc/src/set.txt +++ b/doc/src/set.txt @@ -17,6 +17,7 @@ ID = atom ID range or type range or mol ID range or group ID or region ID :l one or more keyword/value pairs may be appended :l keyword = {type} or {type/fraction} or {mol} or {x} or {y} or {z} or \ {charge} or {dipole} or {dipole/random} or {quat} or \ + {spin} or {spin/random} or {quat} or \ {quat/random} or {diameter} or {shape} or \ {length} or {tri} or {theta} or {theta/random} or \ {angmom} or {omega} or \ @@ -43,6 +44,13 @@ keyword = {type} or {type/fraction} or {mol} or {x} or {y} or {z} or \ {dipole/random} value = seed Dlen seed = random # seed (positive integer) for dipole moment orientations Dlen = magnitude of dipole moment (dipole units) + {spin} values = g x y z + g = magnitude of magnetic spin vector (in Bohr magneton's unit) + x,y,z = orientation of magnetic spin vector + any of x,y,z can be an atom-style variable (see below) + {spin/random} value = seed Dlen + seed = random # seed (positive integer) for magnetic spin orientations + Dlen = magnitude of magnetic spin vector (in Bohr magneton's unit) {quat} values = a b c theta a,b,c = unit vector to rotate particle around via right-hand rule theta = rotation angle (degrees) @@ -232,6 +240,15 @@ the orientation of a particular atom is the same, regardless of how many processors are being used. This keyword does not allow use of an atom-style variable. +Keyword {spin} uses the specified g value to set the magnitude of the +magnetic spin vectors, and the x,y,z values as components of a vector +to set as the orientation of the magnetic spin vectors of the selected +atoms. + +Keyword {spin/random} randomizes the orientation of the magnetic spin +vectors for the selected atoms and sets the magnitude of each to the +specified {Dlen} value. + Keyword {quat} uses the specified values to create a quaternion (4-vector) that represents the orientation of the selected atoms. The particles must define a quaternion for their orientation diff --git a/examples/SPIN/README b/examples/SPIN/README new file mode 100644 index 0000000000..5ad252e7f2 --- /dev/null +++ b/examples/SPIN/README @@ -0,0 +1,20 @@ +This directory contains examples and applications of the SPIN package +===================================================================== + +- the iron, cobalt_hcp, cobalt_fcc and nickel directories provide +examples of spin-lattice calculations. + +- the bfo repository provides an example of spin dynamics calculation +performed on a fixed lattice, and applied to the multiferroic +material bismuth-oxide. + +- the read_restart directory provides examples allowing to write or +read data files, and restart magneto-mechanical simulations. + +- vizualization of the dump files can be achieved using Ovito or +VMD. See the vmd repository for help vizualizing results with VMD. + +** Note, the aim of this repository is mainly to provide users with +examples. Better values and tuning of the magnetic and mechanical +interactions can be achieved for more accurate materials +simulations. ** From ade9b7bfc39ede248fc1d81b7ab93a7019e10daf Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 9 Jul 2018 18:07:10 -0600 Subject: [PATCH 030/123] Commit2 JT 070918 - modified the citeme reference (replaced by the JCP one) - same modification in doc and src/SPIN --- doc/src/fix_langevin_spin.txt | 4 ++-- doc/src/fix_nve_spin.txt | 2 +- doc/src/pair_spin_dmi.txt | 2 +- doc/src/pair_spin_exchange.txt | 2 +- doc/src/pair_spin_magelec.txt | 2 +- doc/src/pair_spin_neel.txt | 2 +- src/SPIN/atom_vec_spin.cpp | 6 +++--- src/SPIN/compute_spin.cpp | 6 +++--- src/SPIN/fix_langevin_spin.cpp | 6 +++--- src/SPIN/fix_nve_spin.cpp | 11 ++++++----- src/SPIN/fix_precession_spin.cpp | 6 +++--- src/SPIN/pair_spin.cpp | 6 +++--- src/SPIN/pair_spin_dmi.cpp | 6 +++--- src/SPIN/pair_spin_exchange.cpp | 6 +++--- src/SPIN/pair_spin_magelec.cpp | 12 ++++++------ src/SPIN/pair_spin_neel.cpp | 6 +++--- 16 files changed, 43 insertions(+), 42 deletions(-) diff --git a/doc/src/fix_langevin_spin.txt b/doc/src/fix_langevin_spin.txt index 51f085ebdc..b089cd7f58 100644 --- a/doc/src/fix_langevin_spin.txt +++ b/doc/src/fix_langevin_spin.txt @@ -98,5 +98,5 @@ integration fix (e.g. {fix nve/spin}). [(Mayergoyz)] I.D. Mayergoyz, G. Bertotti, C. Serpico (2009). Elsevier (2009) :link(Tranchida2) -[(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -arXiv preprint arXiv:1801.10233, (2018). +[(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, +Journal of Computational Physics, (2018). diff --git a/doc/src/fix_nve_spin.txt b/doc/src/fix_nve_spin.txt index 6ccebcebf6..f4b38c270b 100644 --- a/doc/src/fix_nve_spin.txt +++ b/doc/src/fix_nve_spin.txt @@ -73,4 +73,4 @@ instead of "array" is also valid. :link(Tranchida1) [(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -arXiv preprint arXiv:1801.10233, (2018). +Journal of Computational Physics, (2018). diff --git a/doc/src/pair_spin_dmi.txt b/doc/src/pair_spin_dmi.txt index 9fe53df18a..24877906f3 100644 --- a/doc/src/pair_spin_dmi.txt +++ b/doc/src/pair_spin_dmi.txt @@ -63,4 +63,4 @@ See the "Making LAMMPS"_Section_start.html#start_3 section for more info. :link(Tranchida5) [(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -arXiv preprint arXiv:1801.10233, (2018). +Journal of Computational Physics, (2018). diff --git a/doc/src/pair_spin_exchange.txt b/doc/src/pair_spin_exchange.txt index 97b6d0b34f..ad3357cb5e 100644 --- a/doc/src/pair_spin_exchange.txt +++ b/doc/src/pair_spin_exchange.txt @@ -79,4 +79,4 @@ See the "Making LAMMPS"_Section_start.html#start_3 section for more info. :link(Tranchida3) [(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -arXiv preprint arXiv:1801.10233, (2018). +Journal of Computational Physics, (2018). diff --git a/doc/src/pair_spin_magelec.txt b/doc/src/pair_spin_magelec.txt index 0185a5abb2..8ba24c46af 100644 --- a/doc/src/pair_spin_magelec.txt +++ b/doc/src/pair_spin_magelec.txt @@ -70,4 +70,4 @@ See the "Making LAMMPS"_Section_start.html#start_3 section for more info. :link(Tranchida4) [(Tranchida)] Tranchida, Plimpton, Thibaudeau, and Thompson, -arXiv preprint arXiv:1801.10233, (2018). +Journal of Computational Physics, (2018). diff --git a/doc/src/pair_spin_neel.txt b/doc/src/pair_spin_neel.txt index f7c9608a93..8551f8d636 100644 --- a/doc/src/pair_spin_neel.txt +++ b/doc/src/pair_spin_neel.txt @@ -78,4 +78,4 @@ See the "Making LAMMPS"_Section_start.html#start_3 section for more info. :link(Tranchida6) [(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -arXiv preprint arXiv:1801.10233, (2018). +Journal of Computational Physics, (2018). diff --git a/src/SPIN/atom_vec_spin.cpp b/src/SPIN/atom_vec_spin.cpp index 4871fe0c40..51903e5480 100644 --- a/src/SPIN/atom_vec_spin.cpp +++ b/src/SPIN/atom_vec_spin.cpp @@ -18,9 +18,9 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ #include diff --git a/src/SPIN/compute_spin.cpp b/src/SPIN/compute_spin.cpp index 54818a9b70..1d87f4e722 100644 --- a/src/SPIN/compute_spin.cpp +++ b/src/SPIN/compute_spin.cpp @@ -16,9 +16,9 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ #include diff --git a/src/SPIN/fix_langevin_spin.cpp b/src/SPIN/fix_langevin_spin.cpp index 97b33197ce..402b934723 100644 --- a/src/SPIN/fix_langevin_spin.cpp +++ b/src/SPIN/fix_langevin_spin.cpp @@ -16,9 +16,9 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ #include diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index d91636af58..353f2cbd83 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -16,9 +16,9 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ #include @@ -59,8 +59,9 @@ static const char cite_fix_nve_spin[] = "title={Massively parallel symplectic algorithm for coupled magnetic spin " "dynamics and molecular dynamics},\n" "author={Tranchida, J and Plimpton, SJ and Thibaudeau, P and Thompson, AP},\n" - "journal={arXiv preprint arXiv:1801.10233},\n" - "year={2018}\n" + "journal={Journal of Computational Physics},\n" + "year={2018},\n" + "publisher={Elsevier}\n" "}\n\n"; enum{NONE}; diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index eedf0becb7..447139e0ee 100644 --- a/src/SPIN/fix_precession_spin.cpp +++ b/src/SPIN/fix_precession_spin.cpp @@ -16,9 +16,9 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ #include diff --git a/src/SPIN/pair_spin.cpp b/src/SPIN/pair_spin.cpp index acb7ffe548..d29f31b70a 100644 --- a/src/SPIN/pair_spin.cpp +++ b/src/SPIN/pair_spin.cpp @@ -16,9 +16,9 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ #include diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index 07ae684939..0129dec005 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -16,9 +16,9 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ #include diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index 7b05d7337e..5aa5a267b9 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -16,9 +16,9 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ #include diff --git a/src/SPIN/pair_spin_magelec.cpp b/src/SPIN/pair_spin_magelec.cpp index e9e7c1fb3f..79cdc919e8 100644 --- a/src/SPIN/pair_spin_magelec.cpp +++ b/src/SPIN/pair_spin_magelec.cpp @@ -16,9 +16,9 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ #include @@ -436,9 +436,9 @@ void PairSpinMagelec::compute_magelec_mech(int i, int j, double fi[3], double sp meiy *= ME_mech[itype][jtype]; meiz *= ME_mech[itype][jtype]; - fi[0] = meiy*vz - meiz*vy; - fi[1] = meiz*vx - meix*vz; - fi[2] = meix*vy - meiy*vx; + fi[0] += meiy*vz - meiz*vy; + fi[1] += meiz*vx - meix*vz; + fi[2] += meix*vy - meiy*vx; } diff --git a/src/SPIN/pair_spin_neel.cpp b/src/SPIN/pair_spin_neel.cpp index d74db638bd..a8d9fe8ffa 100644 --- a/src/SPIN/pair_spin_neel.cpp +++ b/src/SPIN/pair_spin_neel.cpp @@ -16,9 +16,9 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ #include From 792b182cb041dce9c72a7c46ccb473c0c0165a72 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 10 Jul 2018 09:46:08 -0400 Subject: [PATCH 031/123] whitespace cleanup --- src/SPIN/atom_vec_spin.cpp | 6 +++--- src/SPIN/compute_spin.cpp | 4 ++-- src/SPIN/fix_langevin_spin.cpp | 4 ++-- src/SPIN/fix_nve_spin.cpp | 4 ++-- src/SPIN/fix_precession_spin.cpp | 4 ++-- src/SPIN/pair_spin.cpp | 4 ++-- src/SPIN/pair_spin_dmi.cpp | 4 ++-- src/SPIN/pair_spin_exchange.cpp | 4 ++-- src/SPIN/pair_spin_magelec.cpp | 4 ++-- src/SPIN/pair_spin_neel.cpp | 4 ++-- 10 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/SPIN/atom_vec_spin.cpp b/src/SPIN/atom_vec_spin.cpp index 51903e5480..276bc34e64 100644 --- a/src/SPIN/atom_vec_spin.cpp +++ b/src/SPIN/atom_vec_spin.cpp @@ -18,8 +18,8 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ @@ -54,7 +54,7 @@ AtomVecSpin::AtomVecSpin(LAMMPS *lmp) : AtomVec(lmp) size_data_atom = 9; size_data_vel = 4; xcol_data = 4; - + atom->sp_flag = 1; } diff --git a/src/SPIN/compute_spin.cpp b/src/SPIN/compute_spin.cpp index 1d87f4e722..b508d0624f 100644 --- a/src/SPIN/compute_spin.cpp +++ b/src/SPIN/compute_spin.cpp @@ -16,8 +16,8 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ diff --git a/src/SPIN/fix_langevin_spin.cpp b/src/SPIN/fix_langevin_spin.cpp index 402b934723..3650651457 100644 --- a/src/SPIN/fix_langevin_spin.cpp +++ b/src/SPIN/fix_langevin_spin.cpp @@ -16,8 +16,8 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index 353f2cbd83..415c2352d4 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -16,8 +16,8 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index 447139e0ee..bcdd62413d 100644 --- a/src/SPIN/fix_precession_spin.cpp +++ b/src/SPIN/fix_precession_spin.cpp @@ -16,8 +16,8 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ diff --git a/src/SPIN/pair_spin.cpp b/src/SPIN/pair_spin.cpp index d29f31b70a..b6cf07e60c 100644 --- a/src/SPIN/pair_spin.cpp +++ b/src/SPIN/pair_spin.cpp @@ -16,8 +16,8 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index 0129dec005..4ea6cfd0cc 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -16,8 +16,8 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index 5aa5a267b9..cb2d7424cf 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -16,8 +16,8 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ diff --git a/src/SPIN/pair_spin_magelec.cpp b/src/SPIN/pair_spin_magelec.cpp index 79cdc919e8..77bf42159a 100644 --- a/src/SPIN/pair_spin_magelec.cpp +++ b/src/SPIN/pair_spin_magelec.cpp @@ -16,8 +16,8 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ diff --git a/src/SPIN/pair_spin_neel.cpp b/src/SPIN/pair_spin_neel.cpp index a8d9fe8ffa..05999170eb 100644 --- a/src/SPIN/pair_spin_neel.cpp +++ b/src/SPIN/pair_spin_neel.cpp @@ -16,8 +16,8 @@ Aidan Thompson (SNL) Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ From 1ed25d195be0d32caa75f99172dcda48afab95ed Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 10 Jul 2018 09:48:49 -0400 Subject: [PATCH 032/123] convert c-style includes for c-library calls to c++-style --- src/SPIN/atom_vec_spin.cpp | 6 +++--- src/SPIN/compute_spin.cpp | 2 +- src/SPIN/fix_langevin_spin.cpp | 6 +++--- src/SPIN/fix_nve_spin.cpp | 6 +++--- src/SPIN/fix_precession_spin.cpp | 8 ++++---- src/SPIN/pair_spin.cpp | 6 +++--- src/SPIN/pair_spin_dmi.cpp | 6 +++--- src/SPIN/pair_spin_exchange.cpp | 6 +++--- src/SPIN/pair_spin_magelec.cpp | 6 +++--- src/SPIN/pair_spin_neel.cpp | 6 +++--- 10 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/SPIN/atom_vec_spin.cpp b/src/SPIN/atom_vec_spin.cpp index 276bc34e64..8b47eff624 100644 --- a/src/SPIN/atom_vec_spin.cpp +++ b/src/SPIN/atom_vec_spin.cpp @@ -23,9 +23,9 @@ and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ -#include -#include -#include +#include +#include +#include #include "atom.h" #include "atom_vec_spin.h" #include "comm.h" diff --git a/src/SPIN/compute_spin.cpp b/src/SPIN/compute_spin.cpp index b508d0624f..b67f62d53d 100644 --- a/src/SPIN/compute_spin.cpp +++ b/src/SPIN/compute_spin.cpp @@ -22,7 +22,7 @@ ------------------------------------------------------------------------- */ #include -#include +#include #include "atom.h" #include "compute_spin.h" #include "domain.h" diff --git a/src/SPIN/fix_langevin_spin.cpp b/src/SPIN/fix_langevin_spin.cpp index 3650651457..cb34465482 100644 --- a/src/SPIN/fix_langevin_spin.cpp +++ b/src/SPIN/fix_langevin_spin.cpp @@ -22,9 +22,9 @@ ------------------------------------------------------------------------- */ #include -#include -#include -#include +#include +#include +#include #include "atom.h" #include "atom_vec_ellipsoid.h" diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index 415c2352d4..b75f03212a 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -21,9 +21,9 @@ and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ -#include -#include -#include +#include +#include +#include #include "atom.h" #include "atom_vec.h" diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index bcdd62413d..b908478952 100644 --- a/src/SPIN/fix_precession_spin.cpp +++ b/src/SPIN/fix_precession_spin.cpp @@ -21,10 +21,10 @@ and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ -#include -#include -#include -#include +#include +#include +#include +#include #include "atom.h" #include "domain.h" diff --git a/src/SPIN/pair_spin.cpp b/src/SPIN/pair_spin.cpp index b6cf07e60c..398206b26e 100644 --- a/src/SPIN/pair_spin.cpp +++ b/src/SPIN/pair_spin.cpp @@ -21,9 +21,9 @@ and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ -#include -#include -#include +#include +#include +#include #include "atom.h" #include "comm.h" diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index 4ea6cfd0cc..b792969c5d 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -21,9 +21,9 @@ and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ -#include -#include -#include +#include +#include +#include #include "atom.h" #include "comm.h" diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index cb2d7424cf..1b7b36b6db 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -21,9 +21,9 @@ and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ -#include -#include -#include +#include +#include +#include #include "atom.h" #include "comm.h" diff --git a/src/SPIN/pair_spin_magelec.cpp b/src/SPIN/pair_spin_magelec.cpp index 77bf42159a..315b691d17 100644 --- a/src/SPIN/pair_spin_magelec.cpp +++ b/src/SPIN/pair_spin_magelec.cpp @@ -21,9 +21,9 @@ and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ -#include -#include -#include +#include +#include +#include #include "atom.h" #include "comm.h" diff --git a/src/SPIN/pair_spin_neel.cpp b/src/SPIN/pair_spin_neel.cpp index 05999170eb..0daafad756 100644 --- a/src/SPIN/pair_spin_neel.cpp +++ b/src/SPIN/pair_spin_neel.cpp @@ -21,9 +21,9 @@ and molecular dynamics. Journal of Computational Physics. ------------------------------------------------------------------------- */ -#include -#include -#include +#include +#include +#include #include "atom.h" #include "comm.h" From 5124c9e9937049b252167eb2d790f358c61d3934 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 10 Jul 2018 16:53:26 -0500 Subject: [PATCH 033/123] Fixed bugs in body rounded/polydedra for correct size_border --- src/BODY/body_rounded_polyhedron.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/BODY/body_rounded_polyhedron.cpp b/src/BODY/body_rounded_polyhedron.cpp index fb0be7c1be..6a9b97ae23 100644 --- a/src/BODY/body_rounded_polyhedron.cpp +++ b/src/BODY/body_rounded_polyhedron.cpp @@ -48,13 +48,13 @@ BodyRoundedPolyhedron::BodyRoundedPolyhedron(LAMMPS *lmp, int narg, char **arg) size_forward = 0; - // 1 integer for number of vertices, + // 3 integers: 1 for no. of vertices, 1 for no. of edges, 1 for no. of faces // 3*nmax doubles for vertex coordinates + 2*nmax doubles for edge ends + // (MAX_FACE_SIZE+1)*nmax for faces // 1 double for the enclosing radius // 1 double for the rounded radius - size_border = 1 + 3*nmax + 2*nmax + MAX_FACE_SIZE*nmax + 1 + 1; + size_border = 3 + 3*nmax + 2*nmax + MAX_FACE_SIZE*nmax + 1 + 1; // NOTE: need to set appropriate nnbin param for dcp @@ -159,7 +159,7 @@ int BodyRoundedPolyhedron::pack_border_body(AtomVecBody::Bonus *bonus, double *b buf[2] = nfac; int ndouble; if (nsub == 1 || nsub == 2) ndouble = 3*nsub+2+MAX_FACE_SIZE*nfac+1+1; - else ndouble = 3*nsub+2*nedges(bonus)+MAX_FACE_SIZE*nfac+1+1; + else ndouble = 3*nsub+2*ned+MAX_FACE_SIZE*nfac+1+1; memcpy(&buf[3],bonus->dvalue,ndouble*sizeof(double)); return 3+ndouble; } @@ -177,7 +177,7 @@ int BodyRoundedPolyhedron::unpack_border_body(AtomVecBody::Bonus *bonus, bonus->ivalue[2] = nfac; int ndouble; if (nsub == 1 || nsub == 2) ndouble = 3*nsub+2+MAX_FACE_SIZE*nfac+1+1; - else ndouble = 3*nsub+2*nedges(bonus)+MAX_FACE_SIZE*nfac+1+1; + else ndouble = 3*nsub+2*ned+MAX_FACE_SIZE*nfac+1+1; memcpy(bonus->dvalue,&buf[3],ndouble*sizeof(double)); return 3+ndouble; } From c3a32dde123042fb5bf21ec96a5c1635e0f23661 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Wed, 11 Jul 2018 00:21:49 -0500 Subject: [PATCH 034/123] Updated doc/body.txt for body rounded/polygon and rounded/polyhedron --- doc/src/body.txt | 77 +++++++++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 31 deletions(-) diff --git a/doc/src/body.txt b/doc/src/body.txt index c272f48ad1..0e64e6ad5b 100644 --- a/doc/src/body.txt +++ b/doc/src/body.txt @@ -36,7 +36,7 @@ thus how they can be used to compute pairwise body/body or bond/non-body (point particle) interactions. More details of each style are described below. -More styles ma be added in the future. See "Section +More styles may be added in the future. See "Section 10.12"_Section_modify.html#mod_12 for details on how to add a new body style to the code. @@ -182,7 +182,7 @@ The {rounded/polygon} body style represents body particles as a 2d polygon with a variable number of N vertices. This style can only be used for 2d models; see the "boundary"_boundary.html command. -NOTE: include a diagram of a a rounded polygon body particle +NOTE: include a diagram of a rounded polygon body particle Special cases for N = 1 (spheres) and N = 2 (rods) are also included. One use of this body style is for 2d discrete element models, as @@ -219,12 +219,11 @@ list 6 moments of inertia followed by the coordinates of the N vertices (x1 to zN) as 3N values (with z = 0.0 for each), followed by 2N vertex indices corresponding to the end points of the N edges, followed by a single diameter value = the rounded diameter of the -circle that surrounds each vertex. These floating-point values can be +circle that surrounds each vertex. The diameter value can be different +for each body particle. These floating-point values can be listed on as many lines as you wish; see the "read_data"_read_data.html command for more details. -NOTE: can the diameter value be different for each body particle? - The 6 moments of inertia (ixx,iyy,izz,ixy,ixz,iyz) should be the values consistent with the current orientation of the rigid body around its center of mass. The values are with respect to the @@ -236,9 +235,9 @@ position of the particle is specified by the x,y,z values in the {Atoms} section of the data file. For example, the following information would specify a square particle -whose edge length is sqrt(2): - -NOTE: oriented how? +whose edge length is sqrt(2) and rounded diameter is 1.0 in length unit +and initial orientation is determined from the 6 moments of inertia +(ixx iyy izz ixy ixz iyz): 3 1 27 4 @@ -268,13 +267,13 @@ polyhedron with a variable number of N vertices, E edges and F faces. This style can only be used for 3d models; see the "boundary"_boundary.html command. -NOTE: include a diagram of a a rounded polyhedron body particle +NOTE: include a diagram of a rounded polyhedron body particle + +NOTE: 2d objects can also be specified as a special case, e.g. +for a triangle, N = 3, E = 3 and F = 1. Special cases for N = 1 (spheres) and N = 2 (rods) are also valid. -NOTE: can 2d objects also be specified as a special case, e.g. a -triangle? - This body style is for 3d discrete element models, as described in "Wang"_#Wang. @@ -316,8 +315,9 @@ edges (E) and number of faces (F). The floating point line(s) list 6 moments of inertia followed by the coordinates of the N vertices (x1 to zN) as 3N values, followed by 2N vertex indices corresponding to the end points of the E edges, then 4*F vertex indices defining F -faces. The last value is the radius value = the rounded diameter of -the sphere that surrounds each vertex. These floating-point values +faces. The last value is the diameter value = the rounded diameter of +the sphere that surrounds each vertex. The diameter value can be different +for each body particle. These floating-point values can be listed on as many lines as you wish; see the "read_data"_read_data.html command for more details. Because the maxmimum vertices per face is hard-coded to be 4 @@ -325,10 +325,9 @@ maxmimum vertices per face is hard-coded to be 4 split into triangles or quadrilaterals. For triangular faces, the last vertex index should be set to -1. -NOTE: is there some right-hand rule for the ordering of the 4 vertices -within each face? - -NOTE: can the diameter value be different for each body particle? +The ordering of the 4 vertices within a face should follow +the right-hand rule so that the normal vector of the face points +outwards from the center of mass. The 6 moments of inertia (ixx,iyy,izz,ixy,ixz,iyz) should be the values consistent with the current orientation of the rigid body @@ -341,24 +340,40 @@ position of the particle is specified by the x,y,z values in the {Atoms} section of the data file. For example, the following information would specify a cubic particle -whose edge length is 1.0: +whose edge length is 2.0 and rounded diameter is 0.5 in length unit +and initial orientation is determined from the 6 moments of inertia +(ixx iyy izz ixy ixz iyz): -NOTE: oriented how? - -NOTE: fill in these values correctly - -3 1 27 -4 -1 1 4 0 0 0 --0.7071 -0.7071 0 --0.7071 0.7071 0 -0.7071 0.7071 0 -0.7071 -0.7071 0 +1 3 79 +8 12 6 +0.667 0.667 0.667 0 0 0 +1 1 1 +1 -1 1 +-1 -1 1 +-1 1 1 +1 1 -1 +1 -1 -1 +-1 -1 -1 +-1 1 -1 0 1 1 2 2 3 3 0 -1.0 :pre +4 5 +5 6 +6 7 +7 4 +0 4 +1 5 +2 6 +3 7 +0 1 2 3 +4 5 6 7 +0 1 5 4 +1 2 6 5 +2 3 7 6 +3 0 4 7 +0.5 :pre :line From 1f1447c3ac3f919d6c4c34d03e2a0df99b39fdad Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 11 Jul 2018 07:22:47 -0400 Subject: [PATCH 035/123] need to update exclusions with the new atom IDs in case of molecular systems --- src/reset_ids.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/reset_ids.cpp b/src/reset_ids.cpp index 8a33cd535b..fd898bd3ab 100644 --- a/src/reset_ids.cpp +++ b/src/reset_ids.cpp @@ -16,6 +16,7 @@ #include "atom_vec.h" #include "domain.h" #include "comm.h" +#include "special.h" #include "memory.h" #include "error.h" @@ -44,7 +45,7 @@ void ResetIDs::command(int narg, char **arg) } // create an atom map if one doesn't exist already - + int mapflag = 0; if (atom->map_style == 0) { mapflag = 1; @@ -93,7 +94,7 @@ void ResetIDs::command(int narg, char **arg) // forward_comm_array acquires new IDs for ghost atoms double **newIDs; - memory->create(newIDs,nall,1,"reset_ids:newIDs"); + memory->create(newIDs,nall,1,"reset_ids:newIDs"); for (int i = 0; i < nlocal; i++) { newIDs[i][0] = tag[i]; @@ -105,7 +106,7 @@ void ResetIDs::command(int narg, char **arg) // loop over bonds, angles, etc and reset IDs in stored topology arrays // only necessary for molecular = 1, not molecular = 2 // badcount = atom IDs that could not be found - + int badcount = 0; if (atom->molecular == 1) { @@ -232,8 +233,15 @@ void ResetIDs::command(int narg, char **arg) atom->map_init(); atom->map_set(); + // need to update exclusions with new atom IDs + + if (atom->molecular == 1) { + Special special(lmp); + special.build(); + } + // delete temporary atom map - + if (mapflag) { atom->map_delete(); atom->map_style = 0; From acdc240cdd3e056c3d105b27582387351bc76aca Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Wed, 11 Jul 2018 08:42:28 -0600 Subject: [PATCH 036/123] better rRESPA doc page, also a new Makefile.theta --- doc/src/run_style.txt | 61 ++++++++++---- src/MAKE/MACHINES/Makefile.theta | 133 +++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+), 16 deletions(-) create mode 100644 src/MAKE/MACHINES/Makefile.theta diff --git a/doc/src/run_style.txt b/doc/src/run_style.txt index ba836a07dd..3240344a45 100644 --- a/doc/src/run_style.txt +++ b/doc/src/run_style.txt @@ -138,13 +138,19 @@ iterations of level 1 for a single iteration of level 2, N2 is the iterations of level 2 per iteration of level 3, etc. N-1 looping parameters must be specified. -The "timestep"_timestep.html command sets the timestep for the -outermost rRESPA level. Thus if the example command above for a -4-level rRESPA had an outer timestep of 4.0 fmsec, the inner timestep -would be 8x smaller or 0.5 fmsec. All other LAMMPS commands that -specify number of timesteps (e.g. "neigh_modify"_neigh_modify.html -parameters, "dump"_dump.html every N timesteps, etc) refer to the -outermost timesteps. +Thus with a 4-level respa setting of "2 2 2" for the 3 loop factors, +you could choose to have bond interactions computed 8x per large +timestep, angle interactions computed 4x, pair interactions computed +2x, and long-range interactions once per large timestep. + +The "timestep"_timestep.html command sets the large timestep for the +outermost rRESPA level. Thus if the 3 loop factors are "2 2 2" for +4-level rRESPA, and the outer timestep is set to 4.0 fmsec, then the +inner timestep would be 8x smaller or 0.5 fmsec. All other LAMMPS +commands that specify number of timesteps (e.g. "thermo"_thermo.html +for thermo output every N steps, "neigh_modify +delay/every"_neigh_modify.html parameters, "dump"_dump.html every N +steps, etc) refer to the outermost timesteps. The rRESPA keywords enable you to specify at what level of the hierarchy various forces will be computed. If not specified, the @@ -238,12 +244,24 @@ roughly a 1.5 fold speedup over the {verlet} style with SHAKE and a For non-biomolecular simulations, the {respa} style can be advantageous if there is a clear separation of time scales - fast and -slow modes in the simulation. Even a LJ system can benefit from -rRESPA if the interactions are divided by the inner, middle and outer -keywords. A 2-fold or more speedup can be obtained while maintaining -good energy conservation. In real units, for a pure LJ fluid at -liquid density, with a sigma of 3.0 angstroms, and epsilon of 0.1 -Kcal/mol, the following settings seem to work well: +slow modes in the simulation. For example, a system of slowly-moving +charged polymer chains could be setup as follows: + +timestep 4.0 +run_style respa 2 8 :pre + +This is two-level rRESPA with an 8x difference between the short and +long timesteps. The bonds, angles, dihedrals will be computed every +0.5 fs (assuming real units), while the pair and kspace interactions +will be computed once every 4 fs. These are the default settings for +each kind of interaction, so no additional keywords are necessary. + +Even a LJ system can benefit from rRESPA if the interactions are +divided by the inner, middle and outer keywords. A 2-fold or more +speedup can be obtained while maintaining good energy conservation. +In real units, for a pure LJ fluid at liquid density, with a sigma of +3.0 angstroms, and epsilon of 0.1 Kcal/mol, the following settings +seem to work well: timestep 36.0 run_style respa 3 3 4 inner 1 3.0 4.0 middle 2 6.0 7.0 outer 3 :pre @@ -271,9 +289,9 @@ more instructions on how to use the accelerated styles effectively. [Restrictions:] The {verlet/split} style can only be used if LAMMPS was built with the -REPLICA package. Correspondingly the {respa/omp} style is available only -if the USER-OMP package was included. See the "Making LAMMPS"_Section_start.html#start_3 -section for more info on packages. +REPLICA package. Correspondingly the {respa/omp} style is available +only if the USER-OMP package was included. See the "Making +LAMMPS"_Section_start.html#start_3 section for more info on packages. Whenever using rRESPA, the user should experiment with trade-offs in speed and accuracy for their system, and verify that they are @@ -287,6 +305,17 @@ conserving energy to adequate precision. run_style verlet :pre +For run_style respa, the default assignment of interactions +to rRESPA levels is as follows: + +bond forces = level 1 (innermost loop) +angle forces = same level as bond forces +dihedral forces = same level as angle forces +improper forces = same level as dihedral forces +pair forces = leven N (outermost level) +kspace forces = same level as pair forces +inner, middle, outer forces = no default :ul + :line :link(Tuckerman3) diff --git a/src/MAKE/MACHINES/Makefile.theta b/src/MAKE/MACHINES/Makefile.theta new file mode 100644 index 0000000000..cad5a03b42 --- /dev/null +++ b/src/MAKE/MACHINES/Makefile.theta @@ -0,0 +1,133 @@ +# knl = Flags for Knights Landing Xeon Phi Processor,Intel Compiler/MPI,MKL FFT +# module load perftools-base perftools +# make theta -j 8 +# pat_build -g mpi -u ./lmp_theta + +SHELL = /bin/sh + +# --------------------------------------------------------------------- +# compiler/linker settings +# specify flags and libraries needed for your compiler + +CC = CC -mkl +#OPTFLAGS = -O0 +OPTFLAGS = -xMIC-AVX512 -O3 -fp-model fast=2 -no-prec-div -qoverride-limits +CCFLAGS = -g -qopenmp -DLAMMPS_MEMALIGN=64 -qno-offload \ + -fno-alias -ansi-alias -restrict $(OPTFLAGS) +#CCFLAGS += -DLMP_INTEL_NO_TBB +#CCFLAGS += -DLAMMPS_BIGBIG +#CCFLAGS += -D_USE_PAPI +#CCFLAGS += -D_USE_CRAYPAT_API +SHFLAGS = -fPIC +DEPFLAGS = -M + +LINK = $(CC) +LINKFLAGS = -g -qopenmp $(OPTFLAGS) +LINKFLAGS += -dynamic +LIB = +#LIB += -L${TBBROOT}/lib/intel64/gcc4.7 -ltbbmalloc +LIB += -ltbbmalloc +#LIB += /soft/debuggers/forge-7.0-2017-02-16/lib/64/libdmallocthcxx.a -zmuldefs +SIZE = size + +ARCHIVE = ar +ARFLAGS = -rc +SHLIBFLAGS = -shared + +# --------------------------------------------------------------------- +# LAMMPS-specific settings, all OPTIONAL +# specify settings for LAMMPS features you will use +# if you change any -D setting, do full re-compile after "make clean" + +# LAMMPS ifdef settings +# see possible settings in Section 2.2 (step 4) of manual + +LMP_INC = -DLAMMPS_GZIP #-DLAMMPS_JPEG + +# MPI library +# see discussion in Section 2.2 (step 5) of manual +# MPI wrapper compiler/linker can provide this info +# can point to dummy MPI library in src/STUBS as in Makefile.serial +# use -D MPICH and OMPI settings in INC to avoid C++ lib conflicts +# INC = path for mpi.h, MPI compiler settings +# PATH = path for MPI library +# LIB = name of MPI library + +MPI_INC = -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX=1 +MPI_PATH = +MPI_LIB = + +# FFT library +# see discussion in Section 2.2 (step 6) of manaul +# can be left blank to use provided KISS FFT library +# INC = -DFFT setting, e.g. -DFFT_FFTW, FFT compiler settings +# PATH = path for FFT library +# LIB = name of FFT library + +FFT_INC = -DFFT_MKL -DFFT_SINGLE +FFT_PATH = +FFT_LIB = -L$(MKLROOT)/lib/intel64/ -Wl,--start-group -lmkl_intel_ilp64 \ + -lmkl_intel_thread -lmkl_core -Wl,--end-group + +# JPEG and/or PNG library +# see discussion in Section 2.2 (step 7) of manual +# only needed if -DLAMMPS_JPEG or -DLAMMPS_PNG listed with LMP_INC +# INC = path(s) for jpeglib.h and/or png.h +# PATH = path(s) for JPEG library and/or PNG library +# LIB = name(s) of JPEG library and/or PNG library + +JPG_INC = +JPG_PATH = +JPG_LIB = + +# --------------------------------------------------------------------- +# build rules and dependencies +# do not edit this section + +include Makefile.package.settings +include Makefile.package + +EXTRA_INC = $(LMP_INC) $(PKG_INC) $(MPI_INC) $(FFT_INC) $(JPG_INC) $(PKG_SYSINC) +EXTRA_PATH = $(PKG_PATH) $(MPI_PATH) $(FFT_PATH) $(JPG_PATH) $(PKG_SYSPATH) +EXTRA_LIB = $(PKG_LIB) $(MPI_LIB) $(FFT_LIB) $(JPG_LIB) $(PKG_SYSLIB) + +# Path to src files + +vpath %.cpp .. +vpath %.h .. + +# Link target + +$(EXE): $(OBJ) + $(LINK) $(LINKFLAGS) $(EXTRA_PATH) $(OBJ) $(EXTRA_LIB) $(LIB) -o $(EXE) + $(SIZE) $(EXE) + +# Library targets + +lib: $(OBJ) + $(ARCHIVE) $(ARFLAGS) $(EXE) $(OBJ) + +shlib: $(OBJ) + $(CC) $(CCFLAGS) $(SHFLAGS) $(SHLIBFLAGS) $(EXTRA_PATH) -o $(EXE) \ + $(OBJ) $(EXTRA_LIB) $(LIB) + +# Compilation rules + +%.o:%.cpp + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< + +%.d:%.cpp + $(CC) $(CCFLAGS) $(EXTRA_INC) $(DEPFLAGS) $< > $@ + +%.o:%.cu + $(CC) $(CCFLAGS) $(SHFLAGS) $(EXTRA_INC) -c $< + +# Individual dependencies + +depend : fastdep.exe $(SRC) + @./fastdep.exe $(EXTRA_INC) -- $^ > .depend || exit 1 + +fastdep.exe: ../DEPEND/fastdep.c + icc -O -o $@ $< + +sinclude .depend From 5d133214258d317ec80b8599eb24e007823732bf Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Wed, 11 Jul 2018 12:15:50 -0600 Subject: [PATCH 037/123] Standardize suffix paragraph in fix_enforce2d.txt --- doc/src/fix_enforce2d.txt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/doc/src/fix_enforce2d.txt b/doc/src/fix_enforce2d.txt index 01840254b6..4bbf41d25d 100644 --- a/doc/src/fix_enforce2d.txt +++ b/doc/src/fix_enforce2d.txt @@ -28,12 +28,13 @@ not move from their initial z coordinate. :line -Styles with a suffix are functionally the same as the corresponding -style without the suffix. They have been optimized to run faster, -depending on your available hardware, as discussed in -"Section 5"_Section_accelerate.html of the manual. The -accelerated styles take the same arguments and should produce the same -results, except for round-off and precision issues. +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed in "Section 5"_Section_accelerate.html +of the manual. The accelerated styles take the same arguments and +should produce the same results, except for round-off and precision +issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if From 71f699123374944f5620b2fb2b1b18104e7b7346 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Wed, 11 Jul 2018 12:39:04 -0600 Subject: [PATCH 038/123] Small tweaks to fix_enforce2d_kokkos --- src/KOKKOS/fix_enforce2d_kokkos.cpp | 14 +++++++------- src/KOKKOS/fix_enforce2d_kokkos.h | 15 ++------------- 2 files changed, 9 insertions(+), 20 deletions(-) diff --git a/src/KOKKOS/fix_enforce2d_kokkos.cpp b/src/KOKKOS/fix_enforce2d_kokkos.cpp index 33aa39e2f6..26075b269c 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.cpp +++ b/src/KOKKOS/fix_enforce2d_kokkos.cpp @@ -34,7 +34,7 @@ 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; // | */ // MASK_MASK; + | TORQUE_MASK | ANGMOM_MASK; datamask_modify = V_MASK | F_MASK | OMEGA_MASK | TORQUE_MASK | ANGMOM_MASK; @@ -52,7 +52,6 @@ template void FixEnforce2DKokkos::post_force(int vflag) { atomKK->sync(execution_space,datamask_read); - atomKK->modified(execution_space,datamask_modify); v = atomKK->k_v.view(); f = atomKK->k_f.view(); @@ -120,16 +119,18 @@ void FixEnforce2DKokkos::post_force(int vflag) break; } default: - error->all(FLERR, "flag_mask outside of what it should be"); + error->all(FLERR, "Flag in fix_enforce2d_kokkos outside of what it should be"); } copymode = 0; - // Probably sync here again? - atomKK->sync(execution_space,datamask_read); atomKK->modified(execution_space,datamask_modify); - for (int m = 0; m < nfixlist; m++) + for (int m = 0; m < nfixlist; m++) { + atomKK->sync(flist[m]->execution_space,flist[m]->datamask_read); flist[m]->enforce2d(); + atomKK->modified(flist[m]->execution_space,flist[m]->datamask_modify); + } + } @@ -138,7 +139,6 @@ template void FixEnforce2DKokkos::post_force_item( int i ) const { if (mask[i] & groupbit){ - // x(i,2) = 0; // Enforce2d does not set x[2] to zero either... :/ v(i,2) = 0.0; f(i,2) = 0.0; diff --git a/src/KOKKOS/fix_enforce2d_kokkos.h b/src/KOKKOS/fix_enforce2d_kokkos.h index 1ed3cf3ef8..520a58de04 100644 --- a/src/KOKKOS/fix_enforce2d_kokkos.h +++ b/src/KOKKOS/fix_enforce2d_kokkos.h @@ -32,7 +32,6 @@ class FixEnforce2DKokkos : public FixEnforce2D { public: FixEnforce2DKokkos(class LAMMPS *, int, char **); // ~FixEnforce2DKokkos() {} - // void init(); void setup(int); void post_force(int); @@ -78,18 +77,8 @@ struct FixEnforce2DKokkosPostForceFunctor { /* ERROR/WARNING messages: -E: Illegal ... command +E: Flag in fix_enforce2d_kokkos outside of what it should be -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: Cannot use fix enforce2d with 3d simulation - -Self-explanatory. - -E: Fix enforce2d must be defined after fix %s - -UNDOCUMENTED +LAMMPS developer-only error. */ From aa705f6122cf08da89538aaa81aae0d7f691f178 Mon Sep 17 00:00:00 2001 From: Marshall McDonnell Date: Wed, 11 Jul 2018 15:59:48 -0400 Subject: [PATCH 039/123] Added tail correction to fix gcmc --- src/MC/fix_gcmc.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/MC/fix_gcmc.cpp b/src/MC/fix_gcmc.cpp index 6221e6d52c..b40ce6a1b3 100644 --- a/src/MC/fix_gcmc.cpp +++ b/src/MC/fix_gcmc.cpp @@ -1589,6 +1589,7 @@ void FixGCMC::attempt_atomic_deletion_full() } } if (force->kspace) force->kspace->qsum_qsq(); + if (force->pair->tail_flag) force->pair->reinit(); double energy_after = energy_full(); if (random_equal->uniform() < @@ -1607,6 +1608,7 @@ void FixGCMC::attempt_atomic_deletion_full() if (q_flag) atom->q[i] = q_tmp; } if (force->kspace) force->kspace->qsum_qsq(); + if (force->pair->tail_flag) force->pair->reinit(); energy_stored = energy_before; } update_gas_atoms_list(); @@ -1700,6 +1702,7 @@ void FixGCMC::attempt_atomic_insertion_full() comm->borders(); if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (force->kspace) force->kspace->qsum_qsq(); + if (force->pair->tail_flag) force->pair->reinit(); double energy_after = energy_full(); if (energy_after < MAXENERGYTEST && @@ -1712,6 +1715,7 @@ void FixGCMC::attempt_atomic_insertion_full() atom->natoms--; if (proc_flag) atom->nlocal--; if (force->kspace) force->kspace->qsum_qsq(); + if (force->pair->tail_flag) force->pair->reinit(); energy_stored = energy_before; } update_gas_atoms_list(); @@ -1949,6 +1953,7 @@ void FixGCMC::attempt_molecule_deletion_full() } } if (force->kspace) force->kspace->qsum_qsq(); + if (force->pair->tail_flag) force->pair->reinit(); double energy_after = energy_full(); // energy_before corrected by energy_intra @@ -1981,6 +1986,7 @@ void FixGCMC::attempt_molecule_deletion_full() } } if (force->kspace) force->kspace->qsum_qsq(); + if (force->pair->tail_flag) force->pair->reinit(); } update_gas_atoms_list(); delete[] tmpmask; @@ -2151,6 +2157,7 @@ void FixGCMC::attempt_molecule_insertion_full() comm->borders(); if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); if (force->kspace) force->kspace->qsum_qsq(); + if (force->pair->tail_flag) force->pair->reinit(); double energy_after = energy_full(); // energy_after corrected by energy_intra @@ -2181,6 +2188,7 @@ void FixGCMC::attempt_molecule_insertion_full() } else i++; } if (force->kspace) force->kspace->qsum_qsq(); + if (force->pair->tail_flag) force->pair->reinit(); } update_gas_atoms_list(); } From b31f0245d0abeea2cc851a07bf11e280abe65730 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Wed, 11 Jul 2018 15:55:16 -0600 Subject: [PATCH 040/123] 2 small bug fixes to load balancing --- doc/src/run_style.txt | 16 +++++++++++----- src/balance.cpp | 6 +++++- src/fix_balance.cpp | 13 ++++++++++--- src/fix_store.cpp | 2 -- 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/doc/src/run_style.txt b/doc/src/run_style.txt index 3240344a45..7717ede86f 100644 --- a/doc/src/run_style.txt +++ b/doc/src/run_style.txt @@ -173,11 +173,17 @@ have their force go ramped to 0.0 so the overlap with the next regime compute forces for all pairs from 5.0 outward, with those from 5.0 to 6.0 having their value ramped in an inverse manner. -Only some pair potentials support the use of the {inner} and {middle} -and {outer} keywords. If not, only the {pair} keyword can be used -with that pair style, meaning all pairwise forces are computed at the -same rRESPA level. See the doc pages for individual pair styles for -details.i +Note that you can use {inner} and {outer} without using {middle} to +split the pairwise computations into two portions instead of three. +Unless you are using a very long pairwise cutoff, a 2-way split is +often faster than a 3-way split, since it avoids too much duplicate +computation of pairwise interactions near the intermediate cutoffs. + +Also note that only a few pair potentials support the use of the +{inner} and {middle} and {outer} keywords. If not, only the {pair} +keyword can be used with that pair style, meaning all pairwise forces +are computed at the same rRESPA level. See the doc pages for +individual pair styles for details. Another option for using pair potentials with rRESPA is with the {hybrid} keyword, which requires the use of the "pair_style hybrid or diff --git a/src/balance.cpp b/src/balance.cpp index 86deb55b47..7dd13e8766 100644 --- a/src/balance.cpp +++ b/src/balance.cpp @@ -350,13 +350,13 @@ void Balance::command(int narg, char **arg) domain->set_local_box(); // move particles to new processors via irregular() + // set disable = 0, so weights migrate with atoms for imbfinal calculation if (domain->triclinic) domain->x2lamda(atom->nlocal); Irregular *irregular = new Irregular(lmp); if (wtflag) fixstore->disable = 0; if (style == BISECTION) irregular->migrate_atoms(1,1,rcb->sendproc); else irregular->migrate_atoms(1); - if (wtflag) fixstore->disable = 1; delete irregular; if (domain->triclinic) domain->lamda2x(atom->nlocal); @@ -377,9 +377,11 @@ void Balance::command(int narg, char **arg) } // imbfinal = final imbalance + // set disable = 1, so weights no longer migrate with atoms double maxfinal; double imbfinal = imbalance_factor(maxfinal); + if (wtflag) fixstore->disable = 1; // stats output @@ -540,6 +542,8 @@ void Balance::weight_storage(char *prefix) fixstore = (FixStore *) modify->fix[modify->nfix-1]; } else fixstore = (FixStore *) modify->fix[ifix]; + // do not carry weights with atoms during normal atom migration + fixstore->disable = 1; if (prefix) delete [] fixargs[0]; diff --git a/src/fix_balance.cpp b/src/fix_balance.cpp index b2f545c73f..e748e0ae31 100644 --- a/src/fix_balance.cpp +++ b/src/fix_balance.cpp @@ -114,6 +114,7 @@ FixBalance::FixBalance(LAMMPS *lmp, int narg, char **arg) : if (nevery) force_reneighbor = 1; lastbalance = -1; + next_reneighbor = -1; // compute initial outputs @@ -248,6 +249,10 @@ void FixBalance::pre_neighbor() if (!pending) return; imbfinal = balance->imbalance_factor(maxloadperproc); pending = 0; + + // set disable = 1, so weights no longer migrate with atoms + + if (wtflag) balance->fixstore->disable = 1; } /* ---------------------------------------------------------------------- @@ -275,21 +280,23 @@ void FixBalance::rebalance() // reset proc sub-domains // check and warn if any proc's subbox is smaller than neigh skin - // since may lead to lost atoms in exchange() + // since may lead to lost atoms in comm->exchange() if (domain->triclinic) domain->set_lamda_box(); domain->set_local_box(); domain->subbox_too_small_check(neighbor->skin); // move atoms to new processors via irregular() - // only needed if migrate_check() says an atom moves to far + // for non-RCB only needed if migrate_check() says an atom moves too far // else allow caller's comm->exchange() to do it + // set disable = 0, so weights migrate with atoms + // important to delay disable = 1 until after pre_neighbor imbfinal calc + // b/c atoms may migrate again in comm->exchange() if (domain->triclinic) domain->x2lamda(atom->nlocal); if (wtflag) balance->fixstore->disable = 0; if (lbstyle == BISECTION) irregular->migrate_atoms(0,1,sendproc); else if (irregular->migrate_check()) irregular->migrate_atoms(); - if (wtflag) balance->fixstore->disable = 1; if (domain->triclinic) domain->lamda2x(atom->nlocal); // invoke KSpace setup_grid() to adjust to new proc sub-domains diff --git a/src/fix_store.cpp b/src/fix_store.cpp index 3b1f3dca77..350e120972 100644 --- a/src/fix_store.cpp +++ b/src/fix_store.cpp @@ -154,8 +154,6 @@ void FixStore::reset_global(int nrow_caller, int ncol_caller) if (vecflag) memory->create(vstore,nrow,"fix/store:vstore"); else memory->create(astore,nrow,ncol,"fix/store:astore"); memory->create(rbuf,nrow*ncol+2,"fix/store:rbuf"); - - // printf("AAA HOW GET HERE\n"); } /* ---------------------------------------------------------------------- From 4ac47ba0372385431cadf37d68b890dbcdc1bf6e Mon Sep 17 00:00:00 2001 From: Christoph Junghans Date: Thu, 12 Jul 2018 07:27:11 -0600 Subject: [PATCH 041/123] cmake/README.md: fix GPU_ARCH options --- cmake/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cmake/README.md b/cmake/README.md index 5419063f6d..bafd440a64 100644 --- a/cmake/README.md +++ b/cmake/README.md @@ -1421,11 +1421,11 @@ target API. CUDA SM architecture targeted by GPU package
-
sm20 (Fermi)
-
sm30 (Kepler)
-
sm50 (Maxwell)
-
sm60 (Pascal)
-
sm70 (Volta)
+
sm_20 (Fermi)
+
sm_30 (Kepler)
+
sm_50 (Maxwell)
+
sm_60 (Pascal)
+
sm_70 (Volta)
From 21f749243a9e93da42a77a522af5801740c7daef Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Thu, 12 Jul 2018 10:21:06 -0500 Subject: [PATCH 042/123] Required newton on for pair styles body rounded/polygon and rounded/polyhedron --- doc/src/pair_body_rounded_polygon.txt | 3 --- doc/src/pair_body_rounded_polyhedron.txt | 3 --- src/BODY/pair_body_rounded_polygon.cpp | 4 ++++ src/BODY/pair_body_rounded_polyhedron.cpp | 4 ++++ 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index 15817f10f8..5ef4a9104b 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -93,9 +93,6 @@ These pair styles are part of the BODY package. They are only enabled if LAMMPS was built with that package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info. -NOTE: is there a newton on or off requirement for using this pair style? -If so, say something like this: - This pair style requires the "newton"_newton.html setting to be "on" for pair interactions. diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/src/pair_body_rounded_polyhedron.txt index 29fa90d2cf..81c69fdd62 100644 --- a/doc/src/pair_body_rounded_polyhedron.txt +++ b/doc/src/pair_body_rounded_polyhedron.txt @@ -94,9 +94,6 @@ These pair styles are part of the BODY package. They are only enabled if LAMMPS was built with that package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info. -NOTE: is there a newton on or off requirement for using this pair style? -If so, say something like this: - This pair style requires the "newton"_newton.html setting to be "on" for pair interactions. diff --git a/src/BODY/pair_body_rounded_polygon.cpp b/src/BODY/pair_body_rounded_polygon.cpp index c4c09fd677..14ef70f476 100644 --- a/src/BODY/pair_body_rounded_polygon.cpp +++ b/src/BODY/pair_body_rounded_polygon.cpp @@ -428,6 +428,10 @@ void PairBodyRoundedPolygon::init_style() "body style rounded/polygon"); bptr = (BodyRoundedPolygon *) avec->bptr; + if (force->newton_pair == 0) + error->all(FLERR,"Pair style body/rounded/polygon requires " + "newton pair on"); + if (comm->ghost_velocity == 0) error->all(FLERR,"Pair body/rounded/polygon requires " "ghost atoms store velocity"); diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index 0d73d249b9..2ff209d609 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -400,6 +400,10 @@ void PairBodyRoundedPolyhedron::init_style() "body style rounded/polyhedron"); bptr = (BodyRoundedPolyhedron *) avec->bptr; + if (force->newton_pair == 0) + error->all(FLERR,"Pair style body/rounded/polyhedron requires " + "newton pair on"); + if (comm->ghost_velocity == 0) error->all(FLERR,"Pair body/rounded/polyhedron requires " "ghost atoms store velocity"); From 85511a4db8297dbc43c0d3eb6b69c47d48767a4c Mon Sep 17 00:00:00 2001 From: HaoZeke Date: Fri, 13 Jul 2018 00:44:03 +0530 Subject: [PATCH 043/123] docs: Fix sneaky unicode character Fixes the `pdf` target of the `Makefile`. --- doc/src/Developer/developer.tex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Developer/developer.tex b/doc/src/Developer/developer.tex index 9d9a93a53d..8852f44168 100644 --- a/doc/src/Developer/developer.tex +++ b/doc/src/Developer/developer.tex @@ -476,7 +476,7 @@ is the name of the class. This code allows LAMMPS to find your fix when it parses input script. In addition, your fix header must be included in the file "style\_fix.h". In case if you use LAMMPS make, this file is generated automatically - all files starting with prefix -fix\_ are included, so call your header the same way. Otherwise, donÕt +fix\_ are included, so call your header the same way. Otherwise, don't forget to add your include into "style\_fix.h". Let's write a simple fix which will print average velocity at the end From 16381a52b14aeeb47cc6eb0e2897019bc9c4a4df Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 12 Jul 2018 20:22:38 -0600 Subject: [PATCH 044/123] Fix crash in ReaxFF on GPUs --- src/KOKKOS/pair_reaxc_kokkos.cpp | 9 +++++---- src/KOKKOS/pair_reaxc_kokkos.h | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index bb9f8ab417..e2e2e6f6de 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -343,6 +343,7 @@ void PairReaxCKokkos::init_md() swa = control->nonb_low; swb = control->nonb_cut; + enobondsflag = control->enobondsflag; if (fabs(swa) > 0.01 ) error->warning(FLERR,"Warning: non-zero lower Taper-radius cutoff"); @@ -2272,12 +2273,12 @@ void PairReaxCKokkos::operator()(PairReaxComputeMulti2 0 || control->enobondsflag) + if (numbonds > 0 || enobondsflag) e_lp = p_lp2 * d_Delta_lp[i] * inv_expvd2; const F_FLOAT dElp = p_lp2 * inv_expvd2 + 75.0 * p_lp2 * d_Delta_lp[i] * expvd2 * inv_expvd2*inv_expvd2; const F_FLOAT CElp = dElp * d_dDelta_lp[i]; - if (numbonds > 0 || control->enobondsflag) + if (numbonds > 0 || enobondsflag) a_CdDelta[i] += CElp; if (eflag) ev.ereax[0] += e_lp; @@ -2314,7 +2315,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeMulti2 0 || control->enobondsflag) + if (numbonds > 0 || enobondsflag) e_un = -p_ovun5 * (1.0 - exp_ovun6) * inv_exp_ovun2n * inv_exp_ovun8; if (eflag) ev.ereax[2] += e_un; @@ -2334,7 +2335,7 @@ void PairReaxCKokkos::operator()(PairReaxComputeMulti2 0 || control->enobondsflag) + if (numbonds > 0 || enobondsflag) a_CdDelta[i] += CEunder3; const int j_start = d_bo_first[i]; diff --git a/src/KOKKOS/pair_reaxc_kokkos.h b/src/KOKKOS/pair_reaxc_kokkos.h index 5175e274a8..5c96d44618 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.h +++ b/src/KOKKOS/pair_reaxc_kokkos.h @@ -427,7 +427,7 @@ class PairReaxCKokkos : public PairReaxC { friend void pair_virial_fdotr_compute(PairReaxCKokkos*); - int bocnt,hbcnt; + int bocnt,hbcnt,enobondsflag; typedef LR_lookup_table_kk LR_lookup_table_kk_DT; From d4f8940ff2367f81b0ae806ec3cd057cc69c6614 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Fri, 13 Jul 2018 07:40:06 -0600 Subject: [PATCH 045/123] Update command doc page for Kokkos enforce2d --- doc/src/Section_commands.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index 3dabdbeaa1..cc9757a88e 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -571,7 +571,7 @@ USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. "dt/reset"_fix_dt_reset.html, "efield"_fix_efield.html, "ehex"_fix_ehex.html, -"enforce2d"_fix_enforce2d.html, +"enforce2d (k)"_fix_enforce2d.html, "evaporate"_fix_evaporate.html, "external"_fix_external.html, "freeze"_fix_freeze.html, From 8447d8dd9199555d136f6dd92d389f07cc03d320 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Fri, 13 Jul 2018 14:34:50 -0500 Subject: [PATCH 046/123] Updated doc pages for pair body rounded/polygon and rounded/polyhedra --- doc/src/pair_body_rounded_polygon.txt | 16 +++++++++++----- doc/src/pair_body_rounded_polyhedron.txt | 20 +++++++++++++------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index 5ef4a9104b..55bd8e51d4 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -18,8 +18,6 @@ mu = normal friction coefficient during gross sliding delta_ua = multiple contact scaling factor cutoff = global separation cutoff for interactions (distance units), see below for definition :pre -NOTE: what does gross sliding mean? - [Examples:] pair_style body/rounded/polygon 20.0 5.0 0.0 1.0 0.5 @@ -38,7 +36,7 @@ body particles. This pairwise interaction between rounded polygons is described in "Fraige"_#Fraige, where a polygon does not have sharp corners, but is rounded at its vertices by circles centered on each vertex with a -specified diameter. The edges of the polygon are defined bewteen +specified diameter. The edges of the polygon are defined between pairs of adjacent vertices. The circle diameter for each polygon is specified in the data file read by the "read data"_read_data.html command. This is a 2d discrete element model (DEM) which allows for @@ -47,7 +45,7 @@ multiple contact points. Note that when two particles interact, the effective surface of each polygon particle is displaced outward from each of its vertices and edges by half its circle diameter. The interaction forces and -energies bewteen two particles are defined with respect to the +energies between two particles are defined with respect to the separation of their respective rounded surfaces, not by the separation of the vertices and edges themselves. @@ -65,7 +63,15 @@ explains how contact is defined? Do we need an equation(s) that explain what the params in pair style and coeff mean, for damping and spring constants? Or do we just want to reference the paper for that? -NOTE: say something about no frictional history ? +In "Fraige"_#Fraige, the tangential friction force between two particles +that are in contact is modeled differently prior to gross sliding +(i.e. static friction) and during gross-sliding (kinetic friction). +The latter takes place when the tangential deformation exceeds +the Coulomb frictional limit. In the current implementation, however, +we do not take into account frictional history, i.e. we do not keep track +of how many time steps the two particles have been in contact +nor calculate the tangential deformation. We assume that gross sliding +takes place right when two particles are in contact. The following coefficients must be defined for each pair of atom types via the "pair_coeff"_pair_coeff.html command as in the examples above, diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/src/pair_body_rounded_polyhedron.txt index 81c69fdd62..5f43ebee63 100644 --- a/doc/src/pair_body_rounded_polyhedron.txt +++ b/doc/src/pair_body_rounded_polyhedron.txt @@ -16,9 +16,7 @@ c_n = normal damping coefficient c_t = tangential damping coefficient mu = normal friction coefficient during gross sliding delta_ua = multiple contact scaling factor -cutoff = global sepration cutoff for interactions (distance units), see below for definition :pre - -NOTE: what does gross sliding mean? +cutoff = global separation cutoff for interactions (distance units), see below for definition :pre [Examples:] @@ -39,16 +37,16 @@ This pairwise interaction between rounded polyhedra is described in "Wang"_#Wang, where a polyhedron does not have sharp corners and edges, but is rounded at its vertices and edges by spheres centered on each vertex with a specified diameter. The edges if the polyhedron -are defined bewteen pairs of adjacent vertices. Its faces are defined +are defined between pairs of adjacent vertices. Its faces are defined by a loop of edges. The sphere diameter for each polygon is specified in the data file read by the "read data"_read_data.html command. This is a discrete element model (DEM) which allows for multiple contact points. -Note that when two particles interaact, the effective surface of each +Note that when two particles interact, the effective surface of each polyhedron particle is displaced outward from each of its vertices, edges, and faces by half its sphere diameter. The interaction forces -and energies bewteen two particles are defined with respect to the +and energies between two particles are defined with respect to the separation of their respective rounded surfaces, not by the separation of the vertices, edges, and faces themselves. @@ -66,7 +64,15 @@ explains how contact is defined? Do we need an equation(s) that explain what the params in pair style and coeff mean, for damping and spring constants? Or do we just want to reference the paper for that? -NOTE: say something about no frictional history ? +In "Wang"_#Wang, the tangential friction force between two particles +that are in contact is modeled differently prior to gross sliding +(i.e. static friction) and during gross-sliding (kinetic friction). +The latter takes place when the tangential deformation exceeds +the Coulomb frictional limit. In the current implementation, however, +we do not take into account frictional history, i.e. we do not keep track +of how many time steps the two particles have been in contact +nor calculate the tangential deformation. We assume that gross sliding +takes place right when two particles are in contact. The following coefficients must be defined for each pair of atom types via the "pair_coeff"_pair_coeff.html command as in the examples above, From d00eaef070f6d8500831f5893ec2de6dfa5041b9 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Fri, 13 Jul 2018 23:05:44 -0400 Subject: [PATCH 047/123] Allow 'set' command to change atom velocities --- python/lammps.py | 11 +++++++++++ src/set.cpp | 26 +++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/python/lammps.py b/python/lammps.py index e7d703e12a..2f4ffb642e 100644 --- a/python/lammps.py +++ b/python/lammps.py @@ -708,6 +708,12 @@ class Atom(object): self.lmp.eval("vy[%d]" % self.index), self.lmp.eval("vz[%d]" % self.index)) + @velocity.setter + def velocity(self, value): + self.lmp.set("atom", self.index, "vx", value[0]) + self.lmp.set("atom", self.index, "vy", value[1]) + self.lmp.set("atom", self.index, "vz", value[2]) + @property def force(self): return (self.lmp.eval("fx[%d]" % self.index), @@ -738,6 +744,11 @@ class Atom2D(Atom): return (self.lmp.eval("vx[%d]" % self.index), self.lmp.eval("vy[%d]" % self.index)) + @velocity.setter + def velocity(self, value): + self.lmp.set("atom", self.index, "vx", value[0]) + self.lmp.set("atom", self.index, "vy", value[1]) + @property def force(self): return (self.lmp.eval("fx[%d]" % self.index), diff --git a/src/set.cpp b/src/set.cpp index 0294f93e5d..7eca4e9a9c 100644 --- a/src/set.cpp +++ b/src/set.cpp @@ -48,7 +48,7 @@ enum{TYPE,TYPE_FRACTION,MOLECULE,X,Y,Z,CHARGE,MASS,SHAPE,LENGTH,TRI, THETA,THETA_RANDOM,ANGMOM,OMEGA, DIAMETER,DENSITY,VOLUME,IMAGE,BOND,ANGLE,DIHEDRAL,IMPROPER, MESO_E,MESO_CV,MESO_RHO,EDPD_TEMP,EDPD_CV,CC,SMD_MASS_DENSITY, - SMD_CONTACT_RADIUS,DPDTHETA,INAME,DNAME}; + SMD_CONTACT_RADIUS,DPDTHETA,INAME,DNAME,VX,VY,VZ}; #define BIG INT_MAX @@ -141,6 +141,27 @@ void Set::command(int narg, char **arg) set(Z); iarg += 2; + } else if (strcmp(arg[iarg],"vx") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); + if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); + else dvalue = force->numeric(FLERR,arg[iarg+1]); + set(VX); + iarg += 2; + + } else if (strcmp(arg[iarg],"vy") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); + if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); + else dvalue = force->numeric(FLERR,arg[iarg+1]); + set(VY); + iarg += 2; + + } else if (strcmp(arg[iarg],"vz") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); + if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); + else dvalue = force->numeric(FLERR,arg[iarg+1]); + set(VZ); + iarg += 2; + } else if (strcmp(arg[iarg],"charge") == 0) { if (iarg+2 > narg) error->all(FLERR,"Illegal set command"); if (strstr(arg[iarg+1],"v_") == arg[iarg+1]) varparse(arg[iarg+1],1); @@ -732,6 +753,9 @@ void Set::set(int keyword) else if (keyword == X) atom->x[i][0] = dvalue; else if (keyword == Y) atom->x[i][1] = dvalue; else if (keyword == Z) atom->x[i][2] = dvalue; + else if (keyword == VX) atom->v[i][0] = dvalue; + else if (keyword == VY) atom->v[i][1] = dvalue; + else if (keyword == VZ) atom->v[i][2] = dvalue; else if (keyword == CHARGE) atom->q[i] = dvalue; else if (keyword == MASS) { if (dvalue <= 0.0) error->one(FLERR,"Invalid mass in set command"); From aa3d3213c914144d0873c572363522f108ce1cb6 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Fri, 13 Jul 2018 23:06:42 -0400 Subject: [PATCH 048/123] Update set command documentation --- doc/src/set.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/src/set.txt b/doc/src/set.txt index d05660dc42..d2235d5c32 100644 --- a/doc/src/set.txt +++ b/doc/src/set.txt @@ -36,6 +36,8 @@ keyword = {type} or {type/fraction} or {mol} or {x} or {y} or {z} or \ value can be an atom-style variable (see below) {x},{y},{z} value = atom coordinate (distance units) value can be an atom-style variable (see below) + {vx},{vy},{vz} value = atom velocity (velocity units) + value can be an atom-style variable (see below) {charge} value = atomic charge (charge units) value can be an atom-style variable (see below) {dipole} values = x y z @@ -127,6 +129,7 @@ set type 3 charge 0.5 set type 1*3 charge 0.5 set atom * charge v_atomfile set atom 100*200 x 0.5 y 1.0 +set atom 100 vx 0.0 vy 0.0 vz -1.0 set atom 1492 type 3 :pre [Description:] @@ -225,7 +228,8 @@ IDs. Keywords {x}, {y}, {z}, and {charge} set the coordinates or charge of all selected atoms. For {charge}, the "atom style"_atom_style.html -being used must support the use of atomic charge. +being used must support the use of atomic charge. Keywords {vx}, {vy}, +and {vz} set the velocities of all selected atoms. Keyword {dipole} uses the specified x,y,z values as components of a vector to set as the orientation of the dipole moment vectors of the From f7d551eb5400580899cde3d2dfa9c325729bbcbc Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sun, 15 Jul 2018 08:27:55 -0500 Subject: [PATCH 049/123] Added a figure illustrating pair body rounded/polygon and rounded/polyhedron --- doc/src/JPG/pair_body_rounded.png | Bin 0 -> 650896 bytes doc/src/pair_body_rounded_polygon.txt | 2 ++ doc/src/pair_body_rounded_polyhedron.txt | 2 ++ 3 files changed, 4 insertions(+) create mode 100644 doc/src/JPG/pair_body_rounded.png diff --git a/doc/src/JPG/pair_body_rounded.png b/doc/src/JPG/pair_body_rounded.png new file mode 100644 index 0000000000000000000000000000000000000000..709105ca325764adb567f123a8797ca4f76c581e GIT binary patch literal 650896 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

v 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 Rg#jD8>#$nFjN?$MP(=SVXSJ5>3+ak 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

nP@ubWZNm5tzG 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 literal 0 HcmV?d00001 diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index 55bd8e51d4..e015dc76df 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -63,6 +63,8 @@ explains how contact is defined? Do we need an equation(s) that explain what the params in pair style and coeff mean, for damping and spring constants? Or do we just want to reference the paper for that? +:c,image(JPG/pair_body_rounded.jpg) + In "Fraige"_#Fraige, the tangential friction force between two particles that are in contact is modeled differently prior to gross sliding (i.e. static friction) and during gross-sliding (kinetic friction). diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/src/pair_body_rounded_polyhedron.txt index 5f43ebee63..4c48b5c1bf 100644 --- a/doc/src/pair_body_rounded_polyhedron.txt +++ b/doc/src/pair_body_rounded_polyhedron.txt @@ -64,6 +64,8 @@ explains how contact is defined? Do we need an equation(s) that explain what the params in pair style and coeff mean, for damping and spring constants? Or do we just want to reference the paper for that? +:c,image(JPG/pair_body_rounded.jpg) + In "Wang"_#Wang, the tangential friction force between two particles that are in contact is modeled differently prior to gross sliding (i.e. static friction) and during gross-sliding (kinetic friction). From 27dc7f3205f5da2c7379ef3141df66546c054557 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 16 Jul 2018 11:44:45 -0500 Subject: [PATCH 050/123] Added a tex file for the equations of pair rounded/polygon and rounded/polyhedron --- doc/src/Eqs/pair_body_rounded.tex | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 doc/src/Eqs/pair_body_rounded.tex diff --git a/doc/src/Eqs/pair_body_rounded.tex b/doc/src/Eqs/pair_body_rounded.tex new file mode 100644 index 0000000000..54e095340f --- /dev/null +++ b/doc/src/Eqs/pair_body_rounded.tex @@ -0,0 +1,13 @@ +\documentstyle[12pt]{article} + +\begin{document} + +\begin{eqnarray*} + F_n &=& k_n \delta_n - c_n v_n, \qquad \delta_n \le 0 \\ + &=& -k_{na} \delta_n - c_n v_n, \qquad 0 < \delta_n \le r_c \\ + &=& 0 \qquad \qquad \qquad \qquad \delta_n > r_c \\ + F_t &=& \mu k_n \delta_n - c_t v_t, \qquad \delta_n \le 0 \\ + &=& 0 \qquad \qquad \qquad \qquad \delta_n > 0 +\end{eqnarray*} + +\end{document} From cfa6e8717d2dfd9c5ec2c93dfafdd88de2d8dfb1 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Mon, 16 Jul 2018 12:45:23 -0500 Subject: [PATCH 051/123] Updated doc pages for pair body rounded/polygon and rounded/polyhedron with equations --- doc/src/Eqs/pair_body_rounded.jpg | Bin 0 -> 146978 bytes doc/src/pair_body_rounded_polygon.txt | 8 ++++---- doc/src/pair_body_rounded_polyhedron.txt | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) create mode 100644 doc/src/Eqs/pair_body_rounded.jpg diff --git a/doc/src/Eqs/pair_body_rounded.jpg b/doc/src/Eqs/pair_body_rounded.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e7136ddd20c2acea0e89fa8412497333f15cb541 GIT binary patch literal 146978 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

&mla2Bv-j9_LOV>rgc(FYfl_PM7S)w>bPe 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 Date: Mon, 16 Jul 2018 15:21:52 -0400 Subject: [PATCH 052/123] add support for restarting extra/XXX/per/atom settings in binary restarts --- src/read_restart.cpp | 15 ++++++++++++++- src/write_restart.cpp | 10 +++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/read_restart.cpp b/src/read_restart.cpp index 1164de6faa..7d8e6ca395 100644 --- a/src/read_restart.cpp +++ b/src/read_restart.cpp @@ -62,7 +62,9 @@ enum{VERSION,SMALLINT,TAGINT,BIGINT, MULTIPROC,MPIIO,PROCSPERFILE,PERPROC, IMAGEINT,BOUNDMIN,TIMESTEP, ATOM_ID,ATOM_MAP_STYLE,ATOM_MAP_USER,ATOM_SORTFREQ,ATOM_SORTBIN, - COMM_MODE,COMM_CUTOFF,COMM_VEL,NO_PAIR}; + COMM_MODE,COMM_CUTOFF,COMM_VEL,NO_PAIR, + EXTRA_BOND_PER_ATOM,EXTRA_ANGLE_PER_ATOM,EXTRA_DIHEDRAL_PER_ATOM, + EXTRA_IMPROPER_PER_ATOM,EXTRA_SPECIAL_PER_ATOM}; #define LB_FACTOR 1.1 @@ -914,6 +916,17 @@ void ReadRestart::header(int incompatible) } else if (flag == COMM_VEL) { comm->ghost_velocity = read_int(); + } else if (flag == EXTRA_BOND_PER_ATOM) { + atom->extra_bond_per_atom = read_int(); + } else if (flag == EXTRA_ANGLE_PER_ATOM) { + atom->extra_angle_per_atom = read_int(); + } else if (flag == EXTRA_DIHEDRAL_PER_ATOM) { + atom->extra_dihedral_per_atom = read_int(); + } else if (flag == EXTRA_IMPROPER_PER_ATOM) { + atom->extra_improper_per_atom = read_int(); + } else if (flag == EXTRA_SPECIAL_PER_ATOM) { + force->special_extra = read_int(); + } else error->all(FLERR,"Invalid flag in header section of restart file"); flag = read_int(); diff --git a/src/write_restart.cpp b/src/write_restart.cpp index 69b731870d..1bfbb382a8 100644 --- a/src/write_restart.cpp +++ b/src/write_restart.cpp @@ -61,7 +61,9 @@ enum{VERSION,SMALLINT,TAGINT,BIGINT, MULTIPROC,MPIIO,PROCSPERFILE,PERPROC, IMAGEINT,BOUNDMIN,TIMESTEP, ATOM_ID,ATOM_MAP_STYLE,ATOM_MAP_USER,ATOM_SORTFREQ,ATOM_SORTBIN, - COMM_MODE,COMM_CUTOFF,COMM_VEL,NO_PAIR}; + COMM_MODE,COMM_CUTOFF,COMM_VEL,NO_PAIR, + EXTRA_BOND_PER_ATOM,EXTRA_ANGLE_PER_ATOM,EXTRA_DIHEDRAL_PER_ATOM, + EXTRA_IMPROPER_PER_ATOM,EXTRA_SPECIAL_PER_ATOM}; /* ---------------------------------------------------------------------- */ @@ -527,6 +529,12 @@ void WriteRestart::header() write_double(COMM_CUTOFF,comm->cutghostuser); write_int(COMM_VEL,comm->ghost_velocity); + write_int(EXTRA_BOND_PER_ATOM,atom->extra_bond_per_atom); + write_int(EXTRA_ANGLE_PER_ATOM,atom->extra_angle_per_atom); + write_int(EXTRA_DIHEDRAL_PER_ATOM,atom->extra_dihedral_per_atom); + write_int(EXTRA_IMPROPER_PER_ATOM,atom->extra_improper_per_atom); + write_int(EXTRA_SPECIAL_PER_ATOM,force->special_extra); + // -1 flag signals end of header int flag = -1; From 5abbea360626d02a439daf40309f1b4e13861fff Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Mon, 16 Jul 2018 14:52:18 -0600 Subject: [PATCH 053/123] doc file changes/Qs added for body DEM particles --- doc/src/JPG/pair_body_rounded.jpg | Bin 0 -> 35619 bytes doc/src/JPG/pair_body_rounded.png | Bin 650896 -> 0 bytes doc/src/body.txt | 61 ++++++++++++--------- doc/src/pair_body_rounded_polygon.txt | 67 +++++++++++++++-------- doc/src/pair_body_rounded_polyhedron.txt | 34 +++++++++--- 5 files changed, 105 insertions(+), 57 deletions(-) create mode 100644 doc/src/JPG/pair_body_rounded.jpg delete mode 100644 doc/src/JPG/pair_body_rounded.png diff --git a/doc/src/JPG/pair_body_rounded.jpg b/doc/src/JPG/pair_body_rounded.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd745c44e27e96585be021b3dcca342f686e15e9 GIT binary patch literal 35619 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

nP@ubWZNm5tzG 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 diff --git a/doc/src/body.txt b/doc/src/body.txt index 0e64e6ad5b..be5b3d4edf 100644 --- a/doc/src/body.txt +++ b/doc/src/body.txt @@ -27,9 +27,9 @@ styles supported by LAMMPS are as follows. The name in the first column is used as the {bstyle} argument for the "atom_style body"_atom_style.html command. -{nparticle} | rigid body with N sub-particles | -{rounded/polygon} | 2d polygons with N vertices :tb(c=2,s=|) -{rounded/polyhedron} | 3d polyhedra with N vertices, E edges and F faces :tb(c=2,s=|) +{nparticle} : rigid body with N sub-particles +{rounded/polygon} : 2d polygons with N vertices +{rounded/polyhedron} : 3d polyhedra with N vertices, E edges and F faces :tb(s=:) The body style determines what attributes are stored for each body and thus how they can be used to compute pairwise body/body or @@ -180,11 +180,11 @@ The {bflag2} argument is ignored. The {rounded/polygon} body style represents body particles as a 2d polygon with a variable number of N vertices. This style can only be -used for 2d models; see the "boundary"_boundary.html command. +used for 2d models; see the "boundary"_boundary.html command. See the +"pair_style body/rounded/polygon" doc page for a diagram of two +squares with rounded circles at the vertices. Special cases for N = 1 +(circle) and N = 2 (rod with rounded ends) can also be specified. -NOTE: include a diagram of a rounded polygon body particle - -Special cases for N = 1 (spheres) and N = 2 (rods) are also included. One use of this body style is for 2d discrete element models, as described in "Fraige"_#Fraige. @@ -220,9 +220,9 @@ vertices (x1 to zN) as 3N values (with z = 0.0 for each), followed by 2N vertex indices corresponding to the end points of the N edges, followed by a single diameter value = the rounded diameter of the circle that surrounds each vertex. The diameter value can be different -for each body particle. These floating-point values can be -listed on as many lines as you wish; see the -"read_data"_read_data.html command for more details. +for each body particle. These floating-point values can be listed on +as many lines as you wish; see the "read_data"_read_data.html command +for more details. The 6 moments of inertia (ixx,iyy,izz,ixy,ixz,iyz) should be the values consistent with the current orientation of the rigid body @@ -235,9 +235,10 @@ position of the particle is specified by the x,y,z values in the {Atoms} section of the data file. For example, the following information would specify a square particle -whose edge length is sqrt(2) and rounded diameter is 1.0 in length unit -and initial orientation is determined from the 6 moments of inertia -(ixx iyy izz ixy ixz iyz): +whose edge length is sqrt(2) and rounded diameter is 1.0. The +orientation of the square is aligned with the xy coordinate axes which +is consistent with the 6 moments of inertia: ixx iyy izz ixy ixz iyz = +1 1 4 0 0 0. 3 1 27 4 @@ -265,14 +266,14 @@ body particles with a wall. The {rounded/polyhedron} body style represents body particles as a 3d polyhedron with a variable number of N vertices, E edges and F faces. This style can only be used for 3d models; see the -"boundary"_boundary.html command. +"boundary"_boundary.html command. See the "pair_style +body/rounded/polygon" doc page for a diagram of a two 2d squares with +rounded circles at the vertices. A 3d cube with rounded spheres +at the 8 vertices and 12 rounded edges would be similar. -NOTE: include a diagram of a rounded polyhedron body particle - -NOTE: 2d objects can also be specified as a special case, e.g. -for a triangle, N = 3, E = 3 and F = 1. - -Special cases for N = 1 (spheres) and N = 2 (rods) are also valid. +TRUNG: What are the special cases allowed for 3d, if any? Similar to +the N=1 (sphere) and N=2 (rod) special cases for 2d, descibed in +previous section. This body style is for 3d discrete element models, as described in "Wang"_#Wang. @@ -316,9 +317,9 @@ moments of inertia followed by the coordinates of the N vertices (x1 to zN) as 3N values, followed by 2N vertex indices corresponding to the end points of the E edges, then 4*F vertex indices defining F faces. The last value is the diameter value = the rounded diameter of -the sphere that surrounds each vertex. The diameter value can be different -for each body particle. These floating-point values -can be listed on as many lines as you wish; see the +the sphere that surrounds each vertex. The diameter value can be +different for each body particle. These floating-point values can be +listed on as many lines as you wish; see the "read_data"_read_data.html command for more details. Because the maxmimum vertices per face is hard-coded to be 4 (i.e. quadrilaterals), faces with more than 4 vertices need to be @@ -340,9 +341,10 @@ position of the particle is specified by the x,y,z values in the {Atoms} section of the data file. For example, the following information would specify a cubic particle -whose edge length is 2.0 and rounded diameter is 0.5 in length unit -and initial orientation is determined from the 6 moments of inertia -(ixx iyy izz ixy ixz iyz): +whose edge length is 2.0 and rounded diameter is 0.5. +The orientation of the cube is aligned with the xyz coordinate axes +which is consistent with the 6 moments of inertia: ixx iyy izz ixy ixz +iyz = 0.667 0.667 0.667 0 0 0. 1 3 79 8 12 6 @@ -375,6 +377,13 @@ and initial orientation is determined from the 6 moments of inertia 3 0 4 7 0.5 :pre +The "pair_style +body/rounded/polhedron"_pair_body_rounded_polyhedron.html command can +be used with this body style to compute body/body interactions. The +"fix wall/body/polyhedron"_fix_wall_body_polygon.html command can be +used with this body style to compute the interaction of body particles +with a wall. + :line For output purposes via the "compute diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index d611e8ec98..588a7d6ff9 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -28,9 +28,9 @@ pair_coeff 1 1 100.0 1.0 :pre Style {body/rounded/polygon} is for use with 2d models of body particles of style {rounded/polygon}. It calculates pairwise -body/body interactions as well as interactions between body and -point-particles. See "Section 6.14"_Section_howto.html#howto_14 of -the manual and the "body"_body.html doc page for more details on using +body/body interactions as well as interactions between body and point +particles. See "Section 6.14"_Section_howto.html#howto_14 of the +manual and the "body"_body.html doc page for more details on using body particles. This pairwise interaction between rounded polygons is described in @@ -44,36 +44,50 @@ multiple contact points. Note that when two particles interact, the effective surface of each polygon particle is displaced outward from each of its vertices and -edges by half its circle diameter. The interaction forces and -energies between two particles are defined with respect to the -separation of their respective rounded surfaces, not by the separation -of the vertices and edges themselves. +edges by half its circle diameter (as in the diagram below of a gray +and yellow square particle). The interaction forces and energies +between two particles are defined with respect to the separation of +their respective rounded surfaces, not by the separation of the +vertices and edges themselves. This means that the specified cutoff in the pair_style command should be large enough to encompass the center-to-center distance between two -particles (at any orientation) which would produce a surface-surface -overlap. For example, consider two square particles with edge length -= 1.0 and circle diameter 0.2. The maximum distance of one polygon's -surface from its center is not sqrt(2)/2, but (sqrt(2)+0.1)/2. Thus -the cutoff distance should be sqrt(2) + 0.1, since the surfaces of two -particles that far apart could be touching. +particles (at any orientation) which would produce an overlap of the +two surfaces. For example, consider two square particles with edge +length = 1.0 and circle diameter 0.2. The maximum distance of one +polygon's surface from its center is not sqrt(2)/2, but +(sqrt(2)+0.1)/2. Thus the cutoff distance should be sqrt(2) + 0.1, +since the surfaces of two particles that far apart could be touching. -The forces between vertex-vertex, vertex-edge, vertex-face and edge-edge +The forces between vertex-vertex, vertex-edge, and edge-edge overlaps are given by: :c,image(Eqs/pair_body_rounded.jpg) :c,image(JPG/pair_body_rounded.jpg) -In "Fraige"_#Fraige, the tangential friction force between two particles -that are in contact is modeled differently prior to gross sliding -(i.e. static friction) and during gross-sliding (kinetic friction). -The latter takes place when the tangential deformation exceeds -the Coulomb frictional limit. In the current implementation, however, -we do not take into account frictional history, i.e. we do not keep track -of how many time steps the two particles have been in contact -nor calculate the tangential deformation. We assume that gross sliding -takes place right when two particles are in contact. +In "Fraige"_#Fraige, the tangential friction force between two +particles that are in contact is modeled differently prior to gross +sliding (i.e. static friction) and during gross-sliding (kinetic +friction). The latter takes place when the tangential deformation +exceeds the Coulomb frictional limit. In the current implementation, +however, we do not take into account frictional history, i.e. we do +not keep track of how many time steps the two particles have been in +contact nor calculate the tangential deformation. Instead, we assume +that gross sliding takes place as soon as two particles are in +contact. + +TRUNG: The diagram label "cohesive regions" confuses me. Are you +saying there is some distance d for which the force is attractive, +i.e. the particles are cohesive? I think when d > Ri + Rj, since Ri + +Rj is the surface/surface overlap discussed above? If so, then the +discussion above about the specified cutoff is wrong? I.e. you can +specify a large cutoff than the surface/surface overlap to get +cohesive interactions? If so, this should be explained up above. +But an additional confusion is that the specied cutoff (Rc in diagram?) +is a single number, but depedning on the orientiation of the 2 +particles they might have a suface/surface overlap at a much +smaller value of Ri + Rj. So what is Rc then? The following coefficients must be defined for each pair of atom types via the "pair_coeff"_pair_coeff.html command as in the examples above, @@ -82,6 +96,13 @@ or in the data file read by the "read_data"_read_data.html command: k_n (energy/distance^2 units) k_na (energy/distance^2 units) :ul +Effectively, k_n and k_na are the slopes of the red lines in the plot +above for force versus distance, for r < 0 and 0 < r < rc +respectively. TRUNG: is this sentence correct? + +TRUNG: reminder to copy any change in this file +to the pair polyhedron file as well (and vice versa) + [Mixing, shift, table, tail correction, restart, rRESPA info]: This pair style does not support the "pair_modify"_pair_modify.html diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/src/pair_body_rounded_polyhedron.txt index 52f6294d85..621254bd72 100644 --- a/doc/src/pair_body_rounded_polyhedron.txt +++ b/doc/src/pair_body_rounded_polyhedron.txt @@ -33,6 +33,20 @@ point-particles. See "Section 6.14"_Section_howto.html#howto_14 of the manual and the "body"_body.html doc page for more details on using body particles. +TRUNG: I think we need a paragraph here about how body/sphere +interactions are handled. Does this pair style only do body/body but +allow for a body = sphere or rod or some other degenerate case? Or +does this pair style allow you to model a simulation of mixed body and +point particles, where point particles are spheroids. If so, does +this pair style do body/body and body/point, and you use one of the +other granular pair styles to do point/point? I.e. a pair hybrid +model? Or does everything have to be defined as bodies. Actually +this paragraph would make more sense in the body.txt file about how to +create a model that includes non-body particles (spheres). And in +this pair style file just a couple lines about which part of the +interactions this pair style computes. Ditto in the pair body polygon +file. + This pairwise interaction between rounded polyhedra is described in "Wang"_#Wang, where a polyhedron does not have sharp corners and edges, but is rounded at its vertices and edges by spheres centered on @@ -59,8 +73,8 @@ surface from its center is not sqrt(3)/2, but (sqrt(3)+0.1)/2. Thus the cutoff distance should be sqrt(3) + 0.1, since the surfaces of two particles that far apart could be touching. -The forces between vertex-vertex, vertex-edge, vertex-face, edge-edge -and edge-face are given by: +The forces between vertex-vertex, vertex-edge, vertex-face, edge-edge, +and edge-face overlaps are given by: :c,image(Eqs/pair_body_rounded.jpg) @@ -69,12 +83,12 @@ and edge-face are given by: In "Wang"_#Wang, the tangential friction force between two particles that are in contact is modeled differently prior to gross sliding (i.e. static friction) and during gross-sliding (kinetic friction). -The latter takes place when the tangential deformation exceeds -the Coulomb frictional limit. In the current implementation, however, -we do not take into account frictional history, i.e. we do not keep track -of how many time steps the two particles have been in contact -nor calculate the tangential deformation. We assume that gross sliding -takes place right when two particles are in contact. +The latter takes place when the tangential deformation exceeds the +Coulomb frictional limit. In the current implementation, however, we +do not take into account frictional history, i.e. we do not keep track +of how many time steps the two particles have been in contact nor +calculate the tangential deformation. Instead, we assume that gross +sliding takes place as soon as two particles are in contact. The following coefficients must be defined for each pair of atom types via the "pair_coeff"_pair_coeff.html command as in the examples above, @@ -83,6 +97,10 @@ or in the data file read by the "read_data"_read_data.html command: k_n (energy/distance^2 units) k_na (energy/distance^2 units) :ul +Effectively, k_n and k_na are the slopes of the red lines in the plot +above for force versus distance, for r < 0 and 0 < r < rc +respectively. TRUNG: is this sentence correct? + [Mixing, shift, table, tail correction, restart, rRESPA info]: This pair style does not support the "pair_modify"_pair_modify.html From fa73fab5df878b29a3e121cc1655e73e718e3c05 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Mon, 16 Jul 2018 18:12:15 -0600 Subject: [PATCH 054/123] patch 16Jul18 --- doc/src/Manual.txt | 4 ++-- src/version.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index e34ec8d5ba..e69797d9ec 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,7 +1,7 @@ LAMMPS Users Manual - + @@ -19,7 +19,7 @@ :line LAMMPS Documentation :c,h1 -29 Jun 2018 version :c,h2 +16 Jul 2018 version :c,h2 Version info: :h3 diff --git a/src/version.h b/src/version.h index 2833430def..90a21631d9 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "29 Jun 2018" +#define LAMMPS_VERSION "16 Jul 2018" From d23788831c8833ed78b1bb603ad417e021af98d2 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 17 Jul 2018 10:54:05 -0500 Subject: [PATCH 055/123] Updated to the doc pages of body rounded/polygon and rounded/polyhedra and the pair style: + added examples for special cases with disks and rods for 2d, and spheres and rods for 3d, + corrected the definition of the cutoff distance in pair style command --- doc/src/body.txt | 38 +++++++++++++++++++- doc/src/pair_body_rounded_polygon.txt | 45 +++++++++++++----------- doc/src/pair_body_rounded_polyhedron.txt | 18 ++++------ 3 files changed, 68 insertions(+), 33 deletions(-) diff --git a/doc/src/body.txt b/doc/src/body.txt index be5b3d4edf..85095f7fb6 100644 --- a/doc/src/body.txt +++ b/doc/src/body.txt @@ -238,7 +238,7 @@ For example, the following information would specify a square particle whose edge length is sqrt(2) and rounded diameter is 1.0. The orientation of the square is aligned with the xy coordinate axes which is consistent with the 6 moments of inertia: ixx iyy izz ixy ixz iyz = -1 1 4 0 0 0. +1 1 4 0 0 0. Note that only Izz matters in 2D simulations. 3 1 27 4 @@ -253,6 +253,24 @@ is consistent with the 6 moments of inertia: ixx iyy izz ixy ixz iyz = 3 0 1.0 :pre +A rod in 2D, whose length is 4.0, mass 1.0, rounded at two ends +by circles of diameter 0.5, is specified as follows: + +1 1 13 +2 +1 1 1.33333 0 0 0 +-2 0 0 +2 0 0 +0.5 :pre + +A disk, whose diameter is 3.0, mass 1.0, is specified as follows: + +1 1 10 +1 +1 1 4.5 0 0 0 +0 0 0 +3.0 :pre + The "pair_style body/rounded/polygon"_pair_body_rounded_polygon.html command can be used with this body style to compute body/body interactions. The "fix wall/body/polygon"_fix_wall_body_polygon.html @@ -377,6 +395,24 @@ iyz = 0.667 0.667 0.667 0 0 0. 3 0 4 7 0.5 :pre +A rod in 3D, whose length is 4.0, mass 1.0 and rounded at two ends +by circles of diameter 0.5, is specified as follows: + +1 1 13 +2 +0 1.33333 1.33333 0 0 0 +-2 0 0 +2 0 0 +0.5 :pre + +A sphere whose diameter is 3.0 and mass 1.0, is specified as follows: + +1 1 10 +1 +0.9 0.9 0.9 0 0 0 +0 0 0 +3.0 :pre + The "pair_style body/rounded/polhedron"_pair_body_rounded_polyhedron.html command can be used with this body style to compute body/body interactions. The diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index 588a7d6ff9..b4135a4065 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -29,9 +29,10 @@ pair_coeff 1 1 100.0 1.0 :pre Style {body/rounded/polygon} is for use with 2d models of body particles of style {rounded/polygon}. It calculates pairwise body/body interactions as well as interactions between body and point -particles. See "Section 6.14"_Section_howto.html#howto_14 of the +particles (modeled as disks with a specified diameter). +See "Section 6.14"_Section_howto.html#howto_14 of the manual and the "body"_body.html doc page for more details on using -body particles. +body rounded/polygon particles. This pairwise interaction between rounded polygons is described in "Fraige"_#Fraige, where a polygon does not have sharp corners, but is @@ -50,14 +51,8 @@ between two particles are defined with respect to the separation of their respective rounded surfaces, not by the separation of the vertices and edges themselves. -This means that the specified cutoff in the pair_style command should -be large enough to encompass the center-to-center distance between two -particles (at any orientation) which would produce an overlap of the -two surfaces. For example, consider two square particles with edge -length = 1.0 and circle diameter 0.2. The maximum distance of one -polygon's surface from its center is not sqrt(2)/2, but -(sqrt(2)+0.1)/2. Thus the cutoff distance should be sqrt(2) + 0.1, -since the surfaces of two particles that far apart could be touching. +This means that the specified cutoff in the pair_style command is +the cutoff distance, r_c, for the surface separation, \delta_n (see figure below). The forces between vertex-vertex, vertex-edge, and edge-edge overlaps are given by: @@ -66,17 +61,6 @@ are given by: :c,image(JPG/pair_body_rounded.jpg) -In "Fraige"_#Fraige, the tangential friction force between two -particles that are in contact is modeled differently prior to gross -sliding (i.e. static friction) and during gross-sliding (kinetic -friction). The latter takes place when the tangential deformation -exceeds the Coulomb frictional limit. In the current implementation, -however, we do not take into account frictional history, i.e. we do -not keep track of how many time steps the two particles have been in -contact nor calculate the tangential deformation. Instead, we assume -that gross sliding takes place as soon as two particles are in -contact. - TRUNG: The diagram label "cohesive regions" confuses me. Are you saying there is some distance d for which the force is attractive, i.e. the particles are cohesive? I think when d > Ri + Rj, since Ri + @@ -89,6 +73,25 @@ is a single number, but depedning on the orientiation of the 2 particles they might have a suface/surface overlap at a much smaller value of Ri + Rj. So what is Rc then? +Note that F_n and F_t are functions of the surface separation +\delta_n = d - (R_i + R_j). +In this model, when (R_i + R_j) < d < (R_i + R_j) + r_c, that is, +0 < \delta_n < r_c, the cohesive region of the two surfaces overlap +and the two surfaces are attractive to each other. + + +In "Fraige"_#Fraige, the tangential friction force between two +particles that are in contact is modeled differently prior to gross +sliding (i.e. static friction) and during gross-sliding (kinetic +friction). The latter takes place when the tangential deformation +exceeds the Coulomb frictional limit. In the current implementation, +however, we do not take into account frictional history, i.e. we do +not keep track of how many time steps the two particles have been in +contact nor calculate the tangential deformation. Instead, we assume +that gross sliding takes place as soon as two particles are in +contact. + + The following coefficients must be defined for each pair of atom types via the "pair_coeff"_pair_coeff.html command as in the examples above, or in the data file read by the "read_data"_read_data.html command: diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/src/pair_body_rounded_polyhedron.txt index 621254bd72..3f0a2403d0 100644 --- a/doc/src/pair_body_rounded_polyhedron.txt +++ b/doc/src/pair_body_rounded_polyhedron.txt @@ -29,9 +29,10 @@ pair_coeff 1 1 100.0 1.0 :pre Style {body/rounded/polygon} is for use with 3d models of body particles of style {rounded/polyhedron}. It calculates pairwise body/body interactions as well as interactions between body and -point-particles. See "Section 6.14"_Section_howto.html#howto_14 of +point-particles (modeled as spheres with a specified diameter). +See "Section 6.14"_Section_howto.html#howto_14 of the manual and the "body"_body.html doc page for more details on using -body particles. +body rounded/polyhedron particles. TRUNG: I think we need a paragraph here about how body/sphere interactions are handled. Does this pair style only do body/body but @@ -47,7 +48,7 @@ this pair style file just a couple lines about which part of the interactions this pair style computes. Ditto in the pair body polygon file. -This pairwise interaction between rounded polyhedra is described in +This pairwise interaction between the rounded polyhedra is described in "Wang"_#Wang, where a polyhedron does not have sharp corners and edges, but is rounded at its vertices and edges by spheres centered on each vertex with a specified diameter. The edges if the polyhedron @@ -57,6 +58,7 @@ in the data file read by the "read data"_read_data.html command. This is a discrete element model (DEM) which allows for multiple contact points. + Note that when two particles interact, the effective surface of each polyhedron particle is displaced outward from each of its vertices, edges, and faces by half its sphere diameter. The interaction forces @@ -64,14 +66,8 @@ and energies between two particles are defined with respect to the separation of their respective rounded surfaces, not by the separation of the vertices, edges, and faces themselves. -This means that the specified cutoff in the pair_style command should -be large enough to encompass the center-to-center distance between two -particles (at any orientation) which would produce a surface-surface -overlap. For example, consider two cubic particles with edge length = -1.0 and sphere diameter 0.2. The maximum distance of one polygon's -surface from its center is not sqrt(3)/2, but (sqrt(3)+0.1)/2. Thus -the cutoff distance should be sqrt(3) + 0.1, since the surfaces of two -particles that far apart could be touching. +This means that the specified cutoff in the pair_style command is +the cutoff distance, r_c, for the surface separation, \delta_n (see figure below). The forces between vertex-vertex, vertex-edge, vertex-face, edge-edge, and edge-face overlaps are given by: From de69e2455102bbeffbadfa7a3a4192036aa72d6d Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Tue, 17 Jul 2018 11:05:32 -0500 Subject: [PATCH 056/123] Added replies to Steve's questions --- doc/src/pair_body_rounded_polygon.txt | 8 +++++--- doc/src/pair_body_rounded_polyhedron.txt | 10 +++++++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index b4135a4065..ea77fa9247 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -71,7 +71,8 @@ cohesive interactions? If so, this should be explained up above. But an additional confusion is that the specied cutoff (Rc in diagram?) is a single number, but depedning on the orientiation of the 2 particles they might have a suface/surface overlap at a much -smaller value of Ri + Rj. So what is Rc then? +smaller value of Ri + Rj. So what is Rc then? - I added +the following paragraph to address this. Note that F_n and F_t are functions of the surface separation \delta_n = d - (R_i + R_j). @@ -100,8 +101,9 @@ k_n (energy/distance^2 units) k_na (energy/distance^2 units) :ul Effectively, k_n and k_na are the slopes of the red lines in the plot -above for force versus distance, for r < 0 and 0 < r < rc -respectively. TRUNG: is this sentence correct? +above for force versus surface separation, for \delta_n < 0 and 0 < \delta_n < r_c +respectively. (TRUNG: is this sentence correct? - it should read delta_n, +instead of r) TRUNG: reminder to copy any change in this file to the pair polyhedron file as well (and vice versa) diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/src/pair_body_rounded_polyhedron.txt index 3f0a2403d0..cb4ec00917 100644 --- a/doc/src/pair_body_rounded_polyhedron.txt +++ b/doc/src/pair_body_rounded_polyhedron.txt @@ -46,7 +46,10 @@ this paragraph would make more sense in the body.txt file about how to create a model that includes non-body particles (spheres). And in this pair style file just a couple lines about which part of the interactions this pair style computes. Ditto in the pair body polygon -file. +file. - The pair style supports body/sphere and sphere/sphere +given that all the atoms should be of body rounded/polyhedron. +I updated the above paragraph and added examples in body.txt for +specifying the special objects (i.e. spheres and rods). This pairwise interaction between the rounded polyhedra is described in "Wang"_#Wang, where a polyhedron does not have sharp corners and @@ -94,8 +97,9 @@ k_n (energy/distance^2 units) k_na (energy/distance^2 units) :ul Effectively, k_n and k_na are the slopes of the red lines in the plot -above for force versus distance, for r < 0 and 0 < r < rc -respectively. TRUNG: is this sentence correct? +above for force versus surface separation, for \delta_n < 0 and 0 < \delta_n < r_c +respectively. (TRUNG: is this sentence correct? - it should read delta_n, +instead of r) [Mixing, shift, table, tail correction, restart, rRESPA info]: From 843b96e8dd579f7c02cac30948b258186664b0a0 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Wed, 18 Jul 2018 08:49:42 -0600 Subject: [PATCH 057/123] more changes to new polygon/hedron docs and command names --- doc/src/Section_commands.txt | 6 +- doc/src/body.txt | 10 ++-- ...{pair_body.txt => pair_body_nparticle.txt} | 10 ++-- doc/src/pair_body_rounded_polygon.txt | 59 ++++++++----------- doc/src/pair_body_rounded_polyhedron.txt | 50 +++++++--------- examples/body/in.body | 2 +- ...{pair_body.cpp => pair_body_nparticle.cpp} | 24 ++++---- .../{pair_body.h => pair_body_nparticle.h} | 12 ++-- 8 files changed, 81 insertions(+), 92 deletions(-) rename doc/src/{pair_body.txt => pair_body_nparticle.txt} (93%) rename src/BODY/{pair_body.cpp => pair_body_nparticle.cpp} (95%) rename src/BODY/{pair_body.h => pair_body_nparticle.h} (90%) diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index 3dabdbeaa1..3b73dee150 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -664,6 +664,8 @@ USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. "vector"_fix_vector.html, "viscosity"_fix_viscosity.html, "viscous"_fix_viscous.html, +"wall/body/polygon"_fix_wall_body_polygon.html, +"wall/body/polyhedron"_fix_wall_body_polyhedron.html, "wall/colloid"_fix_wall.html, "wall/gran"_fix_wall_gran.html, "wall/gran/region"_fix_wall_gran_region.html, @@ -914,7 +916,9 @@ KOKKOS, o = USER-OMP, t = OPT. "airebo (oi)"_pair_airebo.html, "airebo/morse (oi)"_pair_airebo.html, "beck (go)"_pair_beck.html, -"body"_pair_body.html, +"body/nparticle"_pair_body_nparticle.html, +"body/rounded/polygon"_pair_body_rounded/polygon.html, +"body/rounded/polyhedron"_pair_body_rounded/polyhedron.html, "bop"_pair_bop.html, "born (go)"_pair_born.html, "born/coul/dsf"_pair_born.html, diff --git a/doc/src/body.txt b/doc/src/body.txt index 85095f7fb6..cef40cc643 100644 --- a/doc/src/body.txt +++ b/doc/src/body.txt @@ -286,12 +286,10 @@ polyhedron with a variable number of N vertices, E edges and F faces. This style can only be used for 3d models; see the "boundary"_boundary.html command. See the "pair_style body/rounded/polygon" doc page for a diagram of a two 2d squares with -rounded circles at the vertices. A 3d cube with rounded spheres -at the 8 vertices and 12 rounded edges would be similar. - -TRUNG: What are the special cases allowed for 3d, if any? Similar to -the N=1 (sphere) and N=2 (rod) special cases for 2d, descibed in -previous section. +rounded circles at the vertices. A 3d cube with rounded spheres at +the 8 vertices and 12 rounded edges would be similar. Special cases +for N = 1 (sphere) and N = 2 (rod with rounded ends) can also be +specified. This body style is for 3d discrete element models, as described in "Wang"_#Wang. diff --git a/doc/src/pair_body.txt b/doc/src/pair_body_nparticle.txt similarity index 93% rename from doc/src/pair_body.txt rename to doc/src/pair_body_nparticle.txt index 7899da832b..8c5b6e155d 100644 --- a/doc/src/pair_body.txt +++ b/doc/src/pair_body_nparticle.txt @@ -10,21 +10,21 @@ pair_style body command :h3 [Syntax:] -pair_style body cutoff :pre +pair_style body/nparticle cutoff :pre cutoff = global cutoff for interactions (distance units) [Examples:] -pair_style body 3.0 +pair_style body/nparticle 3.0 pair_coeff * * 1.0 1.0 pair_coeff 1 1 1.0 1.5 2.5 :pre [Description:] -Style {body} is for use with body particles and calculates pairwise -body/body interactions as well as interactions between body and -point-particles. See "Section 6.14"_Section_howto.html#howto_14 +Style {body/nparticle} is for use with body particles and calculates +pairwise body/body interactions as well as interactions between body +and point-particles. See "Section 6.14"_Section_howto.html#howto_14 of the manual and the "body"_body.html doc page for more details on using body particles. diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index ea77fa9247..caaa0746a1 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -28,11 +28,11 @@ pair_coeff 1 1 100.0 1.0 :pre Style {body/rounded/polygon} is for use with 2d models of body particles of style {rounded/polygon}. It calculates pairwise -body/body interactions as well as interactions between body and point -particles (modeled as disks with a specified diameter). -See "Section 6.14"_Section_howto.html#howto_14 of the -manual and the "body"_body.html doc page for more details on using -body rounded/polygon particles. +body/body interactions which can include body particles modeled as +1-vertex circular disks with a specified diameter. See "Section +6.14"_Section_howto.html#howto_14 of the manual and the +"body"_body.html doc page for more details on using body +rounded/polygon particles. This pairwise interaction between rounded polygons is described in "Fraige"_#Fraige, where a polygon does not have sharp corners, but is @@ -51,8 +51,21 @@ between two particles are defined with respect to the separation of their respective rounded surfaces, not by the separation of the vertices and edges themselves. -This means that the specified cutoff in the pair_style command is -the cutoff distance, r_c, for the surface separation, \delta_n (see figure below). +This means that the specified cutoff in the pair_style command is the +cutoff distance, r_c, for the surface separation, \delta_n (see figure +below). This is the distance at which two particles no longer +interact. If r_c is specified as 0.0, then it is a contact-only +interaction. I.e. the two particles must overlap in order to exert a +repulsive force on each other. If r_c > 0.0, then the force between +two particles will be attractive for surface separations from 0 to +r_c, and repulsive once the particles overlap. + +Note that unlike for other pair styles, the specified cutoff is not +the distance between the centers of two particles at which they stop +interacting. This center-to-center distance depends on the shape and +size of the two particles and their relative orientation. LAMMPS +takes that into account when computing the surface separation distance +and applying the r_c cutoff. The forces between vertex-vertex, vertex-edge, and edge-edge overlaps are given by: @@ -61,25 +74,10 @@ are given by: :c,image(JPG/pair_body_rounded.jpg) -TRUNG: The diagram label "cohesive regions" confuses me. Are you -saying there is some distance d for which the force is attractive, -i.e. the particles are cohesive? I think when d > Ri + Rj, since Ri + -Rj is the surface/surface overlap discussed above? If so, then the -discussion above about the specified cutoff is wrong? I.e. you can -specify a large cutoff than the surface/surface overlap to get -cohesive interactions? If so, this should be explained up above. -But an additional confusion is that the specied cutoff (Rc in diagram?) -is a single number, but depedning on the orientiation of the 2 -particles they might have a suface/surface overlap at a much -smaller value of Ri + Rj. So what is Rc then? - I added -the following paragraph to address this. - -Note that F_n and F_t are functions of the surface separation -\delta_n = d - (R_i + R_j). -In this model, when (R_i + R_j) < d < (R_i + R_j) + r_c, that is, -0 < \delta_n < r_c, the cohesive region of the two surfaces overlap -and the two surfaces are attractive to each other. - +Note that F_n and F_t are functions of the surface separation \delta_n += d - (R_i + R_j). In this model, when (R_i + R_j) < d < (R_i + R_j) ++ r_c, that is, 0 < \delta_n < r_c, the cohesive region of the two +surfaces overlap and the two surfaces are attractive to each other. In "Fraige"_#Fraige, the tangential friction force between two particles that are in contact is modeled differently prior to gross @@ -92,7 +90,6 @@ contact nor calculate the tangential deformation. Instead, we assume that gross sliding takes place as soon as two particles are in contact. - The following coefficients must be defined for each pair of atom types via the "pair_coeff"_pair_coeff.html command as in the examples above, or in the data file read by the "read_data"_read_data.html command: @@ -101,12 +98,8 @@ k_n (energy/distance^2 units) k_na (energy/distance^2 units) :ul Effectively, k_n and k_na are the slopes of the red lines in the plot -above for force versus surface separation, for \delta_n < 0 and 0 < \delta_n < r_c -respectively. (TRUNG: is this sentence correct? - it should read delta_n, -instead of r) - -TRUNG: reminder to copy any change in this file -to the pair polyhedron file as well (and vice versa) +above for force versus surface separation, for \delta_n < 0 and 0 < +\delta_n < r_c respectively. [Mixing, shift, table, tail correction, restart, rRESPA info]: diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/src/pair_body_rounded_polyhedron.txt index cb4ec00917..4a58e0119b 100644 --- a/doc/src/pair_body_rounded_polyhedron.txt +++ b/doc/src/pair_body_rounded_polyhedron.txt @@ -28,28 +28,11 @@ pair_coeff 1 1 100.0 1.0 :pre Style {body/rounded/polygon} is for use with 3d models of body particles of style {rounded/polyhedron}. It calculates pairwise -body/body interactions as well as interactions between body and -point-particles (modeled as spheres with a specified diameter). -See "Section 6.14"_Section_howto.html#howto_14 of -the manual and the "body"_body.html doc page for more details on using -body rounded/polyhedron particles. - -TRUNG: I think we need a paragraph here about how body/sphere -interactions are handled. Does this pair style only do body/body but -allow for a body = sphere or rod or some other degenerate case? Or -does this pair style allow you to model a simulation of mixed body and -point particles, where point particles are spheroids. If so, does -this pair style do body/body and body/point, and you use one of the -other granular pair styles to do point/point? I.e. a pair hybrid -model? Or does everything have to be defined as bodies. Actually -this paragraph would make more sense in the body.txt file about how to -create a model that includes non-body particles (spheres). And in -this pair style file just a couple lines about which part of the -interactions this pair style computes. Ditto in the pair body polygon -file. - The pair style supports body/sphere and sphere/sphere -given that all the atoms should be of body rounded/polyhedron. -I updated the above paragraph and added examples in body.txt for -specifying the special objects (i.e. spheres and rods). +body/body interactions which can include body particles modeled as +1-vertex spheres with a specified diameter. See "Section +6.14"_Section_howto.html#howto_14 of the manual and the +"body"_body.html doc page for more details on using body +rounded/polyhedron particles. This pairwise interaction between the rounded polyhedra is described in "Wang"_#Wang, where a polyhedron does not have sharp corners and @@ -61,7 +44,6 @@ in the data file read by the "read data"_read_data.html command. This is a discrete element model (DEM) which allows for multiple contact points. - Note that when two particles interact, the effective surface of each polyhedron particle is displaced outward from each of its vertices, edges, and faces by half its sphere diameter. The interaction forces @@ -69,8 +51,21 @@ and energies between two particles are defined with respect to the separation of their respective rounded surfaces, not by the separation of the vertices, edges, and faces themselves. -This means that the specified cutoff in the pair_style command is -the cutoff distance, r_c, for the surface separation, \delta_n (see figure below). +This means that the specified cutoff in the pair_style command is the +cutoff distance, r_c, for the surface separation, \delta_n (see figure +below). This is the distance at which two particles no longer +interact. If r_c is specified as 0.0, then it is a contact-only +interaction. I.e. the two particles must overlap in order to exert a +repulsive force on each other. If r_c > 0.0, then the force between +two particles will be attractive for surface separations from 0 to +r_c, and repulsive once the particles overlap. + +Note that unlike for other pair styles, the specified cutoff is not +the distance between the centers of two particles at which they stop +interacting. This center-to-center distance depends on the shape and +size of the two particles and their relative orientation. LAMMPS +takes that into account when computing the surface separation distance +and applying the r_c cutoff. The forces between vertex-vertex, vertex-edge, vertex-face, edge-edge, and edge-face overlaps are given by: @@ -97,9 +92,8 @@ k_n (energy/distance^2 units) k_na (energy/distance^2 units) :ul Effectively, k_n and k_na are the slopes of the red lines in the plot -above for force versus surface separation, for \delta_n < 0 and 0 < \delta_n < r_c -respectively. (TRUNG: is this sentence correct? - it should read delta_n, -instead of r) +above for force versus surface separation, for \delta_n < 0 and 0 < +\delta_n < r_c respectively. [Mixing, shift, table, tail correction, restart, rRESPA info]: diff --git a/examples/body/in.body b/examples/body/in.body index 5879ed5e45..815b853154 100644 --- a/examples/body/in.body +++ b/examples/body/in.body @@ -8,7 +8,7 @@ read_data data.body velocity all create 1.44 87287 loop geom -pair_style body 5.0 +pair_style body/nparticle 5.0 pair_coeff * * 1.0 1.0 neighbor 0.5 bin diff --git a/src/BODY/pair_body.cpp b/src/BODY/pair_body_nparticle.cpp similarity index 95% rename from src/BODY/pair_body.cpp rename to src/BODY/pair_body_nparticle.cpp index 8c12c0cf36..80b45beb4e 100644 --- a/src/BODY/pair_body.cpp +++ b/src/BODY/pair_body_nparticle.cpp @@ -15,7 +15,7 @@ #include #include #include -#include "pair_body.h" +#include "pair_body_nparticle.h" #include "math_extra.h" #include "atom.h" #include "atom_vec_body.h" @@ -32,7 +32,7 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -PairBody::PairBody(LAMMPS *lmp) : Pair(lmp) +PairBodyNparticle::PairBodyNparticle(LAMMPS *lmp) : Pair(lmp) { dmax = nmax = 0; discrete = NULL; @@ -44,7 +44,7 @@ PairBody::PairBody(LAMMPS *lmp) : Pair(lmp) /* ---------------------------------------------------------------------- */ -PairBody::~PairBody() +PairBodyNparticle::~PairBodyNparticle() { memory->destroy(discrete); memory->destroy(dnum); @@ -66,7 +66,7 @@ PairBody::~PairBody() /* ---------------------------------------------------------------------- */ -void PairBody::compute(int eflag, int vflag) +void PairBodyNparticle::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; int ni,nj,npi,npj,ifirst,jfirst; @@ -336,7 +336,7 @@ void PairBody::compute(int eflag, int vflag) allocate all arrays ------------------------------------------------------------------------- */ -void PairBody::allocate() +void PairBodyNparticle::allocate() { allocated = 1; int n = atom->ntypes; @@ -361,7 +361,7 @@ void PairBody::allocate() global settings ------------------------------------------------------------------------- */ -void PairBody::settings(int narg, char **arg) +void PairBodyNparticle::settings(int narg, char **arg) { if (narg != 1) error->all(FLERR,"Illegal pair_style command"); @@ -381,7 +381,7 @@ void PairBody::settings(int narg, char **arg) set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairBody::coeff(int narg, char **arg) +void PairBodyNparticle::coeff(int narg, char **arg) { if (narg < 4 || narg > 5) error->all(FLERR,"Incorrect args for pair coefficients"); @@ -415,12 +415,12 @@ void PairBody::coeff(int narg, char **arg) init specific to this pair style ------------------------------------------------------------------------- */ -void PairBody::init_style() +void PairBodyNparticle::init_style() { avec = (AtomVecBody *) atom->style_match("body"); - if (!avec) error->all(FLERR,"Pair body requires atom style body"); + if (!avec) error->all(FLERR,"Pair body/nparticle requires atom style body"); if (strcmp(avec->bptr->style,"nparticle") != 0) - error->all(FLERR,"Pair body requires body style nparticle"); + error->all(FLERR,"Pair body/nparticle requires body style nparticle"); bptr = (BodyNparticle *) avec->bptr; neighbor->request(this,instance_me); @@ -430,7 +430,7 @@ void PairBody::init_style() init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairBody::init_one(int i, int j) +double PairBodyNparticle::init_one(int i, int j) { if (setflag[i][j] == 0) { epsilon[i][j] = mix_energy(epsilon[i][i],epsilon[j][j], @@ -459,7 +459,7 @@ double PairBody::init_one(int i, int j) store sub-particle space-frame displacements from COM in discrete list ------------------------------------------------------------------------- */ -void PairBody::body2space(int i) +void PairBodyNparticle::body2space(int i) { int ibonus = atom->body[i]; AtomVecBody::Bonus *bonus = &avec->bonus[ibonus]; diff --git a/src/BODY/pair_body.h b/src/BODY/pair_body_nparticle.h similarity index 90% rename from src/BODY/pair_body.h rename to src/BODY/pair_body_nparticle.h index 94fbdf34df..9c7d832b64 100644 --- a/src/BODY/pair_body.h +++ b/src/BODY/pair_body_nparticle.h @@ -13,21 +13,21 @@ #ifdef PAIR_CLASS -PairStyle(body,PairBody) +PairStyle(body/nparticle,PairBodyNparticle) #else -#ifndef LMP_PAIR_BODY_H -#define LMP_PAIR_BODY_H +#ifndef LMP_PAIR_BODY_NPARTICLE_H +#define LMP_PAIR_BODY_NPARTICLE_H #include "pair.h" namespace LAMMPS_NS { -class PairBody : public Pair { +class PairBodyNparticle : public Pair { public: - PairBody(class LAMMPS *); - ~PairBody(); + PairBodyNparticle(class LAMMPS *); + ~PairBodyNparticle(); void compute(int, int); void settings(int, char **); void coeff(int, char **); From f9c7fa973b29f17bacc2d5dfd7686f08fd529f8d Mon Sep 17 00:00:00 2001 From: Tim Mattox Date: Wed, 18 Jul 2018 10:41:57 -0500 Subject: [PATCH 058/123] USER-DPD: propagate a minor performance bugfix throughout the DPDE code The fix_shardlow_kokkos.cpp code had already factored out a redundant sqrt() calculation in the innermost loop of ssa_update_dpde(). This changeset propagates an equivilent optimization to: fix_shardlow.cpp pair_dpd_fdt_energy.cpp pair_dpd_fdt_energy_kokkos.cpp The alpha_ij variable was really just an [itype][jtype] lookup parameter, replacing a sqrt() and two multiplies per interacting particle pair by a cached memory read. Even if there isn't much time savings, the code is now consistent across the various versions. --- src/KOKKOS/fix_shardlow_kokkos.cpp | 3 +-- src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp | 3 ++- src/KOKKOS/pair_dpd_fdt_energy_kokkos.h | 6 +++--- src/USER-DPD/fix_shardlow.cpp | 6 +++--- src/USER-DPD/pair_dpd_fdt_energy.cpp | 10 ++++++++-- src/USER-DPD/pair_dpd_fdt_energy.h | 2 +- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/KOKKOS/fix_shardlow_kokkos.cpp b/src/KOKKOS/fix_shardlow_kokkos.cpp index 70055bf8c9..99e51ebe38 100644 --- a/src/KOKKOS/fix_shardlow_kokkos.cpp +++ b/src/KOKKOS/fix_shardlow_kokkos.cpp @@ -157,7 +157,6 @@ void FixShardlowKokkos::init() k_pairDPDE->k_cutsq.template sync(); d_cutsq = k_pairDPDE->k_cutsq.template view(); - const double boltz2 = 2.0*force->boltz; for (int i = 1; i <= ntypes; i++) { for (int j = i; j <= ntypes; j++) { F_FLOAT cutone = k_pairDPDE->cut[i][j]; @@ -165,7 +164,7 @@ void FixShardlowKokkos::init() else k_params.h_view(i,j).cutinv = FLT_MAX; k_params.h_view(i,j).halfsigma = 0.5*k_pairDPDE->sigma[i][j]; k_params.h_view(i,j).kappa = k_pairDPDE->kappa[i][j]; - k_params.h_view(i,j).alpha = sqrt(boltz2*k_pairDPDE->kappa[i][j]); + k_params.h_view(i,j).alpha = k_pairDPDE->alpha[i][j]; k_params.h_view(j,i) = k_params.h_view(i,j); diff --git a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp index 7ff536f8dd..038d95394a 100644 --- a/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp +++ b/src/KOKKOS/pair_dpd_fdt_energy_kokkos.cpp @@ -591,7 +591,7 @@ void PairDPDfdtEnergyKokkos::operator()(TagPairDPDfdtEnergyComputeNo // Compute uCond randnum = rand_gen.normal(); kappa_ij = STACKPARAMS?m_params[itype][jtype].kappa:params(itype,jtype).kappa; - alpha_ij = sqrt(2.0*boltz*kappa_ij); + alpha_ij = STACKPARAMS?m_params[itype][jtype].alpha:params(itype,jtype).alpha; randPair = alpha_ij*wr*randnum*dtinvsqrt; uTmp = kappa_ij*(1.0/dpdTheta[i] - 1.0/dpdTheta[j])*wd; @@ -676,6 +676,7 @@ double PairDPDfdtEnergyKokkos::init_one(int i, int j) k_params.h_view(i,j).a0 = a0[i][j]; k_params.h_view(i,j).sigma = sigma[i][j]; k_params.h_view(i,j).kappa = kappa[i][j]; + k_params.h_view(i,j).alpha = alpha[i][j]; k_params.h_view(j,i) = k_params.h_view(i,j); if(iuMech; double *dpdTheta = atom->dpdTheta; - double *cut_i, *cut2_i, *sigma_i, *kappa_i; + double *cut_i, *cut2_i, *sigma_i, *kappa_i, *alpha_i; double theta_ij_inv, theta_i_inv; - const double boltz2 = 2.0*force->boltz; const double boltz_inv = 1.0/force->boltz; const double ftm2v = force->ftm2v; @@ -389,6 +388,7 @@ while (ct-- > 0) { cut_i = pairDPDE->cut[itype]; sigma_i = pairDPDE->sigma[itype]; kappa_i = pairDPDE->kappa[itype]; + alpha_i = pairDPDE->alpha[itype]; theta_i_inv = 1.0/dpdTheta[i]; const double mass_i = (rmass) ? rmass[i] : mass[itype]; const double massinv_i = 1.0 / mass_i; @@ -448,7 +448,7 @@ while (ct-- > 0) { // Compute uCond double kappa_ij = kappa_i[jtype]; - double alpha_ij = sqrt(boltz2*kappa_ij); + double alpha_ij = alpha_i[jtype]; double del_uCond = alpha_ij*wr*dtsqrt * es_normal(RNGstate); del_uCond += kappa_ij*(theta_i_inv - theta_j_inv)*wdt; diff --git a/src/USER-DPD/pair_dpd_fdt_energy.cpp b/src/USER-DPD/pair_dpd_fdt_energy.cpp index d1f3cceed4..05dc52eac7 100644 --- a/src/USER-DPD/pair_dpd_fdt_energy.cpp +++ b/src/USER-DPD/pair_dpd_fdt_energy.cpp @@ -65,6 +65,7 @@ PairDPDfdtEnergy::~PairDPDfdtEnergy() memory->destroy(a0); memory->destroy(sigma); memory->destroy(kappa); + memory->destroy(alpha); memory->destroy(duCond); memory->destroy(duMech); } @@ -269,7 +270,7 @@ void PairDPDfdtEnergy::compute(int eflag, int vflag) // Compute uCond randnum = random->gaussian(); kappa_ij = kappa[itype][jtype]; - alpha_ij = sqrt(2.0*force->boltz*kappa_ij); + alpha_ij = alpha[itype][jtype]; randPair = alpha_ij*wr*randnum*dtinvsqrt; uTmp = kappa_ij*(1.0/dpdTheta[i] - 1.0/dpdTheta[j])*wd; @@ -322,6 +323,7 @@ void PairDPDfdtEnergy::allocate() memory->create(a0,n+1,n+1,"pair:a0"); memory->create(sigma,n+1,n+1,"pair:sigma"); memory->create(kappa,n+1,n+1,"pair:kappa"); + memory->create(alpha,n+1,n+1,"pair:alpha"); if (!splitFDT_flag) { memory->create(duCond,nlocal+nghost+1,"pair:duCond"); memory->create(duMech,nlocal+nghost+1,"pair:duMech"); @@ -374,11 +376,12 @@ void PairDPDfdtEnergy::coeff(int narg, char **arg) double a0_one = force->numeric(FLERR,arg[2]); double sigma_one = force->numeric(FLERR,arg[3]); double cut_one = cut_global; - double kappa_one; + double kappa_one, alpha_one; a0_is_zero = (a0_one == 0.0); // Typical use with SSA is to set a0 to zero kappa_one = force->numeric(FLERR,arg[4]); + alpha_one = sqrt(2.0*force->boltz*kappa_one); if (narg == 6) cut_one = force->numeric(FLERR,arg[5]); int count = 0; @@ -387,6 +390,7 @@ void PairDPDfdtEnergy::coeff(int narg, char **arg) a0[i][j] = a0_one; sigma[i][j] = sigma_one; kappa[i][j] = kappa_one; + alpha[i][j] = alpha_one; cut[i][j] = cut_one; setflag[i][j] = 1; count++; @@ -435,6 +439,7 @@ double PairDPDfdtEnergy::init_one(int i, int j) a0[j][i] = a0[i][j]; sigma[j][i] = sigma[i][j]; kappa[j][i] = kappa[i][j]; + alpha[j][i] = alpha[i][j]; return cut[i][j]; } @@ -488,6 +493,7 @@ void PairDPDfdtEnergy::read_restart(FILE *fp) MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world); MPI_Bcast(&kappa[i][j],1,MPI_DOUBLE,0,world); MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world); + alpha[i][j] = sqrt(2.0*force->boltz*kappa[i][j]); a0_is_zero = a0_is_zero && (a0[i][j] == 0.0); // verify the zero assumption } } diff --git a/src/USER-DPD/pair_dpd_fdt_energy.h b/src/USER-DPD/pair_dpd_fdt_energy.h index dce39f83f0..e21b48f7bd 100644 --- a/src/USER-DPD/pair_dpd_fdt_energy.h +++ b/src/USER-DPD/pair_dpd_fdt_energy.h @@ -43,7 +43,7 @@ class PairDPDfdtEnergy : public Pair { double **cut; double **a0; - double **sigma,**kappa; + double **sigma,**kappa,**alpha; double *duCond,*duMech; int seed; From dfd40c1b70c04ac3d3a8c24c4a2e0e399aa5168b Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Wed, 18 Jul 2018 10:48:29 -0600 Subject: [PATCH 059/123] more doc tweaks --- doc/src/body.txt | 8 ++--- doc/src/lammps.book | 6 ++-- doc/src/pair_body_rounded_polygon.txt | 10 +++--- doc/src/pair_body_rounded_polyhedron.txt | 39 ++++++++++++------------ 4 files changed, 33 insertions(+), 30 deletions(-) diff --git a/doc/src/body.txt b/doc/src/body.txt index cef40cc643..e7baf626f5 100644 --- a/doc/src/body.txt +++ b/doc/src/body.txt @@ -186,7 +186,7 @@ squares with rounded circles at the vertices. Special cases for N = 1 (circle) and N = 2 (rod with rounded ends) can also be specified. One use of this body style is for 2d discrete element models, as -described in "Fraige"_#Fraige. +described in "Fraige"_#body-Fraige. Similar to body style {nparticle}, the atom_style body command for this body style takes two additional arguments: @@ -292,7 +292,7 @@ for N = 1 (sphere) and N = 2 (rod with rounded ends) can also be specified. This body style is for 3d discrete element models, as described in -"Wang"_#Wang. +"Wang"_#body-Wang. Similar to body style {rounded/polygon}, the atom_style body command for this body style takes two additional arguments: @@ -447,10 +447,10 @@ determined by the {bflag1} parameter for the {body} keyword. The :line -:link(Fraige) +:link(body-Fraige) [(Fraige)] F. Y. Fraige, P. A. Langston, A. J. Matchett, J. Dodds, Particuology, 6, 455 (2008). -:link(Wang) +:link(body-Wang) [(Wang)] J. Wang, H. S. Yu, P. A. Langston, F. Y. Fraige, Granular Matter, 13, 1 (2011). diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 0764c593f7..9c0216412b 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -280,7 +280,8 @@ fix_vector.html fix_viscosity.html fix_viscous.html fix_wall.html -fix_wall_ees.html +fix_wall_body_polygon.html +fix_wall_body_polyhedron.html fix_wall_gran.html fix_wall_gran_region.html fix_wall_piston.html @@ -419,8 +420,9 @@ pair_agni.html pair_airebo.html pair_awpmd.html pair_beck.html -pair_body.html +pair_body_nparticle.html pair_body_rounded_polygon.html +pair_body_rounded_polyhedron.html pair_bop.html pair_born.html pair_brownian.html diff --git a/doc/src/pair_body_rounded_polygon.txt b/doc/src/pair_body_rounded_polygon.txt index caaa0746a1..9daeb08e9a 100644 --- a/doc/src/pair_body_rounded_polygon.txt +++ b/doc/src/pair_body_rounded_polygon.txt @@ -35,9 +35,9 @@ body/body interactions which can include body particles modeled as rounded/polygon particles. This pairwise interaction between rounded polygons is described in -"Fraige"_#Fraige, where a polygon does not have sharp corners, but is -rounded at its vertices by circles centered on each vertex with a -specified diameter. The edges of the polygon are defined between +"Fraige"_#pair-Fraige, where a polygon does not have sharp corners, +but is rounded at its vertices by circles centered on each vertex with +a specified diameter. The edges of the polygon are defined between pairs of adjacent vertices. The circle diameter for each polygon is specified in the data file read by the "read data"_read_data.html command. This is a 2d discrete element model (DEM) which allows for @@ -79,7 +79,7 @@ Note that F_n and F_t are functions of the surface separation \delta_n + r_c, that is, 0 < \delta_n < r_c, the cohesive region of the two surfaces overlap and the two surfaces are attractive to each other. -In "Fraige"_#Fraige, the tangential friction force between two +In "Fraige"_#pair-Fraige, the tangential friction force between two particles that are in contact is modeled differently prior to gross sliding (i.e. static friction) and during gross-sliding (kinetic friction). The latter takes place when the tangential deformation @@ -129,6 +129,6 @@ for pair interactions. [Default:] none -:link(Fraige) +:link(pair-Fraige) [(Fraige)] F. Y. Fraige, P. A. Langston, A. J. Matchett, J. Dodds, Particuology, 6, 455 (2008). diff --git a/doc/src/pair_body_rounded_polyhedron.txt b/doc/src/pair_body_rounded_polyhedron.txt index 4a58e0119b..dc559feaaf 100644 --- a/doc/src/pair_body_rounded_polyhedron.txt +++ b/doc/src/pair_body_rounded_polyhedron.txt @@ -34,15 +34,15 @@ body/body interactions which can include body particles modeled as "body"_body.html doc page for more details on using body rounded/polyhedron particles. -This pairwise interaction between the rounded polyhedra is described in -"Wang"_#Wang, where a polyhedron does not have sharp corners and -edges, but is rounded at its vertices and edges by spheres centered on -each vertex with a specified diameter. The edges if the polyhedron -are defined between pairs of adjacent vertices. Its faces are defined -by a loop of edges. The sphere diameter for each polygon is specified -in the data file read by the "read data"_read_data.html command. This -is a discrete element model (DEM) which allows for multiple contact -points. +This pairwise interaction between the rounded polyhedra is described +in "Wang"_#pair-Wang, where a polyhedron does not have sharp corners +and edges, but is rounded at its vertices and edges by spheres +centered on each vertex with a specified diameter. The edges if the +polyhedron are defined between pairs of adjacent vertices. Its faces +are defined by a loop of edges. The sphere diameter for each polygon +is specified in the data file read by the "read data"_read_data.html +command. This is a discrete element model (DEM) which allows for +multiple contact points. Note that when two particles interact, the effective surface of each polyhedron particle is displaced outward from each of its vertices, @@ -74,15 +74,16 @@ and edge-face overlaps are given by: :c,image(JPG/pair_body_rounded.jpg) -In "Wang"_#Wang, the tangential friction force between two particles -that are in contact is modeled differently prior to gross sliding -(i.e. static friction) and during gross-sliding (kinetic friction). -The latter takes place when the tangential deformation exceeds the -Coulomb frictional limit. In the current implementation, however, we -do not take into account frictional history, i.e. we do not keep track -of how many time steps the two particles have been in contact nor -calculate the tangential deformation. Instead, we assume that gross -sliding takes place as soon as two particles are in contact. +In "Wang"_#pair-Wang, the tangential friction force between two +particles that are in contact is modeled differently prior to gross +sliding (i.e. static friction) and during gross-sliding (kinetic +friction). The latter takes place when the tangential deformation +exceeds the Coulomb frictional limit. In the current implementation, +however, we do not take into account frictional history, i.e. we do +not keep track of how many time steps the two particles have been in +contact nor calculate the tangential deformation. Instead, we assume +that gross sliding takes place as soon as two particles are in +contact. The following coefficients must be defined for each pair of atom types via the "pair_coeff"_pair_coeff.html command as in the examples above, @@ -123,7 +124,7 @@ for pair interactions. [Default:] none -:link(Wang) +:link(pair-Wang) [(Wang)] J. Wang, H. S. Yu, P. A. Langston, F. Y. Fraige, Granular Matter, 13, 1 (2011). From 7d4de932b6945045779ae4e2a867b4e99f898d19 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 18 Jul 2018 13:13:57 -0400 Subject: [PATCH 060/123] reinstate reference to fix wall/ees in lammps.book --- doc/src/lammps.book | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 9c0216412b..56284812f8 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -282,6 +282,7 @@ fix_viscous.html fix_wall.html fix_wall_body_polygon.html fix_wall_body_polyhedron.html +fix_wall_ees.html fix_wall_gran.html fix_wall_gran_region.html fix_wall_piston.html From 2eb8d779e8bc657a8767c4cad7ab72f20f65955f Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 18 Jul 2018 18:45:40 -0400 Subject: [PATCH 061/123] Fixes a memory leak when using OpenCL The GPU package uses OpenCL events for measuring time. These have to be released to free up memory. I removed the clReleaseEvent() calls in the clear() method because in some cases they don't exist yet and I couldn't find a way to check for a valid event (clRetainEvent didn't work). This at least fixes the massive leak during simulations. See issue #1006 --- lib/gpu/geryon/ocl_timer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/gpu/geryon/ocl_timer.h b/lib/gpu/geryon/ocl_timer.h index 66b79dcab1..1f56aeb364 100644 --- a/lib/gpu/geryon/ocl_timer.h +++ b/lib/gpu/geryon/ocl_timer.h @@ -49,8 +49,6 @@ class UCL_Timer { inline void clear() { if (_initialized) { CL_DESTRUCT_CALL(clReleaseCommandQueue(_cq)); - clReleaseEvent(start_event); - clReleaseEvent(stop_event); _initialized=false; _total_time=0.0; } @@ -107,6 +105,8 @@ class UCL_Timer { CL_SAFE_CALL(clGetEventProfilingInfo(start_event, CL_PROFILING_COMMAND_END, sizeof(cl_ulong), &tstart, NULL)); + clReleaseEvent(start_event); + clReleaseEvent(stop_event); return (tend-tstart)*t_factor; } From de8176b4fc0556d758d7c49bea43f92c5006f234 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 20 Jul 2018 14:41:54 -0400 Subject: [PATCH 062/123] various minor OpenCL related fixes and improvements to the GPU package - document previously undocumented OpenCL tune settings - implement OpenCL platform selection through prefixing the device type with the platform id separated by a colon - allow passing custom tune parameters though postfixing the device type with the 13 tuneable parameters separated by commas - remove an extra clear() that would delete device properties structs an cause LAMMPS to output garbage strings --- doc/src/package.txt | 49 +++++++++++++++++++++++++++++++------ lib/gpu/geryon/ocl_device.h | 16 ++++++------ lib/gpu/lal_device.cpp | 26 ++++++++++++++++---- lib/gpu/lal_device.h | 2 +- src/GPU/gpu_extra.h | 3 +++ 5 files changed, 74 insertions(+), 22 deletions(-) diff --git a/doc/src/package.txt b/doc/src/package.txt index 5c698934e8..5fd42f67d3 100644 --- a/doc/src/package.txt +++ b/doc/src/package.txt @@ -33,8 +33,10 @@ args = arguments specific to the style :l last = ID of last GPU to be used on each node {tpa} value = Nthreads Nthreads = # of GPU threads used per atom - {device} value = device_type - device_type = {kepler} or {fermi} or {cypress} or {generic} + {device} value = device_type or platform_id:device_type or platform_id:custom,val1,val2,val3,..,val13 + platform_id = numerical OpenCL platform id (default: -1) + device_type = {kepler} or {fermi} or {cypress} or {intel} or {phi} or {generic} or {custom} + val1,val2,... = custom OpenCL tune parameters (see below for details) {blocksize} value = size size = thread block size for pair force computation {intel} args = NPhi keyword value ... @@ -96,6 +98,9 @@ args = arguments specific to the style :l package gpu 1 package gpu 1 split 0.75 package gpu 2 split -1.0 +package gpu 1 device kepler +package gpu 1 device 2:generic +package gpu 1 device custom,32,4,8,256,11,128,256,128,32,64,8,128,128 package kokkos neigh half comm device package omp 0 neigh no package omp 4 @@ -244,12 +249,40 @@ the value can improve performance. The number of threads per atom must be a power of 2 and currently cannot be greater than 32. The {device} keyword can be used to tune parameters optimized for a -specific accelerator, when using OpenCL. For CUDA, the {device} -keyword is ignored. Currently, the device type is limited to NVIDIA -Kepler, NVIDIA Fermi, AMD Cypress, or a generic device. More devices -may be added later. The default device type can be specified when -building LAMMPS with the GPU library, via settings in the -lib/gpu/Makefile that is used. +specific accelerator and platform when using OpenCL. OpenCL supports +the concept of a [platform], which represents one or more devices that +share the same driver (e.g. there would be a different platform for +GPUs from different vendors or for CPU based accelerator support). +In LAMMPS only one platform can be active at a time and by default +the first platform with an accelerator is selected. This is equivalent +to using a platform ID of -1. The platform ID is a number corresponding +to the output of the ocl_get_devices tool. The platform ID is passed +to the GPU library, by prefixing the {device} keyword with that number +separated by a colon. For CUDA, the {device} keyword is ignored. +Currently, the device tuning support is limited to NVIDIA Kepler, NVIDIA +Fermi, AMD Cypress, Intel x86_64 CPU, Intel Xeon Phi, or a generic device. +More devices may be added later. The default device type can be +specified when building LAMMPS with the GPU library, via setting a +variable in the lib/gpu/Makefile that is used. + +In addition, a device type {custom} is available, which is followed by +13 comma separated numbers, which allows to set those tweakable parameters +from the package command. It can be combined with the (colon separated) +platform id. The individual settings are: + +MEM_THREADS +THREADS_PER_ATOM +THREADS_PER_CHARGE +BLOCK_PAIR +MAX_SHARED_TYPES +BLOCK_NBOR_BUILD +BLOCK_BIO_PAIR +BLOCK_ELLIPSE +WARP_SIZE +PPPM_BLOCK_1D +BLOCK_CELL_2D +BLOCK_CELL_ID +MAX_BIO_SHARED_TYPES :ul The {blocksize} keyword allows you to tweak the number of threads used per thread block. This number should be a multiple of 32 (for GPUs) diff --git a/lib/gpu/geryon/ocl_device.h b/lib/gpu/geryon/ocl_device.h index 2b2367545e..14455e38a5 100644 --- a/lib/gpu/geryon/ocl_device.h +++ b/lib/gpu/geryon/ocl_device.h @@ -165,8 +165,8 @@ class UCL_Device { /// Get the current OpenCL device name inline std::string name() { return name(_device); } /// Get the OpenCL device name - inline std::string name(const int i) - { return std::string(_properties[i].name); } + inline std::string name(const int i) { + return std::string(_properties[i].name); } /// Get a string telling the type of the current device inline std::string device_type_name() { return device_type_name(_device); } @@ -281,7 +281,7 @@ class UCL_Device { inline cl_device_id & cl_device() { return _cl_device; } /// Select the platform that has accelerators - inline void set_platform_accelerator(int pid=-1); + inline int set_platform_accelerator(int pid=-1); private: int _num_platforms; // Number of platforms @@ -324,6 +324,7 @@ UCL_Device::~UCL_Device() { void UCL_Device::clear() { _properties.clear(); + _cl_devices.clear(); if (_device>-1) { for (size_t i=0; i<_cq.size(); i++) { CL_DESTRUCT_CALL(clReleaseCommandQueue(_cq.back())); @@ -520,8 +521,6 @@ int UCL_Device::device_type(const int i) { // Set the CUDA device to the specified device number int UCL_Device::set(int num) { - clear(); - cl_device_id *device_list = new cl_device_id[_num_devices]; cl_uint n; CL_SAFE_CALL(clGetDeviceIDs(_cl_platform,CL_DEVICE_TYPE_ALL,_num_devices, @@ -612,7 +611,7 @@ void UCL_Device::print_all(std::ostream &out) { // Select the platform that is associated with accelerators // if pid < 0, select the first platform -void UCL_Device::set_platform_accelerator(int pid) { +int UCL_Device::set_platform_accelerator(int pid) { if (pid < 0) { int found = 0; for (int n=0; n<_num_platforms; n++) { @@ -625,10 +624,11 @@ void UCL_Device::set_platform_accelerator(int pid) { break; } } - if (found) break; + if (found) return UCL_SUCCESS; } + return UCL_ERROR; } else { - set_platform(pid); + return set_platform(pid); } } diff --git a/lib/gpu/lal_device.cpp b/lib/gpu/lal_device.cpp index 0ea128a5b3..7f54432a74 100644 --- a/lib/gpu/lal_device.cpp +++ b/lib/gpu/lal_device.cpp @@ -34,8 +34,8 @@ using namespace LAMMPS_AL; template DeviceT::Device() : _init_count(0), _device_init(false), - _gpu_mode(GPU_FORCE), _first_device(0), - _last_device(0), _compiled(false) { + _gpu_mode(GPU_FORCE), _first_device(0), + _last_device(0), _platform_id(-1), _compiled(false) { } template @@ -67,6 +67,17 @@ int DeviceT::init_device(MPI_Comm world, MPI_Comm replica, const int first_gpu, _particle_split=p_split; _cell_size=cell_size; _block_pair=block_pair; + // support selecting platform though "package device" keyword. + // "0:generic" will select platform 0 and tune for generic device + // "1:fermi" will select platform 1 and tune for Nvidia Fermi gpu + if (ocl_vendor) { + char *sep = NULL; + if ((sep = strstr(ocl_vendor,":"))) { + *sep = '\0'; + _platform_id = atoi(ocl_vendor); + ocl_vendor = sep+1; + } + } // Get the rank/size within the world MPI_Comm_rank(_comm_world,&_world_me); @@ -135,6 +146,9 @@ int DeviceT::init_device(MPI_Comm world, MPI_Comm replica, const int first_gpu, return -7; #endif + if (gpu->set_platform_accelerator(_platform_id)!=UCL_SUCCESS) + return -12; + if (gpu->set(my_gpu)!=UCL_SUCCESS) return -6; @@ -191,13 +205,15 @@ int DeviceT::set_ocl_params(char *ocl_vendor) { _ocl_vendor_string="-DUSE_OPENCL"; int token_count=0; std::string params[13]; - char *pch = strtok(ocl_vendor,"\" "); + char *pch = strtok(ocl_vendor,","); + pch = strtok(NULL,","); + if (pch == NULL) return -11; while (pch != NULL) { if (token_count==13) return -11; params[token_count]=pch; token_count++; - pch = strtok(NULL,"\" "); + pch = strtok(NULL,","); } _ocl_vendor_string+=" -DMEM_THREADS="+params[0]+ " -DTHREADS_PER_ATOM="+params[1]+ @@ -656,7 +672,7 @@ int DeviceT::compile_kernels() { dev_program=new UCL_Program(*gpu); int success=dev_program->load_string(device,compile_string().c_str()); if (success!=UCL_SUCCESS) - return -4; + return -6; k_zero.set_function(*dev_program,"kernel_zero"); k_info.set_function(*dev_program,"kernel_info"); _compiled=true; diff --git a/lib/gpu/lal_device.h b/lib/gpu/lal_device.h index 95e9f2a430..695b0a62f9 100644 --- a/lib/gpu/lal_device.h +++ b/lib/gpu/lal_device.h @@ -292,7 +292,7 @@ class Device { MPI_Comm _comm_world, _comm_replica, _comm_gpu; int _procs_per_gpu, _gpu_rank, _world_me, _world_size, _replica_me, _replica_size; - int _gpu_mode, _first_device, _last_device, _nthreads; + int _gpu_mode, _first_device, _last_device, _platform_id, _nthreads; double _particle_split; double _cpu_full; double _ptx_arch; diff --git a/src/GPU/gpu_extra.h b/src/GPU/gpu_extra.h index 56a4f15f1b..111d13c563 100644 --- a/src/GPU/gpu_extra.h +++ b/src/GPU/gpu_extra.h @@ -58,6 +58,9 @@ namespace GPU_EXTRA { else if (all_success == -11) error->all(FLERR, "Invalid custom OpenCL parameter string."); + else if (all_success == -12) + error->all(FLERR, + "Invalid OpenCL platform ID."); else error->all(FLERR,"Unknown error in GPU library"); } From 223de57401ff2547715e24b44226eba5599946ed Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 21 Jul 2018 00:14:31 -0500 Subject: [PATCH 063/123] Added set_platform_accelerator() for nvd_device.h for OpenCL compatibility --- lib/gpu/geryon/nvd_device.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/gpu/geryon/nvd_device.h b/lib/gpu/geryon/nvd_device.h index 2d2a751f85..129bdbbdef 100644 --- a/lib/gpu/geryon/nvd_device.h +++ b/lib/gpu/geryon/nvd_device.h @@ -260,6 +260,9 @@ class UCL_Device { /// List all devices along with all properties inline void print_all(std::ostream &out); + /// Select the platform that has accelerators (for compatibility with OpenCL) + inline int set_platform_accelerator(int pid=-1) { return UCL_SUCCESS; } + private: int _device, _num_devices; std::vector _properties; From 01c27194d4de20ab3002091fe20d396495019e66 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 21 Jul 2018 00:18:30 -0500 Subject: [PATCH 064/123] Fixes for lal_neighbor.cpp for get_host() and for time_kernel --- lib/gpu/lal_neighbor.cpp | 4 ++-- lib/gpu/lal_neighbor.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/gpu/lal_neighbor.cpp b/lib/gpu/lal_neighbor.cpp index 04e08c3e9c..d264a933a1 100644 --- a/lib/gpu/lal_neighbor.cpp +++ b/lib/gpu/lal_neighbor.cpp @@ -281,7 +281,7 @@ void Neighbor::get_host(const int inum, int *ilist, int *numj, } UCL_D_Vec acc_view; acc_view.view_offset(inum,dev_nbor,inum*2); - ucl_copy(acc_view,host_acc,true); + ucl_copy(acc_view,host_acc,inum*2,true); UCL_H_Vec host_view; host_view.alloc(_max_atoms,*dev,UCL_READ_WRITE); @@ -364,7 +364,7 @@ void Neighbor::get_host3(const int inum, const int nlist, int *ilist, int *numj, } UCL_D_Vec acc_view; acc_view.view_offset(inum,dev_nbor,inum*2); - ucl_copy(acc_view,host_acc,true); + ucl_copy(acc_view,host_acc,inum*2,true); time_nbor.stop(); if (_use_packing==false) { diff --git a/lib/gpu/lal_neighbor.h b/lib/gpu/lal_neighbor.h index 05168834c6..01f7b02798 100644 --- a/lib/gpu/lal_neighbor.h +++ b/lib/gpu/lal_neighbor.h @@ -110,7 +110,7 @@ class Neighbor { } if (_time_device) { time_nbor.add_to_total(); - time_kernel.add_to_total(); + if (_use_packing==false) time_kernel.add_to_total(); if (_gpu_nbor==2) { time_hybrid1.add_to_total(); time_hybrid2.add_to_total(); From 94da4be922532f15aa159b3fa60e95e81ac89874 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sat, 21 Jul 2018 13:50:10 -0500 Subject: [PATCH 065/123] Fixed bugs for tersoff gpu styles for OpenCL builds --- lib/gpu/lal_tersoff.cpp | 2 +- lib/gpu/lal_tersoff_mod.cpp | 2 +- lib/gpu/lal_tersoff_zbl.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/gpu/lal_tersoff.cpp b/lib/gpu/lal_tersoff.cpp index a63d286d9c..af1e286520 100644 --- a/lib/gpu/lal_tersoff.cpp +++ b/lib/gpu/lal_tersoff.cpp @@ -272,7 +272,7 @@ void TersoffT::loop(const bool _eflag, const bool _vflag, const int evatom) { &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), &this->dev_short_nbor, - &_eflag, &this->_ainum, &nbor_pitch, &this->_threads_per_atom); + &eflag, &this->_ainum, &nbor_pitch, &this->_threads_per_atom); ainum=this->ans->inum(); nbor_pitch=this->nbor->nbor_pitch(); diff --git a/lib/gpu/lal_tersoff_mod.cpp b/lib/gpu/lal_tersoff_mod.cpp index c37c07f1a1..dc25fdadff 100644 --- a/lib/gpu/lal_tersoff_mod.cpp +++ b/lib/gpu/lal_tersoff_mod.cpp @@ -272,7 +272,7 @@ void TersoffMT::loop(const bool _eflag, const bool _vflag, const int evatom) { &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), &this->dev_short_nbor, - &_eflag, &this->_ainum, &nbor_pitch, &this->_threads_per_atom); + &eflag, &this->_ainum, &nbor_pitch, &this->_threads_per_atom); ainum=this->ans->inum(); nbor_pitch=this->nbor->nbor_pitch(); diff --git a/lib/gpu/lal_tersoff_zbl.cpp b/lib/gpu/lal_tersoff_zbl.cpp index 341f663030..7cd0d9e6b2 100644 --- a/lib/gpu/lal_tersoff_zbl.cpp +++ b/lib/gpu/lal_tersoff_zbl.cpp @@ -297,7 +297,7 @@ void TersoffZT::loop(const bool _eflag, const bool _vflag, const int evatom) { &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), &this->dev_short_nbor, - &_eflag, &this->_ainum, &nbor_pitch, &this->_threads_per_atom); + &eflag, &this->_ainum, &nbor_pitch, &this->_threads_per_atom); ainum=this->ans->inum(); nbor_pitch=this->nbor->nbor_pitch(); From d71e037c233fcd5e49bab5d71d472e9db1249e52 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sun, 22 Jul 2018 11:27:14 -0500 Subject: [PATCH 066/123] Renamed dev_acc to dev_ilist for better description and updated the 3-body styles accordingly; also fixed bugs with accessing dev_packed from the three_end kernel of tersoff/mod and tersoff/zbl gpu styles for OpenCL builds --- lib/gpu/lal_neighbor.cpp | 11 ++++++----- lib/gpu/lal_neighbor.h | 2 +- lib/gpu/lal_sw.cpp | 4 ++-- lib/gpu/lal_sw.cu | 12 ++++++------ lib/gpu/lal_tersoff.cpp | 4 ++-- lib/gpu/lal_tersoff.cu | 12 ++++++------ lib/gpu/lal_tersoff_mod.cpp | 4 ++-- lib/gpu/lal_tersoff_mod.cu | 22 +++++++++++----------- lib/gpu/lal_tersoff_zbl.cpp | 4 ++-- lib/gpu/lal_tersoff_zbl.cu | 22 +++++++++++----------- lib/gpu/lal_vashishta.cpp | 4 ++-- lib/gpu/lal_vashishta.cu | 12 ++++++------ 12 files changed, 57 insertions(+), 56 deletions(-) diff --git a/lib/gpu/lal_neighbor.cpp b/lib/gpu/lal_neighbor.cpp index d264a933a1..c6fa1aa560 100644 --- a/lib/gpu/lal_neighbor.cpp +++ b/lib/gpu/lal_neighbor.cpp @@ -127,10 +127,11 @@ void Neighbor::alloc(bool &success) { dev_packed.clear(); success=success && (dev_packed.alloc((_max_nbors+2)*_max_atoms,*dev, _packed_permissions)==UCL_SUCCESS); - dev_acc.clear(); - success=success && (dev_acc.alloc(_max_atoms,*dev, + dev_ilist.clear(); + success=success && (dev_ilist.alloc(_max_atoms,*dev, UCL_READ_WRITE)==UCL_SUCCESS); - _c_bytes+=dev_packed.row_bytes()+dev_acc.row_bytes(); + dev_ilist.clear(); + _c_bytes+=dev_packed.row_bytes()+dev_ilist.row_bytes(); } if (_max_host>0) { nbor_host.clear(); @@ -197,7 +198,7 @@ void Neighbor::clear() { host_packed.clear(); host_acc.clear(); - dev_acc.clear(); + dev_ilist.clear(); dev_nbor.clear(); nbor_host.clear(); dev_packed.clear(); @@ -289,7 +290,7 @@ void Neighbor::get_host(const int inum, int *ilist, int *numj, int i=ilist[ii]; host_view[i] = ii; } - ucl_copy(dev_acc,host_view,true); + ucl_copy(dev_ilist,host_view,true); time_nbor.stop(); diff --git a/lib/gpu/lal_neighbor.h b/lib/gpu/lal_neighbor.h index 01f7b02798..996deaff6d 100644 --- a/lib/gpu/lal_neighbor.h +++ b/lib/gpu/lal_neighbor.h @@ -200,7 +200,7 @@ class Neighbor { /// Host storage for nbor counts (row 1) & accumulated neighbor counts (row2) UCL_H_Vec host_acc; /// Device storage for accessing atom indices from the neighbor list (3-body) - UCL_D_Vec dev_acc; + UCL_D_Vec dev_ilist; // ----------------- Data for GPU Neighbor Calculation --------------- diff --git a/lib/gpu/lal_sw.cpp b/lib/gpu/lal_sw.cpp index 24984e4878..46b6382a60 100644 --- a/lib/gpu/lal_sw.cpp +++ b/lib/gpu/lal_sw.cpp @@ -243,7 +243,7 @@ void SWT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end_vatom.run(&this->atom->x, &sw1, &sw2, &sw3, &map, &elem2param, &_nelements, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, &this->dev_short_nbor, + &this->nbor->dev_ilist, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); @@ -252,7 +252,7 @@ void SWT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end.run(&this->atom->x, &sw1, &sw2, &sw3, &map, &elem2param, &_nelements, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, &this->dev_short_nbor, + &this->nbor->dev_ilist, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); diff --git a/lib/gpu/lal_sw.cu b/lib/gpu/lal_sw.cu index 517de70691..3b6de5a683 100644 --- a/lib/gpu/lal_sw.cu +++ b/lib/gpu/lal_sw.cu @@ -544,7 +544,7 @@ __kernel void k_sw_three_end(const __global numtyp4 *restrict x_, const int nelements, const __global int * dev_nbor, const __global int * dev_packed, - const __global int * dev_acc, + const __global int * dev_ilist, const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, @@ -614,13 +614,13 @@ __kernel void k_sw_three_end(const __global numtyp4 *restrict x_, int nbor_k,numk; if (dev_nbor==dev_packed) { if (gpu_nbor) nbor_k=j+nbor_pitch; - else nbor_k=dev_acc[j]+nbor_pitch; + else nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch+fast_mul(j,t_per_atom-1); k_end=nbor_k+fast_mul(numk/t_per_atom,n_stride)+(numk & (t_per_atom-1)); nbor_k+=offset_k; } else { - nbor_k=dev_acc[j]+nbor_pitch; + nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch; nbor_k=dev_nbor[nbor_k]; @@ -698,7 +698,7 @@ __kernel void k_sw_three_end_vatom(const __global numtyp4 *restrict x_, const int nelements, const __global int * dev_nbor, const __global int * dev_packed, - const __global int * dev_acc, + const __global int * dev_ilist, const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, @@ -768,13 +768,13 @@ __kernel void k_sw_three_end_vatom(const __global numtyp4 *restrict x_, int nbor_k,numk; if (dev_nbor==dev_packed) { if (gpu_nbor) nbor_k=j+nbor_pitch; - else nbor_k=dev_acc[j]+nbor_pitch; + else nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch+fast_mul(j,t_per_atom-1); k_end=nbor_k+fast_mul(numk/t_per_atom,n_stride)+(numk & (t_per_atom-1)); nbor_k+=offset_k; } else { - nbor_k=dev_acc[j]+nbor_pitch; + nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch; nbor_k=dev_nbor[nbor_k]; diff --git a/lib/gpu/lal_tersoff.cpp b/lib/gpu/lal_tersoff.cpp index af1e286520..ef55b98a2d 100644 --- a/lib/gpu/lal_tersoff.cpp +++ b/lib/gpu/lal_tersoff.cpp @@ -311,7 +311,7 @@ void TersoffT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end_vatom.run(&this->atom->x, &ts1, &ts2, &ts4, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, &this->dev_short_nbor, + &this->nbor->dev_ilist, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); @@ -320,7 +320,7 @@ void TersoffT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end.run(&this->atom->x, &ts1, &ts2, &ts4, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, &this->dev_short_nbor, + &this->nbor->dev_ilist, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); } diff --git a/lib/gpu/lal_tersoff.cu b/lib/gpu/lal_tersoff.cu index cec0ccc443..836f05660d 100644 --- a/lib/gpu/lal_tersoff.cu +++ b/lib/gpu/lal_tersoff.cu @@ -696,7 +696,7 @@ __kernel void k_tersoff_three_end(const __global numtyp4 *restrict x_, const __global acctyp4 *restrict zetaij, const __global int * dev_nbor, const __global int * dev_packed, - const __global int * dev_acc, + const __global int * dev_ilist, const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, @@ -777,13 +777,13 @@ __kernel void k_tersoff_three_end(const __global numtyp4 *restrict x_, int nbor_k,numk; if (dev_nbor==dev_packed) { if (gpu_nbor) nbor_k=j+nbor_pitch; - else nbor_k=dev_acc[j]+nbor_pitch; + else nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch+fast_mul(j,t_per_atom-1); k_end=nbor_k+fast_mul(numk/t_per_atom,n_stride)+(numk & (t_per_atom-1)); nbor_k+=offset_k; } else { - nbor_k=dev_acc[j]+nbor_pitch; + nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch; nbor_k=dev_nbor[nbor_k]; @@ -941,7 +941,7 @@ __kernel void k_tersoff_three_end_vatom(const __global numtyp4 *restrict x_, const __global acctyp4 *restrict zetaij, const __global int * dev_nbor, const __global int * dev_packed, - const __global int * dev_acc, + const __global int * dev_ilist, const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, @@ -1022,13 +1022,13 @@ __kernel void k_tersoff_three_end_vatom(const __global numtyp4 *restrict x_, int nbor_k,numk; if (dev_nbor==dev_packed) { if (gpu_nbor) nbor_k=j+nbor_pitch; - else nbor_k=dev_acc[j]+nbor_pitch; + else nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch+fast_mul(j,t_per_atom-1); k_end=nbor_k+fast_mul(numk/t_per_atom,n_stride)+(numk & (t_per_atom-1)); nbor_k+=offset_k; } else { - nbor_k=dev_acc[j]+nbor_pitch; + nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch; nbor_k=dev_nbor[nbor_k]; diff --git a/lib/gpu/lal_tersoff_mod.cpp b/lib/gpu/lal_tersoff_mod.cpp index dc25fdadff..3cbb488cab 100644 --- a/lib/gpu/lal_tersoff_mod.cpp +++ b/lib/gpu/lal_tersoff_mod.cpp @@ -311,7 +311,7 @@ void TersoffMT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end_vatom.run(&this->atom->x, &ts1, &ts2, &ts4, &ts5, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, &this->dev_short_nbor, + &this->nbor->dev_ilist, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); @@ -320,7 +320,7 @@ void TersoffMT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end.run(&this->atom->x, &ts1, &ts2, &ts4, &ts5, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, &this->dev_short_nbor, + &this->nbor->dev_ilist, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); } diff --git a/lib/gpu/lal_tersoff_mod.cu b/lib/gpu/lal_tersoff_mod.cu index 576359b514..dfb94c4145 100644 --- a/lib/gpu/lal_tersoff_mod.cu +++ b/lib/gpu/lal_tersoff_mod.cu @@ -272,7 +272,7 @@ __kernel void k_tersoff_mod_zeta(const __global numtyp4 *restrict x_, if (iik_three_end_vatom.run(&this->atom->x, &ts1, &ts2, &ts4, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, &this->dev_short_nbor, + &this->nbor->dev_ilist, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); @@ -346,7 +346,7 @@ void TersoffZT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end.run(&this->atom->x, &ts1, &ts2, &ts4, &cutsq, &map, &elem2param, &_nelements, &_nparams, &_zetaij, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, &this->dev_short_nbor, + &this->nbor->dev_ilist, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); } diff --git a/lib/gpu/lal_tersoff_zbl.cu b/lib/gpu/lal_tersoff_zbl.cu index e8bb017f59..73ff51c704 100644 --- a/lib/gpu/lal_tersoff_zbl.cu +++ b/lib/gpu/lal_tersoff_zbl.cu @@ -278,7 +278,7 @@ __kernel void k_tersoff_zbl_zeta(const __global numtyp4 *restrict x_, if (iik_three_end_vatom.run(&this->atom->x, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, &map, &elem2param, &_nelements, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, &this->dev_short_nbor, + &this->nbor->dev_ilist, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); } else { @@ -286,7 +286,7 @@ void VashishtaT::loop(const bool _eflag, const bool _vflag, const int evatom) { this->k_three_end.run(&this->atom->x, ¶m1, ¶m2, ¶m3, ¶m4, ¶m5, &map, &elem2param, &_nelements, &this->nbor->dev_nbor, &this->_nbor_data->begin(), - &this->nbor->dev_acc, &this->dev_short_nbor, + &this->nbor->dev_ilist, &this->dev_short_nbor, &end_ans->force, &end_ans->engv, &eflag, &vflag, &ainum, &nbor_pitch, &this->_threads_per_atom, &this->_gpu_nbor); } diff --git a/lib/gpu/lal_vashishta.cu b/lib/gpu/lal_vashishta.cu index d2e8bb1496..0da46c3b53 100644 --- a/lib/gpu/lal_vashishta.cu +++ b/lib/gpu/lal_vashishta.cu @@ -554,7 +554,7 @@ __kernel void k_vashishta_three_end(const __global numtyp4 *restrict x_, const int nelements, const __global int * dev_nbor, const __global int * dev_packed, - const __global int * dev_acc, + const __global int * dev_ilist, const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, @@ -623,13 +623,13 @@ __kernel void k_vashishta_three_end(const __global numtyp4 *restrict x_, int nbor_k,numk; if (dev_nbor==dev_packed) { if (gpu_nbor) nbor_k=j+nbor_pitch; - else nbor_k=dev_acc[j]+nbor_pitch; + else nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch+fast_mul(j,t_per_atom-1); k_end=nbor_k+fast_mul(numk/t_per_atom,n_stride)+(numk & (t_per_atom-1)); nbor_k+=offset_k; } else { - nbor_k=dev_acc[j]+nbor_pitch; + nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch; nbor_k=dev_nbor[nbor_k]; @@ -709,7 +709,7 @@ __kernel void k_vashishta_three_end_vatom(const __global numtyp4 *restrict x_, const int nelements, const __global int * dev_nbor, const __global int * dev_packed, - const __global int * dev_acc, + const __global int * dev_ilist, const __global int * dev_short_nbor, __global acctyp4 *restrict ans, __global acctyp *restrict engv, @@ -778,13 +778,13 @@ __kernel void k_vashishta_three_end_vatom(const __global numtyp4 *restrict x_, int nbor_k,numk; if (dev_nbor==dev_packed) { if (gpu_nbor) nbor_k=j+nbor_pitch; - else nbor_k=dev_acc[j]+nbor_pitch; + else nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch+fast_mul(j,t_per_atom-1); k_end=nbor_k+fast_mul(numk/t_per_atom,n_stride)+(numk & (t_per_atom-1)); nbor_k+=offset_k; } else { - nbor_k=dev_acc[j]+nbor_pitch; + nbor_k=dev_ilist[j]+nbor_pitch; numk=dev_nbor[nbor_k]; nbor_k+=nbor_pitch; nbor_k=dev_nbor[nbor_k]; From b612c7ee75662dc3530e0a112063486b0f3d080c Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sun, 22 Jul 2018 13:15:01 -0500 Subject: [PATCH 067/123] Fixed a copy-paste bug in lal_neighbor.cpp for neigh no --- lib/gpu/lal_neighbor.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/gpu/lal_neighbor.cpp b/lib/gpu/lal_neighbor.cpp index c6fa1aa560..3e128bcf57 100644 --- a/lib/gpu/lal_neighbor.cpp +++ b/lib/gpu/lal_neighbor.cpp @@ -130,7 +130,6 @@ void Neighbor::alloc(bool &success) { dev_ilist.clear(); success=success && (dev_ilist.alloc(_max_atoms,*dev, UCL_READ_WRITE)==UCL_SUCCESS); - dev_ilist.clear(); _c_bytes+=dev_packed.row_bytes()+dev_ilist.row_bytes(); } if (_max_host>0) { From 644888d03c495258655518d9cf40f51e79acb033 Mon Sep 17 00:00:00 2001 From: Trung Nguyen Date: Sun, 22 Jul 2018 15:12:45 -0500 Subject: [PATCH 068/123] Fixed bugs with time_q and time_quat not calling start() and stop() when _charge and/or _rot in Atom are true for OpenCL builds --- lib/gpu/lal_atom.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/gpu/lal_atom.h b/lib/gpu/lal_atom.h index f6a0b109f2..57880d7ca9 100644 --- a/lib/gpu/lal_atom.h +++ b/lib/gpu/lal_atom.h @@ -322,10 +322,12 @@ class Atom { // Copy charges to device asynchronously inline void add_q_data() { + time_q.start(); if (_q_avail==false) { q.update_device(_nall,true); _q_avail=true; } + time_q.stop(); } // Cast quaternions to write buffer @@ -347,10 +349,12 @@ class Atom { // Copy quaternions to device /** Copies nall()*4 elements **/ inline void add_quat_data() { + time_quat.start(); if (_quat_avail==false) { quat.update_device(_nall*4,true); _quat_avail=true; } + time_quat.stop(); } /// Cast velocities and tags to write buffer From 40dcfa44c9a0f545e9e33432bb06e471a5023de7 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Mon, 23 Jul 2018 08:35:40 -0600 Subject: [PATCH 069/123] new checksum for LATTE download --- lib/latte/Install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/latte/Install.py b/lib/latte/Install.py index e1ed9d4eaa..3b211858dd 100644 --- a/lib/latte/Install.py +++ b/lib/latte/Install.py @@ -40,7 +40,7 @@ version = '1.2.1' checksums = { \ '1.1.0' : '533635721ee222d0ed2925a18fb5b294', \ '1.2.0' : '68bf0db879da5e068a71281020239ae7', \ - '1.2.1' : 'bed76e7e76c545c36dd848a8f1fd35eb' \ + '1.2.1' : '85ac414fdada2d04619c8f936344df14', \ } # print error message or help From 35ffa0a214d25b5a6f6d6bc60563b7e7507b33fe Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 23 Jul 2018 12:36:29 -0400 Subject: [PATCH 070/123] update MD5SUM entry in CMake build system --- cmake/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index bf57398c71..60a0f5d48f 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -332,7 +332,7 @@ if(PKG_LATTE) include(ExternalProject) ExternalProject_Add(latte_build URL https://github.com/lanl/LATTE/archive/v1.2.1.tar.gz - URL_MD5 bed76e7e76c545c36dd848a8f1fd35eb + URL_MD5 85ac414fdada2d04619c8f936344df14 SOURCE_SUBDIR cmake CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= -DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE} ) From 2ac3953e17b94bb16f402185eaa8904809aeeb01 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 23 Jul 2018 12:37:05 -0400 Subject: [PATCH 071/123] update src/Purge.list to cleanly remove obsolete files --- src/Purge.list | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Purge.list b/src/Purge.list index 402fc409e6..cd4eb17dab 100644 --- a/src/Purge.list +++ b/src/Purge.list @@ -24,6 +24,9 @@ style_nstencil.h style_ntopo.h # other auto-generated files lmpinstalledpkgs.h +# renamed on 20 July 2018 +pair_body.h +pair_body.cpp # deleted on 4 April 2018 pair_kim_version.h # deleted on 15 December 2017 From 923ae041dcfe0fdebbb146ec9a9b71fa8eba5a55 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 23 Jul 2018 15:52:42 -0400 Subject: [PATCH 072/123] (temporary) workaround for memory leaks with OpenCL and MPI for upcoming stable release --- lib/gpu/lal_device.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/gpu/lal_device.cpp b/lib/gpu/lal_device.cpp index 7f54432a74..6b4d0ab2a5 100644 --- a/lib/gpu/lal_device.cpp +++ b/lib/gpu/lal_device.cpp @@ -130,8 +130,16 @@ int DeviceT::init_device(MPI_Comm world, MPI_Comm replica, const int first_gpu, // Time on the device only if 1 proc per gpu _time_device=true; + +#if 0 + // XXX: the following setting triggers a memory leak with OpenCL and MPI + // setting _time_device=true for all processes doesn't seem to be a + // problem with either (no segfault, no (large) memory leak. + // thus keeping this disabled for now. may need to review later. + // 2018-07-23 if (_procs_per_gpu>1) _time_device=false; +#endif // Set up a per device communicator MPI_Comm_split(node_comm,my_gpu,0,&_comm_gpu); From eee0df45dd1307223ddde73ec74b42feb4729e7f Mon Sep 17 00:00:00 2001 From: Marshall McDonnell Date: Tue, 24 Jul 2018 09:26:06 -0400 Subject: [PATCH 073/123] Updated fix gcmc docs for tail correction note --- doc/src/fix_gcmc.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/fix_gcmc.txt b/doc/src/fix_gcmc.txt index 38f0fb95ce..191bc32b14 100644 --- a/doc/src/fix_gcmc.txt +++ b/doc/src/fix_gcmc.txt @@ -349,7 +349,7 @@ in the context of NVT dynamics. NOTE: If the density of the cell is initially very small or zero, and increases to a much larger density after a period of equilibration, then certain quantities that are only calculated once at the start -(kspace parameters, tail corrections) may no longer be accurate. The +(kspace parameters) may no longer be accurate. The solution is to start a new simulation after the equilibrium density has been reached. From da1be29278a7a9e623fdd76478cd572a789f77f5 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Tue, 24 Jul 2018 14:31:55 -0600 Subject: [PATCH 074/123] 2nd try at incremental doc page reorg, Section_tools --- doc/src/Manual.txt | 4 +- doc/src/Tools.txt | 527 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 529 insertions(+), 2 deletions(-) create mode 100644 doc/src/Tools.txt diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index e69797d9ec..d6d46570c1 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -116,7 +116,7 @@ it gives quick access to documentation for all LAMMPS commands. Section_howto Section_example Section_perf - Section_tools + Tools Section_modify Section_python Section_errors @@ -210,7 +210,7 @@ END_RST --> 6.27 "Drude induced dipoles"_howto_27 :ule,b "Example problems"_Section_example.html :l "Performance & scalability"_Section_perf.html :l -"Additional tools"_Section_tools.html :l +"Auxiliary tools"_Tools.html :l "Modifying & extending LAMMPS"_Section_modify.html :l 10.1 "Atom styles"_mod_1 :ulb,b 10.2 "Bond, angle, dihedral, improper potentials"_mod_2 :b diff --git a/doc/src/Tools.txt b/doc/src/Tools.txt new file mode 100644 index 0000000000..8fc371c4ef --- /dev/null +++ b/doc/src/Tools.txt @@ -0,0 +1,527 @@ +"Previous Section"_Section_perf.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc - "Next +Section"_Section_modify.html :c + + + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Commands.html#comm) + +:line + +Auxiliary tools :h3 + +LAMMPS is designed to be a computational kernel for performing +molecular dynamics computations. Additional pre- and post-processing +steps are often necessary to setup and analyze a simulation. A list +of such tools can be found on the "LAMMPS webpage"_lws at these links: + +"Pre/Post processing"_http://lammps.sandia.gov/prepost.html +"Offsite LAMMPS packages & tools"_http://lammps.sandia.gov/offsite.html +"Pizza.py toolkit"_pizza :ul + +The last link for "Pizza.py"_pizza is a Python-based tool developed at +Sandia which provides tools for doing setup, analysis, plotting, and +visualization for LAMMPS simulations. + +"link(pizza,http://pizza.sandia.gov) +:link(python,http://www.python.org) + +Additional tools included in the LAMMPS distribution are described on +this page. + +Note that many users write their own setup or analysis tools or use +other existing codes and convert their output to a LAMMPS input format +or vice versa. The tools listed here are included in the LAMMPS +distribution as examples of auxiliary tools. Some of them are not +actively supported by the LAMMPS developers, as they were contributed +by LAMMPS users. If you have problems using them, we can direct you +to the authors. + +The source code for each of these codes is in the tools sub-directory +of the LAMMPS distribution. There is a Makefile (which you may need +to edit for your platform) which will build several of the tools which +reside in that directory. Most of them are larger packages in their +own sub-directories with their own Makefiles and/or README files. + +"amber2lmp"_#amber +"binary2txt"_#binary +"ch2lmp"_#charmm +"chain"_#chain +"colvars"_#colvars +"createatoms"_#createatoms +"doxygen"_#doxygen +"drude"_#drude +"eam database"_#eamdb +"eam generate"_#eamgn +"eff"_#eff +"emacs"_#emacs +"fep"_#fep +"i-pi"_#ipi +"ipp"_#ipp +"kate"_#kate +"lmp2arc"_#arc +"lmp2cfg"_#cfg +"matlab"_#matlab +"micelle2d"_#micelle +"moltemplate"_#moltemplate +"msi2lmp"_#msi +"phonon"_#phonon +"polybond"_#polybond +"pymol_asphere"_#pymol +"python"_#pythontools +"reax"_#reax_tool +"smd"_#smd +"vim"_#vim +"xmgrace"_#xmgrace :ul + +:line +:line + +amber2lmp tool :h4,link(amber) + +The amber2lmp sub-directory contains two Python scripts for converting +files back-and-forth between the AMBER MD code and LAMMPS. See the +README file in amber2lmp for more information. + +These tools were written by Keir Novik while he was at Queen Mary +University of London. Keir is no longer there and cannot support +these tools which are out-of-date with respect to the current LAMMPS +version (and maybe with respect to AMBER as well). Since we don't use +these tools at Sandia, you'll need to experiment with them and make +necessary modifications yourself. + +:line + +binary2txt tool :h4,link(binary) + +The file binary2txt.cpp converts one or more binary LAMMPS dump file +into ASCII text files. The syntax for running the tool is + +binary2txt file1 file2 ... :pre + +which creates file1.txt, file2.txt, etc. This tool must be compiled +on a platform that can read the binary file created by a LAMMPS run, +since binary files are not compatible across all platforms. + +:line + +ch2lmp tool :h4,link(charmm) + +The ch2lmp sub-directory contains tools for converting files +back-and-forth between the CHARMM MD code and LAMMPS. + +They are intended to make it easy to use CHARMM as a builder and as a +post-processor for LAMMPS. Using charmm2lammps.pl, you can convert a +PDB file with associated CHARMM info, including CHARMM force field +data, into its LAMMPS equivalent. Support for the CMAP correction of +CHARMM22 and later is available as an option. This tool can also add +solvent water molecules and Na+ or Cl- ions to the system. +Using lammps2pdb.pl you can convert LAMMPS atom dumps into PDB files. + +See the README file in the ch2lmp sub-directory for more information. + +These tools were created by Pieter in't Veld (pjintve at sandia.gov) +and Paul Crozier (pscrozi at sandia.gov) at Sandia. + +CMAP support added and tested by Xiaohu Hu (hux2 at ornl.gov) and +Robert A. Latour (latourr at clemson.edu), David Hyde-Volpe, and +Tigran Abramyan, (Clemson University) and +Chris Lorenz (chris.lorenz at kcl.ac.uk), King's College London. + +:line + +chain tool :h4,link(chain) + +The file chain.f creates a LAMMPS data file containing bead-spring +polymer chains and/or monomer solvent atoms. It uses a text file +containing chain definition parameters as an input. The created +chains and solvent atoms can strongly overlap, so LAMMPS needs to run +the system initially with a "soft" pair potential to un-overlap it. +The syntax for running the tool is + +chain < def.chain > data.file :pre + +See the def.chain or def.chain.ab files in the tools directory for +examples of definition files. This tool was used to create the +system for the "chain benchmark"_Section_perf.html. + +:line + +colvars tools :h4,link(colvars) + +The colvars directory contains a collection of tools for postprocessing +data produced by the colvars collective variable library. +To compile the tools, edit the makefile for your system and run "make". + +Please report problems and issues the colvars library and its tools +at: https://github.com/colvars/colvars/issues + +abf_integrate: + +MC-based integration of multidimensional free energy gradient +Version 20110511 + +Syntax: ./abf_integrate < filename > \[-n < nsteps >\] \[-t < temp >\] \[-m \[0|1\] (metadynamics)\] \[-h < hill_height >\] \[-f < variable_hill_factor >\] :pre + +The LAMMPS interface to the colvars collective variable library, as +well as these tools, were created by Axel Kohlmeyer (akohlmey at +gmail.com) at ICTP, Italy. + +:line + +createatoms tool :h4,link(createatoms) + +The tools/createatoms directory contains a Fortran program called +createAtoms.f which can generate a variety of interesting crystal +structures and geometries and output the resulting list of atom +coordinates in LAMMPS or other formats. + +See the included Manual.pdf for details. + +The tool is authored by Xiaowang Zhou (Sandia), xzhou at sandia.gov. + +:line + +doxygen tool :h4,link(doxygen) + +The tools/doxygen directory contains a shell script called +doxygen.sh which can generate a call graph and API lists using +the "Doxygen software"_http://doxygen.org. + +See the included README file for details. + +The tool is authored by Nandor Tamaskovics, numericalfreedom at googlemail.com. + +:line + +drude tool :h4,link(drude) + +The tools/drude directory contains a Python script called +polarizer.py which can add Drude oscillators to a LAMMPS +data file in the required format. + +See the header of the polarizer.py file for details. + +The tool is authored by Agilio Padua and Alain Dequidt: agilio.padua +at univ-bpclermont.fr, alain.dequidt at univ-bpclermont.fr + +:line + +eam database tool :h4,link(eamdb) + +The tools/eam_database directory contains a Fortran program that will +generate EAM alloy setfl potential files for any combination of 16 +elements: Cu, Ag, Au, Ni, Pd, Pt, Al, Pb, Fe, Mo, Ta, W, Mg, Co, Ti, +Zr. The files can then be used with the "pair_style +eam/alloy"_pair_eam.html command. + +The tool is authored by Xiaowang Zhou (Sandia), xzhou at sandia.gov, +and is based on his paper: + +X. W. Zhou, R. A. Johnson, and H. N. G. Wadley, Phys. Rev. B, 69, +144113 (2004). + +:line + +eam generate tool :h4,link(eamgn) + +The tools/eam_generate directory contains several one-file C programs +that convert an analytic formula into a tabulated "embedded atom +method (EAM)"_pair_eam.html setfl potential file. The potentials they +produce are in the potentials directory, and can be used with the +"pair_style eam/alloy"_pair_eam.html command. + +The source files and potentials were provided by Gerolf Ziegenhain +(gerolf at ziegenhain.com). + +:line + +eff tool :h4,link(eff) + +The tools/eff directory contains various scripts for generating +structures and post-processing output for simulations using the +electron force field (eFF). + +These tools were provided by Andres Jaramillo-Botero at CalTech +(ajaramil at wag.caltech.edu). + +:line + +emacs tool :h4,link(emacs) + +The tools/emacs directory contains a Lips add-on file for Emacs that +enables a lammps-mode for editing of input scripts when using Emacs, +with various highlighting options setup. + +These tools were provided by Aidan Thompson at Sandia +(athomps at sandia.gov). + +:line + +fep tool :h4,link(fep) + +The tools/fep directory contains Python scripts useful for +post-processing results from performing free-energy perturbation +simulations using the USER-FEP package. + +The scripts were contributed by Agilio Padua (Universite Blaise +Pascal Clermont-Ferrand), agilio.padua at univ-bpclermont.fr. + +See README file in the tools/fep directory. + +:line + +i-pi tool :h4,link(ipi) + +The tools/i-pi directory contains a version of the i-PI package, with +all the LAMMPS-unrelated files removed. It is provided so that it can +be used with the "fix ipi"_fix_ipi.html command to perform +path-integral molecular dynamics (PIMD). + +The i-PI package was created and is maintained by Michele Ceriotti, +michele.ceriotti at gmail.com, to interface to a variety of molecular +dynamics codes. + +See the tools/i-pi/manual.pdf file for an overview of i-PI, and the +"fix ipi"_fix_ipi.html doc page for further details on running PIMD +calculations with LAMMPS. + +:line + +ipp tool :h4,link(ipp) + +The tools/ipp directory contains a Perl script ipp which can be used +to facilitate the creation of a complicated file (say, a lammps input +script or tools/createatoms input file) using a template file. + +ipp was created and is maintained by Reese Jones (Sandia), rjones at +sandia.gov. + +See two examples in the tools/ipp directory. One of them is for the +tools/createatoms tool's input file. + +:line + +kate tool :h4,link(kate) + +The file in the tools/kate directory is an add-on to the Kate editor +in the KDE suite that allow syntax highlighting of LAMMPS input +scripts. See the README.txt file for details. + +The file was provided by Alessandro Luigi Sellerio +(alessandro.sellerio at ieni.cnr.it). + +:line + +lmp2arc tool :h4,link(arc) + +The lmp2arc sub-directory contains a tool for converting LAMMPS output +files to the format for Accelrys' Insight MD code (formerly +MSI/Biosym and its Discover MD code). See the README file for more +information. + +This tool was written by John Carpenter (Cray), Michael Peachey +(Cray), and Steve Lustig (Dupont). John is now at the Mayo Clinic +(jec at mayo.edu), but still fields questions about the tool. + +This tool was updated for the current LAMMPS C++ version by Jeff +Greathouse at Sandia (jagreat at sandia.gov). + +:line + +lmp2cfg tool :h4,link(cfg) + +The lmp2cfg sub-directory contains a tool for converting LAMMPS output +files into a series of *.cfg files which can be read into the +"AtomEye"_http://mt.seas.upenn.edu/Archive/Graphics/A visualizer. See +the README file for more information. + +This tool was written by Ara Kooser at Sandia (askoose at sandia.gov). + +:line + +matlab tool :h4,link(matlab) + +The matlab sub-directory contains several "MATLAB"_matlabhome scripts for +post-processing LAMMPS output. The scripts include readers for log +and dump files, a reader for EAM potential files, and a converter that +reads LAMMPS dump files and produces CFG files that can be visualized +with the "AtomEye"_http://mt.seas.upenn.edu/Archive/Graphics/A +visualizer. + +See the README.pdf file for more information. + +These scripts were written by Arun Subramaniyan at Purdue Univ +(asubrama at purdue.edu). + +:link(matlabhome,http://www.mathworks.com) + +:line + +micelle2d tool :h4,link(micelle) + +The file micelle2d.f creates a LAMMPS data file containing short lipid +chains in a monomer solution. It uses a text file containing lipid +definition parameters as an input. The created molecules and solvent +atoms can strongly overlap, so LAMMPS needs to run the system +initially with a "soft" pair potential to un-overlap it. The syntax +for running the tool is + +micelle2d < def.micelle2d > data.file :pre + +See the def.micelle2d file in the tools directory for an example of a +definition file. This tool was used to create the system for the +"micelle example"_Section_example.html. + +:line + +moltemplate tool :h4,link(moltemplate) + +The moltemplate sub-directory contains a Python-based tool for +building molecular systems based on a text-file description, and +creating LAMMPS data files that encode their molecular topology as +lists of bonds, angles, dihedrals, etc. See the README.TXT file for +more information. + +This tool was written by Andrew Jewett (jewett.aij at gmail.com), who +supports it. It has its own WWW page at +"http://moltemplate.org"_http://moltemplate.org. + +:line + +msi2lmp tool :h4,link(msi) + +The msi2lmp sub-directory contains a tool for creating LAMMPS template +input and data files from BIOVIA's Materias Studio files (formerly Accelrys' +Insight MD code, formerly MSI/Biosym and its Discover MD code). + +This tool was written by John Carpenter (Cray), Michael Peachey +(Cray), and Steve Lustig (Dupont). Several people contributed changes +to remove bugs and adapt its output to changes in LAMMPS. + +This tool has several known limitations and is no longer under active +development, so there are no changes except for the occasional bugfix. + +See the README file in the tools/msi2lmp folder for more information. + +:line + +phonon tool :h4,link(phonon) + +The phonon sub-directory contains a post-processing tool useful for +analyzing the output of the "fix phonon"_fix_phonon.html command in +the USER-PHONON package. + +See the README file for instruction on building the tool and what +library it needs. And see the examples/USER/phonon directory +for example problems that can be post-processed with this tool. + +This tool was written by Ling-Ti Kong at Shanghai Jiao Tong +University. + +:line + +polybond tool :h4,link(polybond) + +The polybond sub-directory contains a Python-based tool useful for +performing "programmable polymer bonding". The Python file +lmpsdata.py provides a "Lmpsdata" class with various methods which can +be invoked by a user-written Python script to create data files with +complex bonding topologies. + +See the Manual.pdf for details and example scripts. + +This tool was written by Zachary Kraus at Georgia Tech. + +:line + +pymol_asphere tool :h4,link(pymol) + +The pymol_asphere sub-directory contains a tool for converting a +LAMMPS dump file that contains orientation info for ellipsoidal +particles into an input file for the "PyMol visualization +package"_pymolhome or its "open source variant"_pymolopen. + +:link(pymolhome,http://www.pymol.org) +:link(pymolopen,http://sourceforge.net/scm/?type=svn&group_id=4546) + +Specifically, the tool triangulates the ellipsoids so they can be +viewed as true ellipsoidal particles within PyMol. See the README and +examples directory within pymol_asphere for more information. + +This tool was written by Mike Brown at Sandia. + +:line + +python tool :h4,link(pythontools) + +The python sub-directory contains several Python scripts +that perform common LAMMPS post-processing tasks, such as: + +extract thermodynamic info from a log file as columns of numbers +plot two columns of thermodynamic info from a log file using GnuPlot +sort the snapshots in a dump file by atom ID +convert multiple "NEB"_neb.html dump files into one dump file for viz +convert dump files into XYZ, CFG, or PDB format for viz by other packages :ul + +These are simple scripts built on "Pizza.py"_pizza modules. See the +README for more info on Pizza.py and how to use these scripts. + +:line + +reax tool :h4,link(reax_tool) + +The reax sub-directory contains stand-alond codes that can +post-process the output of the "fix reax/bonds"_fix_reax_bonds.html +command from a LAMMPS simulation using "ReaxFF"_pair_reax.html. See +the README.txt file for more info. + +These tools were written by Aidan Thompson at Sandia. + +:line + +smd tool :h4,link(smd) + +The smd sub-directory contains a C++ file dump2vtk_tris.cpp and +Makefile which can be compiled and used to convert triangle output +files created by the Smooth-Mach Dynamics (USER-SMD) package into a +VTK-compatible unstructured grid file. It could then be read in and +visualized by VTK. + +See the header of dump2vtk.cpp for more details. + +This tool was written by the USER-SMD package author, Georg +Ganzenmuller at the Fraunhofer-Institute for High-Speed Dynamics, +Ernst Mach Institute in Germany (georg.ganzenmueller at emi.fhg.de). + +:line + +vim tool :h4,link(vim) + +The files in the tools/vim directory are add-ons to the VIM editor +that allow easier editing of LAMMPS input scripts. See the README.txt +file for details. + +These files were provided by Gerolf Ziegenhain (gerolf at +ziegenhain.com) + +:line + +xmgrace tool :h4,link(xmgrace) + +The files in the tools/xmgrace directory can be used to plot the +thermodynamic data in LAMMPS log files via the xmgrace plotting +package. There are several tools in the directory that can be used in +post-processing mode. The lammpsplot.cpp file can be compiled and +used to create plots from the current state of a running LAMMPS +simulation. + +See the README file for details. + +These files were provided by Vikas Varshney (vv0210 at gmail.com) From d83d05088fa284a0608d8cace4f7ac0be6d1482b Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Tue, 24 Jul 2018 14:33:27 -0600 Subject: [PATCH 075/123] remove replaced file --- doc/src/Section_tools.txt | 520 -------------------------------------- 1 file changed, 520 deletions(-) delete mode 100644 doc/src/Section_tools.txt diff --git a/doc/src/Section_tools.txt b/doc/src/Section_tools.txt deleted file mode 100644 index 7cc07cbec5..0000000000 --- a/doc/src/Section_tools.txt +++ /dev/null @@ -1,520 +0,0 @@ -"Previous Section"_Section_perf.html - "LAMMPS WWW Site"_lws - "LAMMPS -Documentation"_ld - "LAMMPS Commands"_lc - "Next -Section"_Section_modify.html :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Section_commands.html#comm) - -:line - -9. Additional tools :h2 - -LAMMPS is designed to be a computational kernel for performing -molecular dynamics computations. Additional pre- and post-processing -steps are often necessary to setup and analyze a simulation. A -list of such tools can be found on the LAMMPS home page -at "http://lammps.sandia.gov/prepost.html"_http://lammps.sandia.gov/prepost.html - -A few additional tools are provided with the LAMMPS distribution -and are described in this section. - -Our group has also written and released a separate toolkit called -"Pizza.py"_pizza which provides tools for doing setup, analysis, -plotting, and visualization for LAMMPS simulations. Pizza.py is -written in "Python"_python and is available for download from "the -Pizza.py WWW site"_pizza. - -:link(pizza,http://www.sandia.gov/~sjplimp/pizza.html) -:link(python,http://www.python.org) - -Note that many users write their own setup or analysis tools or use -other existing codes and convert their output to a LAMMPS input format -or vice versa. The tools listed here are included in the LAMMPS -distribution as examples of auxiliary tools. Some of them are not -actively supported by Sandia, as they were contributed by LAMMPS -users. If you have problems using them, we can direct you to the -authors. - -The source code for each of these codes is in the tools sub-directory -of the LAMMPS distribution. There is a Makefile (which you may need -to edit for your platform) which will build several of the tools which -reside in that directory. Most of them are larger packages in their -own sub-directories with their own Makefiles and/or README files. - -"amber2lmp"_#amber -"binary2txt"_#binary -"ch2lmp"_#charmm -"chain"_#chain -"colvars"_#colvars -"createatoms"_#createatoms -"doxygen"_#doxygen -"drude"_#drude -"eam database"_#eamdb -"eam generate"_#eamgn -"eff"_#eff -"emacs"_#emacs -"fep"_#fep -"i-pi"_#ipi -"ipp"_#ipp -"kate"_#kate -"lmp2arc"_#arc -"lmp2cfg"_#cfg -"matlab"_#matlab -"micelle2d"_#micelle -"moltemplate"_#moltemplate -"msi2lmp"_#msi -"phonon"_#phonon -"polybond"_#polybond -"pymol_asphere"_#pymol -"python"_#pythontools -"reax"_#reax_tool -"smd"_#smd -"vim"_#vim -"xmgrace"_#xmgrace - -:line - -amber2lmp tool :h3,link(amber) - -The amber2lmp sub-directory contains two Python scripts for converting -files back-and-forth between the AMBER MD code and LAMMPS. See the -README file in amber2lmp for more information. - -These tools were written by Keir Novik while he was at Queen Mary -University of London. Keir is no longer there and cannot support -these tools which are out-of-date with respect to the current LAMMPS -version (and maybe with respect to AMBER as well). Since we don't use -these tools at Sandia, you'll need to experiment with them and make -necessary modifications yourself. - -:line - -binary2txt tool :h3,link(binary) - -The file binary2txt.cpp converts one or more binary LAMMPS dump file -into ASCII text files. The syntax for running the tool is - -binary2txt file1 file2 ... :pre - -which creates file1.txt, file2.txt, etc. This tool must be compiled -on a platform that can read the binary file created by a LAMMPS run, -since binary files are not compatible across all platforms. - -:line - -ch2lmp tool :h3,link(charmm) - -The ch2lmp sub-directory contains tools for converting files -back-and-forth between the CHARMM MD code and LAMMPS. - -They are intended to make it easy to use CHARMM as a builder and as a -post-processor for LAMMPS. Using charmm2lammps.pl, you can convert a -PDB file with associated CHARMM info, including CHARMM force field -data, into its LAMMPS equivalent. Support for the CMAP correction of -CHARMM22 and later is available as an option. This tool can also add -solvent water molecules and Na+ or Cl- ions to the system. -Using lammps2pdb.pl you can convert LAMMPS atom dumps into PDB files. - -See the README file in the ch2lmp sub-directory for more information. - -These tools were created by Pieter in't Veld (pjintve at sandia.gov) -and Paul Crozier (pscrozi at sandia.gov) at Sandia. - -CMAP support added and tested by Xiaohu Hu (hux2 at ornl.gov) and -Robert A. Latour (latourr at clemson.edu), David Hyde-Volpe, and -Tigran Abramyan, (Clemson University) and -Chris Lorenz (chris.lorenz at kcl.ac.uk), King's College London. - -:line - -chain tool :h3,link(chain) - -The file chain.f creates a LAMMPS data file containing bead-spring -polymer chains and/or monomer solvent atoms. It uses a text file -containing chain definition parameters as an input. The created -chains and solvent atoms can strongly overlap, so LAMMPS needs to run -the system initially with a "soft" pair potential to un-overlap it. -The syntax for running the tool is - -chain < def.chain > data.file :pre - -See the def.chain or def.chain.ab files in the tools directory for -examples of definition files. This tool was used to create the -system for the "chain benchmark"_Section_perf.html. - -:line - -colvars tools :h3,link(colvars) - -The colvars directory contains a collection of tools for postprocessing -data produced by the colvars collective variable library. -To compile the tools, edit the makefile for your system and run "make". - -Please report problems and issues the colvars library and its tools -at: https://github.com/colvars/colvars/issues - -abf_integrate: - -MC-based integration of multidimensional free energy gradient -Version 20110511 - -Syntax: ./abf_integrate < filename > \[-n < nsteps >\] \[-t < temp >\] \[-m \[0|1\] (metadynamics)\] \[-h < hill_height >\] \[-f < variable_hill_factor >\] :pre - -The LAMMPS interface to the colvars collective variable library, as -well as these tools, were created by Axel Kohlmeyer (akohlmey at -gmail.com) at ICTP, Italy. - -:line - -createatoms tool :h3,link(createatoms) - -The tools/createatoms directory contains a Fortran program called -createAtoms.f which can generate a variety of interesting crystal -structures and geometries and output the resulting list of atom -coordinates in LAMMPS or other formats. - -See the included Manual.pdf for details. - -The tool is authored by Xiaowang Zhou (Sandia), xzhou at sandia.gov. - -:line - -doxygen tool :h3,link(doxygen) - -The tools/doxygen directory contains a shell script called -doxygen.sh which can generate a call graph and API lists using -the "Doxygen software"_http://doxygen.org. - -See the included README file for details. - -The tool is authored by Nandor Tamaskovics, numericalfreedom at googlemail.com. - -:line - -drude tool :h3,link(drude) - -The tools/drude directory contains a Python script called -polarizer.py which can add Drude oscillators to a LAMMPS -data file in the required format. - -See the header of the polarizer.py file for details. - -The tool is authored by Agilio Padua and Alain Dequidt: agilio.padua -at univ-bpclermont.fr, alain.dequidt at univ-bpclermont.fr - -:line - -eam database tool :h3,link(eamdb) - -The tools/eam_database directory contains a Fortran program that will -generate EAM alloy setfl potential files for any combination of 16 -elements: Cu, Ag, Au, Ni, Pd, Pt, Al, Pb, Fe, Mo, Ta, W, Mg, Co, Ti, -Zr. The files can then be used with the "pair_style -eam/alloy"_pair_eam.html command. - -The tool is authored by Xiaowang Zhou (Sandia), xzhou at sandia.gov, -and is based on his paper: - -X. W. Zhou, R. A. Johnson, and H. N. G. Wadley, Phys. Rev. B, 69, -144113 (2004). - -:line - -eam generate tool :h3,link(eamgn) - -The tools/eam_generate directory contains several one-file C programs -that convert an analytic formula into a tabulated "embedded atom -method (EAM)"_pair_eam.html setfl potential file. The potentials they -produce are in the potentials directory, and can be used with the -"pair_style eam/alloy"_pair_eam.html command. - -The source files and potentials were provided by Gerolf Ziegenhain -(gerolf at ziegenhain.com). - -:line - -eff tool :h3,link(eff) - -The tools/eff directory contains various scripts for generating -structures and post-processing output for simulations using the -electron force field (eFF). - -These tools were provided by Andres Jaramillo-Botero at CalTech -(ajaramil at wag.caltech.edu). - -:line - -emacs tool :h3,link(emacs) - -The tools/emacs directory contains a Lips add-on file for Emacs that -enables a lammps-mode for editing of input scripts when using Emacs, -with various highlighting options setup. - -These tools were provided by Aidan Thompson at Sandia -(athomps at sandia.gov). - -:line - -fep tool :h3,link(fep) - -The tools/fep directory contains Python scripts useful for -post-processing results from performing free-energy perturbation -simulations using the USER-FEP package. - -The scripts were contributed by Agilio Padua (Universite Blaise -Pascal Clermont-Ferrand), agilio.padua at univ-bpclermont.fr. - -See README file in the tools/fep directory. - -:line - -i-pi tool :h3,link(ipi) - -The tools/i-pi directory contains a version of the i-PI package, with -all the LAMMPS-unrelated files removed. It is provided so that it can -be used with the "fix ipi"_fix_ipi.html command to perform -path-integral molecular dynamics (PIMD). - -The i-PI package was created and is maintained by Michele Ceriotti, -michele.ceriotti at gmail.com, to interface to a variety of molecular -dynamics codes. - -See the tools/i-pi/manual.pdf file for an overview of i-PI, and the -"fix ipi"_fix_ipi.html doc page for further details on running PIMD -calculations with LAMMPS. - -:line - -ipp tool :h3,link(ipp) - -The tools/ipp directory contains a Perl script ipp which can be used -to facilitate the creation of a complicated file (say, a lammps input -script or tools/createatoms input file) using a template file. - -ipp was created and is maintained by Reese Jones (Sandia), rjones at -sandia.gov. - -See two examples in the tools/ipp directory. One of them is for the -tools/createatoms tool's input file. - -:line - -kate tool :h3,link(kate) - -The file in the tools/kate directory is an add-on to the Kate editor -in the KDE suite that allow syntax highlighting of LAMMPS input -scripts. See the README.txt file for details. - -The file was provided by Alessandro Luigi Sellerio -(alessandro.sellerio at ieni.cnr.it). - -:line - -lmp2arc tool :h3,link(arc) - -The lmp2arc sub-directory contains a tool for converting LAMMPS output -files to the format for Accelrys' Insight MD code (formerly -MSI/Biosym and its Discover MD code). See the README file for more -information. - -This tool was written by John Carpenter (Cray), Michael Peachey -(Cray), and Steve Lustig (Dupont). John is now at the Mayo Clinic -(jec at mayo.edu), but still fields questions about the tool. - -This tool was updated for the current LAMMPS C++ version by Jeff -Greathouse at Sandia (jagreat at sandia.gov). - -:line - -lmp2cfg tool :h3,link(cfg) - -The lmp2cfg sub-directory contains a tool for converting LAMMPS output -files into a series of *.cfg files which can be read into the -"AtomEye"_http://mt.seas.upenn.edu/Archive/Graphics/A visualizer. See -the README file for more information. - -This tool was written by Ara Kooser at Sandia (askoose at sandia.gov). - -:line - -matlab tool :h3,link(matlab) - -The matlab sub-directory contains several "MATLAB"_matlabhome scripts for -post-processing LAMMPS output. The scripts include readers for log -and dump files, a reader for EAM potential files, and a converter that -reads LAMMPS dump files and produces CFG files that can be visualized -with the "AtomEye"_http://mt.seas.upenn.edu/Archive/Graphics/A -visualizer. - -See the README.pdf file for more information. - -These scripts were written by Arun Subramaniyan at Purdue Univ -(asubrama at purdue.edu). - -:link(matlabhome,http://www.mathworks.com) - -:line - -micelle2d tool :h3,link(micelle) - -The file micelle2d.f creates a LAMMPS data file containing short lipid -chains in a monomer solution. It uses a text file containing lipid -definition parameters as an input. The created molecules and solvent -atoms can strongly overlap, so LAMMPS needs to run the system -initially with a "soft" pair potential to un-overlap it. The syntax -for running the tool is - -micelle2d < def.micelle2d > data.file :pre - -See the def.micelle2d file in the tools directory for an example of a -definition file. This tool was used to create the system for the -"micelle example"_Section_example.html. - -:line - -moltemplate tool :h3,link(moltemplate) - -The moltemplate sub-directory contains a Python-based tool for -building molecular systems based on a text-file description, and -creating LAMMPS data files that encode their molecular topology as -lists of bonds, angles, dihedrals, etc. See the README.TXT file for -more information. - -This tool was written by Andrew Jewett (jewett.aij at gmail.com), who -supports it. It has its own WWW page at -"http://moltemplate.org"_http://moltemplate.org. - -:line - -msi2lmp tool :h3,link(msi) - -The msi2lmp sub-directory contains a tool for creating LAMMPS template -input and data files from BIOVIA's Materias Studio files (formerly Accelrys' -Insight MD code, formerly MSI/Biosym and its Discover MD code). - -This tool was written by John Carpenter (Cray), Michael Peachey -(Cray), and Steve Lustig (Dupont). Several people contributed changes -to remove bugs and adapt its output to changes in LAMMPS. - -This tool has several known limitations and is no longer under active -development, so there are no changes except for the occasional bugfix. - -See the README file in the tools/msi2lmp folder for more information. - -:line - -phonon tool :h3,link(phonon) - -The phonon sub-directory contains a post-processing tool useful for -analyzing the output of the "fix phonon"_fix_phonon.html command in -the USER-PHONON package. - -See the README file for instruction on building the tool and what -library it needs. And see the examples/USER/phonon directory -for example problems that can be post-processed with this tool. - -This tool was written by Ling-Ti Kong at Shanghai Jiao Tong -University. - -:line - -polybond tool :h3,link(polybond) - -The polybond sub-directory contains a Python-based tool useful for -performing "programmable polymer bonding". The Python file -lmpsdata.py provides a "Lmpsdata" class with various methods which can -be invoked by a user-written Python script to create data files with -complex bonding topologies. - -See the Manual.pdf for details and example scripts. - -This tool was written by Zachary Kraus at Georgia Tech. - -:line - -pymol_asphere tool :h3,link(pymol) - -The pymol_asphere sub-directory contains a tool for converting a -LAMMPS dump file that contains orientation info for ellipsoidal -particles into an input file for the "PyMol visualization -package"_pymolhome or its "open source variant"_pymolopen. - -:link(pymolhome,http://www.pymol.org) -:link(pymolopen,http://sourceforge.net/scm/?type=svn&group_id=4546) - -Specifically, the tool triangulates the ellipsoids so they can be -viewed as true ellipsoidal particles within PyMol. See the README and -examples directory within pymol_asphere for more information. - -This tool was written by Mike Brown at Sandia. - -:line - -python tool :h3,link(pythontools) - -The python sub-directory contains several Python scripts -that perform common LAMMPS post-processing tasks, such as: - -extract thermodynamic info from a log file as columns of numbers -plot two columns of thermodynamic info from a log file using GnuPlot -sort the snapshots in a dump file by atom ID -convert multiple "NEB"_neb.html dump files into one dump file for viz -convert dump files into XYZ, CFG, or PDB format for viz by other packages :ul - -These are simple scripts built on "Pizza.py"_pizza modules. See the -README for more info on Pizza.py and how to use these scripts. - -:line - -reax tool :h3,link(reax_tool) - -The reax sub-directory contains stand-alond codes that can -post-process the output of the "fix reax/bonds"_fix_reax_bonds.html -command from a LAMMPS simulation using "ReaxFF"_pair_reax.html. See -the README.txt file for more info. - -These tools were written by Aidan Thompson at Sandia. - -:line - -smd tool :h3,link(smd) - -The smd sub-directory contains a C++ file dump2vtk_tris.cpp and -Makefile which can be compiled and used to convert triangle output -files created by the Smooth-Mach Dynamics (USER-SMD) package into a -VTK-compatible unstructured grid file. It could then be read in and -visualized by VTK. - -See the header of dump2vtk.cpp for more details. - -This tool was written by the USER-SMD package author, Georg -Ganzenmuller at the Fraunhofer-Institute for High-Speed Dynamics, -Ernst Mach Institute in Germany (georg.ganzenmueller at emi.fhg.de). - -:line - -vim tool :h3,link(vim) - -The files in the tools/vim directory are add-ons to the VIM editor -that allow easier editing of LAMMPS input scripts. See the README.txt -file for details. - -These files were provided by Gerolf Ziegenhain (gerolf at -ziegenhain.com) - -:line - -xmgrace tool :h3,link(xmgrace) - -The files in the tools/xmgrace directory can be used to plot the -thermodynamic data in LAMMPS log files via the xmgrace plotting -package. There are several tools in the directory that can be used in -post-processing mode. The lammpsplot.cpp file can be compiled and -used to create plots from the current state of a running LAMMPS -simulation. - -See the README file for details. - -These files were provided by Vikas Varshney (vv0210 at gmail.com) - From 8385f5666bef66882a3d5d7aebd41593db0e6900 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Tue, 24 Jul 2018 14:43:48 -0600 Subject: [PATCH 076/123] link changes for new Tools.html --- doc/src/Section_howto.txt | 18 +++++++++--------- doc/src/Section_intro.txt | 18 +++++++++--------- doc/src/Section_modify.txt | 4 ++-- doc/src/Section_perf.txt | 4 +++- doc/src/dump.txt | 18 +++++++++--------- 5 files changed, 32 insertions(+), 30 deletions(-) diff --git a/doc/src/Section_howto.txt b/doc/src/Section_howto.txt index 2784858f02..a46b29c73b 100644 --- a/doc/src/Section_howto.txt +++ b/doc/src/Section_howto.txt @@ -188,9 +188,9 @@ used in the CHARMM, AMBER, and DREIDING force fields. Setting coefficients is done in the input data file via the "read_data"_read_data.html command or in the input script with commands like "pair_coeff"_pair_coeff.html or -"bond_coeff"_bond_coeff.html. See "Section 9"_Section_tools.html -for additional tools that can use CHARMM or AMBER to assign force -field coefficients and convert their output into LAMMPS input. +"bond_coeff"_bond_coeff.html. See the "Tools"_Tools.html doc page for +additional tools that can use CHARMM or AMBER to assign force field +coefficients and convert their output into LAMMPS input. See "(MacKerell)"_#howto-MacKerell for a description of the CHARMM force field. See "(Cornell)"_#howto-Cornell for a description of the AMBER force @@ -762,12 +762,12 @@ simulations can be visualized (and analyzed) in a variety of ways. LAMMPS snapshots are created by the "dump"_dump.html command which can create files in several formats. The native LAMMPS dump format is a text file (see "dump atom" or "dump custom") which can be visualized -by several popular visualization tools. The "dump image"_dump_image.html -and "dump movie"_dump_image.html styles can output internally rendered -images and convert a sequence of them to a movie during the MD run. -Several programs included with LAMMPS as auxiliary tools can convert -between LAMMPS format files and other formats. -See the "Section 9"_Section_tools.html doc page for details. +by several popular visualization tools. The "dump +image"_dump_image.html and "dump movie"_dump_image.html styles can +output internally rendered images and convert a sequence of them to a +movie during the MD run. Several programs included with LAMMPS as +auxiliary tools can convert between LAMMPS format files and other +formats. See the "Tools"_Tools.html doc page for details. A Python-based toolkit distributed by our group can read native LAMMPS dump files, including custom dump files with additional columns of diff --git a/doc/src/Section_intro.txt b/doc/src/Section_intro.txt index 67293b2ee3..fd1d702d0b 100644 --- a/doc/src/Section_intro.txt +++ b/doc/src/Section_intro.txt @@ -234,8 +234,8 @@ Multi-replica models :h4 Pre- and post-processing :h4 -Various pre- and post-processing serial tools are packaged -with LAMMPS; see these "doc pages"_Section_tools.html. :ulb,l +Various pre- and post-processing serial tools are packaged with +LAMMPS; see the "Tools"_Tools.html doc page for details. :ulb,l Our group has also written and released a separate toolkit called "Pizza.py"_pizza which provides tools for doing setup, analysis, @@ -296,9 +296,9 @@ visualize your MD simulation plot your output data :ul A few tools for pre- and post-processing tasks are provided as part of -the LAMMPS package; they are described in "this -section"_Section_tools.html. However, many people use other codes or -write their own tools for these tasks. +the LAMMPS package; they are described on the "Tools"_Tools.html doc +page. However, many people use other codes or write their own tools +for these tasks. As noted above, our group has also written and released a separate toolkit called "Pizza.py"_pizza which addresses some of the listed @@ -327,8 +327,8 @@ topology information and hundreds of force-field coefficients must typically be specified. We suggest you use a program like "CHARMM"_charmm or "AMBER"_amber or other molecular builders to setup such problems and dump its information to a file. You can then -reformat the file as LAMMPS input. Some of the tools in "this -section"_Section_tools.html can assist in this process. +reformat the file as LAMMPS input. Some of the tools described on the +"Tools"_Tools.html doc page can assist in this process. Similarly, LAMMPS creates output files in a simple format. Most users post-process these files with their own analysis tools or re-format @@ -442,8 +442,8 @@ directory. :l The tools sub-directory of the LAMMPS distribution has various stand-alone codes for pre- and post-processing of LAMMPS data. More -details are given in "Section 9"_Section_tools.html. If you write -a new tool that users will find useful, it can be added to the LAMMPS +details are given on the "Tools"_Tools.html doc page. If you write a +new tool that users will find useful, it can be added to the LAMMPS distribution. :l LAMMPS is designed to be easy to extend with new code for features diff --git a/doc/src/Section_modify.txt b/doc/src/Section_modify.txt index f1d55758c8..6948ac062a 100644 --- a/doc/src/Section_modify.txt +++ b/doc/src/Section_modify.txt @@ -1,5 +1,5 @@ - "Previous Section"_Section_tools.html - "LAMMPS WWW Site"_lws - -"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next + "Previous Section"_Tools.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Section_python.html :c :link(lws,http://lammps.sandia.gov) diff --git a/doc/src/Section_perf.txt b/doc/src/Section_perf.txt index 9998cb0d9a..56b1d7dd04 100644 --- a/doc/src/Section_perf.txt +++ b/doc/src/Section_perf.txt @@ -1,4 +1,6 @@ -"Previous Section"_Section_example.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Section_tools.html :c +"Previous Section"_Section_example.html - "LAMMPS WWW Site"_lws - +"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next +Section"_Tools.html :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) diff --git a/doc/src/dump.txt b/doc/src/dump.txt index 438ff1d4e0..d130846519 100644 --- a/doc/src/dump.txt +++ b/doc/src/dump.txt @@ -1,4 +1,4 @@ - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c +"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -184,10 +184,10 @@ file and in what format. Settings made via the individual values and the file itself. The {atom}, {local}, and {custom} styles create files in a simple text -format that is self-explanatory when viewing a dump file. Many of the -LAMMPS "post-processing tools"_Section_tools.html, including -"Pizza.py"_http://www.sandia.gov/~sjplimp/pizza.html, work with this -format, as does the "rerun"_rerun.html command. +format that is self-explanatory when viewing a dump file. Some of the +LAMMPS post-processing tools described on the "Tools"_Tools.html doc +page, including "Pizza.py"_http://www.sandia.gov/~sjplimp/pizza.html, +work with this format, as does the "rerun"_rerun.html command. For post-processing purposes the {atom}, {local}, and {custom} text files are self-describing in the following sense. @@ -413,10 +413,10 @@ If the filename ends with ".bin", the dump file (or files, if "*" or will be about the same size as a text version, but will typically write out much faster. Of course, when post-processing, you will need to convert it back to text format (see the "binary2txt -tool"_Section_tools.html#binary) or write your own code to read the -binary file. The format of the binary file can be understood by -looking at the tools/binary2txt.cpp file. This option is only -available for the {atom} and {custom} styles. +tool"_Tools.html#binary) or write your own code to read the binary +file. The format of the binary file can be understood by looking at +the tools/binary2txt.cpp file. This option is only available for the +{atom} and {custom} styles. If the filename ends with ".gz", the dump file (or files, if "*" or "%" is also used) is written in gzipped format. A gzipped dump file will From c3661272f17cbb0b0aed0cfb6bcbe8cb5f365d5c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 24 Jul 2018 19:55:39 -0400 Subject: [PATCH 077/123] re-allow commands after an exception was caught inside a run. after an exception "all bets are off", i.e. the user should be allowed to do anything to recover. through setting Update::whichflag to 0, the guard against running commands during a run is removed. --- src/error.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/error.cpp b/src/error.cpp index d516050385..3feaf1d1ac 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -16,6 +16,7 @@ #include #include "error.h" #include "universe.h" +#include "update.h" #include "output.h" #include "input.h" @@ -69,6 +70,10 @@ void Error::universe_all(const char *file, int line, const char *str) if (universe->ulogfile) fclose(universe->ulogfile); #ifdef LAMMPS_EXCEPTIONS + + // allow commands if an exception was caught in a run + update->whichflag = 0; + char msg[100]; sprintf(msg, "ERROR: %s (%s:%d)\n", str, file, line); throw LAMMPSException(msg); @@ -90,6 +95,10 @@ void Error::universe_one(const char *file, int line, const char *str) universe->me,str,truncpath(file),line); #ifdef LAMMPS_EXCEPTIONS + + // allow commands if an exception was caught in a run + update->whichflag = 0; + char msg[100]; sprintf(msg, "ERROR: %s (%s:%d)\n", str, file, line); throw LAMMPSAbortException(msg, universe->uworld); @@ -137,6 +146,10 @@ void Error::all(const char *file, int line, const char *str) } #ifdef LAMMPS_EXCEPTIONS + + // allow commands if an exception was caught in a run + update->whichflag = 0; + char msg[100]; sprintf(msg, "ERROR: %s (%s:%d)\n", str, file, line); @@ -183,6 +196,10 @@ void Error::one(const char *file, int line, const char *str) universe->me,str,truncpath(file),line); #ifdef LAMMPS_EXCEPTIONS + + // allow commands if an exception was caught in a run + update->whichflag = 0; + char msg[100]; sprintf(msg, "ERROR on proc %d: %s (%s:%d)\n", me, str, file, line); throw LAMMPSAbortException(msg, world); From 678df2498acbf439d1eee9a02070f9a2956f49c9 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 25 Jul 2018 09:32:02 -0400 Subject: [PATCH 078/123] Updated lammps.book --- doc/src/lammps.book | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 06f4bf3718..fe8eb13161 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -14,7 +14,7 @@ accelerate_opt.html Section_howto.html Section_example.html Section_perf.html -Section_tools.html +Tools.html Section_modify.html Section_python.html Section_errors.html From 7ac3f08eec6c17c5666bbaa0083a0c8f7569e6ab Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 25 Jul 2018 09:39:18 -0400 Subject: [PATCH 079/123] Fix typo --- doc/src/Tools.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Tools.txt b/doc/src/Tools.txt index 8fc371c4ef..859bb9d50c 100644 --- a/doc/src/Tools.txt +++ b/doc/src/Tools.txt @@ -29,7 +29,7 @@ The last link for "Pizza.py"_pizza is a Python-based tool developed at Sandia which provides tools for doing setup, analysis, plotting, and visualization for LAMMPS simulations. -"link(pizza,http://pizza.sandia.gov) +:link(pizza,http://pizza.sandia.gov) :link(python,http://www.python.org) Additional tools included in the LAMMPS distribution are described on From 80d85841af82b105ea2b6bd5afe35b765dee7df3 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Wed, 25 Jul 2018 08:15:25 -0600 Subject: [PATCH 080/123] one more tweak on a link --- doc/src/Tools.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/Tools.txt b/doc/src/Tools.txt index 859bb9d50c..0674e3cfcc 100644 --- a/doc/src/Tools.txt +++ b/doc/src/Tools.txt @@ -10,7 +10,7 @@ Section"_Modify.html :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) -:link(lc,Commands.html#comm) +:link(lc,Section_commands.html#comm) :line From 22c9258b8e78f74c50ced55c88307d3ed5d55d0b Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Wed, 25 Jul 2018 09:27:13 -0600 Subject: [PATCH 081/123] doc changes for Examples and Modify sections --- doc/src/{Section_example.txt => Examples.txt} | 16 +- doc/src/Manual.txt | 39 +- doc/src/Modify.txt | 76 ++ doc/src/Modify_atom.txt | 90 ++ doc/src/Modify_body.txt | 35 + doc/src/Modify_bond.txt | 33 + doc/src/Modify_command.txt | 27 + doc/src/Modify_compute.txt | 49 ++ doc/src/Modify_contribute.txt | 210 +++++ doc/src/Modify_dump.txt | 35 + doc/src/Modify_fix.txt | 107 +++ doc/src/Modify_kspace.txt | 25 + doc/src/Modify_min.txt | 23 + doc/src/Modify_overview.txt | 101 +++ doc/src/Modify_pair.txt | 33 + doc/src/Modify_region.txt | 25 + doc/src/Modify_thermo.txt | 35 + doc/src/Modify_variable.txt | 46 + doc/src/Section_commands.txt | 8 +- doc/src/Section_howto.txt | 35 +- doc/src/Section_intro.txt | 17 +- doc/src/Section_modify.txt | 827 ------------------ doc/src/Section_packages.txt | 3 +- doc/src/Section_perf.txt | 6 +- doc/src/Section_python.txt | 4 +- doc/src/Tools.txt | 4 +- doc/src/atom_style.txt | 2 +- doc/src/body.txt | 4 +- doc/src/compute.txt | 4 +- doc/src/compute_chunk_atom.txt | 4 +- doc/src/compute_global_atom.txt | 8 +- doc/src/compute_reduce.txt | 8 +- doc/src/compute_slice.txt | 4 +- doc/src/dump.txt | 6 +- doc/src/dump_image.txt | 6 +- doc/src/fix.txt | 6 +- doc/src/fix_ave_atom.txt | 6 +- doc/src/fix_ave_chunk.txt | 4 +- doc/src/fix_ave_correlate.txt | 4 +- doc/src/fix_ave_histo.txt | 12 +- doc/src/fix_ave_time.txt | 4 +- doc/src/fix_controller.txt | 4 +- doc/src/fix_property_atom.txt | 6 +- doc/src/fix_vector.txt | 4 +- doc/src/lammps.book | 4 +- doc/src/run.txt | 5 +- doc/src/thermo_style.txt | 11 +- doc/src/tutorial_github.txt | 4 +- 48 files changed, 1063 insertions(+), 966 deletions(-) rename doc/src/{Section_example.txt => Examples.txt} (94%) create mode 100644 doc/src/Modify.txt create mode 100644 doc/src/Modify_atom.txt create mode 100644 doc/src/Modify_body.txt create mode 100644 doc/src/Modify_bond.txt create mode 100644 doc/src/Modify_command.txt create mode 100644 doc/src/Modify_compute.txt create mode 100644 doc/src/Modify_contribute.txt create mode 100644 doc/src/Modify_dump.txt create mode 100644 doc/src/Modify_fix.txt create mode 100644 doc/src/Modify_kspace.txt create mode 100644 doc/src/Modify_min.txt create mode 100644 doc/src/Modify_overview.txt create mode 100644 doc/src/Modify_pair.txt create mode 100644 doc/src/Modify_region.txt create mode 100644 doc/src/Modify_thermo.txt create mode 100644 doc/src/Modify_variable.txt delete mode 100644 doc/src/Section_modify.txt diff --git a/doc/src/Section_example.txt b/doc/src/Examples.txt similarity index 94% rename from doc/src/Section_example.txt rename to doc/src/Examples.txt index a2a9940f48..4935c96257 100644 --- a/doc/src/Section_example.txt +++ b/doc/src/Examples.txt @@ -1,4 +1,12 @@ -"Previous Section"_Section_howto.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Section_perf.html :c +"Previous Section"_Section_howto.html - "LAMMPS WWW Site"_lws - +"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next +Section"_Section_perf.html :c + + :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -6,7 +14,7 @@ :line -7. Example problems :h2 +Example scripts :h3 The LAMMPS distribution includes an examples sub-directory with many sample problems. Many are 2d models that run quickly are are @@ -46,7 +54,7 @@ Lists of both kinds of directories are given below. :line -Lowercase directories :h3 +Lowercase directories :h4 accelerate: run with various acceleration options (OpenMP, GPU, Phi) airebo: polyethylene with AIREBO potential @@ -122,7 +130,7 @@ browser. :line -Uppercase directories :h3 +Uppercase directories :h4 ASPHERE: various aspherical particle models, using ellipsoids, rigid bodies, line/triangle particles, etc COUPLE: examples of how to use LAMMPS as a library diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index d6d46570c1..18ae1c4b61 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -114,10 +114,10 @@ it gives quick access to documentation for all LAMMPS commands. Section_packages Section_accelerate Section_howto - Section_example + Examples Section_perf Tools - Section_modify + Modify Section_python Section_errors Section_history @@ -208,25 +208,10 @@ END_RST --> 6.25 "Polarizable models"_howto_25 :b 6.26 "Adiabatic core/shell model"_howto_26 :b 6.27 "Drude induced dipoles"_howto_27 :ule,b -"Example problems"_Section_example.html :l +"Example scripts"_Examples.html :l "Performance & scalability"_Section_perf.html :l "Auxiliary tools"_Tools.html :l -"Modifying & extending LAMMPS"_Section_modify.html :l - 10.1 "Atom styles"_mod_1 :ulb,b - 10.2 "Bond, angle, dihedral, improper potentials"_mod_2 :b - 10.3 "Compute styles"_mod_3 :b - 10.4 "Dump styles"_mod_4 :b - 10.5 "Dump custom output options"_mod_5 :b - 10.6 "Fix styles"_mod_6 :b - 10.7 "Input script commands"_mod_7 :b - 10.8 "Kspace computations"_mod_8 :b - 10.9 "Minimization styles"_mod_9 :b - 10.10 "Pairwise potentials"_mod_10 :b - 10.11 "Region styles"_mod_11 :b - 10.12 "Body styles"_mod_12 :b - 10.13 "Thermodynamic output options"_mod_13 :b - 10.14 "Variable options"_mod_14 :b - 10.15 "Submitting new features for inclusion in LAMMPS"_mod_15 :ule,b +"Modify & extend LAMMPS"_Modify.html :l "Python interface"_Section_python.html :l 11.1 "Overview of running LAMMPS from Python"_py_1 :ulb,b 11.2 "Overview of using Python from a LAMMPS script"_py_2 :b @@ -302,22 +287,6 @@ END_RST --> :link(howto_26,Section_howto.html#howto_26) :link(howto_27,Section_howto.html#howto_27) -:link(mod_1,Section_modify.html#mod_1) -:link(mod_2,Section_modify.html#mod_2) -:link(mod_3,Section_modify.html#mod_3) -:link(mod_4,Section_modify.html#mod_4) -:link(mod_5,Section_modify.html#mod_5) -:link(mod_6,Section_modify.html#mod_6) -:link(mod_7,Section_modify.html#mod_7) -:link(mod_8,Section_modify.html#mod_8) -:link(mod_9,Section_modify.html#mod_9) -:link(mod_10,Section_modify.html#mod_10) -:link(mod_11,Section_modify.html#mod_11) -:link(mod_12,Section_modify.html#mod_12) -:link(mod_13,Section_modify.html#mod_13) -:link(mod_14,Section_modify.html#mod_14) -:link(mod_15,Section_modify.html#mod_15) - :link(py_1,Section_python.html#py_1) :link(py_2,Section_python.html#py_2) :link(py_3,Section_python.html#py_3) diff --git a/doc/src/Modify.txt b/doc/src/Modify.txt new file mode 100644 index 0000000000..f7d94c89e9 --- /dev/null +++ b/doc/src/Modify.txt @@ -0,0 +1,76 @@ +"Previous Section"_Tools.html - "LAMMPS WWW Site"_lws - +"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next +Section"_Section_python.html :c + + + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Modify & extend LAMMPS :h3 + +LAMMPS is designed in a modular fashion so as to be easy to modify and +extend with new functionality. In fact, about 95% of its source code +is add-on files. These doc pages give basic instructions on how to do +this. + +If you add a new feature to LAMMPS and think it will be of interest to +general users, we encourage you to submit it for inclusion in LAMMPS +as a pull request on our "GitHub +site"_https://github.com/lammps/lammps, after reading the "Modify +contribute"_Modify_contribute.html doc page. + + + + + +"Overview"_Modify_overview.html +"Submitting new features for inclusion in LAMMPS"_Modify_contribute.html :all(b) + +"Atom styles"_Modify_atom.html +"Pair styles"_Modify_pair.html +"Bond, angle, dihedral, improper styles"_Modify_bond.html +"Compute styles"_Modify_compute.html +"Fix styles"_Modify_fix.html +"Input script command styles"_Modify_command.html :all(b) + +"Dump styles"_Modify_dump.html +"Kspace styles"_Modify_kspace.html +"Minimization styles"_Modify_min.html +"Region styles"_Modify_region.html +"Body styles"_Modify_body.html :all(b) + +"Thermodynamic output options"_Modify_thermo.html +"Variable options"_Modify_variable.html :all(b) + + diff --git a/doc/src/Modify_atom.txt b/doc/src/Modify_atom.txt new file mode 100644 index 0000000000..afa1c319d2 --- /dev/null +++ b/doc/src/Modify_atom.txt @@ -0,0 +1,90 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Atom styles :h3 + +Classes that define an "atom style"_atom_style.html are derived from +the AtomVec class and managed by the Atom class. The atom style +determines what attributes are associated with an atom. A new atom +style can be created if one of the existing atom styles does not +define all the attributes you need to store and communicate with +atoms. + +Atom_vec_atomic.cpp is a simple example of an atom style. + +Here is a brief description of methods you define in your new derived +class. See atom_vec.h for details. + +init: one time setup (optional) +grow: re-allocate atom arrays to longer lengths (required) +grow_reset: make array pointers in Atom and AtomVec classes consistent (required) +copy: copy info for one atom to another atom's array locations (required) +pack_comm: store an atom's info in a buffer communicated every timestep (required) +pack_comm_vel: add velocity info to communication buffer (required) +pack_comm_hybrid: store extra info unique to this atom style (optional) +unpack_comm: retrieve an atom's info from the buffer (required) +unpack_comm_vel: also retrieve velocity info (required) +unpack_comm_hybrid: retrieve extra info unique to this atom style (optional) +pack_reverse: store an atom's info in a buffer communicating partial forces (required) +pack_reverse_hybrid: store extra info unique to this atom style (optional) +unpack_reverse: retrieve an atom's info from the buffer (required) +unpack_reverse_hybrid: retrieve extra info unique to this atom style (optional) +pack_border: store an atom's info in a buffer communicated on neighbor re-builds (required) +pack_border_vel: add velocity info to buffer (required) +pack_border_hybrid: store extra info unique to this atom style (optional) +unpack_border: retrieve an atom's info from the buffer (required) +unpack_border_vel: also retrieve velocity info (required) +unpack_border_hybrid: retrieve extra info unique to this atom style (optional) +pack_exchange: store all an atom's info to migrate to another processor (required) +unpack_exchange: retrieve an atom's info from the buffer (required) +size_restart: number of restart quantities associated with proc's atoms (required) +pack_restart: pack atom quantities into a buffer (required) +unpack_restart: unpack atom quantities from a buffer (required) +create_atom: create an individual atom of this style (required) +data_atom: parse an atom line from the data file (required) +data_atom_hybrid: parse additional atom info unique to this atom style (optional) +data_vel: parse one line of velocity information from data file (optional) +data_vel_hybrid: parse additional velocity data unique to this atom style (optional) +memory_usage: tally memory allocated by atom arrays (required) :tb(s=:) + +The constructor of the derived class sets values for several variables +that you must set when defining a new atom style, which are documented +in atom_vec.h. New atom arrays are defined in atom.cpp. Search for +the word "customize" and you will find locations you will need to +modify. + +NOTE: It is possible to add some attributes, such as a molecule ID, to +atom styles that do not have them via the "fix +property/atom"_fix_property_atom.html command. This command also +allows new custom attributes consisting of extra integer or +floating-point values to be added to atoms. See the "fix +property/atom"_fix_property_atom.html doc page for examples of cases +where this is useful and details on how to initialize, access, and +output the custom values. + +New "pair styles"_pair_style.html, "fixes"_fix.html, or +"computes"_compute.html can be added to LAMMPS, as discussed below. +The code for these classes can use the per-atom properties defined by +fix property/atom. The Atom class has a find_custom() method that is +useful in this context: + +int index = atom->find_custom(char *name, int &flag); :pre + +The "name" of a custom attribute, as specified in the "fix +property/atom"_fix_property_atom.html command, is checked to verify +that it exists and its index is returned. The method also sets flag = +0/1 depending on whether it is an integer or floating-point attribute. +The vector of values associated with the attribute can then be +accessed using the returned index as + +int *ivector = atom->ivector\[index\]; +double *dvector = atom->dvector\[index\]; :pre + +Ivector or dvector are vectors of length Nlocal = # of owned atoms, +which store the attributes of individual atoms. diff --git a/doc/src/Modify_body.txt b/doc/src/Modify_body.txt new file mode 100644 index 0000000000..b1dc8130cd --- /dev/null +++ b/doc/src/Modify_body.txt @@ -0,0 +1,35 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Body styles :h3 + +Classes that define body particles are derived from the Body class. +Body particles can represent complex entities, such as surface meshes +of discrete points, collections of sub-particles, deformable objects, +etc. + +See "Section 6.14"_Section_howto.html#howto_14 of the manual for +an overview of using body particles and the "body"_body.html doc page +for details on the various body styles LAMMPS supports. New styles +can be created to add new kinds of body particles to LAMMPS. + +Body_nparticle.cpp is an example of a body particle that is treated as +a rigid body containing N sub-particles. + +Here is a brief description of methods you define in your new derived +class. See body.h for details. + +data_body: process a line from the Bodies section of a data file +noutrow: number of sub-particles output is generated for +noutcol: number of values per-sub-particle output is generated for +output: output values for the Mth sub-particle +pack_comm_body: body attributes to communicate every timestep +unpack_comm_body: unpacking of those attributes +pack_border_body: body attributes to communicate when reneighboring is done +unpack_border_body: unpacking of those attributes :tb(s=:) diff --git a/doc/src/Modify_bond.txt b/doc/src/Modify_bond.txt new file mode 100644 index 0000000000..f0828a0c3b --- /dev/null +++ b/doc/src/Modify_bond.txt @@ -0,0 +1,33 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Bond, angle, dihedral, improper styles :h3 + +Classes that compute molecular interactions are derived from the Bond, +Angle, Dihedral, and Improper classes. New styles can be created to +add new potentials to LAMMPS. + +Bond_harmonic.cpp is the simplest example of a bond style. Ditto for +the harmonic forms of the angle, dihedral, and improper style +commands. + +Here is a brief description of common methods you define in your +new derived class. See bond.h, angle.h, dihedral.h, and improper.h +for details and specific additional methods. + +init: check if all coefficients are set, calls {init_style} (optional) +init_style: check if style specific conditions are met (optional) +compute: compute the molecular interactions (required) +settings: apply global settings for all types (optional) +coeff: set coefficients for one type (required) +equilibrium_distance: length of bond, used by SHAKE (required, bond only) +equilibrium_angle: opening of angle, used by SHAKE (required, angle only) +write & read_restart: writes/reads coeffs to restart files (required) +single: force and energy of a single bond or angle (required, bond or angle only) +memory_usage: tally memory allocated by the style (optional) :tb(s=:) diff --git a/doc/src/Modify_command.txt b/doc/src/Modify_command.txt new file mode 100644 index 0000000000..6fc9aad1fc --- /dev/null +++ b/doc/src/Modify_command.txt @@ -0,0 +1,27 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Input script command style :h3 + +New commands can be added to LAMMPS input scripts by adding new +classes that have a "command" method. For example, the create_atoms, +read_data, velocity, and run commands are all implemented in this +fashion. When such a command is encountered in the LAMMPS input +script, LAMMPS simply creates a class with the corresponding name, +invokes the "command" method of the class, and passes it the arguments +from the input script. The command method can perform whatever +operations it wishes on LAMMPS data structures. + +The single method your new class must define is as follows: + +command: operations performed by the new command :tb(s=:) + +Of course, the new class can define other methods and variables as +needed. + diff --git a/doc/src/Modify_compute.txt b/doc/src/Modify_compute.txt new file mode 100644 index 0000000000..b02b8a983e --- /dev/null +++ b/doc/src/Modify_compute.txt @@ -0,0 +1,49 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Compute styles :h3 + +Classes that compute scalar and vector quantities like temperature +and the pressure tensor, as well as classes that compute per-atom +quantities like kinetic energy and the centro-symmetry parameter +are derived from the Compute class. New styles can be created +to add new calculations to LAMMPS. + +Compute_temp.cpp is a simple example of computing a scalar +temperature. Compute_ke_atom.cpp is a simple example of computing +per-atom kinetic energy. + +Here is a brief description of methods you define in your new derived +class. See compute.h for details. + +init: perform one time setup (required) +init_list: neighbor list setup, if needed (optional) +compute_scalar: compute a scalar quantity (optional) +compute_vector: compute a vector of quantities (optional) +compute_peratom: compute one or more quantities per atom (optional) +compute_local: compute one or more quantities per processor (optional) +pack_comm: pack a buffer with items to communicate (optional) +unpack_comm: unpack the buffer (optional) +pack_reverse: pack a buffer with items to reverse communicate (optional) +unpack_reverse: unpack the buffer (optional) +remove_bias: remove velocity bias from one atom (optional) +remove_bias_all: remove velocity bias from all atoms in group (optional) +restore_bias: restore velocity bias for one atom after remove_bias (optional) +restore_bias_all: same as before, but for all atoms in group (optional) +pair_tally_callback: callback function for {tally}-style computes (optional). +memory_usage: tally memory usage (optional) :tb(s=:) + +Tally-style computes are a special case, as their computation is done +in two stages: the callback function is registered with the pair style +and then called from the Pair::ev_tally() function, which is called for +each pair after force and energy has been computed for this pair. Then +the tallied values are retrieved with the standard compute_scalar or +compute_vector or compute_peratom methods. The USER-TALLY package +provides {examples}_compute_tally.html for utilizing this mechanism. + diff --git a/doc/src/Modify_contribute.txt b/doc/src/Modify_contribute.txt new file mode 100644 index 0000000000..80795b5e20 --- /dev/null +++ b/doc/src/Modify_contribute.txt @@ -0,0 +1,210 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Submitting new features for inclusion in LAMMPS :h3 + +We encourage users to submit new features or modifications for LAMMPS +to "the core developers"_http://lammps.sandia.gov/authors.html so they +can be added to the LAMMPS distribution. The preferred way to manage +and coordinate this is as of Fall 2016 via the LAMMPS project on +"GitHub"_https://github.com/lammps/lammps. An alternative is to +contact the LAMMPS developers or the indicated developer of a package +or feature directly and send in your contribution via e-mail. + +For any larger modifications or programming project, you are +encouraged to contact the LAMMPS developers ahead of time, in order to +discuss implementation strategies and coding guidelines, that will +make it easier to integrate your contribution and result in less work +for everybody involved. You are also encouraged to search through the +list of "open issues on +GitHub"_https://github.com/lammps/lammps/issues and submit a new issue +for a planned feature, so you would not duplicate the work of others +(and possibly get scooped by them) or have your work duplicated by +others. + +How quickly your contribution will be integrated depends largely on +how much effort it will cause to integrate and test it, how much it +requires changes to the core codebase, and of how much interest it is +to the larger LAMMPS community. Please see below for a checklist of +typical requirements. Once you have prepared everything, see "this +tutorial"_tutorial_github.html for instructions on how to submit your +changes or new files through a GitHub pull request. If you prefer to +submit patches or full files, you should first make certain, that your +code works correctly with the latest patch-level version of LAMMPS and +contains all bugfixes from it. Then create a gzipped tar file of all +changed or added files or a corresponding patch file using 'diff -u' +or 'diff -c' and compress it with gzip. Please only use gzip +compression, as this works well on all platforms. + +If the new features/files are broadly useful we may add them as core +files to LAMMPS or as part of a "standard +package"_Section_start.html#start_3. Else we will add them as a +user-contributed file or package. Examples of user packages are in +src sub-directories that start with USER. The USER-MISC package is +simply a collection of (mostly) unrelated single files, which is the +simplest way to have your contribution quickly added to the LAMMPS +distribution. You can see a list of the both standard and user +packages by typing "make package" in the LAMMPS src directory. + +Note that by providing us files to release, you are agreeing to make +them open-source, i.e. we can release them under the terms of the GPL, +used as a license for the rest of LAMMPS. See "Section +1.4"_Section_intro.html#intro_4 for details. + +With user packages and files, all we are really providing (aside from +the fame and fortune that accompanies having your name in the source +code and on the "Authors page"_http://lammps.sandia.gov/authors.html +of the "LAMMPS WWW site"_lws), is a means for you to distribute your +work to the LAMMPS user community, and a mechanism for others to +easily try out your new feature. This may help you find bugs or make +contact with new collaborators. Note that you're also implicitly +agreeing to support your code which means answer questions, fix bugs, +and maintain it if LAMMPS changes in some way that breaks it (an +unusual event). + +NOTE: If you prefer to actively develop and support your add-on +feature yourself, then you may wish to make it available for download +from your own website, as a user package that LAMMPS users can add to +their copy of LAMMPS. See the "Offsite LAMMPS packages and +tools"_http://lammps.sandia.gov/offsite.html page of the LAMMPS web +site for examples of groups that do this. We are happy to advertise +your package and web site from that page. Simply email the +"developers"_http://lammps.sandia.gov/authors.html with info about +your package and we will post it there. + +The previous sections of this doc page describe how to add new "style" +files of various kinds to LAMMPS. Packages are simply collections of +one or more new class files which are invoked as a new style within a +LAMMPS input script. If designed correctly, these additions typically +do not require changes to the main core of LAMMPS; they are simply +add-on files. If you think your new feature requires non-trivial +changes in core LAMMPS files, you'll need to "communicate with the +developers"_http://lammps.sandia.gov/authors.html, since we may or may +not want to make those changes. An example of a trivial change is +making a parent-class method "virtual" when you derive a new child +class from it. + +Here is a checklist of steps you need to follow to submit a single file +or user package for our consideration. Following these steps will save +both you and us time. See existing files in packages in the src dir for +examples. If you are uncertain, please ask. + +All source files you provide must compile with the most current +version of LAMMPS with multiple configurations. In particular you +need to test compiling LAMMPS from scratch with -DLAMMPS_BIGBIG +set in addition to the default -DLAMMPS_SMALLBIG setting. Your code +will need to work correctly in serial and in parallel using MPI. :ulb,l + +For consistency with the rest of LAMMPS and especially, if you want +your contribution(s) to be added to main LAMMPS code or one of its +standard packages, it needs to be written in a style compatible with +other LAMMPS source files. This means: 2-character indentation per +level, [no tabs], no lines over 80 characters. I/O is done via +the C-style stdio library, class header files should not import any +system headers outside , STL containers should be avoided +in headers, and forward declarations used where possible or needed. +All added code should be placed into the LAMMPS_NS namespace or a +sub-namespace; global or static variables should be avoided, as they +conflict with the modular nature of LAMMPS and the C++ class structure. +Header files must [not] import namespaces with {using}. +This all is so the developers can more easily understand, integrate, +and maintain your contribution and reduce conflicts with other parts +of LAMMPS. This basically means that the code accesses data +structures, performs its operations, and is formatted similar to other +LAMMPS source files, including the use of the error class for error +and warning messages. :l + +If you want your contribution to be added as a user-contributed +feature, and it's a single file (actually a *.cpp and *.h file) it can +rapidly be added to the USER-MISC directory. Send us the one-line +entry to add to the USER-MISC/README file in that dir, along with the +2 source files. You can do this multiple times if you wish to +contribute several individual features. :l + +If you want your contribution to be added as a user-contribution and +it is several related features, it is probably best to make it a user +package directory with a name like USER-FOO. In addition to your new +files, the directory should contain a README text file. The README +should contain your name and contact information and a brief +description of what your new package does. If your files depend on +other LAMMPS style files also being installed (e.g. because your file +is a derived class from the other LAMMPS class), then an Install.sh +file is also needed to check for those dependencies. See other README +and Install.sh files in other USER directories as examples. Send us a +tarball of this USER-FOO directory. :l + +Your new source files need to have the LAMMPS copyright, GPL notice, +and your name and email address at the top, like other +user-contributed LAMMPS source files. They need to create a class +that is inside the LAMMPS namespace. If the file is for one of the + +USER packages, including USER-MISC, then we are not as picky about the +coding style (see above). I.e. the files do not need to be in the +same stylistic format and syntax as other LAMMPS files, though that +would be nice for developers as well as users who try to read your +code. :l + +You [must] also create a [documentation] file for each new command or +style you are adding to LAMMPS. For simplicity and convenience, the +documentation of groups of closely related commands or styles may be +combined into a single file. This will be one file for a single-file +feature. For a package, it might be several files. These are simple +text files with a specific markup language, that are then auto-converted +to HTML and PDF. The tools for this conversion are included in the +source distribution, and the translation can be as simple as doing +"make html pdf" in the doc folder. +Thus the documentation source files must be in the same format and +style as other *.txt files in the lammps/doc/src directory for similar +commands and styles; use one or more of them as a starting point. +A description of the markup can also be found in +lammps/doc/utils/txt2html/README.html +As appropriate, the text files can include links to equations +(see doc/Eqs/*.tex for examples, we auto-create the associated JPG +files), or figures (see doc/JPG for examples), or even additional PDF +files with further details (see doc/PDF for examples). The doc page +should also include literature citations as appropriate; see the +bottom of doc/fix_nh.txt for examples and the earlier part of the same +file for how to format the cite itself. The "Restrictions" section of +the doc page should indicate that your command is only available if +LAMMPS is built with the appropriate USER-MISC or USER-FOO package. +See other user package doc files for examples of how to do this. The +prerequisite for building the HTML format files are Python 3.x and +virtualenv, the requirement for generating the PDF format manual +is the "htmldoc"_http://www.htmldoc.org/ software. Please run at least +"make html" and carefully inspect and proofread the resulting HTML format +doc page before submitting your code. :l + +For a new package (or even a single command) you should include one or +more example scripts demonstrating its use. These should run in no +more than a couple minutes, even on a single processor, and not require +large data files as input. See directories under examples/USER for +examples of input scripts other users provided for their packages. +These example inputs are also required for validating memory accesses +and testing for memory leaks with valgrind :l + +If there is a paper of yours describing your feature (either the +algorithm/science behind the feature itself, or its initial usage, or +its implementation in LAMMPS), you can add the citation to the *.cpp +source file. See src/USER-EFF/atom_vec_electron.cpp for an example. +A LaTeX citation is stored in a variable at the top of the file and a +single line of code that references the variable is added to the +constructor of the class. Whenever a user invokes your feature from +their input script, this will cause LAMMPS to output the citation to a +log.cite file and prompt the user to examine the file. Note that you +should only use this for a paper you or your group authored. +E.g. adding a cite in the code for a paper by Nose and Hoover if you +write a fix that implements their integrator is not the intended +usage. That kind of citation should just be in the doc page you +provide. :l +:ule + +Finally, as a general rule-of-thumb, the more clear and +self-explanatory you make your documentation and README files, and the +easier you make it for people to get started, e.g. by providing example +scripts, the more likely it is that users will try out your new feature. diff --git a/doc/src/Modify_dump.txt b/doc/src/Modify_dump.txt new file mode 100644 index 0000000000..9667a1b1fc --- /dev/null +++ b/doc/src/Modify_dump.txt @@ -0,0 +1,35 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Dump styles :h2 + +Classes that dump per-atom info to files are derived from the Dump +class. To dump new quantities or in a new format, a new derived dump +class can be added, but it is typically simpler to modify the +DumpCustom class contained in the dump_custom.cpp file. + +Dump_atom.cpp is a simple example of a derived dump class. + +Here is a brief description of methods you define in your new derived +class. See dump.h for details. + +write_header: write the header section of a snapshot of atoms +count: count the number of lines a processor will output +pack: pack a proc's output data into a buffer +write_data: write a proc's data to a file :tb(s=:) + +See the "dump"_dump.html command and its {custom} style for a list of +keywords for atom information that can already be dumped by +DumpCustom. It includes options to dump per-atom info from Compute +classes, so adding a new derived Compute class is one way to calculate +new quantities to dump. + +Note that new keywords for atom properties are not typically +added to the "dump custom"_dump.html command. Instead they are added +to the "compute property/atom"_compute_property_atom.html command. diff --git a/doc/src/Modify_fix.txt b/doc/src/Modify_fix.txt new file mode 100644 index 0000000000..ba985475cc --- /dev/null +++ b/doc/src/Modify_fix.txt @@ -0,0 +1,107 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Fix styles :h3 + +In LAMMPS, a "fix" is any operation that is computed during +timestepping that alters some property of the system. Essentially +everything that happens during a simulation besides force computation, +neighbor list construction, and output, is a "fix". This includes +time integration (update of coordinates and velocities), force +constraints or boundary conditions (SHAKE or walls), and diagnostics +(compute a diffusion coefficient). New styles can be created to add +new options to LAMMPS. + +Fix_setforce.cpp is a simple example of setting forces on atoms to +prescribed values. There are dozens of fix options already in LAMMPS; +choose one as a template that is similar to what you want to +implement. + +Here is a brief description of methods you can define in your new +derived class. See fix.h for details. + +setmask: determines when the fix is called during the timestep (required) +init: initialization before a run (optional) +setup_pre_exchange: called before atom exchange in setup (optional) +setup_pre_force: called before force computation in setup (optional) +setup: called immediately before the 1st timestep and after forces are computed (optional) +min_setup_pre_force: like setup_pre_force, but for minimizations instead of MD runs (optional) +min_setup: like setup, but for minimizations instead of MD runs (optional) +initial_integrate: called at very beginning of each timestep (optional) +pre_exchange: called before atom exchange on re-neighboring steps (optional) +pre_neighbor: called before neighbor list build (optional) +pre_force: called before pair & molecular forces are computed (optional) +post_force: called after pair & molecular forces are computed and communicated (optional) +final_integrate: called at end of each timestep (optional) +end_of_step: called at very end of timestep (optional) +write_restart: dumps fix info to restart file (optional) +restart: uses info from restart file to re-initialize the fix (optional) +grow_arrays: allocate memory for atom-based arrays used by fix (optional) +copy_arrays: copy atom info when an atom migrates to a new processor (optional) +pack_exchange: store atom's data in a buffer (optional) +unpack_exchange: retrieve atom's data from a buffer (optional) +pack_restart: store atom's data for writing to restart file (optional) +unpack_restart: retrieve atom's data from a restart file buffer (optional) +size_restart: size of atom's data (optional) +maxsize_restart: max size of atom's data (optional) +setup_pre_force_respa: same as setup_pre_force, but for rRESPA (optional) +initial_integrate_respa: same as initial_integrate, but for rRESPA (optional) +post_integrate_respa: called after the first half integration step is done in rRESPA (optional) +pre_force_respa: same as pre_force, but for rRESPA (optional) +post_force_respa: same as post_force, but for rRESPA (optional) +final_integrate_respa: same as final_integrate, but for rRESPA (optional) +min_pre_force: called after pair & molecular forces are computed in minimizer (optional) +min_post_force: called after pair & molecular forces are computed and communicated in minimizer (optional) +min_store: store extra data for linesearch based minimization on a LIFO stack (optional) +min_pushstore: push the minimization LIFO stack one element down (optional) +min_popstore: pop the minimization LIFO stack one element up (optional) +min_clearstore: clear minimization LIFO stack (optional) +min_step: reset or move forward on line search minimization (optional) +min_dof: report number of degrees of freedom {added} by this fix in minimization (optional) +max_alpha: report maximum allowed step size during linesearch minimization (optional) +pack_comm: pack a buffer to communicate a per-atom quantity (optional) +unpack_comm: unpack a buffer to communicate a per-atom quantity (optional) +pack_reverse_comm: pack a buffer to reverse communicate a per-atom quantity (optional) +unpack_reverse_comm: unpack a buffer to reverse communicate a per-atom quantity (optional) +dof: report number of degrees of freedom {removed} by this fix during MD (optional) +compute_scalar: return a global scalar property that the fix computes (optional) +compute_vector: return a component of a vector property that the fix computes (optional) +compute_array: return a component of an array property that the fix computes (optional) +deform: called when the box size is changed (optional) +reset_target: called when a change of the target temperature is requested during a run (optional) +reset_dt: is called when a change of the time step is requested during a run (optional) +modify_param: called when a fix_modify request is executed (optional) +memory_usage: report memory used by fix (optional) +thermo: compute quantities for thermodynamic output (optional) :tb(s=:) + +Typically, only a small fraction of these methods are defined for a +particular fix. Setmask is mandatory, as it determines when the fix +will be invoked during the timestep. Fixes that perform time +integration ({nve}, {nvt}, {npt}) implement initial_integrate() and +final_integrate() to perform velocity Verlet updates. Fixes that +constrain forces implement post_force(). + +Fixes that perform diagnostics typically implement end_of_step(). For +an end_of_step fix, one of your fix arguments must be the variable +"nevery" which is used to determine when to call the fix and you must +set this variable in the constructor of your fix. By convention, this +is the first argument the fix defines (after the ID, group-ID, style). + +If the fix needs to store information for each atom that persists from +timestep to timestep, it can manage that memory and migrate the info +with the atoms as they move from processors to processor by +implementing the grow_arrays, copy_arrays, pack_exchange, and +unpack_exchange methods. Similarly, the pack_restart and +unpack_restart methods can be implemented to store information about +the fix in restart files. If you wish an integrator or force +constraint fix to work with rRESPA (see the "run_style"_run_style.html +command), the initial_integrate, post_force_integrate, and +final_integrate_respa methods can be implemented. The thermo method +enables a fix to contribute values to thermodynamic output, as printed +quantities and/or to be summed to the potential energy of the system. diff --git a/doc/src/Modify_kspace.txt b/doc/src/Modify_kspace.txt new file mode 100644 index 0000000000..21407bf2e9 --- /dev/null +++ b/doc/src/Modify_kspace.txt @@ -0,0 +1,25 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Kspace styles :h3 + +Classes that compute long-range Coulombic interactions via K-space +representations (Ewald, PPPM) are derived from the KSpace class. New +styles can be created to add new K-space options to LAMMPS. + +Ewald.cpp is an example of computing K-space interactions. + +Here is a brief description of methods you define in your new derived +class. See kspace.h for details. + +init: initialize the calculation before a run +setup: computation before the 1st timestep of a run +compute: every-timestep computation +memory_usage: tally of memory usage :tb(s=:) + diff --git a/doc/src/Modify_min.txt b/doc/src/Modify_min.txt new file mode 100644 index 0000000000..5dcf0f1e67 --- /dev/null +++ b/doc/src/Modify_min.txt @@ -0,0 +1,23 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Minimization styles :h3 + +Classes that perform energy minimization derived from the Min class. +New styles can be created to add new minimization algorithms to +LAMMPS. + +Min_cg.cpp is an example of conjugate gradient minimization. + +Here is a brief description of methods you define in your new derived +class. See min.h for details. + +init: initialize the minimization before a run +run: perform the minimization +memory_usage: tally of memory usage :tb(s=:) diff --git a/doc/src/Modify_overview.txt b/doc/src/Modify_overview.txt new file mode 100644 index 0000000000..f9964d964b --- /dev/null +++ b/doc/src/Modify_overview.txt @@ -0,0 +1,101 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Overview :h3 + +The best way to add a new feature to LAMMPS is to find a similar +featureand look at the corresponding source and header files to figure +out what it does. You will need some knowledge of C++ to be able to +understand the hi-level structure of LAMMPS and its class +organization, but functions (class methods) that do actual +computations are written in vanilla C-style code and operate on simple +C-style data structures (vectors and arrays). + +Most of the new features described on the "Modify"_Modify.html doc +page require you to write a new C++ derived class (except for +exceptions described below, where you can make small edits to existing +files). Creating a new class requires 2 files, a source code file +(*.cpp) and a header file (*.h). The derived class must provide +certain methods to work as a new option. Depending on how different +your new feature is compared to existing features, you can either +derive from the base class itself, or from a derived class that +already exists. Enabling LAMMPS to invoke the new class is as simple +as putting the two source files in the src dir and re-building LAMMPS. + +The advantage of C++ and its object-orientation is that all the code +and variables needed to define the new feature are in the 2 files you +write, and thus shouldn't make the rest of LAMMPS more complex or +cause side-effect bugs. + +Here is a concrete example. Suppose you write 2 files pair_foo.cpp +and pair_foo.h that define a new class PairFoo that computes pairwise +potentials described in the classic 1997 "paper"_#Foo by Foo, et al. +If you wish to invoke those potentials in a LAMMPS input script with a +command like + +pair_style foo 0.1 3.5 :pre + +then your pair_foo.h file should be structured as follows: + +#ifdef PAIR_CLASS +PairStyle(foo,PairFoo) +#else +... +(class definition for PairFoo) +... +#endif :pre + +where "foo" is the style keyword in the pair_style command, and +PairFoo is the class name defined in your pair_foo.cpp and pair_foo.h +files. + +When you re-build LAMMPS, your new pairwise potential becomes part of +the executable and can be invoked with a pair_style command like the +example above. Arguments like 0.1 and 3.5 can be defined and +processed by your new class. + +As illustrated by this pairwise example, many kinds of options are +referred to in the LAMMPS documentation as the "style" of a particular +command. + +The "Modify page"_Modify.html lists all the common styles in LAMMPS, +and discusses the header file for the base class that these styles are +derived from. Public variables in that file are ones used and set by +the derived classes which are also used by the base class. Sometimes +they are also used by the rest of LAMMPS. Virtual functions in the +base class header file which are set = 0 are ones you must define in +your new derived class to give it the functionality LAMMPS expects. +Virtual functions that are not set to 0 are functions you can +optionally define. + +Additionally, new output options can be added directly to the +thermo.cpp, dump_custom.cpp, and variable.cpp files. These are also +listed on the "Modify page"_Modify.html. + +Here are additional guidelines for modifying LAMMPS and adding new +functionality: + +Think about whether what you want to do would be better as a pre- or +post-processing step. Many computations are more easily and more +quickly done that way. :ulb,l + +Don't do anything within the timestepping of a run that isn't +parallel. E.g. don't accumulate a bunch of data on a single processor +and analyze it. You run the risk of seriously degrading the parallel +efficiency. :l + +If your new feature reads arguments or writes output, make sure you +follow the unit conventions discussed by the "units"_units.html +command. :l +:ule + +:line + +:link(Foo) +[(Foo)] Foo, Morefoo, and Maxfoo, J of Classic Potentials, 75, 345 (1997). diff --git a/doc/src/Modify_pair.txt b/doc/src/Modify_pair.txt new file mode 100644 index 0000000000..8c234dc621 --- /dev/null +++ b/doc/src/Modify_pair.txt @@ -0,0 +1,33 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Pair styles :h3 + +Classes that compute pairwise interactions are derived from the Pair +class. In LAMMPS, pairwise calculation include manybody potentials +such as EAM or Tersoff where particles interact without a static bond +topology. New styles can be created to add new pair potentials to +LAMMPS. + +Pair_lj_cut.cpp is a simple example of a Pair class, though it +includes some optional methods to enable its use with rRESPA. + +Here is a brief description of the class methods in pair.h: + +compute: workhorse routine that computes pairwise interactions +settings: reads the input script line with arguments you define +coeff: set coefficients for one i,j type pair +init_one: perform initialization for one i,j type pair +init_style: initialization specific to this pair style +write & read_restart: write/read i,j pair coeffs to restart files +write & read_restart_settings: write/read global settings to restart files +single: force and energy of a single pairwise interaction between 2 atoms +compute_inner/middle/outer: versions of compute used by rRESPA :tb(s=:) + +The inner/middle/outer routines are optional. diff --git a/doc/src/Modify_region.txt b/doc/src/Modify_region.txt new file mode 100644 index 0000000000..9fbf359292 --- /dev/null +++ b/doc/src/Modify_region.txt @@ -0,0 +1,25 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Region styles :h3 + +Classes that define geometric regions are derived from the Region +class. Regions are used elsewhere in LAMMPS to group atoms, delete +atoms to create a void, insert atoms in a specified region, etc. New +styles can be created to add new region shapes to LAMMPS. + +Region_sphere.cpp is an example of a spherical region. + +Here is a brief description of methods you define in your new derived +class. See region.h for details. + +inside: determine whether a point is in the region +surface_interior: determine if a point is within a cutoff distance inside of surc +surface_exterior: determine if a point is within a cutoff distance outside of surf +shape_update : change region shape if set by time-dependent variable :tb(s=:) diff --git a/doc/src/Modify_thermo.txt b/doc/src/Modify_thermo.txt new file mode 100644 index 0000000000..001a9f99e1 --- /dev/null +++ b/doc/src/Modify_thermo.txt @@ -0,0 +1,35 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Thermodynamic output options :h3 + +There is one class that computes and prints thermodynamic information +to the screen and log file; see the file thermo.cpp. + +There are two styles defined in thermo.cpp: "one" and "multi". There +is also a flexible "custom" style which allows the user to explicitly +list keywords for quantities to print when thermodynamic info is +output. See the "thermo_style"_thermo_style.html command for a list +of defined quantities. + +The thermo styles (one, multi, etc) are simply lists of keywords. +Adding a new style thus only requires defining a new list of keywords. +Search for the word "customize" with references to "thermo style" in +thermo.cpp to see the two locations where code will need to be added. + +New keywords can also be added to thermo.cpp to compute new quantities +for output. Search for the word "customize" with references to +"keyword" in thermo.cpp to see the several locations where code will +need to be added. + +Note that the "thermo_style custom"_thermo.html command already allows +for thermo output of quantities calculated by "fixes"_fix.html, +"computes"_compute.html, and "variables"_variable.html. Thus, it may +be simpler to compute what you wish via one of those constructs, than +by adding a new keyword to the thermo command. diff --git a/doc/src/Modify_variable.txt b/doc/src/Modify_variable.txt new file mode 100644 index 0000000000..3c5b29cd1a --- /dev/null +++ b/doc/src/Modify_variable.txt @@ -0,0 +1,46 @@ +"Higher level section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Variable options :h3 + +There is one class that computes and stores "variable"_variable.html +information in LAMMPS; see the file variable.cpp. The value +associated with a variable can be periodically printed to the screen +via the "print"_print.html, "fix print"_fix_print.html, or +"thermo_style custom"_thermo_style.html commands. Variables of style +"equal" can compute complex equations that involve the following types +of arguments: + +thermo keywords = ke, vol, atoms, ... +other variables = v_a, v_myvar, ... +math functions = div(x,y), mult(x,y), add(x,y), ... +group functions = mass(group), xcm(group,x), ... +atom values = x\[123\], y\[3\], vx\[34\], ... +compute values = c_mytemp\[0\], c_thermo_press\[3\], ... :pre + +Adding keywords for the "thermo_style custom"_thermo_style.html +command (which can then be accessed by variables) is discussed on the +"Modify thermo"_Modify_thermo.html doc page. + +Adding a new math function of one or two arguments can be done by +editing one section of the Variable::evaluate() method. Search for +the word "customize" to find the appropriate location. + +Adding a new group function can be done by editing one section of the +Variable::evaluate() method. Search for the word "customize" to find +the appropriate location. You may need to add a new method to the +Group class as well (see the group.cpp file). + +Accessing a new atom-based vector can be done by editing one section +of the Variable::evaluate() method. Search for the word "customize" +to find the appropriate location. + +Adding new "compute styles"_compute.html (whose calculated values can +then be accessed by variables) is discussed on the "Modify +compute"_Modify_compute.html doc page. diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index 32308b36cb..a44013f5f1 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -204,10 +204,10 @@ allowed, but that should be sufficient for most use cases. 3.3 Input script structure :h3,link(cmd_3) This section describes the structure of a typical LAMMPS input script. -The "examples" directory in the LAMMPS distribution contains many -sample input scripts; the corresponding problems are discussed in -"Section 7"_Section_example.html, and animated on the "LAMMPS -WWW Site"_lws. +The examples directory in the LAMMPS distribution contains many sample +input scripts; the corresponding problems are discussed on the +"Examples"_Examples.html doc page, and animated on the "LAMMPS WWW +Site"_lws. A LAMMPS input script typically has 4 parts: diff --git a/doc/src/Section_howto.txt b/doc/src/Section_howto.txt index a46b29c73b..0a31fc2b48 100644 --- a/doc/src/Section_howto.txt +++ b/doc/src/Section_howto.txt @@ -1,4 +1,4 @@ -"Previous Section"_Section_accelerate.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Section_example.html :c +"Previous Section"_Section_accelerate.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Examples.html :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -40,7 +40,7 @@ This section describes how to perform common tasks using LAMMPS. 6.28 "Magnetic spins"_#howto_28 :all(b) The example input scripts included in the LAMMPS distribution and -highlighted in "Section 7"_Section_example.html also show how to +highlighted on the "Examples"_Examples.html doc page also show how to setup and run various kinds of simulations. :line @@ -672,10 +672,10 @@ this scenario, LAMMPS is the driver code. During its timestepping, the fix is invoked, and can make library calls to the other code, which has been linked to LAMMPS as a library. This is the way the "POEMS"_poems package that performs constrained rigid-body motion on -groups of atoms is hooked to LAMMPS. See the -"fix poems"_fix_poems.html command for more details. See "this -section"_Section_modify.html of the documentation for info on how to add -a new fix to LAMMPS. +groups of atoms is hooked to LAMMPS. See the "fix +poems"_fix_poems.html command for more details. See the +"Modify"_Modify.html doc page for info on how to add a new fix to +LAMMPS. :link(poems,http://www.rpi.edu/~anderk5/lab) @@ -696,8 +696,8 @@ processors to start up another program). In the latter case the stand-alone code could communicate with LAMMPS thru files that the command writes and reads. -See "Section 10"_Section_modify.html of the documentation for how -to add a new command to LAMMPS. +See the "Modify"_Modify.html doc page for how to add a new command to +LAMMPS. (3) Use LAMMPS as a library called by another code. In this case the other code is the driver and calls LAMMPS as needed. Or a wrapper @@ -1057,7 +1057,7 @@ rigid bodies composed of finite-size particles :ul Example input scripts for these kinds of models are in the body, colloid, dipole, ellipse, line, peri, pour, and tri directories of the -"examples directory"_Section_example.html in the LAMMPS distribution. +"examples directory"_Examples.html in the LAMMPS distribution. Atom styles :h4 @@ -1302,8 +1302,8 @@ As discussed below, LAMMPS gives you a variety of ways to determine what quantities are computed and printed when the thermodynamics, dump, or fix commands listed above perform output. Throughout this discussion, note that users can also "add their own computes and fixes -to LAMMPS"_Section_modify.html which can then generate values that can -then be output with these commands. +to LAMMPS"_Modify.html which can then generate values that can then be +output with these commands. The following sub-sections discuss different LAMMPS command related to output and the kind of data they operate on and produce: @@ -1824,8 +1824,8 @@ At zero temperature, it is easy to estimate these derivatives by deforming the simulation box in one of the six directions using the "change_box"_change_box.html command and measuring the change in the stress tensor. A general-purpose script that does this is given in the -examples/elastic directory described in "this -section"_Section_example.html. +examples/elastic directory described on the "Examples"_Examples.html +doc page. Calculating elastic constants at finite temperature is more challenging, because it is necessary to run a simulation that perfoms @@ -2322,11 +2322,10 @@ Note that this compute allows the per-atom output of other "computes"_compute.html, "fixes"_fix.html, and "variables"_variable.html to be used to define chunk IDs for each atom. This means you can write your own compute or fix to output a -per-atom quantity to use as chunk ID. See -"Section 10"_Section_modify.html of the documentation for how to -do this. You can also define a "per-atom variable"_variable.html in -the input script that uses a formula to generate a chunk ID for each -atom. +per-atom quantity to use as chunk ID. See the "Modify"_Modify.html +doc page for how to do this. You can also define a "per-atom +variable"_variable.html in the input script that uses a formula to +generate a chunk ID for each atom. Fix ave/chunk command: :h4 diff --git a/doc/src/Section_intro.txt b/doc/src/Section_intro.txt index fd1d702d0b..fa2ab0e768 100644 --- a/doc/src/Section_intro.txt +++ b/doc/src/Section_intro.txt @@ -54,8 +54,8 @@ brief discussion of the open-source philosophy. LAMMPS is designed to be easy to modify or extend with new capabilities, such as new force fields, atom types, boundary -conditions, or diagnostics. See "Section 10"_Section_modify.html -for more details. +conditions, or diagnostics. See the "Modify"_Modify.html doc page for +more details. The current version of LAMMPS is written in C++. Earlier versions were written in F77 and F90. See @@ -94,8 +94,8 @@ LAMMPS are listed in "this section"_#intro_5. This section highlights LAMMPS features, with pointers to specific commands which give more details. If LAMMPS doesn't have your favorite interatomic potential, boundary condition, or atom type, see -"Section 10"_Section_modify.html, which describes how you can add -it to LAMMPS. +the "Modify"_Modify.html doc page, which describes how you can add it +to LAMMPS. General features :h4 @@ -334,8 +334,8 @@ Similarly, LAMMPS creates output files in a simple format. Most users post-process these files with their own analysis tools or re-format them for input into other programs, including visualization packages. If you are convinced you need to compute something on-the-fly as -LAMMPS runs, see "Section 10"_Section_modify.html for a discussion -of how you can use the "dump"_dump.html and "compute"_compute.html and +LAMMPS runs, see the "Modify"_Modify.html doc page for a discussion of +how you can use the "dump"_dump.html and "compute"_compute.html and "fix"_fix.html commands to print out data of your choosing. Keep in mind that complicated computations can slow down the molecular dynamics timestepping, particularly if the computations are not @@ -448,9 +448,8 @@ distribution. :l LAMMPS is designed to be easy to extend with new code for features like potentials, boundary conditions, diagnostic computations, etc. -"This section"_Section_modify.html gives details. If you add a -feature of general interest, it can be added to the LAMMPS -distribution. :l +The "Modify"_Modify.html doc page gives details. If you add a feature +of general interest, it can be added to the LAMMPS distribution. :l The Benchmark page of the "LAMMPS WWW Site"_lws lists LAMMPS performance on various platforms. The files needed to run the diff --git a/doc/src/Section_modify.txt b/doc/src/Section_modify.txt deleted file mode 100644 index 6948ac062a..0000000000 --- a/doc/src/Section_modify.txt +++ /dev/null @@ -1,827 +0,0 @@ - "Previous Section"_Tools.html - "LAMMPS WWW Site"_lws - "LAMMPS -Documentation"_ld - "LAMMPS Commands"_lc - "Next -Section"_Section_python.html :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Section_commands.html#comm) - -:line - -10. Modifying & extending LAMMPS :h2 - -This section describes how to customize LAMMPS by modifying -and extending its source code. - -10.1 "Atom styles"_#mod_1 -10.2 "Bond, angle, dihedral, improper potentials"_#mod_2 -10.3 "Compute styles"_#mod_3 -10.4 "Dump styles"_#mod_4 -10.5 "Dump custom output options"_#mod_5 -10.6 "Fix styles"_#mod_6 which include integrators, \ - temperature and pressure control, force constraints, \ - boundary conditions, diagnostic output, etc -10.7 "Input script commands"_#mod_7 -10.8 "Kspace computations"_#mod_8 -10.9 "Minimization styles"_#mod_9 -10.10 "Pairwise potentials"_#mod_10 -10.11 "Region styles"_#mod_11 -10.12 "Body styles"_#mod_12 -10.13 "Thermodynamic output options"_#mod_13 -10.14 "Variable options"_#mod_14 -10.15 "Submitting new features for inclusion in LAMMPS"_#mod_15 :all(b) - -LAMMPS is designed in a modular fashion so as to be easy to modify and -extend with new functionality. In fact, about 75% of its source code -is files added in this fashion. - -In this section, changes and additions users can make are listed along -with minimal instructions. If you add a new feature to LAMMPS and -think it will be of interest to general users, we encourage you to -submit it to the developers for inclusion in the released version of -LAMMPS. Information about how to do this is provided -"below"_#mod_14. - -The best way to add a new feature is to find a similar feature in -LAMMPS and look at the corresponding source and header files to figure -out what it does. You will need some knowledge of C++ to be able to -understand the hi-level structure of LAMMPS and its class -organization, but functions (class methods) that do actual -computations are written in vanilla C-style code and operate on simple -C-style data structures (vectors and arrays). - -Most of the new features described in this section require you to -write a new C++ derived class (except for exceptions described below, -where you can make small edits to existing files). Creating a new -class requires 2 files, a source code file (*.cpp) and a header file -(*.h). The derived class must provide certain methods to work as a -new option. Depending on how different your new feature is compared -to existing features, you can either derive from the base class -itself, or from a derived class that already exists. Enabling LAMMPS -to invoke the new class is as simple as putting the two source -files in the src dir and re-building LAMMPS. - -The advantage of C++ and its object-orientation is that all the code -and variables needed to define the new feature are in the 2 files you -write, and thus shouldn't make the rest of LAMMPS more complex or -cause side-effect bugs. - -Here is a concrete example. Suppose you write 2 files pair_foo.cpp -and pair_foo.h that define a new class PairFoo that computes pairwise -potentials described in the classic 1997 "paper"_#Foo by Foo, et al. -If you wish to invoke those potentials in a LAMMPS input script with a -command like - -pair_style foo 0.1 3.5 :pre - -then your pair_foo.h file should be structured as follows: - -#ifdef PAIR_CLASS -PairStyle(foo,PairFoo) -#else -... -(class definition for PairFoo) -... -#endif :pre - -where "foo" is the style keyword in the pair_style command, and -PairFoo is the class name defined in your pair_foo.cpp and pair_foo.h -files. - -When you re-build LAMMPS, your new pairwise potential becomes part of -the executable and can be invoked with a pair_style command like the -example above. Arguments like 0.1 and 3.5 can be defined and -processed by your new class. - -As illustrated by this pairwise example, many kinds of options are -referred to in the LAMMPS documentation as the "style" of a particular -command. - -The instructions below give the header file for the base class that -these styles are derived from. Public variables in that file are ones -used and set by the derived classes which are also used by the base -class. Sometimes they are also used by the rest of LAMMPS. Virtual -functions in the base class header file which are set = 0 are ones you -must define in your new derived class to give it the functionality -LAMMPS expects. Virtual functions that are not set to 0 are functions -you can optionally define. - -Additionally, new output options can be added directly to the -thermo.cpp, dump_custom.cpp, and variable.cpp files as explained -below. - -Here are additional guidelines for modifying LAMMPS and adding new -functionality: - -Think about whether what you want to do would be better as a pre- or -post-processing step. Many computations are more easily and more -quickly done that way. :ulb,l - -Don't do anything within the timestepping of a run that isn't -parallel. E.g. don't accumulate a bunch of data on a single processor -and analyze it. You run the risk of seriously degrading the parallel -efficiency. :l - -If your new feature reads arguments or writes output, make sure you -follow the unit conventions discussed by the "units"_units.html -command. :l - -If you add something you think is truly useful and doesn't impact -LAMMPS performance when it isn't used, send an email to the -"developers"_http://lammps.sandia.gov/authors.html. We might be -interested in adding it to the LAMMPS distribution. See further -details on this at the bottom of this page. :l -:ule - -:line -:line - -10.1 Atom styles :link(mod_1),h4 - -Classes that define an "atom style"_atom_style.html are derived from -the AtomVec class and managed by the Atom class. The atom style -determines what attributes are associated with an atom. A new atom -style can be created if one of the existing atom styles does not -define all the attributes you need to store and communicate with -atoms. - -Atom_vec_atomic.cpp is a simple example of an atom style. - -Here is a brief description of methods you define in your new derived -class. See atom_vec.h for details. - -init: one time setup (optional) -grow: re-allocate atom arrays to longer lengths (required) -grow_reset: make array pointers in Atom and AtomVec classes consistent (required) -copy: copy info for one atom to another atom's array locations (required) -pack_comm: store an atom's info in a buffer communicated every timestep (required) -pack_comm_vel: add velocity info to communication buffer (required) -pack_comm_hybrid: store extra info unique to this atom style (optional) -unpack_comm: retrieve an atom's info from the buffer (required) -unpack_comm_vel: also retrieve velocity info (required) -unpack_comm_hybrid: retrieve extra info unique to this atom style (optional) -pack_reverse: store an atom's info in a buffer communicating partial forces (required) -pack_reverse_hybrid: store extra info unique to this atom style (optional) -unpack_reverse: retrieve an atom's info from the buffer (required) -unpack_reverse_hybrid: retrieve extra info unique to this atom style (optional) -pack_border: store an atom's info in a buffer communicated on neighbor re-builds (required) -pack_border_vel: add velocity info to buffer (required) -pack_border_hybrid: store extra info unique to this atom style (optional) -unpack_border: retrieve an atom's info from the buffer (required) -unpack_border_vel: also retrieve velocity info (required) -unpack_border_hybrid: retrieve extra info unique to this atom style (optional) -pack_exchange: store all an atom's info to migrate to another processor (required) -unpack_exchange: retrieve an atom's info from the buffer (required) -size_restart: number of restart quantities associated with proc's atoms (required) -pack_restart: pack atom quantities into a buffer (required) -unpack_restart: unpack atom quantities from a buffer (required) -create_atom: create an individual atom of this style (required) -data_atom: parse an atom line from the data file (required) -data_atom_hybrid: parse additional atom info unique to this atom style (optional) -data_vel: parse one line of velocity information from data file (optional) -data_vel_hybrid: parse additional velocity data unique to this atom style (optional) -memory_usage: tally memory allocated by atom arrays (required) :tb(s=:) - -The constructor of the derived class sets values for several variables -that you must set when defining a new atom style, which are documented -in atom_vec.h. New atom arrays are defined in atom.cpp. Search for -the word "customize" and you will find locations you will need to -modify. - -NOTE: It is possible to add some attributes, such as a molecule ID, to -atom styles that do not have them via the "fix -property/atom"_fix_property_atom.html command. This command also -allows new custom attributes consisting of extra integer or -floating-point values to be added to atoms. See the "fix -property/atom"_fix_property_atom.html doc page for examples of cases -where this is useful and details on how to initialize, access, and -output the custom values. - -New "pair styles"_pair_style.html, "fixes"_fix.html, or -"computes"_compute.html can be added to LAMMPS, as discussed below. -The code for these classes can use the per-atom properties defined by -fix property/atom. The Atom class has a find_custom() method that is -useful in this context: - -int index = atom->find_custom(char *name, int &flag); :pre - -The "name" of a custom attribute, as specified in the "fix -property/atom"_fix_property_atom.html command, is checked to verify -that it exists and its index is returned. The method also sets flag = -0/1 depending on whether it is an integer or floating-point attribute. -The vector of values associated with the attribute can then be -accessed using the returned index as - -int *ivector = atom->ivector\[index\]; -double *dvector = atom->dvector\[index\]; :pre - -Ivector or dvector are vectors of length Nlocal = # of owned atoms, -which store the attributes of individual atoms. - -:line - -10.2 Bond, angle, dihedral, improper potentials :link(mod_2),h4 - -Classes that compute molecular interactions are derived from the Bond, -Angle, Dihedral, and Improper classes. New styles can be created to -add new potentials to LAMMPS. - -Bond_harmonic.cpp is the simplest example of a bond style. Ditto for -the harmonic forms of the angle, dihedral, and improper style -commands. - -Here is a brief description of common methods you define in your -new derived class. See bond.h, angle.h, dihedral.h, and improper.h -for details and specific additional methods. - -init: check if all coefficients are set, calls {init_style} (optional) -init_style: check if style specific conditions are met (optional) -compute: compute the molecular interactions (required) -settings: apply global settings for all types (optional) -coeff: set coefficients for one type (required) -equilibrium_distance: length of bond, used by SHAKE (required, bond only) -equilibrium_angle: opening of angle, used by SHAKE (required, angle only) -write & read_restart: writes/reads coeffs to restart files (required) -single: force and energy of a single bond or angle (required, bond or angle only) -memory_usage: tally memory allocated by the style (optional) :tb(s=:) - -:line - -10.3 Compute styles :link(mod_3),h4 - -Classes that compute scalar and vector quantities like temperature -and the pressure tensor, as well as classes that compute per-atom -quantities like kinetic energy and the centro-symmetry parameter -are derived from the Compute class. New styles can be created -to add new calculations to LAMMPS. - -Compute_temp.cpp is a simple example of computing a scalar -temperature. Compute_ke_atom.cpp is a simple example of computing -per-atom kinetic energy. - -Here is a brief description of methods you define in your new derived -class. See compute.h for details. - -init: perform one time setup (required) -init_list: neighbor list setup, if needed (optional) -compute_scalar: compute a scalar quantity (optional) -compute_vector: compute a vector of quantities (optional) -compute_peratom: compute one or more quantities per atom (optional) -compute_local: compute one or more quantities per processor (optional) -pack_comm: pack a buffer with items to communicate (optional) -unpack_comm: unpack the buffer (optional) -pack_reverse: pack a buffer with items to reverse communicate (optional) -unpack_reverse: unpack the buffer (optional) -remove_bias: remove velocity bias from one atom (optional) -remove_bias_all: remove velocity bias from all atoms in group (optional) -restore_bias: restore velocity bias for one atom after remove_bias (optional) -restore_bias_all: same as before, but for all atoms in group (optional) -pair_tally_callback: callback function for {tally}-style computes (optional). -memory_usage: tally memory usage (optional) :tb(s=:) - -Tally-style computes are a special case, as their computation is done -in two stages: the callback function is registered with the pair style -and then called from the Pair::ev_tally() function, which is called for -each pair after force and energy has been computed for this pair. Then -the tallied values are retrieved with the standard compute_scalar or -compute_vector or compute_peratom methods. The USER-TALLY package -provides {examples}_compute_tally.html for utilizing this mechanism. - -:line - -10.4 Dump styles :link(mod_4),h4 -10.5 Dump custom output options :link(mod_5),h4 - -Classes that dump per-atom info to files are derived from the Dump -class. To dump new quantities or in a new format, a new derived dump -class can be added, but it is typically simpler to modify the -DumpCustom class contained in the dump_custom.cpp file. - -Dump_atom.cpp is a simple example of a derived dump class. - -Here is a brief description of methods you define in your new derived -class. See dump.h for details. - -write_header: write the header section of a snapshot of atoms -count: count the number of lines a processor will output -pack: pack a proc's output data into a buffer -write_data: write a proc's data to a file :tb(s=:) - -See the "dump"_dump.html command and its {custom} style for a list of -keywords for atom information that can already be dumped by -DumpCustom. It includes options to dump per-atom info from Compute -classes, so adding a new derived Compute class is one way to calculate -new quantities to dump. - -Alternatively, you can add new keywords to the dump custom command. -Search for the word "customize" in dump_custom.cpp to see the -half-dozen or so locations where code will need to be added. - -:line - -10.6 Fix styles :link(mod_6),h4 - -In LAMMPS, a "fix" is any operation that is computed during -timestepping that alters some property of the system. Essentially -everything that happens during a simulation besides force computation, -neighbor list construction, and output, is a "fix". This includes -time integration (update of coordinates and velocities), force -constraints or boundary conditions (SHAKE or walls), and diagnostics -(compute a diffusion coefficient). New styles can be created to add -new options to LAMMPS. - -Fix_setforce.cpp is a simple example of setting forces on atoms to -prescribed values. There are dozens of fix options already in LAMMPS; -choose one as a template that is similar to what you want to -implement. - -Here is a brief description of methods you can define in your new -derived class. See fix.h for details. - -setmask: determines when the fix is called during the timestep (required) -init: initialization before a run (optional) -setup_pre_exchange: called before atom exchange in setup (optional) -setup_pre_force: called before force computation in setup (optional) -setup: called immediately before the 1st timestep and after forces are computed (optional) -min_setup_pre_force: like setup_pre_force, but for minimizations instead of MD runs (optional) -min_setup: like setup, but for minimizations instead of MD runs (optional) -initial_integrate: called at very beginning of each timestep (optional) -pre_exchange: called before atom exchange on re-neighboring steps (optional) -pre_neighbor: called before neighbor list build (optional) -pre_force: called before pair & molecular forces are computed (optional) -post_force: called after pair & molecular forces are computed and communicated (optional) -final_integrate: called at end of each timestep (optional) -end_of_step: called at very end of timestep (optional) -write_restart: dumps fix info to restart file (optional) -restart: uses info from restart file to re-initialize the fix (optional) -grow_arrays: allocate memory for atom-based arrays used by fix (optional) -copy_arrays: copy atom info when an atom migrates to a new processor (optional) -pack_exchange: store atom's data in a buffer (optional) -unpack_exchange: retrieve atom's data from a buffer (optional) -pack_restart: store atom's data for writing to restart file (optional) -unpack_restart: retrieve atom's data from a restart file buffer (optional) -size_restart: size of atom's data (optional) -maxsize_restart: max size of atom's data (optional) -setup_pre_force_respa: same as setup_pre_force, but for rRESPA (optional) -initial_integrate_respa: same as initial_integrate, but for rRESPA (optional) -post_integrate_respa: called after the first half integration step is done in rRESPA (optional) -pre_force_respa: same as pre_force, but for rRESPA (optional) -post_force_respa: same as post_force, but for rRESPA (optional) -final_integrate_respa: same as final_integrate, but for rRESPA (optional) -min_pre_force: called after pair & molecular forces are computed in minimizer (optional) -min_post_force: called after pair & molecular forces are computed and communicated in minimizer (optional) -min_store: store extra data for linesearch based minimization on a LIFO stack (optional) -min_pushstore: push the minimization LIFO stack one element down (optional) -min_popstore: pop the minimization LIFO stack one element up (optional) -min_clearstore: clear minimization LIFO stack (optional) -min_step: reset or move forward on line search minimization (optional) -min_dof: report number of degrees of freedom {added} by this fix in minimization (optional) -max_alpha: report maximum allowed step size during linesearch minimization (optional) -pack_comm: pack a buffer to communicate a per-atom quantity (optional) -unpack_comm: unpack a buffer to communicate a per-atom quantity (optional) -pack_reverse_comm: pack a buffer to reverse communicate a per-atom quantity (optional) -unpack_reverse_comm: unpack a buffer to reverse communicate a per-atom quantity (optional) -dof: report number of degrees of freedom {removed} by this fix during MD (optional) -compute_scalar: return a global scalar property that the fix computes (optional) -compute_vector: return a component of a vector property that the fix computes (optional) -compute_array: return a component of an array property that the fix computes (optional) -deform: called when the box size is changed (optional) -reset_target: called when a change of the target temperature is requested during a run (optional) -reset_dt: is called when a change of the time step is requested during a run (optional) -modify_param: called when a fix_modify request is executed (optional) -memory_usage: report memory used by fix (optional) -thermo: compute quantities for thermodynamic output (optional) :tb(s=:) - -Typically, only a small fraction of these methods are defined for a -particular fix. Setmask is mandatory, as it determines when the fix -will be invoked during the timestep. Fixes that perform time -integration ({nve}, {nvt}, {npt}) implement initial_integrate() and -final_integrate() to perform velocity Verlet updates. Fixes that -constrain forces implement post_force(). - -Fixes that perform diagnostics typically implement end_of_step(). For -an end_of_step fix, one of your fix arguments must be the variable -"nevery" which is used to determine when to call the fix and you must -set this variable in the constructor of your fix. By convention, this -is the first argument the fix defines (after the ID, group-ID, style). - -If the fix needs to store information for each atom that persists from -timestep to timestep, it can manage that memory and migrate the info -with the atoms as they move from processors to processor by -implementing the grow_arrays, copy_arrays, pack_exchange, and -unpack_exchange methods. Similarly, the pack_restart and -unpack_restart methods can be implemented to store information about -the fix in restart files. If you wish an integrator or force -constraint fix to work with rRESPA (see the "run_style"_run_style.html -command), the initial_integrate, post_force_integrate, and -final_integrate_respa methods can be implemented. The thermo method -enables a fix to contribute values to thermodynamic output, as printed -quantities and/or to be summed to the potential energy of the system. - -:line - -10.7 Input script commands :link(mod_7),h4 - -New commands can be added to LAMMPS input scripts by adding new -classes that have a "command" method. For example, the create_atoms, -read_data, velocity, and run commands are all implemented in this -fashion. When such a command is encountered in the LAMMPS input -script, LAMMPS simply creates a class with the corresponding name, -invokes the "command" method of the class, and passes it the arguments -from the input script. The command method can perform whatever -operations it wishes on LAMMPS data structures. - -The single method your new class must define is as follows: - -command: operations performed by the new command :tb(s=:) - -Of course, the new class can define other methods and variables as -needed. - -:line - -10.8 Kspace computations :link(mod_8),h4 - -Classes that compute long-range Coulombic interactions via K-space -representations (Ewald, PPPM) are derived from the KSpace class. New -styles can be created to add new K-space options to LAMMPS. - -Ewald.cpp is an example of computing K-space interactions. - -Here is a brief description of methods you define in your new derived -class. See kspace.h for details. - -init: initialize the calculation before a run -setup: computation before the 1st timestep of a run -compute: every-timestep computation -memory_usage: tally of memory usage :tb(s=:) - -:line - -10.9 Minimization styles :link(mod_9),h4 - -Classes that perform energy minimization derived from the Min class. -New styles can be created to add new minimization algorithms to -LAMMPS. - -Min_cg.cpp is an example of conjugate gradient minimization. - -Here is a brief description of methods you define in your new derived -class. See min.h for details. - -init: initialize the minimization before a run -run: perform the minimization -memory_usage: tally of memory usage :tb(s=:) - -:line - -10.10 Pairwise potentials :link(mod_10),h4 - -Classes that compute pairwise interactions are derived from the Pair -class. In LAMMPS, pairwise calculation include manybody potentials -such as EAM or Tersoff where particles interact without a static bond -topology. New styles can be created to add new pair potentials to -LAMMPS. - -Pair_lj_cut.cpp is a simple example of a Pair class, though it -includes some optional methods to enable its use with rRESPA. - -Here is a brief description of the class methods in pair.h: - -compute: workhorse routine that computes pairwise interactions -settings: reads the input script line with arguments you define -coeff: set coefficients for one i,j type pair -init_one: perform initialization for one i,j type pair -init_style: initialization specific to this pair style -write & read_restart: write/read i,j pair coeffs to restart files -write & read_restart_settings: write/read global settings to restart files -single: force and energy of a single pairwise interaction between 2 atoms -compute_inner/middle/outer: versions of compute used by rRESPA :tb(s=:) - -The inner/middle/outer routines are optional. - -:line - -10.11 Region styles :link(mod_11),h4 - -Classes that define geometric regions are derived from the Region -class. Regions are used elsewhere in LAMMPS to group atoms, delete -atoms to create a void, insert atoms in a specified region, etc. New -styles can be created to add new region shapes to LAMMPS. - -Region_sphere.cpp is an example of a spherical region. - -Here is a brief description of methods you define in your new derived -class. See region.h for details. - -inside: determine whether a point is in the region -surface_interior: determine if a point is within a cutoff distance inside of surc -surface_exterior: determine if a point is within a cutoff distance outside of surf -shape_update : change region shape if set by time-dependent variable :tb(s=:) - -:line - -10.12 Body styles :link(mod_12),h4 - -Classes that define body particles are derived from the Body class. -Body particles can represent complex entities, such as surface meshes -of discrete points, collections of sub-particles, deformable objects, -etc. - -See "Section 6.14"_Section_howto.html#howto_14 of the manual for -an overview of using body particles and the "body"_body.html doc page -for details on the various body styles LAMMPS supports. New styles -can be created to add new kinds of body particles to LAMMPS. - -Body_nparticle.cpp is an example of a body particle that is treated as -a rigid body containing N sub-particles. - -Here is a brief description of methods you define in your new derived -class. See body.h for details. - -data_body: process a line from the Bodies section of a data file -noutrow: number of sub-particles output is generated for -noutcol: number of values per-sub-particle output is generated for -output: output values for the Mth sub-particle -pack_comm_body: body attributes to communicate every timestep -unpack_comm_body: unpacking of those attributes -pack_border_body: body attributes to communicate when reneighboring is done -unpack_border_body: unpacking of those attributes :tb(s=:) - -:line - -10.13 Thermodynamic output options :link(mod_13),h4 - -There is one class that computes and prints thermodynamic information -to the screen and log file; see the file thermo.cpp. - -There are two styles defined in thermo.cpp: "one" and "multi". There -is also a flexible "custom" style which allows the user to explicitly -list keywords for quantities to print when thermodynamic info is -output. See the "thermo_style"_thermo_style.html command for a list -of defined quantities. - -The thermo styles (one, multi, etc) are simply lists of keywords. -Adding a new style thus only requires defining a new list of keywords. -Search for the word "customize" with references to "thermo style" in -thermo.cpp to see the two locations where code will need to be added. - -New keywords can also be added to thermo.cpp to compute new quantities -for output. Search for the word "customize" with references to -"keyword" in thermo.cpp to see the several locations where code will -need to be added. - -Note that the "thermo_style custom"_thermo.html command already allows -for thermo output of quantities calculated by "fixes"_fix.html, -"computes"_compute.html, and "variables"_variable.html. Thus, it may -be simpler to compute what you wish via one of those constructs, than -by adding a new keyword to the thermo command. - -:line - -10.14 Variable options :link(mod_14),h4 - -There is one class that computes and stores "variable"_variable.html -information in LAMMPS; see the file variable.cpp. The value -associated with a variable can be periodically printed to the screen -via the "print"_print.html, "fix print"_fix_print.html, or -"thermo_style custom"_thermo_style.html commands. Variables of style -"equal" can compute complex equations that involve the following types -of arguments: - -thermo keywords = ke, vol, atoms, ... -other variables = v_a, v_myvar, ... -math functions = div(x,y), mult(x,y), add(x,y), ... -group functions = mass(group), xcm(group,x), ... -atom values = x\[123\], y\[3\], vx\[34\], ... -compute values = c_mytemp\[0\], c_thermo_press\[3\], ... :pre - -Adding keywords for the "thermo_style custom"_thermo_style.html command -(which can then be accessed by variables) was discussed -"here"_Section_modify.html#mod_13 on this page. - -Adding a new math function of one or two arguments can be done by -editing one section of the Variable::evaluate() method. Search for -the word "customize" to find the appropriate location. - -Adding a new group function can be done by editing one section of the -Variable::evaluate() method. Search for the word "customize" to find -the appropriate location. You may need to add a new method to the -Group class as well (see the group.cpp file). - -Accessing a new atom-based vector can be done by editing one section -of the Variable::evaluate() method. Search for the word "customize" -to find the appropriate location. - -Adding new "compute styles"_compute.html (whose calculated values can -then be accessed by variables) was discussed -"here"_Section_modify.html#mod_3 on this page. - -:line -:line - -10.15 Submitting new features for inclusion in LAMMPS :link(mod_15),h4 - -We encourage users to submit new features or modifications for -LAMMPS to "the core developers"_http://lammps.sandia.gov/authors.html -so they can be added to the LAMMPS distribution. The preferred way to -manage and coordinate this is as of Fall 2016 via the LAMMPS project on -"GitHub"_https://github.com/lammps/lammps. An alternative is to contact -the LAMMPS developers or the indicated developer of a package or feature -directly and send in your contribution via e-mail. - -For any larger modifications or programming project, you are encouraged -to contact the LAMMPS developers ahead of time, in order to discuss -implementation strategies and coding guidelines, that will make it -easier to integrate your contribution and result in less work for -everybody involved. You are also encouraged to search through the list -of "open issues on GitHub"_https://github.com/lammps/lammps/issues and -submit a new issue for a planned feature, so you would not duplicate -the work of others (and possibly get scooped by them) or have your work -duplicated by others. - -How quickly your contribution will be integrated -depends largely on how much effort it will cause to integrate and test -it, how much it requires changes to the core codebase, and of how much -interest it is to the larger LAMMPS community. Please see below for a -checklist of typical requirements. Once you have prepared everything, -see "this tutorial"_tutorial_github.html for instructions on how to -submit your changes or new files through a GitHub pull request. If you -prefer to submit patches or full files, you should first make certain, -that your code works correctly with the latest patch-level version of -LAMMPS and contains all bugfixes from it. Then create a gzipped tar -file of all changed or added files or a corresponding patch file using -'diff -u' or 'diff -c' and compress it with gzip. Please only use -gzip compression, as this works well on all platforms. - -If the new features/files are broadly useful we may add them as core -files to LAMMPS or as part of a "standard -package"_Section_start.html#start_3. Else we will add them as a -user-contributed file or package. Examples of user packages are in -src sub-directories that start with USER. The USER-MISC package is -simply a collection of (mostly) unrelated single files, which is the -simplest way to have your contribution quickly added to the LAMMPS -distribution. You can see a list of the both standard and user -packages by typing "make package" in the LAMMPS src directory. - -Note that by providing us files to release, you are agreeing to make -them open-source, i.e. we can release them under the terms of the GPL, -used as a license for the rest of LAMMPS. See "Section -1.4"_Section_intro.html#intro_4 for details. - -With user packages and files, all we are really providing (aside from -the fame and fortune that accompanies having your name in the source -code and on the "Authors page"_http://lammps.sandia.gov/authors.html -of the "LAMMPS WWW site"_lws), is a means for you to distribute your -work to the LAMMPS user community, and a mechanism for others to -easily try out your new feature. This may help you find bugs or make -contact with new collaborators. Note that you're also implicitly -agreeing to support your code which means answer questions, fix bugs, -and maintain it if LAMMPS changes in some way that breaks it (an -unusual event). - -NOTE: If you prefer to actively develop and support your add-on -feature yourself, then you may wish to make it available for download -from your own website, as a user package that LAMMPS users can add to -their copy of LAMMPS. See the "Offsite LAMMPS packages and -tools"_http://lammps.sandia.gov/offsite.html page of the LAMMPS web -site for examples of groups that do this. We are happy to advertise -your package and web site from that page. Simply email the -"developers"_http://lammps.sandia.gov/authors.html with info about -your package and we will post it there. - -The previous sections of this doc page describe how to add new "style" -files of various kinds to LAMMPS. Packages are simply collections of -one or more new class files which are invoked as a new style within a -LAMMPS input script. If designed correctly, these additions typically -do not require changes to the main core of LAMMPS; they are simply -add-on files. If you think your new feature requires non-trivial -changes in core LAMMPS files, you'll need to "communicate with the -developers"_http://lammps.sandia.gov/authors.html, since we may or may -not want to make those changes. An example of a trivial change is -making a parent-class method "virtual" when you derive a new child -class from it. - -Here is a checklist of steps you need to follow to submit a single file -or user package for our consideration. Following these steps will save -both you and us time. See existing files in packages in the src dir for -examples. If you are uncertain, please ask. - -All source files you provide must compile with the most current -version of LAMMPS with multiple configurations. In particular you -need to test compiling LAMMPS from scratch with -DLAMMPS_BIGBIG -set in addition to the default -DLAMMPS_SMALLBIG setting. Your code -will need to work correctly in serial and in parallel using MPI. :ulb,l - -For consistency with the rest of LAMMPS and especially, if you want -your contribution(s) to be added to main LAMMPS code or one of its -standard packages, it needs to be written in a style compatible with -other LAMMPS source files. This means: 2-character indentation per -level, [no tabs], no lines over 80 characters. I/O is done via -the C-style stdio library, class header files should not import any -system headers outside , STL containers should be avoided -in headers, and forward declarations used where possible or needed. -All added code should be placed into the LAMMPS_NS namespace or a -sub-namespace; global or static variables should be avoided, as they -conflict with the modular nature of LAMMPS and the C++ class structure. -Header files must [not] import namespaces with {using}. -This all is so the developers can more easily understand, integrate, -and maintain your contribution and reduce conflicts with other parts -of LAMMPS. This basically means that the code accesses data -structures, performs its operations, and is formatted similar to other -LAMMPS source files, including the use of the error class for error -and warning messages. :l - -If you want your contribution to be added as a user-contributed -feature, and it's a single file (actually a *.cpp and *.h file) it can -rapidly be added to the USER-MISC directory. Send us the one-line -entry to add to the USER-MISC/README file in that dir, along with the -2 source files. You can do this multiple times if you wish to -contribute several individual features. :l - -If you want your contribution to be added as a user-contribution and -it is several related features, it is probably best to make it a user -package directory with a name like USER-FOO. In addition to your new -files, the directory should contain a README text file. The README -should contain your name and contact information and a brief -description of what your new package does. If your files depend on -other LAMMPS style files also being installed (e.g. because your file -is a derived class from the other LAMMPS class), then an Install.sh -file is also needed to check for those dependencies. See other README -and Install.sh files in other USER directories as examples. Send us a -tarball of this USER-FOO directory. :l - -Your new source files need to have the LAMMPS copyright, GPL notice, -and your name and email address at the top, like other -user-contributed LAMMPS source files. They need to create a class -that is inside the LAMMPS namespace. If the file is for one of the -USER packages, including USER-MISC, then we are not as picky about the -coding style (see above). I.e. the files do not need to be in the -same stylistic format and syntax as other LAMMPS files, though that -would be nice for developers as well as users who try to read your -code. :l - -You [must] also create a [documentation] file for each new command or -style you are adding to LAMMPS. For simplicity and convenience, the -documentation of groups of closely related commands or styles may be -combined into a single file. This will be one file for a single-file -feature. For a package, it might be several files. These are simple -text files with a specific markup language, that are then auto-converted -to HTML and PDF. The tools for this conversion are included in the -source distribution, and the translation can be as simple as doing -"make html pdf" in the doc folder. -Thus the documentation source files must be in the same format and -style as other *.txt files in the lammps/doc/src directory for similar -commands and styles; use one or more of them as a starting point. -A description of the markup can also be found in -lammps/doc/utils/txt2html/README.html -As appropriate, the text files can include links to equations -(see doc/Eqs/*.tex for examples, we auto-create the associated JPG -files), or figures (see doc/JPG for examples), or even additional PDF -files with further details (see doc/PDF for examples). The doc page -should also include literature citations as appropriate; see the -bottom of doc/fix_nh.txt for examples and the earlier part of the same -file for how to format the cite itself. The "Restrictions" section of -the doc page should indicate that your command is only available if -LAMMPS is built with the appropriate USER-MISC or USER-FOO package. -See other user package doc files for examples of how to do this. The -prerequisite for building the HTML format files are Python 3.x and -virtualenv, the requirement for generating the PDF format manual -is the "htmldoc"_http://www.htmldoc.org/ software. Please run at least -"make html" and carefully inspect and proofread the resulting HTML format -doc page before submitting your code. :l - -For a new package (or even a single command) you should include one or -more example scripts demonstrating its use. These should run in no -more than a couple minutes, even on a single processor, and not require -large data files as input. See directories under examples/USER for -examples of input scripts other users provided for their packages. -These example inputs are also required for validating memory accesses -and testing for memory leaks with valgrind :l - -If there is a paper of yours describing your feature (either the -algorithm/science behind the feature itself, or its initial usage, or -its implementation in LAMMPS), you can add the citation to the *.cpp -source file. See src/USER-EFF/atom_vec_electron.cpp for an example. -A LaTeX citation is stored in a variable at the top of the file and a -single line of code that references the variable is added to the -constructor of the class. Whenever a user invokes your feature from -their input script, this will cause LAMMPS to output the citation to a -log.cite file and prompt the user to examine the file. Note that you -should only use this for a paper you or your group authored. -E.g. adding a cite in the code for a paper by Nose and Hoover if you -write a fix that implements their integrator is not the intended -usage. That kind of citation should just be in the doc page you -provide. :l -:ule - -Finally, as a general rule-of-thumb, the more clear and -self-explanatory you make your documentation and README files, and the -easier you make it for people to get started, e.g. by providing example -scripts, the more likely it is that users will try out your new feature. - -:line -:line - -:link(Foo) -[(Foo)] Foo, Morefoo, and Maxfoo, J of Classic Potentials, 75, 345 (1997). diff --git a/doc/src/Section_packages.txt b/doc/src/Section_packages.txt index 218866e271..77f56d273c 100644 --- a/doc/src/Section_packages.txt +++ b/doc/src/Section_packages.txt @@ -51,8 +51,7 @@ technical questions about compiling the package. If you have problems using a feature provided in a user package, you may need to contact the contributor directly to get help. Information on how to submit additions you make to LAMMPS as single files or as a standard or user -package are given in "this section"_Section_modify.html#mod_15 of the -manual. +package are given in the "Modify contribute"_Modify.html doc page. Following the next two tables is a sub-section for each package. It lists authors (if applicable) and summarizes the package contents. It diff --git a/doc/src/Section_perf.txt b/doc/src/Section_perf.txt index 56b1d7dd04..f320780129 100644 --- a/doc/src/Section_perf.txt +++ b/doc/src/Section_perf.txt @@ -1,6 +1,6 @@ -"Previous Section"_Section_example.html - "LAMMPS WWW Site"_lws - -"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next -Section"_Tools.html :c +"Previous Section"_Examples.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Tools.html +:c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) diff --git a/doc/src/Section_python.txt b/doc/src/Section_python.txt index 5427cd67f2..c9b0bd8b2e 100644 --- a/doc/src/Section_python.txt +++ b/doc/src/Section_python.txt @@ -1,4 +1,6 @@ -"Previous Section"_Section_modify.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Section_errors.html :c +"Previous Section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc - "Next +Section"_Section_errors.html :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) diff --git a/doc/src/Tools.txt b/doc/src/Tools.txt index 0674e3cfcc..e8badfa6b9 100644 --- a/doc/src/Tools.txt +++ b/doc/src/Tools.txt @@ -1,6 +1,6 @@ "Previous Section"_Section_perf.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next -Section"_Section_modify.html :c +Section"_Modify.html :c + + + +"Common problems"_Errors_common.html +"Reporting bugs"_Errors_bugs.html +"Error messages"_Errors_messages.html +"Warning messages"_Errors_warnings.html :all(b) + + diff --git a/doc/src/Errors_bugs.txt b/doc/src/Errors_bugs.txt new file mode 100644 index 0000000000..c0a94c7a44 --- /dev/null +++ b/doc/src/Errors_bugs.txt @@ -0,0 +1,35 @@ +"Higher level section"_Errors.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Reporting bugs :h3 + +If you are confident that you have found a bug in LAMMPS, follow these +steps. + +Check the "New features and bug +fixes"_http://lammps.sandia.gov/bug.html section of the "LAMMPS WWW +site"_lws to see if the bug has already been reported or fixed or the +"Unfixed bug"_http://lammps.sandia.gov/unbug.html to see if a fix is +pending. + +Check the "mailing list"_http://lammps.sandia.gov/mail.html to see if +it has been discussed before. + +If not, send an email to the mailing list describing the problem with +any ideas you have as to what is causing it or where in the code the +problem might be. The developers will ask for more info if needed, +such as an input script or data files. + +The most useful thing you can do to help us fix the bug is to isolate +the problem. Run it on the smallest number of atoms and fewest number +of processors and with the simplest input script that reproduces the +bug and try to identify what command or combination of commands is +causing the problem. + +NOTE: this page needs to have GitHub issues info added diff --git a/doc/src/Errors_common.txt b/doc/src/Errors_common.txt new file mode 100644 index 0000000000..86a25f7e7d --- /dev/null +++ b/doc/src/Errors_common.txt @@ -0,0 +1,123 @@ +"Higher level section"_Errors.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Common problems :h3 + +If two LAMMPS runs do not produce the exact same answer on different +machines or different numbers of processors, this is typically not a +bug. In theory you should get identical answers on any number of +processors and on any machine. In practice, numerical round-off can +cause slight differences and eventual divergence of molecular dynamics +phase space trajectories within a few 100s or few 1000s of timesteps. +However, the statistical properties of the two runs (e.g. average +energy or temperature) should still be the same. + +If the "velocity"_velocity.html command is used to set initial atom +velocities, a particular atom can be assigned a different velocity +when the problem is run on a different number of processors or on +different machines. If this happens, the phase space trajectories of +the two simulations will rapidly diverge. See the discussion of the +{loop} option in the "velocity"_velocity.html command for details and +options that avoid this issue. + +Similarly, the "create_atoms"_create_atoms.html command generates a +lattice of atoms. For the same physical system, the ordering and +numbering of atoms by atom ID may be different depending on the number +of processors. + +Some commands use random number generators which may be setup to +produce different random number streams on each processor and hence +will produce different effects when run on different numbers of +processors. A commonly-used example is the "fix +langevin"_fix_langevin.html command for thermostatting. + +A LAMMPS simulation typically has two stages, setup and run. Most +LAMMPS errors are detected at setup time; others like a bond +stretching too far may not occur until the middle of a run. + +LAMMPS tries to flag errors and print informative error messages so +you can fix the problem. For most errors it will also print the last +input script command that it was processing. Of course, LAMMPS cannot +figure out your physics or numerical mistakes, like choosing too big a +timestep, specifying erroneous force field coefficients, or putting 2 +atoms on top of each other! If you run into errors that LAMMPS +doesn't catch that you think it should flag, please send an email to +the "developers"_http://lammps.sandia.gov/authors.html. + +If you get an error message about an invalid command in your input +script, you can determine what command is causing the problem by +looking in the log.lammps file or using the "echo command"_echo.html +to see it on the screen. If you get an error like "Invalid ... +style", with ... being fix, compute, pair, etc, it means that you +mistyped the style name or that the command is part of an optional +package which was not compiled into your executable. The list of +available styles in your executable can be listed by using "the -h +command-line argument"_Section_start.html#start_6. The installation +and compilation of optional packages is explained in the "installation +instructions"_Section_start.html#start_3. + +For a given command, LAMMPS expects certain arguments in a specified +order. If you mess this up, LAMMPS will often flag the error, but it +may also simply read a bogus argument and assign a value that is +valid, but not what you wanted. E.g. trying to read the string "abc" +as an integer value of 0. Careful reading of the associated doc page +for the command should allow you to fix these problems. In most cases, +where LAMMPS expects to read a number, either integer or floating point, +it performs a stringent test on whether the provided input actually +is an integer or floating-point number, respectively, and reject the +input with an error message (for instance, when an integer is required, +but a floating-point number 1.0 is provided): + +ERROR: Expected integer parameter in input script or data file :pre + +Some commands allow for using variable references in place of numeric +constants so that the value can be evaluated and may change over the +course of a run. This is typically done with the syntax {v_name} for a +parameter, where name is the name of the variable. On the other hand, +immediate variable expansion with the syntax ${name} is performed while +reading the input and before parsing commands, + +NOTE: Using a variable reference (i.e. {v_name}) is only allowed if +the documentation of the corresponding command explicitly says it is. + +Generally, LAMMPS will print a message to the screen and logfile and +exit gracefully when it encounters a fatal error. Sometimes it will +print a WARNING to the screen and logfile and continue on; you can +decide if the WARNING is important or not. A WARNING message that is +generated in the middle of a run is only printed to the screen, not to +the logfile, to avoid cluttering up thermodynamic output. If LAMMPS +crashes or hangs without spitting out an error message first then it +could be a bug (see "this section"_#err_2) or one of the following +cases: + +LAMMPS runs in the available memory a processor allows to be +allocated. Most reasonable MD runs are compute limited, not memory +limited, so this shouldn't be a bottleneck on most platforms. Almost +all large memory allocations in the code are done via C-style malloc's +which will generate an error message if you run out of memory. +Smaller chunks of memory are allocated via C++ "new" statements. If +you are unlucky you could run out of memory just when one of these +small requests is made, in which case the code will crash or hang (in +parallel), since LAMMPS doesn't trap on those errors. + +Illegal arithmetic can cause LAMMPS to run slow or crash. This is +typically due to invalid physics and numerics that your simulation is +computing. If you see wild thermodynamic values or NaN values in your +LAMMPS output, something is wrong with your simulation. If you +suspect this is happening, it is a good idea to print out +thermodynamic info frequently (e.g. every timestep) via the +"thermo"_thermo.html so you can monitor what is happening. +Visualizing the atom movement is also a good idea to insure your model +is behaving as you expect. + +In parallel, one way LAMMPS can hang is due to how different MPI +implementations handle buffering of messages. If the code hangs +without an error message, it may be that you need to specify an MPI +setting or two (usually via an environment variable) to enable +buffering or boost the sizes of messages that can be buffered. diff --git a/doc/src/Section_errors.txt b/doc/src/Errors_messages.txt similarity index 87% rename from doc/src/Section_errors.txt rename to doc/src/Errors_messages.txt index 95482b06dc..1563e02901 100644 --- a/doc/src/Section_errors.txt +++ b/doc/src/Errors_messages.txt @@ -1,6 +1,5 @@ -"Previous Section"_Section_python.html - "LAMMPS WWW Site"_lws - -"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next -Section"_Section_history.html :c +"Higher level section"_Errors.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -8,185 +7,27 @@ Section"_Section_history.html :c :line -12. Errors :h2 +Error messages :h3 -This section describes the errors you can encounter when using LAMMPS, -either conceptually, or as printed out by the program. +This is an alphabetic list of the ERROR messages LAMMPS prints out and +the reason why. If the explanation here is not sufficient, the +documentation for the offending command may help. Error messages also +list the source file and line number where the error was generated. +For example, a message like this: -12.1 "Common problems"_#err_1 -12.2 "Reporting bugs"_#err_2 -12.3 "Error & warning messages"_#err_3 :all(b) - -:line -:line - -12.1 Common problems :link(err_1),h4 - -If two LAMMPS runs do not produce the exact same answer on different -machines or different numbers of processors, this is typically not a -bug. In theory you should get identical answers on any number of -processors and on any machine. In practice, numerical round-off can -cause slight differences and eventual divergence of molecular dynamics -phase space trajectories within a few 100s or few 1000s of timesteps. -However, the statistical properties of the two runs (e.g. average -energy or temperature) should still be the same. - -If the "velocity"_velocity.html command is used to set initial atom -velocities, a particular atom can be assigned a different velocity -when the problem is run on a different number of processors or on -different machines. If this happens, the phase space trajectories of -the two simulations will rapidly diverge. See the discussion of the -{loop} option in the "velocity"_velocity.html command for details and -options that avoid this issue. - -Similarly, the "create_atoms"_create_atoms.html command generates a -lattice of atoms. For the same physical system, the ordering and -numbering of atoms by atom ID may be different depending on the number -of processors. - -Some commands use random number generators which may be setup to -produce different random number streams on each processor and hence -will produce different effects when run on different numbers of -processors. A commonly-used example is the "fix -langevin"_fix_langevin.html command for thermostatting. - -A LAMMPS simulation typically has two stages, setup and run. Most -LAMMPS errors are detected at setup time; others like a bond -stretching too far may not occur until the middle of a run. - -LAMMPS tries to flag errors and print informative error messages so -you can fix the problem. For most errors it will also print the last -input script command that it was processing. Of course, LAMMPS cannot -figure out your physics or numerical mistakes, like choosing too big a -timestep, specifying erroneous force field coefficients, or putting 2 -atoms on top of each other! If you run into errors that LAMMPS -doesn't catch that you think it should flag, please send an email to -the "developers"_http://lammps.sandia.gov/authors.html. - -If you get an error message about an invalid command in your input -script, you can determine what command is causing the problem by -looking in the log.lammps file or using the "echo command"_echo.html -to see it on the screen. If you get an error like "Invalid ... -style", with ... being fix, compute, pair, etc, it means that you -mistyped the style name or that the command is part of an optional -package which was not compiled into your executable. The list of -available styles in your executable can be listed by using "the -h -command-line argument"_Section_start.html#start_6. The installation -and compilation of optional packages is explained in the "installation -instructions"_Section_start.html#start_3. - -For a given command, LAMMPS expects certain arguments in a specified -order. If you mess this up, LAMMPS will often flag the error, but it -may also simply read a bogus argument and assign a value that is -valid, but not what you wanted. E.g. trying to read the string "abc" -as an integer value of 0. Careful reading of the associated doc page -for the command should allow you to fix these problems. In most cases, -where LAMMPS expects to read a number, either integer or floating point, -it performs a stringent test on whether the provided input actually -is an integer or floating-point number, respectively, and reject the -input with an error message (for instance, when an integer is required, -but a floating-point number 1.0 is provided): - -ERROR: Expected integer parameter in input script or data file :pre - -Some commands allow for using variable references in place of numeric -constants so that the value can be evaluated and may change over the -course of a run. This is typically done with the syntax {v_name} for a -parameter, where name is the name of the variable. On the other hand, -immediate variable expansion with the syntax ${name} is performed while -reading the input and before parsing commands, - -NOTE: Using a variable reference (i.e. {v_name}) is only allowed if -the documentation of the corresponding command explicitly says it is. - -Generally, LAMMPS will print a message to the screen and logfile and -exit gracefully when it encounters a fatal error. Sometimes it will -print a WARNING to the screen and logfile and continue on; you can -decide if the WARNING is important or not. A WARNING message that is -generated in the middle of a run is only printed to the screen, not to -the logfile, to avoid cluttering up thermodynamic output. If LAMMPS -crashes or hangs without spitting out an error message first then it -could be a bug (see "this section"_#err_2) or one of the following -cases: - -LAMMPS runs in the available memory a processor allows to be -allocated. Most reasonable MD runs are compute limited, not memory -limited, so this shouldn't be a bottleneck on most platforms. Almost -all large memory allocations in the code are done via C-style malloc's -which will generate an error message if you run out of memory. -Smaller chunks of memory are allocated via C++ "new" statements. If -you are unlucky you could run out of memory just when one of these -small requests is made, in which case the code will crash or hang (in -parallel), since LAMMPS doesn't trap on those errors. - -Illegal arithmetic can cause LAMMPS to run slow or crash. This is -typically due to invalid physics and numerics that your simulation is -computing. If you see wild thermodynamic values or NaN values in your -LAMMPS output, something is wrong with your simulation. If you -suspect this is happening, it is a good idea to print out -thermodynamic info frequently (e.g. every timestep) via the -"thermo"_thermo.html so you can monitor what is happening. -Visualizing the atom movement is also a good idea to insure your model -is behaving as you expect. - -In parallel, one way LAMMPS can hang is due to how different MPI -implementations handle buffering of messages. If the code hangs -without an error message, it may be that you need to specify an MPI -setting or two (usually via an environment variable) to enable -buffering or boost the sizes of messages that can be buffered. - -:line - -12.2 Reporting bugs :link(err_2),h4 - -If you are confident that you have found a bug in LAMMPS, follow these -steps. - -Check the "New features and bug -fixes"_http://lammps.sandia.gov/bug.html section of the "LAMMPS WWW -site"_lws to see if the bug has already been reported or fixed or the -"Unfixed bug"_http://lammps.sandia.gov/unbug.html to see if a fix is -pending. - -Check the "mailing list"_http://lammps.sandia.gov/mail.html -to see if it has been discussed before. - -If not, send an email to the mailing list describing the problem with -any ideas you have as to what is causing it or where in the code the -problem might be. The developers will ask for more info if needed, -such as an input script or data files. - -The most useful thing you can do to help us fix the bug is to isolate -the problem. Run it on the smallest number of atoms and fewest number -of processors and with the simplest input script that reproduces the -bug and try to identify what command or combination of commands is -causing the problem. - -As a last resort, you can send an email directly to the -"developers"_http://lammps.sandia.gov/authors.html. - -:line - -12.3 Error & warning messages :h3,link(err_3) - -These are two alphabetic lists of the "ERROR"_#error and -"WARNING"_#warn messages LAMMPS prints out and the reason why. If the -explanation here is not sufficient, the documentation for the -offending command may help. -Error and warning messages also list the source file and line number -where the error was generated. For example, this message - -ERROR: Illegal velocity command (velocity.cpp:78) +ERROR: Illegal velocity command (velocity.cpp:78) :pre means that line #78 in the file src/velocity.cpp generated the error. Looking in the source code may help you figure out what went wrong. Note that error messages from "user-contributed -packages"_Section_start.html#start_3 are not listed here. If such an -error occurs and is not self-explanatory, you'll need to look in the -source code or contact the author of the package. +packages"_Section_package.html#table_user are not listed here. If +such an error occurs and is not self-explanatory, you'll need to look +in the source code or contact the author of the package. -Errors: :h3,link(error) +Doc page with "WARNING messages"_Errors_warnings.html + +:line :dlb @@ -803,13 +644,6 @@ lo value must be less than the hi value for all 3 dimensions. :dd The box command cannot be used after a read_data, read_restart, or create_box command. :dd -{BUG: restartinfo=1 but no restart support in pair style} :dt - -The pair style has a bug, where it does not support reading -and writing information to a restart file, but does not set -the member variable restartinfo to 0 as required in that case. :dd - - {CPU neighbor lists must be used for ellipsoid/sphere mix.} :dt When using Gay-Berne or RE-squared pair styles with both ellipsoidal and @@ -11003,904 +10837,3 @@ Self-explanatory. :dd Self-explanatory. :dd :dle - -Warnings: :h3,link(warn) - -:dlb - -{Adjusting Coulombic cutoff for MSM, new cutoff = %g} :dt - -The adjust/cutoff command is turned on and the Coulombic cutoff has been -adjusted to match the user-specified accuracy. :dd - -{Angle atoms missing at step %ld} :dt - -One or more of 3 atoms needed to compute a particular angle are -missing on this processor. Typically this is because the pairwise -cutoff is set too short or the angle has blown apart and an atom is -too far away. :dd - -{Angle style in data file differs from currently defined angle style} :dt - -Self-explanatory. :dd - -{Atom style in data file differs from currently defined atom style} :dt - -Self-explanatory. :dd - -{Bond atom missing in box size check} :dt - -The 2nd atoms needed to compute a particular bond is missing on this -processor. Typically this is because the pairwise cutoff is set too -short or the bond has blown apart and an atom is too far away. :dd - -{Bond atom missing in image check} :dt - -The 2nd atom in a particular bond is missing on this processor. -Typically this is because the pairwise cutoff is set too short or the -bond has blown apart and an atom is too far away. :dd - -{Bond atoms missing at step %ld} :dt - -The 2nd atom needed to compute a particular bond is missing on this -processor. Typically this is because the pairwise cutoff is set too -short or the bond has blown apart and an atom is too far away. :dd - -{Bond style in data file differs from currently defined bond style} :dt - -Self-explanatory. :dd - -{Bond/angle/dihedral extent > half of periodic box length} :dt - -This is a restriction because LAMMPS can be confused about which image -of an atom in the bonded interaction is the correct one to use. -"Extent" in this context means the maximum end-to-end length of the -bond/angle/dihedral. LAMMPS computes this by taking the maximum bond -length, multiplying by the number of bonds in the interaction (e.g. 3 -for a dihedral) and adding a small amount of stretch. :dd - -{Both groups in compute group/group have a net charge; the Kspace boundary correction to energy will be non-zero} :dt - -Self-explanatory. :dd - -{Calling write_dump before a full system init.} :dt - -The write_dump command is used before the system has been fully -initialized as part of a 'run' or 'minimize' command. Not all dump -styles and features are fully supported at this point and thus the -command may fail or produce incomplete or incorrect output. Insert -a "run 0" command, if a full system init is required. :dd - -{Cannot count rigid body degrees-of-freedom before bodies are fully initialized} :dt - -This means the temperature associated with the rigid bodies may be -incorrect on this timestep. :dd - -{Cannot count rigid body degrees-of-freedom before bodies are initialized} :dt - -This means the temperature associated with the rigid bodies may be -incorrect on this timestep. :dd - -{Cannot include log terms without 1/r terms; setting flagHI to 1} :dt - -Self-explanatory. :dd - -{Cannot include log terms without 1/r terms; setting flagHI to 1.} :dt - -Self-explanatory. :dd - -{Charges are set, but coulombic solver is not used} :dt - -Self-explanatory. :dd - -{Charges did not converge at step %ld: %lg} :dt - -Self-explanatory. :dd - -{Communication cutoff is too small for SNAP micro load balancing, increased to %lf} :dt - -Self-explanatory. :dd - -{Compute cna/atom cutoff may be too large to find ghost atom neighbors} :dt - -The neighbor cutoff used may not encompass enough ghost atoms -to perform this operation correctly. :dd - -{Computing temperature of portions of rigid bodies} :dt - -The group defined by the temperature compute does not encompass all -the atoms in one or more rigid bodies, so the change in -degrees-of-freedom for the atoms in those partial rigid bodies will -not be accounted for. :dd - -{Create_bonds max distance > minimum neighbor cutoff} :dt - -This means atom pairs for some atom types may not be in the neighbor -list and thus no bond can be created between them. :dd - -{Delete_atoms cutoff > minimum neighbor cutoff} :dt - -This means atom pairs for some atom types may not be in the neighbor -list and thus an atom in that pair cannot be deleted. :dd - -{Dihedral atoms missing at step %ld} :dt - -One or more of 4 atoms needed to compute a particular dihedral are -missing on this processor. Typically this is because the pairwise -cutoff is set too short or the dihedral has blown apart and an atom is -too far away. :dd - -{Dihedral problem} :dt - -Conformation of the 4 listed dihedral atoms is extreme; you may want -to check your simulation geometry. :dd - -{Dihedral problem: %d %ld %d %d %d %d} :dt - -Conformation of the 4 listed dihedral atoms is extreme; you may want -to check your simulation geometry. :dd - -{Dihedral style in data file differs from currently defined dihedral style} :dt - -Self-explanatory. :dd - -{Dump dcd/xtc timestamp may be wrong with fix dt/reset} :dt - -If the fix changes the timestep, the dump dcd file will not -reflect the change. :dd - -{Energy due to X extra global DOFs will be included in minimizer energies} :dt - -When using fixes like box/relax, the potential energy used by the minimizer -is augmented by an additional energy provided by the fix. Thus the printed -converged energy may be different from the total potential energy. :dd - -{Energy tally does not account for 'zero yes'} :dt - -The energy removed by using the 'zero yes' flag is not accounted -for in the energy tally and thus energy conservation cannot be -monitored in this case. :dd - -{Estimated error in splitting of dispersion coeffs is %g} :dt - -Error is greater than 0.0001 percent. :dd - -{Ewald/disp Newton solver failed, using old method to estimate g_ewald} :dt - -Self-explanatory. Choosing a different cutoff value may help. :dd - -{FENE bond too long} :dt - -A FENE bond has stretched dangerously far. It's interaction strength -will be truncated to attempt to prevent the bond from blowing up. :dd - -{FENE bond too long: %ld %d %d %g} :dt - -A FENE bond has stretched dangerously far. It's interaction strength -will be truncated to attempt to prevent the bond from blowing up. :dd - -{FENE bond too long: %ld %g} :dt - -A FENE bond has stretched dangerously far. It's interaction strength -will be truncated to attempt to prevent the bond from blowing up. :dd - -{Fix SRD walls overlap but fix srd overlap not set} :dt - -You likely want to set this in your input script. :dd - -{Fix bond/swap will ignore defined angles} :dt - -See the doc page for fix bond/swap for more info on this -restriction. :dd - -{Fix deposit near setting < possible overlap separation %g} :dt - -This test is performed for finite size particles with a diameter, not -for point particles. The near setting is smaller than the particle -diameter which can lead to overlaps. :dd - -{Fix evaporate may delete atom with non-zero molecule ID} :dt - -This is probably an error, since you should not delete only one atom -of a molecule. :dd - -{Fix gcmc using full_energy option} :dt - -Fix gcmc has automatically turned on the full_energy option since it -is required for systems like the one specified by the user. User input -included one or more of the following: kspace, triclinic, a hybrid -pair style, an eam pair style, or no "single" function for the pair -style. :dd - -{Fix property/atom mol or charge w/out ghost communication} :dt - -A model typically needs these properties defined for ghost atoms. :dd - -{Fix qeq CG convergence failed (%g) after %d iterations at %ld step} :dt - -Self-explanatory. :dd - -{Fix qeq has non-zero lower Taper radius cutoff} :dt - -Absolute value must be <= 0.01. :dd - -{Fix qeq has very low Taper radius cutoff} :dt - -Value should typically be >= 5.0. :dd - -{Fix qeq/dynamic tolerance may be too small for damped dynamics} :dt - -Self-explanatory. :dd - -{Fix qeq/fire tolerance may be too small for damped fires} :dt - -Self-explanatory. :dd - -{Fix rattle should come after all other integration fixes} :dt - -This fix is designed to work after all other integration fixes change -atom positions. Thus it should be the last integration fix specified. -If not, it will not satisfy the desired constraints as well as it -otherwise would. :dd - -{Fix recenter should come after all other integration fixes} :dt - -Other fixes may change the position of the center-of-mass, so -fix recenter should come last. :dd - -{Fix srd SRD moves may trigger frequent reneighboring} :dt - -This is because the SRD particles may move long distances. :dd - -{Fix srd grid size > 1/4 of big particle diameter} :dt - -This may cause accuracy problems. :dd - -{Fix srd particle moved outside valid domain} :dt - -This may indicate a problem with your simulation parameters. :dd - -{Fix srd particles may move > big particle diameter} :dt - -This may cause accuracy problems. :dd - -{Fix srd viscosity < 0.0 due to low SRD density} :dt - -This may cause accuracy problems. :dd - -{Fix thermal/conductivity comes before fix ave/spatial} :dt - -The order of these 2 fixes in your input script is such that fix -thermal/conductivity comes first. If you are using fix ave/spatial to -measure the temperature profile induced by fix viscosity, then this -may cause a glitch in the profile since you are averaging immediately -after swaps have occurred. Flipping the order of the 2 fixes -typically helps. :dd - -{Fix viscosity comes before fix ave/spatial} :dt - -The order of these 2 fixes in your input script is such that -fix viscosity comes first. If you are using fix ave/spatial -to measure the velocity profile induced by fix viscosity, then -this may cause a glitch in the profile since you are averaging -immediately after swaps have occurred. Flipping the order -of the 2 fixes typically helps. :dd - -{Fixes cannot send data in Kokkos communication, switching to classic communication} :dt - -This is current restriction with Kokkos. :dd - -{For better accuracy use 'pair_modify table 0'} :dt - -The user-specified force accuracy cannot be achieved unless the table -feature is disabled by using 'pair_modify table 0'. :dd - -{Geometric mixing assumed for 1/r^6 coefficients} :dt - -Self-explanatory. :dd - -{Group for fix_modify temp != fix group} :dt - -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. :dd - -{H matrix size has been exceeded: m_fill=%d H.m=%d\n} :dt - -This is the size of the matrix. :dd - -{Ignoring unknown or incorrect info command flag} :dt - -Self-explanatory. An unknown argument was given to the info command. -Compare your input with the documentation. :dd - -{Improper atoms missing at step %ld} :dt - -One or more of 4 atoms needed to compute a particular improper are -missing on this processor. Typically this is because the pairwise -cutoff is set too short or the improper has blown apart and an atom is -too far away. :dd - -{Improper problem: %d %ld %d %d %d %d} :dt - -Conformation of the 4 listed improper atoms is extreme; you may want -to check your simulation geometry. :dd - -{Improper style in data file differs from currently defined improper style} :dt - -Self-explanatory. :dd - -{Inconsistent image flags} :dt - -The image flags for a pair on bonded atoms appear to be inconsistent. -Inconsistent means that when the coordinates of the two atoms are -unwrapped using the image flags, the two atoms are far apart. -Specifically they are further apart than half a periodic box length. -Or they are more than a box length apart in a non-periodic dimension. -This is usually due to the initial data file not having correct image -flags for the 2 atoms in a bond that straddles a periodic boundary. -They should be different by 1 in that case. This is a warning because -inconsistent image flags will not cause problems for dynamics or most -LAMMPS simulations. However they can cause problems when such atoms -are used with the fix rigid or replicate commands. Note that if you -have an infinite periodic crystal with bonds then it is impossible to -have fully consistent image flags, since some bonds will cross -periodic boundaries and connect two atoms with the same image -flag. :dd - -{KIM Model does not provide 'energy'; Potential energy will be zero} :dt - -Self-explanatory. :dd - -{KIM Model does not provide 'forces'; Forces will be zero} :dt - -Self-explanatory. :dd - -{KIM Model does not provide 'particleEnergy'; energy per atom will be zero} :dt - -Self-explanatory. :dd - -{KIM Model does not provide 'particleVirial'; virial per atom will be zero} :dt - -Self-explanatory. :dd - -{Kspace_modify slab param < 2.0 may cause unphysical behavior} :dt - -The kspace_modify slab parameter should be larger to insure periodic -grids padded with empty space do not overlap. :dd - -{Less insertions than requested} :dt - -The fix pour command was unsuccessful at finding open space -for as many particles as it tried to insert. :dd - -{Library error in lammps_gather_atoms} :dt - -This library function cannot be used if atom IDs are not defined -or are not consecutively numbered. :dd - -{Library error in lammps_scatter_atoms} :dt - -This library function cannot be used if atom IDs are not defined or -are not consecutively numbered, or if no atom map is defined. See the -atom_modify command for details about atom maps. :dd - -{Lost atoms via change_box: original %ld current %ld} :dt - -The command options you have used caused atoms to be lost. :dd - -{Lost atoms via displace_atoms: original %ld current %ld} :dt - -The command options you have used caused atoms to be lost. :dd - -{Lost atoms: original %ld current %ld} :dt - -Lost atoms are checked for each time thermo output is done. See the -thermo_modify lost command for options. Lost atoms usually indicate -bad dynamics, e.g. atoms have been blown far out of the simulation -box, or moved further than one processor's sub-domain away before -reneighboring. :dd - -{MSM mesh too small, increasing to 2 points in each direction} :dt - -Self-explanatory. :dd - -{Mismatch between velocity and compute groups} :dt - -The temperature computation used by the velocity command will not be -on the same group of atoms that velocities are being set for. :dd - -{Mixing forced for lj coefficients} :dt - -Self-explanatory. :dd - -{Molecule attributes do not match system attributes} :dt - -An attribute is specified (e.g. diameter, charge) that is -not defined for the specified atom style. :dd - -{Molecule has bond topology but no special bond settings} :dt - -This means the bonded atoms will not be excluded in pair-wise -interactions. :dd - -{Molecule template for create_atoms has multiple molecules} :dt - -The create_atoms command will only create molecules of a single type, -i.e. the first molecule in the template. :dd - -{Molecule template for fix gcmc has multiple molecules} :dt - -The fix gcmc command will only create molecules of a single type, -i.e. the first molecule in the template. :dd - -{Molecule template for fix shake has multiple molecules} :dt - -The fix shake command will only recognize molecules of a single -type, i.e. the first molecule in the template. :dd - -{More than one compute centro/atom} :dt - -It is not efficient to use compute centro/atom more than once. :dd - -{More than one compute cluster/atom} :dt - -It is not efficient to use compute cluster/atom more than once. :dd - -{More than one compute cna/atom defined} :dt - -It is not efficient to use compute cna/atom more than once. :dd - -{More than one compute contact/atom} :dt - -It is not efficient to use compute contact/atom more than once. :dd - -{More than one compute coord/atom} :dt - -It is not efficient to use compute coord/atom more than once. :dd - -{More than one compute damage/atom} :dt - -It is not efficient to use compute ke/atom more than once. :dd - -{More than one compute dilatation/atom} :dt - -Self-explanatory. :dd - -{More than one compute erotate/sphere/atom} :dt - -It is not efficient to use compute erorate/sphere/atom more than once. :dd - -{More than one compute hexorder/atom} :dt - -It is not efficient to use compute hexorder/atom more than once. :dd - -{More than one compute ke/atom} :dt - -It is not efficient to use compute ke/atom more than once. :dd - -{More than one compute orientorder/atom} :dt - -It is not efficient to use compute orientorder/atom more than once. :dd - -{More than one compute plasticity/atom} :dt - -Self-explanatory. :dd - -{More than one compute sna/atom} :dt - -Self-explanatory. :dd - -{More than one compute snad/atom} :dt - -Self-explanatory. :dd - -{More than one compute snav/atom} :dt - -Self-explanatory. :dd - -{More than one fix poems} :dt - -It is not efficient to use fix poems more than once. :dd - -{More than one fix rigid} :dt - -It is not efficient to use fix rigid more than once. :dd - -{Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies} :dt - -This is because excluding specific pair interactions also excludes -them from long-range interactions which may not be the desired effect. -The special_bonds command handles this consistently by insuring -excluded (or weighted) 1-2, 1-3, 1-4 interactions are treated -consistently by both the short-range pair style and the long-range -solver. This is not done for exclusions of charged atom pairs via the -neigh_modify exclude command. :dd - -{New thermo_style command, previous thermo_modify settings will be lost} :dt - -If a thermo_style command is used after a thermo_modify command, the -settings changed by the thermo_modify command will be reset to their -default values. This is because the thermo_modify command acts on -the currently defined thermo style, and a thermo_style command creates -a new style. :dd - -{No Kspace calculation with verlet/split} :dt - -The 2nd partition performs a kspace calculation so the kspace_style -command must be used. :dd - -{No automatic unit conversion to XTC file format conventions possible for units lj} :dt - -This means no scaling will be performed. :dd - -{No fixes defined, atoms won't move} :dt - -If you are not using a fix like nve, nvt, npt then atom velocities and -coordinates will not be updated during timestepping. :dd - -{No joints between rigid bodies, use fix rigid instead} :dt - -The bodies defined by fix poems are not connected by joints. POEMS -will integrate the body motion, but it would be more efficient to use -fix rigid. :dd - -{Not using real units with pair reax} :dt - -This is most likely an error, unless you have created your own ReaxFF -parameter file in a different set of units. :dd - -{Number of MSM mesh points changed to be a multiple of 2} :dt - -MSM requires that the number of grid points in each direction be a multiple -of two and the number of grid points in one or more directions have been -adjusted to meet this requirement. :dd - -{OMP_NUM_THREADS environment is not set.} :dt - -This environment variable must be set appropriately to use the -USER-OMP package. :dd - -{One or more atoms are time integrated more than once} :dt - -This is probably an error since you typically do not want to -advance the positions or velocities of an atom more than once -per timestep. :dd - -{One or more chunks do not contain all atoms in molecule} :dt - -This may not be what you intended. :dd - -{One or more dynamic groups may not be updated at correct point in timestep} :dt - -If there are other fixes that act immediately after the initial stage -of time integration within a timestep (i.e. after atoms move), then -the command that sets up the dynamic group should appear after those -fixes. This will insure that dynamic group assignments are made -after all atoms have moved. :dd - -{One or more respa levels compute no forces} :dt - -This is computationally inefficient. :dd - -{Pair COMB charge %.10f with force %.10f hit max barrier} :dt - -Something is possibly wrong with your model. :dd - -{Pair COMB charge %.10f with force %.10f hit min barrier} :dt - -Something is possibly wrong with your model. :dd - -{Pair brownian needs newton pair on for momentum conservation} :dt - -Self-explanatory. :dd - -{Pair dpd needs newton pair on for momentum conservation} :dt - -Self-explanatory. :dd - -{Pair dsmc: num_of_collisions > number_of_A} :dt - -Collision model in DSMC is breaking down. :dd - -{Pair dsmc: num_of_collisions > number_of_B} :dt - -Collision model in DSMC is breaking down. :dd - -{Pair style in data file differs from currently defined pair style} :dt - -Self-explanatory. :dd - -{Particle deposition was unsuccessful} :dt - -The fix deposit command was not able to insert as many atoms as -needed. The requested volume fraction may be too high, or other atoms -may be in the insertion region. :dd - -{Proc sub-domain size < neighbor skin, could lead to lost atoms} :dt - -The decomposition of the physical domain (likely due to load -balancing) has led to a processor's sub-domain being smaller than the -neighbor skin in one or more dimensions. Since reneighboring is -triggered by atoms moving the skin distance, this may lead to lost -atoms, if an atom moves all the way across a neighboring processor's -sub-domain before reneighboring is triggered. :dd - -{Reducing PPPM order b/c stencil extends beyond nearest neighbor processor} :dt - -This may lead to a larger grid than desired. See the kspace_modify overlap -command to prevent changing of the PPPM order. :dd - -{Reducing PPPMDisp Coulomb order b/c stencil extends beyond neighbor processor} :dt - -This may lead to a larger grid than desired. See the kspace_modify overlap -command to prevent changing of the PPPM order. :dd - -{Reducing PPPMDisp dispersion order b/c stencil extends beyond neighbor processor} :dt - -This may lead to a larger grid than desired. See the kspace_modify overlap -command to prevent changing of the PPPM order. :dd - -{Replacing a fix, but new group != old group} :dt - -The ID and style of a fix match for a fix you are changing with a fix -command, but the new group you are specifying does not match the old -group. :dd - -{Replicating in a non-periodic dimension} :dt - -The parameters for a replicate command will cause a non-periodic -dimension to be replicated; this may cause unwanted behavior. :dd - -{Resetting reneighboring criteria during PRD} :dt - -A PRD simulation requires that neigh_modify settings be delay = 0, -every = 1, check = yes. Since these settings were not in place, -LAMMPS changed them and will restore them to their original values -after the PRD simulation. :dd - -{Resetting reneighboring criteria during TAD} :dt - -A TAD simulation requires that neigh_modify settings be delay = 0, -every = 1, check = yes. Since these settings were not in place, -LAMMPS changed them and will restore them to their original values -after the PRD simulation. :dd - -{Resetting reneighboring criteria during minimization} :dt - -Minimization requires that neigh_modify settings be delay = 0, every = -1, check = yes. Since these settings were not in place, LAMMPS -changed them and will restore them to their original values after the -minimization. :dd - -{Restart file used different # of processors} :dt - -The restart file was written out by a LAMMPS simulation running on a -different number of processors. Due to round-off, the trajectories of -your restarted simulation may diverge a little more quickly than if -you ran on the same # of processors. :dd - -{Restart file used different 3d processor grid} :dt - -The restart file was written out by a LAMMPS simulation running on a -different 3d grid of processors. Due to round-off, the trajectories -of your restarted simulation may diverge a little more quickly than if -you ran on the same # of processors. :dd - -{Restart file used different boundary settings, using restart file values} :dt - -Your input script cannot change these restart file settings. :dd - -{Restart file used different newton bond setting, using restart file value} :dt - -The restart file value will override the setting in the input script. :dd - -{Restart file used different newton pair setting, using input script value} :dt - -The input script value will override the setting in the restart file. :dd - -{Restrain problem: %d %ld %d %d %d %d} :dt - -Conformation of the 4 listed dihedral atoms is extreme; you may want -to check your simulation geometry. :dd - -{Running PRD with only one replica} :dt - -This is allowed, but you will get no parallel speed-up. :dd - -{SRD bin shifting turned on due to small lamda} :dt - -This is done to try to preserve accuracy. :dd - -{SRD bin size for fix srd differs from user request} :dt - -Fix SRD had to adjust the bin size to fit the simulation box. See the -cubic keyword if you want this message to be an error vs warning. :dd - -{SRD bins for fix srd are not cubic enough} :dt - -The bin shape is not within tolerance of cubic. See the cubic -keyword if you want this message to be an error vs warning. :dd - -{SRD particle %d started inside big particle %d on step %ld bounce %d} :dt - -See the inside keyword if you want this message to be an error vs -warning. :dd - -{SRD particle %d started inside wall %d on step %ld bounce %d} :dt - -See the inside keyword if you want this message to be an error vs -warning. :dd - -{Shake determinant < 0.0} :dt - -The determinant of the quadratic equation being solved for a single -cluster specified by the fix shake command is numerically suspect. LAMMPS -will set it to 0.0 and continue. :dd - -{Shell command '%s' failed with error '%s'} :dt - -Self-explanatory. :dd - -{Shell command returned with non-zero status} :dt - -This may indicate the shell command did not operate as expected. :dd - -{Should not allow rigid bodies to bounce off relecting walls} :dt - -LAMMPS allows this, but their dynamics are not computed correctly. :dd - -{Should not use fix nve/limit with fix shake or fix rattle} :dt - -This will lead to invalid constraint forces in the SHAKE/RATTLE -computation. :dd - -{Simulations might be very slow because of large number of structure factors} :dt - -Self-explanatory. :dd - -{Slab correction not needed for MSM} :dt - -Slab correction is intended to be used with Ewald or PPPM and is not needed by MSM. :dd - -{System is not charge neutral, net charge = %g} :dt - -The total charge on all atoms on the system is not 0.0. -For some KSpace solvers this is only a warning. :dd - -{Table inner cutoff >= outer cutoff} :dt - -You specified an inner cutoff for a Coulombic table that is longer -than the global cutoff. Probably not what you wanted. :dd - -{Temperature for MSST is not for group all} :dt - -User-assigned temperature to MSST fix does not compute temperature for -all atoms. Since MSST computes a global pressure, the kinetic energy -contribution from the temperature is assumed to also be for all atoms. -Thus the pressure used by MSST could be inaccurate. :dd - -{Temperature for NPT is not for group all} :dt - -User-assigned temperature to NPT fix does not compute temperature for -all atoms. Since NPT computes a global pressure, the kinetic energy -contribution from the temperature is assumed to also be for all atoms. -Thus the pressure used by NPT could be inaccurate. :dd - -{Temperature for fix modify is not for group all} :dt - -The temperature compute is being used with a pressure calculation -which does operate on group all, so this may be inconsistent. :dd - -{Temperature for thermo pressure is not for group all} :dt - -User-assigned temperature to thermo via the thermo_modify command does -not compute temperature for all atoms. Since thermo computes a global -pressure, the kinetic energy contribution from the temperature is -assumed to also be for all atoms. Thus the pressure printed by thermo -could be inaccurate. :dd - -{The fix ave/spatial command has been replaced by the more flexible fix ave/chunk and compute chunk/atom commands -- fix ave/spatial will be removed in the summer of 2015} :dt - -Self-explanatory. :dd - -{The minimizer does not re-orient dipoles when using fix efield} :dt - -This means that only the atom coordinates will be minimized, -not the orientation of the dipoles. :dd - -{Too many common neighbors in CNA %d times} :dt - -More than the maximum # of neighbors was found multiple times. This -was unexpected. :dd - -{Too many inner timesteps in fix ttm} :dt - -Self-explanatory. :dd - -{Too many neighbors in CNA for %d atoms} :dt - -More than the maximum # of neighbors was found multiple times. This -was unexpected. :dd - -{Triclinic box skew is large} :dt - -The displacement in a skewed direction is normally required to be less -than half the box length in that dimension. E.g. the xy tilt must be -between -half and +half of the x box length. You have relaxed the -constraint using the box tilt command, but the warning means that a -LAMMPS simulation may be inefficient as a result. :dd - -{Use special bonds = 0,1,1 with bond style fene} :dt - -Most FENE models need this setting for the special_bonds command. :dd - -{Use special bonds = 0,1,1 with bond style fene/expand} :dt - -Most FENE models need this setting for the special_bonds command. :dd - -{Using a manybody potential with bonds/angles/dihedrals and special_bond exclusions} :dt - -This is likely not what you want to do. The exclusion settings will -eliminate neighbors in the neighbor list, which the manybody potential -needs to calculated its terms correctly. :dd - -{Using compute temp/deform with inconsistent fix deform remap option} :dt - -Fix nvt/sllod assumes deforming atoms have a velocity profile provided -by "remap v" or "remap none" as a fix deform option. :dd - -{Using compute temp/deform with no fix deform defined} :dt - -This is probably an error, since it makes little sense to use -compute temp/deform in this case. :dd - -{Using fix srd with box deformation but no SRD thermostat} :dt - -The deformation will heat the SRD particles so this can -be dangerous. :dd - -{Using kspace solver on system with no charge} :dt - -Self-explanatory. :dd - -{Using largest cut-off for lj/long/dipole/long long long} :dt - -Self-explanatory. :dd - -{Using largest cutoff for buck/long/coul/long} :dt - -Self-explanatory. :dd - -{Using largest cutoff for lj/long/coul/long} :dt - -Self-explanatory. :dd - -{Using largest cutoff for pair_style lj/long/tip4p/long} :dt - -Self-explanatory. :dd - -{Using package gpu without any pair style defined} :dt - -Self-explanatory. :dd - -{Using pair potential shift with pair_modify compute no} :dt - -The shift effects will thus not be computed. :dd - -{Using pair tail corrections with nonperiodic system} :dt - -This is probably a bogus thing to do, since tail corrections are -computed by integrating the density of a periodic system out to -infinity. :dd - -{Using pair tail corrections with pair_modify compute no} :dt - -The tail corrections will thus not be computed. :dd - -{pair style reax is now deprecated and will soon be retired. Users should switch to pair_style reax/c} :dt - -Self-explanatory. :dd - -:dle - diff --git a/doc/src/Errors_warnings.txt b/doc/src/Errors_warnings.txt new file mode 100644 index 0000000000..0324f563b6 --- /dev/null +++ b/doc/src/Errors_warnings.txt @@ -0,0 +1,934 @@ +"Higher level section"_Errors.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Warning messages :h3 + +This is an alphabetic list of the WARNING messages LAMMPS prints out +and the reason why. If the explanation here is not sufficient, the +documentation for the offending command may help. Warning messages +also list the source file and line number where the warning was +generated. For example, a message lile this: + +WARNING: Bond atom missing in box size check (domain.cpp:187) :pre + +means that line #187 in the file src/domain.cpp generated the error. +Looking in the source code may help you figure out what went wrong. + +Note that warning messages from "user-contributed +packages"_Section_start.html#table_user are not listed here. If such +a warning occurs and is not self-explanatory, you'll need to look in +the source code or contact the author of the package. + +Doc page with "ERROR messages"_Errors_messages.html + +:line + +:dlb + +{Adjusting Coulombic cutoff for MSM, new cutoff = %g} :dt + +The adjust/cutoff command is turned on and the Coulombic cutoff has been +adjusted to match the user-specified accuracy. :dd + +{Angle atoms missing at step %ld} :dt + +One or more of 3 atoms needed to compute a particular angle are +missing on this processor. Typically this is because the pairwise +cutoff is set too short or the angle has blown apart and an atom is +too far away. :dd + +{Angle style in data file differs from currently defined angle style} :dt + +Self-explanatory. :dd + +{Atom style in data file differs from currently defined atom style} :dt + +Self-explanatory. :dd + +{Bond atom missing in box size check} :dt + +The 2nd atoms needed to compute a particular bond is missing on this +processor. Typically this is because the pairwise cutoff is set too +short or the bond has blown apart and an atom is too far away. :dd + +{Bond atom missing in image check} :dt + +The 2nd atom in a particular bond is missing on this processor. +Typically this is because the pairwise cutoff is set too short or the +bond has blown apart and an atom is too far away. :dd + +{Bond atoms missing at step %ld} :dt + +The 2nd atom needed to compute a particular bond is missing on this +processor. Typically this is because the pairwise cutoff is set too +short or the bond has blown apart and an atom is too far away. :dd + +{Bond style in data file differs from currently defined bond style} :dt + +Self-explanatory. :dd + +{Bond/angle/dihedral extent > half of periodic box length} :dt + +This is a restriction because LAMMPS can be confused about which image +of an atom in the bonded interaction is the correct one to use. +"Extent" in this context means the maximum end-to-end length of the +bond/angle/dihedral. LAMMPS computes this by taking the maximum bond +length, multiplying by the number of bonds in the interaction (e.g. 3 +for a dihedral) and adding a small amount of stretch. :dd + +{Both groups in compute group/group have a net charge; the Kspace boundary correction to energy will be non-zero} :dt + +Self-explanatory. :dd + +{Calling write_dump before a full system init.} :dt + +The write_dump command is used before the system has been fully +initialized as part of a 'run' or 'minimize' command. Not all dump +styles and features are fully supported at this point and thus the +command may fail or produce incomplete or incorrect output. Insert +a "run 0" command, if a full system init is required. :dd + +{Cannot count rigid body degrees-of-freedom before bodies are fully initialized} :dt + +This means the temperature associated with the rigid bodies may be +incorrect on this timestep. :dd + +{Cannot count rigid body degrees-of-freedom before bodies are initialized} :dt + +This means the temperature associated with the rigid bodies may be +incorrect on this timestep. :dd + +{Cannot include log terms without 1/r terms; setting flagHI to 1} :dt + +Self-explanatory. :dd + +{Cannot include log terms without 1/r terms; setting flagHI to 1.} :dt + +Self-explanatory. :dd + +{Charges are set, but coulombic solver is not used} :dt + +Self-explanatory. :dd + +{Charges did not converge at step %ld: %lg} :dt + +Self-explanatory. :dd + +{Communication cutoff is too small for SNAP micro load balancing, increased to %lf} :dt + +Self-explanatory. :dd + +{Compute cna/atom cutoff may be too large to find ghost atom neighbors} :dt + +The neighbor cutoff used may not encompass enough ghost atoms +to perform this operation correctly. :dd + +{Computing temperature of portions of rigid bodies} :dt + +The group defined by the temperature compute does not encompass all +the atoms in one or more rigid bodies, so the change in +degrees-of-freedom for the atoms in those partial rigid bodies will +not be accounted for. :dd + +{Create_bonds max distance > minimum neighbor cutoff} :dt + +This means atom pairs for some atom types may not be in the neighbor +list and thus no bond can be created between them. :dd + +{Delete_atoms cutoff > minimum neighbor cutoff} :dt + +This means atom pairs for some atom types may not be in the neighbor +list and thus an atom in that pair cannot be deleted. :dd + +{Dihedral atoms missing at step %ld} :dt + +One or more of 4 atoms needed to compute a particular dihedral are +missing on this processor. Typically this is because the pairwise +cutoff is set too short or the dihedral has blown apart and an atom is +too far away. :dd + +{Dihedral problem} :dt + +Conformation of the 4 listed dihedral atoms is extreme; you may want +to check your simulation geometry. :dd + +{Dihedral problem: %d %ld %d %d %d %d} :dt + +Conformation of the 4 listed dihedral atoms is extreme; you may want +to check your simulation geometry. :dd + +{Dihedral style in data file differs from currently defined dihedral style} :dt + +Self-explanatory. :dd + +{Dump dcd/xtc timestamp may be wrong with fix dt/reset} :dt + +If the fix changes the timestep, the dump dcd file will not +reflect the change. :dd + +{Energy due to X extra global DOFs will be included in minimizer energies} :dt + +When using fixes like box/relax, the potential energy used by the minimizer +is augmented by an additional energy provided by the fix. Thus the printed +converged energy may be different from the total potential energy. :dd + +{Energy tally does not account for 'zero yes'} :dt + +The energy removed by using the 'zero yes' flag is not accounted +for in the energy tally and thus energy conservation cannot be +monitored in this case. :dd + +{Estimated error in splitting of dispersion coeffs is %g} :dt + +Error is greater than 0.0001 percent. :dd + +{Ewald/disp Newton solver failed, using old method to estimate g_ewald} :dt + +Self-explanatory. Choosing a different cutoff value may help. :dd + +{FENE bond too long} :dt + +A FENE bond has stretched dangerously far. It's interaction strength +will be truncated to attempt to prevent the bond from blowing up. :dd + +{FENE bond too long: %ld %d %d %g} :dt + +A FENE bond has stretched dangerously far. It's interaction strength +will be truncated to attempt to prevent the bond from blowing up. :dd + +{FENE bond too long: %ld %g} :dt + +A FENE bond has stretched dangerously far. It's interaction strength +will be truncated to attempt to prevent the bond from blowing up. :dd + +{Fix SRD walls overlap but fix srd overlap not set} :dt + +You likely want to set this in your input script. :dd + +{Fix bond/swap will ignore defined angles} :dt + +See the doc page for fix bond/swap for more info on this +restriction. :dd + +{Fix deposit near setting < possible overlap separation %g} :dt + +This test is performed for finite size particles with a diameter, not +for point particles. The near setting is smaller than the particle +diameter which can lead to overlaps. :dd + +{Fix evaporate may delete atom with non-zero molecule ID} :dt + +This is probably an error, since you should not delete only one atom +of a molecule. :dd + +{Fix gcmc using full_energy option} :dt + +Fix gcmc has automatically turned on the full_energy option since it +is required for systems like the one specified by the user. User input +included one or more of the following: kspace, triclinic, a hybrid +pair style, an eam pair style, or no "single" function for the pair +style. :dd + +{Fix property/atom mol or charge w/out ghost communication} :dt + +A model typically needs these properties defined for ghost atoms. :dd + +{Fix qeq CG convergence failed (%g) after %d iterations at %ld step} :dt + +Self-explanatory. :dd + +{Fix qeq has non-zero lower Taper radius cutoff} :dt + +Absolute value must be <= 0.01. :dd + +{Fix qeq has very low Taper radius cutoff} :dt + +Value should typically be >= 5.0. :dd + +{Fix qeq/dynamic tolerance may be too small for damped dynamics} :dt + +Self-explanatory. :dd + +{Fix qeq/fire tolerance may be too small for damped fires} :dt + +Self-explanatory. :dd + +{Fix rattle should come after all other integration fixes} :dt + +This fix is designed to work after all other integration fixes change +atom positions. Thus it should be the last integration fix specified. +If not, it will not satisfy the desired constraints as well as it +otherwise would. :dd + +{Fix recenter should come after all other integration fixes} :dt + +Other fixes may change the position of the center-of-mass, so +fix recenter should come last. :dd + +{Fix srd SRD moves may trigger frequent reneighboring} :dt + +This is because the SRD particles may move long distances. :dd + +{Fix srd grid size > 1/4 of big particle diameter} :dt + +This may cause accuracy problems. :dd + +{Fix srd particle moved outside valid domain} :dt + +This may indicate a problem with your simulation parameters. :dd + +{Fix srd particles may move > big particle diameter} :dt + +This may cause accuracy problems. :dd + +{Fix srd viscosity < 0.0 due to low SRD density} :dt + +This may cause accuracy problems. :dd + +{Fix thermal/conductivity comes before fix ave/spatial} :dt + +The order of these 2 fixes in your input script is such that fix +thermal/conductivity comes first. If you are using fix ave/spatial to +measure the temperature profile induced by fix viscosity, then this +may cause a glitch in the profile since you are averaging immediately +after swaps have occurred. Flipping the order of the 2 fixes +typically helps. :dd + +{Fix viscosity comes before fix ave/spatial} :dt + +The order of these 2 fixes in your input script is such that +fix viscosity comes first. If you are using fix ave/spatial +to measure the velocity profile induced by fix viscosity, then +this may cause a glitch in the profile since you are averaging +immediately after swaps have occurred. Flipping the order +of the 2 fixes typically helps. :dd + +{Fixes cannot send data in Kokkos communication, switching to classic communication} :dt + +This is current restriction with Kokkos. :dd + +{For better accuracy use 'pair_modify table 0'} :dt + +The user-specified force accuracy cannot be achieved unless the table +feature is disabled by using 'pair_modify table 0'. :dd + +{Geometric mixing assumed for 1/r^6 coefficients} :dt + +Self-explanatory. :dd + +{Group for fix_modify temp != fix group} :dt + +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. :dd + +{H matrix size has been exceeded: m_fill=%d H.m=%d\n} :dt + +This is the size of the matrix. :dd + +{Ignoring unknown or incorrect info command flag} :dt + +Self-explanatory. An unknown argument was given to the info command. +Compare your input with the documentation. :dd + +{Improper atoms missing at step %ld} :dt + +One or more of 4 atoms needed to compute a particular improper are +missing on this processor. Typically this is because the pairwise +cutoff is set too short or the improper has blown apart and an atom is +too far away. :dd + +{Improper problem: %d %ld %d %d %d %d} :dt + +Conformation of the 4 listed improper atoms is extreme; you may want +to check your simulation geometry. :dd + +{Improper style in data file differs from currently defined improper style} :dt + +Self-explanatory. :dd + +{Inconsistent image flags} :dt + +The image flags for a pair on bonded atoms appear to be inconsistent. +Inconsistent means that when the coordinates of the two atoms are +unwrapped using the image flags, the two atoms are far apart. +Specifically they are further apart than half a periodic box length. +Or they are more than a box length apart in a non-periodic dimension. +This is usually due to the initial data file not having correct image +flags for the 2 atoms in a bond that straddles a periodic boundary. +They should be different by 1 in that case. This is a warning because +inconsistent image flags will not cause problems for dynamics or most +LAMMPS simulations. However they can cause problems when such atoms +are used with the fix rigid or replicate commands. Note that if you +have an infinite periodic crystal with bonds then it is impossible to +have fully consistent image flags, since some bonds will cross +periodic boundaries and connect two atoms with the same image +flag. :dd + +{KIM Model does not provide 'energy'; Potential energy will be zero} :dt + +Self-explanatory. :dd + +{KIM Model does not provide 'forces'; Forces will be zero} :dt + +Self-explanatory. :dd + +{KIM Model does not provide 'particleEnergy'; energy per atom will be zero} :dt + +Self-explanatory. :dd + +{KIM Model does not provide 'particleVirial'; virial per atom will be zero} :dt + +Self-explanatory. :dd + +{Kspace_modify slab param < 2.0 may cause unphysical behavior} :dt + +The kspace_modify slab parameter should be larger to insure periodic +grids padded with empty space do not overlap. :dd + +{Less insertions than requested} :dt + +The fix pour command was unsuccessful at finding open space +for as many particles as it tried to insert. :dd + +{Library error in lammps_gather_atoms} :dt + +This library function cannot be used if atom IDs are not defined +or are not consecutively numbered. :dd + +{Library error in lammps_scatter_atoms} :dt + +This library function cannot be used if atom IDs are not defined or +are not consecutively numbered, or if no atom map is defined. See the +atom_modify command for details about atom maps. :dd + +{Lost atoms via change_box: original %ld current %ld} :dt + +The command options you have used caused atoms to be lost. :dd + +{Lost atoms via displace_atoms: original %ld current %ld} :dt + +The command options you have used caused atoms to be lost. :dd + +{Lost atoms: original %ld current %ld} :dt + +Lost atoms are checked for each time thermo output is done. See the +thermo_modify lost command for options. Lost atoms usually indicate +bad dynamics, e.g. atoms have been blown far out of the simulation +box, or moved further than one processor's sub-domain away before +reneighboring. :dd + +{MSM mesh too small, increasing to 2 points in each direction} :dt + +Self-explanatory. :dd + +{Mismatch between velocity and compute groups} :dt + +The temperature computation used by the velocity command will not be +on the same group of atoms that velocities are being set for. :dd + +{Mixing forced for lj coefficients} :dt + +Self-explanatory. :dd + +{Molecule attributes do not match system attributes} :dt + +An attribute is specified (e.g. diameter, charge) that is +not defined for the specified atom style. :dd + +{Molecule has bond topology but no special bond settings} :dt + +This means the bonded atoms will not be excluded in pair-wise +interactions. :dd + +{Molecule template for create_atoms has multiple molecules} :dt + +The create_atoms command will only create molecules of a single type, +i.e. the first molecule in the template. :dd + +{Molecule template for fix gcmc has multiple molecules} :dt + +The fix gcmc command will only create molecules of a single type, +i.e. the first molecule in the template. :dd + +{Molecule template for fix shake has multiple molecules} :dt + +The fix shake command will only recognize molecules of a single +type, i.e. the first molecule in the template. :dd + +{More than one compute centro/atom} :dt + +It is not efficient to use compute centro/atom more than once. :dd + +{More than one compute cluster/atom} :dt + +It is not efficient to use compute cluster/atom more than once. :dd + +{More than one compute cna/atom defined} :dt + +It is not efficient to use compute cna/atom more than once. :dd + +{More than one compute contact/atom} :dt + +It is not efficient to use compute contact/atom more than once. :dd + +{More than one compute coord/atom} :dt + +It is not efficient to use compute coord/atom more than once. :dd + +{More than one compute damage/atom} :dt + +It is not efficient to use compute ke/atom more than once. :dd + +{More than one compute dilatation/atom} :dt + +Self-explanatory. :dd + +{More than one compute erotate/sphere/atom} :dt + +It is not efficient to use compute erorate/sphere/atom more than once. :dd + +{More than one compute hexorder/atom} :dt + +It is not efficient to use compute hexorder/atom more than once. :dd + +{More than one compute ke/atom} :dt + +It is not efficient to use compute ke/atom more than once. :dd + +{More than one compute orientorder/atom} :dt + +It is not efficient to use compute orientorder/atom more than once. :dd + +{More than one compute plasticity/atom} :dt + +Self-explanatory. :dd + +{More than one compute sna/atom} :dt + +Self-explanatory. :dd + +{More than one compute snad/atom} :dt + +Self-explanatory. :dd + +{More than one compute snav/atom} :dt + +Self-explanatory. :dd + +{More than one fix poems} :dt + +It is not efficient to use fix poems more than once. :dd + +{More than one fix rigid} :dt + +It is not efficient to use fix rigid more than once. :dd + +{Neighbor exclusions used with KSpace solver may give inconsistent Coulombic energies} :dt + +This is because excluding specific pair interactions also excludes +them from long-range interactions which may not be the desired effect. +The special_bonds command handles this consistently by insuring +excluded (or weighted) 1-2, 1-3, 1-4 interactions are treated +consistently by both the short-range pair style and the long-range +solver. This is not done for exclusions of charged atom pairs via the +neigh_modify exclude command. :dd + +{New thermo_style command, previous thermo_modify settings will be lost} :dt + +If a thermo_style command is used after a thermo_modify command, the +settings changed by the thermo_modify command will be reset to their +default values. This is because the thermo_modify command acts on +the currently defined thermo style, and a thermo_style command creates +a new style. :dd + +{No Kspace calculation with verlet/split} :dt + +The 2nd partition performs a kspace calculation so the kspace_style +command must be used. :dd + +{No automatic unit conversion to XTC file format conventions possible for units lj} :dt + +This means no scaling will be performed. :dd + +{No fixes defined, atoms won't move} :dt + +If you are not using a fix like nve, nvt, npt then atom velocities and +coordinates will not be updated during timestepping. :dd + +{No joints between rigid bodies, use fix rigid instead} :dt + +The bodies defined by fix poems are not connected by joints. POEMS +will integrate the body motion, but it would be more efficient to use +fix rigid. :dd + +{Not using real units with pair reax} :dt + +This is most likely an error, unless you have created your own ReaxFF +parameter file in a different set of units. :dd + +{Number of MSM mesh points changed to be a multiple of 2} :dt + +MSM requires that the number of grid points in each direction be a multiple +of two and the number of grid points in one or more directions have been +adjusted to meet this requirement. :dd + +{OMP_NUM_THREADS environment is not set.} :dt + +This environment variable must be set appropriately to use the +USER-OMP package. :dd + +{One or more atoms are time integrated more than once} :dt + +This is probably an error since you typically do not want to +advance the positions or velocities of an atom more than once +per timestep. :dd + +{One or more chunks do not contain all atoms in molecule} :dt + +This may not be what you intended. :dd + +{One or more dynamic groups may not be updated at correct point in timestep} :dt + +If there are other fixes that act immediately after the initial stage +of time integration within a timestep (i.e. after atoms move), then +the command that sets up the dynamic group should appear after those +fixes. This will insure that dynamic group assignments are made +after all atoms have moved. :dd + +{One or more respa levels compute no forces} :dt + +This is computationally inefficient. :dd + +{Pair COMB charge %.10f with force %.10f hit max barrier} :dt + +Something is possibly wrong with your model. :dd + +{Pair COMB charge %.10f with force %.10f hit min barrier} :dt + +Something is possibly wrong with your model. :dd + +{Pair brownian needs newton pair on for momentum conservation} :dt + +Self-explanatory. :dd + +{Pair dpd needs newton pair on for momentum conservation} :dt + +Self-explanatory. :dd + +{Pair dsmc: num_of_collisions > number_of_A} :dt + +Collision model in DSMC is breaking down. :dd + +{Pair dsmc: num_of_collisions > number_of_B} :dt + +Collision model in DSMC is breaking down. :dd + +{Pair style in data file differs from currently defined pair style} :dt + +Self-explanatory. :dd + +{Pair style restartinfo set but has no restart support} :dt + +This pair style has a bug, where it does not support reading and +writing information to a restart file, but does not set the member +variable "restartinfo" to 0 as required in that case. :dd + +{Particle deposition was unsuccessful} :dt + +The fix deposit command was not able to insert as many atoms as +needed. The requested volume fraction may be too high, or other atoms +may be in the insertion region. :dd + +{Proc sub-domain size < neighbor skin, could lead to lost atoms} :dt + +The decomposition of the physical domain (likely due to load +balancing) has led to a processor's sub-domain being smaller than the +neighbor skin in one or more dimensions. Since reneighboring is +triggered by atoms moving the skin distance, this may lead to lost +atoms, if an atom moves all the way across a neighboring processor's +sub-domain before reneighboring is triggered. :dd + +{Reducing PPPM order b/c stencil extends beyond nearest neighbor processor} :dt + +This may lead to a larger grid than desired. See the kspace_modify overlap +command to prevent changing of the PPPM order. :dd + +{Reducing PPPMDisp Coulomb order b/c stencil extends beyond neighbor processor} :dt + +This may lead to a larger grid than desired. See the kspace_modify overlap +command to prevent changing of the PPPM order. :dd + +{Reducing PPPMDisp dispersion order b/c stencil extends beyond neighbor processor} :dt + +This may lead to a larger grid than desired. See the kspace_modify overlap +command to prevent changing of the PPPM order. :dd + +{Replacing a fix, but new group != old group} :dt + +The ID and style of a fix match for a fix you are changing with a fix +command, but the new group you are specifying does not match the old +group. :dd + +{Replicating in a non-periodic dimension} :dt + +The parameters for a replicate command will cause a non-periodic +dimension to be replicated; this may cause unwanted behavior. :dd + +{Resetting reneighboring criteria during PRD} :dt + +A PRD simulation requires that neigh_modify settings be delay = 0, +every = 1, check = yes. Since these settings were not in place, +LAMMPS changed them and will restore them to their original values +after the PRD simulation. :dd + +{Resetting reneighboring criteria during TAD} :dt + +A TAD simulation requires that neigh_modify settings be delay = 0, +every = 1, check = yes. Since these settings were not in place, +LAMMPS changed them and will restore them to their original values +after the PRD simulation. :dd + +{Resetting reneighboring criteria during minimization} :dt + +Minimization requires that neigh_modify settings be delay = 0, every = +1, check = yes. Since these settings were not in place, LAMMPS +changed them and will restore them to their original values after the +minimization. :dd + +{Restart file used different # of processors} :dt + +The restart file was written out by a LAMMPS simulation running on a +different number of processors. Due to round-off, the trajectories of +your restarted simulation may diverge a little more quickly than if +you ran on the same # of processors. :dd + +{Restart file used different 3d processor grid} :dt + +The restart file was written out by a LAMMPS simulation running on a +different 3d grid of processors. Due to round-off, the trajectories +of your restarted simulation may diverge a little more quickly than if +you ran on the same # of processors. :dd + +{Restart file used different boundary settings, using restart file values} :dt + +Your input script cannot change these restart file settings. :dd + +{Restart file used different newton bond setting, using restart file value} :dt + +The restart file value will override the setting in the input script. :dd + +{Restart file used different newton pair setting, using input script value} :dt + +The input script value will override the setting in the restart file. :dd + +{Restrain problem: %d %ld %d %d %d %d} :dt + +Conformation of the 4 listed dihedral atoms is extreme; you may want +to check your simulation geometry. :dd + +{Running PRD with only one replica} :dt + +This is allowed, but you will get no parallel speed-up. :dd + +{SRD bin shifting turned on due to small lamda} :dt + +This is done to try to preserve accuracy. :dd + +{SRD bin size for fix srd differs from user request} :dt + +Fix SRD had to adjust the bin size to fit the simulation box. See the +cubic keyword if you want this message to be an error vs warning. :dd + +{SRD bins for fix srd are not cubic enough} :dt + +The bin shape is not within tolerance of cubic. See the cubic +keyword if you want this message to be an error vs warning. :dd + +{SRD particle %d started inside big particle %d on step %ld bounce %d} :dt + +See the inside keyword if you want this message to be an error vs +warning. :dd + +{SRD particle %d started inside wall %d on step %ld bounce %d} :dt + +See the inside keyword if you want this message to be an error vs +warning. :dd + +{Shake determinant < 0.0} :dt + +The determinant of the quadratic equation being solved for a single +cluster specified by the fix shake command is numerically suspect. LAMMPS +will set it to 0.0 and continue. :dd + +{Shell command '%s' failed with error '%s'} :dt + +Self-explanatory. :dd + +{Shell command returned with non-zero status} :dt + +This may indicate the shell command did not operate as expected. :dd + +{Should not allow rigid bodies to bounce off relecting walls} :dt + +LAMMPS allows this, but their dynamics are not computed correctly. :dd + +{Should not use fix nve/limit with fix shake or fix rattle} :dt + +This will lead to invalid constraint forces in the SHAKE/RATTLE +computation. :dd + +{Simulations might be very slow because of large number of structure factors} :dt + +Self-explanatory. :dd + +{Slab correction not needed for MSM} :dt + +Slab correction is intended to be used with Ewald or PPPM and is not needed by MSM. :dd + +{System is not charge neutral, net charge = %g} :dt + +The total charge on all atoms on the system is not 0.0. +For some KSpace solvers this is only a warning. :dd + +{Table inner cutoff >= outer cutoff} :dt + +You specified an inner cutoff for a Coulombic table that is longer +than the global cutoff. Probably not what you wanted. :dd + +{Temperature for MSST is not for group all} :dt + +User-assigned temperature to MSST fix does not compute temperature for +all atoms. Since MSST computes a global pressure, the kinetic energy +contribution from the temperature is assumed to also be for all atoms. +Thus the pressure used by MSST could be inaccurate. :dd + +{Temperature for NPT is not for group all} :dt + +User-assigned temperature to NPT fix does not compute temperature for +all atoms. Since NPT computes a global pressure, the kinetic energy +contribution from the temperature is assumed to also be for all atoms. +Thus the pressure used by NPT could be inaccurate. :dd + +{Temperature for fix modify is not for group all} :dt + +The temperature compute is being used with a pressure calculation +which does operate on group all, so this may be inconsistent. :dd + +{Temperature for thermo pressure is not for group all} :dt + +User-assigned temperature to thermo via the thermo_modify command does +not compute temperature for all atoms. Since thermo computes a global +pressure, the kinetic energy contribution from the temperature is +assumed to also be for all atoms. Thus the pressure printed by thermo +could be inaccurate. :dd + +{The fix ave/spatial command has been replaced by the more flexible fix ave/chunk and compute chunk/atom commands -- fix ave/spatial will be removed in the summer of 2015} :dt + +Self-explanatory. :dd + +{The minimizer does not re-orient dipoles when using fix efield} :dt + +This means that only the atom coordinates will be minimized, +not the orientation of the dipoles. :dd + +{Too many common neighbors in CNA %d times} :dt + +More than the maximum # of neighbors was found multiple times. This +was unexpected. :dd + +{Too many inner timesteps in fix ttm} :dt + +Self-explanatory. :dd + +{Too many neighbors in CNA for %d atoms} :dt + +More than the maximum # of neighbors was found multiple times. This +was unexpected. :dd + +{Triclinic box skew is large} :dt + +The displacement in a skewed direction is normally required to be less +than half the box length in that dimension. E.g. the xy tilt must be +between -half and +half of the x box length. You have relaxed the +constraint using the box tilt command, but the warning means that a +LAMMPS simulation may be inefficient as a result. :dd + +{Use special bonds = 0,1,1 with bond style fene} :dt + +Most FENE models need this setting for the special_bonds command. :dd + +{Use special bonds = 0,1,1 with bond style fene/expand} :dt + +Most FENE models need this setting for the special_bonds command. :dd + +{Using a manybody potential with bonds/angles/dihedrals and special_bond exclusions} :dt + +This is likely not what you want to do. The exclusion settings will +eliminate neighbors in the neighbor list, which the manybody potential +needs to calculated its terms correctly. :dd + +{Using compute temp/deform with inconsistent fix deform remap option} :dt + +Fix nvt/sllod assumes deforming atoms have a velocity profile provided +by "remap v" or "remap none" as a fix deform option. :dd + +{Using compute temp/deform with no fix deform defined} :dt + +This is probably an error, since it makes little sense to use +compute temp/deform in this case. :dd + +{Using fix srd with box deformation but no SRD thermostat} :dt + +The deformation will heat the SRD particles so this can +be dangerous. :dd + +{Using kspace solver on system with no charge} :dt + +Self-explanatory. :dd + +{Using largest cut-off for lj/long/dipole/long long long} :dt + +Self-explanatory. :dd + +{Using largest cutoff for buck/long/coul/long} :dt + +Self-explanatory. :dd + +{Using largest cutoff for lj/long/coul/long} :dt + +Self-explanatory. :dd + +{Using largest cutoff for pair_style lj/long/tip4p/long} :dt + +Self-explanatory. :dd + +{Using package gpu without any pair style defined} :dt + +Self-explanatory. :dd + +{Using pair potential shift with pair_modify compute no} :dt + +The shift effects will thus not be computed. :dd + +{Using pair tail corrections with nonperiodic system} :dt + +This is probably a bogus thing to do, since tail corrections are +computed by integrating the density of a periodic system out to +infinity. :dd + +{Using pair tail corrections with pair_modify compute no} :dt + +The tail corrections will thus not be computed. :dd + +{pair style reax is now deprecated and will soon be retired. Users should switch to pair_style reax/c} :dt + +Self-explanatory. :dd + +:dle diff --git a/doc/src/Examples.txt b/doc/src/Examples.txt index 4935c96257..08afca8b20 100644 --- a/doc/src/Examples.txt +++ b/doc/src/Examples.txt @@ -2,12 +2,6 @@ "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Section_perf.html :c - - :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) :link(lc,Section_commands.html#comm) diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index 18ae1c4b61..4481c911a0 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -1,5 +1,5 @@ - +< LAMMPS Users Manual @@ -118,8 +118,8 @@ it gives quick access to documentation for all LAMMPS commands. Section_perf Tools Modify - Section_python - Section_errors + Python + Errors Section_history .. toctree:: @@ -212,19 +212,8 @@ END_RST --> "Performance & scalability"_Section_perf.html :l "Auxiliary tools"_Tools.html :l "Modify & extend LAMMPS"_Modify.html :l -"Python interface"_Section_python.html :l - 11.1 "Overview of running LAMMPS from Python"_py_1 :ulb,b - 11.2 "Overview of using Python from a LAMMPS script"_py_2 :b - 11.3 "Building LAMMPS as a shared library"_py_3 :b - 11.4 "Installing the Python wrapper into Python"_py_4 :b - 11.5 "Extending Python with MPI to run in parallel"_py_5 :b - 11.6 "Testing the Python-LAMMPS interface"_py_6 :b - 11.7 "Using LAMMPS from Python"_py_7 :b - 11.8 "Example Python scripts that use LAMMPS"_py_8 :ule,b -"Errors"_Section_errors.html :l - 12.1 "Common problems"_err_1 :ulb,b - 12.2 "Reporting bugs"_err_2 :b - 12.3 "Error & warning messages"_err_3 :ule,b +"Use Python with LAMMPS"_Python.html :l +"Errors"_Errors.html :l "Future and history"_Section_history.html :l 13.1 "Coming attractions"_hist_1 :ulb,b 13.2 "Past versions"_hist_2 :ule,b @@ -287,17 +276,6 @@ END_RST --> :link(howto_26,Section_howto.html#howto_26) :link(howto_27,Section_howto.html#howto_27) -:link(py_1,Section_python.html#py_1) -:link(py_2,Section_python.html#py_2) -:link(py_3,Section_python.html#py_3) -:link(py_4,Section_python.html#py_4) -:link(py_5,Section_python.html#py_5) -:link(py_6,Section_python.html#py_6) - -:link(err_1,Section_errors.html#err_1) -:link(err_2,Section_errors.html#err_2) -:link(err_3,Section_errors.html#err_3) - :link(hist_1,Section_history.html#hist_1) :link(hist_2,Section_history.html#hist_2) diff --git a/doc/src/Modify.txt b/doc/src/Modify.txt index 4b16ad781b..ae0b0dc6bd 100644 --- a/doc/src/Modify.txt +++ b/doc/src/Modify.txt @@ -1,12 +1,6 @@ "Previous Section"_Tools.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next -Section"_Section_python.html :c - - +Section"_Python.html :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -34,6 +28,8 @@ contribute"_Modify_contribute.html doc page. Modify_overview Modify_contribute +.. toctree:: + Modify_atom Modify_pair Modify_bond @@ -41,12 +37,16 @@ contribute"_Modify_contribute.html doc page. Modify_fix Modify_command +.. toctree:: + Modify_dump Modify_kspace Modify_min Modify_region Modify_body +.. toctree:: + Modify_thermo Modify_variable diff --git a/doc/src/Python.txt b/doc/src/Python.txt new file mode 100644 index 0000000000..94a2e88f5e --- /dev/null +++ b/doc/src/Python.txt @@ -0,0 +1,79 @@ +"Previous Section"_Modify.html - "LAMMPS WWW Site"_lws - +"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next +Section"_Errors.html :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Use Python with LAMMPS :h3 + +These doc pages describe various ways that LAMMPS and Python can be +used together. + + + + + +"Overview of Python and LAMMPS"_Python_overview.html :all(b) + +"Run LAMMPS from Python"_Python_run.html +"Build LAMMPS as a shared library"_Python_shlib.html +"Install LAMMPS in Python"_Python_install.html +"Extend Python to run in parallel"_Python_mpi.html +"Test the Python/LAMMPS interface"_Python_test.html +"Python library interface"_Python_library.html +"PyLammps interface"_Python_pylammps.html +"Example Python scripts that use LAMMPS"_Python_examples.html :all(b) + +"Call Python from a LAMMPS input script"_Python_call.html :all(b) + + + +If you're not familiar with "Python"_http://www.python.org, it's a +powerful scripting and programming language which can do most +everything that lower-level languages like C or C++ can do in fewer +lines of code. The only drawback is slower execution speed. Python +is also easy to use as a "glue" language to drive a program through +its library interface, or to hook multiple pieces of software +together, such as a simulation code plus a visualization tool, or to +run a coupled multiscale or multiphysics model. + +See the "Howto_couple"_Howto_couple.html doc page for more ideas about +coupling LAMMPS to other codes. See the "Howto +library"_Howto_library.html doc page for a description of the LAMMPS +library interface provided in src/library.h and src/library.h. That +interface is exposed to Python either when calling LAMMPS from Python +or when calling Python from a LAMMPS input script and then calling +back to LAMMPS from Python code. The library interface is designed to +be easy to add funcionality to. Thus the Python interface to LAMMPS +is also easy to extend as well. + +If you create interesting Python scripts that run LAMMPS or +interesting Python functions that can be called from a LAMMPS input +script, that you think would be genearlly useful, please post them as +a pull request to our "GitHub site"_https://github.com/lammps/lammps, +and they can be added to the LAMMPS distribution or webpage. diff --git a/doc/src/Python_call.txt b/doc/src/Python_call.txt new file mode 100644 index 0000000000..3e30a5a7c7 --- /dev/null +++ b/doc/src/Python_call.txt @@ -0,0 +1,85 @@ +"Higher level section"_Python.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Call Python from a LAMMPS input script :h3 + +LAMMPS has several commands which can be used to invoke Python +code directly from an input script: + +"python"_python.html +"variable python"_variable.html +"fix python/invoke"_fix_python_invoke.html +"pair_style python"_pair_python.html :ul + +The "python"_python.html command which can be used to define and +execute a Python function that you write the code for. The Python +function can also be assigned to a LAMMPS python-style variable via +the "variable"_variable.html command. Each time the variable is +evaluated, either in the LAMMPS input script itself, or by another +LAMMPS command that uses the variable, this will trigger the Python +function to be invoked. + +The Python code for the function can be included directly in the input +script or in an auxiliary file. The function can have arguments which +are mapped to LAMMPS variables (also defined in the input script) and +it can return a value to a LAMMPS variable. This is thus a mechanism +for your input script to pass information to a piece of Python code, +ask Python to execute the code, and return information to your input +script. + +Note that a Python function can be arbitrarily complex. It can import +other Python modules, instantiate Python classes, call other Python +functions, etc. The Python code that you provide can contain more +code than the single function. It can contain other functions or +Python classes, as well as global variables or other mechanisms for +storing state between calls from LAMMPS to the function. + +The Python function you provide can consist of "pure" Python code that +only performs operations provided by standard Python. However, the +Python function can also "call back" to LAMMPS through its +Python-wrapped library interface, in the manner described in the +"Python run"_Python_run.html doc page. This means it can issue LAMMPS +input script commands or query and set internal LAMMPS state. As an +example, this can be useful in an input script to create a more +complex loop with branching logic, than can be created using the +simple looping and branching logic enabled by the "next"_next.html and +"if"_if.html commands. + +See the "python"_python.html doc page and the "variable"_variable.html +doc page for its python-style variables for more info, including +examples of Python code you can write for both pure Python operations +and callbacks to LAMMPS. + +The "fix python/invoke"_fix_python_invoke.html command can execute +Python code at selected timesteps during a simulation run. + +The "pair_style python"_pair_python command allows you to define +pairwise potentials as python code which encodes a single pairwise +interaction. This is useful for rapid-developement and debugging of a +new potential. + +To use any of these commands, you only need to build LAMMPS with the +PYTHON package installed: + +make yes-python +make machine :pre + +Note that this will link LAMMPS with the Python library on your +system, which typically requires several auxiliary system libraries to +also be linked. The list of these libraries and the paths to find +them are specified in the lib/python/Makefile.lammps file. You need +to insure that file contains the correct information for your version +of Python and your machine to successfully build LAMMPS. See the +lib/python/README file for more info. + +If you want to write Python code with callbacks to LAMMPS, then you +must also follow the steps overviewed in the "Python +run"_Python_run.html doc page. I.e. you must build LAMMPS as a shared +library and insure that Python can find the python/lammps.py file and +the shared library. diff --git a/doc/src/Python_examples.txt b/doc/src/Python_examples.txt new file mode 100644 index 0000000000..fbca381e8b --- /dev/null +++ b/doc/src/Python_examples.txt @@ -0,0 +1,81 @@ +"Higher level section"_Python.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Example Python scripts that use LAMMPS :h3 + +These are the Python scripts included as demos in the python/examples +directory of the LAMMPS distribution, to illustrate the kinds of +things that are possible when Python wraps LAMMPS. If you create your +own scripts, send them to us and we can include them in the LAMMPS +distribution. + +trivial.py, read/run a LAMMPS input script thru Python, +demo.py, invoke various LAMMPS library interface routines, +simple.py, run in parallel, similar to examples/COUPLE/simple/simple.cpp, +split.py, same as simple.py but running in parallel on a subset of procs, +gui.py, GUI go/stop/temperature-slider to control LAMMPS, +plot.py, real-time temperature plot with GnuPlot via Pizza.py, +viz_tool.py, real-time viz via some viz package, +vizplotgui_tool.py, combination of viz_tool.py and plot.py and gui.py :tb(c=2) + +:line + +For the viz_tool.py and vizplotgui_tool.py commands, replace "tool" +with "gl" or "atomeye" or "pymol" or "vmd", depending on what +visualization package you have installed. + +Note that for GL, you need to be able to run the Pizza.py GL tool, +which is included in the pizza sub-directory. See the "Pizza.py doc +pages"_pizza for more info: + +:link(pizza,http://www.sandia.gov/~sjplimp/pizza.html) + +Note that for AtomEye, you need version 3, and there is a line in the +scripts that specifies the path and name of the executable. See the +AtomEye WWW pages "here"_atomeye or "here"_atomeye3 for more details: + +http://mt.seas.upenn.edu/Archive/Graphics/A +http://mt.seas.upenn.edu/Archive/Graphics/A3/A3.html :pre + +:link(atomeye,http://mt.seas.upenn.edu/Archive/Graphics/A) +:link(atomeye3,http://mt.seas.upenn.edu/Archive/Graphics/A3/A3.html) + +The latter link is to AtomEye 3 which has the scriping +capability needed by these Python scripts. + +Note that for PyMol, you need to have built and installed the +open-source version of PyMol in your Python, so that you can import it +from a Python script. See the PyMol WWW pages "here"_pymolhome or +"here"_pymolopen for more details: + +http://www.pymol.org +http://sourceforge.net/scm/?type=svn&group_id=4546 :pre + +:link(pymolhome,http://www.pymol.org) +:link(pymolopen,http://sourceforge.net/scm/?type=svn&group_id=4546) + +The latter link is to the open-source version. + +Note that for VMD, you need a fairly current version (1.8.7 works for +me) and there are some lines in the pizza/vmd.py script for 4 PIZZA +variables that have to match the VMD installation on your system. + +:line + +See the python/README file for instructions on how to run them and the +source code for individual scripts for comments about what they do. + +Here are screenshots of the vizplotgui_tool.py script in action for +different visualization package options. Click to see larger images: + +:image(JPG/screenshot_gl_small.jpg,JPG/screenshot_gl.jpg) +:image(JPG/screenshot_atomeye_small.jpg,JPG/screenshot_atomeye.jpg) +:image(JPG/screenshot_pymol_small.jpg,JPG/screenshot_pymol.jpg) +:image(JPG/screenshot_vmd_small.jpg,JPG/screenshot_vmd.jpg) + diff --git a/doc/src/Python_install.txt b/doc/src/Python_install.txt new file mode 100644 index 0000000000..631f6c4a7f --- /dev/null +++ b/doc/src/Python_install.txt @@ -0,0 +1,74 @@ +"Higher level section"_Python.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Installing LAMMPS in Python :h3 + +For Python to invoke LAMMPS, there are 2 files it needs to know about: + +python/lammps.py +src/liblammps.so :ul + +Lammps.py is the Python wrapper on the LAMMPS library interface. +Liblammps.so is the shared LAMMPS library that Python loads, as +described above. + +You can insure Python can find these files in one of two ways: + +set two environment variables +run the python/install.py script :ul + +If you set the paths to these files as environment variables, you only +have to do it once. For the csh or tcsh shells, add something like +this to your ~/.cshrc file, one line for each of the two files: + +setenv PYTHONPATH $\{PYTHONPATH\}:/home/sjplimp/lammps/python +setenv LD_LIBRARY_PATH $\{LD_LIBRARY_PATH\}:/home/sjplimp/lammps/src :pre + +If you use the python/install.py script, you need to invoke it every +time you rebuild LAMMPS (as a shared library) or make changes to the +python/lammps.py file. + +You can invoke install.py from the python directory as + +% python install.py \[libdir\] \[pydir\] :pre + +The optional libdir is where to copy the LAMMPS shared library to; the +default is /usr/local/lib. The optional pydir is where to copy the +lammps.py file to; the default is the site-packages directory of the +version of Python that is running the install script. + +Note that libdir must be a location that is in your default +LD_LIBRARY_PATH, like /usr/local/lib or /usr/lib. And pydir must be a +location that Python looks in by default for imported modules, like +its site-packages dir. If you want to copy these files to +non-standard locations, such as within your own user space, you will +need to set your PYTHONPATH and LD_LIBRARY_PATH environment variables +accordingly, as above. + +If the install.py script does not allow you to copy files into system +directories, prefix the python command with "sudo". If you do this, +make sure that the Python that root runs is the same as the Python you +run. E.g. you may need to do something like + +% sudo /usr/local/bin/python install.py \[libdir\] \[pydir\] :pre + +You can also invoke install.py from the make command in the src +directory as + +% make install-python :pre + +In this mode you cannot append optional arguments. Again, you may +need to prefix this with "sudo". In this mode you cannot control +which Python is invoked by root. + +Note that if you want Python to be able to load different versions of +the LAMMPS shared library (see "this section"_#py_5 below), you will +need to manually copy files like liblammps_g++.so into the appropriate +system directory. This is not needed if you set the LD_LIBRARY_PATH +environment variable as described above. diff --git a/doc/src/Python_library.txt b/doc/src/Python_library.txt new file mode 100644 index 0000000000..4babbb746c --- /dev/null +++ b/doc/src/Python_library.txt @@ -0,0 +1,256 @@ +"Higher level section"_Python.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Python library interface :h3 + +As described previously, the Python interface to LAMMPS consists of a +Python "lammps" module, the source code for which is in +python/lammps.py, which creates a "lammps" object, with a set of +methods that can be invoked on that object. The sample Python code +below assumes you have first imported the "lammps" module in your +Python script, as follows: + +from lammps import lammps :pre + +These are the methods defined by the lammps module. If you look at +the files src/library.cpp and src/library.h you will see they +correspond one-to-one with calls you can make to the LAMMPS library +from a C++ or C or Fortran program, and which are described in +"Section 6.19"_Section_howto.html#howto_19 of the manual. + +The python/examples directory has Python scripts which show how Python +can run LAMMPS, grab data, change it, and put it back into LAMMPS. + +lmp = lammps() # create a LAMMPS object using the default liblammps.so library + # 4 optional args are allowed: name, cmdargs, ptr, comm +lmp = lammps(ptr=lmpptr) # use lmpptr as previously created LAMMPS object +lmp = lammps(comm=split) # create a LAMMPS object with a custom communicator, requires mpi4py 2.0.0 or later +lmp = lammps(name="g++") # create a LAMMPS object using the liblammps_g++.so library +lmp = lammps(name="g++",cmdargs=list) # add LAMMPS command-line args, e.g. list = \["-echo","screen"\] :pre + +lmp.close() # destroy a LAMMPS object :pre + +version = lmp.version() # return the numerical version id, e.g. LAMMPS 2 Sep 2015 -> 20150902 :pre + +lmp.file(file) # run an entire input script, file = "in.lj" +lmp.command(cmd) # invoke a single LAMMPS command, cmd = "run 100" +lmp.commands_list(cmdlist) # invoke commands in cmdlist = ["run 10", "run 20"] +lmp.commands_string(multicmd) # invoke commands in multicmd = "run 10\nrun 20" :pre + +size = lmp.extract_setting(name) # return data type info :pre + +xlo = lmp.extract_global(name,type) # extract a global quantity + # name = "boxxlo", "nlocal", etc + # type = 0 = int + # 1 = double :pre + +boxlo,boxhi,xy,yz,xz,periodicity,box_change = lmp.extract_box() # extract box info :pre + +coords = lmp.extract_atom(name,type) # extract a per-atom quantity + # name = "x", "type", etc + # type = 0 = vector of ints + # 1 = array of ints + # 2 = vector of doubles + # 3 = array of doubles :pre + +eng = lmp.extract_compute(id,style,type) # extract value(s) from a compute +v3 = lmp.extract_fix(id,style,type,i,j) # extract value(s) from a fix + # id = ID of compute or fix + # style = 0 = global data + # 1 = per-atom data + # 2 = local data + # type = 0 = scalar + # 1 = vector + # 2 = array + # i,j = indices of value in global vector or array :pre + +var = lmp.extract_variable(name,group,flag) # extract value(s) from a variable + # name = name of variable + # group = group ID (ignored for equal-style variables) + # flag = 0 = equal-style variable + # 1 = atom-style variable :pre + +value = lmp.get_thermo(name) # return current value of a thermo keyword +natoms = lmp.get_natoms() # total # of atoms as int :pre + +flag = lmp.set_variable(name,value) # set existing named string-style variable to value, flag = 0 if successful +lmp.reset_box(boxlo,boxhi,xy,yz,xz) # reset the simulation box size :pre + +data = lmp.gather_atoms(name,type,count) # return per-atom property of all atoms gathered into data, ordered by atom ID + # name = "x", "charge", "type", etc +data = lmp.gather_atoms_concat(name,type,count) # ditto, but concatenated atom values from each proc (unordered) +data = lmp.gather_atoms_subset(name,type,count,ndata,ids) # ditto, but for subset of Ndata atoms with IDs :pre + +lmp.scatter_atoms(name,type,count,data) # scatter per-atom property to all atoms from data, ordered by atom ID + # name = "x", "charge", "type", etc + # count = # of per-atom values, 1 or 3, etc :pre +lmp.scatter_atoms_subset(name,type,count,ndata,ids,data) # ditto, but for subset of Ndata atoms with IDs :pre + +lmp.create_atoms(n,ids,types,x,v,image,shrinkexceed) # create N atoms with IDs, types, x, v, and image flags :pre + +:line + +The lines + +from lammps import lammps +lmp = lammps() :pre + +create an instance of LAMMPS, wrapped in a Python class by the lammps +Python module, and return an instance of the Python class as lmp. It +is used to make all subsequent calls to the LAMMPS library. + +Additional arguments to lammps() can be used to tell Python the name +of the shared library to load or to pass arguments to the LAMMPS +instance, the same as if LAMMPS were launched from a command-line +prompt. + +If the ptr argument is set like this: + +lmp = lammps(ptr=lmpptr) :pre + +then lmpptr must be an argument passed to Python via the LAMMPS +"python"_python.html command, when it is used to define a Python +function that is invoked by the LAMMPS input script. This mode of +calling Python from LAMMPS is described in the "Python +call"_Python_call.html doc page. The variable lmpptr refers to the +instance of LAMMPS that called the embedded Python interpreter. Using +it as an argument to lammps() allows the returned Python class +instance "lmp" to make calls to that instance of LAMMPS. See the +"python"_python.html command doc page for examples using this syntax. + +Note that you can create multiple LAMMPS objects in your Python +script, and coordinate and run multiple simulations, e.g. + +from lammps import lammps +lmp1 = lammps() +lmp2 = lammps() +lmp1.file("in.file1") +lmp2.file("in.file2") :pre + +The file(), command(), commands_list(), commands_string() methods +allow an input script, a single command, or multiple commands to be +invoked. + +The extract_setting(), extract_global(), extract_box(), +extract_atom(), extract_compute(), extract_fix(), and +extract_variable() methods return values or pointers to data +structures internal to LAMMPS. + +For extract_global() see the src/library.cpp file for the list of +valid names. New names could easily be added. A double or integer is +returned. You need to specify the appropriate data type via the type +argument. + +For extract_atom(), a pointer to internal LAMMPS atom-based data is +returned, which you can use via normal Python subscripting. See the +extract() method in the src/atom.cpp file for a list of valid names. +Again, new names could easily be added if the property you want is not +listed. A pointer to a vector of doubles or integers, or a pointer to +an array of doubles (double **) or integers (int **) is returned. You +need to specify the appropriate data type via the type argument. + +For extract_compute() and extract_fix(), the global, per-atom, or +local data calculated by the compute or fix can be accessed. What is +returned depends on whether the compute or fix calculates a scalar or +vector or array. For a scalar, a single double value is returned. If +the compute or fix calculates a vector or array, a pointer to the +internal LAMMPS data is returned, which you can use via normal Python +subscripting. The one exception is that for a fix that calculates a +global vector or array, a single double value from the vector or array +is returned, indexed by I (vector) or I and J (array). I,J are +zero-based indices. The I,J arguments can be left out if not needed. +See "Section 6.15"_Section_howto.html#howto_15 of the manual for a +discussion of global, per-atom, and local data, and of scalar, vector, +and array data types. See the doc pages for individual +"computes"_compute.html and "fixes"_fix.html for a description of what +they calculate and store. + +For extract_variable(), an "equal-style or atom-style +variable"_variable.html is evaluated and its result returned. + +For equal-style variables a single double value is returned and the +group argument is ignored. For atom-style variables, a vector of +doubles is returned, one value per atom, which you can use via normal +Python subscripting. The values will be zero for atoms not in the +specified group. + +The get_thermo() method returns returns the current value of a thermo +keyword as a float. + +The get_natoms() method returns the total number of atoms in the +simulation, as an int. + +The set_variable() methosd sets an existing string-style variable to a +new string value, so that subsequent LAMMPS commands can access the +variable. + +The reset_box() emthods resets the size and shape of the simulation +box, e.g. as part of restoring a previously extracted and saved state +of a simulation. + +The gather methods collect peratom info of the requested type (atom +coords, atom types, forces, etc) from all processors, and returns the +same vector of values to each callling processor. The scatter +functions do the inverse. They distribute a vector of peratom values, +passed by all calling processors, to invididual atoms, which may be +owned by different processos. + +Note that the data returned by the gather methods, +e.g. gather_atoms("x"), is different from the data structure returned +by extract_atom("x") in four ways. (1) Gather_atoms() returns a +vector which you index as x\[i\]; extract_atom() returns an array +which you index as x\[i\]\[j\]. (2) Gather_atoms() orders the atoms +by atom ID while extract_atom() does not. (3) Gather_atoms() returns +a list of all atoms in the simulation; extract_atoms() returns just +the atoms local to each processor. (4) Finally, the gather_atoms() +data structure is a copy of the atom coords stored internally in +LAMMPS, whereas extract_atom() returns an array that effectively +points directly to the internal data. This means you can change +values inside LAMMPS from Python by assigning a new values to the +extract_atom() array. To do this with the gather_atoms() vector, you +need to change values in the vector, then invoke the scatter_atoms() +method. + +For the scatter methods, the array of coordinates passed to must be a +ctypes vector of ints or doubles, allocated and initialized something +like this: + +from ctypes import * +natoms = lmp.get_natoms() +n3 = 3*natoms +x = (n3*c_double)() +x\[0\] = x coord of atom with ID 1 +x\[1\] = y coord of atom with ID 1 +x\[2\] = z coord of atom with ID 1 +x\[3\] = x coord of atom with ID 2 +... +x\[n3-1\] = z coord of atom with ID natoms +lmp.scatter_atoms("x",1,3,x) :pre + +Alternatively, you can just change values in the vector returned by +the gather methods, since they are also ctypes vectors. + +:line + +As noted above, these Python class methods correspond one-to-one with +the functions in the LAMMPS library interface in src/library.cpp and +library.h. This means you can extend the Python wrapper via the +following steps: + +Add a new interface function to src/library.cpp and +src/library.h. :ulb,l + +Rebuild LAMMPS as a shared library. :l + +Add a wrapper method to python/lammps.py for this interface +function. :l + +You should now be able to invoke the new interface function from a +Python script. :l +:ule diff --git a/doc/src/Python_mpi.txt b/doc/src/Python_mpi.txt new file mode 100644 index 0000000000..8377bbb3d0 --- /dev/null +++ b/doc/src/Python_mpi.txt @@ -0,0 +1,67 @@ +"Higher level section"_Python.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Extending Python to run in parallel :h3 + +If you wish to run LAMMPS in parallel from Python, you need to extend +your Python with an interface to MPI. This also allows you to +make MPI calls directly from Python in your script, if you desire. + +We recommend use of mpi4py: + +"PyPar"_https://github.com/daleroberts/pypar :ul + +As of version 2.0.0 it allows passing a custom MPI communicator to +the LAMMPS constructor, which means one can easily run one or more +LAMMPS instances on subsets of the total MPI ranks. + +To install mpi4py (version mpi4py-2.0.0 as of Oct 2015), unpack it +and from its main directory, type + +python setup.py build +sudo python setup.py install :pre + +Again, the "sudo" is only needed if required to copy mpi4py files into +your Python distribution's site-packages directory. To install with +user privilege into the user local directory type + +python setup.py install --user :pre + +If you have successfully installed mpi4py, you should be able to run +Python and type + +from mpi4py import MPI :pre + +without error. You should also be able to run python in parallel +on a simple test script + +% mpirun -np 4 python test.py :pre + +where test.py contains the lines + +from mpi4py import MPI +comm = MPI.COMM_WORLD +print "Proc %d out of %d procs" % (comm.Get_rank(),comm.Get_size()) :pre + +and see one line of output for each processor you run on. + +NOTE: To use mpi4py and LAMMPS in parallel from Python, you must +insure both are using the same version of MPI. If you only have one +MPI installed on your system, this is not an issue, but it can be if +you have multiple MPIs. Your LAMMPS build is explicit about which MPI +it is using, since you specify the details in your lo-level +src/MAKE/Makefile.foo file. Mpi4py uses the "mpicc" command to find +information about the MPI it uses to build against. And it tries to +load "libmpi.so" from the LD_LIBRARY_PATH. This may or may not find +the MPI library that LAMMPS is using. If you have problems running +both mpi4py and LAMMPS together, this is an issue you may need to +address, e.g. by moving other MPI installations so that mpi4py finds +the right one. + + diff --git a/doc/src/Python_overview.txt b/doc/src/Python_overview.txt new file mode 100644 index 0000000000..a5d6a469ff --- /dev/null +++ b/doc/src/Python_overview.txt @@ -0,0 +1,35 @@ +"Previous Section"_Examples.html - "LAMMPS WWW Site"_lws - +"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next +Section"_Tools.html :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Commands.html#comm) + +:line + +Overview of Python and LAMMPS :h3 + +LAMMPS can work together with Python in three ways. First, Python can +wrap LAMMPS through the its "library interface"_Howto_library.html, so +that a Python script can create one or more instances of LAMMPS and +launch one or more simulations. In Python lingo, this is "extending" +Python with LAMMPS. + +Second, a lower-level Python interface can be used indirectly through +provided PyLammps and IPyLammps wrapper classes, written in Python. +These wrappers try to simplify the usage of LAMMPS in Python by +providing an object-based interface to common LAMMPS functionality. +They also reduces the amount of code necessary to parameterize LAMMPS +scripts through Python and make variables and computes directly +accessible. + +Third, LAMMPS can use the Python interpreter, so that a LAMMPS +input script can invoke Python code directly, and pass information +back-and-forth between the input script and Python functions you +write. This Python code can also callback to LAMMPS to query or change +its attributes. In Python lingo, this is "embedding" Python in +LAMMPS. When used in this mode, Python can perform operations that +the simple LAMMPS input script syntax cannot. + + diff --git a/doc/src/Python_pylammps.txt b/doc/src/Python_pylammps.txt new file mode 100644 index 0000000000..ad5ed192ee --- /dev/null +++ b/doc/src/Python_pylammps.txt @@ -0,0 +1,14 @@ +"Higher level section"_Python.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +PyLammps interface :h3 + +PyLammps is a Python wrapper class which can be created on its own or +use an existing lammps Python object. It has its own "PyLammps +Tutorial"_tutorial_pylammps.html doc page. diff --git a/doc/src/Python_run.txt b/doc/src/Python_run.txt new file mode 100644 index 0000000000..03ab2ed3d7 --- /dev/null +++ b/doc/src/Python_run.txt @@ -0,0 +1,40 @@ +"Higher level section"_Python.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Run LAMMPS from Python :h3 + +The LAMMPS distribution includes a python directory with all you need +to run LAMMPS from Python. The python/lammps.py file wraps the LAMMPS +library interface, with one wrapper function per LAMMPS library +function. This file makes it is possible to do the following either +from a Python script, or interactively from a Python prompt: create +one or more instances of LAMMPS, invoke LAMMPS commands or give it an +input script, run LAMMPS incrementally, extract LAMMPS results, an +modify internal LAMMPS variables. From a Python script you can do +this in serial or parallel. Running Python interactively in parallel +does not generally work, unless you have a version of Python that +extends Python to enable multiple instances of Python to read what you +type. + +To do all of this, you must first build LAMMPS as a shared library, +then insure that your Python can find the python/lammps.py file and +the shared library. + +Two advantages of using Python to run LAMMPS are how concise the +language is, and that it can be run interactively, enabling rapid +development and debugging. If you use it to mostly invoke costly +operations within LAMMPS, such as running a simulation for a +reasonable number of timesteps, then the overhead cost of invoking +LAMMPS thru Python will be negligible. + +The Python wrapper for LAMMPS uses the "ctypes" package in Python, +which auto-generates the interface code needed between Python and a +set of C-style library functions. Ctypes is part of standard Python +for versions 2.5 and later. You can check which version of Python you +have by simply typing "python" at a shell prompt. diff --git a/doc/src/Python_shlib.txt b/doc/src/Python_shlib.txt new file mode 100644 index 0000000000..1aafbe2e84 --- /dev/null +++ b/doc/src/Python_shlib.txt @@ -0,0 +1,34 @@ +"Higher level section"_Python.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Build LAMMPS as a shared library :h3 + +Instructions on how to build LAMMPS as a shared library are given in +"Section 2.4"_Section_start.html#start_4. A shared library is one +that is dynamically loadable, which is what Python requires to wrap +LAMMPS. On Linux this is a library file that ends in ".so", not ".a". + +From the src directory, type + +make foo mode=shlib :pre + +where foo is the machine target name, such as mpi or serial. +This should create the file liblammps_foo.so in the src directory, as +well as a soft link liblammps.so, which is what the Python wrapper will +load by default. Note that if you are building multiple machine +versions of the shared library, the soft link is always set to the +most recently built version. + +NOTE: If you are building LAMMPS with an MPI or FFT library or other +auxiliary libraries (used by various packages), then all of these +extra libraries must also be shared libraries. If the LAMMPS +shared-library build fails with an error complaining about this, see +"Section 2.4"_Section_start.html#start_4 for more details. + +Also include CMake info on this diff --git a/doc/src/Python_test.txt b/doc/src/Python_test.txt new file mode 100644 index 0000000000..5f361a500b --- /dev/null +++ b/doc/src/Python_test.txt @@ -0,0 +1,131 @@ +"Higher level section"_Python.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Test the Python/LAMMPS interface :h3 + +To test if LAMMPS is callable from Python, launch Python interactively +and type: + +>>> from lammps import lammps +>>> lmp = lammps() :pre + +If you get no errors, you're ready to use LAMMPS from Python. If the +2nd command fails, the most common error to see is + +OSError: Could not load LAMMPS dynamic library :pre + +which means Python was unable to load the LAMMPS shared library. This +typically occurs if the system can't find the LAMMPS shared library or +one of the auxiliary shared libraries it depends on, or if something +about the library is incompatible with your Python. The error message +should give you an indication of what went wrong. + +You can also test the load directly in Python as follows, without +first importing from the lammps.py file: + +>>> from ctypes import CDLL +>>> CDLL("liblammps.so") :pre + +If an error occurs, carefully go thru the steps in "Section +2.4"_Section_start.html#start_4 and above about building a shared +library and about insuring Python can find the necessary two files +it needs. + +[Test LAMMPS and Python in serial:] :h4 + +To run a LAMMPS test in serial, type these lines into Python +interactively from the bench directory: + +>>> from lammps import lammps +>>> lmp = lammps() +>>> lmp.file("in.lj") :pre + +Or put the same lines in the file test.py and run it as + +% python test.py :pre + +Either way, you should see the results of running the in.lj benchmark +on a single processor appear on the screen, the same as if you had +typed something like: + +lmp_g++ -in in.lj :pre + +[Test LAMMPS and Python in parallel:] :h4 + +To run LAMMPS in parallel, assuming you have installed the +"PyPar"_https://github.com/daleroberts/pypar package as discussed +above, create a test.py file containing these lines: + +import pypar +from lammps import lammps +lmp = lammps() +lmp.file("in.lj") +print "Proc %d out of %d procs has" % (pypar.rank(),pypar.size()),lmp +pypar.finalize() :pre + +To run LAMMPS in parallel, assuming you have installed the +"mpi4py"_https://bitbucket.org/mpi4py/mpi4py package as discussed +above, create a test.py file containing these lines: + +from mpi4py import MPI +from lammps import lammps +lmp = lammps() +lmp.file("in.lj") +me = MPI.COMM_WORLD.Get_rank() +nprocs = MPI.COMM_WORLD.Get_size() +print "Proc %d out of %d procs has" % (me,nprocs),lmp +MPI.Finalize() :pre + +You can either script in parallel as: + +% mpirun -np 4 python test.py :pre + +and you should see the same output as if you had typed + +% mpirun -np 4 lmp_g++ -in in.lj :pre + +Note that if you leave out the 3 lines from test.py that specify PyPar +commands you will instantiate and run LAMMPS independently on each of +the P processors specified in the mpirun command. In this case you +should get 4 sets of output, each showing that a LAMMPS run was made +on a single processor, instead of one set of output showing that +LAMMPS ran on 4 processors. If the 1-processor outputs occur, it +means that PyPar is not working correctly. + +Also note that once you import the PyPar module, PyPar initializes MPI +for you, and you can use MPI calls directly in your Python script, as +described in the PyPar documentation. The last line of your Python +script should be pypar.finalize(), to insure MPI is shut down +correctly. + +[Running Python scripts:] :h4 + +Note that any Python script (not just for LAMMPS) can be invoked in +one of several ways: + +% python foo.script +% python -i foo.script +% foo.script :pre + +The last command requires that the first line of the script be +something like this: + +#!/usr/local/bin/python +#!/usr/local/bin/python -i :pre + +where the path points to where you have Python installed, and that you +have made the script file executable: + +% chmod +x foo.script :pre + +Without the "-i" flag, Python will exit when the script finishes. +With the "-i" flag, you will be left in the Python interpreter when +the script finishes, so you can type subsequent commands. As +mentioned above, you can only run Python interactively when running +Python on a single processor, not in parallel. diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index a44013f5f1..7b9349a233 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -67,7 +67,7 @@ values are not desired, the "processors"_processors.html and 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. "This section"_Section_errors.html gives +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/src/Section_history.txt b/doc/src/Section_history.txt index 7b90410628..6bbd1e4d99 100644 --- a/doc/src/Section_history.txt +++ b/doc/src/Section_history.txt @@ -1,4 +1,4 @@ -"Previous Section"_Section_errors.html - "LAMMPS WWW Site"_lws - +"Previous Section"_Errors.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Manual.html :c diff --git a/doc/src/Section_howto.txt b/doc/src/Section_howto.txt index 0a31fc2b48..3c5fe47057 100644 --- a/doc/src/Section_howto.txt +++ b/doc/src/Section_howto.txt @@ -731,10 +731,10 @@ any other language that supports a vanilla C-like interface). For example, from C++ you could create one (or more) "instances" of LAMMPS, pass it an input script to process, or execute individual commands, all by invoking the correct class methods in LAMMPS. From C -or Fortran you can make function calls to do the same things. See -"Section 11"_Section_python.html of the manual for a description -of the Python wrapper provided with LAMMPS that operates through the -LAMMPS library interface. +or Fortran you can make function calls to do the same things. See the +"Python"_Python.html doc page for a description of the Python wrapper +provided with LAMMPS that operates through the LAMMPS library +interface. The files src/library.cpp and library.h contain the C-style interface to LAMMPS. See "Section 6.19"_Section_howto.html#howto_19 of the @@ -1843,10 +1843,10 @@ converge and requires careful post-processing "(Shinoda)"_#Shinoda1 6.19 Library interface to LAMMPS :link(howto_19),h4 -As described in "Section 2.5"_Section_start.html#start_5, LAMMPS -can be built as a library, so that it can be called by another code, -used in a "coupled manner"_Section_howto.html#howto_10 with other -codes, or driven through a "Python interface"_Section_python.html. +As described in "Section 2.5"_Section_start.html#start_5, LAMMPS can +be built as a library, so that it can be called by another code, used +in a "coupled manner"_Section_howto.html#howto_10 with other codes, or +driven through a "Python interface"_Python.html. All of these methodologies use a C-style interface to LAMMPS that is provided in the files src/library.cpp and src/library.h. The @@ -1869,9 +1869,9 @@ details. NOTE: You can write code for additional functions as needed to define how your code talks to LAMMPS and add them to src/library.cpp and -src/library.h, as well as to the "Python -interface"_Section_python.html. The added functions can access or -change any internal LAMMPS data you wish. +src/library.h, as well as to the "Python interface"_Python.html. The +added functions can access or change any internal LAMMPS data you +wish. void lammps_open(int, char **, MPI_Comm, void **) void lammps_open_no_mpi(int, char **, void **) diff --git a/doc/src/Section_intro.txt b/doc/src/Section_intro.txt index fa2ab0e768..c7cf5bf8d2 100644 --- a/doc/src/Section_intro.txt +++ b/doc/src/Section_intro.txt @@ -1,4 +1,6 @@ -"Previous Section"_Manual.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Section_start.html :c +"Previous Section"_Manual.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc - "Next +Section"_Section_start.html :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -429,7 +431,7 @@ Site"_lws, or have a suggestion for something to clarify or include, send an email to the "developers"_http://lammps.sandia.gov/authors.html. :l -If you find a bug, "Section 12.2"_Section_errors.html#err_2 +If you find a bug, the "Errors bugs"_Errors_bugs.html doc page describes how to report it. :l If you publish a paper using LAMMPS results, send the citation (and diff --git a/doc/src/Section_packages.txt b/doc/src/Section_packages.txt index 77f56d273c..340a77310d 100644 --- a/doc/src/Section_packages.txt +++ b/doc/src/Section_packages.txt @@ -1178,10 +1178,10 @@ PYTHON package :link(PYTHON),h4 A "python"_python.html command which allow you to execute Python code from a LAMMPS input script. The code can be in a separate file or -embedded in the input script itself. See "Section -11.2"_Section_python.html#py_2 for an overview of using Python from -LAMMPS in this manner and the entire section for other ways to use -LAMMPS and Python together. +embedded in the input script itself. See the "Python +call"_Python_call.html doc page for an overview of using Python from +LAMMPS in this manner and the "Python"_Python.html doc page for other +ways to use LAMMPS and Python together. [Install or un-install:] @@ -1202,7 +1202,7 @@ to Makefile.lammps) if the LAMMPS build fails. [Supporting info:] src/PYTHON: filenames -> commands -"Section 11"_Section_python.html +"Python call"_Python_call.html lib/python/README examples/python :ul diff --git a/doc/src/Section_python.txt b/doc/src/Section_python.txt deleted file mode 100644 index c9b0bd8b2e..0000000000 --- a/doc/src/Section_python.txt +++ /dev/null @@ -1,869 +0,0 @@ -"Previous Section"_Modify.html - "LAMMPS WWW Site"_lws - "LAMMPS -Documentation"_ld - "LAMMPS Commands"_lc - "Next -Section"_Section_errors.html :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Section_commands.html#comm) - -:line - -11. Python interface to LAMMPS :h2 - -LAMMPS can work together with Python in three ways. First, Python can -wrap LAMMPS through the "LAMMPS library -interface"_Section_howto.html#howto_19, so that a Python script can -create one or more instances of LAMMPS and launch one or more -simulations. In Python lingo, this is "extending" Python with LAMMPS. - -Second, the low-level Python interface can be used indirectly through the -PyLammps and IPyLammps wrapper classes in Python. These wrappers try to -simplify the usage of LAMMPS in Python by providing an object-based interface -to common LAMMPS functionality. It also reduces the amount of code necessary to -parameterize LAMMPS scripts through Python and makes variables and computes -directly accessible. See "PyLammps interface"_#py_9 for more details. - -Third, LAMMPS can use the Python interpreter, so that a LAMMPS input -script can invoke Python code, and pass information back-and-forth -between the input script and Python functions you write. The Python -code can also callback to LAMMPS to query or change its attributes. -In Python lingo, this is "embedding" Python in LAMMPS. - -This section describes how to use these three approaches. - -11.1 "Overview of running LAMMPS from Python"_#py_1 -11.2 "Overview of using Python from a LAMMPS script"_#py_2 -11.3 "Building LAMMPS as a shared library"_#py_3 -11.4 "Installing the Python wrapper into Python"_#py_4 -11.5 "Extending Python with MPI to run in parallel"_#py_5 -11.6 "Testing the Python-LAMMPS interface"_#py_6 -11.7 "Using LAMMPS from Python"_#py_7 -11.8 "Example Python scripts that use LAMMPS"_#py_8 -11.9 "PyLammps interface"_#py_9 :ul - -If you are not familiar with it, "Python"_http://www.python.org is a -powerful scripting and programming language which can essentially do -anything that faster, lower-level languages like C or C++ can do, but -typically with much fewer lines of code. When used in embedded mode, -Python can perform operations that the simplistic LAMMPS input script -syntax cannot. Python can be also be used as a "glue" language to -drive a program through its library interface, or to hook multiple -pieces of software together, such as a simulation package plus a -visualization package, or to run a coupled multiscale or multiphysics -model. - -See "Section 6.10"_Section_howto.html#howto_10 of the manual and -the couple directory of the distribution for more ideas about coupling -LAMMPS to other codes. See "Section -6.19"_Section_howto.html#howto_19 for a description of the LAMMPS -library interface provided in src/library.cpp and src/library.h, and -how to extend it for your needs. As described below, that interface -is what is exposed to Python either when calling LAMMPS from Python or -when calling Python from a LAMMPS input script and then calling back -to LAMMPS from Python code. The library interface is designed to be -easy to add functions to. Thus the Python interface to LAMMPS is also -easy to extend as well. - -If you create interesting Python scripts that run LAMMPS or -interesting Python functions that can be called from a LAMMPS input -script, that you think would be useful to other users, please "email -them to the developers"_http://lammps.sandia.gov/authors.html. We can -include them in the LAMMPS distribution. - -:line -:line - -11.1 Overview of running LAMMPS from Python :link(py_1),h4 - -The LAMMPS distribution includes a python directory with all you need -to run LAMMPS from Python. The python/lammps.py file wraps the LAMMPS -library interface, with one wrapper function per LAMMPS library -function. This file makes it is possible to do the following either -from a Python script, or interactively from a Python prompt: create -one or more instances of LAMMPS, invoke LAMMPS commands or give it an -input script, run LAMMPS incrementally, extract LAMMPS results, an -modify internal LAMMPS variables. From a Python script you can do -this in serial or parallel. Running Python interactively in parallel -does not generally work, unless you have a version of Python that -extends standard Python to enable multiple instances of Python to read -what you type. - -To do all of this, you must first build LAMMPS as a shared library, -then insure that your Python can find the python/lammps.py file and -the shared library. These steps are explained in subsequent sections -11.3 and 11.4. Sections 11.5 and 11.6 discuss using MPI from a -parallel Python program and how to test that you are ready to use -LAMMPS from Python. Section 11.7 lists all the functions in the -current LAMMPS library interface and how to call them from Python. - -Section 11.8 gives some examples of coupling LAMMPS to other tools via -Python. For example, LAMMPS can easily be coupled to a GUI or other -visualization tools that display graphs or animations in real time as -LAMMPS runs. Examples of such scripts are included in the python -directory. - -Two advantages of using Python to run LAMMPS are how concise the -language is, and that it can be run interactively, enabling rapid -development and debugging of programs. If you use it to mostly invoke -costly operations within LAMMPS, such as running a simulation for a -reasonable number of timesteps, then the overhead cost of invoking -LAMMPS thru Python will be negligible. - -The Python wrapper for LAMMPS uses the amazing and magical (to me) -"ctypes" package in Python, which auto-generates the interface code -needed between Python and a set of C interface routines for a library. -Ctypes is part of standard Python for versions 2.5 and later. You can -check which version of Python you have installed, by simply typing -"python" at a shell prompt. - -:line - -11.2 Overview of using Python from a LAMMPS script :link(py_2),h4 - -LAMMPS has several commands which can be used to invoke Python -code directly from an input script: - -"python"_python.html -"variable python"_variable.html -"fix python/invoke"_fix_python_invoke.html -"pair_style python"_pair_python.html :ul - -The "python"_python.html command which can be used to define and -execute a Python function that you write the code for. The Python -function can also be assigned to a LAMMPS python-style variable via -the "variable"_variable.html command. Each time the variable is -evaluated, either in the LAMMPS input script itself, or by another -LAMMPS command that uses the variable, this will trigger the Python -function to be invoked. - -The Python code for the function can be included directly in the input -script or in an auxiliary file. The function can have arguments which -are mapped to LAMMPS variables (also defined in the input script) and -it can return a value to a LAMMPS variable. This is thus a mechanism -for your input script to pass information to a piece of Python code, -ask Python to execute the code, and return information to your input -script. - -Note that a Python function can be arbitrarily complex. It can import -other Python modules, instantiate Python classes, call other Python -functions, etc. The Python code that you provide can contain more -code than the single function. It can contain other functions or -Python classes, as well as global variables or other mechanisms for -storing state between calls from LAMMPS to the function. - -The Python function you provide can consist of "pure" Python code that -only performs operations provided by standard Python. However, the -Python function can also "call back" to LAMMPS through its -Python-wrapped library interface, in the manner described in the -previous section 11.1. This means it can issue LAMMPS input script -commands or query and set internal LAMMPS state. As an example, this -can be useful in an input script to create a more complex loop with -branching logic, than can be created using the simple looping and -branching logic enabled by the "next"_next.html and "if"_if.html -commands. - -See the "python"_python.html doc page and the "variable"_variable.html -doc page for its python-style variables for more info, including -examples of Python code you can write for both pure Python operations -and callbacks to LAMMPS. - -The "fix python/invoke"_fix_python_invoke.html command can execute -Python code at selected timesteps during a simulation run. - -The "pair_style python"_pair_python command allows you to define -pairwise potentials as python code which encodes a single pairwise -interaction. This is useful for rapid-developement and debugging of a -new potential. - -To use any of these commands, you only need to build LAMMPS with the -PYTHON package installed: - -make yes-python -make machine :pre - -Note that this will link LAMMPS with the Python library on your -system, which typically requires several auxiliary system libraries to -also be linked. The list of these libraries and the paths to find -them are specified in the lib/python/Makefile.lammps file. You need -to insure that file contains the correct information for your version -of Python and your machine to successfully build LAMMPS. See the -lib/python/README file for more info. - -If you want to write Python code with callbacks to LAMMPS, then you -must also follow the steps overviewed in the preceding section (11.1) -for running LAMMPS from Python. I.e. you must build LAMMPS as a -shared library and insure that Python can find the python/lammps.py -file and the shared library. - -:line - -11.3 Building LAMMPS as a shared library :link(py_3),h4 - -Instructions on how to build LAMMPS as a shared library are given in -"Section 2.4"_Section_start.html#start_4. A shared library is one -that is dynamically loadable, which is what Python requires to wrap -LAMMPS. On Linux this is a library file that ends in ".so", not ".a". - -From the src directory, type - -make foo mode=shlib :pre - -where foo is the machine target name, such as linux or g++ or serial. -This should create the file liblammps_foo.so in the src directory, as -well as a soft link liblammps.so, which is what the Python wrapper will -load by default. Note that if you are building multiple machine -versions of the shared library, the soft link is always set to the -most recently built version. - -NOTE: If you are building LAMMPS with an MPI or FFT library or other -auxiliary libraries (used by various packages), then all of these -extra libraries must also be shared libraries. If the LAMMPS -shared-library build fails with an error complaining about this, see -"Section 2.4"_Section_start.html#start_4 for more details. - -:line - -11.4 Installing the Python wrapper into Python :link(py_4),h4 - -For Python to invoke LAMMPS, there are 2 files it needs to know about: - -python/lammps.py -src/liblammps.so :ul - -Lammps.py is the Python wrapper on the LAMMPS library interface. -Liblammps.so is the shared LAMMPS library that Python loads, as -described above. - -You can insure Python can find these files in one of two ways: - -set two environment variables -run the python/install.py script :ul - -If you set the paths to these files as environment variables, you only -have to do it once. For the csh or tcsh shells, add something like -this to your ~/.cshrc file, one line for each of the two files: - -setenv PYTHONPATH $\{PYTHONPATH\}:/home/sjplimp/lammps/python -setenv LD_LIBRARY_PATH $\{LD_LIBRARY_PATH\}:/home/sjplimp/lammps/src :pre - -If you use the python/install.py script, you need to invoke it every -time you rebuild LAMMPS (as a shared library) or make changes to the -python/lammps.py file. - -You can invoke install.py from the python directory as - -% python install.py \[libdir\] \[pydir\] :pre - -The optional libdir is where to copy the LAMMPS shared library to; the -default is /usr/local/lib. The optional pydir is where to copy the -lammps.py file to; the default is the site-packages directory of the -version of Python that is running the install script. - -Note that libdir must be a location that is in your default -LD_LIBRARY_PATH, like /usr/local/lib or /usr/lib. And pydir must be a -location that Python looks in by default for imported modules, like -its site-packages dir. If you want to copy these files to -non-standard locations, such as within your own user space, you will -need to set your PYTHONPATH and LD_LIBRARY_PATH environment variables -accordingly, as above. - -If the install.py script does not allow you to copy files into system -directories, prefix the python command with "sudo". If you do this, -make sure that the Python that root runs is the same as the Python you -run. E.g. you may need to do something like - -% sudo /usr/local/bin/python install.py \[libdir\] \[pydir\] :pre - -You can also invoke install.py from the make command in the src -directory as - -% make install-python :pre - -In this mode you cannot append optional arguments. Again, you may -need to prefix this with "sudo". In this mode you cannot control -which Python is invoked by root. - -Note that if you want Python to be able to load different versions of -the LAMMPS shared library (see "this section"_#py_5 below), you will -need to manually copy files like liblammps_g++.so into the appropriate -system directory. This is not needed if you set the LD_LIBRARY_PATH -environment variable as described above. - -:line - -11.5 Extending Python with MPI to run in parallel :link(py_5),h4 - -If you wish to run LAMMPS in parallel from Python, you need to extend -your Python with an interface to MPI. This also allows you to -make MPI calls directly from Python in your script, if you desire. - -There are several Python packages available that purport to wrap MPI -as a library and allow MPI functions to be called from Python. However, -development on most of them seems to be halted except on: - -"mpi4py"_https://bitbucket.org/mpi4py/mpi4py -"PyPar"_https://github.com/daleroberts/pypar :ul - -Both packages, PyPar and mpi4py have been successfully tested with -LAMMPS. PyPar is simpler and easy to set up and use, but supports -only a subset of MPI. Mpi4py is more MPI-feature complete, but also a -bit more complex to use. As of version 2.0.0, mpi4py is the only -python MPI wrapper that allows passing a custom MPI communicator to -the LAMMPS constructor, which means one can easily run one or more -LAMMPS instances on subsets of the total MPI ranks. - -:line - -PyPar requires the ubiquitous "Numpy package"_http://numpy.scipy.org -be installed in your Python. After launching Python, type - -import numpy :pre - -to see if it is installed. If not, here is how to install it (version -1.3.0b1 as of April 2009). Unpack the numpy tarball and from its -top-level directory, type - -python setup.py build -sudo python setup.py install :pre - -The "sudo" is only needed if required to copy Numpy files into your -Python distribution's site-packages directory. - -To install PyPar (version pypar-2.1.4_94 as of Aug 2012), unpack it -and from its "source" directory, type - -python setup.py build -sudo python setup.py install :pre - -Again, the "sudo" is only needed if required to copy PyPar files into -your Python distribution's site-packages directory. - -If you have successfully installed PyPar, you should be able to run -Python and type - -import pypar :pre - -without error. You should also be able to run python in parallel -on a simple test script - -% mpirun -np 4 python test.py :pre - -where test.py contains the lines - -import pypar -print "Proc %d out of %d procs" % (pypar.rank(),pypar.size()) :pre - -and see one line of output for each processor you run on. - -NOTE: To use PyPar and LAMMPS in parallel from Python, you must insure -both are using the same version of MPI. If you only have one MPI -installed on your system, this is not an issue, but it can be if you -have multiple MPIs. Your LAMMPS build is explicit about which MPI it -is using, since you specify the details in your lo-level -src/MAKE/Makefile.foo file. PyPar uses the "mpicc" command to find -information about the MPI it uses to build against. And it tries to -load "libmpi.so" from the LD_LIBRARY_PATH. This may or may not find -the MPI library that LAMMPS is using. If you have problems running -both PyPar and LAMMPS together, this is an issue you may need to -address, e.g. by moving other MPI installations so that PyPar finds -the right one. - -:line - -To install mpi4py (version mpi4py-2.0.0 as of Oct 2015), unpack it -and from its main directory, type - -python setup.py build -sudo python setup.py install :pre - -Again, the "sudo" is only needed if required to copy mpi4py files into -your Python distribution's site-packages directory. To install with -user privilege into the user local directory type - -python setup.py install --user :pre - -If you have successfully installed mpi4py, you should be able to run -Python and type - -from mpi4py import MPI :pre - -without error. You should also be able to run python in parallel -on a simple test script - -% mpirun -np 4 python test.py :pre - -where test.py contains the lines - -from mpi4py import MPI -comm = MPI.COMM_WORLD -print "Proc %d out of %d procs" % (comm.Get_rank(),comm.Get_size()) :pre - -and see one line of output for each processor you run on. - -NOTE: To use mpi4py and LAMMPS in parallel from Python, you must -insure both are using the same version of MPI. If you only have one -MPI installed on your system, this is not an issue, but it can be if -you have multiple MPIs. Your LAMMPS build is explicit about which MPI -it is using, since you specify the details in your lo-level -src/MAKE/Makefile.foo file. Mpi4py uses the "mpicc" command to find -information about the MPI it uses to build against. And it tries to -load "libmpi.so" from the LD_LIBRARY_PATH. This may or may not find -the MPI library that LAMMPS is using. If you have problems running -both mpi4py and LAMMPS together, this is an issue you may need to -address, e.g. by moving other MPI installations so that mpi4py finds -the right one. - -:line - -11.6 Testing the Python-LAMMPS interface :link(py_6),h4 - -To test if LAMMPS is callable from Python, launch Python interactively -and type: - ->>> from lammps import lammps ->>> lmp = lammps() :pre - -If you get no errors, you're ready to use LAMMPS from Python. If the -2nd command fails, the most common error to see is - -OSError: Could not load LAMMPS dynamic library :pre - -which means Python was unable to load the LAMMPS shared library. This -typically occurs if the system can't find the LAMMPS shared library or -one of the auxiliary shared libraries it depends on, or if something -about the library is incompatible with your Python. The error message -should give you an indication of what went wrong. - -You can also test the load directly in Python as follows, without -first importing from the lammps.py file: - ->>> from ctypes import CDLL ->>> CDLL("liblammps.so") :pre - -If an error occurs, carefully go thru the steps in "Section -2.4"_Section_start.html#start_4 and above about building a shared -library and about insuring Python can find the necessary two files -it needs. - -[Test LAMMPS and Python in serial:] :h4 - -To run a LAMMPS test in serial, type these lines into Python -interactively from the bench directory: - ->>> from lammps import lammps ->>> lmp = lammps() ->>> lmp.file("in.lj") :pre - -Or put the same lines in the file test.py and run it as - -% python test.py :pre - -Either way, you should see the results of running the in.lj benchmark -on a single processor appear on the screen, the same as if you had -typed something like: - -lmp_g++ -in in.lj :pre - -[Test LAMMPS and Python in parallel:] :h4 - -To run LAMMPS in parallel, assuming you have installed the -"PyPar"_https://github.com/daleroberts/pypar package as discussed -above, create a test.py file containing these lines: - -import pypar -from lammps import lammps -lmp = lammps() -lmp.file("in.lj") -print "Proc %d out of %d procs has" % (pypar.rank(),pypar.size()),lmp -pypar.finalize() :pre - -To run LAMMPS in parallel, assuming you have installed the -"mpi4py"_https://bitbucket.org/mpi4py/mpi4py package as discussed -above, create a test.py file containing these lines: - -from mpi4py import MPI -from lammps import lammps -lmp = lammps() -lmp.file("in.lj") -me = MPI.COMM_WORLD.Get_rank() -nprocs = MPI.COMM_WORLD.Get_size() -print "Proc %d out of %d procs has" % (me,nprocs),lmp -MPI.Finalize() :pre - -You can either script in parallel as: - -% mpirun -np 4 python test.py :pre - -and you should see the same output as if you had typed - -% mpirun -np 4 lmp_g++ -in in.lj :pre - -Note that if you leave out the 3 lines from test.py that specify PyPar -commands you will instantiate and run LAMMPS independently on each of -the P processors specified in the mpirun command. In this case you -should get 4 sets of output, each showing that a LAMMPS run was made -on a single processor, instead of one set of output showing that -LAMMPS ran on 4 processors. If the 1-processor outputs occur, it -means that PyPar is not working correctly. - -Also note that once you import the PyPar module, PyPar initializes MPI -for you, and you can use MPI calls directly in your Python script, as -described in the PyPar documentation. The last line of your Python -script should be pypar.finalize(), to insure MPI is shut down -correctly. - -[Running Python scripts:] :h4 - -Note that any Python script (not just for LAMMPS) can be invoked in -one of several ways: - -% python foo.script -% python -i foo.script -% foo.script :pre - -The last command requires that the first line of the script be -something like this: - -#!/usr/local/bin/python -#!/usr/local/bin/python -i :pre - -where the path points to where you have Python installed, and that you -have made the script file executable: - -% chmod +x foo.script :pre - -Without the "-i" flag, Python will exit when the script finishes. -With the "-i" flag, you will be left in the Python interpreter when -the script finishes, so you can type subsequent commands. As -mentioned above, you can only run Python interactively when running -Python on a single processor, not in parallel. - -:line -:line - -11.7 Using LAMMPS from Python :link(py_7),h4 - -As described above, the Python interface to LAMMPS consists of a -Python "lammps" module, the source code for which is in -python/lammps.py, which creates a "lammps" object, with a set of -methods that can be invoked on that object. The sample Python code -below assumes you have first imported the "lammps" module in your -Python script, as follows: - -from lammps import lammps :pre - -These are the methods defined by the lammps module. If you look at -the files src/library.cpp and src/library.h you will see they -correspond one-to-one with calls you can make to the LAMMPS library -from a C++ or C or Fortran program, and which are described in -"Section 6.19"_Section_howto.html#howto_19 of the manual. - -The python/examples directory has Python scripts which show how Python -can run LAMMPS, grab data, change it, and put it back into LAMMPS. - -lmp = lammps() # create a LAMMPS object using the default liblammps.so library - # 4 optional args are allowed: name, cmdargs, ptr, comm -lmp = lammps(ptr=lmpptr) # use lmpptr as previously created LAMMPS object -lmp = lammps(comm=split) # create a LAMMPS object with a custom communicator, requires mpi4py 2.0.0 or later -lmp = lammps(name="g++") # create a LAMMPS object using the liblammps_g++.so library -lmp = lammps(name="g++",cmdargs=list) # add LAMMPS command-line args, e.g. list = \["-echo","screen"\] :pre - -lmp.close() # destroy a LAMMPS object :pre - -version = lmp.version() # return the numerical version id, e.g. LAMMPS 2 Sep 2015 -> 20150902 :pre - -lmp.file(file) # run an entire input script, file = "in.lj" -lmp.command(cmd) # invoke a single LAMMPS command, cmd = "run 100" -lmp.commands_list(cmdlist) # invoke commands in cmdlist = ["run 10", "run 20"] -lmp.commands_string(multicmd) # invoke commands in multicmd = "run 10\nrun 20" :pre - -size = lmp.extract_setting(name) # return data type info :pre - -xlo = lmp.extract_global(name,type) # extract a global quantity - # name = "boxxlo", "nlocal", etc - # type = 0 = int - # 1 = double :pre - -boxlo,boxhi,xy,yz,xz,periodicity,box_change = lmp.extract_box() # extract box info :pre - -coords = lmp.extract_atom(name,type) # extract a per-atom quantity - # name = "x", "type", etc - # type = 0 = vector of ints - # 1 = array of ints - # 2 = vector of doubles - # 3 = array of doubles :pre - -eng = lmp.extract_compute(id,style,type) # extract value(s) from a compute -v3 = lmp.extract_fix(id,style,type,i,j) # extract value(s) from a fix - # id = ID of compute or fix - # style = 0 = global data - # 1 = per-atom data - # 2 = local data - # type = 0 = scalar - # 1 = vector - # 2 = array - # i,j = indices of value in global vector or array :pre - -var = lmp.extract_variable(name,group,flag) # extract value(s) from a variable - # name = name of variable - # group = group ID (ignored for equal-style variables) - # flag = 0 = equal-style variable - # 1 = atom-style variable :pre - -value = lmp.get_thermo(name) # return current value of a thermo keyword -natoms = lmp.get_natoms() # total # of atoms as int :pre - -flag = lmp.set_variable(name,value) # set existing named string-style variable to value, flag = 0 if successful -lmp.reset_box(boxlo,boxhi,xy,yz,xz) # reset the simulation box size :pre - -data = lmp.gather_atoms(name,type,count) # return per-atom property of all atoms gathered into data, ordered by atom ID - # name = "x", "charge", "type", etc -data = lmp.gather_atoms_concat(name,type,count) # ditto, but concatenated atom values from each proc (unordered) -data = lmp.gather_atoms_subset(name,type,count,ndata,ids) # ditto, but for subset of Ndata atoms with IDs :pre - -lmp.scatter_atoms(name,type,count,data) # scatter per-atom property to all atoms from data, ordered by atom ID - # name = "x", "charge", "type", etc - # count = # of per-atom values, 1 or 3, etc :pre -lmp.scatter_atoms_subset(name,type,count,ndata,ids,data) # ditto, but for subset of Ndata atoms with IDs :pre - -lmp.create_atoms(n,ids,types,x,v,image,shrinkexceed) # create N atoms with IDs, types, x, v, and image flags :pre - -:line - -The lines - -from lammps import lammps -lmp = lammps() :pre - -create an instance of LAMMPS, wrapped in a Python class by the lammps -Python module, and return an instance of the Python class as lmp. It -is used to make all subsequent calls to the LAMMPS library. - -Additional arguments to lammps() can be used to tell Python the name -of the shared library to load or to pass arguments to the LAMMPS -instance, the same as if LAMMPS were launched from a command-line -prompt. - -If the ptr argument is set like this: - -lmp = lammps(ptr=lmpptr) :pre - -then lmpptr must be an argument passed to Python via the LAMMPS -"python"_python.html command, when it is used to define a Python -function that is invoked by the LAMMPS input script. This mode of -using Python with LAMMPS is described above in 11.2. The variable -lmpptr refers to the instance of LAMMPS that called the embedded -Python interpreter. Using it as an argument to lammps() allows the -returned Python class instance "lmp" to make calls to that instance of -LAMMPS. See the "python"_python.html command doc page for examples -using this syntax. - -Note that you can create multiple LAMMPS objects in your Python -script, and coordinate and run multiple simulations, e.g. - -from lammps import lammps -lmp1 = lammps() -lmp2 = lammps() -lmp1.file("in.file1") -lmp2.file("in.file2") :pre - -The file(), command(), commands_list(), commands_string() methods -allow an input script, a single command, or multiple commands to be -invoked. - -The extract_setting(), extract_global(), extract_box(), -extract_atom(), extract_compute(), extract_fix(), and -extract_variable() methods return values or pointers to data -structures internal to LAMMPS. - -For extract_global() see the src/library.cpp file for the list of -valid names. New names could easily be added. A double or integer is -returned. You need to specify the appropriate data type via the type -argument. - -For extract_atom(), a pointer to internal LAMMPS atom-based data is -returned, which you can use via normal Python subscripting. See the -extract() method in the src/atom.cpp file for a list of valid names. -Again, new names could easily be added if the property you want is not -listed. A pointer to a vector of doubles or integers, or a pointer to -an array of doubles (double **) or integers (int **) is returned. You -need to specify the appropriate data type via the type argument. - -For extract_compute() and extract_fix(), the global, per-atom, or -local data calculated by the compute or fix can be accessed. What is -returned depends on whether the compute or fix calculates a scalar or -vector or array. For a scalar, a single double value is returned. If -the compute or fix calculates a vector or array, a pointer to the -internal LAMMPS data is returned, which you can use via normal Python -subscripting. The one exception is that for a fix that calculates a -global vector or array, a single double value from the vector or array -is returned, indexed by I (vector) or I and J (array). I,J are -zero-based indices. The I,J arguments can be left out if not needed. -See "Section 6.15"_Section_howto.html#howto_15 of the manual for a -discussion of global, per-atom, and local data, and of scalar, vector, -and array data types. See the doc pages for individual -"computes"_compute.html and "fixes"_fix.html for a description of what -they calculate and store. - -For extract_variable(), an "equal-style or atom-style -variable"_variable.html is evaluated and its result returned. - -For equal-style variables a single double value is returned and the -group argument is ignored. For atom-style variables, a vector of -doubles is returned, one value per atom, which you can use via normal -Python subscripting. The values will be zero for atoms not in the -specified group. - -The get_thermo() method returns returns the current value of a thermo -keyword as a float. - -The get_natoms() method returns the total number of atoms in the -simulation, as an int. - -The set_variable() methosd sets an existing string-style variable to a -new string value, so that subsequent LAMMPS commands can access the -variable. - -The reset_box() emthods resets the size and shape of the simulation -box, e.g. as part of restoring a previously extracted and saved state -of a simulation. - -The gather methods collect peratom info of the requested type (atom -coords, atom types, forces, etc) from all processors, and returns the -same vector of values to each callling processor. The scatter -functions do the inverse. They distribute a vector of peratom values, -passed by all calling processors, to invididual atoms, which may be -owned by different processos. - -Note that the data returned by the gather methods, -e.g. gather_atoms("x"), is different from the data structure returned -by extract_atom("x") in four ways. (1) Gather_atoms() returns a -vector which you index as x\[i\]; extract_atom() returns an array -which you index as x\[i\]\[j\]. (2) Gather_atoms() orders the atoms -by atom ID while extract_atom() does not. (3) Gather_atoms() returns -a list of all atoms in the simulation; extract_atoms() returns just -the atoms local to each processor. (4) Finally, the gather_atoms() -data structure is a copy of the atom coords stored internally in -LAMMPS, whereas extract_atom() returns an array that effectively -points directly to the internal data. This means you can change -values inside LAMMPS from Python by assigning a new values to the -extract_atom() array. To do this with the gather_atoms() vector, you -need to change values in the vector, then invoke the scatter_atoms() -method. - -For the scatter methods, the array of coordinates passed to must be a -ctypes vector of ints or doubles, allocated and initialized something -like this: - -from ctypes import * -natoms = lmp.get_natoms() -n3 = 3*natoms -x = (n3*c_double)() -x\[0\] = x coord of atom with ID 1 -x\[1\] = y coord of atom with ID 1 -x\[2\] = z coord of atom with ID 1 -x\[3\] = x coord of atom with ID 2 -... -x\[n3-1\] = z coord of atom with ID natoms -lmp.scatter_atoms("x",1,3,x) :pre - -Alternatively, you can just change values in the vector returned by -the gather methods, since they are also ctypes vectors. - -:line - -As noted above, these Python class methods correspond one-to-one with -the functions in the LAMMPS library interface in src/library.cpp and -library.h. This means you can extend the Python wrapper via the -following steps: - -Add a new interface function to src/library.cpp and -src/library.h. :ulb,l - -Rebuild LAMMPS as a shared library. :l - -Add a wrapper method to python/lammps.py for this interface -function. :l - -You should now be able to invoke the new interface function from a -Python script. Isn't ctypes amazing? :l -:ule - -:line -:line - -11.8 Example Python scripts that use LAMMPS :link(py_8),h4 - -These are the Python scripts included as demos in the python/examples -directory of the LAMMPS distribution, to illustrate the kinds of -things that are possible when Python wraps LAMMPS. If you create your -own scripts, send them to us and we can include them in the LAMMPS -distribution. - -trivial.py, read/run a LAMMPS input script thru Python, -demo.py, invoke various LAMMPS library interface routines, -simple.py, run in parallel, similar to examples/COUPLE/simple/simple.cpp, -split.py, same as simple.py but running in parallel on a subset of procs, -gui.py, GUI go/stop/temperature-slider to control LAMMPS, -plot.py, real-time temperature plot with GnuPlot via Pizza.py, -viz_tool.py, real-time viz via some viz package, -vizplotgui_tool.py, combination of viz_tool.py and plot.py and gui.py :tb(c=2) - -:line - -For the viz_tool.py and vizplotgui_tool.py commands, replace "tool" -with "gl" or "atomeye" or "pymol" or "vmd", depending on what -visualization package you have installed. - -Note that for GL, you need to be able to run the Pizza.py GL tool, -which is included in the pizza sub-directory. See the "Pizza.py doc -pages"_pizza for more info: - -:link(pizza,http://www.sandia.gov/~sjplimp/pizza.html) - -Note that for AtomEye, you need version 3, and there is a line in the -scripts that specifies the path and name of the executable. See the -AtomEye WWW pages "here"_atomeye or "here"_atomeye3 for more details: - -http://mt.seas.upenn.edu/Archive/Graphics/A -http://mt.seas.upenn.edu/Archive/Graphics/A3/A3.html :pre - -:link(atomeye,http://mt.seas.upenn.edu/Archive/Graphics/A) -:link(atomeye3,http://mt.seas.upenn.edu/Archive/Graphics/A3/A3.html) - -The latter link is to AtomEye 3 which has the scriping -capability needed by these Python scripts. - -Note that for PyMol, you need to have built and installed the -open-source version of PyMol in your Python, so that you can import it -from a Python script. See the PyMol WWW pages "here"_pymolhome or -"here"_pymolopen for more details: - -http://www.pymol.org -http://sourceforge.net/scm/?type=svn&group_id=4546 :pre - -:link(pymolhome,http://www.pymol.org) -:link(pymolopen,http://sourceforge.net/scm/?type=svn&group_id=4546) - -The latter link is to the open-source version. - -Note that for VMD, you need a fairly current version (1.8.7 works for -me) and there are some lines in the pizza/vmd.py script for 4 PIZZA -variables that have to match the VMD installation on your system. - -:line - -See the python/README file for instructions on how to run them and the -source code for individual scripts for comments about what they do. - -Here are screenshots of the vizplotgui_tool.py script in action for -different visualization package options. Click to see larger images: - -:image(JPG/screenshot_gl_small.jpg,JPG/screenshot_gl.jpg) -:image(JPG/screenshot_atomeye_small.jpg,JPG/screenshot_atomeye.jpg) -:image(JPG/screenshot_pymol_small.jpg,JPG/screenshot_pymol.jpg) -:image(JPG/screenshot_vmd_small.jpg,JPG/screenshot_vmd.jpg) - -11.9 PyLammps interface :link(py_9),h4 - -Please see the "PyLammps Tutorial"_tutorial_pylammps.html. diff --git a/doc/src/Section_start.txt b/doc/src/Section_start.txt index 7d456171dc..d8f340b179 100644 --- a/doc/src/Section_start.txt +++ b/doc/src/Section_start.txt @@ -1,4 +1,6 @@ -"Previous Section"_Section_intro.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Section_commands.html :c +"Previous Section"_Section_intro.html - "LAMMPS WWW Site"_lws - +"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next +Section"_Section_commands.html :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -930,8 +932,8 @@ Makefile.opt :ul LAMMPS can be built as either a static or shared library, which can then be called from another application or a scripting language. See "this section"_Section_howto.html#howto_10 for more info on coupling -LAMMPS to other codes. See "this section"_Section_python.html for -more info on wrapping and running LAMMPS from Python. +LAMMPS to other codes. See the "Python"_Python.html doc page for more +info on wrapping and running LAMMPS from Python. Static library :h4 @@ -955,15 +957,15 @@ dynamically loaded, e.g. from Python, type make foo mode=shlib :pre where foo is the machine name. This kind of library is required when -wrapping LAMMPS with Python; see "Section 11"_Section_python.html -for details. This will use the SHFLAGS and SHLIBFLAGS settings in +wrapping LAMMPS with Python; see the "Python"_Python.html doc page for +details. This will use the SHFLAGS and SHLIBFLAGS settings in src/MAKE/Makefile.foo and perform the build in the directory Obj_shared_foo. This is so that each file can be compiled with the -fPIC flag which is required for inclusion in a shared library. The build will create the file liblammps_foo.so which another application -can link to dynamically. It will also create a soft link liblammps.so, -which will point to the most recently built shared library. This is -the file the Python wrapper loads by default. +can link to dynamically. It will also create a soft link +liblammps.so, which will point to the most recently built shared +library. This is the file the Python wrapper loads by default. 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 @@ -1035,10 +1037,10 @@ src/library.cpp and src/library.h. See the sample codes in examples/COUPLE/simple for examples of C++ and C and Fortran codes that invoke LAMMPS thru its library interface. There are other examples as well in the COUPLE directory which are -discussed in "Section 6.10"_Section_howto.html#howto_10 of the -manual. See "Section 11"_Section_python.html of the manual for a -description of the Python wrapper provided with LAMMPS that operates -through the LAMMPS library interface. +discussed in "Section 6.10"_Section_howto.html#howto_10 of the manual. +See the "Python"_Python.html doc page for a description of the Python +wrapper provided with LAMMPS that operates through the LAMMPS library +interface. The files src/library.cpp and library.h define the C-style API for using LAMMPS as a library. See "Section @@ -1177,7 +1179,7 @@ than your working directory, which is probably not what you want. If LAMMPS encounters errors in the input script or while running a simulation it will print an ERROR message and stop or a WARNING -message and continue. See "Section 12"_Section_errors.html for a +message and continue. See the "Errors"_Errors.html doc page for a discussion of the various kinds of errors LAMMPS can or can't detect, a list of all ERROR and WARNING messages, and what to do about them. diff --git a/doc/src/Tools.txt b/doc/src/Tools.txt index 60b92f0f2e..4c5fbbd453 100644 --- a/doc/src/Tools.txt +++ b/doc/src/Tools.txt @@ -2,12 +2,6 @@ Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Modify.html :c - - :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) :link(lc,Section_commands.html#comm) diff --git a/doc/src/fix_external.txt b/doc/src/fix_external.txt index b28d33446f..30e34b4858 100644 --- a/doc/src/fix_external.txt +++ b/doc/src/fix_external.txt @@ -34,8 +34,7 @@ This fix allows external programs that are running LAMMPS through its "library interface"_Section_howto.html#howto_19 to modify certain LAMMPS properties on specific timesteps, similar to the way other fixes do. The external driver can be a "C/C++ or Fortran -program"_Section_howto.html#howto_19 or a "Python -script"_Section_python.html. +program"_Section_howto.html#howto_19 or a "Python script"_Python.html. :line diff --git a/doc/src/lammps.book b/doc/src/lammps.book index ff8fe68ff1..4924ec8027 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -31,9 +31,22 @@ Modify_region.html Modify_body.html Modify_thermo.html Modify_variable.html - -Section_python.html -Section_errors.html +Python.html +Python_overview.txt +Python_run.txt +Python_shlib.txt +Python_install.txt +Python_mpi.txt +Python_test.txt +Python_library.txt +Python_pylammps.txt +Python_examples.txt +Python_call.txt +Errors.html +Errors_common.txt +Errors_bugs.txt +Errors_messages.txt +Errors_warnings.txt Section_history.html lammps_tutorials.html diff --git a/doc/src/python.txt b/doc/src/python.txt index 1ac2b48528..d670fcc77f 100644 --- a/doc/src/python.txt +++ b/doc/src/python.txt @@ -99,10 +99,9 @@ They can be substituted for directly in an input script. Or they can be passed to various commands as arguments, so that the variable is evaluated during a simulation run. -A broader overview of how Python can be used with LAMMPS is -given in "Section 11"_Section_python.html. There is an -examples/python directory which illustrates use of the python -command. +A broader overview of how Python can be used with LAMMPS is given on +the "Python"_Python.html doc page. There is an examples/python +directory which illustrates use of the python command. :line @@ -331,9 +330,9 @@ to the screen and log file. Note that since the LAMMPS print command itself takes a string in quotes as its argument, the Python string must be delimited with a different style of quotes. -"Section 11.7"_Section_python.html#py_7 describes the syntax for how -Python wraps the various functions included in the LAMMPS library -interface. +The "Pytnon library"_Python_library.html doc page describes the syntax +for how Python wraps the various functions included in the LAMMPS +library interface. A more interesting example is in the examples/python/in.python script which loads and runs the following function from examples/python/funcs.py: @@ -484,15 +483,16 @@ building LAMMPS. LAMMPS must also be built as a shared library and your Python function must be able to to load the Python module in python/lammps.py that wraps the LAMMPS library interface. These are the same steps required to use Python by itself to wrap LAMMPS. -Details on these steps are explained in "Section -python"_Section_python.html. Note that it is important that the -stand-alone LAMMPS executable and the LAMMPS shared library be -consistent (built from the same source code files) in order for this -to work. If the two have been built at different times using -different source files, problems may occur. +Details on these steps are explained on the "Python"_Python.html doc +page. Note that it is important that the stand-alone LAMMPS +executable and the LAMMPS shared library be consistent (built from the +same source code files) in order for this to work. If the two have +been built at different times using different source files, problems +may occur. [Related commands:] -"shell"_shell.html, "variable"_variable.html, "fix python/invoke"_fix_python_invoke.html +"shell"_shell.html, "variable"_variable.html, "fix +python/invoke"_fix_python_invoke.html [Default:] none diff --git a/doc/src/read_dump.txt b/doc/src/read_dump.txt index 23f6274582..21c6df5017 100644 --- a/doc/src/read_dump.txt +++ b/doc/src/read_dump.txt @@ -282,11 +282,11 @@ conditions are applied to remap an atom back into the simulation box. NOTE: If you get a warning about inconsistent image flags after reading in a dump snapshot, it means one or more pairs of bonded atoms -now have inconsistent image flags. As discussed in "Section -errors"_Section_errors.html this may or may not cause problems for -subsequent simulations, One way this can happen is if you read image -flag fields from the dump file but do not also use the dump file box -parameters. +now have inconsistent image flags. As discussed on the "Errors +common"_Errors_common.html doc page this may or may not cause problems +for subsequent simulations. One way this can happen is if you read +image flag fields from the dump file but do not also use the dump file +box parameters. LAMMPS knows how to compute unscaled and remapped coordinates for the snapshot column labels discussed above, e.g. {x}, {xs}, {xu}, {xsu}. diff --git a/doc/src/read_restart.txt b/doc/src/read_restart.txt index a5a2bfcc97..6f6a828229 100644 --- a/doc/src/read_restart.txt +++ b/doc/src/read_restart.txt @@ -76,8 +76,7 @@ different than if the run had continued. These pair styles include If a restarted run is immediately different than the run which produced the restart file, it could be a LAMMPS bug, so consider -"reporting it"_Section_errors.html#err_2 if you think the behavior is -wrong. +"reporting it"_Errors_bugs.html if you think the behavior is a bug. Because restart files are binary, they may not be portable to other machines. In this case, you can use the "-restart command-line diff --git a/src/pair.cpp b/src/pair.cpp index 9bb1ad212f..5c308cc7ce 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -693,17 +693,19 @@ void Pair::compute_dummy(int eflag, int vflag) } /* ---------------------------------------------------------------------- */ + void Pair::read_restart(FILE *) { if (comm->me == 0) - error->warning(FLERR,"BUG: restartinfo=1 but no restart support in pair style"); + error->warning(FLERR,"Pair style restartinfo set but has no restart support"); } /* ---------------------------------------------------------------------- */ + void Pair::write_restart(FILE *) { if (comm->me == 0) - error->warning(FLERR,"BUG: restartinfo=1 but no restart support in pair style"); + error->warning(FLERR,"Pair style restartinfo set but has no restart support"); } /* ------------------------------------------------------------------- From e6e026433c09be429fe2066d7016c0569564519a Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 25 Jul 2018 16:49:51 -0400 Subject: [PATCH 086/123] Fix clean-all in docs Makefile --- doc/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index c8cc8bc1bd..c4bc80e7bd 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -49,11 +49,11 @@ help: # ------------------------------------------ -clean-all: +clean-all: clean rm -rf $(BUILDDIR)/* utils/txt2html/txt2html.exe clean: - rm -rf $(RSTDIR) html + rm -rf $(RSTDIR) html old epub rm -rf spelling clean-spelling: From 353ecd2c7ac09f81528fa36a782ef271176c69b0 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 25 Jul 2018 16:56:28 -0400 Subject: [PATCH 087/123] Correct header levels --- doc/src/Errors.txt | 2 +- doc/src/Python.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/Errors.txt b/doc/src/Errors.txt index 8e10cb6ae4..7bc520c19d 100644 --- a/doc/src/Errors.txt +++ b/doc/src/Errors.txt @@ -8,7 +8,7 @@ Section"_Section_history.html :c :line -Errors :h3 +Errors :h2 These doc pages describe the errors you can encounter when using LAMMPS. The common problems include conceptual issues. The messages diff --git a/doc/src/Python.txt b/doc/src/Python.txt index 94a2e88f5e..169670d669 100644 --- a/doc/src/Python.txt +++ b/doc/src/Python.txt @@ -8,7 +8,7 @@ Section"_Errors.html :c :line -Use Python with LAMMPS :h3 +Use Python with LAMMPS :h2 These doc pages describe various ways that LAMMPS and Python can be used together. From 532d09bd567dbabdfe86ef459ad16e14d98922ed Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Wed, 25 Jul 2018 16:56:49 -0400 Subject: [PATCH 088/123] Correct lammps.book --- doc/src/lammps.book | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 4924ec8027..4274ef48b3 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -32,21 +32,21 @@ Modify_body.html Modify_thermo.html Modify_variable.html Python.html -Python_overview.txt -Python_run.txt -Python_shlib.txt -Python_install.txt -Python_mpi.txt -Python_test.txt -Python_library.txt -Python_pylammps.txt -Python_examples.txt -Python_call.txt +Python_overview.html +Python_run.html +Python_shlib.html +Python_install.html +Python_mpi.html +Python_test.html +Python_library.html +Python_pylammps.html +Python_examples.html +Python_call.html Errors.html -Errors_common.txt -Errors_bugs.txt -Errors_messages.txt -Errors_warnings.txt +Errors_common.html +Errors_bugs.html +Errors_messages.html +Errors_warnings.html Section_history.html lammps_tutorials.html From c8b9a727e42460124cac2aeb5717c236367db16d Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Fri, 27 Jul 2018 00:35:08 -0400 Subject: [PATCH 089/123] Add potential files to CMake install target --- cmake/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 60a0f5d48f..44f871bfe3 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -900,6 +900,11 @@ if(BUILD_EXE) endif() endif() +############################################################################### +# Install potential files in data directory +############################################################################### +install(DIRECTORY ${LAMMPS_SOURCE_DIR}/../potentials DESTINATION ${CMAKE_INSTALL_DATADIR}/lammps) + ############################################################################### # Testing # From 819e47b69e7bf46edd99db1ee0b67e1d4134c9b0 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Fri, 27 Jul 2018 02:29:10 -0400 Subject: [PATCH 090/123] Add output dir and verbose option to txt2rst --- doc/Makefile | 2 +- doc/utils/converters/lammpsdoc/txt2html.py | 12 +++++++++--- doc/utils/converters/lammpsdoc/txt2rst.py | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index c4bc80e7bd..81f3623499 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -157,7 +157,7 @@ $(RSTDIR)/%.rst : src/%.txt $(TXT2RST) @(\ mkdir -p $(RSTDIR) ; \ . $(VENV)/bin/activate ;\ - txt2rst $< > $@ ;\ + txt2rst -v $< > $@ ;\ deactivate ;\ ) diff --git a/doc/utils/converters/lammpsdoc/txt2html.py b/doc/utils/converters/lammpsdoc/txt2html.py index 79a75d72f6..ed9f47a4e4 100755 --- a/doc/utils/converters/lammpsdoc/txt2html.py +++ b/doc/utils/converters/lammpsdoc/txt2html.py @@ -662,14 +662,15 @@ class TxtConverter: parser = self.get_argument_parser() parsed_args = parser.parse_args(args) - write_to_files = len(parsed_args.files) > 1 + write_to_files = parsed_args.output_dir or (len(parsed_args.files) > 1) for filename in parsed_args.files: if parsed_args.skip_files and filename in parsed_args.skip_files: continue with open(filename, 'r') as f: - print("Converting", filename, "...", file=err) + if parsed_args.verbose: + print("Converting", filename, "...", file=err) content = f.read() converter = self.create_converter(parsed_args) @@ -683,7 +684,10 @@ class TxtConverter: result = msg if write_to_files: - output_filename = self.get_output_filename(filename) + if parsed_args.output_dir: + output_filename = os.path.join(parsed_args.output_dir, os.path.basename(self.get_output_filename(filename))) + else: + output_filename = self.get_output_filename(filename) with open(output_filename, "w+t") as outfile: outfile.write(result) else: @@ -698,6 +702,8 @@ class Txt2HtmlConverter(TxtConverter): 'HTML file. useful when set of HTML files' ' will be converted to PDF') parser.add_argument('-x', metavar='file-to-skip', dest='skip_files', action='append') + parser.add_argument('--verbose', '-v', dest='verbose', action='store_true') + parser.add_argument('--output-directory', '-o', dest='output_dir') parser.add_argument('--generate-title', dest='create_title', action='store_true', help='add HTML head page' 'title based on first ' 'h1,h2,h3,h4... element') diff --git a/doc/utils/converters/lammpsdoc/txt2rst.py b/doc/utils/converters/lammpsdoc/txt2rst.py index 17d0916157..8119ad3a78 100755 --- a/doc/utils/converters/lammpsdoc/txt2rst.py +++ b/doc/utils/converters/lammpsdoc/txt2rst.py @@ -395,6 +395,8 @@ class Txt2RstConverter(TxtConverter): parser = argparse.ArgumentParser(description='converts a text file with simple formatting & markup into ' 'Restructured Text for Sphinx.') parser.add_argument('-x', metavar='file-to-skip', dest='skip_files', action='append') + parser.add_argument('--verbose', '-v', dest='verbose', action='store_true') + parser.add_argument('--output-directory', '-o', dest='output_dir') parser.add_argument('files', metavar='file', nargs='+', help='one or more files to convert') return parser From 9ffd262039924bb6c154de80d26dd6c47f4cb693 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Fri, 27 Jul 2018 02:46:36 -0400 Subject: [PATCH 091/123] Add CMake target for html documentation --- cmake/CMakeLists.txt | 58 ++++++++++++++++++++++++++++++++++++++ doc/utils/requirements.txt | 1 + 2 files changed, 59 insertions(+) create mode 100644 doc/utils/requirements.txt diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 44f871bfe3..33462df5ef 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -9,6 +9,7 @@ set(SOVERSION 0) get_filename_component(LAMMPS_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../src ABSOLUTE) get_filename_component(LAMMPS_LIB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../lib ABSOLUTE) get_filename_component(LAMMPS_LIB_BINARY_DIR ${CMAKE_BINARY_DIR}/lib ABSOLUTE) +get_filename_component(LAMMPS_DOC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../doc ABSOLUTE) # To avoid conflicts with the conventional Makefile build system, we build everything here @@ -900,6 +901,63 @@ if(BUILD_EXE) endif() endif() +############################################################################### +# Build documentation +############################################################################### +option(BUILD_DOC "Build LAMMPS documentation" OFF) +if(BUILD_DOC) + include(ProcessorCount) + ProcessorCount(NPROCS) + find_package(PythonInterp 3 REQUIRED) + + set(VIRTUALENV ${PYTHON_EXECUTABLE} -m virtualenv) + + file(GLOB DOC_SOURCES ${LAMMPS_DOC_DIR}/src/*.txt) + file(GLOB PDF_EXTRA_SOURCES ${LAMMPS_DOC_DIR}/src/lammps_commands*.txt ${LAMMPS_DOC_DIR}/src/lammps_support.txt ${LAMMPS_DOC_DIR}/src/lammps_tutorials.txt) + list(REMOVE_ITEM DOC_SOURCES ${PDF_EXTRA_SOURCES}) + + add_custom_command( + OUTPUT docenv + COMMAND ${VIRTUALENV} docenv + ) + add_custom_command( + OUTPUT requirements.txt + DEPENDS docenv + COMMAND ${CMAKE_COMMAND} -E copy ${LAMMPS_DOC_DIR}/utils/requirements.txt requirements.txt + COMMAND ./docenv/bin/pip install -r requirements.txt --upgrade + COMMAND ./docenv/bin/pip install --upgrade ${LAMMPS_DOC_DIR}/utils/converters + ) + + set(RST_FILES "") + set(RST_DIR ${CMAKE_BINARY_DIR}/rst) + file(MAKE_DIRECTORY ${RST_DIR}) + foreach(TXT_FILE ${DOC_SOURCES}) + get_filename_component(FILENAME ${TXT_FILE} NAME_WE) + set(RST_FILE ${RST_DIR}/${FILENAME}.rst) + list(APPEND RST_FILES ${RST_FILE}) + add_custom_command( + OUTPUT ${RST_FILE} + DEPENDS requirements.txt docenv ${TXT_FILE} + COMMAND ./docenv/bin/txt2rst -o ${RST_DIR} ${TXT_FILE} + ) + endforeach() + + add_custom_command( + OUTPUT html + DEPENDS ${RST_FILES} + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LAMMPS_DOC_DIR}/src ${RST_DIR} + COMMAND ./docenv/bin/sphinx-build -j ${NPROCS} -b html -c ${LAMMPS_DOC_DIR}/utils/sphinx-config -d ${CMAKE_BINARY_DIR}/doctrees ${RST_DIR} html + ) + + add_custom_target( + doc + DEPENDS html + SOURCES ${LAMMPS_DOC_DIR}/utils/requirements.txt ${DOC_SOURCES} + ) + + install(DIRECTORY ${CMAKE_BINARY_DIR}/html DESTINATION ${CMAKE_INSTALL_DOCDIR}) +endif() + ############################################################################### # Install potential files in data directory ############################################################################### diff --git a/doc/utils/requirements.txt b/doc/utils/requirements.txt new file mode 100644 index 0000000000..2806c16498 --- /dev/null +++ b/doc/utils/requirements.txt @@ -0,0 +1 @@ +Sphinx From 06335e77cb76aa58627e51f7776f3797a1f21dc3 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Fri, 27 Jul 2018 02:56:19 -0400 Subject: [PATCH 092/123] Ensure doc is built by default when enabled --- cmake/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 33462df5ef..88efd90221 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -950,7 +950,7 @@ if(BUILD_DOC) ) add_custom_target( - doc + doc ALL DEPENDS html SOURCES ${LAMMPS_DOC_DIR}/utils/requirements.txt ${DOC_SOURCES} ) From f63e2b6eaf8d7370eaff5ea7e3bacfa10bd05a4c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Jul 2018 10:24:15 +0200 Subject: [PATCH 093/123] simplify code and guarantee that "mode" is initialized --- src/BODY/fix_wall_body_polygon.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/BODY/fix_wall_body_polygon.cpp b/src/BODY/fix_wall_body_polygon.cpp index 5ec5a7cca8..0e7aaea1e1 100644 --- a/src/BODY/fix_wall_body_polygon.cpp +++ b/src/BODY/fix_wall_body_polygon.cpp @@ -641,18 +641,15 @@ int FixWallBodyPolygon::compute_distance_to_wall(double* x0, double rradi, mode = VERTEX; contact = 1; } else { + mode = NONE; if (side == XLO) { if (x0[0] < wall_pos) mode = VERTEX; - else mode = NONE; } else if (side == XHI) { if (x0[0] > wall_pos) mode = VERTEX; - else mode = NONE; } else if (side == YLO) { if (x0[1] < wall_pos) mode = VERTEX; - else mode = NONE; } else if (side == YHI) { if (x0[1] > wall_pos) mode = VERTEX; - else mode = NONE; } } From 8075b98fc53f1c56ac449c6fa428f34452b158d8 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Jul 2018 10:24:38 +0200 Subject: [PATCH 094/123] initialize rsqinv --- src/BODY/pair_body_rounded_polyhedron.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index 2ff209d609..fa1d84a663 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -685,7 +685,7 @@ void PairBodyRoundedPolyhedron::sphere_against_edge(int ibody, int jbody, { int ni,nei,ifirst,iefirst,npi1,npi2,ibonus; double xi1[3],xi2[3],vti[3],h[3],fn[3],ft[3],d,t; - double delx,dely,delz,rij,rsqinv,R,fx,fy,fz,fpair,shift,energy; + double delx,dely,delz,rsq,rij,rsqinv,R,fx,fy,fz,fpair,shift,energy; double rradi,rradj,contact_dist; double vr1,vr2,vr3,vnnr,vn1,vn2,vn3,vt1,vt2,vt3; double *quat, *inertia; @@ -749,7 +749,9 @@ void PairBodyRoundedPolyhedron::sphere_against_edge(int ibody, int jbody, delx = h[0] - x[jbody][0]; dely = h[1] - x[jbody][1]; delz = h[2] - x[jbody][2]; - rij = sqrt(delx*delx + dely*dely + delz*delz); + rsq = delx*delx + dely*dely + delz*delz; + rsqinv = (rsq == 0.0) ? 0.0 : 1.0/rsq; + rij = sqrt(rsq); R = rij - contact_dist; energy = 0; From 2af88dcc26a32215568d168869a0d35f6aa4b9f0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Jul 2018 10:39:01 +0200 Subject: [PATCH 095/123] avoid uninitialized variables --- src/BODY/pair_body_rounded_polyhedron.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/BODY/pair_body_rounded_polyhedron.cpp b/src/BODY/pair_body_rounded_polyhedron.cpp index fa1d84a663..051be762e5 100644 --- a/src/BODY/pair_body_rounded_polyhedron.cpp +++ b/src/BODY/pair_body_rounded_polyhedron.cpp @@ -2079,6 +2079,7 @@ void PairBodyRoundedPolyhedron::distance_bt_edges(const double* x1, double s1,s2,x13[3],x23[3],x13h[3]; double t13,t23,t31,t41,x31[3],x41[3]; + t13=t23=t31=t41=0.0; MathExtra::sub3(x1,x3,x13); // x13 = x1 - x3 MathExtra::sub3(x2,x3,x23); // x23 = x2 - x3 From 28993d98237b2b10b5f894de1557b4a24b2744c8 Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 26 Jul 2018 08:36:30 -0600 Subject: [PATCH 096/123] Commit JT 072618 - improvements documentation (dmi and exchange) - correction error cross product in pair_spin_dmi.cpp - implementation mech. part in pair_spin_dmi.cpp - correction in all pairs: init_one for [j][i] couples - correction in atom_vec_spin.cpp: index error in read_data - some improvements in pair_spin_dmi.cpp and pair_spin_magelec.cpp --- doc/src/Eqs/pair_spin_dmi_forces.jpg | Bin 0 -> 13431 bytes doc/src/Eqs/pair_spin_dmi_forces.tex | 14 +++ doc/src/Eqs/pair_spin_dmi_interaction.jpg | Bin 6316 -> 7891 bytes doc/src/Eqs/pair_spin_dmi_interaction.tex | 2 +- doc/src/Eqs/pair_spin_exchange_forces.jpg | Bin 13720 -> 13255 bytes doc/src/Eqs/pair_spin_exchange_forces.tex | 10 +- .../Eqs/pair_spin_exchange_interaction.jpg | Bin 6661 -> 5940 bytes .../Eqs/pair_spin_exchange_interaction.tex | 2 +- doc/src/pair_spin_dmi.txt | 41 +++++-- doc/src/pair_spin_exchange.txt | 28 ++++- examples/SPIN/bfo/in.spin.bfo | 11 +- examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp | 10 +- src/SPIN/atom_vec_spin.cpp | 6 +- src/SPIN/compute_spin.cpp | 20 +-- src/SPIN/pair_spin_dmi.cpp | 116 ++++++++++++------ src/SPIN/pair_spin_dmi.h | 15 +-- src/SPIN/pair_spin_exchange.cpp | 52 ++++---- src/SPIN/pair_spin_magelec.cpp | 88 +++++++------ src/SPIN/pair_spin_neel.cpp | 10 +- src/SPIN/pair_spin_neel.h | 4 +- 20 files changed, 272 insertions(+), 157 deletions(-) create mode 100644 doc/src/Eqs/pair_spin_dmi_forces.jpg create mode 100644 doc/src/Eqs/pair_spin_dmi_forces.tex diff --git a/doc/src/Eqs/pair_spin_dmi_forces.jpg b/doc/src/Eqs/pair_spin_dmi_forces.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fba6a91cbf6fdb6ee6736073a114d08c907d6d3c GIT binary patch literal 13431 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

Mp% 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 Hvig4jn{I9c literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/pair_spin_dmi_forces.tex b/doc/src/Eqs/pair_spin_dmi_forces.tex new file mode 100644 index 0000000000..1c0c246db4 --- /dev/null +++ b/doc/src/Eqs/pair_spin_dmi_forces.tex @@ -0,0 +1,14 @@ +\documentclass[preview]{standalone} +\usepackage{varwidth} +\usepackage[utf8x]{inputenc} +\usepackage{amsmath,amssymb,amsthm,bm} +\begin{document} +\begin{varwidth}{50in} + \begin{equation} + \vec{\omega}_i = -\frac{1}{\hbar} \sum_{j}^{Neighb} \vec{s}_{j}\times \left(\vec{e}_{ij}\times \vec{D} \right) + ~~{\rm and}~~ + \vec{F}_i = -\sum_{j}^{Neighb} \frac{1}{r_{ij}} \vec{D} \times \left( \vec{s}_{i}\times \vec{s}_{j} \right) + , \nonumber + \end{equation} +\end{varwidth} +\end{document} diff --git a/doc/src/Eqs/pair_spin_dmi_interaction.jpg b/doc/src/Eqs/pair_spin_dmi_interaction.jpg index 1d15b2199add75eefecb424f75ea2dbd363a1afe..3eb24c67e3b26f97c362fd05982ead5fb0f5c150 100644 GIT binary patch literal 7891 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 literal 13720 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 YAN#n!=#A%hftx-OcW#2Ko`=Q%0oGV3X8-^I diff --git a/doc/src/Eqs/pair_spin_exchange_forces.tex b/doc/src/Eqs/pair_spin_exchange_forces.tex index 088696d5ef..ac5ef682f3 100644 --- a/doc/src/Eqs/pair_spin_exchange_forces.tex +++ b/doc/src/Eqs/pair_spin_exchange_forces.tex @@ -5,10 +5,12 @@ \begin{document} \begin{varwidth}{50in} \begin{equation} - \vec{F}^{i} = \sum_{j}^{Neighbor} \frac{\partial {J} \left(r_{ij} \right)}{ - \partial r_{ij}} \left( \vec{s}_{i}\cdot \vec{s}_{j} \right) \vec{r}_{ij} - ~~{\rm and}~~ \vec{\omega}^{i} = \frac{1}{\hbar} \sum_{j}^{Neighbor} {J} - \left(r_{ij} \right)\,\vec{s}_{j} \nonumber + \vec{\omega}_{i} = \frac{1}{\hbar} \sum_{j}^{Neighb} {J} + \left(r_{ij} \right)\,\vec{s}_{j} + ~~{\rm and}~~ + \vec{F}_{i} = \sum_{j}^{Neighb} \frac{\partial {J} \left(r_{ij} \right)}{ + \partial r_{ij}} \left( \vec{s}_{i}\cdot \vec{s}_{j} \right) \vec{e}_{ij} + \nonumber \end{equation} \end{varwidth} \end{document} diff --git a/doc/src/Eqs/pair_spin_exchange_interaction.jpg b/doc/src/Eqs/pair_spin_exchange_interaction.jpg index d51524d27ca413ec4ded189107c2219b061f7d7e..c70d8a6554003e37472d648c1944a13ee9d3f859 100644 GIT binary patch literal 5940 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 literal 6661 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 { - mag[0] += sp[i][0]; - mag[1] += sp[i][1]; - mag[2] += sp[i][2]; - magenergy -= (sp[i][0]*fm[i][0] + sp[i][1]*fm[i][1] + sp[i][2]*fm[i][2]); - tx = sp[i][1]*fm[i][2]-sp[i][2]*fm[i][1]; - ty = sp[i][2]*fm[i][0]-sp[i][0]*fm[i][2]; - tz = sp[i][0]*fm[i][1]-sp[i][1]*fm[i][0]; - tempnum += tx*tx+ty*ty+tz*tz; - tempdenom += sp[i][0]*fm[i][0]+fm[i][1]*sp[i][1]+sp[i][2]*fm[i][2]; - countsp++; + mag[0] += sp[i][0]; + mag[1] += sp[i][1]; + mag[2] += sp[i][2]; + magenergy -= (sp[i][0]*fm[i][0] + sp[i][1]*fm[i][1] + sp[i][2]*fm[i][2]); + tx = sp[i][1]*fm[i][2]-sp[i][2]*fm[i][1]; + ty = sp[i][2]*fm[i][0]-sp[i][0]*fm[i][2]; + tz = sp[i][0]*fm[i][1]-sp[i][1]*fm[i][0]; + tempnum += tx*tx+ty*ty+tz*tz; + tempdenom += sp[i][0]*fm[i][0]+fm[i][1]*sp[i][1]+sp[i][2]*fm[i][2]; + countsp++; } } else error->all(FLERR,"Compute compute/spin requires atom/spin style"); diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index b792969c5d..08e2c63e7f 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -65,6 +65,9 @@ PairSpinDmi::~PairSpinDmi() memory->destroy(v_dmx); memory->destroy(v_dmy); memory->destroy(v_dmz); + memory->destroy(vmech_dmx); + memory->destroy(vmech_dmy); + memory->destroy(vmech_dmz); memory->destroy(cutsq); } } @@ -118,7 +121,7 @@ void PairSpinDmi::coeff(int narg, char **arg) force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); const double rij = force->numeric(FLERR,arg[3]); - const double dm = (force->numeric(FLERR,arg[4]))/hbar; + const double dm = (force->numeric(FLERR,arg[4])); double dmx = force->numeric(FLERR,arg[5]); double dmy = force->numeric(FLERR,arg[6]); double dmz = force->numeric(FLERR,arg[7]); @@ -133,9 +136,12 @@ void PairSpinDmi::coeff(int narg, char **arg) for (int j = MAX(jlo,i); j <= jhi; j++) { cut_spin_dmi[i][j] = rij; DM[i][j] = dm; - v_dmx[i][j] = dmx * dm; - v_dmy[i][j] = dmy * dm; - v_dmz[i][j] = dmz * dm; + v_dmx[i][j] = dmx * dm / hbar; + v_dmy[i][j] = dmy * dm / hbar; + v_dmz[i][j] = dmz * dm / hbar; + vmech_dmx[i][j] = dmx * dm; + vmech_dmy[i][j] = dmy * dm; + vmech_dmz[i][j] = dmz * dm; setflag[i][j] = 1; count++; } @@ -187,9 +193,17 @@ void PairSpinDmi::init_style() double PairSpinDmi::init_one(int i, int j) { - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + DM[j][i] = DM[i][j]; + v_dmx[j][i] = v_dmx[i][j]; + v_dmy[j][i] = v_dmy[i][j]; + v_dmz[j][i] = v_dmz[i][j]; + vmech_dmx[j][i] = vmech_dmx[i][j]; + vmech_dmy[j][i] = vmech_dmy[i][j]; + vmech_dmz[j][i] = vmech_dmz[i][j]; + cut_spin_dmi[j][i] = cut_spin_dmi[i][j]; + return cut_spin_dmi_global; } @@ -210,7 +224,8 @@ void PairSpinDmi::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double evdwl, ecoul; - double xi[3], rij[3], eij[3]; + double xi[3], eij[3]; + double delx,dely,delz; double spi[3], spj[3]; double fi[3], fmi[3]; double local_cut2; @@ -264,20 +279,17 @@ void PairSpinDmi::compute(int eflag, int vflag) spj[2] = sp[j][2]; evdwl = 0.0; - fi[0] = fi[1] = fi[2] = 0.0; fmi[0] = fmi[1] = fmi[2] = 0.0; - rij[0] = rij[1] = rij[2] = 0.0; - eij[0] = eij[1] = eij[2] = 0.0; - rij[0] = x[j][0] - xi[0]; - rij[1] = x[j][1] - xi[1]; - rij[2] = x[j][2] - xi[2]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + delx = xi[0] - x[j][0]; + dely = xi[1] - x[j][1]; + delz = xi[2] - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; inorm = 1.0/sqrt(rsq); - eij[0] = rij[0]*inorm; - eij[1] = rij[1]*inorm; - eij[2] = rij[2]*inorm; + eij[0] = -inorm*delx; + eij[1] = -inorm*dely; + eij[2] = -inorm*delz; local_cut2 = cut_spin_dmi[itype][jtype]*cut_spin_dmi[itype][jtype]; @@ -286,7 +298,7 @@ void PairSpinDmi::compute(int eflag, int vflag) if (rsq <= local_cut2) { compute_dmi(i,j,eij,fmi,spj); if (lattice_flag) { - compute_dmi_mech(fi); + compute_dmi_mech(i,j,rsq,eij,fi,spi,spj); } } @@ -309,7 +321,7 @@ void PairSpinDmi::compute(int eflag, int vflag) } 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],delx,dely,delz); } } @@ -325,8 +337,8 @@ void PairSpinDmi::compute_single_pair(int ii, double fmi[3]) double **x = atom->x; double **sp = atom->sp; double local_cut2; - - double xi[3], rij[3], eij[3]; + double xi[3], eij[3]; + double delx,dely,delz; double spj[3]; int i,j,jnum,itype,jtype; @@ -358,14 +370,14 @@ void PairSpinDmi::compute_single_pair(int ii, double fmi[3]) spj[1] = sp[j][1]; spj[2] = sp[j][2]; - rij[0] = x[j][0] - xi[0]; - rij[1] = x[j][1] - xi[1]; - rij[2] = x[j][2] - xi[2]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + delx = xi[0] - x[j][0]; + dely = xi[1] - x[j][1]; + delz = xi[2] - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; inorm = 1.0/sqrt(rsq); - eij[0] = rij[0]*inorm; - eij[1] = rij[1]*inorm; - eij[2] = rij[2]*inorm; + eij[0] = -inorm*delx; + eij[1] = -inorm*dely; + eij[2] = -inorm*delz; local_cut2 = cut_spin_dmi[itype][jtype]*cut_spin_dmi[itype][jtype]; @@ -390,23 +402,45 @@ void PairSpinDmi::compute_dmi(int i, int j, double eij[3], double fmi[3], double jtype = type[j]; dmix = eij[1]*v_dmz[itype][jtype] - eij[2]*v_dmy[itype][jtype]; - dmiy = eij[2]*v_dmx[itype][jtype] - eij[2]*v_dmz[itype][jtype]; + 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] += (spj[1]*dmiz - spj[2]*dmiy); - fmi[1] += (spj[2]*dmix - spj[0]*dmiz); - fmi[2] += (spj[0]*dmiy - spj[1]*dmix); + fmi[0] -= (spj[1]*dmiz - spj[2]*dmiy); + fmi[1] -= (spj[2]*dmix - spj[0]*dmiz); + fmi[2] -= (spj[0]*dmiy - spj[1]*dmix); } /* ---------------------------------------------------------------------- compute the mechanical force due to the dmi interaction between atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinDmi::compute_dmi_mech(double fi[3]) +void PairSpinDmi::compute_dmi_mech(int i, int j, double rsq, double eij[3], + double fi[3], double spi[3], double spj[3]) { - fi[0] += 0.0; - fi[1] += 0.0; - fi[2] += 0.0; + int *type = atom->type; + int itype, jtype; + double dmix,dmiy,dmiz; + itype = type[i]; + jtype = type[j]; + double csx,csy,csz,cdmx,cdmy,cdmz,irij; + + irij = 1.0/sqrt(rsq); + + dmix = vmech_dmx[itype][jtype]; + dmiy = vmech_dmy[itype][jtype]; + dmiz = vmech_dmz[itype][jtype]; + + csx = (spi[1]*spj[2] - spi[2]*spj[1]); + csy = (spi[2]*spj[0] - spi[0]*spj[2]); + csz = (spi[0]*spj[1] - spi[1]*spj[0]); + + cdmx = (dmiy*csz - dmiz*csy); + cdmy = (dmiz*csx - dmix*csz); + cdmz = (dmix*csy - dmiy*csz); + + fi[0] += irij*cdmx; + fi[1] += irij*cdmy; + fi[2] += irij*cdmz; } /* ---------------------------------------------------------------------- @@ -428,6 +462,9 @@ void PairSpinDmi::allocate() memory->create(v_dmx,n+1,n+1,"pair:DM_vector_x"); memory->create(v_dmy,n+1,n+1,"pair:DM_vector_y"); memory->create(v_dmz,n+1,n+1,"pair:DM_vector_z"); + memory->create(vmech_dmx,n+1,n+1,"pair:DMmech_vector_x"); + memory->create(vmech_dmy,n+1,n+1,"pair:DMmech_vector_y"); + memory->create(vmech_dmz,n+1,n+1,"pair:DMmech_vector_z"); memory->create(cutsq,n+1,n+1,"pair:cutsq"); @@ -451,6 +488,9 @@ void PairSpinDmi::write_restart(FILE *fp) fwrite(&v_dmx[i][j],sizeof(double),1,fp); fwrite(&v_dmy[i][j],sizeof(double),1,fp); fwrite(&v_dmz[i][j],sizeof(double),1,fp); + fwrite(&vmech_dmx[i][j],sizeof(double),1,fp); + fwrite(&vmech_dmy[i][j],sizeof(double),1,fp); + fwrite(&vmech_dmz[i][j],sizeof(double),1,fp); fwrite(&cut_spin_dmi[i][j],sizeof(double),1,fp); } } @@ -478,12 +518,18 @@ void PairSpinDmi::read_restart(FILE *fp) fread(&v_dmx[i][j],sizeof(double),1,fp); fread(&v_dmy[i][j],sizeof(double),1,fp); fread(&v_dmz[i][j],sizeof(double),1,fp); + fread(&vmech_dmx[i][j],sizeof(double),1,fp); + fread(&vmech_dmy[i][j],sizeof(double),1,fp); + fread(&vmech_dmz[i][j],sizeof(double),1,fp); fread(&cut_spin_dmi[i][j],sizeof(double),1,fp); } MPI_Bcast(&DM[i][j],1,MPI_DOUBLE,0,world); MPI_Bcast(&v_dmx[i][j],1,MPI_DOUBLE,0,world); MPI_Bcast(&v_dmy[i][j],1,MPI_DOUBLE,0,world); MPI_Bcast(&v_dmz[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&vmech_dmx[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&vmech_dmy[i][j],1,MPI_DOUBLE,0,world); + MPI_Bcast(&vmech_dmz[i][j],1,MPI_DOUBLE,0,world); MPI_Bcast(&cut_spin_dmi[i][j],1,MPI_DOUBLE,0,world); } } diff --git a/src/SPIN/pair_spin_dmi.h b/src/SPIN/pair_spin_dmi.h index a309f0c8d5..68e42e879d 100644 --- a/src/SPIN/pair_spin_dmi.h +++ b/src/SPIN/pair_spin_dmi.h @@ -38,22 +38,23 @@ class PairSpinDmi : public PairSpin { void compute_single_pair(int, double *); void compute_dmi(int, int, double *, double *, double *); - void compute_dmi_mech(double *); + void compute_dmi_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_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 **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 - int lattice_flag; // flag for mech force computation - class FixNVESpin *lockfixnvespin; // ptr to FixNVESpin for setups + int lattice_flag; // flag for mech force computation + class FixNVESpin *lockfixnvespin; // ptr to FixNVESpin for setups void allocate(); }; diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index 1b7b36b6db..cc074bb97d 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -65,7 +65,7 @@ PairSpinExchange::~PairSpinExchange() memory->destroy(J1_mech); memory->destroy(J2); memory->destroy(J3); - memory->destroy(cutsq); // to be deleted + memory->destroy(cutsq); // to be implemented } } @@ -134,8 +134,8 @@ void PairSpinExchange::coeff(int narg, char **arg) count++; } } - if (count == 0) - error->all(FLERR,"Incorrect args in pair_style command"); + + if (count == 0) error->all(FLERR,"Incorrect args in pair_style command"); } /* ---------------------------------------------------------------------- @@ -183,6 +183,12 @@ double PairSpinExchange::init_one(int i, int j) if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + J1_mag[j][i] = J1_mag[i][j]; + J1_mech[j][i] = J1_mech[i][j]; + J2[j][i] = J2[i][j]; + J3[j][i] = J3[i][j]; + cut_spin_exchange[j][i] = cut_spin_exchange[i][j]; + return cut_spin_exchange_global; } @@ -203,7 +209,8 @@ void PairSpinExchange::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double evdwl, ecoul; - double xi[3], rij[3], eij[3]; + double xi[3], eij[3]; + double delx,dely,delz; double spi[3], spj[3]; double fi[3], fmi[3]; double local_cut2; @@ -255,18 +262,17 @@ void PairSpinExchange::compute(int eflag, int vflag) spj[2] = sp[j][2]; 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]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + delx = xi[0] - x[j][0]; + dely = xi[1] - x[j][1]; + delz = xi[2] - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; inorm = 1.0/sqrt(rsq); - eij[0] = inorm*rij[0]; - eij[1] = inorm*rij[1]; - eij[2] = inorm*rij[2]; + eij[0] = -inorm*delx; + eij[1] = -inorm*dely; + eij[2] = -inorm*delz; local_cut2 = cut_spin_exchange[itype][jtype]*cut_spin_exchange[itype][jtype]; @@ -298,7 +304,7 @@ void PairSpinExchange::compute(int eflag, int vflag) } 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],delx,dely,delz); } } @@ -317,8 +323,8 @@ void PairSpinExchange::compute_single_pair(int ii, double fmi[3]) double **x = atom->x; double **sp = atom->sp; double local_cut2; - double xi[3], rij[3]; + double delx,dely,delz; double spj[3]; int i,j,jnum,itype,jtype; @@ -351,15 +357,14 @@ void PairSpinExchange::compute_single_pair(int ii, double fmi[3]) spj[1] = sp[j][1]; spj[2] = sp[j][2]; - rij[0] = x[j][0] - xi[0]; - rij[1] = x[j][1] - xi[1]; - rij[2] = x[j][2] - xi[2]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + delx = xi[0] - x[j][0]; + dely = xi[1] - x[j][1]; + delz = xi[2] - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; if (rsq <= local_cut2) { compute_exchange(i,j,rsq,fmi,spj); } - } } @@ -390,7 +395,8 @@ void PairSpinExchange::compute_exchange(int i, int j, double rsq, double fmi[3], compute the mechanical force due to the exchange interaction between atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinExchange::compute_exchange_mech(int i, int j, double rsq, double rij[3], double fi[3], double spi[3], double spj[3]) +void PairSpinExchange::compute_exchange_mech(int i, int j, double rsq, double eij[3], + double fi[3], double spi[3], double spj[3]) { int *type = atom->type; int itype, jtype; @@ -408,9 +414,9 @@ void PairSpinExchange::compute_exchange_mech(int i, int j, double rsq, double ri Jex_mech *= 8.0*Jex*rr*exp(-ra); Jex_mech *= (spi[0]*spj[0]+spi[1]*spj[1]+spi[2]*spj[2]); - fi[0] -= Jex_mech*rij[0]; - fi[1] -= Jex_mech*rij[1]; - fi[2] -= Jex_mech*rij[2]; + fi[0] -= Jex_mech*eij[0]; + fi[1] -= Jex_mech*eij[1]; + fi[2] -= Jex_mech*eij[2]; } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/pair_spin_magelec.cpp b/src/SPIN/pair_spin_magelec.cpp index 315b691d17..6bc1f71947 100644 --- a/src/SPIN/pair_spin_magelec.cpp +++ b/src/SPIN/pair_spin_magelec.cpp @@ -187,8 +187,14 @@ void PairSpinMagelec::init_style() double PairSpinMagelec::init_one(int i, int j) { + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + ME[j][i] = ME[i][j]; + ME_mech[j][i] = ME_mech[i][j]; + v_mex[j][i] = v_mex[i][j]; + v_mey[j][i] = v_mey[i][j]; + v_mez[j][i] = v_mez[i][j]; + cut_spin_magelec[j][i] = cut_spin_magelec[i][j]; return cut_spin_magelec_global; } @@ -211,7 +217,8 @@ void PairSpinMagelec::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double evdwl, ecoul; - double xi[3], rij[3], eij[3]; + double xi[3], eij[3]; + double delx,dely,delz; double spi[3], spj[3]; double fi[3], fmi[3]; double local_cut2; @@ -263,18 +270,17 @@ void PairSpinMagelec::compute(int eflag, int vflag) spj[2] = sp[j][2]; 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]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + delx = xi[0] - x[j][0]; + dely = xi[1] - x[j][1]; + delz = xi[2] - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; inorm = 1.0/sqrt(rsq); - eij[0] = inorm*rij[0]; - eij[1] = inorm*rij[1]; - eij[2] = inorm*rij[2]; + eij[0] = -inorm*delx; + eij[1] = -inorm*dely; + eij[2] = -inorm*delz; local_cut2 = cut_spin_magelec[itype][jtype]*cut_spin_magelec[itype][jtype]; @@ -301,12 +307,12 @@ void PairSpinMagelec::compute(int eflag, int vflag) } if (eflag) { - evdwl = (spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]); + 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],delx,dely,delz); } } @@ -322,8 +328,8 @@ void PairSpinMagelec::compute_single_pair(int ii, double fmi[3]) double **x = atom->x; double **sp = atom->sp; double local_cut2; - - double xi[3], rij[3], eij[3]; + double xi[3], eij[3]; + double delx,dely,delz; double spj[3]; int i,j,jnum,itype,jtype; @@ -342,8 +348,6 @@ void PairSpinMagelec::compute_single_pair(int ii, double fmi[3]) xi[1] = x[i][1]; xi[2] = x[i][2]; - eij[0] = eij[1] = eij[2] = 0.0; - jlist = firstneigh[i]; jnum = numneigh[i]; @@ -358,14 +362,14 @@ void PairSpinMagelec::compute_single_pair(int ii, double fmi[3]) spj[1] = sp[j][1]; spj[2] = sp[j][2]; - rij[0] = x[j][0] - xi[0]; - rij[1] = x[j][1] - xi[1]; - rij[2] = x[j][2] - xi[2]; - rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; + delx = xi[0] - x[j][0]; + dely = xi[1] - x[j][1]; + delz = xi[2] - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; inorm = 1.0/sqrt(rsq); - eij[0] = inorm*rij[0]; - eij[1] = inorm*rij[1]; - eij[2] = inorm*rij[2]; + eij[0] = -inorm*delx; + eij[1] = -inorm*dely; + eij[2] = -inorm*delz; if (rsq <= local_cut2) { compute_magelec(i,j,rsq,eij,fmi,spj); @@ -380,36 +384,26 @@ void PairSpinMagelec::compute_magelec(int i, int j, double rsq, double eij[3], d { int *type = atom->type; int itype, jtype; + double meix,meiy,meiz; + double vx,vy,vz; itype = type[i]; jtype = type[j]; - double local_cut2 = cut_spin_magelec[itype][jtype]*cut_spin_magelec[itype][jtype]; + vx = v_mex[itype][jtype]; + vy = v_mey[itype][jtype]; + vz = v_mez[itype][jtype]; - if (rsq <= local_cut2) { - double meix,meiy,meiz; - double rx, ry, rz; - double vx, vy, vz; + meix = vy*eij[2] - vz*eij[1]; + meiy = vz*eij[0] - vx*eij[2]; + meiz = vx*eij[1] - vy*eij[0]; - rx = eij[0]; - ry = eij[1]; - rz = eij[2]; + meix *= ME[itype][jtype]; + meiy *= ME[itype][jtype]; + meiz *= ME[itype][jtype]; - vx = v_mex[itype][jtype]; - vy = v_mey[itype][jtype]; - vz = v_mez[itype][jtype]; - - meix = vy*rz - vz*ry; - meiy = vz*rx - vx*rz; - meiz = vx*ry - vy*rx; - - meix *= ME[itype][jtype]; - meiy *= ME[itype][jtype]; - meiz *= ME[itype][jtype]; - - fmi[0] += spj[1]*meiz - spj[2]*meiy; - fmi[1] += spj[2]*meix - spj[0]*meiz; - fmi[2] += spj[0]*meiy - spj[1]*meix; - } + fmi[0] += spj[1]*meiz - spj[2]*meiy; + fmi[1] += spj[2]*meix - spj[0]*meiz; + fmi[2] += spj[0]*meiy - spj[1]*meix; } /* ---------------------------------------------------------------------- */ diff --git a/src/SPIN/pair_spin_neel.cpp b/src/SPIN/pair_spin_neel.cpp index 0daafad756..55f537cf4f 100644 --- a/src/SPIN/pair_spin_neel.cpp +++ b/src/SPIN/pair_spin_neel.cpp @@ -193,8 +193,16 @@ void PairSpinNeel::init_style() double PairSpinNeel::init_one(int i, int j) { + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + g1[j][i] = g1[i][j]; + g1_mech[j][i] = g1_mech[i][j]; + g2[j][i] = g2[i][j]; + g3[j][i] = g3[i][j]; + q1[j][i] = q1[i][j]; + q1_mech[j][i] = q1_mech[i][j]; + q2[j][i] = q2[i][j]; + q3[j][i] = q3[i][j]; return cut_spin_neel_global; } diff --git a/src/SPIN/pair_spin_neel.h b/src/SPIN/pair_spin_neel.h index 934d4a93ad..f60d7d2dca 100644 --- a/src/SPIN/pair_spin_neel.h +++ b/src/SPIN/pair_spin_neel.h @@ -51,9 +51,9 @@ class PairSpinNeel : public PairSpin { // pseudo-dipolar and pseudo-quadrupolar coeff. - double **g1, **g1_mech; // exchange coeffs gij + double **g1, **g1_mech; // neel coeffs gij double **g2, **g3; // g1 in eV, g2 adim, g3 in Ang - double **q1, **q1_mech; // exchange coeffs qij + 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 From 6cd7299920a56d75c9d7d9cde5946d61c1e03dba Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 27 Jul 2018 12:10:43 +0200 Subject: [PATCH 097/123] update CODEOWNERS file to automatically notify @julient31 on changes to the SPIN package --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 75b79443c3..53b0a7b4f2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -17,6 +17,7 @@ src/GPU/* @ndtrung81 src/KOKKOS/* @stanmoore1 src/KIM/* @ellio167 src/LATTE/* @cnegre +src/SPIN/* @julient31 src/USER-CGDNA/* @ohenrich src/USER-CGSDK/* @akohlmey src/USER-COLVARS/* @giacomofiorin From 99985a1d5bc4072db6e1858b6b99223f080fdd51 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Fri, 27 Jul 2018 20:31:53 -0400 Subject: [PATCH 098/123] Add profile.d files to set LAMMPS_POTENTIALS environment variable --- cmake/CMakeLists.txt | 11 ++++++++++- cmake/etc/profile.d/lammps.csh.in | 2 ++ cmake/etc/profile.d/lammps.sh.in | 2 ++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 cmake/etc/profile.d/lammps.csh.in create mode 100644 cmake/etc/profile.d/lammps.sh.in diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 88efd90221..8567e4395e 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -961,7 +961,16 @@ endif() ############################################################################### # Install potential files in data directory ############################################################################### -install(DIRECTORY ${LAMMPS_SOURCE_DIR}/../potentials DESTINATION ${CMAKE_INSTALL_DATADIR}/lammps) +set(LAMMPS_POTENTIALS_DIR ${CMAKE_INSTALL_FULL_DATADIR}/lammps/potentials) +install(DIRECTORY ${LAMMPS_SOURCE_DIR}/../potentials DESTINATION ${CMAKE_INSTALL_DATADIR}/lammps/potentials) + +configure_file(etc/profile.d/lammps.sh.in ${CMAKE_BINARY_DIR}/etc/profile.d/lammps.sh @ONLY) +configure_file(etc/profile.d/lammps.csh.in ${CMAKE_BINARY_DIR}/etc/profile.d/lammps.csh @ONLY) +install( + FILES ${CMAKE_BINARY_DIR}/etc/profile.d/lammps.sh + ${CMAKE_BINARY_DIR}/etc/profile.d/lammps.csh + DESTINATION ${CMAKE_INSTALL_SYSCONFDIR}/profile.d +) ############################################################################### # Testing diff --git a/cmake/etc/profile.d/lammps.csh.in b/cmake/etc/profile.d/lammps.csh.in new file mode 100644 index 0000000000..def49bf75c --- /dev/null +++ b/cmake/etc/profile.d/lammps.csh.in @@ -0,0 +1,2 @@ +# set environment for LAMMPS executables to find potential files +if ( "$?LAMMPS_POTENTIALS" == 0 ) setenv LAMMPS_POTENTIALS @LAMMPS_POTENTIALS_DIR@ diff --git a/cmake/etc/profile.d/lammps.sh.in b/cmake/etc/profile.d/lammps.sh.in new file mode 100644 index 0000000000..acd75fa0cf --- /dev/null +++ b/cmake/etc/profile.d/lammps.sh.in @@ -0,0 +1,2 @@ +# set environment for LAMMPS executables to find potential files +export LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS-@LAMMPS_POTENTIALS_DIR@} From 8fccf6b9b4535bc2fb2dc801804e9c640fdad469 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Sat, 28 Jul 2018 23:31:50 -0400 Subject: [PATCH 099/123] Use absolute paths for docenv --- cmake/CMakeLists.txt | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 8567e4395e..485e2df91c 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -920,12 +920,15 @@ if(BUILD_DOC) OUTPUT docenv COMMAND ${VIRTUALENV} docenv ) + + set(DOCENV_BINARY_DIR ${CMAKE_BINARY_DIR}/docenv/bin) + add_custom_command( OUTPUT requirements.txt DEPENDS docenv COMMAND ${CMAKE_COMMAND} -E copy ${LAMMPS_DOC_DIR}/utils/requirements.txt requirements.txt - COMMAND ./docenv/bin/pip install -r requirements.txt --upgrade - COMMAND ./docenv/bin/pip install --upgrade ${LAMMPS_DOC_DIR}/utils/converters + COMMAND ${DOCENV_BINARY_DIR}/pip install -r requirements.txt --upgrade + COMMAND ${DOCENV_BINARY_DIR}/pip install --upgrade ${LAMMPS_DOC_DIR}/utils/converters ) set(RST_FILES "") @@ -938,7 +941,7 @@ if(BUILD_DOC) add_custom_command( OUTPUT ${RST_FILE} DEPENDS requirements.txt docenv ${TXT_FILE} - COMMAND ./docenv/bin/txt2rst -o ${RST_DIR} ${TXT_FILE} + COMMAND ${DOCENV_BINARY_DIR}/txt2rst -o ${RST_DIR} ${TXT_FILE} ) endforeach() @@ -946,7 +949,7 @@ if(BUILD_DOC) OUTPUT html DEPENDS ${RST_FILES} COMMAND ${CMAKE_COMMAND} -E copy_directory ${LAMMPS_DOC_DIR}/src ${RST_DIR} - COMMAND ./docenv/bin/sphinx-build -j ${NPROCS} -b html -c ${LAMMPS_DOC_DIR}/utils/sphinx-config -d ${CMAKE_BINARY_DIR}/doctrees ${RST_DIR} html + COMMAND ${DOCENV_BINARY_DIR}/sphinx-build -j ${NPROCS} -b html -c ${LAMMPS_DOC_DIR}/utils/sphinx-config -d ${CMAKE_BINARY_DIR}/doctrees ${RST_DIR} html ) add_custom_target( From fa9b46fb40dcaba96802ad88dcebde7816eac36f Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Sun, 29 Jul 2018 00:08:20 -0400 Subject: [PATCH 100/123] Add BUILD_DOC option to CMake README.md --- cmake/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cmake/README.md b/cmake/README.md index bafd440a64..b6644ffda9 100644 --- a/cmake/README.md +++ b/cmake/README.md @@ -275,6 +275,16 @@ cmake -C ../cmake/presets/std_nolib.cmake ../cmake -DPKG_GPU=on + + BUILD_DOC + control whether to build LAMMPS documentation + +
+
off (default)
+
on
+
+ + LAMMPS_LONGLONG_TO_LONG Workaround if your system or MPI version does not recognize long long data types From 82fc3b99d9049bbd98ec2fd55ffebfd58f823c29 Mon Sep 17 00:00:00 2001 From: HaoZeke Date: Mon, 30 Jul 2018 16:59:25 +0530 Subject: [PATCH 101/123] emacs: Update mode file This is a squashed commit including the following changes: 1) Update mode header 2) Clean up white-space 3) Fix free variable warning 4) Add proper file ending stuff 5) Rename to keep conventional naming scheme 6) Updates to the readme 7) Update to conform to `package-lint` criteria 8) Add license header 9) Add in-file instructions --- tools/emacs/README.txt | 36 +++++++++++++- tools/emacs/{lammps.el => lammps-mode.el} | 57 ++++++++++++++++++++--- 2 files changed, 84 insertions(+), 9 deletions(-) rename tools/emacs/{lammps.el => lammps-mode.el} (73%) diff --git a/tools/emacs/README.txt b/tools/emacs/README.txt index 8dfc37cb85..43add16505 100644 --- a/tools/emacs/README.txt +++ b/tools/emacs/README.txt @@ -1,6 +1,7 @@ === Emacs Syntax Highlighting === Created by Aidan Thompson 12/2010 =============================== +Updated by Roit Goswami Mon Jul 30 2018 The lammps.el file provided in this directory will enable syntax highlighting for the lammps script syntax in emacs. The groupings @@ -15,9 +16,40 @@ some basic syntax highlighting of strings, comments, etc. ============================ (0) Create/edit the emacs init file ~/.emacs to contain: -(load "~/.emacs.d/lammps") +(load "~/.emacs.d/lammps-mode.el") This file may also be called ~/.emacs.el, or ~/.emacs.d/init.el -(1) Copy lammps.el to the directory ~/.emacs.d +(1) Copy lammps-mode.el to the directory ~/.emacs.d +=Update: +======== + +The package may now also be installed by a MELPA style recipe, namely: + +```lisp +(lammps-mode :fetcher github :repo "HaoZeke/lammps-mode") +``` + +For a simpler installation with `use-package` simply add: + +```lisp +(use-package lammps-mode) +``` + +The latest version of the package will be kept in sync as a squashed update on +the lammps repository as well. + +It is advisable to use the MELPA installation methods listed here: +https://melpa.org/#/getting-started + +For autoloading and auto-recognizing "in.*" and "*.lmp" files add the following +to `.emacs`: + +```lisp +(autoload 'lammps-mode "lammps-mode.el" "LAMMPS mode." t) +(setq auto-mode-alist (append auto-mode-alist + '(("in\\." . lammps-mode)) + '(("\\.lmp\\'" . lammps-mode)) + )) +``` diff --git a/tools/emacs/lammps.el b/tools/emacs/lammps-mode.el similarity index 73% rename from tools/emacs/lammps.el rename to tools/emacs/lammps-mode.el index d1ebebbbbf..9dfd119d0a 100644 --- a/tools/emacs/lammps.el +++ b/tools/emacs/lammps-mode.el @@ -1,7 +1,49 @@ -;; LAMMPS auto-mode +;;; lammps-mode.el --- basic syntax highlighting for LAMMPS files + +;; Copyright (C) 2010-18 Aidan Thompson +;; Copyright (C) 2018 Rohit Goswami + +;; Author: Aidan Thompson +;; Maintainer: Rohit Goswami +;; Created: December 4, 2010 +;; Modified: July 30, 2018 +;; Version: 1.5.0 +;; Keywords: languages, faces +;; Homepage: https://github.com/lammps/lammps/tree/master/tools/emacs +;; Package-Requires: ((emacs "24.4")) + +;; This file is not part of GNU Emacs. + +;; This file 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, or (at your option) +;; any later version. + +;; This file 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 GNU Emacs; see the file COPYING. If not, write to +;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Commentary: ;; translation of keyword classes from tools/vim ;; see http://xahlee.org/emacs/elisp_syntax_coloring.html +;; Put this in your .emacs file to enable autoloading of lammps-mode +;; and auto-recognition of "in.*" and "*.lmp" files: +;; +;; (autoload 'lammps-mode "lammps-mode.el" "LAMMPS mode." t) +;; (setq auto-mode-alist (append auto-mode-alist +;; '(("in\\." . lammps-mode)) +;; '(("\\.lmp\\'" . lammps-mode)) +;; )) +;; + +;;; Code: ;; define several keyword classes (defvar lammps-output '("log" @@ -136,6 +178,8 @@ (defvar lammps-variable-regexp "\\$\\({[a-zA-Z0-9_]+}\\)\\|\\$[A-Za-z]") +(defvar lammps-font-lock-keywords) + ;; clear memory (setq lammps-output nil) (setq lammps-read nil) @@ -151,8 +195,7 @@ ;; create the list for font-lock. ;; each class of keyword is given a particular face -(setq - lammps-font-lock-keywords +(setq lammps-font-lock-keywords `((,lammps-output-regexp . font-lock-function-name-face) (,lammps-read-regexp . font-lock-preprocessor-face) (,lammps-lattice-regexp . font-lock-type-face) @@ -200,11 +243,11 @@ (setq lammps-variable-regexp nil)) ;; apply it to specified filename patterns -(setq - auto-mode-alist - (append - auto-mode-alist +(setq auto-mode-alist + (append auto-mode-alist '(("in\\." . lammps-mode)) '(("\\.lmp\\'" . lammps-mode)) )) +(provide 'lammps-mode) +;;; lammps-mode.el ends here From 2c9e96be116bafca79671625fa7fb2539343a334 Mon Sep 17 00:00:00 2001 From: HaoZeke Date: Mon, 30 Jul 2018 19:58:18 +0530 Subject: [PATCH 102/123] emacs: Stop forcing filename patterns --- tools/emacs/lammps-mode.el | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tools/emacs/lammps-mode.el b/tools/emacs/lammps-mode.el index 9dfd119d0a..9ba2669982 100644 --- a/tools/emacs/lammps-mode.el +++ b/tools/emacs/lammps-mode.el @@ -242,12 +242,5 @@ (setq lammps-comment-regexp nil) (setq lammps-variable-regexp nil)) -;; apply it to specified filename patterns -(setq auto-mode-alist - (append auto-mode-alist - '(("in\\." . lammps-mode)) - '(("\\.lmp\\'" . lammps-mode)) - )) - (provide 'lammps-mode) ;;; lammps-mode.el ends here From a00d7becc30ae782fe3d991e7cc8693ae5ed5b9b Mon Sep 17 00:00:00 2001 From: HaoZeke Date: Mon, 30 Jul 2018 20:10:29 +0530 Subject: [PATCH 103/123] emacs: Major readme update and refactor Also update the license and switch to GPL v2 like lammps --- tools/emacs/README.md | 76 ++++++++++++++++++++++++++++++++++++++ tools/emacs/README.txt | 55 --------------------------- tools/emacs/lammps-mode.el | 15 ++++---- 3 files changed, 83 insertions(+), 63 deletions(-) create mode 100644 tools/emacs/README.md delete mode 100644 tools/emacs/README.txt diff --git a/tools/emacs/README.md b/tools/emacs/README.md new file mode 100644 index 0000000000..ce502a27e3 --- /dev/null +++ b/tools/emacs/README.md @@ -0,0 +1,76 @@ +# GNU Emacs Syntax Highlighting + +> Copyright (C) 2010-2018 Aidan Thompson +> Copyright (C) 2018 Rohit Goswami + +The `lammps-mode.el` file provided in this directory will enable syntax +highlighting for the lammps script syntax in GNU Emacs. The groupings of +commands were originally copied from `tools/vim`. + +## Installation +**Requirements: GNU Emacs 24.\*** + +### Obtaining the Package + +#### MELPA + +The easiest installation method is via MELPA and it is advisable to use one of +the many [MELPA installation methods](https://melpa.org/#/getting-started). + +For example, with [use-package](https://github.com/jwiegley/use-package) one can +simply use the following: + +``` emacs-lisp +(use-package lammps-mode) +``` + +#### Manually + +Assuming for some reason you have downloaded the file to `~/.emacs.d/lisp` you +would do the following (kanged [from here](http://ergoemacs.org/emacs/emacs_installing_packages.html)): + +``` emacs-lisp +;; Tell emacs where is your personal elisp lib dir +(add-to-list 'load-path "~/.emacs.d/lisp/") + +;; load the package. +(load "lammps-mode") +``` + +### Autoloading \& Auto-recognition + +For autoloading and auto-recognizing `in.*` and `*.lmp` files add the following +to `.emacs`: + +``` emacs-lisp +(autoload 'lammps-mode "lammps-mode.el" "LAMMPS mode." t) +(setq auto-mode-alist (append auto-mode-alist + '(("in\\." . lammps-mode)) + '(("\\.lmp\\'" . lammps-mode)) + )) +``` + +## Status + +By far not all commands are included in the syntax file (lammps-mode.el). You +can easily add new ones to the existing classes. + +## Implementation Details + +`lammps-mode` is derived from `shell-script-mode` which provides some basic +syntax highlighting of strings, comments, etc. + +The MELPA recipe used for this package is simply: + +``` emacs-lisp +(lammps-mode :fetcher github :repo "HaoZeke/lammps-mode") +``` + +## Caveats + +* Does not work with Xemacs [See [this comment](https://github.com/lammps/lammps/pull/1022#issuecomment-408871233)] + +## License + +[GNU GPL v2](https://github.com/HaoZeke/lammps-mode/blob/master/LICENSE). +Check the file for more details. diff --git a/tools/emacs/README.txt b/tools/emacs/README.txt deleted file mode 100644 index 43add16505..0000000000 --- a/tools/emacs/README.txt +++ /dev/null @@ -1,55 +0,0 @@ -=== Emacs Syntax Highlighting === -Created by Aidan Thompson 12/2010 -=============================== -Updated by Roit Goswami Mon Jul 30 2018 - -The lammps.el file provided in this directory will enable syntax -highlighting for the lammps script syntax in emacs. The groupings -of commands were copied from tools/vim. The simulation scripts have to -end on *.lmp or start with in.* (see lammps.el). By far not all -commands are included in the syntax file (lammps.el). -You can easily add new ones to the existing classes. -'lammps-mode' is derived from 'shell-script-mode' which provides -some basic syntax highlighting of strings, comments, etc. - -=To enable the highlighting: -============================ -(0) Create/edit the emacs init file ~/.emacs to contain: - -(load "~/.emacs.d/lammps-mode.el") - -This file may also be called ~/.emacs.el, or ~/.emacs.d/init.el - -(1) Copy lammps-mode.el to the directory ~/.emacs.d - -=Update: -======== - -The package may now also be installed by a MELPA style recipe, namely: - -```lisp -(lammps-mode :fetcher github :repo "HaoZeke/lammps-mode") -``` - -For a simpler installation with `use-package` simply add: - -```lisp -(use-package lammps-mode) -``` - -The latest version of the package will be kept in sync as a squashed update on -the lammps repository as well. - -It is advisable to use the MELPA installation methods listed here: -https://melpa.org/#/getting-started - -For autoloading and auto-recognizing "in.*" and "*.lmp" files add the following -to `.emacs`: - -```lisp -(autoload 'lammps-mode "lammps-mode.el" "LAMMPS mode." t) -(setq auto-mode-alist (append auto-mode-alist - '(("in\\." . lammps-mode)) - '(("\\.lmp\\'" . lammps-mode)) - )) -``` diff --git a/tools/emacs/lammps-mode.el b/tools/emacs/lammps-mode.el index 9ba2669982..37e8a32116 100644 --- a/tools/emacs/lammps-mode.el +++ b/tools/emacs/lammps-mode.el @@ -14,20 +14,19 @@ ;; This file is not part of GNU Emacs. -;; This file is free software; you can redistribute it and/or modify +;; 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, or (at your option) -;; any later version. +;; the Free Software Foundation; either version 2 of the License, or +;; (at your option) any later version. -;; This file is distributed in the hope that it will be useful, +;; 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 GNU Emacs; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. +;; You should have received a copy of the GNU General Public License along +;; with this program; if not, write to the Free Software Foundation, Inc., +;; 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ;;; Commentary: ;; translation of keyword classes from tools/vim From b76f86602a4f7fb2cdfa7464f276b45e9dbe9e06 Mon Sep 17 00:00:00 2001 From: Amrita Goswami <32496815+amritagos@users.noreply.github.com> Date: Mon, 30 Jul 2018 21:18:59 +0530 Subject: [PATCH 104/123] docs: Fix spelling mistakes and clarify Tools.txt --- doc/src/Tools.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/src/Tools.txt b/doc/src/Tools.txt index 4c5fbbd453..7165010da3 100644 --- a/doc/src/Tools.txt +++ b/doc/src/Tools.txt @@ -249,9 +249,9 @@ These tools were provided by Andres Jaramillo-Botero at CalTech emacs tool :h4,link(emacs) -The tools/emacs directory contains a Lips add-on file for Emacs that -enables a lammps-mode for editing of input scripts when using Emacs, -with various highlighting options setup. +The tools/emacs directory contains an Emacs Lisp add-on file for GNU Emacs +that enables a lammps-mode for editing input scripts when using GNU Emacs, +with various highlighting options set up. These tools were provided by Aidan Thompson at Sandia (athomps at sandia.gov). From 882e1e5138387bfe6b68333ba4364e8d3b13f13c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 30 Jul 2018 18:32:28 +0200 Subject: [PATCH 105/123] resolve dependency problem between RIGID and USER-OMP package --- cmake/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 60a0f5d48f..e5db6c8bbb 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -585,8 +585,14 @@ if(PKG_USER-OMP) # detects styles which have USER-OMP version RegisterStylesExt(${USER-OMP_SOURCES_DIR} omp OMP_SOURCES) + get_property(USER-OMP_SOURCES GLOBAL PROPERTY OMP_SOURCES) + # manually add classes, that are not styles + if(PKG_RIGID) + list(APPEND USER-OMP_SOURCES ${USER-OMP_SOURCES_DIR}/fix_rigid_nh_omp.cpp) + endif() + list(APPEND LIB_SOURCES ${USER-OMP_SOURCES}) include_directories(${USER-OMP_SOURCES_DIR}) endif() From 82c9e8a52c88f32617adbe1d54a4aff106724071 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 30 Jul 2018 18:56:56 +0200 Subject: [PATCH 106/123] add explicit pattern based dependencies for CORESHELL packages, so KSPACE is no longer enforced --- cmake/CMakeLists.txt | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index e5db6c8bbb..40b0a8f01f 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -153,7 +153,7 @@ if(ENABLE_TESTING) enable_testing() endif(ENABLE_TESTING) -set(DEFAULT_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GRANULAR +set(DEFAULT_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS DIPOLE GRANULAR KSPACE MANYBODY MC MEAM MISC MOLECULE PERI QEQ REAX REPLICA RIGID SHOCK SPIN SNAP SRD KIM PYTHON MSCG MPIIO VORONOI POEMS LATTE USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-MESO USER-CGSDK USER-COLVARS USER-DIFFRACTION USER-DPD USER-DRUDE @@ -161,6 +161,7 @@ set(DEFAULT_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS CORESHELL DIPOLE GRANU USER-MOFFF USER-MOLFILE USER-NETCDF USER-PHONON USER-QTB USER-REAXC USER-SMD USER-SMTBQ USER-SPH USER-TALLY USER-UEF USER-VTK USER-QUIP USER-QMMM) set(ACCEL_PACKAGES USER-OMP KOKKOS OPT USER-INTEL GPU) +set(OTHER_PACKAGES CORESHELL) foreach(PKG ${DEFAULT_PACKAGES}) option(PKG_${PKG} "Build ${PKG} Package" OFF) endforeach() @@ -180,7 +181,6 @@ pkg_depends(USER-ATC MANYBODY) pkg_depends(USER-LB MPI) pkg_depends(USER-MISC MANYBODY) pkg_depends(USER-PHONON KSPACE) -pkg_depends(CORESHELL KSPACE) ###################################################### # packages with special compiler needs or external libs @@ -574,6 +574,20 @@ endif() # packages which selectively include variants based on enabled styles # e.g. accelerator packages ###################################################################### +if(PKG_CORESHELL) + set(CORESHELL_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/CORESHELL) + set(CORESHELL_SOURCES) + set_property(GLOBAL PROPERTY "CORESHELL_SOURCES" "${CORESHELL_SOURCES}") + + # detects styles which have a CORESHELL version + RegisterStylesExt(${CORESHELL_SOURCES_DIR} cs CORESHELL_SOURCES) + + get_property(CORESHELL_SOURCES GLOBAL PROPERTY CORESHELL_SOURCES) + + list(APPEND LIB_SOURCES ${CORESHELL_SOURCES}) + include_directories(${CORESHELL_SOURCES_DIR}) +endif() + if(PKG_USER-OMP) set(USER-OMP_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/USER-OMP) set(USER-OMP_SOURCES ${USER-OMP_SOURCES_DIR}/thr_data.cpp From b02362b94317eb503c1994a1e0eaab374f4b00e6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 30 Jul 2018 19:09:16 +0200 Subject: [PATCH 107/123] add manual treatment of source dependencies between USER-REAXC and USER-OMP --- cmake/CMakeLists.txt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 40b0a8f01f..1c86ebc695 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -602,11 +602,24 @@ if(PKG_USER-OMP) get_property(USER-OMP_SOURCES GLOBAL PROPERTY OMP_SOURCES) - # manually add classes, that are not styles + # manually add package dependent source files from USER-OMP that do not provide styles + if(PKG_RIGID) list(APPEND USER-OMP_SOURCES ${USER-OMP_SOURCES_DIR}/fix_rigid_nh_omp.cpp) endif() + if(PKG_USER-REAXC) + list(APPEND USER-OMP_SOURCES ${USER-OMP_SOURCES_DIR}/reaxc_bond_orders_omp.cpp + ${USER-OMP_SOURCES_DIR}/reaxc_hydrogen_bonds_omp.cpp + ${USER-OMP_SOURCES_DIR}/reaxc_nonbonded_omp.cpp + ${USER-OMP_SOURCES_DIR}/reaxc_bonds_omp.cpp + ${USER-OMP_SOURCES_DIR}/reaxc_init_md_omp.cpp + ${USER-OMP_SOURCES_DIR}/reaxc_torsion_angles_omp.cpp + ${USER-OMP_SOURCES_DIR}/reaxc_forces_omp.cpp + ${USER-OMP_SOURCES_DIR}/reaxc_multi_body_omp.cpp + ${USER-OMP_SOURCES_DIR}/reaxc_valence_angles_omp.cpp) + endif() + list(APPEND LIB_SOURCES ${USER-OMP_SOURCES}) include_directories(${USER-OMP_SOURCES_DIR}) endif() From ee822bec1be9b7bac77c6ca014568da467e80440 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 30 Jul 2018 20:04:31 +0200 Subject: [PATCH 108/123] selectively handle dependency of qeq/fire on MANYBODY --- cmake/CMakeLists.txt | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 1c86ebc695..1e58a670aa 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -154,14 +154,14 @@ if(ENABLE_TESTING) endif(ENABLE_TESTING) set(DEFAULT_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS DIPOLE GRANULAR - KSPACE MANYBODY MC MEAM MISC MOLECULE PERI QEQ REAX REPLICA RIGID SHOCK SPIN SNAP + KSPACE MANYBODY MC MEAM MISC MOLECULE PERI REAX REPLICA RIGID SHOCK SPIN SNAP SRD KIM PYTHON MSCG MPIIO VORONOI POEMS LATTE USER-ATC USER-AWPMD USER-BOCS USER-CGDNA USER-MESO USER-CGSDK USER-COLVARS USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-H5MD USER-LB USER-MANIFOLD USER-MEAMC USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE USER-NETCDF USER-PHONON USER-QTB USER-REAXC USER-SMD USER-SMTBQ USER-SPH USER-TALLY USER-UEF USER-VTK USER-QUIP USER-QMMM) set(ACCEL_PACKAGES USER-OMP KOKKOS OPT USER-INTEL GPU) -set(OTHER_PACKAGES CORESHELL) +set(OTHER_PACKAGES CORESHELL QEQ) foreach(PKG ${DEFAULT_PACKAGES}) option(PKG_${PKG} "Build ${PKG} Package" OFF) endforeach() @@ -176,7 +176,7 @@ macro(pkg_depends PKG1 PKG2) endmacro() pkg_depends(MPIIO MPI) -pkg_depends(QEQ MANYBODY) +#pkg_depends(QEQ MANYBODY) pkg_depends(USER-ATC MANYBODY) pkg_depends(USER-LB MPI) pkg_depends(USER-MISC MANYBODY) @@ -588,6 +588,27 @@ if(PKG_CORESHELL) include_directories(${CORESHELL_SOURCES_DIR}) endif() +# Fix qeq/fire requires MANYBODY (i.e. COMB and COMB3) to be installed +if(PKG_QEQ) + set(QEQ_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/QEQ) + file(GLOB QEQ_HEADERS ${QEQ_SOURCES_DIR}/fix*.h) + file(GLOB QEQ_SOURCES ${QEQ_SOURCES_DIR}/fix*.cpp) + + if(NOT PKG_MANYBODY) + list(REMOVE_ITEM QEQ_HEADERS ${QEQ_SOURCES_DIR}/fix_qeq_fire.h) + list(REMOVE_ITEM QEQ_SOURCES ${QEQ_SOURCES_DIR}/fix_qeq_fire.cpp) + endif() + set_property(GLOBAL PROPERTY "QEQ_SOURCES" "${QEQ_SOURCES}") + + foreach(MY_HEADER ${QEQ_HEADERS}) + AddStyleHeader(${MY_HEADER} FIX) + endforeach() + + get_property(QEQ_SOURCES GLOBAL PROPERTY QEQ_SOURCES) + list(APPEND LIB_SOURCES ${QEQ_SOURCES}) + include_directories(${QEQ_SOURCES_DIR}) +endif() + if(PKG_USER-OMP) set(USER-OMP_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/USER-OMP) set(USER-OMP_SOURCES ${USER-OMP_SOURCES_DIR}/thr_data.cpp From d9c328932fac636d6d0d187bde2fdeb9ea3884e7 Mon Sep 17 00:00:00 2001 From: "Steven J. Plimpton" Date: Mon, 30 Jul 2018 12:31:12 -0600 Subject: [PATCH 109/123] changes to Packages and Speed doc files --- doc/src/Errors_messages.txt | 6 +- doc/src/Errors_warnings.txt | 6 +- doc/src/Examples.txt | 2 +- doc/src/Manual.txt | 29 +- doc/src/Packages.txt | 39 ++ ...tion_packages.txt => Packages_details.txt} | 330 ++++++--------- doc/src/Packages_standard.txt | 65 +++ doc/src/Packages_user.txt | 74 ++++ doc/src/Section_accelerate.txt | 391 ------------------ doc/src/Section_commands.txt | 44 +- doc/src/Section_intro.txt | 2 +- doc/src/Section_start.txt | 100 ++--- doc/src/Speed.txt | 69 ++++ doc/src/{Section_perf.txt => Speed_bench.txt} | 19 +- doc/src/Speed_compare.txt | 73 ++++ doc/src/{accelerate_gpu.txt => Speed_gpu.txt} | 15 +- .../{accelerate_intel.txt => Speed_intel.txt} | 14 +- ...accelerate_kokkos.txt => Speed_kokkos.txt} | 20 +- doc/src/Speed_measure.txt | 55 +++ doc/src/{accelerate_omp.txt => Speed_omp.txt} | 11 +- doc/src/{accelerate_opt.txt => Speed_opt.txt} | 11 +- doc/src/Speed_packages.txt | 191 +++++++++ doc/src/Speed_tips.txt | 63 +++ doc/src/angle_charmm.txt | 11 +- doc/src/angle_class2.txt | 11 +- doc/src/angle_cosine.txt | 11 +- doc/src/angle_cosine_delta.txt | 11 +- doc/src/angle_cosine_periodic.txt | 11 +- doc/src/angle_cosine_shift.txt | 11 +- doc/src/angle_cosine_shift_exp.txt | 11 +- doc/src/angle_cosine_squared.txt | 11 +- doc/src/angle_dipole.txt | 11 +- doc/src/angle_fourier.txt | 11 +- doc/src/angle_fourier_simple.txt | 11 +- doc/src/angle_harmonic.txt | 11 +- doc/src/angle_quartic.txt | 11 +- doc/src/angle_table.txt | 11 +- doc/src/atom_style.txt | 12 +- doc/src/bond_class2.txt | 11 +- doc/src/bond_fene.txt | 11 +- doc/src/bond_fene_expand.txt | 11 +- doc/src/bond_gromos.txt | 11 +- doc/src/bond_harmonic.txt | 11 +- doc/src/bond_harmonic_shift.txt | 11 +- doc/src/bond_harmonic_shift_cut.txt | 11 +- doc/src/bond_morse.txt | 11 +- doc/src/bond_nonlinear.txt | 11 +- doc/src/bond_quartic.txt | 11 +- doc/src/bond_table.txt | 11 +- doc/src/compute_pressure.txt | 11 +- doc/src/compute_temp.txt | 11 +- doc/src/compute_temp_partial.txt | 11 +- doc/src/dihedral_charmm.txt | 11 +- doc/src/dihedral_class2.txt | 11 +- doc/src/dihedral_cosine_shift_exp.txt | 11 +- doc/src/dihedral_fourier.txt | 11 +- doc/src/dihedral_harmonic.txt | 11 +- doc/src/dihedral_helix.txt | 11 +- doc/src/dihedral_multi_harmonic.txt | 11 +- doc/src/dihedral_nharmonic.txt | 11 +- doc/src/dihedral_opls.txt | 11 +- doc/src/dihedral_quadratic.txt | 11 +- doc/src/dihedral_table.txt | 11 +- doc/src/fix_addforce.txt | 16 +- doc/src/fix_aveforce.txt | 16 +- doc/src/fix_deform.txt | 13 +- doc/src/fix_dpd_energy.txt | 11 +- doc/src/fix_enforce2d.txt | 11 +- doc/src/fix_eos_table_rx.txt | 11 +- doc/src/fix_freeze.txt | 16 +- doc/src/fix_gravity.txt | 11 +- doc/src/fix_langevin.txt | 11 +- doc/src/fix_momentum.txt | 11 +- doc/src/fix_nh.txt | 11 +- doc/src/fix_nph_asphere.txt | 11 +- doc/src/fix_nph_body.txt | 11 +- doc/src/fix_nph_sphere.txt | 11 +- doc/src/fix_nphug.txt | 11 +- doc/src/fix_npt_asphere.txt | 11 +- doc/src/fix_npt_body.txt | 11 +- doc/src/fix_npt_sphere.txt | 11 +- doc/src/fix_nve.txt | 11 +- doc/src/fix_nve_asphere.txt | 11 +- doc/src/fix_nve_sphere.txt | 11 +- doc/src/fix_nvt_asphere.txt | 11 +- doc/src/fix_nvt_body.txt | 11 +- doc/src/fix_nvt_sllod.txt | 11 +- doc/src/fix_nvt_sphere.txt | 11 +- doc/src/fix_qeq_comb.txt | 11 +- doc/src/fix_qeq_reax.txt | 11 +- doc/src/fix_rigid.txt | 11 +- doc/src/fix_rx.txt | 11 +- doc/src/fix_setforce.txt | 16 +- doc/src/fix_shake.txt | 16 +- doc/src/fix_shardlow.txt | 11 +- doc/src/fix_wall.txt | 11 +- doc/src/fix_wall_reflect.txt | 11 +- doc/src/improper_class2.txt | 11 +- doc/src/improper_cossq.txt | 11 +- doc/src/improper_cvff.txt | 11 +- doc/src/improper_fourier.txt | 11 +- doc/src/improper_harmonic.txt | 11 +- doc/src/improper_ring.txt | 11 +- doc/src/improper_umbrella.txt | 11 +- doc/src/kspace_style.txt | 15 +- doc/src/lammps.book | 12 +- doc/src/package.txt | 6 +- doc/src/pair_adp.txt | 11 +- doc/src/pair_agni.txt | 14 +- doc/src/pair_airebo.txt | 11 +- doc/src/pair_beck.txt | 11 +- doc/src/pair_born.txt | 11 +- doc/src/pair_buck.txt | 11 +- doc/src/pair_buck_long.txt | 11 +- doc/src/pair_charmm.txt | 11 +- doc/src/pair_class2.txt | 11 +- doc/src/pair_colloid.txt | 11 +- doc/src/pair_comb.txt | 11 +- doc/src/pair_coul.txt | 11 +- doc/src/pair_dipole.txt | 11 +- doc/src/pair_dpd.txt | 11 +- doc/src/pair_dpd_fdt.txt | 11 +- doc/src/pair_eam.txt | 9 +- doc/src/pair_edip.txt | 11 +- doc/src/pair_eim.txt | 11 +- doc/src/pair_exp6_rx.txt | 11 +- doc/src/pair_gauss.txt | 11 +- doc/src/pair_gayberne.txt | 11 +- doc/src/pair_gran.txt | 11 +- doc/src/pair_gromacs.txt | 11 +- doc/src/pair_hbond_dreiding.txt | 11 +- doc/src/pair_hybrid.txt | 8 +- doc/src/pair_kim.txt | 4 +- doc/src/pair_lj.txt | 11 +- doc/src/pair_lj96.txt | 11 +- doc/src/pair_lj_cubic.txt | 11 +- doc/src/pair_lj_expand.txt | 11 +- doc/src/pair_lj_long.txt | 11 +- doc/src/pair_lj_smooth.txt | 11 +- doc/src/pair_lj_smooth_linear.txt | 11 +- doc/src/pair_lj_soft.txt | 11 +- doc/src/pair_meam_spline.txt | 11 +- doc/src/pair_morse.txt | 11 +- doc/src/pair_multi_lucy_rx.txt | 11 +- doc/src/pair_nb3b_harmonic.txt | 11 +- doc/src/pair_nm.txt | 11 +- doc/src/pair_peri.txt | 11 +- doc/src/pair_reaxc.txt | 21 +- doc/src/pair_resquared.txt | 11 +- doc/src/pair_sdk.txt | 11 +- doc/src/pair_snap.txt | 11 +- doc/src/pair_soft.txt | 11 +- doc/src/pair_sw.txt | 11 +- doc/src/pair_table.txt | 11 +- doc/src/pair_table_rx.txt | 11 +- doc/src/pair_tersoff.txt | 11 +- doc/src/pair_tersoff_mod.txt | 11 +- doc/src/pair_tersoff_zbl.txt | 11 +- doc/src/pair_thole.txt | 11 +- doc/src/pair_ufm.txt | 11 +- doc/src/pair_vashishta.txt | 11 +- doc/src/pair_yukawa.txt | 11 +- doc/src/pair_yukawa_colloid.txt | 11 +- doc/src/pair_zbl.txt | 11 +- doc/src/region.txt | 16 +- doc/src/run_style.txt | 30 +- 166 files changed, 1618 insertions(+), 1637 deletions(-) create mode 100644 doc/src/Packages.txt rename doc/src/{Section_packages.txt => Packages_details.txt} (86%) create mode 100644 doc/src/Packages_standard.txt create mode 100644 doc/src/Packages_user.txt delete mode 100644 doc/src/Section_accelerate.txt create mode 100644 doc/src/Speed.txt rename doc/src/{Section_perf.txt => Speed_bench.txt} (86%) create mode 100644 doc/src/Speed_compare.txt rename doc/src/{accelerate_gpu.txt => Speed_gpu.txt} (96%) rename doc/src/{accelerate_intel.txt => Speed_intel.txt} (98%) rename doc/src/{accelerate_kokkos.txt => Speed_kokkos.txt} (97%) create mode 100644 doc/src/Speed_measure.txt rename doc/src/{accelerate_omp.txt => Speed_omp.txt} (96%) rename doc/src/{accelerate_opt.txt => Speed_opt.txt} (86%) create mode 100644 doc/src/Speed_packages.txt create mode 100644 doc/src/Speed_tips.txt diff --git a/doc/src/Errors_messages.txt b/doc/src/Errors_messages.txt index 1563e02901..39eabbd232 100644 --- a/doc/src/Errors_messages.txt +++ b/doc/src/Errors_messages.txt @@ -21,9 +21,9 @@ means that line #78 in the file src/velocity.cpp generated the error. Looking in the source code may help you figure out what went wrong. Note that error messages from "user-contributed -packages"_Section_package.html#table_user are not listed here. If -such an error occurs and is not self-explanatory, you'll need to look -in the source code or contact the author of the package. +packages"_Packages_user.html are not listed here. If such an error +occurs and is not self-explanatory, you'll need to look in the source +code or contact the author of the package. Doc page with "WARNING messages"_Errors_warnings.html diff --git a/doc/src/Errors_warnings.txt b/doc/src/Errors_warnings.txt index 0324f563b6..1da777043c 100644 --- a/doc/src/Errors_warnings.txt +++ b/doc/src/Errors_warnings.txt @@ -21,9 +21,9 @@ means that line #187 in the file src/domain.cpp generated the error. Looking in the source code may help you figure out what went wrong. Note that warning messages from "user-contributed -packages"_Section_start.html#table_user are not listed here. If such -a warning occurs and is not self-explanatory, you'll need to look in -the source code or contact the author of the package. +packages"_Packages_user.html are not listed here. If such a warning +occurs and is not self-explanatory, you'll need to look in the source +code or contact the author of the package. Doc page with "ERROR messages"_Errors_messages.html diff --git a/doc/src/Examples.txt b/doc/src/Examples.txt index 08afca8b20..467ddcc959 100644 --- a/doc/src/Examples.txt +++ b/doc/src/Examples.txt @@ -143,5 +143,5 @@ The USER directory has a large number of sub-directories which correspond by name to a USER package. They contain scripts that illustrate how to use the command(s) provided in that package. Many of the sub-directories have their own README files which give further -instructions. See the "Section 4"_Section_packages.html doc +instructions. See the "Packages_details"_Packages_details.html doc page for more info on specific USER packages. diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index 4481c911a0..31b8a6a1d4 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -111,11 +111,10 @@ it gives quick access to documentation for all LAMMPS commands. Section_intro Section_start Section_commands - Section_packages - Section_accelerate + Packages + Speed Section_howto Examples - Section_perf Tools Modify Python @@ -167,19 +166,8 @@ END_RST --> 3.3 "Input script structure"_cmd_3 :b 3.4 "Commands listed by category"_cmd_4 :b 3.5 "Commands listed alphabetically"_cmd_5 :ule,b -"Packages"_Section_packages.html :l - 4.1 "Standard packages"_pkg_1 :ulb,b - 4.2 "User packages"_pkg_2 :ule,b -"Accelerating LAMMPS performance"_Section_accelerate.html :l - 5.1 "Measuring performance"_acc_1 :ulb,b - 5.2 "Algorithms and code options to boost performace"_acc_2 :b - 5.3 "Accelerator packages with optimized styles"_acc_3 :b - 5.3.1 "GPU package"_accelerate_gpu.html :b - 5.3.2 "USER-INTEL package"_accelerate_intel.html :b - 5.3.3 "KOKKOS package"_accelerate_kokkos.html :b - 5.3.4 "USER-OMP package"_accelerate_omp.html :b - 5.3.5 "OPT package"_accelerate_opt.html :b - 5.4 "Comparison of various accelerator packages"_acc_4 :ule,b +"Optional packages"_Packages.html :l +"Accelerate performance"_Speed.html :l "How-to discussions"_Section_howto.html :l 6.1 "Restarting a simulation"_howto_1 :ulb,b 6.2 "2d simulations"_howto_2 :b @@ -209,7 +197,6 @@ END_RST --> 6.26 "Adiabatic core/shell model"_howto_26 :b 6.27 "Drude induced dipoles"_howto_27 :ule,b "Example scripts"_Examples.html :l -"Performance & scalability"_Section_perf.html :l "Auxiliary tools"_Tools.html :l "Modify & extend LAMMPS"_Modify.html :l "Use Python with LAMMPS"_Python.html :l @@ -240,14 +227,6 @@ END_RST --> :link(cmd_4,Section_commands.html#cmd_4) :link(cmd_5,Section_commands.html#cmd_5) -:link(pkg_1,Section_packages.html#pkg_1) -:link(pkg_2,Section_packages.html#pkg_2) - -:link(acc_1,Section_accelerate.html#acc_1) -:link(acc_2,Section_accelerate.html#acc_2) -:link(acc_3,Section_accelerate.html#acc_3) -:link(acc_4,Section_accelerate.html#acc_4) - :link(howto_1,Section_howto.html#howto_1) :link(howto_2,Section_howto.html#howto_2) :link(howto_3,Section_howto.html#howto_3) diff --git a/doc/src/Packages.txt b/doc/src/Packages.txt new file mode 100644 index 0000000000..6498d03063 --- /dev/null +++ b/doc/src/Packages.txt @@ -0,0 +1,39 @@ +"Previous Section"_Section_commands.html - "LAMMPS WWW Site"_lws - +"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next +Section"_Speed.html :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Optional packages :h2 + +This section gives an overview of the optional packages that extend +LAMMPS functionality. Packages are groups of files that enable a +specific set of features. For example, force fields for molecular +systems or rigid-body constraint are in packages. You can see the +list of all packages and "make" commands to manage them by typing +"make package" from within the src directory of the LAMMPS +distribution. "Section 2.3"_Section_start.html#start_3 gives general +info on how to install and un-install packages as part of the LAMMPS +build process. + + + + + +"Standard packages"_Packages_standard.html +"User packages"_Packages_user.html +"Details on each package"_Packages_details.html :ul + + diff --git a/doc/src/Section_packages.txt b/doc/src/Packages_details.txt similarity index 86% rename from doc/src/Section_packages.txt rename to doc/src/Packages_details.txt index 340a77310d..af18d097d9 100644 --- a/doc/src/Section_packages.txt +++ b/doc/src/Packages_details.txt @@ -1,6 +1,5 @@ -"Previous Section"_Section_commands.html - "LAMMPS WWW Site"_lws - -"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next -Section"_Section_accelerate.html :c +"Higher level section"_Packages.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -8,152 +7,89 @@ Section"_Section_accelerate.html :c :line -4. Packages :h2 +Package details :h3 -This section gives an overview of the optional packages that extend -LAMMPS functionality with instructions on how to build LAMMPS with -each of them. Packages are groups of files that enable a specific set -of features. For example, force fields for molecular systems or -granular systems are in packages. You can see the list of all -packages and "make" commands to manage them by typing "make package" -from within the src directory of the LAMMPS distribution. "Section -2.3"_Section_start.html#start_3 gives general info on how to install -and un-install packages as part of the LAMMPS build process. - -There are two kinds of packages in LAMMPS, standard and user packages: - -"Table of standard packages"_#table_standard -"Table of user packages"_#table_user :ul - -Either of these kinds of packages may work as is, may require some -additional code compiled located in the lib folder, or may require -an external library to be downloaded, compiled, installed, and LAMMPS -configured to know about its location and additional compiler flags. -You can often do the build of the internal or external libraries -in one step by typing "make lib-name args='...'" from the src dir, -with appropriate arguments included in args='...'. If you just type -"make lib-name" you should see a help message about supported flags -and some examples. For more details about this, please study the -tables below and the sections about the individual packages. - -Standard packages are supported by the LAMMPS developers and are -written in a syntax and style consistent with the rest of LAMMPS. -This means the developers will answer questions about them, debug and -fix them if necessary, and keep them compatible with future changes to -LAMMPS. - -User packages have been contributed by users, and begin with the -"user" prefix. If they are a single command (single file), they are -typically in the user-misc package. User packages don't necessarily -meet the requirements of the standard packages. This means the -developers will try to keep things working and usually can answer -technical questions about compiling the package. If you have problems -using a feature provided in a user package, you may need to contact -the contributor directly to get help. Information on how to submit -additions you make to LAMMPS as single files or as a standard or user -package are given in the "Modify contribute"_Modify.html doc page. - -Following the next two tables is a sub-section for each package. It -lists authors (if applicable) and summarizes the package contents. It -has specific instructions on how to install the package, including (if -necessary) downloading or building any extra library it requires. It -also gives links to documentation, example scripts, and -pictures/movies (if available) that illustrate use of the package. +Here is a brief description of all the standard and user packages in +LAMMPS. It lists authors (if applicable) and summarizes the package +contents. It has specific instructions on how to install the package, +including, if necessary, info on how to download or build any extra +library it requires. It also gives links to documentation, example +scripts, and pictures/movies (if available) that illustrate use of the +package. NOTE: To see the complete list of commands a package adds to LAMMPS, -just look at the files in its src directory, e.g. "ls src/GRANULAR". -Files with names that start with fix, compute, atom, pair, bond, -angle, etc correspond to commands with the same style names. +you can examine the files in its src directory, e.g. "ls +src/GRANULAR". Files with names that start with fix, compute, atom, +pair, bond, angle, etc correspond to commands with the same style name +as contained in the file name. -In these two tables, the "Example" column is a sub-directory in the -examples directory of the distribution which has an input script that -uses the package. E.g. "peptide" refers to the examples/peptide -directory; USER/atc refers to the examples/USER/atc directory. The -"Library" column indicates whether an extra library is needed to build -and use the package: +"ASPHERE"_#ASPHERE, +"BODY"_#BODY, +"CLASS2"_#CLASS2, +"COLLOID"_#COLLOID, +"COMPRESS"_#COMPRESS, +"CORESHELL"_#CORESHELL, +"DIPOLE"_#DIPOLE, +"GPU"_#GPU, +"GRANULAR"_#GRANULAR, +"KIM"_#KIM, +"KOKKOS"_#KOKKOS, +"KSPACE"_#KSPACE, +"LATTE"_#LATTE, +"MANYBODY"_#MANYBODY, +"MC"_#MC, +"MEAM"_#MEAM, +"MISC"_#MISC, +"MOLECULE"_#MOLECULE, +"MPIIO"_#MPIIO, +"MSCG"_#MSCG, +"OPT"_#OPT, +"PERI"_#PERI, +"POEMS"_#POEMS, +"PYTHON"_#PYTHON, +"QEQ"_#QEQ, +"REAX"_#REAX, +"REPLICA"_#REPLICA, +"RIGID"_#RIGID, +"SHOCK"_#SHOCK, +"SNAP"_#SNAP, +"SRD"_#SRD, +"VORONOI"_#VORONOI :tb(c=6,ea=c) -dash = no library -sys = system library: you likely have it on your machine -int = internal library: provided with LAMMPS, but you may need to build it -ext = external library: you will need to download and install it on your machine :ul - -:line -:line - -[Standard packages] :link(table_standard),p - -Package, Description, Doc page, Example, Library -"ASPHERE"_#ASPHERE, aspherical particle models, "Section 6.6.14"_Section_howto.html#howto_14, ellipse, - -"BODY"_#BODY, body-style particles, "body"_body.html, body, - -"CLASS2"_#CLASS2, class 2 force fields, "pair_style lj/class2"_pair_class2.html, -, - -"COLLOID"_#COLLOID, colloidal particles, "atom_style colloid"_atom_style.html, colloid, - -"COMPRESS"_#COMPRESS, I/O compression, "dump */gz"_dump.html, -, sys -"CORESHELL"_#CORESHELL, adiabatic core/shell model, "Section 6.6.25"_Section_howto.html#howto_25, coreshell, - -"DIPOLE"_#DIPOLE, point dipole particles, "pair_style dipole/cut"_pair_dipole.html, dipole, - -"GPU"_#GPU, GPU-enabled styles, "Section 5.3.1"_accelerate_gpu.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, int -"GRANULAR"_#GRANULAR, granular systems, "Section 6.6.6"_Section_howto.html#howto_6, pour, - -"KIM"_#KIM, OpenKIM wrapper, "pair_style kim"_pair_kim.html, kim, ext -"KOKKOS"_#KOKKOS, Kokkos-enabled styles, "Section 5.3.3"_accelerate_kokkos.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - -"KSPACE"_#KSPACE, long-range Coulombic solvers, "kspace_style"_kspace_style.html, peptide, - -"LATTE"_#LATTE, quantum DFTB forces via LATTE, "fix latte"_fix_latte.html, latte, ext -"MANYBODY"_#MANYBODY, many-body potentials, "pair_style tersoff"_pair_tersoff.html, shear, - -"MC"_#MC, Monte Carlo options, "fix gcmc"_fix_gcmc.html, -, - -"MEAM"_#MEAM, modified EAM potential, "pair_style meam"_pair_meam.html, meam, int -"MISC"_#MISC, miscellanous single-file commands, -, -, - -"MOLECULE"_#MOLECULE, molecular system force fields, "Section 6.6.3"_Section_howto.html#howto_3, peptide, - -"MPIIO"_#MPIIO, MPI parallel I/O dump and restart, "dump"_dump.html, -, - -"MSCG"_#MSCG, multi-scale coarse-graining wrapper, "fix mscg"_fix_mscg.html, mscg, ext -"OPT"_#OPT, optimized pair styles, "Section 5.3.5"_accelerate_opt.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - -"PERI"_#PERI, Peridynamics models, "pair_style peri"_pair_peri.html, peri, - -"POEMS"_#POEMS, coupled rigid body motion, "fix poems"_fix_poems.html, rigid, int -"PYTHON"_#PYTHON, embed Python code in an input script, "python"_python.html, python, sys -"QEQ"_#QEQ, QEq charge equilibration, "fix qeq"_fix_qeq.html, qeq, - -"REAX"_#REAX, ReaxFF potential (Fortran), "pair_style reax"_pair_reax.html, reax, int -"REPLICA"_#REPLICA, multi-replica methods, "Section 6.6.5"_Section_howto.html#howto_5, tad, - -"RIGID"_#RIGID, rigid bodies and constraints, "fix rigid"_fix_rigid.html, rigid, - -"SHOCK"_#SHOCK, shock loading methods, "fix msst"_fix_msst.html, -, - -"SNAP"_#SNAP, quantum-fitted potential, "pair_style snap"_pair_snap.html, snap, - -"SPIN"_#SPIN, magnetic atomic spin dynamics, "Section 6.6.28"_Section_howto.html#howto_28, SPIN, - -"SRD"_#SRD, stochastic rotation dynamics, "fix srd"_fix_srd.html, srd, - -"VORONOI"_#VORONOI, Voronoi tesselation, "compute voronoi/atom"_compute_voronoi_atom.html, -, ext :tb(ea=c,ca1=l) - -[USER packages] :link(table_user),p - -Package, Description, Doc page, Example, Library -"USER-ATC"_#USER-ATC, atom-to-continuum coupling, "fix atc"_fix_atc.html, USER/atc, int -"USER-AWPMD"_#USER-AWPMD, wave-packet MD, "pair_style awpmd/cut"_pair_awpmd.html, USER/awpmd, int -"USER-BOCS"_#USER-BOCS, BOCS bottom up coarse graining, "fix bocs"_fix_bocs.html, USER/bocs, - -"USER-CGDNA"_#USER-CGDNA, coarse-grained DNA force fields, src/USER-CGDNA/README, USER/cgdna, - -"USER-CGSDK"_#USER-CGSDK, SDK coarse-graining model, "pair_style lj/sdk"_pair_sdk.html, USER/cgsdk, - -"USER-COLVARS"_#USER-COLVARS, collective variables library, "fix colvars"_fix_colvars.html, USER/colvars, int -"USER-DIFFRACTION"_#USER-DIFFRACTION, virtual x-ray and electron diffraction,"compute xrd"_compute_xrd.html, USER/diffraction, - -"USER-DPD"_#USER-DPD, reactive dissipative particle dynamics, src/USER-DPD/README, USER/dpd, - -"USER-DRUDE"_#USER-DRUDE, Drude oscillators, "tutorial"_tutorial_drude.html, USER/drude, - -"USER-EFF"_#USER-EFF, electron force field,"pair_style eff/cut"_pair_eff.html, USER/eff, - -"USER-FEP"_#USER-FEP, free energy perturbation,"compute fep"_compute_fep.html, USER/fep, - -"USER-H5MD"_#USER-H5MD, dump output via HDF5,"dump h5md"_dump_h5md.html, -, ext -"USER-INTEL"_#USER-INTEL, optimized Intel CPU and KNL styles,"Section 5.3.2"_accelerate_intel.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - -"USER-LB"_#USER-LB, Lattice Boltzmann fluid,"fix lb/fluid"_fix_lb_fluid.html, USER/lb, - -"USER-MANIFOLD"_#USER-MANIFOLD, motion on 2d surfaces,"fix manifoldforce"_fix_manifoldforce.html, USER/manifold, - -"USER-MEAMC"_#USER-MEAMC, modified EAM potential (C++), "pair_style meam/c"_pair_meam.html, meam, - -"USER-MESO"_#USER-MESO, mesoscale DPD models, "pair_style edpd"_pair_meso.html, USER/meso, - -"USER-MGPT"_#USER-MGPT, fast MGPT multi-ion potentials, "pair_style mgpt"_pair_mgpt.html, USER/mgpt, - -"USER-MISC"_#USER-MISC, single-file contributions, USER-MISC/README, USER/misc, - -"USER-MOFFF"_#USER-MOFFF, styles for "MOF-FF"_MOFplus force field, "pair_style buck6d/coul/gauss"_pair_buck6d_coul_gauss.html, USER/mofff, - -"USER-MOLFILE"_#USER-MOLFILE, "VMD"_vmd_home molfile plug-ins,"dump molfile"_dump_molfile.html, -, ext -"USER-NETCDF"_#USER-NETCDF, dump output via NetCDF,"dump netcdf"_dump_netcdf.html, -, ext -"USER-OMP"_#USER-OMP, OpenMP-enabled styles,"Section 5.3.4"_accelerate_omp.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - -"USER-PHONON"_#USER-PHONON, phonon dynamical matrix,"fix phonon"_fix_phonon.html, USER/phonon, - -"USER-QMMM"_#USER-QMMM, QM/MM coupling,"fix qmmm"_fix_qmmm.html, USER/qmmm, ext -"USER-QTB"_#USER-QTB, quantum nuclear effects,"fix qtb"_fix_qtb.html "fix qbmsst"_fix_qbmsst.html, qtb, - -"USER-QUIP"_#USER-QUIP, QUIP/libatoms interface,"pair_style quip"_pair_quip.html, USER/quip, ext -"USER-REAXC"_#USER-REAXC, ReaxFF potential (C/C++) ,"pair_style reaxc"_pair_reaxc.html, reax, - -"USER-SMD"_#USER-SMD, smoothed Mach dynamics,"SMD User Guide"_PDF/SMD_LAMMPS_userguide.pdf, USER/smd, ext -"USER-SMTBQ"_#USER-SMTBQ, second moment tight binding QEq potential,"pair_style smtbq"_pair_smtbq.html, USER/smtbq, - -"USER-SPH"_#USER-SPH, smoothed particle hydrodynamics,"SPH User Guide"_PDF/SPH_LAMMPS_userguide.pdf, USER/sph, - -"USER-TALLY"_#USER-TALLY, pairwise tally computes,"compute XXX/tally"_compute_tally.html, USER/tally, - -"USER-UEF"_#USER-UEF, extensional flow,"fix nvt/uef"_fix_nh_uef.html, USER/uef, - -"USER-VTK"_#USER-VTK, dump output via VTK, "compute vtk"_dump_vtk.html, -, ext :tb(ea=c,ca1=l) +"USER-ATC"_#USER-ATC, +"USER-AWPMD"_#USER-AWPMD, +"USER-BOCS"_#USER-BOCS, +"USER-CGDNA"_#USER-CGDNA, +"USER-CGSDK"_#USER-CGSDK, +"USER-COLVARS"_#USER-COLVARS, +"USER-DIFFRACTION"_#USER-DIFFRACTION, +"USER-DPD"_#USER-DPD, +"USER-DRUDE"_#USER-DRUDE, +"USER-EFF"_#USER-EFF, +"USER-FEP"_#USER-FEP, +"USER-H5MD"_#USER-H5MD, +"USER-INTEL"_#USER-INTEL, +"USER-LB"_#USER-LB, +"USER-MANIFOLD"_#USER-MANIFOLD, +"USER-MEAMC"_#USER-MEAMC, +"USER-MESO"_#USER-MESO, +"USER-MGPT"_#USER-MGPT, +"USER-MISC"_#USER-MISC, +"USER-MOFFF"_#USER-MOFFF, +"USER-MOLFILE"_#USER-MOLFILE, +"USER-NETCDF"_#USER-NETCDF, +"USER-OMP"_#USER-OMP, +"USER-PHONON"_#USER-PHONON, +"USER-QMMM"_#USER-QMMM, +"USER-QTB"_#USER-QTB, +"USER-QUIP"_#USER-QUIP, +"USER-REAXC"_#USER-REAXC, +"USER-SMD"_#USER-SMD, +"USER-SMTBQ"_#USER-SMTBQ, +"USER-SPH"_#USER-SPH, +"USER-TALLY"_#USER-TALLY, +"USER-UEF"_#USER-UEF, +"USER-VTK"_#USER-VTK :tb(c=6,ea=c) :line :line @@ -380,14 +316,14 @@ GPU package :link(GPU),h4 [Contents:] Dozens of pair styles and a version of the PPPM long-range Coulombic -solver optimized for GPUs. All such styles have a "gpu" as a -suffix in their style name. The GPU code can be compiled with either -CUDA or OpenCL, however the OpenCL variants are no longer actively -maintained and only the CUDA versions are regularly tested. -"Section 5.3.1"_accelerate_gpu.html gives details of what -hardware and GPU software is required on your system, -and details on how to build and use this package. Its styles can be -invoked at run time via the "-sf gpu" or "-suffix gpu" "command-line +solver optimized for GPUs. All such styles have a "gpu" as a suffix +in their style name. The GPU code can be compiled with either CUDA or +OpenCL, however the OpenCL variants are no longer actively maintained +and only the CUDA versions are regularly tested. The "Speed +gpu"_Speed_gpu.html doc page gives details of what hardware and GPU +software is required on your system, and details on how to build and +use this package. Its styles can be invoked at run time via the "-sf +gpu" or "-suffix gpu" "command-line switches"_Section_start.html#start_6. See also the "KOKKOS"_#KOKKOS package, which has GPU-enabled styles. @@ -453,8 +389,8 @@ GPU library. src/GPU: filenames -> commands src/GPU/README lib/gpu/README -"Section 5.3"_Section_accelerate.html#acc_3 -"Section 5.3.1"_accelerate_gpu.html +"Speed packages"_Speed_packages.html +"Speed gpu"_Speed_gpu.html.html "Section 2.6 -sf gpu"_Section_start.html#start_6 "Section 2.6 -pk gpu"_Section_start.html#start_6 "package gpu"_package.html @@ -579,10 +515,10 @@ Dozens of atom, pair, bond, angle, dihedral, improper, fix, compute styles adapted to compile using the Kokkos library which can convert them to OpenMP or CUDA code so that they run efficiently on multicore CPUs, KNLs, or GPUs. All the styles have a "kk" as a suffix in their -style name. "Section 5.3.3"_accelerate_kokkos.html gives details of -what hardware and software is required on your system, and how to -build and use this package. Its styles can be invoked at run time via -the "-sf kk" or "-suffix kk" "command-line +style name. The "Speed kokkos"_Speed_kokkos.html doc page gives +details of what hardware and software is required on your system, and +how to build and use this package. Its styles can be invoked at run +time via the "-sf kk" or "-suffix kk" "command-line switches"_Section_start.html#start_6. Also see the "GPU"_#GPU, "OPT"_#OPT, "USER-INTEL"_#USER-INTEL, and "USER-OMP"_#USER-OMP packages, which have styles optimized for CPUs, KNLs, and GPUs. @@ -649,8 +585,8 @@ make machine :pre src/KOKKOS: filenames -> commands src/KOKKOS/README lib/kokkos/README -"Section 5.3"_Section_accelerate.html#acc_3 -"Section 5.3.3"_accelerate_kokkos.html +"Speed packages"_Speed_packages.html +"Speed kokkos"_Speed_kokkos.html "Section 2.6 -k on ..."_Section_start.html#start_6 "Section 2.6 -sf kk"_Section_start.html#start_6 "Section 2.6 -pk kokkos"_Section_start.html#start_6 @@ -1048,9 +984,9 @@ OPT package :link(OPT),h4 A handful of pair styles which are optimized for improved CPU performance on single or multiple cores. These include EAM, LJ, CHARMM, and Morse potentials. The styles have an "opt" suffix in -their style name. "Section 5.3.5"_accelerate_opt.html gives details -of how to build and use this package. Its styles can be invoked at -run time via the "-sf opt" or "-suffix opt" "command-line +their style name. The "Speed opt"_Speed_opt.html doc page gives +details of how to build and use this package. Its styles can be +invoked at run time via the "-sf opt" or "-suffix opt" "command-line switches"_Section_start.html#start_6. See also the "KOKKOS"_#KOKKOS, "USER-INTEL"_#USER-INTEL, and "USER-OMP"_#USER-OMP packages, which have styles optimized for CPU performance. @@ -1076,8 +1012,8 @@ CCFLAGS: add -restrict for Intel compilers :ul [Supporting info:] src/OPT: filenames -> commands -"Section 5.3"_Section_accelerate.html#acc_3 -"Section 5.3.5"_accelerate_opt.html +"Speed packages"_Speed_packages.html +"Speed opt"_Speed_opt.html "Section 2.6 -sf opt"_Section_start.html#start_6 Pair Styles section of "Section 3.5"_Section_commands.html#cmd_5 for pair styles followed by (t) "Benchmarks page"_http://lammps.sandia.gov/bench.html of web site :ul @@ -1178,10 +1114,10 @@ PYTHON package :link(PYTHON),h4 A "python"_python.html command which allow you to execute Python code from a LAMMPS input script. The code can be in a separate file or -embedded in the input script itself. See the "Python -call"_Python_call.html doc page for an overview of using Python from -LAMMPS in this manner and the "Python"_Python.html doc page for other -ways to use LAMMPS and Python together. +embedded in the input script itself. See "Section +11.2"_Section_python.html#py_2 for an overview of using Python from +LAMMPS in this manner and the entire section for other ways to use +LAMMPS and Python together. [Install or un-install:] @@ -1202,7 +1138,7 @@ to Makefile.lammps) if the LAMMPS build fails. [Supporting info:] src/PYTHON: filenames -> commands -"Python call"_Python_call.html +"Section 11"_Section_python.html lib/python/README examples/python :ul @@ -1415,38 +1351,6 @@ examples/snap :ul :line -SPIN package :link(SPIN),h4 - -[Contents:] - -Model atomic magnetic spins classically, coupled to atoms moving in -the usual manner via MD. Various pair, fix, and compute styles. - -[Author:] Julian Tranchida (Sandia). - -[Install or un-install:] - -make yes-spin -make machine :pre - -make no-spin -make machine :pre - -[Supporting info:] - -src/SPIN: filenames -> commands -"Section 6.28"_Section_howto.html#howto_28 -"pair_style spin/dmi"_pair_spin_dmi.html -"pair_style spin/exchange"_pair_spin_exchange.html -"pair_style spin/magelec"_pair_spin_magelec.html -"pair_style spin/neel"_pair_spin_neel.html -"fix nve/spin"_fix_nve_spin.html -"fix precession/spin"_fix_precession_spin.html -"compute spin"_compute_spin.html -examples/SPIN :ul - -:line - SRD package :link(SRD),h4 [Contents:] @@ -2065,8 +1969,8 @@ USER-INTEL package :link(USER-INTEL),h4 Dozens of pair, fix, bond, angle, dihedral, improper, and kspace styles which are optimized for Intel CPUs and KNLs (Knights Landing). -All of them have an "intel" in their style name. "Section -5.3.2"_accelerate_intel.html gives details of what hardware and +All of them have an "intel" in their style name. The "Speed +intel"_Speed_intel.html doc page gives details of what hardware and compilers are required on your system, and how to build and use this package. Its styles can be invoked at run time via the "-sf intel" or "-suffix intel" "command-line switches"_Section_start.html#start_6. @@ -2116,7 +2020,7 @@ hardware target, to produce a separate executable. You should also typically install the USER-OMP package, as it can be used in tandem with the USER-INTEL package to good effect, as -explained in "Section 5.3.2"_accelerate_intel.html. +explained on the "Speed intel"_Speed_intel.html doc page. make yes-user-intel yes-user-omp make machine :pre @@ -2128,8 +2032,8 @@ make machine :pre src/USER-INTEL: filenames -> commands src/USER-INTEL/README -"Section 5.3"_Section_accelerate.html#acc_3 -"Section 5.3.2"_accelerate_gpu.html +"Speed packages"_Speed_packages.html +"Speed intel"_Speed_intel.html "Section 2.6 -sf intel"_Section_start.html#start_6 "Section 2.6 -pk intel"_Section_start.html#start_6 "package intel"_package.html @@ -2475,10 +2379,10 @@ USER-OMP package :link(USER-OMP),h4 Hundreds of pair, fix, compute, bond, angle, dihedral, improper, and kspace styles which are altered to enable threading on many-core CPUs via OpenMP directives. All of them have an "omp" in their style name. -"Section 5.3.4"_accelerate_omp.html gives details of what hardware and -compilers are required on your system, and how to build and use this -package. Its styles can be invoked at run time via the "-sf omp" or -"-suffix omp" "command-line switches"_Section_start.html#start_6. +The "Speed omp"_Speed_omp.html doc page gives details of what hardware +and compilers are required on your system, and how to build and use +this package. Its styles can be invoked at run time via the "-sf omp" +or "-suffix omp" "command-line switches"_Section_start.html#start_6. Also see the "KOKKOS"_#KOKKOS, "OPT"_#OPT, and "USER-INTEL"_#USER-INTEL packages, which have styles optimized for CPUs. @@ -2513,8 +2417,8 @@ LINKFLAGS: add -fopenmp :ul src/USER-OMP: filenames -> commands src/USER-OMP/README -"Section 5.3"_Section_accelerate.html#acc_3 -"Section 5.3.4"_accelerate_omp.html +"Speed packages"_Speed_packages.html +"Speed omp"_Speed_omp.html "Section 2.6 -sf omp"_Section_start.html#start_6 "Section 2.6 -pk omp"_Section_start.html#start_6 "package omp"_package.html diff --git a/doc/src/Packages_standard.txt b/doc/src/Packages_standard.txt new file mode 100644 index 0000000000..095bf699a6 --- /dev/null +++ b/doc/src/Packages_standard.txt @@ -0,0 +1,65 @@ +"Higher level section"_Packages.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Standard packages :h3 + +This is the list of standard packages in LAMMPS. The link for each +package name gives more details. + +Standard packages are supported by the LAMMPS developers and are +written in a syntax and style consistent with the rest of LAMMPS. +This means the developers will answer questions about them, debug and +fix them if necessary, and keep them compatible with future changes to +LAMMPS. + +The "Example" column is a sub-directory in the examples directory of +the distribution which has an input script that uses the package. +E.g. "peptide" refers to the examples/peptide directory; USER/atc +refers to the examples/USER/atc directory. The "Library" column +indicates whether an extra library is needed to build and use the +package: + +dash = no library +sys = system library: you likely have it on your machine +int = internal library: provided with LAMMPS, but you may need to build it +ext = external library: you will need to download and install it on your machine :ul + +Package, Description, Doc page, Example, Library +"ASPHERE"_Packages_details.html#ASPHERE, aspherical particle models, "Section 6.6.14"_Section_howto.html#howto_14, ellipse, - +"BODY"_Packages_details.html#BODY, body-style particles, "body"_body.html, body, - +"CLASS2"_Packages_details.html#CLASS2, class 2 force fields, "pair_style lj/class2"_pair_class2.html, -, - +"COLLOID"_Packages_details.html#COLLOID, colloidal particles, "atom_style colloid"_atom_style.html, colloid, - +"COMPRESS"_Packages_details.html#COMPRESS, I/O compression, "dump */gz"_dump.html, -, sys +"CORESHELL"_Packages_details.html#CORESHELL, adiabatic core/shell model, "Section 6.6.25"_Section_howto.html#howto_25, coreshell, - +"DIPOLE"_Packages_details.html#DIPOLE, point dipole particles, "pair_style dipole/cut"_pair_dipole.html, dipole, - +"GPU"_Packages_details.html#GPU, GPU-enabled styles, "Section gpu"_Speed_gpu.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, int +"GRANULAR"_Packages_details.html#GRANULAR, granular systems, "Section 6.6.6"_Section_howto.html#howto_6, pour, - +"KIM"_Packages_details.html#KIM, OpenKIM wrapper, "pair_style kim"_pair_kim.html, kim, ext +"KOKKOS"_Packages_details.html#KOKKOS, Kokkos-enabled styles, "Speed kokkos"_Speed_kokkos.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - +"KSPACE"_Packages_details.html#KSPACE, long-range Coulombic solvers, "kspace_style"_kspace_style.html, peptide, - +"LATTE"_Packages_details.html#LATTE, quantum DFTB forces via LATTE, "fix latte"_fix_latte.html, latte, ext +"MANYBODY"_Packages_details.html#MANYBODY, many-body potentials, "pair_style tersoff"_pair_tersoff.html, shear, - +"MC"_Packages_details.html#MC, Monte Carlo options, "fix gcmc"_fix_gcmc.html, -, - +"MEAM"_Packages_details.html#MEAM, modified EAM potential, "pair_style meam"_pair_meam.html, meam, int +"MISC"_Packages_details.html#MISC, miscellanous single-file commands, -, -, - +"MOLECULE"_Packages_details.html#MOLECULE, molecular system force fields, "Section 6.6.3"_Section_howto.html#howto_3, peptide, - +"MPIIO"_Packages_details.html#MPIIO, MPI parallel I/O dump and restart, "dump"_dump.html, -, - +"MSCG"_Packages_details.html#MSCG, multi-scale coarse-graining wrapper, "fix mscg"_fix_mscg.html, mscg, ext +"OPT"_Packages_details.html#OPT, optimized pair styles, "Speed opt"_Speed_opt.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - +"PERI"_Packages_details.html#PERI, Peridynamics models, "pair_style peri"_pair_peri.html, peri, - +"POEMS"_Packages_details.html#POEMS, coupled rigid body motion, "fix poems"_fix_poems.html, rigid, int +"PYTHON"_Packages_details.html#PYTHON, embed Python code in an input script, "python"_python.html, python, sys +"QEQ"_Packages_details.html#QEQ, QEq charge equilibration, "fix qeq"_fix_qeq.html, qeq, - +"REAX"_Packages_details.html#REAX, ReaxFF potential (Fortran), "pair_style reax"_pair_reax.html, reax, int +"REPLICA"_Packages_details.html#REPLICA, multi-replica methods, "Section 6.6.5"_Section_howto.html#howto_5, tad, - +"RIGID"_Packages_details.html#RIGID, rigid bodies and constraints, "fix rigid"_fix_rigid.html, rigid, - +"SHOCK"_Packages_details.html#SHOCK, shock loading methods, "fix msst"_fix_msst.html, -, - +"SNAP"_Packages_details.html#SNAP, quantum-fitted potential, "pair_style snap"_pair_snap.html, snap, - +"SRD"_Packages_details.html#SRD, stochastic rotation dynamics, "fix srd"_fix_srd.html, srd, - +"VORONOI"_Packages_details.html#VORONOI, Voronoi tesselation, "compute voronoi/atom"_compute_voronoi_atom.html, -, ext :tb(ea=c,ca1=l) diff --git a/doc/src/Packages_user.txt b/doc/src/Packages_user.txt new file mode 100644 index 0000000000..73c7fdb65d --- /dev/null +++ b/doc/src/Packages_user.txt @@ -0,0 +1,74 @@ +"Higher level section"_Packages.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +User packages :h3 + +This is a list of user packages in LAMMPS. The link for each package +name gives more details. + +User packages have been contributed by users, and begin with the +"user" prefix. If a contribution is a single command (single file), +it is typically in the user-misc package. User packages don't +necessarily meet the requirements of the "standard +packages"_Packages_standard.html. This means the developers will try +to keep things working and usually can answer technical questions +about compiling the package. If you have problems using a specific +feature provided in a user package, you may need to contact the +contributor directly to get help. Information on how to submit +additions you make to LAMMPS as single files or as a standard or user +package is explained on the "Modify contribute"_Modify_contribute.html +doc page. + +The "Example" column is a sub-directory in the examples directory of +the distribution which has an input script that uses the package. +E.g. "peptide" refers to the examples/peptide directory; USER/atc +refers to the examples/USER/atc directory. The "Library" column +indicates whether an extra library is needed to build and use the +package: + +dash = no library +sys = system library: you likely have it on your machine +int = internal library: provided with LAMMPS, but you may need to build it +ext = external library: you will need to download and install it on your machine :ul + +Package, Description, Doc page, Example, Library +"USER-ATC"_Packages_details.html#USER-ATC, atom-to-continuum coupling, "fix atc"_fix_atc.html, USER/atc, int +"USER-AWPMD"_Packages_details.html#USER-AWPMD, wave-packet MD, "pair_style awpmd/cut"_pair_awpmd.html, USER/awpmd, int +"USER-BOCS"_Packages_details.html#USER-BOCS, BOCS bottom up coarse graining, "fix bocs"_fix_bocs.html, USER/bocs, - +"USER-CGDNA"_Packages_details.html#USER-CGDNA, coarse-grained DNA force fields, src/USER-CGDNA/README, USER/cgdna, - +"USER-CGSDK"_Packages_details.html#USER-CGSDK, SDK coarse-graining model, "pair_style lj/sdk"_pair_sdk.html, USER/cgsdk, - +"USER-COLVARS"_Packages_details.html#USER-COLVARS, collective variables library, "fix colvars"_fix_colvars.html, USER/colvars, int +"USER-DIFFRACTION"_Packages_details.html#USER-DIFFRACTION, virtual x-ray and electron diffraction,"compute xrd"_compute_xrd.html, USER/diffraction, - +"USER-DPD"_Packages_details.html#USER-DPD, reactive dissipative particle dynamics, src/USER-DPD/README, USER/dpd, - +"USER-DRUDE"_Packages_details.html#USER-DRUDE, Drude oscillators, "tutorial"_tutorial_drude.html, USER/drude, - +"USER-EFF"_Packages_details.html#USER-EFF, electron force field,"pair_style eff/cut"_pair_eff.html, USER/eff, - +"USER-FEP"_Packages_details.html#USER-FEP, free energy perturbation,"compute fep"_compute_fep.html, USER/fep, - +"USER-H5MD"_Packages_details.html#USER-H5MD, dump output via HDF5,"dump h5md"_dump_h5md.html, -, ext +"USER-INTEL"_Packages_details.html#USER-INTEL, optimized Intel CPU and KNL styles,"Speed intel"_Speed_intel.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - +"USER-LB"_Packages_details.html#USER-LB, Lattice Boltzmann fluid,"fix lb/fluid"_fix_lb_fluid.html, USER/lb, - +"USER-MANIFOLD"_Packages_details.html#USER-MANIFOLD, motion on 2d surfaces,"fix manifoldforce"_fix_manifoldforce.html, USER/manifold, - +"USER-MEAMC"_Packages_details.html#USER-MEAMC, modified EAM potential (C++), "pair_style meam/c"_pair_meam.html, meam, - +"USER-MESO"_Packages_details.html#USER-MESO, mesoscale DPD models, "pair_style edpd"_pair_meso.html, USER/meso, - +"USER-MGPT"_Packages_details.html#USER-MGPT, fast MGPT multi-ion potentials, "pair_style mgpt"_pair_mgpt.html, USER/mgpt, - +"USER-MISC"_Packages_details.html#USER-MISC, single-file contributions, USER-MISC/README, USER/misc, - +"USER-MOFFF"_Packages_details.html#USER-MOFFF, styles for "MOF-FF"_MOFplus force field, "pair_style buck6d/coul/gauss"_pair_buck6d_coul_gauss.html, USER/mofff, - +"USER-MOLFILE"_Packages_details.html#USER-MOLFILE, "VMD"_vmd_home molfile plug-ins,"dump molfile"_dump_molfile.html, -, ext +"USER-NETCDF"_Packages_details.html#USER-NETCDF, dump output via NetCDF,"dump netcdf"_dump_netcdf.html, -, ext +"USER-OMP"_Packages_details.html#USER-OMP, OpenMP-enabled styles,"Speed omp"_Speed_omp.html, "Benchmarks"_http://lammps.sandia.gov/bench.html, - +"USER-PHONON"_Packages_details.html#USER-PHONON, phonon dynamical matrix,"fix phonon"_fix_phonon.html, USER/phonon, - +"USER-QMMM"_Packages_details.html#USER-QMMM, QM/MM coupling,"fix qmmm"_fix_qmmm.html, USER/qmmm, ext +"USER-QTB"_Packages_details.html#USER-QTB, quantum nuclear effects,"fix qtb"_fix_qtb.html "fix qbmsst"_fix_qbmsst.html, qtb, - +"USER-QUIP"_Packages_details.html#USER-QUIP, QUIP/libatoms interface,"pair_style quip"_pair_quip.html, USER/quip, ext +"USER-REAXC"_Packages_details.html#USER-REAXC, ReaxFF potential (C/C++) ,"pair_style reaxc"_pair_reaxc.html, reax, - +"USER-SMD"_Packages_details.html#USER-SMD, smoothed Mach dynamics,"SMD User Guide"_PDF/SMD_LAMMPS_userguide.pdf, USER/smd, ext +"USER-SMTBQ"_Packages_details.html#USER-SMTBQ, second moment tight binding QEq potential,"pair_style smtbq"_pair_smtbq.html, USER/smtbq, - +"USER-SPH"_Packages_details.html#USER-SPH, smoothed particle hydrodynamics,"SPH User Guide"_PDF/SPH_LAMMPS_userguide.pdf, USER/sph, - +"USER-TALLY"_Packages_details.html#USER-TALLY, pairwise tally computes,"compute XXX/tally"_compute_tally.html, USER/tally, - +"USER-UEF"_Packages_details.html#USER-UEF, extensional flow,"fix nvt/uef"_fix_nh_uef.html, USER/uef, - +"USER-VTK"_Packages_details.html#USER-VTK, dump output via VTK, "compute vtk"_dump_vtk.html, -, ext :tb(ea=c,ca1=l) diff --git a/doc/src/Section_accelerate.txt b/doc/src/Section_accelerate.txt deleted file mode 100644 index d5cbf77a84..0000000000 --- a/doc/src/Section_accelerate.txt +++ /dev/null @@ -1,391 +0,0 @@ -"Previous Section"_Section_packages.html - "LAMMPS WWW Site"_lws - -"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next -Section"_Section_howto.html :c - -:link(lws,http://lammps.sandia.gov) -:link(ld,Manual.html) -:link(lc,Section_commands.html#comm) - -:line - -5. Accelerating LAMMPS performance :h2 - -This section describes various methods for improving LAMMPS -performance for different classes of problems running on different -kinds of machines. - -There are two thrusts to the discussion that follows. The -first is using code options that implement alternate algorithms -that can speed-up a simulation. The second is to use one -of the several accelerator packages provided with LAMMPS that -contain code optimized for certain kinds of hardware, including -multi-core CPUs, GPUs, and Intel Xeon Phi coprocessors. - -5.1 "Measuring performance"_#acc_1 :ulb,l -5.2 "Algorithms and code options to boost performace"_#acc_2 :l -5.3 "Accelerator packages with optimized styles"_#acc_3 :l - 5.3.1 "GPU package"_accelerate_gpu.html :l - 5.3.2 "USER-INTEL package"_accelerate_intel.html :l - 5.3.3 "KOKKOS package"_accelerate_kokkos.html :l - 5.3.4 "USER-OMP package"_accelerate_omp.html :l - 5.3.5 "OPT package"_accelerate_opt.html :l -5.4 "Comparison of various accelerator packages"_#acc_4 :l -:ule - -The "Benchmark page"_http://lammps.sandia.gov/bench.html of the LAMMPS -web site gives performance results for the various accelerator -packages discussed in Section 5.2, for several of the standard LAMMPS -benchmark problems, as a function of problem size and number of -compute nodes, on different hardware platforms. - -:line -:line - -5.1 Measuring performance :h3,link(acc_1) - -Before trying to make your simulation run faster, you should -understand how it currently performs and where the bottlenecks are. - -The best way to do this is run the your system (actual number of -atoms) for a modest number of timesteps (say 100 steps) on several -different processor counts, including a single processor if possible. -Do this for an equilibrium version of your system, so that the -100-step timings are representative of a much longer run. There is -typically no need to run for 1000s of timesteps to get accurate -timings; you can simply extrapolate from short runs. - -For the set of runs, look at the timing data printed to the screen and -log file at the end of each LAMMPS run. "This -section"_Section_start.html#start_7 of the manual has an overview. - -Running on one (or a few processors) should give a good estimate of -the serial performance and what portions of the timestep are taking -the most time. Running the same problem on a few different processor -counts should give an estimate of parallel scalability. I.e. if the -simulation runs 16x faster on 16 processors, its 100% parallel -efficient; if it runs 8x faster on 16 processors, it's 50% efficient. - -The most important data to look at in the timing info is the timing -breakdown and relative percentages. For example, trying different -options for speeding up the long-range solvers will have little impact -if they only consume 10% of the run time. If the pairwise time is -dominating, you may want to look at GPU or OMP versions of the pair -style, as discussed below. Comparing how the percentages change as -you increase the processor count gives you a sense of how different -operations within the timestep are scaling. Note that if you are -running with a Kspace solver, there is additional output on the -breakdown of the Kspace time. For PPPM, this includes the fraction -spent on FFTs, which can be communication intensive. - -Another important detail in the timing info are the histograms of -atoms counts and neighbor counts. If these vary widely across -processors, you have a load-imbalance issue. This often results in -inaccurate relative timing data, because processors have to wait when -communication occurs for other processors to catch up. Thus the -reported times for "Communication" or "Other" may be higher than they -really are, due to load-imbalance. If this is an issue, you can -uncomment the MPI_Barrier() lines in src/timer.cpp, and recompile -LAMMPS, to obtain synchronized timings. - -:line - -5.2 General strategies :h3,link(acc_2) - -NOTE: this section 5.2 is still a work in progress - -Here is a list of general ideas for improving simulation performance. -Most of them are only applicable to certain models and certain -bottlenecks in the current performance, so let the timing data you -generate be your guide. It is hard, if not impossible, to predict how -much difference these options will make, since it is a function of -problem size, number of processors used, and your machine. There is -no substitute for identifying performance bottlenecks, and trying out -various options. - -rRESPA -2-FFT PPPM -Staggered PPPM -single vs double PPPM -partial charge PPPM -verlet/split run style -processor command for proc layout and numa layout -load-balancing: balance and fix balance :ul - -2-FFT PPPM, also called {analytic differentiation} or {ad} PPPM, uses -2 FFTs instead of the 4 FFTs used by the default {ik differentiation} -PPPM. However, 2-FFT PPPM also requires a slightly larger mesh size to -achieve the same accuracy as 4-FFT PPPM. For problems where the FFT -cost is the performance bottleneck (typically large problems running -on many processors), 2-FFT PPPM may be faster than 4-FFT PPPM. - -Staggered PPPM performs calculations using two different meshes, one -shifted slightly with respect to the other. This can reduce force -aliasing errors and increase the accuracy of the method, but also -doubles the amount of work required. For high relative accuracy, using -staggered PPPM allows one to half the mesh size in each dimension as -compared to regular PPPM, which can give around a 4x speedup in the -kspace time. However, for low relative accuracy, using staggered PPPM -gives little benefit and can be up to 2x slower in the kspace -time. For example, the rhodopsin benchmark was run on a single -processor, and results for kspace time vs. relative accuracy for the -different methods are shown in the figure below. For this system, -staggered PPPM (using ik differentiation) becomes useful when using a -relative accuracy of slightly greater than 1e-5 and above. - -:c,image(JPG/rhodo_staggered.jpg) - -NOTE: Using staggered PPPM may not give the same increase in accuracy -of energy and pressure as it does in forces, so some caution must be -used if energy and/or pressure are quantities of interest, such as -when using a barostat. - -:line - -5.3 Packages with optimized styles :h3,link(acc_3) - -Accelerated versions of various "pair_style"_pair_style.html, -"fixes"_fix.html, "computes"_compute.html, and other commands have -been added to LAMMPS, which will typically run faster than the -standard non-accelerated versions. Some require appropriate hardware -to be present on your system, e.g. GPUs or Intel Xeon Phi -coprocessors. - -All of these commands are in packages provided with LAMMPS. An -overview of packages is give in "Section -packages"_Section_packages.html. - -These are the accelerator packages -currently in LAMMPS, either as standard or user packages: - -"GPU Package"_accelerate_gpu.html : for NVIDIA GPUs as well as OpenCL support -"USER-INTEL Package"_accelerate_intel.html : for Intel CPUs and Intel Xeon Phi -"KOKKOS Package"_accelerate_kokkos.html : for Nvidia GPUs, Intel Xeon Phi, and OpenMP threading -"USER-OMP Package"_accelerate_omp.html : for OpenMP threading and generic CPU optimizations -"OPT Package"_accelerate_opt.html : generic CPU optimizations :tb(s=:) - - - -Inverting this list, LAMMPS currently has acceleration support for -three kinds of hardware, via the listed packages: - -Many-core CPUs : "USER-INTEL"_accelerate_intel.html, "KOKKOS"_accelerate_kokkos.html, "USER-OMP"_accelerate_omp.html, "OPT"_accelerate_opt.html packages -NVIDIA GPUs : "GPU"_accelerate_gpu.html, "KOKKOS"_accelerate_kokkos.html packages -Intel Phi : "USER-INTEL"_accelerate_intel.html, "KOKKOS"_accelerate_kokkos.html packages :tb(s=:) - -Which package is fastest for your hardware may depend on the size -problem you are running and what commands (accelerated and -non-accelerated) are invoked by your input script. While these doc -pages include performance guidelines, there is no substitute for -trying out the different packages appropriate to your hardware. - -Any accelerated style has the same name as the corresponding standard -style, except that a suffix is appended. Otherwise, the syntax for -the command that uses the style is identical, their functionality is -the same, and the numerical results it produces should also be the -same, except for precision and round-off effects. - -For example, all of these styles are accelerated variants of the -Lennard-Jones "pair_style lj/cut"_pair_lj.html: - -"pair_style lj/cut/gpu"_pair_lj.html -"pair_style lj/cut/intel"_pair_lj.html -"pair_style lj/cut/kk"_pair_lj.html -"pair_style lj/cut/omp"_pair_lj.html -"pair_style lj/cut/opt"_pair_lj.html :ul - -To see what accelerate styles are currently available, see -"Section 3.5"_Section_commands.html#cmd_5 of the manual. The -doc pages for individual commands (e.g. "pair lj/cut"_pair_lj.html or -"fix nve"_fix_nve.html) also list any accelerated variants available -for that style. - -To use an accelerator package in LAMMPS, and one or more of the styles -it provides, follow these general steps. Details vary from package to -package and are explained in the individual accelerator doc pages, -listed above: - -build the accelerator library | - only for GPU package | -install the accelerator package | - make yes-opt, make yes-user-intel, etc | -add compile/link flags to Makefile.machine in src/MAKE | - only for USER-INTEL, KOKKOS, USER-OMP, OPT packages | -re-build LAMMPS | - make machine | -prepare and test a regular LAMMPS simulation | - lmp_machine -in in.script; mpirun -np 32 lmp_machine -in in.script | -enable specific accelerator support via '-k on' "command-line switch"_Section_start.html#start_6, | - only needed for KOKKOS package | -set any needed options for the package via "-pk" "command-line switch"_Section_start.html#start_6 or "package"_package.html command, | - only if defaults need to be changed | -use accelerated styles in your input via "-sf" "command-line switch"_Section_start.html#start_6 or "suffix"_suffix.html command | lmp_machine -in in.script -sf gpu -:tb(c=2,s=|) - -Note that the first 4 steps can be done as a single command with -suitable make command invocations. This is discussed in "Section -4"_Section_packages.html of the manual, and its use is -illustrated in the individual accelerator sections. Typically these -steps only need to be done once, to create an executable that uses one -or more accelerator packages. - -The last 4 steps can all be done from the command-line when LAMMPS is -launched, without changing your input script, as illustrated in the -individual accelerator sections. Or you can add -"package"_package.html and "suffix"_suffix.html commands to your input -script. - -NOTE: With a few exceptions, you can build a single LAMMPS executable -with all its accelerator packages installed. Note however that the -USER-INTEL and KOKKOS packages require you to choose one of their -hardware options when building for a specific platform. I.e. CPU or -Phi option for the USER-INTEL package. Or the OpenMP, Cuda, or Phi -option for the KOKKOS package. - -These are the exceptions. You cannot build a single executable with: - -both the USER-INTEL Phi and KOKKOS Phi options -the USER-INTEL Phi or Kokkos Phi option, and the GPU package :ul - -See the examples/accelerate/README and make.list files for sample -Make.py commands that build LAMMPS with any or all of the accelerator -packages. As an example, here is a command that builds with all the -GPU related packages installed (GPU, KOKKOS with Cuda), including -settings to build the needed auxiliary GPU libraries for Kepler GPUs: - -Make.py -j 16 -p omp gpu kokkos -cc nvcc wrap=mpi \ - -gpu mode=double arch=35 -kokkos cuda arch=35 lib-all file mpi :pre - -The examples/accelerate directory also has input scripts that can be -used with all of the accelerator packages. See its README file for -details. - -Likewise, the bench directory has FERMI and KEPLER and PHI -sub-directories with Make.py commands and input scripts for using all -the accelerator packages on various machines. See the README files in -those dirs. - -As mentioned above, the "Benchmark -page"_http://lammps.sandia.gov/bench.html of the LAMMPS web site gives -performance results for the various accelerator packages for several -of the standard LAMMPS benchmark problems, as a function of problem -size and number of compute nodes, on different hardware platforms. - -Here is a brief summary of what the various packages provide. Details -are in the individual accelerator sections. - -Styles with a "gpu" suffix are part of the GPU package, and can be run -on NVIDIA GPUs. The speed-up on a GPU depends on a variety of -factors, discussed in the accelerator sections. :ulb,l - -Styles with an "intel" suffix are part of the USER-INTEL -package. These styles support vectorized single and mixed precision -calculations, in addition to full double precision. In extreme cases, -this can provide speedups over 3.5x on CPUs. The package also -supports acceleration in "offload" mode to Intel(R) Xeon Phi(TM) -coprocessors. This can result in additional speedup over 2x depending -on the hardware configuration. :l - -Styles with a "kk" suffix are part of the KOKKOS package, and can be -run using OpenMP on multicore CPUs, on an NVIDIA GPU, or on an Intel -Xeon Phi in "native" mode. The speed-up depends on a variety of -factors, as discussed on the KOKKOS accelerator page. :l - -Styles with an "omp" suffix are part of the USER-OMP package and allow -a pair-style to be run in multi-threaded mode using OpenMP. This can -be useful on nodes with high-core counts when using less MPI processes -than cores is advantageous, e.g. when running with PPPM so that FFTs -are run on fewer MPI processors or when the many MPI tasks would -overload the available bandwidth for communication. :l - -Styles with an "opt" suffix are part of the OPT package and typically -speed-up the pairwise calculations of your simulation by 5-25% on a -CPU. :l -:ule - -The individual accelerator package doc pages explain: - -what hardware and software the accelerated package requires -how to build LAMMPS with the accelerated package -how to run with the accelerated package either via command-line switches or modifying the input script -speed-ups to expect -guidelines for best performance -restrictions :ul - -:line - -5.4 Comparison of various accelerator packages :h3,link(acc_4) - -NOTE: this section still needs to be re-worked with additional KOKKOS -and USER-INTEL information. - -The next section compares and contrasts the various accelerator -options, since there are multiple ways to perform OpenMP threading, -run on GPUs, and run on Intel Xeon Phi coprocessors. - -All 3 of these packages accelerate a LAMMPS calculation using NVIDIA -hardware, but they do it in different ways. - -As a consequence, for a particular simulation on specific hardware, -one package may be faster than the other. We give guidelines below, -but the best way to determine which package is faster for your input -script is to try both of them on your machine. See the benchmarking -section below for examples where this has been done. - -[Guidelines for using each package optimally:] - -The GPU package allows you to assign multiple CPUs (cores) to a single -GPU (a common configuration for "hybrid" nodes that contain multicore -CPU(s) and GPU(s)) and works effectively in this mode. :ulb,l - -The GPU package moves per-atom data (coordinates, forces) -back-and-forth between the CPU and GPU every timestep. The -KOKKOS/CUDA package only does this on timesteps when a CPU calculation -is required (e.g. to invoke a fix or compute that is non-GPU-ized). -Hence, if you can formulate your input script to only use GPU-ized -fixes and computes, and avoid doing I/O too often (thermo output, dump -file snapshots, restart files), then the data transfer cost of the -KOKKOS/CUDA package can be very low, causing it to run faster than the -GPU package. :l - -The GPU package is often faster than the KOKKOS/CUDA package, if the -number of atoms per GPU is smaller. The crossover point, in terms of -atoms/GPU at which the KOKKOS/CUDA package becomes faster depends -strongly on the pair style. For example, for a simple Lennard Jones -system the crossover (in single precision) is often about 50K-100K -atoms per GPU. When performing double precision calculations the -crossover point can be significantly smaller. :l - -Both packages compute bonded interactions (bonds, angles, etc) on the -CPU. If the GPU package is running with several MPI processes -assigned to one GPU, the cost of computing the bonded interactions is -spread across more CPUs and hence the GPU package can run faster. :l - -When using the GPU package with multiple CPUs assigned to one GPU, its -performance depends to some extent on high bandwidth between the CPUs -and the GPU. Hence its performance is affected if full 16 PCIe lanes -are not available for each GPU. In HPC environments this can be the -case if S2050/70 servers are used, where two devices generally share -one PCIe 2.0 16x slot. Also many multi-GPU mainboards do not provide -full 16 lanes to each of the PCIe 2.0 16x slots. :l -:ule - -[Differences between the two packages:] - -The GPU package accelerates only pair force, neighbor list, and PPPM -calculations. :ulb,l - -The GPU package requires neighbor lists to be built on the CPU when using -exclusion lists, hybrid pair styles, or a triclinic simulation box. :l -:ule diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index 7b9349a233..7948e0de32 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -1,4 +1,4 @@ -"Previous Section"_Section_start.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Section_packages.html :c +"Previous Section"_Section_start.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Packages.html :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -554,8 +554,8 @@ Fix styles :h3 See the "fix"_fix.html command for one-line descriptions of each style or click on the style itself for a full description. Some of the styles have accelerated versions, which can be used if LAMMPS is built -with the "appropriate accelerated package"_Section_accelerate.html. -This is indicated by additional letters in parenthesis: g = GPU, i = +with the "appropriate accelerated package"_Speed_packages.html. This +is indicated by additional letters in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. "adapt"_fix_adapt.html, @@ -775,9 +775,9 @@ See the "compute"_compute.html command for one-line descriptions of each style or click on the style itself for a full description. Some of the styles have accelerated versions, which can be used if LAMMPS is built with the "appropriate accelerated -package"_Section_accelerate.html. This is indicated by additional -letters in parenthesis: g = GPU, i = USER-INTEL, k = -KOKKOS, o = USER-OMP, t = OPT. +package"_Speed_packages.html. This is indicated by additional letters +in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = USER-OMP, t = +OPT. "aggregate/atom"_compute_cluster_atom.html, "angle"_compute_angle.html, @@ -920,9 +920,9 @@ See the "pair_style"_pair_style.html command for an overview of pair potentials. Click on the style itself for a full description. Many of the styles have accelerated versions, which can be used if LAMMPS is built with the "appropriate accelerated -package"_Section_accelerate.html. This is indicated by additional -letters in parenthesis: g = GPU, i = USER-INTEL, k = -KOKKOS, o = USER-OMP, t = OPT. +package"_Speed_packages.html. This is indicated by additional letters +in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = USER-OMP, t = +OPT. "none"_pair_none.html, "zero"_pair_zero.html, @@ -1142,9 +1142,9 @@ See the "bond_style"_bond_style.html command for an overview of bond potentials. Click on the style itself for a full description. Some of the styles have accelerated versions, which can be used if LAMMPS is built with the "appropriate accelerated -package"_Section_accelerate.html. This is indicated by additional -letters in parenthesis: g = GPU, i = USER-INTEL, k = -KOKKOS, o = USER-OMP, t = OPT. +package"_Speed_packages.html. This is indicated by additional letters +in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = USER-OMP, t = +OPT. "none"_bond_none.html, "zero"_bond_zero.html, @@ -1176,9 +1176,9 @@ See the "angle_style"_angle_style.html command for an overview of angle potentials. Click on the style itself for a full description. Some of the styles have accelerated versions, which can be used if LAMMPS is built with the "appropriate accelerated -package"_Section_accelerate.html. This is indicated by additional -letters in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = -USER-OMP, t = OPT. +package"_Speed_packages.html. This is indicated by additional letters +in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = USER-OMP, t = +OPT. "none"_angle_none.html, "zero"_angle_zero.html, @@ -1212,7 +1212,7 @@ See the "dihedral_style"_dihedral_style.html command for an overview of dihedral potentials. Click on the style itself for a full description. Some of the styles have accelerated versions, which can be used if LAMMPS is built with the "appropriate accelerated -package"_Section_accelerate.html. This is indicated by additional +package"_Speed_packages.html. This is indicated by additional letters in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = USER-OMP, t = OPT. @@ -1247,9 +1247,9 @@ See the "improper_style"_improper_style.html command for an overview of improper potentials. Click on the style itself for a full description. Some of the styles have accelerated versions, which can be used if LAMMPS is built with the "appropriate accelerated -package"_Section_accelerate.html. This is indicated by additional -letters in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = -USER-OMP, t = OPT. +package"_Speed_packages.html. This is indicated by additional letters +in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = USER-OMP, t = +OPT. "none"_improper_none.html, "zero"_improper_zero.html, @@ -1276,9 +1276,9 @@ See the "kspace_style"_kspace_style.html command for an overview of Kspace solvers. Click on the style itself for a full description. Some of the styles have accelerated versions, which can be used if LAMMPS is built with the "appropriate accelerated -package"_Section_accelerate.html. This is indicated by additional -letters in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = -USER-OMP, t = OPT. +package"_Speed_packages.html. This is indicated by additional letters +in parenthesis: g = GPU, i = USER-INTEL, k = KOKKOS, o = USER-OMP, t = +OPT. "ewald (o)"_kspace_style.html, "ewald/disp"_kspace_style.html, diff --git a/doc/src/Section_intro.txt b/doc/src/Section_intro.txt index c7cf5bf8d2..36a1181ca7 100644 --- a/doc/src/Section_intro.txt +++ b/doc/src/Section_intro.txt @@ -253,7 +253,7 @@ Specialized features :h4 LAMMPS can be built with optional packages which implement a variety of additional capabilities. An overview of all the packages is "given -here"_Section_packages.html. +here"_Packages.html. These are some LAMMPS capabilities which you may not think of as typical classical molecular dynamics options: diff --git a/doc/src/Section_start.txt b/doc/src/Section_start.txt index d8f340b179..cd445b3e14 100644 --- a/doc/src/Section_start.txt +++ b/doc/src/Section_start.txt @@ -119,10 +119,11 @@ lower-case name of the package, e.g. replica or user-misc. If you want to do one of the following: -use a LAMMPS command that requires an extra library (e.g. "dump image"_dump_image.html) -build with a package that requires an extra library -build with an accelerator package that requires special compiler/linker settings -run on a machine that has its own compilers, settings, or libraries :ul +use a LAMMPS command that requires an extra library (e.g. "dump +image"_dump_image.html) build with a package that requires an extra +library build with an accelerator package that requires special +compiler/linker settings run on a machine that has its own compilers, +settings, or libraries :ul then building LAMMPS is more complicated. You may need to find where extra libraries exist on your machine or install them if they don't. @@ -697,8 +698,8 @@ are always included, plus optional packages. Packages are groups of files that enable a specific set of features. For example, force fields for molecular systems or granular systems are in packages. -"Section 4"_Section_packages.html in the manual has details about all -the packages, which come in two flavors: [standard] and [user] +The "Packages"_Packages.html doc pages has details about all the +packages, which come in two flavors: [standard] and [user] packages. It also has specific instructions for building LAMMPS with any package which requires an extra library. General instructions are below. @@ -828,45 +829,47 @@ options. Packages that require extra libraries :h4,link(start_3_3) A few of the standard and user packages require extra libraries. See -"Section 4"_Section_packages.html for two tables of packages which -indicate which ones require libraries. For each such package, the -Section 4 doc page gives details on how to build the extra library, -including how to download it if necessary. The basic ideas are -summarized here. +the "Packages"_Packages.html doc pages for two tables of packages +which indicate which ones require libraries. For each such package, +the Section 4 doc page gives details on how to build the extra +library, including how to download it if necessary. The basic ideas +are summarized here. [System libraries:] -Packages in the tables "Section 4"_Section_packages.html with a "sys" -in the last column link to system libraries that typically already -exist on your machine. E.g. the python package links to a system -Python library. If your machine does not have the required library, -you will have to download and install it on your machine, in either -the system or user space. +Packages in the standard and user tables of the +"Packages"_Packages.html doc pages with a "sys" in the last column +link to system libraries that typically already exist on your machine. +E.g. the python package links to a system Python library. If your +machine does not have the required library, you will have to download +and install it on your machine, in either the system or user space. [Internal libraries:] -Packages in the tables "Section 4"_Section_packages.html with an "int" -in the last column link to internal libraries whose source code is -included with LAMMPS, in the lib/name directory where name is the -package name. You must first build the library in that directory -before building LAMMPS with that package installed. E.g. the gpu -package links to a library you build in the lib/gpu dir. You can -often do the build in one step by typing "make lib-name args=..." -from the src dir, with appropriate arguments. You can leave off the -args to see a help message. See "Section 4"_Section_packages.html for -details for each package. +Packages in the standard and user tables of the +"Packages"_Packages.html doc pages with an "int" in the last column +link to internal libraries whose source code is included with LAMMPS, +in the lib/name directory where name is the package name. You must +first build the library in that directory before building LAMMPS with +that package installed. E.g. the gpu package links to a library you +build in the lib/gpu dir. You can often do the build in one step by +typing "make lib-name args=..." from the src dir, with appropriate +arguments. You can leave off the args to see a help message. See the +"Packages details"_Packages_details.html doc page for details for each +package. [External libraries:] -Packages in the tables "Section 4"_Section_packages.html with an "ext" -in the last column link to external libraries whose source code is not -included with LAMMPS. You must first download and install the library -before building LAMMPS with that package installed. E.g. the voronoi -package links to the freely available "Voro++ library"_voro_home2. You -can often do the download/build in one step by typing "make lib-name +Packages in the standard and user tables of the +"Packages"_Packages.html doc pages with an "ext" in the last column +link to external libraries whose source code is not included with +LAMMPS. You must first download and install the library before +building LAMMPS with that package installed. E.g. the voronoi package +links to the freely available "Voro++ library"_voro_home2. You can +often do the download/build in one step by typing "make lib-name args=..." from the src dir, with appropriate arguments. You can leave -off the args to see a help message. See "Section -4"_Section_packages.html for details for each package. +off the args to see a help message. See the "Packages +details"_Packages_details.html doc page for details for each package. :link(voro_home2,http://math.lbl.gov/voro++) @@ -888,9 +891,9 @@ copied from a lib/name/Makefile.lammps.* file when the library is built. If those settings are not correct for your machine you will need to edit or create an appropriate Makefile.lammps file. -Package-specific details for these steps are given in "Section -4"_Section_packages.html an in README files in the lib/name -directories. +Package-specific details for these steps are given on the "Packages +details"_Packages_details.html doc page and in README files in the +lib/name directories. [Compiler options needed for accelerator packages:] @@ -901,14 +904,14 @@ these accelerator packages for optimal performance requires specific settings in the Makefile.machine file you use. A summary of the Makefile.machine settings needed for each of these -packages is given in "Section 4"_Section_packages.html. More info is -given on the doc pages that describe each package in detail: +packages is given on the "Packages"_Packages.html doc pages. More +info is given on the doc pages that describe each package in detail: -5.3.1 "USER-INTEL package"_accelerate_intel.html -5.3.2 "GPU package"_accelerate_intel.html -5.3.3 "KOKKOS package"_accelerate_kokkos.html -5.3.4 "USER-OMP package"_accelerate_omp.html -5.3.5 "OPT package"_accelerate_opt.html :all(b) +"USER-INTEL package"_Speed_intel.html +"GPU package"_Speed_gpu.html +"KOKKOS package"_Speed_kokkos.html +"USER-OMP package"_Speed_omp.html +"OPT package"_Speed_opt.html :all(b) You can also use or examine the following machine Makefiles in src/MAKE/OPTIONS, which include the settings. Note that the @@ -1276,8 +1279,8 @@ Either the full word or an abbreviation can be used for the keywords. Note that the keywords do not use a leading minus sign. I.e. the keyword is "t", not "-t". Also note that each of the keywords has a default setting. Example of when to use these options and what -settings to use on different platforms is given in "Section -5.3"_Section_accelerate.html#acc_3. +settings to use on different platforms is given on the "Speed +kokkos"_Speed_kokkos.html doc page. d or device g or gpus @@ -1461,8 +1464,7 @@ cores within each node are ranked in a desired order. Or when using the "run_style verlet/split"_run_style.html command with 2 partitions to insure that a specific Kspace processor (in the 2nd partition) is matched up with a specific set of processors in the 1st partition. -See the "Section 5"_Section_accelerate.html doc pages for -more details. +See the "Speed tips"_Speed_tips.html doc page for more details. If the keyword {nth} is used with a setting {N}, then it means every Nth processor will be moved to the end of the ranking. This is useful diff --git a/doc/src/Speed.txt b/doc/src/Speed.txt new file mode 100644 index 0000000000..2339a11c06 --- /dev/null +++ b/doc/src/Speed.txt @@ -0,0 +1,69 @@ +"Previous Section"_Package.html - "LAMMPS WWW Site"_lws - +"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next +Section"_Section_howto.html :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Accelerate performance :h2 + +This section describes various methods for improving LAMMPS +performance for different classes of problems running on different +kinds of machines. + +There are two thrusts to the discussion that follows. The first is +using code options that implement alternate algorithms that can +speed-up a simulation. The second is to use one of the several +accelerator packages provided with LAMMPS that contain code optimized +for certain kinds of hardware, including multi-core CPUs, GPUs, and +Intel Xeon Phi coprocessors. + +The "Benchmark page"_http://lammps.sandia.gov/bench.html of the LAMMPS +web site gives performance results for the various accelerator +packages discussed on the "Speed packages"_Speed_packages.html doc +page, for several of the standard LAMMPS benchmark problems, as a +function of problem size and number of compute nodes, on different +hardware platforms. + + + + + +"Benchmarks"_Speed_bench.html +"Measuring performance"_Speed_measure.html :all(b) + +"General tips"_Speed_tips.html :all(b) + +"Accelerator packages"_Speed_packages.html +"GPU package"_Speed_gpu.html +"USER-INTEL package"_Speed_intel.html +"KOKKOS package"_Speed_kokkos.html +"USER-OMP package"_Speed_omp.html +"OPT package"_Speed_opt.html +"Comparison of accelerator packages"_Speed_compare.html :all(b) + + diff --git a/doc/src/Section_perf.txt b/doc/src/Speed_bench.txt similarity index 86% rename from doc/src/Section_perf.txt rename to doc/src/Speed_bench.txt index f320780129..dc76588c11 100644 --- a/doc/src/Section_perf.txt +++ b/doc/src/Speed_bench.txt @@ -1,6 +1,5 @@ -"Previous Section"_Examples.html - "LAMMPS WWW Site"_lws - "LAMMPS -Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Tools.html -:c +"Higher level section"_Speed.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -8,12 +7,12 @@ Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Tools.html :line -8. Performance & scalability :h2 +Benchmarks :h3 -Current LAMMPS performance is discussed on the Benchmarks page of the -"LAMMPS WWW Site"_lws where CPU timings and parallel efficiencies are -listed. The page has several sections, which are briefly described -below: +Current LAMMPS performance is discussed on the "Benchmarks +page"_http://lammps.sandia.gov/bench.html of the "LAMMPS website"_lws +where timings and parallel efficiencies are listed. The page has +several sections, which are briefly described below: CPU performance on 5 standard problems, strong and weak scaling GPU and Xeon Phi performance on same and related problems @@ -53,8 +52,8 @@ of these 5 problems on 1 or 4 cores of Linux desktop. The bench/FERMI and bench/KEPLER dirs have input files and scripts and instructions for running the same (or similar) problems using OpenMP or GPU or Xeon Phi acceleration options. See the README files in those dirs and the -"Section 5.3"_Section_accelerate.html#acc_3 doc pages for -instructions on how to build LAMMPS and run on that kind of hardware. +"Speed packages"_Speed_packages.html doc pages for instructions on how +to build LAMMPS and run on that kind of hardware. The bench/POTENTIALS directory has input files which correspond to the table of results on the diff --git a/doc/src/Speed_compare.txt b/doc/src/Speed_compare.txt new file mode 100644 index 0000000000..6c947b9662 --- /dev/null +++ b/doc/src/Speed_compare.txt @@ -0,0 +1,73 @@ +"Higher level section"_Speed.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Comparison of various accelerator packages :h3 + +NOTE: this section still needs to be re-worked with additional KOKKOS +and USER-INTEL information. + +The next section compares and contrasts the various accelerator +options, since there are multiple ways to perform OpenMP threading, +run on GPUs, and run on Intel Xeon Phi coprocessors. + +All 3 of these packages accelerate a LAMMPS calculation using NVIDIA +hardware, but they do it in different ways. + +As a consequence, for a particular simulation on specific hardware, +one package may be faster than the other. We give guidelines below, +but the best way to determine which package is faster for your input +script is to try both of them on your machine. See the benchmarking +section below for examples where this has been done. + +[Guidelines for using each package optimally:] + +The GPU package allows you to assign multiple CPUs (cores) to a single +GPU (a common configuration for "hybrid" nodes that contain multicore +CPU(s) and GPU(s)) and works effectively in this mode. :ulb,l + +The GPU package moves per-atom data (coordinates, forces) +back-and-forth between the CPU and GPU every timestep. The +KOKKOS/CUDA package only does this on timesteps when a CPU calculation +is required (e.g. to invoke a fix or compute that is non-GPU-ized). +Hence, if you can formulate your input script to only use GPU-ized +fixes and computes, and avoid doing I/O too often (thermo output, dump +file snapshots, restart files), then the data transfer cost of the +KOKKOS/CUDA package can be very low, causing it to run faster than the +GPU package. :l + +The GPU package is often faster than the KOKKOS/CUDA package, if the +number of atoms per GPU is smaller. The crossover point, in terms of +atoms/GPU at which the KOKKOS/CUDA package becomes faster depends +strongly on the pair style. For example, for a simple Lennard Jones +system the crossover (in single precision) is often about 50K-100K +atoms per GPU. When performing double precision calculations the +crossover point can be significantly smaller. :l + +Both packages compute bonded interactions (bonds, angles, etc) on the +CPU. If the GPU package is running with several MPI processes +assigned to one GPU, the cost of computing the bonded interactions is +spread across more CPUs and hence the GPU package can run faster. :l + +When using the GPU package with multiple CPUs assigned to one GPU, its +performance depends to some extent on high bandwidth between the CPUs +and the GPU. Hence its performance is affected if full 16 PCIe lanes +are not available for each GPU. In HPC environments this can be the +case if S2050/70 servers are used, where two devices generally share +one PCIe 2.0 16x slot. Also many multi-GPU mainboards do not provide +full 16 lanes to each of the PCIe 2.0 16x slots. :l +:ule + +[Differences between the two packages:] + +The GPU package accelerates only pair force, neighbor list, and PPPM +calculations. :ulb,l + +The GPU package requires neighbor lists to be built on the CPU when using +exclusion lists, hybrid pair styles, or a triclinic simulation box. :l +:ule diff --git a/doc/src/accelerate_gpu.txt b/doc/src/Speed_gpu.txt similarity index 96% rename from doc/src/accelerate_gpu.txt rename to doc/src/Speed_gpu.txt index 816a31c788..d6ebbf8069 100644 --- a/doc/src/accelerate_gpu.txt +++ b/doc/src/Speed_gpu.txt @@ -1,5 +1,5 @@ -"Previous Section"_Section_packages.html - "LAMMPS WWW Site"_lws - -"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c +"Higher level section"_Speed.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -7,9 +7,7 @@ :line -"Return to Section accelerate overview"_Section_accelerate.html - -5.3.1 GPU package :h5 +GPU package :h3 The GPU package was developed by Mike Brown at ORNL and his collaborators, particularly Trung Nguyen (ORNL). It provides GPU @@ -72,10 +70,9 @@ Run lammps/lib/gpu/nvc_get_devices (after building the GPU library, see below) t [Building LAMMPS with the GPU package:] This requires two steps (a,b): build the GPU library, then build -LAMMPS with the GPU package. - -You can do both these steps in one line as described in -"Section 4"_Section_packages.html of the manual. +LAMMPS with the GPU package. You can do both these steps in one line +as described on the "Packages details"_Packages_details.html#GPU doc +page. Or you can follow these two (a,b) steps: diff --git a/doc/src/accelerate_intel.txt b/doc/src/Speed_intel.txt similarity index 98% rename from doc/src/accelerate_intel.txt rename to doc/src/Speed_intel.txt index 71f5185b15..acf5c3f2f9 100644 --- a/doc/src/accelerate_intel.txt +++ b/doc/src/Speed_intel.txt @@ -1,5 +1,5 @@ -"Previous Section"_Section_packages.html - "LAMMPS WWW Site"_lws - -"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c +"Higher level section"_Speed.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -7,9 +7,7 @@ :line -"Return to Section accelerate overview"_Section_accelerate.html - -5.3.2 USER-INTEL package :h5 +USER-INTEL package :h3 The USER-INTEL package is maintained by Mike Brown at Intel Corporation. It provides two methods for accelerating simulations, @@ -233,9 +231,9 @@ source /opt/intel/parallel_studio_xe_2016.3.067/psxevars.sh # or psxevars.csh for C-shell make intel_cpu_intelmpi :pre -Alternatively this can be done as a single command with -suitable make command invocations. This is discussed in "Section -4"_Section_packages.html of the manual. +Alternatively this can be done as a single command with suitable make +command invocations, as described on the "Packages +details"_Packages_details.html#USER-INTEL doc page. Note that if you build with support for a Phi coprocessor, the same binary can be used on nodes with or without coprocessors installed. diff --git a/doc/src/accelerate_kokkos.txt b/doc/src/Speed_kokkos.txt similarity index 97% rename from doc/src/accelerate_kokkos.txt rename to doc/src/Speed_kokkos.txt index 0c9178d6e4..8e01db7bdc 100644 --- a/doc/src/accelerate_kokkos.txt +++ b/doc/src/Speed_kokkos.txt @@ -1,5 +1,5 @@ -"Previous Section"_Section_packages.html - "LAMMPS WWW Site"_lws - -"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c +"Higher level section"_Speed.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -7,9 +7,7 @@ :line -"Return to Section accelerate overview"_Section_accelerate.html - -5.3.3 KOKKOS package :h5 +KOKKOS package :h3 Kokkos is a templated C++ library that provides abstractions to allow a single implementation of an application kernel (e.g. a pair style) to run efficiently on @@ -85,10 +83,10 @@ make kokkos_phi :pre [Compile for CPUs and GPUs (with OpenMPI or MPICH):] -NOTE: To build with Kokkos support for NVIDIA GPUs, NVIDIA CUDA software -version 7.5 or later must be installed on your system. See the -discussion for the "GPU"_accelerate_gpu.html package for details of -how to check and do this. +NOTE: To build with Kokkos support for NVIDIA GPUs, NVIDIA CUDA +software version 7.5 or later must be installed on your system. See +the discussion for the "GPU package"_Speed_gpu.html for details of how +to check and do this. use a C++11 compatible compiler and set KOKKOS_ARCH variable in /src/MAKE/OPTIONS/Makefile.kokkos_cuda_mpi for both GPU and CPU as described @@ -434,8 +432,8 @@ migrate during a simulation. KOKKOS_USE_TPLS=hwloc should always be used if running with KOKKOS_DEVICES=Pthreads for pthreads. It is not necessary for KOKKOS_DEVICES=OpenMP for OpenMP, because OpenMP provides alternative methods via environment variables for binding -threads to hardware cores. More info on binding threads to cores is -given in "Section 5.3"_Section_accelerate.html#acc_3. +threads to hardware cores. More info on binding threads to cores is +given on the "Speed omp"_Speed_omp.html doc page. KOKKOS_USE_TPLS=librt enables use of a more accurate timer mechanism on most Unix platforms. This library is not available on all diff --git a/doc/src/Speed_measure.txt b/doc/src/Speed_measure.txt new file mode 100644 index 0000000000..03c0345c20 --- /dev/null +++ b/doc/src/Speed_measure.txt @@ -0,0 +1,55 @@ +"Higher level section"_Speed.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Measuring performance :h3 + +Before trying to make your simulation run faster, you should +understand how it currently performs and where the bottlenecks are. + +The best way to do this is run the your system (actual number of +atoms) for a modest number of timesteps (say 100 steps) on several +different processor counts, including a single processor if possible. +Do this for an equilibrium version of your system, so that the +100-step timings are representative of a much longer run. There is +typically no need to run for 1000s of timesteps to get accurate +timings; you can simply extrapolate from short runs. + +For the set of runs, look at the timing data printed to the screen and +log file at the end of each LAMMPS run. "This +section"_Section_start.html#start_7 of the manual has an overview. + +Running on one (or a few processors) should give a good estimate of +the serial performance and what portions of the timestep are taking +the most time. Running the same problem on a few different processor +counts should give an estimate of parallel scalability. I.e. if the +simulation runs 16x faster on 16 processors, its 100% parallel +efficient; if it runs 8x faster on 16 processors, it's 50% efficient. + +The most important data to look at in the timing info is the timing +breakdown and relative percentages. For example, trying different +options for speeding up the long-range solvers will have little impact +if they only consume 10% of the run time. If the pairwise time is +dominating, you may want to look at GPU or OMP versions of the pair +style, as discussed below. Comparing how the percentages change as +you increase the processor count gives you a sense of how different +operations within the timestep are scaling. Note that if you are +running with a Kspace solver, there is additional output on the +breakdown of the Kspace time. For PPPM, this includes the fraction +spent on FFTs, which can be communication intensive. + +Another important detail in the timing info are the histograms of +atoms counts and neighbor counts. If these vary widely across +processors, you have a load-imbalance issue. This often results in +inaccurate relative timing data, because processors have to wait when +communication occurs for other processors to catch up. Thus the +reported times for "Communication" or "Other" may be higher than they +really are, due to load-imbalance. If this is an issue, you can +uncomment the MPI_Barrier() lines in src/timer.cpp, and recompile +LAMMPS, to obtain synchronized timings. + diff --git a/doc/src/accelerate_omp.txt b/doc/src/Speed_omp.txt similarity index 96% rename from doc/src/accelerate_omp.txt rename to doc/src/Speed_omp.txt index fa7bef1a52..3700580225 100644 --- a/doc/src/accelerate_omp.txt +++ b/doc/src/Speed_omp.txt @@ -1,5 +1,5 @@ -"Previous Section"_Section_packages.html - "LAMMPS WWW Site"_lws - -"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c +"Higher level section"_Speed.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -7,9 +7,7 @@ :line -"Return to Section 5 overview"_Section_accelerate.html - -5.3.4 USER-OMP package :h5 +USER-OMP package :h3 The USER-OMP package was developed by Axel Kohlmeyer at Temple University. It provides multi-threaded versions of most pair styles, @@ -39,7 +37,8 @@ each MPI task running on a CPU. The lines above illustrate how to include/build with the USER-OMP package in two steps, using the "make" command. Or how to do it with -one command as described in "Section 4"_Section_packages.html of the manual. +one command as described on the "Packages +details"_Packages_details.html#USER-OMP doc page. Note that the CCFLAGS and LINKFLAGS settings in Makefile.machine must include "-fopenmp". Likewise, if you use an Intel compiler, the diff --git a/doc/src/accelerate_opt.txt b/doc/src/Speed_opt.txt similarity index 86% rename from doc/src/accelerate_opt.txt rename to doc/src/Speed_opt.txt index 845264b522..7d0d7169f0 100644 --- a/doc/src/accelerate_opt.txt +++ b/doc/src/Speed_opt.txt @@ -1,5 +1,5 @@ -"Previous Section"_Section_packages.html - "LAMMPS WWW Site"_lws - -"LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c +"Higher level section"_Speed.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) @@ -7,9 +7,7 @@ :line -"Return to Section accelerate overview"_Section_accelerate.html - -5.3.5 OPT package :h5 +OPT package :h3 The OPT package was developed by James Fischer (High Performance Technologies), David Richie, and Vincent Natoli (Stone Ridge @@ -34,7 +32,8 @@ None. The lines above illustrate how to build LAMMPS with the OPT package in two steps, using the "make" command. Or how to do it with one command -as described in "Section 4"_Section_packages.html of the manual. +as described on the "Packages details"_Packages_details.html#OPT doc +page. Note that if you use an Intel compiler to build with the OPT package, the CCFLAGS setting in your Makefile.machine must include "-restrict". diff --git a/doc/src/Speed_packages.txt b/doc/src/Speed_packages.txt new file mode 100644 index 0000000000..18850d52e0 --- /dev/null +++ b/doc/src/Speed_packages.txt @@ -0,0 +1,191 @@ +"Higher level section"_Speed.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +Accelerator packages :h3 + +Accelerated versions of various "pair_style"_pair_style.html, +"fixes"_fix.html, "computes"_compute.html, and other commands have +been added to LAMMPS, which will typically run faster than the +standard non-accelerated versions. Some require appropriate hardware +to be present on your system, e.g. GPUs or Intel Xeon Phi +coprocessors. + +All of these commands are in packages provided with LAMMPS. An +overview of packages is give on the "Packages"_Packages.html doc +pages. + +These are the accelerator packages currently in LAMMPS, either as +standard or user packages: + +"GPU Package"_accelerate_gpu.html : for NVIDIA GPUs as well as OpenCL support +"USER-INTEL Package"_accelerate_intel.html : for Intel CPUs and Intel Xeon Phi +"KOKKOS Package"_accelerate_kokkos.html : for Nvidia GPUs, Intel Xeon Phi, and OpenMP threading +"USER-OMP Package"_accelerate_omp.html : for OpenMP threading and generic CPU optimizations +"OPT Package"_accelerate_opt.html : generic CPU optimizations :tb(s=:) + + + +Inverting this list, LAMMPS currently has acceleration support for +three kinds of hardware, via the listed packages: + +Many-core CPUs : "USER-INTEL"_accelerate_intel.html, "KOKKOS"_accelerate_kokkos.html, "USER-OMP"_accelerate_omp.html, "OPT"_accelerate_opt.html packages +NVIDIA GPUs : "GPU"_accelerate_gpu.html, "KOKKOS"_accelerate_kokkos.html packages +Intel Phi : "USER-INTEL"_accelerate_intel.html, "KOKKOS"_accelerate_kokkos.html packages :tb(s=:) + +Which package is fastest for your hardware may depend on the size +problem you are running and what commands (accelerated and +non-accelerated) are invoked by your input script. While these doc +pages include performance guidelines, there is no substitute for +trying out the different packages appropriate to your hardware. + +Any accelerated style has the same name as the corresponding standard +style, except that a suffix is appended. Otherwise, the syntax for +the command that uses the style is identical, their functionality is +the same, and the numerical results it produces should also be the +same, except for precision and round-off effects. + +For example, all of these styles are accelerated variants of the +Lennard-Jones "pair_style lj/cut"_pair_lj.html: + +"pair_style lj/cut/gpu"_pair_lj.html +"pair_style lj/cut/intel"_pair_lj.html +"pair_style lj/cut/kk"_pair_lj.html +"pair_style lj/cut/omp"_pair_lj.html +"pair_style lj/cut/opt"_pair_lj.html :ul + +To see what accelerate styles are currently available, see +"Section 3.5"_Section_commands.html#cmd_5 of the manual. The +doc pages for individual commands (e.g. "pair lj/cut"_pair_lj.html or +"fix nve"_fix_nve.html) also list any accelerated variants available +for that style. + +To use an accelerator package in LAMMPS, and one or more of the styles +it provides, follow these general steps. Details vary from package to +package and are explained in the individual accelerator doc pages, +listed above: + +build the accelerator library | + only for GPU package | +install the accelerator package | + make yes-opt, make yes-user-intel, etc | +add compile/link flags to Makefile.machine in src/MAKE | + only for USER-INTEL, KOKKOS, USER-OMP, OPT packages | +re-build LAMMPS | + make machine | +prepare and test a regular LAMMPS simulation | + lmp_machine -in in.script; mpirun -np 32 lmp_machine -in in.script | +enable specific accelerator support via '-k on' "command-line switch"_Section_start.html#start_6, | + only needed for KOKKOS package | +set any needed options for the package via "-pk" "command-line switch"_Section_start.html#start_6 or "package"_package.html command, | + only if defaults need to be changed | +use accelerated styles in your input via "-sf" "command-line switch"_Section_start.html#start_6 or "suffix"_suffix.html command | lmp_machine -in in.script -sf gpu +:tb(c=2,s=|) + +Note that the first 4 steps can be done as a single command with +suitable make command invocations. This is discussed on the +"Packages"_Packages.html doc pages, and its use is illustrated in the +individual accelerator sections. Typically these steps only need to +be done once, to create an executable that uses one or more +accelerator packages. + +The last 4 steps can all be done from the command-line when LAMMPS is +launched, without changing your input script, as illustrated in the +individual accelerator sections. Or you can add +"package"_package.html and "suffix"_suffix.html commands to your input +script. + +NOTE: With a few exceptions, you can build a single LAMMPS executable +with all its accelerator packages installed. Note however that the +USER-INTEL and KOKKOS packages require you to choose one of their +hardware options when building for a specific platform. I.e. CPU or +Phi option for the USER-INTEL package. Or the OpenMP, Cuda, or Phi +option for the KOKKOS package. + +These are the exceptions. You cannot build a single executable with: + +both the USER-INTEL Phi and KOKKOS Phi options +the USER-INTEL Phi or Kokkos Phi option, and the GPU package :ul + +See the examples/accelerate/README and make.list files for sample +Make.py commands that build LAMMPS with any or all of the accelerator +packages. As an example, here is a command that builds with all the +GPU related packages installed (GPU, KOKKOS with Cuda), including +settings to build the needed auxiliary GPU libraries for Kepler GPUs: + +Make.py -j 16 -p omp gpu kokkos -cc nvcc wrap=mpi \ + -gpu mode=double arch=35 -kokkos cuda arch=35 lib-all file mpi :pre + +The examples/accelerate directory also has input scripts that can be +used with all of the accelerator packages. See its README file for +details. + +Likewise, the bench directory has FERMI and KEPLER and PHI +sub-directories with Make.py commands and input scripts for using all +the accelerator packages on various machines. See the README files in +those dirs. + +As mentioned above, the "Benchmark +page"_http://lammps.sandia.gov/bench.html of the LAMMPS web site gives +performance results for the various accelerator packages for several +of the standard LAMMPS benchmark problems, as a function of problem +size and number of compute nodes, on different hardware platforms. + +Here is a brief summary of what the various packages provide. Details +are in the individual accelerator sections. + +Styles with a "gpu" suffix are part of the GPU package, and can be run +on NVIDIA GPUs. The speed-up on a GPU depends on a variety of +factors, discussed in the accelerator sections. :ulb,l + +Styles with an "intel" suffix are part of the USER-INTEL +package. These styles support vectorized single and mixed precision +calculations, in addition to full double precision. In extreme cases, +this can provide speedups over 3.5x on CPUs. The package also +supports acceleration in "offload" mode to Intel(R) Xeon Phi(TM) +coprocessors. This can result in additional speedup over 2x depending +on the hardware configuration. :l + +Styles with a "kk" suffix are part of the KOKKOS package, and can be +run using OpenMP on multicore CPUs, on an NVIDIA GPU, or on an Intel +Xeon Phi in "native" mode. The speed-up depends on a variety of +factors, as discussed on the KOKKOS accelerator page. :l + +Styles with an "omp" suffix are part of the USER-OMP package and allow +a pair-style to be run in multi-threaded mode using OpenMP. This can +be useful on nodes with high-core counts when using less MPI processes +than cores is advantageous, e.g. when running with PPPM so that FFTs +are run on fewer MPI processors or when the many MPI tasks would +overload the available bandwidth for communication. :l + +Styles with an "opt" suffix are part of the OPT package and typically +speed-up the pairwise calculations of your simulation by 5-25% on a +CPU. :l +:ule + +The individual accelerator package doc pages explain: + +what hardware and software the accelerated package requires +how to build LAMMPS with the accelerated package +how to run with the accelerated package either via command-line switches or modifying the input script +speed-ups to expect +guidelines for best performance +restrictions :ul + diff --git a/doc/src/Speed_tips.txt b/doc/src/Speed_tips.txt new file mode 100644 index 0000000000..c0d360cd8e --- /dev/null +++ b/doc/src/Speed_tips.txt @@ -0,0 +1,63 @@ +"Higher level section"_Speed.html - "LAMMPS WWW Site"_lws - "LAMMPS +Documentation"_ld - "LAMMPS Commands"_lc :c + +:link(lws,http://lammps.sandia.gov) +:link(ld,Manual.html) +:link(lc,Section_commands.html#comm) + +:line + +General tips :h3 + +NOTE: this section 5.2 is still a work in progress + +Here is a list of general ideas for improving simulation performance. +Most of them are only applicable to certain models and certain +bottlenecks in the current performance, so let the timing data you +generate be your guide. It is hard, if not impossible, to predict how +much difference these options will make, since it is a function of +problem size, number of processors used, and your machine. There is +no substitute for identifying performance bottlenecks, and trying out +various options. + +make individual pages for these, or one for PPPM +one for timestepping, etc +one for balancing +or proc layout + +rRESPA +2-FFT PPPM +Staggered PPPM +single vs double PPPM +partial charge PPPM +verlet/split run style +processor command for proc layout and numa layout +load-balancing: balance and fix balance :ul + +2-FFT PPPM, also called {analytic differentiation} or {ad} PPPM, uses +2 FFTs instead of the 4 FFTs used by the default {ik differentiation} +PPPM. However, 2-FFT PPPM also requires a slightly larger mesh size to +achieve the same accuracy as 4-FFT PPPM. For problems where the FFT +cost is the performance bottleneck (typically large problems running +on many processors), 2-FFT PPPM may be faster than 4-FFT PPPM. + +Staggered PPPM performs calculations using two different meshes, one +shifted slightly with respect to the other. This can reduce force +aliasing errors and increase the accuracy of the method, but also +doubles the amount of work required. For high relative accuracy, using +staggered PPPM allows one to half the mesh size in each dimension as +compared to regular PPPM, which can give around a 4x speedup in the +kspace time. However, for low relative accuracy, using staggered PPPM +gives little benefit and can be up to 2x slower in the kspace +time. For example, the rhodopsin benchmark was run on a single +processor, and results for kspace time vs. relative accuracy for the +different methods are shown in the figure below. For this system, +staggered PPPM (using ik differentiation) becomes useful when using a +relative accuracy of slightly greater than 1e-5 and above. + +:c,image(JPG/rhodo_staggered.jpg) + +NOTE: Using staggered PPPM may not give the same increase in accuracy +of energy and pressure as it does in forces, so some caution must be +used if energy and/or pressure are quantities of interest, such as +when using a barostat. diff --git a/doc/src/angle_charmm.txt b/doc/src/angle_charmm.txt index 7ff7ef8fd4..fe109d24fb 100644 --- a/doc/src/angle_charmm.txt +++ b/doc/src/angle_charmm.txt @@ -51,10 +51,9 @@ internally; hence the units of K are in energy/radian^2. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -66,8 +65,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_class2.txt b/doc/src/angle_class2.txt index d4330139c9..c13a64afb6 100644 --- a/doc/src/angle_class2.txt +++ b/doc/src/angle_class2.txt @@ -83,10 +83,9 @@ same value from the Ea formula. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -98,8 +97,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_cosine.txt b/doc/src/angle_cosine.txt index c0ce3c9301..99264b02a6 100644 --- a/doc/src/angle_cosine.txt +++ b/doc/src/angle_cosine.txt @@ -38,10 +38,9 @@ K (energy) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -53,8 +52,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_cosine_delta.txt b/doc/src/angle_cosine_delta.txt index 830fd6db58..052300412f 100644 --- a/doc/src/angle_cosine_delta.txt +++ b/doc/src/angle_cosine_delta.txt @@ -43,10 +43,9 @@ internally. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -58,8 +57,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_cosine_periodic.txt b/doc/src/angle_cosine_periodic.txt index b5c53b1b0f..4bedae3246 100644 --- a/doc/src/angle_cosine_periodic.txt +++ b/doc/src/angle_cosine_periodic.txt @@ -51,10 +51,9 @@ geometry. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -66,8 +65,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_cosine_shift.txt b/doc/src/angle_cosine_shift.txt index 6ed9fe2150..185b9f5309 100644 --- a/doc/src/angle_cosine_shift.txt +++ b/doc/src/angle_cosine_shift.txt @@ -41,10 +41,9 @@ theta (angle) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -56,8 +55,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_cosine_shift_exp.txt b/doc/src/angle_cosine_shift_exp.txt index 44a68c1087..e5c7fdd709 100644 --- a/doc/src/angle_cosine_shift_exp.txt +++ b/doc/src/angle_cosine_shift_exp.txt @@ -53,10 +53,9 @@ A (real number) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -68,8 +67,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_cosine_squared.txt b/doc/src/angle_cosine_squared.txt index 065cdad542..e85c514d1e 100644 --- a/doc/src/angle_cosine_squared.txt +++ b/doc/src/angle_cosine_squared.txt @@ -43,10 +43,9 @@ internally. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -58,8 +57,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_dipole.txt b/doc/src/angle_dipole.txt index 34cc8c153c..31ae2e9464 100644 --- a/doc/src/angle_dipole.txt +++ b/doc/src/angle_dipole.txt @@ -71,10 +71,9 @@ gamma0 (degrees) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -86,8 +85,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restrictions:] diff --git a/doc/src/angle_fourier.txt b/doc/src/angle_fourier.txt index da39e7cf32..18eb56b478 100644 --- a/doc/src/angle_fourier.txt +++ b/doc/src/angle_fourier.txt @@ -39,10 +39,9 @@ C2 (real) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -54,8 +53,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_fourier_simple.txt b/doc/src/angle_fourier_simple.txt index 5adda6cb32..6faff5f10d 100644 --- a/doc/src/angle_fourier_simple.txt +++ b/doc/src/angle_fourier_simple.txt @@ -38,10 +38,9 @@ n (real) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -53,8 +52,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_harmonic.txt b/doc/src/angle_harmonic.txt index 4c74763964..fe803be623 100644 --- a/doc/src/angle_harmonic.txt +++ b/doc/src/angle_harmonic.txt @@ -45,10 +45,9 @@ internally; hence the units of K are in energy/radian^2. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -60,8 +59,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_quartic.txt b/doc/src/angle_quartic.txt index f7640bdfbc..a31214f435 100644 --- a/doc/src/angle_quartic.txt +++ b/doc/src/angle_quartic.txt @@ -45,10 +45,9 @@ internally; hence the units of K are in energy/radian^2. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -60,8 +59,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/angle_table.txt b/doc/src/angle_table.txt index bd6e167bd8..29b56875e7 100644 --- a/doc/src/angle_table.txt +++ b/doc/src/angle_table.txt @@ -124,10 +124,9 @@ one that matches the specified keyword. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -139,8 +138,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/atom_style.txt b/doc/src/atom_style.txt index 442bb5ac70..0e6aa8a033 100644 --- a/doc/src/atom_style.txt +++ b/doc/src/atom_style.txt @@ -261,10 +261,10 @@ styles; see the "Modify"_Modify.html doc page. Styles with a {kk} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to -run faster, depending on your available hardware, as discussed in -"Section 5"_Section_accelerate.html of the manual. The -accelerated styles take the same arguments and should produce the same -results, except for round-off and precision issues. +run faster, depending on your available hardware, as discussed in on +the "Speed packages"_Speed_packages.html doc page. The accelerated +styles take the same arguments and should produce the same results, +except for round-off and precision issues. Note that other acceleration packages in LAMMPS, specifically the GPU, USER-INTEL, USER-OMP, and OPT packages do not use accelerated atom @@ -279,8 +279,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_7 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restrictions:] diff --git a/doc/src/bond_class2.txt b/doc/src/bond_class2.txt index 9687a63168..049482c973 100644 --- a/doc/src/bond_class2.txt +++ b/doc/src/bond_class2.txt @@ -44,10 +44,9 @@ K4 (energy/distance^4) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -59,8 +58,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/bond_fene.txt b/doc/src/bond_fene.txt index 9050c3bf5c..be154a53b1 100644 --- a/doc/src/bond_fene.txt +++ b/doc/src/bond_fene.txt @@ -47,10 +47,9 @@ sigma (distance) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -62,8 +61,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/bond_fene_expand.txt b/doc/src/bond_fene_expand.txt index ff687444a9..77ebd977c8 100644 --- a/doc/src/bond_fene_expand.txt +++ b/doc/src/bond_fene_expand.txt @@ -50,10 +50,9 @@ delta (distance) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -65,8 +64,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/bond_gromos.txt b/doc/src/bond_gromos.txt index cc3ff75878..7a56cb3afa 100644 --- a/doc/src/bond_gromos.txt +++ b/doc/src/bond_gromos.txt @@ -40,10 +40,9 @@ r0 (distance) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -55,8 +54,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/bond_harmonic.txt b/doc/src/bond_harmonic.txt index c18a7e0fd4..54e89fcc72 100644 --- a/doc/src/bond_harmonic.txt +++ b/doc/src/bond_harmonic.txt @@ -42,10 +42,9 @@ r0 (distance) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -57,8 +56,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/bond_harmonic_shift.txt b/doc/src/bond_harmonic_shift.txt index bf3b3c115a..0213b5cc6f 100644 --- a/doc/src/bond_harmonic_shift.txt +++ b/doc/src/bond_harmonic_shift.txt @@ -43,10 +43,9 @@ rc (distance) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -58,8 +57,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/bond_harmonic_shift_cut.txt b/doc/src/bond_harmonic_shift_cut.txt index 1918ce00b6..d907bf4a62 100644 --- a/doc/src/bond_harmonic_shift_cut.txt +++ b/doc/src/bond_harmonic_shift_cut.txt @@ -43,10 +43,9 @@ rc (distance) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -58,8 +57,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/bond_morse.txt b/doc/src/bond_morse.txt index 4f6a32e341..66f2d08cab 100644 --- a/doc/src/bond_morse.txt +++ b/doc/src/bond_morse.txt @@ -41,10 +41,9 @@ r0 (distance) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -56,8 +55,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/bond_nonlinear.txt b/doc/src/bond_nonlinear.txt index 434af62506..e0aa5629b3 100644 --- a/doc/src/bond_nonlinear.txt +++ b/doc/src/bond_nonlinear.txt @@ -41,10 +41,9 @@ lamda (distance) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -56,8 +55,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/bond_quartic.txt b/doc/src/bond_quartic.txt index 4dc7ad4a36..760a5d7f07 100644 --- a/doc/src/bond_quartic.txt +++ b/doc/src/bond_quartic.txt @@ -76,10 +76,9 @@ delete_bonds all bond 0 remove :pre Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -91,8 +90,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/bond_table.txt b/doc/src/bond_table.txt index 906d3e5d76..fe0b3ce22b 100644 --- a/doc/src/bond_table.txt +++ b/doc/src/bond_table.txt @@ -121,10 +121,9 @@ one that matches the specified keyword. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -136,8 +135,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/compute_pressure.txt b/doc/src/compute_pressure.txt index f0691ad207..8b7491da49 100644 --- a/doc/src/compute_pressure.txt +++ b/doc/src/compute_pressure.txt @@ -105,10 +105,9 @@ where "thermo_temp" is the ID of a similarly defined compute of style Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -120,8 +119,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/compute_temp.txt b/doc/src/compute_temp.txt index b88be79e20..f9fa56c882 100644 --- a/doc/src/compute_temp.txt +++ b/doc/src/compute_temp.txt @@ -67,10 +67,9 @@ thermostatting. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -82,8 +81,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/compute_temp_partial.txt b/doc/src/compute_temp_partial.txt index fe2420b4e4..59ec8cf20b 100644 --- a/doc/src/compute_temp_partial.txt +++ b/doc/src/compute_temp_partial.txt @@ -74,10 +74,9 @@ thermostatting. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -89,8 +88,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/dihedral_charmm.txt b/doc/src/dihedral_charmm.txt index 06abe054e4..f808649a44 100644 --- a/doc/src/dihedral_charmm.txt +++ b/doc/src/dihedral_charmm.txt @@ -116,10 +116,9 @@ computed. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -131,8 +130,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/dihedral_class2.txt b/doc/src/dihedral_class2.txt index cb9fc72c22..41282b22a3 100644 --- a/doc/src/dihedral_class2.txt +++ b/doc/src/dihedral_class2.txt @@ -141,10 +141,9 @@ r3 (distance) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -156,8 +155,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/dihedral_cosine_shift_exp.txt b/doc/src/dihedral_cosine_shift_exp.txt index 715682affc..483745be41 100644 --- a/doc/src/dihedral_cosine_shift_exp.txt +++ b/doc/src/dihedral_cosine_shift_exp.txt @@ -52,10 +52,9 @@ A (real number) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -67,8 +66,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/dihedral_fourier.txt b/doc/src/dihedral_fourier.txt index 0accbb22bf..0270139f68 100644 --- a/doc/src/dihedral_fourier.txt +++ b/doc/src/dihedral_fourier.txt @@ -44,10 +44,9 @@ dm (degrees) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -59,8 +58,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/dihedral_harmonic.txt b/doc/src/dihedral_harmonic.txt index d9a48ff384..a25a7969fe 100644 --- a/doc/src/dihedral_harmonic.txt +++ b/doc/src/dihedral_harmonic.txt @@ -53,10 +53,9 @@ Some force fields let {n} be positive or negative which corresponds to Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -68,8 +67,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/dihedral_helix.txt b/doc/src/dihedral_helix.txt index 1e907557b2..814962a472 100644 --- a/doc/src/dihedral_helix.txt +++ b/doc/src/dihedral_helix.txt @@ -46,10 +46,9 @@ C (energy) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -61,8 +60,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/dihedral_multi_harmonic.txt b/doc/src/dihedral_multi_harmonic.txt index 7d3c2ea083..62cad4141a 100644 --- a/doc/src/dihedral_multi_harmonic.txt +++ b/doc/src/dihedral_multi_harmonic.txt @@ -40,10 +40,9 @@ A5 (energy) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -55,8 +54,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/dihedral_nharmonic.txt b/doc/src/dihedral_nharmonic.txt index 8392d83899..a49979fa66 100644 --- a/doc/src/dihedral_nharmonic.txt +++ b/doc/src/dihedral_nharmonic.txt @@ -40,10 +40,9 @@ An (energy) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -55,8 +54,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/dihedral_opls.txt b/doc/src/dihedral_opls.txt index d1a6ba3ff2..9b33173da4 100644 --- a/doc/src/dihedral_opls.txt +++ b/doc/src/dihedral_opls.txt @@ -48,10 +48,9 @@ K4 (energy) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -63,8 +62,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/dihedral_quadratic.txt b/doc/src/dihedral_quadratic.txt index ca2f5aed40..f90c4b79f1 100644 --- a/doc/src/dihedral_quadratic.txt +++ b/doc/src/dihedral_quadratic.txt @@ -41,10 +41,9 @@ phi0 (degrees) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -56,8 +55,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/dihedral_table.txt b/doc/src/dihedral_table.txt index 0b88f26a61..6a480fec93 100644 --- a/doc/src/dihedral_table.txt +++ b/doc/src/dihedral_table.txt @@ -174,10 +174,9 @@ that matches the specified keyword. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -189,8 +188,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restrictions:] diff --git a/doc/src/fix_addforce.txt b/doc/src/fix_addforce.txt index b2ac95eabb..5bba9acb3f 100644 --- a/doc/src/fix_addforce.txt +++ b/doc/src/fix_addforce.txt @@ -103,12 +103,12 @@ converge properly. :line -Styles with a suffix are functionally the same as the corresponding -style without the suffix. They have been optimized to run faster, -depending on your available hardware, as discussed in -"Section 5"_Section_accelerate.html of the manual. The -accelerated styles take the same arguments and should produce the same -results, except for round-off and precision issues. +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -120,8 +120,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_aveforce.txt b/doc/src/fix_aveforce.txt index 5d7dec3e6a..4944996695 100644 --- a/doc/src/fix_aveforce.txt +++ b/doc/src/fix_aveforce.txt @@ -63,12 +63,12 @@ to it. :line -Styles with a suffix are functionally the same as the corresponding -style without the suffix. They have been optimized to run faster, -depending on your available hardware, as discussed in -"Section 5"_Section_accelerate.html of the manual. The -accelerated styles take the same arguments and should produce the same -results, except for round-off and precision issues. +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -80,8 +80,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_deform.txt b/doc/src/fix_deform.txt index c870c73bdc..681986561a 100644 --- a/doc/src/fix_deform.txt +++ b/doc/src/fix_deform.txt @@ -94,7 +94,7 @@ nvt/sllod"_fix_nvt_sllod.html and "compute temp/deform"_compute_temp_deform.html commands for more details. Note that simulation of a continuously extended system (extensional flow) can be modeled using the "USER-UEF -package"_Section_packages.html#USER-UEF and its "fix +package"_Packages_details.html#USER-UEF and its "fix commands"_fix_nh_uef.html. For the {x}, {y}, {z} parameters, the associated dimension cannot be @@ -550,10 +550,9 @@ command if you want to include lattice spacings in a variable formula. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -565,8 +564,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_dpd_energy.txt b/doc/src/fix_dpd_energy.txt index 1c10d954d6..4f2b5d573f 100644 --- a/doc/src/fix_dpd_energy.txt +++ b/doc/src/fix_dpd_energy.txt @@ -50,10 +50,9 @@ examples/USER/dpd directory. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -65,8 +64,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_enforce2d.txt b/doc/src/fix_enforce2d.txt index 4bbf41d25d..67b351e4b8 100644 --- a/doc/src/fix_enforce2d.txt +++ b/doc/src/fix_enforce2d.txt @@ -31,10 +31,9 @@ not move from their initial z coordinate. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -46,8 +45,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_eos_table_rx.txt b/doc/src/fix_eos_table_rx.txt index 0c87874347..f74a838c47 100644 --- a/doc/src/fix_eos_table_rx.txt +++ b/doc/src/fix_eos_table_rx.txt @@ -156,10 +156,9 @@ no 0.93 0.00 0.000 -1.76 :pre Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -171,8 +170,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_freeze.txt b/doc/src/fix_freeze.txt index a63ee4cb32..9619f4120b 100644 --- a/doc/src/fix_freeze.txt +++ b/doc/src/fix_freeze.txt @@ -31,12 +31,12 @@ using "fix setforce"_fix_setforce.html. :line -Styles with a suffix are functionally the same as the corresponding -style without the suffix. They have been optimized to run faster, -depending on your available hardware, as discussed in -"Section 5"_Section_accelerate.html of the manual. The -accelerated styles take the same arguments and should produce the same -results, except for round-off and precision issues. +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -48,8 +48,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_gravity.txt b/doc/src/fix_gravity.txt index dae8ac5ed0..f39955d4f8 100644 --- a/doc/src/fix_gravity.txt +++ b/doc/src/fix_gravity.txt @@ -90,10 +90,9 @@ field. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -105,8 +104,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_langevin.txt b/doc/src/fix_langevin.txt index 93c73f5a5d..6ab236e572 100644 --- a/doc/src/fix_langevin.txt +++ b/doc/src/fix_langevin.txt @@ -264,10 +264,9 @@ generates an average temperature of 220 K, instead of 300 K. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -279,8 +278,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_momentum.txt b/doc/src/fix_momentum.txt index bcf4465fb8..aa5199ac14 100644 --- a/doc/src/fix_momentum.txt +++ b/doc/src/fix_momentum.txt @@ -61,10 +61,9 @@ initial velocities with zero aggregate linear and/or angular momentum. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -76,8 +75,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_nh.txt b/doc/src/fix_nh.txt index 41d0e6438f..e3a39c6bc6 100644 --- a/doc/src/fix_nh.txt +++ b/doc/src/fix_nh.txt @@ -484,10 +484,9 @@ the various ways to do this. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -499,8 +498,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_nph_asphere.txt b/doc/src/fix_nph_asphere.txt index 8c35b6a1a7..ff8c300c47 100644 --- a/doc/src/fix_nph_asphere.txt +++ b/doc/src/fix_nph_asphere.txt @@ -81,10 +81,9 @@ It also means that changing attributes of {thermo_temp} or Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -96,8 +95,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_nph_body.txt b/doc/src/fix_nph_body.txt index 1e590f1cb3..9263470e9e 100644 --- a/doc/src/fix_nph_body.txt +++ b/doc/src/fix_nph_body.txt @@ -80,10 +80,9 @@ It also means that changing attributes of {thermo_temp} or Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -95,8 +94,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_nph_sphere.txt b/doc/src/fix_nph_sphere.txt index 62b45edfd7..ba3b2f6c06 100644 --- a/doc/src/fix_nph_sphere.txt +++ b/doc/src/fix_nph_sphere.txt @@ -90,10 +90,9 @@ It also means that changing attributes of {thermo_temp} or Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -105,8 +104,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_nphug.txt b/doc/src/fix_nphug.txt index 292e46f94a..4f696e9590 100644 --- a/doc/src/fix_nphug.txt +++ b/doc/src/fix_nphug.txt @@ -140,10 +140,9 @@ It also means that changing attributes of {thermo_temp} or Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -155,8 +154,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_npt_asphere.txt b/doc/src/fix_npt_asphere.txt index 5f3979e36e..a21caa1042 100644 --- a/doc/src/fix_npt_asphere.txt +++ b/doc/src/fix_npt_asphere.txt @@ -105,10 +105,9 @@ thermal degrees of freedom, and the bias is added back in. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -120,8 +119,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_npt_body.txt b/doc/src/fix_npt_body.txt index d89bf19db2..0f678a1b7d 100644 --- a/doc/src/fix_npt_body.txt +++ b/doc/src/fix_npt_body.txt @@ -104,10 +104,9 @@ thermal degrees of freedom, and the bias is added back in. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -119,8 +118,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_npt_sphere.txt b/doc/src/fix_npt_sphere.txt index c4cf2cb08d..862f95603f 100644 --- a/doc/src/fix_npt_sphere.txt +++ b/doc/src/fix_npt_sphere.txt @@ -115,10 +115,9 @@ thermal degrees of freedom, and the bias is added back in. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -130,8 +129,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_nve.txt b/doc/src/fix_nve.txt index c04c17858e..ac9cb53b50 100644 --- a/doc/src/fix_nve.txt +++ b/doc/src/fix_nve.txt @@ -34,10 +34,9 @@ ensemble. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -49,8 +48,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_nve_asphere.txt b/doc/src/fix_nve_asphere.txt index 1f31fb9679..5be7a7aa68 100644 --- a/doc/src/fix_nve_asphere.txt +++ b/doc/src/fix_nve_asphere.txt @@ -45,10 +45,9 @@ This fix is not invoked during "energy minimization"_minimize.html. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -60,8 +59,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_nve_sphere.txt b/doc/src/fix_nve_sphere.txt index 21dc6cba8a..cfe73a854d 100644 --- a/doc/src/fix_nve_sphere.txt +++ b/doc/src/fix_nve_sphere.txt @@ -65,10 +65,9 @@ moment of inertia, as used in the time integration. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -80,8 +79,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_nvt_asphere.txt b/doc/src/fix_nvt_asphere.txt index 21b900f16a..031c60e4be 100644 --- a/doc/src/fix_nvt_asphere.txt +++ b/doc/src/fix_nvt_asphere.txt @@ -86,10 +86,9 @@ thermal degrees of freedom, and the bias is added back in. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -101,8 +100,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_nvt_body.txt b/doc/src/fix_nvt_body.txt index 6a5e09ba7f..80de7fd7c3 100644 --- a/doc/src/fix_nvt_body.txt +++ b/doc/src/fix_nvt_body.txt @@ -85,10 +85,9 @@ thermal degrees of freedom, and the bias is added back in. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -100,8 +99,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_nvt_sllod.txt b/doc/src/fix_nvt_sllod.txt index 392dbc281c..bb3c092939 100644 --- a/doc/src/fix_nvt_sllod.txt +++ b/doc/src/fix_nvt_sllod.txt @@ -109,10 +109,9 @@ thermal degrees of freedom, and the bias is added back in. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -124,8 +123,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_nvt_sphere.txt b/doc/src/fix_nvt_sphere.txt index ecf0922b79..897d5606d7 100644 --- a/doc/src/fix_nvt_sphere.txt +++ b/doc/src/fix_nvt_sphere.txt @@ -96,10 +96,9 @@ thermal degrees of freedom, and the bias is added back in. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -111,8 +110,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restart, fix_modify, output, run start/stop, minimize info:] diff --git a/doc/src/fix_qeq_comb.txt b/doc/src/fix_qeq_comb.txt index 7f82404127..783dc3133c 100644 --- a/doc/src/fix_qeq_comb.txt +++ b/doc/src/fix_qeq_comb.txt @@ -62,10 +62,9 @@ equilibration calculation is written to the specified file. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -77,8 +76,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_qeq_reax.txt b/doc/src/fix_qeq_reax.txt index 18450c7cd5..a534a66c09 100644 --- a/doc/src/fix_qeq_reax.txt +++ b/doc/src/fix_qeq_reax.txt @@ -80,10 +80,9 @@ This fix is invoked during "energy minimization"_minimize.html. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -95,8 +94,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_rigid.txt b/doc/src/fix_rigid.txt index 8d803ac6da..f3dd20daa3 100644 --- a/doc/src/fix_rigid.txt +++ b/doc/src/fix_rigid.txt @@ -690,10 +690,9 @@ rigid/nvt. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -705,8 +704,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_rx.txt b/doc/src/fix_rx.txt index 0810a34740..aff3303f43 100644 --- a/doc/src/fix_rx.txt +++ b/doc/src/fix_rx.txt @@ -186,10 +186,9 @@ read_data data.dpd fix foo_SPECIES NULL Species Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -201,8 +200,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_setforce.txt b/doc/src/fix_setforce.txt index f5be0f93a5..0af1c92922 100644 --- a/doc/src/fix_setforce.txt +++ b/doc/src/fix_setforce.txt @@ -65,12 +65,12 @@ to it. :line -Styles with a r {kk} suffix are functionally the same as the -corresponding style without the suffix. They have been optimized to -run faster, depending on your available hardware, as discussed in -"Section 5"_Section_accelerate.html of the manual. The -accelerated styles take the same arguments and should produce the same -results, except for round-off and precision issues. +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. The region keyword is also supported by Kokkos, but a Kokkos-enabled region must be used. See the region "region"_region.html command for @@ -85,8 +85,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_shake.txt b/doc/src/fix_shake.txt index 46452a1f7e..7428b30a14 100644 --- a/doc/src/fix_shake.txt +++ b/doc/src/fix_shake.txt @@ -145,12 +145,12 @@ info of atoms in the molecule. :line -Styles with a suffix are functionally the same as the corresponding -style without the suffix. They have been optimized to run faster, -depending on your available hardware, as discussed in -"Section 5"_Section_accelerate.html of the manual. The -accelerated styles take the same arguments and should produce the same -results, except for round-off and precision issues. +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -162,8 +162,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_shardlow.txt b/doc/src/fix_shardlow.txt index 24726d8610..6d14346334 100644 --- a/doc/src/fix_shardlow.txt +++ b/doc/src/fix_shardlow.txt @@ -56,10 +56,9 @@ examples/USER/dpd directory. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -71,8 +70,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_wall.txt b/doc/src/fix_wall.txt index e814c89a07..959a103f02 100644 --- a/doc/src/fix_wall.txt +++ b/doc/src/fix_wall.txt @@ -288,10 +288,9 @@ option for this fix. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -303,8 +302,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_wall_reflect.txt b/doc/src/fix_wall_reflect.txt index 954ec65bf6..5380bdf738 100644 --- a/doc/src/fix_wall_reflect.txt +++ b/doc/src/fix_wall_reflect.txt @@ -130,10 +130,9 @@ position = c0 + A (1 - cos(omega*delta)) :pre Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -145,8 +144,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/improper_class2.txt b/doc/src/improper_class2.txt index 14ec6258de..ef2abf5091 100644 --- a/doc/src/improper_class2.txt +++ b/doc/src/improper_class2.txt @@ -87,10 +87,9 @@ radians internally; hence the units of M are in energy/radian^2. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -102,8 +101,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/improper_cossq.txt b/doc/src/improper_cossq.txt index 138a6a1650..22ba990ba4 100644 --- a/doc/src/improper_cossq.txt +++ b/doc/src/improper_cossq.txt @@ -53,10 +53,9 @@ X0 (degrees) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -68,8 +67,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/improper_cvff.txt b/doc/src/improper_cvff.txt index 5f69eccc60..1662d93b14 100644 --- a/doc/src/improper_cvff.txt +++ b/doc/src/improper_cvff.txt @@ -54,10 +54,9 @@ n (0,1,2,3,4,6) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -69,8 +68,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/improper_fourier.txt b/doc/src/improper_fourier.txt index f9062da207..99132b8931 100644 --- a/doc/src/improper_fourier.txt +++ b/doc/src/improper_fourier.txt @@ -48,10 +48,9 @@ all (integer >= 0) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -63,8 +62,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/improper_harmonic.txt b/doc/src/improper_harmonic.txt index bb17e5a641..f37338e468 100644 --- a/doc/src/improper_harmonic.txt +++ b/doc/src/improper_harmonic.txt @@ -58,10 +58,9 @@ internally; hence the units of K are in energy/radian^2. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -73,8 +72,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/improper_ring.txt b/doc/src/improper_ring.txt index c02d392474..84c35f9f5c 100644 --- a/doc/src/improper_ring.txt +++ b/doc/src/improper_ring.txt @@ -57,10 +57,9 @@ theta0 (degrees) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -72,8 +71,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/improper_umbrella.txt b/doc/src/improper_umbrella.txt index d6df9ee6cc..e72cc7f0ad 100644 --- a/doc/src/improper_umbrella.txt +++ b/doc/src/improper_umbrella.txt @@ -51,10 +51,9 @@ omega0 (degrees) :ul Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -66,8 +65,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/kspace_style.txt b/doc/src/kspace_style.txt index 4f27c9aa78..8dbb3dde49 100644 --- a/doc/src/kspace_style.txt +++ b/doc/src/kspace_style.txt @@ -145,8 +145,8 @@ speedup in the KSpace time (8x less mesh points, 2x more expensive). However, for low relative accuracy, the staggered PPPM mesh size may be essentially the same as for regular PPPM, which means the method will be up to 2x slower in the KSpace time (simply 2x more expensive). -For more details and timings, see -"Section 5"_Section_accelerate.html. +For more details and timings, see the "Speed tips"_Speed_tips.html doc +page. NOTE: Using {pppm/stagger} may not give the same increase in the accuracy of energy and pressure as it does in forces, so some caution @@ -267,10 +267,9 @@ relative RMS error. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. More specifically, the {pppm/gpu} style performs charge assignment and force interpolation calculations on the GPU. These processes are @@ -291,8 +290,8 @@ KOKKOS, USER-OMP, and OPT packages respectively. They are only enabled if LAMMPS was built with those packages. See the "Making LAMMPS"_Section_start.html#start_3 section for more info. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 4274ef48b3..f96960ff39 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -4,13 +4,11 @@ Manual.html Section_intro.html Section_start.html Section_commands.html -Section_packages.html -Section_accelerate.html -accelerate_gpu.html -accelerate_intel.html -accelerate_kokkos.html -accelerate_omp.html -accelerate_opt.html +Packages.html +Packages_standard.html +Packages_user.html +Packages_details.html +Speed.html Section_howto.html Examples.html Section_perf.html diff --git a/doc/src/package.txt b/doc/src/package.txt index 5fd42f67d3..81e1db9bd8 100644 --- a/doc/src/package.txt +++ b/doc/src/package.txt @@ -149,9 +149,9 @@ the style options are set, either to default values or to specified settings. I.e. settings from previous invocations do not persist across multiple invocations. -See the "Section 5.3"_Section_accelerate.html#acc_3 section of the -manual for more details about using the various accelerator packages -for speeding up LAMMPS simulations. +See the "Speed packages"_Speed_packages.html doc page for more details +about using the various accelerator packages for speeding up LAMMPS +simulations. :line diff --git a/doc/src/pair_adp.txt b/doc/src/pair_adp.txt index 9d2a48dcbc..1ba59b7732 100644 --- a/doc/src/pair_adp.txt +++ b/doc/src/pair_adp.txt @@ -125,10 +125,9 @@ array tabulated with a scaling by r. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -140,8 +139,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_agni.txt b/doc/src/pair_agni.txt index 402e537dad..352e00249a 100644 --- a/doc/src/pair_agni.txt +++ b/doc/src/pair_agni.txt @@ -58,11 +58,11 @@ and input files are provided in the examples/USER/misc/agni directory. :line Styles with {omp} suffix is functionally the same as the corresponding -style without the suffix. They have been optimized to run faster, depending -on your available hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated style takes the same arguments and -should produce the same results, except for round-off and precision -issues. +style without the suffix. They have been optimized to run faster, +depending on your available hardware, as discussed on the "Speed +packages"_Speed_packages.html doc page. The accelerated style takes +the same arguments and should produce the same results, except for +round-off and precision issues. The accelerated style is part of the USER-OMP. They are only enabled if LAMMPS was built with those packages. See the "Making @@ -73,8 +73,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_airebo.txt b/doc/src/pair_airebo.txt index 1aa017f278..b5add21f24 100644 --- a/doc/src/pair_airebo.txt +++ b/doc/src/pair_airebo.txt @@ -176,10 +176,9 @@ thermo_style custom step temp epair v_REBO v_LJ v_TORSION :pre Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -191,8 +190,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_beck.txt b/doc/src/pair_beck.txt index e160f09b3d..1aca4b4f9a 100644 --- a/doc/src/pair_beck.txt +++ b/doc/src/pair_beck.txt @@ -51,10 +51,9 @@ Rc is used. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -66,8 +65,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_born.txt b/doc/src/pair_born.txt index f867107426..2504fb7e25 100644 --- a/doc/src/pair_born.txt +++ b/doc/src/pair_born.txt @@ -145,10 +145,9 @@ pair_style command. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -160,8 +159,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_buck.txt b/doc/src/pair_buck.txt index d18b39d5d9..de247b9c01 100644 --- a/doc/src/pair_buck.txt +++ b/doc/src/pair_buck.txt @@ -140,10 +140,9 @@ pair_style command. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -155,8 +154,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_buck_long.txt b/doc/src/pair_buck_long.txt index 05e760e1b2..94bf6a2d7c 100644 --- a/doc/src/pair_buck_long.txt +++ b/doc/src/pair_buck_long.txt @@ -102,10 +102,9 @@ global Coulombic cutoff is allowed. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -117,8 +116,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_charmm.txt b/doc/src/pair_charmm.txt index 75a8e4bff9..af20661bbd 100644 --- a/doc/src/pair_charmm.txt +++ b/doc/src/pair_charmm.txt @@ -184,10 +184,9 @@ the pair_style command. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -199,8 +198,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_class2.txt b/doc/src/pair_class2.txt index 36fae5068b..e62971a645 100644 --- a/doc/src/pair_class2.txt +++ b/doc/src/pair_class2.txt @@ -102,10 +102,9 @@ cutoff distance. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -117,8 +116,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_colloid.txt b/doc/src/pair_colloid.txt index 83b15b358b..a7bb0db08a 100644 --- a/doc/src/pair_colloid.txt +++ b/doc/src/pair_colloid.txt @@ -127,10 +127,9 @@ commands for efficiency: "neighbor multi"_neighbor.html and Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -142,8 +141,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_comb.txt b/doc/src/pair_comb.txt index f5461b1cbc..6949ca50c2 100644 --- a/doc/src/pair_comb.txt +++ b/doc/src/pair_comb.txt @@ -112,10 +112,9 @@ nor file {ffield.comb3} with style {comb}. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -127,8 +126,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_coul.txt b/doc/src/pair_coul.txt index aa3a008bd3..650575d055 100644 --- a/doc/src/pair_coul.txt +++ b/doc/src/pair_coul.txt @@ -268,10 +268,9 @@ command. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -283,8 +282,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_dipole.txt b/doc/src/pair_dipole.txt index 2516e5eae4..e7d196d599 100644 --- a/doc/src/pair_dipole.txt +++ b/doc/src/pair_dipole.txt @@ -186,10 +186,9 @@ type pair. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -201,8 +200,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_dpd.txt b/doc/src/pair_dpd.txt index 9e29e93430..a36029ea63 100644 --- a/doc/src/pair_dpd.txt +++ b/doc/src/pair_dpd.txt @@ -110,10 +110,9 @@ random force. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -125,8 +124,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_dpd_fdt.txt b/doc/src/pair_dpd_fdt.txt index 867f3f2315..129d3c84af 100644 --- a/doc/src/pair_dpd_fdt.txt +++ b/doc/src/pair_dpd_fdt.txt @@ -129,10 +129,9 @@ significantly larger timesteps to be taken. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -144,8 +143,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_eam.txt b/doc/src/pair_eam.txt index 03e77f53ab..8d4d11341c 100644 --- a/doc/src/pair_eam.txt +++ b/doc/src/pair_eam.txt @@ -371,10 +371,9 @@ are listed. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -386,7 +385,7 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for more +See the "Speed packages"_Speed_packages.html doc page for more instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_edip.txt b/doc/src/pair_edip.txt index e5b1420b59..f0d1927812 100644 --- a/doc/src/pair_edip.txt +++ b/doc/src/pair_edip.txt @@ -109,10 +109,9 @@ the EDIP package. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -124,8 +123,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_eim.txt b/doc/src/pair_eim.txt index 75ad2d4683..7f94d919f2 100644 --- a/doc/src/pair_eim.txt +++ b/doc/src/pair_eim.txt @@ -136,10 +136,9 @@ needs. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -151,8 +150,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_exp6_rx.txt b/doc/src/pair_exp6_rx.txt index 7eafa23543..dec660fd1d 100644 --- a/doc/src/pair_exp6_rx.txt +++ b/doc/src/pair_exp6_rx.txt @@ -153,10 +153,9 @@ pair interaction. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -168,8 +167,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_gauss.txt b/doc/src/pair_gauss.txt index f6f46a2de8..7716f89f17 100644 --- a/doc/src/pair_gauss.txt +++ b/doc/src/pair_gauss.txt @@ -84,10 +84,9 @@ is used. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -99,8 +98,8 @@ by including their suffix, or you can use the "-suffix command-line switch7_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_gayberne.txt b/doc/src/pair_gayberne.txt index c923578586..e9a98a0b84 100644 --- a/doc/src/pair_gayberne.txt +++ b/doc/src/pair_gayberne.txt @@ -133,10 +133,9 @@ pair_coeff sigma to 1.0 as well. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -148,8 +147,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_gran.txt b/doc/src/pair_gran.txt index d7e87af013..86b04f96de 100644 --- a/doc/src/pair_gran.txt +++ b/doc/src/pair_gran.txt @@ -179,10 +179,9 @@ potential. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -194,8 +193,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_gromacs.txt b/doc/src/pair_gromacs.txt index ec84a2d57a..7daf805e2b 100644 --- a/doc/src/pair_gromacs.txt +++ b/doc/src/pair_gromacs.txt @@ -91,10 +91,9 @@ cutoff(s) specified in the pair_style command. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -106,8 +105,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_hbond_dreiding.txt b/doc/src/pair_hbond_dreiding.txt index d3cf90ec14..45f852c254 100644 --- a/doc/src/pair_hbond_dreiding.txt +++ b/doc/src/pair_hbond_dreiding.txt @@ -166,10 +166,9 @@ optional parameters. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -181,8 +180,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_hybrid.txt b/doc/src/pair_hybrid.txt index d37dedc709..9503256d26 100644 --- a/doc/src/pair_hybrid.txt +++ b/doc/src/pair_hybrid.txt @@ -315,8 +315,8 @@ off C/C interaction, i.e. by setting the appropriate coefficients to Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. Since the {hybrid} and {hybrid/overlay} styles delegate computation to the individual sub-styles, the suffix versions of the {hybrid} and @@ -334,8 +334,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_kim.txt b/doc/src/pair_kim.txt index c5d910e27c..fc2c1405af 100644 --- a/doc/src/pair_kim.txt +++ b/doc/src/pair_kim.txt @@ -46,8 +46,8 @@ are included in the KIM library by default, in the "What is in the KIM API source package?" section. To use this pair style, you must first download and install the KIM -API library from the "OpenKIM website"_https://openkim.org. The "KIM -section of Section packages"_Section_packages.html#KIM has +API library from the "OpenKIM website"_https://openkim.org. The KIM +section of the "Packages details"_Packages_details.html doc page has instructions on how to do this with a simple make command, when building LAMMPS. diff --git a/doc/src/pair_lj.txt b/doc/src/pair_lj.txt index e297d479bc..c2968ffdf3 100644 --- a/doc/src/pair_lj.txt +++ b/doc/src/pair_lj.txt @@ -269,10 +269,9 @@ pair_style command. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -284,8 +283,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_lj96.txt b/doc/src/pair_lj96.txt index 83f6ec063d..a0a9971474 100644 --- a/doc/src/pair_lj96.txt +++ b/doc/src/pair_lj96.txt @@ -49,10 +49,9 @@ cutoff specified in the pair_style command is used. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -64,8 +63,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_lj_cubic.txt b/doc/src/pair_lj_cubic.txt index 4ca8c3c141..c4e2af5062 100644 --- a/doc/src/pair_lj_cubic.txt +++ b/doc/src/pair_lj_cubic.txt @@ -63,10 +63,9 @@ located at rmin = 2^(1/6)*sigma. In the above example, sigma = Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -78,8 +77,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_lj_expand.txt b/doc/src/pair_lj_expand.txt index e0838426f6..c156fefef2 100644 --- a/doc/src/pair_lj_expand.txt +++ b/doc/src/pair_lj_expand.txt @@ -53,10 +53,9 @@ optional. If not specified, the global LJ cutoff is used. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -68,8 +67,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_lj_long.txt b/doc/src/pair_lj_long.txt index 6be4562d18..bc851adb74 100644 --- a/doc/src/pair_lj_long.txt +++ b/doc/src/pair_lj_long.txt @@ -156,10 +156,9 @@ specified in the pair_style command. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -171,8 +170,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_lj_smooth.txt b/doc/src/pair_lj_smooth.txt index b1678cad58..653520966b 100644 --- a/doc/src/pair_lj_smooth.txt +++ b/doc/src/pair_lj_smooth.txt @@ -62,10 +62,9 @@ specified, the global values for Rin and Rc are used. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -77,8 +76,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_lj_smooth_linear.txt b/doc/src/pair_lj_smooth_linear.txt index 5f7c226cee..aebde2e653 100644 --- a/doc/src/pair_lj_smooth_linear.txt +++ b/doc/src/pair_lj_smooth_linear.txt @@ -49,10 +49,9 @@ LJ cutoff specified in the pair_style command is used. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -64,8 +63,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_lj_soft.txt b/doc/src/pair_lj_soft.txt index 2ef133da55..7add9f623d 100644 --- a/doc/src/pair_lj_soft.txt +++ b/doc/src/pair_lj_soft.txt @@ -207,10 +207,9 @@ directory tree, under examples/USER/fep. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -222,8 +221,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_meam_spline.txt b/doc/src/pair_meam_spline.txt index 6653b397a0..74242e32b9 100644 --- a/doc/src/pair_meam_spline.txt +++ b/doc/src/pair_meam_spline.txt @@ -106,10 +106,9 @@ MEAM files. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -121,8 +120,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_morse.txt b/doc/src/pair_morse.txt index 3eb5ac5afe..34876011a1 100644 --- a/doc/src/pair_morse.txt +++ b/doc/src/pair_morse.txt @@ -101,10 +101,9 @@ cutoff is used. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -116,8 +115,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_multi_lucy_rx.txt b/doc/src/pair_multi_lucy_rx.txt index 57abcf4a4c..b043030907 100644 --- a/doc/src/pair_multi_lucy_rx.txt +++ b/doc/src/pair_multi_lucy_rx.txt @@ -204,10 +204,9 @@ This pair style can only be used via the {pair} keyword of the Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -219,8 +218,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_nb3b_harmonic.txt b/doc/src/pair_nb3b_harmonic.txt index 2395707fb4..e6e103f517 100644 --- a/doc/src/pair_nb3b_harmonic.txt +++ b/doc/src/pair_nb3b_harmonic.txt @@ -92,10 +92,9 @@ a particular simulation; LAMMPS ignores those entries. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -107,8 +106,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_nm.txt b/doc/src/pair_nm.txt index 81cea1a38d..08c3393993 100644 --- a/doc/src/pair_nm.txt +++ b/doc/src/pair_nm.txt @@ -133,10 +133,9 @@ the "run_style respa"_run_style.html command. They do not support the Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -148,8 +147,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Restrictions:] diff --git a/doc/src/pair_peri.txt b/doc/src/pair_peri.txt index deca093e3b..4327003057 100644 --- a/doc/src/pair_peri.txt +++ b/doc/src/pair_peri.txt @@ -139,10 +139,9 @@ details please see the description in "(Mtchell2011a)". Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -154,8 +153,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_reaxc.txt b/doc/src/pair_reaxc.txt index 39759b3111..8d8c7e84e7 100644 --- a/doc/src/pair_reaxc.txt +++ b/doc/src/pair_reaxc.txt @@ -50,11 +50,11 @@ as a package. The {reax/c/kk} style is a Kokkos version of the ReaxFF potential that is derived from the {reax/c} style. The Kokkos version can run on GPUs and can also use OpenMP multithreading. For more information about the -Kokkos package, see "Section 4"_Section_packages.html#kokkos and -"Section 5.3.3"_accelerate_kokkos.html. One important consideration -when using the {reax/c/kk} style is the choice of either half or full -neighbor lists. This setting can be changed using the Kokkos -"package"_package.html command. +Kokkos package, see "Packages details"_Packages_details.html and +"Speed kokkos"_Speed_kokkos.html doc pages. One important +consideration when using the {reax/c/kk} style is the choice of either +half or full neighbor lists. This setting can be changed using the +Kokkos "package"_package.html command. The {reax/c} style differs from the "pair_style reax"_pair_reax.html command in the lo-level implementation details. The {reax} style is a @@ -303,10 +303,9 @@ This pair style can only be used via the {pair} keyword of the Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -318,8 +317,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_resquared.txt b/doc/src/pair_resquared.txt index 9ad95eb5fc..6ea5c73c0d 100644 --- a/doc/src/pair_resquared.txt +++ b/doc/src/pair_resquared.txt @@ -145,10 +145,9 @@ specified in the pair_style command is used. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -160,8 +159,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_sdk.txt b/doc/src/pair_sdk.txt index 360136a4ea..4cd56bc43d 100644 --- a/doc/src/pair_sdk.txt +++ b/doc/src/pair_sdk.txt @@ -85,10 +85,9 @@ pair_style command. Styles with a {gpu}, {intel}, {kk}, {omp} or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP, and OPT packages respectively. They are only enabled if @@ -100,8 +99,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_snap.txt b/doc/src/pair_snap.txt index 27dcf6082b..c3d6e67e82 100644 --- a/doc/src/pair_snap.txt +++ b/doc/src/pair_snap.txt @@ -175,10 +175,9 @@ This pair style can only be used via the {pair} keyword of the Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -190,8 +189,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_soft.txt b/doc/src/pair_soft.txt index 08fa88c477..adbfa596c9 100644 --- a/doc/src/pair_soft.txt +++ b/doc/src/pair_soft.txt @@ -82,10 +82,9 @@ variables. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -97,8 +96,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_sw.txt b/doc/src/pair_sw.txt index 4932fe55d3..7c9ce4a4f9 100644 --- a/doc/src/pair_sw.txt +++ b/doc/src/pair_sw.txt @@ -144,10 +144,9 @@ taken from the ij and ik pairs (sigma, a, gamma) Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -164,8 +163,8 @@ additional 5 to 10 percent performance improvement when the Stillinger-Weber parameters p and q are set to 4 and 0 respectively. These parameters are common for modeling silicon and water. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_table.txt b/doc/src/pair_table.txt index b99491b477..f5e69a6d54 100644 --- a/doc/src/pair_table.txt +++ b/doc/src/pair_table.txt @@ -217,10 +217,9 @@ one that matches the specified keyword. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -232,8 +231,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_table_rx.txt b/doc/src/pair_table_rx.txt index cd3a7ef31b..52760c396b 100644 --- a/doc/src/pair_table_rx.txt +++ b/doc/src/pair_table_rx.txt @@ -227,10 +227,9 @@ This pair style can only be used via the {pair} keyword of the Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -242,8 +241,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_tersoff.txt b/doc/src/pair_tersoff.txt index 918e889924..70fe207f0a 100644 --- a/doc/src/pair_tersoff.txt +++ b/doc/src/pair_tersoff.txt @@ -179,10 +179,9 @@ defined in various papers. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -194,8 +193,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_tersoff_mod.txt b/doc/src/pair_tersoff_mod.txt index e0c2b5a5cb..aced6d40d6 100644 --- a/doc/src/pair_tersoff_mod.txt +++ b/doc/src/pair_tersoff_mod.txt @@ -131,10 +131,9 @@ for SiSiSi means Si bonded to a Si with another Si atom influencing the bond. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -146,8 +145,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_tersoff_zbl.txt b/doc/src/pair_tersoff_zbl.txt index 21d57e4e88..838c2f39cf 100644 --- a/doc/src/pair_tersoff_zbl.txt +++ b/doc/src/pair_tersoff_zbl.txt @@ -189,10 +189,9 @@ providing the base ZBL implementation. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -204,8 +203,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_thole.txt b/doc/src/pair_thole.txt index 41a4059cee..11d4b85cff 100644 --- a/doc/src/pair_thole.txt +++ b/doc/src/pair_thole.txt @@ -130,10 +130,9 @@ the {pair_style} command line. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -145,8 +144,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. [Mixing]: diff --git a/doc/src/pair_ufm.txt b/doc/src/pair_ufm.txt index 88a22864cc..5af8741502 100644 --- a/doc/src/pair_ufm.txt +++ b/doc/src/pair_ufm.txt @@ -69,10 +69,9 @@ NOTE: The thermodynamic integration procedure can be performed with this potenti Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -84,8 +83,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_vashishta.txt b/doc/src/pair_vashishta.txt index d9c66d45c0..e90a9d8f50 100644 --- a/doc/src/pair_vashishta.txt +++ b/doc/src/pair_vashishta.txt @@ -171,10 +171,9 @@ two-body parameters from the CCC and CSiSi entries. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -186,8 +185,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_yukawa.txt b/doc/src/pair_yukawa.txt index e7c063ded9..979165dda0 100644 --- a/doc/src/pair_yukawa.txt +++ b/doc/src/pair_yukawa.txt @@ -49,10 +49,9 @@ cutoff is used. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -64,8 +63,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_yukawa_colloid.txt b/doc/src/pair_yukawa_colloid.txt index 2037a9451f..a1752c261e 100644 --- a/doc/src/pair_yukawa_colloid.txt +++ b/doc/src/pair_yukawa_colloid.txt @@ -80,10 +80,9 @@ yukawa/colloid cutoff is used. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -95,8 +94,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_zbl.txt b/doc/src/pair_zbl.txt index 1984cd831f..0507083295 100644 --- a/doc/src/pair_zbl.txt +++ b/doc/src/pair_zbl.txt @@ -71,10 +71,9 @@ copper. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section 5"_Section_accelerate.html -of the manual. The accelerated styles take the same arguments and -should produce the same results, except for round-off and precision -issues. +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. These accelerated styles are part of the GPU, USER-INTEL, KOKKOS, USER-OMP and OPT packages, respectively. They are only enabled if @@ -86,8 +85,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/region.txt b/doc/src/region.txt index 5039e4a516..1ac3861e67 100644 --- a/doc/src/region.txt +++ b/doc/src/region.txt @@ -358,12 +358,12 @@ sub-regions can be defined with the {open} keyword. :line -Styles with a {kk} suffix are functionally the same as the -corresponding style without the suffix. They have been optimized to -run faster, depending on your available hardware, as discussed in -"Section 5"_Section_accelerate.html of the manual. The -accelerated styles take the same arguments and should produce the same -results, except for round-off and precision issues. +Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are +functionally the same as the corresponding style without the suffix. +They have been optimized to run faster, depending on your available +hardware, as discussed on the "Speed packages"_Speed_packages.html doc +page. The accelerated styles take the same arguments and should +produce the same results, except for round-off and precision issues. The code using the region (such as a fix or compute) must also be supported by Kokkos or no acceleration will occur. Currently, only {block} style @@ -378,8 +378,8 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/run_style.txt b/doc/src/run_style.txt index 7717ede86f..a896a648af 100644 --- a/doc/src/run_style.txt +++ b/doc/src/run_style.txt @@ -119,13 +119,13 @@ switches"_Section_start.html#start_6 to change this. The log and screen file for the 2nd partition will not contain thermodynamic output beyond the 1st timestep of the run. -See "Section 5"_Section_accelerate.html of the manual for -performance details of the speed-up offered by the {verlet/split} -style. One important performance consideration is the assignment of -logical processors in the 2 partitions to the physical cores of a -parallel machine. The "processors"_processors.html command has -options to support this, and strategies are discussed in -"Section 5"_Section_accelerate.html of the manual. +See the "Speed packages"_Speed_packages.html doc page for performance +details of the speed-up offered by the {verlet/split} style. One +important performance consideration is the assignment of logical +processors in the 2 partitions to the physical cores of a parallel +machine. The "processors"_processors.html command has options to +support this, and strategies are discussed in "Section +5"_Section_accelerate.html of the manual. :line @@ -274,21 +274,21 @@ run_style respa 3 3 4 inner 1 3.0 4.0 middle 2 6.0 7.0 outer 3 :pre :line -The {respa/omp} styles is a variant of {respa} adapted for use with +The {respa/omp} style is a variant of {respa} adapted for use with pair, bond, angle, dihedral, improper, or kspace styles with an {omp} -suffix. It is functionally equivalent to {respa} but performs additional -operations required for managing {omp} styles. For more on {omp} styles -see the "Section 5"_Section_accelerate.html of the manual. -Accelerated styles take the same arguments and should produce the same -results, except for round-off and precision issues. +suffix. It is functionally equivalent to {respa} but performs +additional operations required for managing {omp} styles. For more on +{omp} styles see the "Speed omp"_Speed_omp.html doc page. Accelerated +styles take the same arguments and should produce the same results, +except for round-off and precision issues. You can specify {respa/omp} explicitly in your input script, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section 5"_Section_accelerate.html of the manual for -more instructions on how to use the accelerated styles effectively. +See the "Speed packages"_Speed_packages.html doc page for more +instructions on how to use the accelerated styles effectively. :line From 34f619ea1d6514d6e231c5acbd8f8589ee77047a Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 30 Jul 2018 19:04:52 -0400 Subject: [PATCH 110/123] Update lammps.book --- doc/src/lammps.book | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/doc/src/lammps.book b/doc/src/lammps.book index f96960ff39..fe9a64932b 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -9,9 +9,18 @@ Packages_standard.html Packages_user.html Packages_details.html Speed.html +Speed_bench.html +Speed_measure.html +Speed_tips.html +Speed_packages.html +Speed_gpu.html +Speed_intel.html +Speed_kokkos.html +Speed_omp.html +Speed_opt.html +Speed_compare Section_howto.html Examples.html -Section_perf.html Tools.html Modify.html Modify_overview.html From 57cd1ab55ad6b1f319e01230f25075c73788de93 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 30 Jul 2018 19:13:26 -0400 Subject: [PATCH 111/123] Add missing extension --- doc/src/lammps.book | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/lammps.book b/doc/src/lammps.book index fe9a64932b..f9798da227 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -18,7 +18,7 @@ Speed_intel.html Speed_kokkos.html Speed_omp.html Speed_opt.html -Speed_compare +Speed_compare.html Section_howto.html Examples.html Tools.html From 18a7b1ab4f51b289127beca2df91f88354c7eb90 Mon Sep 17 00:00:00 2001 From: Richard Berger Date: Mon, 30 Jul 2018 21:32:12 -0400 Subject: [PATCH 112/123] Fix broken links and duplicate TOC --- doc/src/Section_howto.txt | 2 +- doc/src/Speed.txt | 5 ----- doc/src/Speed_intel.txt | 8 ++++---- doc/src/Speed_omp.txt | 2 +- doc/src/Speed_packages.txt | 26 +++++++++++++------------- doc/src/fix_reax_bonds.txt | 4 ++-- doc/src/fix_reaxc_species.txt | 4 ++-- doc/src/pair_brownian.txt | 4 ++-- doc/src/pair_lubricate.txt | 4 ++-- doc/src/run_style.txt | 2 +- 10 files changed, 28 insertions(+), 33 deletions(-) diff --git a/doc/src/Section_howto.txt b/doc/src/Section_howto.txt index 3c5fe47057..f929d3bdab 100644 --- a/doc/src/Section_howto.txt +++ b/doc/src/Section_howto.txt @@ -1,4 +1,4 @@ -"Previous Section"_Section_accelerate.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Examples.html :c +"Previous Section"_Speed.html - "LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc - "Next Section"_Examples.html :c :link(lws,http://lammps.sandia.gov) :link(ld,Manual.html) diff --git a/doc/src/Speed.txt b/doc/src/Speed.txt index 2339a11c06..1e2097ab1d 100644 --- a/doc/src/Speed.txt +++ b/doc/src/Speed.txt @@ -42,11 +42,6 @@ hardware platforms. .. toctree:: Speed_packages - Speed_gpu - Speed_intel - Speed_kokkos - Speed_omp - Speed_opt Speed_compare END_RST --> diff --git a/doc/src/Speed_intel.txt b/doc/src/Speed_intel.txt index acf5c3f2f9..08e3fbc4cc 100644 --- a/doc/src/Speed_intel.txt +++ b/doc/src/Speed_intel.txt @@ -186,8 +186,8 @@ can start running so that the CPU pipeline is still being used efficiently. Although benefits can be seen by launching a MPI task for every hardware thread, for multinode simulations, we recommend that OpenMP threads are used for SMT instead, either with the -USER-INTEL package, "USER-OMP package"_accelerate_omp.html, or -"KOKKOS package"_accelerate_kokkos.html. In the example above, up +USER-INTEL package, "USER-OMP package"_Speed_omp.html, or +"KOKKOS package"_Speed_kokkos.html. In the example above, up to 36X speedups can be observed by using all 36 physical cores with LAMMPS. By using all 72 hardware threads, an additional 10-30% performance gain can be achieved. @@ -389,8 +389,8 @@ performance and/or scalability for simple 2-body potentials such as lj/cut or when using LRT mode on processors supporting AVX-512. Not all styles are supported in the USER-INTEL package. You can mix -the USER-INTEL package with styles from the "OPT"_accelerate_opt.html -package or the "USER-OMP package"_accelerate_omp.html. Of course, +the USER-INTEL package with styles from the "OPT"_Speed_opt.html +package or the "USER-OMP package"_Speed_omp.html. Of course, this requires that these packages were installed at build time. This can performed automatically by using "-sf hybrid intel opt" or "-sf hybrid intel omp" command-line options. Alternatively, the "opt" diff --git a/doc/src/Speed_omp.txt b/doc/src/Speed_omp.txt index 3700580225..9685b6d349 100644 --- a/doc/src/Speed_omp.txt +++ b/doc/src/Speed_omp.txt @@ -99,7 +99,7 @@ task, versus running standard LAMMPS with its standard un-accelerated styles (in serial or all-MPI parallelization with 1 task/core). This is because many of the USER-OMP styles contain similar optimizations to those used in the OPT package, described in "Section -5.3.5"_accelerate_opt.html. +5.3.5"_Speed_opt.html. With multiple threads/task, the optimal choice of number of MPI tasks/node and OpenMP threads/task can vary a lot and should always be diff --git a/doc/src/Speed_packages.txt b/doc/src/Speed_packages.txt index 18850d52e0..13b5e183db 100644 --- a/doc/src/Speed_packages.txt +++ b/doc/src/Speed_packages.txt @@ -23,11 +23,11 @@ pages. These are the accelerator packages currently in LAMMPS, either as standard or user packages: -"GPU Package"_accelerate_gpu.html : for NVIDIA GPUs as well as OpenCL support -"USER-INTEL Package"_accelerate_intel.html : for Intel CPUs and Intel Xeon Phi -"KOKKOS Package"_accelerate_kokkos.html : for Nvidia GPUs, Intel Xeon Phi, and OpenMP threading -"USER-OMP Package"_accelerate_omp.html : for OpenMP threading and generic CPU optimizations -"OPT Package"_accelerate_opt.html : generic CPU optimizations :tb(s=:) +"GPU Package"_Speed_gpu.html : for NVIDIA GPUs as well as OpenCL support +"USER-INTEL Package"_Speed_intel.html : for Intel CPUs and Intel Xeon Phi +"KOKKOS Package"_Speed_kokkos.html : for Nvidia GPUs, Intel Xeon Phi, and OpenMP threading +"USER-OMP Package"_Speed_omp.html : for OpenMP threading and generic CPU optimizations +"OPT Package"_Speed_opt.html : generic CPU optimizations :tb(s=:) Inverting this list, LAMMPS currently has acceleration support for three kinds of hardware, via the listed packages: -Many-core CPUs : "USER-INTEL"_accelerate_intel.html, "KOKKOS"_accelerate_kokkos.html, "USER-OMP"_accelerate_omp.html, "OPT"_accelerate_opt.html packages -NVIDIA GPUs : "GPU"_accelerate_gpu.html, "KOKKOS"_accelerate_kokkos.html packages -Intel Phi : "USER-INTEL"_accelerate_intel.html, "KOKKOS"_accelerate_kokkos.html packages :tb(s=:) +Many-core CPUs : "USER-INTEL"_Speed_intel.html, "KOKKOS"_Speed_kokkos.html, "USER-OMP"_Speed_omp.html, "OPT"_Speed_opt.html packages +NVIDIA GPUs : "GPU"_Speed_gpu.html, "KOKKOS"_Speed_kokkos.html packages +Intel Phi : "USER-INTEL"_Speed_intel.html, "KOKKOS"_Speed_kokkos.html packages :tb(s=:) Which package is fastest for your hardware may depend on the size problem you are running and what commands (accelerated and diff --git a/doc/src/fix_reax_bonds.txt b/doc/src/fix_reax_bonds.txt index 3f8f237de1..50f0b77d52 100644 --- a/doc/src/fix_reax_bonds.txt +++ b/doc/src/fix_reax_bonds.txt @@ -72,7 +72,7 @@ This fix is not invoked during "energy minimization"_minimize.html. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section_accelerate"_Section_accelerate.html +hardware, as discussed in "Speed"_Speed.html of the manual. The accelerated styles take the same arguments and should produce the same results, except for round-off and precision issues. @@ -87,7 +87,7 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section_accelerate"_Section_accelerate.html of the manual for +See "Speed"_Speed.html of the manual for more instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/fix_reaxc_species.txt b/doc/src/fix_reaxc_species.txt index 7c920791f7..75e4598ca5 100644 --- a/doc/src/fix_reaxc_species.txt +++ b/doc/src/fix_reaxc_species.txt @@ -139,7 +139,7 @@ minimization"_minimize.html. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "Section_accelerate"_Section_accelerate.html +hardware, as discussed in "Speed"_Speed.html of the manual. The accelerated styles take the same arguments and should produce the same results, except for round-off and precision issues. @@ -154,7 +154,7 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "Section_accelerate"_Section_accelerate.html of the manual for +See "Speed"_Speed.html of the manual for more instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_brownian.txt b/doc/src/pair_brownian.txt index 79b71e91c7..8d30f0cec6 100644 --- a/doc/src/pair_brownian.txt +++ b/doc/src/pair_brownian.txt @@ -74,7 +74,7 @@ must be specified. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "this section"_Section_accelerate.html of +hardware, as discussed in "this section"_Speed.html of the manual. The accelerated styles take the same arguments and should produce the same results, except for round-off and precision issues. @@ -88,7 +88,7 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "this section"_Section_accelerate.html of the manual for more +See "this section"_Speed.html of the manual for more instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/pair_lubricate.txt b/doc/src/pair_lubricate.txt index b39c7545c7..2a16aa2a9d 100644 --- a/doc/src/pair_lubricate.txt +++ b/doc/src/pair_lubricate.txt @@ -143,7 +143,7 @@ must be specified. Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available -hardware, as discussed in "this section"_Section_accelerate.html of +hardware, as discussed in "this section"_Speed.html of the manual. The accelerated styles take the same arguments and should produce the same results, except for round-off and precision issues. @@ -157,7 +157,7 @@ by including their suffix, or you can use the "-suffix command-line switch"_Section_start.html#start_6 when you invoke LAMMPS, or you can use the "suffix"_suffix.html command in your input script. -See "this section"_Section_accelerate.html of the manual for more +See "this section"_Speed.html of the manual for more instructions on how to use the accelerated styles effectively. :line diff --git a/doc/src/run_style.txt b/doc/src/run_style.txt index a896a648af..6f1f719d64 100644 --- a/doc/src/run_style.txt +++ b/doc/src/run_style.txt @@ -125,7 +125,7 @@ important performance consideration is the assignment of logical processors in the 2 partitions to the physical cores of a parallel machine. The "processors"_processors.html command has options to support this, and strategies are discussed in "Section -5"_Section_accelerate.html of the manual. +5"_Speed.html of the manual. :line From f3615e83e8f8e72e3c6ad995f9b6fda1aed64946 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Jul 2018 09:18:37 +0200 Subject: [PATCH 113/123] move pair style eam/cd from USER-MISC to MANYBODY and update docs accordingly --- cmake/CMakeLists.txt | 1 - doc/src/Section_commands.txt | 2 +- doc/src/pair_eam.txt | 9 ++--- src/{USER-MISC => MANYBODY}/pair_cdeam.cpp | 0 src/{USER-MISC => MANYBODY}/pair_cdeam.h | 0 src/USER-MISC/Install.sh | 40 ---------------------- src/USER-MISC/README | 1 - 7 files changed, 3 insertions(+), 50 deletions(-) rename src/{USER-MISC => MANYBODY}/pair_cdeam.cpp (100%) rename src/{USER-MISC => MANYBODY}/pair_cdeam.h (100%) delete mode 100755 src/USER-MISC/Install.sh diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 60a0f5d48f..065d22707a 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -178,7 +178,6 @@ pkg_depends(MPIIO MPI) pkg_depends(QEQ MANYBODY) pkg_depends(USER-ATC MANYBODY) pkg_depends(USER-LB MPI) -pkg_depends(USER-MISC MANYBODY) pkg_depends(USER-PHONON KSPACE) pkg_depends(CORESHELL KSPACE) diff --git a/doc/src/Section_commands.txt b/doc/src/Section_commands.txt index 7b9349a233..3f1be036f5 100644 --- a/doc/src/Section_commands.txt +++ b/doc/src/Section_commands.txt @@ -969,6 +969,7 @@ KOKKOS, o = USER-OMP, t = OPT. "dsmc"_pair_dsmc.html, "eam (gikot)"_pair_eam.html, "eam/alloy (gikot)"_pair_eam.html, +"eam/cd (o)"_pair_eam.html, "eam/fs (gikot)"_pair_eam.html, "eim (o)"_pair_eim.html, "gauss (go)"_pair_gauss.html, @@ -1069,7 +1070,6 @@ package"_Section_start.html#start_3. "coul/shield"_pair_coul_shield.html, "dpd/fdt"_pair_dpd_fdt.html, "dpd/fdt/energy (k)"_pair_dpd_fdt.html, -"eam/cd (o)"_pair_eam.html, "edip (o)"_pair_edip.html, "edip/multi"_pair_edip.html, "edpd"_pair_meso.html, diff --git a/doc/src/pair_eam.txt b/doc/src/pair_eam.txt index 03e77f53ab..4ab4e6d794 100644 --- a/doc/src/pair_eam.txt +++ b/doc/src/pair_eam.txt @@ -414,15 +414,10 @@ The eam pair styles can only be used via the {pair} keyword of the [Restrictions:] -All of these styles except the {eam/cd} style are part of the MANYBODY -package. They are only enabled if LAMMPS was built with that package. +All of these styles are part of the MANYBODY package. They are only +enabled if LAMMPS was built with that package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info. -The {eam/cd} style is part of the USER-MISC package and also requires -the MANYBODY package. It is only enabled if LAMMPS was built with -those packages. See the "Making LAMMPS"_Section_start.html#start_3 -section for more info. - [Related commands:] "pair_coeff"_pair_coeff.html diff --git a/src/USER-MISC/pair_cdeam.cpp b/src/MANYBODY/pair_cdeam.cpp similarity index 100% rename from src/USER-MISC/pair_cdeam.cpp rename to src/MANYBODY/pair_cdeam.cpp diff --git a/src/USER-MISC/pair_cdeam.h b/src/MANYBODY/pair_cdeam.h similarity index 100% rename from src/USER-MISC/pair_cdeam.h rename to src/MANYBODY/pair_cdeam.h diff --git a/src/USER-MISC/Install.sh b/src/USER-MISC/Install.sh deleted file mode 100755 index 2d42125ec3..0000000000 --- a/src/USER-MISC/Install.sh +++ /dev/null @@ -1,40 +0,0 @@ -# Install/unInstall package files in LAMMPS -# mode = 0/1/2 for uninstall/install/update - -mode=$1 - -# enforce using portable C locale -LC_ALL=C -export LC_ALL - -# arg1 = file, arg2 = file it depends on - -action () { - if (test $mode = 0) then - rm -f ../$1 - elif (! cmp -s $1 ../$1) then - if (test -z "$2" || test -e ../$2) then - cp $1 .. - if (test $mode = 2) then - echo " updating src/$1" - fi - fi - elif (test ! -n "$2") then - if (test ! -e ../$2) then - rm -f ../$1 - fi - fi -} - -# all package files -# only a few files have dependencies - -for file in *.cpp *.h; do - if (test $file = "pair_cdeam.cpp") then - action pair_cdeam.cpp pair_eam_alloy.cpp - elif (test $file = "pair_cdeam.h") then - action pair_cdeam.h pair_eam_alloy.cpp - else - test -f ${file} && action $file - fi -done diff --git a/src/USER-MISC/README b/src/USER-MISC/README index 68a6252d8d..0f9e7bf383 100644 --- a/src/USER-MISC/README +++ b/src/USER-MISC/README @@ -65,7 +65,6 @@ pair_style buck/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 pair_style coul/diel, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 pair_style dipole/sf, Mario Orsi, orsimario at gmail.com, 8 Aug 11 pair_style edip, Luca Ferraro, luca.ferraro at caspur.it, 15 Sep 11 -pair_style eam/cd, Alexander Stukowski, stukowski at mm.tu-darmstadt.de, 7 Nov 09 pair_style extep, Jaap Kroes (Radboud U), jaapkroes at gmail dot com, 28 Nov 17 pair_style gauss/cut, Axel Kohlmeyer, akohlmey at gmail.com, 1 Dec 11 pair_style lennard/mdf, Paolo Raiteri, p.raiteri at curtin.edu.au, 2 Dec 15 From 24e293326dd290bd94a904d21c4db68ff4a3c2de Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Jul 2018 09:36:35 +0200 Subject: [PATCH 114/123] Remove disabled line and add comment on package dependencies --- cmake/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 1e58a670aa..186639fc1e 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -175,8 +175,9 @@ macro(pkg_depends PKG1 PKG2) endif() endmacro() +# "hard" dependencies between packages resulting +# in an error instead of skipping over files pkg_depends(MPIIO MPI) -#pkg_depends(QEQ MANYBODY) pkg_depends(USER-ATC MANYBODY) pkg_depends(USER-LB MPI) pkg_depends(USER-MISC MANYBODY) From 50fe2097822785f596d98e2750a40e2224af0fae Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Jul 2018 10:24:36 +0200 Subject: [PATCH 115/123] mention -*- cookie for switching emacs modes and clarify file pattern text --- tools/emacs/README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/emacs/README.md b/tools/emacs/README.md index ce502a27e3..75504a7000 100644 --- a/tools/emacs/README.md +++ b/tools/emacs/README.md @@ -39,8 +39,14 @@ would do the following (kanged [from here](http://ergoemacs.org/emacs/emacs_inst ### Autoloading \& Auto-recognition -For autoloading and auto-recognizing `in.*` and `*.lmp` files add the following -to `.emacs`: +To automatically turn on the LAMMPS mode for editing your input scripts, +use the following line as the **first** line of your script: +``` +# -*- lammps -*- +``` + +For automatically switching on the LAMMPS mode based on filename patterns, +e.g. for `in.*` and `*.lmp` files, add the following code to your `.emacs`: ``` emacs-lisp (autoload 'lammps-mode "lammps-mode.el" "LAMMPS mode." t) From 6dad2f59d8bc4ecc68604b712d0072c303e3f2e9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Jul 2018 11:06:09 +0200 Subject: [PATCH 116/123] list @HaoZeke as (new) owner of the LAMMPS emacs mode list code --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 75b79443c3..7f32281192 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -44,6 +44,7 @@ src/USER-MISC/*_grem.* @dstelter92 # tools tools/msi2lmp/* @akohlmey +tools/emacs/* @HaoZeke # cmake cmake/* @junghans @rbberger From 67e70316deedfa95f21edbb9674bacca3dd7d3b0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Jul 2018 16:58:44 +0200 Subject: [PATCH 117/123] rename pair_cdeam.* to pair_eam_cd.* --- src/MANYBODY/{pair_cdeam.cpp => pair_eam_cd.cpp} | 0 src/MANYBODY/{pair_cdeam.h => pair_eam_cd.h} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/MANYBODY/{pair_cdeam.cpp => pair_eam_cd.cpp} (100%) rename src/MANYBODY/{pair_cdeam.h => pair_eam_cd.h} (100%) diff --git a/src/MANYBODY/pair_cdeam.cpp b/src/MANYBODY/pair_eam_cd.cpp similarity index 100% rename from src/MANYBODY/pair_cdeam.cpp rename to src/MANYBODY/pair_eam_cd.cpp diff --git a/src/MANYBODY/pair_cdeam.h b/src/MANYBODY/pair_eam_cd.h similarity index 100% rename from src/MANYBODY/pair_cdeam.h rename to src/MANYBODY/pair_eam_cd.h From e9d40d3c6dc389c8fe3b144349fae04e12b0fb86 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Jul 2018 17:16:18 +0200 Subject: [PATCH 118/123] rename class from PairCDEAM to PairEAMCD --- src/MANYBODY/pair_eam_cd.cpp | 22 +++++++++++----------- src/MANYBODY/pair_eam_cd.h | 18 +++++++++--------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/MANYBODY/pair_eam_cd.cpp b/src/MANYBODY/pair_eam_cd.cpp index 53d9036a61..c0e480488d 100644 --- a/src/MANYBODY/pair_eam_cd.cpp +++ b/src/MANYBODY/pair_eam_cd.cpp @@ -21,7 +21,7 @@ #include #include #include -#include "pair_cdeam.h" +#include "pair_eam_cd.h" #include "atom.h" #include "force.h" #include "comm.h" @@ -49,7 +49,7 @@ using namespace LAMMPS_NS; #define MAXLINE 1024 // This sets the maximum line length in EAM input files. -PairCDEAM::PairCDEAM(LAMMPS *lmp, int _cdeamVersion) : PairEAM(lmp), PairEAMAlloy(lmp), cdeamVersion(_cdeamVersion) +PairEAMCD::PairEAMCD(LAMMPS *lmp, int _cdeamVersion) : PairEAM(lmp), PairEAMAlloy(lmp), cdeamVersion(_cdeamVersion) { single_enable = 0; restartinfo = 0; @@ -72,14 +72,14 @@ PairCDEAM::PairCDEAM(LAMMPS *lmp, int _cdeamVersion) : PairEAM(lmp), PairEAMAllo } } -PairCDEAM::~PairCDEAM() +PairEAMCD::~PairEAMCD() { memory->destroy(rhoB); memory->destroy(D_values); if(hcoeff) delete[] hcoeff; } -void PairCDEAM::compute(int eflag, int vflag) +void PairEAMCD::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; @@ -415,7 +415,7 @@ void PairCDEAM::compute(int eflag, int vflag) /* ---------------------------------------------------------------------- */ -void PairCDEAM::coeff(int narg, char **arg) +void PairEAMCD::coeff(int narg, char **arg) { PairEAMAlloy::coeff(narg, arg); @@ -452,7 +452,7 @@ void PairCDEAM::coeff(int narg, char **arg) /* ---------------------------------------------------------------------- Reads in the h(x) polynomial coefficients ------------------------------------------------------------------------- */ -void PairCDEAM::read_h_coeff(char *filename) +void PairEAMCD::read_h_coeff(char *filename) { if(comm->me == 0) { // Open potential file @@ -494,7 +494,7 @@ void PairCDEAM::read_h_coeff(char *filename) /* ---------------------------------------------------------------------- */ -int PairCDEAM::pack_forward_comm(int n, int *list, double *buf, +int PairEAMCD::pack_forward_comm(int n, int *list, double *buf, int pbc_flag, int *pbc) { int i,j,m; @@ -534,7 +534,7 @@ int PairCDEAM::pack_forward_comm(int n, int *list, double *buf, /* ---------------------------------------------------------------------- */ -void PairCDEAM::unpack_forward_comm(int n, int first, double *buf) +void PairEAMCD::unpack_forward_comm(int n, int first, double *buf) { int i,m,last; @@ -567,7 +567,7 @@ void PairCDEAM::unpack_forward_comm(int n, int first, double *buf) } /* ---------------------------------------------------------------------- */ -int PairCDEAM::pack_reverse_comm(int n, int first, double *buf) +int PairEAMCD::pack_reverse_comm(int n, int first, double *buf) { int i,m,last; @@ -603,7 +603,7 @@ int PairCDEAM::pack_reverse_comm(int n, int first, double *buf) /* ---------------------------------------------------------------------- */ -void PairCDEAM::unpack_reverse_comm(int n, int *list, double *buf) +void PairEAMCD::unpack_reverse_comm(int n, int *list, double *buf) { int i,j,m; @@ -637,7 +637,7 @@ void PairCDEAM::unpack_reverse_comm(int n, int *list, double *buf) /* ---------------------------------------------------------------------- memory usage of local atom-based arrays ------------------------------------------------------------------------- */ -double PairCDEAM::memory_usage() +double PairEAMCD::memory_usage() { double bytes = 2 * nmax * sizeof(double); return PairEAMAlloy::memory_usage() + bytes; diff --git a/src/MANYBODY/pair_eam_cd.h b/src/MANYBODY/pair_eam_cd.h index 934b7601a4..15486aed6d 100644 --- a/src/MANYBODY/pair_eam_cd.h +++ b/src/MANYBODY/pair_eam_cd.h @@ -13,8 +13,8 @@ #ifdef PAIR_CLASS -PairStyle(eam/cd,PairCDEAM_OneSite) -PairStyle(eam/cd/old,PairCDEAM_TwoSite) +PairStyle(eam/cd,PairEAMCD_OneSite) +PairStyle(eam/cd/old,PairEAMCD_TwoSite) #else @@ -25,14 +25,14 @@ PairStyle(eam/cd/old,PairCDEAM_TwoSite) namespace LAMMPS_NS { -class PairCDEAM : public PairEAMAlloy +class PairEAMCD : public PairEAMAlloy { public: /// Constructor. - PairCDEAM(class LAMMPS*, int cdeamVersion); + PairEAMCD(class LAMMPS*, int cdeamVersion); /// Destructor. - virtual ~PairCDEAM(); + virtual ~PairEAMCD(); /// Calculates the energies and forces for all atoms in the system. virtual void compute(int, int); @@ -211,19 +211,19 @@ public: }; /// The one-site concentration formulation of CD-EAM. - class PairCDEAM_OneSite : public PairCDEAM + class PairEAMCD_OneSite : public PairEAMCD { public: /// Constructor. - PairCDEAM_OneSite(class LAMMPS* lmp) : PairEAM(lmp), PairCDEAM(lmp, 1) {} + PairEAMCD_OneSite(class LAMMPS* lmp) : PairEAM(lmp), PairEAMCD(lmp, 1) {} }; /// The two-site concentration formulation of CD-EAM. - class PairCDEAM_TwoSite : public PairCDEAM + class PairEAMCD_TwoSite : public PairEAMCD { public: /// Constructor. - PairCDEAM_TwoSite(class LAMMPS* lmp) : PairEAM(lmp), PairCDEAM(lmp, 2) {} + PairEAMCD_TwoSite(class LAMMPS* lmp) : PairEAM(lmp), PairEAMCD(lmp, 2) {} }; } From c6186bf00d5adcfd11d07c2393f306a1695d587e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Jul 2018 17:36:49 +0200 Subject: [PATCH 119/123] whitespace and formatting update --- src/MANYBODY/pair_eam_cd.cpp | 1081 ++++++++++++++++++---------------- 1 file changed, 557 insertions(+), 524 deletions(-) diff --git a/src/MANYBODY/pair_eam_cd.cpp b/src/MANYBODY/pair_eam_cd.cpp index c0e480488d..66ebad6244 100644 --- a/src/MANYBODY/pair_eam_cd.cpp +++ b/src/MANYBODY/pair_eam_cd.cpp @@ -32,463 +32,507 @@ using namespace LAMMPS_NS; -// This is for debugging purposes. The ASSERT() macro is used in the code to check -// if everything runs as expected. Change this to #if 0 if you don't need the checking. -#if 0 - #define ASSERT(cond) ((!(cond)) ? my_failure(error,__FILE__,__LINE__) : my_noop()) - - inline void my_noop() {} - inline void my_failure(Error* error, const char* file, int line) { - char str[1024]; - sprintf(str,"Assertion failure: File %s, line %i", file, line); - error->one(FLERR,str); - } -#else - #define ASSERT(cond) -#endif - +#define ASSERT(cond) #define MAXLINE 1024 // This sets the maximum line length in EAM input files. -PairEAMCD::PairEAMCD(LAMMPS *lmp, int _cdeamVersion) : PairEAM(lmp), PairEAMAlloy(lmp), cdeamVersion(_cdeamVersion) +PairEAMCD::PairEAMCD(LAMMPS *lmp, int _cdeamVersion) + : PairEAM(lmp), PairEAMAlloy(lmp), cdeamVersion(_cdeamVersion) { - single_enable = 0; - restartinfo = 0; + single_enable = 0; + restartinfo = 0; - rhoB = NULL; - D_values = NULL; - hcoeff = NULL; + rhoB = NULL; + D_values = NULL; + hcoeff = NULL; - // Set communication buffer sizes needed by this pair style. - if(cdeamVersion == 1) { - comm_forward = 4; - comm_reverse = 3; - } - else if(cdeamVersion == 2) { - comm_forward = 3; - comm_reverse = 2; - } - else { - error->all(FLERR,"Invalid CD-EAM potential version."); - } + // Set communication buffer sizes needed by this pair style. + + if (cdeamVersion == 1) { + comm_forward = 4; + comm_reverse = 3; + } else if (cdeamVersion == 2) { + comm_forward = 3; + comm_reverse = 2; + } else { + error->all(FLERR,"Invalid eam/cd potential version."); + } } PairEAMCD::~PairEAMCD() { - memory->destroy(rhoB); - memory->destroy(D_values); - if(hcoeff) delete[] hcoeff; + memory->destroy(rhoB); + memory->destroy(D_values); + if (hcoeff) delete[] hcoeff; } void PairEAMCD::compute(int eflag, int vflag) { - int i,j,ii,jj,inum,jnum,itype,jtype; - double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; - double rsq,rhoip,rhojp,recip,phi; - int *ilist,*jlist,*numneigh,**firstneigh; + int i,j,ii,jj,inum,jnum,itype,jtype; + double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; + double rsq,rhoip,rhojp,recip,phi; + int *ilist,*jlist,*numneigh,**firstneigh; - evdwl = 0.0; - if (eflag || vflag) ev_setup(eflag,vflag); - else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; + evdwl = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = eflag_global = eflag_atom = 0; - // Grow per-atom arrays if necessary - if(atom->nmax > nmax) { - memory->destroy(rho); - memory->destroy(fp); - memory->destroy(rhoB); - memory->destroy(D_values); - nmax = atom->nmax; - memory->create(rho,nmax,"pair:rho"); - memory->create(rhoB,nmax,"pair:rhoB"); - memory->create(fp,nmax,"pair:fp"); - memory->create(D_values,nmax,"pair:D_values"); + // Grow per-atom arrays if necessary + + if (atom->nmax > nmax) { + memory->destroy(rho); + memory->destroy(fp); + memory->destroy(rhoB); + memory->destroy(D_values); + nmax = atom->nmax; + memory->create(rho,nmax,"pair:rho"); + memory->create(rhoB,nmax,"pair:rhoB"); + memory->create(fp,nmax,"pair:fp"); + memory->create(D_values,nmax,"pair:D_values"); + } + + double **x = atom->x; + double **f = atom->f; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // Zero out per-atom arrays. + + int m = nlocal + atom->nghost; + for (i = 0; i < m; i++) { + rho[i] = 0.0; + rhoB[i] = 0.0; + D_values[i] = 0.0; + } + + // Stage I + + // Compute rho and rhoB at each local atom site. + + // Additionally calculate the D_i values here if we are using the + // one-site formulation. For the two-site formulation we have to + // calculate the D values in an extra loop (Stage II). + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cutforcesq) { + jtype = type[j]; + double r = sqrt(rsq); + const EAMTableIndex index = radiusToTableIndex(r); + double localrho = RhoOfR(index, jtype, itype); + rho[i] += localrho; + if (jtype == speciesB) rhoB[i] += localrho; + if (newton_pair || j < nlocal) { + localrho = RhoOfR(index, itype, jtype); + rho[j] += localrho; + if (itype == speciesB) rhoB[j] += localrho; } - double **x = atom->x; - double **f = atom->f; - int *type = atom->type; - int nlocal = atom->nlocal; - int newton_pair = force->newton_pair; + if (cdeamVersion == 1 && itype != jtype) { - inum = list->inum; - ilist = list->ilist; - numneigh = list->numneigh; - firstneigh = list->firstneigh; + // Note: if the i-j interaction is not concentration dependent (because either + // i or j are not species A or B) then its contribution to D_i and D_j should + // be ignored. + // This if-clause is only required for a ternary. - // Zero out per-atom arrays. - int m = nlocal + atom->nghost; - for(i = 0; i < m; i++) { - rho[i] = 0.0; - rhoB[i] = 0.0; - D_values[i] = 0.0; + if ((itype == speciesA && jtype == speciesB) + || (jtype == speciesA && itype == speciesB)) { + double Phi_AB = PhiOfR(index, itype, jtype, 1.0 / r); + D_values[i] += Phi_AB; + if (newton_pair || j < nlocal) + D_values[j] += Phi_AB; + } + } + } + } + } + + // Communicate and sum densities. + + if (newton_pair) { + communicationStage = 1; + comm->reverse_comm_pair(this); + } + + // fp = derivative of embedding energy at each atom + // phi = embedding energy at each atom + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + EAMTableIndex index = rhoToTableIndex(rho[i]); + fp[i] = FPrimeOfRho(index, type[i]); + if (eflag) { + phi = FofRho(index, type[i]); + if (eflag_global) eng_vdwl += phi; + if (eflag_atom) eatom[i] += phi; + } + } + + // Communicate derivative of embedding function and densities + // and D_values (this for one-site formulation only). + + communicationStage = 2; + comm->forward_comm_pair(this); + + // The electron densities may not drop to zero because then the + // concentration would no longer be defined. But the concentration + // is not needed anyway if there is no interaction with another atom, + // which is the case if the electron density is exactly zero. + // That's why the following lines have been commented out. + // + //for (i = 0; i < nlocal + atom->nghost; i++) { + // if (rho[i] == 0 && (type[i] == speciesA || type[i] == speciesB)) + // error->one(FLERR,"CD-EAM potential routine: Detected atom with zero electron density."); + //} + + // Stage II + // This is only required for the original two-site formulation of the CD-EAM potential. + + if (cdeamVersion == 2) { + + // Compute intermediate value D_i for each atom. + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + + // This code line is required for ternary alloys. + + if (itype != speciesA && itype != speciesB) continue; + + double x_i = rhoB[i] / rho[i]; // Concentration at atom i. + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + jtype = type[j]; + if (itype == jtype) continue; + + // This code line is required for ternary alloys. + + if (jtype != speciesA && jtype != speciesB) continue; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cutforcesq) { + double r = sqrt(rsq); + const EAMTableIndex index = radiusToTableIndex(r); + + // The concentration independent part of the cross pair potential. + + double Phi_AB = PhiOfR(index, itype, jtype, 1.0 / r); + + // Average concentration of two sites + + double x_ij = 0.5 * (x_i + rhoB[j]/rho[j]); + + // Calculate derivative of h(x_ij) polynomial function. + + double h_prime = evalHprime(x_ij); + + D_values[i] += h_prime * Phi_AB / (2.0 * rho[i] * rho[i]); + if (newton_pair || j < nlocal) + D_values[j] += h_prime * Phi_AB / (2.0 * rho[j] * rho[j]); + } + } + } + + // Communicate and sum D values. + + if (newton_pair) { + communicationStage = 3; + comm->reverse_comm_pair(this); + } + communicationStage = 4; + comm->forward_comm_pair(this); + } + + // Stage III + + // Compute force acting on each atom. + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xtmp = x[i][0]; + ytmp = x[i][1]; + ztmp = x[i][2]; + itype = type[i]; + + jlist = firstneigh[i]; + jnum = numneigh[i]; + + // Concentration at site i + // The value -1 indicates: no concentration dependence for all interactions of atom i. + // It will be replaced by the concentration at site i if atom i is either A or B. + + double x_i = -1.0; + double D_i, h_prime_i; + + // This if-clause is only required for ternary alloys. + + if ((itype == speciesA || itype == speciesB) && rho[i] != 0.0) { + + // Compute local concentration at site i. + + x_i = rhoB[i]/rho[i]; + ASSERT(x_i >= 0 && x_i<=1.0); + + if (cdeamVersion == 1) { + + // Calculate derivative of h(x_i) polynomial function. + + h_prime_i = evalHprime(x_i); + D_i = D_values[i] * h_prime_i / (2.0 * rho[i] * rho[i]); + } else if (cdeamVersion == 2) { + D_i = D_values[i]; + } else { + ASSERT(false); + } + } + + for (jj = 0; jj < jnum; jj++) { + j = jlist[jj]; + j &= NEIGHMASK; + + delx = xtmp - x[j][0]; + dely = ytmp - x[j][1]; + delz = ztmp - x[j][2]; + rsq = delx*delx + dely*dely + delz*delz; + + if (rsq < cutforcesq) { + jtype = type[j]; + double r = sqrt(rsq); + const EAMTableIndex index = radiusToTableIndex(r); + + // rhoip = derivative of (density at atom j due to atom i) + // rhojp = derivative of (density at atom i due to atom j) + // psip needs both fp[i] and fp[j] terms since r_ij appears in two + // terms of embed eng: Fi(sum rho_ij) and Fj(sum rho_ji) + // hence embed' = Fi(sum rho_ij) rhojp + Fj(sum rho_ji) rhoip + + rhoip = RhoPrimeOfR(index, itype, jtype); + rhojp = RhoPrimeOfR(index, jtype, itype); + fpair = fp[i]*rhojp + fp[j]*rhoip; + recip = 1.0/r; + + // The value -1 indicates: no concentration dependence for this + // i-j pair because atom j is not of species A nor B. + + double x_j = -1; + + // This code line is required for ternary alloy. + + if (jtype == speciesA || jtype == speciesB) { + ASSERT(rho[i] != 0.0); + ASSERT(rho[j] != 0.0); + + // Compute local concentration at site j. + + x_j = rhoB[j]/rho[j]; + ASSERT(x_j >= 0 && x_j<=1.0); + + double D_j=0.0; + if (cdeamVersion == 1) { + + // Calculate derivative of h(x_j) polynomial function. + + double h_prime_j = evalHprime(x_j); + D_j = D_values[j] * h_prime_j / (2.0 * rho[j] * rho[j]); + } else if (cdeamVersion == 2) { + D_j = D_values[j]; + } else { + ASSERT(false); + } + double t2 = -rhoB[j]; + if (itype == speciesB) t2 += rho[j]; + fpair += D_j * rhoip * t2; } - // Stage I + // This if-clause is only required for a ternary alloy. + // Actually we don't need it at all because D_i should be zero + // anyway if atom i has no concentration dependent interactions + // (because it is not species A or B). - // Compute rho and rhoB at each local atom site. - // Additionally calculate the D_i values here if we are using the one-site formulation. - // For the two-site formulation we have to calculate the D values in an extra loop (Stage II). - for(ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itype = type[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - for(jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - - if(rsq < cutforcesq) { - jtype = type[j]; - double r = sqrt(rsq); - const EAMTableIndex index = radiusToTableIndex(r); - double localrho = RhoOfR(index, jtype, itype); - rho[i] += localrho; - if(jtype == speciesB) rhoB[i] += localrho; - if(newton_pair || j < nlocal) { - localrho = RhoOfR(index, itype, jtype); - rho[j] += localrho; - if(itype == speciesB) rhoB[j] += localrho; - } - - if(cdeamVersion == 1 && itype != jtype) { - // Note: if the i-j interaction is not concentration dependent (because either - // i or j are not species A or B) then its contribution to D_i and D_j should - // be ignored. - // This if-clause is only required for a ternary. - if((itype == speciesA && jtype == speciesB) || (jtype == speciesA && itype == speciesB)) { - double Phi_AB = PhiOfR(index, itype, jtype, 1.0 / r); - D_values[i] += Phi_AB; - if(newton_pair || j < nlocal) - D_values[j] += Phi_AB; - } - } - } - } + if (x_i != -1.0) { + double t1 = -rhoB[i]; + if (jtype == speciesB) t1 += rho[i]; + fpair += D_i * rhojp * t1; } - // Communicate and sum densities. - if(newton_pair) { - communicationStage = 1; - comm->reverse_comm_pair(this); + double phip; + double phi = PhiOfR(index, itype, jtype, recip, phip); + if (itype == jtype || x_i == -1.0 || x_j == -1.0) { + + // Case of no concentration dependence. + + fpair += phip; + } else { + + // We have a concentration dependence for the i-j interaction. + + double h=0.0; + if (cdeamVersion == 1) { + + // Calculate h(x_i) polynomial function. + + double h_i = evalH(x_i); + + // Calculate h(x_j) polynomial function. + + double h_j = evalH(x_j); + h = 0.5 * (h_i + h_j); + } else if (cdeamVersion == 2) { + + // Average concentration. + + double x_ij = 0.5 * (x_i + x_j); + + // Calculate h(x_ij) polynomial function. + + h = evalH(x_ij); + } else { + ASSERT(false); + } + fpair += h * phip; + phi *= h; } - // fp = derivative of embedding energy at each atom - // phi = embedding energy at each atom - for(ii = 0; ii < inum; ii++) { - i = ilist[ii]; - EAMTableIndex index = rhoToTableIndex(rho[i]); - fp[i] = FPrimeOfRho(index, type[i]); - if(eflag) { - phi = FofRho(index, type[i]); - if (eflag_global) eng_vdwl += phi; - if (eflag_atom) eatom[i] += phi; - } + // Divide by r_ij and negate to get forces from gradient. + + fpair /= -r; + + f[i][0] += delx*fpair; + f[i][1] += dely*fpair; + f[i][2] += delz*fpair; + if (newton_pair || j < nlocal) { + f[j][0] -= delx*fpair; + f[j][1] -= dely*fpair; + f[j][2] -= delz*fpair; } - // Communicate derivative of embedding function and densities - // and D_values (this for one-site formulation only). - communicationStage = 2; - comm->forward_comm_pair(this); + if (eflag) evdwl = phi; + if (evflag) ev_tally(i,j,nlocal,newton_pair,evdwl,0.0,fpair,delx,dely,delz); + } + } + } - // The electron densities may not drop to zero because then the concentration would no longer be defined. - // But the concentration is not needed anyway if there is no interaction with another atom, which is the case - // if the electron density is exactly zero. That's why the following lines have been commented out. - // - //for(i = 0; i < nlocal + atom->nghost; i++) { - // if(rho[i] == 0 && (type[i] == speciesA || type[i] == speciesB)) - // error->one(FLERR,"CD-EAM potential routine: Detected atom with zero electron density."); - //} - - // Stage II - // This is only required for the original two-site formulation of the CD-EAM potential. - - if(cdeamVersion == 2) { - // Compute intermediate value D_i for each atom. - for(ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itype = type[i]; - jlist = firstneigh[i]; - jnum = numneigh[i]; - - // This code line is required for ternary alloys. - if(itype != speciesA && itype != speciesB) continue; - - double x_i = rhoB[i] / rho[i]; // Concentration at atom i. - - for(jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - jtype = type[j]; - if(itype == jtype) continue; - - // This code line is required for ternary alloys. - if(jtype != speciesA && jtype != speciesB) continue; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - - if(rsq < cutforcesq) { - double r = sqrt(rsq); - const EAMTableIndex index = radiusToTableIndex(r); - - // The concentration independent part of the cross pair potential. - double Phi_AB = PhiOfR(index, itype, jtype, 1.0 / r); - - // Average concentration of two sites - double x_ij = 0.5 * (x_i + rhoB[j]/rho[j]); - - // Calculate derivative of h(x_ij) polynomial function. - double h_prime = evalHprime(x_ij); - - D_values[i] += h_prime * Phi_AB / (2.0 * rho[i] * rho[i]); - if(newton_pair || j < nlocal) - D_values[j] += h_prime * Phi_AB / (2.0 * rho[j] * rho[j]); - } - } - } - - // Communicate and sum D values. - if(newton_pair) { - communicationStage = 3; - comm->reverse_comm_pair(this); - } - communicationStage = 4; - comm->forward_comm_pair(this); - } - - // Stage III - - // Compute force acting on each atom. - for(ii = 0; ii < inum; ii++) { - i = ilist[ii]; - xtmp = x[i][0]; - ytmp = x[i][1]; - ztmp = x[i][2]; - itype = type[i]; - - jlist = firstneigh[i]; - jnum = numneigh[i]; - - // Concentration at site i - double x_i = -1.0; // The value -1 indicates: no concentration dependence for all interactions of atom i. - // It will be replaced by the concentration at site i if atom i is either A or B. - - double D_i, h_prime_i; - - // This if-clause is only required for ternary alloys. - if((itype == speciesA || itype == speciesB) && rho[i] != 0.0) { - - // Compute local concentration at site i. - x_i = rhoB[i]/rho[i]; - ASSERT(x_i >= 0 && x_i<=1.0); - - if(cdeamVersion == 1) { - // Calculate derivative of h(x_i) polynomial function. - h_prime_i = evalHprime(x_i); - D_i = D_values[i] * h_prime_i / (2.0 * rho[i] * rho[i]); - } else if(cdeamVersion == 2) { - D_i = D_values[i]; - } else { - ASSERT(false); - } - } - - for(jj = 0; jj < jnum; jj++) { - j = jlist[jj]; - j &= NEIGHMASK; - - delx = xtmp - x[j][0]; - dely = ytmp - x[j][1]; - delz = ztmp - x[j][2]; - rsq = delx*delx + dely*dely + delz*delz; - - if(rsq < cutforcesq) { - jtype = type[j]; - double r = sqrt(rsq); - const EAMTableIndex index = radiusToTableIndex(r); - - // rhoip = derivative of (density at atom j due to atom i) - // rhojp = derivative of (density at atom i due to atom j) - // psip needs both fp[i] and fp[j] terms since r_ij appears in two - // terms of embed eng: Fi(sum rho_ij) and Fj(sum rho_ji) - // hence embed' = Fi(sum rho_ij) rhojp + Fj(sum rho_ji) rhoip - rhoip = RhoPrimeOfR(index, itype, jtype); - rhojp = RhoPrimeOfR(index, jtype, itype); - fpair = fp[i]*rhojp + fp[j]*rhoip; - recip = 1.0/r; - - double x_j = -1; // The value -1 indicates: no concentration dependence for this i-j pair - // because atom j is not of species A nor B. - - // This code line is required for ternary alloy. - if(jtype == speciesA || jtype == speciesB) { - ASSERT(rho[i] != 0.0); - ASSERT(rho[j] != 0.0); - - // Compute local concentration at site j. - x_j = rhoB[j]/rho[j]; - ASSERT(x_j >= 0 && x_j<=1.0); - - double D_j=0.0; - if(cdeamVersion == 1) { - // Calculate derivative of h(x_j) polynomial function. - double h_prime_j = evalHprime(x_j); - D_j = D_values[j] * h_prime_j / (2.0 * rho[j] * rho[j]); - } else if(cdeamVersion == 2) { - D_j = D_values[j]; - } else { - ASSERT(false); - } - double t2 = -rhoB[j]; - if(itype == speciesB) t2 += rho[j]; - fpair += D_j * rhoip * t2; - } - - // This if-clause is only required for a ternary alloy. - // Actually we don't need it at all because D_i should be zero anyway if - // atom i has no concentration dependent interactions (because it is not species A or B). - if(x_i != -1.0) { - double t1 = -rhoB[i]; - if(jtype == speciesB) t1 += rho[i]; - fpair += D_i * rhojp * t1; - } - - double phip; - double phi = PhiOfR(index, itype, jtype, recip, phip); - if(itype == jtype || x_i == -1.0 || x_j == -1.0) { - // Case of no concentration dependence. - fpair += phip; - } else { - // We have a concentration dependence for the i-j interaction. - double h=0.0; - if(cdeamVersion == 1) { - // Calculate h(x_i) polynomial function. - double h_i = evalH(x_i); - // Calculate h(x_j) polynomial function. - double h_j = evalH(x_j); - h = 0.5 * (h_i + h_j); - } else if(cdeamVersion == 2) { - // Average concentration. - double x_ij = 0.5 * (x_i + x_j); - // Calculate h(x_ij) polynomial function. - h = evalH(x_ij); - } else { - ASSERT(false); - } - fpair += h * phip; - phi *= h; - } - - // Divide by r_ij and negate to get forces from gradient. - fpair /= -r; - - f[i][0] += delx*fpair; - f[i][1] += dely*fpair; - f[i][2] += delz*fpair; - if(newton_pair || j < nlocal) { - f[j][0] -= delx*fpair; - f[j][1] -= dely*fpair; - f[j][2] -= delz*fpair; - } - - if(eflag) evdwl = phi; - if(evflag) ev_tally(i,j,nlocal,newton_pair,evdwl,0.0,fpair,delx,dely,delz); - } - } - } - - if(vflag_fdotr) virial_fdotr_compute(); + if (vflag_fdotr) virial_fdotr_compute(); } /* ---------------------------------------------------------------------- */ void PairEAMCD::coeff(int narg, char **arg) { - PairEAMAlloy::coeff(narg, arg); + PairEAMAlloy::coeff(narg, arg); - // Make sure the EAM file is a CD-EAM binary alloy. - if(setfl->nelements < 2) - error->all(FLERR,"The EAM file must contain at least 2 elements to be used with the eam/cd pair style."); + // Make sure the EAM file is a CD-EAM binary alloy. - // Read in the coefficients of the h polynomial from the end of the EAM file. - read_h_coeff(arg[2]); + if (setfl->nelements < 2) + error->all(FLERR,"The EAM file must contain at least 2 elements to be used with the eam/cd pair style."); - // Determine which atom type is the A species and which is the B species in the alloy. - // By default take the first element (index 0) in the EAM file as the A species - // and the second element (index 1) in the EAM file as the B species. - speciesA = -1; - speciesB = -1; - for(int i = 1; i <= atom->ntypes; i++) { - if(map[i] == 0) { - if(speciesA >= 0) - error->all(FLERR,"The first element from the EAM file may only be mapped to a single atom type."); - speciesA = i; - } - if(map[i] == 1) { - if(speciesB >= 0) - error->all(FLERR,"The second element from the EAM file may only be mapped to a single atom type."); - speciesB = i; - } - } - if(speciesA < 0) - error->all(FLERR,"The first element from the EAM file must be mapped to exactly one atom type."); - if(speciesB < 0) - error->all(FLERR,"The second element from the EAM file must be mapped to exactly one atom type."); + // Read in the coefficients of the h polynomial from the end of the EAM file. + + read_h_coeff(arg[2]); + + // Determine which atom type is the A species and which is the B + // species in the alloy. By default take the first element (index 0) + // in the EAM file as the A species and the second element (index 1) + // in the EAM file as the B species. + + speciesA = -1; + speciesB = -1; + for (int i = 1; i <= atom->ntypes; i++) { + if (map[i] == 0) { + if (speciesA >= 0) + error->all(FLERR,"The first element from the EAM file may only be mapped to a single atom type."); + speciesA = i; + } + if (map[i] == 1) { + if (speciesB >= 0) + error->all(FLERR,"The second element from the EAM file may only be mapped to a single atom type."); + speciesB = i; + } + } + if (speciesA < 0) + error->all(FLERR,"The first element from the EAM file must be mapped to exactly one atom type."); + if (speciesB < 0) + error->all(FLERR,"The second element from the EAM file must be mapped to exactly one atom type."); } /* ---------------------------------------------------------------------- Reads in the h(x) polynomial coefficients ------------------------------------------------------------------------- */ + void PairEAMCD::read_h_coeff(char *filename) { - if(comm->me == 0) { - // Open potential file - FILE *fptr; - char line[MAXLINE]; - char nextline[MAXLINE]; - fptr = force->open_potential(filename); - if (fptr == NULL) { - char str[128]; - sprintf(str,"Cannot open EAM potential file %s", filename); - error->one(FLERR,str); - } + if (comm->me == 0) { - // h coefficients are stored at the end of the file. - // Skip to last line of file. - while(fgets(nextline, MAXLINE, fptr) != NULL) { - strcpy(line, nextline); - } - char* ptr = strtok(line, " \t\n\r\f"); - int degree = atoi(ptr); - nhcoeff = degree+1; - hcoeff = new double[nhcoeff]; - int i = 0; - while((ptr = strtok(NULL," \t\n\r\f")) != NULL && i < nhcoeff) { - hcoeff[i++] = atof(ptr); - } - if(i != nhcoeff || nhcoeff < 1) - error->one(FLERR,"Failed to read h(x) function coefficients from EAM file."); + // Open potential file - // Close the potential file. - fclose(fptr); - } + FILE *fptr; + char line[MAXLINE]; + char nextline[MAXLINE]; + fptr = force->open_potential(filename); + if (fptr == NULL) { + char str[128]; + sprintf(str,"Cannot open EAM potential file %s", filename); + error->one(FLERR,str); + } - MPI_Bcast(&nhcoeff, 1, MPI_INT, 0, world); - if(comm->me != 0) hcoeff = new double[nhcoeff]; - MPI_Bcast(hcoeff, nhcoeff, MPI_DOUBLE, 0, world); + // h coefficients are stored at the end of the file. + // Skip to last line of file. + + while(fgets(nextline, MAXLINE, fptr) != NULL) { + strcpy(line, nextline); + } + char* ptr = strtok(line, " \t\n\r\f"); + int degree = atoi(ptr); + nhcoeff = degree+1; + hcoeff = new double[nhcoeff]; + int i = 0; + while((ptr = strtok(NULL," \t\n\r\f")) != NULL && i < nhcoeff) { + hcoeff[i++] = atof(ptr); + } + if (i != nhcoeff || nhcoeff < 1) + error->one(FLERR,"Failed to read h(x) function coefficients from EAM file."); + + // Close the potential file. + + fclose(fptr); + } + + MPI_Bcast(&nhcoeff, 1, MPI_INT, 0, world); + if (comm->me != 0) hcoeff = new double[nhcoeff]; + MPI_Bcast(hcoeff, nhcoeff, MPI_DOUBLE, 0, world); } @@ -497,141 +541,130 @@ void PairEAMCD::read_h_coeff(char *filename) int PairEAMCD::pack_forward_comm(int n, int *list, double *buf, int pbc_flag, int *pbc) { - int i,j,m; + int i,j,m; - m = 0; - if(communicationStage == 2) { - if(cdeamVersion == 1) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = fp[j]; - buf[m++] = rho[j]; - buf[m++] = rhoB[j]; - buf[m++] = D_values[j]; - } - return m; - } - else if(cdeamVersion == 2) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = fp[j]; - buf[m++] = rho[j]; - buf[m++] = rhoB[j]; - } - return m; - } - else { ASSERT(false); return 0; } - } - else if(communicationStage == 4) { - for (i = 0; i < n; i++) { - j = list[i]; - buf[m++] = D_values[j]; - } - return m; - } - else return 0; + m = 0; + if (communicationStage == 2) { + if (cdeamVersion == 1) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = fp[j]; + buf[m++] = rho[j]; + buf[m++] = rhoB[j]; + buf[m++] = D_values[j]; + } + return m; + } else if (cdeamVersion == 2) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = fp[j]; + buf[m++] = rho[j]; + buf[m++] = rhoB[j]; + } + return m; + } else { ASSERT(false); return 0; } + } else if (communicationStage == 4) { + for (i = 0; i < n; i++) { + j = list[i]; + buf[m++] = D_values[j]; + } + return m; + } else return 0; } /* ---------------------------------------------------------------------- */ void PairEAMCD::unpack_forward_comm(int n, int first, double *buf) { - int i,m,last; + int i,m,last; - m = 0; - last = first + n; - if(communicationStage == 2) { - if(cdeamVersion == 1) { - for(i = first; i < last; i++) { - fp[i] = buf[m++]; - rho[i] = buf[m++]; - rhoB[i] = buf[m++]; - D_values[i] = buf[m++]; - } - } - else if(cdeamVersion == 2) { - for(i = first; i < last; i++) { - fp[i] = buf[m++]; - rho[i] = buf[m++]; - rhoB[i] = buf[m++]; - } - } else { - ASSERT(false); - } - } - else if(communicationStage == 4) { - for(i = first; i < last; i++) { - D_values[i] = buf[m++]; - } - } + m = 0; + last = first + n; + if (communicationStage == 2) { + if (cdeamVersion == 1) { + for (i = first; i < last; i++) { + fp[i] = buf[m++]; + rho[i] = buf[m++]; + rhoB[i] = buf[m++]; + D_values[i] = buf[m++]; + } + } else if (cdeamVersion == 2) { + for (i = first; i < last; i++) { + fp[i] = buf[m++]; + rho[i] = buf[m++]; + rhoB[i] = buf[m++]; + } + } else { + ASSERT(false); + } + } else if (communicationStage == 4) { + for (i = first; i < last; i++) { + D_values[i] = buf[m++]; + } + } } /* ---------------------------------------------------------------------- */ int PairEAMCD::pack_reverse_comm(int n, int first, double *buf) { - int i,m,last; + int i,m,last; - m = 0; - last = first + n; + m = 0; + last = first + n; - if(communicationStage == 1) { - if(cdeamVersion == 1) { - for(i = first; i < last; i++) { - buf[m++] = rho[i]; - buf[m++] = rhoB[i]; - buf[m++] = D_values[i]; - } - return m; - } - else if(cdeamVersion == 2) { - for(i = first; i < last; i++) { - buf[m++] = rho[i]; - buf[m++] = rhoB[i]; - } - return m; - } - else { ASSERT(false); return 0; } - } - else if(communicationStage == 3) { - for(i = first; i < last; i++) { - buf[m++] = D_values[i]; - } - return m; - } - else return 0; + if (communicationStage == 1) { + if (cdeamVersion == 1) { + for (i = first; i < last; i++) { + buf[m++] = rho[i]; + buf[m++] = rhoB[i]; + buf[m++] = D_values[i]; + } + return m; + } else if (cdeamVersion == 2) { + for (i = first; i < last; i++) { + buf[m++] = rho[i]; + buf[m++] = rhoB[i]; + } + return m; + } else { ASSERT(false); return 0; } + } else if (communicationStage == 3) { + for (i = first; i < last; i++) { + buf[m++] = D_values[i]; + } + return m; + } else return 0; } /* ---------------------------------------------------------------------- */ void PairEAMCD::unpack_reverse_comm(int n, int *list, double *buf) { - int i,j,m; + int i,j,m; - m = 0; - if(communicationStage == 1) { - if(cdeamVersion == 1) { - for(i = 0; i < n; i++) { - j = list[i]; - rho[j] += buf[m++]; - rhoB[j] += buf[m++]; - D_values[j] += buf[m++]; - } - } else if(cdeamVersion == 2) { - for(i = 0; i < n; i++) { - j = list[i]; - rho[j] += buf[m++]; - rhoB[j] += buf[m++]; - } - } else { - ASSERT(false); - } - } - else if(communicationStage == 3) { - for(i = 0; i < n; i++) { - j = list[i]; - D_values[j] += buf[m++]; - } - } + m = 0; + if (communicationStage == 1) { + if (cdeamVersion == 1) { + for (i = 0; i < n; i++) { + j = list[i]; + rho[j] += buf[m++]; + rhoB[j] += buf[m++]; + D_values[j] += buf[m++]; + } + } else if (cdeamVersion == 2) { + for (i = 0; i < n; i++) { + j = list[i]; + rho[j] += buf[m++]; + rhoB[j] += buf[m++]; + } + } else { + ASSERT(false); + } + } else if (communicationStage == 3) { + for (i = 0; i < n; i++) { + j = list[i]; + D_values[j] += buf[m++]; + } + } } /* ---------------------------------------------------------------------- @@ -639,6 +672,6 @@ void PairEAMCD::unpack_reverse_comm(int n, int *list, double *buf) ------------------------------------------------------------------------- */ double PairEAMCD::memory_usage() { - double bytes = 2 * nmax * sizeof(double); - return PairEAMAlloy::memory_usage() + bytes; + double bytes = 2 * nmax * sizeof(double); + return PairEAMAlloy::memory_usage() + bytes; } From 77e5445bfe967dac65406aa62ac0a70ba6a4d35c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 31 Jul 2018 14:16:54 -0400 Subject: [PATCH 120/123] Need to purge old pair_cdeam.* files --- src/Purge.list | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Purge.list b/src/Purge.list index cd4eb17dab..cb98636b1c 100644 --- a/src/Purge.list +++ b/src/Purge.list @@ -24,6 +24,9 @@ style_nstencil.h style_ntopo.h # other auto-generated files lmpinstalledpkgs.h +# renamed on 31 July 2018 +pair_cdeam.h +pair_cdeam.cpp # renamed on 20 July 2018 pair_body.h pair_body.cpp From c8be5a3f2d9258a5390e78b4c68a2a842bbf34a9 Mon Sep 17 00:00:00 2001 From: Michael King Date: Wed, 1 Aug 2018 11:11:18 +0200 Subject: [PATCH 121/123] change ave/histo to ave/histo/weight --- examples/USER/diffraction/BulkNi.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/USER/diffraction/BulkNi.in b/examples/USER/diffraction/BulkNi.in index a18163175c..0fa9c1b74c 100644 --- a/examples/USER/diffraction/BulkNi.in +++ b/examples/USER/diffraction/BulkNi.in @@ -20,7 +20,7 @@ compute XRD all xrd 1.541838 Ni 2Theta 40 80 c 2 2 2 LP 1 echo compute SAED all saed 0.0251 Ni Kmax 0.85 Zone 1 0 0 c 0.025 0.025 0.025 & dR_Ewald 0.05 echo manual -fix 1 all ave/histo 1 1 1 40 80 200 c_XRD[1] c_XRD[2] & +fix 1 all ave/histo/weight 1 1 1 40 80 200 c_XRD[1] c_XRD[2] & mode vector file $A.hist.xrd fix 2 all saed/vtk 1 1 1 c_SAED file $A_001.saed From 42948b60ee7ef0cf8028d938ec594e42071e08db Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 1 Aug 2018 14:37:03 +0200 Subject: [PATCH 122/123] corrections for broken links in the html docs --- doc/src/Section_howto.txt | 4 ++-- doc/src/fixes.txt | 2 ++ doc/src/pairs.txt | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/doc/src/Section_howto.txt b/doc/src/Section_howto.txt index f929d3bdab..337880ccee 100644 --- a/doc/src/Section_howto.txt +++ b/doc/src/Section_howto.txt @@ -1158,7 +1158,7 @@ styles"_pair_style.html that generate torque: "pair_style lubricate"_pair_lubricate.html "pair_style line/lj"_pair_line_lj.html "pair_style tri/lj"_pair_tri_lj.html -"pair_style body"_pair_body.html :ul +"pair_style body"_pair_body_nparticle.html :ul The granular pair styles are used with spherical particles. The dipole pair style is used with the dipole atom style, which could be @@ -1269,7 +1269,7 @@ list of sub-particles. Individual body partices are typically treated as rigid bodies, and their motion integrated with a command like "fix nve/body"_fix_nve_body.html. Interactions between pairs of body particles are computed via a command like "pair_style -body"_pair_body.html. +body"_pair_body_nparticle.html. :line diff --git a/doc/src/fixes.txt b/doc/src/fixes.txt index 9510217d02..7a45ed8086 100644 --- a/doc/src/fixes.txt +++ b/doc/src/fixes.txt @@ -168,6 +168,8 @@ Fixes :h1 fix_viscosity fix_viscous fix_wall + fix_wall_body_polygon + fix_wall_body_polyhedron fix_wall_ees fix_wall_gran fix_wall_gran_region diff --git a/doc/src/pairs.txt b/doc/src/pairs.txt index 1a5e98a109..4c3eef2cd1 100644 --- a/doc/src/pairs.txt +++ b/doc/src/pairs.txt @@ -10,8 +10,9 @@ Pair Styles :h1 pair_airebo pair_awpmd pair_beck - pair_body + pair_body_nparticle pair_body_rounded_polygon + pair_body_rounded_polyhedron pair_bop pair_born pair_brownian From d598e7c60efa5f04e98d7ec0523c3db8a356d209 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 1 Aug 2018 15:54:46 +0200 Subject: [PATCH 123/123] rename preprocessor guard to prevent multiple inclusion to be consistent with file name --- src/MANYBODY/pair_eam_cd.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MANYBODY/pair_eam_cd.h b/src/MANYBODY/pair_eam_cd.h index 15486aed6d..ee84fb09c5 100644 --- a/src/MANYBODY/pair_eam_cd.h +++ b/src/MANYBODY/pair_eam_cd.h @@ -18,8 +18,8 @@ PairStyle(eam/cd/old,PairEAMCD_TwoSite) #else -#ifndef LMP_PAIR_CDEAM_H -#define LMP_PAIR_CDEAM_H +#ifndef LMP_PAIR_EAM_CD_H +#define LMP_PAIR_EAM_CD_H #include "pair_eam_alloy.h"

v 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 Rg#jD8>#$nFjN?$MP(=SVXSJ5>3+ak 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