2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2013,2014,2015,2016,2017, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
41 * This file contains the definition of the microstate of the simulated system
43 * History of observables that needs to be checkpointed should be stored
44 * in ObservablesHistory.
45 * The state of the mdrun machinery that needs to be checkpointed is also
51 * \ingroup module_mdtypes
54 #ifndef GMX_MDTYPES_STATE_H
55 #define GMX_MDTYPES_STATE_H
60 #include "gromacs/math/paddedvector.h"
61 #include "gromacs/math/vectypes.h"
62 #include "gromacs/mdtypes/md_enums.h"
63 #include "gromacs/utility/basedefinitions.h"
64 #include "gromacs/utility/real.h"
69 * The t_state struct should contain all the (possibly) non-static
70 * information required to define the state of the system.
71 * Currently the random seeds for SD and BD are missing.
74 /* \brief Enum for all entries in \p t_state
76 * These enums are used in flags as (1<<est...).
77 * The order of these enums should not be changed,
78 * since that affects the checkpoint (.cpt) file format.
82 estBOX
, estBOX_REL
, estBOXV
, estPRES_PREV
, estNH_XI
, estTHERM_INT
,
83 estX
, estV
, estSDX_NOTSUPPORTED
, estCGP
,
84 estLD_RNG_NOTSUPPORTED
, estLD_RNGI_NOTSUPPORTED
,
85 estDISRE_INITF
, estDISRE_RM3TAV
,
86 estORIRE_INITF
, estORIRE_DTAV
,
87 estSVIR_PREV
, estNH_VXI
, estVETA
, estVOL0
, estNHPRES_XI
, estNHPRES_VXI
, estFVIR_PREV
,
88 estFEPSTATE
, estMC_RNG_NOTSUPPORTED
, estMC_RNGI_NOTSUPPORTED
,
93 //! \brief The names of the state entries, defined in src/gmxlib/checkpoint.c
94 extern const char *est_names
[estNR
];
96 /*! \libinternal \brief History information for NMR distance and orientation restraints
98 * Often this is only used for reporting observables, and thus should not
99 * actually be part of the microstate. But with time-dependent restraining
100 * they are actually part of the (non-Markovian) microstate.
101 * \todo Rename this with a more descriptive name.
109 real disre_initf
; //!< The scaling factor for initializing the time av.
110 int ndisrepairs
; //!< The number of distance restraints
111 real
*disre_rm3tav
; //!< The r^-3 time averaged pair distances
112 real orire_initf
; //!< The scaling factor for initializing the time av.
113 int norire_Dtav
; //!< The number of matrix element in dtav (npair*5)
114 real
*orire_Dtav
; //!< The time averaged orientation tensors
117 /*! \libinternal \brief Struct used for checkpointing only
119 * This struct would not be required with unlimited precision.
120 * But because of limited precision, the COM motion removal implementation
121 * can cause the kinetic energy in the MD loop to differ by a few bits from
122 * the kinetic energy one would determine from state.v.
129 gmx_bool bUpToDate
; //!< Test if all data is up to date
130 int ekin_n
; //!< The number of tensors
131 tensor
*ekinh
; //!< Half step Ekin, size \p ekin_n
132 tensor
*ekinf
; //!< Full step Ekin, size \p ekin_n
133 tensor
*ekinh_old
; //!< Half step Ekin of the previous step, size \p ekin_n
134 tensor ekin_total
; //!< Total kinetic energy
135 std::vector
<double> ekinscalef_nhc
; //!< Nose-Hoover Ekin scaling factors for full step Ekin
136 std::vector
<double> ekinscaleh_nhc
; //!< Nose-Hoover Ekin scaling factors for half step Ekin
137 std::vector
<double> vscale_nhc
; //!< Nose-Hoover velocity scaling factors
138 real dekindl
; //!< dEkin/dlambda, with free-energy
139 real mvcos
; //!< Cosine(z) component of the momentum, for viscosity calculations
142 /*! \brief Free-energy sampling history struct
144 * \todo Split out into microstate and observables history.
146 typedef struct df_history_t
148 int nlambda
; //!< total number of lambda states - for history
150 gmx_bool bEquil
; //!< Have we reached equilibration
151 int *n_at_lam
; //!< number of points observed at each lambda
152 real
*wl_histo
; //!< histogram for WL flatness determination
153 real wl_delta
; //!< current wang-landau delta
155 real
*sum_weights
; //!< weights of the states
156 real
*sum_dg
; //!< free energies of the states -- not actually used for weighting, but informational
157 real
*sum_minvar
; //!< corrections to weights for minimum variance
158 real
*sum_variance
; //!< variances of the states
160 real
**accum_p
; //!< accumulated bennett weights for n+1
161 real
**accum_m
; //!< accumulated bennett weights for n-1
162 real
**accum_p2
; //!< accumulated squared bennett weights for n+1
163 real
**accum_m2
; //!< accumulated squared bennett weights for n-1
165 real
**Tij
; //!< transition matrix
166 real
**Tij_empirical
; //!< Empirical transition matrix
171 /*! \brief The microstate of the system
173 * The global state will contain complete data for all used entries.
174 * The local state with domain decomposition will have partial entries
175 * for which \p stateEntryIsAtomProperty() is true. Some entries that
176 * are used in the global state might not be present in the local state.
177 * \todo Move pure observables history to ObservablesHistory.
186 int natoms
; //!< Number of atoms, local + non-local; this is the size of \p x, \p v and \p cg_p, when used
187 int ngtc
; //!< The number of temperature coupling groups
188 int nnhpres
; //!< The NH-chain length for the MTTK barostat
189 int nhchainlength
; //!< The NH-chain length for temperature coupling
190 int flags
; //!< Set of bit-flags telling which entries are present, see enum at the top of the file
191 int fep_state
; //!< indicates which of the alchemical states we are in
192 std::array
<real
, efptNR
> lambda
; //!< Free-energy lambda vector
193 matrix box
; //!< Matrix of box vectors
194 matrix box_rel
; //!< Relative box vectors to preserve box shape
195 matrix boxv
; //!< Box velocities for Parrinello-Rahman P-coupling
196 matrix pres_prev
; //!< Pressure of the previous step for pcoupl
197 matrix svir_prev
; //!< Shake virial for previous step for pcoupl
198 matrix fvir_prev
; //!< Force virial of the previous step for pcoupl
199 std::vector
<double> nosehoover_xi
; //!< Nose-Hoover coordinates (ngtc)
200 std::vector
<double> nosehoover_vxi
; //!< Nose-Hoover velocities (ngtc)
201 std::vector
<double> nhpres_xi
; //!< Pressure Nose-Hoover coordinates
202 std::vector
<double> nhpres_vxi
; //!< Pressure Nose-Hoover velocities
203 std::vector
<double> therm_integral
; //!< Work exterted N-H/V-rescale T-coupling (ngtc)
204 double baros_integral
; //!< For Berendsen P-coupling conserved quantity
205 real veta
; //!< Trotter based isotropic P-coupling
206 real vol0
; //!< Initial volume,required for computing MTTK conserved quantity
207 PaddedRVecVector x
; //!< The coordinates (natoms)
208 PaddedRVecVector v
; //!< The velocities (natoms)
209 PaddedRVecVector cg_p
; //!< p vector for conjugate gradient minimization
211 ekinstate_t ekinstate
; //!< The state of the kinetic energy
213 /* History for special algorithms, should be moved to a history struct */
214 history_t hist
; //!< Time history for restraints
215 df_history_t
*dfhist
; //!< Free-energy history for free energy analysis
217 int ddp_count
; //!< The DD partitioning count for this state
218 int ddp_count_cg_gl
; //!< The DD partitioning count for index_gl
219 std::vector
<int> cg_gl
; //!< The global cg number of the local cgs
223 /* We don't document the structs below, as they don't belong here.
224 * TODO: Move the next two structs out of state.h.
227 typedef struct t_extmass
229 double *Qinv
; /* inverse mass of thermostat -- computed from inputs, but a good place to store */
230 double *QPinv
; /* inverse mass of thermostat for barostat -- computed from inputs, but a good place to store */
231 double Winv
; /* Pressure mass inverse -- computed, not input, but a good place to store. Need to make a matrix later */
232 tensor Winvm
; /* inverse pressure mass tensor, computed */
248 //! Resizes the T- and P-coupling state variables
249 void init_gtc_state(t_state
*state
, int ngtc
, int nnhpres
, int nhchainlength
);
251 //! Change the number of atoms represented by this state, allocating memory as needed.
252 void state_change_natoms(t_state
*state
, int natoms
);
254 //! Allocates memory for free-energy history
255 void init_dfhist_state(t_state
*state
, int dfhistNumLambda
);
257 /*! \brief Compares two states, write the differences to stdout */
258 void comp_state(const t_state
*st1
, const t_state
*st2
, gmx_bool bRMSD
, real ftol
, real abstol
);
260 /*! \brief Allocates an rvec pointer and copy the contents of v to it */
261 rvec
*getRvecArrayFromPaddedRVecVector(const PaddedRVecVector
*v
,
264 /*! \brief Determine the relative box components
266 * Set box_rel e.g. used in mdrun state, used to preserve the box shape
267 * \param[in] ir Input record
268 * \param[inout] state State
270 void set_box_rel(const t_inputrec
*ir
, t_state
*state
);
272 /*! \brief Make sure the relative box shape remains the same
274 * This function ensures that the relative box dimensions are
275 * preserved, which otherwise might diffuse away due to rounding
276 * errors in pressure coupling or the deform option.
278 * \param[in] ir Input record
279 * \param[in] box_rel Relative box dimensions
280 * \param[inout] box The corrected actual box dimensions
282 void preserve_box_shape(const t_inputrec
*ir
, matrix box_rel
, matrix box
);