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, 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.
49 #include "gromacs/fileio/readinp.h"
50 #include "gromacs/fileio/warninp.h"
51 #include "gromacs/gmxlib/chargegroup.h"
52 #include "gromacs/gmxlib/network.h"
53 #include "gromacs/gmxpreprocess/toputil.h"
54 #include "gromacs/math/functions.h"
55 #include "gromacs/math/units.h"
56 #include "gromacs/math/vec.h"
57 #include "gromacs/mdlib/calc_verletbuf.h"
58 #include "gromacs/mdtypes/inputrec.h"
59 #include "gromacs/mdtypes/md_enums.h"
60 #include "gromacs/mdtypes/pull-params.h"
61 #include "gromacs/options/options.h"
62 #include "gromacs/options/treesupport.h"
63 #include "gromacs/pbcutil/pbc.h"
64 #include "gromacs/topology/block.h"
65 #include "gromacs/topology/ifunc.h"
66 #include "gromacs/topology/index.h"
67 #include "gromacs/topology/mtop_util.h"
68 #include "gromacs/topology/symtab.h"
69 #include "gromacs/topology/topology.h"
70 #include "gromacs/utility/cstringutil.h"
71 #include "gromacs/utility/exceptions.h"
72 #include "gromacs/utility/fatalerror.h"
73 #include "gromacs/utility/gmxassert.h"
74 #include "gromacs/utility/ikeyvaluetreeerror.h"
75 #include "gromacs/utility/keyvaluetree.h"
76 #include "gromacs/utility/keyvaluetreetransform.h"
77 #include "gromacs/utility/smalloc.h"
78 #include "gromacs/utility/stringcompare.h"
79 #include "gromacs/utility/stringutil.h"
84 /* Resource parameters
85 * Do not change any of these until you read the instruction
86 * in readinp.h. Some cpp's do not take spaces after the backslash
87 * (like the c-shell), which will give you a very weird compiler
91 typedef struct t_inputrec_strings
93 char tcgrps[STRLEN], tau_t[STRLEN], ref_t[STRLEN],
94 acc[STRLEN], accgrps[STRLEN], freeze[STRLEN], frdim[STRLEN],
95 energy[STRLEN], user1[STRLEN], user2[STRLEN], vcm[STRLEN], x_compressed_groups[STRLEN],
96 couple_moltype[STRLEN], orirefitgrp[STRLEN], egptable[STRLEN], egpexcl[STRLEN],
97 wall_atomtype[STRLEN], wall_density[STRLEN], deform[STRLEN], QMMM[STRLEN],
99 char fep_lambda[efptNR][STRLEN];
100 char lambda_weights[STRLEN];
103 char anneal[STRLEN], anneal_npoints[STRLEN],
104 anneal_time[STRLEN], anneal_temp[STRLEN];
105 char QMmethod[STRLEN], QMbasis[STRLEN], QMcharge[STRLEN], QMmult[STRLEN],
106 bSH[STRLEN], CASorbitals[STRLEN], CASelectrons[STRLEN], SAon[STRLEN],
107 SAoff[STRLEN], SAsteps[STRLEN], bTS[STRLEN], bOPT[STRLEN];
109 } gmx_inputrec_strings;
111 static gmx_inputrec_strings *is = NULL;
113 void init_inputrec_strings()
117 gmx_incons("Attempted to call init_inputrec_strings before calling done_inputrec_strings. Only one inputrec (i.e. .mdp file) can be parsed at a time.");
122 void done_inputrec_strings()
130 egrptpALL, /* All particles have to be a member of a group. */
131 egrptpALL_GENREST, /* A rest group with name is generated for particles *
132 * that are not part of any group. */
133 egrptpPART, /* As egrptpALL_GENREST, but no name is generated *
134 * for the rest group. */
135 egrptpONE /* Merge all selected groups into one group, *
136 * make a rest group for the remaining particles. */
139 static const char *constraints[eshNR+1] = {
140 "none", "h-bonds", "all-bonds", "h-angles", "all-angles", NULL
143 static const char *couple_lam[ecouplamNR+1] = {
144 "vdw-q", "vdw", "q", "none", NULL
147 void init_ir(t_inputrec *ir, t_gromppopts *opts)
149 snew(opts->include, STRLEN);
150 snew(opts->define, STRLEN);
151 snew(ir->fepvals, 1);
152 snew(ir->expandedvals, 1);
153 snew(ir->simtempvals, 1);
156 static void GetSimTemps(int ntemps, t_simtemp *simtemp, double *temperature_lambdas)
161 for (i = 0; i < ntemps; i++)
163 /* simple linear scaling -- allows more control */
164 if (simtemp->eSimTempScale == esimtempLINEAR)
166 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*temperature_lambdas[i];
168 else if (simtemp->eSimTempScale == esimtempGEOMETRIC) /* should give roughly equal acceptance for constant heat capacity . . . */
170 simtemp->temperatures[i] = simtemp->simtemp_low * std::pow(simtemp->simtemp_high/simtemp->simtemp_low, static_cast<real>((1.0*i)/(ntemps-1)));
172 else if (simtemp->eSimTempScale == esimtempEXPONENTIAL)
174 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*(std::expm1(temperature_lambdas[i])/std::expm1(1.0));
179 sprintf(errorstr, "eSimTempScale=%d not defined", simtemp->eSimTempScale);
180 gmx_fatal(FARGS, errorstr);
187 static void _low_check(gmx_bool b, const char *s, warninp_t wi)
191 warning_error(wi, s);
195 static void check_nst(const char *desc_nst, int nst,
196 const char *desc_p, int *p,
201 if (*p > 0 && *p % nst != 0)
203 /* Round up to the next multiple of nst */
204 *p = ((*p)/nst + 1)*nst;
205 sprintf(buf, "%s should be a multiple of %s, changing %s to %d\n",
206 desc_p, desc_nst, desc_p, *p);
211 static gmx_bool ir_NVE(const t_inputrec *ir)
213 return (EI_MD(ir->eI) && ir->etc == etcNO);
216 static int lcd(int n1, int n2)
221 for (i = 2; (i <= n1 && i <= n2); i++)
223 if (n1 % i == 0 && n2 % i == 0)
232 static void process_interaction_modifier(const t_inputrec *ir, int *eintmod)
234 if (*eintmod == eintmodPOTSHIFT_VERLET)
236 if (ir->cutoff_scheme == ecutsVERLET)
238 *eintmod = eintmodPOTSHIFT;
242 *eintmod = eintmodNONE;
247 void check_ir(const char *mdparin, t_inputrec *ir, t_gromppopts *opts,
249 /* Check internal consistency.
250 * NOTE: index groups are not set here yet, don't check things
251 * like temperature coupling group options here, but in triple_check
254 /* Strange macro: first one fills the err_buf, and then one can check
255 * the condition, which will print the message and increase the error
258 #define CHECK(b) _low_check(b, err_buf, wi)
259 char err_buf[256], warn_buf[STRLEN];
262 t_lambda *fep = ir->fepvals;
263 t_expanded *expand = ir->expandedvals;
265 set_warning_line(wi, mdparin, -1);
267 if (ir->coulombtype == eelRF_NEC_UNSUPPORTED)
269 sprintf(warn_buf, "%s electrostatics is no longer supported",
270 eel_names[eelRF_NEC_UNSUPPORTED]);
271 warning_error(wi, warn_buf);
274 /* BASIC CUT-OFF STUFF */
275 if (ir->rcoulomb < 0)
277 warning_error(wi, "rcoulomb should be >= 0");
281 warning_error(wi, "rvdw should be >= 0");
284 !(ir->cutoff_scheme == ecutsVERLET && ir->verletbuf_tol > 0))
286 warning_error(wi, "rlist should be >= 0");
288 sprintf(err_buf, "nstlist can not be smaller than 0. (If you were trying to use the heuristic neighbour-list update scheme for efficient buffering for improved energy conservation, please use the Verlet cut-off scheme instead.)");
289 CHECK(ir->nstlist < 0);
291 process_interaction_modifier(ir, &ir->coulomb_modifier);
292 process_interaction_modifier(ir, &ir->vdw_modifier);
294 if (ir->cutoff_scheme == ecutsGROUP)
297 "The group cutoff scheme is deprecated since GROMACS 5.0 and will be removed in a future "
298 "release when all interaction forms are supported for the verlet scheme. The verlet "
299 "scheme already scales better, and it is compatible with GPUs and other accelerators.");
301 if (ir->rlist > 0 && ir->rlist < ir->rcoulomb)
303 gmx_fatal(FARGS, "rcoulomb must not be greater than rlist (twin-range schemes are not supported)");
305 if (ir->rlist > 0 && ir->rlist < ir->rvdw)
307 gmx_fatal(FARGS, "rvdw must not be greater than rlist (twin-range schemes are not supported)");
310 if (ir->rlist == 0 && ir->ePBC != epbcNONE)
312 warning_error(wi, "Can not have an infinite cut-off with PBC");
316 if (ir->cutoff_scheme == ecutsVERLET)
320 /* Normal Verlet type neighbor-list, currently only limited feature support */
321 if (inputrec2nboundeddim(ir) < 3)
323 warning_error(wi, "With Verlet lists only full pbc or pbc=xy with walls is supported");
326 // We don't (yet) have general Verlet kernels for rcoulomb!=rvdw
327 if (ir->rcoulomb != ir->rvdw)
329 // Since we have PME coulomb + LJ cut-off kernels with rcoulomb>rvdw
330 // for PME load balancing, we can support this exception.
331 bool bUsesPmeTwinRangeKernel = (EEL_PME_EWALD(ir->coulombtype) &&
332 ir->vdwtype == evdwCUT &&
333 ir->rcoulomb > ir->rvdw);
334 if (!bUsesPmeTwinRangeKernel)
336 warning_error(wi, "With Verlet lists rcoulomb!=rvdw is not supported (except for rcoulomb>rvdw with PME electrostatics)");
340 if (ir->vdwtype == evdwSHIFT || ir->vdwtype == evdwSWITCH)
342 if (ir->vdw_modifier == eintmodNONE ||
343 ir->vdw_modifier == eintmodPOTSHIFT)
345 ir->vdw_modifier = (ir->vdwtype == evdwSHIFT ? eintmodFORCESWITCH : eintmodPOTSWITCH);
347 sprintf(warn_buf, "Replacing vdwtype=%s by the equivalent combination of vdwtype=%s and vdw_modifier=%s", evdw_names[ir->vdwtype], evdw_names[evdwCUT], eintmod_names[ir->vdw_modifier]);
348 warning_note(wi, warn_buf);
350 ir->vdwtype = evdwCUT;
354 sprintf(warn_buf, "Unsupported combination of vdwtype=%s and vdw_modifier=%s", evdw_names[ir->vdwtype], eintmod_names[ir->vdw_modifier]);
355 warning_error(wi, warn_buf);
359 if (!(ir->vdwtype == evdwCUT || ir->vdwtype == evdwPME))
361 warning_error(wi, "With Verlet lists only cut-off and PME LJ interactions are supported");
363 if (!(ir->coulombtype == eelCUT || EEL_RF(ir->coulombtype) ||
364 EEL_PME(ir->coulombtype) || ir->coulombtype == eelEWALD))
366 warning_error(wi, "With Verlet lists only cut-off, reaction-field, PME and Ewald electrostatics are supported");
368 if (!(ir->coulomb_modifier == eintmodNONE ||
369 ir->coulomb_modifier == eintmodPOTSHIFT))
371 sprintf(warn_buf, "coulomb_modifier=%s is not supported with the Verlet cut-off scheme", eintmod_names[ir->coulomb_modifier]);
372 warning_error(wi, warn_buf);
375 if (ir->implicit_solvent != eisNO)
377 warning_error(wi, "Implicit solvent is not (yet) supported with the with Verlet lists.");
380 if (ir->nstlist <= 0)
382 warning_error(wi, "With Verlet lists nstlist should be larger than 0");
385 if (ir->nstlist < 10)
387 warning_note(wi, "With Verlet lists the optimal nstlist is >= 10, with GPUs >= 20. Note that with the Verlet scheme, nstlist has no effect on the accuracy of your simulation.");
390 rc_max = std::max(ir->rvdw, ir->rcoulomb);
392 if (ir->verletbuf_tol <= 0)
394 if (ir->verletbuf_tol == 0)
396 warning_error(wi, "Can not have Verlet buffer tolerance of exactly 0");
399 if (ir->rlist < rc_max)
401 warning_error(wi, "With verlet lists rlist can not be smaller than rvdw or rcoulomb");
404 if (ir->rlist == rc_max && ir->nstlist > 1)
406 warning_note(wi, "rlist is equal to rvdw and/or rcoulomb: there is no explicit Verlet buffer. The cluster pair list does have a buffering effect, but choosing a larger rlist might be necessary for good energy conservation.");
411 if (ir->rlist > rc_max)
413 warning_note(wi, "You have set rlist larger than the interaction cut-off, but you also have verlet-buffer-tolerance > 0. Will set rlist using verlet-buffer-tolerance.");
416 if (ir->nstlist == 1)
418 /* No buffer required */
423 if (EI_DYNAMICS(ir->eI))
425 if (inputrec2nboundeddim(ir) < 3)
427 warning_error(wi, "The box volume is required for calculating rlist from the energy drift with verlet-buffer-tolerance > 0. You are using at least one unbounded dimension, so no volume can be computed. Either use a finite box, or set rlist yourself together with verlet-buffer-tolerance = -1.");
429 /* Set rlist temporarily so we can continue processing */
434 /* Set the buffer to 5% of the cut-off */
435 ir->rlist = (1.0 + verlet_buffer_ratio_nodynamics)*rc_max;
441 /* GENERAL INTEGRATOR STUFF */
444 if (ir->etc != etcNO)
446 if (EI_RANDOM(ir->eI))
448 sprintf(warn_buf, "Setting tcoupl from '%s' to 'no'. %s handles temperature coupling implicitly. See the documentation for more information on which parameters affect temperature for %s.", etcoupl_names[ir->etc], ei_names[ir->eI], ei_names[ir->eI]);
452 sprintf(warn_buf, "Setting tcoupl from '%s' to 'no'. Temperature coupling does not apply to %s.", etcoupl_names[ir->etc], ei_names[ir->eI]);
454 warning_note(wi, warn_buf);
458 if (ir->eI == eiVVAK)
460 sprintf(warn_buf, "Integrator method %s is implemented primarily for validation purposes; for molecular dynamics, you should probably be using %s or %s", ei_names[eiVVAK], ei_names[eiMD], ei_names[eiVV]);
461 warning_note(wi, warn_buf);
463 if (!EI_DYNAMICS(ir->eI))
465 if (ir->epc != epcNO)
467 sprintf(warn_buf, "Setting pcoupl from '%s' to 'no'. Pressure coupling does not apply to %s.", epcoupl_names[ir->epc], ei_names[ir->eI]);
468 warning_note(wi, warn_buf);
472 if (EI_DYNAMICS(ir->eI))
474 if (ir->nstcalcenergy < 0)
476 ir->nstcalcenergy = ir_optimal_nstcalcenergy(ir);
477 if (ir->nstenergy != 0 && ir->nstenergy < ir->nstcalcenergy)
479 /* nstcalcenergy larger than nstener does not make sense.
480 * We ideally want nstcalcenergy=nstener.
484 ir->nstcalcenergy = lcd(ir->nstenergy, ir->nstlist);
488 ir->nstcalcenergy = ir->nstenergy;
492 else if ( (ir->nstenergy > 0 && ir->nstcalcenergy > ir->nstenergy) ||
493 (ir->efep != efepNO && ir->fepvals->nstdhdl > 0 &&
494 (ir->nstcalcenergy > ir->fepvals->nstdhdl) ) )
497 const char *nsten = "nstenergy";
498 const char *nstdh = "nstdhdl";
499 const char *min_name = nsten;
500 int min_nst = ir->nstenergy;
502 /* find the smallest of ( nstenergy, nstdhdl ) */
503 if (ir->efep != efepNO && ir->fepvals->nstdhdl > 0 &&
504 (ir->nstenergy == 0 || ir->fepvals->nstdhdl < ir->nstenergy))
506 min_nst = ir->fepvals->nstdhdl;
509 /* If the user sets nstenergy small, we should respect that */
511 "Setting nstcalcenergy (%d) equal to %s (%d)",
512 ir->nstcalcenergy, min_name, min_nst);
513 warning_note(wi, warn_buf);
514 ir->nstcalcenergy = min_nst;
517 if (ir->epc != epcNO)
519 if (ir->nstpcouple < 0)
521 ir->nstpcouple = ir_optimal_nstpcouple(ir);
525 if (ir->nstcalcenergy > 0)
527 if (ir->efep != efepNO)
529 /* nstdhdl should be a multiple of nstcalcenergy */
530 check_nst("nstcalcenergy", ir->nstcalcenergy,
531 "nstdhdl", &ir->fepvals->nstdhdl, wi);
532 /* nstexpanded should be a multiple of nstcalcenergy */
533 check_nst("nstcalcenergy", ir->nstcalcenergy,
534 "nstexpanded", &ir->expandedvals->nstexpanded, wi);
536 /* for storing exact averages nstenergy should be
537 * a multiple of nstcalcenergy
539 check_nst("nstcalcenergy", ir->nstcalcenergy,
540 "nstenergy", &ir->nstenergy, wi);
544 if (ir->nsteps == 0 && !ir->bContinuation)
546 warning_note(wi, "For a correct single-point energy evaluation with nsteps = 0, use continuation = yes to avoid constraining the input coordinates.");
550 if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
551 ir->bContinuation && ir->ld_seed != -1)
553 warning_note(wi, "You are doing a continuation with SD or BD, make sure that ld_seed is different from the previous run (using ld_seed=-1 will ensure this)");
559 sprintf(err_buf, "TPI only works with pbc = %s", epbc_names[epbcXYZ]);
560 CHECK(ir->ePBC != epbcXYZ);
561 sprintf(err_buf, "TPI only works with ns = %s", ens_names[ensGRID]);
562 CHECK(ir->ns_type != ensGRID);
563 sprintf(err_buf, "with TPI nstlist should be larger than zero");
564 CHECK(ir->nstlist <= 0);
565 sprintf(err_buf, "TPI does not work with full electrostatics other than PME");
566 CHECK(EEL_FULL(ir->coulombtype) && !EEL_PME(ir->coulombtype));
567 sprintf(err_buf, "TPI does not work (yet) with the Verlet cut-off scheme");
568 CHECK(ir->cutoff_scheme == ecutsVERLET);
572 if ( (opts->nshake > 0) && (opts->bMorse) )
575 "Using morse bond-potentials while constraining bonds is useless");
576 warning(wi, warn_buf);
579 if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
580 ir->bContinuation && ir->ld_seed != -1)
582 warning_note(wi, "You are doing a continuation with SD or BD, make sure that ld_seed is different from the previous run (using ld_seed=-1 will ensure this)");
584 /* verify simulated tempering options */
588 gmx_bool bAllTempZero = TRUE;
589 for (i = 0; i < fep->n_lambda; i++)
591 sprintf(err_buf, "Entry %d for %s must be between 0 and 1, instead is %g", i, efpt_names[efptTEMPERATURE], fep->all_lambda[efptTEMPERATURE][i]);
592 CHECK((fep->all_lambda[efptTEMPERATURE][i] < 0) || (fep->all_lambda[efptTEMPERATURE][i] > 1));
593 if (fep->all_lambda[efptTEMPERATURE][i] > 0)
595 bAllTempZero = FALSE;
598 sprintf(err_buf, "if simulated tempering is on, temperature-lambdas may not be all zero");
599 CHECK(bAllTempZero == TRUE);
601 sprintf(err_buf, "Simulated tempering is currently only compatible with md-vv");
602 CHECK(ir->eI != eiVV);
604 /* check compatability of the temperature coupling with simulated tempering */
606 if (ir->etc == etcNOSEHOOVER)
608 sprintf(warn_buf, "Nose-Hoover based temperature control such as [%s] my not be entirelyconsistent with simulated tempering", etcoupl_names[ir->etc]);
609 warning_note(wi, warn_buf);
612 /* check that the temperatures make sense */
614 sprintf(err_buf, "Higher simulated tempering temperature (%g) must be >= than the simulated tempering lower temperature (%g)", ir->simtempvals->simtemp_high, ir->simtempvals->simtemp_low);
615 CHECK(ir->simtempvals->simtemp_high <= ir->simtempvals->simtemp_low);
617 sprintf(err_buf, "Higher simulated tempering temperature (%g) must be >= zero", ir->simtempvals->simtemp_high);
618 CHECK(ir->simtempvals->simtemp_high <= 0);
620 sprintf(err_buf, "Lower simulated tempering temperature (%g) must be >= zero", ir->simtempvals->simtemp_low);
621 CHECK(ir->simtempvals->simtemp_low <= 0);
624 /* verify free energy options */
626 if (ir->efep != efepNO)
629 sprintf(err_buf, "The soft-core power is %d and can only be 1 or 2",
631 CHECK(fep->sc_alpha != 0 && fep->sc_power != 1 && fep->sc_power != 2);
633 sprintf(err_buf, "The soft-core sc-r-power is %d and can only be 6 or 48",
634 (int)fep->sc_r_power);
635 CHECK(fep->sc_alpha != 0 && fep->sc_r_power != 6.0 && fep->sc_r_power != 48.0);
637 sprintf(err_buf, "Can't use positive delta-lambda (%g) if initial state/lambda does not start at zero", fep->delta_lambda);
638 CHECK(fep->delta_lambda > 0 && ((fep->init_fep_state > 0) || (fep->init_lambda > 0)));
640 sprintf(err_buf, "Can't use positive delta-lambda (%g) with expanded ensemble simulations", fep->delta_lambda);
641 CHECK(fep->delta_lambda > 0 && (ir->efep == efepEXPANDED));
643 sprintf(err_buf, "Can only use expanded ensemble with md-vv (for now)");
644 CHECK(!(EI_VV(ir->eI)) && (ir->efep == efepEXPANDED));
646 sprintf(err_buf, "Free-energy not implemented for Ewald");
647 CHECK(ir->coulombtype == eelEWALD);
649 /* check validty of lambda inputs */
650 if (fep->n_lambda == 0)
652 /* Clear output in case of no states:*/
653 sprintf(err_buf, "init-lambda-state set to %d: no lambda states are defined.", fep->init_fep_state);
654 CHECK((fep->init_fep_state >= 0) && (fep->n_lambda == 0));
658 sprintf(err_buf, "initial thermodynamic state %d does not exist, only goes to %d", fep->init_fep_state, fep->n_lambda-1);
659 CHECK((fep->init_fep_state >= fep->n_lambda));
662 sprintf(err_buf, "Lambda state must be set, either with init-lambda-state or with init-lambda");
663 CHECK((fep->init_fep_state < 0) && (fep->init_lambda < 0));
665 sprintf(err_buf, "init-lambda=%g while init-lambda-state=%d. Lambda state must be set either with init-lambda-state or with init-lambda, but not both",
666 fep->init_lambda, fep->init_fep_state);
667 CHECK((fep->init_fep_state >= 0) && (fep->init_lambda >= 0));
671 if ((fep->init_lambda >= 0) && (fep->delta_lambda == 0))
675 for (i = 0; i < efptNR; i++)
677 if (fep->separate_dvdl[i])
682 if (n_lambda_terms > 1)
684 sprintf(warn_buf, "If lambda vector states (fep-lambdas, coul-lambdas etc.) are set, don't use init-lambda to set lambda state (except for slow growth). Use init-lambda-state instead.");
685 warning(wi, warn_buf);
688 if (n_lambda_terms < 2 && fep->n_lambda > 0)
691 "init-lambda is deprecated for setting lambda state (except for slow growth). Use init-lambda-state instead.");
695 for (j = 0; j < efptNR; j++)
697 for (i = 0; i < fep->n_lambda; i++)
699 sprintf(err_buf, "Entry %d for %s must be between 0 and 1, instead is %g", i, efpt_names[j], fep->all_lambda[j][i]);
700 CHECK((fep->all_lambda[j][i] < 0) || (fep->all_lambda[j][i] > 1));
704 if ((fep->sc_alpha > 0) && (!fep->bScCoul))
706 for (i = 0; i < fep->n_lambda; i++)
708 sprintf(err_buf, "For state %d, vdw-lambdas (%f) is changing with vdw softcore, while coul-lambdas (%f) is nonzero without coulomb softcore: this will lead to crashes, and is not supported.", i, fep->all_lambda[efptVDW][i],
709 fep->all_lambda[efptCOUL][i]);
710 CHECK((fep->sc_alpha > 0) &&
711 (((fep->all_lambda[efptCOUL][i] > 0.0) &&
712 (fep->all_lambda[efptCOUL][i] < 1.0)) &&
713 ((fep->all_lambda[efptVDW][i] > 0.0) &&
714 (fep->all_lambda[efptVDW][i] < 1.0))));
718 if ((fep->bScCoul) && (EEL_PME(ir->coulombtype)))
720 real sigma, lambda, r_sc;
723 /* Maximum estimate for A and B charges equal with lambda power 1 */
725 r_sc = std::pow(lambda*fep->sc_alpha*std::pow(sigma/ir->rcoulomb, fep->sc_r_power) + 1.0, 1.0/fep->sc_r_power);
726 sprintf(warn_buf, "With PME there is a minor soft core effect present at the cut-off, proportional to (LJsigma/rcoulomb)^%g. This could have a minor effect on energy conservation, but usually other effects dominate. With a common sigma value of %g nm the fraction of the particle-particle potential at the cut-off at lambda=%g is around %.1e, while ewald-rtol is %.1e.",
728 sigma, lambda, r_sc - 1.0, ir->ewald_rtol);
729 warning_note(wi, warn_buf);
732 /* Free Energy Checks -- In an ideal world, slow growth and FEP would
733 be treated differently, but that's the next step */
735 for (i = 0; i < efptNR; i++)
737 for (j = 0; j < fep->n_lambda; j++)
739 sprintf(err_buf, "%s[%d] must be between 0 and 1", efpt_names[i], j);
740 CHECK((fep->all_lambda[i][j] < 0) || (fep->all_lambda[i][j] > 1));
745 if ((ir->bSimTemp) || (ir->efep == efepEXPANDED))
749 /* checking equilibration of weights inputs for validity */
751 sprintf(err_buf, "weight-equil-number-all-lambda (%d) is ignored if lmc-weights-equil is not equal to %s",
752 expand->equil_n_at_lam, elmceq_names[elmceqNUMATLAM]);
753 CHECK((expand->equil_n_at_lam > 0) && (expand->elmceq != elmceqNUMATLAM));
755 sprintf(err_buf, "weight-equil-number-samples (%d) is ignored if lmc-weights-equil is not equal to %s",
756 expand->equil_samples, elmceq_names[elmceqSAMPLES]);
757 CHECK((expand->equil_samples > 0) && (expand->elmceq != elmceqSAMPLES));
759 sprintf(err_buf, "weight-equil-number-steps (%d) is ignored if lmc-weights-equil is not equal to %s",
760 expand->equil_steps, elmceq_names[elmceqSTEPS]);
761 CHECK((expand->equil_steps > 0) && (expand->elmceq != elmceqSTEPS));
763 sprintf(err_buf, "weight-equil-wl-delta (%d) is ignored if lmc-weights-equil is not equal to %s",
764 expand->equil_samples, elmceq_names[elmceqWLDELTA]);
765 CHECK((expand->equil_wl_delta > 0) && (expand->elmceq != elmceqWLDELTA));
767 sprintf(err_buf, "weight-equil-count-ratio (%f) is ignored if lmc-weights-equil is not equal to %s",
768 expand->equil_ratio, elmceq_names[elmceqRATIO]);
769 CHECK((expand->equil_ratio > 0) && (expand->elmceq != elmceqRATIO));
771 sprintf(err_buf, "weight-equil-number-all-lambda (%d) must be a positive integer if lmc-weights-equil=%s",
772 expand->equil_n_at_lam, elmceq_names[elmceqNUMATLAM]);
773 CHECK((expand->equil_n_at_lam <= 0) && (expand->elmceq == elmceqNUMATLAM));
775 sprintf(err_buf, "weight-equil-number-samples (%d) must be a positive integer if lmc-weights-equil=%s",
776 expand->equil_samples, elmceq_names[elmceqSAMPLES]);
777 CHECK((expand->equil_samples <= 0) && (expand->elmceq == elmceqSAMPLES));
779 sprintf(err_buf, "weight-equil-number-steps (%d) must be a positive integer if lmc-weights-equil=%s",
780 expand->equil_steps, elmceq_names[elmceqSTEPS]);
781 CHECK((expand->equil_steps <= 0) && (expand->elmceq == elmceqSTEPS));
783 sprintf(err_buf, "weight-equil-wl-delta (%f) must be > 0 if lmc-weights-equil=%s",
784 expand->equil_wl_delta, elmceq_names[elmceqWLDELTA]);
785 CHECK((expand->equil_wl_delta <= 0) && (expand->elmceq == elmceqWLDELTA));
787 sprintf(err_buf, "weight-equil-count-ratio (%f) must be > 0 if lmc-weights-equil=%s",
788 expand->equil_ratio, elmceq_names[elmceqRATIO]);
789 CHECK((expand->equil_ratio <= 0) && (expand->elmceq == elmceqRATIO));
791 sprintf(err_buf, "lmc-weights-equil=%s only possible when lmc-stats = %s or lmc-stats %s",
792 elmceq_names[elmceqWLDELTA], elamstats_names[elamstatsWL], elamstats_names[elamstatsWWL]);
793 CHECK((expand->elmceq == elmceqWLDELTA) && (!EWL(expand->elamstats)));
795 sprintf(err_buf, "lmc-repeats (%d) must be greater than 0", expand->lmc_repeats);
796 CHECK((expand->lmc_repeats <= 0));
797 sprintf(err_buf, "minimum-var-min (%d) must be greater than 0", expand->minvarmin);
798 CHECK((expand->minvarmin <= 0));
799 sprintf(err_buf, "weight-c-range (%d) must be greater or equal to 0", expand->c_range);
800 CHECK((expand->c_range < 0));
801 sprintf(err_buf, "init-lambda-state (%d) must be zero if lmc-forced-nstart (%d)> 0 and lmc-move != 'no'",
802 fep->init_fep_state, expand->lmc_forced_nstart);
803 CHECK((fep->init_fep_state != 0) && (expand->lmc_forced_nstart > 0) && (expand->elmcmove != elmcmoveNO));
804 sprintf(err_buf, "lmc-forced-nstart (%d) must not be negative", expand->lmc_forced_nstart);
805 CHECK((expand->lmc_forced_nstart < 0));
806 sprintf(err_buf, "init-lambda-state (%d) must be in the interval [0,number of lambdas)", fep->init_fep_state);
807 CHECK((fep->init_fep_state < 0) || (fep->init_fep_state >= fep->n_lambda));
809 sprintf(err_buf, "init-wl-delta (%f) must be greater than or equal to 0", expand->init_wl_delta);
810 CHECK((expand->init_wl_delta < 0));
811 sprintf(err_buf, "wl-ratio (%f) must be between 0 and 1", expand->wl_ratio);
812 CHECK((expand->wl_ratio <= 0) || (expand->wl_ratio >= 1));
813 sprintf(err_buf, "wl-scale (%f) must be between 0 and 1", expand->wl_scale);
814 CHECK((expand->wl_scale <= 0) || (expand->wl_scale >= 1));
816 /* if there is no temperature control, we need to specify an MC temperature */
817 sprintf(err_buf, "If there is no temperature control, and lmc-mcmove!= 'no',mc_temperature must be set to a positive number");
818 if (expand->nstTij > 0)
820 sprintf(err_buf, "nstlog must be non-zero");
821 CHECK(ir->nstlog != 0);
822 sprintf(err_buf, "nst-transition-matrix (%d) must be an integer multiple of nstlog (%d)",
823 expand->nstTij, ir->nstlog);
824 CHECK((expand->nstTij % ir->nstlog) != 0);
829 sprintf(err_buf, "walls only work with pbc=%s", epbc_names[epbcXY]);
830 CHECK(ir->nwall && ir->ePBC != epbcXY);
833 if (ir->ePBC != epbcXYZ && ir->nwall != 2)
835 if (ir->ePBC == epbcNONE)
837 if (ir->epc != epcNO)
839 warning(wi, "Turning off pressure coupling for vacuum system");
845 sprintf(err_buf, "Can not have pressure coupling with pbc=%s",
846 epbc_names[ir->ePBC]);
847 CHECK(ir->epc != epcNO);
849 sprintf(err_buf, "Can not have Ewald with pbc=%s", epbc_names[ir->ePBC]);
850 CHECK(EEL_FULL(ir->coulombtype));
852 sprintf(err_buf, "Can not have dispersion correction with pbc=%s",
853 epbc_names[ir->ePBC]);
854 CHECK(ir->eDispCorr != edispcNO);
857 if (ir->rlist == 0.0)
859 sprintf(err_buf, "can only have neighborlist cut-off zero (=infinite)\n"
860 "with coulombtype = %s or coulombtype = %s\n"
861 "without periodic boundary conditions (pbc = %s) and\n"
862 "rcoulomb and rvdw set to zero",
863 eel_names[eelCUT], eel_names[eelUSER], epbc_names[epbcNONE]);
864 CHECK(((ir->coulombtype != eelCUT) && (ir->coulombtype != eelUSER)) ||
865 (ir->ePBC != epbcNONE) ||
866 (ir->rcoulomb != 0.0) || (ir->rvdw != 0.0));
870 warning_note(wi, "Simulating without cut-offs can be (slightly) faster with nstlist=0, nstype=simple and only one MPI rank");
875 if (ir->nstcomm == 0)
877 ir->comm_mode = ecmNO;
879 if (ir->comm_mode != ecmNO)
883 warning(wi, "If you want to remove the rotation around the center of mass, you should set comm_mode = Angular instead of setting nstcomm < 0. nstcomm is modified to its absolute value");
884 ir->nstcomm = abs(ir->nstcomm);
887 if (ir->nstcalcenergy > 0 && ir->nstcomm < ir->nstcalcenergy)
889 warning_note(wi, "nstcomm < nstcalcenergy defeats the purpose of nstcalcenergy, setting nstcomm to nstcalcenergy");
890 ir->nstcomm = ir->nstcalcenergy;
893 if (ir->comm_mode == ecmANGULAR)
895 sprintf(err_buf, "Can not remove the rotation around the center of mass with periodic molecules");
896 CHECK(ir->bPeriodicMols);
897 if (ir->ePBC != epbcNONE)
899 warning(wi, "Removing the rotation around the center of mass in a periodic system, this can lead to artifacts. Only use this on a single (cluster of) molecules. This cluster should not cross periodic boundaries.");
904 if (EI_STATE_VELOCITY(ir->eI) && ir->ePBC == epbcNONE && ir->comm_mode != ecmANGULAR)
906 warning_note(wi, "Tumbling and or flying ice-cubes: We are not removing rotation around center of mass in a non-periodic system. You should probably set comm_mode = ANGULAR.");
909 /* TEMPERATURE COUPLING */
910 if (ir->etc == etcYES)
912 ir->etc = etcBERENDSEN;
913 warning_note(wi, "Old option for temperature coupling given: "
914 "changing \"yes\" to \"Berendsen\"\n");
917 if ((ir->etc == etcNOSEHOOVER) || (ir->epc == epcMTTK))
919 if (ir->opts.nhchainlength < 1)
921 sprintf(warn_buf, "number of Nose-Hoover chains (currently %d) cannot be less than 1,reset to 1\n", ir->opts.nhchainlength);
922 ir->opts.nhchainlength = 1;
923 warning(wi, warn_buf);
926 if (ir->etc == etcNOSEHOOVER && !EI_VV(ir->eI) && ir->opts.nhchainlength > 1)
928 warning_note(wi, "leapfrog does not yet support Nose-Hoover chains, nhchainlength reset to 1");
929 ir->opts.nhchainlength = 1;
934 ir->opts.nhchainlength = 0;
937 if (ir->eI == eiVVAK)
939 sprintf(err_buf, "%s implemented primarily for validation, and requires nsttcouple = 1 and nstpcouple = 1.",
941 CHECK((ir->nsttcouple != 1) || (ir->nstpcouple != 1));
944 if (ETC_ANDERSEN(ir->etc))
946 sprintf(err_buf, "%s temperature control not supported for integrator %s.", etcoupl_names[ir->etc], ei_names[ir->eI]);
947 CHECK(!(EI_VV(ir->eI)));
949 if (ir->nstcomm > 0 && (ir->etc == etcANDERSEN))
951 sprintf(warn_buf, "Center of mass removal not necessary for %s. All velocities of coupled groups are rerandomized periodically, so flying ice cube errors will not occur.", etcoupl_names[ir->etc]);
952 warning_note(wi, warn_buf);
955 sprintf(err_buf, "nstcomm must be 1, not %d for %s, as velocities of atoms in coupled groups are randomized every time step", ir->nstcomm, etcoupl_names[ir->etc]);
956 CHECK(ir->nstcomm > 1 && (ir->etc == etcANDERSEN));
959 if (ir->etc == etcBERENDSEN)
961 sprintf(warn_buf, "The %s thermostat does not generate the correct kinetic energy distribution. You might want to consider using the %s thermostat.",
962 ETCOUPLTYPE(ir->etc), ETCOUPLTYPE(etcVRESCALE));
963 warning_note(wi, warn_buf);
966 if ((ir->etc == etcNOSEHOOVER || ETC_ANDERSEN(ir->etc))
967 && ir->epc == epcBERENDSEN)
969 sprintf(warn_buf, "Using Berendsen pressure coupling invalidates the "
970 "true ensemble for the thermostat");
971 warning(wi, warn_buf);
974 /* PRESSURE COUPLING */
975 if (ir->epc == epcISOTROPIC)
977 ir->epc = epcBERENDSEN;
978 warning_note(wi, "Old option for pressure coupling given: "
979 "changing \"Isotropic\" to \"Berendsen\"\n");
982 if (ir->epc != epcNO)
984 dt_pcoupl = ir->nstpcouple*ir->delta_t;
986 sprintf(err_buf, "tau-p must be > 0 instead of %g\n", ir->tau_p);
987 CHECK(ir->tau_p <= 0);
989 if (ir->tau_p/dt_pcoupl < pcouple_min_integration_steps(ir->epc) - 10*GMX_REAL_EPS)
991 sprintf(warn_buf, "For proper integration of the %s barostat, tau-p (%g) should be at least %d times larger than nstpcouple*dt (%g)",
992 EPCOUPLTYPE(ir->epc), ir->tau_p, pcouple_min_integration_steps(ir->epc), dt_pcoupl);
993 warning(wi, warn_buf);
996 sprintf(err_buf, "compressibility must be > 0 when using pressure"
997 " coupling %s\n", EPCOUPLTYPE(ir->epc));
998 CHECK(ir->compress[XX][XX] < 0 || ir->compress[YY][YY] < 0 ||
999 ir->compress[ZZ][ZZ] < 0 ||
1000 (trace(ir->compress) == 0 && ir->compress[YY][XX] <= 0 &&
1001 ir->compress[ZZ][XX] <= 0 && ir->compress[ZZ][YY] <= 0));
1003 if (epcPARRINELLORAHMAN == ir->epc && opts->bGenVel)
1006 "You are generating velocities so I am assuming you "
1007 "are equilibrating a system. You are using "
1008 "%s pressure coupling, but this can be "
1009 "unstable for equilibration. If your system crashes, try "
1010 "equilibrating first with Berendsen pressure coupling. If "
1011 "you are not equilibrating the system, you can probably "
1012 "ignore this warning.",
1013 epcoupl_names[ir->epc]);
1014 warning(wi, warn_buf);
1020 if (ir->epc > epcNO)
1022 if ((ir->epc != epcBERENDSEN) && (ir->epc != epcMTTK))
1024 warning_error(wi, "for md-vv and md-vv-avek, can only use Berendsen and Martyna-Tuckerman-Tobias-Klein (MTTK) equations for pressure control; MTTK is equivalent to Parrinello-Rahman.");
1030 if (ir->epc == epcMTTK)
1032 warning_error(wi, "MTTK pressure coupling requires a Velocity-verlet integrator");
1036 /* ELECTROSTATICS */
1037 /* More checks are in triple check (grompp.c) */
1039 if (ir->coulombtype == eelSWITCH)
1041 sprintf(warn_buf, "coulombtype = %s is only for testing purposes and can lead to serious "
1042 "artifacts, advice: use coulombtype = %s",
1043 eel_names[ir->coulombtype],
1044 eel_names[eelRF_ZERO]);
1045 warning(wi, warn_buf);
1048 if (ir->epsilon_r != 1 && ir->implicit_solvent == eisGBSA)
1050 sprintf(warn_buf, "epsilon-r = %g with GB implicit solvent, will use this value for inner dielectric", ir->epsilon_r);
1051 warning_note(wi, warn_buf);
1054 if (EEL_RF(ir->coulombtype) && ir->epsilon_rf == 1 && ir->epsilon_r != 1)
1056 sprintf(warn_buf, "epsilon-r = %g and epsilon-rf = 1 with reaction field, proceeding assuming old format and exchanging epsilon-r and epsilon-rf", ir->epsilon_r);
1057 warning(wi, warn_buf);
1058 ir->epsilon_rf = ir->epsilon_r;
1059 ir->epsilon_r = 1.0;
1062 if (ir->epsilon_r == 0)
1065 "It is pointless to use long-range or Generalized Born electrostatics with infinite relative permittivity."
1066 "Since you are effectively turning of electrostatics, a plain cutoff will be much faster.");
1067 CHECK(EEL_FULL(ir->coulombtype) || ir->implicit_solvent == eisGBSA);
1070 if (getenv("GMX_DO_GALACTIC_DYNAMICS") == NULL)
1072 sprintf(err_buf, "epsilon-r must be >= 0 instead of %g\n", ir->epsilon_r);
1073 CHECK(ir->epsilon_r < 0);
1076 if (EEL_RF(ir->coulombtype))
1078 /* reaction field (at the cut-off) */
1080 if (ir->coulombtype == eelRF_ZERO && ir->epsilon_rf != 0)
1082 sprintf(warn_buf, "With coulombtype = %s, epsilon-rf must be 0, assuming you meant epsilon_rf=0",
1083 eel_names[ir->coulombtype]);
1084 warning(wi, warn_buf);
1085 ir->epsilon_rf = 0.0;
1088 sprintf(err_buf, "epsilon-rf must be >= epsilon-r");
1089 CHECK((ir->epsilon_rf < ir->epsilon_r && ir->epsilon_rf != 0) ||
1090 (ir->epsilon_r == 0));
1091 if (ir->epsilon_rf == ir->epsilon_r)
1093 sprintf(warn_buf, "Using epsilon-rf = epsilon-r with %s does not make sense",
1094 eel_names[ir->coulombtype]);
1095 warning(wi, warn_buf);
1098 /* Allow rlist>rcoulomb for tabulated long range stuff. This just
1099 * means the interaction is zero outside rcoulomb, but it helps to
1100 * provide accurate energy conservation.
1102 if (ir_coulomb_might_be_zero_at_cutoff(ir))
1104 if (ir_coulomb_switched(ir))
1107 "With coulombtype = %s rcoulomb_switch must be < rcoulomb. Or, better: Use the potential modifier options!",
1108 eel_names[ir->coulombtype]);
1109 CHECK(ir->rcoulomb_switch >= ir->rcoulomb);
1112 else if (ir->coulombtype == eelCUT || EEL_RF(ir->coulombtype))
1114 if (ir->cutoff_scheme == ecutsGROUP && ir->coulomb_modifier == eintmodNONE)
1116 sprintf(err_buf, "With coulombtype = %s, rcoulomb should be >= rlist unless you use a potential modifier",
1117 eel_names[ir->coulombtype]);
1118 CHECK(ir->rlist > ir->rcoulomb);
1122 if (ir->coulombtype == eelSWITCH || ir->coulombtype == eelSHIFT)
1125 "Explicit switch/shift coulomb interactions cannot be used in combination with a secondary coulomb-modifier.");
1126 CHECK( ir->coulomb_modifier != eintmodNONE);
1128 if (ir->vdwtype == evdwSWITCH || ir->vdwtype == evdwSHIFT)
1131 "Explicit switch/shift vdw interactions cannot be used in combination with a secondary vdw-modifier.");
1132 CHECK( ir->vdw_modifier != eintmodNONE);
1135 if (ir->coulombtype == eelSWITCH || ir->coulombtype == eelSHIFT ||
1136 ir->vdwtype == evdwSWITCH || ir->vdwtype == evdwSHIFT)
1139 "The switch/shift interaction settings are just for compatibility; you will get better "
1140 "performance from applying potential modifiers to your interactions!\n");
1141 warning_note(wi, warn_buf);
1144 if (ir->coulombtype == eelPMESWITCH || ir->coulomb_modifier == eintmodPOTSWITCH)
1146 if (ir->rcoulomb_switch/ir->rcoulomb < 0.9499)
1148 real percentage = 100*(ir->rcoulomb-ir->rcoulomb_switch)/ir->rcoulomb;
1149 sprintf(warn_buf, "The switching range should be 5%% or less (currently %.2f%% using a switching range of %4f-%4f) for accurate electrostatic energies, energy conservation will be good regardless, since ewald_rtol = %g.",
1150 percentage, ir->rcoulomb_switch, ir->rcoulomb, ir->ewald_rtol);
1151 warning(wi, warn_buf);
1155 if (ir->vdwtype == evdwSWITCH || ir->vdw_modifier == eintmodPOTSWITCH)
1157 if (ir->rvdw_switch == 0)
1159 sprintf(warn_buf, "rvdw-switch is equal 0 even though you are using a switched Lennard-Jones potential. This suggests it was not set in the mdp, which can lead to large energy errors. In GROMACS, 0.05 to 0.1 nm is often a reasonable vdw switching range.");
1160 warning(wi, warn_buf);
1164 if (EEL_FULL(ir->coulombtype))
1166 if (ir->coulombtype == eelPMESWITCH || ir->coulombtype == eelPMEUSER ||
1167 ir->coulombtype == eelPMEUSERSWITCH)
1169 sprintf(err_buf, "With coulombtype = %s, rcoulomb must be <= rlist",
1170 eel_names[ir->coulombtype]);
1171 CHECK(ir->rcoulomb > ir->rlist);
1173 else if (ir->cutoff_scheme == ecutsGROUP && ir->coulomb_modifier == eintmodNONE)
1175 if (ir->coulombtype == eelPME || ir->coulombtype == eelP3M_AD)
1178 "With coulombtype = %s (without modifier), rcoulomb must be equal to rlist.\n"
1179 "For optimal energy conservation,consider using\n"
1180 "a potential modifier.", eel_names[ir->coulombtype]);
1181 CHECK(ir->rcoulomb != ir->rlist);
1186 if (EEL_PME(ir->coulombtype) || EVDW_PME(ir->vdwtype))
1188 if (ir->pme_order < 3)
1190 warning_error(wi, "pme-order can not be smaller than 3");
1194 if (ir->nwall == 2 && EEL_FULL(ir->coulombtype))
1196 if (ir->ewald_geometry == eewg3D)
1198 sprintf(warn_buf, "With pbc=%s you should use ewald-geometry=%s",
1199 epbc_names[ir->ePBC], eewg_names[eewg3DC]);
1200 warning(wi, warn_buf);
1202 /* This check avoids extra pbc coding for exclusion corrections */
1203 sprintf(err_buf, "wall-ewald-zfac should be >= 2");
1204 CHECK(ir->wall_ewald_zfac < 2);
1206 if ((ir->ewald_geometry == eewg3DC) && (ir->ePBC != epbcXY) &&
1207 EEL_FULL(ir->coulombtype))
1209 sprintf(warn_buf, "With %s and ewald_geometry = %s you should use pbc = %s",
1210 eel_names[ir->coulombtype], eewg_names[eewg3DC], epbc_names[epbcXY]);
1211 warning(wi, warn_buf);
1213 if ((ir->epsilon_surface != 0) && EEL_FULL(ir->coulombtype))
1215 if (ir->cutoff_scheme == ecutsVERLET)
1217 sprintf(warn_buf, "Since molecules/charge groups are broken using the Verlet scheme, you can not use a dipole correction to the %s electrostatics.",
1218 eel_names[ir->coulombtype]);
1219 warning(wi, warn_buf);
1223 sprintf(warn_buf, "Dipole corrections to %s electrostatics only work if all charge groups that can cross PBC boundaries are dipoles. If this is not the case set epsilon_surface to 0",
1224 eel_names[ir->coulombtype]);
1225 warning_note(wi, warn_buf);
1229 if (ir_vdw_switched(ir))
1231 sprintf(err_buf, "With switched vdw forces or potentials, rvdw-switch must be < rvdw");
1232 CHECK(ir->rvdw_switch >= ir->rvdw);
1234 if (ir->rvdw_switch < 0.5*ir->rvdw)
1236 sprintf(warn_buf, "You are applying a switch function to vdw forces or potentials from %g to %g nm, which is more than half the interaction range, whereas switch functions are intended to act only close to the cut-off.",
1237 ir->rvdw_switch, ir->rvdw);
1238 warning_note(wi, warn_buf);
1241 else if (ir->vdwtype == evdwCUT || ir->vdwtype == evdwPME)
1243 if (ir->cutoff_scheme == ecutsGROUP && ir->vdw_modifier == eintmodNONE)
1245 sprintf(err_buf, "With vdwtype = %s, rvdw must be >= rlist unless you use a potential modifier", evdw_names[ir->vdwtype]);
1246 CHECK(ir->rlist > ir->rvdw);
1250 if (ir->vdwtype == evdwPME)
1252 if (!(ir->vdw_modifier == eintmodNONE || ir->vdw_modifier == eintmodPOTSHIFT))
1254 sprintf(err_buf, "With vdwtype = %s, the only supported modifiers are %s and %s",
1255 evdw_names[ir->vdwtype],
1256 eintmod_names[eintmodPOTSHIFT],
1257 eintmod_names[eintmodNONE]);
1261 if (ir->cutoff_scheme == ecutsGROUP)
1263 if (((ir->coulomb_modifier != eintmodNONE && ir->rcoulomb == ir->rlist) ||
1264 (ir->vdw_modifier != eintmodNONE && ir->rvdw == ir->rlist)))
1266 warning_note(wi, "With exact cut-offs, rlist should be "
1267 "larger than rcoulomb and rvdw, so that there "
1268 "is a buffer region for particle motion "
1269 "between neighborsearch steps");
1272 if (ir_coulomb_is_zero_at_cutoff(ir) && ir->rlist <= ir->rcoulomb)
1274 sprintf(warn_buf, "For energy conservation with switch/shift potentials, rlist should be 0.1 to 0.3 nm larger than rcoulomb.");
1275 warning_note(wi, warn_buf);
1277 if (ir_vdw_switched(ir) && (ir->rlist <= ir->rvdw))
1279 sprintf(warn_buf, "For energy conservation with switch/shift potentials, rlist should be 0.1 to 0.3 nm larger than rvdw.");
1280 warning_note(wi, warn_buf);
1284 if (ir->vdwtype == evdwUSER && ir->eDispCorr != edispcNO)
1286 warning_note(wi, "You have selected user tables with dispersion correction, the dispersion will be corrected to -C6/r^6 beyond rvdw_switch (the tabulated interaction between rvdw_switch and rvdw will not be double counted). Make sure that you really want dispersion correction to -C6/r^6.");
1289 if (ir->eI == eiLBFGS && (ir->coulombtype == eelCUT || ir->vdwtype == evdwCUT)
1292 warning(wi, "For efficient BFGS minimization, use switch/shift/pme instead of cut-off.");
1295 if (ir->eI == eiLBFGS && ir->nbfgscorr <= 0)
1297 warning(wi, "Using L-BFGS with nbfgscorr<=0 just gets you steepest descent.");
1300 /* ENERGY CONSERVATION */
1301 if (ir_NVE(ir) && ir->cutoff_scheme == ecutsGROUP)
1303 if (!ir_vdw_might_be_zero_at_cutoff(ir) && ir->rvdw > 0 && ir->vdw_modifier == eintmodNONE)
1305 sprintf(warn_buf, "You are using a cut-off for VdW interactions with NVE, for good energy conservation use vdwtype = %s (possibly with DispCorr)",
1306 evdw_names[evdwSHIFT]);
1307 warning_note(wi, warn_buf);
1309 if (!ir_coulomb_might_be_zero_at_cutoff(ir) && ir->rcoulomb > 0)
1311 sprintf(warn_buf, "You are using a cut-off for electrostatics with NVE, for good energy conservation use coulombtype = %s or %s",
1312 eel_names[eelPMESWITCH], eel_names[eelRF_ZERO]);
1313 warning_note(wi, warn_buf);
1317 /* IMPLICIT SOLVENT */
1318 if (ir->coulombtype == eelGB_NOTUSED)
1320 sprintf(warn_buf, "Invalid option %s for coulombtype",
1321 eel_names[ir->coulombtype]);
1322 warning_error(wi, warn_buf);
1325 if (ir->sa_algorithm == esaSTILL)
1327 sprintf(err_buf, "Still SA algorithm not available yet, use %s or %s instead\n", esa_names[esaAPPROX], esa_names[esaNO]);
1328 CHECK(ir->sa_algorithm == esaSTILL);
1331 if (ir->implicit_solvent == eisGBSA)
1333 sprintf(err_buf, "With GBSA implicit solvent, rgbradii must be equal to rlist.");
1334 CHECK(ir->rgbradii != ir->rlist);
1336 if (ir->coulombtype != eelCUT)
1338 sprintf(err_buf, "With GBSA, coulombtype must be equal to %s\n", eel_names[eelCUT]);
1339 CHECK(ir->coulombtype != eelCUT);
1341 if (ir->vdwtype != evdwCUT)
1343 sprintf(err_buf, "With GBSA, vdw-type must be equal to %s\n", evdw_names[evdwCUT]);
1344 CHECK(ir->vdwtype != evdwCUT);
1346 if (ir->nstgbradii < 1)
1348 sprintf(warn_buf, "Using GBSA with nstgbradii<1, setting nstgbradii=1");
1349 warning_note(wi, warn_buf);
1352 if (ir->sa_algorithm == esaNO)
1354 sprintf(warn_buf, "No SA (non-polar) calculation requested together with GB. Are you sure this is what you want?\n");
1355 warning_note(wi, warn_buf);
1357 if (ir->sa_surface_tension < 0 && ir->sa_algorithm != esaNO)
1359 sprintf(warn_buf, "Value of sa_surface_tension is < 0. Changing it to 2.05016 or 2.25936 kJ/nm^2/mol for Still and HCT/OBC respectively\n");
1360 warning_note(wi, warn_buf);
1362 if (ir->gb_algorithm == egbSTILL)
1364 ir->sa_surface_tension = 0.0049 * CAL2JOULE * 100;
1368 ir->sa_surface_tension = 0.0054 * CAL2JOULE * 100;
1371 if (ir->sa_surface_tension == 0 && ir->sa_algorithm != esaNO)
1373 sprintf(err_buf, "Surface tension set to 0 while SA-calculation requested\n");
1374 CHECK(ir->sa_surface_tension == 0 && ir->sa_algorithm != esaNO);
1381 if (ir->cutoff_scheme != ecutsGROUP)
1383 warning_error(wi, "QMMM is currently only supported with cutoff-scheme=group");
1385 if (!EI_DYNAMICS(ir->eI))
1388 sprintf(buf, "QMMM is only supported with dynamics, not with integrator %s", ei_names[ir->eI]);
1389 warning_error(wi, buf);
1395 gmx_fatal(FARGS, "AdResS simulations are no longer supported");
1399 /* count the number of text elemets separated by whitespace in a string.
1400 str = the input string
1401 maxptr = the maximum number of allowed elements
1402 ptr = the output array of pointers to the first character of each element
1403 returns: the number of elements. */
1404 int str_nelem(const char *str, int maxptr, char *ptr[])
1409 copy0 = gmx_strdup(str);
1412 while (*copy != '\0')
1416 gmx_fatal(FARGS, "Too many groups on line: '%s' (max is %d)",
1424 while ((*copy != '\0') && !isspace(*copy))
1443 /* interpret a number of doubles from a string and put them in an array,
1444 after allocating space for them.
1445 str = the input string
1446 n = the (pre-allocated) number of doubles read
1447 r = the output array of doubles. */
1448 static void parse_n_real(char *str, int *n, real **r, warninp_t wi)
1453 char warn_buf[STRLEN];
1455 *n = str_nelem(str, MAXPTR, ptr);
1458 for (i = 0; i < *n; i++)
1460 (*r)[i] = strtod(ptr[i], &endptr);
1463 sprintf(warn_buf, "Invalid value %s in string in mdp file. Expected a real number.", ptr[i]);
1464 warning_error(wi, warn_buf);
1469 static void do_fep_params(t_inputrec *ir, char fep_lambda[][STRLEN], char weights[STRLEN], warninp_t wi)
1472 int i, j, max_n_lambda, nweights, nfep[efptNR];
1473 t_lambda *fep = ir->fepvals;
1474 t_expanded *expand = ir->expandedvals;
1475 real **count_fep_lambdas;
1476 gmx_bool bOneLambda = TRUE;
1478 snew(count_fep_lambdas, efptNR);
1480 /* FEP input processing */
1481 /* first, identify the number of lambda values for each type.
1482 All that are nonzero must have the same number */
1484 for (i = 0; i < efptNR; i++)
1486 parse_n_real(fep_lambda[i], &(nfep[i]), &(count_fep_lambdas[i]), wi);
1489 /* now, determine the number of components. All must be either zero, or equal. */
1492 for (i = 0; i < efptNR; i++)
1494 if (nfep[i] > max_n_lambda)
1496 max_n_lambda = nfep[i]; /* here's a nonzero one. All of them
1497 must have the same number if its not zero.*/
1502 for (i = 0; i < efptNR; i++)
1506 ir->fepvals->separate_dvdl[i] = FALSE;
1508 else if (nfep[i] == max_n_lambda)
1510 if (i != efptTEMPERATURE) /* we treat this differently -- not really a reason to compute the derivative with
1511 respect to the temperature currently */
1513 ir->fepvals->separate_dvdl[i] = TRUE;
1518 gmx_fatal(FARGS, "Number of lambdas (%d) for FEP type %s not equal to number of other types (%d)",
1519 nfep[i], efpt_names[i], max_n_lambda);
1522 /* we don't print out dhdl if the temperature is changing, since we can't correctly define dhdl in this case */
1523 ir->fepvals->separate_dvdl[efptTEMPERATURE] = FALSE;
1525 /* the number of lambdas is the number we've read in, which is either zero
1526 or the same for all */
1527 fep->n_lambda = max_n_lambda;
1529 /* allocate space for the array of lambda values */
1530 snew(fep->all_lambda, efptNR);
1531 /* if init_lambda is defined, we need to set lambda */
1532 if ((fep->init_lambda > 0) && (fep->n_lambda == 0))
1534 ir->fepvals->separate_dvdl[efptFEP] = TRUE;
1536 /* otherwise allocate the space for all of the lambdas, and transfer the data */
1537 for (i = 0; i < efptNR; i++)
1539 snew(fep->all_lambda[i], fep->n_lambda);
1540 if (nfep[i] > 0) /* if it's zero, then the count_fep_lambda arrays
1543 for (j = 0; j < fep->n_lambda; j++)
1545 fep->all_lambda[i][j] = (double)count_fep_lambdas[i][j];
1547 sfree(count_fep_lambdas[i]);
1550 sfree(count_fep_lambdas);
1552 /* "fep-vals" is either zero or the full number. If zero, we'll need to define fep-lambdas for internal
1553 bookkeeping -- for now, init_lambda */
1555 if ((nfep[efptFEP] == 0) && (fep->init_lambda >= 0))
1557 for (i = 0; i < fep->n_lambda; i++)
1559 fep->all_lambda[efptFEP][i] = fep->init_lambda;
1563 /* check to see if only a single component lambda is defined, and soft core is defined.
1564 In this case, turn on coulomb soft core */
1566 if (max_n_lambda == 0)
1572 for (i = 0; i < efptNR; i++)
1574 if ((nfep[i] != 0) && (i != efptFEP))
1580 if ((bOneLambda) && (fep->sc_alpha > 0))
1582 fep->bScCoul = TRUE;
1585 /* Fill in the others with the efptFEP if they are not explicitly
1586 specified (i.e. nfep[i] == 0). This means if fep is not defined,
1587 they are all zero. */
1589 for (i = 0; i < efptNR; i++)
1591 if ((nfep[i] == 0) && (i != efptFEP))
1593 for (j = 0; j < fep->n_lambda; j++)
1595 fep->all_lambda[i][j] = fep->all_lambda[efptFEP][j];
1601 /* make it easier if sc_r_power = 48 by increasing it to the 4th power, to be in the right scale. */
1602 if (fep->sc_r_power == 48)
1604 if (fep->sc_alpha > 0.1)
1606 gmx_fatal(FARGS, "sc_alpha (%f) for sc_r_power = 48 should usually be between 0.001 and 0.004", fep->sc_alpha);
1610 /* now read in the weights */
1611 parse_n_real(weights, &nweights, &(expand->init_lambda_weights), wi);
1614 snew(expand->init_lambda_weights, fep->n_lambda); /* initialize to zero */
1616 else if (nweights != fep->n_lambda)
1618 gmx_fatal(FARGS, "Number of weights (%d) is not equal to number of lambda values (%d)",
1619 nweights, fep->n_lambda);
1621 if ((expand->nstexpanded < 0) && (ir->efep != efepNO))
1623 expand->nstexpanded = fep->nstdhdl;
1624 /* if you don't specify nstexpanded when doing expanded ensemble free energy calcs, it is set to nstdhdl */
1626 if ((expand->nstexpanded < 0) && ir->bSimTemp)
1628 expand->nstexpanded = 2*(int)(ir->opts.tau_t[0]/ir->delta_t);
1629 /* if you don't specify nstexpanded when doing expanded ensemble simulated tempering, it is set to
1630 2*tau_t just to be careful so it's not to frequent */
1635 static void do_simtemp_params(t_inputrec *ir)
1638 snew(ir->simtempvals->temperatures, ir->fepvals->n_lambda);
1639 GetSimTemps(ir->fepvals->n_lambda, ir->simtempvals, ir->fepvals->all_lambda[efptTEMPERATURE]);
1644 static void do_wall_params(t_inputrec *ir,
1645 char *wall_atomtype, char *wall_density,
1649 char *names[MAXPTR];
1652 opts->wall_atomtype[0] = NULL;
1653 opts->wall_atomtype[1] = NULL;
1655 ir->wall_atomtype[0] = -1;
1656 ir->wall_atomtype[1] = -1;
1657 ir->wall_density[0] = 0;
1658 ir->wall_density[1] = 0;
1662 nstr = str_nelem(wall_atomtype, MAXPTR, names);
1663 if (nstr != ir->nwall)
1665 gmx_fatal(FARGS, "Expected %d elements for wall_atomtype, found %d",
1668 for (i = 0; i < ir->nwall; i++)
1670 opts->wall_atomtype[i] = gmx_strdup(names[i]);
1673 if (ir->wall_type == ewt93 || ir->wall_type == ewt104)
1675 nstr = str_nelem(wall_density, MAXPTR, names);
1676 if (nstr != ir->nwall)
1678 gmx_fatal(FARGS, "Expected %d elements for wall-density, found %d", ir->nwall, nstr);
1680 for (i = 0; i < ir->nwall; i++)
1682 if (sscanf(names[i], "%lf", &dbl) != 1)
1684 gmx_fatal(FARGS, "Could not parse wall-density value from string '%s'", names[i]);
1688 gmx_fatal(FARGS, "wall-density[%d] = %f\n", i, dbl);
1690 ir->wall_density[i] = dbl;
1696 static void add_wall_energrps(gmx_groups_t *groups, int nwall, t_symtab *symtab)
1704 srenew(groups->grpname, groups->ngrpname+nwall);
1705 grps = &(groups->grps[egcENER]);
1706 srenew(grps->nm_ind, grps->nr+nwall);
1707 for (i = 0; i < nwall; i++)
1709 sprintf(str, "wall%d", i);
1710 groups->grpname[groups->ngrpname] = put_symtab(symtab, str);
1711 grps->nm_ind[grps->nr++] = groups->ngrpname++;
1716 void read_expandedparams(int *ninp_p, t_inpfile **inp_p,
1717 t_expanded *expand, warninp_t wi)
1725 /* read expanded ensemble parameters */
1726 CCTYPE ("expanded ensemble variables");
1727 ITYPE ("nstexpanded", expand->nstexpanded, -1);
1728 EETYPE("lmc-stats", expand->elamstats, elamstats_names);
1729 EETYPE("lmc-move", expand->elmcmove, elmcmove_names);
1730 EETYPE("lmc-weights-equil", expand->elmceq, elmceq_names);
1731 ITYPE ("weight-equil-number-all-lambda", expand->equil_n_at_lam, -1);
1732 ITYPE ("weight-equil-number-samples", expand->equil_samples, -1);
1733 ITYPE ("weight-equil-number-steps", expand->equil_steps, -1);
1734 RTYPE ("weight-equil-wl-delta", expand->equil_wl_delta, -1);
1735 RTYPE ("weight-equil-count-ratio", expand->equil_ratio, -1);
1736 CCTYPE("Seed for Monte Carlo in lambda space");
1737 ITYPE ("lmc-seed", expand->lmc_seed, -1);
1738 RTYPE ("mc-temperature", expand->mc_temp, -1);
1739 ITYPE ("lmc-repeats", expand->lmc_repeats, 1);
1740 ITYPE ("lmc-gibbsdelta", expand->gibbsdeltalam, -1);
1741 ITYPE ("lmc-forced-nstart", expand->lmc_forced_nstart, 0);
1742 EETYPE("symmetrized-transition-matrix", expand->bSymmetrizedTMatrix, yesno_names);
1743 ITYPE("nst-transition-matrix", expand->nstTij, -1);
1744 ITYPE ("mininum-var-min", expand->minvarmin, 100); /*default is reasonable */
1745 ITYPE ("weight-c-range", expand->c_range, 0); /* default is just C=0 */
1746 RTYPE ("wl-scale", expand->wl_scale, 0.8);
1747 RTYPE ("wl-ratio", expand->wl_ratio, 0.8);
1748 RTYPE ("init-wl-delta", expand->init_wl_delta, 1.0);
1749 EETYPE("wl-oneovert", expand->bWLoneovert, yesno_names);
1757 /*! \brief Return whether an end state with the given coupling-lambda
1758 * value describes fully-interacting VDW.
1760 * \param[in] couple_lambda_value Enumeration ecouplam value describing the end state
1761 * \return Whether VDW is on (i.e. the user chose vdw or vdw-q in the .mdp file)
1763 static gmx_bool couple_lambda_has_vdw_on(int couple_lambda_value)
1765 return (couple_lambda_value == ecouplamVDW ||
1766 couple_lambda_value == ecouplamVDWQ);
1772 class MdpErrorHandler : public gmx::IKeyValueTreeErrorHandler
1775 explicit MdpErrorHandler(warninp_t wi)
1776 : wi_(wi), mapping_(nullptr)
1780 void setBackMapping(const gmx::IKeyValueTreeBackMapping &mapping)
1782 mapping_ = &mapping;
1785 virtual bool onError(gmx::UserInputError *ex, const gmx::KeyValueTreePath &context)
1787 ex->prependContext(gmx::formatString("Error in mdp option \"%s\":",
1788 getOptionName(context).c_str()));
1789 std::string message = gmx::formatExceptionMessageToString(*ex);
1790 warning_error(wi_, message.c_str());
1795 std::string getOptionName(const gmx::KeyValueTreePath &context)
1797 if (mapping_ != nullptr)
1799 gmx::KeyValueTreePath path = mapping_->originalPath(context);
1800 GMX_ASSERT(path.size() == 1, "Inconsistent mapping back to mdp options");
1803 GMX_ASSERT(context.size() == 1, "Inconsistent context for mdp option parsing");
1808 const gmx::IKeyValueTreeBackMapping *mapping_;
1813 void get_ir(const char *mdparin, const char *mdparout,
1814 t_inputrec *ir, t_gromppopts *opts,
1818 double dumdub[2][6];
1822 char warn_buf[STRLEN];
1823 t_lambda *fep = ir->fepvals;
1824 t_expanded *expand = ir->expandedvals;
1826 init_inputrec_strings();
1827 inp = read_inpfile(mdparin, &ninp, wi);
1829 snew(dumstr[0], STRLEN);
1830 snew(dumstr[1], STRLEN);
1832 if (-1 == search_einp(ninp, inp, "cutoff-scheme"))
1835 "%s did not specify a value for the .mdp option "
1836 "\"cutoff-scheme\". Probably it was first intended for use "
1837 "with GROMACS before 4.6. In 4.6, the Verlet scheme was "
1838 "introduced, but the group scheme was still the default. "
1839 "The default is now the Verlet scheme, so you will observe "
1840 "different behaviour.", mdparin);
1841 warning_note(wi, warn_buf);
1844 /* ignore the following deprecated commands */
1847 REM_TYPE("domain-decomposition");
1848 REM_TYPE("andersen-seed");
1850 REM_TYPE("dihre-fc");
1851 REM_TYPE("dihre-tau");
1852 REM_TYPE("nstdihreout");
1853 REM_TYPE("nstcheckpoint");
1854 REM_TYPE("optimize-fft");
1855 REM_TYPE("adress_type");
1856 REM_TYPE("adress_const_wf");
1857 REM_TYPE("adress_ex_width");
1858 REM_TYPE("adress_hy_width");
1859 REM_TYPE("adress_ex_forcecap");
1860 REM_TYPE("adress_interface_correction");
1861 REM_TYPE("adress_site");
1862 REM_TYPE("adress_reference_coords");
1863 REM_TYPE("adress_tf_grp_names");
1864 REM_TYPE("adress_cg_grp_names");
1865 REM_TYPE("adress_do_hybridpairs");
1866 REM_TYPE("rlistlong");
1867 REM_TYPE("nstcalclr");
1868 REM_TYPE("pull-print-com2");
1870 /* replace the following commands with the clearer new versions*/
1871 REPL_TYPE("unconstrained-start", "continuation");
1872 REPL_TYPE("foreign-lambda", "fep-lambdas");
1873 REPL_TYPE("verlet-buffer-drift", "verlet-buffer-tolerance");
1874 REPL_TYPE("nstxtcout", "nstxout-compressed");
1875 REPL_TYPE("xtc-grps", "compressed-x-grps");
1876 REPL_TYPE("xtc-precision", "compressed-x-precision");
1877 REPL_TYPE("pull-print-com1", "pull-print-com");
1879 CCTYPE ("VARIOUS PREPROCESSING OPTIONS");
1880 CTYPE ("Preprocessor information: use cpp syntax.");
1881 CTYPE ("e.g.: -I/home/joe/doe -I/home/mary/roe");
1882 STYPE ("include", opts->include, NULL);
1883 CTYPE ("e.g.: -DPOSRES -DFLEXIBLE (note these variable names are case sensitive)");
1884 STYPE ("define", opts->define, NULL);
1886 CCTYPE ("RUN CONTROL PARAMETERS");
1887 EETYPE("integrator", ir->eI, ei_names);
1888 CTYPE ("Start time and timestep in ps");
1889 RTYPE ("tinit", ir->init_t, 0.0);
1890 RTYPE ("dt", ir->delta_t, 0.001);
1891 STEPTYPE ("nsteps", ir->nsteps, 0);
1892 CTYPE ("For exact run continuation or redoing part of a run");
1893 STEPTYPE ("init-step", ir->init_step, 0);
1894 CTYPE ("Part index is updated automatically on checkpointing (keeps files separate)");
1895 ITYPE ("simulation-part", ir->simulation_part, 1);
1896 CTYPE ("mode for center of mass motion removal");
1897 EETYPE("comm-mode", ir->comm_mode, ecm_names);
1898 CTYPE ("number of steps for center of mass motion removal");
1899 ITYPE ("nstcomm", ir->nstcomm, 100);
1900 CTYPE ("group(s) for center of mass motion removal");
1901 STYPE ("comm-grps", is->vcm, NULL);
1903 CCTYPE ("LANGEVIN DYNAMICS OPTIONS");
1904 CTYPE ("Friction coefficient (amu/ps) and random seed");
1905 RTYPE ("bd-fric", ir->bd_fric, 0.0);
1906 STEPTYPE ("ld-seed", ir->ld_seed, -1);
1909 CCTYPE ("ENERGY MINIMIZATION OPTIONS");
1910 CTYPE ("Force tolerance and initial step-size");
1911 RTYPE ("emtol", ir->em_tol, 10.0);
1912 RTYPE ("emstep", ir->em_stepsize, 0.01);
1913 CTYPE ("Max number of iterations in relax-shells");
1914 ITYPE ("niter", ir->niter, 20);
1915 CTYPE ("Step size (ps^2) for minimization of flexible constraints");
1916 RTYPE ("fcstep", ir->fc_stepsize, 0);
1917 CTYPE ("Frequency of steepest descents steps when doing CG");
1918 ITYPE ("nstcgsteep", ir->nstcgsteep, 1000);
1919 ITYPE ("nbfgscorr", ir->nbfgscorr, 10);
1921 CCTYPE ("TEST PARTICLE INSERTION OPTIONS");
1922 RTYPE ("rtpi", ir->rtpi, 0.05);
1924 /* Output options */
1925 CCTYPE ("OUTPUT CONTROL OPTIONS");
1926 CTYPE ("Output frequency for coords (x), velocities (v) and forces (f)");
1927 ITYPE ("nstxout", ir->nstxout, 0);
1928 ITYPE ("nstvout", ir->nstvout, 0);
1929 ITYPE ("nstfout", ir->nstfout, 0);
1930 CTYPE ("Output frequency for energies to log file and energy file");
1931 ITYPE ("nstlog", ir->nstlog, 1000);
1932 ITYPE ("nstcalcenergy", ir->nstcalcenergy, 100);
1933 ITYPE ("nstenergy", ir->nstenergy, 1000);
1934 CTYPE ("Output frequency and precision for .xtc file");
1935 ITYPE ("nstxout-compressed", ir->nstxout_compressed, 0);
1936 RTYPE ("compressed-x-precision", ir->x_compression_precision, 1000.0);
1937 CTYPE ("This selects the subset of atoms for the compressed");
1938 CTYPE ("trajectory file. You can select multiple groups. By");
1939 CTYPE ("default, all atoms will be written.");
1940 STYPE ("compressed-x-grps", is->x_compressed_groups, NULL);
1941 CTYPE ("Selection of energy groups");
1942 STYPE ("energygrps", is->energy, NULL);
1944 /* Neighbor searching */
1945 CCTYPE ("NEIGHBORSEARCHING PARAMETERS");
1946 CTYPE ("cut-off scheme (Verlet: particle based cut-offs, group: using charge groups)");
1947 EETYPE("cutoff-scheme", ir->cutoff_scheme, ecutscheme_names);
1948 CTYPE ("nblist update frequency");
1949 ITYPE ("nstlist", ir->nstlist, 10);
1950 CTYPE ("ns algorithm (simple or grid)");
1951 EETYPE("ns-type", ir->ns_type, ens_names);
1952 CTYPE ("Periodic boundary conditions: xyz, no, xy");
1953 EETYPE("pbc", ir->ePBC, epbc_names);
1954 EETYPE("periodic-molecules", ir->bPeriodicMols, yesno_names);
1955 CTYPE ("Allowed energy error due to the Verlet buffer in kJ/mol/ps per atom,");
1956 CTYPE ("a value of -1 means: use rlist");
1957 RTYPE("verlet-buffer-tolerance", ir->verletbuf_tol, 0.005);
1958 CTYPE ("nblist cut-off");
1959 RTYPE ("rlist", ir->rlist, 1.0);
1960 CTYPE ("long-range cut-off for switched potentials");
1962 /* Electrostatics */
1963 CCTYPE ("OPTIONS FOR ELECTROSTATICS AND VDW");
1964 CTYPE ("Method for doing electrostatics");
1965 EETYPE("coulombtype", ir->coulombtype, eel_names);
1966 EETYPE("coulomb-modifier", ir->coulomb_modifier, eintmod_names);
1967 CTYPE ("cut-off lengths");
1968 RTYPE ("rcoulomb-switch", ir->rcoulomb_switch, 0.0);
1969 RTYPE ("rcoulomb", ir->rcoulomb, 1.0);
1970 CTYPE ("Relative dielectric constant for the medium and the reaction field");
1971 RTYPE ("epsilon-r", ir->epsilon_r, 1.0);
1972 RTYPE ("epsilon-rf", ir->epsilon_rf, 0.0);
1973 CTYPE ("Method for doing Van der Waals");
1974 EETYPE("vdw-type", ir->vdwtype, evdw_names);
1975 EETYPE("vdw-modifier", ir->vdw_modifier, eintmod_names);
1976 CTYPE ("cut-off lengths");
1977 RTYPE ("rvdw-switch", ir->rvdw_switch, 0.0);
1978 RTYPE ("rvdw", ir->rvdw, 1.0);
1979 CTYPE ("Apply long range dispersion corrections for Energy and Pressure");
1980 EETYPE("DispCorr", ir->eDispCorr, edispc_names);
1981 CTYPE ("Extension of the potential lookup tables beyond the cut-off");
1982 RTYPE ("table-extension", ir->tabext, 1.0);
1983 CTYPE ("Separate tables between energy group pairs");
1984 STYPE ("energygrp-table", is->egptable, NULL);
1985 CTYPE ("Spacing for the PME/PPPM FFT grid");
1986 RTYPE ("fourierspacing", ir->fourier_spacing, 0.12);
1987 CTYPE ("FFT grid size, when a value is 0 fourierspacing will be used");
1988 ITYPE ("fourier-nx", ir->nkx, 0);
1989 ITYPE ("fourier-ny", ir->nky, 0);
1990 ITYPE ("fourier-nz", ir->nkz, 0);
1991 CTYPE ("EWALD/PME/PPPM parameters");
1992 ITYPE ("pme-order", ir->pme_order, 4);
1993 RTYPE ("ewald-rtol", ir->ewald_rtol, 0.00001);
1994 RTYPE ("ewald-rtol-lj", ir->ewald_rtol_lj, 0.001);
1995 EETYPE("lj-pme-comb-rule", ir->ljpme_combination_rule, eljpme_names);
1996 EETYPE("ewald-geometry", ir->ewald_geometry, eewg_names);
1997 RTYPE ("epsilon-surface", ir->epsilon_surface, 0.0);
1999 CCTYPE("IMPLICIT SOLVENT ALGORITHM");
2000 EETYPE("implicit-solvent", ir->implicit_solvent, eis_names);
2002 CCTYPE ("GENERALIZED BORN ELECTROSTATICS");
2003 CTYPE ("Algorithm for calculating Born radii");
2004 EETYPE("gb-algorithm", ir->gb_algorithm, egb_names);
2005 CTYPE ("Frequency of calculating the Born radii inside rlist");
2006 ITYPE ("nstgbradii", ir->nstgbradii, 1);
2007 CTYPE ("Cutoff for Born radii calculation; the contribution from atoms");
2008 CTYPE ("between rlist and rgbradii is updated every nstlist steps");
2009 RTYPE ("rgbradii", ir->rgbradii, 1.0);
2010 CTYPE ("Dielectric coefficient of the implicit solvent");
2011 RTYPE ("gb-epsilon-solvent", ir->gb_epsilon_solvent, 80.0);
2012 CTYPE ("Salt concentration in M for Generalized Born models");
2013 RTYPE ("gb-saltconc", ir->gb_saltconc, 0.0);
2014 CTYPE ("Scaling factors used in the OBC GB model. Default values are OBC(II)");
2015 RTYPE ("gb-obc-alpha", ir->gb_obc_alpha, 1.0);
2016 RTYPE ("gb-obc-beta", ir->gb_obc_beta, 0.8);
2017 RTYPE ("gb-obc-gamma", ir->gb_obc_gamma, 4.85);
2018 RTYPE ("gb-dielectric-offset", ir->gb_dielectric_offset, 0.009);
2019 EETYPE("sa-algorithm", ir->sa_algorithm, esa_names);
2020 CTYPE ("Surface tension (kJ/mol/nm^2) for the SA (nonpolar surface) part of GBSA");
2021 CTYPE ("The value -1 will set default value for Still/HCT/OBC GB-models.");
2022 RTYPE ("sa-surface-tension", ir->sa_surface_tension, -1);
2024 /* Coupling stuff */
2025 CCTYPE ("OPTIONS FOR WEAK COUPLING ALGORITHMS");
2026 CTYPE ("Temperature coupling");
2027 EETYPE("tcoupl", ir->etc, etcoupl_names);
2028 ITYPE ("nsttcouple", ir->nsttcouple, -1);
2029 ITYPE("nh-chain-length", ir->opts.nhchainlength, 10);
2030 EETYPE("print-nose-hoover-chain-variables", ir->bPrintNHChains, yesno_names);
2031 CTYPE ("Groups to couple separately");
2032 STYPE ("tc-grps", is->tcgrps, NULL);
2033 CTYPE ("Time constant (ps) and reference temperature (K)");
2034 STYPE ("tau-t", is->tau_t, NULL);
2035 STYPE ("ref-t", is->ref_t, NULL);
2036 CTYPE ("pressure coupling");
2037 EETYPE("pcoupl", ir->epc, epcoupl_names);
2038 EETYPE("pcoupltype", ir->epct, epcoupltype_names);
2039 ITYPE ("nstpcouple", ir->nstpcouple, -1);
2040 CTYPE ("Time constant (ps), compressibility (1/bar) and reference P (bar)");
2041 RTYPE ("tau-p", ir->tau_p, 1.0);
2042 STYPE ("compressibility", dumstr[0], NULL);
2043 STYPE ("ref-p", dumstr[1], NULL);
2044 CTYPE ("Scaling of reference coordinates, No, All or COM");
2045 EETYPE ("refcoord-scaling", ir->refcoord_scaling, erefscaling_names);
2048 CCTYPE ("OPTIONS FOR QMMM calculations");
2049 EETYPE("QMMM", ir->bQMMM, yesno_names);
2050 CTYPE ("Groups treated Quantum Mechanically");
2051 STYPE ("QMMM-grps", is->QMMM, NULL);
2052 CTYPE ("QM method");
2053 STYPE("QMmethod", is->QMmethod, NULL);
2054 CTYPE ("QMMM scheme");
2055 EETYPE("QMMMscheme", ir->QMMMscheme, eQMMMscheme_names);
2056 CTYPE ("QM basisset");
2057 STYPE("QMbasis", is->QMbasis, NULL);
2058 CTYPE ("QM charge");
2059 STYPE ("QMcharge", is->QMcharge, NULL);
2060 CTYPE ("QM multiplicity");
2061 STYPE ("QMmult", is->QMmult, NULL);
2062 CTYPE ("Surface Hopping");
2063 STYPE ("SH", is->bSH, NULL);
2064 CTYPE ("CAS space options");
2065 STYPE ("CASorbitals", is->CASorbitals, NULL);
2066 STYPE ("CASelectrons", is->CASelectrons, NULL);
2067 STYPE ("SAon", is->SAon, NULL);
2068 STYPE ("SAoff", is->SAoff, NULL);
2069 STYPE ("SAsteps", is->SAsteps, NULL);
2070 CTYPE ("Scale factor for MM charges");
2071 RTYPE ("MMChargeScaleFactor", ir->scalefactor, 1.0);
2072 CTYPE ("Optimization of QM subsystem");
2073 STYPE ("bOPT", is->bOPT, NULL);
2074 STYPE ("bTS", is->bTS, NULL);
2076 /* Simulated annealing */
2077 CCTYPE("SIMULATED ANNEALING");
2078 CTYPE ("Type of annealing for each temperature group (no/single/periodic)");
2079 STYPE ("annealing", is->anneal, NULL);
2080 CTYPE ("Number of time points to use for specifying annealing in each group");
2081 STYPE ("annealing-npoints", is->anneal_npoints, NULL);
2082 CTYPE ("List of times at the annealing points for each group");
2083 STYPE ("annealing-time", is->anneal_time, NULL);
2084 CTYPE ("Temp. at each annealing point, for each group.");
2085 STYPE ("annealing-temp", is->anneal_temp, NULL);
2088 CCTYPE ("GENERATE VELOCITIES FOR STARTUP RUN");
2089 EETYPE("gen-vel", opts->bGenVel, yesno_names);
2090 RTYPE ("gen-temp", opts->tempi, 300.0);
2091 ITYPE ("gen-seed", opts->seed, -1);
2094 CCTYPE ("OPTIONS FOR BONDS");
2095 EETYPE("constraints", opts->nshake, constraints);
2096 CTYPE ("Type of constraint algorithm");
2097 EETYPE("constraint-algorithm", ir->eConstrAlg, econstr_names);
2098 CTYPE ("Do not constrain the start configuration");
2099 EETYPE("continuation", ir->bContinuation, yesno_names);
2100 CTYPE ("Use successive overrelaxation to reduce the number of shake iterations");
2101 EETYPE("Shake-SOR", ir->bShakeSOR, yesno_names);
2102 CTYPE ("Relative tolerance of shake");
2103 RTYPE ("shake-tol", ir->shake_tol, 0.0001);
2104 CTYPE ("Highest order in the expansion of the constraint coupling matrix");
2105 ITYPE ("lincs-order", ir->nProjOrder, 4);
2106 CTYPE ("Number of iterations in the final step of LINCS. 1 is fine for");
2107 CTYPE ("normal simulations, but use 2 to conserve energy in NVE runs.");
2108 CTYPE ("For energy minimization with constraints it should be 4 to 8.");
2109 ITYPE ("lincs-iter", ir->nLincsIter, 1);
2110 CTYPE ("Lincs will write a warning to the stderr if in one step a bond");
2111 CTYPE ("rotates over more degrees than");
2112 RTYPE ("lincs-warnangle", ir->LincsWarnAngle, 30.0);
2113 CTYPE ("Convert harmonic bonds to morse potentials");
2114 EETYPE("morse", opts->bMorse, yesno_names);
2116 /* Energy group exclusions */
2117 CCTYPE ("ENERGY GROUP EXCLUSIONS");
2118 CTYPE ("Pairs of energy groups for which all non-bonded interactions are excluded");
2119 STYPE ("energygrp-excl", is->egpexcl, NULL);
2123 CTYPE ("Number of walls, type, atom types, densities and box-z scale factor for Ewald");
2124 ITYPE ("nwall", ir->nwall, 0);
2125 EETYPE("wall-type", ir->wall_type, ewt_names);
2126 RTYPE ("wall-r-linpot", ir->wall_r_linpot, -1);
2127 STYPE ("wall-atomtype", is->wall_atomtype, NULL);
2128 STYPE ("wall-density", is->wall_density, NULL);
2129 RTYPE ("wall-ewald-zfac", ir->wall_ewald_zfac, 3);
2132 CCTYPE("COM PULLING");
2133 EETYPE("pull", ir->bPull, yesno_names);
2137 is->pull_grp = read_pullparams(&ninp, &inp, ir->pull, wi);
2140 /* Enforced rotation */
2141 CCTYPE("ENFORCED ROTATION");
2142 CTYPE("Enforced rotation: No or Yes");
2143 EETYPE("rotation", ir->bRot, yesno_names);
2147 is->rot_grp = read_rotparams(&ninp, &inp, ir->rot, wi);
2150 /* Interactive MD */
2152 CCTYPE("Group to display and/or manipulate in interactive MD session");
2153 STYPE ("IMD-group", is->imd_grp, NULL);
2154 if (is->imd_grp[0] != '\0')
2161 CCTYPE("NMR refinement stuff");
2162 CTYPE ("Distance restraints type: No, Simple or Ensemble");
2163 EETYPE("disre", ir->eDisre, edisre_names);
2164 CTYPE ("Force weighting of pairs in one distance restraint: Conservative or Equal");
2165 EETYPE("disre-weighting", ir->eDisreWeighting, edisreweighting_names);
2166 CTYPE ("Use sqrt of the time averaged times the instantaneous violation");
2167 EETYPE("disre-mixed", ir->bDisreMixed, yesno_names);
2168 RTYPE ("disre-fc", ir->dr_fc, 1000.0);
2169 RTYPE ("disre-tau", ir->dr_tau, 0.0);
2170 CTYPE ("Output frequency for pair distances to energy file");
2171 ITYPE ("nstdisreout", ir->nstdisreout, 100);
2172 CTYPE ("Orientation restraints: No or Yes");
2173 EETYPE("orire", opts->bOrire, yesno_names);
2174 CTYPE ("Orientation restraints force constant and tau for time averaging");
2175 RTYPE ("orire-fc", ir->orires_fc, 0.0);
2176 RTYPE ("orire-tau", ir->orires_tau, 0.0);
2177 STYPE ("orire-fitgrp", is->orirefitgrp, NULL);
2178 CTYPE ("Output frequency for trace(SD) and S to energy file");
2179 ITYPE ("nstorireout", ir->nstorireout, 100);
2181 /* free energy variables */
2182 CCTYPE ("Free energy variables");
2183 EETYPE("free-energy", ir->efep, efep_names);
2184 STYPE ("couple-moltype", is->couple_moltype, NULL);
2185 EETYPE("couple-lambda0", opts->couple_lam0, couple_lam);
2186 EETYPE("couple-lambda1", opts->couple_lam1, couple_lam);
2187 EETYPE("couple-intramol", opts->bCoupleIntra, yesno_names);
2189 RTYPE ("init-lambda", fep->init_lambda, -1); /* start with -1 so
2191 it was not entered */
2192 ITYPE ("init-lambda-state", fep->init_fep_state, -1);
2193 RTYPE ("delta-lambda", fep->delta_lambda, 0.0);
2194 ITYPE ("nstdhdl", fep->nstdhdl, 50);
2195 STYPE ("fep-lambdas", is->fep_lambda[efptFEP], NULL);
2196 STYPE ("mass-lambdas", is->fep_lambda[efptMASS], NULL);
2197 STYPE ("coul-lambdas", is->fep_lambda[efptCOUL], NULL);
2198 STYPE ("vdw-lambdas", is->fep_lambda[efptVDW], NULL);
2199 STYPE ("bonded-lambdas", is->fep_lambda[efptBONDED], NULL);
2200 STYPE ("restraint-lambdas", is->fep_lambda[efptRESTRAINT], NULL);
2201 STYPE ("temperature-lambdas", is->fep_lambda[efptTEMPERATURE], NULL);
2202 ITYPE ("calc-lambda-neighbors", fep->lambda_neighbors, 1);
2203 STYPE ("init-lambda-weights", is->lambda_weights, NULL);
2204 EETYPE("dhdl-print-energy", fep->edHdLPrintEnergy, edHdLPrintEnergy_names);
2205 RTYPE ("sc-alpha", fep->sc_alpha, 0.0);
2206 ITYPE ("sc-power", fep->sc_power, 1);
2207 RTYPE ("sc-r-power", fep->sc_r_power, 6.0);
2208 RTYPE ("sc-sigma", fep->sc_sigma, 0.3);
2209 EETYPE("sc-coul", fep->bScCoul, yesno_names);
2210 ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2211 RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2212 EETYPE("separate-dhdl-file", fep->separate_dhdl_file,
2213 separate_dhdl_file_names);
2214 EETYPE("dhdl-derivatives", fep->dhdl_derivatives, dhdl_derivatives_names);
2215 ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2216 RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2218 /* Non-equilibrium MD stuff */
2219 CCTYPE("Non-equilibrium MD stuff");
2220 STYPE ("acc-grps", is->accgrps, NULL);
2221 STYPE ("accelerate", is->acc, NULL);
2222 STYPE ("freezegrps", is->freeze, NULL);
2223 STYPE ("freezedim", is->frdim, NULL);
2224 RTYPE ("cos-acceleration", ir->cos_accel, 0);
2225 STYPE ("deform", is->deform, NULL);
2227 /* simulated tempering variables */
2228 CCTYPE("simulated tempering variables");
2229 EETYPE("simulated-tempering", ir->bSimTemp, yesno_names);
2230 EETYPE("simulated-tempering-scaling", ir->simtempvals->eSimTempScale, esimtemp_names);
2231 RTYPE("sim-temp-low", ir->simtempvals->simtemp_low, 300.0);
2232 RTYPE("sim-temp-high", ir->simtempvals->simtemp_high, 300.0);
2234 /* expanded ensemble variables */
2235 if (ir->efep == efepEXPANDED || ir->bSimTemp)
2237 read_expandedparams(&ninp, &inp, expand, wi);
2240 /* Electric fields */
2242 gmx::KeyValueTreeObject convertedValues = flatKeyValueTreeFromInpFile(ninp, inp);
2243 gmx::KeyValueTreeTransformer transform;
2244 transform.rules()->addRule()
2245 .keyMatchType("/", gmx::StringCompareType::CaseAndDashInsensitive);
2246 ir->efield->initMdpTransform(transform.rules());
2247 for (const auto &path : transform.mappedPaths())
2249 GMX_ASSERT(path.size() == 1, "Inconsistent mapping back to mdp options");
2250 mark_einp_set(ninp, inp, path[0].c_str());
2252 gmx::Options options;
2253 ir->efield->initMdpOptions(&options);
2254 MdpErrorHandler errorHandler(wi);
2256 = transform.transform(convertedValues, &errorHandler);
2257 errorHandler.setBackMapping(result.backMapping());
2258 gmx::assignOptionsFromKeyValueTree(&options, result.object(),
2262 /* Ion/water position swapping ("computational electrophysiology") */
2263 CCTYPE("Ion/water position swapping for computational electrophysiology setups");
2264 CTYPE("Swap positions along direction: no, X, Y, Z");
2265 EETYPE("swapcoords", ir->eSwapCoords, eSwapTypes_names);
2266 if (ir->eSwapCoords != eswapNO)
2273 CTYPE("Swap attempt frequency");
2274 ITYPE("swap-frequency", ir->swap->nstswap, 1);
2275 CTYPE("Number of ion types to be controlled");
2276 ITYPE("iontypes", nIonTypes, 1);
2279 warning_error(wi, "You need to provide at least one ion type for position exchanges.");
2281 ir->swap->ngrp = nIonTypes + eSwapFixedGrpNR;
2282 snew(ir->swap->grp, ir->swap->ngrp);
2283 for (i = 0; i < ir->swap->ngrp; i++)
2285 snew(ir->swap->grp[i].molname, STRLEN);
2287 CTYPE("Two index groups that contain the compartment-partitioning atoms");
2288 STYPE("split-group0", ir->swap->grp[eGrpSplit0].molname, NULL);
2289 STYPE("split-group1", ir->swap->grp[eGrpSplit1].molname, NULL);
2290 CTYPE("Use center of mass of split groups (yes/no), otherwise center of geometry is used");
2291 EETYPE("massw-split0", ir->swap->massw_split[0], yesno_names);
2292 EETYPE("massw-split1", ir->swap->massw_split[1], yesno_names);
2294 CTYPE("Name of solvent molecules");
2295 STYPE("solvent-group", ir->swap->grp[eGrpSolvent].molname, NULL);
2297 CTYPE("Split cylinder: radius, upper and lower extension (nm) (this will define the channels)");
2298 CTYPE("Note that the split cylinder settings do not have an influence on the swapping protocol,");
2299 CTYPE("however, if correctly defined, the permeation events are recorded per channel");
2300 RTYPE("cyl0-r", ir->swap->cyl0r, 2.0);
2301 RTYPE("cyl0-up", ir->swap->cyl0u, 1.0);
2302 RTYPE("cyl0-down", ir->swap->cyl0l, 1.0);
2303 RTYPE("cyl1-r", ir->swap->cyl1r, 2.0);
2304 RTYPE("cyl1-up", ir->swap->cyl1u, 1.0);
2305 RTYPE("cyl1-down", ir->swap->cyl1l, 1.0);
2307 CTYPE("Average the number of ions per compartment over these many swap attempt steps");
2308 ITYPE("coupl-steps", ir->swap->nAverage, 10);
2310 CTYPE("Names of the ion types that can be exchanged with solvent molecules,");
2311 CTYPE("and the requested number of ions of this type in compartments A and B");
2312 CTYPE("-1 means fix the numbers as found in step 0");
2313 for (i = 0; i < nIonTypes; i++)
2315 int ig = eSwapFixedGrpNR + i;
2317 sprintf(buf, "iontype%d-name", i);
2318 STYPE(buf, ir->swap->grp[ig].molname, NULL);
2319 sprintf(buf, "iontype%d-in-A", i);
2320 ITYPE(buf, ir->swap->grp[ig].nmolReq[0], -1);
2321 sprintf(buf, "iontype%d-in-B", i);
2322 ITYPE(buf, ir->swap->grp[ig].nmolReq[1], -1);
2325 CTYPE("By default (i.e. bulk offset = 0.0), ion/water exchanges happen between layers");
2326 CTYPE("at maximum distance (= bulk concentration) to the split group layers. However,");
2327 CTYPE("an offset b (-1.0 < b < +1.0) can be specified to offset the bulk layer from the middle at 0.0");
2328 CTYPE("towards one of the compartment-partitioning layers (at +/- 1.0).");
2329 RTYPE("bulk-offsetA", ir->swap->bulkOffset[0], 0.0);
2330 RTYPE("bulk-offsetB", ir->swap->bulkOffset[1], 0.0);
2331 if (!(ir->swap->bulkOffset[0] > -1.0 && ir->swap->bulkOffset[0] < 1.0)
2332 || !(ir->swap->bulkOffset[1] > -1.0 && ir->swap->bulkOffset[1] < 1.0) )
2334 warning_error(wi, "Bulk layer offsets must be > -1.0 and < 1.0 !");
2337 CTYPE("Start to swap ions if threshold difference to requested count is reached");
2338 RTYPE("threshold", ir->swap->threshold, 1.0);
2341 /* AdResS is no longer supported, but we need mdrun to be able to refuse to run old AdResS .tpr files */
2342 EETYPE("adress", ir->bAdress, yesno_names);
2344 /* User defined thingies */
2345 CCTYPE ("User defined thingies");
2346 STYPE ("user1-grps", is->user1, NULL);
2347 STYPE ("user2-grps", is->user2, NULL);
2348 ITYPE ("userint1", ir->userint1, 0);
2349 ITYPE ("userint2", ir->userint2, 0);
2350 ITYPE ("userint3", ir->userint3, 0);
2351 ITYPE ("userint4", ir->userint4, 0);
2352 RTYPE ("userreal1", ir->userreal1, 0);
2353 RTYPE ("userreal2", ir->userreal2, 0);
2354 RTYPE ("userreal3", ir->userreal3, 0);
2355 RTYPE ("userreal4", ir->userreal4, 0);
2358 write_inpfile(mdparout, ninp, inp, FALSE, wi);
2359 for (i = 0; (i < ninp); i++)
2362 sfree(inp[i].value);
2366 /* Process options if necessary */
2367 for (m = 0; m < 2; m++)
2369 for (i = 0; i < 2*DIM; i++)
2378 if (sscanf(dumstr[m], "%lf", &(dumdub[m][XX])) != 1)
2380 warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 1)");
2382 dumdub[m][YY] = dumdub[m][ZZ] = dumdub[m][XX];
2384 case epctSEMIISOTROPIC:
2385 case epctSURFACETENSION:
2386 if (sscanf(dumstr[m], "%lf%lf", &(dumdub[m][XX]), &(dumdub[m][ZZ])) != 2)
2388 warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 2)");
2390 dumdub[m][YY] = dumdub[m][XX];
2392 case epctANISOTROPIC:
2393 if (sscanf(dumstr[m], "%lf%lf%lf%lf%lf%lf",
2394 &(dumdub[m][XX]), &(dumdub[m][YY]), &(dumdub[m][ZZ]),
2395 &(dumdub[m][3]), &(dumdub[m][4]), &(dumdub[m][5])) != 6)
2397 warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 6)");
2401 gmx_fatal(FARGS, "Pressure coupling type %s not implemented yet",
2402 epcoupltype_names[ir->epct]);
2406 clear_mat(ir->ref_p);
2407 clear_mat(ir->compress);
2408 for (i = 0; i < DIM; i++)
2410 ir->ref_p[i][i] = dumdub[1][i];
2411 ir->compress[i][i] = dumdub[0][i];
2413 if (ir->epct == epctANISOTROPIC)
2415 ir->ref_p[XX][YY] = dumdub[1][3];
2416 ir->ref_p[XX][ZZ] = dumdub[1][4];
2417 ir->ref_p[YY][ZZ] = dumdub[1][5];
2418 if (ir->ref_p[XX][YY] != 0 && ir->ref_p[XX][ZZ] != 0 && ir->ref_p[YY][ZZ] != 0)
2420 warning(wi, "All off-diagonal reference pressures are non-zero. Are you sure you want to apply a threefold shear stress?\n");
2422 ir->compress[XX][YY] = dumdub[0][3];
2423 ir->compress[XX][ZZ] = dumdub[0][4];
2424 ir->compress[YY][ZZ] = dumdub[0][5];
2425 for (i = 0; i < DIM; i++)
2427 for (m = 0; m < i; m++)
2429 ir->ref_p[i][m] = ir->ref_p[m][i];
2430 ir->compress[i][m] = ir->compress[m][i];
2435 if (ir->comm_mode == ecmNO)
2440 opts->couple_moltype = NULL;
2441 if (strlen(is->couple_moltype) > 0)
2443 if (ir->efep != efepNO)
2445 opts->couple_moltype = gmx_strdup(is->couple_moltype);
2446 if (opts->couple_lam0 == opts->couple_lam1)
2448 warning(wi, "The lambda=0 and lambda=1 states for coupling are identical");
2450 if (ir->eI == eiMD && (opts->couple_lam0 == ecouplamNONE ||
2451 opts->couple_lam1 == ecouplamNONE))
2453 warning(wi, "For proper sampling of the (nearly) decoupled state, stochastic dynamics should be used");
2458 warning_note(wi, "Free energy is turned off, so we will not decouple the molecule listed in your input.");
2461 /* FREE ENERGY AND EXPANDED ENSEMBLE OPTIONS */
2462 if (ir->efep != efepNO)
2464 if (fep->delta_lambda > 0)
2466 ir->efep = efepSLOWGROWTH;
2470 if (fep->edHdLPrintEnergy == edHdLPrintEnergyYES)
2472 fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2473 warning_note(wi, "Old option for dhdl-print-energy given: "
2474 "changing \"yes\" to \"total\"\n");
2477 if (ir->bSimTemp && (fep->edHdLPrintEnergy == edHdLPrintEnergyNO))
2479 /* always print out the energy to dhdl if we are doing
2480 expanded ensemble, since we need the total energy for
2481 analysis if the temperature is changing. In some
2482 conditions one may only want the potential energy, so
2483 we will allow that if the appropriate mdp setting has
2484 been enabled. Otherwise, total it is:
2486 fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2489 if ((ir->efep != efepNO) || ir->bSimTemp)
2491 ir->bExpanded = FALSE;
2492 if ((ir->efep == efepEXPANDED) || ir->bSimTemp)
2494 ir->bExpanded = TRUE;
2496 do_fep_params(ir, is->fep_lambda, is->lambda_weights, wi);
2497 if (ir->bSimTemp) /* done after fep params */
2499 do_simtemp_params(ir);
2502 /* Because sc-coul (=FALSE by default) only acts on the lambda state
2503 * setup and not on the old way of specifying the free-energy setup,
2504 * we should check for using soft-core when not needed, since that
2505 * can complicate the sampling significantly.
2506 * Note that we only check for the automated coupling setup.
2507 * If the (advanced) user does FEP through manual topology changes,
2508 * this check will not be triggered.
2510 if (ir->efep != efepNO && ir->fepvals->n_lambda == 0 &&
2511 ir->fepvals->sc_alpha != 0 &&
2512 (couple_lambda_has_vdw_on(opts->couple_lam0) &&
2513 couple_lambda_has_vdw_on(opts->couple_lam1)))
2515 warning(wi, "You are using soft-core interactions while the Van der Waals interactions are not decoupled (note that the sc-coul option is only active when using lambda states). Although this will not lead to errors, you will need much more sampling than without soft-core interactions. Consider using sc-alpha=0.");
2520 ir->fepvals->n_lambda = 0;
2523 /* WALL PARAMETERS */
2525 do_wall_params(ir, is->wall_atomtype, is->wall_density, opts);
2527 /* ORIENTATION RESTRAINT PARAMETERS */
2529 if (opts->bOrire && str_nelem(is->orirefitgrp, MAXPTR, NULL) != 1)
2531 warning_error(wi, "ERROR: Need one orientation restraint fit group\n");
2534 /* DEFORMATION PARAMETERS */
2536 clear_mat(ir->deform);
2537 for (i = 0; i < 6; i++)
2542 double gmx_unused canary;
2543 int ndeform = sscanf(is->deform, "%lf %lf %lf %lf %lf %lf %lf",
2544 &(dumdub[0][0]), &(dumdub[0][1]), &(dumdub[0][2]),
2545 &(dumdub[0][3]), &(dumdub[0][4]), &(dumdub[0][5]), &canary);
2547 if (strlen(is->deform) > 0 && ndeform != 6)
2549 sprintf(warn_buf, "Cannot parse exactly 6 box deformation velocities from string '%s'", is->deform);
2550 warning_error(wi, warn_buf);
2552 for (i = 0; i < 3; i++)
2554 ir->deform[i][i] = dumdub[0][i];
2556 ir->deform[YY][XX] = dumdub[0][3];
2557 ir->deform[ZZ][XX] = dumdub[0][4];
2558 ir->deform[ZZ][YY] = dumdub[0][5];
2559 if (ir->epc != epcNO)
2561 for (i = 0; i < 3; i++)
2563 for (j = 0; j <= i; j++)
2565 if (ir->deform[i][j] != 0 && ir->compress[i][j] != 0)
2567 warning_error(wi, "A box element has deform set and compressibility > 0");
2571 for (i = 0; i < 3; i++)
2573 for (j = 0; j < i; j++)
2575 if (ir->deform[i][j] != 0)
2577 for (m = j; m < DIM; m++)
2579 if (ir->compress[m][j] != 0)
2581 sprintf(warn_buf, "An off-diagonal box element has deform set while compressibility > 0 for the same component of another box vector, this might lead to spurious periodicity effects.");
2582 warning(wi, warn_buf);
2590 /* Ion/water position swapping checks */
2591 if (ir->eSwapCoords != eswapNO)
2593 if (ir->swap->nstswap < 1)
2595 warning_error(wi, "swap_frequency must be 1 or larger when ion swapping is requested");
2597 if (ir->swap->nAverage < 1)
2599 warning_error(wi, "coupl_steps must be 1 or larger.\n");
2601 if (ir->swap->threshold < 1.0)
2603 warning_error(wi, "Ion count threshold must be at least 1.\n");
2611 static int search_QMstring(const char *s, int ng, const char *gn[])
2613 /* same as normal search_string, but this one searches QM strings */
2616 for (i = 0; (i < ng); i++)
2618 if (gmx_strcasecmp(s, gn[i]) == 0)
2624 gmx_fatal(FARGS, "this QM method or basisset (%s) is not implemented\n!", s);
2628 } /* search_QMstring */
2630 /* We would like gn to be const as well, but C doesn't allow this */
2631 /* TODO this is utility functionality (search for the index of a
2632 string in a collection), so should be refactored and located more
2634 int search_string(const char *s, int ng, char *gn[])
2638 for (i = 0; (i < ng); i++)
2640 if (gmx_strcasecmp(s, gn[i]) == 0)
2647 "Group %s referenced in the .mdp file was not found in the index file.\n"
2648 "Group names must match either [moleculetype] names or custom index group\n"
2649 "names, in which case you must supply an index file to the '-n' option\n"
2656 static gmx_bool do_numbering(int natoms, gmx_groups_t *groups, int ng, char *ptrs[],
2657 t_blocka *block, char *gnames[],
2658 int gtype, int restnm,
2659 int grptp, gmx_bool bVerbose,
2662 unsigned short *cbuf;
2663 t_grps *grps = &(groups->grps[gtype]);
2664 int i, j, gid, aj, ognr, ntot = 0;
2667 char warn_buf[STRLEN];
2671 fprintf(debug, "Starting numbering %d groups of type %d\n", ng, gtype);
2674 title = gtypes[gtype];
2677 /* Mark all id's as not set */
2678 for (i = 0; (i < natoms); i++)
2683 snew(grps->nm_ind, ng+1); /* +1 for possible rest group */
2684 for (i = 0; (i < ng); i++)
2686 /* Lookup the group name in the block structure */
2687 gid = search_string(ptrs[i], block->nr, gnames);
2688 if ((grptp != egrptpONE) || (i == 0))
2690 grps->nm_ind[grps->nr++] = gid;
2694 fprintf(debug, "Found gid %d for group %s\n", gid, ptrs[i]);
2697 /* Now go over the atoms in the group */
2698 for (j = block->index[gid]; (j < block->index[gid+1]); j++)
2703 /* Range checking */
2704 if ((aj < 0) || (aj >= natoms))
2706 gmx_fatal(FARGS, "Invalid atom number %d in indexfile", aj);
2708 /* Lookup up the old group number */
2712 gmx_fatal(FARGS, "Atom %d in multiple %s groups (%d and %d)",
2713 aj+1, title, ognr+1, i+1);
2717 /* Store the group number in buffer */
2718 if (grptp == egrptpONE)
2731 /* Now check whether we have done all atoms */
2735 if (grptp == egrptpALL)
2737 gmx_fatal(FARGS, "%d atoms are not part of any of the %s groups",
2738 natoms-ntot, title);
2740 else if (grptp == egrptpPART)
2742 sprintf(warn_buf, "%d atoms are not part of any of the %s groups",
2743 natoms-ntot, title);
2744 warning_note(wi, warn_buf);
2746 /* Assign all atoms currently unassigned to a rest group */
2747 for (j = 0; (j < natoms); j++)
2749 if (cbuf[j] == NOGID)
2755 if (grptp != egrptpPART)
2760 "Making dummy/rest group for %s containing %d elements\n",
2761 title, natoms-ntot);
2763 /* Add group name "rest" */
2764 grps->nm_ind[grps->nr] = restnm;
2766 /* Assign the rest name to all atoms not currently assigned to a group */
2767 for (j = 0; (j < natoms); j++)
2769 if (cbuf[j] == NOGID)
2778 if (grps->nr == 1 && (ntot == 0 || ntot == natoms))
2780 /* All atoms are part of one (or no) group, no index required */
2781 groups->ngrpnr[gtype] = 0;
2782 groups->grpnr[gtype] = NULL;
2786 groups->ngrpnr[gtype] = natoms;
2787 snew(groups->grpnr[gtype], natoms);
2788 for (j = 0; (j < natoms); j++)
2790 groups->grpnr[gtype][j] = cbuf[j];
2796 return (bRest && grptp == egrptpPART);
2799 static void calc_nrdf(gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
2802 gmx_groups_t *groups;
2803 pull_params_t *pull;
2804 int natoms, ai, aj, i, j, d, g, imin, jmin;
2806 int *nrdf2, *na_vcm, na_tot;
2807 double *nrdf_tc, *nrdf_vcm, nrdf_uc, *nrdf_vcm_sub;
2809 gmx_mtop_atomloop_all_t aloop;
2810 int mb, mol, ftype, as;
2811 gmx_molblock_t *molb;
2812 gmx_moltype_t *molt;
2815 * First calc 3xnr-atoms for each group
2816 * then subtract half a degree of freedom for each constraint
2818 * Only atoms and nuclei contribute to the degrees of freedom...
2823 groups = &mtop->groups;
2824 natoms = mtop->natoms;
2826 /* Allocate one more for a possible rest group */
2827 /* We need to sum degrees of freedom into doubles,
2828 * since floats give too low nrdf's above 3 million atoms.
2830 snew(nrdf_tc, groups->grps[egcTC].nr+1);
2831 snew(nrdf_vcm, groups->grps[egcVCM].nr+1);
2832 snew(dof_vcm, groups->grps[egcVCM].nr+1);
2833 snew(na_vcm, groups->grps[egcVCM].nr+1);
2834 snew(nrdf_vcm_sub, groups->grps[egcVCM].nr+1);
2836 for (i = 0; i < groups->grps[egcTC].nr; i++)
2840 for (i = 0; i < groups->grps[egcVCM].nr+1; i++)
2843 clear_ivec(dof_vcm[i]);
2845 nrdf_vcm_sub[i] = 0;
2848 snew(nrdf2, natoms);
2849 aloop = gmx_mtop_atomloop_all_init(mtop);
2851 while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
2854 if (atom->ptype == eptAtom || atom->ptype == eptNucleus)
2856 g = ggrpnr(groups, egcFREEZE, i);
2857 for (d = 0; d < DIM; d++)
2859 if (opts->nFreeze[g][d] == 0)
2861 /* Add one DOF for particle i (counted as 2*1) */
2863 /* VCM group i has dim d as a DOF */
2864 dof_vcm[ggrpnr(groups, egcVCM, i)][d] = 1;
2867 nrdf_tc [ggrpnr(groups, egcTC, i)] += 0.5*nrdf2[i];
2868 nrdf_vcm[ggrpnr(groups, egcVCM, i)] += 0.5*nrdf2[i];
2873 for (mb = 0; mb < mtop->nmolblock; mb++)
2875 molb = &mtop->molblock[mb];
2876 molt = &mtop->moltype[molb->type];
2877 atom = molt->atoms.atom;
2878 for (mol = 0; mol < molb->nmol; mol++)
2880 for (ftype = F_CONSTR; ftype <= F_CONSTRNC; ftype++)
2882 ia = molt->ilist[ftype].iatoms;
2883 for (i = 0; i < molt->ilist[ftype].nr; )
2885 /* Subtract degrees of freedom for the constraints,
2886 * if the particles still have degrees of freedom left.
2887 * If one of the particles is a vsite or a shell, then all
2888 * constraint motion will go there, but since they do not
2889 * contribute to the constraints the degrees of freedom do not
2894 if (((atom[ia[1]].ptype == eptNucleus) ||
2895 (atom[ia[1]].ptype == eptAtom)) &&
2896 ((atom[ia[2]].ptype == eptNucleus) ||
2897 (atom[ia[2]].ptype == eptAtom)))
2915 imin = std::min(imin, nrdf2[ai]);
2916 jmin = std::min(jmin, nrdf2[aj]);
2919 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
2920 nrdf_tc [ggrpnr(groups, egcTC, aj)] -= 0.5*jmin;
2921 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2922 nrdf_vcm[ggrpnr(groups, egcVCM, aj)] -= 0.5*jmin;
2924 ia += interaction_function[ftype].nratoms+1;
2925 i += interaction_function[ftype].nratoms+1;
2928 ia = molt->ilist[F_SETTLE].iatoms;
2929 for (i = 0; i < molt->ilist[F_SETTLE].nr; )
2931 /* Subtract 1 dof from every atom in the SETTLE */
2932 for (j = 0; j < 3; j++)
2935 imin = std::min(2, nrdf2[ai]);
2937 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
2938 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2943 as += molt->atoms.nr;
2949 /* Correct nrdf for the COM constraints.
2950 * We correct using the TC and VCM group of the first atom
2951 * in the reference and pull group. If atoms in one pull group
2952 * belong to different TC or VCM groups it is anyhow difficult
2953 * to determine the optimal nrdf assignment.
2957 for (i = 0; i < pull->ncoord; i++)
2959 if (pull->coord[i].eType != epullCONSTRAINT)
2966 for (j = 0; j < 2; j++)
2968 const t_pull_group *pgrp;
2970 pgrp = &pull->group[pull->coord[i].group[j]];
2974 /* Subtract 1/2 dof from each group */
2976 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
2977 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2978 if (nrdf_tc[ggrpnr(groups, egcTC, ai)] < 0)
2980 gmx_fatal(FARGS, "Center of mass pulling constraints caused the number of degrees of freedom for temperature coupling group %s to be negative", gnames[groups->grps[egcTC].nm_ind[ggrpnr(groups, egcTC, ai)]]);
2985 /* We need to subtract the whole DOF from group j=1 */
2992 if (ir->nstcomm != 0)
2996 /* We remove COM motion up to dim ndof_com() */
2997 ndim_rm_vcm = ndof_com(ir);
2999 /* Subtract ndim_rm_vcm (or less with frozen dimensions) from
3000 * the number of degrees of freedom in each vcm group when COM
3001 * translation is removed and 6 when rotation is removed as well.
3003 for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3005 switch (ir->comm_mode)
3008 nrdf_vcm_sub[j] = 0;
3009 for (d = 0; d < ndim_rm_vcm; d++)
3018 nrdf_vcm_sub[j] = 6;
3021 gmx_incons("Checking comm_mode");
3025 for (i = 0; i < groups->grps[egcTC].nr; i++)
3027 /* Count the number of atoms of TC group i for every VCM group */
3028 for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3033 for (ai = 0; ai < natoms; ai++)
3035 if (ggrpnr(groups, egcTC, ai) == i)
3037 na_vcm[ggrpnr(groups, egcVCM, ai)]++;
3041 /* Correct for VCM removal according to the fraction of each VCM
3042 * group present in this TC group.
3044 nrdf_uc = nrdf_tc[i];
3047 fprintf(debug, "T-group[%d] nrdf_uc = %g\n", i, nrdf_uc);
3050 for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3052 if (nrdf_vcm[j] > nrdf_vcm_sub[j])
3054 nrdf_tc[i] += nrdf_uc*((double)na_vcm[j]/(double)na_tot)*
3055 (nrdf_vcm[j] - nrdf_vcm_sub[j])/nrdf_vcm[j];
3059 fprintf(debug, " nrdf_vcm[%d] = %g, nrdf = %g\n",
3060 j, nrdf_vcm[j], nrdf_tc[i]);
3065 for (i = 0; (i < groups->grps[egcTC].nr); i++)
3067 opts->nrdf[i] = nrdf_tc[i];
3068 if (opts->nrdf[i] < 0)
3073 "Number of degrees of freedom in T-Coupling group %s is %.2f\n",
3074 gnames[groups->grps[egcTC].nm_ind[i]], opts->nrdf[i]);
3082 sfree(nrdf_vcm_sub);
3085 static gmx_bool do_egp_flag(t_inputrec *ir, gmx_groups_t *groups,
3086 const char *option, const char *val, int flag)
3088 /* The maximum number of energy group pairs would be MAXPTR*(MAXPTR+1)/2.
3089 * But since this is much larger than STRLEN, such a line can not be parsed.
3090 * The real maximum is the number of names that fit in a string: STRLEN/2.
3092 #define EGP_MAX (STRLEN/2)
3093 int nelem, i, j, k, nr;
3094 char *names[EGP_MAX];
3098 gnames = groups->grpname;
3100 nelem = str_nelem(val, EGP_MAX, names);
3103 gmx_fatal(FARGS, "The number of groups for %s is odd", option);
3105 nr = groups->grps[egcENER].nr;
3107 for (i = 0; i < nelem/2; i++)
3111 gmx_strcasecmp(names[2*i], *(gnames[groups->grps[egcENER].nm_ind[j]])))
3117 gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3118 names[2*i], option);
3122 gmx_strcasecmp(names[2*i+1], *(gnames[groups->grps[egcENER].nm_ind[k]])))
3128 gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3129 names[2*i+1], option);
3131 if ((j < nr) && (k < nr))
3133 ir->opts.egp_flags[nr*j+k] |= flag;
3134 ir->opts.egp_flags[nr*k+j] |= flag;
3143 static void make_swap_groups(
3148 int ig = -1, i = 0, gind;
3152 /* Just a quick check here, more thorough checks are in mdrun */
3153 if (strcmp(swap->grp[eGrpSplit0].molname, swap->grp[eGrpSplit1].molname) == 0)
3155 gmx_fatal(FARGS, "The split groups can not both be '%s'.", swap->grp[eGrpSplit0].molname);
3158 /* Get the index atoms of the split0, split1, solvent, and swap groups */
3159 for (ig = 0; ig < swap->ngrp; ig++)
3161 swapg = &swap->grp[ig];
3162 gind = search_string(swap->grp[ig].molname, grps->nr, gnames);
3163 swapg->nat = grps->index[gind+1] - grps->index[gind];
3167 fprintf(stderr, "%s group '%s' contains %d atoms.\n",
3168 ig < 3 ? eSwapFixedGrp_names[ig] : "Swap",
3169 swap->grp[ig].molname, swapg->nat);
3170 snew(swapg->ind, swapg->nat);
3171 for (i = 0; i < swapg->nat; i++)
3173 swapg->ind[i] = grps->a[grps->index[gind]+i];
3178 gmx_fatal(FARGS, "Swap group %s does not contain any atoms.", swap->grp[ig].molname);
3184 void make_IMD_group(t_IMD *IMDgroup, char *IMDgname, t_blocka *grps, char **gnames)
3189 ig = search_string(IMDgname, grps->nr, gnames);
3190 IMDgroup->nat = grps->index[ig+1] - grps->index[ig];
3192 if (IMDgroup->nat > 0)
3194 fprintf(stderr, "Group '%s' with %d atoms can be activated for interactive molecular dynamics (IMD).\n",
3195 IMDgname, IMDgroup->nat);
3196 snew(IMDgroup->ind, IMDgroup->nat);
3197 for (i = 0; i < IMDgroup->nat; i++)
3199 IMDgroup->ind[i] = grps->a[grps->index[ig]+i];
3205 void do_index(const char* mdparin, const char *ndx,
3212 gmx_groups_t *groups;
3216 char warnbuf[STRLEN], **gnames;
3217 int nr, ntcg, ntau_t, nref_t, nacc, nofg, nSA, nSA_points, nSA_time, nSA_temp;
3220 int nacg, nfreeze, nfrdim, nenergy, nvcm, nuser;
3221 char *ptr1[MAXPTR], *ptr2[MAXPTR], *ptr3[MAXPTR];
3222 int i, j, k, restnm;
3223 gmx_bool bExcl, bTable, bSetTCpar, bAnneal, bRest;
3224 int nQMmethod, nQMbasis, nQMg;
3225 char warn_buf[STRLEN];
3230 fprintf(stderr, "processing index file...\n");
3235 snew(grps->index, 1);
3237 atoms_all = gmx_mtop_global_atoms(mtop);
3238 analyse(&atoms_all, grps, &gnames, FALSE, TRUE);
3239 done_atom(&atoms_all);
3243 grps = init_index(ndx, &gnames);
3246 groups = &mtop->groups;
3247 natoms = mtop->natoms;
3248 symtab = &mtop->symtab;
3250 snew(groups->grpname, grps->nr+1);
3252 for (i = 0; (i < grps->nr); i++)
3254 groups->grpname[i] = put_symtab(symtab, gnames[i]);
3256 groups->grpname[i] = put_symtab(symtab, "rest");
3258 srenew(gnames, grps->nr+1);
3259 gnames[restnm] = *(groups->grpname[i]);
3260 groups->ngrpname = grps->nr+1;
3262 set_warning_line(wi, mdparin, -1);
3264 ntau_t = str_nelem(is->tau_t, MAXPTR, ptr1);
3265 nref_t = str_nelem(is->ref_t, MAXPTR, ptr2);
3266 ntcg = str_nelem(is->tcgrps, MAXPTR, ptr3);
3267 if ((ntau_t != ntcg) || (nref_t != ntcg))
3269 gmx_fatal(FARGS, "Invalid T coupling input: %d groups, %d ref-t values and "
3270 "%d tau-t values", ntcg, nref_t, ntau_t);
3273 bSetTCpar = (ir->etc || EI_SD(ir->eI) || ir->eI == eiBD || EI_TPI(ir->eI));
3274 do_numbering(natoms, groups, ntcg, ptr3, grps, gnames, egcTC,
3275 restnm, bSetTCpar ? egrptpALL : egrptpALL_GENREST, bVerbose, wi);
3276 nr = groups->grps[egcTC].nr;
3278 snew(ir->opts.nrdf, nr);
3279 snew(ir->opts.tau_t, nr);
3280 snew(ir->opts.ref_t, nr);
3281 if (ir->eI == eiBD && ir->bd_fric == 0)
3283 fprintf(stderr, "bd-fric=0, so tau-t will be used as the inverse friction constant(s)\n");
3290 gmx_fatal(FARGS, "Not enough ref-t and tau-t values!");
3294 for (i = 0; (i < nr); i++)
3296 ir->opts.tau_t[i] = strtod(ptr1[i], &endptr);
3299 warning_error(wi, "Invalid value for mdp option tau-t. tau-t should only consist of real numbers separated by spaces.");
3301 if ((ir->eI == eiBD) && ir->opts.tau_t[i] <= 0)
3303 sprintf(warn_buf, "With integrator %s tau-t should be larger than 0", ei_names[ir->eI]);
3304 warning_error(wi, warn_buf);
3307 if (ir->etc != etcVRESCALE && ir->opts.tau_t[i] == 0)
3309 warning_note(wi, "tau-t = -1 is the value to signal that a group should not have temperature coupling. Treating your use of tau-t = 0 as if you used -1.");
3312 if (ir->opts.tau_t[i] >= 0)
3314 tau_min = std::min(tau_min, ir->opts.tau_t[i]);
3317 if (ir->etc != etcNO && ir->nsttcouple == -1)
3319 ir->nsttcouple = ir_optimal_nsttcouple(ir);
3324 if ((ir->etc == etcNOSEHOOVER) && (ir->epc == epcBERENDSEN))
3326 gmx_fatal(FARGS, "Cannot do Nose-Hoover temperature with Berendsen pressure control with md-vv; use either vrescale temperature with berendsen pressure or Nose-Hoover temperature with MTTK pressure");
3328 if (ir->epc == epcMTTK)
3330 if (ir->etc != etcNOSEHOOVER)
3332 gmx_fatal(FARGS, "Cannot do MTTK pressure coupling without Nose-Hoover temperature control");
3336 if (ir->nstpcouple != ir->nsttcouple)
3338 int mincouple = std::min(ir->nstpcouple, ir->nsttcouple);
3339 ir->nstpcouple = ir->nsttcouple = mincouple;
3340 sprintf(warn_buf, "for current Trotter decomposition methods with vv, nsttcouple and nstpcouple must be equal. Both have been reset to min(nsttcouple,nstpcouple) = %d", mincouple);
3341 warning_note(wi, warn_buf);
3346 /* velocity verlet with averaged kinetic energy KE = 0.5*(v(t+1/2) - v(t-1/2)) is implemented
3347 primarily for testing purposes, and does not work with temperature coupling other than 1 */
3349 if (ETC_ANDERSEN(ir->etc))
3351 if (ir->nsttcouple != 1)
3354 sprintf(warn_buf, "Andersen temperature control methods assume nsttcouple = 1; there is no need for larger nsttcouple > 1, since no global parameters are computed. nsttcouple has been reset to 1");
3355 warning_note(wi, warn_buf);
3358 nstcmin = tcouple_min_integration_steps(ir->etc);
3361 if (tau_min/(ir->delta_t*ir->nsttcouple) < nstcmin - 10*GMX_REAL_EPS)
3363 sprintf(warn_buf, "For proper integration of the %s thermostat, tau-t (%g) should be at least %d times larger than nsttcouple*dt (%g)",
3364 ETCOUPLTYPE(ir->etc),
3366 ir->nsttcouple*ir->delta_t);
3367 warning(wi, warn_buf);
3370 for (i = 0; (i < nr); i++)
3372 ir->opts.ref_t[i] = strtod(ptr2[i], &endptr);
3375 warning_error(wi, "Invalid value for mdp option ref-t. ref-t should only consist of real numbers separated by spaces.");
3377 if (ir->opts.ref_t[i] < 0)
3379 gmx_fatal(FARGS, "ref-t for group %d negative", i);
3382 /* set the lambda mc temperature to the md integrator temperature (which should be defined
3383 if we are in this conditional) if mc_temp is negative */
3384 if (ir->expandedvals->mc_temp < 0)
3386 ir->expandedvals->mc_temp = ir->opts.ref_t[0]; /*for now, set to the first reft */
3390 /* Simulated annealing for each group. There are nr groups */
3391 nSA = str_nelem(is->anneal, MAXPTR, ptr1);
3392 if (nSA == 1 && (ptr1[0][0] == 'n' || ptr1[0][0] == 'N'))
3396 if (nSA > 0 && nSA != nr)
3398 gmx_fatal(FARGS, "Not enough annealing values: %d (for %d groups)\n", nSA, nr);
3402 snew(ir->opts.annealing, nr);
3403 snew(ir->opts.anneal_npoints, nr);
3404 snew(ir->opts.anneal_time, nr);
3405 snew(ir->opts.anneal_temp, nr);
3406 for (i = 0; i < nr; i++)
3408 ir->opts.annealing[i] = eannNO;
3409 ir->opts.anneal_npoints[i] = 0;
3410 ir->opts.anneal_time[i] = NULL;
3411 ir->opts.anneal_temp[i] = NULL;
3416 for (i = 0; i < nr; i++)
3418 if (ptr1[i][0] == 'n' || ptr1[i][0] == 'N')
3420 ir->opts.annealing[i] = eannNO;
3422 else if (ptr1[i][0] == 's' || ptr1[i][0] == 'S')
3424 ir->opts.annealing[i] = eannSINGLE;
3427 else if (ptr1[i][0] == 'p' || ptr1[i][0] == 'P')
3429 ir->opts.annealing[i] = eannPERIODIC;
3435 /* Read the other fields too */
3436 nSA_points = str_nelem(is->anneal_npoints, MAXPTR, ptr1);
3437 if (nSA_points != nSA)
3439 gmx_fatal(FARGS, "Found %d annealing-npoints values for %d groups\n", nSA_points, nSA);
3441 for (k = 0, i = 0; i < nr; i++)
3443 ir->opts.anneal_npoints[i] = strtol(ptr1[i], &endptr, 10);
3446 warning_error(wi, "Invalid value for mdp option annealing-npoints. annealing should only consist of integers separated by spaces.");
3448 if (ir->opts.anneal_npoints[i] == 1)
3450 gmx_fatal(FARGS, "Please specify at least a start and an end point for annealing\n");
3452 snew(ir->opts.anneal_time[i], ir->opts.anneal_npoints[i]);
3453 snew(ir->opts.anneal_temp[i], ir->opts.anneal_npoints[i]);
3454 k += ir->opts.anneal_npoints[i];
3457 nSA_time = str_nelem(is->anneal_time, MAXPTR, ptr1);
3460 gmx_fatal(FARGS, "Found %d annealing-time values, wanted %d\n", nSA_time, k);
3462 nSA_temp = str_nelem(is->anneal_temp, MAXPTR, ptr2);
3465 gmx_fatal(FARGS, "Found %d annealing-temp values, wanted %d\n", nSA_temp, k);
3468 for (i = 0, k = 0; i < nr; i++)
3471 for (j = 0; j < ir->opts.anneal_npoints[i]; j++)
3473 ir->opts.anneal_time[i][j] = strtod(ptr1[k], &endptr);
3476 warning_error(wi, "Invalid value for mdp option anneal-time. anneal-time should only consist of real numbers separated by spaces.");
3478 ir->opts.anneal_temp[i][j] = strtod(ptr2[k], &endptr);
3481 warning_error(wi, "Invalid value for anneal-temp. anneal-temp should only consist of real numbers separated by spaces.");
3485 if (ir->opts.anneal_time[i][0] > (ir->init_t+GMX_REAL_EPS))
3487 gmx_fatal(FARGS, "First time point for annealing > init_t.\n");
3493 if (ir->opts.anneal_time[i][j] < ir->opts.anneal_time[i][j-1])
3495 gmx_fatal(FARGS, "Annealing timepoints out of order: t=%f comes after t=%f\n",
3496 ir->opts.anneal_time[i][j], ir->opts.anneal_time[i][j-1]);
3499 if (ir->opts.anneal_temp[i][j] < 0)
3501 gmx_fatal(FARGS, "Found negative temperature in annealing: %f\n", ir->opts.anneal_temp[i][j]);
3506 /* Print out some summary information, to make sure we got it right */
3507 for (i = 0, k = 0; i < nr; i++)
3509 if (ir->opts.annealing[i] != eannNO)
3511 j = groups->grps[egcTC].nm_ind[i];
3512 fprintf(stderr, "Simulated annealing for group %s: %s, %d timepoints\n",
3513 *(groups->grpname[j]), eann_names[ir->opts.annealing[i]],
3514 ir->opts.anneal_npoints[i]);
3515 fprintf(stderr, "Time (ps) Temperature (K)\n");
3516 /* All terms except the last one */
3517 for (j = 0; j < (ir->opts.anneal_npoints[i]-1); j++)
3519 fprintf(stderr, "%9.1f %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3522 /* Finally the last one */
3523 j = ir->opts.anneal_npoints[i]-1;
3524 if (ir->opts.annealing[i] == eannSINGLE)
3526 fprintf(stderr, "%9.1f- %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3530 fprintf(stderr, "%9.1f %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3531 if (fabs(ir->opts.anneal_temp[i][j]-ir->opts.anneal_temp[i][0]) > GMX_REAL_EPS)
3533 warning_note(wi, "There is a temperature jump when your annealing loops back.\n");
3544 make_pull_groups(ir->pull, is->pull_grp, grps, gnames);
3546 make_pull_coords(ir->pull);
3551 make_rotation_groups(ir->rot, is->rot_grp, grps, gnames);
3554 if (ir->eSwapCoords != eswapNO)
3556 make_swap_groups(ir->swap, grps, gnames);
3559 /* Make indices for IMD session */
3562 make_IMD_group(ir->imd, is->imd_grp, grps, gnames);
3565 nacc = str_nelem(is->acc, MAXPTR, ptr1);
3566 nacg = str_nelem(is->accgrps, MAXPTR, ptr2);
3567 if (nacg*DIM != nacc)
3569 gmx_fatal(FARGS, "Invalid Acceleration input: %d groups and %d acc. values",
3572 do_numbering(natoms, groups, nacg, ptr2, grps, gnames, egcACC,
3573 restnm, egrptpALL_GENREST, bVerbose, wi);
3574 nr = groups->grps[egcACC].nr;
3575 snew(ir->opts.acc, nr);
3576 ir->opts.ngacc = nr;
3578 for (i = k = 0; (i < nacg); i++)
3580 for (j = 0; (j < DIM); j++, k++)
3582 ir->opts.acc[i][j] = strtod(ptr1[k], &endptr);
3585 warning_error(wi, "Invalid value for mdp option accelerate. accelerate should only consist of real numbers separated by spaces.");
3589 for (; (i < nr); i++)
3591 for (j = 0; (j < DIM); j++)
3593 ir->opts.acc[i][j] = 0;
3597 nfrdim = str_nelem(is->frdim, MAXPTR, ptr1);
3598 nfreeze = str_nelem(is->freeze, MAXPTR, ptr2);
3599 if (nfrdim != DIM*nfreeze)
3601 gmx_fatal(FARGS, "Invalid Freezing input: %d groups and %d freeze values",
3604 do_numbering(natoms, groups, nfreeze, ptr2, grps, gnames, egcFREEZE,
3605 restnm, egrptpALL_GENREST, bVerbose, wi);
3606 nr = groups->grps[egcFREEZE].nr;
3607 ir->opts.ngfrz = nr;
3608 snew(ir->opts.nFreeze, nr);
3609 for (i = k = 0; (i < nfreeze); i++)
3611 for (j = 0; (j < DIM); j++, k++)
3613 ir->opts.nFreeze[i][j] = (gmx_strncasecmp(ptr1[k], "Y", 1) == 0);
3614 if (!ir->opts.nFreeze[i][j])
3616 if (gmx_strncasecmp(ptr1[k], "N", 1) != 0)
3618 sprintf(warnbuf, "Please use Y(ES) or N(O) for freezedim only "
3619 "(not %s)", ptr1[k]);
3620 warning(wi, warn_buf);
3625 for (; (i < nr); i++)
3627 for (j = 0; (j < DIM); j++)
3629 ir->opts.nFreeze[i][j] = 0;
3633 nenergy = str_nelem(is->energy, MAXPTR, ptr1);
3634 do_numbering(natoms, groups, nenergy, ptr1, grps, gnames, egcENER,
3635 restnm, egrptpALL_GENREST, bVerbose, wi);
3636 add_wall_energrps(groups, ir->nwall, symtab);
3637 ir->opts.ngener = groups->grps[egcENER].nr;
3638 nvcm = str_nelem(is->vcm, MAXPTR, ptr1);
3640 do_numbering(natoms, groups, nvcm, ptr1, grps, gnames, egcVCM,
3641 restnm, nvcm == 0 ? egrptpALL_GENREST : egrptpPART, bVerbose, wi);
3644 warning(wi, "Some atoms are not part of any center of mass motion removal group.\n"
3645 "This may lead to artifacts.\n"
3646 "In most cases one should use one group for the whole system.");
3649 /* Now we have filled the freeze struct, so we can calculate NRDF */
3650 calc_nrdf(mtop, ir, gnames);
3652 nuser = str_nelem(is->user1, MAXPTR, ptr1);
3653 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser1,
3654 restnm, egrptpALL_GENREST, bVerbose, wi);
3655 nuser = str_nelem(is->user2, MAXPTR, ptr1);
3656 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser2,
3657 restnm, egrptpALL_GENREST, bVerbose, wi);
3658 nuser = str_nelem(is->x_compressed_groups, MAXPTR, ptr1);
3659 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcCompressedX,
3660 restnm, egrptpONE, bVerbose, wi);
3661 nofg = str_nelem(is->orirefitgrp, MAXPTR, ptr1);
3662 do_numbering(natoms, groups, nofg, ptr1, grps, gnames, egcORFIT,
3663 restnm, egrptpALL_GENREST, bVerbose, wi);
3665 /* QMMM input processing */
3666 nQMg = str_nelem(is->QMMM, MAXPTR, ptr1);
3667 nQMmethod = str_nelem(is->QMmethod, MAXPTR, ptr2);
3668 nQMbasis = str_nelem(is->QMbasis, MAXPTR, ptr3);
3669 if ((nQMmethod != nQMg) || (nQMbasis != nQMg))
3671 gmx_fatal(FARGS, "Invalid QMMM input: %d groups %d basissets"
3672 " and %d methods\n", nQMg, nQMbasis, nQMmethod);
3674 /* group rest, if any, is always MM! */
3675 do_numbering(natoms, groups, nQMg, ptr1, grps, gnames, egcQMMM,
3676 restnm, egrptpALL_GENREST, bVerbose, wi);
3677 nr = nQMg; /*atoms->grps[egcQMMM].nr;*/
3678 ir->opts.ngQM = nQMg;
3679 snew(ir->opts.QMmethod, nr);
3680 snew(ir->opts.QMbasis, nr);
3681 for (i = 0; i < nr; i++)
3683 /* input consists of strings: RHF CASSCF PM3 .. These need to be
3684 * converted to the corresponding enum in names.c
3686 ir->opts.QMmethod[i] = search_QMstring(ptr2[i], eQMmethodNR,
3688 ir->opts.QMbasis[i] = search_QMstring(ptr3[i], eQMbasisNR,
3692 str_nelem(is->QMmult, MAXPTR, ptr1);
3693 str_nelem(is->QMcharge, MAXPTR, ptr2);
3694 str_nelem(is->bSH, MAXPTR, ptr3);
3695 snew(ir->opts.QMmult, nr);
3696 snew(ir->opts.QMcharge, nr);
3697 snew(ir->opts.bSH, nr);
3699 for (i = 0; i < nr; i++)
3701 ir->opts.QMmult[i] = strtol(ptr1[i], &endptr, 10);
3704 warning_error(wi, "Invalid value for mdp option QMmult. QMmult should only consist of integers separated by spaces.");
3706 ir->opts.QMcharge[i] = strtol(ptr2[i], &endptr, 10);
3709 warning_error(wi, "Invalid value for mdp option QMcharge. QMcharge should only consist of integers separated by spaces.");
3711 ir->opts.bSH[i] = (gmx_strncasecmp(ptr3[i], "Y", 1) == 0);
3714 str_nelem(is->CASelectrons, MAXPTR, ptr1);
3715 str_nelem(is->CASorbitals, MAXPTR, ptr2);
3716 snew(ir->opts.CASelectrons, nr);
3717 snew(ir->opts.CASorbitals, nr);
3718 for (i = 0; i < nr; i++)
3720 ir->opts.CASelectrons[i] = strtol(ptr1[i], &endptr, 10);
3723 warning_error(wi, "Invalid value for mdp option CASelectrons. CASelectrons should only consist of integers separated by spaces.");
3725 ir->opts.CASorbitals[i] = strtol(ptr2[i], &endptr, 10);
3728 warning_error(wi, "Invalid value for mdp option CASorbitals. CASorbitals should only consist of integers separated by spaces.");
3731 /* special optimization options */
3733 str_nelem(is->bOPT, MAXPTR, ptr1);
3734 str_nelem(is->bTS, MAXPTR, ptr2);
3735 snew(ir->opts.bOPT, nr);
3736 snew(ir->opts.bTS, nr);
3737 for (i = 0; i < nr; i++)
3739 ir->opts.bOPT[i] = (gmx_strncasecmp(ptr1[i], "Y", 1) == 0);
3740 ir->opts.bTS[i] = (gmx_strncasecmp(ptr2[i], "Y", 1) == 0);
3742 str_nelem(is->SAon, MAXPTR, ptr1);
3743 str_nelem(is->SAoff, MAXPTR, ptr2);
3744 str_nelem(is->SAsteps, MAXPTR, ptr3);
3745 snew(ir->opts.SAon, nr);
3746 snew(ir->opts.SAoff, nr);
3747 snew(ir->opts.SAsteps, nr);
3749 for (i = 0; i < nr; i++)
3751 ir->opts.SAon[i] = strtod(ptr1[i], &endptr);
3754 warning_error(wi, "Invalid value for mdp option SAon. SAon should only consist of real numbers separated by spaces.");
3756 ir->opts.SAoff[i] = strtod(ptr2[i], &endptr);
3759 warning_error(wi, "Invalid value for mdp option SAoff. SAoff should only consist of real numbers separated by spaces.");
3761 ir->opts.SAsteps[i] = strtol(ptr3[i], &endptr, 10);
3764 warning_error(wi, "Invalid value for mdp option SAsteps. SAsteps should only consist of integers separated by spaces.");
3767 /* end of QMMM input */
3771 for (i = 0; (i < egcNR); i++)
3773 fprintf(stderr, "%-16s has %d element(s):", gtypes[i], groups->grps[i].nr);
3774 for (j = 0; (j < groups->grps[i].nr); j++)
3776 fprintf(stderr, " %s", *(groups->grpname[groups->grps[i].nm_ind[j]]));
3778 fprintf(stderr, "\n");
3782 nr = groups->grps[egcENER].nr;
3783 snew(ir->opts.egp_flags, nr*nr);
3785 bExcl = do_egp_flag(ir, groups, "energygrp-excl", is->egpexcl, EGP_EXCL);
3786 if (bExcl && ir->cutoff_scheme == ecutsVERLET)
3788 warning_error(wi, "Energy group exclusions are not (yet) implemented for the Verlet scheme");
3790 if (bExcl && EEL_FULL(ir->coulombtype))
3792 warning(wi, "Can not exclude the lattice Coulomb energy between energy groups");
3795 bTable = do_egp_flag(ir, groups, "energygrp-table", is->egptable, EGP_TABLE);
3796 if (bTable && !(ir->vdwtype == evdwUSER) &&
3797 !(ir->coulombtype == eelUSER) && !(ir->coulombtype == eelPMEUSER) &&
3798 !(ir->coulombtype == eelPMEUSERSWITCH))
3800 gmx_fatal(FARGS, "Can only have energy group pair tables in combination with user tables for VdW and/or Coulomb");
3803 for (i = 0; (i < grps->nr); i++)
3815 static void check_disre(gmx_mtop_t *mtop)
3817 gmx_ffparams_t *ffparams;
3818 t_functype *functype;
3820 int i, ndouble, ftype;
3821 int label, old_label;
3823 if (gmx_mtop_ftype_count(mtop, F_DISRES) > 0)
3825 ffparams = &mtop->ffparams;
3826 functype = ffparams->functype;
3827 ip = ffparams->iparams;
3830 for (i = 0; i < ffparams->ntypes; i++)
3832 ftype = functype[i];
3833 if (ftype == F_DISRES)
3835 label = ip[i].disres.label;
3836 if (label == old_label)
3838 fprintf(stderr, "Distance restraint index %d occurs twice\n", label);
3846 gmx_fatal(FARGS, "Found %d double distance restraint indices,\n"
3847 "probably the parameters for multiple pairs in one restraint "
3848 "are not identical\n", ndouble);
3853 static gmx_bool absolute_reference(t_inputrec *ir, gmx_mtop_t *sys,
3854 gmx_bool posres_only,
3858 gmx_mtop_ilistloop_t iloop;
3868 for (d = 0; d < DIM; d++)
3870 AbsRef[d] = (d < ndof_com(ir) ? 0 : 1);
3872 /* Check for freeze groups */
3873 for (g = 0; g < ir->opts.ngfrz; g++)
3875 for (d = 0; d < DIM; d++)
3877 if (ir->opts.nFreeze[g][d] != 0)
3885 /* Check for position restraints */
3886 iloop = gmx_mtop_ilistloop_init(sys);
3887 while (gmx_mtop_ilistloop_next(iloop, &ilist, &nmol))
3890 (AbsRef[XX] == 0 || AbsRef[YY] == 0 || AbsRef[ZZ] == 0))
3892 for (i = 0; i < ilist[F_POSRES].nr; i += 2)
3894 pr = &sys->ffparams.iparams[ilist[F_POSRES].iatoms[i]];
3895 for (d = 0; d < DIM; d++)
3897 if (pr->posres.fcA[d] != 0)
3903 for (i = 0; i < ilist[F_FBPOSRES].nr; i += 2)
3905 /* Check for flat-bottom posres */
3906 pr = &sys->ffparams.iparams[ilist[F_FBPOSRES].iatoms[i]];
3907 if (pr->fbposres.k != 0)
3909 switch (pr->fbposres.geom)
3911 case efbposresSPHERE:
3912 AbsRef[XX] = AbsRef[YY] = AbsRef[ZZ] = 1;
3914 case efbposresCYLINDERX:
3915 AbsRef[YY] = AbsRef[ZZ] = 1;
3917 case efbposresCYLINDERY:
3918 AbsRef[XX] = AbsRef[ZZ] = 1;
3920 case efbposresCYLINDER:
3921 /* efbposres is a synonym for efbposresCYLINDERZ for backwards compatibility */
3922 case efbposresCYLINDERZ:
3923 AbsRef[XX] = AbsRef[YY] = 1;
3925 case efbposresX: /* d=XX */
3926 case efbposresY: /* d=YY */
3927 case efbposresZ: /* d=ZZ */
3928 d = pr->fbposres.geom - efbposresX;
3932 gmx_fatal(FARGS, " Invalid geometry for flat-bottom position restraint.\n"
3933 "Expected nr between 1 and %d. Found %d\n", efbposresNR-1,
3941 return (AbsRef[XX] != 0 && AbsRef[YY] != 0 && AbsRef[ZZ] != 0);
3945 check_combination_rule_differences(const gmx_mtop_t *mtop, int state,
3946 gmx_bool *bC6ParametersWorkWithGeometricRules,
3947 gmx_bool *bC6ParametersWorkWithLBRules,
3948 gmx_bool *bLBRulesPossible)
3950 int ntypes, tpi, tpj;
3953 double c6i, c6j, c12i, c12j;
3954 double c6, c6_geometric, c6_LB;
3955 double sigmai, sigmaj, epsi, epsj;
3956 gmx_bool bCanDoLBRules, bCanDoGeometricRules;
3959 /* A tolerance of 1e-5 seems reasonable for (possibly hand-typed)
3960 * force-field floating point parameters.
3963 ptr = getenv("GMX_LJCOMB_TOL");
3967 double gmx_unused canary;
3969 if (sscanf(ptr, "%lf%lf", &dbl, &canary) != 1)
3971 gmx_fatal(FARGS, "Could not parse a single floating-point number from GMX_LJCOMB_TOL (%s)", ptr);
3976 *bC6ParametersWorkWithLBRules = TRUE;
3977 *bC6ParametersWorkWithGeometricRules = TRUE;
3978 bCanDoLBRules = TRUE;
3979 ntypes = mtop->ffparams.atnr;
3980 snew(typecount, ntypes);
3981 gmx_mtop_count_atomtypes(mtop, state, typecount);
3982 *bLBRulesPossible = TRUE;
3983 for (tpi = 0; tpi < ntypes; ++tpi)
3985 c6i = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c6;
3986 c12i = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c12;
3987 for (tpj = tpi; tpj < ntypes; ++tpj)
3989 c6j = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c6;
3990 c12j = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c12;
3991 c6 = mtop->ffparams.iparams[ntypes * tpi + tpj].lj.c6;
3992 c6_geometric = std::sqrt(c6i * c6j);
3993 if (!gmx_numzero(c6_geometric))
3995 if (!gmx_numzero(c12i) && !gmx_numzero(c12j))
3997 sigmai = gmx::sixthroot(c12i / c6i);
3998 sigmaj = gmx::sixthroot(c12j / c6j);
3999 epsi = c6i * c6i /(4.0 * c12i);
4000 epsj = c6j * c6j /(4.0 * c12j);
4001 c6_LB = 4.0 * std::sqrt(epsi * epsj) * gmx::power6(0.5 * (sigmai + sigmaj));
4005 *bLBRulesPossible = FALSE;
4006 c6_LB = c6_geometric;
4008 bCanDoLBRules = gmx_within_tol(c6_LB, c6, tol);
4011 if (FALSE == bCanDoLBRules)
4013 *bC6ParametersWorkWithLBRules = FALSE;
4016 bCanDoGeometricRules = gmx_within_tol(c6_geometric, c6, tol);
4018 if (FALSE == bCanDoGeometricRules)
4020 *bC6ParametersWorkWithGeometricRules = FALSE;
4028 check_combination_rules(const t_inputrec *ir, const gmx_mtop_t *mtop,
4031 gmx_bool bLBRulesPossible, bC6ParametersWorkWithGeometricRules, bC6ParametersWorkWithLBRules;
4033 check_combination_rule_differences(mtop, 0,
4034 &bC6ParametersWorkWithGeometricRules,
4035 &bC6ParametersWorkWithLBRules,
4037 if (ir->ljpme_combination_rule == eljpmeLB)
4039 if (FALSE == bC6ParametersWorkWithLBRules || FALSE == bLBRulesPossible)
4041 warning(wi, "You are using arithmetic-geometric combination rules "
4042 "in LJ-PME, but your non-bonded C6 parameters do not "
4043 "follow these rules.");
4048 if (FALSE == bC6ParametersWorkWithGeometricRules)
4050 if (ir->eDispCorr != edispcNO)
4052 warning_note(wi, "You are using geometric combination rules in "
4053 "LJ-PME, but your non-bonded C6 parameters do "
4054 "not follow these rules. "
4055 "This will introduce very small errors in the forces and energies in "
4056 "your simulations. Dispersion correction will correct total energy "
4057 "and/or pressure for isotropic systems, but not forces or surface tensions.");
4061 warning_note(wi, "You are using geometric combination rules in "
4062 "LJ-PME, but your non-bonded C6 parameters do "
4063 "not follow these rules. "
4064 "This will introduce very small errors in the forces and energies in "
4065 "your simulations. If your system is homogeneous, consider using dispersion correction "
4066 "for the total energy and pressure.");
4072 void triple_check(const char *mdparin, t_inputrec *ir, gmx_mtop_t *sys,
4075 char err_buf[STRLEN];
4077 gmx_bool bCharge, bAcc;
4080 gmx_mtop_atomloop_block_t aloopb;
4081 gmx_mtop_atomloop_all_t aloop;
4083 char warn_buf[STRLEN];
4085 set_warning_line(wi, mdparin, -1);
4087 if (ir->cutoff_scheme == ecutsVERLET &&
4088 ir->verletbuf_tol > 0 &&
4090 ((EI_MD(ir->eI) || EI_SD(ir->eI)) &&
4091 (ir->etc == etcVRESCALE || ir->etc == etcBERENDSEN)))
4093 /* Check if a too small Verlet buffer might potentially
4094 * cause more drift than the thermostat can couple off.
4096 /* Temperature error fraction for warning and suggestion */
4097 const real T_error_warn = 0.002;
4098 const real T_error_suggest = 0.001;
4099 /* For safety: 2 DOF per atom (typical with constraints) */
4100 const real nrdf_at = 2;
4101 real T, tau, max_T_error;
4106 for (i = 0; i < ir->opts.ngtc; i++)
4108 T = std::max(T, ir->opts.ref_t[i]);
4109 tau = std::max(tau, ir->opts.tau_t[i]);
4113 /* This is a worst case estimate of the temperature error,
4114 * assuming perfect buffer estimation and no cancelation
4115 * of errors. The factor 0.5 is because energy distributes
4116 * equally over Ekin and Epot.
4118 max_T_error = 0.5*tau*ir->verletbuf_tol/(nrdf_at*BOLTZ*T);
4119 if (max_T_error > T_error_warn)
4121 sprintf(warn_buf, "With a verlet-buffer-tolerance of %g kJ/mol/ps, a reference temperature of %g and a tau_t of %g, your temperature might be off by up to %.1f%%. To ensure the error is below %.1f%%, decrease verlet-buffer-tolerance to %.0e or decrease tau_t.",
4122 ir->verletbuf_tol, T, tau,
4124 100*T_error_suggest,
4125 ir->verletbuf_tol*T_error_suggest/max_T_error);
4126 warning(wi, warn_buf);
4131 if (ETC_ANDERSEN(ir->etc))
4135 for (i = 0; i < ir->opts.ngtc; i++)
4137 sprintf(err_buf, "all tau_t must currently be equal using Andersen temperature control, violated for group %d", i);
4138 CHECK(ir->opts.tau_t[0] != ir->opts.tau_t[i]);
4139 sprintf(err_buf, "all tau_t must be positive using Andersen temperature control, tau_t[%d]=%10.6f",
4140 i, ir->opts.tau_t[i]);
4141 CHECK(ir->opts.tau_t[i] < 0);
4144 for (i = 0; i < ir->opts.ngtc; i++)
4146 int nsteps = (int)(ir->opts.tau_t[i]/ir->delta_t);
4147 sprintf(err_buf, "tau_t/delta_t for group %d for temperature control method %s must be a multiple of nstcomm (%d), as velocities of atoms in coupled groups are randomized every time step. The input tau_t (%8.3f) leads to %d steps per randomization", i, etcoupl_names[ir->etc], ir->nstcomm, ir->opts.tau_t[i], nsteps);
4148 CHECK((nsteps % ir->nstcomm) && (ir->etc == etcANDERSENMASSIVE));
4152 if (EI_DYNAMICS(ir->eI) && !EI_SD(ir->eI) && ir->eI != eiBD &&
4153 ir->comm_mode == ecmNO &&
4154 !(absolute_reference(ir, sys, FALSE, AbsRef) || ir->nsteps <= 10) &&
4155 !ETC_ANDERSEN(ir->etc))
4157 warning(wi, "You are not using center of mass motion removal (mdp option comm-mode), numerical rounding errors can lead to build up of kinetic energy of the center of mass");
4160 /* Check for pressure coupling with absolute position restraints */
4161 if (ir->epc != epcNO && ir->refcoord_scaling == erscNO)
4163 absolute_reference(ir, sys, TRUE, AbsRef);
4165 for (m = 0; m < DIM; m++)
4167 if (AbsRef[m] && norm2(ir->compress[m]) > 0)
4169 warning(wi, "You are using pressure coupling with absolute position restraints, this will give artifacts. Use the refcoord_scaling option.");
4177 aloopb = gmx_mtop_atomloop_block_init(sys);
4179 while (gmx_mtop_atomloop_block_next(aloopb, &atom, &nmol))
4181 if (atom->q != 0 || atom->qB != 0)
4189 if (EEL_FULL(ir->coulombtype))
4192 "You are using full electrostatics treatment %s for a system without charges.\n"
4193 "This costs a lot of performance for just processing zeros, consider using %s instead.\n",
4194 EELTYPE(ir->coulombtype), EELTYPE(eelCUT));
4195 warning(wi, err_buf);
4200 if (ir->coulombtype == eelCUT && ir->rcoulomb > 0 && !ir->implicit_solvent)
4203 "You are using a plain Coulomb cut-off, which might produce artifacts.\n"
4204 "You might want to consider using %s electrostatics.\n",
4206 warning_note(wi, err_buf);
4210 /* Check if combination rules used in LJ-PME are the same as in the force field */
4211 if (EVDW_PME(ir->vdwtype))
4213 check_combination_rules(ir, sys, wi);
4216 /* Generalized reaction field */
4217 if (ir->opts.ngtc == 0)
4219 sprintf(err_buf, "No temperature coupling while using coulombtype %s",
4221 CHECK(ir->coulombtype == eelGRF);
4225 sprintf(err_buf, "When using coulombtype = %s"
4226 " ref-t for temperature coupling should be > 0",
4228 CHECK((ir->coulombtype == eelGRF) && (ir->opts.ref_t[0] <= 0));
4232 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4234 for (m = 0; (m < DIM); m++)
4236 if (fabs(ir->opts.acc[i][m]) > 1e-6)
4245 snew(mgrp, sys->groups.grps[egcACC].nr);
4246 aloop = gmx_mtop_atomloop_all_init(sys);
4248 while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
4250 mgrp[ggrpnr(&sys->groups, egcACC, i)] += atom->m;
4253 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4255 for (m = 0; (m < DIM); m++)
4257 acc[m] += ir->opts.acc[i][m]*mgrp[i];
4261 for (m = 0; (m < DIM); m++)
4263 if (fabs(acc[m]) > 1e-6)
4265 const char *dim[DIM] = { "X", "Y", "Z" };
4267 "Net Acceleration in %s direction, will %s be corrected\n",
4268 dim[m], ir->nstcomm != 0 ? "" : "not");
4269 if (ir->nstcomm != 0 && m < ndof_com(ir))
4272 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4274 ir->opts.acc[i][m] -= acc[m];
4282 if (ir->efep != efepNO && ir->fepvals->sc_alpha != 0 &&
4283 !gmx_within_tol(sys->ffparams.reppow, 12.0, 10*GMX_DOUBLE_EPS))
4285 gmx_fatal(FARGS, "Soft-core interactions are only supported with VdW repulsion power 12");
4293 for (i = 0; i < ir->pull->ncoord && !bWarned; i++)
4295 if (ir->pull->coord[i].group[0] == 0 ||
4296 ir->pull->coord[i].group[1] == 0)
4298 absolute_reference(ir, sys, FALSE, AbsRef);
4299 for (m = 0; m < DIM; m++)
4301 if (ir->pull->coord[i].dim[m] && !AbsRef[m])
4303 warning(wi, "You are using an absolute reference for pulling, but the rest of the system does not have an absolute reference. This will lead to artifacts.");
4311 for (i = 0; i < 3; i++)
4313 for (m = 0; m <= i; m++)
4315 if ((ir->epc != epcNO && ir->compress[i][m] != 0) ||
4316 ir->deform[i][m] != 0)
4318 for (c = 0; c < ir->pull->ncoord; c++)
4320 if (ir->pull->coord[c].eGeom == epullgDIRPBC &&
4321 ir->pull->coord[c].vec[m] != 0)
4323 gmx_fatal(FARGS, "Can not have dynamic box while using pull geometry '%s' (dim %c)", EPULLGEOM(ir->pull->coord[c].eGeom), 'x'+m);
4334 void double_check(t_inputrec *ir, matrix box,
4335 gmx_bool bHasNormalConstraints,
4336 gmx_bool bHasAnyConstraints,
4340 char warn_buf[STRLEN];
4343 ptr = check_box(ir->ePBC, box);
4346 warning_error(wi, ptr);
4349 if (bHasNormalConstraints && ir->eConstrAlg == econtSHAKE)
4351 if (ir->shake_tol <= 0.0)
4353 sprintf(warn_buf, "ERROR: shake-tol must be > 0 instead of %g\n",
4355 warning_error(wi, warn_buf);
4359 if ( (ir->eConstrAlg == econtLINCS) && bHasNormalConstraints)
4361 /* If we have Lincs constraints: */
4362 if (ir->eI == eiMD && ir->etc == etcNO &&
4363 ir->eConstrAlg == econtLINCS && ir->nLincsIter == 1)
4365 sprintf(warn_buf, "For energy conservation with LINCS, lincs_iter should be 2 or larger.\n");
4366 warning_note(wi, warn_buf);
4369 if ((ir->eI == eiCG || ir->eI == eiLBFGS) && (ir->nProjOrder < 8))
4371 sprintf(warn_buf, "For accurate %s with LINCS constraints, lincs-order should be 8 or more.", ei_names[ir->eI]);
4372 warning_note(wi, warn_buf);
4374 if (ir->epc == epcMTTK)
4376 warning_error(wi, "MTTK not compatible with lincs -- use shake instead.");
4380 if (bHasAnyConstraints && ir->epc == epcMTTK)
4382 warning_error(wi, "Constraints are not implemented with MTTK pressure control.");
4385 if (ir->LincsWarnAngle > 90.0)
4387 sprintf(warn_buf, "lincs-warnangle can not be larger than 90 degrees, setting it to 90.\n");
4388 warning(wi, warn_buf);
4389 ir->LincsWarnAngle = 90.0;
4392 if (ir->ePBC != epbcNONE)
4394 if (ir->nstlist == 0)
4396 warning(wi, "With nstlist=0 atoms are only put into the box at step 0, therefore drifting atoms might cause the simulation to crash.");
4398 if (ir->ns_type == ensGRID)
4400 if (gmx::square(ir->rlist) >= max_cutoff2(ir->ePBC, box))
4402 sprintf(warn_buf, "ERROR: The cut-off length is longer than half the shortest box vector or longer than the smallest box diagonal element. Increase the box size or decrease rlist.\n");
4403 warning_error(wi, warn_buf);
4408 min_size = std::min(box[XX][XX], std::min(box[YY][YY], box[ZZ][ZZ]));
4409 if (2*ir->rlist >= min_size)
4411 sprintf(warn_buf, "ERROR: One of the box lengths is smaller than twice the cut-off length. Increase the box size or decrease rlist.");
4412 warning_error(wi, warn_buf);
4415 fprintf(stderr, "Grid search might allow larger cut-off's than simple search with triclinic boxes.");
4422 void check_chargegroup_radii(const gmx_mtop_t *mtop, const t_inputrec *ir,
4426 real rvdw1, rvdw2, rcoul1, rcoul2;
4427 char warn_buf[STRLEN];
4429 calc_chargegroup_radii(mtop, x, &rvdw1, &rvdw2, &rcoul1, &rcoul2);
4433 printf("Largest charge group radii for Van der Waals: %5.3f, %5.3f nm\n",
4438 printf("Largest charge group radii for Coulomb: %5.3f, %5.3f nm\n",
4444 if (rvdw1 + rvdw2 > ir->rlist ||
4445 rcoul1 + rcoul2 > ir->rlist)
4448 "The sum of the two largest charge group radii (%f) "
4449 "is larger than rlist (%f)\n",
4450 std::max(rvdw1+rvdw2, rcoul1+rcoul2), ir->rlist);
4451 warning(wi, warn_buf);
4455 /* Here we do not use the zero at cut-off macro,
4456 * since user defined interactions might purposely
4457 * not be zero at the cut-off.
4459 if (ir_vdw_is_zero_at_cutoff(ir) &&
4460 rvdw1 + rvdw2 > ir->rlist - ir->rvdw)
4462 sprintf(warn_buf, "The sum of the two largest charge group "
4463 "radii (%f) is larger than rlist (%f) - rvdw (%f).\n"
4464 "With exact cut-offs, better performance can be "
4465 "obtained with cutoff-scheme = %s, because it "
4466 "does not use charge groups at all.",
4468 ir->rlist, ir->rvdw,
4469 ecutscheme_names[ecutsVERLET]);
4472 warning(wi, warn_buf);
4476 warning_note(wi, warn_buf);
4479 if (ir_coulomb_is_zero_at_cutoff(ir) &&
4480 rcoul1 + rcoul2 > ir->rlist - ir->rcoulomb)
4482 sprintf(warn_buf, "The sum of the two largest charge group radii (%f) is larger than rlist (%f) - rcoulomb (%f).\n"
4483 "With exact cut-offs, better performance can be obtained with cutoff-scheme = %s, because it does not use charge groups at all.",
4485 ir->rlist, ir->rcoulomb,
4486 ecutscheme_names[ecutsVERLET]);
4489 warning(wi, warn_buf);
4493 warning_note(wi, warn_buf);