Port basic pull test to gtest framework
authorBerk Hess <hess@kth.se>
Wed, 30 Jun 2021 10:50:18 +0000 (10:50 +0000)
committerPaul Bauer <paul.bauer.q@gmail.com>
Wed, 30 Jun 2021 10:50:18 +0000 (10:50 +0000)
src/programs/mdrun/tests/CMakeLists.txt
src/programs/mdrun/tests/moduletest.cpp
src/programs/mdrun/tests/moduletest.h
src/programs/mdrun/tests/pull.cpp [new file with mode: 0644]
src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_0.xml [new file with mode: 0644]
src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_1.xml [new file with mode: 0644]
src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_2.xml [new file with mode: 0644]
src/testutils/simulationdatabase/spc216.ndx
src/testutils/simulationdatabase/spc216_pull.ndx [new file with mode: 0644]

index 6b4300486ed371a715b2b6642b2025931e5ce76b..32ff54143f39454872f6e83069493d201774a6a2 100644 (file)
@@ -247,6 +247,21 @@ gmx_add_gtest_executable(${exename}
 )
 target_link_libraries(${exename} PRIVATE mdrun_test_infrastructure)
 # TODO: Link specific modules: topology
+
+# End-to-end test for pull functionality
+target_link_libraries(${exename} PRIVATE legacy_modules)
+gmx_register_gtest_test(${testname} ${exename} OPENMP_THREADS 2 INTEGRATION_TEST IGNORE_LEAKS)
+set(testname "MdrunPullTests")
+set(exename "mdrun-pull-test")
+
+gmx_add_gtest_executable(${exename}
+        CPP_SOURCE_FILES
+        # files with code for tests
+        pull.cpp
+        # pseudo-library for code for mdrun
+        $<TARGET_OBJECTS:mdrun_objlib>
+)
+target_link_libraries(${exename} PRIVATE mdrun_test_infrastructure)
 target_link_libraries(${exename} PRIVATE legacy_modules)
 gmx_register_gtest_test(${testname} ${exename} OPENMP_THREADS 2 INTEGRATION_TEST IGNORE_LEAKS)
 
index 1a15c721a9db9d08296836959a08b0c7d157e9e9..f71254a1b5a631f2b64526f6ae5c45d45d9cfad1 100644 (file)
@@ -174,6 +174,11 @@ void SimulationRunner::useGroFromDatabase(const char* name)
     groFileName_ = gmx::test::TestFileManager::getInputFilePath((std::string(name) + ".gro").c_str());
 }
 
