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,2018,2019, 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.
37 #ifndef GMX_MDTYPES_INPUTREC_H
38 #define GMX_MDTYPES_INPUTREC_H
44 #include "gromacs/math/vectypes.h"
45 #include "gromacs/mdtypes/md_enums.h"
46 #include "gromacs/utility/basedefinitions.h"
47 #include "gromacs/utility/real.h"
49 #define EGP_EXCL (1<<0)
50 #define EGP_TABLE (1<<1)
60 class KeyValueTreeObject;
65 //! Number of T-Coupl groups
67 //! Number of of Nose-Hoover chains per group
69 //! Number of Accelerate groups
71 //! Number of Freeze groups
73 //! Number of Energy groups
75 //! Number of degrees of freedom in a group
77 //! Coupling temperature per group
79 //! No/simple/periodic simulated annealing for each group
81 //! Number of annealing time points per group
83 //! For each group: Time points
85 //! For each group: Temperature at these times. Final temp after all intervals is ref_t
89 //! Acceleration per group
91 //! Whether the group will be frozen in each direction
93 //! Exclusions/tables of energy group pairs
97 //! Number of QM groups
99 //! Level of theory in the QM calculation
101 //! Basisset in the QM calculation
103 //! Total charge in the QM region
105 //! Spin multiplicicty in the QM region
107 //! Surface hopping (diabatic hop only)
109 //! Number of orbiatls in the active space
111 //! Number of electrons in the active space
113 //! At which gap (A.U.) the SA is switched on
115 //! At which gap (A.U.) the SA is switched off
117 //! In how many steps SA goes from 1-1 to 0.5-0.5
123 //! Simulated temperature scaling; linear or exponential
125 //! The low temperature for simulated tempering
127 //! The high temperature for simulated tempering
129 //! The range of temperatures used for simulated tempering
135 //! The frequency for calculating dhdl
137 //! Fractional value of lambda (usually will use init_fep_state, this will only be for slow growth, and for legacy free energy code. Only has a valid value if positive)
139 //! The initial number of the state
141 //! Change of lambda per time step (fraction of (0.1)
143 //! Print no, total or potential energies in dhdl
144 int edHdLPrintEnergy;
145 //! The number of foreign lambda points
147 //! The array of all lambda values
149 //! The number of neighboring lambda states to calculate the energy for in up and down directions (-1 for all)
150 int lambda_neighbors;
151 //! The first lambda to calculate energies for
153 //! The last lambda +1 to calculate energies for
155 //! Free energy soft-core parameter
157 //! Lambda power for soft-core interactions
159 //! R power for soft-core interactions
161 //! Free energy soft-core sigma when c6 or c12=0
163 //! Free energy soft-core sigma for ?????
165 //! Use softcore for the coulomb portion as well (default FALSE)
167 //! Whether to print the dvdl term associated with this term; if it is not specified as separate, it is lumped with the FEP term
168 gmx_bool separate_dvdl[efptNR];
169 //! Whether to write a separate dhdl.xvg file note: NOT a gmx_bool, but an enum
170 int separate_dhdl_file;
171 //! Whether to calculate+write dhdl derivatives note: NOT a gmx_bool, but an enum
172 int dhdl_derivatives;
173 //! The maximum table size for the dH histogram
175 //! The spacing for the dH histogram
176 double dh_hist_spacing;
180 //! The frequency of expanded ensemble state changes
182 //! Which type of move updating do we use for lambda monte carlo (or no for none)
184 //! What move set will be we using for state space moves
186 //! The method we use to decide of we have equilibrated the weights
188 //! The minumum number of samples at each lambda for deciding whether we have reached a minimum
190 //! Wang-Landau delta at which we stop equilibrating weights
192 //! Use the ratio of weights (ratio of minimum to maximum) to decide when to stop equilibrating
194 //! After equil_steps steps we stop equilibrating the weights
196 //! After equil_samples total samples (steps/nstfep), we stop equilibrating the weights
198 //! Random number seed for lambda mc switches
200 //! Whether to use minumum variance weighting
202 //! The number of samples needed before kicking into minvar routine
204 //! The offset for the variance in MinVar
206 //! Range of cvalues used for BAR
208 //! Whether to print symmetrized matrices
209 gmx_bool bSymmetrizedTMatrix;
210 //! How frequently to print the transition matrices
212 //! Number of repetitions in the MC lambda jumps MRS -- VERIFY THIS
214 //! Minimum number of samples for each state before free sampling MRS -- VERIFY THIS!
215 int lmc_forced_nstart;
216 //! Distance in lambda space for the gibbs interval
218 //! Scaling factor for Wang-Landau
220 //! Ratio between largest and smallest number for freezing the weights
222 //! Starting delta for Wang-Landau
224 //! Use one over t convergence for Wang-Landau when the delta get sufficiently small
225 gmx_bool bWLoneovert;
226 //! Did we initialize the weights? TODO: REMOVE FOR 5.0, no longer needed with new logic
227 gmx_bool bInit_weights;
228 //! To override the main temperature, or define it if it's not defined
230 //! User-specified initial weights to start with
231 real *init_lambda_weights;
236 //! Rotation type for this group
238 //! Use mass-weighed positions?
240 //! Number of atoms in the group
242 //! The global atoms numbers
244 //! The reference positions
246 //! The normalized rotation vector
248 //! Rate of rotation (degree/ps)
250 //! Force constant (kJ/(mol nm^2)
252 //! Pivot point of rotation axis (nm)
254 //! Type of fit to determine actual group angle
256 //! Number of angles around the reference angle for which the rotation potential is also evaluated (for fit type 'potential' only)
258 //! Distance between two angles in degrees (for fit type 'potential' only)
260 //! Slab distance (nm)
262 //! Minimum value the gaussian must have so that the force is actually evaluated
264 //! Additive constant for radial motion2 and flexible2 potentials (nm^2)
270 //! Number of rotation groups
272 //! Output frequency for main rotation outfile
274 //! Output frequency for per-slab data
282 //! Number of interactive atoms
284 //! The global indices of the interactive atoms
290 //! Name of the swap group, e.g. NA, CL, SOL
292 //! Number of atoms in this group
294 //! The global ion group atoms numbers
296 //! Requested number of molecules of this type per compartment
297 int nmolReq[eCompNR];
302 //! Period between when a swap is attempted
304 //! Use mass-weighted positions in split group
305 gmx_bool massw_split[2];
306 /*! \brief Split cylinders defined by radius, upper and lower
307 * extension. The split cylinders define the channels and are
308 * each anchored in the center of the split group */
314 //! Coupling constant (number of swap attempt steps)
316 //! Ion counts may deviate from the requested values by +-threshold before a swap is done
318 //! Offset of the swap layer (='bulk') with respect to the compartment-defining layers
319 real bulkOffset[eCompNR];
320 //! Number of groups to be controlled
322 //! All swap groups, including split and solvent
326 struct t_inputrec // NOLINT (clang-analyzer-optin.performance.Padding)
329 explicit t_inputrec(const t_inputrec &) = delete;
330 t_inputrec &operator=(const t_inputrec &) = delete;
333 //! Integration method
335 //! Number of steps to be taken
337 //! Used in checkpointing to separate chunks
339 //! Start at a stepcount >0 (used w. convert-tpr)
341 //! Frequency of energy calc. and T/P coupl. upd.
343 //! Group or verlet cutoffs
345 //! Number of steps before pairlist is generated
347 //! Number of steps after which center of mass motion is removed
349 //! Center of mass motion removal algorithm
351 //! Number of steps after which print to logfile
353 //! Number of steps after which X is output
355 //! Number of steps after which V is output
357 //! Number of steps after which F is output
359 //! Number of steps after which energies printed
361 //! Number of steps after which compressed trj (.xtc,.tng) is output
362 int nstxout_compressed;
363 //! Initial time (ps)
367 //! Precision of x in compressed trajectory file
368 real x_compression_precision;
369 //! Requested fourier_spacing, when nk? not set
370 real fourier_spacing;
371 //! Number of k vectors in x dimension for fourier methods for long range electrost.
373 //! Number of k vectors in y dimension for fourier methods for long range electrost.
375 //! Number of k vectors in z dimension for fourier methods for long range electrost.
377 //! Interpolation order for PME
379 //! Real space tolerance for Ewald, determines the real/reciprocal space relative weight
381 //! Real space tolerance for LJ-Ewald
383 //! Normal/3D ewald, or pseudo-2D LR corrections
385 //! Epsilon for PME dipole correction
386 real epsilon_surface;
387 //! Type of combination rule in LJ-PME
388 int ljpme_combination_rule;
389 //! Type of periodic boundary conditions
391 //! Periodic molecules
393 //! Continuation run: starting state is correct (ie. constrained)
394 gmx_bool bContinuation;
395 //! Temperature coupling
397 //! Interval in steps for temperature coupling
399 //! Whether to print nose-hoover chains
400 gmx_bool bPrintNHChains;
401 //! Pressure coupling
403 //! Pressure coupling type
405 //! Interval in steps for pressure coupling
407 //! Pressure coupling time (ps)
409 //! Reference pressure (kJ/(mol nm^3))
411 //! Compressibility ((mol nm^3)/kJ)
413 //! How to scale absolute reference coordinates
414 int refcoord_scaling;
415 //! The COM of the posres atoms
417 //! The B-state COM of the posres atoms
419 //! Random seed for Andersen thermostat (obsolete)
421 //! Per atom pair energy drift tolerance (kJ/mol/ps/atom) for list buffer
423 //! Short range pairlist cut-off (nm)
425 //! Radius for test particle insertion
427 //! Type of electrostatics treatment
429 //! Modify the Coulomb interaction
430 int coulomb_modifier;
431 //! Coulomb switch range start (nm)
432 real rcoulomb_switch;
433 //! Coulomb cutoff (nm)
435 //! Relative dielectric constant
437 //! Relative dielectric constant of the RF
439 //! Always false (no longer supported)
440 bool implicit_solvent;
441 //! Type of Van der Waals treatment
443 //! Modify the Van der Waals interaction
445 //! Van der Waals switch range start (nm)
447 //! Van der Waals cutoff (nm)
449 //! Perform Long range dispersion corrections
451 //! Extension of the table beyond the cut-off, as well as the table length for 1-4 interac.
453 //! Tolerance for shake
455 //! Free energy calculations
457 //! Data for the FEP state
459 //! Whether to do simulated tempering
461 //! Variables for simulated tempering
462 t_simtemp *simtempvals;
463 //! Whether expanded ensembles are used
465 //! Expanded ensemble parameters
466 t_expanded *expandedvals;
467 //! Type of distance restraining
469 //! Force constant for time averaged distance restraints
471 //! Type of weighting of pairs in one restraints
473 //! Use combination of time averaged and instantaneous violations
474 gmx_bool bDisreMixed;
475 //! Frequency of writing pair distances to enx
477 //! Time constant for memory function in disres
479 //! Force constant for orientational restraints
481 //! Time constant for memory function in orires
483 //! Frequency of writing tr(SD) to energy output
485 //! The stepsize for updating
489 //! Number of iterations for convergence of steepest descent in relax_shells
491 //! Stepsize for directional minimization in relax_shells
493 //! Number of steps after which a steepest descents step is done while doing cg
495 //! Number of corrections to the Hessian to keep
497 //! Type of constraint algorithm
499 //! Order of the LINCS Projection Algorithm
501 //! Warn if any bond rotates more than this many degrees
503 //! Number of iterations in the final LINCS step
505 //! Use successive overrelaxation for shake
507 //! Friction coefficient for BD (amu/ps)
509 //! Random seed for SD and BD
511 //! The number of walls
513 //! The type of walls
515 //! The potentail is linear for r<=wall_r_linpot
517 //! The atom type for walls
518 int wall_atomtype[2];
519 //! Number density for walls
520 real wall_density[2];
521 //! Scaling factor for the box for Ewald
522 real wall_ewald_zfac;
524 /* COM pulling data */
525 //! Do we do COM pulling?
527 //! The data for center of mass pulling
531 //! Whether to use AWH biasing for PMF calculations
533 //! AWH biasing parameters
534 gmx::AwhParams *awhParams;
536 /* Enforced rotation data */
537 //! Whether to calculate enforced rotation potential(s)
539 //! The data for enforced rotation potentials
542 //! Whether to do ion/water position exchanges (CompEL)
544 //! Swap data structure.
547 //! Whether the tpr makes an interactive MD session possible.
549 //! Interactive molecular dynamics
552 //! Acceleration for viscosity calculation
554 //! Triclinic deformation velocities (nm/ps)
556 /*! \brief User determined parameters */
569 //! QM/MM calculation
571 //! Constraints on QM bonds
573 //! Scheme: ONIOM or normal
575 //! Factor for scaling the MM charges in QM calc.
578 /* Fields for removed features go here (better caching) */
579 //! Whether AdResS is enabled - always false if a valid .tpr was read
581 //! Whether twin-range scheme is active - always false if a valid .tpr was read
582 gmx_bool useTwinRange;
584 //! KVT object that contains input parameters converted to the new style.
585 gmx::KeyValueTreeObject *params;
587 //! KVT for storing simulation parameters that are not part of the mdp file.
588 std::unique_ptr<gmx::KeyValueTreeObject> internalParameters;
591 int ir_optimal_nstcalcenergy(const t_inputrec *ir);
593 int tcouple_min_integration_steps(int etc);
595 int ir_optimal_nsttcouple(const t_inputrec *ir);
597 int pcouple_min_integration_steps(int epc);
599 int ir_optimal_nstpcouple(const t_inputrec *ir);
601 /* Returns if the Coulomb force or potential is switched to zero */
602 gmx_bool ir_coulomb_switched(const t_inputrec *ir);
604 /* Returns if the Coulomb interactions are zero beyond the rcoulomb.
605 * Note: always returns TRUE for the Verlet cut-off scheme.
607 gmx_bool ir_coulomb_is_zero_at_cutoff(const t_inputrec *ir);
609 /* As ir_coulomb_is_zero_at_cutoff, but also returns TRUE for user tabulated
610 * interactions, since these might be zero beyond rcoulomb.
612 gmx_bool ir_coulomb_might_be_zero_at_cutoff(const t_inputrec *ir);
614 /* Returns if the Van der Waals force or potential is switched to zero */
615 gmx_bool ir_vdw_switched(const t_inputrec *ir);
617 /* Returns if the Van der Waals interactions are zero beyond the rvdw.
618 * Note: always returns TRUE for the Verlet cut-off scheme.
620 gmx_bool ir_vdw_is_zero_at_cutoff(const t_inputrec *ir);
622 /* As ir_vdw_is_zero_at_cutoff, but also returns TRUE for user tabulated
623 * interactions, since these might be zero beyond rvdw.
625 gmx_bool ir_vdw_might_be_zero_at_cutoff(const t_inputrec *ir);
627 /*! \brief Free memory from input record.
629 * All arrays and pointers will be freed.
631 * \param[in] ir The data structure
633 void done_inputrec(t_inputrec *ir);
635 void pr_inputrec(FILE *fp, int indent, const char *title, const t_inputrec *ir,
636 gmx_bool bMDPformat);
638 void cmp_inputrec(FILE *fp, const t_inputrec *ir1, const t_inputrec *ir2, real ftol, real abstol);
640 void comp_pull_AB(FILE *fp, pull_params_t *pull, real ftol, real abstol);
643 gmx_bool inputrecDeform(const t_inputrec *ir);
645 gmx_bool inputrecDynamicBox(const t_inputrec *ir);
647 gmx_bool inputrecPreserveShape(const t_inputrec *ir);
649 gmx_bool inputrecNeedMutot(const t_inputrec *ir);
651 gmx_bool inputrecTwinRange(const t_inputrec *ir);
653 gmx_bool inputrecExclForces(const t_inputrec *ir);
655 gmx_bool inputrecNptTrotter(const t_inputrec *ir);
657 gmx_bool inputrecNvtTrotter(const t_inputrec *ir);
659 gmx_bool inputrecNphTrotter(const t_inputrec *ir);
661 /*! \brief Return true if the simulation is 2D periodic with two walls. */
662 bool inputrecPbcXY2Walls(const t_inputrec *ir);
664 /*! \brief Returns true for MD integator with T and/or P-coupling that supports
665 * calculating the conserved energy quantity.
667 bool integratorHasConservedEnergyQuantity(const t_inputrec *ir);
669 /*! \brief Returns true when temperature is coupled or constant. */
670 bool integratorHasReferenceTemperature(const t_inputrec *ir);
672 /*! \brief Return the number of bounded dimensions
674 * \param[in] ir The input record with MD parameters
675 * \return the number of dimensions in which
676 * the coordinates of the particles are bounded, starting at X.
678 int inputrec2nboundeddim(const t_inputrec *ir);
680 /*! \brief Returns the number of degrees of freedom in center of mass motion
682 * \param[in] ir The inputrec structure
683 * \return the number of degrees of freedom of the center of mass
685 int ndof_com(const t_inputrec *ir);
687 /*! \brief Returns the maximum reference temperature over all coupled groups
689 * Returns 0 for energy minimization and normal mode computation.
690 * Returns -1 for MD without temperature coupling.
692 * \param[in] ir The inputrec structure
694 real maxReferenceTemperature(const t_inputrec &ir);
696 #endif /* GMX_MDTYPES_INPUTREC_H */