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.
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.
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.
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.
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.
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.
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.
38 #ifndef GMX_MDTYPES_INPUTREC_H
39 #define GMX_MDTYPES_INPUTREC_H
46 #include "gromacs/math/vectypes.h"
47 #include "gromacs/mdtypes/md_enums.h"
48 #include "gromacs/utility/enumerationhelpers.h"
49 #include "gromacs/utility/real.h"
51 #define EGP_EXCL (1 << 0)
52 #define EGP_TABLE (1 << 1)
62 class KeyValueTreeObject;
68 //! Number of T-Coupl groups
70 //! Number of of Nose-Hoover chains per group
71 int nhchainlength = 0;
72 //! Number of Accelerate groups
74 //! Number of Freeze groups
76 //! Number of Energy groups
78 //! Number of degrees of freedom in a group
80 //! Coupling temperature per group
81 real* ref_t = nullptr;
82 //! No/simple/periodic simulated annealing for each group
83 SimulatedAnnealing* annealing = nullptr;
84 //! Number of annealing time points per group
85 int* anneal_npoints = nullptr;
86 //! For each group: Time points
87 real** anneal_time = nullptr;
88 //! For each group: Temperature at these times. Final temp after all intervals is ref_t
89 real** anneal_temp = nullptr;
91 real* tau_t = nullptr;
92 //! Acceleration per group
93 rvec* acceleration = nullptr;
94 //! Whether the group will be frozen in each direction
95 ivec* nFreeze = nullptr;
96 //! Exclusions/tables of energy group pairs
97 int* egp_flags = nullptr;
100 //! Number of QM groups
106 //! Simulated temperature scaling; linear or exponential
107 SimulatedTempering eSimTempScale = SimulatedTempering::Default;
108 //! The low temperature for simulated tempering
109 real simtemp_low = 0;
110 //! The high temperature for simulated tempering
111 real simtemp_high = 0;
112 //! The range of temperatures used for simulated tempering
113 std::vector<real> temperatures;
118 //! The frequency for calculating dhdl
120 //! 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)
121 double init_lambda = 0;
122 //! The initial number of the state
123 int init_fep_state = 0;
124 //! Change of lambda per time step (fraction of (0.1)
125 double delta_lambda = 0;
126 //! Print no, total or potential energies in dhdl
127 FreeEnergyPrintEnergy edHdLPrintEnergy = FreeEnergyPrintEnergy::Default;
128 //! The number of foreign lambda points
130 //! The array of all lambda values
131 gmx::EnumerationArray<FreeEnergyPerturbationCouplingType, std::vector<double>> all_lambda;
132 //! The number of neighboring lambda states to calculate the energy for in up and down directions (-1 for all)
133 int lambda_neighbors = 0;
134 //! The first lambda to calculate energies for
135 int lambda_start_n = 0;
136 //! The last lambda +1 to calculate energies for
137 int lambda_stop_n = 0;
138 //! Free energy soft-core parameter
140 //! Lambda power for soft-core interactions
142 //! R power for soft-core interactions
144 //! Free energy soft-core sigma when c6 or c12=0
146 //! Free energy soft-core sigma for ?????
147 real sc_sigma_min = 0;
148 //! Use softcore for the coulomb portion as well (default FALSE)
149 bool bScCoul = false;
150 //! The specific soft-core function to use
151 SoftcoreType softcoreFunction = SoftcoreType::Beutler;
152 //! scale for the linearization point for the vdw interaction with gapsys soft-core
153 real scGapsysScaleLinpointLJ = 0.85;
154 //! scale for the linearization point for the coulomb interaction with gapsys soft-core
155 real scGapsysScaleLinpointQ = 0.3;
156 //! lower bound for c12/c6 in gapsys soft-core
157 real scGapsysSigmaLJ = 0.3;
158 //! Whether to print the dvdl term associated with this term; if it is not specified as separate, it is lumped with the FEP term
159 gmx::EnumerationArray<FreeEnergyPerturbationCouplingType, bool> separate_dvdl;
160 //! Whether to write a separate dhdl.xvg file note: NOT a gmx_bool, but an enum
161 SeparateDhdlFile separate_dhdl_file = SeparateDhdlFile::Default;
162 //! Whether to calculate+write dhdl derivatives note: NOT a gmx_bool, but an enum
163 DhDlDerivativeCalculation dhdl_derivatives = DhDlDerivativeCalculation::Default;
164 //! The maximum table size for the dH histogram
165 int dh_hist_size = 0;
166 //! The spacing for the dH histogram
167 double dh_hist_spacing = 0;
172 //! The frequency of expanded ensemble state changes
174 //! Which type of move updating do we use for lambda monte carlo (or no for none)
175 LambdaWeightCalculation elamstats = LambdaWeightCalculation::Default;
176 //! What move set will be we using for state space moves
177 LambdaMoveCalculation elmcmove = LambdaMoveCalculation::Default;
178 //! The method we use to decide of we have equilibrated the weights
179 LambdaWeightWillReachEquilibrium elmceq = LambdaWeightWillReachEquilibrium::Default;
180 //! The minumum number of samples at each lambda for deciding whether we have reached a minimum
181 int equil_n_at_lam = 0;
182 //! Wang-Landau delta at which we stop equilibrating weights
183 real equil_wl_delta = 0;
184 //! Use the ratio of weights (ratio of minimum to maximum) to decide when to stop equilibrating
185 real equil_ratio = 0;
186 //! After equil_steps steps we stop equilibrating the weights
188 //! After equil_samples total samples (steps/nstfep), we stop equilibrating the weights
189 int equil_samples = 0;
190 //! Random number seed for lambda mc switches
192 //! Whether to use minumum variance weighting
194 //! The number of samples needed before kicking into minvar routine
196 //! The offset for the variance in MinVar
197 real minvar_const = 0;
198 //! Range of cvalues used for BAR
200 //! Whether to print symmetrized matrices
201 bool bSymmetrizedTMatrix = false;
202 //! How frequently to print the transition matrices
204 //! Number of repetitions in the MC lambda jumps MRS -- VERIFY THIS
206 //! Minimum number of samples for each state before free sampling MRS -- VERIFY THIS!
207 int lmc_forced_nstart = 0;
208 //! Distance in lambda space for the gibbs interval
209 int gibbsdeltalam = 0;
210 //! Scaling factor for Wang-Landau
212 //! Ratio between largest and smallest number for freezing the weights
214 //! Starting delta for Wang-Landau
215 real init_wl_delta = 0;
216 //! Use one over t convergence for Wang-Landau when the delta get sufficiently small
217 bool bWLoneovert = false;
218 //! Did we initialize the weights? TODO: REMOVE FOR 5.0, no longer needed with new logic
219 bool bInit_weights = false;
220 //! To override the main temperature, or define it if it's not defined
222 //! User-specified initial weights to start with
223 std::vector<real> init_lambda_weights;
228 //! Rotation type for this group
229 EnforcedRotationGroupType eType;
230 //! Use mass-weighed positions?
232 //! Number of atoms in the group
234 //! The global atoms numbers
236 //! The reference positions
238 //! The normalized rotation vector
240 //! Rate of rotation (degree/ps)
242 //! Force constant (kJ/(mol nm^2)
244 //! Pivot point of rotation axis (nm)
246 //! Type of fit to determine actual group angle
247 RotationGroupFitting eFittype;
248 //! Number of angles around the reference angle for which the rotation potential is also evaluated (for fit type 'potential' only)
250 //! Distance between two angles in degrees (for fit type 'potential' only)
252 //! Slab distance (nm)
254 //! Minimum value the gaussian must have so that the force is actually evaluated
256 //! Additive constant for radial motion2 and flexible2 potentials (nm^2)
262 //! Number of rotation groups
264 //! Output frequency for main rotation outfile
266 //! Output frequency for per-slab data
274 //! Number of interactive atoms
276 //! The global indices of the interactive atoms
282 //! Name of the swap group, e.g. NA, CL, SOL
284 //! Number of atoms in this group
286 //! The global ion group atoms numbers
288 //! Requested number of molecules of this type per compartment
289 gmx::EnumerationArray<Compartment, int> nmolReq;
294 //! Period between when a swap is attempted
296 //! Use mass-weighted positions in split group
298 /*! \brief Split cylinders defined by radius, upper and lower
299 * extension. The split cylinders define the channels and are
300 * each anchored in the center of the split group */
306 //! Coupling constant (number of swap attempt steps)
308 //! Ion counts may deviate from the requested values by +-threshold before a swap is done
310 //! Offset of the swap layer (='bulk') with respect to the compartment-defining layers
311 gmx::EnumerationArray<Compartment, real> bulkOffset;
312 //! Number of groups to be controlled
314 //! All swap groups, including split and solvent
318 struct t_inputrec // NOLINT (clang-analyzer-optin.performance.Padding)
321 explicit t_inputrec(const t_inputrec&) = delete;
322 t_inputrec& operator=(const t_inputrec&) = delete;
325 //! Integration method
326 IntegrationAlgorithm eI = IntegrationAlgorithm::Default;
327 //! Number of steps to be taken
329 //! Used in checkpointing to separate chunks
330 int simulation_part = 0;
331 //! Start at a stepcount >0 (used w. convert-tpr)
332 int64_t init_step = 0;
333 //! Frequency of energy calc. and T/P coupl. upd.
334 int nstcalcenergy = 0;
335 //! Group or verlet cutoffs
336 CutoffScheme cutoff_scheme = CutoffScheme::Default;
337 //! Number of steps before pairlist is generated
339 //! Number of steps after which center of mass motion is removed
341 //! Center of mass motion removal algorithm
342 ComRemovalAlgorithm comm_mode = ComRemovalAlgorithm::Default;
343 //! Number of steps after which print to logfile
345 //! Number of steps after which X is output
347 //! Number of steps after which V is output
349 //! Number of steps after which F is output
351 //! Number of steps after which energies printed
353 //! Number of steps after which compressed trj (.xtc,.tng) is output
354 int nstxout_compressed = 0;
355 //! Initial time (ps)
359 //! Whether we use multiple time stepping
361 //! The multiple time stepping levels
362 std::vector<gmx::MtsLevel> mtsLevels;
363 //! Precision of x in compressed trajectory file
364 real x_compression_precision = 0;
365 //! Requested fourier_spacing, when nk? not set
366 real fourier_spacing = 0;
367 //! Number of k vectors in x dimension for fourier methods for long range electrost.
369 //! Number of k vectors in y dimension for fourier methods for long range electrost.
371 //! Number of k vectors in z dimension for fourier methods for long range electrost.
373 //! Interpolation order for PME
375 //! Real space tolerance for Ewald, determines the real/reciprocal space relative weight
377 //! Real space tolerance for LJ-Ewald
378 real ewald_rtol_lj = 0;
379 //! Normal/3D ewald, or pseudo-2D LR corrections
380 EwaldGeometry ewald_geometry = EwaldGeometry::Default;
381 //! Epsilon for PME dipole correction
382 real epsilon_surface = 0;
383 //! Type of combination rule in LJ-PME
384 LongRangeVdW ljpme_combination_rule = LongRangeVdW::Default;
385 //! Type of periodic boundary conditions
386 PbcType pbcType = PbcType::Default;
387 //! Periodic molecules
388 bool bPeriodicMols = false;
389 //! Continuation run: starting state is correct (ie. constrained)
390 bool bContinuation = false;
391 //! Temperature coupling
392 TemperatureCoupling etc = TemperatureCoupling::Default;
393 //! Interval in steps for temperature coupling
395 //! Whether to print nose-hoover chains
396 bool bPrintNHChains = false;
397 //! Pressure coupling
398 PressureCoupling epc = PressureCoupling::Default;
399 //! Pressure coupling type
400 PressureCouplingType epct = PressureCouplingType::Default;
401 //! Interval in steps for pressure coupling
403 //! Pressure coupling time (ps)
405 //! Reference pressure (kJ/(mol nm^3))
406 tensor ref_p = { { 0 } };
407 //! Compressibility ((mol nm^3)/kJ)
408 tensor compress = { { 0 } };
409 //! How to scale absolute reference coordinates
410 RefCoordScaling refcoord_scaling = RefCoordScaling::Default;
411 //! The COM of the posres atoms
412 rvec posres_com = { 0, 0, 0 };
413 //! The B-state COM of the posres atoms
414 rvec posres_comB = { 0, 0, 0 };
415 //! Random seed for Andersen thermostat (obsolete)
416 int andersen_seed = 0;
417 //! Per atom pair energy drift tolerance (kJ/mol/ps/atom) for list buffer
418 real verletbuf_tol = 0;
419 //! Short range pairlist cut-off (nm)
421 //! Radius for test particle insertion
423 //! Type of electrostatics treatment
424 CoulombInteractionType coulombtype = CoulombInteractionType::Default;
425 //! Modify the Coulomb interaction
426 InteractionModifiers coulomb_modifier = InteractionModifiers::Default;
427 //! Coulomb switch range start (nm)
428 real rcoulomb_switch = 0;
429 //! Coulomb cutoff (nm)
431 //! Relative dielectric constant
433 //! Relative dielectric constant of the RF
435 //! Always false (no longer supported)
436 bool implicit_solvent = false;
437 //! Type of Van der Waals treatment
438 VanDerWaalsType vdwtype = VanDerWaalsType::Default;
439 //! Modify the Van der Waals interaction
440 InteractionModifiers vdw_modifier = InteractionModifiers::Default;
441 //! Van der Waals switch range start (nm)
442 real rvdw_switch = 0;
443 //! Van der Waals cutoff (nm)
445 //! Perform Long range dispersion corrections
446 DispersionCorrectionType eDispCorr = DispersionCorrectionType::Default;
447 //! Extension of the table beyond the cut-off, as well as the table length for 1-4 interac.
449 //! Tolerance for shake
451 //! Free energy calculations
452 FreeEnergyPerturbationType efep = FreeEnergyPerturbationType::Default;
453 //! Data for the FEP state
454 std::unique_ptr<t_lambda> fepvals;
455 //! Whether to do simulated tempering
456 bool bSimTemp = false;
457 //! Variables for simulated tempering
458 std::unique_ptr<t_simtemp> simtempvals;
459 //! Whether expanded ensembles are used
460 bool bExpanded = false;
461 //! Expanded ensemble parameters
462 std::unique_ptr<t_expanded> expandedvals;
463 //! Type of distance restraining
464 DistanceRestraintRefinement eDisre = DistanceRestraintRefinement::Default;
465 //! Force constant for time averaged distance restraints
467 //! Type of weighting of pairs in one restraints
468 DistanceRestraintWeighting eDisreWeighting = DistanceRestraintWeighting::Default;
469 //! Use combination of time averaged and instantaneous violations
470 bool bDisreMixed = false;
471 //! Frequency of writing pair distances to enx
473 //! Time constant for memory function in disres
475 //! Force constant for orientational restraints
477 //! Time constant for memory function in orires
479 //! Frequency of writing tr(SD) to energy output
481 //! The stepsize for updating
482 real em_stepsize = 0;
485 //! Number of iterations for convergence of steepest descent in relax_shells
487 //! Stepsize for directional minimization in relax_shells
488 real fc_stepsize = 0;
489 //! Number of steps after which a steepest descents step is done while doing cg
491 //! Number of corrections to the Hessian to keep
493 //! Type of constraint algorithm
494 ConstraintAlgorithm eConstrAlg = ConstraintAlgorithm::Default;
495 //! Order of the LINCS Projection Algorithm
497 //! Warn if any bond rotates more than this many degrees
498 real LincsWarnAngle = 0;
499 //! Number of iterations in the final LINCS step
501 //! Use successive overrelaxation for shake
502 bool bShakeSOR = false;
503 //! Friction coefficient for BD (amu/ps)
505 //! Random seed for SD and BD
507 //! The number of walls
509 //! The type of walls
510 WallType wall_type = WallType::Default;
511 //! The potentail is linear for r<=wall_r_linpot
512 real wall_r_linpot = 0;
513 //! The atom type for walls
514 int wall_atomtype[2] = { 0, 0 };
515 //! Number density for walls
516 real wall_density[2] = { 0, 0 };
517 //! Scaling factor for the box for Ewald
518 real wall_ewald_zfac = 0;
520 /* COM pulling data */
521 //! Do we do COM pulling?
523 //! The data for center of mass pulling
524 std::unique_ptr<pull_params_t> pull;
527 //! Whether to use AWH biasing for PMF calculations
529 //! AWH biasing parameters
530 std::unique_ptr<gmx::AwhParams> awhParams;
532 /* Enforced rotation data */
533 //! Whether to calculate enforced rotation potential(s)
535 //! The data for enforced rotation potentials
536 t_rot* rot = nullptr;
538 //! Whether to do ion/water position exchanges (CompEL)
539 SwapType eSwapCoords = SwapType::Default;
540 //! Swap data structure.
541 t_swapcoords* swap = nullptr;
543 //! Whether the tpr makes an interactive MD session possible.
545 //! Interactive molecular dynamics
546 t_IMD* imd = nullptr;
548 //! Acceleration for viscosity calculation
550 //! Triclinic deformation velocities (nm/ps)
551 tensor deform = { { 0 } };
552 /*! \brief User determined parameters */
565 //! QM/MM calculation
568 /* Fields for removed features go here (better caching) */
569 //! Whether AdResS is enabled - always false if a valid .tpr was read
570 bool bAdress = false;
571 //! Whether twin-range scheme is active - always false if a valid .tpr was read
572 bool useTwinRange = false;
573 //! Whether we have constant acceleration
574 bool useConstantAcceleration = false;
576 //! KVT object that contains input parameters converted to the new style.
577 gmx::KeyValueTreeObject* params = nullptr;
579 //! KVT for storing simulation parameters that are not part of the mdp file.
580 std::unique_ptr<gmx::KeyValueTreeObject> internalParameters;
583 int ir_optimal_nstcalcenergy(const t_inputrec* ir);
585 int tcouple_min_integration_steps(TemperatureCoupling etc);
587 int ir_optimal_nsttcouple(const t_inputrec* ir);
589 int pcouple_min_integration_steps(PressureCoupling epc);
591 int ir_optimal_nstpcouple(const t_inputrec* ir);
593 /* Returns if the Coulomb force or potential is switched to zero */
594 bool ir_coulomb_switched(const t_inputrec* ir);
596 /* Returns if the Coulomb interactions are zero beyond the rcoulomb.
597 * Note: always returns TRUE for the Verlet cut-off scheme.
599 bool ir_coulomb_is_zero_at_cutoff(const t_inputrec* ir);
601 /* As ir_coulomb_is_zero_at_cutoff, but also returns TRUE for user tabulated
602 * interactions, since these might be zero beyond rcoulomb.
604 bool ir_coulomb_might_be_zero_at_cutoff(const t_inputrec* ir);
606 /* Returns if the Van der Waals force or potential is switched to zero */
607 bool ir_vdw_switched(const t_inputrec* ir);
609 /* Returns if the Van der Waals interactions are zero beyond the rvdw.
610 * Note: always returns TRUE for the Verlet cut-off scheme.
612 bool ir_vdw_is_zero_at_cutoff(const t_inputrec* ir);
614 /* As ir_vdw_is_zero_at_cutoff, but also returns TRUE for user tabulated
615 * interactions, since these might be zero beyond rvdw.
617 bool ir_vdw_might_be_zero_at_cutoff(const t_inputrec* ir);
619 /*! \brief Free memory from input record.
621 * All arrays and pointers will be freed.
623 * \param[in] ir The data structure
625 void done_inputrec(t_inputrec* ir);
627 void pr_inputrec(FILE* fp, int indent, const char* title, const t_inputrec* ir, bool bMDPformat);
629 void cmp_inputrec(FILE* fp, const t_inputrec* ir1, const t_inputrec* ir2, real ftol, real abstol);
631 void comp_pull_AB(FILE* fp, const pull_params_t& pull, real ftol, real abstol);
634 bool inputrecDeform(const t_inputrec* ir);
636 bool inputrecDynamicBox(const t_inputrec* ir);
638 bool inputrecPreserveShape(const t_inputrec* ir);
640 bool inputrecNeedMutot(const t_inputrec* ir);
642 bool inputrecTwinRange(const t_inputrec* ir);
644 bool inputrecExclForces(const t_inputrec* ir);
646 bool inputrecNptTrotter(const t_inputrec* ir);
648 bool inputrecNvtTrotter(const t_inputrec* ir);
650 bool inputrecNphTrotter(const t_inputrec* ir);
652 /*! \brief Return true if the simulation is 2D periodic with two walls. */
653 bool inputrecPbcXY2Walls(const t_inputrec* ir);
655 //! \brief Return true if the simulation has frozen atoms (non-trivial freeze groups).
656 bool inputrecFrozenAtoms(const t_inputrec* ir);
658 /*! \brief Returns true for MD integator with T and/or P-coupling that supports
659 * calculating a conserved energy quantity.
661 * Note that dynamical integrators without T and P coupling (ie NVE)
662 * return false, i.e. the return value refers to whether there
663 * is a conserved quantity different than the total energy.
665 bool integratorHasConservedEnergyQuantity(const t_inputrec* ir);
667 /*! \brief Returns true when temperature is coupled or constant. */
668 bool integratorHasReferenceTemperature(const t_inputrec* ir);
670 /*! \brief Return the number of bounded dimensions
672 * \param[in] ir The input record with MD parameters
673 * \return the number of dimensions in which
674 * the coordinates of the particles are bounded, starting at X.
676 int inputrec2nboundeddim(const t_inputrec* ir);
678 /*! \brief Returns the number of degrees of freedom in center of mass motion
680 * \param[in] ir The inputrec structure
681 * \return the number of degrees of freedom of the center of mass
683 int ndof_com(const t_inputrec* ir);
685 /*! \brief Returns the maximum reference temperature over all coupled groups
687 * Returns 0 for energy minimization and normal mode computation.
688 * Returns -1 for MD without temperature coupling.
690 * \param[in] ir The inputrec structure
692 real maxReferenceTemperature(const t_inputrec& ir);
694 /*! \brief Returns whether there is an Ewald surface contribution
696 bool haveEwaldSurfaceContribution(const t_inputrec& ir);
698 /*! \brief Check if calculation of the specific FEP type was requested.
700 * \param[in] ir Input record.
701 * \param[in] fepType Free-energy perturbation type to check for.
703 * \returns If the \p fepType is perturbed in this run.
705 bool haveFreeEnergyType(const t_inputrec& ir, int fepType);
707 #endif /* GMX_MDTYPES_INPUTREC_H */