#include "gromacs/topology/topology.h"
+#include "testutils/loggertest.h"
#include "testutils/testasserts.h"
namespace gmx
/* TODO: Actually initialize moltype.atoms.atom when this is converted to C++ */
+/*! \brief Returns a flexible ethane united-atom molecule */
+gmx_moltype_t flexibleEthaneUA()
+{
+ gmx_moltype_t moltype = {};
+
+ moltype.atoms.nr = 2;
+ moltype.ilist[F_BONDS].iatoms = { 0, 0, 1 };
+
+ return moltype;
+}
+
/*! \brief Returns an ethane united-atom molecule */
gmx_moltype_t ethaneUA()
{
return moltype;
}
-/*! \brief Returns a butane united-atom molecule */
+/*! \brief Returns a butane fully-constrained united-atom molecule */
gmx_moltype_t butaneUA()
{
gmx_moltype_t moltype = {};
gmx_mtop_t mtop_;
//! Default temperature for tests
real temperature_ = 298;
+ //! Logger to use in tests
+ test::LoggerTestHelper logHelper_;
};
TEST_F(UpdateGroupsTest, WithEthaneUA)
real maxRadius = computeMaxUpdateGroupRadius(mtop_, updateGroupingsPerMoleculeType, temperature_);
EXPECT_FLOAT_EQ(maxRadius, 0.3 / 2);
+
+ logHelper_.expectNoEntries(MDLogger::LogLevel::Info);
+ UpdateGroups updateGroups = makeUpdateGroups(
+ logHelper_.logger(), std::move(updateGroupingsPerMoleculeType), maxRadius, true, true, 1e6_real);
}
TEST_F(UpdateGroupsTest, WithMethane)
real maxRadius = computeMaxUpdateGroupRadius(mtop_, updateGroupingsPerMoleculeType, temperature_);
EXPECT_FLOAT_EQ(maxRadius, 0.14);
+
+ logHelper_.expectNoEntries(MDLogger::LogLevel::Info);
+ UpdateGroups updateGroups = makeUpdateGroups(
+ logHelper_.logger(), std::move(updateGroupingsPerMoleculeType), maxRadius, true, true, 1e6_real);
}
+
TEST_F(UpdateGroupsTest, WithEthane)
{
mtop_.moltype.emplace_back(ethane());
real maxRadius = computeMaxUpdateGroupRadius(mtop_, updateGroupingsPerMoleculeType, temperature_);
EXPECT_FLOAT_EQ(maxRadius, 0.094746813);
+
+ logHelper_.expectNoEntries(MDLogger::LogLevel::Info);
+ UpdateGroups updateGroups = makeUpdateGroups(
+ logHelper_.logger(), std::move(updateGroupingsPerMoleculeType), maxRadius, true, true, 1e6_real);
}
TEST_F(UpdateGroupsTest, CheckRadiusCalculationAtDifferentTemperaturesWithEthane)
EXPECT_FLOAT_EQ(maxRadius, 0.125);
}
-TEST_F(UpdateGroupsTest, WithButaneUA)
+TEST_F(UpdateGroupsTest, WithButaneUALogsThatUnsuitableForUpdateGroups)
{
mtop_.moltype.emplace_back(butaneUA());
{
auto updateGroupingsPerMoleculeType = gmx::makeUpdateGroupingsPerMoleculeType(mtop_);
EXPECT_EQ(updateGroupingsPerMoleculeType.size(), 0);
+
+ real maxRadius = computeMaxUpdateGroupRadius(mtop_, updateGroupingsPerMoleculeType, temperature_);
+ EXPECT_FLOAT_EQ(maxRadius, 0.0);
+
+ logHelper_.expectEntryMatchingRegex(
+ MDLogger::LogLevel::Info,
+ "At least one moleculetype does not conform to the requirements");
+ UpdateGroups updateGroups = makeUpdateGroups(
+ logHelper_.logger(), std::move(updateGroupingsPerMoleculeType), maxRadius, true, true, 1e6_real);
}
TEST_F(UpdateGroupsTest, WithWaterThreeSite)
real maxRadius = computeMaxUpdateGroupRadius(mtop_, updateGroupingsPerMoleculeType, temperature_);
EXPECT_FLOAT_EQ(maxRadius, 0.083887339);
+
+ logHelper_.expectNoEntries(MDLogger::LogLevel::Info);
+ UpdateGroups updateGroups = makeUpdateGroups(
+ logHelper_.logger(), std::move(updateGroupingsPerMoleculeType), maxRadius, true, true, 1e6_real);
}
// Tests update group with virtual site
ASSERT_EQ(updateGroupingsPerMoleculeType.size(), 1);
EXPECT_EQ(updateGroupingsPerMoleculeType[0].numBlocks(), 1);
+
+ real maxRadius = computeMaxUpdateGroupRadius(mtop_, updateGroupingsPerMoleculeType, temperature_);
+ EXPECT_FLOAT_EQ(maxRadius, 0.083887339);
+
+ logHelper_.expectNoEntries(MDLogger::LogLevel::Info);
+ UpdateGroups updateGroups = makeUpdateGroups(
+ logHelper_.logger(), std::move(updateGroupingsPerMoleculeType), maxRadius, true, true, 1e6_real);
}
TEST_F(UpdateGroupsTest, WithFourAtomsWithSettle)
{
mtop_.moltype.emplace_back(waterThreeSite());
mtop_.moltype.back().atoms.nr = 4;
+ {
+ t_iparams iparams[2];
+ iparams[0].settle = { 0.1, 0.1633 };
+ iparams[1].vsite = { 0.128, 0.128 };
+ mtop_.ffparams.iparams.push_back(iparams[0]);
+ mtop_.ffparams.iparams.push_back(iparams[1]);
+ }
auto updateGroupingsPerMoleculeType = gmx::makeUpdateGroupingsPerMoleculeType(mtop_);
ASSERT_EQ(updateGroupingsPerMoleculeType.size(), 1);
EXPECT_EQ(updateGroupingsPerMoleculeType[0].numBlocks(), 2);
+
+ real maxRadius = computeMaxUpdateGroupRadius(mtop_, updateGroupingsPerMoleculeType, temperature_);
+ EXPECT_FLOAT_EQ(maxRadius, 0.083887339);
+
+ logHelper_.expectNoEntries(MDLogger::LogLevel::Info);
+ UpdateGroups updateGroups = makeUpdateGroups(
+ logHelper_.logger(), std::move(updateGroupingsPerMoleculeType), maxRadius, true, true, 1e6_real);
}
// Tests groups with two constraints and an angle potential
real maxRadius = computeMaxUpdateGroupRadius(mtop_, updateGroupingsPerMoleculeType, temperature_);
EXPECT_FLOAT_EQ(maxRadius, 0.090824135);
+
+ logHelper_.expectNoEntries(MDLogger::LogLevel::Info);
+ UpdateGroups updateGroups = makeUpdateGroups(
+ logHelper_.logger(), std::move(updateGroupingsPerMoleculeType), maxRadius, true, true, 1e6_real);
}
TEST_F(UpdateGroupsTest, CheckRadiusCalculationAtDifferentTemperaturesWithWaterFlexAngle)
ASSERT_EQ(updateGroupingsPerMoleculeType.size(), 2);
EXPECT_EQ(updateGroupingsPerMoleculeType[0].numBlocks(), 1);
EXPECT_EQ(updateGroupingsPerMoleculeType[1].numBlocks(), 1);
+
+ real maxRadius = computeMaxUpdateGroupRadius(mtop_, updateGroupingsPerMoleculeType, temperature_);
+ EXPECT_FLOAT_EQ(maxRadius, 0.14);
+
+ logHelper_.expectNoEntries(MDLogger::LogLevel::Info);
+ UpdateGroups updateGroups = makeUpdateGroups(
+ logHelper_.logger(), std::move(updateGroupingsPerMoleculeType), maxRadius, true, true, 1e6_real);
+}
+
+TEST_F(UpdateGroupsTest, LogsWhenSizesAreInvalid)
+{
+ mtop_.moltype.emplace_back(methane());
+ {
+ t_iparams iparams;
+ iparams.constr = { 0.1, 0.1 };
+ mtop_.ffparams.iparams.push_back(iparams);
+ }
+
+ auto updateGroupingsPerMoleculeType = gmx::makeUpdateGroupingsPerMoleculeType(mtop_);
+ logHelper_.expectEntryMatchingRegex(MDLogger::LogLevel::Info,
+ "The combination of rlist and box size prohibits");
+ UpdateGroups updateGroups = makeUpdateGroups(
+ logHelper_.logger(), std::move(updateGroupingsPerMoleculeType), 1e9_real, true, true, 1e6_real);
}
+TEST_F(UpdateGroupsTest, LogsWhenUpdateGroupsAreNotUseful)
+{
+ mtop_.moltype.emplace_back(flexibleEthaneUA());
+ {
+ t_iparams iparams;
+ iparams.harmonic = { 0.1, 10.0, 0.1, 10.0 };
+ mtop_.ffparams.iparams.push_back(iparams);
+ }
+
+ auto updateGroupingsPerMoleculeType = gmx::makeUpdateGroupingsPerMoleculeType(mtop_);
+
+ ASSERT_EQ(updateGroupingsPerMoleculeType.size(), 1);
+ EXPECT_EQ(updateGroupingsPerMoleculeType[0].numBlocks(), 2);
+
+ real maxRadius = computeMaxUpdateGroupRadius(mtop_, updateGroupingsPerMoleculeType, temperature_);
+ EXPECT_FLOAT_EQ(maxRadius, 0);
+
+ logHelper_.expectEntryMatchingRegex(MDLogger::LogLevel::Info,
+ "No constraints or virtual sites are in use");
+ UpdateGroups updateGroups = makeUpdateGroups(
+ logHelper_.logger(), std::move(updateGroupingsPerMoleculeType), maxRadius, true, false, 1e6_real);
+}
+
+
} // namespace
} // namespace gmx