From a2186af7f41666acacf76a67073f378248d8b67e Mon Sep 17 00:00:00 2001
From: Giovanni Bussi <giovanni.bussi@gmail.com>
Date: Thu, 8 Aug 2013 17:20:16 +0200
Subject: [PATCH] Added regtest for LOAD

---
 regtest/basic/rt15/COLVAR.reference |   3 +
 regtest/basic/rt15/Distance2.cpp    | 130 ++++++++++++++++++++++++++++
 regtest/basic/rt15/Makefile         |   1 +
 regtest/basic/rt15/config           |   3 +
 regtest/basic/rt15/der2             |   1 +
 regtest/basic/rt15/plumed.dat       |   8 ++
 regtest/basic/rt15/trajectory.xyz   |  20 +++++
 7 files changed, 166 insertions(+)
 create mode 100644 regtest/basic/rt15/COLVAR.reference
 create mode 100644 regtest/basic/rt15/Distance2.cpp
 create mode 100644 regtest/basic/rt15/Makefile
 create mode 100644 regtest/basic/rt15/config
 create mode 100644 regtest/basic/rt15/der2
 create mode 100644 regtest/basic/rt15/plumed.dat
 create mode 100644 regtest/basic/rt15/trajectory.xyz

diff --git a/regtest/basic/rt15/COLVAR.reference b/regtest/basic/rt15/COLVAR.reference
new file mode 100644
index 000000000..a95e7f5e5
--- /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 000000000..3ff1f3562
--- /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 000000000..3703b27ce
--- /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 000000000..4d3237ab4
--- /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 000000000..c7900cb65
--- /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 000000000..408583cf1
--- /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 000000000..aa856131c
--- /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
-- 
GitLab