Add GPU 3D FFT tests
authorMark Abraham <mark.j.abraham@gmail.com>
Tue, 3 Aug 2021 13:42:42 +0000 (13:42 +0000)
committerMark Abraham <mark.j.abraham@gmail.com>
Tue, 3 Aug 2021 13:42:42 +0000 (13:42 +0000)
src/gromacs/fft/tests/CMakeLists.txt
src/gromacs/fft/tests/fft.cpp
src/gromacs/fft/tests/refdata/FFFTest3D_Real5_6_9.xml [deleted file]
src/gromacs/fft/tests/refdata/FFTTest3D_GpuReal5_6_9.xml [new file with mode: 0644]
src/gromacs/fft/tests/refdata/FFTTest3D_Real5_6_9.xml [new file with mode: 0644]

index 4a6e1dd848967c4c37003052cc8867eab4ad43a1..319a6ab7f371d037a109e651e7fdabfe62916bf9 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2012,2013,2020, by the GROMACS development team, led by
+# Copyright (c) 2012,2013,2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
@@ -32,7 +32,7 @@
 # To help us fund GROMACS development, we humbly ask that you cite
 # the research papers on the package. Check out http://www.gromacs.org.
 
-gmx_add_unit_test(FFTUnitTests fft-test
-    CPP_SOURCE_FILES
+gmx_add_unit_test(FFTUnitTests fft-test HARDWARE_DETECTION
+    GPU_CPP_SOURCE_FILES
         fft.cpp
     )
index 3ef73d4f3f7133bcd60264a2e64fe58fe16c7794..b743d3d1149280a975cb43e905771b8ecf43ea21 100644 (file)
 
 #include "gromacs/fft/fft.h"
 
+#include "config.h"
+
 #include <algorithm>
 #include <vector>
 
+#include <gmock/gmock.h>
 #include <gtest/gtest.h>
 
+#include "gromacs/fft/gpu_3dfft.h"
 #include "gromacs/fft/parallel_3dfft.h"
+#include "gromacs/gpu_utils/clfftinitializer.h"
+#if GMX_GPU
+#    include "gromacs/gpu_utils/devicebuffer.h"
+#endif
 #include "gromacs/utility/stringutil.h"
 
 #include "testutils/refdata.h"
+#include "testutils/test_hardware_environment.h"
 #include "testutils/testasserts.h"
+#include "testutils/testmatchers.h"
 
-namespace
+namespace gmx
+{
+namespace test
 {
 
 /*! \brief Input data for FFT tests.
@@ -109,25 +121,23 @@ const double inputdata[] = {
 class BaseFFTTest : public ::testing::Test
 {
 public:
-    BaseFFTTest() : checker_(data_.rootChecker()), flags_(GMX_FFT_FLAG_CONSERVATIVE)
-    {
-        // TODO: These tolerances are just something that has been observed
-        // to be sufficient to pass the tests.  It would be nicer to
-        // actually argue about why they are sufficient (or what is).
-        checker_.setDefaultTolerance(gmx::test::relativeToleranceAsPrecisionDependentUlp(10.0, 64, 512));
-    }
+    BaseFFTTest() : flags_(GMX_FFT_FLAG_CONSERVATIVE) {}
     ~BaseFFTTest() override { gmx_fft_cleanup(); }
 
-    gmx::test::TestReferenceData    data_;
-    gmx::test::TestReferenceChecker checker_;
-    std::vector<real>               in_, out_;
-    int                             flags_;
+    TestReferenceData data_;
+    std::vector<real> in_, out_;
+    int               flags_;
+    // TODO: These tolerances are just something that has been observed
+    // to be sufficient to pass the tests.  It would be nicer to
+    // actually argue about why they are sufficient (or what is).
+    // Should work for both one-way and forward+backward transform.
+    FloatingPointTolerance defaultTolerance_ = relativeToleranceAsPrecisionDependentUlp(10.0, 64, 512);
 };
 
 class FFTTest : public BaseFFTTest
 {
 public:
-    FFTTest() : fft_(nullptr) {}
+    FFTTest() : fft_(nullptr) { checker_.setDefaultTolerance(defaultTolerance_); }
     ~FFTTest() override
     {
         if (fft_)
@@ -135,13 +145,14 @@ public:
             gmx_fft_destroy(fft_);
         }
     }
-    gmx_fft_t fft_;
+    TestReferenceChecker checker_ = data_.rootChecker();
+    gmx_fft_t            fft_;
 };
 
 class ManyFFTTest : public BaseFFTTest
 {
 public:
-    ManyFFTTest() : fft_(nullptr) {}
+    ManyFFTTest() : fft_(nullptr) { checker_.setDefaultTolerance(defaultTolerance_); }
     ~ManyFFTTest() override
     {
         if (fft_)
@@ -149,7 +160,8 @@ public:
             gmx_many_fft_destroy(fft_);
         }
     }
-    gmx_fft_t fft_;
+    TestReferenceChecker checker_ = data_.rootChecker();
+    gmx_fft_t            fft_;
 };
 
 
@@ -159,11 +171,11 @@ class FFTTest1D : public FFTTest, public ::testing::WithParamInterface<int>
 {
 };
 
-class FFFTest3D : public BaseFFTTest
+class FFTTest3D : public BaseFFTTest
 {
 public:
-    FFFTest3D() : fft_(nullptr) {}
-    ~FFFTest3D() override
+    FFTTest3D() : fft_(nullptr) {}
+    ~FFTTest3D() override
     {
         if (fft_)
         {
@@ -276,44 +288,172 @@ TEST_F(FFTTest, Real2DLength18_15Test)
     //    _checker.checkSequenceArray(rx*ny, out, "backward");
 }
 
+namespace
+{
+
+/*! \brief Check that the real grid after forward and backward
+ * 3D transforms matches the input real grid. */
+void checkRealGrid(const ivec           realGridSize,
+                   const ivec           realGridSizePadded,
+                   ArrayRef<const real> inputRealGrid,
+                   ArrayRef<real>       outputRealGridValues)
+{
+    // Normalize the output (as the implementation does not
+    // normalize either FFT)
+    const real normalizationConstant = 1.0 / (realGridSize[XX] * realGridSize[YY] * realGridSize[ZZ]);
+    std::transform(outputRealGridValues.begin(),
+                   outputRealGridValues.end(),
+                   outputRealGridValues.begin(),
+                   [normalizationConstant](const real r) { return r * normalizationConstant; });
+    // Check the real grid, skipping unused data from the padding
+    const auto realGridTolerance = relativeToleranceAsFloatingPoint(10, 1e-6);
+    for (int i = 0; i < realGridSize[XX] * realGridSize[YY]; i++)
+    {
+        auto expected =
+                arrayRefFromArray(inputRealGrid.data() + i * realGridSizePadded[ZZ], realGridSize[ZZ]);
+        auto actual = arrayRefFromArray(outputRealGridValues.data() + i * realGridSizePadded[ZZ],
+                                        realGridSize[ZZ]);
+        EXPECT_THAT(actual, Pointwise(RealEq(realGridTolerance), expected))
+                << formatString("checking backward transform part %d", i);
+    }
+}
+
+} // namespace
+
 // TODO: test with threads and more than 1 MPI ranks
-TEST_F(FFFTest3D, Real5_6_9)
+TEST_F(FFTTest3D, Real5_6_9)
 {
-    int        ndata[] = { 5, 6, 9 };
-    MPI_Comm   comm[]  = { MPI_COMM_NULL, MPI_COMM_NULL };
+    int        realGridSize[] = { 5, 6, 9 };
+    MPI_Comm   comm[]         = { MPI_COMM_NULL, MPI_COMM_NULL };
     real*      rdata;
     t_complex* cdata;
-    ivec       local_ndata, offset, rsize, csize, complex_order;
+    ivec       local_ndata, offset, realGridSizePadded, complexGridSizePadded, complex_order;
+    TestReferenceChecker checker(data_.rootChecker());
+    checker.setDefaultTolerance(defaultTolerance_);
 
-    gmx_parallel_3dfft_init(&fft_, ndata, &rdata, &cdata, comm, TRUE, 1);
+    gmx_parallel_3dfft_init(&fft_, realGridSize, &rdata, &cdata, comm, TRUE, 1);
 
-    gmx_parallel_3dfft_real_limits(fft_, local_ndata, offset, rsize);
-    gmx_parallel_3dfft_complex_limits(fft_, complex_order, local_ndata, offset, csize);
-    checker_.checkVector(rsize, "rsize");
-    checker_.checkVector(csize, "csize");
-    int size        = csize[0] * csize[1] * csize[2];
+    gmx_parallel_3dfft_real_limits(fft_, local_ndata, offset, realGridSizePadded);
+    gmx_parallel_3dfft_complex_limits(fft_, complex_order, local_ndata, offset, complexGridSizePadded);
+    checker.checkVector(realGridSizePadded, "realGridSizePadded");
+    checker.checkVector(complexGridSizePadded, "complexGridSizePadded");
+    int size = complexGridSizePadded[0] * complexGridSizePadded[1] * complexGridSizePadded[2];
     int sizeInBytes = size * sizeof(t_complex);
     int sizeInReals = sizeInBytes / sizeof(real);
 
+    // Prepare the real grid
     in_ = std::vector<real>(sizeInReals);
     // Use std::copy to convert from double to real easily
     std::copy(inputdata, inputdata + sizeInReals, in_.begin());
     // Use memcpy to convert to t_complex easily
     memcpy(rdata, in_.data(), sizeInBytes);
+
+    // Do the forward FFT to compute the complex grid
     gmx_parallel_3dfft_execute(fft_, GMX_FFT_REAL_TO_COMPLEX, 0, nullptr);
-    // TODO use std::complex and add checkComplex for it
-    checker_.checkSequenceArray(size * 2, reinterpret_cast<real*>(cdata), "forward");
 
-    // Use std::copy to convert from double to real easily
-    std::copy(inputdata, inputdata + sizeInReals, in_.begin());
-    // Use memcpy to convert to t_complex easily
-    memcpy(cdata, in_.data(), sizeInBytes);
+    // Check the complex grid (NB this data has not been normalized)
+    ArrayRef<real> complexGridValues = arrayRefFromArray(reinterpret_cast<real*>(cdata), size * 2);
+    checker.checkSequence(
+            complexGridValues.begin(), complexGridValues.end(), "ComplexGridAfterRealToComplex");
+
+    // Do the back transform
     gmx_parallel_3dfft_execute(fft_, GMX_FFT_COMPLEX_TO_REAL, 0, nullptr);
-    for (int i = 0; i < ndata[0] * ndata[1]; i++) // check sequence but skip unused data
+
+    ArrayRef<real> outputRealGridValues = arrayRefFromArray(
+            rdata, realGridSizePadded[XX] * realGridSizePadded[YY] * realGridSizePadded[ZZ]);
+    checkRealGrid(realGridSize, realGridSizePadded, in_, outputRealGridValues);
+}
+
+#if GMX_GPU
+TEST_F(FFTTest3D, GpuReal5_6_9)
+{
+    // Ensure library resources are managed appropriately
+    ClfftInitializer clfftInitializer;
+    for (const auto& testDevice : getTestHardwareEnvironment()->getTestDeviceList())
     {
-        checker_.checkSequenceArray(
-                ndata[2], rdata + i * rsize[2], gmx::formatString("backward %d", i).c_str());
+        TestReferenceChecker checker(data_.rootChecker()); // Must be inside the loop to avoid warnings
+        checker.setDefaultTolerance(defaultTolerance_);
+
+        const DeviceContext& deviceContext = testDevice->deviceContext();
+        setActiveDevice(testDevice->deviceInfo());
+        const DeviceStream& deviceStream = testDevice->deviceStream();
+
+        ivec realGridSize       = { 5, 6, 9 };
+        ivec realGridSizePadded = { realGridSize[XX], realGridSize[YY], (realGridSize[ZZ] / 2 + 1) * 2 };
+        ivec complexGridSizePadded = { realGridSize[XX], realGridSize[YY], (realGridSize[ZZ] / 2) + 1 };
+
+        checker.checkVector(realGridSizePadded, "realGridSizePadded");
+        checker.checkVector(complexGridSizePadded, "complexGridSizePadded");
+
+        int size = complexGridSizePadded[0] * complexGridSizePadded[1] * complexGridSizePadded[2];
+        int sizeInReals = size * 2;
+
+        // Set up the complex grid. Complex numbers take twice the
+        // memory.
+        std::vector<float> complexGridValues(sizeInReals);
+        in_.resize(sizeInReals);
+        // Use std::copy to convert from double to real easily
+        std::copy(inputdata, inputdata + sizeInReals, in_.begin());
+
+        // Allocate the device buffers
+        DeviceBuffer<float> realGrid, complexGrid;
+        allocateDeviceBuffer(&realGrid, in_.size(), deviceContext);
+        allocateDeviceBuffer(&complexGrid, complexGridValues.size(), deviceContext);
+
+        const bool useDecomposition     = false;
+        const bool performOutOfPlaceFFT = true;
+        Gpu3dFft   gpu3dFft(realGridSize,
+                          realGridSizePadded,
+                          complexGridSizePadded,
+                          useDecomposition,
+                          performOutOfPlaceFFT,
+                          deviceContext,
+                          deviceStream,
+                          realGrid,
+                          complexGrid);
+
+        // Transfer the real grid input data for the FFT
+        copyToDeviceBuffer(
+                &realGrid, in_.data(), 0, in_.size(), deviceStream, GpuApiCallBehavior::Sync, nullptr);
+
+        // Do the forward FFT to compute the complex grid
+        CommandEvent* timingEvent = nullptr;
+        gpu3dFft.perform3dFft(GMX_FFT_REAL_TO_COMPLEX, timingEvent);
+        deviceStream.synchronize();
+
+        // Check the complex grid (NB this data has not been normalized)
+        copyFromDeviceBuffer(complexGridValues.data(),
+                             &complexGrid,
+                             0,
+                             complexGridValues.size(),
+                             deviceStream,
+                             GpuApiCallBehavior::Sync,
+                             nullptr);
+        checker.checkSequence(
+                complexGridValues.begin(), complexGridValues.end(), "ComplexGridAfterRealToComplex");
+
+        // Do the back transform
+        gpu3dFft.perform3dFft(GMX_FFT_COMPLEX_TO_REAL, timingEvent);
+        deviceStream.synchronize();
+
+        // Transfer the real grid back from the device
+        std::vector<float> outputRealGridValues(in_.size());
+        copyFromDeviceBuffer(outputRealGridValues.data(),
+                             &realGrid,
+                             0,
+                             outputRealGridValues.size(),
+                             deviceStream,
+                             GpuApiCallBehavior::Sync,
+                             nullptr);
+
+        checkRealGrid(realGridSize, realGridSizePadded, in_, outputRealGridValues);
+
+        freeDeviceBuffer(&realGrid);
+        freeDeviceBuffer(&complexGrid);
     }
 }
 
-} // namespace
+#endif
+
+} // namespace test
+} // namespace gmx
diff --git a/src/gromacs/fft/tests/refdata/FFFTest3D_Real5_6_9.xml b/src/gromacs/fft/tests/refdata/FFFTest3D_Real5_6_9.xml
deleted file mode 100644 (file)
index 63e1eb7..0000000
+++ /dev/null
@@ -1,677 +0,0 @@
-<?xml version="1.0"?>
-<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
-<ReferenceData>
-  <Vector Name="rsize">
-    <Int Name="X">5</Int>
-    <Int Name="Y">6</Int>
-    <Int Name="Z">10</Int>
-  </Vector>
-  <Vector Name="csize">
-    <Int Name="X">5</Int>
-    <Int Name="Y">6</Int>
-    <Int Name="Z">5</Int>
-  </Vector>
-  <Sequence Name="forward">
-    <Int Name="Length">300</Int>
-    <Real>136.09999999999999</Real>
-    <Real>0</Real>
-    <Real>6.1046777798672718</Real>
-    <Real>-9.6927915189833946</Real>
-    <Real>-156.90467777986728</Real>
-    <Real>-44.500278567324997</Real>
-    <Real>-156.90467777986728</Real>
-    <Real>44.500278567324997</Real>
-    <Real>6.1046777798672718</Real>
-    <Real>9.6927915189833946</Real>
-    <Real>109.33089836200787</Real>
-    <Real>144.0174147413677</Real>
-    <Real>110.98910420129505</Real>
-    <Real>-75.428066165741754</Real>
-    <Real>-28.957680459929328</Real>
-    <Real>-35.773394870359915</Real>
-    <Real>12.909729603318853</Real>
-    <Real>-51.326604840195436</Real>
-    <Real>-17.828427811489327</Real>
-    <Real>-51.168418460828008</Real>
-    <Real>80.282164734026082</Real>
-    <Real>-30.151275351195387</Real>
-    <Real>46.266467708046036</Real>
-    <Real>-2.5678489670789695</Real>
-    <Real>-79.201790713534407</Real>
-    <Real>-57.924296703634695</Real>
-    <Real>82.000686192249177</Real>
-    <Real>-94.147447732293045</Real>
-    <Real>79.405763443152921</Real>
-    <Real>-57.639099104105966</Real>
-    <Real>174.5</Real>
-    <Real>-82.099208278764806</Real>
-    <Real>-1.0211355262416717</Real>
-    <Real>-80.952112737709058</Real>
-    <Real>115.14489096295327</Real>
-    <Real>-67.412953751874596</Real>
-    <Real>65.004908445660504</Real>
-    <Real>16.143174029504717</Real>
-    <Real>-55.628663882372045</Real>
-    <Real>-81.859587355434371</Real>
-    <Real>-73.063063096033957</Real>
-    <Real>-35.171612785160626</Real>
-    <Real>22.705466420779317</Real>
-    <Real>46.342233241626971</Real>
-    <Real>-37.809610613745839</Real>
-    <Real>-14.488888242266853</Real>
-    <Real>-79.566298372895176</Real>
-    <Real>40.132587632371795</Real>
-    <Real>171.53659040275272</Real>
-    <Real>-43.288340582509605</Real>
-    <Real>-53.849999999999994</Real>
-    <Real>8.7468565782228325</Real>
-    <Real>-37.527983739057511</Real>
-    <Real>-76.662755634952219</Real>
-    <Real>-46.050013953391961</Real>
-    <Real>82.151413216948384</Real>
-    <Real>93.26075304045446</Real>
-    <Real>71.72939427904592</Real>
-    <Real>82.167244651995048</Real>
-    <Real>-68.64440036357621</Real>
-    <Real>34.447925708729784</Real>
-    <Real>-46.679698485304449</Real>
-    <Real>47.084315355518264</Real>
-    <Real>53.226361938057281</Real>
-    <Real>-39.940061988556401</Real>
-    <Real>-56.889712822841695</Real>
-    <Real>-54.133563551261311</Real>
-    <Real>162.86277437335812</Real>
-    <Real>0.13978000683655267</Real>
-    <Real>-83.154435988355104</Real>
-    <Real>77.450843683464598</Real>
-    <Real>99.232127419610549</Real>
-    <Real>25.603100973672902</Real>
-    <Real>-41.980268634661634</Real>
-    <Real>-63.660910025502318</Real>
-    <Real>0.38754591548317308</Real>
-    <Real>-14.140629179993443</Real>
-    <Real>-109.4766531704594</Real>
-    <Real>-1.8193728170681087</Real>
-    <Real>-50.783752164257926</Real>
-    <Real>-28.349999999999952</Real>
-    <Real>66.250943389509573</Real>
-    <Real>41.767316918315906</Real>
-    <Real>141.31781715474784</Real>
-    <Real>-98.532415917009445</Real>
-    <Real>-56.132356053022541</Real>
-    <Real>-26.039172227730639</Real>
-    <Real>-32.616671442082939</Real>
-    <Real>43.404271226424349</Real>
-    <Real>74.736944696670093</Real>
-    <Real>-75.394910708698106</Real>
-    <Real>-63.045733778267902</Real>
-    <Real>58.365744569582262</Real>
-    <Real>39.770614495173518</Real>
-    <Real>-89.180292566745976</Real>
-    <Real>-54.385841985238315</Real>
-    <Real>-23.894931563229392</Real>
-    <Real>99.576471973869459</Real>
-    <Real>1.8243953109653859</Real>
-    <Real>79.398509308323142</Real>
-    <Real>-93.249999999999986</Real>
-    <Real>-38.19172030689375</Real>
-    <Real>71.020497976742078</Real>
-    <Real>-1.7414685014859375</Real>
-    <Real>-45.144746631885752</Real>
-    <Real>136.91007840098462</Real>
-    <Real>76.807385747829073</Real>
-    <Real>-61.008015162243666</Real>
-    <Real>83.066862907314615</Real>
-    <Real>-10.854137720612538</Real>
-    <Real>11.146194900875926</Real>
-    <Real>-39.325905869819678</Real>
-    <Real>-44.096266736330733</Real>
-    <Real>-54.376841765161188</Real>
-    <Real>38.091494194864921</Real>
-    <Real>-10.091555063687309</Real>
-    <Real>28.417313488040552</Real>
-    <Real>104.61453969853031</Real>
-    <Real>-132.63257919812122</Real>
-    <Real>13.423985690353295</Real>
-    <Real>-89.798336147192956</Real>
-    <Real>-124.42587252332874</Real>
-    <Real>-177.69961189145357</Real>
-    <Real>-86.970199597566591</Real>
-    <Real>93.17963732706697</Real>
-    <Real>-17.907496809528595</Real>
-    <Real>21.200096591640985</Real>
-    <Real>-170.3504082897976</Real>
-    <Real>-56.000998352042203</Real>
-    <Real>-18.570020938666069</Real>
-    <Real>-41.500000000000043</Real>
-    <Real>70.148057706539575</Real>
-    <Real>92.677142033179237</Real>
-    <Real>12.237494316957232</Real>
-    <Real>63.749995048043708</Real>
-    <Real>-69.490209658536372</Real>
-    <Real>59.724306187452875</Real>
-    <Real>16.675397899553808</Real>
-    <Real>-41.651443268675777</Real>
-    <Real>8.5343775020010852</Real>
-    <Real>13.130336383741636</Real>
-    <Real>-22.927176864452179</Real>
-    <Real>116.12111228365779</Real>
-    <Real>-45.760745866170936</Real>
-    <Real>-29.881200055227058</Real>
-    <Real>24.907824000483362</Real>
-    <Real>-39.485004753366795</Real>
-    <Real>-8.2658722859128169</Real>
-    <Real>60.512645744111403</Real>
-    <Real>100.43935627235211</Real>
-    <Real>-12.299999999999983</Real>
-    <Real>-1.532107773982716e-14</Real>
-    <Real>-105.67236454974396</Real>
-    <Real>-26.742612718204111</Real>
-    <Real>23.572364549743824</Real>
-    <Real>-22.442318619165579</Real>
-    <Real>23.572364549743931</Real>
-    <Real>22.442318619165665</Real>
-    <Real>-105.67236454974388</Real>
-    <Real>26.74261271820416</Real>
-    <Real>42.035849450475915</Real>
-    <Real>-41.135575070858103</Real>
-    <Real>101.09538167141052</Real>
-    <Real>13.414183590793666</Real>
-    <Real>-72.121180894777268</Real>
-    <Real>-60.285029492264044</Real>
-    <Real>-4.2385225536985374</Real>
-    <Real>-12.733879099379028</Real>
-    <Real>-2.2031334820560886</Real>
-    <Real>-5.9043348756325251</Real>
-    <Real>80.964834850820381</Real>
-    <Real>-8.4039231702524511</Real>
-    <Real>-131.61904089627444</Real>
-    <Real>-28.451722994458656</Real>
-    <Real>-9.7116784144650872</Real>
-    <Real>-28.127997000734677</Real>
-    <Real>-10.749861458489509</Real>
-    <Real>-19.317475675829929</Real>
-    <Real>20.460493103348547</Real>
-    <Real>99.431367993784676</Real>
-    <Real>-3.3000000000000114</Real>
-    <Real>-11.085125168440795</Real>
-    <Real>-22.328371106147429</Real>
-    <Real>9.1879447293819183</Real>
-    <Real>-85.659284275876232</Real>
-    <Real>-7.1290511976147108</Real>
-    <Real>-68.632393167495465</Real>
-    <Real>-26.374469875305937</Real>
-    <Real>-61.079951450481019</Real>
-    <Real>-80.646702595135139</Real>
-    <Real>-53.250684301296275</Real>
-    <Real>-70.41197369012103</Real>
-    <Real>41.788374988548171</Real>
-    <Real>32.640898630438265</Real>
-    <Real>-34.654631341454106</Real>
-    <Real>137.86853343714677</Real>
-    <Real>22.242615745077465</Real>
-    <Real>81.318379495452149</Real>
-    <Real>-23.038816467169607</Real>
-    <Real>-59.640953773067203</Real>
-    <Real>-93.249999999999986</Real>
-    <Real>38.19172030689375</Real>
-    <Real>83.066862907314615</Real>
-    <Real>10.854137720612538</Real>
-    <Real>76.807385747829073</Real>
-    <Real>61.008015162243666</Real>
-    <Real>-45.144746631885752</Real>
-    <Real>-136.91007840098462</Real>
-    <Real>71.020497976742078</Real>
-    <Real>1.7414685014859375</Real>
-    <Real>-29.122549319509069</Real>
-    <Real>-55.548007164359561</Real>
-    <Real>-91.848515147247426</Real>
-    <Real>25.06854222882243</Real>
-    <Real>7.3660985224634778</Real>
-    <Real>-19.841635066202443</Real>
-    <Real>-54.161343304004404</Real>
-    <Real>32.336599137264542</Real>
-    <Real>48.259353160853109</Real>
-    <Real>-110.07063552157047</Real>
-    <Real>-25.626531284617432</Real>
-    <Real>-34.453667272791314</Real>
-    <Real>40.635846175667098</Real>
-    <Real>152.67975355881111</Real>
-    <Real>91.78484627866203</Real>
-    <Real>79.680065800736912</Real>
-    <Real>-91.796318858791864</Real>
-    <Real>60.323017825477706</Real>
-    <Real>-163.82188856316603</Real>
-    <Real>25.244915999312511</Real>
-    <Real>52.850000000000058</Real>
-    <Real>-2.3382685902179858</Real>
-    <Real>-19.91408137475327</Real>
-    <Real>-59.783730527586336</Real>
-    <Real>32.573560897852467</Real>
-    <Real>39.669307866057125</Real>
-    <Real>31.658633708141917</Real>
-    <Real>-44.218290841443348</Real>
-    <Real>-33.918113231241179</Real>
-    <Real>-63.665841176367557</Real>
-    <Real>-106.97911453329807</Real>
-    <Real>64.66325190459132</Real>
-    <Real>45.356186666025032</Real>
-    <Real>34.173035237197205</Real>
-    <Real>-39.799606476905076</Real>
-    <Real>-13.643005636820957</Real>
-    <Real>44.499372603779527</Real>
-    <Real>33.891599639990183</Real>
-    <Real>-140.20066970017646</Real>
-    <Real>-124.76439777461155</Real>
-    <Real>-53.850000000000009</Real>
-    <Real>-8.7468565782228183</Real>
-    <Real>82.167244651995205</Real>
-    <Real>68.644400363576096</Real>
-    <Real>93.260753040454404</Real>
-    <Real>-71.729394279046062</Real>
-    <Real>-46.050013953392131</Real>
-    <Real>-82.151413216948328</Real>
-    <Real>-37.527983739057447</Real>
-    <Real>76.662755634952305</Real>
-    <Real>-7.3610436092304763</Real>
-    <Real>-30.547454539791147</Real>
-    <Real>-18.733928727339173</Real>
-    <Real>-18.102923805155882</Real>
-    <Real>-62.82063554018734</Real>
-    <Real>30.062829944592039</Real>
-    <Real>25.151783100728036</Real>
-    <Real>-44.495797289735151</Real>
-    <Real>-26.734819466231169</Real>
-    <Real>62.413919808452206</Real>
-    <Real>-48.153015000031743</Real>
-    <Real>47.71798614443874</Real>
-    <Real>-22.179018783043063</Real>
-    <Real>5.6175083821953766</Real>
-    <Real>-9.6620741626321305</Real>
-    <Real>-2.8341625358714282</Real>
-    <Real>-79.862998875491655</Real>
-    <Real>28.256495771921998</Real>
-    <Real>53.788706248057551</Real>
-    <Real>-29.917919391540103</Real>
-    <Real>-3.3000000000000398</Real>
-    <Real>-72.572928837136018</Real>
-    <Real>-11.154757375936285</Real>
-    <Real>123.56158573276491</Real>
-    <Real>4.391989120832692</Real>
-    <Real>-61.96304685084263</Real>
-    <Real>-18.30723670508241</Real>
-    <Real>116.70643860522515</Real>
-    <Real>0.37000496018599804</Real>
-    <Real>-218.31535114198857</Real>
-    <Real>-38.139800074234053</Real>
-    <Real>-30.521720281097942</Real>
-    <Real>-107.60901341744089</Real>
-    <Real>-90.941870214929992</Real>
-    <Real>59.289174146567866</Real>
-    <Real>-85.926292155264207</Real>
-    <Real>-4.1465872345487398</Real>
-    <Real>162.12010447830716</Real>
-    <Real>102.1718381873422</Real>
-    <Real>60.231632931236987</Real>
-  </Sequence>
-  <Sequence Name="backward 0">
-    <Int Name="Length">9</Int>
-    <Real>98.799999999999997</Real>
-    <Real>-114.17356732757719</Real>
-    <Real>53.384075393173227</Real>
-    <Real>141.47199899409034</Real>
-    <Real>199.50902369698844</Real>
-    <Real>113.62515772012821</Real>
-    <Real>-240.27199899409035</Real>
-    <Real>7.0334226660655048</Real>
-    <Real>165.42188785122184</Real>
-  </Sequence>
-  <Sequence Name="backward 1">
-    <Int Name="Length">9</Int>
-    <Real>-1.5752990424915652</Real>
-    <Real>-2.9455394548274754</Real>
-    <Real>49.95592752379568</Real>
-    <Real>9.2464792224190404</Real>
-    <Real>-80.868528144019606</Real>
-    <Real>142.01990127005607</Real>
-    <Real>-145.11209026077205</Real>
-    <Real>-67.696439219454547</Real>
-    <Real>-220.99493351685803</Real>
-  </Sequence>
-  <Sequence Name="backward 2">
-    <Int Name="Length">9</Int>
-    <Real>-138.07787643056315</Real>
-    <Real>-95.826875135688994</Real>
-    <Real>73.996428626422301</Real>
-    <Real>107.42916512459894</Real>
-    <Real>-172.52346162732448</Real>
-    <Real>-184.75361826185093</Real>
-    <Real>-99.268395609140242</Real>
-    <Real>93.058202090688113</Real>
-    <Real>94.74898396157765</Real>
-  </Sequence>
-  <Sequence Name="backward 3">
-    <Int Name="Length">9</Int>
-    <Real>-235.80000000000004</Real>
-    <Real>81.949379543941745</Real>
-    <Real>10.473869144692348</Real>
-    <Real>184.41408311032413</Real>
-    <Real>-37.698123461634296</Real>
-    <Real>8.4715186995471896</Real>
-    <Real>42.385916889675968</Real>
-    <Real>0.26911387157102595</Real>
-    <Real>-81.465757798118148</Real>
-  </Sequence>
-  <Sequence Name="backward 4">
-    <Int Name="Length">9</Int>
-    <Real>-78.322123569436854</Real>
-    <Real>248.55977420749613</Real>
-    <Real>-35.552362712469616</Real>
-    <Real>-85.931604390859917</Real>
-    <Real>-61.809843162557783</Real>
-    <Real>-176.47551156447958</Real>
-    <Real>96.170834875401255</Real>
-    <Real>261.258274628913</Real>
-    <Real>-104.07999105072589</Real>
-  </Sequence>
-  <Sequence Name="backward 5">
-    <Int Name="Length">9</Int>
-    <Real>155.17529904249164</Real>
-    <Real>-98.054784036654695</Real>
-    <Real>104.7868879046318</Real>
-    <Real>38.312090260771917</Real>
-    <Real>-323.53345409503578</Real>
-    <Real>200.2760504100425</Real>
-    <Real>44.753520777580981</Real>
-    <Real>-91.192657145303485</Real>
-    <Real>55.247568503627704</Real>
-  </Sequence>
-  <Sequence Name="backward 6">
-    <Int Name="Length">9</Int>
-    <Real>15.303512203673439</Real>
-    <Real>305.8417773965229</Real>
-    <Real>149.63642319825721</Real>
-    <Real>97.994280036482849</Real>
-    <Real>-119.45564486257564</Real>
-    <Real>-131.61449725304536</Real>
-    <Real>-137.33825432710083</Real>
-    <Real>-143.59706871739439</Real>
-    <Real>-83.794037618517763</Real>
-  </Sequence>
-  <Sequence Name="backward 7">
-    <Int Name="Length">9</Int>
-    <Real>142.92194440900039</Real>
-    <Real>-106.94848208349096</Real>
-    <Real>-177.86913088170192</Real>
-    <Real>92.160865134863741</Real>
-    <Real>147.52064131879024</Real>
-    <Real>16.10773730651772</Real>
-    <Real>99.443083231115622</Real>
-    <Real>-117.64340089550609</Real>
-    <Real>31.791713066080177</Real>
-  </Sequence>
-  <Sequence Name="backward 8">
-    <Int Name="Length">9</Int>
-    <Real>70.535843012407312</Real>
-    <Real>-12.913960383936107</Real>
-    <Real>-71.002562801141949</Real>
-    <Real>-25.4614211584476</Real>
-    <Real>132.79474651115487</Real>
-    <Real>49.912000682648731</Real>
-    <Real>-18.915377312923233</Real>
-    <Real>-99.21579562065719</Real>
-    <Real>-93.41662759409158</Real>
-  </Sequence>
-  <Sequence Name="backward 9">
-    <Int Name="Length">9</Int>
-    <Real>-137.81219155290859</Real>
-    <Real>-270.52611638440578</Real>
-    <Real>-4.9177423672470262</Real>
-    <Real>-109.39818723263446</Real>
-    <Real>78.202512280834114</Real>
-    <Real>-56.368724642750863</Real>
-    <Real>41.836966344200128</Real>
-    <Real>-61.765709427318583</Real>
-    <Real>63.196234058815804</Real>
-  </Sequence>
-  <Sequence Name="backward 10">
-    <Int Name="Length">9</Int>
-    <Real>95.71803428988315</Real>
-    <Real>-146.68382720396653</Real>
-    <Real>121.75204137987734</Real>
-    <Real>-94.825717707153942</Real>
-    <Real>46.993640996205691</Real>
-    <Real>171.31526794671083</Real>
-    <Real>-95.826292103411461</Real>
-    <Real>-57.056817800871507</Real>
-    <Real>-0.19397483120351922</Real>
-  </Sequence>
-  <Sequence Name="backward 11">
-    <Int Name="Length">9</Int>
-    <Real>-66.714126302558228</Real>
-    <Real>-25.810599002217099</Real>
-    <Real>29.393924067872003</Real>
-    <Real>-151.37572573631348</Real>
-    <Real>7.8342439632777641</Real>
-    <Real>-94.377367003221309</Real>
-    <Real>-70.206125724087329</Real>
-    <Real>93.005166103691664</Real>
-    <Real>139.59644081347116</Real>
-  </Sequence>
-  <Sequence Name="backward 12">
-    <Int Name="Length">9</Int>
-    <Real>115.71963314444717</Real>
-    <Real>4.6312103100194264</Real>
-    <Real>114.15415792126656</Real>
-    <Real>37.107727028258068</Real>
-    <Real>50.143704822468365</Real>
-    <Real>-78.143218736964982</Real>
-    <Real>-203.63187718820055</Real>
-    <Real>224.71637955775333</Real>
-    <Real>156.08119214541438</Real>
-  </Sequence>
-  <Sequence Name="backward 13">
-    <Int Name="Length">9</Int>
-    <Real>4.9039043456949472</Real>
-    <Real>-94.431714276078111</Real>
-    <Real>-169.81582884793104</Real>
-    <Real>224.33382652559737</Real>
-    <Real>-107.83029995230413</Real>
-    <Real>30.179776667693119</Real>
-    <Real>-187.17508761498954</Real>
-    <Real>-133.83218721565669</Real>
-    <Real>-80.841981050451608</Real>
-  </Sequence>
-  <Sequence Name="backward 14">
-    <Int Name="Length">9</Int>
-    <Real>24.096997814169889</Real>
-    <Real>20.671627746028825</Real>
-    <Real>190.05899316235499</Real>
-    <Real>-44.652508355281228</Real>
-    <Real>-190.77298632613235</Real>
-    <Real>59.908926306609914</Real>
-    <Real>11.267766578037357</Real>
-    <Real>8.8392202928189789</Real>
-    <Real>-34.897733181241406</Real>
-  </Sequence>
-  <Sequence Name="backward 15">
-    <Int Name="Length">9</Int>
-    <Real>158.84687786413161</Real>
-    <Real>217.99492781212811</Real>
-    <Real>-138.82594738474563</Real>
-    <Real>-175.85858202022641</Real>
-    <Real>76.223652279684131</Real>
-    <Real>-42.485785703038268</Real>
-    <Real>77.096637856218706</Real>
-    <Real>153.11954350023521</Real>
-    <Real>34.678306060552622</Real>
-  </Sequence>
-  <Sequence Name="backward 16">
-    <Int Name="Length">9</Int>
-    <Real>371.39502526136897</Real>
-    <Real>-111.49279195570283</Real>
-    <Real>158.19081873733262</Real>
-    <Real>-58.925671119530691</Real>
-    <Real>-144.71988972800506</Real>
-    <Real>-333.32217656126909</Real>
-    <Real>99.971615267290659</Real>
-    <Real>-46.656629850947049</Real>
-    <Real>-26.605886688390541</Real>
-  </Sequence>
-  <Sequence Name="backward 17">
-    <Int Name="Length">9</Int>
-    <Real>71.148192038040435</Real>
-    <Real>-259.92390868152563</Real>
-    <Real>247.14795354500208</Real>
-    <Real>-74.934844862088667</Real>
-    <Real>-143.74464625132174</Real>
-    <Real>-90.704177181511653</Real>
-    <Real>40.167190056658185</Real>
-    <Real>-47.017923206913665</Real>
-    <Real>-61.723971656076479</Real>
-  </Sequence>
-  <Sequence Name="backward 18">
-    <Int Name="Length">9</Int>
-    <Real>311.41576839866417</Real>
-    <Real>-101.38744207132891</Real>
-    <Real>-65.574456247279457</Real>
-    <Real>198.43164083349166</Real>
-    <Real>-59.146570193629515</Real>
-    <Real>-211.97035720241863</Real>
-    <Real>65.043048483196671</Real>
-    <Real>374.99115856435526</Real>
-    <Real>77.087652023803656</Real>
-  </Sequence>
-  <Sequence Name="backward 19">
-    <Int Name="Length">9</Int>
-    <Real>46.436607452085013</Real>
-    <Real>-131.21786925466827</Real>
-    <Real>-106.86294041413136</Real>
-    <Real>-100.89493849076261</Real>
-    <Real>91.341349703918169</Real>
-    <Real>104.86826899066472</Real>
-    <Real>108.13578235939831</Real>
-    <Real>85.995586072325651</Real>
-    <Real>138.09948488445932</Real>
-  </Sequence>
-  <Sequence Name="backward 20">
-    <Int Name="Length">9</Int>
-    <Real>276.46765016460154</Real>
-    <Real>102.77535901877457</Real>
-    <Real>31.422378980505727</Real>
-    <Real>24.277083589916394</Real>
-    <Real>209.28910333980451</Real>
-    <Real>-83.071229481675232</Real>
-    <Real>-55.993796282865638</Real>
-    <Real>6.6343662980513045</Real>
-    <Real>-98.950954485113186</Real>
-  </Sequence>
-  <Sequence Name="backward 21">
-    <Int Name="Length">9</Int>
-    <Real>-144.9876322750122</Real>
-    <Real>116.62967038347652</Real>
-    <Real>100.52890254175037</Real>
-    <Real>-126.68456856175324</Real>
-    <Real>92.689569818525527</Real>
-    <Real>-95.47849048693503</Real>
-    <Real>112.27134446448976</Real>
-    <Real>48.48880612928285</Real>
-    <Real>-88.62648315644104</Real>
-  </Sequence>
-  <Sequence Name="backward 22">
-    <Int Name="Length">9</Int>
-    <Real>115.84696057532403</Real>
-    <Real>-233.43089737239819</Real>
-    <Real>-201.87341723455972</Real>
-    <Real>-170.12507625363628</Real>
-    <Real>-157.86760046735139</Real>
-    <Real>63.396270989245927</Real>
-    <Real>125.96015871207827</Real>
-    <Real>-31.44381153076408</Real>
-    <Real>-120.66509202543989</Real>
-  </Sequence>
-  <Sequence Name="backward 23">
-    <Int Name="Length">9</Int>
-    <Real>-38.792339959068002</Real>
-    <Real>-97.641243664242779</Real>
-    <Real>-298.20365770657571</Real>
-    <Real>32.913086466936676</Real>
-    <Real>234.08951270294585</Real>
-    <Real>-94.883245031360104</Real>
-    <Real>154.46039443373573</Real>
-    <Real>-274.26533090021292</Real>
-    <Real>138.11097003299557</Real>
-  </Sequence>
-  <Sequence Name="backward 24">
-    <Int Name="Length">9</Int>
-    <Real>122.2610862532153</Real>
-    <Real>-283.0427512466955</Real>
-    <Real>180.15241577538353</Real>
-    <Real>-9.9141066752170133</Real>
-    <Real>-68.225900518696875</Real>
-    <Real>-123.08567974377479</Real>
-    <Real>58.107541809089128</Real>
-    <Real>-150.73192370070763</Real>
-    <Real>97.533476397784881</Real>
-  </Sequence>
-  <Sequence Name="backward 25">
-    <Int Name="Length">9</Int>
-    <Real>-29.801893874037276</Real>
-    <Real>170.03622913088341</Real>
-    <Real>-10.118556706633502</Real>
-    <Real>-205.43915382732803</Real>
-    <Real>-272.59639172396476</Real>
-    <Real>8.7330959208887329</Real>
-    <Real>94.856369991786892</Real>
-    <Real>37.072909884061374</Real>
-    <Real>-43.885312638696632</Real>
-  </Sequence>
-  <Sequence Name="backward 26">
-    <Int Name="Length">9</Int>
-    <Real>-122.64627960454543</Real>
-    <Real>-218.25300495630358</Real>
-    <Real>-66.248934921215351</Real>
-    <Real>235.81218197593182</Real>
-    <Real>77.755741706503443</Real>
-    <Real>161.37957855282087</Real>
-    <Real>-117.81520662551542</Real>
-    <Real>24.181871661022953</Real>
-    <Real>125.04696383150052</Real>
-  </Sequence>
-  <Sequence Name="backward 27">
-    <Int Name="Length">9</Int>
-    <Real>30.252945963789017</Real>
-    <Real>-222.87322834137666</Real>
-    <Real>2.2397215783475062</Real>
-    <Real>-245.52203618184382</Real>
-    <Real>193.95778011433887</Real>
-    <Real>-126.31235607728593</Real>
-    <Real>-249.54157466845032</Real>
-    <Real>236.5707782492016</Real>
-    <Real>125.66017916437173</Real>
-  </Sequence>
-  <Sequence Name="backward 28">
-    <Int Name="Length">9</Int>
-    <Real>-8.0142315132093813</Real>
-    <Real>34.968683899269891</Real>
-    <Real>-150.81461809558681</Real>
-    <Real>61.533078723587487</Real>
-    <Real>-96.969594117006423</Real>
-    <Real>-39.411025671588746</Real>
-    <Real>173.31918207192354</Real>
-    <Real>-71.781263920425047</Real>
-    <Real>4.8455027677415465</Real>
-  </Sequence>
-  <Sequence Name="backward 29">
-    <Int Name="Length">9</Int>
-    <Real>92.297711890842834</Real>
-    <Real>240.88637294249287</Real>
-    <Real>10.566089284880015</Real>
-    <Real>-15.062663835846205</Real>
-    <Real>54.062522273351675</Real>
-    <Real>-59.442852705262901</Real>
-    <Real>49.417941891322926</Real>
-    <Real>-186.06049257608359</Real>
-    <Real>-118.7464771685228</Real>
-  </Sequence>
-</ReferenceData>
diff --git a/src/gromacs/fft/tests/refdata/FFTTest3D_GpuReal5_6_9.xml b/src/gromacs/fft/tests/refdata/FFTTest3D_GpuReal5_6_9.xml
new file mode 100644 (file)
index 0000000..816c531
--- /dev/null
@@ -0,0 +1,317 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Vector Name="realGridSizePadded">
+    <Int Name="X">5</Int>
+    <Int Name="Y">6</Int>
+    <Int Name="Z">10</Int>
+  </Vector>
+  <Vector Name="complexGridSizePadded">
+    <Int Name="X">5</Int>
+    <Int Name="Y">6</Int>
+    <Int Name="Z">5</Int>
+  </Vector>
+  <Sequence Name="ComplexGridAfterRealToComplex">
+    <Int Name="Length">300</Int>
+    <Real>136.09999</Real>
+    <Real>0</Real>
+    <Real>109.33089</Real>
+    <Real>144.01743</Real>
+    <Real>80.28215</Real>
+    <Real>-30.151276</Real>
+    <Real>174.5</Real>
+    <Real>-82.099213</Real>
+    <Real>-73.063065</Real>
+    <Real>-35.171608</Real>
+    <Real>-53.849991</Real>
+    <Real>8.7468605</Real>
+    <Real>34.447918</Real>
+    <Real>-46.679695</Real>
+    <Real>77.450844</Real>
+    <Real>99.232132</Real>
+    <Real>-28.349995</Real>
+    <Real>66.250931</Real>
+    <Real>-75.394905</Real>
+    <Real>-63.045742</Real>
+    <Real>-93.249992</Real>
+    <Real>-38.191727</Real>
+    <Real>11.146183</Real>
+    <Real>-39.325916</Real>
+    <Real>-89.79834</Real>
+    <Real>-124.42588</Real>
+    <Real>-41.5</Real>
+    <Real>70.148056</Real>
+    <Real>13.130341</Real>
+    <Real>-22.927174</Real>
+    <Real>-12.300018</Real>
+    <Real>0</Real>
+    <Real>42.035843</Real>
+    <Real>-41.135578</Real>
+    <Real>80.964828</Real>
+    <Real>-8.4039288</Real>
+    <Real>-3.2999973</Real>
+    <Real>-11.085131</Real>
+    <Real>-53.250679</Real>
+    <Real>-70.411972</Real>
+    <Real>-93.249992</Real>
+    <Real>38.191727</Real>
+    <Real>-29.122549</Real>
+    <Real>-55.548016</Real>
+    <Real>-25.626528</Real>
+    <Real>-34.453659</Real>
+    <Real>52.849998</Real>
+    <Real>-2.3382683</Real>
+    <Real>-106.97911</Real>
+    <Real>64.663254</Real>
+    <Real>-53.849991</Real>
+    <Real>-8.7468605</Real>
+    <Real>-7.3610411</Real>
+    <Real>-30.547455</Real>
+    <Real>-48.153027</Real>
+    <Real>47.717995</Real>
+    <Real>-3.2999983</Real>
+    <Real>-72.572922</Real>
+    <Real>-38.139801</Real>
+    <Real>-30.521713</Real>
+    <Real>6.1046782</Real>
+    <Real>-9.692791</Real>
+    <Real>110.98911</Real>
+    <Real>-75.428078</Real>
+    <Real>46.266464</Real>
+    <Real>-2.5678482</Real>
+    <Real>-1.0211296</Real>
+    <Real>-80.952118</Real>
+    <Real>22.705467</Real>
+    <Real>46.342243</Real>
+    <Real>-37.527981</Real>
+    <Real>-76.662758</Real>
+    <Real>47.08432</Real>
+    <Real>53.226368</Real>
+    <Real>25.6031</Real>
+    <Real>-41.980274</Real>
+    <Real>41.767311</Real>
+    <Real>141.31783</Real>
+    <Real>58.365734</Real>
+    <Real>39.770599</Real>
+    <Real>71.020485</Real>
+    <Real>-1.7414665</Real>
+    <Real>-44.096264</Real>
+    <Real>-54.376839</Real>
+    <Real>-177.69962</Real>
+    <Real>-86.9702</Real>
+    <Real>92.677132</Real>
+    <Real>12.237498</Real>
+    <Real>116.1211</Real>
+    <Real>-45.76075</Real>
+    <Real>-105.67236</Real>
+    <Real>-26.742617</Real>
+    <Real>101.09538</Real>
+    <Real>13.41419</Real>
+    <Real>-131.61905</Real>
+    <Real>-28.451714</Real>
+    <Real>-22.328371</Real>
+    <Real>9.1879501</Real>
+    <Real>41.788376</Real>
+    <Real>32.6409</Real>
+    <Real>83.066856</Real>
+    <Real>10.854151</Real>
+    <Real>-91.848518</Real>
+    <Real>25.068546</Real>
+    <Real>40.635841</Real>
+    <Real>152.67975</Real>
+    <Real>-19.914082</Real>
+    <Real>-59.78373</Real>
+    <Real>45.356178</Real>
+    <Real>34.173023</Real>
+    <Real>82.167252</Real>
+    <Real>68.644402</Real>
+    <Real>-18.733931</Real>
+    <Real>-18.102921</Real>
+    <Real>-22.17901</Real>
+    <Real>5.6175013</Real>
+    <Real>-11.154749</Real>
+    <Real>123.56158</Real>
+    <Real>-107.60902</Real>
+    <Real>-90.941872</Real>
+    <Real>-156.90469</Real>
+    <Real>-44.500271</Real>
+    <Real>-28.957687</Real>
+    <Real>-35.773396</Real>
+    <Real>-79.20179</Real>
+    <Real>-57.924294</Real>
+    <Real>115.1449</Real>
+    <Real>-67.412949</Real>
+    <Real>-37.809608</Real>
+    <Real>-14.488893</Real>
+    <Real>-46.050011</Real>
+    <Real>82.151398</Real>
+    <Real>-39.940063</Real>
+    <Real>-56.889717</Real>
+    <Real>-63.660892</Real>
+    <Real>0.38755035</Real>
+    <Real>-98.53241</Real>
+    <Real>-56.132343</Real>
+    <Real>-89.180298</Real>
+    <Real>-54.385841</Real>
+    <Real>-45.144741</Real>
+    <Real>136.9101</Real>
+    <Real>38.091484</Real>
+    <Real>-10.091549</Real>
+    <Real>93.179642</Real>
+    <Real>-17.907486</Real>
+    <Real>63.75</Real>
+    <Real>-69.490211</Real>
+    <Real>-29.881189</Real>
+    <Real>24.907822</Real>
+    <Real>23.572371</Real>
+    <Real>-22.442316</Real>
+    <Real>-72.121185</Real>
+    <Real>-60.285027</Real>
+    <Real>-9.7116699</Real>
+    <Real>-28.127995</Real>
+    <Real>-85.659286</Real>
+    <Real>-7.1290541</Real>
+    <Real>-34.654629</Real>
+    <Real>137.86853</Real>
+    <Real>76.807381</Real>
+    <Real>61.008018</Real>
+    <Real>7.3661022</Real>
+    <Real>-19.84164</Real>
+    <Real>91.784836</Real>
+    <Real>79.680069</Real>
+    <Real>32.573555</Real>
+    <Real>39.669312</Real>
+    <Real>-39.799622</Real>
+    <Real>-13.642996</Real>
+    <Real>93.26075</Real>
+    <Real>-71.729401</Real>
+    <Real>-62.820633</Real>
+    <Real>30.062822</Real>
+    <Real>-9.6620827</Real>
+    <Real>-2.8341637</Real>
+    <Real>4.3919802</Real>
+    <Real>-61.963036</Real>
+    <Real>59.289169</Real>
+    <Real>-85.926285</Real>
+    <Real>-156.90469</Real>
+    <Real>44.500271</Real>
+    <Real>12.909737</Real>
+    <Real>-51.326603</Real>
+    <Real>82.000694</Real>
+    <Real>-94.147453</Real>
+    <Real>65.004913</Real>
+    <Real>16.143177</Real>
+    <Real>-79.566307</Real>
+    <Real>40.132591</Real>
+    <Real>93.26075</Real>
+    <Real>71.729401</Real>
+    <Real>-54.133568</Real>
+    <Real>162.86279</Real>
+    <Real>-14.140621</Real>
+    <Real>-109.47665</Real>
+    <Real>-26.039165</Real>
+    <Real>-32.616673</Real>
+    <Real>-23.894932</Real>
+    <Real>99.576469</Real>
+    <Real>76.807381</Real>
+    <Real>-61.008018</Real>
+    <Real>28.417313</Real>
+    <Real>104.61455</Real>
+    <Real>21.200081</Real>
+    <Real>-170.35042</Real>
+    <Real>59.724304</Real>
+    <Real>16.675398</Real>
+    <Real>-39.485001</Real>
+    <Real>-8.2658739</Real>
+    <Real>23.572371</Real>
+    <Real>22.442316</Real>
+    <Real>-4.2385178</Real>
+    <Real>-12.733873</Real>
+    <Real>-10.749865</Real>
+    <Real>-19.317474</Real>
+    <Real>-68.632401</Real>
+    <Real>-26.374466</Real>
+    <Real>22.242615</Real>
+    <Real>81.31839</Real>
+    <Real>-45.144741</Real>
+    <Real>-136.9101</Real>
+    <Real>-54.161346</Real>
+    <Real>32.336605</Real>
+    <Real>-91.79631</Real>
+    <Real>60.323013</Real>
+    <Real>31.658646</Real>
+    <Real>-44.218285</Real>
+    <Real>44.499374</Real>
+    <Real>33.891602</Real>
+    <Real>-46.050011</Real>
+    <Real>-82.151398</Real>
+    <Real>25.151779</Real>
+    <Real>-44.495792</Real>
+    <Real>-79.862991</Real>
+    <Real>28.256498</Real>
+    <Real>-18.307243</Real>
+    <Real>116.70643</Real>
+    <Real>-4.1465816</Real>
+    <Real>162.1201</Real>
+    <Real>6.1046782</Real>
+    <Real>9.692791</Real>
+    <Real>-17.828434</Real>
+    <Real>-51.168427</Real>
+    <Real>79.405762</Real>
+    <Real>-57.639107</Real>
+    <Real>-55.628658</Real>
+    <Real>-81.859589</Real>
+    <Real>171.53659</Real>
+    <Real>-43.288349</Real>
+    <Real>82.167252</Real>
+    <Real>-68.644402</Real>
+    <Real>0.13977623</Real>
+    <Real>-83.154434</Real>
+    <Real>-1.8193827</Real>
+    <Real>-50.783756</Real>
+    <Real>43.404274</Real>
+    <Real>74.736938</Real>
+    <Real>1.8243904</Real>
+    <Real>79.398506</Real>
+    <Real>83.066856</Real>
+    <Real>-10.854151</Real>
+    <Real>-132.63257</Real>
+    <Real>13.42399</Real>
+    <Real>-56.001003</Real>
+    <Real>-18.570007</Real>
+    <Real>-41.651451</Real>
+    <Real>8.5343847</Real>
+    <Real>60.512642</Real>
+    <Real>100.43935</Real>
+    <Real>-105.67236</Real>
+    <Real>26.742617</Real>
+    <Real>-2.2031364</Real>
+    <Real>-5.9043312</Real>
+    <Real>20.460499</Real>
+    <Real>99.431366</Real>
+    <Real>-61.079948</Real>
+    <Real>-80.646698</Real>
+    <Real>-23.038826</Real>
+    <Real>-59.640953</Real>
+    <Real>71.020485</Real>
+    <Real>1.7414665</Real>
+    <Real>48.259361</Real>
+    <Real>-110.07063</Real>
+    <Real>-163.82187</Real>
+    <Real>25.244911</Real>
+    <Real>-33.918114</Real>
+    <Real>-63.66584</Real>
+    <Real>-140.20068</Real>
+    <Real>-124.76439</Real>
+    <Real>-37.527981</Real>
+    <Real>76.662758</Real>
+    <Real>-26.734808</Real>
+    <Real>62.413918</Real>
+    <Real>53.788704</Real>
+    <Real>-29.917919</Real>
+    <Real>0.37000275</Real>
+    <Real>-218.31534</Real>
+    <Real>102.17184</Real>
+    <Real>60.231632</Real>
+  </Sequence>
+</ReferenceData>
diff --git a/src/gromacs/fft/tests/refdata/FFTTest3D_Real5_6_9.xml b/src/gromacs/fft/tests/refdata/FFTTest3D_Real5_6_9.xml
new file mode 100644 (file)
index 0000000..840a0bd
--- /dev/null
@@ -0,0 +1,317 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Vector Name="realGridSizePadded">
+    <Int Name="X">5</Int>
+    <Int Name="Y">6</Int>
+    <Int Name="Z">10</Int>
+  </Vector>
+  <Vector Name="complexGridSizePadded">
+    <Int Name="X">5</Int>
+    <Int Name="Y">6</Int>
+    <Int Name="Z">5</Int>
+  </Vector>
+  <Sequence Name="ComplexGridAfterRealToComplex">
+    <Int Name="Length">300</Int>
+    <Real>136.09999999999999</Real>
+    <Real>0</Real>
+    <Real>6.1046777798673304</Real>
+    <Real>-9.6927915189833804</Real>
+    <Real>-156.90467777986734</Real>
+    <Real>-44.500278567325005</Real>
+    <Real>-156.90467777986734</Real>
+    <Real>44.500278567325005</Real>
+    <Real>6.1046777798673304</Real>
+    <Real>9.6927915189833804</Real>
+    <Real>109.33089836200777</Real>
+    <Real>144.01741474136767</Real>
+    <Real>110.98910420129506</Real>
+    <Real>-75.428066165741697</Real>
+    <Real>-28.9576804599293</Real>
+    <Real>-35.773394870359979</Real>
+    <Real>12.909729603318882</Real>
+    <Real>-51.326604840195373</Real>
+    <Real>-17.828427811489235</Real>
+    <Real>-51.168418460828057</Real>
+    <Real>80.282164734026082</Real>
+    <Real>-30.151275351195409</Real>
+    <Real>46.266467708046093</Real>
+    <Real>-2.5678489670789659</Real>
+    <Real>-79.201790713534393</Real>
+    <Real>-57.924296703634646</Real>
+    <Real>82.000686192249006</Real>
+    <Real>-94.147447732293045</Real>
+    <Real>79.405763443152878</Real>
+    <Real>-57.63909910410591</Real>
+    <Real>174.5</Real>
+    <Real>-82.099208278764777</Real>
+    <Real>-1.0211355262417676</Real>
+    <Real>-80.952112737709001</Real>
+    <Real>115.14489096295333</Real>
+    <Real>-67.412953751874568</Real>
+    <Real>65.004908445660561</Real>
+    <Real>16.143174029504738</Real>
+    <Real>-55.628663882372095</Real>
+    <Real>-81.859587355434371</Real>
+    <Real>-73.063063096033858</Real>
+    <Real>-35.17161278516069</Real>
+    <Real>22.705466420779416</Real>
+    <Real>46.34223324162695</Real>
+    <Real>-37.809610613745875</Real>
+    <Real>-14.488888242266809</Real>
+    <Real>-79.566298372895233</Real>
+    <Real>40.132587632371767</Real>
+    <Real>171.53659040275275</Real>
+    <Real>-43.288340582509534</Real>
+    <Real>-53.850000000000001</Real>
+    <Real>8.7468565782228254</Real>
+    <Real>-37.527983739057433</Real>
+    <Real>-76.662755634952319</Real>
+    <Real>-46.050013953392011</Real>
+    <Real>82.151413216948384</Real>
+    <Real>93.260753040454404</Real>
+    <Real>71.729394279046062</Real>
+    <Real>82.167244651995048</Real>
+    <Real>-68.644400363576196</Real>
+    <Real>34.447925708729784</Real>
+    <Real>-46.679698485304343</Real>
+    <Real>47.084315355518257</Real>
+    <Real>53.226361938057238</Real>
+    <Real>-39.940061988556415</Real>
+    <Real>-56.889712822841616</Real>
+    <Real>-54.133563551261453</Real>
+    <Real>162.86277437335798</Real>
+    <Real>0.13978000683670544</Real>
+    <Real>-83.154435988355075</Real>
+    <Real>77.450843683464541</Real>
+    <Real>99.232127419610464</Real>
+    <Real>25.603100973672952</Real>
+    <Real>-41.980268634661584</Real>
+    <Real>-63.660910025502289</Real>
+    <Real>0.38754591548313932</Real>
+    <Real>-14.140629179993454</Real>
+    <Real>-109.47665317045926</Real>
+    <Real>-1.819372817068146</Real>
+    <Real>-50.783752164257912</Real>
+    <Real>-28.349999999999991</Real>
+    <Real>66.250943389509558</Real>
+    <Real>41.767316918315899</Real>
+    <Real>141.3178171547479</Real>
+    <Real>-98.532415917009473</Real>
+    <Real>-56.132356053022612</Real>
+    <Real>-26.039172227730649</Real>
+    <Real>-32.616671442082982</Real>
+    <Real>43.404271226424243</Real>
+    <Real>74.73694469667015</Real>
+    <Real>-75.394910708698077</Real>
+    <Real>-63.045733778267945</Real>
+    <Real>58.365744569582304</Real>
+    <Real>39.770614495173604</Real>
+    <Real>-89.180292566745905</Real>
+    <Real>-54.385841985238351</Real>
+    <Real>-23.89493156322942</Real>
+    <Real>99.576471973869374</Real>
+    <Real>1.824395310965258</Real>
+    <Real>79.398509308323057</Real>
+    <Real>-93.25</Real>
+    <Real>-38.191720306893735</Real>
+    <Real>71.020497976742121</Real>
+    <Real>-1.7414685014859943</Real>
+    <Real>-45.144746631885752</Real>
+    <Real>136.91007840098462</Real>
+    <Real>76.807385747829002</Real>
+    <Real>-61.008015162243645</Real>
+    <Real>83.066862907314629</Real>
+    <Real>-10.854137720612524</Real>
+    <Real>11.146194900875905</Real>
+    <Real>-39.325905869819671</Real>
+    <Real>-44.096266736330762</Real>
+    <Real>-54.376841765161174</Real>
+    <Real>38.091494194864985</Real>
+    <Real>-10.091555063687235</Real>
+    <Real>28.417313488040527</Real>
+    <Real>104.61453969853025</Real>
+    <Real>-132.63257919812122</Real>
+    <Real>13.423985690353135</Real>
+    <Real>-89.798336147192941</Real>
+    <Real>-124.42587252332865</Real>
+    <Real>-177.69961189145363</Real>
+    <Real>-86.970199597566364</Real>
+    <Real>93.179637327066956</Real>
+    <Real>-17.907496809528642</Real>
+    <Real>21.200096591640929</Real>
+    <Real>-170.35040828979743</Real>
+    <Real>-56.000998352042323</Real>
+    <Real>-18.570020938665991</Real>
+    <Real>-41.5</Real>
+    <Real>70.148057706539518</Real>
+    <Real>92.677142033179152</Real>
+    <Real>12.23749431695725</Real>
+    <Real>63.749995048043729</Real>
+    <Real>-69.490209658536315</Real>
+    <Real>59.724306187452846</Real>
+    <Real>16.675397899553762</Real>
+    <Real>-41.651443268675749</Real>
+    <Real>8.5343775020010852</Real>
+    <Real>13.130336383741557</Real>
+    <Real>-22.927176864452125</Real>
+    <Real>116.12111228365768</Real>
+    <Real>-45.760745866170758</Real>
+    <Real>-29.881200055227175</Real>
+    <Real>24.907824000483256</Real>
+    <Real>-39.485004753366788</Real>
+    <Real>-8.2658722859129039</Real>
+    <Real>60.512645744111353</Real>
+    <Real>100.43935627235197</Real>
+    <Real>-12.299999999999997</Real>
+    <Real>0</Real>
+    <Real>-105.67236454974395</Real>
+    <Real>-26.742612718204111</Real>
+    <Real>23.572364549743916</Real>
+    <Real>-22.442318619165608</Real>
+    <Real>23.572364549743916</Real>
+    <Real>22.442318619165608</Real>
+    <Real>-105.67236454974395</Real>
+    <Real>26.742612718204111</Real>
+    <Real>42.035849450475908</Real>
+    <Real>-41.135575070858067</Real>
+    <Real>101.09538167141042</Real>
+    <Real>13.414183590793723</Real>
+    <Real>-72.121180894777183</Real>
+    <Real>-60.28502949226403</Real>
+    <Real>-4.2385225536985178</Real>
+    <Real>-12.733879099379088</Real>
+    <Real>-2.2031334820560637</Real>
+    <Real>-5.9043348756324505</Real>
+    <Real>80.964834850820353</Real>
+    <Real>-8.4039231702524546</Real>
+    <Real>-131.61904089627436</Real>
+    <Real>-28.45172299445861</Real>
+    <Real>-9.7116784144650836</Real>
+    <Real>-28.127997000734691</Real>
+    <Real>-10.749861458489534</Real>
+    <Real>-19.317475675829904</Real>
+    <Real>20.460493103348522</Real>
+    <Real>99.431367993784619</Real>
+    <Real>-3.3000000000000043</Real>
+    <Real>-11.085125168440822</Real>
+    <Real>-22.328371106147358</Real>
+    <Real>9.187944729381897</Real>
+    <Real>-85.659284275876232</Real>
+    <Real>-7.1290511976147215</Real>
+    <Real>-68.632393167495422</Real>
+    <Real>-26.374469875305898</Real>
+    <Real>-61.079951450480984</Real>
+    <Real>-80.646702595135253</Real>
+    <Real>-53.250684301296232</Real>
+    <Real>-70.41197369012103</Real>
+    <Real>41.788374988548</Real>
+    <Real>32.640898630438166</Real>
+    <Real>-34.654631341454191</Real>
+    <Real>137.86853343714668</Real>
+    <Real>22.242615745077437</Real>
+    <Real>81.318379495452191</Real>
+    <Real>-23.038816467169443</Real>
+    <Real>-59.640953773067181</Real>
+    <Real>-93.25</Real>
+    <Real>38.191720306893735</Real>
+    <Real>83.066862907314629</Real>
+    <Real>10.854137720612524</Real>
+    <Real>76.807385747829002</Real>
+    <Real>61.008015162243645</Real>
+    <Real>-45.144746631885752</Real>
+    <Real>-136.91007840098462</Real>
+    <Real>71.020497976742121</Real>
+    <Real>1.7414685014859943</Real>
+    <Real>-29.12254931950897</Real>
+    <Real>-55.548007164359511</Real>
+    <Real>-91.848515147247383</Real>
+    <Real>25.068542228822352</Real>
+    <Real>7.3660985224634832</Real>
+    <Real>-19.841635066202368</Real>
+    <Real>-54.161343304004355</Real>
+    <Real>32.3365991372645</Real>
+    <Real>48.259353160853053</Real>
+    <Real>-110.07063552157035</Real>
+    <Real>-25.626531284617528</Real>
+    <Real>-34.453667272791314</Real>
+    <Real>40.635846175667027</Real>
+    <Real>152.67975355881092</Real>
+    <Real>91.784846278662059</Real>
+    <Real>79.680065800736799</Real>
+    <Real>-91.796318858791764</Real>
+    <Real>60.323017825477706</Real>
+    <Real>-163.82188856316591</Real>
+    <Real>25.244915999312568</Real>
+    <Real>52.850000000000009</Real>
+    <Real>-2.3382685902179645</Real>
+    <Real>-19.91408137475328</Real>
+    <Real>-59.783730527586329</Real>
+    <Real>32.573560897852502</Real>
+    <Real>39.669307866057082</Real>
+    <Real>31.658633708141942</Real>
+    <Real>-44.218290841443263</Real>
+    <Real>-33.918113231241179</Real>
+    <Real>-63.665841176367543</Real>
+    <Real>-106.97911453329806</Real>
+    <Real>64.663251904591306</Real>
+    <Real>45.356186666024996</Real>
+    <Real>34.173035237197176</Real>
+    <Real>-39.79960647690492</Real>
+    <Real>-13.643005636820892</Real>
+    <Real>44.499372603779499</Real>
+    <Real>33.891599639990183</Real>
+    <Real>-140.20066970017635</Real>
+    <Real>-124.76439777461135</Real>
+    <Real>-53.850000000000001</Real>
+    <Real>-8.7468565782228254</Real>
+    <Real>82.167244651995048</Real>
+    <Real>68.644400363576196</Real>
+    <Real>93.260753040454404</Real>
+    <Real>-71.729394279046062</Real>
+    <Real>-46.050013953392011</Real>
+    <Real>-82.151413216948384</Real>
+    <Real>-37.527983739057433</Real>
+    <Real>76.662755634952319</Real>
+    <Real>-7.3610436092305136</Real>
+    <Real>-30.547454539791165</Real>
+    <Real>-18.73392872733908</Real>
+    <Real>-18.10292380515591</Real>
+    <Real>-62.820635540187361</Real>
+    <Real>30.062829944591893</Real>
+    <Real>25.151783100728075</Real>
+    <Real>-44.495797289734995</Real>
+    <Real>-26.734819466231212</Real>
+    <Real>62.413919808452086</Real>
+    <Real>-48.153015000031722</Real>
+    <Real>47.717986144438648</Real>
+    <Real>-22.179018783043063</Real>
+    <Real>5.6175083821953571</Real>
+    <Real>-9.6620741626321376</Real>
+    <Real>-2.8341625358714371</Real>
+    <Real>-79.862998875491698</Real>
+    <Real>28.256495771921948</Real>
+    <Real>53.788706248057593</Real>
+    <Real>-29.91791939154006</Real>
+    <Real>-3.3000000000000007</Real>
+    <Real>-72.572928837135976</Real>
+    <Real>-11.154757375936294</Real>
+    <Real>123.5615857327648</Real>
+    <Real>4.3919891208326618</Real>
+    <Real>-61.963046850842439</Real>
+    <Real>-18.307236705082499</Real>
+    <Real>116.70643860522506</Real>
+    <Real>0.37000496018613305</Real>
+    <Real>-218.31535114198851</Real>
+    <Real>-38.13980007423406</Real>
+    <Real>-30.52172028109797</Real>
+    <Real>-107.60901341744066</Real>
+    <Real>-90.941870214929978</Real>
+    <Real>59.289174146567873</Real>
+    <Real>-85.926292155263994</Real>
+    <Real>-4.1465872345488588</Real>
+    <Real>162.1201044783071</Real>
+    <Real>102.1718381873421</Real>
+    <Real>60.231632931236973</Real>
+  </Sequence>
+</ReferenceData>