From 892fb116cd6401d53f66d60630bb961ecdfed27d Mon Sep 17 00:00:00 2001
From: sjplimp <sjplimp@f3b2605a-c512-4ea7-a41b-209d697bcdaa>
Date: Mon, 17 Mar 2008 23:37:19 +0000
Subject: [PATCH] git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@1608
 f3b2605a-c512-4ea7-a41b-209d697bcdaa

---
 src/GRANULAR/atom_vec_granular.cpp            |  29 +-
 src/GRANULAR/atom_vec_granular.h              |   2 +-
 src/atom.cpp                                  |   5 +-
 src/atom.h                                    |   4 +-
 src/compute_erotate_sphere.cpp                | 105 +++++++
 ...tate_dipole.h => compute_erotate_sphere.h} |  11 +-
 src/compute_rotate_dipole.cpp                 |  90 ------
 src/compute_rotate_gran.cpp                   |  73 -----
 src/compute_temp_sphere.cpp                   | 161 ++++++++++
 ...te_rotate_gran.h => compute_temp_sphere.h} |  16 +-
 src/fix_nph.cpp                               |   4 +-
 src/fix_nve_sphere.cpp                        | 276 ++++++++++++++++++
 src/fix_nve_sphere.h                          |  42 +++
 src/style.h                                   |  10 +-
 src/style_dipole.h                            |  16 -
 src/style_granular.h                          |   2 -
 src/thermo.cpp                                | 105 -------
 src/thermo.h                                  |  10 +-
 18 files changed, 617 insertions(+), 344 deletions(-)
 create mode 100644 src/compute_erotate_sphere.cpp
 rename src/{compute_rotate_dipole.h => compute_erotate_sphere.h} (78%)
 delete mode 100644 src/compute_rotate_dipole.cpp
 delete mode 100644 src/compute_rotate_gran.cpp
 create mode 100644 src/compute_temp_sphere.cpp
 rename src/{compute_rotate_gran.h => compute_temp_sphere.h} (73%)
 create mode 100644 src/fix_nve_sphere.cpp
 create mode 100644 src/fix_nve_sphere.h

diff --git a/src/GRANULAR/atom_vec_granular.cpp b/src/GRANULAR/atom_vec_granular.cpp
index a5e523576b..b81541daf4 100644
--- a/src/GRANULAR/atom_vec_granular.cpp
+++ b/src/GRANULAR/atom_vec_granular.cpp
@@ -41,7 +41,7 @@ AtomVecGranular::AtomVecGranular(LAMMPS *lmp, int narg, char **arg) :
   xcol_data = 5;
 
   atom->radius_flag = atom->density_flag = atom->rmass_flag = 1;
-  atom->xorient_flag = atom->omega_flag = atom->torque_flag = 1;
+  atom->omega_flag = atom->torque_flag = 1;
 
   PI = 4.0*atan(1.0);
 }
@@ -77,8 +77,6 @@ void AtomVecGranular::grow(int n)
   rmass = atom->rmass = (double *)
     memory->srealloc(atom->rmass,nmax*sizeof(double),"atom:rmass");
 
-  xorient = atom->xorient = 
-    memory->grow_2d_double_array(atom->xorient,nmax,3,"atom:xorient");
   omega = atom->omega = 
     memory->grow_2d_double_array(atom->omega,nmax,3,"atom:omega");
   torque = atom->torque =
@@ -107,9 +105,6 @@ void AtomVecGranular::copy(int i, int j)
   radius[j] = radius[i];
   density[j] = density[i];
   rmass[j] = rmass[i];
-  xorient[j][0] = xorient[i][0];
-  xorient[j][1] = xorient[i][1];
-  xorient[j][2] = xorient[i][2];
   omega[j][0] = omega[i][0];
   omega[j][1] = omega[i][1];
   omega[j][2] = omega[i][2];
@@ -408,9 +403,6 @@ int AtomVecGranular::pack_exchange(int i, double *buf)
   buf[m++] = radius[i];
   buf[m++] = density[i];
   buf[m++] = rmass[i];
-  buf[m++] = xorient[i][0];
-  buf[m++] = xorient[i][1];
-  buf[m++] = xorient[i][2];
   buf[m++] = omega[i][0];
   buf[m++] = omega[i][1];
   buf[m++] = omega[i][2];
@@ -445,9 +437,6 @@ int AtomVecGranular::unpack_exchange(double *buf)
   radius[nlocal] = buf[m++];
   density[nlocal] = buf[m++];
   rmass[nlocal] = buf[m++];
-  xorient[nlocal][0] = buf[m++];
-  xorient[nlocal][1] = buf[m++];
-  xorient[nlocal][2] = buf[m++];
   omega[nlocal][0] = buf[m++];
   omega[nlocal][1] = buf[m++];
   omega[nlocal][2] = buf[m++];
@@ -503,9 +492,6 @@ int AtomVecGranular::pack_restart(int i, double *buf)
 
   buf[m++] = radius[i];
   buf[m++] = density[i];
-  buf[m++] = xorient[i][0];
-  buf[m++] = xorient[i][1];
-  buf[m++] = xorient[i][2];
   buf[m++] = omega[i][0];
   buf[m++] = omega[i][1];
   buf[m++] = omega[i][2];
@@ -553,9 +539,6 @@ int AtomVecGranular::unpack_restart(double *buf)
   else
     rmass[nlocal] = PI * radius[nlocal]*radius[nlocal] * density[nlocal];
 
-  xorient[nlocal][0] = buf[m++];
-  xorient[nlocal][1] = buf[m++];
-  xorient[nlocal][2] = buf[m++];
   omega[nlocal][0] = buf[m++];
   omega[nlocal][1] = buf[m++];
   omega[nlocal][2] = buf[m++];
@@ -598,9 +581,6 @@ void AtomVecGranular::create_atom(int itype, double *coord)
       radius[nlocal]*radius[nlocal]*radius[nlocal] * density[nlocal];
   else
     rmass[nlocal] = PI * radius[nlocal]*radius[nlocal] * density[nlocal];
-  xorient[nlocal][0] = 0.0;
-  xorient[nlocal][1] = 0.0;
-  xorient[nlocal][2] = 0.0;
   omega[nlocal][0] = 0.0;
   omega[nlocal][1] = 0.0;
   omega[nlocal][2] = 0.0;
@@ -644,9 +624,6 @@ void AtomVecGranular::data_atom(double *coord, int imagetmp, char **values)
   v[nlocal][0] = 0.0;
   v[nlocal][1] = 0.0;
   v[nlocal][2] = 0.0;
-  xorient[nlocal][0] = 1.0;
-  xorient[nlocal][1] = 0.0;
-  xorient[nlocal][2] = 0.0;
   omega[nlocal][0] = 0.0;
   omega[nlocal][1] = 0.0;
   omega[nlocal][2] = 0.0;
