Fix multi-sim restart handling in corner cases
[gromacs.git] / src / gromacs / mdrunutility / handlerestart.h
blob3ff99de1b4c8891dc4439aac4c6d6f3dde3d45c4
1 /*
2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 2015,2016,2017,2018,2019, by the GROMACS development team, led by
5 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6 * and including many others, as listed in the AUTHORS file in the
7 * top-level source directory and at http://www.gromacs.org.
9 * GROMACS is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public License
11 * as published by the Free Software Foundation; either version 2.1
12 * of the License, or (at your option) any later version.
14 * GROMACS is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with GROMACS; if not, see
21 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 * If you want to redistribute modifications to GROMACS, please
25 * consider that scientific software is very special. Version
26 * control is crucial - bugs must be traceable. We will be happy to
27 * consider code for inclusion in the official distribution, but
28 * derived work must not be called official GROMACS. Details are found
29 * in the README & COPYING files - if they are missing, get the
30 * official version at http://www.gromacs.org.
32 * To help us fund GROMACS development, we humbly ask that you cite
33 * the research papers on the package. Check out http://www.gromacs.org.
35 /*! \defgroup module_mdrunutility Implementation of mdrun utility functionality
36 * \ingroup group_mdrun
38 * \brief This module contains code that implements general
39 * infrastructure for mdrun that does not suit any other module.
41 /*! \libinternal \file
43 * \brief This file declares functions for mdrun to call to manage the
44 * details of doing a restart (ie. reading checkpoints, appending
45 * output files).
47 * \todo There may be other code in runner.cpp etc. that can usefully
48 * live here
50 * \author Berk Hess <hess@kth.se>
51 * \author Erik Lindahl <erik@kth.se>
52 * \author Mark Abraham <mark.j.abraham@gmail.com>
54 * \inlibraryapi
55 * \ingroup module_mdrunutility
58 #ifndef GMX_MDRUNUTILITY_HANDLERESTART_H
59 #define GMX_MDRUNUTILITY_HANDLERESTART_H
61 #include "gromacs/mdrunutility/logging.h"
62 #include "gromacs/utility/basedefinitions.h"
64 struct gmx_multisim_t;
65 struct t_commrec;
66 struct t_filenm;
68 namespace gmx
71 enum class AppendingBehavior;
73 //! Enumeration for describing how mdrun is (re)starting
74 enum class StartingBehavior : int
76 //! Restarting with appending, if a checkpoint is supplied and other conditions are met.
77 RestartWithAppending,
78 //! Restarting without appending, when a checkpoint is supplied.
79 RestartWithoutAppending,
80 //! Not restarting
81 NewSimulation,
82 //! Mark the end of the enumeration
83 Count
86 /*! \brief Handle startup of mdrun, particularly regarding -cpi and -append
88 * If there is a checkpoint file, then prepare to start from that
89 * state. If possible/required, do so with appending. If some files
90 * are not found when appending should be done, we will instead issue
91 * a fatal error to avoid unintentional problems.
93 * If there is no checkpoint file, we return a value to indicate a new
94 * simulation is starting.
96 * On return, \p fnm is updated with suffix strings for part numbers if we are
97 * doing a restart from checkpoint and are not appending.
99 * The routine also does communication to coordinate behaviour between
100 * all simulations, including for error conditions.
102 * \throws FileIOError When the filesystem behavior prevents the
103 * user's choices being implemented.
104 * \throws InconsistentInputError When the users's choices cannot be implemented.
105 * \throws GromacsException On ranks upon which the error condition was
106 * not detected.
108 * \param[in] cr Communication structure
109 * \param[in] ms Handles multi-simulations.
110 * \param[in] appendingBehavior User choice for appending
111 * \param[in] nfile Size of fnm struct
112 * \param[inout] fnm Filename parameters to mdrun
114 * \return Description of how mdrun is starting */
115 std::tuple<StartingBehavior, LogFilePtr>
116 handleRestart(t_commrec *cr,
117 const gmx_multisim_t *ms,
118 AppendingBehavior appendingBehavior,
119 int nfile,
120 t_filenm fnm[]);
122 } // namespace gmx
124 #endif