Refactor mdrun integration tests
[alexxy/gromacs.git] / src / programs / mdrun / tests / moduletest.cpp
index 91320d5f20871b05a89291e2d265a1b9efdee0b9..1e8a6373c5530d0c502e3910693e79ecef50440b 100644 (file)
  * \author Mark Abraham <mark.j.abraham@gmail.com>
  * \ingroup module_mdrun
  */
+#include "gmxpre.h"
+
 #include "moduletest.h"
 
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
+#include "config.h"
 
-#include "testutils/integrationtests.h"
-#include "testutils/testoptions.h"
-#include "testutils/cmdlinetest.h"
-#include "gromacs/options/options.h"
+#include "gromacs/gmxpreprocess/grompp.h"
 #include "gromacs/options/basicoptions.h"
+#include "gromacs/options/options.h"
+#include "gromacs/utility/basedefinitions.h"
+#include "gromacs/utility/basenetwork.h"
 #include "gromacs/utility/file.h"
-#include "gromacs/legacyheaders/network.h"
-#include "gromacs/legacyheaders/types/simple.h"
 #include "programs/mdrun/mdrun_main.h"
-#include "programs/gmx/legacycmainfunctions.h"
+
+#include "testutils/cmdlinetest.h"
+#include "testutils/integrationtests.h"
+#include "testutils/testoptions.h"
 
 namespace gmx
 {
@@ -65,144 +66,180 @@ namespace test
  * MdrunTestFixture
  */
 
-
-/*! /brief Number of tMPI threads for child mdrun call */
-static int gmx_unused numThreads = 1;
-/*! /brief Number of OpenMP threads for child mdrun call */
-static int gmx_unused numOpenMPThreads = 1;
-
 namespace
 {
 
+#if defined(GMX_THREAD_MPI) || defined(DOXYGEN)
+//! Number of tMPI threads for child mdrun call.
+int g_numThreads = 1;
+#endif
+#if defined(GMX_OPENMP) || defined(DOXYGEN)
+//! Number of OpenMP threads for child mdrun call.
+int g_numOpenMPThreads = 1;
+#endif
+//! \cond
 GMX_TEST_OPTIONS(MdrunTestOptions, options)
 {
     GMX_UNUSED_VALUE(options);
 #ifdef GMX_THREAD_MPI
-    options->addOption(IntegerOption("nt").store(&numThreads)
-                           .description("Number of thread-MPI threads/ranks for child mdrun call"));
+    options->addOption(IntegerOption("nt").store(&g_numThreads)
+                           .description("Number of thread-MPI threads/ranks for child mdrun calls"));
 #endif
 #ifdef GMX_OPENMP
-    options->addOption(IntegerOption("nt_omp").store(&numOpenMPThreads)
-                           .description("Number of OpenMP threads for child mdrun call"));
+    options->addOption(IntegerOption("nt_omp").store(&g_numOpenMPThreads)
+                           .description("Number of OpenMP threads for child mdrun calls"));
 #endif
 }
+//! \endcond
 
 }
 
-MdrunTestFixture::MdrunTestFixture() :
-    topFileName(),
-    groFileName(),
-    fullPrecisionTrajectoryFileName(),
-    ndxFileName(),
-    mdpInputFileName(fileManager_.getTemporaryFilePath("input.mdp")),
-    mdpOutputFileName(fileManager_.getTemporaryFilePath("output.mdp")),
-    tprFileName(fileManager_.getTemporaryFilePath(".tpr")),
-    logFileName(fileManager_.getTemporaryFilePath(".log")),
-    edrFileName(fileManager_.getTemporaryFilePath(".edr"))
+SimulationRunner::SimulationRunner(IntegrationTestFixture *fixture) :
+    fixture_(fixture),
+    topFileName_(),
+    groFileName_(),
+    fullPrecisionTrajectoryFileName_(),
+    ndxFileName_(),
+    mdpInputFileName_(fixture_->fileManager_.getTemporaryFilePath("input.mdp")),
+    mdpOutputFileName_(fixture_->fileManager_.getTemporaryFilePath("output.mdp")),
+    tprFileName_(fixture_->fileManager_.getTemporaryFilePath(".tpr")),
+    logFileName_(fixture_->fileManager_.getTemporaryFilePath(".log")),
+    edrFileName_(fixture_->fileManager_.getTemporaryFilePath(".edr")),
+    nsteps_(-2)
 {
 #ifdef GMX_LIB_MPI
     GMX_RELEASE_ASSERT(gmx_mpi_initialized(), "MPI system not initialized for mdrun tests");
 #endif
 }
 
-MdrunTestFixture::~MdrunTestFixture()
-{
-}
-
 // TODO The combination of defaulting to Verlet cut-off scheme, NVE,
 // and verlet-buffer-tolerance = -1 gives a grompp error. If we keep
 // things that way, this function should be renamed. For now,
 // force the use of the group scheme.
 void
-MdrunTestFixture::useEmptyMdpFile()
+SimulationRunner::useEmptyMdpFile()
 {
     useStringAsMdpFile("cutoff-scheme = Group\n");
 }
 
 void
-MdrunTestFixture::useStringAsMdpFile(const char *mdpString)
+SimulationRunner::useStringAsMdpFile(const char *mdpString)
 {
     useStringAsMdpFile(std::string(mdpString));
 }
 
 void
-MdrunTestFixture::useStringAsMdpFile(const std::string &mdpString)
+SimulationRunner::useStringAsMdpFile(const std::string &mdpString)
 {
-    gmx::File::writeFileFromString(mdpInputFileName, mdpString);
+    gmx::File::writeFileFromString(mdpInputFileName_, mdpString);
 }
 
 void
-MdrunTestFixture::useStringAsNdxFile(const char *ndxString)
+SimulationRunner::useStringAsNdxFile(const char *ndxString)
 {
-    gmx::File::writeFileFromString(ndxFileName, ndxString);
+    gmx::File::writeFileFromString(ndxFileName_, ndxString);
 }
 
 void
-MdrunTestFixture::useTopGroAndNdxFromDatabase(const char *name)
+SimulationRunner::useTopGroAndNdxFromDatabase(const char *name)
+{
+    topFileName_ = fixture_->fileManager_.getInputFilePath((std::string(name) + ".top").c_str());
+    groFileName_ = fixture_->fileManager_.getInputFilePath((std::string(name) + ".gro").c_str());
+    ndxFileName_ = fixture_->fileManager_.getInputFilePath((std::string(name) + ".ndx").c_str());
+}
+
+int
+SimulationRunner::callGromppOnThisRank()
 {
-    topFileName = fileManager_.getInputFilePath((std::string(name) + ".top").c_str());
-    groFileName = fileManager_.getInputFilePath((std::string(name) + ".gro").c_str());
-    ndxFileName = fileManager_.getInputFilePath((std::string(name) + ".ndx").c_str());
+    CommandLine caller;
+    caller.append("grompp");
+    caller.addOption("-f", mdpInputFileName_);
+    caller.addOption("-n", ndxFileName_);
+    caller.addOption("-p", topFileName_);
+    caller.addOption("-c", groFileName_);
+
+    caller.addOption("-po", mdpOutputFileName_);
+    caller.addOption("-o", tprFileName_);
+
+    return gmx_grompp(caller.argc(), caller.argv());
 }
 
 int
-MdrunTestFixture::callGrompp()
+SimulationRunner::callGrompp()
 {
 #ifdef GMX_LIB_MPI
-    // When compiled with external MPI, only call one instance of the grompp function
+    // When compiled with external MPI, only call one instance of the
+    // grompp function
     if (0 != gmx_node_rank())
     {
         return 0;
     }
 #endif
-
-    CommandLine caller;
-    caller.append("grompp");
-    caller.addOption("-f", mdpInputFileName);
-    caller.addOption("-n", ndxFileName);
-    caller.addOption("-p", topFileName);
-    caller.addOption("-c", groFileName);
-
-    caller.addOption("-po", mdpOutputFileName);
-    caller.addOption("-o", tprFileName);
-
-    return gmx_grompp(caller.argc(), caller.argv());
+    return callGromppOnThisRank();
 }
 
 int
-MdrunTestFixture::callMdrun(const CommandLine &callerRef)
+SimulationRunner::callMdrun(const CommandLine &callerRef)
 {
     /* Conforming to style guide by not passing a non-const reference
        to this function. Passing a non-const reference might make it
        easier to write code that incorrectly re-uses callerRef after
        the call to this function. */
     CommandLine caller(callerRef);
-    caller.addOption("-s", tprFileName);
+    caller.addOption("-s", tprFileName_);
+
+    caller.addOption("-g", logFileName_);
+    caller.addOption("-e", edrFileName_);
+    caller.addOption("-o", fullPrecisionTrajectoryFileName_);
+    caller.addOption("-x", reducedPrecisionTrajectoryFileName_);
 
-    caller.addOption("-g", logFileName);
-    caller.addOption("-e", edrFileName);
-    caller.addOption("-o", fullPrecisionTrajectoryFileName);
-    caller.addOption("-x", reducedPrecisionTrajectoryFileName);
+    caller.addOption("-deffnm", fixture_->fileManager_.getTemporaryFilePath("state"));
 
-    caller.addOption("-deffnm", fileManager_.getTemporaryFilePath("state"));
+    if (nsteps_ > -2)
+    {
+        caller.addOption("-nsteps", nsteps_);
+    }
 
 #ifdef GMX_THREAD_MPI
-    caller.addOption("-nt", numThreads);
+    caller.addOption("-nt", g_numThreads);
 #endif
 #ifdef GMX_OPENMP
-    caller.addOption("-ntomp", numOpenMPThreads);
+    caller.addOption("-ntomp", g_numOpenMPThreads);
 #endif
 
     return gmx_mdrun(caller.argc(), caller.argv());
 }
 
 int
-MdrunTestFixture::callMdrun()
+SimulationRunner::callMdrun()
 {
     CommandLine caller;
     caller.append("mdrun");
     return callMdrun(caller);
 }
 
+// ====
+
+MdrunTestFixtureBase::MdrunTestFixtureBase()
+{
+#ifdef GMX_LIB_MPI
+    GMX_RELEASE_ASSERT(gmx_mpi_initialized(), "MPI system not initialized for mdrun tests");
+#endif
+}
+
+MdrunTestFixtureBase::~MdrunTestFixtureBase()
+{
+}
+
+// ====
+
+MdrunTestFixture::MdrunTestFixture() : runner_(this)
+{
+}
+
+MdrunTestFixture::~MdrunTestFixture()
+{
+}
+
 } // namespace test
 } // namespace gmx