PME solving tests
authorAleksei Iupinov <a.yupinov@gmail.com>
Thu, 5 Jan 2017 13:49:47 +0000 (14:49 +0100)
committerAleksei Iupinov <a.yupinov@gmail.com>
Mon, 21 Aug 2017 13:31:13 +0000 (15:31 +0200)
Unit tests for PME solving on CPU. Test 2 grid sizes, 2 input grids,
normal and triclinic boxes, normal and LJ PME, 2 values of Ewald coefficients
and electrostatic parameter epsilon_r, with and without energy/virial compute.
Transformed grid (and possibly energy and virial gathered from the grid)
are tested as outputs.

Change-Id: I74c85b9d21e3ad30c8ad6c27c544690466ab3673

56 files changed:
src/gromacs/ewald/pme-solve.cpp
src/gromacs/ewald/pme-solve.h
src/gromacs/ewald/tests/pmegathertest.cpp
src/gromacs/ewald/tests/pmesolvetest.cpp [new file with mode: 0644]
src/gromacs/ewald/tests/pmesplinespreadtest.cpp
src/gromacs/ewald/tests/pmetestcommon.cpp
src/gromacs/ewald/tests/pmetestcommon.h
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_0.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_1.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_10.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_11.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_12.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_13.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_14.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_15.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_2.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_3.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_4.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_5.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_6.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_7.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_8.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_9.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_0.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_1.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_2.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_3.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_4.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_5.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_6.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_7.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_0.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_1.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_2.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_3.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_4.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_5.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_6.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_7.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_0.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_1.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_10.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_11.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_12.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_13.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_14.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_15.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_2.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_3.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_4.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_5.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_6.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_7.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_8.xml [new file with mode: 0644]
src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_9.xml [new file with mode: 0644]
src/gromacs/math/gmxcomplex.h

index d5c0ec3b5be6b6374f76a35375445180a37fbf0a..c36fbbf776682eab68e2524b1f5b78ab3bd0c4b7 100644 (file)
@@ -291,7 +291,7 @@ gmx_inline static void calc_exponentials_lj(int start, int end, real *r, real *t
 }
 #endif
 
