bef760925a4de0328f03bcbc6ca1ffff79dbcb76
[alexxy/gromacs.git] / src / gromacs / mdtypes / state.h
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
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.
7  * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by
8  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
9  * and including many others, as listed in the AUTHORS file in the
10  * top-level source directory and at http://www.gromacs.org.
11  *
12  * GROMACS is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU Lesser General Public License
14  * as published by the Free Software Foundation; either version 2.1
15  * of the License, or (at your option) any later version.
16  *
17  * GROMACS is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20  * Lesser General Public License for more details.
21  *
22  * You should have received a copy of the GNU Lesser General Public
23  * License along with GROMACS; if not, see
24  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
26  *
27  * If you want to redistribute modifications to GROMACS, please
28  * consider that scientific software is very special. Version
29  * control is crucial - bugs must be traceable. We will be happy to
30  * consider code for inclusion in the official distribution, but
31  * derived work must not be called official GROMACS. Details are found
32  * in the README & COPYING files - if they are missing, get the
33  * official version at http://www.gromacs.org.
34  *
35  * To help us fund GROMACS development, we humbly ask that you cite
36  * the research papers on the package. Check out http://www.gromacs.org.
37  */
38
39 /*! \file
40  *
41  * \brief
42  * This file contains the definition of the microstate of the simulated system
43  *
44  * History of observables that needs to be checkpointed should be stored
45  * in ObservablesHistory.
46  * The state of the mdrun machinery that needs to be checkpointed is also
47  * stored elsewhere.
48  *
49  * \author Berk Hess
50  *
51  * \inlibraryapi
52  * \ingroup module_mdtypes
53  */
54
55 #ifndef GMX_MDTYPES_STATE_H
56 #define GMX_MDTYPES_STATE_H
57
58 #include <array>
59 #include <memory>
60 #include <vector>
61
62 #include "gromacs/gpu_utils/hostallocator.h"
63 #include "gromacs/math/paddedvector.h"
64 #include "gromacs/math/vectypes.h"
65 #include "gromacs/mdtypes/md_enums.h"
66 #include "gromacs/utility/arrayref.h"
67 #include "gromacs/utility/basedefinitions.h"
68 #include "gromacs/utility/enumerationhelpers.h"
69 #include "gromacs/utility/real.h"
70
71 struct t_inputrec;
72
73 namespace gmx
74 {
75 struct AwhHistory;
76 enum class CheckpointDataOperation;
77 template<CheckpointDataOperation operation>
78 class CheckpointData;
79 } // namespace gmx
80
81 //! Convenience alias for until all is moved in the gmx namespace
82 template<class T>
83 using PaddedHostVector = gmx::PaddedHostVector<T>;
84
85 /*
86  * The t_state struct should contain all the (possibly) non-static
87  * information required to define the state of the system.
88  * Currently the random seeds for SD and BD are missing.
89  */
90
91 /* \brief Enum for all entries in \p t_state
92  *
93  * These enums are used in flags as (1<<est...).
94  * The order of these enums should not be changed,
95  * since that affects the checkpoint (.cpt) file format.
96  */
97 enum class StateEntry : int
98 {
99     Lambda,
100     Box,
101     BoxRel,
102     BoxV,
103     PressurePrevious,
104     Nhxi,
105     ThermInt,
106     X,
107     V,
108     SDxNotSupported,
109     Cgp,
110     LDRngNotSupported,
111     LDRngINotSupported,
112     DisreInitF,
113     DisreRm3Tav,
114     OrireInitF,
115     OrireDtav,
116     SVirPrev,
117     Nhvxi,
118     Veta,
119     Vol0,
120     Nhpresxi,
121     Nhpresvxi,
122     FVirPrev,
123     FepState,
124     MCRngNotSupported,
125     MCRngINotSupported,
126     BarosInt,
127     PullComPrevStep,
128     Count
129 };
130
131 //! \brief The names of the state entries, defined in src/gromacs/fileio/checkpoint.cpp
132 const char* enumValueToString(StateEntry enumValue);
133 /*! \brief Convert enum to bitmask value.
134  *
135  * Used for setting flags in checkpoint header and verifying which flags are set.
136  */
137 template<typename Enum>
138 inline int enumValueToBitMask(Enum enumValue)
139 {
140     static_assert(static_cast<int>(Enum::Count) <= std::numeric_limits<int>::digits);
141     return 1 << static_cast<int>(enumValue);
142 }
143
144 /*! \libinternal \brief History information for NMR distance and orientation restraints
145  *
146  * Often this is only used for reporting observables, and thus should not
147  * actually be part of the microstate. But with time-dependent restraining
148  * they are actually part of the (non-Markovian) microstate.
149  * \todo Rename this with a more descriptive name.
150  */
151 class history_t
152 {
153 public:
154     history_t();
155
156     real  disre_initf;  //!< The scaling factor for initializing the time av.
157     int   ndisrepairs;  //!< The number of distance restraints
158     real* disre_rm3tav; //!< The r^-3 time averaged pair distances
159     real  orire_initf;  //!< The scaling factor for initializing the time av.
160     int   norire_Dtav;  //!< The number of matrix element in dtav (npair*5)
161     real* orire_Dtav;   //!< The time averaged orientation tensors
162 };
163
164 /*! \libinternal \brief Struct used for checkpointing only
165  *
166  * This struct would not be required with unlimited precision.
167  * But because of limited precision, the COM motion removal implementation
168  * can cause the kinetic energy in the MD loop to differ by a few bits from
169  * the kinetic energy one would determine from state.v.
170  */
171 class ekinstate_t
172 {
173 public:
174     ekinstate_t();
175
176     gmx_bool            bUpToDate;      //!< Test if all data is up to date
177     int                 ekin_n;         //!< The number of tensors
178     tensor*             ekinh;          //!< Half step Ekin, size \p ekin_n
179     tensor*             ekinf;          //!< Full step Ekin, size \p ekin_n
180     tensor*             ekinh_old;      //!< Half step Ekin of the previous step, size \p ekin_n
181     tensor              ekin_total;     //!< Total kinetic energy
182     std::vector<double> ekinscalef_nhc; //!< Nose-Hoover Ekin scaling factors for full step Ekin
183     std::vector<double> ekinscaleh_nhc; //!< Nose-Hoover Ekin scaling factors for half step Ekin
184     std::vector<double> vscale_nhc;     //!< Nose-Hoover velocity scaling factors
185     real                dekindl;        //!< dEkin/dlambda, with free-energy
186     real                mvcos; //!< Cosine(z) component of the momentum, for viscosity calculations
187     /*! \brief Whether KE terms have been read from the checkpoint.
188      *
189      * Only used for managing whether the call to compute_globals
190      * before we enter the MD loop should compute these quantities
191      * fresh, or not. */
192     bool hasReadEkinState;
193
194     /*!
195      * \brief Allows to read and write checkpoint within modular simulator
196      * \tparam operation  Whether we're reading or writing
197      * \param checkpointData  The CheckpointData object
198      */
199     template<gmx::CheckpointDataOperation operation>
200     void doCheckpoint(gmx::CheckpointData<operation> checkpointData);
201 };
202
203 /*! \brief Free-energy sampling history struct
204  *
205  * \todo Split out into microstate and observables history.
206  */
207 typedef struct df_history_t
208 {
209     int nlambda; //!< total number of lambda states - for history
210
211     gmx_bool bEquil;   //!< Have we reached equilibration
212     int*     n_at_lam; //!< number of points observed at each lambda
213     real*    wl_histo; //!< histogram for WL flatness determination
214     real     wl_delta; //!< current wang-landau delta
215
216     real* sum_weights; //!< weights of the states
217     real* sum_dg; //!< free energies of the states -- not actually used for weighting, but informational
218     real* sum_minvar;   //!< corrections to weights for minimum variance
219     real* sum_variance; //!< variances of the states
220
221     real** accum_p;  //!< accumulated bennett weights for n+1
222     real** accum_m;  //!< accumulated bennett weights for n-1
223     real** accum_p2; //!< accumulated squared bennett weights for n+1
224     real** accum_m2; //!< accumulated squared bennett weights for n-1
225
226     real** Tij;           //!< transition matrix
227     real** Tij_empirical; //!< Empirical transition matrix
228
229 } df_history_t;
230
231
232 /*! \brief The microstate of the system
233  *
234  * The global state will contain complete data for all used entries.
235  * The local state with domain decomposition will have partial entries
236  * for which \p stateEntryIsAtomProperty() is true. Some entries that
237  * are used in the global state might not be present in the local state.
238  * \todo Move pure observables history to ObservablesHistory.
239  */
240 class t_state
241 {
242 public:
243     t_state();
244
245     // All things public
246     int natoms; //!< Number of atoms, local + non-local; this is the size of \p x, \p v and \p cg_p, when used
247     int ngtc;          //!< The number of temperature coupling groups
248     int nnhpres;       //!< The number of NH-chains for the MTTK barostat (always 1 or 0)
249     int nhchainlength; //!< The NH-chain length for temperature coupling and MTTK barostat
250     int flags; //!< Set of bit-flags telling which entries are present, see enum at the top of the file
251     int fep_state; //!< indicates which of the alchemical states we are in
252     gmx::EnumerationArray<FreeEnergyPerturbationCouplingType, real> lambda; //!< Free-energy lambda vector
253     matrix                                                          box; //!< Matrix of box vectors
254     matrix              box_rel;        //!< Relative box vectors to preserve box shape
255     matrix              boxv;           //!< Box velocities for Parrinello-Rahman P-coupling
256     matrix              pres_prev;      //!< Pressure of the previous step for pcoupl
257     matrix              svir_prev;      //!< Shake virial for previous step for pcoupl
258     matrix              fvir_prev;      //!< Force virial of the previous step for pcoupl
259     std::vector<double> nosehoover_xi;  //!< Nose-Hoover coordinates (ngtc)
260     std::vector<double> nosehoover_vxi; //!< Nose-Hoover velocities (ngtc)
261     std::vector<double> nhpres_xi;      //!< Pressure Nose-Hoover coordinates
262     std::vector<double> nhpres_vxi;     //!< Pressure Nose-Hoover velocities
263     std::vector<double> therm_integral; //!< Work exterted N-H/V-rescale T-coupling (ngtc)
264     double              baros_integral; //!< For Berendsen P-coupling conserved quantity
265     real                veta;           //!< Trotter based isotropic P-coupling
266     real                vol0; //!< Initial volume,required for computing MTTK conserved quantity
267     PaddedHostVector<gmx::RVec> x;    //!< The coordinates (natoms)
268     PaddedHostVector<gmx::RVec> v;    //!< The velocities (natoms)
269     PaddedHostVector<gmx::RVec> cg_p; //!< p vector for conjugate gradient minimization
270
271     ekinstate_t ekinstate; //!< The state of the kinetic energy
272
273     /* History for special algorithms, should be moved to a history struct */
274     history_t                        hist;       //!< Time history for restraints
275     df_history_t*                    dfhist;     //!< Free-energy history for free energy analysis
276     std::shared_ptr<gmx::AwhHistory> awhHistory; //!< Accelerated weight histogram history
277
278     int              ddp_count;       //!< The DD partitioning count for this state
279     int              ddp_count_cg_gl; //!< The DD partitioning count for index_gl
280     std::vector<int> cg_gl;           //!< The global cg number of the local cgs
281
282     std::vector<double> pull_com_prev_step; //!< The COM of the previous step of each pull group
283 };
284
285 #ifndef DOXYGEN
286 /* We don't document the structs below, as they don't belong here.
287  * TODO: Move the next two structs out of state.h.
288  */
289
290 struct t_extmass
291 {
292     std::vector<double> Qinv; /* inverse mass of thermostat -- computed from inputs, but a good place to store */
293     std::vector<double> QPinv; /* inverse mass of thermostat for barostat -- computed from inputs, but a good place to store */
294     double              Winv; /* Pressure mass inverse -- computed, not input, but a good place to store. Need to make a matrix later */
295     tensor              Winvm; /* inverse pressure mass tensor, computed       */
296 };
297
298
299 typedef struct
300 {
301     real    veta;
302     double  rscale;
303     double  vscale;
304     double  rvscale;
305     double  alpha;
306     double* vscale_nhc;
307 } t_vetavars;
308
309 #endif // DOXYGEN
310
311 //! Resizes the T- and P-coupling state variables
312 void init_gtc_state(t_state* state, int ngtc, int nnhpres, int nhchainlength);
313
314 //! Change the number of atoms represented by this state, allocating memory as needed.
315 void state_change_natoms(t_state* state, int natoms);
316
317 //! Allocates memory for free-energy history
318 void init_dfhist_state(t_state* state, int dfhistNumLambda);
319
320 /*! \brief Compares two states, write the differences to stdout */
321 void comp_state(const t_state* st1, const t_state* st2, gmx_bool bRMSD, real ftol, real abstol);
322
323 /*! \brief Allocates an rvec pointer and copy the contents of v to it */
324 rvec* makeRvecArray(gmx::ArrayRef<const gmx::RVec> v, gmx::index n);
325
326 /*! \brief Determine the relative box components
327  *
328  * Set box_rel e.g. used in mdrun state, used to preserve the box shape
329  * \param[in]    ir      Input record
330  * \param[inout] state   State
331  */
332 void set_box_rel(const t_inputrec* ir, t_state* state);
333
334 /*! \brief Make sure the relative box shape remains the same
335  *
336  * This function ensures that the relative box dimensions are
337  * preserved, which otherwise might diffuse away due to rounding
338  * errors in pressure coupling or the deform option.
339  *
340  * \param[in]    ir      Input record
341  * \param[in]    box_rel Relative box dimensions
342  * \param[inout] box     The corrected actual box dimensions
343  */
344 void preserve_box_shape(const t_inputrec* ir, matrix box_rel, matrix box);
345
346 /*! \brief Returns an arrayRef to the positions in \p state when \p state!=null
347  *
348  * When \p state=nullptr, returns an empty arrayRef.
349  *
350  * \note The size returned is the number of atoms, without padding.
351  *
352  * \param[in] state  The state, can be nullptr
353  */
354 static inline gmx::ArrayRef<const gmx::RVec> positionsFromStatePointer(const t_state* state)
355 {
356     if (state)
357     {
358         return gmx::makeConstArrayRef(state->x).subArray(0, state->natoms);
359     }
360     else
361     {
362         return {};
363     }
364 };
365
366 /*! \brief Prints the current lambda state to the log file.
367  *
368  * \param[in] fplog  The log file. If fplog == nullptr there will be no output.
369  * \param[in] lambda The array of lambda values.
370  * \param[in] isInitialOutput Whether this output is the initial lambda state or not.
371  */
372 void printLambdaStateToLog(FILE* fplog, gmx::ArrayRef<const real> lambda, bool isInitialOutput);
373
374
375 /*! \brief Fills fep_state and lambda if needed
376  *
377  * If FEP or simulated tempering is in use,  fills fep_state
378  * and lambda on master rank.
379  *
380  * Reports the initial lambda state to the log file. */
381 void initialize_lambdas(FILE* fplog, const t_inputrec& ir, bool isMaster, int* fep_state, gmx::ArrayRef<real> lambda);
382
383 #endif