* \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
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
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";
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")
::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,
::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,
::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,
::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
//! 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.
*
* 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.
*
{ "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
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;
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)
{