Fix dHdl and foreign energy clearing at checkpointing
authorBerk Hess <hess@kth.se>
Mon, 9 Nov 2020 20:37:31 +0000 (21:37 +0100)
committerPaul Bauer <paul.bauer.q@gmail.com>
Tue, 10 Nov 2020 08:54:45 +0000 (08:54 +0000)
The code copying dH/dl and foreign lambda energies to the checkpoint
data structures copied the wrong way around leading to zero values
being written to energy file for steps in between the last energy
frame and the checkpoint.

Fixes #3763

docs/release-notes/2020/2020.5.rst
src/gromacs/mdlib/mdebin_bar.cpp

index 76caa756f75f80fad4ee147a2d1fa70a03fa20cd..5b4ac5b5af0868034ee5805b4e09d055aa78ea7b 100644 (file)
@@ -16,6 +16,17 @@ in the :ref:`release-notes`.
 Fixes where mdrun could behave incorrectly
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
+Fix mdrun writing zero dH/dlambda and foreign lambda energies before checkpointing
+""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+With free-energy runs with separate-dhdl-file=no and nstdhdl not a multiple of
+nstenergy, mdrun would write zeros for dH/dlambda and foreign energies to
+the energy file for steps between the last energy frame and the checkpoint.
+This would lead to errors in free-energy estimates which could go unnoticed
+as values only deviate for a few steps.
+
+:issue:`3763`
+
 Fixed bugs with COM pulling and domain decompostion with weight or >32 ranks
 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 
index a0db60909977cca9e8698b79871310818362bda6..4589a85683fa4177f7c215ad53196b6ee0379128 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.
@@ -729,7 +730,7 @@ void mde_delta_h_coll_update_energyhistory(const t_mde_delta_h_coll* dhc, energy
     {
         std::vector<real>& dh = deltaH->dh[i];
         dh.resize(dhc->dh[i].ndh);
-        std::copy(dh.begin(), dh.end(), dhc->dh[i].dh);
+        std::copy(dhc->dh[i].dh, dhc->dh[i].dh + dhc->dh[i].ndh, dh.begin());
     }
     deltaH->start_time   = dhc->start_time;
     deltaH->start_lambda = dhc->start_lambda;