diff --git a/src/core/ActionAtomistic.h b/src/core/ActionAtomistic.h index 3a52cc119a91b84a1264f09648228d0259c5b804..12acea4db122825f5736adecafc0b3535616160a 100644 --- a/src/core/ActionAtomistic.h +++ b/src/core/ActionAtomistic.h @@ -77,13 +77,16 @@ public: /// Get position of i-th atom (access by relative index) const Vector & getPosition(int)const; /// Get position of i-th atom (access by absolute AtomNumber). -/// With direct access to the global atom array - const Vector & getPosition(AtomNumber)const; +/// With direct access to the global atom array. +/// \warning Should be only used by actions that need to read the shared position array. +/// This array is insensitive to local changes such as makeWhole(), numerical derivatives, etc. + const Vector & getGlobalPosition(AtomNumber)const; /// Get modifiable position of i-th atom (access by absolute AtomNumber). -/// Should be used by action that need to modify the stored atomic coordinates - Vector & modifyPosition(AtomNumber); +/// \warning Should be only used by actions that need to modify the shared position array. +/// This array is insensitive to local changes such as makeWhole(), numerical derivatives, etc. + Vector & modifyGlobalPosition(AtomNumber); /// Get total number of atoms, including virtual ones. -/// Can be used to make a loop on modifyPosition or getPosition(AtomNumber) +/// Can be used to make a loop on modifyGlobalPosition or getGlobalPosition. unsigned getTotAtoms()const; /// Get modifiable force of i-th atom (access by absolute AtomNumber). /// \warning Should be used by action that need to modify the stored atomic forces. @@ -188,12 +191,12 @@ const Vector & ActionAtomistic::getPosition(int i)const { } inline -const Vector & ActionAtomistic::getPosition(AtomNumber i)const { +const Vector & ActionAtomistic::getGlobalPosition(AtomNumber i)const { return atoms.positions[i.index()]; } inline -Vector & ActionAtomistic::modifyPosition(AtomNumber i) { +Vector & ActionAtomistic::modifyGlobalPosition(AtomNumber i) { return atoms.positions[i.index()]; } diff --git a/src/generic/FitToTemplate.cpp b/src/generic/FitToTemplate.cpp index b0c3aae134832769b7bf2a38b40750d5469a9356..90e32efe86d0cbb73ffec4227bf7e318e9cd3533 100644 --- a/src/generic/FitToTemplate.cpp +++ b/src/generic/FitToTemplate.cpp @@ -285,7 +285,7 @@ void FitToTemplate::calculate() { shift=center-cc; setValue(shift.modulo()); for(unsigned i=0; i<getTotAtoms(); i++) { - Vector & ato (modifyPosition(AtomNumber::index(i))); + Vector & ato (modifyGlobalPosition(AtomNumber::index(i))); ato+=shift; } } @@ -294,7 +294,7 @@ void FitToTemplate::calculate() { double r=rmsd->calc_FitElements( getPositions(), rotation, drotdpos, centeredpositions, center_positions); setValue(r); for(unsigned i=0; i<getTotAtoms(); i++) { - Vector & ato (modifyPosition(AtomNumber::index(i))); + Vector & ato (modifyGlobalPosition(AtomNumber::index(i))); ato=matmul(rotation,ato-center_positions)+center; } // rotate box diff --git a/src/generic/ResetCell.cpp b/src/generic/ResetCell.cpp index 40caea04b4d22f3c18812e7f3c707791832f128e..6e91a3935a87220e3deb05b98a25ea6b5d52f824 100644 --- a/src/generic/ResetCell.cpp +++ b/src/generic/ResetCell.cpp @@ -153,7 +153,7 @@ void ResetCell::calculate() { // rotate all coordinates for(unsigned i=0; i<getTotAtoms(); i++) { - Vector & ato (modifyPosition(AtomNumber::index(i))); + Vector & ato (modifyGlobalPosition(AtomNumber::index(i))); ato=matmul(rotation,ato); } // rotate box diff --git a/src/generic/WholeMolecules.cpp b/src/generic/WholeMolecules.cpp index 4fee06bb3bddacbf08d6752d0a88c1a472fa7f3a..10087ee8f8fbf52fa0c4542713d618bf9eb8e1a9 100644 --- a/src/generic/WholeMolecules.cpp +++ b/src/generic/WholeMolecules.cpp @@ -178,8 +178,8 @@ WholeMolecules::WholeMolecules(const ActionOptions&ao): void WholeMolecules::calculate() { for(unsigned i=0; i<groups.size(); ++i) { for(unsigned j=0; j<groups[i].size()-1; ++j) { - const Vector & first (getPosition(groups[i][j])); - Vector & second (modifyPosition(groups[i][j+1])); + const Vector & first (getGlobalPosition(groups[i][j])); + Vector & second (modifyGlobalPosition(groups[i][j+1])); second=first+pbcDistance(first,second); } } diff --git a/src/generic/WrapAround.cpp b/src/generic/WrapAround.cpp index 9b8712a086e7daf3614e7e4333414df1dff3e689..d06914fed32c99f89ccf1a30db1040d50dd1f17e 100644 --- a/src/generic/WrapAround.cpp +++ b/src/generic/WrapAround.cpp @@ -209,11 +209,11 @@ WrapAround::WrapAround(const ActionOptions&ao): void WrapAround::calculate() { for(unsigned i=0; i<atoms.size(); i+=groupby) { - Vector & first (modifyPosition(atoms[i])); + Vector & first (modifyGlobalPosition(atoms[i])); double mindist2=std::numeric_limits<double>::max(); int closest=-1; for(unsigned j=0; j<reference.size(); ++j) { - Vector & second (modifyPosition(reference[j])); + Vector & second (modifyGlobalPosition(reference[j])); Vector distance=pbcDistance(first,second); double distance2=modulo2(distance); if(distance2<mindist2) { @@ -222,12 +222,12 @@ void WrapAround::calculate() { } } plumed_massert(closest>=0,"closest not found"); - Vector & second (modifyPosition(reference[closest])); + Vector & second (modifyGlobalPosition(reference[closest])); // place first atom of the group first=second+pbcDistance(second,first); // then place other atoms close to the first of the group for(unsigned j=1; j<groupby; j++) { - Vector & second (modifyPosition(atoms[i+j])); + Vector & second (modifyGlobalPosition(atoms[i+j])); second=first+pbcDistance(first,second); } }