diff --git a/src/ASPHERE/compute_temp_asphere.cpp b/src/ASPHERE/compute_temp_asphere.cpp index c975e72a69..5006b489d6 100755 --- a/src/ASPHERE/compute_temp_asphere.cpp +++ b/src/ASPHERE/compute_temp_asphere.cpp @@ -68,7 +68,7 @@ void ComputeTempAsphere::init() fix_dof = 0; for (int i = 0; i < modify->nfix; i++) fix_dof += modify->fix[i]->dof(igroup); - recount(); + dof_compute(); tempbias = 0; tbias = NULL; @@ -84,11 +84,12 @@ void ComputeTempAsphere::init() /* ---------------------------------------------------------------------- */ -void ComputeTempAsphere::recount() +void ComputeTempAsphere::dof_compute() { double natoms = group->count(igroup); int dimension = domain->dimension; dof = dimension * natoms; + if (tbias) dof -= tbias->dof_remove(natoms); dof -= extra_dof + fix_dof; // add rotational degrees of freedom @@ -181,7 +182,7 @@ double ComputeTempAsphere::compute_scalar() if (tbias) tbias->restore_bias_all(); MPI_Allreduce(&t,&scalar,1,MPI_DOUBLE,MPI_SUM,world); - if (dynamic) recount(); + if (dynamic || tbias) dof_compute(); scalar *= tfactor; return scalar; } diff --git a/src/ASPHERE/compute_temp_asphere.h b/src/ASPHERE/compute_temp_asphere.h index 95f0a4f71e..c8dbe84249 100755 --- a/src/ASPHERE/compute_temp_asphere.h +++ b/src/ASPHERE/compute_temp_asphere.h @@ -38,7 +38,7 @@ class ComputeTempAsphere : public Compute { Compute *tbias; // ptr to additional bias compute - void recount(); + void dof_compute(); void calculate_inertia(); }; diff --git a/src/compute.cpp b/src/compute.cpp index b97b914243..6a5c20e37a 100644 --- a/src/compute.cpp +++ b/src/compute.cpp @@ -17,6 +17,7 @@ #include "ctype.h" #include "comm.h" #include "compute.h" +#include "domain.h" #include "group.h" #include "modify.h" #include "lattice.h" @@ -71,7 +72,9 @@ Compute::Compute(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) comm_forward = comm_reverse = 0; // set modify defaults + // should change 3 to dimension + //extra_dof = domain->dimension; extra_dof = 3; dynamic = 0; diff --git a/src/compute.h b/src/compute.h index adfbcd88c7..63e042a50e 100644 --- a/src/compute.h +++ b/src/compute.h @@ -77,6 +77,7 @@ class Compute : protected Pointers { virtual int pack_reverse_comm(int, int, double *) {return 0;} virtual void unpack_reverse_comm(int, int *, double *) {} + virtual double dof_remove(double &) {return 0.0;} virtual void remove_bias(int, double *) {} virtual void remove_bias_all() {} virtual void restore_bias(int, double *) {} diff --git a/src/compute_temp.cpp b/src/compute_temp.cpp index 0132b67969..0c898cc2fb 100644 --- a/src/compute_temp.cpp +++ b/src/compute_temp.cpp @@ -56,7 +56,7 @@ void ComputeTemp::init() fix_dof = 0; for (int i = 0; i < modify->nfix; i++) fix_dof += modify->fix[i]->dof(igroup); - recount(); + dof_compute(); tempbias = 0; tbias = NULL; @@ -70,12 +70,13 @@ void ComputeTemp::init() /* ---------------------------------------------------------------------- */ -void ComputeTemp::recount() +void ComputeTemp::dof_compute() { double natoms = group->count(igroup); dof = domain->dimension * natoms; + if (tbias) dof -= tbias->dof_remove(natoms); dof -= extra_dof + fix_dof; - if (dof > 0) tfactor = force->mvv2e / (dof * force->boltz); + if (dof > 0.0) tfactor = force->mvv2e / (dof * force->boltz); else tfactor = 0.0; } @@ -89,7 +90,7 @@ double ComputeTemp::compute_scalar() if (!(tbias->invoked & INVOKED_SCALAR)) double tmp = tbias->compute_scalar(); tbias->remove_bias_all(); - } else tempbias = 0; + } double **v = atom->v; double *mass = atom->mass; @@ -114,7 +115,7 @@ double ComputeTemp::compute_scalar() if (tbias) tbias->restore_bias_all(); MPI_Allreduce(&t,&scalar,1,MPI_DOUBLE,MPI_SUM,world); - if (dynamic) recount(); + if (dynamic || tbias) dof_compute(); scalar *= tfactor; return scalar; } diff --git a/src/compute_temp.h b/src/compute_temp.h index 68dd470d66..763fa534e3 100644 --- a/src/compute_temp.h +++ b/src/compute_temp.h @@ -37,7 +37,7 @@ class ComputeTemp : public Compute { Compute *tbias; // ptr to additional bias compute - void recount(); + void dof_compute(); }; } diff --git a/src/compute_temp_com.cpp b/src/compute_temp_com.cpp index be00aa9419..ac89291bee 100644 --- a/src/compute_temp_com.cpp +++ b/src/compute_temp_com.cpp @@ -63,7 +63,7 @@ void ComputeTempCOM::init() fix_dof = 0; for (int i = 0; i < modify->nfix; i++) fix_dof += modify->fix[i]->dof(igroup); - recount(); + dof_compute(); masstotal = group->mass(igroup); tbias = NULL; @@ -76,10 +76,11 @@ void ComputeTempCOM::init() /* ---------------------------------------------------------------------- */ -void ComputeTempCOM::recount() +void ComputeTempCOM::dof_compute() { double natoms = group->count(igroup); dof = domain->dimension * natoms; + if (tbias) dof -= tbias->dof_remove(natoms); dof -= extra_dof + fix_dof; if (dof > 0) tfactor = force->mvv2e / (dof * force->boltz); else tfactor = 0.0; @@ -126,7 +127,7 @@ double ComputeTempCOM::compute_scalar() if (tbias) tbias->restore_bias_all(); MPI_Allreduce(&t,&scalar,1,MPI_DOUBLE,MPI_SUM,world); - if (dynamic) recount(); + if (dynamic || tbias) dof_compute(); scalar *= tfactor; return scalar; } diff --git a/src/compute_temp_com.h b/src/compute_temp_com.h index c46b750023..c289d29b79 100644 --- a/src/compute_temp_com.h +++ b/src/compute_temp_com.h @@ -38,7 +38,7 @@ class ComputeTempCOM : public Compute { double vbias[3]; // stored velocity bias for one atom Compute *tbias; // ptr to additional bias compute - void recount(); + void dof_compute(); }; } diff --git a/src/compute_temp_deform.cpp b/src/compute_temp_deform.cpp index 1ae5fb29c3..e9d7f5dd6f 100644 --- a/src/compute_temp_deform.cpp +++ b/src/compute_temp_deform.cpp @@ -71,7 +71,7 @@ void ComputeTempDeform::init() fix_dof = 0; for (i = 0; i < modify->nfix; i++) fix_dof += modify->fix[i]->dof(igroup); - recount(); + dof_compute(); tbias = NULL; if (id_bias) { @@ -95,10 +95,11 @@ void ComputeTempDeform::init() /* ---------------------------------------------------------------------- */ -void ComputeTempDeform::recount() +void ComputeTempDeform::dof_compute() { double natoms = group->count(igroup); dof = domain->dimension * natoms; + if (tbias) dof -= tbias->dof_remove(natoms); dof -= extra_dof + fix_dof; if (dof > 0) tfactor = force->mvv2e / (dof * force->boltz); else tfactor = 0.0; @@ -156,6 +157,7 @@ double ComputeTempDeform::compute_scalar() if (tbias) tbias->restore_bias_all(); MPI_Allreduce(&t,&scalar,1,MPI_DOUBLE,MPI_SUM,world); + if (dynamic || tbias) dof_compute(); scalar *= tfactor; return scalar; } diff --git a/src/compute_temp_deform.h b/src/compute_temp_deform.h index f60343600b..a96e337e41 100644 --- a/src/compute_temp_deform.h +++ b/src/compute_temp_deform.h @@ -41,7 +41,7 @@ class ComputeTempDeform : public Compute { int maxbias; // size of vbiasall array Compute *tbias; // ptr to additional bias compute - void recount(); + void dof_compute(); }; } diff --git a/src/compute_temp_partial.cpp b/src/compute_temp_partial.cpp index 21199a1958..a4a11bdf5b 100644 --- a/src/compute_temp_partial.cpp +++ b/src/compute_temp_partial.cpp @@ -16,6 +16,7 @@ #include "compute_temp_partial.h" #include "atom.h" #include "force.h" +#include "domain.h" #include "modify.h" #include "fix.h" #include "group.h" @@ -65,7 +66,7 @@ void ComputeTempPartial::init() fix_dof = 0; for (int i = 0; i < modify->nfix; i++) fix_dof += modify->fix[i]->dof(igroup); - recount(); + dof_compute(); tbias = NULL; if (id_bias) { @@ -77,10 +78,11 @@ void ComputeTempPartial::init() /* ---------------------------------------------------------------------- */ -void ComputeTempPartial::recount() +void ComputeTempPartial::dof_compute() { double natoms = group->count(igroup); dof = (xflag+yflag+zflag) * natoms; + if (tbias) dof -= tbias->dof_remove(natoms); dof -= extra_dof + fix_dof; if (dof > 0) tfactor = force->mvv2e / (dof * force->boltz); else tfactor = 0.0; @@ -88,6 +90,18 @@ void ComputeTempPartial::recount() /* ---------------------------------------------------------------------- */ +double ComputeTempPartial::dof_remove(double &natoms) +{ + double rmdof = 0.0; + if (tbias) rmdof = tbias->dof_remove(natoms); + int activedim = xflag+yflag+zflag; + if (domain->dimension == 2) activedim = xflag+yflag; + rmdof += (domain->dimension - activedim) * natoms; + return rmdof; +} + +/* ---------------------------------------------------------------------- */ + double ComputeTempPartial::compute_scalar() { invoked |= INVOKED_SCALAR; @@ -122,7 +136,7 @@ double ComputeTempPartial::compute_scalar() if (tbias) tbias->restore_bias_all(); MPI_Allreduce(&t,&scalar,1,MPI_DOUBLE,MPI_SUM,world); - if (dynamic) recount(); + if (dynamic || tbias) dof_compute(); scalar *= tfactor; return scalar; } diff --git a/src/compute_temp_partial.h b/src/compute_temp_partial.h index 48f3c90592..12b4a7f12e 100644 --- a/src/compute_temp_partial.h +++ b/src/compute_temp_partial.h @@ -26,6 +26,7 @@ class ComputeTempPartial : public Compute { double compute_scalar(); void compute_vector(); + double dof_remove(double &); void remove_bias(int, double *); void remove_bias_all(); void restore_bias(int, double *); @@ -42,7 +43,7 @@ class ComputeTempPartial : public Compute { int maxbias; // size of vbiasall array Compute *tbias; // ptr to additional bias compute - void recount(); + void dof_compute(); }; } diff --git a/src/compute_temp_ramp.cpp b/src/compute_temp_ramp.cpp index ed9ed0baf1..68ae64f315 100644 --- a/src/compute_temp_ramp.cpp +++ b/src/compute_temp_ramp.cpp @@ -130,7 +130,7 @@ void ComputeTempRamp::init() fix_dof = 0; for (int i = 0; i < modify->nfix; i++) fix_dof += modify->fix[i]->dof(igroup); - recount(); + dof_compute(); tbias = NULL; if (id_bias) { @@ -142,10 +142,11 @@ void ComputeTempRamp::init() /* ---------------------------------------------------------------------- */ -void ComputeTempRamp::recount() +void ComputeTempRamp::dof_compute() { double natoms = group->count(igroup); dof = domain->dimension * natoms; + if (tbias) dof -= tbias->dof_remove(natoms); dof -= extra_dof + fix_dof; if (dof > 0) tfactor = force->mvv2e / (dof * force->boltz); else tfactor = 0.0; @@ -195,7 +196,7 @@ double ComputeTempRamp::compute_scalar() if (tbias) tbias->restore_bias_all(); MPI_Allreduce(&t,&scalar,1,MPI_DOUBLE,MPI_SUM,world); - if (dynamic) recount(); + if (dynamic || tbias) dof_compute(); scalar *= tfactor; return scalar; } diff --git a/src/compute_temp_ramp.h b/src/compute_temp_ramp.h index 47df64e4eb..4462638fc6 100644 --- a/src/compute_temp_ramp.h +++ b/src/compute_temp_ramp.h @@ -45,7 +45,7 @@ class ComputeTempRamp : public Compute { int maxbias; // size of vbiasall array Compute *tbias; // ptr to additional bias compute - void recount(); + void dof_compute(); }; } diff --git a/src/compute_temp_region.cpp b/src/compute_temp_region.cpp index 3a6f46b199..fb01a8f7d2 100644 --- a/src/compute_temp_region.cpp +++ b/src/compute_temp_region.cpp @@ -73,6 +73,17 @@ void ComputeTempRegion::init() /* ---------------------------------------------------------------------- */ +double ComputeTempRegion::dof_remove(double &natoms) +{ + double rmdof = 0.0; + if (tbias) rmdof = tbias->dof_remove(natoms); + natoms -= natoms_region; + rmdof += domain->dimension * natoms; + return rmdof; +} + +/* ---------------------------------------------------------------------- */ + double ComputeTempRegion::compute_scalar() { invoked |= INVOKED_SCALAR; @@ -117,7 +128,8 @@ double ComputeTempRegion::compute_scalar() tarray[0] = count; tarray[1] = t; MPI_Allreduce(tarray,tarray_all,2,MPI_DOUBLE,MPI_SUM,world); - dof = domain->dimension * tarray_all[0] - extra_dof; + natoms_region = tarray_all[0]; + dof = domain->dimension * natoms_region - extra_dof; if (dof > 0) scalar = force->mvv2e * tarray_all[1] / (dof * force->boltz); else scalar = 0.0; return scalar; diff --git a/src/compute_temp_region.h b/src/compute_temp_region.h index 2dd8273f65..4f80ec9df7 100644 --- a/src/compute_temp_region.h +++ b/src/compute_temp_region.h @@ -26,6 +26,7 @@ class ComputeTempRegion : public Compute { double compute_scalar(); void compute_vector(); + double dof_remove(double &); void remove_bias(int, double *); void remove_bias_all(); void restore_bias(int, double *); @@ -34,6 +35,7 @@ class ComputeTempRegion : public Compute { private: int iregion; + double natoms_region; double vbias[3]; // stored velocity bias for one atom double **vbiasall; // stored velocity bias for all atoms diff --git a/src/compute_temp_sphere.cpp b/src/compute_temp_sphere.cpp index 8e7b7baf3d..05eefdf775 100644 --- a/src/compute_temp_sphere.cpp +++ b/src/compute_temp_sphere.cpp @@ -60,7 +60,7 @@ void ComputeTempSphere::init() fix_dof = 0; for (int i = 0; i < modify->nfix; i++) fix_dof += modify->fix[i]->dof(igroup); - recount(); + dof_compute(); tempbias = 0; tbias = NULL; @@ -85,11 +85,12 @@ void ComputeTempSphere::init() /* ---------------------------------------------------------------------- */ -void ComputeTempSphere::recount() +void ComputeTempSphere::dof_compute() { double natoms = group->count(igroup); if (domain->dimension == 3) dof = 6.0 * natoms; else dof = 3.0 * natoms; + if (tbias) dof -= tbias->dof_remove(natoms); dof -= extra_dof + fix_dof; if (dof > 0) tfactor = force->mvv2e / (dof * force->boltz); else tfactor = 0.0; @@ -138,7 +139,7 @@ double ComputeTempSphere::compute_scalar() if (tbias) tbias->restore_bias_all(); MPI_Allreduce(&t,&scalar,1,MPI_DOUBLE,MPI_SUM,world); - if (dynamic) recount(); + if (dynamic || tbias) dof_compute(); scalar *= tfactor; return scalar; } diff --git a/src/compute_temp_sphere.h b/src/compute_temp_sphere.h index 3e7d576997..09e2fd8faa 100644 --- a/src/compute_temp_sphere.h +++ b/src/compute_temp_sphere.h @@ -38,7 +38,7 @@ class ComputeTempSphere : public Compute { Compute *tbias; // ptr to additional bias compute - void recount(); + void dof_compute(); }; }