| lj/coul | reax/c
@@ -425,7 +425,7 @@ potentials. Click on the style itself for a full description:
See the bond_style command for an overview of bond
potentials. Click on the style itself for a full description:
-
+
| none | hybrid | class2 | fene |
| fene/expand | harmonic | morse | nonlinear |
| quartic | table
@@ -438,7 +438,7 @@ potentials. Click on the style itself for a full description:
See the angle_style command for an overview of
angle potentials. Click on the style itself for a full description:
-
+
| none | hybrid | charmm | class2 |
| cosine | cosine/delta | cosine/periodic | cosine/squared |
| harmonic | table
@@ -447,7 +447,7 @@ angle potentials. Click on the style itself for a full description:
These are angle styles contributed by users, which can be used if
LAMMPS is built with the appropriate package.
-
+
@@ -459,7 +459,7 @@ angle potentials. Click on the style itself for a full description:
of dihedral potentials. Click on the style itself for a full
description:
-
+
@@ -472,7 +472,7 @@ description:
of improper potentials. Click on the style itself for a full
description:
-
+
@@ -484,14 +484,14 @@ description:
See the kspace_style command for an overview of
Kspace solvers. Click on the style itself for a full description:
-
+
These are Kspace solvers contributed by users, which can be used if
LAMMPS is built with the appropriate package.
-
+
diff --git a/doc/variable.html b/doc/variable.html
index 7f913caf8c..65c519b438 100644
--- a/doc/variable.html
+++ b/doc/variable.html
@@ -52,11 +52,13 @@
group functions = count(group), mass(group), charge(group),
xcm(group,dim), vcm(group,dim), fcm(group,dim),
bound(group,xmin), gyration(group), ke(group),
- angmom(group,dim),inertia(group,dimdim),omega(group,dim)
+ angmom(group,dim), torque(group,dim),
+ inertia(group,dimdim), omega(group,dim)
region functions = count(group,region), mass(group,region), charge(group,region),
xcm(group,dim,region), vcm(group,dim,region), fcm(group,dim,region),
bound(group,xmin,region), gyration(group,region), ke(group,reigon),
- angmom(group,dim,region), inertia(group,dimdim,region),omega(group,dim,region)
+ angmom(group,dim,region), torque(group,dim,region),
+ inertia(group,dimdim,region), omega(group,dim,region)
special functions = sum(x), min(x), max(x), ave(x), trap(x), gmask(x), rmask(x), grmask(x,y)
atom value = mass[i], type[i], x[i], y[i], z[i], vx[i], vy[i], vz[i], fx[i], fy[i], fz[i]
atom vector = mass, type, x, y, z, vx, vy, vz, fx, fy, fz
@@ -274,8 +276,8 @@ references to other variables.
| Thermo keywords | vol, pe, ebond, etc |
| Math operators | (), -x, x+y, x-y, x*y, x/y, x^y, x==y, x!=y, xy, x>=y, x&&y, x||y, !x |
| Math functions | sqrt(x), exp(x), ln(x), log(x), sin(x), cos(x), tan(x), asin(x), acos(x), atan(x), atan2(y,x), random(x,y,z), normal(x,y,z), ceil(x), floor(x), round(x), ramp(x,y), stagger(x,y), logfreq(x,y,z), vdisplace(x,y), swiggle(x,y,z), cwiggle(x,y,z) |
-| Group functions | count(ID), mass(ID), charge(ID), xcm(ID,dim), vcm(ID,dim), fcm(ID,dim), bound(ID,dir), gyration(ID), ke(ID), angmom(ID,dim), inertia(ID,dimdim), omega(ID,dim) |
-| Region functions | count(ID,IDR), mass(ID,IDR), charge(ID,IDR), xcm(ID,dim,IDR), vcm(ID,dim,IDR), fcm(ID,dim,IDR), bound(ID,dir,IDR), gyration(ID,IDR), ke(ID,IDR), angmom(ID,dim,IDR), inertia(ID,dimdim,IDR), omega(ID,dim,IDR) |
+| Group functions | count(ID), mass(ID), charge(ID), xcm(ID,dim), vcm(ID,dim), fcm(ID,dim), bound(ID,dir), gyration(ID), ke(ID), angmom(ID,dim), torque(ID,dim), inertia(ID,dimdim), omega(ID,dim) |
+| Region functions | count(ID,IDR), mass(ID,IDR), charge(ID,IDR), xcm(ID,dim,IDR), vcm(ID,dim,IDR), fcm(ID,dim,IDR), bound(ID,dir,IDR), gyration(ID,IDR), ke(ID,IDR), angmom(ID,dim,IDR), torque(ID,dim,IDR), inertia(ID,dimdim,IDR), omega(ID,dim,IDR) |
| Special functions | sum(x), min(x), max(x), ave(x), trap(x), gmask(x), rmask(x), grmask(x,y) |
| Atom values | mass[i], type[i], x[i], y[i], z[i], vx[i], vy[i], vz[i], fx[i], fy[i], fz[i] |
| Atom vectors | mass, type, x, y, z, vx, vy, vz, fx, fy, fz |
@@ -476,10 +478,12 @@ the min/max of a particular coordinate for all atoms in the group.
Gyration() computes the radius-of-gyration of the group of atoms. See
the compute gyration command for a definition
of the formula. Angmom() returns components of the angular momentum
-of the group of atoms around its center of mass. Inertia() returns
-one of 6 components of the inertia tensor of the group of atoms around
-its center of mass. Omega() returns components of the angular
-velocity of the group of atoms around its center of mass.
+of the group of atoms around its center of mass. Torque() returns
+components of the torque on the group of atoms around its center of
+mass, based on current forces on the atoms. Inertia() returns one of
+6 components of the inertia tensor of the group of atoms around its
+center of mass. Omega() returns components of the angular velocity of
+the group of atoms around its center of mass.
Region functions are specified exactly the same way as group functions
except they take an extra argument which is the region ID. The
diff --git a/doc/variable.txt b/doc/variable.txt
index ae68785dbe..f7cb1c088d 100644
--- a/doc/variable.txt
+++ b/doc/variable.txt
@@ -47,11 +47,13 @@ style = {delete} or {index} or {loop} or {world} or {universe} or {uloop} or {st
group functions = count(group), mass(group), charge(group),
xcm(group,dim), vcm(group,dim), fcm(group,dim),
bound(group,xmin), gyration(group), ke(group),
- angmom(group,dim),inertia(group,dimdim),omega(group,dim)
+ angmom(group,dim), torque(group,dim),
+ inertia(group,dimdim), omega(group,dim)
region functions = count(group,region), mass(group,region), charge(group,region),
xcm(group,dim,region), vcm(group,dim,region), fcm(group,dim,region),
bound(group,xmin,region), gyration(group,region), ke(group,reigon),
- angmom(group,dim,region), inertia(group,dimdim,region),omega(group,dim,region)
+ angmom(group,dim,region), torque(group,dim,region),
+ inertia(group,dimdim,region), omega(group,dim,region)
special functions = sum(x), min(x), max(x), ave(x), trap(x), gmask(x), rmask(x), grmask(x,y)
atom value = mass\[i\], type\[i\], x\[i\], y\[i\], z\[i\], vx\[i\], vy\[i\], vz\[i\], fx\[i\], fy\[i\], fz\[i\]
atom vector = mass, type, x, y, z, vx, vy, vz, fx, fy, fz
@@ -269,12 +271,13 @@ Math operators: (), -x, x+y, x-y, x*y, x/y, x^y, x==y, x!=y, xy, x>=
Math functions: sqrt(x), exp(x), ln(x), log(x), sin(x), cos(x), tan(x), asin(x), acos(x), atan(x), atan2(y,x), random(x,y,z), normal(x,y,z), ceil(x), floor(x), round(x), ramp(x,y), stagger(x,y), logfreq(x,y,z), vdisplace(x,y), swiggle(x,y,z), cwiggle(x,y,z)
Group functions: count(ID), mass(ID), charge(ID), xcm(ID,dim), \
vcm(ID,dim), fcm(ID,dim), bound(ID,dir), \
- gyration(ID), ke(ID), angmom(ID,dim), \
+ gyration(ID), ke(ID), angmom(ID,dim), torque(ID,dim), \
inertia(ID,dimdim), omega(ID,dim)
Region functions: count(ID,IDR), mass(ID,IDR), charge(ID,IDR), \
xcm(ID,dim,IDR), vcm(ID,dim,IDR), fcm(ID,dim,IDR), \
bound(ID,dir,IDR), gyration(ID,IDR), ke(ID,IDR), \
- angmom(ID,dim,IDR), inertia(ID,dimdim,IDR), omega(ID,dim,IDR)
+ angmom(ID,dim,IDR), torque(ID,dim,IDR), \
+ inertia(ID,dimdim,IDR), omega(ID,dim,IDR)
Special functions: sum(x), min(x), max(x), ave(x), trap(x), gmask(x), rmask(x), grmask(x,y)
Atom values: mass\[i\], type\[i\], x\[i\], y\[i\], z\[i\], \
vx\[i\], vy\[i\], vz\[i\], fx\[i\], fy\[i\], fz\[i\]
@@ -475,10 +478,12 @@ the min/max of a particular coordinate for all atoms in the group.
Gyration() computes the radius-of-gyration of the group of atoms. See
the "compute gyration"_compute_gyration.html command for a definition
of the formula. Angmom() returns components of the angular momentum
-of the group of atoms around its center of mass. Inertia() returns
-one of 6 components of the inertia tensor of the group of atoms around
-its center of mass. Omega() returns components of the angular
-velocity of the group of atoms around its center of mass.
+of the group of atoms around its center of mass. Torque() returns
+components of the torque on the group of atoms around its center of
+mass, based on current forces on the atoms. Inertia() returns one of
+6 components of the inertia tensor of the group of atoms around its
+center of mass. Omega() returns components of the angular velocity of
+the group of atoms around its center of mass.
Region functions are specified exactly the same way as group functions
except they take an extra argument which is the region ID. The
From f830e06f4b81f64c8896043d6edb6fc48c764b98 Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 14:46:00 +0000
Subject: [PATCH 09/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5304
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
src/version.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/version.h b/src/version.h
index 7c46deee24..ada3305c95 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define LAMMPS_VERSION "26 Nov 2010"
+#define LAMMPS_VERSION "27 Nov 2010"
From a029b1d9f58922faeb9ef574804bd820d2e1335d Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 14:54:55 +0000
Subject: [PATCH 10/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5306
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
src/fix_rigid_nvt.cpp | 105 ++++++++++++++++++++++++++++++++++++++----
src/fix_rigid_nvt.h | 1 +
2 files changed, 96 insertions(+), 10 deletions(-)
diff --git a/src/fix_rigid_nvt.cpp b/src/fix_rigid_nvt.cpp
index 162fa72d4f..d3e8948b8b 100644
--- a/src/fix_rigid_nvt.cpp
+++ b/src/fix_rigid_nvt.cpp
@@ -42,7 +42,9 @@ FixRigidNVT::FixRigidNVT(LAMMPS *lmp, int narg, char **arg) :
{
// other settings are made by FixRigid parent
+ scalar_flag = 1;
restart_global = 1;
+ extscalar = 1;
// error checking
// convert input period to frequency
@@ -58,7 +60,7 @@ FixRigidNVT::FixRigidNVT(LAMMPS *lmp, int narg, char **arg) :
if (t_iter < 1) error->all("Illegal fix_modify command");
if (t_order != 3 && t_order != 5)
error->all("Fix_modify order must be 3 or 5");
-
+
allocate_chain();
allocate_order();
conjqm = memory->create_2d_double_array(nbody,4,"nve_rigid:conjqm");
@@ -104,7 +106,9 @@ void FixRigidNVT::init()
for (int ibody = 0; ibody < nbody; ibody++)
for (int k = 0; k < domain->dimension; k++)
if (fabs(inertia[ibody][k]) < 1e-6) nf_r--;
-
+
+ // see Table 1 in Kamberaj et al
+
if (t_order == 3) {
w[0] = 1.0 / (2.0 - pow(2.0, 1.0/3.0));
w[1] = 1.0 - 2.0*w[0];
@@ -200,12 +204,12 @@ void FixRigidNVT::initial_integrate(int vflag)
xcm[ibody][1] += dtv * vcm[ibody][1];
xcm[ibody][2] += dtv * vcm[ibody][2];
- // step 1.3 - apply torque (body coords) to quaternion momentum
-
torque[ibody][0] *= tflag[ibody][0];
torque[ibody][1] *= tflag[ibody][1];
torque[ibody][2] *= tflag[ibody][2];
+ // step 1.3 - apply torque (body coords) to quaternion momentum
+
matvec_rows(ex_space[ibody],ey_space[ibody],ez_space[ibody],
torque[ibody],tbody);
quatvec(quat[ibody],tbody,fquat);
@@ -219,7 +223,7 @@ void FixRigidNVT::initial_integrate(int vflag)
conjqm[ibody][2] *= scale_r;
conjqm[ibody][3] *= scale_r;
- // step 1.4 to 1.13 - use no_squish rotate to update p and q
+ // step 1.4 to 1.8 - use no_squish rotate to update p (i.e. conjqm) and q
no_squish_rotate(3,conjqm[ibody],quat[ibody],inertia[ibody],dtq);
no_squish_rotate(2,conjqm[ibody],quat[ibody],inertia[ibody],dtq);
@@ -227,7 +231,7 @@ void FixRigidNVT::initial_integrate(int vflag)
no_squish_rotate(2,conjqm[ibody],quat[ibody],inertia[ibody],dtq);
no_squish_rotate(3,conjqm[ibody],quat[ibody],inertia[ibody],dtq);
- // update the exyz_space
+ // update the exyz_space from new quaternion
// transform p back to angmom
// update angular velocity
@@ -271,7 +275,7 @@ void FixRigidNVT::final_integrate()
double tmp,scale_t,scale_r,akin_t,akin_r;
double dtfm,xy,xz,yz;
- // intialize velocity scale for translation and rotation
+ // compute velocity scales for translation and rotation
tmp = -1.0 * dtq * eta_dot_t[0];
scale_t = exp(tmp);
@@ -360,7 +364,7 @@ void FixRigidNVT::final_integrate()
torque[ibody][1] = all[ibody][4];
torque[ibody][2] = all[ibody][5];
- // update vcm by 1/2 step
+ // 2.5-2.6 update vcm by 1/2 step
dtfm = dtf / masstotal[ibody];
vcm[ibody][0] *= scale_t;
@@ -370,22 +374,31 @@ void FixRigidNVT::final_integrate()
vcm[ibody][1] += dtfm * fcm[ibody][1] * fflag[ibody][1];
vcm[ibody][2] += dtfm * fcm[ibody][2] * fflag[ibody][2];
- // update conjqm, then transform to angmom, set velocity again
- // virial is already setup from initial_integrate
+ // 2.1-2.4 update conjqm, angular momentum and angular velocity
+ // apply body torque flags
torque[ibody][0] *= tflag[ibody][0];
torque[ibody][1] *= tflag[ibody][1];
torque[ibody][2] *= tflag[ibody][2];
+ // convert torque to the body frame
+
matvec_rows(ex_space[ibody],ey_space[ibody],ez_space[ibody],
torque[ibody],tbody);
+
+ // compute "force" for quaternion
+
quatvec(quat[ibody],tbody,fquat);
+ // update the conjugate quaternion momentum (conjqm)
+
conjqm[ibody][0] = scale_r * conjqm[ibody][0] + dtf2 * fquat[0];
conjqm[ibody][1] = scale_r * conjqm[ibody][1] + dtf2 * fquat[1];
conjqm[ibody][2] = scale_r * conjqm[ibody][2] + dtf2 * fquat[2];
conjqm[ibody][3] = scale_r * conjqm[ibody][3] + dtf2 * fquat[3];
+ // compute angular momentum in the body frame then convert to the space-fixed frame
+
invquatvec(quat[ibody],conjqm[ibody],mbody);
matvec_cols(ex_space[ibody],ey_space[ibody],ez_space[ibody],
mbody,angmom[ibody]);
@@ -394,6 +407,8 @@ void FixRigidNVT::final_integrate()
angmom[ibody][1] *= 0.5;
angmom[ibody][2] *= 0.5;
+ // compute new angular velocity
+
omega_from_angmom(angmom[ibody],ex_space[ibody],ey_space[ibody],
ez_space[ibody],inertia[ibody],omega[ibody]);
}
@@ -535,6 +550,76 @@ void FixRigidNVT::write_restart(FILE *fp)
delete list;
}
+/* ----------------------------------------------------------------------
+ compute kinetic energy in the extended Hamiltonian
+ conserved quantity = sum of returned energy and potential energy
+-----------------------------------------------------------------------*/
+
+double FixRigidNVT::compute_scalar()
+{
+ int i,k,ibody;
+ double kt = boltz * t_target;
+ double energy,ke_t,ke_q,tmp,Pkq[4];
+
+ // compute the kinetic parts of H_NVE in Kameraj et al (JCP 2005, pp 224114)
+
+ // translational kinetic energy
+
+ ke_t = 0.0;
+ for (ibody = 0; ibody < nbody; ibody++)
+ ke_t += 0.5 * masstotal[ibody] * (vcm[ibody][0]*vcm[ibody][0] +
+ vcm[ibody][1]*vcm[ibody][1] +
+ vcm[ibody][2]*vcm[ibody][2]);
+
+ // rotational kinetic energy
+
+ ke_q = 0.0;
+ for (ibody = 0; ibody < nbody; ibody++) {
+ for (k = 1; k < 4; k++) {
+ if (k == 1) {
+ Pkq[0] = -quat[ibody][1];
+ Pkq[1] = quat[ibody][0];
+ Pkq[2] = quat[ibody][3];
+ Pkq[3] = -quat[ibody][2];
+ } else if (k == 2) {
+ Pkq[0] = -quat[ibody][2];
+ Pkq[1] = -quat[ibody][3];
+ Pkq[2] = quat[ibody][0];
+ Pkq[3] = quat[ibody][1];
+ } else if (k == 3) {
+ Pkq[0] = -quat[ibody][3];
+ Pkq[1] = quat[ibody][2];
+ Pkq[2] = -quat[ibody][1];
+ Pkq[3] = quat[ibody][0];
+ }
+
+ tmp = conjqm[ibody][0]*Pkq[0] + conjqm[ibody][1]*Pkq[1] +
+ conjqm[ibody][2]*Pkq[2] + conjqm[ibody][3]*Pkq[3];
+ tmp *= tmp;
+
+ if (fabs(inertia[ibody][k-1]) < 1e-6) tmp = 0.0;
+ else tmp /= (8.0 * inertia[ibody][k-1]);
+ ke_q += tmp;
+ }
+ }
+
+ energy = ke_t + ke_q;
+
+ // thermostat chain energy: from equation 12 in Kameraj et al (JCP 2005)
+
+ energy += kt * (nf_t * eta_t[0] + nf_r * eta_r[0]);
+
+ for (i = 1; i < t_chain; i++)
+ energy += kt * (eta_t[i] + eta_r[i]);
+
+ for (i = 0; i < t_chain; i++) {
+ energy += 0.5 * q_t[i] * (eta_dot_t[i] * eta_dot_t[i]);
+ energy += 0.5 * q_r[i] * (eta_dot_r[i] * eta_dot_r[i]);
+ }
+
+ return energy;
+}
+
/* ----------------------------------------------------------------------
use state info from restart file to restart the Fix
------------------------------------------------------------------------- */
diff --git a/src/fix_rigid_nvt.h b/src/fix_rigid_nvt.h
index a5366919b4..0f69084145 100644
--- a/src/fix_rigid_nvt.h
+++ b/src/fix_rigid_nvt.h
@@ -32,6 +32,7 @@ class FixRigidNVT : public FixRigid {
void setup(int);
void initial_integrate(int);
void final_integrate();
+ double compute_scalar();
void write_restart(FILE *);
void restart(char *);
void reset_target(double);
From a71cc659fa3ab210459a282a3435d85ed5cb9e82 Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 15:04:48 +0000
Subject: [PATCH 11/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5307
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
doc/fix_rigid.html | 35 +++++++++++++++++++++--------------
doc/fix_rigid.txt | 35 +++++++++++++++++++++--------------
2 files changed, 42 insertions(+), 28 deletions(-)
diff --git a/doc/fix_rigid.html b/doc/fix_rigid.html
index 6920208a96..13b63adb7f 100644
--- a/doc/fix_rigid.html
+++ b/doc/fix_rigid.html
@@ -272,21 +272,28 @@ for info on how to re-specify a fix in an input script that reads a
restart file, so that the operation of the fix continues in an
uninterrupted fashion.
-None of the fix_modify options are relevant to these
-fixes.
+ The fix_modify energy option is supported by the
+rigid/nvt fix to add the energy change induced by the thermostatting
+to the system's potential energy as part of thermodynamic
+output.
-These fixes compute a global array of values which can be accessed by
-various output commands. The number of rows
-in the array is equal to the number of rigid bodies. The number of
-columns is 15. Thus for each rigid body, 12 values are stored: the
-xyz coords of the center of mass (COM), the xyz components of the COM
-velocity, the xyz components of the force acting on the COM, the xyz
-components of the torque acting on the COM, and the xyz image flags of
-the COM, which have the same meaning as image flags for atom positions
-(see the "dump" command). The force and torque values in the array
-are not affected by the force and torque keywords in the fix rigid
-command; they reflect values before any changes are made by those
-keywords.
+ The rigid/nvt fix computes a global scalar which can be accessed by
+various output commands. The scalar value
+calculated by the rigid/nvt fix is "extensive". The scalar is the
+cumulative energy change due to the thermostatting the fix performs.
+
+All of these fixes compute a global array of values which can be
+accessed by various output commands. The
+number of rows in the array is equal to the number of rigid bodies.
+The number of columns is 15. Thus for each rigid body, 12 values are
+stored: the xyz coords of the center of mass (COM), the xyz components
+of the COM velocity, the xyz components of the force acting on the
+COM, the xyz components of the torque acting on the COM, and the xyz
+image flags of the COM, which have the same meaning as image flags for
+atom positions (see the "dump" command). The force and torque values
+in the array are not affected by the force and torque keywords in
+the fix rigid command; they reflect values before any changes are made
+by those keywords.
The ordering of the rigid bodies (by row in the array) is as follows.
For the single keyword there is just one rigid body. For the
diff --git a/doc/fix_rigid.txt b/doc/fix_rigid.txt
index 201f7be3d6..f224b605fa 100644
--- a/doc/fix_rigid.txt
+++ b/doc/fix_rigid.txt
@@ -261,21 +261,28 @@ for info on how to re-specify a fix in an input script that reads a
restart file, so that the operation of the fix continues in an
uninterrupted fashion.
-None of the "fix_modify"_fix_modify.html options are relevant to these
-fixes.
+The "fix_modify"_fix_modify.html {energy} option is supported by the
+rigid/nvt fix to add the energy change induced by the thermostatting
+to the system's potential energy as part of "thermodynamic
+output"_thermo_style.html.
-These fixes compute a global array of values which can be accessed by
-various "output commands"_Section_howto.html#4_15. The number of rows
-in the array is equal to the number of rigid bodies. The number of
-columns is 15. Thus for each rigid body, 12 values are stored: the
-xyz coords of the center of mass (COM), the xyz components of the COM
-velocity, the xyz components of the force acting on the COM, the xyz
-components of the torque acting on the COM, and the xyz image flags of
-the COM, which have the same meaning as image flags for atom positions
-(see the "dump" command). The force and torque values in the array
-are not affected by the {force} and {torque} keywords in the fix rigid
-command; they reflect values before any changes are made by those
-keywords.
+The rigid/nvt fix computes a global scalar which can be accessed by
+various "output commands"_Section_howto.html#4_15. The scalar value
+calculated by the rigid/nvt fix is "extensive". The scalar is the
+cumulative energy change due to the thermostatting the fix performs.
+
+All of these fixes compute a global array of values which can be
+accessed by various "output commands"_Section_howto.html#4_15. The
+number of rows in the array is equal to the number of rigid bodies.
+The number of columns is 15. Thus for each rigid body, 12 values are
+stored: the xyz coords of the center of mass (COM), the xyz components
+of the COM velocity, the xyz components of the force acting on the
+COM, the xyz components of the torque acting on the COM, and the xyz
+image flags of the COM, which have the same meaning as image flags for
+atom positions (see the "dump" command). The force and torque values
+in the array are not affected by the {force} and {torque} keywords in
+the fix rigid command; they reflect values before any changes are made
+by those keywords.
The ordering of the rigid bodies (by row in the array) is as follows.
For the {single} keyword there is just one rigid body. For the
From df96ce17b59923ee2279163f9b9b5a79b7ee296c Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 15:05:03 +0000
Subject: [PATCH 12/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5308
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
doc/fix_nh.html | 4 ++--
doc/fix_nh.txt | 5 ++---
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/doc/fix_nh.html b/doc/fix_nh.html
index 52e2c67054..b477cea8dd 100644
--- a/doc/fix_nh.html
+++ b/doc/fix_nh.html
@@ -379,8 +379,8 @@ and barostatting to the system's potential energy as part of
These fixes compute a global scalar and a global vector of quantities,
which can be accessed by various output
-commands. The scalar values calculated by
-this fix are "extensive"; the vector values are "intensive".
+commands. The scalar value calculated by
+these fixes is "extensive"; the vector values are "intensive".
The scalar is the cumulative energy change due to the fix.
diff --git a/doc/fix_nh.txt b/doc/fix_nh.txt
index 78a510402a..026caa8348 100644
--- a/doc/fix_nh.txt
+++ b/doc/fix_nh.txt
@@ -371,8 +371,8 @@ and barostatting to the system's potential energy as part of
These fixes compute a global scalar and a global vector of quantities,
which can be accessed by various "output
-commands"_Section_howto.html#4_15. The scalar values calculated by
-this fix are "extensive"; the vector values are "intensive".
+commands"_Section_howto.html#4_15. The scalar value calculated by
+these fixes is "extensive"; the vector values are "intensive".
The scalar is the cumulative energy change due to the fix.
@@ -433,7 +433,6 @@ limiting factor for numerical stability. Both
factorizations are time-reversible and can be shown to preserve the phase
space measure of the underlying non-Hamiltonian equations of motion.
-
[Restrictions:]
Non-periodic dimensions cannot be barostatted. {Z}, {xz}, and {yz},
From 34d0dbea1b36de791a899ff6d6f4ffa3ce2d8770 Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 15:07:55 +0000
Subject: [PATCH 13/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5309
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
src/fix_rigid.h | 2 +-
src/fix_rigid_nvt.cpp | 14 ++++++++++++++
src/fix_rigid_nvt.h | 1 +
3 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/src/fix_rigid.h b/src/fix_rigid.h
index 2f2e2d0f53..efe77587b4 100644
--- a/src/fix_rigid.h
+++ b/src/fix_rigid.h
@@ -28,7 +28,7 @@ class FixRigid : public Fix {
public:
FixRigid(class LAMMPS *, int, char **);
virtual ~FixRigid();
- int setmask();
+ virtual int setmask();
virtual void init();
virtual void setup(int);
virtual void initial_integrate(int);
diff --git a/src/fix_rigid_nvt.cpp b/src/fix_rigid_nvt.cpp
index d3e8948b8b..0f16ca1980 100644
--- a/src/fix_rigid_nvt.cpp
+++ b/src/fix_rigid_nvt.cpp
@@ -88,6 +88,20 @@ FixRigidNVT::~FixRigidNVT()
/* ---------------------------------------------------------------------- */
+int FixRigidNVT::setmask()
+{
+ int mask = 0;
+ mask |= INITIAL_INTEGRATE;
+ mask |= FINAL_INTEGRATE;
+ mask |= PRE_NEIGHBOR;
+ mask |= THERMO_ENERGY;
+ mask |= INITIAL_INTEGRATE_RESPA;
+ mask |= FINAL_INTEGRATE_RESPA;
+ return mask;
+}
+
+/* ---------------------------------------------------------------------- */
+
void FixRigidNVT::init()
{
FixRigid::init();
diff --git a/src/fix_rigid_nvt.h b/src/fix_rigid_nvt.h
index 0f69084145..da4c8184fb 100644
--- a/src/fix_rigid_nvt.h
+++ b/src/fix_rigid_nvt.h
@@ -28,6 +28,7 @@ class FixRigidNVT : public FixRigid {
public:
FixRigidNVT(class LAMMPS *, int, char **);
~FixRigidNVT();
+ int setmask();
void init();
void setup(int);
void initial_integrate(int);
From c0497703c11346052fb6b8060ebdce03c83ddbd7 Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 15:12:07 +0000
Subject: [PATCH 14/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5310
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
src/version.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/version.h b/src/version.h
index ada3305c95..2071042fd5 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define LAMMPS_VERSION "27 Nov 2010"
+#define LAMMPS_VERSION "28 Nov 2010"
From 47392a29d1c1ef3134f0266587cb782e92271383 Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 16:24:37 +0000
Subject: [PATCH 15/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5312
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
src/REPLICA/fix_neb.cpp | 31 +++++++++++++++++++++++++++----
src/REPLICA/neb.cpp | 9 +++++----
2 files changed, 32 insertions(+), 8 deletions(-)
diff --git a/src/REPLICA/fix_neb.cpp b/src/REPLICA/fix_neb.cpp
index 652ba83755..8dfecad9f7 100644
--- a/src/REPLICA/fix_neb.cpp
+++ b/src/REPLICA/fix_neb.cpp
@@ -132,6 +132,7 @@ void FixNEB::min_setup(int vflag)
void FixNEB::min_post_force(int vflag)
{
MPI_Status status;
+ MPI_Request request;
double vprev,vnext,vmax,vmin;
double delx,dely,delz;
double delta1[3],delta2[3];
@@ -141,10 +142,21 @@ void FixNEB::min_post_force(int vflag)
veng = pe->compute_scalar();
- if (ireplica < nreplica-1)
+ if (ireplica == 0)
+ MPI_Send(&veng,1,MPI_DOUBLE,procnext,0,uworld);
+ else if (ireplica == nreplica-1) {
+ MPI_Irecv(&vprev,1,MPI_DOUBLE,procprev,0,uworld,&request);
+ MPI_Wait(&request,&status);
+ } else
MPI_Sendrecv(&veng,1,MPI_DOUBLE,procnext,0,
&vprev,1,MPI_DOUBLE,procprev,0,uworld,&status);
- if (ireplica > 0)
+
+ if (ireplica == 0) {
+ MPI_Irecv(&vnext,1,MPI_DOUBLE,procnext,0,uworld,&request);
+ MPI_Wait(&request,&status);
+ } else if (ireplica == nreplica-1)
+ MPI_Send(&veng,1,MPI_DOUBLE,procprev,0,uworld);
+ else
MPI_Sendrecv(&veng,1,MPI_DOUBLE,procprev,0,
&vnext,1,MPI_DOUBLE,procnext,0,uworld,&status);
@@ -157,10 +169,21 @@ void FixNEB::min_post_force(int vflag)
int nlocal = atom->nlocal;
if (nlocal != natoms) error->one("Atom count changed in fix neb");
- if (ireplica < nreplica-1)
+ if (ireplica == 0)
+ MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld);
+ else if (ireplica == nreplica-1) {
+ MPI_Irecv(xprev[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld,&request);
+ MPI_Wait(&request,&status);
+ } else
MPI_Sendrecv(x[0],3*nlocal,MPI_DOUBLE,procnext,0,
xprev[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld,&status);
- if (ireplica > 0)
+
+ if (ireplica == 0) {
+ MPI_Irecv(xnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request);
+ MPI_Wait(&request,&status);
+ } else if (ireplica == nreplica-1)
+ MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld);
+ else
MPI_Sendrecv(x[0],3*nlocal,MPI_DOUBLE,procprev,0,
xnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&status);
diff --git a/src/REPLICA/neb.cpp b/src/REPLICA/neb.cpp
index bed7a179ac..cc488e72fb 100644
--- a/src/REPLICA/neb.cpp
+++ b/src/REPLICA/neb.cpp
@@ -383,12 +383,13 @@ void NEB::print_status()
for (int i = 1; i < nreplica; i++)
rdist[i] = rdist[i-1] + all[i][1];
double endpt = rdist[nreplica-1] = rdist[nreplica-2] + all[nreplica-2][2];
- for (int i = 1; i < nreplica; i++)
- rdist[i] /= endpt;
+ if (endpt > 0.0)
+ for (int i = 1; i < nreplica; i++)
+ rdist[i] /= endpt;
// look up GradV for the initial, final, and climbing replicas
- // These are identical to fnorm2, but better to be safe we
- // take them straight from fix_neb
+ // these should be identical to fnorm2
+ // but to be safe take them straight from fix neb
double gradvnorm0, gradvnorm1, gradvnormc;
From b22df84673c1c2ab3f4ced2676af58224456af0d Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 16:27:32 +0000
Subject: [PATCH 16/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5313
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
src/version.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/version.h b/src/version.h
index 2071042fd5..7a14ca54d4 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define LAMMPS_VERSION "28 Nov 2010"
+#define LAMMPS_VERSION "29 Nov 2010"
From 0dad5a85513bd0e3188e440319090b5d2e7ebf94 Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 16:41:36 +0000
Subject: [PATCH 17/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5315
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
src/USER-CG-CMM/Install.sh | 22 ++++++++++++++--------
src/USER-CG-CMM/Package.sh | 26 ++++++++++++++++++++++++++
src/USER-CG-CMM/cg_cmm_parms.h | 2 +-
3 files changed, 41 insertions(+), 9 deletions(-)
create mode 100644 src/USER-CG-CMM/Package.sh
diff --git a/src/USER-CG-CMM/Install.sh b/src/USER-CG-CMM/Install.sh
index 2954dee31c..18dcb44d3a 100644
--- a/src/USER-CG-CMM/Install.sh
+++ b/src/USER-CG-CMM/Install.sh
@@ -2,8 +2,10 @@
if (test $1 = 1) then
- cp angle_cg_cmm.h ..
- cp angle_cg_cmm.cpp ..
+ if (test -e ../angle_harmonic.cpp) then
+ cp angle_cg_cmm.h ..
+ cp angle_cg_cmm.cpp ..
+ fi
cp cg_cmm_parms.h ..
cp cg_cmm_parms.cpp ..
@@ -14,13 +16,16 @@ if (test $1 = 1) then
cp pair_cg_cmm.h ..
cp pair_cg_cmm_coul_cut.cpp ..
cp pair_cg_cmm_coul_cut.h ..
- cp pair_cg_cmm_coul_long.cpp ..
- cp pair_cg_cmm_coul_long.h ..
+
+ if (test -e ../pppm.cpp) then
+ cp pair_cg_cmm_coul_long.cpp ..
+ cp pair_cg_cmm_coul_long.h ..
+ fi
elif (test $1 = 0) then
- rm ../angle_cg_cmm.h
- rm ../angle_cg_cmm.cpp
+ rm -f ../angle_cg_cmm.h
+ rm -f ../angle_cg_cmm.cpp
rm ../cg_cmm_parms.h
rm ../cg_cmm_parms.cpp
@@ -31,7 +36,8 @@ elif (test $1 = 0) then
rm ../pair_cg_cmm.h
rm ../pair_cg_cmm_coul_cut.cpp
rm ../pair_cg_cmm_coul_cut.h
- rm ../pair_cg_cmm_coul_long.cpp
- rm ../pair_cg_cmm_coul_long.h
+
+ rm -f ../pair_cg_cmm_coul_long.cpp
+ rm -f ../pair_cg_cmm_coul_long.h
fi
diff --git a/src/USER-CG-CMM/Package.sh b/src/USER-CG-CMM/Package.sh
new file mode 100644
index 0000000000..dcf6a81581
--- /dev/null
+++ b/src/USER-CG-CMM/Package.sh
@@ -0,0 +1,26 @@
+# Update package files in LAMMPS
+# cp package file to src if doesn't exist or is different
+# do not copy molecular and kspace files if corresponding versions do not exist
+
+for file in *.cpp *.h; do
+ if (test $file = angle_cg_cmm.cpp -a ! -e ../pair_angle_harmonic.cpp) then
+ continue
+ fi
+ if (test $file = angle_cg_cmm.h -a ! -e ../pair_angle_harmonic.h) then
+ continue
+ fi
+ if (test $file = pair_cg_cmm_coul_long.cpp -a ! -e ../pair_lj_cut_coul_long.cpp) then
+ continue
+ fi
+ if (test $file = pair_cg_cmm_coul_long.h -a ! -e ../pair_lj_cut_coul_long.h) then
+ continue
+ fi
+
+ if (test ! -e ../$file) then
+ echo " creating src/$file"
+ cp $file ..
+ elif (test "`diff --brief $file ../$file`" != "") then
+ echo " updating src/$file"
+ cp $file ..
+ fi
+done
diff --git a/src/USER-CG-CMM/cg_cmm_parms.h b/src/USER-CG-CMM/cg_cmm_parms.h
index ca1b0656b5..f696759d7a 100644
--- a/src/USER-CG-CMM/cg_cmm_parms.h
+++ b/src/USER-CG-CMM/cg_cmm_parms.h
@@ -13,7 +13,7 @@
/* ----------------------------------------------------------------------
Common parameters for the CMM coarse grained MD potentials.
- Contributing author: Axel Kohlmeyer
+ Contributing author: Axel Kohlmeyer (Temple U)
------------------------------------------------------------------------- */
#ifndef LMP_CG_CMM_PARMS_H
From 38ab9087edbba29c6042d23390f59e238b795275 Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 16:41:43 +0000
Subject: [PATCH 18/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5316
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
src/MOLECULE/angle_cosine_delta.cpp | 2 +-
src/Makefile | 38 ++++++++++++++---------------
src/OPT/Package.sh | 16 ++++++------
3 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/src/MOLECULE/angle_cosine_delta.cpp b/src/MOLECULE/angle_cosine_delta.cpp
index 84932225b7..3697bb87c7 100644
--- a/src/MOLECULE/angle_cosine_delta.cpp
+++ b/src/MOLECULE/angle_cosine_delta.cpp
@@ -12,7 +12,7 @@
------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------
- Contributing author: Axel Kohlmeyer (U Penn), akohlmey at cmm.chem.upenn.edu
+ Contributing author: Axel Kohlmeyer (Temple U), akohlmey at gmail.com
------------------------------------------------------------------------- */
#include "math.h"
diff --git a/src/Makefile b/src/Makefile
index 182dbc2bec..7473b0e112 100755
--- a/src/Makefile
+++ b/src/Makefile
@@ -22,11 +22,11 @@ PACKUSER = user-ackland user-atc user-cd-eam user-cg-cmm user-eff \
PACKALL = $(PACKAGE) $(PACKUSER)
-PACKAGEUC = $(shell perl -e 'printf("%s", uc("$(PACKAGE)"));')
-PACKUSERUC = $(shell perl -e 'printf("%s", uc("$(PACKUSER)"));')
+PACKAGEUC = $(shell echo $(PACKAGE) | tr a-z A-Z)
+PACKUSERUC = $(shell echo $(PACKUSER) | tr a-z A-Z)
-YESDIR = $(shell perl -e 'printf("%s", uc("$(@:yes-%=%)"));')
-NODIR = $(shell perl -e 'printf("%s", uc("$(@:no-%=%)"));')
+YESDIR = $(shell echo $(@:yes-%=%) | tr a-z A-Z)
+NODIR = $(shell echo $(@:no-%=%) | tr a-z A-Z)
# List of all targets
@@ -63,7 +63,7 @@ help:
.DEFAULT:
@test -f MAKE/Makefile.$@
@if [ ! -d Obj_$@ ]; then mkdir Obj_$@; fi
- @/bin/sh Make.sh style
+ @$(SHELL) Make.sh style
@cp -p *.cpp *.h Obj_$@
@cp MAKE/Makefile.$@ Obj_$@/Makefile
@if [ ! -e Makefile.package ]; then make package-regenerate; fi
@@ -98,12 +98,12 @@ tar:
# Update Makefile.lib and Makefile.list
makelib:
- @/bin/sh Make.sh style
- @/bin/sh Make.sh Makefile.lib
+ @$(SHELL) Make.sh style
+ @$(SHELL) Make.sh Makefile.lib
makelist:
- @/bin/sh Make.sh style
- @/bin/sh Make.sh Makefile.list
+ @$(SHELL) Make.sh style
+ @$(SHELL) Make.sh Makefile.list
# Package management
@@ -149,7 +149,7 @@ yes-%:
echo "Package $(@:yes-%=%) does not exist"; \
else \
echo "Installing package $(@:yes-%=%)"; \
- cd $(YESDIR); /bin/sh Install.sh 1; \
+ cd $(YESDIR); $(SHELL) Install.sh 1; \
fi;
no-%:
@@ -157,7 +157,7 @@ no-%:
echo "Package $(@:no-%=%) does not exist"; \
else \
echo "Uninstalling package $(@:no-%=%), ignore errors"; \
- cd $(NODIR); /bin/sh Install.sh 0; cd ..; \
+ cd $(NODIR); $(SHELL) Install.sh 0; cd ..; \
fi;
# status = list differences between src and package files
@@ -166,21 +166,21 @@ no-%:
# regenerate = regenerate Makefile.package from Makefile.package.empty
package-status:
- @for p in $(PACKAGEUC); do /bin/sh Package.sh $$p status; done
+ @for p in $(PACKAGEUC); do $(SHELL) Package.sh $$p status; done
@echo ''
- @for p in $(PACKUSERUC); do /bin/sh Package.sh $$p status; done
+ @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p status; done
package-update:
- @for p in $(PACKAGEUC); do /bin/sh Package.sh $$p update; done
+ @for p in $(PACKAGEUC); do $(SHELL) Package.sh $$p update; done
@echo ''
- @for p in $(PACKUSERUC); do /bin/sh Package.sh $$p update; done
+ @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p update; done
package-overwrite:
- @for p in $(PACKAGEUC); do /bin/sh Package.sh $$p overwrite; done
+ @for p in $(PACKAGEUC); do $(SHELL) Package.sh $$p overwrite; done
@echo ''
- @for p in $(PACKUSERUC); do /bin/sh Package.sh $$p overwrite; done
+ @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p overwrite; done
package-regenerate:
@cp Makefile.package.empty Makefile.package
- @for p in $(PACKAGEUC); do /bin/sh Package.sh $$p regenerate; done
- @for p in $(PACKUSERUC); do /bin/sh Package.sh $$p regenerate; done
+ @for p in $(PACKAGEUC); do $(SHELL) Package.sh $$p regenerate; done
+ @for p in $(PACKUSERUC); do $(SHELL) Package.sh $$p regenerate; done
diff --git a/src/OPT/Package.sh b/src/OPT/Package.sh
index 4780f3a938..a822239950 100644
--- a/src/OPT/Package.sh
+++ b/src/OPT/Package.sh
@@ -3,28 +3,28 @@
# do not copy eam and charmm files if non-OPT versions do not exist
for file in *.cpp *.h; do
- if (test $file == pair_eam_opt.cpp -a ! -e ../pair_eam.cpp) then
+ if (test $file = pair_eam_opt.cpp -a ! -e ../pair_eam.cpp) then
continue
fi
- if (test $file == pair_eam_opt.h -a ! -e ../pair_eam.cpp) then
+ if (test $file = pair_eam_opt.h -a ! -e ../pair_eam.cpp) then
continue
fi
- if (test $file == pair_eam_alloy_opt.cpp -a ! -e ../pair_eam.cpp) then
+ if (test $file = pair_eam_alloy_opt.cpp -a ! -e ../pair_eam.cpp) then
continue
fi
- if (test $file == pair_eam_alloy_opt.h -a ! -e ../pair_eam.cpp) then
+ if (test $file = pair_eam_alloy_opt.h -a ! -e ../pair_eam.cpp) then
continue
fi
- if (test $file == pair_eam_fs_opt.cpp -a ! -e ../pair_eam.cpp) then
+ if (test $file = pair_eam_fs_opt.cpp -a ! -e ../pair_eam.cpp) then
continue
fi
- if (test $file == pair_eam_fs_opt.h -a ! -e ../pair_eam.cpp) then
+ if (test $file = pair_eam_fs_opt.h -a ! -e ../pair_eam.cpp) then
continue
fi
- if (test $file == pair_lj_charmm_coul_long_opt.cpp -a ! -e ../pair_lj_charmm_coul_long.cpp) then
+ if (test $file = pair_lj_charmm_coul_long_opt.cpp -a ! -e ../pair_lj_charmm_coul_long.cpp) then
continue
fi
- if (test $file == pair_lj_charmm_coul_long_opt.h -a ! -e ../pair_lj_charmm_coul_long.cpp) then
+ if (test $file = pair_lj_charmm_coul_long_opt.h -a ! -e ../pair_lj_charmm_coul_long.cpp) then
continue
fi
From 3ed80aea4d8caf6cc48300469ef1a839357b03fe Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 20:38:34 +0000
Subject: [PATCH 19/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5317
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
python/examples/pizza/vmd.py | 205 +++++++++++++++++++++++++++++++++++
1 file changed, 205 insertions(+)
create mode 100644 python/examples/pizza/vmd.py
diff --git a/python/examples/pizza/vmd.py b/python/examples/pizza/vmd.py
new file mode 100644
index 0000000000..06212dc997
--- /dev/null
+++ b/python/examples/pizza/vmd.py
@@ -0,0 +1,205 @@
+#
+# Minimalistic VMD embedding for Pizza.py
+#
+# This class will replace the VMD startup script,
+# open a pipe to the executable, and feed it Tcl
+# command lines one at a time.
+#
+# (c) 2010 Axel Kohlmeyer
+
+oneline = "Control VMD from python."
+
+docstr = """
+v = vmd() start up VMD
+v.stop() shut down VMD instance
+v.clear() delete all visualizations
+
+v.rep(style) set default representation style. One of
+ (Lines|VDW|Licorice|DynamicBonds|Points|CPK)
+v.new(file[,type]) load new file (default file type 'lammpstrj')
+v.data(file[,atomstyle]) load new data file (default atom style 'full')
+v.replace(file[,type]) replace current frames with new file
+v.append(file[,type]) append file to current frame(s)
+v.set(snap,x,y,z,(True|False)) set coordinates from a pizza.py snapshot to new or current frame
+
+v.frame(frame) set current frame
+v.flush() flush pending input to VMD and update GUI
+v.read(file) read Tcl script file (e.g. saved state)
+
+v.enter() enter interactive shell
+v.debug([True|False]) display generated VMD script commands?
+"""
+
+# Imports and external programs
+
+import types, os
+import numpy
+
+try: from DEFAULTS import PIZZA_VMDNAME
+except: PIZZA_VMDNAME = "vmd"
+try: from DEFAULTS import PIZZA_VMDDIR
+except: PIZZA_VMDDIR = "/usr/local/lib/vmd"
+try: from DEFAULTS import PIZZA_VMDDEV
+except: PIZZA_VMDDEV = "win"
+try: from DEFAULTS import PIZZA_VMDARCH
+except: PIZZA_VMDARCH = "LINUX"
+
+try: import pexpect
+except:
+ print "pexpect from http://pypi.python.org/pypi/pexpect/ is required for vmd module"
+ raise
+# Class definition
+
+class vmd:
+
+ # --------------------------------------------------------------------
+
+ def __init__(self):
+ self.vmddir = PIZZA_VMDDIR
+ self.vmdexe = PIZZA_VMDDIR + '/' + PIZZA_VMDNAME + '_' + PIZZA_VMDARCH
+ # these are all defaults copied from the vmd launch script
+ os.environ['VMDDIR'] = PIZZA_VMDDIR
+ os.environ['VMDDISPLAYDEVICE'] = PIZZA_VMDDEV
+ os.environ['VMDSCRPOS'] = "596 190"
+ os.environ['VMDSCRSIZE'] = "669 834"
+ os.environ['VMDSCRHEIGHT'] = "6.0"
+ os.environ['VMDSCRDIST'] = "-2.0"
+ os.environ['VMDTITLE'] = "on"
+ os.environ['TCL_LIBRARY'] = PIZZA_VMDDIR + "/scripts/tcl"
+ os.environ['STRIDE_BIN'] = PIZZA_VMDDIR + "/stride_" + PIZZA_VMDARCH
+ os.environ['SURF_BIN'] = PIZZA_VMDDIR + "/surf_" + PIZZA_VMDARCH
+ os.environ['TACHYON_BIN'] = PIZZA_VMDDIR + "/tachyon_" + PIZZA_VMDARCH
+ ldpath = os.environ.get('LD_LIBRARY_PATH','')
+ if ldpath == '':
+ os.environ['LD_LIBRARY_PATH'] = PIZZA_VMDDIR
+ else:
+ os.environ['LD_LIBRARY_PATH'] = ldpath + ':' + PIZZA_VMDDIR
+ ldpath = os.environ.get('LD_LIBRARY_PATH','')
+ if ldpath == '':
+ os.environ['PYTHONPATH'] = PIZZA_VMDDIR
+ else:
+ os.environ['PYTHONPATH'] = PIZZA_VMDDIR + "/scripts/python"
+ self.debugme = False
+ # open pipe to vmd and wait until we have a prompt
+ self.VMD = pexpect.spawn(self.vmdexe)
+ self.VMD.expect('vmd >')
+
+ # --------------------------------------------------------------------
+ # post command to vmd and wait until the prompt returns.
+ def __call__(self,command):
+ if self.VMD.isalive():
+ self.VMD.sendline(command)
+ self.VMD.expect('vmd >')
+ if self.debugme:
+ print "call+result:"+self.VMD.before
+ return
+
+ # --------------------------------------------------------------------
+ # exit VMD
+ def stop(self):
+ self.__call__("quit")
+ del self.VMD
+
+ # --------------------------------------------------------------------
+ # force VMD display and GUI update.
+ def flush(self):
+ self.__call__('display update ui')
+
+ # --------------------------------------------------------------------
+ # turn on debugging info
+ def debug(self,status=True):
+ if status and not self.debugme:
+ print 'Turning vmd.py debugging ON.'
+ if not status and self.debugme:
+ print 'Turning vmd.py debugging OFF.'
+ self.debugme = status
+
+ # --------------------------------------------------------------------
+ # emulate a regular tcl command prompt
+ def enter(self,mode='tcl'):
+ self.__call__('menu main off')
+ self.__call__('menu main on')
+ while 1:
+ try:
+ command = raw_input("vmd > ")
+ except EOFError:
+ print "(EOF)"
+ self.__call__('menu main off')
+ return
+ if command == "quit" or command == "exit":
+ self.__call__('menu main off')
+ return
+ if command == "gopython":
+ print "gopython not supported here"
+ continue
+ self.__call__(command)
+
+ # --------------------------------------------------------------------
+ # read and execute tcl script file (e.g. a saved state)
+ def read(self,filename):
+ self.__call__('play ' + filename)
+ self.flush()
+
+ # --------------------------------------------------------------------
+ # remove all molecules, data and visualizations
+ def clear(self):
+ self.__call__("mol delete all")
+
+ # --------------------------------------------------------------------
+ # navigate to a given frame
+ def rep(self,style='Lines'):
+ if style == 'Lines' or style == 'VDW' or style == 'Licorice' \
+ or style == 'DynamicBonds' or style == 'Points' or style == 'CPK':
+ self.__call__('mol default style ' + style)
+ # --------------------------------------------------------------------
+ # navigate to a given frame
+ def frame(self,framespec):
+ self.__call__('animate goto ' + str(framespec))
+
+ # --------------------------------------------------------------------
+ # load a new molecule from a file supported by a molfile plugin
+ def new(self,filename,filetype='lammpstrj'):
+ self.__call__('mol new ' + filename + ' type ' + filetype + ' waitfor all')
+ self.flush()
+
+ # --------------------------------------------------------------------
+ # load a new molecule from a data file via the topotools plugin
+ def data(self,filename,atomstyle='full'):
+ self.__call__('package require topotools 1.0')
+ self.__call__('topo readlammpsdata ' + filename + ' ' + atomstyle)
+ self.flush()
+
+ # --------------------------------------------------------------------
+ # append all frames from a given file to the current molecule
+ def append(self,filename,filetype='lammpstrj'):
+ self.__call__('set tmol [molinfo top]')
+ self.__call__('array set viewpoints {}')
+ self.__call__('foreach mol [molinfo list] { set viewpoints($mol) [molinfo $mol get { center_matrix rotate_matrix scale_matrix global_matrix}]}')
+ self.__call__('mol addfile ' + filename + ' mol $tmol type ' + filetype + ' waitfor all')
+ self.__call__('foreach mol [molinfo list] { molinfo $mol set {center_matrix rotate_matrix scale_matrix global_matrix} $viewpoints($mol)}')
+ self.flush()
+
+ # --------------------------------------------------------------------
+ # replace all frames of a molecule with those from a given file
+ def update(self,filename,filetype='lammpstrj'):
+ self.__call__('set tmol [molinfo top]')
+ self.__call__('array set viewpoints {}')
+ self.__call__('foreach mol [molinfo list] {set viewpoints($mol) [molinfo $mol get { center_matrix rotate_matrix scale_matrix global_matrix}]}')
+ self.__call__('animate delete all $tmol')
+ self.__call__('mol addfile ' + filename + ' mol $tmol type ' + filetype + ' waitfor all')
+ self.__call__('foreach mol [molinfo list] {molinfo $mol set {center_matrix rotate_matrix scale_matrix global_matrix} $viewpoints($mol)}')
+ self.flush()
+
+ # --------------------------------------------------------------------
+ # add or overwrite coordinates with coordinates in a snapshot
+ def set(self,snap,x,y,z,append=True):
+ self.__call__('set vmdsel [atomselect top all]')
+ if append:
+ self.__call__('animate dup [molinfo top]')
+ cmd = '$vmdsel set {x y z} {'
+ for idx in range(0,snap.natoms):
+ cmd += ' {'+str(snap[idx,x])+' '+str(snap[idx,y])+' '+str(snap[idx,z])+'}'
+ cmd += '}'
+ self.__call__(cmd)
+ self.__call__('$vmdsel delete ; unset vmdsel')
+ self.flush()
From ab7699eecd0431231d8f69c76a87b5380e16f38d Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 20:38:59 +0000
Subject: [PATCH 20/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5318
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
python/examples/viz_vmd.py | 91 ++++++++++++++
python/examples/vizplotgui_atomeye.py | 8 +-
python/examples/vizplotgui_gl.py | 8 +-
python/examples/vizplotgui_pymol.py | 4 +-
python/examples/vizplotgui_vmd.py | 173 ++++++++++++++++++++++++++
5 files changed, 274 insertions(+), 10 deletions(-)
create mode 100755 python/examples/viz_vmd.py
create mode 100755 python/examples/vizplotgui_vmd.py
diff --git a/python/examples/viz_vmd.py b/python/examples/viz_vmd.py
new file mode 100755
index 0000000000..bce8360d35
--- /dev/null
+++ b/python/examples/viz_vmd.py
@@ -0,0 +1,91 @@
+#!/usr/local/bin/python -i
+# preceeding line should have path for Python on your machine
+
+# viz_vmd.py
+# Purpose: viz running LAMMPS simulation via VMD
+# Syntax: viz_vmd.py in.lammps Nfreq Nsteps
+# in.lammps = LAMMPS input script
+# Nfreq = dump and viz shapshot every this many steps
+# Nsteps = run for this many steps
+
+import sys
+sys.path.append("./pizza")
+
+# parse command line
+
+argv = sys.argv
+if len(argv) != 4:
+ print "Syntax: viz_vmd.py in.lammps Nfreq Nsteps"
+ sys.exit()
+
+infile = sys.argv[1]
+nfreq = int(sys.argv[2])
+nsteps = int(sys.argv[3])
+
+me = 0
+# uncomment if running in parallel via Pypar
+#import pypar
+#me = pypar.rank()
+#nprocs = pypar.size()
+
+from lammps import lammps
+lmp = lammps()
+
+# run infile all at once
+# assumed to have no run command in it
+
+lmp.file(infile)
+lmp.command("thermo %d" % nfreq)
+lmp.command("dump python all atom %d tmp.dump" % nfreq)
+
+# initial 0-step run to generate dump file and image
+
+lmp.command("run 0 pre yes post no")
+ntimestep = 0
+
+# wrapper on VMD window via Pizza.py vmd tool
+# just proc 0 handles reading of dump file and viz
+
+if me == 0:
+ from vmd import vmd
+ v = vmd()
+ v('menu main off')
+ v.rep('VDW')
+
+ from dump import dump
+ from pdbfile import pdbfile
+
+ d = dump('tmp.dump',0)
+ p = pdbfile(d)
+ d.next()
+ d.unscale()
+ p.single(ntimestep)
+ v.new('tmp.pdb','pdb')
+
+# run nfreq steps at a time w/out pre/post, read dump snapshot, display it
+
+while ntimestep < nsteps:
+ lmp.command("run %d pre no post no" % nfreq)
+ ntimestep += nfreq
+ if me == 0:
+ d.next()
+ d.unscale()
+ p.single(ntimestep)
+ # add frame to current data set
+ v.append('tmp.pdb','pdb')
+ # delete all frame and add new.
+ #v.update('tmp.dump')
+
+lmp.command("run 0 pre no post yes")
+
+if me == 0:
+ v.flush()
+ # uncomment the following, if you want to work with the viz some more.
+ #v('menu main on')
+ #print "type quit to terminate."
+ #v.enter()
+ #v.stop()
+
+# uncomment if running in parallel via Pypar
+#print "Proc %d out of %d procs has" % (me,nprocs), lmp
+#pypar.finalize()
diff --git a/python/examples/vizplotgui_atomeye.py b/python/examples/vizplotgui_atomeye.py
index 7969e8a1bd..879b6b061a 100755
--- a/python/examples/vizplotgui_atomeye.py
+++ b/python/examples/vizplotgui_atomeye.py
@@ -1,9 +1,9 @@
#!/usr/local/bin/python -i
# preceeding line should have path for Python on your machine
-# vizplotgui.py
-# Purpose: viz running LAMMPS simulation with plot and GUI
-# Syntax: vizplotgui.py in.lammps Nfreq compute-ID
+# vizplotgui_atomeye.py
+# Purpose: viz running LAMMPS simulation via AtomEye with plot and GUI
+# Syntax: vizplotgui_atomeye.py in.lammps Nfreq compute-ID
# in.lammps = LAMMPS input script
# Nfreq = plot data point and viz shapshot every this many steps
# compute-ID = ID of compute that calculates temperature
@@ -49,7 +49,7 @@ def update(ntimestep):
argv = sys.argv
if len(argv) != 4:
- print "Syntax: vizplotgui.py in.lammps Nfreq compute-ID"
+ print "Syntax: vizplotgui_atomeye.py in.lammps Nfreq compute-ID"
sys.exit()
infile = sys.argv[1]
diff --git a/python/examples/vizplotgui_gl.py b/python/examples/vizplotgui_gl.py
index e134c8791d..a0d84383e7 100755
--- a/python/examples/vizplotgui_gl.py
+++ b/python/examples/vizplotgui_gl.py
@@ -1,9 +1,9 @@
#!/usr/local/bin/python -i
# preceeding line should have path for Python on your machine
-# vizplotgui.py
-# Purpose: viz running LAMMPS simulation with plot and GUI
-# Syntax: vizplotgui.py in.lammps Nfreq compute-ID
+# vizplotgui_gl.py
+# Purpose: viz running LAMMPS simulation via GL tool with plot and GUI
+# Syntax: vizplotgui_gl.py in.lammps Nfreq compute-ID
# in.lammps = LAMMPS input script
# Nfreq = plot data point and viz shapshot every this many steps
# compute-ID = ID of compute that calculates temperature
@@ -46,7 +46,7 @@ def update(ntimestep):
argv = sys.argv
if len(argv) != 4:
- print "Syntax: vizplotgui.py in.lammps Nfreq compute-ID"
+ print "Syntax: vizplotgui_gl.py in.lammps Nfreq compute-ID"
sys.exit()
infile = sys.argv[1]
diff --git a/python/examples/vizplotgui_pymol.py b/python/examples/vizplotgui_pymol.py
index d5b356e390..0ec2c9fe10 100755
--- a/python/examples/vizplotgui_pymol.py
+++ b/python/examples/vizplotgui_pymol.py
@@ -2,7 +2,7 @@
# preceeding line should have path for Python on your machine
# vizplotgui_pymol.py
-# Purpose: viz running LAMMPS simulation with plot and GUI
+# Purpose: viz running LAMMPS simulation via PyMol with plot and GUI
# Syntax: vizplotgui_pymol.py in.lammps Nfreq compute-ID
# in.lammps = LAMMPS input script
# Nfreq = plot data point and viz shapshot every this many steps
@@ -48,7 +48,7 @@ def update(ntimestep):
argv = sys.argv
if len(argv) != 4:
- print "Syntax: vizplotgui.py in.lammps Nfreq compute-ID"
+ print "Syntax: vizplotgui_pymol.py in.lammps Nfreq compute-ID"
sys.exit()
infile = sys.argv[1]
diff --git a/python/examples/vizplotgui_vmd.py b/python/examples/vizplotgui_vmd.py
new file mode 100755
index 0000000000..0db1791595
--- /dev/null
+++ b/python/examples/vizplotgui_vmd.py
@@ -0,0 +1,173 @@
+#!/usr/local/bin/python -i
+# preceeding line should have path for Python on your machine
+
+# vizplotgui_vmd.py
+# Purpose: viz running LAMMPS simulation via VMD with plot and GUI
+# Syntax: vizplotgui_vmd.py in.lammps Nfreq compute-ID
+# in.lammps = LAMMPS input script
+# Nfreq = plot data point and viz shapshot every this many steps
+# compute-ID = ID of compute that calculates temperature
+# (or any other scalar quantity)
+
+# IMPORTANT: this script cannot yet be run in parallel via Pypar,
+# because I can't seem to do a MPI-style broadcast in Pypar
+
+import sys,time
+sys.path.append("./pizza")
+
+# methods called by GUI
+
+def run():
+ global runflag
+ runflag = 1
+def stop():
+ global runflag
+ runflag = 0
+def settemp(value):
+ global temptarget
+ temptarget = slider.get()
+def quit():
+ global breakflag
+ breakflag = 1
+
+# method called by timestep loop every Nfreq steps
+# read dump snapshot and viz it, update plot with compute value
+
+def update(ntimestep):
+ d.next()
+ d.unscale()
+ p.single(ntimestep)
+ v.append('tmp.pdb','pdb')
+ value = lmp.extract_compute(compute,0,0)
+ xaxis.append(ntimestep)
+ yaxis.append(value)
+ gn.plot(xaxis,yaxis)
+
+# parse command line
+
+argv = sys.argv
+if len(argv) != 4:
+ print "Syntax: vizplotgui_vmd.py in.lammps Nfreq compute-ID"
+ sys.exit()
+
+infile = sys.argv[1]
+nfreq = int(sys.argv[2])
+compute = sys.argv[3]
+
+me = 0
+# uncomment if running in parallel via Pypar
+#import pypar
+#me = pypar.rank()
+#nprocs = pypar.size()
+
+from lammps import lammps
+lmp = lammps()
+
+# run infile all at once
+# assumed to have no run command in it
+# dump a file in native LAMMPS dump format for Pizza.py dump tool
+
+lmp.file(infile)
+lmp.command("thermo %d" % nfreq)
+lmp.command("dump python all atom %d tmp.dump" % nfreq)
+
+# initial 0-step run to generate initial 1-point plot, dump file, and image
+
+lmp.command("run 0 pre yes post no")
+value = lmp.extract_compute(compute,0,0)
+ntimestep = 0
+xaxis = [ntimestep]
+yaxis = [value]
+
+breakflag = 0
+runflag = 0
+temptarget = 1.0
+
+# wrapper on VMD window via Pizza.py vmd tool
+# just proc 0 handles reading of dump file and viz
+
+if me == 0:
+ from vmd import vmd
+ v = vmd()
+ v('menu main off')
+ v.rep('VDW')
+
+ from dump import dump
+ from pdbfile import pdbfile
+
+ d = dump('tmp.dump',0)
+ p = pdbfile(d)
+ d.next()
+ d.unscale()
+ p.single(ntimestep)
+ v.new('tmp.pdb','pdb')
+
+# display GUI with run/stop buttons and slider for temperature
+
+if me == 0:
+ from Tkinter import *
+ tkroot = Tk()
+ tkroot.withdraw()
+ root = Toplevel(tkroot)
+ root.title("LAMMPS GUI")
+
+ frame = Frame(root)
+ Button(frame,text="Run",command=run).pack(side=LEFT)
+ Button(frame,text="Stop",command=stop).pack(side=LEFT)
+ slider = Scale(frame,from_=0.0,to=5.0,resolution=0.1,
+ orient=HORIZONTAL,label="Temperature")
+ slider.bind('',settemp)
+ slider.set(temptarget)
+ slider.pack(side=LEFT)
+ Button(frame,text="Quit",command=quit).pack(side=RIGHT)
+ frame.pack()
+ tkroot.update()
+
+# wrapper on GnuPlot via Pizza.py gnu tool
+
+if me == 0:
+ from gnu import gnu
+ gn = gnu()
+ gn.plot(xaxis,yaxis)
+ gn.title(compute,"Timestep","Temperature")
+
+# endless loop, checking status of GUI settings every Nfreq steps
+# run with pre yes/no and post yes/no depending on go/stop status
+# re-invoke fix langevin with new seed when temperature slider changes
+# after re-invoke of fix langevin, run with pre yes
+
+running = 0
+temp = temptarget
+seed = 12345
+
+lmp.command("fix 2 all langevin %g %g 0.1 %d" % (temp,temp,seed))
+
+while 1:
+ if me == 0: tkroot.update()
+ if temp != temptarget:
+ temp = temptarget
+ seed += me+1
+ lmp.command("fix 2 all langevin %g %g 0.1 12345" % (temp,temp))
+ running = 0
+ if runflag and running:
+ lmp.command("run %d pre no post no" % nfreq)
+ ntimestep += nfreq
+ if me == 0: update(ntimestep)
+ elif runflag and not running:
+ lmp.command("run %d pre yes post no" % nfreq)
+ ntimestep += nfreq
+ if me == 0: update(ntimestep)
+ elif not runflag and running:
+ lmp.command("run %d pre no post yes" % nfreq)
+ ntimestep += nfreq
+ if me == 0: update(ntimestep)
+ if breakflag: break
+ if runflag: running = 1
+ else: running = 0
+ time.sleep(0.01)
+
+lmp.command("run 0 pre no post yes")
+
+# uncomment if running in parallel via Pypar
+#print "Proc %d out of %d procs has" % (me,nprocs), lmp
+#pypar.finalize()
From 509fe6fe17cbb27188794042e4abab8030cd9602 Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 20:40:51 +0000
Subject: [PATCH 21/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5319
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
python/examples/viz_atomeye.py | 8 ++++----
python/examples/viz_gl.py | 6 +++---
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/python/examples/viz_atomeye.py b/python/examples/viz_atomeye.py
index 64f7505eda..cc77409519 100755
--- a/python/examples/viz_atomeye.py
+++ b/python/examples/viz_atomeye.py
@@ -1,9 +1,9 @@
#!/usr/local/bin/python -i
# preceeding line should have path for Python on your machine
-# viz.py
-# Purpose: viz running LAMMPS simulation via GL tool in Pizza.py
-# Syntax: viz.py in.lammps Nfreq Nsteps
+# viz_atomeye.py
+# Purpose: viz running LAMMPS simulation via AtomEye
+# Syntax: viz_atomeye.py in.lammps Nfreq Nsteps
# in.lammps = LAMMPS input script
# Nfreq = dump and viz shapshot every this many steps
# Nsteps = run for this many steps
@@ -18,7 +18,7 @@ ATOMEYE3 = "/home/sjplimp/tools/atomeye3/A3.i686-20060530"
argv = sys.argv
if len(argv) != 4:
- print "Syntax: viz.py in.lammps Nfreq Nsteps"
+ print "Syntax: viz_atomeye.py in.lammps Nfreq Nsteps"
sys.exit()
infile = sys.argv[1]
diff --git a/python/examples/viz_gl.py b/python/examples/viz_gl.py
index 8117e70e29..05e9c99251 100755
--- a/python/examples/viz_gl.py
+++ b/python/examples/viz_gl.py
@@ -1,9 +1,9 @@
#!/usr/local/bin/python -i
# preceeding line should have path for Python on your machine
-# viz.py
+# viz_gl.py
# Purpose: viz running LAMMPS simulation via GL tool in Pizza.py
-# Syntax: viz.py in.lammps Nfreq Nsteps
+# Syntax: viz_gl.py in.lammps Nfreq Nsteps
# in.lammps = LAMMPS input script
# Nfreq = dump and viz shapshot every this many steps
# Nsteps = run for this many steps
@@ -15,7 +15,7 @@ sys.path.append("./pizza")
argv = sys.argv
if len(argv) != 4:
- print "Syntax: viz.py in.lammps Nfreq Nsteps"
+ print "Syntax: viz_gl.py in.lammps Nfreq Nsteps"
sys.exit()
infile = sys.argv[1]
From 5d199c90cd8d9181cc4a9f76354fccbcc904ca92 Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 20:45:17 +0000
Subject: [PATCH 22/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5320
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
python/examples/pizza/vmd.py | 30 +++++++++++++++++++++---------
1 file changed, 21 insertions(+), 9 deletions(-)
diff --git a/python/examples/pizza/vmd.py b/python/examples/pizza/vmd.py
index 06212dc997..8b61ee2d81 100644
--- a/python/examples/pizza/vmd.py
+++ b/python/examples/pizza/vmd.py
@@ -1,13 +1,20 @@
+# Pizza.py toolkit, www.cs.sandia.gov/~sjplimp/pizza.html
+# Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories
#
-# Minimalistic VMD embedding for Pizza.py
-#
-# This class will replace the VMD startup script,
-# open a pipe to the executable, and feed it Tcl
-# command lines one at a time.
-#
-# (c) 2010 Axel Kohlmeyer
+# Copyright (2005) 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.
-oneline = "Control VMD from python."
+# vmd tool
+
+# Minimalistic VMD embedding for Pizza.py
+# (c) 2010 Axel Kohlmeyer
+# This class will replace the VMD startup script,
+# open a pipe to the executable,
+# and feed it Tcl command lines one at a time
+
+oneline = "Control VMD from python"
docstr = """
v = vmd() start up VMD
@@ -30,6 +37,9 @@ v.enter() enter interactive shell
v.debug([True|False]) display generated VMD script commands?
"""
+# History
+# 11/10, Axel Kohlmeyer (Temple U): original version
+
# Imports and external programs
import types, os
@@ -46,8 +56,10 @@ except: PIZZA_VMDARCH = "LINUX"
try: import pexpect
except:
- print "pexpect from http://pypi.python.org/pypi/pexpect/ is required for vmd module"
+ print "pexpect from http://pypi.python.org/pypi/pexpect", \
+ "is required for vmd tool"
raise
+
# Class definition
class vmd:
From f3f2d08e11db78763dacd99dff7da4b689d6164a Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 20:48:24 +0000
Subject: [PATCH 23/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5321
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
src/version.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/version.h b/src/version.h
index 7a14ca54d4..6773201cdb 100644
--- a/src/version.h
+++ b/src/version.h
@@ -1 +1 @@
-#define LAMMPS_VERSION "29 Nov 2010"
+#define LAMMPS_VERSION "30 Nov 2010"
From 9e0598d9189193c0d8ecb6e1851aca53004818ad Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 21:27:39 +0000
Subject: [PATCH 24/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5323
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
python/examples/viz_atomeye.py | 5 +++--
python/examples/vizplotgui_atomeye.py | 3 ++-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/python/examples/viz_atomeye.py b/python/examples/viz_atomeye.py
index cc77409519..c068e69079 100755
--- a/python/examples/viz_atomeye.py
+++ b/python/examples/viz_atomeye.py
@@ -11,8 +11,9 @@
import sys,os
# set this to point to AtomEye version 3 executable
-
-ATOMEYE3 = "/home/sjplimp/tools/atomeye3/A3.i686-20060530"
+# first line if want AtomEye output to screen, 2nd line to file
+#ATOMEYE3 = "/home/sjplimp/tools/atomeye3/A3.i686-20060530"
+ATOMEYE3 = "/home/sjplimp/tools/atomeye3/A3.i686-20060530 > atomeye.out"
# parse command line
diff --git a/python/examples/vizplotgui_atomeye.py b/python/examples/vizplotgui_atomeye.py
index 879b6b061a..6da801eb3d 100755
--- a/python/examples/vizplotgui_atomeye.py
+++ b/python/examples/vizplotgui_atomeye.py
@@ -15,6 +15,7 @@
import sys,os,time
sys.path.append("./pizza")
+# set this to point to AtomEye version 3 executable
# first line if want AtomEye output to screen, 2nd line to file
#ATOMEYE3 = "/home/sjplimp/tools/atomeye3/A3.i686-20060530"
ATOMEYE3 = "/home/sjplimp/tools/atomeye3/A3.i686-20060530 > atomeye.out"
@@ -85,7 +86,7 @@ breakflag = 0
runflag = 0
temptarget = 1.0
-# wrapper on GL window via Pizza.py gl tool
+# wrapper on AtomEye
# just proc 0 handles reading of dump file and viz
if me == 0:
From 182c275000376ea3d941ffa2fc8b34779797fde3 Mon Sep 17 00:00:00 2001
From: sjplimp
Date: Wed, 24 Nov 2010 22:33:33 +0000
Subject: [PATCH 25/28] git-svn-id:
svn://svn.icms.temple.edu/lammps-ro/trunk@5324
f3b2605a-c512-4ea7-a41b-209d697bcdaa
---
doc/JPG/screenshot_atomeye_small.jpg | Bin 27732 -> 7498 bytes
doc/JPG/screenshot_gl_small.jpg | Bin 20386 -> 5875 bytes
doc/JPG/screenshot_pymol_small.jpg | Bin 27349 -> 7660 bytes
doc/JPG/screenshot_vmd.jpg | Bin 0 -> 327211 bytes
doc/JPG/screenshot_vmd_small.jpg | Bin 0 -> 6787 bytes
5 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 doc/JPG/screenshot_vmd.jpg
create mode 100644 doc/JPG/screenshot_vmd_small.jpg
diff --git a/doc/JPG/screenshot_atomeye_small.jpg b/doc/JPG/screenshot_atomeye_small.jpg
index 95c0859c857744e2d715a85989de590ef867e37e..364a6ace4ab088793bb42f994f0c7a5484c5c63e 100644
GIT binary patch
delta 7400
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
literal 27732
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%0DS{CFU~%2of`Lk_
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 | | |