Skip to content
Snippets Groups Projects
Commit f89e0490 authored by Giovanni Bussi's avatar Giovanni Bussi
Browse files

Added method to compute virial automatically for variables without PBC

parent 40d20afd
No related branches found
No related tags found
No related merge requests found
......@@ -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);
}
......@@ -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
......@@ -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();
}
}
......@@ -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();
}
}
......@@ -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
//
......
......@@ -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();
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment