Fix dispersion correction table generation
authorBerk Hess <hess@kth.se>
Mon, 28 Sep 2020 14:24:26 +0000 (14:24 +0000)
committerMark Abraham <mark.j.abraham@gmail.com>
Mon, 28 Sep 2020 14:24:26 +0000 (14:24 +0000)
Dispersion correction table generation was incorrectly skipped
during PME tuning, which lead to an assertion failure with LJ-PME.

Fixes #3677

docs/release-notes/2020/2020.4.rst
src/gromacs/tables/forcetable.cpp
src/programs/mdrun/tests/CMakeLists.txt
src/programs/mdrun/tests/dispersion_correction.cpp [new file with mode: 0644]

index 603b9ff506db40bc5ceffadbc5c1216f1c4920c7..6479820ee8eb4bb9ca93b1f5cc6590ef2c4d92e3 100644 (file)
@@ -34,6 +34,14 @@ due to illegal or incorrect memory usage.
 
 :issue:`3635`
 
+Fix assertion failure with LJ-PME and dispersion correction
+"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+
+With vdw-type=PME and dispersion correction, mdrun would exit with
+an assertion failure during PME tuning.
+
+:issue:`3677`
+
 Fixes for ``gmx`` tools
 ^^^^^^^^^^^^^^^^^^^^^^^
 
index f6685133661a68808b24049a9a4cc26dec554918..5d1834ee947ae31a553e6e59e03f0be2da55bbcb 100644 (file)
@@ -3,7 +3,8 @@
  *
  * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
  * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015,2016,2017,2018,2019, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016,2017 by the GROMACS development team.
+ * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -1466,11 +1467,6 @@ makeDispersionCorrectionTable(FILE* fp, const interaction_const_t* ic, real rtab
     GMX_RELEASE_ASSERT(ic->vdwtype != evdwUSER || tabfn,
                        "With VdW user tables we need a table file name");
 
-    if (tabfn == nullptr)
-    {
-        return std::unique_ptr<t_forcetable>(nullptr);
-    }
-
     t_forcetable* fullTable = make_tables(fp, ic, tabfn, rtab, 0);
     /* Copy the contents of the table to one that has just dispersion
      * and repulsion, to improve cache performance. We want the table
index 6b15556a6dae1feb2b7addebecd63e5ad4dd579a..9ba03c04fc8d9d1dbc1c54c9df9ac052c2acbd0e 100644 (file)
@@ -97,6 +97,7 @@ set(exename "mdrun-test")
 
 gmx_add_gtest_executable(
     ${exename}
+    dispersion_correction.cpp
     orires.cpp
     pmetest.cpp
     simulator.cpp
diff --git a/src/programs/mdrun/tests/dispersion_correction.cpp b/src/programs/mdrun/tests/dispersion_correction.cpp
new file mode 100644 (file)
index 0000000..eaabf4e
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 2020, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+
+/*! \internal \file
+ * \brief
+ * Test for MD with dispersion correction.
+ *
+ * \author Paul Bauer <paul.bauer.q@gmail.com>
+ * \ingroup module_mdrun_integration_tests
+ */
+#include "gmxpre.h"
+
+#include "moduletest.h"
+
+namespace gmx
+{
+namespace test
+{
+
+class DispersionCorrectionTestFixture : public MdrunTestFixture
+{
+protected:
+    DispersionCorrectionTestFixture();
+    ~DispersionCorrectionTestFixture() override;
+};
+
+DispersionCorrectionTestFixture::DispersionCorrectionTestFixture() {}
+
+DispersionCorrectionTestFixture::~DispersionCorrectionTestFixture() {}
+
+//! Test fixture for mdrun with dispersion correction
+typedef gmx::test::DispersionCorrectionTestFixture DispersionCorrectionTest;
+
+/* Check whether the dispersion correction function works. */
+TEST_F(DispersionCorrectionTest, DispersionCorrectionCanRun)
+{
+    runner_.useTopGroAndNdxFromDatabase("alanine_vsite_vacuo");
+    const std::string mdpContents = R"(
+        dt            = 0.002
+        nsteps        = 200
+        tcoupl        = Berendsen
+        tc-grps       = System
+        tau-t         = 0.5
+        ref-t         = 300
+        constraints   = h-bonds
+        cutoff-scheme = Verlet
+        DispCorr      = AllEnerPres
+    )";
+    runner_.useStringAsMdpFile(mdpContents);
+
+    EXPECT_EQ(0, runner_.callGrompp());
+
+    ::gmx::test::CommandLine disperCorrCaller;
+
+    // Do an mdrun with ORIRES enabled
+    ASSERT_EQ(0, runner_.callMdrun(disperCorrCaller));
+}
+
+} // namespace test
+} // namespace gmx