diff --git a/src/Colvar.cpp b/src/Colvar.cpp index a0e93ecd11af8f20035748ae0cd01e0b7d46cb93..33cf38032de9d2ea4d8215789e87185d2fe673c1 100644 --- a/src/Colvar.cpp +++ b/src/Colvar.cpp @@ -87,3 +87,13 @@ void Colvar::apply(){ if( getPntrToComponent(0)->applyForce( forces ) ) modifyForceOnEnergy()+=forces[0]; } } + +void Colvar::setBoxDerivativesNoPbc(Value* v){ + Tensor virial; + unsigned nat=getNumberOfAtoms(); + for(unsigned i=0;i<nat;i++) virial-=Tensor(getPosition(i), + Vector(v->getDerivative(3*i+0), + v->getDerivative(3*i+1), + v->getDerivative(3*i+2))); + setBoxDerivatives(v,virial); +} diff --git a/src/Colvar.h b/src/Colvar.h index a2988eacf84ce18ccd8e68a2283eb9e5cf19c384..c31d20a7ee5e9c77997ee1b9b6dbca6ff5132683 100644 --- a/src/Colvar.h +++ b/src/Colvar.h @@ -58,6 +58,12 @@ protected: const Tensor & getBoxDerivatives()const; const double & getForce()const; void apply(); +/// Set box derivatives automatically. +/// It should be called after the setAtomsDerivatives has been used for all +/// single atoms. +/// \warning It only works for collective variable NOT using PBCs! + void setBoxDerivativesNoPbc(); + void setBoxDerivativesNoPbc(Value*); public: bool checkIsEnergy(){return isEnergy;}; Colvar(const ActionOptions&); @@ -97,6 +103,12 @@ void Colvar::setBoxDerivatives(const Tensor&d){ setBoxDerivatives(getPntrToValue(),d); } +inline +void Colvar::setBoxDerivativesNoPbc(){ + setBoxDerivativesNoPbc(getPntrToValue()); +} + + } #endif diff --git a/src/ColvarDipole.cpp b/src/ColvarDipole.cpp index 66fcd7ed79dd1f492618b6c71c803bc10a08f40f..0382269ac4b8f6311b87ac464eb77f7917380ca4 100644 --- a/src/ColvarDipole.cpp +++ b/src/ColvarDipole.cpp @@ -86,7 +86,6 @@ PLUMED_COLVAR_INIT(ao) void ColvarDipole::calculate() { double dipole=0.; - Tensor virial; vector<Vector> deriv(getNumberOfAtoms()); Vector dipje; vector<double> charges(getNumberOfAtoms()); @@ -111,13 +110,12 @@ void ColvarDipole::calculate() for(unsigned int i=0;i<ga_lista.size();i++) { double dfunc=charges[i]/dipole; deriv[i] = deriv[i] + (dfunc)*dipje; - virial=virial-Tensor(getPosition(i),deriv[i]); } // for(unsigned i=0;i<getPositions().size();++i) setAtomsDerivatives(i,deriv[i]); for(unsigned i=0;i<getNumberOfAtoms();++i) setAtomsDerivatives(i,deriv[i]); setValue (dipole); - setBoxDerivatives (virial); + setBoxDerivativesNoPbc(); } } diff --git a/src/ColvarGyration.cpp b/src/ColvarGyration.cpp index 5c54da4a1fd5ff5982bfe851f2f81e9b5e57d1f4..a2719a86b9b26e6c9b6ff998d3ae9c1db2806883 100644 --- a/src/ColvarGyration.cpp +++ b/src/ColvarGyration.cpp @@ -144,7 +144,6 @@ use_masses(true) void ColvarGyration::calculate(){ std::vector<Vector> derivatives( getNumberOfAtoms() ); - Tensor virial; virial.zero(); double totmass = 0.; double d=0., rgyr=0.; Vector pos0, com, diff; @@ -212,7 +211,6 @@ void ColvarGyration::calculate(){ for(unsigned i=0;i<getNumberOfAtoms();i++){ derivatives[i] /= rgyr*totmass; setAtomsDerivatives(i,derivatives[i]); - virial=virial+(-1.0*Tensor(getPosition(i),derivatives[i])); } break; } @@ -222,7 +220,6 @@ void ColvarGyration::calculate(){ for(unsigned i=0;i<getNumberOfAtoms();i++) { derivatives[i] *= 4.; setAtomsDerivatives(i,derivatives[i]); - virial=virial+(-1.0*Tensor(getPosition(i),derivatives[i])); } break; } @@ -345,13 +342,12 @@ void ColvarGyration::calculate(){ derivatives[i][j]=(prefactor[0]*transf[j][0]*tX[0]+prefactor[1]*transf[j][1]*tX[1]+prefactor[2]*transf[j][2]*tX[2]); } setAtomsDerivatives(i,derivatives[i]); - virial=virial+(-1.0*Tensor(getPosition(i),derivatives[i])); } break; } } setValue(rgyr); - setBoxDerivatives(virial); + setBoxDerivativesNoPbc(); } } diff --git a/src/ColvarPathMSDBase.cpp b/src/ColvarPathMSDBase.cpp index 5853035e47c8f23fcf01f315e46574f976ca54fd..1ac102cfd8608c448594a2145e35d2b97fa0d63a 100644 --- a/src/ColvarPathMSDBase.cpp +++ b/src/ColvarPathMSDBase.cpp @@ -153,15 +153,13 @@ void ColvarPathMSDBase::calculate(){ for(unsigned i=0;i< derivs_s.size();i++){ derivs_s[i]+=tmp*(*it).distder[i] ;} if(j==0){for(unsigned i=0;i< derivs_z.size();i++){ derivs_z[i]+=(*it).distder[i]*expval/partition;}} } - Tensor virial,virialz; for(unsigned i=0;i< derivs_s.size();i++){ setAtomsDerivatives (val_s_path[j],i,derivs_s[i]); - virial=virial+(-1.0*Tensor(getPosition(i),derivs_s[i])); - if(j==0){setAtomsDerivatives (val_z_path,i,derivs_z[i]);virialz=virialz+(-1.0*Tensor(getPosition(i),derivs_z[i]));} + if(j==0){setAtomsDerivatives (val_z_path,i,derivs_z[i]);} } - setBoxDerivatives(val_s_path[j],virial); - if(j==0)setBoxDerivatives(val_z_path,virialz); } + for(unsigned i=0;i<val_s_path.size();++i) setBoxDerivativesNoPbc(val_s_path[i]); + setBoxDerivativesNoPbc(val_z_path); // // here set next round neighbors // diff --git a/src/ColvarRMSD.cpp b/src/ColvarRMSD.cpp index c1a87bb927a7051398129bf752996a319f2c1b0c..840bf0e2f7096c4d8ec108ad662acf25bda550bc 100644 --- a/src/ColvarRMSD.cpp +++ b/src/ColvarRMSD.cpp @@ -158,8 +158,7 @@ void ColvarRMSD::calculate(){ setValue(r); for(unsigned i=0;i<derivs.size();i++) setAtomsDerivatives(i,derivs[i]); Tensor virial; - for(unsigned i=0;i<derivs.size();i++) virial=virial+(-1.0*Tensor(getPosition(i),derivs[i])); - setBoxDerivatives(virial); + setBoxDerivativesNoPbc(); } }