-int solve_pme_yzx(struct gmx_pme_t *pme, t_complex *grid, real vol,
+int solve_pme_yzx(const gmx_pme_t *pme, t_complex *grid, real vol,
                   gmx_bool bEnerVir,
                   int nthread, int thread)
 {
@@ -542,7 +542,7 @@ int solve_pme_yzx(struct gmx_pme_t *pme, t_complex *grid, real vol,
     return local_ndata[YY]*local_ndata[XX];
 }
 
-int solve_pme_lj_yzx(struct gmx_pme_t *pme, t_complex **grid, gmx_bool bLB, real vol,
+int solve_pme_lj_yzx(const gmx_pme_t *pme, t_complex **grid, gmx_bool bLB, real vol,
                      gmx_bool bEnerVir, int nthread, int thread)
 {
     /* do recip sum over local cells in grid */
index 33c828a39d58db951039b6dca8a3945739d699ad..b1af3702f5e9de02c8dfe0d6dcd3c11c46463729 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2014,2015,2016, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016,2017, 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.
@@ -69,12 +69,12 @@ void get_pme_ener_vir_q(struct pme_solve_work_t *work, int nthread,
 void get_pme_ener_vir_lj(struct pme_solve_work_t *work, int nthread,
                          real *mesh_energy, matrix vir);
 
-int solve_pme_yzx(struct gmx_pme_t *pme, t_complex *grid,
+int solve_pme_yzx(const gmx_pme_t *pme, t_complex *grid,
                   real vol,
                   gmx_bool bEnerVir,
                   int nthread, int thread);
 
-int solve_pme_lj_yzx(struct gmx_pme_t *pme, t_complex **grid, gmx_bool bLB,
+int solve_pme_lj_yzx(const gmx_pme_t *pme, t_complex **grid, gmx_bool bLB,
                      real vol,
                      gmx_bool bEnerVir, int nthread, int thread);
 
index 60c7d5e31c01fe4f6c7ef3cf52fbadf58642fca6..7e1e74f3ee5bbf3cd8a7715c05549dd199be8858 100644 (file)
@@ -403,7 +403,7 @@ class PmeGatherTest : public ::testing::TestWithParam<GatherInputParameters>
                                           (inputForceTreatment == PmeGatherInputHandling::ReduceWith) ? "with reduction" : "without reduction"
                                           ));
 
-                PmeSafePointer pmeSafe = pmeInitWithAtoms(&inputRec, inputAtomData.coordinates, inputAtomData.charges, box);
+                PmeSafePointer pmeSafe = pmeInitAtoms(&inputRec, inputAtomData.coordinates, inputAtomData.charges, box);
 
                 /* Setting some more inputs */
                 pmeSetRealGrid(pmeSafe.get(), mode.first, nonZeroGridValues);
diff --git a/src/gromacs/ewald/tests/pmesolvetest.cpp b/src/gromacs/ewald/tests/pmesolvetest.cpp
new file mode 100644 (file)
index 0000000..d45195d
--- /dev/null
@@ -0,0 +1,320 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2016,2017, 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 PME solving tests.
+ *
+ * \author Aleksei Iupinov <a.yupinov@gmail.com>
+ * \ingroup module_ewald
+ */
+
+#include "gmxpre.h"
+
+#include <string>
+
+#include <gmock/gmock.h>
+
+#include "gromacs/mdtypes/inputrec.h"
+#include "gromacs/utility/stringutil.h"
+
+#include "testutils/refdata.h"
+#include "testutils/testasserts.h"
+
+#include "pmetestcommon.h"
+
+namespace gmx
+{
+namespace test
+{
+namespace
+{
+/*! \brief Convenience typedef of the test input parameters - unit cell box, complex grid dimensions, complex grid values,
+ * electrostatic constant epsilon_r, Ewald splitting parameters ewaldcoeff_q and ewaldcoeff_lj, solver type
+ * Output: transformed local grid (Fourier space); optionally reciprocal energy and virial matrix.
+ * TODO:
+ * Implement and test Lorentz-Berthelot
+ */
+typedef std::tuple<Matrix3x3, IVec, SparseComplexGridValuesInput, double, double, double, PmeSolveAlgorithm> SolveInputParameters;
+
+//! Test fixture
+class PmeSolveTest : public ::testing::TestWithParam<SolveInputParameters>
+{
+    public:
+        //! Default constructor
+        PmeSolveTest() = default;
+
+        //! The test
+        void runTest()
+        {
+            /* Getting the input */
+            Matrix3x3                      box;
+            IVec                           gridSize;
+            SparseComplexGridValuesInput   nonZeroGridValues;
+            double                         epsilon_r;
+            double                         ewaldCoeff_q;
+            double                         ewaldCoeff_lj;
+            PmeSolveAlgorithm              method;
+            std::tie(box, gridSize, nonZeroGridValues, epsilon_r, ewaldCoeff_q, ewaldCoeff_lj, method) = GetParam();
+
+            /* Storing the input where it's needed, running the test */
+            t_inputrec inputRec;
+            inputRec.nkx         = gridSize[XX];
+            inputRec.nky         = gridSize[YY];
+            inputRec.nkz         = gridSize[ZZ];
+            inputRec.pme_order   = 4;
+            inputRec.coulombtype = eelPME;
+            inputRec.epsilon_r   = epsilon_r;
+            switch (method)
+            {
+                case PmeSolveAlgorithm::Coulomb:
+                    break;
+
+                case PmeSolveAlgorithm::LennardJones:
+                    inputRec.vdwtype = evdwPME;
+                    break;
+
+                default:
+                    GMX_THROW(InternalError("Unknown PME solver"));
+            }
+
+            TestReferenceData                     refData;
+            const std::map<CodePath, std::string> modesToTest = {{CodePath::CPU, "CPU"}};
+            for (const auto &mode : modesToTest)
+            {
+                std::map<GridOrdering, std::string> gridOrderingsToTest = {{GridOrdering::YZX, "YZX"}};
+                for (const auto &gridOrdering : gridOrderingsToTest)
+                {
+                    for (bool computeEnergyAndVirial : {false, true})
+                    {
+                        /* Describing the test*/
+                        SCOPED_TRACE(formatString("Testing solving (%s, %s, %s energy/virial) with %s for PME grid size %d %d %d, Ewald coefficients %g %g",
+                                                  (method == PmeSolveAlgorithm::LennardJones) ? "Lennard-Jones" : "Coulomb",
+                                                  gridOrdering.second.c_str(), computeEnergyAndVirial ? "with" : "without",
+                                                  mode.second.c_str(),
+                                                  gridSize[XX], gridSize[YY], gridSize[ZZ],
+                                                  ewaldCoeff_q, ewaldCoeff_lj
+                                                  ));
+
+                        /* Running the test */
+                        PmeSafePointer pmeSafe = pmeInitEmpty(&inputRec, box, ewaldCoeff_q, ewaldCoeff_lj);
+                        pmeSetComplexGrid(pmeSafe.get(), mode.first, gridOrdering.first, nonZeroGridValues);
+                        const real     cellVolume = box[0] * box[4] * box[8];
+                        //FIXME - this is box[XX][XX] * box[YY][YY] * box[ZZ][ZZ], should be stored in the PME structure
+                        pmePerformSolve(pmeSafe.get(), mode.first, method, cellVolume, gridOrdering.first, computeEnergyAndVirial);
+
+                        /* Check the outputs */
+                        TestReferenceChecker checker(refData.rootChecker());
+                        const auto           ulpTolerance = 200;
+                        checker.setDefaultTolerance(relativeToleranceAsUlp(10.0, ulpTolerance));
+
+                        SparseComplexGridValuesOutput nonZeroGridValuesOutput = pmeGetComplexGrid(pmeSafe.get(), mode.first, gridOrdering.first);
+                        /* Transformed grid */
+                        TestReferenceChecker          gridValuesChecker(checker.checkCompound("NonZeroGridValues", "ComplexSpaceGrid"));
+                        const auto                    ulpToleranceGrid = 50;
+                        gridValuesChecker.setDefaultTolerance(relativeToleranceAsUlp(1.0, ulpToleranceGrid));
+                        for (const auto &point : nonZeroGridValuesOutput)
+                        {
+                            // we want an additional safeguard for denormal numbers as they cause an exception in string conversion;
+                            // however, using GMX_REAL_MIN causes an "unused item warning" for single precision builds
+                            if (fabs(point.second.re) >= GMX_FLOAT_MIN)
+                            {
+                                gridValuesChecker.checkReal(point.second.re, (point.first + " re").c_str());
+                            }
+                            if (fabs(point.second.im) >= GMX_FLOAT_MIN)
+                            {
+                                gridValuesChecker.checkReal(point.second.im, (point.first + " im").c_str());
+                            }
+                        }
+
+                        if (computeEnergyAndVirial)
+                        {
+                            real       energy;
+                            Matrix3x3  virial;
+                            std::tie(energy, virial) = pmeGetReciprocalEnergyAndVirial(pmeSafe.get(), mode.first, method);
+                            /* Energy */
+                            checker.checkReal(energy, "Energy");
+                            /* Virial */
+                            TestReferenceChecker virialChecker(checker.checkCompound("Matrix", "Virial"));
+                            virialChecker.setDefaultTolerance(relativeToleranceAsUlp(1000, 30));
+                            for (int i = 0; i < DIM; i++)
+                            {
+                                for (int j = 0; j <= i; j++)
+                                {
+                                    std::string valueId = formatString("Cell %d %d", i, j);
+                                    virialChecker.checkReal(virial[i * DIM + j], valueId.c_str());
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+};
+
+/*! \brief Test for PME solving */
+TEST_P(PmeSolveTest, ReproducesOutputs)
+{
+    EXPECT_NO_THROW(runTest());
+}
+
+/* Valid input instances */
+
+//! A couple of valid inputs for boxes.
+static std::vector<Matrix3x3> const c_sampleBoxes
+{
+    // normal box
+    Matrix3x3 {{
+                   8.0f, 0.0f, 0.0f,
+                   0.0f, 3.4f, 0.0f,
+                   0.0f, 0.0f, 2.0f
+               }},
+    // triclinic box
+    Matrix3x3 {{
+                   7.0f, 0.0f, 0.0f,
+                   0.0f, 4.1f, 0.0f,
+                   3.5f, 2.0f, 12.2f
+               }},
+};
+
+//! A couple of valid inputs for grid sizes
+static std::vector<IVec> const c_sampleGridSizes
+{
+    IVec {
+        16, 12, 28
+    },
+    IVec {
+        9, 7, 23
+    }
+};
+
+//! Moved out from instantiations for readability
+const auto c_inputBoxes     = ::testing::ValuesIn(c_sampleBoxes);
+//! Moved out from instantiations for readability
+const auto c_inputGridSizes = ::testing::ValuesIn(c_sampleGridSizes);
+
+//! 2 sample complex grids - only non-zero values have to be listed
+static std::vector<SparseComplexGridValuesInput> const c_sampleGrids
+{
+    SparseComplexGridValuesInput {{
+                                      IVec {
+                                          0, 0, 0
+                                      }, t_complex {
+                                          3.5f, 6.7f
+                                      }
+                                  }, {
+                                      IVec {
+                                          7, 0, 0
+                                      }, t_complex {
+                                          -2.5f, -0.7f
+                                      }
+                                  }, {
+                                      IVec {
+                                          3, 5, 7
+                                      }, t_complex {
+                                          -0.006f, 1e-8f
+                                      }
+                                  }, {
+                                      IVec {
+                                          3, 1, 2
+                                      }, t_complex {
+                                          0.6f, 7.9f
+                                      }
+                                  },  {
+                                      IVec {
+                                          6, 2, 4
+                                      }, t_complex {
+                                          30.1f, 2.45f
+                                      }
+                                  }, },
+    SparseComplexGridValuesInput {{
+                                      IVec {
+                                          0, 4, 0
+                                      }, t_complex {
+                                          0.0f, 0.3f
+                                      }
+                                  }, {
+                                      IVec {
+                                          4, 2, 7
+                                      }, t_complex {
+                                          13.76f, -40.0f
+                                      }
+                                  }, {
+                                      IVec {
+                                          0, 6, 7
+                                      }, t_complex {
+                                          3.6f, 0.0f
+                                      }
+                                  }, {
+                                      IVec {
+                                          2, 5, 10
+                                      }, t_complex {
+                                          3.6f, 10.65f
+                                      }
+                                  }, }
+};
+
+//! Moved out from instantiations for readability
+const auto c_inputGrids = ::testing::ValuesIn(c_sampleGrids);
+//! Moved out from instantiations for readability
+const auto c_inputEpsilon_r = ::testing::Values(1.2);
+//! Moved out from instantiations for readability
+const auto c_inputEwaldCoeff_q = ::testing::Values(2.0);
+//! Moved out from instantiations for readability
+const auto c_inputEwaldCoeff_lj = ::testing::Values(0.7);
+//! Moved out from instantiations for readability
+const auto c_inputMethods = ::testing::Values(PmeSolveAlgorithm::Coulomb, PmeSolveAlgorithm::LennardJones);
+
+//! Instantiation of the PME solving test
+INSTANTIATE_TEST_CASE_P(SaneInput, PmeSolveTest, ::testing::Combine(c_inputBoxes, c_inputGridSizes, c_inputGrids,
+                                                                    c_inputEpsilon_r, c_inputEwaldCoeff_q, c_inputEwaldCoeff_lj, c_inputMethods));
+
+//! A few more instances to check that different ewaldCoeff_q actually affects results of the Coulomb solver
+INSTANTIATE_TEST_CASE_P(DifferentEwaldCoeffQ, PmeSolveTest, ::testing::Combine(c_inputBoxes, c_inputGridSizes, c_inputGrids,
+                                                                               c_inputEpsilon_r, ::testing::Values(0.4), c_inputEwaldCoeff_lj,
+                                                                                   ::testing::Values(PmeSolveAlgorithm::Coulomb)));
+
+//! A few more instances to check that different ewaldCoeff_lj actually affects results of the Lennard-Jones solver
+INSTANTIATE_TEST_CASE_P(DifferentEwaldCoeffLJ, PmeSolveTest, ::testing::Combine(c_inputBoxes, c_inputGridSizes, c_inputGrids,
+                                                                                c_inputEpsilon_r, c_inputEwaldCoeff_q, ::testing::Values(0.3),
+                                                                                    ::testing::Values(PmeSolveAlgorithm::LennardJones)));
+
+//! A few more instances to check that different epsilon_r actually affects results of all solvers
+INSTANTIATE_TEST_CASE_P(DifferentEpsilonR, PmeSolveTest, ::testing::Combine(c_inputBoxes, c_inputGridSizes, c_inputGrids,
+                                                                            testing::Values(1.9), c_inputEwaldCoeff_q, c_inputEwaldCoeff_lj,
+                                                                            c_inputMethods));
+
+}
+}
+}
index 4adbdebca0c8397afc4c9a8164e950f51266b7a6..c751ef1ebfb59815f55737735b3a9e99d41dea18 100644 (file)
@@ -125,7 +125,7 @@ class PmeSplineAndSpreadTest : public ::testing::TestWithParam<SplineAndSpreadIn
 
                     /* Running the test */
 
-                    PmeSafePointer pmeSafe = pmeInitWithAtoms(&inputRec, coordinates, charges, box);
+                    PmeSafePointer pmeSafe = pmeInitAtoms(&inputRec, coordinates, charges, box);
 
                     const bool     computeSplines = (option.first == PmeSplineAndSpreadOptions::SplineOnly) || (option.first == PmeSplineAndSpreadOptions::SplineAndSpreadUnified);
                     const bool     spreadCharges  = (option.first == PmeSplineAndSpreadOptions::SpreadOnly) || (option.first == PmeSplineAndSpreadOptions::SplineAndSpreadUnified);
index 74493f869b966efe74779b0849bacbefd29e4e00..475b84412f37fe3bf2c24237b3ff988a787c8096 100644 (file)
@@ -49,6 +49,7 @@
 #include "gromacs/ewald/pme-gather.h"
 #include "gromacs/ewald/pme-grid.h"
 #include "gromacs/ewald/pme-internal.h"
+#include "gromacs/ewald/pme-solve.h"
 #include "gromacs/ewald/pme-spread.h"
 #include "gromacs/fft/parallel_3dfft.h"
 #include "gromacs/math/invertmatrix.h"
@@ -63,50 +64,59 @@ namespace test
 {
 
 //! PME initialization - internal
-static PmeSafePointer pmeInitInternal(const t_inputrec *inputRec, size_t atomCount)
+static PmeSafePointer pmeInitInternal(const t_inputrec         *inputRec,
+                                      size_t                    atomCount,
+                                      const Matrix3x3          &box,
+                                      real                      ewaldCoeff_q = 1.0f,
+                                      real                      ewaldCoeff_lj = 1.0f
+                                      )
 {
     gmx_pme_t *pmeDataRaw = nullptr;
     gmx_pme_init(&pmeDataRaw, nullptr, 1, 1, inputRec,
-                 atomCount, false, false, true, 0.0, 0.0, 1);
+                 atomCount, false, false, true, ewaldCoeff_q, ewaldCoeff_lj, 1);
     PmeSafePointer pme(pmeDataRaw); // taking ownership
+
+    // TODO get rid of this with proper matrix type
+    matrix boxTemp;
+    for (int i = 0; i < DIM; i++)
+    {
+        for (int j = 0; j < DIM; j++)
+        {
+            boxTemp[i][j] = box[i * DIM + j];
+        }
+    }
+    const char *boxError = check_box(-1, boxTemp);
+    GMX_RELEASE_ASSERT(boxError == nullptr, boxError);
+    invertBoxMatrix(boxTemp, pme->recipbox);
+
     return pme;
 }
 
 //! Simple PME initialization based on input, no atom data
-PmeSafePointer pmeInitEmpty(const t_inputrec *inputRec)
+PmeSafePointer pmeInitEmpty(const t_inputrec         *inputRec,
+                            const Matrix3x3          &box,
+                            real                      ewaldCoeff_q,
+                            real                      ewaldCoeff_lj
+                            )
 {
-    return pmeInitInternal(inputRec, 0);
+    return pmeInitInternal(inputRec, 0, box, ewaldCoeff_q, ewaldCoeff_lj);
     // hiding the fact that PME actually needs to know the number of atoms in advance
 }
 
-//! PME initialization with atom data and system box
-PmeSafePointer pmeInitWithAtoms(const t_inputrec        *inputRec,
-                                const CoordinatesVector &coordinates,
-                                const ChargesVector     &charges,
-                                const Matrix3x3          box
-                                )
+//! PME initialization with atom data
+PmeSafePointer pmeInitAtoms(const t_inputrec         *inputRec,
+                            const CoordinatesVector  &coordinates,
+                            const ChargesVector      &charges,
+                            const Matrix3x3          &box
+                            )
 {
     const size_t    atomCount = coordinates.size();
     GMX_RELEASE_ASSERT(atomCount == charges.size(), "Mismatch in atom data");
-    PmeSafePointer  pmeSafe = pmeInitInternal(inputRec, atomCount);
+    PmeSafePointer  pmeSafe = pmeInitInternal(inputRec, atomCount, box);
     pme_atomcomm_t *atc     = &(pmeSafe->atc[0]);
     atc->x           = const_cast<rvec *>(as_rvec_array(coordinates.data()));
     atc->coefficient = const_cast<real *>(charges.data());
     /* With decomposition there would be more boilerplate atc code here, e.g. do_redist_pos_coeffs */
-
-    // TODO get rid of this with proper matrix type
-    matrix boxTemp;
-    for (int i = 0; i < DIM; i++)
-    {
-        for (int j = 0; j < DIM; j++)
-        {
-            boxTemp[i][j] = box[i * DIM + j];
-        }
-    }
-    const char *boxError = check_box(-1, boxTemp);
-    GMX_RELEASE_ASSERT(boxError == nullptr, boxError);
-    invertBoxMatrix(boxTemp, pmeSafe->recipbox);
-
     return pmeSafe;
 }
 
@@ -127,6 +137,44 @@ static void pmeGetRealGridSizesInternal(const gmx_pme_t      *pme,
     gmx_parallel_3dfft_real_limits(pme->pfft_setup[gridIndex], gridSize, gridOffsetUnused, paddedGridSize);
 }
 
+//! Getting local PME complex grid pointer for test I/O
+static t_complex *pmeGetComplexGridInternal(const gmx_pme_t *pme)
+{
+    const size_t gridIndex = 0;
+    return pme->cfftgrid[gridIndex];
+}
+
+//! Getting local PME complex grid dimensions
+static void pmeGetComplexGridSizesInternal(const gmx_pme_t      *pme,
+                                           IVec                 &gridSize,
+                                           IVec                 &paddedGridSize)
+{
+    const size_t gridIndex = 0;
+    IVec         gridOffsetUnused, complexOrderUnused;
+    gmx_parallel_3dfft_complex_limits(pme->pfft_setup[gridIndex], complexOrderUnused, gridSize, gridOffsetUnused, paddedGridSize); //TODO: what about YZX ordering?
+}
+
+//! Getting the PME grid memory buffer and its sizes - template definition
+template<typename ValueType> static void pmeGetGridAndSizesInternal(const gmx_pme_t *, ValueType * &, IVec &, IVec &)
+{
+    GMX_THROW(InternalError("Deleted function call"));
+    // explicitly deleting general template does not compile in clang/icc, see https://llvm.org/bugs/show_bug.cgi?id=17537
+}
+
+//! Getting the PME real grid memory buffer and its sizes
+template<> void pmeGetGridAndSizesInternal<real>(const gmx_pme_t *pme, real * &grid, IVec &gridSize, IVec &paddedGridSize)
+{
+    grid = pmeGetRealGridInternal(pme);
+    pmeGetRealGridSizesInternal(pme, gridSize, paddedGridSize);
+}
+
+//! Getting the PME complex grid memory buffer and its sizes
+template<> void pmeGetGridAndSizesInternal<t_complex>(const gmx_pme_t *pme, t_complex * &grid, IVec &gridSize, IVec &paddedGridSize)
+{
+    grid = pmeGetComplexGridInternal(pme);
+    pmeGetComplexGridSizesInternal(pme, gridSize, paddedGridSize);
+}
+
 //! PME spline calculation and charge spreading
 void pmePerformSplineAndSpread(gmx_pme_t *pme, CodePath mode, // TODO const qualifiers
                                bool computeSplines, bool spreadCharges)
@@ -157,7 +205,7 @@ void pmePerformSplineAndSpread(gmx_pme_t *pme, CodePath mode, // TODO const qual
 //! Getting the internal spline data buffer pointer
 static real *pmeGetSplineDataInternal(const gmx_pme_t *pme, PmeSplineDataType type, int dimIndex)
 {
-    GMX_RELEASE_ASSERT((0 <= dimIndex) && (dimIndex < DIM), "Invalid dimension index");
+    GMX_ASSERT((0 <= dimIndex) && (dimIndex < DIM), "Invalid dimension index");
     const pme_atomcomm_t *atc          = &(pme->atc[0]);
     const size_t          threadIndex  = 0;
     real                 *splineBuffer = nullptr;
@@ -177,13 +225,50 @@ static real *pmeGetSplineDataInternal(const gmx_pme_t *pme, PmeSplineDataType ty
     return splineBuffer;
 }
 
+//! PME solving
+void pmePerformSolve(const gmx_pme_t *pme, CodePath mode,
+                     PmeSolveAlgorithm method, real cellVolume,
+                     GridOrdering gridOrdering, bool computeEnergyAndVirial)
+{
+    t_complex      *h_grid                 = pmeGetComplexGridInternal(pme);
+    const bool      useLorentzBerthelot    = false;
+    const size_t    threadIndex            = 0;
+    switch (mode)
+    {
+        case CodePath::CPU:
+            if (gridOrdering != GridOrdering::YZX)
+            {
+                GMX_THROW(InternalError("Test not implemented for this mode"));
+            }
+            switch (method)
+            {
+                case PmeSolveAlgorithm::Coulomb:
+                    solve_pme_yzx(pme, h_grid, cellVolume,
+                                  computeEnergyAndVirial, pme->nthread, threadIndex);
+                    break;
+
+                case PmeSolveAlgorithm::LennardJones:
+                    solve_pme_lj_yzx(pme, &h_grid, useLorentzBerthelot,
+                                     cellVolume, computeEnergyAndVirial, pme->nthread, threadIndex);
+                    break;
+
+                default:
+                    GMX_THROW(InternalError("Test not implemented for this mode"));
+            }
+            break;
+
+        default:
+            GMX_THROW(InternalError("Test not implemented for this mode"));
+    }
+}
+
 //! PME force gathering
 void pmePerformGather(gmx_pme_t *pme, CodePath mode,
                       PmeGatherInputHandling inputTreatment, ForcesVector &forces)
 {
     pme_atomcomm_t *atc                     = &(pme->atc[0]);
     const size_t    atomCount               = atc->n;
-    GMX_RELEASE_ASSERT(forces.size() == atomCount, "Bad force buffer size");
+    GMX_RELEASE_ASSERT(forces.size() == atomCount, "Invalid force buffer size");
     const bool      forceReductionWithInput = (inputTreatment == PmeGatherInputHandling::ReduceWith);
     const real      scale                   = 1.0;
     const size_t    threadIndex             = 0;
@@ -262,25 +347,47 @@ void pmeSetGridLineIndices(const gmx_pme_t *pme, CodePath mode,
     }
 }
 
-//! Setting real grid to be used in gather
-void pmeSetRealGrid(const gmx_pme_t                 *pme,
-                    CodePath                         mode,
-                    const SparseRealGridValuesInput &gridValues)
+//! Getting plain index into the complex 3d grid
+inline size_t pmeGetGridPlainIndexInternal(const IVec &index, const IVec &paddedGridSize, GridOrdering gridOrdering)
 {
-    real *grid = pmeGetRealGridInternal(pme);
-    IVec  gridSize, paddedGridSize;
-    pmeGetRealGridSizesInternal(pme, gridSize, paddedGridSize);
+    size_t result;
+    switch (gridOrdering)
+    {
+        case GridOrdering::YZX:
+            result = (index[YY] * paddedGridSize[ZZ] + index[ZZ]) * paddedGridSize[XX] + index[XX];
+            break;
+
+        case GridOrdering::XYZ:
+            result = (index[XX] * paddedGridSize[YY] + index[YY]) * paddedGridSize[ZZ] + index[ZZ];
+            break;
+
+        default:
+            GMX_THROW(InternalError("Test not implemented for this mode"));
+    }
+    return result;
+}
+
+//! Setting real or complex grid
+template<typename ValueType>
+static void pmeSetGridInternal(const gmx_pme_t *pme, CodePath mode,
+                               GridOrdering gridOrdering,
+                               const SparseGridValuesInput<ValueType> &gridValues)
+{
+    IVec       gridSize, paddedGridSize;
+    ValueType *grid;
+    pmeGetGridAndSizesInternal<ValueType>(pme, grid, gridSize, paddedGridSize);
+
     switch (mode)
     {
         case CodePath::CPU:
-            std::memset(grid, 0, paddedGridSize[XX] * paddedGridSize[YY] * paddedGridSize[ZZ] * sizeof(real));
+            std::memset(grid, 0, paddedGridSize[XX] * paddedGridSize[YY] * paddedGridSize[ZZ] * sizeof(ValueType));
             for (const auto &gridValue : gridValues)
             {
                 for (int i = 0; i < DIM; i++)
                 {
                     GMX_RELEASE_ASSERT((0 <= gridValue.first[i]) && (gridValue.first[i] < gridSize[i]), "Invalid grid value index");
                 }
-                const size_t gridValueIndex = (gridValue.first[XX] * paddedGridSize[YY] + gridValue.first[YY]) * paddedGridSize[ZZ] + gridValue.first[ZZ];
+                const size_t gridValueIndex = pmeGetGridPlainIndexInternal(gridValue.first, paddedGridSize, gridOrdering);
                 grid[gridValueIndex] = gridValue.second;
             }
             break;
@@ -290,6 +397,21 @@ void pmeSetRealGrid(const gmx_pme_t                 *pme,
     }
 }
 
+//! Setting real grid to be used in gather
+void pmeSetRealGrid(const gmx_pme_t *pme, CodePath mode,
+                    const SparseRealGridValuesInput &gridValues)
+{
+    pmeSetGridInternal<real>(pme, mode, GridOrdering::XYZ, gridValues);
+}
+
+//! Setting complex grid to be used in solve
+void pmeSetComplexGrid(const gmx_pme_t *pme, CodePath mode,
+                       GridOrdering gridOrdering,
+                       const SparseComplexGridValuesInput &gridValues)
+{
+    pmeSetGridInternal<t_complex>(pme, mode, gridOrdering, gridValues);
+}
+
 //! Getting the single dimension's spline values or derivatives
 SplineParamsDimVector pmeGetSplineData(const gmx_pme_t *pme, CodePath mode,
                                        PmeSplineDataType type, int dimIndex)
@@ -334,31 +456,28 @@ GridLineIndicesVector pmeGetGridlineIndices(const gmx_pme_t *pme, CodePath mode)
     return gridLineIndices;
 }
 
-//! Getting the real grid (spreading output of PmePerformSplineAndSpread())
-SparseRealGridValuesOutput pmeGetRealGrid(const gmx_pme_t *pme, CodePath mode)
+//! Getting real or complex grid - only non zero values
+template<typename ValueType>
+static SparseGridValuesOutput<ValueType> pmeGetGridInternal(const gmx_pme_t *pme, CodePath mode, GridOrdering gridOrdering)
 {
-    GMX_RELEASE_ASSERT(pme != nullptr, "PME data is not initialized");
-
-    SparseRealGridValuesOutput gridValues;
-    IVec                       gridSize, paddedGridSize;
-
-    real                      *grid = pmeGetRealGridInternal(pme);
-    pmeGetRealGridSizesInternal(pme, gridSize, paddedGridSize);
-
+    IVec       gridSize, paddedGridSize;
+    ValueType *grid;
+    pmeGetGridAndSizesInternal<ValueType>(pme, grid, gridSize, paddedGridSize);
+    SparseGridValuesOutput<ValueType> gridValues;
     switch (mode)
     {
         case CodePath::CPU:
             gridValues.clear();
-
             for (int ix = 0; ix < gridSize[XX]; ix++)
             {
                 for (int iy = 0; iy < gridSize[YY]; iy++)
                 {
                     for (int iz = 0; iz < gridSize[ZZ]; iz++)
                     {
-                        const size_t gridValueIndex = (ix * paddedGridSize[YY] + iy) * paddedGridSize[ZZ] + iz;
-                        const real   value          = grid[gridValueIndex];
-                        if (value != 0.0)
+                        IVec            temp(ix, iy, iz);
+                        const size_t    gridValueIndex = pmeGetGridPlainIndexInternal(temp, paddedGridSize, gridOrdering);
+                        const ValueType value          = grid[gridValueIndex];
+                        if (value != ValueType {})
                         {
                             auto key = formatString("Cell %d %d %d", ix, iy, iz);
                             gridValues[key] = value;
@@ -374,5 +493,56 @@ SparseRealGridValuesOutput pmeGetRealGrid(const gmx_pme_t *pme, CodePath mode)
     return gridValues;
 }
 
+//! Getting the real grid (spreading output of pmePerformSplineAndSpread())
+SparseRealGridValuesOutput pmeGetRealGrid(const gmx_pme_t *pme, CodePath mode)
+{
+    return pmeGetGridInternal<real>(pme, mode, GridOrdering::XYZ);
+}
+
+//! Getting the complex grid output of pmePerformSolve()
+SparseComplexGridValuesOutput pmeGetComplexGrid(const gmx_pme_t *pme, CodePath mode,
+                                                GridOrdering gridOrdering)
+{
+    return pmeGetGridInternal<t_complex>(pme, mode, gridOrdering);
+}
+
+//! Getting the reciprocal energy and virial
+PmeSolveOutput pmeGetReciprocalEnergyAndVirial(const gmx_pme_t *pme, CodePath mode,
+                                               PmeSolveAlgorithm method)
+{
+    real      energy = 0.0f;
+    Matrix3x3 virial;
+    matrix    virialTemp; //TODO get rid of
+    switch (mode)
+    {
+        case CodePath::CPU:
+            switch (method)
+            {
+                case PmeSolveAlgorithm::Coulomb:
+                    get_pme_ener_vir_q(pme->solve_work, pme->nthread, &energy, virialTemp);
+                    break;
+
+                case PmeSolveAlgorithm::LennardJones:
+                    get_pme_ener_vir_lj(pme->solve_work, pme->nthread, &energy, virialTemp);
+                    break;
+
+                default:
+                    GMX_THROW(InternalError("Test not implemented for this mode"));
+            }
+            break;
+
+        default:
+            GMX_THROW(InternalError("Test not implemented for this mode"));
+    }
+    for (int i = 0; i < DIM; i++)
+    {
+        for (int j = 0; j < DIM; j++)
+        {
+            virial[i * DIM + j] = virialTemp[i][j];
+        }
+    }
+    return std::make_tuple(energy, virial);
+}
+
 }
 }
index 55b38f53b64ba647d99ee7cff8ca3808f6ef14fa..e3bd8e810aed97273c92cae8171f02f7a3372e8b 100644 (file)
@@ -47,6 +47,7 @@
 #include <vector>
 
 #include "gromacs/ewald/pme.h"
+#include "gromacs/math/gmxcomplex.h"
 #include "gromacs/utility/arrayref.h"
 #include "gromacs/utility/unique_cptr.h"
 
@@ -72,7 +73,7 @@ typedef ConstArrayRef<IVec> GridLineIndicesVector;
 enum class PmeSplineDataType
 {
     Values,      // theta
-    Derivatives, //dtheta
+    Derivatives, // dtheta
 };
 /*! \brief Spline parameters (theta or dtheta).
  * A reference to a single dimension's spline data; this means (atomCount * pmeOrder) values or derivatives.
@@ -86,11 +87,14 @@ typedef std::array<SplineParamsDimVector, DIM> SplineParamsVector;
 template<typename ValueType>using SparseGridValuesInput = std::map<IVec, ValueType>;
 //! Non-zero real grid values
 typedef SparseGridValuesInput<real> SparseRealGridValuesInput;
+//! Non-zero complex grid values
+typedef SparseGridValuesInput<t_complex> SparseComplexGridValuesInput;
 //! Non-zero grid values for test output; keys are string representations of the cells' 3d indices (IVec); this allows for better sorting.
 template<typename ValueType>using SparseGridValuesOutput = std::map<std::string, ValueType>;
 //! Non-zero real grid values
 typedef SparseGridValuesOutput<real> SparseRealGridValuesOutput;
-
+//! Non-zero complex grid values
+typedef SparseGridValuesOutput<t_complex> SparseComplexGridValuesOutput;
 //! TODO: make proper C++ matrix for the whole Gromacs, get rid of this
 typedef std::array<real, DIM * DIM> Matrix3x3;
 //! PME code path being tested
@@ -104,20 +108,40 @@ enum class PmeGatherInputHandling
     Overwrite,
     ReduceWith,
 };
+//! PME solver type
+enum class PmeSolveAlgorithm
+{
+    Coulomb,
+    LennardJones,
+};
+//! PME grid dimension ordering (from major to minor)
+enum class GridOrdering
+{
+    YZX,
+    XYZ
+};
+//! PME solver results - reciprocal energy and virial
+typedef std::tuple<real, Matrix3x3> PmeSolveOutput;
 
 // PME stages
 
-//! Simple PME initialization based on input, no atom data; only good for testing the initialization stage
-PmeSafePointer pmeInitEmpty(const t_inputrec *inputRec);
-//! PME initialization with atom data and system box
-PmeSafePointer pmeInitWithAtoms(const t_inputrec        *inputRec,
-                                const CoordinatesVector &coordinates,
-                                const ChargesVector     &charges,
-                                const Matrix3x3          box
-                                );
+//! Simple PME initialization (no atom data)
+PmeSafePointer pmeInitEmpty(const t_inputrec *inputRec,
+                            const Matrix3x3 &box = {{1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f}},
+                            real ewaldCoeff_q = 0.0f, real ewaldCoeff_lj = 0.0f);
+//! PME initialization with atom data and system box; lacks Ewald coefficients
+PmeSafePointer pmeInitAtoms(const t_inputrec         *inputRec,
+                            const CoordinatesVector  &coordinates,
+                            const ChargesVector      &charges,
+                            const Matrix3x3          &box
+                            );
 //! PME spline computation and charge spreading
 void pmePerformSplineAndSpread(gmx_pme_t *pme, CodePath mode,
                                bool computeSplines, bool spreadCharges);
+//! PME solving
+void pmePerformSolve(const gmx_pme_t *pme, CodePath mode,
+                     PmeSolveAlgorithm method, real cellVolume,
+                     GridOrdering gridOrdering, bool computeEnergyAndVirial);
 //! PME force gathering
 void pmePerformGather(gmx_pme_t *pme, CodePath mode,
                       PmeGatherInputHandling inputTreatment, ForcesVector &forces);
@@ -133,6 +157,8 @@ void pmeSetGridLineIndices(const gmx_pme_t *pme, CodePath mode,
 //! Setting real grid to be used in gather
 void pmeSetRealGrid(const gmx_pme_t *pme, CodePath mode,
                     const SparseRealGridValuesInput &gridValues);
+void pmeSetComplexGrid(const gmx_pme_t *pme, CodePath mode, GridOrdering gridOrdering,
+                       const SparseComplexGridValuesInput &gridValues);
 
 // PME state getters
 
@@ -141,9 +167,14 @@ SplineParamsDimVector pmeGetSplineData(const gmx_pme_t *pme, CodePath mode,
                                        PmeSplineDataType type, int dimIndex);
 //! Getting the gridline indices
 GridLineIndicesVector pmeGetGridlineIndices(const gmx_pme_t *pme, CodePath mode);
-//! Getting the real grid (spreading output of PmePerformSplineAndSpread())
+//! Getting the real grid (spreading output of pmePerformSplineAndSpread())
 SparseRealGridValuesOutput pmeGetRealGrid(const gmx_pme_t *pme, CodePath mode);
-
+//! Getting the complex grid output of pmePerformSolve()
+SparseComplexGridValuesOutput pmeGetComplexGrid(const gmx_pme_t *pme, CodePath mode,
+                                                GridOrdering gridOrdering);
+//! Getting the reciprocal energy and virial
+PmeSolveOutput pmeGetReciprocalEnergyAndVirial(const gmx_pme_t *pme, CodePath mode,
+                                               PmeSolveAlgorithm method);
 }
 }
 
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_0.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_0.xml
new file mode 100644 (file)
index 0000000..cf7ff86
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">0.018817131631578641</Real>
+    <Real Name="Cell 3 1 2 im">0.24775889296163411</Real>
+    <Real Name="Cell 3 5 7 re">-1.119109555041644e-18</Real>
+    <Real Name="Cell 3 5 7 im">1.8651825641876716e-24</Real>
+    <Real Name="Cell 6 2 4 re">0.00014622573978042473</Real>
+    <Real Name="Cell 6 2 4 im">1.1902095179213895e-05</Real>
+    <Real Name="Cell 7 0 0 re">-1.6418289569939666</Real>
+    <Real Name="Cell 7 0 0 im">-0.45971210012946007</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">4.18620154095722</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">5.2163287107129568</Real>
+    <Real Name="Cell 1 0">0.71788757122964064</Real>
+    <Real Name="Cell 1 1">-1.5300517107974831</Real>
+    <Real Name="Cell 2 0">2.4408178106438716</Real>
+    <Real Name="Cell 2 1">1.9143668566123748</Real>
+    <Real Name="Cell 2 2">4.4157467245717141</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_1.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_1.xml
new file mode 100644 (file)
index 0000000..038a0b3
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.040960646891504318</Real>
+    <Real Name="Cell 0 0 0 im">-0.078410378960130159</Real>
+    <Real Name="Cell 3 1 2 re">-1.3292554554983258e-14</Real>
+    <Real Name="Cell 3 1 2 im">-1.7501863013212537e-13</Real>
+    <Real Name="Cell 7 0 0 re">3.8478547590276771e-09</Real>
+    <Real Name="Cell 7 0 0 im">1.0773993141797484e-09</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.33435589928707093</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.16717786512572544</Real>
+    <Real Name="Cell 1 0">-3.2035473334097224e-12</Real>
+    <Real Name="Cell 1 1">0.16717794964102289</Real>
+    <Real Name="Cell 2 0">-1.0892061239107136e-11</Real>
+    <Real Name="Cell 2 1">-8.5427928890925915e-12</Real>
+    <Real Name="Cell 2 2">0.16717794961448998</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_10.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_10.xml
new file mode 100644 (file)
index 0000000..4611723
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">0.0073185487574843394</Real>
+    <Real Name="Cell 0 6 7 re">0.0017113607923287439</Real>
+    <Real Name="Cell 2 5 10 re">0.053679757843731919</Real>
+    <Real Name="Cell 2 5 10 im">0.15880261547309443</Real>
+    <Real Name="Cell 4 2 7 re">1.8806856946202906</Real>
+    <Real Name="Cell 4 2 7 im">-5.4671094864454624</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">246.45436864462314</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">192.88102601012326</Real>
+    <Real Name="Cell 1 0">271.42730351185259</Real>
+    <Real Name="Cell 1 1">115.25885143338239</Real>
+    <Real Name="Cell 2 0">183.08288439538768</Real>
+    <Real Name="Cell 2 1">159.24069411835538</Real>
+    <Real Name="Cell 2 2">-16.391759814440562</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_11.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_11.xml
new file mode 100644 (file)
index 0000000..e951fb5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">-4.178818756469648e-13</Real>
+    <Real Name="Cell 0 6 7 re">-1.0069137884249014e-27</Real>
+    <Real Name="Cell 2 5 10 re">-5.6094174367698197e-19</Real>
+    <Real Name="Cell 2 5 10 im">-1.6594526428986948e-18</Real>
+    <Real Name="Cell 4 2 7 re">-2.2152312932810136e-08</Real>
+    <Real Name="Cell 4 2 7 im">6.4396257454452892e-08</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-2.8806661919058218e-06</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-1.8705530331608101e-05</Real>
+    <Real Name="Cell 1 0">-1.7197688691957962e-05</Real>
+    <Real Name="Cell 1 1">-1.3240622263816033e-05</Real>
+    <Real Name="Cell 2 0">-1.1629584411980756e-05</Real>
+    <Real Name="Cell 2 1">-9.9276940353995703e-06</Real>
+    <Real Name="Cell 2 2">-5.2730666430580063e-06</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_12.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_12.xml
new file mode 100644 (file)
index 0000000..82f4457
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">0.52012107052982537</Real>
+    <Real Name="Cell 3 1 2 im">6.8482605725216255</Real>
+    <Real Name="Cell 3 5 7 re">-0.0036980789183935344</Real>
+    <Real Name="Cell 3 5 7 im">6.1634647729559887e-09</Real>
+    <Real Name="Cell 6 2 4 re">15.260222121080961</Real>
+    <Real Name="Cell 6 2 4 im">1.2421111113117829</Real>
+    <Real Name="Cell 7 0 0 re">-2.8812686235380811</Real>
+    <Real Name="Cell 7 0 0 im">-0.80675520085170338</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">520.6731680619182</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">171.22464074353465</Real>
+    <Real Name="Cell 1 0">-373.95782882517159</Real>
+    <Real Name="Cell 1 1">229.20286440584107</Real>
+    <Real Name="Cell 2 0">-313.85265632355726</Real>
+    <Real Name="Cell 2 1">356.06528628658498</Real>
+    <Real Name="Cell 2 2">10.654363487499289</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_13.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_13.xml
new file mode 100644 (file)
index 0000000..4a67884
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.0063639096934527042</Real>
+    <Real Name="Cell 0 0 0 im">-0.012182341066375335</Real>
+    <Real Name="Cell 3 1 2 re">-9.9228430546493259e-06</Real>
+    <Real Name="Cell 3 1 2 im">-0.00013065076327181465</Real>
+    <Real Name="Cell 3 5 7 re">2.5759085022798612e-11</Real>
+    <Real Name="Cell 3 5 7 im">-4.2931807737236158e-17</Real>
+    <Real Name="Cell 6 2 4 re">-1.3138496192640048e-06</Real>
+    <Real Name="Cell 6 2 4 im">-1.0694124880568754e-07</Real>
+    <Real Name="Cell 7 0 0 re">0.00057663643475955946</Real>
+    <Real Name="Cell 7 0 0 im">0.00016145819898305986</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.053802892914868977</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.020691662312509726</Real>
+    <Real Name="Cell 1 0">-0.0023237899154683532</Real>
+    <Real Name="Cell 1 1">0.02527149273778484</Real>
+    <Real Name="Cell 2 0">0.000600553079798094</Real>
+    <Real Name="Cell 2 1">-0.00016167607048479874</Real>
+    <Real Name="Cell 2 2">0.026646993387493604</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_14.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_14.xml
new file mode 100644 (file)
index 0000000..771ae35
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">0.069611755622628294</Real>
+    <Real Name="Cell 0 6 7 re">0.79383865861583514</Real>
+    <Real Name="Cell 2 5 10 re">0.88080833512750023</Real>
+    <Real Name="Cell 2 5 10 im">2.6057246337798414</Real>
+    <Real Name="Cell 4 2 7 re">19.096438888541929</Real>
+    <Real Name="Cell 4 2 7 im">-55.512902822367884</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">2517.0732535091583</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">1955.3066474629525</Real>
+    <Real Name="Cell 1 0">2721.0324266903935</Real>
+    <Real Name="Cell 1 1">1103.5308168016663</Real>
+    <Real Name="Cell 2 0">1875.3173351098101</Real>
+    <Real Name="Cell 2 1">1534.4704563076873</Real>
+    <Real Name="Cell 2 2">-113.42604196736495</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_15.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_15.xml
new file mode 100644 (file)
index 0000000..a295124
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">-7.0537221329547844e-09</Real>
+    <Real Name="Cell 0 6 7 re">-5.7463804790685012e-07</Real>
+    <Real Name="Cell 2 5 10 re">-4.1614840083045064e-11</Real>
+    <Real Name="Cell 2 5 10 im">-1.2311056743065747e-10</Real>
+    <Real Name="Cell 4 2 7 re">-2.2493407131842702e-07</Real>
+    <Real Name="Cell 4 2 7 im">6.5387810342123984e-07</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-3.1321432926615869e-05</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-0.00018890242348857845</Real>
+    <Real Name="Cell 1 0">-0.00017462064584253123</Real>
+    <Real Name="Cell 1 1">-0.00013613472585420061</Real>
+    <Real Name="Cell 2 0">-0.00011809371439078819</Real>
+    <Real Name="Cell 2 1">-9.3982474514113124e-05</Real>
+    <Real Name="Cell 2 2">-6.9661560924232365e-05</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_2.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_2.xml
new file mode 100644 (file)
index 0000000..b02a6c5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">0.012194838340975378</Real>
+    <Real Name="Cell 0 6 7 re">6.975795431873326e-17</Real>
+    <Real Name="Cell 2 5 10 re">1.5478395335267946e-29</Real>
+    <Real Name="Cell 2 5 10 im">4.5790252439711993e-29</Real>
+    <Real Name="Cell 4 2 7 re">5.7327906140725394e-14</Real>
+    <Real Name="Cell 4 2 7 im">-1.6665088717192258e-13</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">0.0018292258312883258</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-0.00091461291090054464</Real>
+    <Real Name="Cell 1 0">5.5807272795043997e-12</Real>
+    <Real Name="Cell 1 1">0.0071615797758995967</Real>
+    <Real Name="Cell 2 0">3.3205328244435521e-11</Real>
+    <Real Name="Cell 2 1">3.9061162844133993e-11</Real>
+    <Real Name="Cell 2 2">-0.00091461268319907444</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_3.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_3.xml
new file mode 100644 (file)
index 0000000..a16227f
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">-5.4292848213686879e-16</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-8.1439275556636247e-17</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">4.0719637778318123e-17</Real>
+    <Real Name="Cell 1 0">-2.215406351573413e-112</Real>
+    <Real Name="Cell 1 1">-2.3047772408403365e-15</Real>
+    <Real Name="Cell 2 0">-1.3181668161597632e-111</Real>
+    <Real Name="Cell 2 1">-1.5507844461013891e-111</Real>
+    <Real Name="Cell 2 2">4.0719637778318123e-17</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_4.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_4.xml
new file mode 100644 (file)
index 0000000..a471dff
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">0.058526893274896463</Real>
+    <Real Name="Cell 3 1 2 im">0.77060407346768123</Real>
+    <Real Name="Cell 3 5 7 re">-1.6754581199058096e-16</Real>
+    <Real Name="Cell 3 5 7 im">2.7924301585993392e-22</Real>
+    <Real Name="Cell 6 2 4 re">0.00075718908137880822</Real>
+    <Real Name="Cell 6 2 4 im">6.1631669832991787e-05</Real>
+    <Real Name="Cell 7 0 0 re">-27.942228597744055</Real>
+    <Real Name="Cell 7 0 0 im">-7.8238238741294062</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">43.811954836969655</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">24.403587715787729</Real>
+    <Real Name="Cell 1 0">2.2029901722547436</Real>
+    <Real Name="Cell 1 1">-20.146106627765938</Real>
+    <Real Name="Cell 2 0">7.4901667957596416</Real>
+    <Real Name="Cell 2 1">5.9835608562785838</Real>
+    <Real Name="Cell 2 2">-1.5618699365008126</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_5.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_5.xml
new file mode 100644 (file)
index 0000000..0c68446
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.040960646891504318</Real>
+    <Real Name="Cell 0 0 0 im">-0.078410378960130159</Real>
+    <Real Name="Cell 3 1 2 re">-4.1343810365053865e-14</Real>
+    <Real Name="Cell 3 1 2 im">-5.4436015474703515e-13</Real>
+    <Real Name="Cell 7 0 0 re">0.0073924880067034026</Real>
+    <Real Name="Cell 7 0 0 im">0.0020698966066268229</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.3443209679114585</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.15510734808993293</Real>
+    <Real Name="Cell 1 0">-9.9639879528132092e-12</Real>
+    <Real Name="Cell 1 1">0.17216048394791436</Real>
+    <Real Name="Cell 2 0">-3.3877559989804848e-11</Real>
+    <Real Name="Cell 2 1">-2.6570634540835225e-11</Real>
+    <Real Name="Cell 2 2">0.1721604838653891</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_6.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_6.xml
new file mode 100644 (file)
index 0000000..2dde2be
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">0.17992679246372756</Real>
+    <Real Name="Cell 0 6 7 re">3.1968338340529017e-14</Real>
+    <Real Name="Cell 2 5 10 re">1.4964328935770195e-27</Real>
+    <Real Name="Cell 2 5 10 im">4.4269472688716676e-27</Real>
+    <Real Name="Cell 4 2 7 re">5.8210622825280826e-13</Real>
+    <Real Name="Cell 4 2 7 im">-1.6921692400294715e-12</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">0.026989020017818024</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-0.013494509960742423</Real>
+    <Real Name="Cell 1 0">5.6666575255782654e-11</Real>
+    <Real Name="Cell 1 1">0.06534006396863376</Real>
+    <Real Name="Cell 2 0">3.3716613222916207e-10</Real>
+    <Real Name="Cell 2 1">3.9636410829671391e-10</Real>
+    <Real Name="Cell 2 2">-0.013494507645153258</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_7.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_7.xml
new file mode 100644 (file)
index 0000000..40708a3
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">-3.36295522544755e-10</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-5.0444330386190764e-11</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">2.5222165193095382e-11</Real>
+    <Real Name="Cell 1 0">-2.2495184669680253e-111</Real>
+    <Real Name="Cell 1 1">-8.0991543667196338e-10</Real>
+    <Real Name="Cell 2 0">-1.3384635253888647e-110</Real>
+    <Real Name="Cell 2 1">8.1762240348126863e-110</Real>
+    <Real Name="Cell 2 2">2.5222165193095382e-11</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_8.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_8.xml
new file mode 100644 (file)
index 0000000..e779a9f
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">0.16722545997013091</Real>
+    <Real Name="Cell 3 1 2 im">2.2018018286947507</Real>
+    <Real Name="Cell 3 5 7 re">-7.965262272963144e-05</Real>
+    <Real Name="Cell 3 5 7 im">1.3275436925529491e-10</Real>
+    <Real Name="Cell 6 2 4 re">1.8922041838381742</Real>
+    <Real Name="Cell 6 2 4 im">0.1540166206604045</Real>
+    <Real Name="Cell 7 0 0 re">-0.082605078044972122</Real>
+    <Real Name="Cell 7 0 0 im">-0.023129421458700488</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">74.938609442792128</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">131.28949617469087</Real>
+    <Real Name="Cell 1 0">95.826683673140366</Real>
+    <Real Name="Cell 1 1">17.066209311548512</Real>
+    <Real Name="Cell 2 0">0.28439471667197097</Real>
+    <Real Name="Cell 2 1">0.22350643167596149</Real>
+    <Real Name="Cell 2 2">-37.437308226605346</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_9.xml b/src/gromacs/ewald/tests/refdata/DifferentEpsilonR_PmeSolveTest_ReproducesOutputs_9.xml
new file mode 100644 (file)
index 0000000..1291a6b
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.0063639096934527042</Real>
+    <Real Name="Cell 0 0 0 im">-0.012182341066375335</Real>
+    <Real Name="Cell 3 1 2 re">-3.1903187316269281e-06</Real>
+    <Real Name="Cell 3 1 2 im">-4.2005862137679066e-05</Real>
+    <Real Name="Cell 3 5 7 re">7.4468604604379845e-21</Real>
+    <Real Name="Cell 3 5 7 im">-1.2411433917415391e-26</Real>
+    <Real Name="Cell 6 2 4 re">-1.1742988941980482e-10</Real>
+    <Real Name="Cell 6 2 4 im">-9.5582468781340022e-12</Real>
+    <Real Name="Cell 7 0 0 re">7.4608679756532561e-13</Real>
+    <Real Name="Cell 7 0 0 im">2.089042997606721e-13</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.052281447439372866</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.02472611767566462</Real>
+    <Real Name="Cell 1 0">-0.00080506035697563581</Real>
+    <Real Name="Cell 1 1">0.025682559278230224</Real>
+    <Real Name="Cell 2 0">-3.29941854498715e-06</Real>
+    <Real Name="Cell 2 1">-1.8777213593421415e-06</Real>
+    <Real Name="Cell 2 2">0.026140716022377927</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_0.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_0.xml
new file mode 100644 (file)
index 0000000..6cd911f
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.0032243074812554435</Real>
+    <Real Name="Cell 0 0 0 im">-0.0061722455741210361</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.026319560176871287</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.013159780088435644</Real>
+    <Real Name="Cell 1 0">-5.165174788189329e-61</Real>
+    <Real Name="Cell 1 1">0.013159780088435644</Real>
+    <Real Name="Cell 2 0">-1.7561594772433171e-60</Real>
+    <Real Name="Cell 2 1">-1.3773799435171546e-60</Real>
+    <Real Name="Cell 2 2">0.013159780088435644</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_1.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_1.xml
new file mode 100644 (file)
index 0000000..91e51c7
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid"></NonZeroGridValues>
+  <Real Name="Energy">-1.947673270478603e-72</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">9.7383663523930152e-73</Real>
+    <Real Name="Cell 1 0">0</Real>
+    <Real Name="Cell 1 1">-2.9656379577570034e-70</Real>
+    <Real Name="Cell 2 0">0</Real>
+    <Real Name="Cell 2 1">0</Real>
+    <Real Name="Cell 2 2">9.7383663523930152e-73</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_2.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_2.xml
new file mode 100644 (file)
index 0000000..390185c
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.0032243074812554435</Real>
+    <Real Name="Cell 0 0 0 im">-0.0061722455741210361</Real>
+    <Real Name="Cell 7 0 0 re">7.6130413375662804e-07</Real>
+    <Real Name="Cell 7 0 0 im">2.1316515382167483e-07</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.02632058641484105</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.013152471049737076</Real>
+    <Real Name="Cell 1 0">-1.6065234568866201e-60</Real>
+    <Real Name="Cell 1 1">0.013160293207420525</Real>
+    <Real Name="Cell 2 0">-5.4621799066245241e-60</Real>
+    <Real Name="Cell 2 1">-4.2840625516976533e-60</Real>
+    <Real Name="Cell 2 2">0.013160293207420525</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_3.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_3.xml
new file mode 100644 (file)
index 0000000..f1b61dd
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid"></NonZeroGridValues>
+  <Real Name="Energy">-4.3985657072804985e-43</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">2.1992828536402492e-43</Real>
+    <Real Name="Cell 1 0">0</Real>
+    <Real Name="Cell 1 1">-3.7761403572058291e-41</Real>
+    <Real Name="Cell 2 0">0</Real>
+    <Real Name="Cell 2 1">0</Real>
+    <Real Name="Cell 2 2">2.1992828536402492e-43</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_4.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_4.xml
new file mode 100644 (file)
index 0000000..44c5d4f
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.00050094915954292444</Real>
+    <Real Name="Cell 0 0 0 im">-0.00095895979239689257</Real>
+    <Real Name="Cell 3 1 2 re">-2.1599352313386163e-17</Real>
+    <Real Name="Cell 3 1 2 im">-2.8439146425867423e-16</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.0040891762422784351</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.0020445881210921345</Real>
+    <Real Name="Cell 1 0">-2.6795203304867056e-14</Real>
+    <Real Name="Cell 1 1">0.0020445881211239685</Real>
+    <Real Name="Cell 2 0">-1.098163039749412e-16</Real>
+    <Real Name="Cell 2 1">-6.2497085016678689e-17</Real>
+    <Real Name="Cell 2 2">0.0020445881211392175</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_5.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_5.xml
new file mode 100644 (file)
index 0000000..ab98022
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 4 2 7 re">-2.4230251056816728e-36</Real>
+    <Real Name="Cell 4 2 7 im">7.0436775156320539e-36</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-3.1508792663404843e-34</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-1.1273079188143722e-32</Real>
+    <Real Name="Cell 1 0">-9.7578492587057644e-33</Real>
+    <Real Name="Cell 1 1">-8.1723275488460565e-33</Real>
+    <Real Name="Cell 2 0">-6.5985455177412012e-33</Real>
+    <Real Name="Cell 2 1">-5.6329048412902129e-33</Real>
+    <Real Name="Cell 2 2">-3.651592456698565e-33</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_6.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_6.xml
new file mode 100644 (file)
index 0000000..00531bb
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.00050094915954292444</Real>
+    <Real Name="Cell 0 0 0 im">-0.00095895979239689257</Real>
+    <Real Name="Cell 3 1 2 re">-6.7180429642686536e-17</Real>
+    <Real Name="Cell 3 1 2 im">-8.8454229915819465e-16</Real>
+    <Real Name="Cell 6 2 4 re">-4.0219318277835495e-30</Real>
+    <Real Name="Cell 6 2 4 im">-3.2736654634451577e-31</Real>
+    <Real Name="Cell 7 0 0 re">5.2771744681693101e-09</Real>
+    <Real Name="Cell 7 0 0 im">1.4776088259238779e-09</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.0040891833559143697</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.002044522620163693</Real>
+    <Real Name="Cell 1 0">-8.3341076355721297e-14</Real>
+    <Real Name="Cell 1 1">0.0020445916779097549</Real>
+    <Real Name="Cell 2 0">1.9811620023306347e-08</Real>
+    <Real Name="Cell 2 1">-1.9438457977681831e-16</Real>
+    <Real Name="Cell 2 2">0.0020445859942955147</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_7.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffLJ_PmeSolveTest_ReproducesOutputs_7.xml
new file mode 100644 (file)
index 0000000..fabd54d
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">-5.0080644372294188e-32</Real>
+    <Real Name="Cell 0 6 7 re">-1.0989740423361005e-25</Real>
+    <Real Name="Cell 4 2 7 re">-2.4603340679631761e-35</Real>
+    <Real Name="Cell 4 2 7 im">7.152133799530054e-35</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-3.9563065547185542e-25</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">1.9781521166964556e-25</Real>
+    <Real Name="Cell 1 0">-9.9080974872891094e-32</Real>
+    <Real Name="Cell 1 1">-2.4345081597770461e-24</Real>
+    <Real Name="Cell 2 0">-6.7001478021157686e-32</Real>
+    <Real Name="Cell 2 1">6.6239601982153926e-24</Real>
+    <Real Name="Cell 2 2">-1.6470674587189056e-23</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_0.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_0.xml
new file mode 100644 (file)
index 0000000..d430106
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">8.2210755780125459e-34</Real>
+    <Real Name="Cell 3 1 2 im">1.0824415878263353e-32</Real>
+    <Real Name="Cell 7 0 0 re">-5.3044697270927454e-20</Real>
+    <Real Name="Cell 7 0 0 im">-1.4852514982922861e-20</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">7.1504251744240444e-20</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">3.41272626726192e-18</Real>
+    <Real Name="Cell 1 0">5.9287266918327695e-31</Real>
+    <Real Name="Cell 1 1">-3.5752125871655224e-20</Real>
+    <Real Name="Cell 2 0">2.0157671317638854e-30</Real>
+    <Real Name="Cell 2 1">1.5809937844887388e-30</Real>
+    <Real Name="Cell 2 2">-3.5752125866744843e-20</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_1.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_1.xml
new file mode 100644 (file)
index 0000000..bcd6795
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">4.898432637853757e-38</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">7.3476492487499718e-39</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-3.6738246243749859e-39</Real>
+    <Real Name="Cell 1 0">0</Real>
+    <Real Name="Cell 1 1">6.3099551402707054e-37</Real>
+    <Real Name="Cell 2 0">0</Real>
+    <Real Name="Cell 2 1">0</Real>
+    <Real Name="Cell 2 2">-3.6738246243749859e-39</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_2.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_2.xml
new file mode 100644 (file)
index 0000000..95b20f5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">2.556999772227411e-33</Real>
+    <Real Name="Cell 3 1 2 im">3.3667162736272229e-32</Real>
+    <Real Name="Cell 7 0 0 re">-1.0926105068604317</Real>
+    <Real Name="Cell 7 0 0 im">-0.30593093671094795</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">1.4728389596008808</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">6.4146764633054083</Real>
+    <Real Name="Cell 1 0">1.84401087871763e-30</Real>
+    <Real Name="Cell 1 1">-0.73641947980044042</Real>
+    <Real Name="Cell 2 0">6.2696371634985231e-30</Real>
+    <Real Name="Cell 2 1">4.917362343247014e-30</Real>
+    <Real Name="Cell 2 2">-0.73641947980044042</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_3.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_3.xml
new file mode 100644 (file)
index 0000000..bbf414b
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">2.7045303395891825e-21</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">4.0567956705863441e-22</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-2.0283978352931721e-22</Real>
+    <Real Name="Cell 1 0">0</Real>
+    <Real Name="Cell 1 1">1.9685468212785548e-20</Real>
+    <Real Name="Cell 2 0">0</Real>
+    <Real Name="Cell 2 1">0</Real>
+    <Real Name="Cell 2 2">-2.0283978352931721e-22</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_4.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_4.xml
new file mode 100644 (file)
index 0000000..64665b1
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">1.4765194649429009e-07</Real>
+    <Real Name="Cell 3 1 2 im">1.9440839083925106e-06</Real>
+    <Real Name="Cell 6 2 4 re">2.8973305349725333e-25</Real>
+    <Real Name="Cell 6 2 4 im">2.3582923119190961e-26</Real>
+    <Real Name="Cell 7 0 0 re">-1.9143774765849531e-29</Real>
+    <Real Name="Cell 7 0 0 im">-5.3602568431532371e-30</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">1.5446854233119991e-05</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.00017895573959435024</Real>
+    <Real Name="Cell 1 0">0.00010624017864812442</Real>
+    <Real Name="Cell 1 1">5.2738464577355206e-05</Real>
+    <Real Name="Cell 2 0">4.3541015979734419e-07</Real>
+    <Real Name="Cell 2 1">2.4779440564845181e-07</Real>
+    <Real Name="Cell 2 2">-7.7224115666698012e-06</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_5.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_5.xml
new file mode 100644 (file)
index 0000000..b52d391
--- /dev/null
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">8.4622953690730811e-28</Real>
+    <Real Name="Cell 4 2 7 re">1.4391546043716599e-17</Real>
+    <Real Name="Cell 4 2 7 im">-4.1835888966074777e-17</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">1.8714632354986221e-15</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">3.7666982290146189e-14</Real>
+    <Real Name="Cell 1 0">3.2953537029348404e-14</Real>
+    <Real Name="Cell 1 1">2.7195337232381974e-14</Real>
+    <Real Name="Cell 2 0">2.2284153843094576e-14</Real>
+    <Real Name="Cell 2 1">1.9023058601221014e-14</Real>
+    <Real Name="Cell 2 2">1.1928221773909695e-14</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_6.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_6.xml
new file mode 100644 (file)
index 0000000..1d95a12
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">4.5924160406040909e-07</Real>
+    <Real Name="Cell 3 1 2 im">6.0466809528496931e-06</Real>
+    <Real Name="Cell 3 5 7 re">-4.7703059370503073e-21</Real>
+    <Real Name="Cell 3 5 7 im">7.9505097776562864e-27</Real>
+    <Real Name="Cell 6 2 4 re">1.0063968348774453e-13</Real>
+    <Real Name="Cell 6 2 4 im">8.1916021999667744e-15</Real>
+    <Real Name="Cell 7 0 0 re">-0.024375179191018694</Real>
+    <Real Name="Cell 7 0 0 im">-0.0068250500572553229</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">0.032905785796259142</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.17994239387577421</Real>
+    <Real Name="Cell 1 0">0.00033043861081358196</Real>
+    <Real Name="Cell 1 1">-0.016264838330712152</Real>
+    <Real Name="Cell 2 0">-0.056174983204850239</Real>
+    <Real Name="Cell 2 1">7.7074954253368213e-07</Real>
+    <Real Name="Cell 2 2">-0.00033672708354701251</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_7.xml b/src/gromacs/ewald/tests/refdata/DifferentEwaldCoeffQ_PmeSolveTest_ReproducesOutputs_7.xml
new file mode 100644 (file)
index 0000000..9ae05dd
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">7.9977633138124044e-16</Real>
+    <Real Name="Cell 0 6 7 re">7.6137551246740057e-12</Real>
+    <Real Name="Cell 2 5 10 re">5.378627596651949e-26</Real>
+    <Real Name="Cell 2 5 10 im">1.5911773158340167e-25</Real>
+    <Real Name="Cell 4 2 7 re">1.4613142447013661e-16</Real>
+    <Real Name="Cell 4 2 7 im">-4.2480064546339484e-16</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">2.7428640483431204e-11</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-1.3322349180734567e-11</Real>
+    <Real Name="Cell 1 0">3.3460945005926606e-13</Real>
+    <Real Name="Cell 1 1">9.089404609722578e-11</Real>
+    <Real Name="Cell 2 0">2.262727808888106e-13</Real>
+    <Real Name="Cell 2 1">-2.6231426231809359e-10</Real>
+    <Real Name="Cell 2 2">6.4698667840508995e-10</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_0.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_0.xml
new file mode 100644 (file)
index 0000000..8c74152
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">0.029793791749999521</Real>
+    <Real Name="Cell 3 1 2 im">0.39228491385592074</Real>
+    <Real Name="Cell 3 5 7 re">-1.7719234621492696e-18</Real>
+    <Real Name="Cell 3 5 7 im">2.9532057266304802e-24</Real>
+    <Real Name="Cell 6 2 4 re">0.00023152408798567255</Real>
+    <Real Name="Cell 6 2 4 im">1.8844984033755337e-05</Real>
+    <Real Name="Cell 7 0 0 re">-2.5995625152404473</Real>
+    <Real Name="Cell 7 0 0 im">-0.72787749187164519</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">6.6281524398489351</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">8.2591871252955169</Real>
+    <Real Name="Cell 1 0">1.1366553211135979</Real>
+    <Real Name="Cell 1 1">-2.4225818754293491</Real>
+    <Real Name="Cell 2 0">3.8646282001861314</Real>
+    <Real Name="Cell 2 1">3.0310808563029275</Real>
+    <Real Name="Cell 2 2">6.9915989805718821</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_1.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_1.xml
new file mode 100644 (file)
index 0000000..038a0b3
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.040960646891504318</Real>
+    <Real Name="Cell 0 0 0 im">-0.078410378960130159</Real>
+    <Real Name="Cell 3 1 2 re">-1.3292554554983258e-14</Real>
+    <Real Name="Cell 3 1 2 im">-1.7501863013212537e-13</Real>
+    <Real Name="Cell 7 0 0 re">3.8478547590276771e-09</Real>
+    <Real Name="Cell 7 0 0 im">1.0773993141797484e-09</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.33435589928707093</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.16717786512572544</Real>
+    <Real Name="Cell 1 0">-3.2035473334097224e-12</Real>
+    <Real Name="Cell 1 1">0.16717794964102289</Real>
+    <Real Name="Cell 2 0">-1.0892061239107136e-11</Real>
+    <Real Name="Cell 2 1">-8.5427928890925915e-12</Real>
+    <Real Name="Cell 2 2">0.16717794961448998</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_10.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_10.xml
new file mode 100644 (file)
index 0000000..2c822fb
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">0.011587702199350205</Real>
+    <Real Name="Cell 0 6 7 re">0.0027096545878538447</Real>
+    <Real Name="Cell 2 5 10 re">0.084992949919242208</Real>
+    <Real Name="Cell 2 5 10 im">0.25143747449906617</Real>
+    <Real Name="Cell 4 2 7 re">2.9777523498154599</Real>
+    <Real Name="Cell 4 2 7 im">-8.6562566868719806</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">390.21941702065322</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">305.39495784936184</Real>
+    <Real Name="Cell 1 0">429.75989722709977</Real>
+    <Real Name="Cell 1 1">182.49318143618873</Real>
+    <Real Name="Cell 2 0">289.88123362603045</Real>
+    <Real Name="Cell 2 1">252.13109902072929</Real>
+    <Real Name="Cell 2 2">-25.953619706197543</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_11.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_11.xml
new file mode 100644 (file)
index 0000000..e951fb5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">-4.178818756469648e-13</Real>
+    <Real Name="Cell 0 6 7 re">-1.0069137884249014e-27</Real>
+    <Real Name="Cell 2 5 10 re">-5.6094174367698197e-19</Real>
+    <Real Name="Cell 2 5 10 im">-1.6594526428986948e-18</Real>
+    <Real Name="Cell 4 2 7 re">-2.2152312932810136e-08</Real>
+    <Real Name="Cell 4 2 7 im">6.4396257454452892e-08</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-2.8806661919058218e-06</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-1.8705530331608101e-05</Real>
+    <Real Name="Cell 1 0">-1.7197688691957962e-05</Real>
+    <Real Name="Cell 1 1">-1.3240622263816033e-05</Real>
+    <Real Name="Cell 2 0">-1.1629584411980756e-05</Real>
+    <Real Name="Cell 2 1">-9.9276940353995703e-06</Real>
+    <Real Name="Cell 2 2">-5.2730666430580063e-06</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_12.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_12.xml
new file mode 100644 (file)
index 0000000..5bc243a
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">0.8235250283388903</Real>
+    <Real Name="Cell 3 1 2 im">10.84307923982591</Real>
+    <Real Name="Cell 3 5 7 re">-0.0058552916207897637</Real>
+    <Real Name="Cell 3 5 7 im">9.7588192238469836e-09</Real>
+    <Real Name="Cell 6 2 4 re">24.162018358378187</Real>
+    <Real Name="Cell 6 2 4 im">1.9666759262436562</Real>
+    <Real Name="Cell 7 0 0 re">-4.5620086539352958</Real>
+    <Real Name="Cell 7 0 0 im">-1.2773624013485305</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">824.39918276470382</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">271.10568117726308</Real>
+    <Real Name="Cell 1 0">-592.09989563985494</Real>
+    <Real Name="Cell 1 1">362.90453530924833</Real>
+    <Real Name="Cell 2 0">-496.93337251229889</Real>
+    <Real Name="Cell 2 1">563.77003662042625</Real>
+    <Real Name="Cell 2 2">16.869408855207137</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_13.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_13.xml
new file mode 100644 (file)
index 0000000..4a67884
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.0063639096934527042</Real>
+    <Real Name="Cell 0 0 0 im">-0.012182341066375335</Real>
+    <Real Name="Cell 3 1 2 re">-9.9228430546493259e-06</Real>
+    <Real Name="Cell 3 1 2 im">-0.00013065076327181465</Real>
+    <Real Name="Cell 3 5 7 re">2.5759085022798612e-11</Real>
+    <Real Name="Cell 3 5 7 im">-4.2931807737236158e-17</Real>
+    <Real Name="Cell 6 2 4 re">-1.3138496192640048e-06</Real>
+    <Real Name="Cell 6 2 4 im">-1.0694124880568754e-07</Real>
+    <Real Name="Cell 7 0 0 re">0.00057663643475955946</Real>
+    <Real Name="Cell 7 0 0 im">0.00016145819898305986</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.053802892914868977</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.020691662312509726</Real>
+    <Real Name="Cell 1 0">-0.0023237899154683532</Real>
+    <Real Name="Cell 1 1">0.02527149273778484</Real>
+    <Real Name="Cell 2 0">0.000600553079798094</Real>
+    <Real Name="Cell 2 1">-0.00016167607048479874</Real>
+    <Real Name="Cell 2 2">0.026646993387493604</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_14.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_14.xml
new file mode 100644 (file)
index 0000000..3ad5450
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">0.11021861306916146</Real>
+    <Real Name="Cell 0 6 7 re">1.2569112094750723</Real>
+    <Real Name="Cell 2 5 10 re">1.3946131972852089</Real>
+    <Real Name="Cell 2 5 10 im">4.125730670151416</Real>
+    <Real Name="Cell 4 2 7 re">30.236028240191384</Real>
+    <Real Name="Cell 4 2 7 im">-87.895429468749143</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">3985.3659847228328</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">3095.9021918163417</Real>
+    <Real Name="Cell 1 0">4308.3013422597896</Real>
+    <Real Name="Cell 1 1">1747.2571266026378</Real>
+    <Real Name="Cell 2 0">2969.2524472571986</Real>
+    <Real Name="Cell 2 1">2429.5782224871705</Real>
+    <Real Name="Cell 2 2">-179.5912331149944</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_15.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_15.xml
new file mode 100644 (file)
index 0000000..a295124
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">-7.0537221329547844e-09</Real>
+    <Real Name="Cell 0 6 7 re">-5.7463804790685012e-07</Real>
+    <Real Name="Cell 2 5 10 re">-4.1614840083045064e-11</Real>
+    <Real Name="Cell 2 5 10 im">-1.2311056743065747e-10</Real>
+    <Real Name="Cell 4 2 7 re">-2.2493407131842702e-07</Real>
+    <Real Name="Cell 4 2 7 im">6.5387810342123984e-07</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-3.1321432926615869e-05</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-0.00018890242348857845</Real>
+    <Real Name="Cell 1 0">-0.00017462064584253123</Real>
+    <Real Name="Cell 1 1">-0.00013613472585420061</Real>
+    <Real Name="Cell 2 0">-0.00011809371439078819</Real>
+    <Real Name="Cell 2 1">-9.3982474514113124e-05</Real>
+    <Real Name="Cell 2 2">-6.9661560924232365e-05</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_2.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_2.xml
new file mode 100644 (file)
index 0000000..0ddc9d4
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">0.01930849403987768</Real>
+    <Real Name="Cell 0 6 7 re">1.1045009433799435e-16</Real>
+    <Real Name="Cell 2 5 10 re">2.4507459280840924e-29</Real>
+    <Real Name="Cell 2 5 10 im">7.2501233029544003e-29</Real>
+    <Real Name="Cell 4 2 7 re">9.076918472281522e-14</Real>
+    <Real Name="Cell 4 2 7 im">-2.6386390468887747e-13</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">0.0028962742328731829</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-0.0014481371089258624</Real>
+    <Real Name="Cell 1 0">8.8361515258819677e-12</Real>
+    <Real Name="Cell 1 1">0.011339167978507696</Real>
+    <Real Name="Cell 2 0">5.257510305368959e-11</Real>
+    <Real Name="Cell 2 1">6.1846841169878849e-11</Real>
+    <Real Name="Cell 2 2">-0.0014481367483985346</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_3.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_3.xml
new file mode 100644 (file)
index 0000000..a16227f
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">-5.4292848213686879e-16</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-8.1439275556636247e-17</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">4.0719637778318123e-17</Real>
+    <Real Name="Cell 1 0">-2.215406351573413e-112</Real>
+    <Real Name="Cell 1 1">-2.3047772408403365e-15</Real>
+    <Real Name="Cell 2 0">-1.3181668161597632e-111</Real>
+    <Real Name="Cell 2 1">-1.5507844461013891e-111</Real>
+    <Real Name="Cell 2 2">4.0719637778318123e-17</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_4.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_4.xml
new file mode 100644 (file)
index 0000000..0001f72
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">0.092667581018586076</Real>
+    <Real Name="Cell 3 1 2 im">1.2201231163238289</Real>
+    <Real Name="Cell 3 5 7 re">-2.6528086898508655e-16</Real>
+    <Real Name="Cell 3 5 7 im">4.4213477511156205e-22</Real>
+    <Real Name="Cell 6 2 4 re">0.0011988827121831131</Real>
+    <Real Name="Cell 6 2 4 im">9.7583477235570334e-05</Real>
+    <Real Name="Cell 7 0 0 re">-44.241861946428088</Real>
+    <Real Name="Cell 7 0 0 im">-12.387721134038228</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">69.36892849186863</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">38.63901388333057</Real>
+    <Real Name="Cell 1 0">3.4880677727366778</Real>
+    <Real Name="Cell 1 1">-31.8980021606294</Real>
+    <Real Name="Cell 2 0">11.859430759952769</Real>
+    <Real Name="Cell 2 1">9.4739713557744256</Real>
+    <Real Name="Cell 2 2">-2.4729607327929468</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_5.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_5.xml
new file mode 100644 (file)
index 0000000..0c68446
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.040960646891504318</Real>
+    <Real Name="Cell 0 0 0 im">-0.078410378960130159</Real>
+    <Real Name="Cell 3 1 2 re">-4.1343810365053865e-14</Real>
+    <Real Name="Cell 3 1 2 im">-5.4436015474703515e-13</Real>
+    <Real Name="Cell 7 0 0 re">0.0073924880067034026</Real>
+    <Real Name="Cell 7 0 0 im">0.0020698966066268229</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.3443209679114585</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.15510734808993293</Real>
+    <Real Name="Cell 1 0">-9.9639879528132092e-12</Real>
+    <Real Name="Cell 1 1">0.17216048394791436</Real>
+    <Real Name="Cell 2 0">-3.3877559989804848e-11</Real>
+    <Real Name="Cell 2 1">-2.6570634540835225e-11</Real>
+    <Real Name="Cell 2 2">0.1721604838653891</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_6.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_6.xml
new file mode 100644 (file)
index 0000000..a482ad5
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">0.28488408806756871</Real>
+    <Real Name="Cell 0 6 7 re">5.061653570583762e-14</Real>
+    <Real Name="Cell 2 5 10 re">2.3693520814969476e-27</Real>
+    <Real Name="Cell 2 5 10 im">7.0093331757134742e-27</Real>
+    <Real Name="Cell 4 2 7 re">9.2166819473361329e-13</Real>
+    <Real Name="Cell 4 2 7 im">-2.6792679633799972e-12</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">0.042732615028211886</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">-0.021366307437842177</Real>
+    <Real Name="Cell 1 0">8.9722077488322564e-11</Real>
+    <Real Name="Cell 1 1">0.10345510128367014</Real>
+    <Real Name="Cell 2 0">5.3384637602950688e-10</Real>
+    <Real Name="Cell 2 1">6.2757650480313056e-10</Real>
+    <Real Name="Cell 2 2">-0.021366303771492665</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_7.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_7.xml
new file mode 100644 (file)
index 0000000..40708a3
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 4 0 im">-3.36295522544755e-10</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-5.0444330386190764e-11</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">2.5222165193095382e-11</Real>
+    <Real Name="Cell 1 0">-2.2495184669680253e-111</Real>
+    <Real Name="Cell 1 1">-8.0991543667196338e-10</Real>
+    <Real Name="Cell 2 0">-1.3384635253888647e-110</Real>
+    <Real Name="Cell 2 1">8.1762240348126863e-110</Real>
+    <Real Name="Cell 2 2">2.5222165193095382e-11</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_8.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_8.xml
new file mode 100644 (file)
index 0000000..c24261d
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">3.5</Real>
+    <Real Name="Cell 0 0 0 im">6.6999998092651367</Real>
+    <Real Name="Cell 3 1 2 re">0.26477364495270733</Real>
+    <Real Name="Cell 3 1 2 im">3.4861862287666896</Real>
+    <Real Name="Cell 3 5 7 re">-0.00012611665265524979</Real>
+    <Real Name="Cell 3 5 7 im">2.1019441798755029e-10</Real>
+    <Real Name="Cell 6 2 4 re">2.9959899577437761</Real>
+    <Real Name="Cell 6 2 4 im">0.24385964937897381</Real>
+    <Real Name="Cell 7 0 0 re">-0.13079137357120588</Real>
+    <Real Name="Cell 7 0 0 im">-0.036621583976275775</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">118.65279828442088</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">207.87503560992724</Real>
+    <Real Name="Cell 1 0">151.72558248247225</Real>
+    <Real Name="Cell 1 1">27.021498076618471</Real>
+    <Real Name="Cell 2 0">0.45029163473062073</Real>
+    <Real Name="Cell 2 1">0.35388518348693898</Real>
+    <Real Name="Cell 2 2">-59.275738025458466</Real>
+  </Matrix>
+</ReferenceData>
diff --git a/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_9.xml b/src/gromacs/ewald/tests/refdata/SaneInput_PmeSolveTest_ReproducesOutputs_9.xml
new file mode 100644 (file)
index 0000000..1291a6b
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <NonZeroGridValues Name="ComplexSpaceGrid">
+    <Real Name="Cell 0 0 0 re">-0.0063639096934527042</Real>
+    <Real Name="Cell 0 0 0 im">-0.012182341066375335</Real>
+    <Real Name="Cell 3 1 2 re">-3.1903187316269281e-06</Real>
+    <Real Name="Cell 3 1 2 im">-4.2005862137679066e-05</Real>
+    <Real Name="Cell 3 5 7 re">7.4468604604379845e-21</Real>
+    <Real Name="Cell 3 5 7 im">-1.2411433917415391e-26</Real>
+    <Real Name="Cell 6 2 4 re">-1.1742988941980482e-10</Real>
+    <Real Name="Cell 6 2 4 im">-9.5582468781340022e-12</Real>
+    <Real Name="Cell 7 0 0 re">7.4608679756532561e-13</Real>
+    <Real Name="Cell 7 0 0 im">2.089042997606721e-13</Real>
+  </NonZeroGridValues>
+  <Real Name="Energy">-0.052281447439372866</Real>
+  <Matrix Name="Virial">
+    <Real Name="Cell 0 0">0.02472611767566462</Real>
+    <Real Name="Cell 1 0">-0.00080506035697563581</Real>
+    <Real Name="Cell 1 1">0.025682559278230224</Real>
+    <Real Name="Cell 2 0">-3.29941854498715e-06</Real>
+    <Real Name="Cell 2 1">-1.8777213593421415e-06</Real>
+    <Real Name="Cell 2 2">0.026140716022377927</Real>
+  </Matrix>
+</ReferenceData>
index 8fa0c8ad6a8570b0fc45cfcbac2d6aa201908e8f..bffd94fe870b68ace130918d9e346fbab1f2d687 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2012,2014, by the GROMACS development team, led by
+ * Copyright (c) 2012,2014,2017, 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.
@@ -117,8 +117,6 @@ static real cabs2(t_complex c)
     return abs2;
 }
 
-
-
 static t_complex cdiv(t_complex teller, t_complex noemer)
 {
     t_complex res, anoemer;
@@ -128,4 +126,8 @@ static t_complex cdiv(t_complex teller, t_complex noemer)
 
     return rcmul(1.0/anoemer.re, res);
 }
+
+inline bool operator==(const t_complex &lhs, const t_complex &rhs){ return (lhs.re == rhs.re) && (lhs.im == rhs.im); }
+inline bool operator!=(const t_complex &lhs, const t_complex &rhs){ return !(lhs == rhs); }
+
 #endif