Pull and AWH exact continuation tests
authorPascal Merz <pascal.merz@me.com>
Fri, 4 Jun 2021 15:47:20 +0000 (15:47 +0000)
committerArtem Zhmurov <zhmurov@gmail.com>
Fri, 4 Jun 2021 15:47:20 +0000 (15:47 +0000)
src/programs/mdrun/tests/exactcontinuation.cpp
src/testutils/include/testutils/simulationdatabase.h
src/testutils/simulationdatabase.cpp

index ef9af92b409784b34ef2755db76c47525bf69873..b2fb64833b71b7dcf6e7a70f444d61371cd004a4 100644 (file)
@@ -332,7 +332,7 @@ void runTest(TestFileManager*            fileManager,
  * \todo Add FEP case. */
 class MdrunNoAppendContinuationIsExact :
     public MdrunTestFixture,
-    public ::testing::WithParamInterface<std::tuple<std::string, std::string, std::string, std::string>>
+    public ::testing::WithParamInterface<std::tuple<std::string, std::string, std::string, std::string, MdpParameterDatabase>>
 {
 public:
     //! Constructor
@@ -350,11 +350,12 @@ public:
 
 TEST_P(MdrunNoAppendContinuationIsExact, WithinTolerances)
 {
-    auto params              = GetParam();
-    auto simulationName      = std::get<0>(params);
-    auto integrator          = std::get<1>(params);
-    auto temperatureCoupling = std::get<2>(params);
-    auto pressureCoupling    = std::get<3>(params);
+    auto params                  = GetParam();
+    auto simulationName          = std::get<0>(params);
+    auto integrator              = std::get<1>(params);
+    auto temperatureCoupling     = std::get<2>(params);
+    auto pressureCoupling        = std::get<3>(params);
+    auto additionalMdpParameters = std::get<4>(params);
 
     // Check for unimplemented functionality
     // TODO: Update this as modular simulator gains functionality
@@ -387,7 +388,8 @@ TEST_P(MdrunNoAppendContinuationIsExact, WithinTolerances)
     auto mdpFieldValues = prepareMdpFieldValues(simulationName.c_str(),
                                                 integrator.c_str(),
                                                 temperatureCoupling.c_str(),
-                                                pressureCoupling.c_str());
+                                                pressureCoupling.c_str(),
+                                                additionalMdpParameters);
     // The exact lambda state choice is unimportant, so long as there
     // is one when using an FEP input.
     mdpFieldValues["init-lambda-state"] = "3";
@@ -417,9 +419,19 @@ TEST_P(MdrunNoAppendContinuationIsExact, WithinTolerances)
 
     if (temperatureCoupling != "no" || pressureCoupling != "no")
     {
-        energyTermsToCompare.insert({ interaction_function[F_ECONSERVED].longname,
-                                      relativeToleranceAsPrecisionDependentUlp(
-                                              10.0, ulpToleranceInMixed, ulpToleranceInDouble) });
+        if (simulationName == "alanine_vacuo")
+        {
+            // This is slightly less reproducible
+            energyTermsToCompare.insert({ interaction_function[F_ECONSERVED].longname,
+                                          relativeToleranceAsPrecisionDependentUlp(
+                                                  10.0, ulpToleranceInMixed * 2, ulpToleranceInDouble) });
+        }
+        else
+        {
+            energyTermsToCompare.insert({ interaction_function[F_ECONSERVED].longname,
+                                          relativeToleranceAsPrecisionDependentUlp(
+                                                  10.0, ulpToleranceInMixed, ulpToleranceInDouble) });
+        }
     }
 
     if (pressureCoupling == "parrinello-rahman")
@@ -450,14 +462,16 @@ INSTANTIATE_TEST_CASE_P(
         ::testing::Combine(::testing::Values("argon12", "spc2", "alanine_vsite_vacuo"),
                            ::testing::Values("md", "md-vv", "bd", "sd"),
                            ::testing::Values("no"),
-                           ::testing::Values("no")));
+                           ::testing::Values("no"),
+                           ::testing::Values(MdpParameterDatabase::Default)));
 
 INSTANTIATE_TEST_CASE_P(NormalIntegratorsWithFEP,
                         MdrunNoAppendContinuationIsExact,
                         ::testing::Combine(::testing::Values("nonanol_vacuo"),
                                            ::testing::Values("md", "md-vv", "bd", "sd"),
                                            ::testing::Values("no"),
-                                           ::testing::Values("no")));
+                                           ::testing::Values("no"),
+                                           ::testing::Values(MdpParameterDatabase::Default)));
 
 INSTANTIATE_TEST_CASE_P(
         NVT,
@@ -465,7 +479,8 @@ INSTANTIATE_TEST_CASE_P(
         ::testing::Combine(::testing::Values("argon12"),
                            ::testing::Values("md", "md-vv"),
                            ::testing::Values("berendsen", "v-rescale", "nose-hoover"),
-                           ::testing::Values("no")));
+                           ::testing::Values("no"),
+                           ::testing::Values(MdpParameterDatabase::Default)));
 
 INSTANTIATE_TEST_CASE_P(
         NPH,
@@ -473,7 +488,8 @@ INSTANTIATE_TEST_CASE_P(
         ::testing::Combine(::testing::Values("argon12"),
                            ::testing::Values("md", "md-vv"),
                            ::testing::Values("no"),
-                           ::testing::Values("berendsen", "parrinello-rahman", "C-rescale")));
+                           ::testing::Values("berendsen", "parrinello-rahman", "C-rescale"),
+                           ::testing::Values(MdpParameterDatabase::Default)));
 
 INSTANTIATE_TEST_CASE_P(
         NPT,
@@ -481,14 +497,32 @@ INSTANTIATE_TEST_CASE_P(
         ::testing::Combine(::testing::Values("argon12"),
                            ::testing::Values("md", "md-vv"),
                            ::testing::Values("berendsen", "v-rescale", "nose-hoover"),
-                           ::testing::Values("berendsen", "parrinello-rahman", "C-rescale")));
+                           ::testing::Values("berendsen", "parrinello-rahman", "C-rescale"),
+                           ::testing::Values(MdpParameterDatabase::Default)));
 
 INSTANTIATE_TEST_CASE_P(MTTK,
                         MdrunNoAppendContinuationIsExact,
                         ::testing::Combine(::testing::Values("argon12"),
                                            ::testing::Values("md-vv"),
                                            ::testing::Values("nose-hoover"),
-                                           ::testing::Values("mttk")));
+                                           ::testing::Values("mttk"),
+                                           ::testing::Values(MdpParameterDatabase::Default)));
+
+INSTANTIATE_TEST_CASE_P(Pull,
+                        MdrunNoAppendContinuationIsExact,
+                        ::testing::Combine(::testing::Values("spc2"),
+                                           ::testing::Values("md", "md-vv"),
+                                           ::testing::Values("no"),
+                                           ::testing::Values("no"),
+                                           ::testing::Values(MdpParameterDatabase::Pull)));
+
+INSTANTIATE_TEST_CASE_P(Awh,
+                        MdrunNoAppendContinuationIsExact,
+                        ::testing::Combine(::testing::Values("alanine_vacuo"),
+                                           ::testing::Values("md", "md-vv"),
+                                           ::testing::Values("v-rescale"),
+                                           ::testing::Values("no"),
+                                           ::testing::Values(MdpParameterDatabase::Awh)));
 
 #endif
 
