diff --git a/regtest/basic/rt15/COLVAR.reference b/regtest/basic/rt15/COLVAR.reference new file mode 100644 index 0000000000000000000000000000000000000000..a95e7f5e5444f31cd84eae0cd6fbc48673de1170 --- /dev/null +++ b/regtest/basic/rt15/COLVAR.reference @@ -0,0 +1,3 @@ +#! FIELDS time d2 + 0.000000 1.000000 + 0.050000 9.000000 diff --git a/regtest/basic/rt15/Distance2.cpp b/regtest/basic/rt15/Distance2.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3ff1f3562f8a1a7cb4def4e4a82a16fe4db67238 --- /dev/null +++ b/regtest/basic/rt15/Distance2.cpp @@ -0,0 +1,130 @@ +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Copyright (c) 2013 The plumed team + (see the PEOPLE file at the root of the distribution for a list of names) + + See http://www.plumed-code.org for more information. + + This file is part of plumed, version 2.0. + + plumed is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + plumed is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with plumed. If not, see <http://www.gnu.org/licenses/>. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +#include "colvar/Colvar.h" +#include "core/ActionRegister.h" + +#include <string> +#include <cmath> + +using namespace std; + +namespace PLMD{ + +class Distance : public colvar::Colvar { + bool components; + bool pbc; + +public: + static void registerKeywords( Keywords& keys ); + Distance(const ActionOptions&); +// active methods: + virtual void calculate(); +}; + +PLUMED_REGISTER_ACTION(Distance,"DISTANCE2") + +void Distance::registerKeywords( Keywords& keys ){ + Colvar::registerKeywords( keys ); + keys.add("atoms","ATOMS","the pair of atom that we are calculating the distance between"); + keys.addFlag("COMPONENTS",false,"calculate the x, y and z components of the distance separately and store them as label.x, label.y and label.z"); +} + +Distance::Distance(const ActionOptions&ao): +PLUMED_COLVAR_INIT(ao), +components(false), +pbc(true) +{ + vector<AtomNumber> atoms; + parseAtomList("ATOMS",atoms); + if(atoms.size()!=2) + error("Number of specified atoms should be 2"); + parseFlag("COMPONENTS",components); + bool nopbc=!pbc; + parseFlag("NOPBC",nopbc); + pbc=!nopbc; + checkRead(); + + log.printf(" between atoms %d %d\n",atoms[0].serial(),atoms[1].serial()); + if(pbc) log.printf(" using periodic boundary conditions\n"); + else log.printf(" without periodic boundary conditions\n"); + + + if(!components){ + + addValueWithDerivatives(); setNotPeriodic(); + + } else{ + addComponentWithDerivatives("x"); componentIsNotPeriodic("x"); + addComponentWithDerivatives("y"); componentIsNotPeriodic("y"); + addComponentWithDerivatives("z"); componentIsNotPeriodic("z"); + } + + requestAtoms(atoms); +} + + +// calculator +void Distance::calculate(){ + + Vector distance; + if(pbc){ + distance=pbcDistance(getPosition(0),getPosition(1)); + } else { + distance=delta(getPosition(0),getPosition(1)); + } + const double value=distance.modulo(); + const double invvalue=1.0/value; + + if(!components){ + + setAtomsDerivatives(0,-invvalue*distance); + setAtomsDerivatives(1,invvalue*distance); + setBoxDerivatives (-invvalue*Tensor(distance,distance)); + setValue (value); + + }else{ + + Value* valuex=getPntrToComponent("x"); + Value* valuey=getPntrToComponent("y"); + Value* valuez=getPntrToComponent("z"); + + setAtomsDerivatives (valuex,0,Vector(-1,0,0)); + setAtomsDerivatives (valuex,1,Vector(+1,0,0)); + setBoxDerivatives (valuex,Tensor(distance,Vector(-1,0,0))); + valuex->set(distance[0]); + + setAtomsDerivatives (valuey,0,Vector(0,-1,0)); + setAtomsDerivatives (valuey,1,Vector(0,+1,0)); + setBoxDerivatives (valuey,Tensor(distance,Vector(0,-1,0))); + valuey->set(distance[1]); + + setAtomsDerivatives (valuez,0,Vector(0,0,-1)); + setAtomsDerivatives (valuez,1,Vector(0,0,+1)); + setBoxDerivatives (valuez,Tensor(distance,Vector(0,0,-1))); + valuez->set(distance[2]); + }; +} + +} + + + diff --git a/regtest/basic/rt15/Makefile b/regtest/basic/rt15/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..3703b27cea227aa053fb6d1d73f861e4384dbcee --- /dev/null +++ b/regtest/basic/rt15/Makefile @@ -0,0 +1 @@ +include ../../scripts/test.make diff --git a/regtest/basic/rt15/config b/regtest/basic/rt15/config new file mode 100644 index 0000000000000000000000000000000000000000..4d3237ab4a4ecd86b2983241a7de3ffb5917dcea --- /dev/null +++ b/regtest/basic/rt15/config @@ -0,0 +1,3 @@ +type=driver +plumed_needs="dlopen" +arg="--plumed plumed.dat --trajectory-stride 10 --timestep 0.005 --ixyz trajectory.xyz" diff --git a/regtest/basic/rt15/der2 b/regtest/basic/rt15/der2 new file mode 100644 index 0000000000000000000000000000000000000000..c7900cb654c6710b7753144beb12fe8d48a6e0c1 --- /dev/null +++ b/regtest/basic/rt15/der2 @@ -0,0 +1 @@ +fake file just to test backup diff --git a/regtest/basic/rt15/plumed.dat b/regtest/basic/rt15/plumed.dat new file mode 100644 index 0000000000000000000000000000000000000000..408583cf10a090356a463a1b15e88c5020398c36 --- /dev/null +++ b/regtest/basic/rt15/plumed.dat @@ -0,0 +1,8 @@ +# This is loading a collective variable on the fly: +LOAD FILE=Distance2.cpp + +d2: DISTANCE2 ATOMS=1,2 + +PRINT FILE=COLVAR ARG=d2 + +ENDPLUMED diff --git a/regtest/basic/rt15/trajectory.xyz b/regtest/basic/rt15/trajectory.xyz new file mode 100644 index 0000000000000000000000000000000000000000..aa856131c7ed36fea3adba7f25a7eb8bec2164fb --- /dev/null +++ b/regtest/basic/rt15/trajectory.xyz @@ -0,0 +1,20 @@ +8 +10 0 0 0 10 0 0 0 10 +X 0.5 0.5 0.5 +X 0.5 0.5 9.5 +X 0.5 9.5 0.5 +X 0.5 9.5 9.5 +X 9.5 0.5 0.5 +X 9.5 0.5 9.5 +X 9.5 9.5 0.5 +X 9.5 9.5 9.5 +8 +10 10 0 0 10 10 10 0 10 +X 0.5 0.5 0.5 +X 0.5 0.5 9.5 +X 0.5 9.5 0.5 +X 0.5 9.5 9.5 +X 9.5 0.5 0.5 +X 9.5 0.5 9.5 +X 9.5 9.5 0.5 +X 9.5 9.4 9.5