@@ -672,9 +649,6 @@ int AtomVecGranular::data_atom_hybrid(int nlocal, char **values)
   v[nlocal][0] = 0.0;
   v[nlocal][1] = 0.0;
   v[nlocal][2] = 0.0;
-  xorient[nlocal][0] = 1.0;
-  xorient[nlocal][1] = 0.0;
-  xorient[nlocal][2] = 0.0;
   omega[nlocal][0] = 0.0;
   omega[nlocal][1] = 0.0;
   omega[nlocal][2] = 0.0;
@@ -727,7 +701,6 @@ double AtomVecGranular::memory_usage()
   if (atom->memcheck("radius")) bytes += nmax * sizeof(double);
   if (atom->memcheck("density")) bytes += nmax * sizeof(double);
   if (atom->memcheck("rmass")) bytes += nmax * sizeof(double);
-  if (atom->memcheck("xorient")) bytes += nmax*3 * sizeof(double);
   if (atom->memcheck("omega")) bytes += nmax*3 * sizeof(double);
   if (atom->memcheck("torque")) bytes += nmax*3 * sizeof(double);
 
diff --git a/src/GRANULAR/atom_vec_granular.h b/src/GRANULAR/atom_vec_granular.h
index 730e146aab..1e385d9261 100644
--- a/src/GRANULAR/atom_vec_granular.h
+++ b/src/GRANULAR/atom_vec_granular.h
@@ -53,7 +53,7 @@ class AtomVecGranular : public AtomVec {
   int *tag,*type,*mask,*image;
   double **x,**v,**f;
   double *radius,*density,*rmass;
-  double **xorient,**omega,**torque;
+  double **omega,**torque;
 };
 
 }
diff --git a/src/atom.cpp b/src/atom.cpp
index d706e958a8..5475ec7cdc 100644
--- a/src/atom.cpp
+++ b/src/atom.cpp
@@ -63,7 +63,7 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp)
   molecule = NULL;
   q = NULL;
   mu = NULL;
-  xorient = quat = omega = angmom = torque = NULL;
+  quat = omega = angmom = torque = NULL;
   radius = density = rmass = vfrac = NULL;
 
   maxspecial = 1;
@@ -89,7 +89,7 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp)
 
   molecule_flag = 0;
   q_flag = mu_flag = 0;
-  xorient_flag = quat_flag = omega_flag = angmom_flag = torque_flag = 0;
+  quat_flag = omega_flag = angmom_flag = torque_flag = 0;
   radius_flag = density_flag = rmass_flag = vfrac_flag = 0;
 
   // ntype-length arrays
@@ -153,7 +153,6 @@ Atom::~Atom()
 
   memory->sfree(q);
   memory->destroy_2d_double_array(mu);
-  memory->destroy_2d_double_array(xorient);
   memory->destroy_2d_double_array(quat);
   memory->destroy_2d_double_array(omega);
   memory->destroy_2d_double_array(angmom);
