}
#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)
{
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 */
/*
* 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.
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);
(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);
--- /dev/null
+/*
+ * 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));
+
+}
+}
+}
/* 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);
#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"
{
//! 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;
}
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)
//! 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;
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;
}
}
-//! 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;
}
}
+//! 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)
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;
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);
+}
+
}
}
#include <vector>
#include "gromacs/ewald/pme.h"
+#include "gromacs/math/gmxcomplex.h"
#include "gromacs/utility/arrayref.h"
#include "gromacs/utility/unique_cptr.h"
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.
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
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);
//! 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
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);
}
}
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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>
*
* 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.
return abs2;
}
-
-
static t_complex cdiv(t_complex teller, t_complex noemer)
{
t_complex res, anoemer;
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