EXPECT_EQ(0, runner->callGrompp(caller));
}
+ const std::string splitPoint = std::to_string(std::stoi(mdpFieldValues.at("nsteps")) / 2);
+
// prepare the .tpr file for the first part of the two-part run
{
// TODO evolve grompp to report the number of warnings issued, so
caller.addOption("-maxwarn", maxWarningsTolerated);
runner->useTopGroAndNdxFromDatabase(simulationName);
auto firstPartMdpFieldValues = mdpFieldValues;
- firstPartMdpFieldValues["nsteps"] = std::to_string(std::stoi(mdpFieldValues.at("nsteps")) / 2);
+ firstPartMdpFieldValues["nsteps"] = splitPoint;
runner->useStringAsMdpFile(prepareMdpFileContents(firstPartMdpFieldValues));
runner->tprFileName_ = firstPartRunTprFileName;
EXPECT_EQ(0, runner->callGrompp(caller));
runner->edrFileName_ = fullRunEdrFileName;
CommandLine fullRunCaller;
fullRunCaller.append("mdrun");
+ /* Force neighborlist update at the beginning of the second half of the trajectory.
+ * Doing so through CLI options prevents pairlist tuning from changing it. */
+ fullRunCaller.addOption("-nstlist", splitPoint);
ASSERT_EQ(0, runner->callMdrun(fullRunCaller));
}
mdpFieldValues["init-lambda-state"] = "3";
mdpFieldValues["nsteps"] = "16";
- // Forces on GPUs are generally not reproducible enough for a tight
- // tolerance. Similarly, the propagation of sd and bd are not as
+ // Forces and update on GPUs are generally not reproducible enough for a tight
+ // tolerance. Similarly, the propagation of bd is not as
// reproducible as the others. So we use several ULP tolerance
// in all cases. This is looser than needed e.g. for md and md-vv
// with forces on CPUs, but there is no real risk of a bug with
// those propagators that would only be caught with a tighter
// tolerance in this particular test.
- int ulpToleranceInMixed = 32;
+ int ulpToleranceInMixed = 128;
int ulpToleranceInDouble = 64;
if (integrator == "bd")
{