diff --git a/src/atom.h b/src/atom.h
index b9404bae7f..658dc35f28 100644
--- a/src/atom.h
+++ b/src/atom.h
@@ -47,7 +47,7 @@ class Atom : protected Pointers {
 
   int *molecule;
   double *q,**mu;
-  double **xorient,**quat,**omega,**angmom,**torque;
+  double **quat,**omega,**angmom,**torque;
   double *radius,*density,*rmass,*vfrac;
 
   int maxspecial;
@@ -74,7 +74,7 @@ class Atom : protected Pointers {
 
   int molecule_flag;
   int q_flag,mu_flag;
-  int xorient_flag,quat_flag,omega_flag,angmom_flag,torque_flag;
+  int quat_flag,omega_flag,angmom_flag,torque_flag;
   int radius_flag,density_flag,rmass_flag,vfrac_flag;
 
   // extra peratom info in restart file destined for fix & diag 
diff --git a/src/compute_erotate_sphere.cpp b/src/compute_erotate_sphere.cpp
new file mode 100644
index 0000000000..2537bf88c5
--- /dev/null
+++ b/src/compute_erotate_sphere.cpp
@@ -0,0 +1,105 @@
+/* ----------------------------------------------------------------------
+   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
+   http://lammps.sandia.gov, Sandia National Laboratories
+   Steve Plimpton, sjplimp@sandia.gov
+
+   Copyright (2003) Sandia Corporation.  Under the terms of Contract
+   DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
+   certain rights in this software.  This software is distributed under 
+   the GNU General Public License.
+
+   See the README file in the top-level LAMMPS directory.
+------------------------------------------------------------------------- */
+
+#include "mpi.h"
+#include "compute_erotate_sphere.h"
+#include "atom.h"
+#include "force.h"
+#include "domain.h"
+#include "group.h"
+#include "error.h"
+
+using namespace LAMMPS_NS;
+
+#define INVOKED_SCALAR 1
+
+#define INERTIA 0.4          // moment of inertia for sphere
+
+/* ---------------------------------------------------------------------- */
+
+ComputeERotateSphere::ComputeERotateSphere(LAMMPS *lmp, int narg, char **arg) :
+  Compute(lmp, narg, arg)
+{
+  if (narg != 3) error->all("Illegal compute erotate/sphere command");
+
+  if (!atom->omega_flag) 
+    error->all("Compute erotate/sphere requires atom attribute omega");
+
+  scalar_flag = 1;
+  extscalar = 1;
+
+  inertia = new double[atom->ntypes+1];
+}
+
+/* ---------------------------------------------------------------------- */
+
+ComputeERotateSphere::~ComputeERotateSphere()
+{
+  delete [] inertia;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void ComputeERotateSphere::init()
+{
+  pfactor = 0.5 * force->mvv2e * INERTIA;
+
+  if (atom->mass && !atom->shape)
+    error->all("Compute erotate/sphere requires atom attribute shape");
+  if (!atom->mass && (!atom->radius_flag || !atom->rmass_flag))
+    error->all("Compute erotate/sphere requires atom attributes radius, rmass");
+
+  if (atom->mass) {
+    double *mass = atom->mass;
+    double **shape = atom->shape;
+    
+    for (int i = 1; i <= atom->ntypes; i++) {
+      if (shape[i][0] != shape[i][1] || shape[i][0] != shape[i][2])
+	error->all("Compute rotate requires spherical particle shapes");
+      inertia[i] = 0.25*shape[i][0]*shape[i][0] * mass[i];
+    }
+  }
+}
+
+/* ---------------------------------------------------------------------- */
+
+double ComputeERotateSphere::compute_scalar()
+{
+  invoked |= INVOKED_SCALAR;
+
+  double **omega = atom->omega;
+  double *radius = atom->radius;
+  double *rmass = atom->rmass;
+  double *mass = atom->mass;
+  int *mask = atom->mask;
+  int *type = atom->type;
+  int nlocal = atom->nlocal;
+
+  double erotate = 0.0;
+
+  if (mass) {
+    for (int i = 0; i < nlocal; i++)
+      if (mask[i] & groupbit)
+	erotate += (omega[i][0]*omega[i][0] + omega[i][1]*omega[i][1] + 
+		    omega[i][2]*omega[i][2]) * inertia[type[i]];
+  } else {
+    for (int i = 0; i < nlocal; i++) 
+      if (mask[i] & groupbit)
+	erotate += (omega[i][0]*omega[i][0] + omega[i][1]*omega[i][1] + 
+		    omega[i][2]*omega[i][2]) * radius[i]*radius[i]*rmass[i];
+  }
+
+  MPI_Allreduce(&erotate,&scalar,1,MPI_DOUBLE,MPI_SUM,world);
+  scalar *= pfactor;
+  return scalar;
+}
diff --git a/src/compute_rotate_dipole.h b/src/compute_erotate_sphere.h
similarity index 78%
rename from src/compute_rotate_dipole.h
rename to src/compute_erotate_sphere.h
index 62e7d09a33..2a06cc52a3 100644
--- a/src/compute_rotate_dipole.h
+++ b/src/compute_erotate_sphere.h
@@ -11,21 +11,22 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
-#ifndef COMPUTE_ROTATE_DIPOLE_H
-#define COMPUTE_ROTATE_DIPOLE_H
+#ifndef COMPUTE_EROTATE_SPHERE_H
+#define COMPUTE_EROTATE_SPHERE_H
 
 #include "compute.h"
 
 namespace LAMMPS_NS {
 
-class ComputeRotateDipole : public Compute {
+class ComputeERotateSphere : public Compute {
  public:
-  ComputeRotateDipole(class LAMMPS *, int, char **);
-  ~ComputeRotateDipole();
+  ComputeERotateSphere(class LAMMPS *, int, char **);
+  ~ComputeERotateSphere();
   void init();
   double compute_scalar();
 
  private:
+  double pfactor;
   double *inertia;
 };
 
diff --git a/src/compute_rotate_dipole.cpp b/src/compute_rotate_dipole.cpp
deleted file mode 100644
index 09b264c53a..0000000000
--- a/src/compute_rotate_dipole.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-/* ----------------------------------------------------------------------
-   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
-   http://lammps.sandia.gov, Sandia National Laboratories
-   Steve Plimpton, sjplimp@sandia.gov
-
-   Copyright (2003) Sandia Corporation.  Under the terms of Contract
-   DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
-   certain rights in this software.  This software is distributed under 
-   the GNU General Public License.
-
-   See the README file in the top-level LAMMPS directory.
-------------------------------------------------------------------------- */
-
-#include "mpi.h"
-#include "compute_rotate_dipole.h"
-#include "atom.h"
-#include "domain.h"
-#include "group.h"
-#include "error.h"
-
-using namespace LAMMPS_NS;
-
-#define INVOKED_SCALAR 1
-#define INERTIA3D 0.4          // moments of inertia for sphere and disk
-#define INERTIA2D 0.5
-
-/* ---------------------------------------------------------------------- */
-
-ComputeRotateDipole::ComputeRotateDipole(LAMMPS *lmp, int narg, char **arg) : 
-  Compute(lmp, narg, arg)
-{
-  if (narg != 3) error->all("Illegal compute rotate/dipole command");
-
-  if (atom->dipole == NULL || !atom->omega_flag)
-    error->all("Compute rotate/dipole requires atom attributes dipole, omega");
-
-  scalar_flag = 1;
-  extscalar = 1;
-
-  inertia = NULL;
-}
-
-/* ---------------------------------------------------------------------- */
-
-ComputeRotateDipole::~ComputeRotateDipole()
-{
-  delete [] inertia;
-}
-
-/* ---------------------------------------------------------------------- */
-
-void ComputeRotateDipole::init()
-{
-  delete [] inertia;
-  inertia = new double[atom->ntypes+1];
-
-  double *mass = atom->mass;
-  double **shape = atom->shape;
-
-  if (domain->dimension == 3)
-    for (int i = 1; i <= atom->ntypes; i++)
-      inertia[i] = INERTIA3D * mass[i] * 0.25*shape[i][0]*shape[i][0];
-  else
-    for (int i = 1; i <= atom->ntypes; i++)
-      inertia[i] = INERTIA2D * mass[i] * 0.25*shape[i][0]*shape[i][0];
-}
-
-/* ---------------------------------------------------------------------- */
-
-double ComputeRotateDipole::compute_scalar()
-{
-  invoked |= INVOKED_SCALAR;
-
-  double *dipole = atom->dipole;
-  double **omega = atom->omega;
-  int *type = atom->type;
-  int *mask = atom->mask;
-  int nlocal = atom->nlocal;
-
-  double erot = 0.0;
-  for (int i = 0; i < nlocal; i++)
-    if (mask[i] & groupbit && dipole[type[i]] > 0.0)
-      erot += inertia[type[i]] * 
-	(omega[i][0]*omega[i][0] + omega[i][1]*omega[i][1] + 
-	 omega[i][2]*omega[i][2]);
-
-  MPI_Allreduce(&erot,&scalar,1,MPI_DOUBLE,MPI_SUM,world);
-  scalar *= 0.5;
-  return scalar;
-}
diff --git a/src/compute_rotate_gran.cpp b/src/compute_rotate_gran.cpp
deleted file mode 100644
index 32e21525c2..0000000000
--- a/src/compute_rotate_gran.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/* ----------------------------------------------------------------------
-   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
-   http://lammps.sandia.gov, Sandia National Laboratories
-   Steve Plimpton, sjplimp@sandia.gov
-
-   Copyright (2003) Sandia Corporation.  Under the terms of Contract
-   DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
-   certain rights in this software.  This software is distributed under 
-   the GNU General Public License.
-
-   See the README file in the top-level LAMMPS directory.
-------------------------------------------------------------------------- */
-
-#include "mpi.h"
-#include "compute_rotate_gran.h"
-#include "atom.h"
-#include "force.h"
-#include "domain.h"
-#include "group.h"
-#include "error.h"
-
-using namespace LAMMPS_NS;
-
-#define INVOKED_SCALAR 1
-#define INERTIA3D 0.4          // moments of inertia for sphere and disk
-#define INERTIA2D 0.5
-
-/* ---------------------------------------------------------------------- */
-
-ComputeRotateGran::ComputeRotateGran(LAMMPS *lmp, int narg, char **arg) : 
-  Compute(lmp, narg, arg)
-{
-  if (narg != 3) error->all("Illegal compute rotate/gran command");
-
-  if (!atom->radius_flag || !atom->rmass_flag || !atom->omega_flag)
-    error->all("Compute rotate/gran requires atom attributes "
-	       "radius, rmass, omega");
-
-  scalar_flag = 1;
-  extscalar = 1;
-}
-
-/* ---------------------------------------------------------------------- */
-
-void ComputeRotateGran::init()
-{
-  if (domain->dimension == 3) pfactor = 0.5 * force->mvv2e * INERTIA3D;
-  else pfactor = 0.5 * force->mvv2e * INERTIA2D;
-}
-
-/* ---------------------------------------------------------------------- */
-
-double ComputeRotateGran::compute_scalar()
-{
-  invoked |= INVOKED_SCALAR;
-
-  double **omega = atom->omega;
-  double *radius = atom->radius;
-  double *rmass = atom->rmass;
-  int *mask = atom->mask;
-  int nlocal = atom->nlocal;
-
-  double erot = 0.0;
-
-  for (int i = 0; i < nlocal; i++) 
-    if (mask[i] & groupbit)
-      erot += (omega[i][0]*omega[i][0] + omega[i][1]*omega[i][1] + 
-	       omega[i][2]*omega[i][2]) * radius[i]*radius[i]*rmass[i];
-
-  MPI_Allreduce(&erot,&scalar,1,MPI_DOUBLE,MPI_SUM,world);
-  scalar *= pfactor;
-  return scalar;
-}
diff --git a/src/compute_temp_sphere.cpp b/src/compute_temp_sphere.cpp
new file mode 100644
index 0000000000..91c044df3b
--- /dev/null
+++ b/src/compute_temp_sphere.cpp
@@ -0,0 +1,161 @@
+/* ----------------------------------------------------------------------
+   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
+   http://lammps.sandia.gov, Sandia National Laboratories
+   Steve Plimpton, sjplimp@sandia.gov
+
+   Copyright (2003) Sandia Corporation.  Under the terms of Contract
+   DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
+   certain rights in this software.  This software is distributed under 
+   the GNU General Public License.
+
+   See the README file in the top-level LAMMPS directory.
+------------------------------------------------------------------------- */
+
+#include "mpi.h"
+#include "compute_temp_sphere.h"
+#include "atom.h"
+#include "force.h"
+#include "domain.h"
+#include "modify.h"
+#include "fix.h"
+#include "group.h"
+#include "error.h"
+
+using namespace LAMMPS_NS;
+
+#define INVOKED_SCALAR 1
+#define INVOKED_VECTOR 2
+
+#define INERTIA 0.4          // moment of inertia for sphere
+
+/* ---------------------------------------------------------------------- */
+
+ComputeTempSphere::ComputeTempSphere(LAMMPS *lmp, int narg, char **arg) : 
+  Compute(lmp, narg, arg)
+{
+  if (narg != 3) error->all("Illegal compute temp command");
+
+  scalar_flag = vector_flag = 1;
+  size_vector = 6;
+  extscalar = 0;
+  extvector = 1;
+  tempflag = 1;
+
+  vector = new double[6];
+  inertia = new double[atom->ntypes+1];
+}
+
+/* ---------------------------------------------------------------------- */
+
+ComputeTempSphere::~ComputeTempSphere()
+{
+  delete [] vector;
+  delete [] inertia;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void ComputeTempSphere::init()
+{
+  fix_dof = 0;
+  for (int i = 0; i < modify->nfix; i++)
+    fix_dof += modify->fix[i]->dof(igroup);
+  recount();
+
+  if (atom->mass) {
+    double *mass = atom->mass;
+    double **shape = atom->shape;
+    
+    for (int i = 1; i <= atom->ntypes; i++) {
+      if (shape[i][0] != shape[i][1] || shape[i][0] != shape[i][2])
+	error->all("Compute temp/sphere requires spherical particle shapes");
+      inertia[i] = INERTIA * 0.25*shape[i][0]*shape[i][0] * mass[i];
+    }
+  }
+}
+
+/* ---------------------------------------------------------------------- */
+
+void ComputeTempSphere::recount()
+{
+  double natoms = group->count(igroup);
+  if (domain->dimension == 3) dof = 6.0 * natoms;
+  else dof = 3.0 * natoms;
+  dof -= extra_dof + fix_dof;
+  if (dof > 0) tfactor = force->mvv2e / (dof * force->boltz);
+  else tfactor = 0.0;
+}
+
+/* ---------------------------------------------------------------------- */
+
+double ComputeTempSphere::compute_scalar()
+{
+  invoked |= INVOKED_SCALAR;
+
+  double **v = atom->v;
+  double **omega = atom->omega;
+  double *mass = atom->mass;
+  double *rmass = atom->rmass;
+  double *radius = atom->radius;
+  int *type = atom->type;
+  int *mask = atom->mask;
+  int nlocal = atom->nlocal;
+
+  double t = 0.0;
+
+  if (mass) {
+    for (int i = 0; i < nlocal; i++)
+      if (mask[i] & groupbit) {
+	t += (v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]) * 
+	  mass[type[i]];
+	t += (omega[i][0]*omega[i][0] + omega[i][1]*omega[i][1] + 
+	      omega[i][2]*omega[i][2]) * inertia[type[i]];
+      }
+  } else {
+    for (int i = 0; i < nlocal; i++)
+      if (mask[i] & groupbit) {
+	t += (v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]) * rmass[i];
+	t += (omega[i][0]*omega[i][0] + omega[i][1]*omega[i][1] + 
+	      omega[i][2]*omega[i][2]) * INERTIA*radius[i]*radius[i]*rmass[i];
+      }
+  }
+
+  MPI_Allreduce(&t,&scalar,1,MPI_DOUBLE,MPI_SUM,world);
+  if (dynamic) recount();
+  scalar *= tfactor;
+  return scalar;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void ComputeTempSphere::compute_vector()
+{
+  int i;
+
+  invoked |= INVOKED_VECTOR;
+
+  double **v = atom->v;
+  double *mass = atom->mass;
+  double *rmass = atom->rmass;
+  int *type = atom->type;
+  int *mask = atom->mask;
+  int nlocal = atom->nlocal;
+
+  double massone,t[6];
+  for (i = 0; i < 6; i++) t[i] = 0.0;
+
+  for (i = 0; i < nlocal; i++)
+    if (mask[i] & groupbit) {
+      if (mass) massone = mass[type[i]];
+      else massone = rmass[i];
+      t[0] += massone * v[i][0]*v[i][0];
+      t[1] += massone * v[i][1]*v[i][1];
+      t[2] += massone * v[i][2]*v[i][2];
+      t[3] += massone * v[i][0]*v[i][1];
+      t[4] += massone * v[i][0]*v[i][2];
+      t[5] += massone * v[i][1]*v[i][2];
+    }
+
+  MPI_Allreduce(t,vector,6,MPI_DOUBLE,MPI_SUM,world);
+  for (i = 0; i < 6; i++) vector[i] *= force->mvv2e;
+}
diff --git a/src/compute_rotate_gran.h b/src/compute_temp_sphere.h
similarity index 73%
rename from src/compute_rotate_gran.h
rename to src/compute_temp_sphere.h
index 9bf17af119..6ae185f3a7 100644
--- a/src/compute_rotate_gran.h
+++ b/src/compute_temp_sphere.h
@@ -11,21 +11,27 @@
    See the README file in the top-level LAMMPS directory.
 ------------------------------------------------------------------------- */
 
-#ifndef COMPUTE_ROTATE_GRAN_H
-#define COMPUTE_ROTATE_GRAN_H
+#ifndef COMPUTE_TEMP_SPHERE_H
+#define COMPUTE_TEMP_SPHERE_H
 
 #include "compute.h"
 
 namespace LAMMPS_NS {
 
-class ComputeRotateGran : public Compute {
+class ComputeTempSphere : public Compute {
  public:
-  ComputeRotateGran(class LAMMPS *, int, char **);
+  ComputeTempSphere(class LAMMPS *, int, char **);
+  ~ComputeTempSphere();
   void init();
   double compute_scalar();
+  void compute_vector();
 
  private:
-  double pfactor;
+  int fix_dof;
+  double tfactor;
+  double *inertia;
+
+  void recount();
 };
 
 }
diff --git a/src/fix_nph.cpp b/src/fix_nph.cpp
index 0556f593d4..53de24d004 100644
--- a/src/fix_nph.cpp
+++ b/src/fix_nph.cpp
@@ -312,8 +312,8 @@ void FixNPH::setup(int vflag)
   p_target[1] = p_start[1];
   p_target[2] = p_start[2];
 
-  double tmp = temperature->compute_scalar();
   if (press_couple == 0) {
+    double tmp = temperature->compute_scalar();
     tmp = pressure->compute_scalar();
   } else {
     temperature->compute_vector();
@@ -425,8 +425,8 @@ void FixNPH::final_integrate()
 
   // compute new pressure
 
-  double tmp = temperature->compute_scalar();
   if (press_couple == 0) {
+    double tmp = temperature->compute_scalar();
     tmp = pressure->compute_scalar();
   } else {
     temperature->compute_vector();
diff --git a/src/fix_nve_sphere.cpp b/src/fix_nve_sphere.cpp
new file mode 100644
index 0000000000..65dfd19963
--- /dev/null
+++ b/src/fix_nve_sphere.cpp
@@ -0,0 +1,276 @@
+/* ----------------------------------------------------------------------
+   LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
+   http://lammps.sandia.gov, Sandia National Laboratories
+   Steve Plimpton, sjplimp@sandia.gov
+
+   Copyright (2003) Sandia Corporation.  Under the terms of Contract
+   DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
+   certain rights in this software.  This software is distributed under 
+   the GNU General Public License.
+
+   See the README file in the top-level LAMMPS directory.
+------------------------------------------------------------------------- */
+
+#include "math.h"
+#include "stdio.h"
+#include "string.h"
+#include "fix_nve_sphere.h"
+#include "atom.h"
+#include "atom_vec.h"
+#include "update.h"
+#include "respa.h"
+#include "force.h"
+#include "error.h"
+
+using namespace LAMMPS_NS;
+
+#define INERTIA 0.4          // moment of inertia for sphere
+
+enum{NONE,DIPOLE};
+
+/* ---------------------------------------------------------------------- */
+
+FixNVESphere::FixNVESphere(LAMMPS *lmp, int narg, char **arg) :
+  Fix(lmp, narg, arg)
+{
+  if (narg < 3) error->all("Illegal fix nve/sphere command");
+
+  // process extra keywords
+
+  extra = NONE;
+
+  int iarg = 3;
+  while (iarg < narg) {
+    if (strcmp(arg[iarg],"update") == 0) {
+      if (iarg+2 > narg) error->all("Illegal fix nve/sphere command");
+      if (strcmp(arg[iarg+1],"dipole") == 0) extra = DIPOLE;
+      else error->all("Illegal fix nve/sphere command");
+      iarg += 2;
+    } else error->all("Illegal fix nve/sphere command");
+  }
+
+  // error check
+
+  if (!atom->omega_flag || !atom->torque_flag)
+    error->all("Fix nve/sphere requires atom attributes omega, torque");
+  if (extra == DIPOLE && !atom->mu_flag)
+    error->all("Fix nve/sphere requires atom attribute mu");
+
+  dttype = new double[atom->ntypes+1];
+}
+
+/* ---------------------------------------------------------------------- */
+
+FixNVESphere::~FixNVESphere()
+{
+  delete [] dttype;
+}
+
+/* ---------------------------------------------------------------------- */
+
+int FixNVESphere::setmask()
+{
+  int mask = 0;
+  mask |= INITIAL_INTEGRATE;
+  mask |= FINAL_INTEGRATE;
+  mask |= INITIAL_INTEGRATE_RESPA;
+  mask |= FINAL_INTEGRATE_RESPA;
+  return mask;
+}
+
+/* ---------------------------------------------------------------------- */
+
+void FixNVESphere::init()
+{
+  dtv = update->dt;
+  dtf = 0.5 * update->dt * force->ftm2v;
+  dtfrotate = dtf / INERTIA;
+
+  if (strcmp(update->integrate_style,"respa") == 0)
+    step_respa = ((Respa *) update->integrate)->step;
+
+  if (atom->mass && !atom->shape)
+    error->all("Fix nve/sphere requires atom attribute shape");
+  if (!atom->mass && (!atom->radius_flag || !atom->rmass_flag))
+    error->all("Fix nve/sphere requires atom attributes radius, rmass");
+
+  if (atom->mass) {
+    double *mass = atom->mass;
+    double **shape = atom->shape;
+    for (int i = 1; i <= atom->ntypes; i++) {
+      if (shape[i][0] != shape[i][1] || shape[i][0] != shape[i][2])
+	error->all("Fix nve/sphere requires spherical particle shapes");
+      dttype[i] = dtfrotate / (0.25*shape[i][0]*shape[i][0]*mass[i]);
+    }
+  }
+}
+
+/* ---------------------------------------------------------------------- */
+
+void FixNVESphere::initial_integrate(int vflag)
+{
+  int itype;
+  double dtfm,dtirotate,msq,scale;
+  double g[3];
+
+  double **x = atom->x;
+  double **v = atom->v;
+  double **f = atom->f;
+  double **omega = atom->omega;
+  double **torque = atom->torque;
+  double *radius = atom->radius;
+  double *rmass = atom->rmass;
+  double *mass = atom->mass;
+  int *mask = atom->mask;
+  int *type = atom->type;
+  int nlocal = atom->nlocal;
+  if (igroup == atom->firstgroup) nlocal = atom->nfirst;
+
+  // update v,x,omega for all particles
+  // d_omega/dt = torque / inertia
+
+  if (mass) {
+    for (int i = 0; i < nlocal; i++) {
+      if (mask[i] & groupbit) {
+	itype = type[i];
+	dtfm = dtf / mass[itype];
+	v[i][0] += dtfm * f[i][0];
+	v[i][1] += dtfm * f[i][1];
+	v[i][2] += dtfm * f[i][2];
+	x[i][0] += dtv * v[i][0];
+	x[i][1] += dtv * v[i][1];
+	x[i][2] += dtv * v[i][2];
+	
+	dtirotate = dttype[itype];
+	omega[i][0] += dtirotate * torque[i][0];
+	omega[i][1] += dtirotate * torque[i][1];
+	omega[i][2] += dtirotate * torque[i][2];
+      }
+    }
+
+  } else {
+    for (int i = 0; i < nlocal; i++) {
+      if (mask[i] & groupbit) {
+	dtfm = dtf / rmass[i];
+	v[i][0] += dtfm * f[i][0];
+	v[i][1] += dtfm * f[i][1];
+	v[i][2] += dtfm * f[i][2];
+	x[i][0] += dtv * v[i][0];
+	x[i][1] += dtv * v[i][1];
+	x[i][2] += dtv * v[i][2];
+	
+	dtirotate = dtfrotate / (radius[i]*radius[i]*rmass[i]);
+	omega[i][0] += dtirotate * torque[i][0];
+	omega[i][1] += dtirotate * torque[i][1];
+	omega[i][2] += dtirotate * torque[i][2];
+      }
+    }
+  }
+
+  // update mu for dipoles
+  // d_mu/dt = omega cross mu
+  // renormalize mu to dipole length
+
+  if (extra == DIPOLE) {
+    double **mu = atom->mu;
+    double *dipole = atom->dipole;
+    for (int i = 0; i < nlocal; i++) {
+      if (mask[i] & groupbit) {
+	if (dipole[type[i]] > 0.0) {
+	  g[0] = mu[i][0] + dtv * (omega[i][1]*mu[i][2]-omega[i][2]*mu[i][1]);
+	  g[1] = mu[i][1] + dtv * (omega[i][2]*mu[i][0]-omega[i][0]*mu[i][2]);
+	  g[2] = mu[i][2] + dtv * (omega[i][0]*mu[i][1]-omega[i][1]*mu[i][0]);
+	  msq = g[0]*g[0] + g[1]*g[1] + g[2]*g[2];
+	  scale = dipole[type[i]]/sqrt(msq);
+	  mu[i][0] = g[0]*scale;
+	  mu[i][1] = g[1]*scale;
+	  mu[i][2] = g[2]*scale;
+	}
+      }
+    }
+  }
+}
+
+/* ---------------------------------------------------------------------- */
+
+void FixNVESphere::final_integrate()
+{
+  int itype;
+  double dtfm,dtirotate;
+
+  double **v = atom->v;
+  double **f = atom->f;
+  double **omega = atom->omega;
+  double **torque = atom->torque;
+  double *mass = atom->mass;
+  double *rmass = atom->rmass;
+  double *radius = atom->radius;
+  int *type = atom->type;
+  int *mask = atom->mask;
+  int nlocal = atom->nlocal;
+  if (igroup == atom->firstgroup) nlocal = atom->nfirst;
+
+  if (mass) {
+    for (int i = 0; i < nlocal; i++) {
+      if (mask[i] & groupbit) {
+	itype = type[i];
+	dtfm = dtf / mass[itype];
+	v[i][0] += dtfm * f[i][0];
+	v[i][1] += dtfm * f[i][1];
+	v[i][2] += dtfm * f[i][2];
+	
+	dtirotate = dttype[itype];
+	omega[i][0] += dtirotate * torque[i][0];
+	omega[i][1] += dtirotate * torque[i][1];
+	omega[i][2] += dtirotate * torque[i][2];
+      }
+    }
+    
+  } else {
+    for (int i = 0; i < nlocal; i++) {
+      if (mask[i] & groupbit) {
+	dtfm = dtf / rmass[i];
+	v[i][0] += dtfm * f[i][0];
+	v[i][1] += dtfm * f[i][1];
+	v[i][2] += dtfm * f[i][2];
+	
+	dtirotate = dtfrotate / (radius[i]*radius[i]*rmass[i]);
+	omega[i][0] += dtirotate * torque[i][0];
+	omega[i][1] += dtirotate * torque[i][1];
+	omega[i][2] += dtirotate * torque[i][2];
+      }
+    }
+  }
+}
+
+/* ---------------------------------------------------------------------- */
+
+void FixNVESphere::initial_integrate_respa(int vflag, int ilevel, int flag)
+{
+  if (flag) return;             // only used by NPT,NPH
+
+  dtv = step_respa[ilevel];
+  dtf = 0.5 * step_respa[ilevel] * force->ftm2v;
+  dtfrotate = dtf / INERTIA;
+
+  if (ilevel == 0) initial_integrate(vflag);
+  else final_integrate();
+}
+
+/* ---------------------------------------------------------------------- */
+
+void FixNVESphere::final_integrate_respa(int ilevel)
+{
+  dtf = 0.5 * step_respa[ilevel] * force->ftm2v;
+  dtfrotate = dtf / INERTIA;
+  final_integrate();
+}
+
+/* ---------------------------------------------------------------------- */
+
+void FixNVESphere::reset_dt()
+{
+  dtv = update->dt;
+  dtf = 0.5 * update->dt * force->ftm2v;
+  dtfrotate = dtf / INERTIA;
+}
diff --git a/src/fix_nve_sphere.h b/src/fix_nve_sphere.h
new file mode 100644
index 0000000000..a8b1e8a94c
--- /dev/null
+++ b/src/fix_nve_sphere.h
@@ -0,0 +1,42 @@
+/* ----------------------------------------------------------------------
+   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.
+------------------------------------------------------------------------- */
+
+#ifndef FIX_NVE_SPHERE_H
+#define FIX_NVE_SPHERE_H
+
+#include "fix.h"
+
+namespace LAMMPS_NS {
+
+class FixNVESphere : public Fix {
+ public:
+  FixNVESphere(class LAMMPS *, int, char **);
+  ~FixNVESphere();
+  int setmask();
+  void init();
+  void initial_integrate(int);
+  void final_integrate();
+  void initial_integrate_respa(int, int, int);
+  void final_integrate_respa(int);
+  void reset_dt();
+
+ private:
+  int extra;
+  double dtv,dtf,dtfrotate;
+  double *step_respa;
+  double *dttype;
+};
+
+}
+
+#endif
diff --git a/src/style.h b/src/style.h
index 31be23a950..c71ea81160 100644
--- a/src/style.h
+++ b/src/style.h
@@ -85,8 +85,7 @@ CommandStyle(write_restart,WriteRestart)
 #include "compute_pe_atom.h"
 #include "compute_pressure.h"
 #include "compute_reduce.h"
-#include "compute_rotate_dipole.h"
-#include "compute_rotate_gran.h"
+#include "compute_erotate_sphere.h"
 #include "compute_stress_atom.h"
 #include "compute_temp.h"
 #include "compute_temp_com.h"
@@ -94,6 +93,7 @@ CommandStyle(write_restart,WriteRestart)
 #include "compute_temp_partial.h"
 #include "compute_temp_ramp.h"
 #include "compute_temp_region.h"
+#include "compute_temp_sphere.h"
 #endif
 
 #ifdef ComputeClass
@@ -106,8 +106,7 @@ ComputeStyle(pe,ComputePE)
 ComputeStyle(pe/atom,ComputePEAtom)
 ComputeStyle(pressure,ComputePressure)
 ComputeStyle(reduce,ComputeReduce)
-ComputeStyle(rotate/dipole,ComputeRotateDipole)
-ComputeStyle(rotate/gran,ComputeRotateGran)
+ComputeStyle(erotate/sphere,ComputeERotateSphere)
 ComputeStyle(stress/atom,ComputeStressAtom)
 ComputeStyle(temp,ComputeTemp)
 ComputeStyle(temp/com,ComputeTempCOM)
@@ -115,6 +114,7 @@ ComputeStyle(temp/deform,ComputeTempDeform)
 ComputeStyle(temp/partial,ComputeTempPartial)
 ComputeStyle(temp/ramp,ComputeTempRamp)
 ComputeStyle(temp/region,ComputeTempRegion)
+ComputeStyle(temp/sphere,ComputeTempSphere)
 #endif
 
 #ifdef DihedralInclude
@@ -165,6 +165,7 @@ DumpStyle(xyz,DumpXYZ)
 #include "fix_nve.h"
 #include "fix_nve_limit.h"
 #include "fix_nve_noforce.h"
+#include "fix_nve_sphere.h"
 #include "fix_nvt.h"
 #include "fix_nvt_sllod.h"
 #include "fix_plane_force.h"
@@ -219,6 +220,7 @@ FixStyle(npt,FixNPT)
 FixStyle(nve,FixNVE)
 FixStyle(nve/limit,FixNVELimit)
 FixStyle(nve/noforce,FixNVENoforce)
+FixStyle(nve/sphere,FixNVESphere)
 FixStyle(nvt,FixNVT)
 FixStyle(nvt/sllod,FixNVTSlodd)
 FixStyle(orient/fcc,FixOrientFCC)
diff --git a/src/style_dipole.h b/src/style_dipole.h
index 7f989773f4..4708beb13c 100644
--- a/src/style_dipole.h
+++ b/src/style_dipole.h
@@ -19,22 +19,6 @@
 AtomStyle(dipole,AtomVecDipole)
 #endif
 
-#ifdef ComputeInclude
-#include "compute_temp_dipole.h"
-#endif
-
-#ifdef ComputeClass
-ComputeStyle(temp/dipole,ComputeTempDipole)
-#endif
-
-#ifdef FixInclude
-#include "fix_nve_dipole.h"
-#endif
-
-#ifdef FixClass
-FixStyle(nve/dipole,FixNVEDipole)
-#endif
-
 #ifdef PairInclude
 #include "pair_dipole_cut.h"
 #endif
diff --git a/src/style_granular.h b/src/style_granular.h
index 5e89edb020..4681b8da9f 100644
--- a/src/style_granular.h
+++ b/src/style_granular.h
@@ -21,7 +21,6 @@ AtomStyle(granular,AtomVecGranular)
 
 #ifdef FixInclude
 #include "fix_freeze.h"
-#include "fix_nve_gran.h"
 #include "fix_pour.h"
 #include "fix_shear_history.h"
 #include "fix_wall_gran.h"
@@ -29,7 +28,6 @@ AtomStyle(granular,AtomVecGranular)
 
 #ifdef FixClass
 FixStyle(freeze,FixFreeze)
-FixStyle(nve/gran,FixNVEGran)
 FixStyle(pour,FixPour)
 FixStyle(SHEAR_HISTORY,FixShearHistory)
 FixStyle(wall/gran,FixWallGran)
diff --git a/src/thermo.cpp b/src/thermo.cpp
index 6c8fe42253..a4283eb452 100644
--- a/src/thermo.cpp
+++ b/src/thermo.cpp
@@ -44,14 +44,11 @@ using namespace LAMMPS_NS;
 // evdwl, ecoul, epair, ebond, eangle, edihed, eimp, emol, elong, etail
 // vol, lx, ly, lz, xlo, xhi, ylo, yhi, zlo, zhi, xy, xz, yz
 // pxx, pyy, pzz, pxy, pxz, pyz
-// drot, grot (rotational KE for dipole and granular particles)
 
 // customize a new thermo style by adding a DEFINE to this list
 
 #define ONE "step temp epair emol etotal press"
 #define MULTI "etotal ke temp pe ebond eangle edihed eimp evdwl ecoul elong press"
-#define GRANULAR "step atoms ke grot"
-#define DIPOLE "step temp epair drot etotal press"
 
 enum{IGNORE,WARN,ERROR};           // same as write_restart.cpp
 enum{ONELINE,MULTILINE};
@@ -97,10 +94,6 @@ Thermo::Thermo(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp)
   } else if (strcmp(style,"multi") == 0) {
     strcpy(line,MULTI);
     lineflag = MULTILINE;
-  } else if (strcmp(style,"granular") == 0) {
-    strcpy(line,GRANULAR);
-  } else if (strcmp(style,"dipole") == 0) {
-    strcpy(line,DIPOLE);
 
   } else if (strcmp(style,"custom") == 0) {
     if (narg == 1) error->all("Illegal thermo style custom command");
@@ -118,18 +111,12 @@ Thermo::Thermo(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp)
   temperature = NULL;
   pressure = NULL;
   pe = NULL;
-  rotate_dipole = NULL;
-  rotate_gran = NULL;
 
   index_temp = index_press_scalar = index_press_vector = index_pe = -1;
-  index_drot = index_grot = -1;
-  internal_drot = internal_grot = 0;
 
   id_temp = (char *) "thermo_temp";
   id_press = (char *) "thermo_press";
   id_pe = (char *) "thermo_pe";
-  id_drot = (char *) "thermo_rotate_dipole";
-  id_grot = (char *) "thermo_rotate_gran";
 
   // count fields in line
   // allocate per-field memory
@@ -139,18 +126,6 @@ Thermo::Thermo(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp)
   allocate();
   parse_fields(line);
 
-  // create the requested compute styles
-  // temperature,pressure,pe always exist b/c Output class created them
-
-  if (index_drot >= 0) {
-    create_compute(id_drot,(char *) "rotate/dipole",NULL);
-    internal_drot = 1;
-  }
-  if (index_grot >= 0) {
-    create_compute(id_grot,(char *) "rotate/gran",NULL);
-    internal_grot = 1;
-  }
-
   // format strings
 
   format_multi = (char *) "---------------- Step %8d ----- "
@@ -170,13 +145,6 @@ Thermo::~Thermo()
   delete [] style;
   delete [] line;
 
-  // delete Compute classes if thermo created them
-
-  if (index_drot >= 0 && internal_drot)
-    modify->delete_compute(id_compute[index_drot]);
-  if (index_grot >= 0 && internal_grot)
-    modify->delete_compute(id_compute[index_grot]);
-
   deallocate();
 
   // format strings
@@ -194,7 +162,6 @@ void Thermo::init()
   // set normvalue to default setting unless user has specified it
 
   if (normuserflag) normvalue = normuser;
-  else if (strcmp(style,"granular") == 0) normvalue = 0;
   else if (strcmp(update->unit_style,"lj") == 0) normvalue = 1;
   else normvalue = 0;
 
@@ -267,8 +234,6 @@ void Thermo::init()
   if (index_press_scalar >= 0) pressure = computes[index_press_scalar];
   if (index_press_vector >= 0) pressure = computes[index_press_vector];
   if (index_pe >= 0) pe = computes[index_pe];
-  if (index_drot >= 0) rotate_dipole = computes[index_drot];
-  if (index_grot >= 0) rotate_gran = computes[index_grot];
 }
 
 /* ---------------------------------------------------------------------- */
@@ -455,38 +420,6 @@ void Thermo::modify_params(int narg, char **arg)
 
       iarg += 2;
 
-    } else if (strcmp(arg[iarg],"drot") == 0) {
-      if (iarg+2 > narg) error->all("Illegal thermo_modify command");
-      if (index_drot < 0) error->all("Thermo style does not use drot");
-      if (internal_drot) {
-	modify->delete_compute(id_compute[index_drot]);
-	internal_drot = 0;
-      }
-      delete [] id_compute[index_drot];
-      int n = strlen(arg[iarg+1]) + 1;
-      id_compute[index_drot] = new char[n];
-      strcpy(id_compute[index_drot],arg[iarg+1]);
-
-      int icompute = modify->find_compute(id_compute[index_drot]);
-      if (icompute < 0) error->all("Could not find thermo_modify drot ID");
-      iarg += 2;
-
-    } else if (strcmp(arg[iarg],"grot") == 0) {
-      if (iarg+2 > narg) error->all("Illegal thermo_modify command");
-      if (index_grot < 0) error->all("Thermo style does not use grot");
-      if (internal_grot) {
-	modify->delete_compute(id_compute[index_grot]);
-	internal_grot = 0;
-      }
-      delete [] id_compute[index_grot];
-      int n = strlen(arg[iarg+1]) + 1;
-      id_compute[index_grot] = new char[n];
-      strcpy(id_compute[index_grot],arg[iarg+1]);
-
-      int icompute = modify->find_compute(id_compute[index_grot]);
-      if (icompute < 0) error->all("Could not find thermo_modify grot ID");
-      iarg += 2;
-
     } else if (strcmp(arg[iarg],"lost") == 0) {
       if (iarg+2 > narg) error->all("Illegal thermo_modify command");
       if (strcmp(arg[iarg+1],"ignore") == 0) lostflag = IGNORE;
@@ -740,13 +673,6 @@ void Thermo::parse_fields(char *str)
       addfield("Pyz",&Thermo::compute_pyz,FLOAT);
       index_press_vector = add_compute(id_press,1);
 
-    } else if (strcmp(word,"drot") == 0) {
-      addfield("RotKEdip",&Thermo::compute_drot,FLOAT);
-      index_drot = add_compute(id_drot,0);
-    } else if (strcmp(word,"grot") == 0) {
-      addfield("RotKEgrn",&Thermo::compute_grot,FLOAT);
-      index_grot = add_compute(id_grot,0);
-
     // compute value = c_ID, fix value = f_ID, variable value = v_ID
     // if no trailing [], then arg is set to 0, else arg is between []
     // copy = at most 8 chars of ID to pass to addfield
@@ -925,14 +851,6 @@ int Thermo::evaluate_keyword(char *word, double *answer)
     if (!pe)
       error->all("Variable uses compute via thermo keyword that thermo does not");
 
-  if (strcmp(word,"drot") == 0)
-    if (!rotate_dipole)
-      error->all("Variable uses compute via thermo keyword that thermo does not");
-
-  if (strcmp(word,"grot") == 0)
-    if (!rotate_gran)
-      error->all("Variable uses compute via thermo keyword that thermo does not");
-
   // set compute_pe invocation flag for keywords that use energy
   // but don't call compute_pe explicitly
 
@@ -1004,9 +922,6 @@ int Thermo::evaluate_keyword(char *word, double *answer)
   else if (strcmp(word,"pxy") == 0) compute_pxy();
   else if (strcmp(word,"pxz") == 0) compute_pxz();
   else if (strcmp(word,"pyz") == 0) compute_pyz();
-  
-  else if (strcmp(word,"drot") == 0) compute_drot();
-  else if (strcmp(word,"grot") == 0) compute_grot();
 
   else return 1;
 
@@ -1440,23 +1355,3 @@ void Thermo::compute_pyz()
     pressure->compute_vector();
   dvalue = pressure->vector[5];
 }
-
-/* ---------------------------------------------------------------------- */
-
-void Thermo::compute_drot()
-{
-  if (thermoflag || rotate_dipole->invoked & INVOKED_SCALAR)
-    dvalue = rotate_dipole->scalar;
-  else dvalue = rotate_dipole->compute_scalar();
-  if (normflag) dvalue /= natoms;
-}
-
-/* ---------------------------------------------------------------------- */
-
-void Thermo::compute_grot()
-{
-  if (thermoflag || rotate_gran->invoked & INVOKED_SCALAR)
-    dvalue = rotate_gran->scalar;
-  else dvalue = rotate_gran->compute_scalar();
-  if (normflag) dvalue /= natoms;
-}
diff --git a/src/thermo.h b/src/thermo.h
index 74a7077d27..cc14576421 100644
--- a/src/thermo.h
+++ b/src/thermo.h
@@ -66,14 +66,11 @@ class Thermo : protected Pointers {
 
                          // data for keyword-specific Compute objects
                          // index = where they are in computes list
-                         // internal = 1/0 if Thermo created them or not
                          // id = ID of Compute objects
                          // Compute * = ptrs to the Compute objects
   int index_temp,index_press_scalar,index_press_vector,index_pe;
-  int index_drot,index_grot;
-  int internal_drot,internal_grot;
-  char *id_temp,*id_press,*id_pe,*id_drot,*id_grot;
-  class Compute *temperature,*pressure,*pe,*rotate_dipole,*rotate_gran;
+  char *id_temp,*id_press,*id_pe;
+  class Compute *temperature,*pressure,*pe;
 
   int ncompute;                // # of Compute objects called by thermo
   char **id_compute;           // their IDs
@@ -154,9 +151,6 @@ class Thermo : protected Pointers {
   void compute_pxy();
   void compute_pyz();
   void compute_pxz();
-
-  void compute_drot();
-  void compute_grot();
 };
 
 }
-- 
GitLab