#
# This file is part of the GROMACS molecular simulation package.
#
-# Copyright (c) 2016,2019,2020, by the GROMACS development team, led by
+# Copyright (c) 2016,2019,2020,2021, by the GROMACS development team, led by
# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
# and including many others, as listed in the AUTHORS file in the
# top-level source directory and at http://www.gromacs.org.
gmx_add_unit_test(ListedForcesTest listed_forces-test
CPP_SOURCE_FILES
bonded.cpp
+ pairs.cpp
)
--- /dev/null
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2021, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS 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 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS 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 GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal \file
+ * \brief Implements test of 1-4 interactions
+ *
+ * This test is copied from the bonded interactions test and slightly
+ * modified since 'do_pairs' takes a different set of arguments than
+ * 'calculateSimpleBond'. To keep the test setup uncluttered this test is
+ * therefore not merged into the bonded test but implemented standalone.
+ *
+ * The test setup consists of 2 atom pairs that are tested in an fep setting
+ * (vanishing charge and lennard-jones parameters of one atom) and without
+ * fep. Placement of the atoms in the box is such that shift-forces and pbc
+ * paths in do_pairs are covered.
+ *
+ * \author Sebastian Kehl <sebastian.kehl@mpcdf.mpg.de>
+ * \ingroup module_listed_forces
+ */
+#include "gmxpre.h"
+
+#include "gromacs/listed_forces/bonded.h"
+
+#include <cmath>
+
+#include <memory>
+#include <unordered_map>
+
+#include <gtest/gtest.h>
+
+#include "gromacs/listed_forces/listed_forces.h"
+#include "gromacs/listed_forces/pairs.h"
+#include "gromacs/math/paddedvector.h"
+#include "gromacs/math/units.h"
+#include "gromacs/math/vec.h"
+#include "gromacs/math/vectypes.h"
+#include "gromacs/mdtypes/mdatom.h"
+#include "gromacs/mdtypes/simulation_workload.h"
+#include "gromacs/mdtypes/enerdata.h"
+#include "gromacs/mdtypes/forcerec.h"
+#include "gromacs/mdtypes/inputrec.h"
+#include "gromacs/mdtypes/interaction_const.h"
+#include "gromacs/mdtypes/nblist.h"
+#include "gromacs/tables/forcetable.h"
+#include "gromacs/pbcutil/ishift.h"
+#include "gromacs/pbcutil/pbc.h"
+#include "gromacs/topology/idef.h"
+#include "gromacs/utility/enumerationhelpers.h"
+#include "gromacs/utility/strconvert.h"
+#include "gromacs/utility/stringstream.h"
+#include "gromacs/utility/textwriter.h"
+#include "gromacs/utility/fatalerror.h"
+
+#include "testutils/refdata.h"
+#include "testutils/testasserts.h"
+
+namespace gmx
+{
+namespace test
+{
+namespace
+{
+
+//! Number of atoms used in these tests.
+constexpr int c_numAtoms = 3;
+
+/*! \brief Output from pairs kernels
+ *
+ */
+struct OutputQuantities
+{
+ OutputQuantities(int energyGroup) :
+ energy(energyGroup),
+ dvdLambda(static_cast<int>(FreeEnergyPerturbationCouplingType::Count), 0.0)
+ {
+ }
+
+ //! Energy of this interaction
+ gmx_grppairener_t energy;
+ //! Derivative with respect to lambda
+ std::vector<real> dvdLambda;
+ //! Shift vectors
+ rvec fShift[N_IVEC] = { { 0 } };
+ //! Forces
+ alignas(GMX_REAL_MAX_SIMD_WIDTH * sizeof(real)) rvec4 f[c_numAtoms] = { { 0 } };
+};
+
+/*! \brief Utility to check the output from pairs tests
+ *
+ * \param[in] checker Reference checker
+ * \param[in] output The output from the test to check
+ * \param[in] bondedKernelFlavor Flavor for determining what output to check
+ * \param[in] functionType type of the interaction
+ */
+void checkOutput(TestReferenceChecker* checker,
+ const OutputQuantities& output,
+ const BondedKernelFlavor bondedKernelFlavor,
+ const int functionType)
+{
+ if (computeEnergy(bondedKernelFlavor))
+ {
+ switch (functionType)
+ {
+ case F_LJ14:
+ case F_LJC14_Q:
+ checker->checkReal(output.energy.energyGroupPairTerms[NonBondedEnergyTerms::Coulomb14][0],
+ "Epot Coulomb14");
+ checker->checkReal(output.energy.energyGroupPairTerms[NonBondedEnergyTerms::LJ14][0],
+ "Epot LJ14");
+ break;
+ case F_LJC_PAIRS_NB:
+ checker->checkReal(output.energy.energyGroupPairTerms[NonBondedEnergyTerms::CoulombSR][0],
+ "Epot Coulomb14");
+ checker->checkReal(output.energy.energyGroupPairTerms[NonBondedEnergyTerms::LJSR][0],
+ "Epot LJ14");
+ break;
+ default: gmx_fatal(FARGS, "Unknown function type %d in do_nonbonded14", functionType);
+ }
+ checker->checkReal(output.dvdLambda[static_cast<int>(FreeEnergyPerturbationCouplingType::Coul)],
+ "dVdlCoul ");
+ checker->checkReal(output.dvdLambda[static_cast<int>(FreeEnergyPerturbationCouplingType::Vdw)],
+ "dVdlVdw ");
+ }
+ checker->checkSequence(std::begin(output.f), std::end(output.f), "Forces");
+}
+
+/* \brief Utility class to setup forcerec and interaction parameters
+ *
+ * Data is only initialized as necessary for the 1-4 interactions to work!
+ */
+class ForcerecHelper
+{
+public:
+ ForcerecHelper()
+ {
+ fepVals_.sc_alpha = 0.3;
+ fepVals_.sc_power = 1;
+ fepVals_.sc_r_power = 6.0;
+ fepVals_.sc_sigma = 0.3;
+ fepVals_.sc_sigma_min = 0.3;
+ fepVals_.bScCoul = true;
+
+ fr_.ic = std::make_unique<interaction_const_t>();
+ // set data in ic
+ fr_.ic->softCoreParameters = std::make_unique<interaction_const_t::SoftCoreParameters>(fepVals_);
+
+ // set data in fr
+ real tableRange = 2.9;
+ fr_.pairsTable = make_tables(nullptr, fr_.ic.get(), nullptr, tableRange, GMX_MAKETABLES_14ONLY);
+ fr_.efep = haveFep_;
+ fr_.fudgeQQ = 0.5;
+ fr_.use_simd_kernels = useSimd_;
+ fr_.bMolPBC = haveMolPBC_;
+ }
+
+ t_forcerec* get() { return &fr_; }
+
+private:
+ FreeEnergyPerturbationType haveFep_ = FreeEnergyPerturbationType::No;
+ bool useSimd_ = false;
+ bool haveMolPBC_ = false;
+
+ t_lambda fepVals_;
+ t_forcerec fr_;
+};
+
+ForcerecHelper frHelper;
+
+
+/*! \brief Input structure for listed forces tests
+ */
+struct ListInput
+{
+public:
+ //! Function type
+ int fType = -1;
+ //! do fep
+ bool fep = false;
+ //! Tolerance for float evaluation
+ float floatToler = 1e-6;
+ //! Tolerance for double evaluation
+ double doubleToler = 1e-8;
+ //! Interaction parameters
+ t_iparams iparams = { { 0 } };
+
+ //! Constructor
+ ListInput() {}
+
+ /*! \brief Constructor with tolerance
+ *
+ * \param[in] ftol Single precision tolerance
+ * \param[in] dtol Double precision tolerance
+ */
+ ListInput(float ftol, double dtol)
+ {
+ floatToler = ftol;
+ doubleToler = dtol;
+ }
+
+ /*! \brief Set parameters for lj14 interaction
+ *
+ * Fep is used if either c6A != c6B or c12A != c12B.
+ *
+ * \param[in] c6A lj-c6 of state A
+ * \param[in] c12A lj-c12 of state A
+ * \param[in] c6B lj-c6 of state B
+ * \param[in] c12B lj-c12 of state B
+ */
+ ListInput setLj14Interaction(real c6A, real c12A, real c6B, real c12B)
+ {
+ fType = F_LJ14;
+ fep = (c6A != c6B || c12A != c12B);
+ iparams.lj14.c6A = c6A;
+ iparams.lj14.c12A = c12A;
+ iparams.lj14.c6B = c6B;
+ iparams.lj14.c12B = c12B;
+
+ return *this;
+ }
+
+ /*! \brief Set parameters for ljc14 interaction
+ *
+ * \param[in] qi charge i
+ * \param[in] qj charge j
+ * \param[in] c6 lj-c6
+ * \param[in] c12 lj-c12
+ * \param[in] fudgeQ fudge factor
+ */
+ ListInput setLjc14Interaction(real qi, real qj, real c6, real c12, real fudgeQ)
+ {
+ fType = F_LJC14_Q;
+ iparams.ljc14.qi = qi;
+ iparams.ljc14.qj = qj;
+ iparams.ljc14.c6 = c6;
+ iparams.ljc14.c12 = c12;
+ iparams.ljc14.fqq = fudgeQ;
+
+ return *this;
+ }
+
+ /*! \brief Set parameters for ljcnb interaction
+ *
+ * \param[in] qi charge i
+ * \param[in] qj charge j
+ * \param[in] c6 lj-c6
+ * \param[in] c12 lj-c12
+ */
+ ListInput setLjcnbInteraction(real qi, real qj, real c6, real c12)
+ {
+ fType = F_LJC_PAIRS_NB;
+ iparams.ljcnb.qi = qi;
+ iparams.ljcnb.qj = qj;
+ iparams.ljcnb.c6 = c6;
+ iparams.ljcnb.c12 = c12;
+
+ return *this;
+ }
+};
+
+class ListedForcesPairsTest :
+ public ::testing::TestWithParam<std::tuple<ListInput, PaddedVector<RVec>, PbcType>>
+{
+protected:
+ matrix box_;
+ t_pbc pbc_;
+ PaddedVector<RVec> x_;
+ PbcType pbcType_;
+ ListInput input_;
+ TestReferenceData refData_;
+ TestReferenceChecker checker_;
+
+ ListedForcesPairsTest() : checker_(refData_.rootChecker())
+ {
+ input_ = std::get<0>(GetParam());
+ x_ = std::get<1>(GetParam());
+ pbcType_ = std::get<2>(GetParam());
+ clear_mat(box_);
+ box_[0][0] = box_[1][1] = box_[2][2] = 1.0;
+ set_pbc(&pbc_, pbcType_, box_);
+
+ FloatingPointTolerance tolerance = relativeToleranceAsPrecisionDependentFloatingPoint(
+ 1.0, input_.floatToler, input_.doubleToler);
+
+ checker_.setDefaultTolerance(tolerance);
+ }
+
+ void testOneIfunc(TestReferenceChecker* checker, const real lambda)
+ {
+ SCOPED_TRACE(std::string("Testing PBC type: ") + c_pbcTypeNames[pbcType_]);
+
+ // 'definition of pairs' is a concatenation of #npairs (here 2)
+ // 'nAtomsPerPair+1'-tuples (fType a_0 a_i ... a_nAtomsPerPair)
+ std::vector<t_iatom> iatoms = { 0, 1, 2, 0, 0, 2 };
+
+ std::vector<int> ddgatindex = { 0, 1, 2 };
+ std::vector<real> chargeA = { 1.0, -0.5, -0.5 };
+ std::vector<real> chargeB = { 0.0, 0.0, 0.0 };
+ std::vector<unsigned short> egrp = { 0, 0, 0 };
+ t_mdatoms mdatoms = { 0 };
+
+ mdatoms.chargeA = chargeA.data();
+ mdatoms.chargeB = chargeB.data();
+ mdatoms.cENER = egrp.data();
+ // nPerturbed is not decisive for fep to be used; it is overruled by
+ // other conditions in do_pairs_general; just here to not segfault
+ // upon query
+ mdatoms.nPerturbed = 0;
+
+ t_forcerec* fr = frHelper.get();
+ fr->efep = input_.fep ? FreeEnergyPerturbationType::Yes : FreeEnergyPerturbationType::No;
+ if (pbcType_ != PbcType::No)
+ {
+ fr->bMolPBC = true;
+ }
+
+ std::vector<BondedKernelFlavor> flavors = { BondedKernelFlavor::ForcesAndVirialAndEnergy };
+
+ if (!input_.fep || lambda == 0)
+ {
+ fr->use_simd_kernels = true;
+ flavors.push_back(BondedKernelFlavor::ForcesSimdWhenAvailable);
+ }
+
+ for (const auto flavor : flavors)
+ {
+ SCOPED_TRACE("Testing bonded kernel flavor: " + c_bondedKernelFlavorStrings[flavor]);
+
+ StepWorkload stepWork;
+ stepWork.computeVirial = computeVirial(flavor);
+ stepWork.computeEnergy = computeEnergy(flavor);
+
+ bool havePerturbedInteractions = input_.fep;
+ if (flavor == BondedKernelFlavor::ForcesSimdWhenAvailable)
+ {
+ havePerturbedInteractions = false;
+ }
+
+ int numEnergyTerms = static_cast<int>(NonBondedEnergyTerms::Count);
+ int numFepCouplingTerms = static_cast<int>(FreeEnergyPerturbationCouplingType::Count);
+ OutputQuantities output(numEnergyTerms);
+ std::vector<real> lambdas(numFepCouplingTerms, lambda);
+
+ do_pairs(input_.fType,
+ iatoms.size(),
+ iatoms.data(),
+ &input_.iparams,
+ as_rvec_array(x_.data()),
+ output.f,
+ output.fShift,
+ &pbc_,
+ lambdas.data(),
+ output.dvdLambda.data(),
+ &mdatoms,
+ fr,
+ havePerturbedInteractions,
+ stepWork,
+ &output.energy,
+ ddgatindex.data());
+
+ checkOutput(checker, output, flavor, input_.fType);
+ auto shiftForcesChecker = checker->checkCompound("Shift-Forces", "Shift-forces");
+
+ if (computeVirial(flavor))
+ {
+ shiftForcesChecker.checkVector(output.fShift[CENTRAL], "Central");
+ }
+ else
+ {
+ // Permit omitting to compare shift forces with
+ // reference data when that is useless.
+ shiftForcesChecker.disableUnusedEntriesCheck();
+ }
+ }
+ }
+
+ void testIfunc()
+ {
+ TestReferenceChecker thisChecker =
+ checker_.checkCompound("FunctionType", interaction_function[input_.fType].name)
+ .checkCompound("FEP", (input_.fep ? "Yes" : "No"));
+
+ if (input_.fep)
+ {
+ const int numLambdas = 3;
+ for (int i = 0; i < numLambdas; ++i)
+ {
+ const real lambda = i / (numLambdas - 1.0);
+ auto lambdaChecker = thisChecker.checkCompound("Lambda", toString(lambda));
+ testOneIfunc(&lambdaChecker, lambda);
+ }
+ }
+ else
+ {
+ testOneIfunc(&thisChecker, 0.0);
+ }
+ }
+};
+
+TEST_P(ListedForcesPairsTest, Ifunc)
+{
+ testIfunc();
+}
+
+//! Function types for testing 1-4 interaction. Add new terms at the end.
+std::vector<ListInput> c_14Interaction = {
+ { ListInput(1e-5, 1e-7).setLj14Interaction(0.001458, 1.0062882e-6, 0.0, 0.0) },
+ { ListInput(1e-5, 1e-7).setLj14Interaction(0.001458, 1.0062882e-6, 0.001458, 1.0062882e-6) },
+ { ListInput(1e-5, 1e-7).setLjc14Interaction(1.0, -1.0, 0.001458, 1.0062882e-6, 0.5) },
+ { ListInput(1e-5, 1e-7).setLjcnbInteraction(1.0, -1.0, 0.001458, 1.0062882e-6) }
+};
+
+//! PBC values for testing
+std::vector<PbcType> c_pbcForTests = { PbcType::No, PbcType::XY, PbcType::Xyz };
+
+/*! \brief Coordinates for testing 1-4 interaction
+ *
+ * Define coordinates for 3 atoms here, which will be used in 2 interactions.
+ */
+std::vector<PaddedVector<RVec>> c_coordinatesFor14Interaction = {
+ { { 0.0, 0.0, 0.0 }, { 1.0, 1.0, 1.0 }, { 1.1, 1.2, 1.3 } }
+};
+
+INSTANTIATE_TEST_CASE_P(14Interaction,
+ ListedForcesPairsTest,
+ ::testing::Combine(::testing::ValuesIn(c_14Interaction),
+ ::testing::ValuesIn(c_coordinatesFor14Interaction),
+ ::testing::ValuesIn(c_pbcForTests)));
+
+} // namespace
+
+} // namespace test
+
+} // namespace gmx
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJ14">
+ <FEP Name="Yes">
+ <Lambda Name="0">
+ <Real Name="Epot Coulomb14">0.21407271220614837</Real>
+ <Real Name="Epot LJ14">-0.39771349695163671</Real>
+ <Real Name="dVdlCoul ">-0.21851037383566912</Real>
+ <Real Name="dVdlVdw ">0.41875860652489377</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0.030442842705220918</Real>
+ <Real Name="Y">0.033210373860240998</Real>
+ <Real Name="Z">0.035977905015261082</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0.89301764058624677</Real>
+ <Real Name="Y">1.7860352811724916</Real>
+ <Real Name="Z">2.6790529217587382</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-0.92346048329146768</Real>
+ <Real Name="Y">-1.8192456550327325</Real>
+ <Real Name="Z">-2.7150308267739991</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Shift-Forces>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot Coulomb14">0.10595201107466379</Real>
+ <Real Name="Epot LJ14">-0.19369895958475428</Real>
+ <Real Name="dVdlCoul ">-0.21402396676422034</Real>
+ <Real Name="dVdlVdw ">0.39750692921973912</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0.015221397582715825</Real>
+ <Real Name="Y">0.016605160999326352</Real>
+ <Real Name="Z">0.017988924415936882</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0.42958890996342458</Real>
+ <Real Name="Y">0.85917781992684816</Real>
+ <Real Name="Z">1.2887667298902727</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-0.44481030754614043</Real>
+ <Real Name="Y">-0.87578298092617457</Real>
+ <Real Name="Z">-1.3067556543062095</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Shift-Forces>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot Coulomb14">0</Real>
+ <Real Name="Epot LJ14">0</Real>
+ <Real Name="dVdlCoul ">-0.20983019696952224</Real>
+ <Real Name="dVdlVdw ">0.37749364747323017</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Shift-Forces>
+ </Lambda>
+ </FEP>
+ </FunctionType>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJ14">
+ <FEP Name="Yes">
+ <Lambda Name="0">
+ <Real Name="Epot Coulomb14">0.1445520414957524</Real>
+ <Real Name="Epot LJ14">-0.3979723893321509</Real>
+ <Real Name="dVdlCoul ">-0.14898844529427274</Real>
+ <Real Name="dVdlVdw ">0.41901751034443802</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0.010987624164811038</Real>
+ <Real Name="Y">0.021975248329622051</Real>
+ <Real Name="Z">0.14283911414254338</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0.89301764058624677</Real>
+ <Real Name="Y">1.7860352811724916</Real>
+ <Real Name="Z">2.6790529217587382</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-0.9040052647510578</Real>
+ <Real Name="Y">-1.8080105295021136</Real>
+ <Real Name="Z">-2.8218920359012816</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">-0.010987624164811038</Real>
+ <Real Name="Y">-0.021975248329622051</Real>
+ <Real Name="Z">-0.14283911414254338</Real>
+ </Vector>
+ </Shift-Forces>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot Coulomb14">0.071191990173256878</Real>
+ <Real Name="Epot LJ14">-0.19382840291531345</Real>
+ <Real Name="dVdlCoul ">-0.14450329606174245</Real>
+ <Real Name="dVdlVdw ">0.39776582160013413</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0.0054936782176173184</Real>
+ <Real Name="Y">0.010987356435234625</Real>
+ <Real Name="Z">0.07141781682902508</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0.42958890996342458</Real>
+ <Real Name="Y">0.85917781992684816</Real>
+ <Real Name="Z">1.2887667298902727</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-0.4350825881810419</Real>
+ <Real Name="Y">-0.87016517636208279</Real>
+ <Real Name="Z">-1.3601845467192979</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">-0.0054936782176173184</Real>
+ <Real Name="Y">-0.010987356435234625</Real>
+ <Real Name="Z">-0.07141781682902508</Real>
+ </Vector>
+ </Shift-Forces>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot Coulomb14">0</Real>
+ <Real Name="Epot LJ14">0</Real>
+ <Real Name="dVdlCoul ">-0.14031078405845462</Real>
+ <Real Name="dVdlVdw ">0.37775252841519097</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Shift-Forces>
+ </Lambda>
+ </FEP>
+ </FunctionType>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJC_NB">
+ <FEP Name="No">
+ <Real Name="Epot Coulomb14">-3.4307104627027285</Real>
+ <Real Name="Epot LJ14">-0.3979723893321509</Real>
+ <Real Name="dVdlCoul ">0</Real>
+ <Real Name="dVdlVdw ">0</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0.043664263974573722</Real>
+ <Real Name="Y">0.087328527949147347</Real>
+ <Real Name="Z">0.56763543166945785</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">3.0406526210041607</Real>
+ <Real Name="Y">6.0813052420083142</Real>
+ <Real Name="Z">9.1219578630124758</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-3.0843168849787346</Real>
+ <Real Name="Y">-6.1686337699574612</Real>
+ <Real Name="Z">-9.6895932946819343</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">-0.043664263974573722</Real>
+ <Real Name="Y">-0.087328527949147347</Real>
+ <Real Name="Z">-0.56763543166945785</Real>
+ </Vector>
+ </Shift-Forces>
+ </FEP>
+ </FunctionType>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJC_NB">
+ <FEP Name="No">
+ <Real Name="Epot Coulomb14">-5.3452248382476508</Real>
+ <Real Name="Epot LJ14">-0.79539132295421022</Real>
+ <Real Name="dVdlCoul ">0</Real>
+ <Real Name="dVdlVdw ">0</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">3.0406526210041607</Real>
+ <Real Name="Y">6.0813052420083142</Real>
+ <Real Name="Z">9.1219578630124758</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">3.0406526210041607</Real>
+ <Real Name="Y">6.0813052420083142</Real>
+ <Real Name="Z">9.1219578630124758</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-6.0813052420083213</Real>
+ <Real Name="Y">-12.162610484016628</Real>
+ <Real Name="Z">-18.243915726024952</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">-3.0406526210041607</Real>
+ <Real Name="Y">-6.0813052420083142</Real>
+ <Real Name="Z">-9.1219578630124758</Real>
+ </Vector>
+ </Shift-Forces>
+ </FEP>
+ </FunctionType>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJ14">
+ <FEP Name="Yes">
+ <Lambda Name="0">
+ <Real Name="Epot Coulomb14">-0.33407655239047818</Real>
+ <Real Name="Epot LJ14">-0.79539132295421022</Real>
+ <Real Name="dVdlCoul ">0.3385142675285866</Real>
+ <Real Name="dVdlVdw ">0.83748154200529312</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">1.6088959673922179</Real>
+ <Real Name="Y">3.2177919347844322</Real>
+ <Real Name="Z">4.8266879021766504</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0.89301764058624677</Real>
+ <Real Name="Y">1.7860352811724916</Real>
+ <Real Name="Z">2.6790529217587382</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-2.5019136079784645</Real>
+ <Real Name="Y">-5.0038272159569237</Real>
+ <Real Name="Z">-7.5057408239353887</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">-1.6088959673922179</Real>
+ <Real Name="Y">-3.2177919347844322</Real>
+ <Real Name="Z">-4.8266879021766504</Real>
+ </Vector>
+ </Shift-Forces>
+ </Lambda>
+ <Lambda Name="0.5">
+ <Real Name="Epot Coulomb14">-0.16595391778969223</Real>
+ <Real Name="Epot LJ14">-0.38738008371883476</Real>
+ <Real Name="dVdlCoul ">0.33402780694852929</Real>
+ <Real Name="dVdlVdw ">0.79497818749041516</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0.77157606087074149</Real>
+ <Real Name="Y">1.5431521217414814</Real>
+ <Real Name="Z">2.3147281826122228</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0.42958890996342458</Real>
+ <Real Name="Y">0.85917781992684816</Real>
+ <Real Name="Z">1.2887667298902727</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-1.2011649708341661</Real>
+ <Real Name="Y">-2.4023299416683295</Real>
+ <Real Name="Z">-3.6034949125024953</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">-0.77157606087074149</Real>
+ <Real Name="Y">-1.5431521217414814</Real>
+ <Real Name="Z">-2.3147281826122228</Real>
+ </Vector>
+ </Shift-Forces>
+ </Lambda>
+ <Lambda Name="1">
+ <Real Name="Epot Coulomb14">0</Real>
+ <Real Name="Epot LJ14">0</Real>
+ <Real Name="dVdlCoul ">0.32983398364534788</Real>
+ <Real Name="dVdlVdw ">0.75495162409282812</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Shift-Forces>
+ </Lambda>
+ </FEP>
+ </FunctionType>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJ14">
+ <FEP Name="No">
+ <Real Name="Epot Coulomb14">0.2140727122061484</Real>
+ <Real Name="Epot LJ14">-0.39771349695163671</Real>
+ <Real Name="dVdlCoul ">0</Real>
+ <Real Name="dVdlVdw ">0</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0.030442842705220907</Real>
+ <Real Name="Y">0.033210373860240984</Real>
+ <Real Name="Z">0.035977905015261075</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0.89301764058624677</Real>
+ <Real Name="Y">1.7860352811724916</Real>
+ <Real Name="Z">2.6790529217587382</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-0.92346048329146768</Real>
+ <Real Name="Y">-1.8192456550327325</Real>
+ <Real Name="Z">-2.7150308267739991</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Shift-Forces>
+ </FEP>
+ </FunctionType>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJ14">
+ <FEP Name="No">
+ <Real Name="Epot Coulomb14">0.14455204149575238</Real>
+ <Real Name="Epot LJ14">-0.3979723893321509</Real>
+ <Real Name="dVdlCoul ">0</Real>
+ <Real Name="dVdlVdw ">0</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0.010987624164811043</Real>
+ <Real Name="Y">0.021975248329622062</Real>
+ <Real Name="Z">0.14283911414254344</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0.89301764058624677</Real>
+ <Real Name="Y">1.7860352811724916</Real>
+ <Real Name="Z">2.6790529217587382</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-0.9040052647510578</Real>
+ <Real Name="Y">-1.8080105295021136</Real>
+ <Real Name="Z">-2.8218920359012816</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">-0.010987624164811043</Real>
+ <Real Name="Y">-0.021975248329622062</Real>
+ <Real Name="Z">-0.14283911414254344</Real>
+ </Vector>
+ </Shift-Forces>
+ </FEP>
+ </FunctionType>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJ14">
+ <FEP Name="No">
+ <Real Name="Epot Coulomb14">-0.33407655239047818</Real>
+ <Real Name="Epot LJ14">-0.79539132295421022</Real>
+ <Real Name="dVdlCoul ">0</Real>
+ <Real Name="dVdlVdw ">0</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">1.6088959673922179</Real>
+ <Real Name="Y">3.2177919347844322</Real>
+ <Real Name="Z">4.8266879021766504</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">0.89301764058624677</Real>
+ <Real Name="Y">1.7860352811724916</Real>
+ <Real Name="Z">2.6790529217587382</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-2.5019136079784645</Real>
+ <Real Name="Y">-5.0038272159569237</Real>
+ <Real Name="Z">-7.5057408239353887</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">-1.6088959673922179</Real>
+ <Real Name="Y">-3.2177919347844322</Real>
+ <Real Name="Z">-4.8266879021766504</Real>
+ </Vector>
+ </Shift-Forces>
+ </FEP>
+ </FunctionType>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJC14_Q">
+ <FEP Name="No">
+ <Real Name="Epot Coulomb14">-1.5763138899305722</Real>
+ <Real Name="Epot LJ14">-0.39771349695163671</Real>
+ <Real Name="dVdlCoul ">0</Real>
+ <Real Name="dVdlVdw ">0</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0.060858562567575235</Real>
+ <Real Name="Y">0.066391159164627525</Real>
+ <Real Name="Z">0.071923755761679822</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">2.0861481852628656</Real>
+ <Real Name="Y">4.1722963705257259</Real>
+ <Real Name="Z">6.2584445557885919</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-2.1470067478304409</Real>
+ <Real Name="Y">-4.2386875296903535</Real>
+ <Real Name="Z">-6.3303683115502718</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Shift-Forces>
+ </FEP>
+ </FunctionType>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJC14_Q">
+ <FEP Name="No">
+ <Real Name="Epot Coulomb14">-1.7153552313513643</Real>
+ <Real Name="Epot LJ14">-0.3979723893321509</Real>
+ <Real Name="dVdlCoul ">0</Real>
+ <Real Name="dVdlVdw ">0</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0.021879837434731937</Real>
+ <Real Name="Y">0.043759674869463826</Real>
+ <Real Name="Z">0.28443788665151498</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">2.0861481852628656</Real>
+ <Real Name="Y">4.1722963705257259</Real>
+ <Real Name="Z">6.2584445557885919</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-2.1080280226975976</Real>
+ <Real Name="Y">-4.2160560453951899</Real>
+ <Real Name="Z">-6.5428824424401073</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">-0.021879837434731937</Real>
+ <Real Name="Y">-0.043759674869463826</Real>
+ <Real Name="Z">-0.28443788665151498</Real>
+ </Vector>
+ </Shift-Forces>
+ </FEP>
+ </FunctionType>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJC14_Q">
+ <FEP Name="No">
+ <Real Name="Epot Coulomb14">-2.6726124191238254</Real>
+ <Real Name="Epot LJ14">-0.79539132295421022</Real>
+ <Real Name="dVdlCoul ">0</Real>
+ <Real Name="dVdlVdw ">0</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">2.0861481852628656</Real>
+ <Real Name="Y">4.1722963705257259</Real>
+ <Real Name="Z">6.2584445557885919</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">2.0861481852628656</Real>
+ <Real Name="Y">4.1722963705257259</Real>
+ <Real Name="Z">6.2584445557885919</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-4.1722963705257312</Real>
+ <Real Name="Y">-8.3445927410514518</Real>
+ <Real Name="Z">-12.516889111577184</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">-2.0861481852628656</Real>
+ <Real Name="Y">-4.1722963705257259</Real>
+ <Real Name="Z">-6.2584445557885919</Real>
+ </Vector>
+ </Shift-Forces>
+ </FEP>
+ </FunctionType>
+</ReferenceData>
--- /dev/null
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+ <FunctionType Name="LJC_NB">
+ <FEP Name="No">
+ <Real Name="Epot Coulomb14">-3.1526277798611444</Real>
+ <Real Name="Epot LJ14">-0.39771349695163671</Real>
+ <Real Name="dVdlCoul ">0</Real>
+ <Real Name="dVdlVdw ">0</Real>
+ <Sequence Name="Forces">
+ <Int Name="Length">3</Int>
+ <Vector>
+ <Real Name="X">0.1216900022922839</Real>
+ <Real Name="Y">0.13275272977340061</Real>
+ <Real Name="Z">0.14381545725451733</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">3.0406526210041607</Real>
+ <Real Name="Y">6.0813052420083142</Real>
+ <Real Name="Z">9.1219578630124758</Real>
+ </Vector>
+ <Vector>
+ <Real Name="X">-3.1623426232964444</Real>
+ <Real Name="Y">-6.214057971781715</Real>
+ <Real Name="Z">-9.2657733202669927</Real>
+ </Vector>
+ </Sequence>
+ <Shift-Forces Name="Shift-forces">
+ <Vector Name="Central">
+ <Real Name="X">0</Real>
+ <Real Name="Y">0</Real>
+ <Real Name="Z">0</Real>
+ </Vector>
+ </Shift-Forces>
+ </FEP>
+ </FunctionType>
+</ReferenceData>