+void SimulationRunner::useNdxFromDatabase(const std::string& name)
+{
+    ndxFileName_ = gmx::test::TestFileManager::getInputFilePath(name + ".ndx");
+}
+
 void SimulationRunner::useTopGroAndMdpFromFepTestDatabase(const std::string& name)
 {
     GMX_RELEASE_ASSERT(mdpSource_ != SimulationRunnerMdpSource::String,
index 72261b69fe5d0cec23e2186aae32545735d53962..2a23459089558eb8df2595e221db1b1ff3b55e35 100644 (file)
@@ -125,6 +125,8 @@ public:
     void useTopGroAndNdxFromDatabase(const std::string& name);
     //! Use a standard .gro file as input to grompp
     void useGroFromDatabase(const char* name);
+    //! Use a standard .ndx as input to grompp
+    void useNdxFromDatabase(const std::string& name);
     //! Use .top, .gro, and .mdp from FEP test database
     void useTopGroAndMdpFromFepTestDatabase(const std::string& name);
     //! Calls grompp (on rank 0, with a customized command line) to prepare for the mdrun test
diff --git a/src/programs/mdrun/tests/pull.cpp b/src/programs/mdrun/tests/pull.cpp
new file mode 100644 (file)
index 0000000..56bc255
--- /dev/null
@@ -0,0 +1,223 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2021, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+
+/*! \internal \file
+ * \brief
+ * Tests for mdrun pull functionality.
+ *
+ * \author Berk Hess <hess@kth.se>
+ * \ingroup module_mdrun_integration_tests
+ */
+#include "gmxpre.h"
+
+#include <map>
+#include <memory>
+#include <string>
+#include <unordered_map>
+#include <vector>
+
+#include <gtest/gtest.h>
+
+#include "gromacs/options/filenameoption.h"
+#include "gromacs/topology/idef.h"
+#include "gromacs/topology/ifunc.h"
+#include "gromacs/utility/stringutil.h"
+
+#include "testutils/mpitest.h"
+#include "testutils/refdata.h"
+#include "testutils/simulationdatabase.h"
+#include "testutils/testasserts.h"
+
+#include "energycomparison.h"
+#include "moduletest.h"
+
+namespace gmx
+{
+namespace test
+{
+namespace
+{
+
+/*! \brief Database of energy tolerances on the various systems. */
+std::unordered_map<std::string, FloatingPointTolerance> energyToleranceForSystem_g = {
+    { { "spc216", relativeToleranceAsFloatingPoint(1, 1e-4) } }
+};
+
+/*! \brief Database of pressure tolerances on the various systems. */
+std::unordered_map<std::string, FloatingPointTolerance> pressureToleranceForSystem_g = {
+    { { "spc216", relativeToleranceAsFloatingPoint(1, 2e-4) } }
+};
+
+const std::unordered_map<std::string, std::vector<std::pair<std::string, std::string>>> c_mdpPullParams = {
+    { { "umbrella-3D",
+        { { "pull-ngroups", "2" },
+          { "pull-ncoords", "1" },
+          { "pull-nstxout", "0" },
+          { "pull-nstfout", "0" },
+          { "pull-group1-name", "r_1" },
+          { "pull-group2-name", "r_2" },
+          { "pull-coord1-groups", "1 2" },
+          { "pull-coord1-type", "umbrella" },
+          { "pull-coord1-geometry", "distance" },
+          { "pull-coord1-dim", "Y Y Y" },
+          { "pull-coord1-init", "0.6" },
+          { "pull-coord1-k", "100" } } },
+      { "umbrella-2D",
+        { { "pull-ngroups", "2" },
+          { "pull-ncoords", "1" },
+          { "pull-nstxout", "0" },
+          { "pull-nstfout", "0" },
+          { "pull-group1-name", "r_1" },
+          { "pull-group2-name", "r_2" },
+          { "pull-coord1-groups", "1 2" },
+          { "pull-coord1-type", "umbrella" },
+          { "pull-coord1-geometry", "distance" },
+          { "pull-coord1-dim", "Y Y N" },
+          { "pull-coord1-init", "0.4" },
+          { "pull-coord1-k", "100" } } },
+      { "constraint-flatbottom",
+        { { "pull-ngroups", "3" },
+          { "pull-ncoords", "2" },
+          { "pull-nstxout", "0" },
+          { "pull-nstfout", "0" },
+          { "pull-group1-name", "r_1" },
+          { "pull-group2-name", "r_2" },
+          { "pull-group3-name", "r_3" },
+          { "pull-coord1-groups", "1 2" },
+          { "pull-coord1-type", "constraint" },
+          { "pull-coord1-geometry", "distance" },
+          { "pull-coord1-dim", "Y Y Y" },
+          { "pull-coord1-init", "0.5" },
+          { "pull-coord2-groups", "1 3" },
+          { "pull-coord2-type", "flat-bottom" },
+          { "pull-coord2-geometry", "distance" },
+          { "pull-coord2-dim", "Y Y Y" },
+          { "pull-coord2-init", "0.4" },
+          { "pull-coord2-k", "100" } } } }
+};
+
+//! Helper type
+using MdpField = MdpFieldValues::value_type;
+
+/*! \brief Test fixture base for simple mdrun systems
+ *
+ * This test ensures mdrun can run a simulation, reaching
+ * reproducible energies.
+ *
+ * The choices for tolerance are arbitrary but sufficient. */
+class PullIntegrationTest :
+    public MdrunTestFixture,
+    public ::testing::WithParamInterface<std::tuple<std::string, std::string>>
+{
+};
+
+//! Adds integrator and nonbonded parameter setup
+void addBasicMdpValues(MdpFieldValues* mdpFieldValues)
+{
+    (*mdpFieldValues)["nsteps"]        = "20";
+    (*mdpFieldValues)["nstcomm"]       = "10";
+    (*mdpFieldValues)["nstlist"]       = "10";
+    (*mdpFieldValues)["nstcalcenergy"] = "5";
+    (*mdpFieldValues)["nstenergy"]     = "5";
+    (*mdpFieldValues)["coulombtype"]   = "Reaction-field";
+    (*mdpFieldValues)["vdwtype"]       = "Cut-off";
+}
+
+TEST_P(PullIntegrationTest, WithinTolerances)
+{
+    auto params         = GetParam();
+    auto simulationName = std::get<0>(params);
+    auto pullSetup      = std::get<1>(params);
+    SCOPED_TRACE(formatString("Comparing simple mdrun for '%s'", simulationName.c_str()));
+
+    // TODO At some point we should also test PME-only ranks.
+    int numRanksAvailable = getNumberOfTestMpiRanks();
+    if (!isNumberOfPpRanksSupported(simulationName, numRanksAvailable))
+    {
+        fprintf(stdout,
+                "Test system '%s' cannot run with %d ranks.\n"
+                "The supported numbers are: %s\n",
+                simulationName.c_str(),
+                numRanksAvailable,
+                reportNumbersOfPpRanksSupported(simulationName).c_str());
+        return;
+    }
+    auto mdpFieldValues = prepareMdpFieldValues(simulationName.c_str(), "md", "no", "no");
+    addBasicMdpValues(&mdpFieldValues);
+
+    // Add the pull parameters
+    mdpFieldValues["pull"]    = "yes";
+    const auto& mdpPullParams = c_mdpPullParams.at(pullSetup);
+    for (const auto& param : mdpPullParams)
+    {
+        mdpFieldValues[param.first] = param.second;
+    }
+
+    // Prepare the .tpr file
+    {
+        CommandLine caller;
+        runner_.useTopGroAndNdxFromDatabase(simulationName);
+        runner_.useNdxFromDatabase(simulationName + "_pull");
+        runner_.useStringAsMdpFile(prepareMdpFileContents(mdpFieldValues));
+        EXPECT_EQ(0, runner_.callGrompp(caller));
+    }
+    // Do mdrun
+    {
+        CommandLine mdrunCaller;
+        ASSERT_EQ(0, runner_.callMdrun(mdrunCaller));
+        EnergyTermsToCompare energyTermsToCompare{ {
+                { interaction_function[F_COM_PULL].longname, energyToleranceForSystem_g.at(simulationName) },
+                { interaction_function[F_EPOT].longname, energyToleranceForSystem_g.at(simulationName) },
+                { interaction_function[F_EKIN].longname, energyToleranceForSystem_g.at(simulationName) },
+                { interaction_function[F_PRES].longname, pressureToleranceForSystem_g.at(simulationName) },
+        } };
+        TestReferenceData    refData;
+        auto                 checker = refData.rootChecker()
+                               .checkCompound("Simulation", simulationName)
+                               .checkCompound("PullSetup", pullSetup);
+        checkEnergiesAgainstReferenceData(runner_.edrFileName_, energyTermsToCompare, &checker);
+    }
+}
+
+INSTANTIATE_TEST_CASE_P(PullTest,
+                        PullIntegrationTest,
+                        ::testing::Combine(::testing::Values("spc216"),
+                                           ::testing::Values("umbrella-3D",
+                                                             "umbrella-2D",
+                                                             "constraint-flatbottom")));
+
+} // namespace
+} // namespace test
+} // namespace gmx
diff --git a/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_0.xml b/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_0.xml
new file mode 100644 (file)
index 0000000..1758f5a
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Simulation Name="spc216">
+    <PullSetup Name="umbrella-3D">
+      <Energy Name="Pressure">
+        <Real Name="Time 0.000000 Step 0 in frame 0">7047.8843</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">6813.9585</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">6432.3613</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">5985.5601</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">5571.9185</Real>
+      </Energy>
+      <Energy Name="Kinetic En.">
+        <Real Name="Time 0.000000 Step 0 in frame 0">1627.3685</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">1620.8447</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">1637.7889</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">1665.6293</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">1688.8979</Real>
+      </Energy>
+      <Energy Name="Potential">
+        <Real Name="Time 0.000000 Step 0 in frame 0">-7927.1426</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">-7920.6416</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">-7937.6411</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">-7965.5195</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">-7988.6768</Real>
+      </Energy>
+      <Energy Name="COM Pull En.">
+        <Real Name="Time 0.000000 Step 0 in frame 0">0.031361848</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">0.039091855</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">0.047064677</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">0.055442076</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">0.064478263</Real>
+      </Energy>
+    </PullSetup>
+  </Simulation>
+</ReferenceData>
diff --git a/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_1.xml b/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_1.xml
new file mode 100644 (file)
index 0000000..fab41f1
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Simulation Name="spc216">
+    <PullSetup Name="umbrella-2D">
+      <Energy Name="Pressure">
+        <Real Name="Time 0.000000 Step 0 in frame 0">7049.2031</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">6815.1157</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">6433.2632</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">5986.5176</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">5572.6538</Real>
+      </Energy>
+      <Energy Name="Kinetic En.">
+        <Real Name="Time 0.000000 Step 0 in frame 0">1627.3667</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">1620.8271</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">1637.7637</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">1665.6067</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">1688.8857</Real>
+      </Energy>
+      <Energy Name="Potential">
+        <Real Name="Time 0.000000 Step 0 in frame 0">-7926.6826</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">-7920.1704</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">-7937.1602</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">-7965.0396</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">-7988.1987</Real>
+      </Energy>
+      <Energy Name="COM Pull En.">
+        <Real Name="Time 0.000000 Step 0 in frame 0">0.49112874</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">0.5159598</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">0.53794813</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">0.55593359</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">0.56885451</Real>
+      </Energy>
+    </PullSetup>
+  </Simulation>
+</ReferenceData>
diff --git a/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_2.xml b/src/programs/mdrun/tests/refdata/PullTest_PullIntegrationTest_WithinTolerances_2.xml
new file mode 100644 (file)
index 0000000..b6809bd
--- /dev/null
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="referencedata.xsl"?>
+<ReferenceData>
+  <Simulation Name="spc216">
+    <PullSetup Name="constraint-flatbottom">
+      <Energy Name="Pressure">
+        <Real Name="Time 0.000000 Step 0 in frame 0">6961.0444</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">6714.8164</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">6345.8267</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">5948.0703</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">5588.2402</Real>
+      </Energy>
+      <Energy Name="Kinetic En.">
+        <Real Name="Time 0.000000 Step 0 in frame 0">1626.4885</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">1629.6486</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">1656.0322</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">1692.8835</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">1722.447</Real>
+      </Energy>
+      <Energy Name="Potential">
+        <Real Name="Time 0.000000 Step 0 in frame 0">-7891.5601</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">-7894.7871</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">-7921.2197</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">-7958.1206</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">-7987.5889</Real>
+      </Energy>
+      <Energy Name="COM Pull En.">
+        <Real Name="Time 0.000000 Step 0 in frame 0">0</Real>
+        <Real Name="Time 0.005000 Step 5 in frame 1">0</Real>
+        <Real Name="Time 0.010000 Step 10 in frame 2">0</Real>
+        <Real Name="Time 0.015000 Step 15 in frame 3">0</Real>
+        <Real Name="Time 0.020000 Step 20 in frame 4">0</Real>
+      </Energy>
+    </PullSetup>
+  </Simulation>
+</ReferenceData>
index 9e16ffcdef15206295945e20047c7c43f5ea7690..4e2371feb13d4c3c23c1110004ffb216bbf30381 100644 (file)
@@ -1,45 +1 @@
-[ System ]
-   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15 
-  16   17   18   19   20   21   22   23   24   25   26   27   28   29   30 
-  31   32   33   34   35   36   37   38   39   40   41   42   43   44   45 
-  46   47   48   49   50   51   52   53   54   55   56   57   58   59   60 
-  61   62   63   64   65   66   67   68   69   70   71   72   73   74   75 
-  76   77   78   79   80   81   82   83   84   85   86   87   88   89   90 
-  91   92   93   94   95   96   97   98   99  100  101  102  103  104  105 
- 106  107  108  109  110  111  112  113  114  115  116  117  118  119  120 
- 121  122  123  124  125  126  127  128  129  130  131  132  133  134  135 
- 136  137  138  139  140  141  142  143  144  145  146  147  148  149  150 
- 151  152  153  154  155  156  157  158  159  160  161  162  163  164  165 
- 166  167  168  169  170  171  172  173  174  175  176  177  178  179  180 
- 181  182  183  184  185  186  187  188  189  190  191  192  193  194  195 
- 196  197  198  199  200  201  202  203  204  205  206  207  208  209  210 
- 211  212  213  214  215  216  217  218  219  220  221  222  223  224  225 
- 226  227  228  229  230  231  232  233  234  235  236  237  238  239  240 
- 241  242  243  244  245  246  247  248  249  250  251  252  253  254  255 
- 256  257  258  259  260  261  262  263  264  265  266  267  268  269  270 
- 271  272  273  274  275  276  277  278  279  280  281  282  283  284  285 
- 286  287  288  289  290  291  292  293  294  295  296  297  298  299  300 
- 301  302  303  304  305  306  307  308  309  310  311  312  313  314  315 
- 316  317  318  319  320  321  322  323  324  325  326  327  328  329  330 
- 331  332  333  334  335  336  337  338  339  340  341  342  343  344  345 
- 346  347  348  349  350  351  352  353  354  355  356  357  358  359  360 
- 361  362  363  364  365  366  367  368  369  370  371  372  373  374  375 
- 376  377  378  379  380  381  382  383  384  385  386  387  388  389  390 
- 391  392  393  394  395  396  397  398  399  400  401  402  403  404  405 
- 406  407  408  409  410  411  412  413  414  415  416  417  418  419  420 
- 421  422  423  424  425  426  427  428  429  430  431  432  433  434  435 
- 436  437  438  439  440  441  442  443  444  445  446  447  448  449  450 
- 451  452  453  454  455  456  457  458  459  460  461  462  463  464  465 
- 466  467  468  469  470  471  472  473  474  475  476  477  478  479  480 
- 481  482  483  484  485  486  487  488  489  490  491  492  493  494  495 
- 496  497  498  499  500  501  502  503  504  505  506  507  508  509  510 
- 511  512  513  514  515  516  517  518  519  520  521  522  523  524  525 
- 526  527  528  529  530  531  532  533  534  535  536  537  538  539  540 
- 541  542  543  544  545  546  547  548  549  550  551  552  553  554  555 
- 556  557  558  559  560  561  562  563  564  565  566  567  568  569  570 
- 571  572  573  574  575  576  577  578  579  580  581  582  583  584  585 
- 586  587  588  589  590  591  592  593  594  595  596  597  598  599  600 
- 601  602  603  604  605  606  607  608  609  610  611  612  613  614  615 
- 616  617  618  619  620  621  622  623  624  625  626  627  628  629  630 
- 631  632  633  634  635  636  637  638  639  640  641  642  643  644  645 
- 646  647  648 
+spc216_pull
\ No newline at end of file
diff --git a/src/testutils/simulationdatabase/spc216_pull.ndx b/src/testutils/simulationdatabase/spc216_pull.ndx
new file mode 100644 (file)
index 0000000..3e10435
--- /dev/null
@@ -0,0 +1,51 @@
+[ System ]
+   1    2    3    4    5    6    7    8    9   10   11   12   13   14   15 
+  16   17   18   19   20   21   22   23   24   25   26   27   28   29   30 
+  31   32   33   34   35   36   37   38   39   40   41   42   43   44   45 
+  46   47   48   49   50   51   52   53   54   55   56   57   58   59   60 
+  61   62   63   64   65   66   67   68   69   70   71   72   73   74   75 
+  76   77   78   79   80   81   82   83   84   85   86   87   88   89   90 
+  91   92   93   94   95   96   97   98   99  100  101  102  103  104  105 
+ 106  107  108  109  110  111  112  113  114  115  116  117  118  119  120 
+ 121  122  123  124  125  126  127  128  129  130  131  132  133  134  135 
+ 136  137  138  139  140  141  142  143  144  145  146  147  148  149  150 
+ 151  152  153  154  155  156  157  158  159  160  161  162  163  164  165 
+ 166  167  168  169  170  171  172  173  174  175  176  177  178  179  180 
+ 181  182  183  184  185  186  187  188  189  190  191  192  193  194  195 
+ 196  197  198  199  200  201  202  203  204  205  206  207  208  209  210 
+ 211  212  213  214  215  216  217  218  219  220  221  222  223  224  225 
+ 226  227  228  229  230  231  232  233  234  235  236  237  238  239  240 
+ 241  242  243  244  245  246  247  248  249  250  251  252  253  254  255 
+ 256  257  258  259  260  261  262  263  264  265  266  267  268  269  270 
+ 271  272  273  274  275  276  277  278  279  280  281  282  283  284  285 
+ 286  287  288  289  290  291  292  293  294  295  296  297  298  299  300 
+ 301  302  303  304  305  306  307  308  309  310  311  312  313  314  315 
+ 316  317  318  319  320  321  322  323  324  325  326  327  328  329  330 
+ 331  332  333  334  335  336  337  338  339  340  341  342  343  344  345 
+ 346  347  348  349  350  351  352  353  354  355  356  357  358  359  360 
+ 361  362  363  364  365  366  367  368  369  370  371  372  373  374  375 
+ 376  377  378  379  380  381  382  383  384  385  386  387  388  389  390 
+ 391  392  393  394  395  396  397  398  399  400  401  402  403  404  405 
+ 406  407  408  409  410  411  412  413  414  415  416  417  418  419  420 
+ 421  422  423  424  425  426  427  428  429  430  431  432  433  434  435 
+ 436  437  438  439  440  441  442  443  444  445  446  447  448  449  450 
+ 451  452  453  454  455  456  457  458  459  460  461  462  463  464  465 
+ 466  467  468  469  470  471  472  473  474  475  476  477  478  479  480 
+ 481  482  483  484  485  486  487  488  489  490  491  492  493  494  495 
+ 496  497  498  499  500  501  502  503  504  505  506  507  508  509  510 
+ 511  512  513  514  515  516  517  518  519  520  521  522  523  524  525 
+ 526  527  528  529  530  531  532  533  534  535  536  537  538  539  540 
+ 541  542  543  544  545  546  547  548  549  550  551  552  553  554  555 
+ 556  557  558  559  560  561  562  563  564  565  566  567  568  569  570 
+ 571  572  573  574  575  576  577  578  579  580  581  582  583  584  585 
+ 586  587  588  589  590  591  592  593  594  595  596  597  598  599  600 
+ 601  602  603  604  605  606  607  608  609  610  611  612  613  614  615 
+ 616  617  618  619  620  621  622  623  624  625  626  627  628  629  630 
+ 631  632  633  634  635  636  637  638  639  640  641  642  643  644  645 
+ 646  647  648 
+[ r_1 ]
+   1    2    3 
+[ r_2 ]
+   4    5    6 
+[ r_3 ]
+   7    8    9