index 02bdc7886bfa0077be7ae3de10c06bc58de53b2d..5ee1976c2aed580fc77baacac85b061ad90aa680 100644 (file)
@@ -66,6 +66,15 @@ std::string reportNumbersOfPpRanksSupported(const std::string& simulationName);
 //! Helper typedef
 using MdpFieldValues = std::map<std::string, std::string>;
 
+//! Strong type denoting mdp parameters needed to test specific algorithms
+enum class MdpParameterDatabase
+{
+    Default,
+    Pull,
+    Awh,
+    Count
+};
+
 /*! \brief Set up values for an .mdp file that permits a highly
  * reproducible simulation.
  *
@@ -92,24 +101,27 @@ using MdpFieldValues = std::map<std::string, std::string>;
  * volume over the handful of MD steps that will be run. A
  * single temperature-coupling group is used.
  *
- * \param[in]    simulationName   The name of the simulation, which indexes the database
- * \param[in]    integrator       The integrator to use
- * \param[in]    tcoupl           The temperature-coupling algorithm to use
- * \param[in]    pcoupl           The pressure-coupling algorithm to use
- * \return                        Mdp file values
+ * \param[in]  simulationName           The name of the simulation, which indexes the database
+ * \param[in]  integrator               The integrator to use
+ * \param[in]  tcoupl                   The temperature-coupling algorithm to use
+ * \param[in]  pcoupl                   The pressure-coupling algorithm to use
+ * \param[in]  additionalMdpParameters  Additional mdp parameters to be added
+ * \return                              Mdp file values
  *
  * \throws  std::bad_alloc     if out of memory
  *          std::out_of_range  if \c simulationName is not in the database */
 MdpFieldValues prepareMdpFieldValues(const std::string& simulationName,
                                      const std::string& integrator,
                                      const std::string& tcoupl,
-                                     const std::string& pcoupl);
+                                     const std::string& pcoupl,
+                                     MdpParameterDatabase additionalMdpParameters = MdpParameterDatabase::Default);
 
 //! \copydoc prepareMdpFieldValues()
 MdpFieldValues prepareMdpFieldValues(const char* simulationName,
                                      const char* integrator,
                                      const char* tcoupl,
-                                     const char* pcoupl);
+                                     const char* pcoupl,
+                                     MdpParameterDatabase additionalMdpParameters = MdpParameterDatabase::Default);
 
 /*! \brief Make a string containing an .mdp file from the \c mdpFieldValues.
  *
index 1a948a62590b9925aef07d22c9502982c96dfc40..36ac5ad86fdf3ef3f9bc0807b26a737342a6d8b5 100644 (file)
@@ -181,6 +181,65 @@ const MdpFileValues mdpFileValueDatabase_g{
     { "vsite_test", { {}, { 1, 2, 3, 4, 5, 6, 7, 8, 9 } } },
 };
 
+//! Helper typedef for mdp database
+using MdpDatabase = std::map<MdpParameterDatabase, MdpFieldValues>;
+//! Database of additional mdp options used for specific algorithms
+const MdpDatabase c_additionalMdpOptions{ { MdpParameterDatabase::Default, {} },
+                                          { MdpParameterDatabase::Pull,
+                                            { { "coulombtype", "reaction-field" },
+                                              { "pull", "yes" },
+                                              // Prev step reference is checkpointed - rest of pull is not cpt-dependent
+                                              { "pull-pbc-ref-prev-step-com", "yes" },
+                                              { "pull-ngroups", "2" },
+                                              { "pull-group1-name", "FirstWaterMolecule" },
+                                              { "pull-group2-name", "SecondWaterMolecule" },
+                                              { "pull-ncoords", "1" },
+                                              { "pull-coord1-type", "umbrella" },
+                                              { "pull-coord1-geometry", "distance" },
+                                              { "pull-coord1-groups", "1 2" },
+                                              { "pull-coord1-init", "1" },
+                                              { "pull-coord1-k", "10000" } } },
+                                          { MdpParameterDatabase::Awh,
+                                            { { "pull", "yes" },
+                                              { "pull-ngroups", "5" },
+                                              { "pull-ncoords", "2" },
+                                              { "pull-group1-name", "C_&_r_1" },
+                                              { "pull-group2-name", "N_&_r_2" },
+                                              { "pull-group3-name", "CA" },
+                                              { "pull-group4-name", "C_&_r_2" },
+                                              { "pull-group5-name", "N_&_r_3" },
+                                              { "pull-coord1-geometry", "dihedral" },
+                                              { "pull-coord1-groups", "1 2 2 3 3 4" },
+                                              { "pull-coord1-k", "4000" },
+                                              { "pull-coord1-kB", "1000" },
+                                              { "pull-coord2-geometry", "dihedral" },
+                                              { "pull-coord2-groups", "2 3 3 4 4 5" },
+                                              { "pull-coord2-k", "4000" },
+                                              { "pull-coord2-kB", "1000" },
+                                              { "pull-coord1-type", "external-potential" },
+                                              { "pull-coord1-potential-provider", "awh" },
+                                              { "pull-coord2-type", "external-potential" },
+                                              { "pull-coord2-potential-provider", "awh" },
+                                              { "awh", "yes" },
+                                              { "awh-potential", "convolved" },
+                                              { "awh-nstout", "4" },
+                                              { "awh-nstsample", "4" },
+                                              { "awh-nsamples-update", "1" },
+                                              { "awh-share-multisim", "no" },
+                                              { "awh-nbias", "2" },
+                                              { "awh1-ndim", "1" },
+                                              { "awh1-dim1-coord-index", "2" },
+                                              { "awh1-dim1-start", "150" },
+                                              { "awh1-dim1-end", "180" },
+                                              { "awh1-dim1-force-constant", "4000" },
+                                              { "awh1-dim1-diffusion", "0.1" },
+                                              { "awh2-ndim", "1" },
+                                              { "awh2-dim1-coord-index", "1" },
+                                              { "awh2-dim1-start", "178" },
+                                              { "awh2-dim1-end", "-178" },
+                                              { "awh2-dim1-force-constant", "4000" },
+                                              { "awh2-dim1-diffusion", "0.1" } } } };
+
 /*! \brief Prepare default .mdp values
  *
  * Insert suitable .mdp defaults, so that \c mdpFileValueDatabase_g
@@ -251,10 +310,11 @@ std::string reportNumbersOfPpRanksSupported(const std::string& simulationName)
             std::begin(possibleNumbers), std::end(possibleNumbers), ",", StringFormatter("%d"));
 }
 
-MdpFieldValues prepareMdpFieldValues(const std::string& simulationName,
-                                     const std::string& integrator,
-                                     const std::string& tcoupl,
-                                     const std::string& pcoupl)
+MdpFieldValues prepareMdpFieldValues(const std::string&   simulationName,
+                                     const std::string&   integrator,
+                                     const std::string&   tcoupl,
+                                     const std::string&   pcoupl,
+                                     MdpParameterDatabase additionalMdpParameters)
 {
     using MdpField = MdpFieldValues::value_type;
 
@@ -262,15 +322,22 @@ MdpFieldValues prepareMdpFieldValues(const std::string& simulationName,
     mdpFieldValues.insert(MdpField("integrator", integrator));
     mdpFieldValues.insert(MdpField("tcoupl", tcoupl));
     mdpFieldValues.insert(MdpField("pcoupl", pcoupl));
+    for (const auto& mdpField : c_additionalMdpOptions.at(additionalMdpParameters))
+    {
+        mdpFieldValues.insert(mdpField);
+    }
+
     return mdpFieldValues;
 }
 
-MdpFieldValues prepareMdpFieldValues(const char* simulationName,
-                                     const char* integrator,
-                                     const char* tcoupl,
-                                     const char* pcoupl)
+MdpFieldValues prepareMdpFieldValues(const char*          simulationName,
+                                     const char*          integrator,
+                                     const char*          tcoupl,
+                                     const char*          pcoupl,
+                                     MdpParameterDatabase additionalMdpParameters)
 {
-    return prepareMdpFieldValues(std::string(simulationName), integrator, tcoupl, pcoupl);
+    return prepareMdpFieldValues(
+            std::string(simulationName), integrator, tcoupl, pcoupl, additionalMdpParameters);
 }
 std::string prepareMdpFileContents(const MdpFieldValues& mdpFieldValues)
 {