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, 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 "gmx_fatal.h"
62 #include "mtop_util.h"
63 #include "chargegroup.h"
69 /* Resource parameters
70 * Do not change any of these until you read the instruction
71 * in readinp.h. Some cpp's do not take spaces after the backslash
72 * (like the c-shell), which will give you a very weird compiler
76 typedef struct t_inputrec_strings
78 char tcgrps[STRLEN], tau_t[STRLEN], ref_t[STRLEN],
79 acc[STRLEN], accgrps[STRLEN], freeze[STRLEN], frdim[STRLEN],
80 energy[STRLEN], user1[STRLEN], user2[STRLEN], vcm[STRLEN], x_compressed_groups[STRLEN],
81 couple_moltype[STRLEN], orirefitgrp[STRLEN], egptable[STRLEN], egpexcl[STRLEN],
82 wall_atomtype[STRLEN], wall_density[STRLEN], deform[STRLEN], QMMM[STRLEN];
83 char fep_lambda[efptNR][STRLEN];
84 char lambda_weights[STRLEN];
87 char anneal[STRLEN], anneal_npoints[STRLEN],
88 anneal_time[STRLEN], anneal_temp[STRLEN];
89 char QMmethod[STRLEN], QMbasis[STRLEN], QMcharge[STRLEN], QMmult[STRLEN],
90 bSH[STRLEN], CASorbitals[STRLEN], CASelectrons[STRLEN], SAon[STRLEN],
91 SAoff[STRLEN], SAsteps[STRLEN], bTS[STRLEN], bOPT[STRLEN];
92 char efield_x[STRLEN], efield_xt[STRLEN], efield_y[STRLEN],
93 efield_yt[STRLEN], efield_z[STRLEN], efield_zt[STRLEN];
95 } gmx_inputrec_strings;
97 static gmx_inputrec_strings *is = NULL;
99 void init_inputrec_strings()
103 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.");
108 void done_inputrec_strings()
114 static char swapgrp[STRLEN], splitgrp0[STRLEN], splitgrp1[STRLEN], solgrp[STRLEN];
117 egrptpALL, /* All particles have to be a member of a group. */
118 egrptpALL_GENREST, /* A rest group with name is generated for particles *
119 * that are not part of any group. */
120 egrptpPART, /* As egrptpALL_GENREST, but no name is generated *
121 * for the rest group. */
122 egrptpONE /* Merge all selected groups into one group, *
123 * make a rest group for the remaining particles. */
126 static const char *constraints[eshNR+1] = {
127 "none", "h-bonds", "all-bonds", "h-angles", "all-angles", NULL
130 static const char *couple_lam[ecouplamNR+1] = {
131 "vdw-q", "vdw", "q", "none", NULL
134 void init_ir(t_inputrec *ir, t_gromppopts *opts)
136 snew(opts->include, STRLEN);
137 snew(opts->define, STRLEN);
138 snew(ir->fepvals, 1);
139 snew(ir->expandedvals, 1);
140 snew(ir->simtempvals, 1);
143 static void GetSimTemps(int ntemps, t_simtemp *simtemp, double *temperature_lambdas)
148 for (i = 0; i < ntemps; i++)
150 /* simple linear scaling -- allows more control */
151 if (simtemp->eSimTempScale == esimtempLINEAR)
153 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*temperature_lambdas[i];
155 else if (simtemp->eSimTempScale == esimtempGEOMETRIC) /* should give roughly equal acceptance for constant heat capacity . . . */
157 simtemp->temperatures[i] = simtemp->simtemp_low * pow(simtemp->simtemp_high/simtemp->simtemp_low, (1.0*i)/(ntemps-1));
159 else if (simtemp->eSimTempScale == esimtempEXPONENTIAL)
161 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*((exp(temperature_lambdas[i])-1)/(exp(1.0)-1));
166 sprintf(errorstr, "eSimTempScale=%d not defined", simtemp->eSimTempScale);
167 gmx_fatal(FARGS, errorstr);
174 static void _low_check(gmx_bool b, char *s, warninp_t wi)
178 warning_error(wi, s);
182 static void check_nst(const char *desc_nst, int nst,
183 const char *desc_p, int *p,
188 if (*p > 0 && *p % nst != 0)
190 /* Round up to the next multiple of nst */
191 *p = ((*p)/nst + 1)*nst;
192 sprintf(buf, "%s should be a multiple of %s, changing %s to %d\n",
193 desc_p, desc_nst, desc_p, *p);
198 static gmx_bool ir_NVE(const t_inputrec *ir)
200 return ((ir->eI == eiMD || EI_VV(ir->eI)) && ir->etc == etcNO);
203 static int lcd(int n1, int n2)
208 for (i = 2; (i <= n1 && i <= n2); i++)
210 if (n1 % i == 0 && n2 % i == 0)
219 static void process_interaction_modifier(const t_inputrec *ir, int *eintmod)
221 if (*eintmod == eintmodPOTSHIFT_VERLET)
223 if (ir->cutoff_scheme == ecutsVERLET)
225 *eintmod = eintmodPOTSHIFT;
229 *eintmod = eintmodNONE;
234 void check_ir(const char *mdparin, t_inputrec *ir, t_gromppopts *opts,
236 /* Check internal consistency */
238 /* Strange macro: first one fills the err_buf, and then one can check
239 * the condition, which will print the message and increase the error
242 #define CHECK(b) _low_check(b, err_buf, wi)
243 char err_buf[256], warn_buf[STRLEN];
249 t_lambda *fep = ir->fepvals;
250 t_expanded *expand = ir->expandedvals;
252 set_warning_line(wi, mdparin, -1);
254 /* BASIC CUT-OFF STUFF */
255 if (ir->rcoulomb < 0)
257 warning_error(wi, "rcoulomb should be >= 0");
261 warning_error(wi, "rvdw should be >= 0");
264 !(ir->cutoff_scheme == ecutsVERLET && ir->verletbuf_tol > 0))
266 warning_error(wi, "rlist should be >= 0");
269 process_interaction_modifier(ir, &ir->coulomb_modifier);
270 process_interaction_modifier(ir, &ir->vdw_modifier);
272 if (ir->cutoff_scheme == ecutsGROUP)
274 /* BASIC CUT-OFF STUFF */
275 if (ir->rlist == 0 ||
276 !((EEL_MIGHT_BE_ZERO_AT_CUTOFF(ir->coulombtype) && ir->rcoulomb > ir->rlist) ||
277 (EVDW_MIGHT_BE_ZERO_AT_CUTOFF(ir->vdwtype) && ir->rvdw > ir->rlist)))
279 /* No switched potential and/or no twin-range:
280 * we can set the long-range cut-off to the maximum of the other cut-offs.
282 ir->rlistlong = max_cutoff(ir->rlist, max_cutoff(ir->rvdw, ir->rcoulomb));
284 else if (ir->rlistlong < 0)
286 ir->rlistlong = max_cutoff(ir->rlist, max_cutoff(ir->rvdw, ir->rcoulomb));
287 sprintf(warn_buf, "rlistlong was not set, setting it to %g (no buffer)",
289 warning(wi, warn_buf);
291 if (ir->rlistlong == 0 && ir->ePBC != epbcNONE)
293 warning_error(wi, "Can not have an infinite cut-off with PBC");
295 if (ir->rlistlong > 0 && (ir->rlist == 0 || ir->rlistlong < ir->rlist))
297 warning_error(wi, "rlistlong can not be shorter than rlist");
299 if (IR_TWINRANGE(*ir) && ir->nstlist <= 0)
301 warning_error(wi, "Can not have nstlist<=0 with twin-range interactions");
305 if (ir->rlistlong == ir->rlist)
309 else if (ir->rlistlong > ir->rlist && ir->nstcalclr == 0)
311 warning_error(wi, "With different cutoffs for electrostatics and VdW, nstcalclr must be -1 or a positive number");
314 if (ir->cutoff_scheme == ecutsVERLET)
318 /* Normal Verlet type neighbor-list, currently only limited feature support */
319 if (inputrec2nboundeddim(ir) < 3)
321 warning_error(wi, "With Verlet lists only full pbc or pbc=xy with walls is supported");
323 if (ir->rcoulomb != ir->rvdw)
325 warning_error(wi, "With Verlet lists rcoulomb!=rvdw is not supported");
327 if (ir->vdwtype != evdwCUT)
329 warning_error(wi, "With Verlet lists only cut-off LJ interactions are supported");
331 if (!(ir->coulombtype == eelCUT ||
332 (EEL_RF(ir->coulombtype) && ir->coulombtype != eelRF_NEC) ||
333 EEL_PME(ir->coulombtype) || ir->coulombtype == eelEWALD))
335 warning_error(wi, "With Verlet lists only cut-off, reaction-field, PME and Ewald electrostatics are supported");
338 if (ir->nstlist <= 0)
340 warning_error(wi, "With Verlet lists nstlist should be larger than 0");
343 if (ir->nstlist < 10)
345 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.");
348 rc_max = max(ir->rvdw, ir->rcoulomb);
350 if (ir->verletbuf_tol <= 0)
352 if (ir->verletbuf_tol == 0)
354 warning_error(wi, "Can not have Verlet buffer tolerance of exactly 0");
357 if (ir->rlist < rc_max)
359 warning_error(wi, "With verlet lists rlist can not be smaller than rvdw or rcoulomb");
362 if (ir->rlist == rc_max && ir->nstlist > 1)
364 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.");
369 if (ir->rlist > rc_max)
371 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.");
374 if (ir->nstlist == 1)
376 /* No buffer required */
381 if (EI_DYNAMICS(ir->eI))
383 if (EI_MD(ir->eI) && ir->etc == etcNO)
385 warning_error(wi, "Temperature coupling is required for calculating rlist using the energy tolerance with verlet-buffer-tolerance > 0. Either use temperature coupling or set rlist yourself together with verlet-buffer-tolerance = -1.");
388 if (inputrec2nboundeddim(ir) < 3)
390 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.");
392 /* Set rlist temporarily so we can continue processing */
397 /* Set the buffer to 5% of the cut-off */
398 ir->rlist = 1.05*rc_max;
403 /* No twin-range calculations with Verlet lists */
404 ir->rlistlong = ir->rlist;
407 if (ir->nstcalclr == -1)
409 /* if rlist=rlistlong, this will later be changed to nstcalclr=0 */
410 ir->nstcalclr = ir->nstlist;
412 else if (ir->nstcalclr > 0)
414 if (ir->nstlist > 0 && (ir->nstlist % ir->nstcalclr != 0))
416 warning_error(wi, "nstlist must be evenly divisible by nstcalclr. Use nstcalclr = -1 to automatically follow nstlist");
419 else if (ir->nstcalclr < -1)
421 warning_error(wi, "nstcalclr must be a positive number (divisor of nstcalclr), or -1 to follow nstlist.");
424 if (EEL_PME(ir->coulombtype) && ir->rcoulomb > ir->rvdw && ir->nstcalclr > 1)
426 warning_error(wi, "When used with PME, the long-range component of twin-range interactions must be updated every step (nstcalclr)");
429 /* GENERAL INTEGRATOR STUFF */
430 if (!(ir->eI == eiMD || EI_VV(ir->eI)))
434 if (ir->eI == eiVVAK)
436 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]);
437 warning_note(wi, warn_buf);
439 if (!EI_DYNAMICS(ir->eI))
443 if (EI_DYNAMICS(ir->eI))
445 if (ir->nstcalcenergy < 0)
447 ir->nstcalcenergy = ir_optimal_nstcalcenergy(ir);
448 if (ir->nstenergy != 0 && ir->nstenergy < ir->nstcalcenergy)
450 /* nstcalcenergy larger than nstener does not make sense.
451 * We ideally want nstcalcenergy=nstener.
455 ir->nstcalcenergy = lcd(ir->nstenergy, ir->nstlist);
459 ir->nstcalcenergy = ir->nstenergy;
463 else if ( (ir->nstenergy > 0 && ir->nstcalcenergy > ir->nstenergy) ||
464 (ir->efep != efepNO && ir->fepvals->nstdhdl > 0 &&
465 (ir->nstcalcenergy > ir->fepvals->nstdhdl) ) )
468 const char *nsten = "nstenergy";
469 const char *nstdh = "nstdhdl";
470 const char *min_name = nsten;
471 int min_nst = ir->nstenergy;
473 /* find the smallest of ( nstenergy, nstdhdl ) */
474 if (ir->efep != efepNO && ir->fepvals->nstdhdl > 0 &&
475 (ir->fepvals->nstdhdl < ir->nstenergy) )
477 min_nst = ir->fepvals->nstdhdl;
480 /* If the user sets nstenergy small, we should respect that */
482 "Setting nstcalcenergy (%d) equal to %s (%d)",
483 ir->nstcalcenergy, min_name, min_nst);
484 warning_note(wi, warn_buf);
485 ir->nstcalcenergy = min_nst;
488 if (ir->epc != epcNO)
490 if (ir->nstpcouple < 0)
492 ir->nstpcouple = ir_optimal_nstpcouple(ir);
495 if (IR_TWINRANGE(*ir))
497 check_nst("nstlist", ir->nstlist,
498 "nstcalcenergy", &ir->nstcalcenergy, wi);
499 if (ir->epc != epcNO)
501 check_nst("nstlist", ir->nstlist,
502 "nstpcouple", &ir->nstpcouple, wi);
506 if (ir->nstcalcenergy > 0)
508 if (ir->efep != efepNO)
510 /* nstdhdl should be a multiple of nstcalcenergy */
511 check_nst("nstcalcenergy", ir->nstcalcenergy,
512 "nstdhdl", &ir->fepvals->nstdhdl, wi);
513 /* nstexpanded should be a multiple of nstcalcenergy */
514 check_nst("nstcalcenergy", ir->nstcalcenergy,
515 "nstexpanded", &ir->expandedvals->nstexpanded, wi);
517 /* for storing exact averages nstenergy should be
518 * a multiple of nstcalcenergy
520 check_nst("nstcalcenergy", ir->nstcalcenergy,
521 "nstenergy", &ir->nstenergy, wi);
526 if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
527 ir->bContinuation && ir->ld_seed != -1)
529 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)");
535 sprintf(err_buf, "TPI only works with pbc = %s", epbc_names[epbcXYZ]);
536 CHECK(ir->ePBC != epbcXYZ);
537 sprintf(err_buf, "TPI only works with ns = %s", ens_names[ensGRID]);
538 CHECK(ir->ns_type != ensGRID);
539 sprintf(err_buf, "with TPI nstlist should be larger than zero");
540 CHECK(ir->nstlist <= 0);
541 sprintf(err_buf, "TPI does not work with full electrostatics other than PME");
542 CHECK(EEL_FULL(ir->coulombtype) && !EEL_PME(ir->coulombtype));
546 if ( (opts->nshake > 0) && (opts->bMorse) )
549 "Using morse bond-potentials while constraining bonds is useless");
550 warning(wi, warn_buf);
553 if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
554 ir->bContinuation && ir->ld_seed != -1)
556 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)");
558 /* verify simulated tempering options */
562 gmx_bool bAllTempZero = TRUE;
563 for (i = 0; i < fep->n_lambda; i++)
565 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]);
566 CHECK((fep->all_lambda[efptTEMPERATURE][i] < 0) || (fep->all_lambda[efptTEMPERATURE][i] > 1));
567 if (fep->all_lambda[efptTEMPERATURE][i] > 0)
569 bAllTempZero = FALSE;
572 sprintf(err_buf, "if simulated tempering is on, temperature-lambdas may not be all zero");
573 CHECK(bAllTempZero == TRUE);
575 sprintf(err_buf, "Simulated tempering is currently only compatible with md-vv");
576 CHECK(ir->eI != eiVV);
578 /* check compatability of the temperature coupling with simulated tempering */
580 if (ir->etc == etcNOSEHOOVER)
582 sprintf(warn_buf, "Nose-Hoover based temperature control such as [%s] my not be entirelyconsistent with simulated tempering", etcoupl_names[ir->etc]);
583 warning_note(wi, warn_buf);
586 /* check that the temperatures make sense */
588 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);
589 CHECK(ir->simtempvals->simtemp_high <= ir->simtempvals->simtemp_low);
591 sprintf(err_buf, "Higher simulated tempering temperature (%g) must be >= zero", ir->simtempvals->simtemp_high);
592 CHECK(ir->simtempvals->simtemp_high <= 0);
594 sprintf(err_buf, "Lower simulated tempering temperature (%g) must be >= zero", ir->simtempvals->simtemp_low);
595 CHECK(ir->simtempvals->simtemp_low <= 0);
598 /* verify free energy options */
600 if (ir->efep != efepNO)
603 sprintf(err_buf, "The soft-core power is %d and can only be 1 or 2",
605 CHECK(fep->sc_alpha != 0 && fep->sc_power != 1 && fep->sc_power != 2);
607 sprintf(err_buf, "The soft-core sc-r-power is %d and can only be 6 or 48",
608 (int)fep->sc_r_power);
609 CHECK(fep->sc_alpha != 0 && fep->sc_r_power != 6.0 && fep->sc_r_power != 48.0);
611 sprintf(err_buf, "Can't use postive delta-lambda (%g) if initial state/lambda does not start at zero", fep->delta_lambda);
612 CHECK(fep->delta_lambda > 0 && ((fep->init_fep_state > 0) || (fep->init_lambda > 0)));
614 sprintf(err_buf, "Can't use postive delta-lambda (%g) with expanded ensemble simulations", fep->delta_lambda);
615 CHECK(fep->delta_lambda > 0 && (ir->efep == efepEXPANDED));
617 sprintf(err_buf, "Can only use expanded ensemble with md-vv for now; should be supported for other integrators in 5.0");
618 CHECK(!(EI_VV(ir->eI)) && (ir->efep == efepEXPANDED));
620 sprintf(err_buf, "Free-energy not implemented for Ewald");
621 CHECK(ir->coulombtype == eelEWALD);
623 /* check validty of lambda inputs */
624 if (fep->n_lambda == 0)
626 /* Clear output in case of no states:*/
627 sprintf(err_buf, "init-lambda-state set to %d: no lambda states are defined.", fep->init_fep_state);
628 CHECK((fep->init_fep_state >= 0) && (fep->n_lambda == 0));
632 sprintf(err_buf, "initial thermodynamic state %d does not exist, only goes to %d", fep->init_fep_state, fep->n_lambda-1);
633 CHECK((fep->init_fep_state >= fep->n_lambda));
636 sprintf(err_buf, "Lambda state must be set, either with init-lambda-state or with init-lambda");
637 CHECK((fep->init_fep_state < 0) && (fep->init_lambda < 0));
639 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",
640 fep->init_lambda, fep->init_fep_state);
641 CHECK((fep->init_fep_state >= 0) && (fep->init_lambda >= 0));
645 if ((fep->init_lambda >= 0) && (fep->delta_lambda == 0))
649 for (i = 0; i < efptNR; i++)
651 if (fep->separate_dvdl[i])
656 if (n_lambda_terms > 1)
658 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.");
659 warning(wi, warn_buf);
662 if (n_lambda_terms < 2 && fep->n_lambda > 0)
665 "init-lambda is deprecated for setting lambda state (except for slow growth). Use init-lambda-state instead.");
669 for (j = 0; j < efptNR; j++)
671 for (i = 0; i < fep->n_lambda; i++)
673 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]);
674 CHECK((fep->all_lambda[j][i] < 0) || (fep->all_lambda[j][i] > 1));
678 if ((fep->sc_alpha > 0) && (!fep->bScCoul))
680 for (i = 0; i < fep->n_lambda; i++)
682 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],
683 fep->all_lambda[efptCOUL][i]);
684 CHECK((fep->sc_alpha > 0) &&
685 (((fep->all_lambda[efptCOUL][i] > 0.0) &&
686 (fep->all_lambda[efptCOUL][i] < 1.0)) &&
687 ((fep->all_lambda[efptVDW][i] > 0.0) &&
688 (fep->all_lambda[efptVDW][i] < 1.0))));
692 if ((fep->bScCoul) && (EEL_PME(ir->coulombtype)))
694 real sigma, lambda, r_sc;
697 /* Maximum estimate for A and B charges equal with lambda power 1 */
699 r_sc = pow(lambda*fep->sc_alpha*pow(sigma/ir->rcoulomb, fep->sc_r_power) + 1.0, 1.0/fep->sc_r_power);
700 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.",
702 sigma, lambda, r_sc - 1.0, ir->ewald_rtol);
703 warning_note(wi, warn_buf);
706 /* Free Energy Checks -- In an ideal world, slow growth and FEP would
707 be treated differently, but that's the next step */
709 for (i = 0; i < efptNR; i++)
711 for (j = 0; j < fep->n_lambda; j++)
713 sprintf(err_buf, "%s[%d] must be between 0 and 1", efpt_names[i], j);
714 CHECK((fep->all_lambda[i][j] < 0) || (fep->all_lambda[i][j] > 1));
719 if ((ir->bSimTemp) || (ir->efep == efepEXPANDED))
722 expand = ir->expandedvals;
724 /* checking equilibration of weights inputs for validity */
726 sprintf(err_buf, "weight-equil-number-all-lambda (%d) is ignored if lmc-weights-equil is not equal to %s",
727 expand->equil_n_at_lam, elmceq_names[elmceqNUMATLAM]);
728 CHECK((expand->equil_n_at_lam > 0) && (expand->elmceq != elmceqNUMATLAM));
730 sprintf(err_buf, "weight-equil-number-samples (%d) is ignored if lmc-weights-equil is not equal to %s",
731 expand->equil_samples, elmceq_names[elmceqSAMPLES]);
732 CHECK((expand->equil_samples > 0) && (expand->elmceq != elmceqSAMPLES));
734 sprintf(err_buf, "weight-equil-number-steps (%d) is ignored if lmc-weights-equil is not equal to %s",
735 expand->equil_steps, elmceq_names[elmceqSTEPS]);
736 CHECK((expand->equil_steps > 0) && (expand->elmceq != elmceqSTEPS));
738 sprintf(err_buf, "weight-equil-wl-delta (%d) is ignored if lmc-weights-equil is not equal to %s",
739 expand->equil_samples, elmceq_names[elmceqWLDELTA]);
740 CHECK((expand->equil_wl_delta > 0) && (expand->elmceq != elmceqWLDELTA));
742 sprintf(err_buf, "weight-equil-count-ratio (%f) is ignored if lmc-weights-equil is not equal to %s",
743 expand->equil_ratio, elmceq_names[elmceqRATIO]);
744 CHECK((expand->equil_ratio > 0) && (expand->elmceq != elmceqRATIO));
746 sprintf(err_buf, "weight-equil-number-all-lambda (%d) must be a positive integer if lmc-weights-equil=%s",
747 expand->equil_n_at_lam, elmceq_names[elmceqNUMATLAM]);
748 CHECK((expand->equil_n_at_lam <= 0) && (expand->elmceq == elmceqNUMATLAM));
750 sprintf(err_buf, "weight-equil-number-samples (%d) must be a positive integer if lmc-weights-equil=%s",
751 expand->equil_samples, elmceq_names[elmceqSAMPLES]);
752 CHECK((expand->equil_samples <= 0) && (expand->elmceq == elmceqSAMPLES));
754 sprintf(err_buf, "weight-equil-number-steps (%d) must be a positive integer if lmc-weights-equil=%s",
755 expand->equil_steps, elmceq_names[elmceqSTEPS]);
756 CHECK((expand->equil_steps <= 0) && (expand->elmceq == elmceqSTEPS));
758 sprintf(err_buf, "weight-equil-wl-delta (%f) must be > 0 if lmc-weights-equil=%s",
759 expand->equil_wl_delta, elmceq_names[elmceqWLDELTA]);
760 CHECK((expand->equil_wl_delta <= 0) && (expand->elmceq == elmceqWLDELTA));
762 sprintf(err_buf, "weight-equil-count-ratio (%f) must be > 0 if lmc-weights-equil=%s",
763 expand->equil_ratio, elmceq_names[elmceqRATIO]);
764 CHECK((expand->equil_ratio <= 0) && (expand->elmceq == elmceqRATIO));
766 sprintf(err_buf, "lmc-weights-equil=%s only possible when lmc-stats = %s or lmc-stats %s",
767 elmceq_names[elmceqWLDELTA], elamstats_names[elamstatsWL], elamstats_names[elamstatsWWL]);
768 CHECK((expand->elmceq == elmceqWLDELTA) && (!EWL(expand->elamstats)));
770 sprintf(err_buf, "lmc-repeats (%d) must be greater than 0", expand->lmc_repeats);
771 CHECK((expand->lmc_repeats <= 0));
772 sprintf(err_buf, "minimum-var-min (%d) must be greater than 0", expand->minvarmin);
773 CHECK((expand->minvarmin <= 0));
774 sprintf(err_buf, "weight-c-range (%d) must be greater or equal to 0", expand->c_range);
775 CHECK((expand->c_range < 0));
776 sprintf(err_buf, "init-lambda-state (%d) must be zero if lmc-forced-nstart (%d)> 0 and lmc-move != 'no'",
777 fep->init_fep_state, expand->lmc_forced_nstart);
778 CHECK((fep->init_fep_state != 0) && (expand->lmc_forced_nstart > 0) && (expand->elmcmove != elmcmoveNO));
779 sprintf(err_buf, "lmc-forced-nstart (%d) must not be negative", expand->lmc_forced_nstart);
780 CHECK((expand->lmc_forced_nstart < 0));
781 sprintf(err_buf, "init-lambda-state (%d) must be in the interval [0,number of lambdas)", fep->init_fep_state);
782 CHECK((fep->init_fep_state < 0) || (fep->init_fep_state >= fep->n_lambda));
784 sprintf(err_buf, "init-wl-delta (%f) must be greater than or equal to 0", expand->init_wl_delta);
785 CHECK((expand->init_wl_delta < 0));
786 sprintf(err_buf, "wl-ratio (%f) must be between 0 and 1", expand->wl_ratio);
787 CHECK((expand->wl_ratio <= 0) || (expand->wl_ratio >= 1));
788 sprintf(err_buf, "wl-scale (%f) must be between 0 and 1", expand->wl_scale);
789 CHECK((expand->wl_scale <= 0) || (expand->wl_scale >= 1));
791 /* if there is no temperature control, we need to specify an MC temperature */
792 sprintf(err_buf, "If there is no temperature control, and lmc-mcmove!= 'no',mc_temperature must be set to a positive number");
793 if (expand->nstTij > 0)
795 sprintf(err_buf, "nst-transition-matrix (%d) must be an integer multiple of nstlog (%d)",
796 expand->nstTij, ir->nstlog);
797 CHECK((mod(expand->nstTij, ir->nstlog) != 0));
802 sprintf(err_buf, "walls only work with pbc=%s", epbc_names[epbcXY]);
803 CHECK(ir->nwall && ir->ePBC != epbcXY);
806 if (ir->ePBC != epbcXYZ && ir->nwall != 2)
808 if (ir->ePBC == epbcNONE)
810 if (ir->epc != epcNO)
812 warning(wi, "Turning off pressure coupling for vacuum system");
818 sprintf(err_buf, "Can not have pressure coupling with pbc=%s",
819 epbc_names[ir->ePBC]);
820 CHECK(ir->epc != epcNO);
822 sprintf(err_buf, "Can not have Ewald with pbc=%s", epbc_names[ir->ePBC]);
823 CHECK(EEL_FULL(ir->coulombtype));
825 sprintf(err_buf, "Can not have dispersion correction with pbc=%s",
826 epbc_names[ir->ePBC]);
827 CHECK(ir->eDispCorr != edispcNO);
830 if (ir->rlist == 0.0)
832 sprintf(err_buf, "can only have neighborlist cut-off zero (=infinite)\n"
833 "with coulombtype = %s or coulombtype = %s\n"
834 "without periodic boundary conditions (pbc = %s) and\n"
835 "rcoulomb and rvdw set to zero",
836 eel_names[eelCUT], eel_names[eelUSER], epbc_names[epbcNONE]);
837 CHECK(((ir->coulombtype != eelCUT) && (ir->coulombtype != eelUSER)) ||
838 (ir->ePBC != epbcNONE) ||
839 (ir->rcoulomb != 0.0) || (ir->rvdw != 0.0));
843 warning_error(wi, "Can not have heuristic neighborlist updates without cut-off");
847 warning_note(wi, "Simulating without cut-offs is usually (slightly) faster with nstlist=0, nstype=simple and particle decomposition");
852 if (ir->nstcomm == 0)
854 ir->comm_mode = ecmNO;
856 if (ir->comm_mode != ecmNO)
860 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");
861 ir->nstcomm = abs(ir->nstcomm);
864 if (ir->nstcalcenergy > 0 && ir->nstcomm < ir->nstcalcenergy)
866 warning_note(wi, "nstcomm < nstcalcenergy defeats the purpose of nstcalcenergy, setting nstcomm to nstcalcenergy");
867 ir->nstcomm = ir->nstcalcenergy;
870 if (ir->comm_mode == ecmANGULAR)
872 sprintf(err_buf, "Can not remove the rotation around the center of mass with periodic molecules");
873 CHECK(ir->bPeriodicMols);
874 if (ir->ePBC != epbcNONE)
876 warning(wi, "Removing the rotation around the center of mass in a periodic system (this is not a problem when you have only one molecule).");
881 if (EI_STATE_VELOCITY(ir->eI) && ir->ePBC == epbcNONE && ir->comm_mode != ecmANGULAR)
883 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.");
886 sprintf(err_buf, "Twin-range neighbour searching (NS) with simple NS"
887 " algorithm not implemented");
888 CHECK(((ir->rcoulomb > ir->rlist) || (ir->rvdw > ir->rlist))
889 && (ir->ns_type == ensSIMPLE));
891 /* TEMPERATURE COUPLING */
892 if (ir->etc == etcYES)
894 ir->etc = etcBERENDSEN;
895 warning_note(wi, "Old option for temperature coupling given: "
896 "changing \"yes\" to \"Berendsen\"\n");
899 if ((ir->etc == etcNOSEHOOVER) || (ir->epc == epcMTTK))
901 if (ir->opts.nhchainlength < 1)
903 sprintf(warn_buf, "number of Nose-Hoover chains (currently %d) cannot be less than 1,reset to 1\n", ir->opts.nhchainlength);
904 ir->opts.nhchainlength = 1;
905 warning(wi, warn_buf);
908 if (ir->etc == etcNOSEHOOVER && !EI_VV(ir->eI) && ir->opts.nhchainlength > 1)
910 warning_note(wi, "leapfrog does not yet support Nose-Hoover chains, nhchainlength reset to 1");
911 ir->opts.nhchainlength = 1;
916 ir->opts.nhchainlength = 0;
919 if (ir->eI == eiVVAK)
921 sprintf(err_buf, "%s implemented primarily for validation, and requires nsttcouple = 1 and nstpcouple = 1.",
923 CHECK((ir->nsttcouple != 1) || (ir->nstpcouple != 1));
926 if (ETC_ANDERSEN(ir->etc))
928 sprintf(err_buf, "%s temperature control not supported for integrator %s.", etcoupl_names[ir->etc], ei_names[ir->eI]);
929 CHECK(!(EI_VV(ir->eI)));
931 for (i = 0; i < ir->opts.ngtc; i++)
933 sprintf(err_buf, "all tau_t must currently be equal using Andersen temperature control, violated for group %d", i);
934 CHECK(ir->opts.tau_t[0] != ir->opts.tau_t[i]);
935 sprintf(err_buf, "all tau_t must be postive using Andersen temperature control, tau_t[%d]=%10.6f",
936 i, ir->opts.tau_t[i]);
937 CHECK(ir->opts.tau_t[i] < 0);
939 if (ir->nstcomm > 0 && (ir->etc == etcANDERSEN))
941 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]);
942 warning_note(wi, warn_buf);
945 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]);
946 CHECK(ir->nstcomm > 1 && (ir->etc == etcANDERSEN));
948 for (i = 0; i < ir->opts.ngtc; i++)
950 int nsteps = (int)(ir->opts.tau_t[i]/ir->delta_t);
951 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);
952 CHECK((nsteps % ir->nstcomm) && (ir->etc == etcANDERSENMASSIVE));
955 if (ir->etc == etcBERENDSEN)
957 sprintf(warn_buf, "The %s thermostat does not generate the correct kinetic energy distribution. You might want to consider using the %s thermostat.",
958 ETCOUPLTYPE(ir->etc), ETCOUPLTYPE(etcVRESCALE));
959 warning_note(wi, warn_buf);
962 if ((ir->etc == etcNOSEHOOVER || ETC_ANDERSEN(ir->etc))
963 && ir->epc == epcBERENDSEN)
965 sprintf(warn_buf, "Using Berendsen pressure coupling invalidates the "
966 "true ensemble for the thermostat");
967 warning(wi, warn_buf);
970 /* PRESSURE COUPLING */
971 if (ir->epc == epcISOTROPIC)
973 ir->epc = epcBERENDSEN;
974 warning_note(wi, "Old option for pressure coupling given: "
975 "changing \"Isotropic\" to \"Berendsen\"\n");
978 if (ir->epc != epcNO)
980 dt_pcoupl = ir->nstpcouple*ir->delta_t;
982 sprintf(err_buf, "tau-p must be > 0 instead of %g\n", ir->tau_p);
983 CHECK(ir->tau_p <= 0);
985 if (ir->tau_p/dt_pcoupl < pcouple_min_integration_steps(ir->epc))
987 sprintf(warn_buf, "For proper integration of the %s barostat, tau-p (%g) should be at least %d times larger than nstpcouple*dt (%g)",
988 EPCOUPLTYPE(ir->epc), ir->tau_p, pcouple_min_integration_steps(ir->epc), dt_pcoupl);
989 warning(wi, warn_buf);
992 sprintf(err_buf, "compressibility must be > 0 when using pressure"
993 " coupling %s\n", EPCOUPLTYPE(ir->epc));
994 CHECK(ir->compress[XX][XX] < 0 || ir->compress[YY][YY] < 0 ||
995 ir->compress[ZZ][ZZ] < 0 ||
996 (trace(ir->compress) == 0 && ir->compress[YY][XX] <= 0 &&
997 ir->compress[ZZ][XX] <= 0 && ir->compress[ZZ][YY] <= 0));
999 if (epcPARRINELLORAHMAN == ir->epc && opts->bGenVel)
1002 "You are generating velocities so I am assuming you "
1003 "are equilibrating a system. You are using "
1004 "%s pressure coupling, but this can be "
1005 "unstable for equilibration. If your system crashes, try "
1006 "equilibrating first with Berendsen pressure coupling. If "
1007 "you are not equilibrating the system, you can probably "
1008 "ignore this warning.",
1009 epcoupl_names[ir->epc]);
1010 warning(wi, warn_buf);
1016 if (ir->epc > epcNO)
1018 if ((ir->epc != epcBERENDSEN) && (ir->epc != epcMTTK))
1020 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.");
1025 /* ELECTROSTATICS */
1026 /* More checks are in triple check (grompp.c) */
1028 if (ir->coulombtype == eelSWITCH)
1030 sprintf(warn_buf, "coulombtype = %s is only for testing purposes and can lead to serious "
1031 "artifacts, advice: use coulombtype = %s",
1032 eel_names[ir->coulombtype],
1033 eel_names[eelRF_ZERO]);
1034 warning(wi, warn_buf);
1037 if (ir->epsilon_r != 1 && ir->implicit_solvent == eisGBSA)
1039 sprintf(warn_buf, "epsilon-r = %g with GB implicit solvent, will use this value for inner dielectric", ir->epsilon_r);
1040 warning_note(wi, warn_buf);
1043 if (EEL_RF(ir->coulombtype) && ir->epsilon_rf == 1 && ir->epsilon_r != 1)
1045 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);
1046 warning(wi, warn_buf);
1047 ir->epsilon_rf = ir->epsilon_r;
1048 ir->epsilon_r = 1.0;
1051 if (getenv("GALACTIC_DYNAMICS") == NULL)
1053 sprintf(err_buf, "epsilon-r must be >= 0 instead of %g\n", ir->epsilon_r);
1054 CHECK(ir->epsilon_r < 0);
1057 if (EEL_RF(ir->coulombtype))
1059 /* reaction field (at the cut-off) */
1061 if (ir->coulombtype == eelRF_ZERO)
1063 sprintf(warn_buf, "With coulombtype = %s, epsilon-rf must be 0, assuming you meant epsilon_rf=0",
1064 eel_names[ir->coulombtype]);
1065 CHECK(ir->epsilon_rf != 0);
1066 ir->epsilon_rf = 0.0;
1069 sprintf(err_buf, "epsilon-rf must be >= epsilon-r");
1070 CHECK((ir->epsilon_rf < ir->epsilon_r && ir->epsilon_rf != 0) ||
1071 (ir->epsilon_r == 0));
1072 if (ir->epsilon_rf == ir->epsilon_r)
1074 sprintf(warn_buf, "Using epsilon-rf = epsilon-r with %s does not make sense",
1075 eel_names[ir->coulombtype]);
1076 warning(wi, warn_buf);
1079 /* Allow rlist>rcoulomb for tabulated long range stuff. This just
1080 * means the interaction is zero outside rcoulomb, but it helps to
1081 * provide accurate energy conservation.
1083 if (EEL_MIGHT_BE_ZERO_AT_CUTOFF(ir->coulombtype))
1085 if (EEL_SWITCHED(ir->coulombtype))
1088 "With coulombtype = %s rcoulomb_switch must be < rcoulomb. Or, better: Use the potential modifier options!",
1089 eel_names[ir->coulombtype]);
1090 CHECK(ir->rcoulomb_switch >= ir->rcoulomb);
1093 else if (ir->coulombtype == eelCUT || EEL_RF(ir->coulombtype))
1095 if (ir->cutoff_scheme == ecutsGROUP && ir->coulomb_modifier == eintmodNONE)
1097 sprintf(err_buf, "With coulombtype = %s, rcoulomb should be >= rlist unless you use a potential modifier",
1098 eel_names[ir->coulombtype]);
1099 CHECK(ir->rlist > ir->rcoulomb);
1103 if (ir->coulombtype == eelSWITCH || ir->coulombtype == eelSHIFT ||
1104 ir->vdwtype == evdwSWITCH || ir->vdwtype == evdwSHIFT)
1107 "The switch/shift interaction settings are just for compatibility; you will get better "
1108 "performance from applying potential modifiers to your interactions!\n");
1109 warning_note(wi, warn_buf);
1112 if (ir->coulombtype == eelPMESWITCH)
1114 if (ir->rcoulomb_switch/ir->rcoulomb < 0.9499)
1116 sprintf(warn_buf, "The switching range for %s should be 5%% or less, energy conservation will be good anyhow, since ewald_rtol = %g",
1117 eel_names[ir->coulombtype],
1119 warning(wi, warn_buf);
1123 if (EEL_FULL(ir->coulombtype))
1125 if (ir->coulombtype == eelPMESWITCH || ir->coulombtype == eelPMEUSER ||
1126 ir->coulombtype == eelPMEUSERSWITCH)
1128 sprintf(err_buf, "With coulombtype = %s, rcoulomb must be <= rlist",
1129 eel_names[ir->coulombtype]);
1130 CHECK(ir->rcoulomb > ir->rlist);
1132 else if (ir->cutoff_scheme == ecutsGROUP && ir->coulomb_modifier == eintmodNONE)
1134 if (ir->coulombtype == eelPME || ir->coulombtype == eelP3M_AD)
1137 "With coulombtype = %s (without modifier), rcoulomb must be equal to rlist,\n"
1138 "or rlistlong if nstcalclr=1. For optimal energy conservation,consider using\n"
1139 "a potential modifier.", eel_names[ir->coulombtype]);
1140 if (ir->nstcalclr == 1)
1142 CHECK(ir->rcoulomb != ir->rlist && ir->rcoulomb != ir->rlistlong);
1146 CHECK(ir->rcoulomb != ir->rlist);
1152 if (EVDW_PME(ir->vdwtype))
1154 if (EVDW_MIGHT_BE_ZERO_AT_CUTOFF(ir->vdwtype))
1156 sprintf(err_buf, "With vdwtype = %s, rvdw must be <= rlist",
1157 evdw_names[ir->vdwtype]);
1158 CHECK(ir->rvdw > ir->rlist);
1163 "With vdwtype = %s, rvdw must be equal to rlist\n",
1164 evdw_names[ir->vdwtype]);
1165 CHECK(ir->rvdw != ir->rlist);
1169 if (EEL_PME(ir->coulombtype) || EVDW_PME(ir->vdwtype))
1171 if (ir->pme_order < 3)
1173 warning_error(wi, "pme-order can not be smaller than 3");
1177 if (ir->nwall == 2 && EEL_FULL(ir->coulombtype))
1179 if (ir->ewald_geometry == eewg3D)
1181 sprintf(warn_buf, "With pbc=%s you should use ewald-geometry=%s",
1182 epbc_names[ir->ePBC], eewg_names[eewg3DC]);
1183 warning(wi, warn_buf);
1185 /* This check avoids extra pbc coding for exclusion corrections */
1186 sprintf(err_buf, "wall-ewald-zfac should be >= 2");
1187 CHECK(ir->wall_ewald_zfac < 2);
1190 if (EVDW_SWITCHED(ir->vdwtype))
1192 sprintf(err_buf, "With vdwtype = %s rvdw-switch must be < rvdw. Or, better - use a potential modifier.",
1193 evdw_names[ir->vdwtype]);
1194 CHECK(ir->rvdw_switch >= ir->rvdw);
1196 else if (ir->vdwtype == evdwCUT)
1198 if (ir->cutoff_scheme == ecutsGROUP && ir->vdw_modifier == eintmodNONE)
1200 sprintf(err_buf, "With vdwtype = %s, rvdw must be >= rlist unless you use a potential modifier", evdw_names[ir->vdwtype]);
1201 CHECK(ir->rlist > ir->rvdw);
1204 if (ir->cutoff_scheme == ecutsGROUP)
1206 if (((ir->coulomb_modifier != eintmodNONE && ir->rcoulomb == ir->rlist) ||
1207 (ir->vdw_modifier != eintmodNONE && ir->rvdw == ir->rlist)) &&
1210 warning_note(wi, "With exact cut-offs, rlist should be "
1211 "larger than rcoulomb and rvdw, so that there "
1212 "is a buffer region for particle motion "
1213 "between neighborsearch steps");
1216 if (EEL_IS_ZERO_AT_CUTOFF(ir->coulombtype)
1217 && (ir->rlistlong <= ir->rcoulomb))
1219 sprintf(warn_buf, "For energy conservation with switch/shift potentials, %s should be 0.1 to 0.3 nm larger than rcoulomb.",
1220 IR_TWINRANGE(*ir) ? "rlistlong" : "rlist");
1221 warning_note(wi, warn_buf);
1223 if (EVDW_SWITCHED(ir->vdwtype) && (ir->rlistlong <= ir->rvdw))
1225 sprintf(warn_buf, "For energy conservation with switch/shift potentials, %s should be 0.1 to 0.3 nm larger than rvdw.",
1226 IR_TWINRANGE(*ir) ? "rlistlong" : "rlist");
1227 warning_note(wi, warn_buf);
1231 if (ir->vdwtype == evdwUSER && ir->eDispCorr != edispcNO)
1233 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.");
1236 if (ir->nstlist == -1)
1238 sprintf(err_buf, "With nstlist=-1 rvdw and rcoulomb should be smaller than rlist to account for diffusion and possibly charge-group radii");
1239 CHECK(ir->rvdw >= ir->rlist || ir->rcoulomb >= ir->rlist);
1241 sprintf(err_buf, "nstlist can not be smaller than -1");
1242 CHECK(ir->nstlist < -1);
1244 if (ir->eI == eiLBFGS && (ir->coulombtype == eelCUT || ir->vdwtype == evdwCUT)
1247 warning(wi, "For efficient BFGS minimization, use switch/shift/pme instead of cut-off.");
1250 if (ir->eI == eiLBFGS && ir->nbfgscorr <= 0)
1252 warning(wi, "Using L-BFGS with nbfgscorr<=0 just gets you steepest descent.");
1255 /* ENERGY CONSERVATION */
1256 if (ir_NVE(ir) && ir->cutoff_scheme == ecutsGROUP)
1258 if (!EVDW_MIGHT_BE_ZERO_AT_CUTOFF(ir->vdwtype) && ir->rvdw > 0 && ir->vdw_modifier == eintmodNONE)
1260 sprintf(warn_buf, "You are using a cut-off for VdW interactions with NVE, for good energy conservation use vdwtype = %s (possibly with DispCorr)",
1261 evdw_names[evdwSHIFT]);
1262 warning_note(wi, warn_buf);
1264 if (!EEL_MIGHT_BE_ZERO_AT_CUTOFF(ir->coulombtype) && ir->rcoulomb > 0 && ir->coulomb_modifier == eintmodNONE)
1266 sprintf(warn_buf, "You are using a cut-off for electrostatics with NVE, for good energy conservation use coulombtype = %s or %s",
1267 eel_names[eelPMESWITCH], eel_names[eelRF_ZERO]);
1268 warning_note(wi, warn_buf);
1272 /* IMPLICIT SOLVENT */
1273 if (ir->coulombtype == eelGB_NOTUSED)
1275 ir->coulombtype = eelCUT;
1276 ir->implicit_solvent = eisGBSA;
1277 fprintf(stderr, "Note: Old option for generalized born electrostatics given:\n"
1278 "Changing coulombtype from \"generalized-born\" to \"cut-off\" and instead\n"
1279 "setting implicit-solvent value to \"GBSA\" in input section.\n");
1282 if (ir->sa_algorithm == esaSTILL)
1284 sprintf(err_buf, "Still SA algorithm not available yet, use %s or %s instead\n", esa_names[esaAPPROX], esa_names[esaNO]);
1285 CHECK(ir->sa_algorithm == esaSTILL);
1288 if (ir->implicit_solvent == eisGBSA)
1290 sprintf(err_buf, "With GBSA implicit solvent, rgbradii must be equal to rlist.");
1291 CHECK(ir->rgbradii != ir->rlist);
1293 if (ir->coulombtype != eelCUT)
1295 sprintf(err_buf, "With GBSA, coulombtype must be equal to %s\n", eel_names[eelCUT]);
1296 CHECK(ir->coulombtype != eelCUT);
1298 if (ir->vdwtype != evdwCUT)
1300 sprintf(err_buf, "With GBSA, vdw-type must be equal to %s\n", evdw_names[evdwCUT]);
1301 CHECK(ir->vdwtype != evdwCUT);
1303 if (ir->nstgbradii < 1)
1305 sprintf(warn_buf, "Using GBSA with nstgbradii<1, setting nstgbradii=1");
1306 warning_note(wi, warn_buf);
1309 if (ir->sa_algorithm == esaNO)
1311 sprintf(warn_buf, "No SA (non-polar) calculation requested together with GB. Are you sure this is what you want?\n");
1312 warning_note(wi, warn_buf);
1314 if (ir->sa_surface_tension < 0 && ir->sa_algorithm != esaNO)
1316 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");
1317 warning_note(wi, warn_buf);
1319 if (ir->gb_algorithm == egbSTILL)
1321 ir->sa_surface_tension = 0.0049 * CAL2JOULE * 100;
1325 ir->sa_surface_tension = 0.0054 * CAL2JOULE * 100;
1328 if (ir->sa_surface_tension == 0 && ir->sa_algorithm != esaNO)
1330 sprintf(err_buf, "Surface tension set to 0 while SA-calculation requested\n");
1331 CHECK(ir->sa_surface_tension == 0 && ir->sa_algorithm != esaNO);
1338 if (ir->cutoff_scheme != ecutsGROUP)
1340 warning_error(wi, "AdresS simulation supports only cutoff-scheme=group");
1344 warning_error(wi, "AdresS simulation supports only stochastic dynamics");
1346 if (ir->epc != epcNO)
1348 warning_error(wi, "AdresS simulation does not support pressure coupling");
1350 if (EEL_FULL(ir->coulombtype))
1352 warning_error(wi, "AdresS simulation does not support long-range electrostatics");
1357 /* count the number of text elemets separated by whitespace in a string.
1358 str = the input string
1359 maxptr = the maximum number of allowed elements
1360 ptr = the output array of pointers to the first character of each element
1361 returns: the number of elements. */
1362 int str_nelem(const char *str, int maxptr, char *ptr[])
1367 copy0 = strdup(str);
1370 while (*copy != '\0')
1374 gmx_fatal(FARGS, "Too many groups on line: '%s' (max is %d)",
1382 while ((*copy != '\0') && !isspace(*copy))
1401 /* interpret a number of doubles from a string and put them in an array,
1402 after allocating space for them.
1403 str = the input string
1404 n = the (pre-allocated) number of doubles read
1405 r = the output array of doubles. */
1406 static void parse_n_real(char *str, int *n, real **r)
1411 *n = str_nelem(str, MAXPTR, ptr);
1414 for (i = 0; i < *n; i++)
1416 (*r)[i] = strtod(ptr[i], NULL);
1420 static void do_fep_params(t_inputrec *ir, char fep_lambda[][STRLEN], char weights[STRLEN])
1423 int i, j, max_n_lambda, nweights, nfep[efptNR];
1424 t_lambda *fep = ir->fepvals;
1425 t_expanded *expand = ir->expandedvals;
1426 real **count_fep_lambdas;
1427 gmx_bool bOneLambda = TRUE;
1429 snew(count_fep_lambdas, efptNR);
1431 /* FEP input processing */
1432 /* first, identify the number of lambda values for each type.
1433 All that are nonzero must have the same number */
1435 for (i = 0; i < efptNR; i++)
1437 parse_n_real(fep_lambda[i], &(nfep[i]), &(count_fep_lambdas[i]));
1440 /* now, determine the number of components. All must be either zero, or equal. */
1443 for (i = 0; i < efptNR; i++)
1445 if (nfep[i] > max_n_lambda)
1447 max_n_lambda = nfep[i]; /* here's a nonzero one. All of them
1448 must have the same number if its not zero.*/
1453 for (i = 0; i < efptNR; i++)
1457 ir->fepvals->separate_dvdl[i] = FALSE;
1459 else if (nfep[i] == max_n_lambda)
1461 if (i != efptTEMPERATURE) /* we treat this differently -- not really a reason to compute the derivative with
1462 respect to the temperature currently */
1464 ir->fepvals->separate_dvdl[i] = TRUE;
1469 gmx_fatal(FARGS, "Number of lambdas (%d) for FEP type %s not equal to number of other types (%d)",
1470 nfep[i], efpt_names[i], max_n_lambda);
1473 /* we don't print out dhdl if the temperature is changing, since we can't correctly define dhdl in this case */
1474 ir->fepvals->separate_dvdl[efptTEMPERATURE] = FALSE;
1476 /* the number of lambdas is the number we've read in, which is either zero
1477 or the same for all */
1478 fep->n_lambda = max_n_lambda;
1480 /* allocate space for the array of lambda values */
1481 snew(fep->all_lambda, efptNR);
1482 /* if init_lambda is defined, we need to set lambda */
1483 if ((fep->init_lambda > 0) && (fep->n_lambda == 0))
1485 ir->fepvals->separate_dvdl[efptFEP] = TRUE;
1487 /* otherwise allocate the space for all of the lambdas, and transfer the data */
1488 for (i = 0; i < efptNR; i++)
1490 snew(fep->all_lambda[i], fep->n_lambda);
1491 if (nfep[i] > 0) /* if it's zero, then the count_fep_lambda arrays
1494 for (j = 0; j < fep->n_lambda; j++)
1496 fep->all_lambda[i][j] = (double)count_fep_lambdas[i][j];
1498 sfree(count_fep_lambdas[i]);
1501 sfree(count_fep_lambdas);
1503 /* "fep-vals" is either zero or the full number. If zero, we'll need to define fep-lambdas for internal
1504 bookkeeping -- for now, init_lambda */
1506 if ((nfep[efptFEP] == 0) && (fep->init_lambda >= 0))
1508 for (i = 0; i < fep->n_lambda; i++)
1510 fep->all_lambda[efptFEP][i] = fep->init_lambda;
1514 /* check to see if only a single component lambda is defined, and soft core is defined.
1515 In this case, turn on coulomb soft core */
1517 if (max_n_lambda == 0)
1523 for (i = 0; i < efptNR; i++)
1525 if ((nfep[i] != 0) && (i != efptFEP))
1531 if ((bOneLambda) && (fep->sc_alpha > 0))
1533 fep->bScCoul = TRUE;
1536 /* Fill in the others with the efptFEP if they are not explicitly
1537 specified (i.e. nfep[i] == 0). This means if fep is not defined,
1538 they are all zero. */
1540 for (i = 0; i < efptNR; i++)
1542 if ((nfep[i] == 0) && (i != efptFEP))
1544 for (j = 0; j < fep->n_lambda; j++)
1546 fep->all_lambda[i][j] = fep->all_lambda[efptFEP][j];
1552 /* make it easier if sc_r_power = 48 by increasing it to the 4th power, to be in the right scale. */
1553 if (fep->sc_r_power == 48)
1555 if (fep->sc_alpha > 0.1)
1557 gmx_fatal(FARGS, "sc_alpha (%f) for sc_r_power = 48 should usually be between 0.001 and 0.004", fep->sc_alpha);
1561 expand = ir->expandedvals;
1562 /* now read in the weights */
1563 parse_n_real(weights, &nweights, &(expand->init_lambda_weights));
1566 snew(expand->init_lambda_weights, fep->n_lambda); /* initialize to zero */
1568 else if (nweights != fep->n_lambda)
1570 gmx_fatal(FARGS, "Number of weights (%d) is not equal to number of lambda values (%d)",
1571 nweights, fep->n_lambda);
1573 if ((expand->nstexpanded < 0) && (ir->efep != efepNO))
1575 expand->nstexpanded = fep->nstdhdl;
1576 /* if you don't specify nstexpanded when doing expanded ensemble free energy calcs, it is set to nstdhdl */
1578 if ((expand->nstexpanded < 0) && ir->bSimTemp)
1580 expand->nstexpanded = 2*(int)(ir->opts.tau_t[0]/ir->delta_t);
1581 /* if you don't specify nstexpanded when doing expanded ensemble simulated tempering, it is set to
1582 2*tau_t just to be careful so it's not to frequent */
1587 static void do_simtemp_params(t_inputrec *ir)
1590 snew(ir->simtempvals->temperatures, ir->fepvals->n_lambda);
1591 GetSimTemps(ir->fepvals->n_lambda, ir->simtempvals, ir->fepvals->all_lambda[efptTEMPERATURE]);
1596 static void do_wall_params(t_inputrec *ir,
1597 char *wall_atomtype, char *wall_density,
1601 char *names[MAXPTR];
1604 opts->wall_atomtype[0] = NULL;
1605 opts->wall_atomtype[1] = NULL;
1607 ir->wall_atomtype[0] = -1;
1608 ir->wall_atomtype[1] = -1;
1609 ir->wall_density[0] = 0;
1610 ir->wall_density[1] = 0;
1614 nstr = str_nelem(wall_atomtype, MAXPTR, names);
1615 if (nstr != ir->nwall)
1617 gmx_fatal(FARGS, "Expected %d elements for wall_atomtype, found %d",
1620 for (i = 0; i < ir->nwall; i++)
1622 opts->wall_atomtype[i] = strdup(names[i]);
1625 if (ir->wall_type == ewt93 || ir->wall_type == ewt104)
1627 nstr = str_nelem(wall_density, MAXPTR, names);
1628 if (nstr != ir->nwall)
1630 gmx_fatal(FARGS, "Expected %d elements for wall-density, found %d", ir->nwall, nstr);
1632 for (i = 0; i < ir->nwall; i++)
1634 sscanf(names[i], "%lf", &dbl);
1637 gmx_fatal(FARGS, "wall-density[%d] = %f\n", i, dbl);
1639 ir->wall_density[i] = dbl;
1645 static void add_wall_energrps(gmx_groups_t *groups, int nwall, t_symtab *symtab)
1653 srenew(groups->grpname, groups->ngrpname+nwall);
1654 grps = &(groups->grps[egcENER]);
1655 srenew(grps->nm_ind, grps->nr+nwall);
1656 for (i = 0; i < nwall; i++)
1658 sprintf(str, "wall%d", i);
1659 groups->grpname[groups->ngrpname] = put_symtab(symtab, str);
1660 grps->nm_ind[grps->nr++] = groups->ngrpname++;
1665 void read_expandedparams(int *ninp_p, t_inpfile **inp_p,
1666 t_expanded *expand, warninp_t wi)
1668 int ninp, nerror = 0;
1674 /* read expanded ensemble parameters */
1675 CCTYPE ("expanded ensemble variables");
1676 ITYPE ("nstexpanded", expand->nstexpanded, -1);
1677 EETYPE("lmc-stats", expand->elamstats, elamstats_names);
1678 EETYPE("lmc-move", expand->elmcmove, elmcmove_names);
1679 EETYPE("lmc-weights-equil", expand->elmceq, elmceq_names);
1680 ITYPE ("weight-equil-number-all-lambda", expand->equil_n_at_lam, -1);
1681 ITYPE ("weight-equil-number-samples", expand->equil_samples, -1);
1682 ITYPE ("weight-equil-number-steps", expand->equil_steps, -1);
1683 RTYPE ("weight-equil-wl-delta", expand->equil_wl_delta, -1);
1684 RTYPE ("weight-equil-count-ratio", expand->equil_ratio, -1);
1685 CCTYPE("Seed for Monte Carlo in lambda space");
1686 ITYPE ("lmc-seed", expand->lmc_seed, -1);
1687 RTYPE ("mc-temperature", expand->mc_temp, -1);
1688 ITYPE ("lmc-repeats", expand->lmc_repeats, 1);
1689 ITYPE ("lmc-gibbsdelta", expand->gibbsdeltalam, -1);
1690 ITYPE ("lmc-forced-nstart", expand->lmc_forced_nstart, 0);
1691 EETYPE("symmetrized-transition-matrix", expand->bSymmetrizedTMatrix, yesno_names);
1692 ITYPE("nst-transition-matrix", expand->nstTij, -1);
1693 ITYPE ("mininum-var-min", expand->minvarmin, 100); /*default is reasonable */
1694 ITYPE ("weight-c-range", expand->c_range, 0); /* default is just C=0 */
1695 RTYPE ("wl-scale", expand->wl_scale, 0.8);
1696 RTYPE ("wl-ratio", expand->wl_ratio, 0.8);
1697 RTYPE ("init-wl-delta", expand->init_wl_delta, 1.0);
1698 EETYPE("wl-oneovert", expand->bWLoneovert, yesno_names);
1706 void get_ir(const char *mdparin, const char *mdparout,
1707 t_inputrec *ir, t_gromppopts *opts,
1711 double dumdub[2][6];
1715 char warn_buf[STRLEN];
1716 t_lambda *fep = ir->fepvals;
1717 t_expanded *expand = ir->expandedvals;
1719 init_inputrec_strings();
1720 inp = read_inpfile(mdparin, &ninp, wi);
1722 snew(dumstr[0], STRLEN);
1723 snew(dumstr[1], STRLEN);
1725 if (-1 == search_einp(ninp, inp, "cutoff-scheme"))
1728 "%s did not specify a value for the .mdp option "
1729 "\"cutoff-scheme\". Probably it was first intended for use "
1730 "with GROMACS before 4.6. In 4.6, the Verlet scheme was "
1731 "introduced, but the group scheme was still the default. "
1732 "The default is now the Verlet scheme, so you will observe "
1733 "different behaviour.", mdparin);
1734 warning_note(wi, warn_buf);
1737 /* remove the following deprecated commands */
1740 REM_TYPE("domain-decomposition");
1741 REM_TYPE("andersen-seed");
1743 REM_TYPE("dihre-fc");
1744 REM_TYPE("dihre-tau");
1745 REM_TYPE("nstdihreout");
1746 REM_TYPE("nstcheckpoint");
1748 /* replace the following commands with the clearer new versions*/
1749 REPL_TYPE("unconstrained-start", "continuation");
1750 REPL_TYPE("foreign-lambda", "fep-lambdas");
1751 REPL_TYPE("verlet-buffer-drift", "verlet-buffer-tolerance");
1752 REPL_TYPE("nstxtcout", "nstxout-compressed");
1753 REPL_TYPE("xtc-grps", "compressed-x-grps");
1754 REPL_TYPE("xtc-precision", "compressed-x-precision");
1756 CCTYPE ("VARIOUS PREPROCESSING OPTIONS");
1757 CTYPE ("Preprocessor information: use cpp syntax.");
1758 CTYPE ("e.g.: -I/home/joe/doe -I/home/mary/roe");
1759 STYPE ("include", opts->include, NULL);
1760 CTYPE ("e.g.: -DPOSRES -DFLEXIBLE (note these variable names are case sensitive)");
1761 STYPE ("define", opts->define, NULL);
1763 CCTYPE ("RUN CONTROL PARAMETERS");
1764 EETYPE("integrator", ir->eI, ei_names);
1765 CTYPE ("Start time and timestep in ps");
1766 RTYPE ("tinit", ir->init_t, 0.0);
1767 RTYPE ("dt", ir->delta_t, 0.001);
1768 STEPTYPE ("nsteps", ir->nsteps, 0);
1769 CTYPE ("For exact run continuation or redoing part of a run");
1770 STEPTYPE ("init-step", ir->init_step, 0);
1771 CTYPE ("Part index is updated automatically on checkpointing (keeps files separate)");
1772 ITYPE ("simulation-part", ir->simulation_part, 1);
1773 CTYPE ("mode for center of mass motion removal");
1774 EETYPE("comm-mode", ir->comm_mode, ecm_names);
1775 CTYPE ("number of steps for center of mass motion removal");
1776 ITYPE ("nstcomm", ir->nstcomm, 100);
1777 CTYPE ("group(s) for center of mass motion removal");
1778 STYPE ("comm-grps", is->vcm, NULL);
1780 CCTYPE ("LANGEVIN DYNAMICS OPTIONS");
1781 CTYPE ("Friction coefficient (amu/ps) and random seed");
1782 RTYPE ("bd-fric", ir->bd_fric, 0.0);
1783 ITYPE ("ld-seed", ir->ld_seed, 1993);
1786 CCTYPE ("ENERGY MINIMIZATION OPTIONS");
1787 CTYPE ("Force tolerance and initial step-size");
1788 RTYPE ("emtol", ir->em_tol, 10.0);
1789 RTYPE ("emstep", ir->em_stepsize, 0.01);
1790 CTYPE ("Max number of iterations in relax-shells");
1791 ITYPE ("niter", ir->niter, 20);
1792 CTYPE ("Step size (ps^2) for minimization of flexible constraints");
1793 RTYPE ("fcstep", ir->fc_stepsize, 0);
1794 CTYPE ("Frequency of steepest descents steps when doing CG");
1795 ITYPE ("nstcgsteep", ir->nstcgsteep, 1000);
1796 ITYPE ("nbfgscorr", ir->nbfgscorr, 10);
1798 CCTYPE ("TEST PARTICLE INSERTION OPTIONS");
1799 RTYPE ("rtpi", ir->rtpi, 0.05);
1801 /* Output options */
1802 CCTYPE ("OUTPUT CONTROL OPTIONS");
1803 CTYPE ("Output frequency for coords (x), velocities (v) and forces (f)");
1804 ITYPE ("nstxout", ir->nstxout, 0);
1805 ITYPE ("nstvout", ir->nstvout, 0);
1806 ITYPE ("nstfout", ir->nstfout, 0);
1807 ir->nstcheckpoint = 1000;
1808 CTYPE ("Output frequency for energies to log file and energy file");
1809 ITYPE ("nstlog", ir->nstlog, 1000);
1810 ITYPE ("nstcalcenergy", ir->nstcalcenergy, 100);
1811 ITYPE ("nstenergy", ir->nstenergy, 1000);
1812 CTYPE ("Output frequency and precision for .xtc file");
1813 ITYPE ("nstxout-compressed", ir->nstxout_compressed, 0);
1814 RTYPE ("compressed-x-precision", ir->x_compression_precision, 1000.0);
1815 CTYPE ("This selects the subset of atoms for the compressed");
1816 CTYPE ("trajectory file. You can select multiple groups. By");
1817 CTYPE ("default, all atoms will be written.");
1818 STYPE ("compressed-x-grps", is->x_compressed_groups, NULL);
1819 CTYPE ("Selection of energy groups");
1820 STYPE ("energygrps", is->energy, NULL);
1822 /* Neighbor searching */
1823 CCTYPE ("NEIGHBORSEARCHING PARAMETERS");
1824 CTYPE ("cut-off scheme (Verlet: particle based cut-offs, group: using charge groups)");
1825 EETYPE("cutoff-scheme", ir->cutoff_scheme, ecutscheme_names);
1826 CTYPE ("nblist update frequency");
1827 ITYPE ("nstlist", ir->nstlist, 10);
1828 CTYPE ("ns algorithm (simple or grid)");
1829 EETYPE("ns-type", ir->ns_type, ens_names);
1830 /* set ndelta to the optimal value of 2 */
1832 CTYPE ("Periodic boundary conditions: xyz, no, xy");
1833 EETYPE("pbc", ir->ePBC, epbc_names);
1834 EETYPE("periodic-molecules", ir->bPeriodicMols, yesno_names);
1835 CTYPE ("Allowed energy error due to the Verlet buffer in kJ/mol/ps per atom,");
1836 CTYPE ("a value of -1 means: use rlist");
1837 RTYPE("verlet-buffer-tolerance", ir->verletbuf_tol, 0.005);
1838 CTYPE ("nblist cut-off");
1839 RTYPE ("rlist", ir->rlist, 1.0);
1840 CTYPE ("long-range cut-off for switched potentials");
1841 RTYPE ("rlistlong", ir->rlistlong, -1);
1842 ITYPE ("nstcalclr", ir->nstcalclr, -1);
1844 /* Electrostatics */
1845 CCTYPE ("OPTIONS FOR ELECTROSTATICS AND VDW");
1846 CTYPE ("Method for doing electrostatics");
1847 EETYPE("coulombtype", ir->coulombtype, eel_names);
1848 EETYPE("coulomb-modifier", ir->coulomb_modifier, eintmod_names);
1849 CTYPE ("cut-off lengths");
1850 RTYPE ("rcoulomb-switch", ir->rcoulomb_switch, 0.0);
1851 RTYPE ("rcoulomb", ir->rcoulomb, 1.0);
1852 CTYPE ("Relative dielectric constant for the medium and the reaction field");
1853 RTYPE ("epsilon-r", ir->epsilon_r, 1.0);
1854 RTYPE ("epsilon-rf", ir->epsilon_rf, 0.0);
1855 CTYPE ("Method for doing Van der Waals");
1856 EETYPE("vdw-type", ir->vdwtype, evdw_names);
1857 EETYPE("vdw-modifier", ir->vdw_modifier, eintmod_names);
1858 CTYPE ("cut-off lengths");
1859 RTYPE ("rvdw-switch", ir->rvdw_switch, 0.0);
1860 RTYPE ("rvdw", ir->rvdw, 1.0);
1861 CTYPE ("Apply long range dispersion corrections for Energy and Pressure");
1862 EETYPE("DispCorr", ir->eDispCorr, edispc_names);
1863 CTYPE ("Extension of the potential lookup tables beyond the cut-off");
1864 RTYPE ("table-extension", ir->tabext, 1.0);
1865 CTYPE ("Separate tables between energy group pairs");
1866 STYPE ("energygrp-table", is->egptable, NULL);
1867 CTYPE ("Spacing for the PME/PPPM FFT grid");
1868 RTYPE ("fourierspacing", ir->fourier_spacing, 0.12);
1869 CTYPE ("FFT grid size, when a value is 0 fourierspacing will be used");
1870 ITYPE ("fourier-nx", ir->nkx, 0);
1871 ITYPE ("fourier-ny", ir->nky, 0);
1872 ITYPE ("fourier-nz", ir->nkz, 0);
1873 CTYPE ("EWALD/PME/PPPM parameters");
1874 ITYPE ("pme-order", ir->pme_order, 4);
1875 RTYPE ("ewald-rtol", ir->ewald_rtol, 0.00001);
1876 RTYPE ("ewald-rtol-lj", ir->ewald_rtol_lj, 0.001);
1877 EETYPE("lj-pme-comb-rule", ir->ljpme_combination_rule, eljpme_names);
1878 EETYPE("ewald-geometry", ir->ewald_geometry, eewg_names);
1879 RTYPE ("epsilon-surface", ir->epsilon_surface, 0.0);
1880 EETYPE("optimize-fft", ir->bOptFFT, yesno_names);
1882 CCTYPE("IMPLICIT SOLVENT ALGORITHM");
1883 EETYPE("implicit-solvent", ir->implicit_solvent, eis_names);
1885 CCTYPE ("GENERALIZED BORN ELECTROSTATICS");
1886 CTYPE ("Algorithm for calculating Born radii");
1887 EETYPE("gb-algorithm", ir->gb_algorithm, egb_names);
1888 CTYPE ("Frequency of calculating the Born radii inside rlist");
1889 ITYPE ("nstgbradii", ir->nstgbradii, 1);
1890 CTYPE ("Cutoff for Born radii calculation; the contribution from atoms");
1891 CTYPE ("between rlist and rgbradii is updated every nstlist steps");
1892 RTYPE ("rgbradii", ir->rgbradii, 1.0);
1893 CTYPE ("Dielectric coefficient of the implicit solvent");
1894 RTYPE ("gb-epsilon-solvent", ir->gb_epsilon_solvent, 80.0);
1895 CTYPE ("Salt concentration in M for Generalized Born models");
1896 RTYPE ("gb-saltconc", ir->gb_saltconc, 0.0);
1897 CTYPE ("Scaling factors used in the OBC GB model. Default values are OBC(II)");
1898 RTYPE ("gb-obc-alpha", ir->gb_obc_alpha, 1.0);
1899 RTYPE ("gb-obc-beta", ir->gb_obc_beta, 0.8);
1900 RTYPE ("gb-obc-gamma", ir->gb_obc_gamma, 4.85);
1901 RTYPE ("gb-dielectric-offset", ir->gb_dielectric_offset, 0.009);
1902 EETYPE("sa-algorithm", ir->sa_algorithm, esa_names);
1903 CTYPE ("Surface tension (kJ/mol/nm^2) for the SA (nonpolar surface) part of GBSA");
1904 CTYPE ("The value -1 will set default value for Still/HCT/OBC GB-models.");
1905 RTYPE ("sa-surface-tension", ir->sa_surface_tension, -1);
1907 /* Coupling stuff */
1908 CCTYPE ("OPTIONS FOR WEAK COUPLING ALGORITHMS");
1909 CTYPE ("Temperature coupling");
1910 EETYPE("tcoupl", ir->etc, etcoupl_names);
1911 ITYPE ("nsttcouple", ir->nsttcouple, -1);
1912 ITYPE("nh-chain-length", ir->opts.nhchainlength, 10);
1913 EETYPE("print-nose-hoover-chain-variables", ir->bPrintNHChains, yesno_names);
1914 CTYPE ("Groups to couple separately");
1915 STYPE ("tc-grps", is->tcgrps, NULL);
1916 CTYPE ("Time constant (ps) and reference temperature (K)");
1917 STYPE ("tau-t", is->tau_t, NULL);
1918 STYPE ("ref-t", is->ref_t, NULL);
1919 CTYPE ("pressure coupling");
1920 EETYPE("pcoupl", ir->epc, epcoupl_names);
1921 EETYPE("pcoupltype", ir->epct, epcoupltype_names);
1922 ITYPE ("nstpcouple", ir->nstpcouple, -1);
1923 CTYPE ("Time constant (ps), compressibility (1/bar) and reference P (bar)");
1924 RTYPE ("tau-p", ir->tau_p, 1.0);
1925 STYPE ("compressibility", dumstr[0], NULL);
1926 STYPE ("ref-p", dumstr[1], NULL);
1927 CTYPE ("Scaling of reference coordinates, No, All or COM");
1928 EETYPE ("refcoord-scaling", ir->refcoord_scaling, erefscaling_names);
1931 CCTYPE ("OPTIONS FOR QMMM calculations");
1932 EETYPE("QMMM", ir->bQMMM, yesno_names);
1933 CTYPE ("Groups treated Quantum Mechanically");
1934 STYPE ("QMMM-grps", is->QMMM, NULL);
1935 CTYPE ("QM method");
1936 STYPE("QMmethod", is->QMmethod, NULL);
1937 CTYPE ("QMMM scheme");
1938 EETYPE("QMMMscheme", ir->QMMMscheme, eQMMMscheme_names);
1939 CTYPE ("QM basisset");
1940 STYPE("QMbasis", is->QMbasis, NULL);
1941 CTYPE ("QM charge");
1942 STYPE ("QMcharge", is->QMcharge, NULL);
1943 CTYPE ("QM multiplicity");
1944 STYPE ("QMmult", is->QMmult, NULL);
1945 CTYPE ("Surface Hopping");
1946 STYPE ("SH", is->bSH, NULL);
1947 CTYPE ("CAS space options");
1948 STYPE ("CASorbitals", is->CASorbitals, NULL);
1949 STYPE ("CASelectrons", is->CASelectrons, NULL);
1950 STYPE ("SAon", is->SAon, NULL);
1951 STYPE ("SAoff", is->SAoff, NULL);
1952 STYPE ("SAsteps", is->SAsteps, NULL);
1953 CTYPE ("Scale factor for MM charges");
1954 RTYPE ("MMChargeScaleFactor", ir->scalefactor, 1.0);
1955 CTYPE ("Optimization of QM subsystem");
1956 STYPE ("bOPT", is->bOPT, NULL);
1957 STYPE ("bTS", is->bTS, NULL);
1959 /* Simulated annealing */
1960 CCTYPE("SIMULATED ANNEALING");
1961 CTYPE ("Type of annealing for each temperature group (no/single/periodic)");
1962 STYPE ("annealing", is->anneal, NULL);
1963 CTYPE ("Number of time points to use for specifying annealing in each group");
1964 STYPE ("annealing-npoints", is->anneal_npoints, NULL);
1965 CTYPE ("List of times at the annealing points for each group");
1966 STYPE ("annealing-time", is->anneal_time, NULL);
1967 CTYPE ("Temp. at each annealing point, for each group.");
1968 STYPE ("annealing-temp", is->anneal_temp, NULL);
1971 CCTYPE ("GENERATE VELOCITIES FOR STARTUP RUN");
1972 EETYPE("gen-vel", opts->bGenVel, yesno_names);
1973 RTYPE ("gen-temp", opts->tempi, 300.0);
1974 ITYPE ("gen-seed", opts->seed, 173529);
1977 CCTYPE ("OPTIONS FOR BONDS");
1978 EETYPE("constraints", opts->nshake, constraints);
1979 CTYPE ("Type of constraint algorithm");
1980 EETYPE("constraint-algorithm", ir->eConstrAlg, econstr_names);
1981 CTYPE ("Do not constrain the start configuration");
1982 EETYPE("continuation", ir->bContinuation, yesno_names);
1983 CTYPE ("Use successive overrelaxation to reduce the number of shake iterations");
1984 EETYPE("Shake-SOR", ir->bShakeSOR, yesno_names);
1985 CTYPE ("Relative tolerance of shake");
1986 RTYPE ("shake-tol", ir->shake_tol, 0.0001);
1987 CTYPE ("Highest order in the expansion of the constraint coupling matrix");
1988 ITYPE ("lincs-order", ir->nProjOrder, 4);
1989 CTYPE ("Number of iterations in the final step of LINCS. 1 is fine for");
1990 CTYPE ("normal simulations, but use 2 to conserve energy in NVE runs.");
1991 CTYPE ("For energy minimization with constraints it should be 4 to 8.");
1992 ITYPE ("lincs-iter", ir->nLincsIter, 1);
1993 CTYPE ("Lincs will write a warning to the stderr if in one step a bond");
1994 CTYPE ("rotates over more degrees than");
1995 RTYPE ("lincs-warnangle", ir->LincsWarnAngle, 30.0);
1996 CTYPE ("Convert harmonic bonds to morse potentials");
1997 EETYPE("morse", opts->bMorse, yesno_names);
1999 /* Energy group exclusions */
2000 CCTYPE ("ENERGY GROUP EXCLUSIONS");
2001 CTYPE ("Pairs of energy groups for which all non-bonded interactions are excluded");
2002 STYPE ("energygrp-excl", is->egpexcl, NULL);
2006 CTYPE ("Number of walls, type, atom types, densities and box-z scale factor for Ewald");
2007 ITYPE ("nwall", ir->nwall, 0);
2008 EETYPE("wall-type", ir->wall_type, ewt_names);
2009 RTYPE ("wall-r-linpot", ir->wall_r_linpot, -1);
2010 STYPE ("wall-atomtype", is->wall_atomtype, NULL);
2011 STYPE ("wall-density", is->wall_density, NULL);
2012 RTYPE ("wall-ewald-zfac", ir->wall_ewald_zfac, 3);
2015 CCTYPE("COM PULLING");
2016 CTYPE("Pull type: no, umbrella, constraint or constant-force");
2017 EETYPE("pull", ir->ePull, epull_names);
2018 if (ir->ePull != epullNO)
2021 is->pull_grp = read_pullparams(&ninp, &inp, ir->pull, &opts->pull_start, wi);
2024 /* Enforced rotation */
2025 CCTYPE("ENFORCED ROTATION");
2026 CTYPE("Enforced rotation: No or Yes");
2027 EETYPE("rotation", ir->bRot, yesno_names);
2031 is->rot_grp = read_rotparams(&ninp, &inp, ir->rot, wi);
2035 CCTYPE("NMR refinement stuff");
2036 CTYPE ("Distance restraints type: No, Simple or Ensemble");
2037 EETYPE("disre", ir->eDisre, edisre_names);
2038 CTYPE ("Force weighting of pairs in one distance restraint: Conservative or Equal");
2039 EETYPE("disre-weighting", ir->eDisreWeighting, edisreweighting_names);
2040 CTYPE ("Use sqrt of the time averaged times the instantaneous violation");
2041 EETYPE("disre-mixed", ir->bDisreMixed, yesno_names);
2042 RTYPE ("disre-fc", ir->dr_fc, 1000.0);
2043 RTYPE ("disre-tau", ir->dr_tau, 0.0);
2044 CTYPE ("Output frequency for pair distances to energy file");
2045 ITYPE ("nstdisreout", ir->nstdisreout, 100);
2046 CTYPE ("Orientation restraints: No or Yes");
2047 EETYPE("orire", opts->bOrire, yesno_names);
2048 CTYPE ("Orientation restraints force constant and tau for time averaging");
2049 RTYPE ("orire-fc", ir->orires_fc, 0.0);
2050 RTYPE ("orire-tau", ir->orires_tau, 0.0);
2051 STYPE ("orire-fitgrp", is->orirefitgrp, NULL);
2052 CTYPE ("Output frequency for trace(SD) and S to energy file");
2053 ITYPE ("nstorireout", ir->nstorireout, 100);
2055 /* free energy variables */
2056 CCTYPE ("Free energy variables");
2057 EETYPE("free-energy", ir->efep, efep_names);
2058 STYPE ("couple-moltype", is->couple_moltype, NULL);
2059 EETYPE("couple-lambda0", opts->couple_lam0, couple_lam);
2060 EETYPE("couple-lambda1", opts->couple_lam1, couple_lam);
2061 EETYPE("couple-intramol", opts->bCoupleIntra, yesno_names);
2063 RTYPE ("init-lambda", fep->init_lambda, -1); /* start with -1 so
2065 it was not entered */
2066 ITYPE ("init-lambda-state", fep->init_fep_state, -1);
2067 RTYPE ("delta-lambda", fep->delta_lambda, 0.0);
2068 ITYPE ("nstdhdl", fep->nstdhdl, 50);
2069 STYPE ("fep-lambdas", is->fep_lambda[efptFEP], NULL);
2070 STYPE ("mass-lambdas", is->fep_lambda[efptMASS], NULL);
2071 STYPE ("coul-lambdas", is->fep_lambda[efptCOUL], NULL);
2072 STYPE ("vdw-lambdas", is->fep_lambda[efptVDW], NULL);
2073 STYPE ("bonded-lambdas", is->fep_lambda[efptBONDED], NULL);
2074 STYPE ("restraint-lambdas", is->fep_lambda[efptRESTRAINT], NULL);
2075 STYPE ("temperature-lambdas", is->fep_lambda[efptTEMPERATURE], NULL);
2076 ITYPE ("calc-lambda-neighbors", fep->lambda_neighbors, 1);
2077 STYPE ("init-lambda-weights", is->lambda_weights, NULL);
2078 EETYPE("dhdl-print-energy", fep->bPrintEnergy, yesno_names);
2079 RTYPE ("sc-alpha", fep->sc_alpha, 0.0);
2080 ITYPE ("sc-power", fep->sc_power, 1);
2081 RTYPE ("sc-r-power", fep->sc_r_power, 6.0);
2082 RTYPE ("sc-sigma", fep->sc_sigma, 0.3);
2083 EETYPE("sc-coul", fep->bScCoul, yesno_names);
2084 ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2085 RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2086 EETYPE("separate-dhdl-file", fep->separate_dhdl_file,
2087 separate_dhdl_file_names);
2088 EETYPE("dhdl-derivatives", fep->dhdl_derivatives, dhdl_derivatives_names);
2089 ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2090 RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2092 /* Non-equilibrium MD stuff */
2093 CCTYPE("Non-equilibrium MD stuff");
2094 STYPE ("acc-grps", is->accgrps, NULL);
2095 STYPE ("accelerate", is->acc, NULL);
2096 STYPE ("freezegrps", is->freeze, NULL);
2097 STYPE ("freezedim", is->frdim, NULL);
2098 RTYPE ("cos-acceleration", ir->cos_accel, 0);
2099 STYPE ("deform", is->deform, NULL);
2101 /* simulated tempering variables */
2102 CCTYPE("simulated tempering variables");
2103 EETYPE("simulated-tempering", ir->bSimTemp, yesno_names);
2104 EETYPE("simulated-tempering-scaling", ir->simtempvals->eSimTempScale, esimtemp_names);
2105 RTYPE("sim-temp-low", ir->simtempvals->simtemp_low, 300.0);
2106 RTYPE("sim-temp-high", ir->simtempvals->simtemp_high, 300.0);
2108 /* expanded ensemble variables */
2109 if (ir->efep == efepEXPANDED || ir->bSimTemp)
2111 read_expandedparams(&ninp, &inp, expand, wi);
2114 /* Electric fields */
2115 CCTYPE("Electric fields");
2116 CTYPE ("Format is number of terms (int) and for all terms an amplitude (real)");
2117 CTYPE ("and a phase angle (real)");
2118 STYPE ("E-x", is->efield_x, NULL);
2119 STYPE ("E-xt", is->efield_xt, NULL);
2120 STYPE ("E-y", is->efield_y, NULL);
2121 STYPE ("E-yt", is->efield_yt, NULL);
2122 STYPE ("E-z", is->efield_z, NULL);
2123 STYPE ("E-zt", is->efield_zt, NULL);
2125 CCTYPE("Ion/water position swapping for computational electrophysiology setups");
2126 CTYPE("Swap positions along direction: no, X, Y, Z");
2127 EETYPE("swapcoords", ir->eSwapCoords, eSwapTypes_names);
2128 if (ir->eSwapCoords != eswapNO)
2131 CTYPE("Swap attempt frequency");
2132 ITYPE("swap-frequency", ir->swap->nstswap, 1);
2133 CTYPE("Two index groups that contain the compartment-partitioning atoms");
2134 STYPE("split-group0", splitgrp0, NULL);
2135 STYPE("split-group1", splitgrp1, NULL);
2136 CTYPE("Use center of mass of split groups (yes/no), otherwise center of geometry is used");
2137 EETYPE("massw-split0", ir->swap->massw_split[0], yesno_names);
2138 EETYPE("massw-split1", ir->swap->massw_split[1], yesno_names);
2140 CTYPE("Group name of ions that can be exchanged with solvent molecules");
2141 STYPE("swap-group", swapgrp, NULL);
2142 CTYPE("Group name of solvent molecules");
2143 STYPE("solvent-group", solgrp, NULL);
2145 CTYPE("Split cylinder: radius, upper and lower extension (nm) (this will define the channels)");
2146 CTYPE("Note that the split cylinder settings do not have an influence on the swapping protocol,");
2147 CTYPE("however, if correctly defined, the ion permeation events are counted per channel");
2148 RTYPE("cyl0-r", ir->swap->cyl0r, 2.0);
2149 RTYPE("cyl0-up", ir->swap->cyl0u, 1.0);
2150 RTYPE("cyl0-down", ir->swap->cyl0l, 1.0);
2151 RTYPE("cyl1-r", ir->swap->cyl1r, 2.0);
2152 RTYPE("cyl1-up", ir->swap->cyl1u, 1.0);
2153 RTYPE("cyl1-down", ir->swap->cyl1l, 1.0);
2155 CTYPE("Average the number of ions per compartment over these many swap attempt steps");
2156 ITYPE("coupl-steps", ir->swap->nAverage, 10);
2157 CTYPE("Requested number of anions and cations for each of the two compartments");
2158 CTYPE("-1 means fix the numbers as found in time step 0");
2159 ITYPE("anionsA", ir->swap->nanions[0], -1);
2160 ITYPE("cationsA", ir->swap->ncations[0], -1);
2161 ITYPE("anionsB", ir->swap->nanions[1], -1);
2162 ITYPE("cationsB", ir->swap->ncations[1], -1);
2163 CTYPE("Start to swap ions if threshold difference to requested count is reached");
2164 RTYPE("threshold", ir->swap->threshold, 1.0);
2167 /* AdResS defined thingies */
2168 CCTYPE ("AdResS parameters");
2169 EETYPE("adress", ir->bAdress, yesno_names);
2172 snew(ir->adress, 1);
2173 read_adressparams(&ninp, &inp, ir->adress, wi);
2176 /* User defined thingies */
2177 CCTYPE ("User defined thingies");
2178 STYPE ("user1-grps", is->user1, NULL);
2179 STYPE ("user2-grps", is->user2, NULL);
2180 ITYPE ("userint1", ir->userint1, 0);
2181 ITYPE ("userint2", ir->userint2, 0);
2182 ITYPE ("userint3", ir->userint3, 0);
2183 ITYPE ("userint4", ir->userint4, 0);
2184 RTYPE ("userreal1", ir->userreal1, 0);
2185 RTYPE ("userreal2", ir->userreal2, 0);
2186 RTYPE ("userreal3", ir->userreal3, 0);
2187 RTYPE ("userreal4", ir->userreal4, 0);
2190 write_inpfile(mdparout, ninp, inp, FALSE, wi);
2191 for (i = 0; (i < ninp); i++)
2194 sfree(inp[i].value);
2198 /* Process options if necessary */
2199 for (m = 0; m < 2; m++)
2201 for (i = 0; i < 2*DIM; i++)
2210 if (sscanf(dumstr[m], "%lf", &(dumdub[m][XX])) != 1)
2212 warning_error(wi, "Pressure coupling not enough values (I need 1)");
2214 dumdub[m][YY] = dumdub[m][ZZ] = dumdub[m][XX];
2216 case epctSEMIISOTROPIC:
2217 case epctSURFACETENSION:
2218 if (sscanf(dumstr[m], "%lf%lf",
2219 &(dumdub[m][XX]), &(dumdub[m][ZZ])) != 2)
2221 warning_error(wi, "Pressure coupling not enough values (I need 2)");
2223 dumdub[m][YY] = dumdub[m][XX];
2225 case epctANISOTROPIC:
2226 if (sscanf(dumstr[m], "%lf%lf%lf%lf%lf%lf",
2227 &(dumdub[m][XX]), &(dumdub[m][YY]), &(dumdub[m][ZZ]),
2228 &(dumdub[m][3]), &(dumdub[m][4]), &(dumdub[m][5])) != 6)
2230 warning_error(wi, "Pressure coupling not enough values (I need 6)");
2234 gmx_fatal(FARGS, "Pressure coupling type %s not implemented yet",
2235 epcoupltype_names[ir->epct]);
2239 clear_mat(ir->ref_p);
2240 clear_mat(ir->compress);
2241 for (i = 0; i < DIM; i++)
2243 ir->ref_p[i][i] = dumdub[1][i];
2244 ir->compress[i][i] = dumdub[0][i];
2246 if (ir->epct == epctANISOTROPIC)
2248 ir->ref_p[XX][YY] = dumdub[1][3];
2249 ir->ref_p[XX][ZZ] = dumdub[1][4];
2250 ir->ref_p[YY][ZZ] = dumdub[1][5];
2251 if (ir->ref_p[XX][YY] != 0 && ir->ref_p[XX][ZZ] != 0 && ir->ref_p[YY][ZZ] != 0)
2253 warning(wi, "All off-diagonal reference pressures are non-zero. Are you sure you want to apply a threefold shear stress?\n");
2255 ir->compress[XX][YY] = dumdub[0][3];
2256 ir->compress[XX][ZZ] = dumdub[0][4];
2257 ir->compress[YY][ZZ] = dumdub[0][5];
2258 for (i = 0; i < DIM; i++)
2260 for (m = 0; m < i; m++)
2262 ir->ref_p[i][m] = ir->ref_p[m][i];
2263 ir->compress[i][m] = ir->compress[m][i];
2268 if (ir->comm_mode == ecmNO)
2273 opts->couple_moltype = NULL;
2274 if (strlen(is->couple_moltype) > 0)
2276 if (ir->efep != efepNO)
2278 opts->couple_moltype = strdup(is->couple_moltype);
2279 if (opts->couple_lam0 == opts->couple_lam1)
2281 warning(wi, "The lambda=0 and lambda=1 states for coupling are identical");
2283 if (ir->eI == eiMD && (opts->couple_lam0 == ecouplamNONE ||
2284 opts->couple_lam1 == ecouplamNONE))
2286 warning(wi, "For proper sampling of the (nearly) decoupled state, stochastic dynamics should be used");
2291 warning(wi, "Can not couple a molecule with free_energy = no");
2294 /* FREE ENERGY AND EXPANDED ENSEMBLE OPTIONS */
2295 if (ir->efep != efepNO)
2297 if (fep->delta_lambda > 0)
2299 ir->efep = efepSLOWGROWTH;
2305 fep->bPrintEnergy = TRUE;
2306 /* always print out the energy to dhdl if we are doing expanded ensemble, since we need the total energy
2307 if the temperature is changing. */
2310 if ((ir->efep != efepNO) || ir->bSimTemp)
2312 ir->bExpanded = FALSE;
2313 if ((ir->efep == efepEXPANDED) || ir->bSimTemp)
2315 ir->bExpanded = TRUE;
2317 do_fep_params(ir, is->fep_lambda, is->lambda_weights);
2318 if (ir->bSimTemp) /* done after fep params */
2320 do_simtemp_params(ir);
2325 ir->fepvals->n_lambda = 0;
2328 /* WALL PARAMETERS */
2330 do_wall_params(ir, is->wall_atomtype, is->wall_density, opts);
2332 /* ORIENTATION RESTRAINT PARAMETERS */
2334 if (opts->bOrire && str_nelem(is->orirefitgrp, MAXPTR, NULL) != 1)
2336 warning_error(wi, "ERROR: Need one orientation restraint fit group\n");
2339 /* DEFORMATION PARAMETERS */
2341 clear_mat(ir->deform);
2342 for (i = 0; i < 6; i++)
2346 m = sscanf(is->deform, "%lf %lf %lf %lf %lf %lf",
2347 &(dumdub[0][0]), &(dumdub[0][1]), &(dumdub[0][2]),
2348 &(dumdub[0][3]), &(dumdub[0][4]), &(dumdub[0][5]));
2349 for (i = 0; i < 3; i++)
2351 ir->deform[i][i] = dumdub[0][i];
2353 ir->deform[YY][XX] = dumdub[0][3];
2354 ir->deform[ZZ][XX] = dumdub[0][4];
2355 ir->deform[ZZ][YY] = dumdub[0][5];
2356 if (ir->epc != epcNO)
2358 for (i = 0; i < 3; i++)
2360 for (j = 0; j <= i; j++)
2362 if (ir->deform[i][j] != 0 && ir->compress[i][j] != 0)
2364 warning_error(wi, "A box element has deform set and compressibility > 0");
2368 for (i = 0; i < 3; i++)
2370 for (j = 0; j < i; j++)
2372 if (ir->deform[i][j] != 0)
2374 for (m = j; m < DIM; m++)
2376 if (ir->compress[m][j] != 0)
2378 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.");
2379 warning(wi, warn_buf);
2387 /* Ion/water position swapping checks */
2388 if (ir->eSwapCoords != eswapNO)
2390 if (ir->swap->nstswap < 1)
2392 warning_error(wi, "swap_frequency must be 1 or larger when ion swapping is requested");
2394 if (ir->swap->nAverage < 1)
2396 warning_error(wi, "coupl_steps must be 1 or larger.\n");
2398 if (ir->swap->threshold < 1.0)
2400 warning_error(wi, "Ion count threshold must be at least 1.\n");
2408 static int search_QMstring(const char *s, int ng, const char *gn[])
2410 /* same as normal search_string, but this one searches QM strings */
2413 for (i = 0; (i < ng); i++)
2415 if (gmx_strcasecmp(s, gn[i]) == 0)
2421 gmx_fatal(FARGS, "this QM method or basisset (%s) is not implemented\n!", s);
2425 } /* search_QMstring */
2427 /* We would like gn to be const as well, but C doesn't allow this */
2428 int search_string(const char *s, int ng, char *gn[])
2432 for (i = 0; (i < ng); i++)
2434 if (gmx_strcasecmp(s, gn[i]) == 0)
2441 "Group %s referenced in the .mdp file was not found in the index file.\n"
2442 "Group names must match either [moleculetype] names or custom index group\n"
2443 "names, in which case you must supply an index file to the '-n' option\n"
2450 static gmx_bool do_numbering(int natoms, gmx_groups_t *groups, int ng, char *ptrs[],
2451 t_blocka *block, char *gnames[],
2452 int gtype, int restnm,
2453 int grptp, gmx_bool bVerbose,
2456 unsigned short *cbuf;
2457 t_grps *grps = &(groups->grps[gtype]);
2458 int i, j, gid, aj, ognr, ntot = 0;
2461 char warn_buf[STRLEN];
2465 fprintf(debug, "Starting numbering %d groups of type %d\n", ng, gtype);
2468 title = gtypes[gtype];
2471 /* Mark all id's as not set */
2472 for (i = 0; (i < natoms); i++)
2477 snew(grps->nm_ind, ng+1); /* +1 for possible rest group */
2478 for (i = 0; (i < ng); i++)
2480 /* Lookup the group name in the block structure */
2481 gid = search_string(ptrs[i], block->nr, gnames);
2482 if ((grptp != egrptpONE) || (i == 0))
2484 grps->nm_ind[grps->nr++] = gid;
2488 fprintf(debug, "Found gid %d for group %s\n", gid, ptrs[i]);
2491 /* Now go over the atoms in the group */
2492 for (j = block->index[gid]; (j < block->index[gid+1]); j++)
2497 /* Range checking */
2498 if ((aj < 0) || (aj >= natoms))
2500 gmx_fatal(FARGS, "Invalid atom number %d in indexfile", aj);
2502 /* Lookup up the old group number */
2506 gmx_fatal(FARGS, "Atom %d in multiple %s groups (%d and %d)",
2507 aj+1, title, ognr+1, i+1);
2511 /* Store the group number in buffer */
2512 if (grptp == egrptpONE)
2525 /* Now check whether we have done all atoms */
2529 if (grptp == egrptpALL)
2531 gmx_fatal(FARGS, "%d atoms are not part of any of the %s groups",
2532 natoms-ntot, title);
2534 else if (grptp == egrptpPART)
2536 sprintf(warn_buf, "%d atoms are not part of any of the %s groups",
2537 natoms-ntot, title);
2538 warning_note(wi, warn_buf);
2540 /* Assign all atoms currently unassigned to a rest group */
2541 for (j = 0; (j < natoms); j++)
2543 if (cbuf[j] == NOGID)
2549 if (grptp != egrptpPART)
2554 "Making dummy/rest group for %s containing %d elements\n",
2555 title, natoms-ntot);
2557 /* Add group name "rest" */
2558 grps->nm_ind[grps->nr] = restnm;
2560 /* Assign the rest name to all atoms not currently assigned to a group */
2561 for (j = 0; (j < natoms); j++)
2563 if (cbuf[j] == NOGID)
2572 if (grps->nr == 1 && (ntot == 0 || ntot == natoms))
2574 /* All atoms are part of one (or no) group, no index required */
2575 groups->ngrpnr[gtype] = 0;
2576 groups->grpnr[gtype] = NULL;
2580 groups->ngrpnr[gtype] = natoms;
2581 snew(groups->grpnr[gtype], natoms);
2582 for (j = 0; (j < natoms); j++)
2584 groups->grpnr[gtype][j] = cbuf[j];
2590 return (bRest && grptp == egrptpPART);
2593 static void calc_nrdf(gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
2596 gmx_groups_t *groups;
2598 int natoms, ai, aj, i, j, d, g, imin, jmin;
2600 int *nrdf2, *na_vcm, na_tot;
2601 double *nrdf_tc, *nrdf_vcm, nrdf_uc, n_sub = 0;
2602 gmx_mtop_atomloop_all_t aloop;
2604 int mb, mol, ftype, as;
2605 gmx_molblock_t *molb;
2606 gmx_moltype_t *molt;
2609 * First calc 3xnr-atoms for each group
2610 * then subtract half a degree of freedom for each constraint
2612 * Only atoms and nuclei contribute to the degrees of freedom...
2617 groups = &mtop->groups;
2618 natoms = mtop->natoms;
2620 /* Allocate one more for a possible rest group */
2621 /* We need to sum degrees of freedom into doubles,
2622 * since floats give too low nrdf's above 3 million atoms.
2624 snew(nrdf_tc, groups->grps[egcTC].nr+1);
2625 snew(nrdf_vcm, groups->grps[egcVCM].nr+1);
2626 snew(na_vcm, groups->grps[egcVCM].nr+1);
2628 for (i = 0; i < groups->grps[egcTC].nr; i++)
2632 for (i = 0; i < groups->grps[egcVCM].nr+1; i++)
2637 snew(nrdf2, natoms);
2638 aloop = gmx_mtop_atomloop_all_init(mtop);
2639 while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
2642 if (atom->ptype == eptAtom || atom->ptype == eptNucleus)
2644 g = ggrpnr(groups, egcFREEZE, i);
2645 /* Double count nrdf for particle i */
2646 for (d = 0; d < DIM; d++)
2648 if (opts->nFreeze[g][d] == 0)
2653 nrdf_tc [ggrpnr(groups, egcTC, i)] += 0.5*nrdf2[i];
2654 nrdf_vcm[ggrpnr(groups, egcVCM, i)] += 0.5*nrdf2[i];
2659 for (mb = 0; mb < mtop->nmolblock; mb++)
2661 molb = &mtop->molblock[mb];
2662 molt = &mtop->moltype[molb->type];
2663 atom = molt->atoms.atom;
2664 for (mol = 0; mol < molb->nmol; mol++)
2666 for (ftype = F_CONSTR; ftype <= F_CONSTRNC; ftype++)
2668 ia = molt->ilist[ftype].iatoms;
2669 for (i = 0; i < molt->ilist[ftype].nr; )
2671 /* Subtract degrees of freedom for the constraints,
2672 * if the particles still have degrees of freedom left.
2673 * If one of the particles is a vsite or a shell, then all
2674 * constraint motion will go there, but since they do not
2675 * contribute to the constraints the degrees of freedom do not
2680 if (((atom[ia[1]].ptype == eptNucleus) ||
2681 (atom[ia[1]].ptype == eptAtom)) &&
2682 ((atom[ia[2]].ptype == eptNucleus) ||
2683 (atom[ia[2]].ptype == eptAtom)))
2701 imin = min(imin, nrdf2[ai]);
2702 jmin = min(jmin, nrdf2[aj]);
2705 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
2706 nrdf_tc [ggrpnr(groups, egcTC, aj)] -= 0.5*jmin;
2707 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2708 nrdf_vcm[ggrpnr(groups, egcVCM, aj)] -= 0.5*jmin;
2710 ia += interaction_function[ftype].nratoms+1;
2711 i += interaction_function[ftype].nratoms+1;
2714 ia = molt->ilist[F_SETTLE].iatoms;
2715 for (i = 0; i < molt->ilist[F_SETTLE].nr; )
2717 /* Subtract 1 dof from every atom in the SETTLE */
2718 for (j = 0; j < 3; j++)
2721 imin = min(2, nrdf2[ai]);
2723 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
2724 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2729 as += molt->atoms.nr;
2733 if (ir->ePull == epullCONSTRAINT)
2735 /* Correct nrdf for the COM constraints.
2736 * We correct using the TC and VCM group of the first atom
2737 * in the reference and pull group. If atoms in one pull group
2738 * belong to different TC or VCM groups it is anyhow difficult
2739 * to determine the optimal nrdf assignment.
2743 for (i = 0; i < pull->ncoord; i++)
2747 for (j = 0; j < 2; j++)
2749 const t_pull_group *pgrp;
2751 pgrp = &pull->group[pull->coord[i].group[j]];
2755 /* Subtract 1/2 dof from each group */
2757 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
2758 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2759 if (nrdf_tc[ggrpnr(groups, egcTC, ai)] < 0)
2761 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)]]);
2766 /* We need to subtract the whole DOF from group j=1 */
2773 if (ir->nstcomm != 0)
2775 /* Subtract 3 from the number of degrees of freedom in each vcm group
2776 * when com translation is removed and 6 when rotation is removed
2779 switch (ir->comm_mode)
2782 n_sub = ndof_com(ir);
2789 gmx_incons("Checking comm_mode");
2792 for (i = 0; i < groups->grps[egcTC].nr; i++)
2794 /* Count the number of atoms of TC group i for every VCM group */
2795 for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
2800 for (ai = 0; ai < natoms; ai++)
2802 if (ggrpnr(groups, egcTC, ai) == i)
2804 na_vcm[ggrpnr(groups, egcVCM, ai)]++;
2808 /* Correct for VCM removal according to the fraction of each VCM
2809 * group present in this TC group.
2811 nrdf_uc = nrdf_tc[i];
2814 fprintf(debug, "T-group[%d] nrdf_uc = %g, n_sub = %g\n",
2818 for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
2820 if (nrdf_vcm[j] > n_sub)
2822 nrdf_tc[i] += nrdf_uc*((double)na_vcm[j]/(double)na_tot)*
2823 (nrdf_vcm[j] - n_sub)/nrdf_vcm[j];
2827 fprintf(debug, " nrdf_vcm[%d] = %g, nrdf = %g\n",
2828 j, nrdf_vcm[j], nrdf_tc[i]);
2833 for (i = 0; (i < groups->grps[egcTC].nr); i++)
2835 opts->nrdf[i] = nrdf_tc[i];
2836 if (opts->nrdf[i] < 0)
2841 "Number of degrees of freedom in T-Coupling group %s is %.2f\n",
2842 gnames[groups->grps[egcTC].nm_ind[i]], opts->nrdf[i]);
2851 static void decode_cos(char *s, t_cosines *cosine)
2854 char format[STRLEN], f1[STRLEN];
2866 sscanf(t, "%d", &(cosine->n));
2873 snew(cosine->a, cosine->n);
2874 snew(cosine->phi, cosine->n);
2876 sprintf(format, "%%*d");
2877 for (i = 0; (i < cosine->n); i++)
2880 strcat(f1, "%lf%lf");
2881 if (sscanf(t, f1, &a, &phi) < 2)
2883 gmx_fatal(FARGS, "Invalid input for electric field shift: '%s'", t);
2886 cosine->phi[i] = phi;
2887 strcat(format, "%*lf%*lf");
2894 static gmx_bool do_egp_flag(t_inputrec *ir, gmx_groups_t *groups,
2895 const char *option, const char *val, int flag)
2897 /* The maximum number of energy group pairs would be MAXPTR*(MAXPTR+1)/2.
2898 * But since this is much larger than STRLEN, such a line can not be parsed.
2899 * The real maximum is the number of names that fit in a string: STRLEN/2.
2901 #define EGP_MAX (STRLEN/2)
2902 int nelem, i, j, k, nr;
2903 char *names[EGP_MAX];
2907 gnames = groups->grpname;
2909 nelem = str_nelem(val, EGP_MAX, names);
2912 gmx_fatal(FARGS, "The number of groups for %s is odd", option);
2914 nr = groups->grps[egcENER].nr;
2916 for (i = 0; i < nelem/2; i++)
2920 gmx_strcasecmp(names[2*i], *(gnames[groups->grps[egcENER].nm_ind[j]])))
2926 gmx_fatal(FARGS, "%s in %s is not an energy group\n",
2927 names[2*i], option);
2931 gmx_strcasecmp(names[2*i+1], *(gnames[groups->grps[egcENER].nm_ind[k]])))
2937 gmx_fatal(FARGS, "%s in %s is not an energy group\n",
2938 names[2*i+1], option);
2940 if ((j < nr) && (k < nr))
2942 ir->opts.egp_flags[nr*j+k] |= flag;
2943 ir->opts.egp_flags[nr*k+j] |= flag;
2952 static void make_swap_groups(
2961 int ig = -1, i = 0, j;
2965 /* Just a quick check here, more thorough checks are in mdrun */
2966 if (strcmp(splitg0name, splitg1name) == 0)
2968 gmx_fatal(FARGS, "The split groups can not both be '%s'.", splitg0name);
2971 /* First get the swap group index atoms */
2972 ig = search_string(swapgname, grps->nr, gnames);
2973 swap->nat = grps->index[ig+1] - grps->index[ig];
2976 fprintf(stderr, "Swap group '%s' contains %d atoms.\n", swapgname, swap->nat);
2977 snew(swap->ind, swap->nat);
2978 for (i = 0; i < swap->nat; i++)
2980 swap->ind[i] = grps->a[grps->index[ig]+i];
2985 gmx_fatal(FARGS, "You defined an empty group of atoms for swapping.");
2988 /* Now do so for the split groups */
2989 for (j = 0; j < 2; j++)
2993 splitg = splitg0name;
2997 splitg = splitg1name;
3000 ig = search_string(splitg, grps->nr, gnames);
3001 swap->nat_split[j] = grps->index[ig+1] - grps->index[ig];
3002 if (swap->nat_split[j] > 0)
3004 fprintf(stderr, "Split group %d '%s' contains %d atom%s.\n",
3005 j, splitg, swap->nat_split[j], (swap->nat_split[j] > 1) ? "s" : "");
3006 snew(swap->ind_split[j], swap->nat_split[j]);
3007 for (i = 0; i < swap->nat_split[j]; i++)
3009 swap->ind_split[j][i] = grps->a[grps->index[ig]+i];
3014 gmx_fatal(FARGS, "Split group %d has to contain at least 1 atom!", j);
3018 /* Now get the solvent group index atoms */
3019 ig = search_string(solgname, grps->nr, gnames);
3020 swap->nat_sol = grps->index[ig+1] - grps->index[ig];
3021 if (swap->nat_sol > 0)
3023 fprintf(stderr, "Solvent group '%s' contains %d atoms.\n", solgname, swap->nat_sol);
3024 snew(swap->ind_sol, swap->nat_sol);
3025 for (i = 0; i < swap->nat_sol; i++)
3027 swap->ind_sol[i] = grps->a[grps->index[ig]+i];
3032 gmx_fatal(FARGS, "You defined an empty group of solvent. Cannot exchange ions.");
3037 void do_index(const char* mdparin, const char *ndx,
3040 t_inputrec *ir, rvec *v,
3044 gmx_groups_t *groups;
3048 char warnbuf[STRLEN], **gnames;
3049 int nr, ntcg, ntau_t, nref_t, nacc, nofg, nSA, nSA_points, nSA_time, nSA_temp;
3052 int nacg, nfreeze, nfrdim, nenergy, nvcm, nuser;
3053 char *ptr1[MAXPTR], *ptr2[MAXPTR], *ptr3[MAXPTR];
3054 int i, j, k, restnm;
3056 gmx_bool bExcl, bTable, bSetTCpar, bAnneal, bRest;
3057 int nQMmethod, nQMbasis, nQMcharge, nQMmult, nbSH, nCASorb, nCASelec,
3058 nSAon, nSAoff, nSAsteps, nQMg, nbOPT, nbTS;
3059 char warn_buf[STRLEN];
3063 fprintf(stderr, "processing index file...\n");
3069 snew(grps->index, 1);
3071 atoms_all = gmx_mtop_global_atoms(mtop);
3072 analyse(&atoms_all, grps, &gnames, FALSE, TRUE);
3073 free_t_atoms(&atoms_all, FALSE);
3077 grps = init_index(ndx, &gnames);
3080 groups = &mtop->groups;
3081 natoms = mtop->natoms;
3082 symtab = &mtop->symtab;
3084 snew(groups->grpname, grps->nr+1);
3086 for (i = 0; (i < grps->nr); i++)
3088 groups->grpname[i] = put_symtab(symtab, gnames[i]);
3090 groups->grpname[i] = put_symtab(symtab, "rest");
3092 srenew(gnames, grps->nr+1);
3093 gnames[restnm] = *(groups->grpname[i]);
3094 groups->ngrpname = grps->nr+1;
3096 set_warning_line(wi, mdparin, -1);
3098 ntau_t = str_nelem(is->tau_t, MAXPTR, ptr1);
3099 nref_t = str_nelem(is->ref_t, MAXPTR, ptr2);
3100 ntcg = str_nelem(is->tcgrps, MAXPTR, ptr3);
3101 if ((ntau_t != ntcg) || (nref_t != ntcg))
3103 gmx_fatal(FARGS, "Invalid T coupling input: %d groups, %d ref-t values and "
3104 "%d tau-t values", ntcg, nref_t, ntau_t);
3107 bSetTCpar = (ir->etc || EI_SD(ir->eI) || ir->eI == eiBD || EI_TPI(ir->eI));
3108 do_numbering(natoms, groups, ntcg, ptr3, grps, gnames, egcTC,
3109 restnm, bSetTCpar ? egrptpALL : egrptpALL_GENREST, bVerbose, wi);
3110 nr = groups->grps[egcTC].nr;
3112 snew(ir->opts.nrdf, nr);
3113 snew(ir->opts.tau_t, nr);
3114 snew(ir->opts.ref_t, nr);
3115 if (ir->eI == eiBD && ir->bd_fric == 0)
3117 fprintf(stderr, "bd-fric=0, so tau-t will be used as the inverse friction constant(s)\n");
3124 gmx_fatal(FARGS, "Not enough ref-t and tau-t values!");
3128 for (i = 0; (i < nr); i++)
3130 ir->opts.tau_t[i] = strtod(ptr1[i], NULL);
3131 if ((ir->eI == eiBD || ir->eI == eiSD2) && ir->opts.tau_t[i] <= 0)
3133 sprintf(warn_buf, "With integrator %s tau-t should be larger than 0", ei_names[ir->eI]);
3134 warning_error(wi, warn_buf);
3137 if (ir->etc != etcVRESCALE && ir->opts.tau_t[i] == 0)
3139 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.");
3142 if (ir->opts.tau_t[i] >= 0)
3144 tau_min = min(tau_min, ir->opts.tau_t[i]);
3147 if (ir->etc != etcNO && ir->nsttcouple == -1)
3149 ir->nsttcouple = ir_optimal_nsttcouple(ir);
3154 if ((ir->etc == etcNOSEHOOVER) && (ir->epc == epcBERENDSEN))
3156 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");
3158 if ((ir->epc == epcMTTK) && (ir->etc > etcNO))
3160 if (ir->nstpcouple != ir->nsttcouple)
3162 int mincouple = min(ir->nstpcouple, ir->nsttcouple);
3163 ir->nstpcouple = ir->nsttcouple = mincouple;
3164 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);
3165 warning_note(wi, warn_buf);
3169 /* velocity verlet with averaged kinetic energy KE = 0.5*(v(t+1/2) - v(t-1/2)) is implemented
3170 primarily for testing purposes, and does not work with temperature coupling other than 1 */
3172 if (ETC_ANDERSEN(ir->etc))
3174 if (ir->nsttcouple != 1)
3177 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");
3178 warning_note(wi, warn_buf);
3181 nstcmin = tcouple_min_integration_steps(ir->etc);
3184 if (tau_min/(ir->delta_t*ir->nsttcouple) < nstcmin)
3186 sprintf(warn_buf, "For proper integration of the %s thermostat, tau-t (%g) should be at least %d times larger than nsttcouple*dt (%g)",
3187 ETCOUPLTYPE(ir->etc),
3189 ir->nsttcouple*ir->delta_t);
3190 warning(wi, warn_buf);
3193 for (i = 0; (i < nr); i++)
3195 ir->opts.ref_t[i] = strtod(ptr2[i], NULL);
3196 if (ir->opts.ref_t[i] < 0)
3198 gmx_fatal(FARGS, "ref-t for group %d negative", i);
3201 /* set the lambda mc temperature to the md integrator temperature (which should be defined
3202 if we are in this conditional) if mc_temp is negative */
3203 if (ir->expandedvals->mc_temp < 0)
3205 ir->expandedvals->mc_temp = ir->opts.ref_t[0]; /*for now, set to the first reft */
3209 /* Simulated annealing for each group. There are nr groups */
3210 nSA = str_nelem(is->anneal, MAXPTR, ptr1);
3211 if (nSA == 1 && (ptr1[0][0] == 'n' || ptr1[0][0] == 'N'))
3215 if (nSA > 0 && nSA != nr)
3217 gmx_fatal(FARGS, "Not enough annealing values: %d (for %d groups)\n", nSA, nr);
3221 snew(ir->opts.annealing, nr);
3222 snew(ir->opts.anneal_npoints, nr);
3223 snew(ir->opts.anneal_time, nr);
3224 snew(ir->opts.anneal_temp, nr);
3225 for (i = 0; i < nr; i++)
3227 ir->opts.annealing[i] = eannNO;
3228 ir->opts.anneal_npoints[i] = 0;
3229 ir->opts.anneal_time[i] = NULL;
3230 ir->opts.anneal_temp[i] = NULL;
3235 for (i = 0; i < nr; i++)
3237 if (ptr1[i][0] == 'n' || ptr1[i][0] == 'N')
3239 ir->opts.annealing[i] = eannNO;
3241 else if (ptr1[i][0] == 's' || ptr1[i][0] == 'S')
3243 ir->opts.annealing[i] = eannSINGLE;
3246 else if (ptr1[i][0] == 'p' || ptr1[i][0] == 'P')
3248 ir->opts.annealing[i] = eannPERIODIC;
3254 /* Read the other fields too */
3255 nSA_points = str_nelem(is->anneal_npoints, MAXPTR, ptr1);
3256 if (nSA_points != nSA)
3258 gmx_fatal(FARGS, "Found %d annealing-npoints values for %d groups\n", nSA_points, nSA);
3260 for (k = 0, i = 0; i < nr; i++)
3262 ir->opts.anneal_npoints[i] = strtol(ptr1[i], NULL, 10);
3263 if (ir->opts.anneal_npoints[i] == 1)
3265 gmx_fatal(FARGS, "Please specify at least a start and an end point for annealing\n");
3267 snew(ir->opts.anneal_time[i], ir->opts.anneal_npoints[i]);
3268 snew(ir->opts.anneal_temp[i], ir->opts.anneal_npoints[i]);
3269 k += ir->opts.anneal_npoints[i];
3272 nSA_time = str_nelem(is->anneal_time, MAXPTR, ptr1);
3275 gmx_fatal(FARGS, "Found %d annealing-time values, wanter %d\n", nSA_time, k);
3277 nSA_temp = str_nelem(is->anneal_temp, MAXPTR, ptr2);
3280 gmx_fatal(FARGS, "Found %d annealing-temp values, wanted %d\n", nSA_temp, k);
3283 for (i = 0, k = 0; i < nr; i++)
3286 for (j = 0; j < ir->opts.anneal_npoints[i]; j++)
3288 ir->opts.anneal_time[i][j] = strtod(ptr1[k], NULL);
3289 ir->opts.anneal_temp[i][j] = strtod(ptr2[k], NULL);
3292 if (ir->opts.anneal_time[i][0] > (ir->init_t+GMX_REAL_EPS))
3294 gmx_fatal(FARGS, "First time point for annealing > init_t.\n");
3300 if (ir->opts.anneal_time[i][j] < ir->opts.anneal_time[i][j-1])
3302 gmx_fatal(FARGS, "Annealing timepoints out of order: t=%f comes after t=%f\n",
3303 ir->opts.anneal_time[i][j], ir->opts.anneal_time[i][j-1]);
3306 if (ir->opts.anneal_temp[i][j] < 0)
3308 gmx_fatal(FARGS, "Found negative temperature in annealing: %f\n", ir->opts.anneal_temp[i][j]);
3313 /* Print out some summary information, to make sure we got it right */
3314 for (i = 0, k = 0; i < nr; i++)
3316 if (ir->opts.annealing[i] != eannNO)
3318 j = groups->grps[egcTC].nm_ind[i];
3319 fprintf(stderr, "Simulated annealing for group %s: %s, %d timepoints\n",
3320 *(groups->grpname[j]), eann_names[ir->opts.annealing[i]],
3321 ir->opts.anneal_npoints[i]);
3322 fprintf(stderr, "Time (ps) Temperature (K)\n");
3323 /* All terms except the last one */
3324 for (j = 0; j < (ir->opts.anneal_npoints[i]-1); j++)
3326 fprintf(stderr, "%9.1f %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3329 /* Finally the last one */
3330 j = ir->opts.anneal_npoints[i]-1;
3331 if (ir->opts.annealing[i] == eannSINGLE)
3333 fprintf(stderr, "%9.1f- %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3337 fprintf(stderr, "%9.1f %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3338 if (fabs(ir->opts.anneal_temp[i][j]-ir->opts.anneal_temp[i][0]) > GMX_REAL_EPS)
3340 warning_note(wi, "There is a temperature jump when your annealing loops back.\n");
3349 if (ir->ePull != epullNO)
3351 make_pull_groups(ir->pull, is->pull_grp, grps, gnames);
3353 make_pull_coords(ir->pull);
3358 make_rotation_groups(ir->rot, is->rot_grp, grps, gnames);
3361 if (ir->eSwapCoords != eswapNO)
3363 make_swap_groups(ir->swap, swapgrp, splitgrp0, splitgrp1, solgrp, grps, gnames);
3366 nacc = str_nelem(is->acc, MAXPTR, ptr1);
3367 nacg = str_nelem(is->accgrps, MAXPTR, ptr2);
3368 if (nacg*DIM != nacc)
3370 gmx_fatal(FARGS, "Invalid Acceleration input: %d groups and %d acc. values",
3373 do_numbering(natoms, groups, nacg, ptr2, grps, gnames, egcACC,
3374 restnm, egrptpALL_GENREST, bVerbose, wi);
3375 nr = groups->grps[egcACC].nr;
3376 snew(ir->opts.acc, nr);
3377 ir->opts.ngacc = nr;
3379 for (i = k = 0; (i < nacg); i++)
3381 for (j = 0; (j < DIM); j++, k++)
3383 ir->opts.acc[i][j] = strtod(ptr1[k], NULL);
3386 for (; (i < nr); i++)
3388 for (j = 0; (j < DIM); j++)
3390 ir->opts.acc[i][j] = 0;
3394 nfrdim = str_nelem(is->frdim, MAXPTR, ptr1);
3395 nfreeze = str_nelem(is->freeze, MAXPTR, ptr2);
3396 if (nfrdim != DIM*nfreeze)
3398 gmx_fatal(FARGS, "Invalid Freezing input: %d groups and %d freeze values",
3401 do_numbering(natoms, groups, nfreeze, ptr2, grps, gnames, egcFREEZE,
3402 restnm, egrptpALL_GENREST, bVerbose, wi);
3403 nr = groups->grps[egcFREEZE].nr;
3404 ir->opts.ngfrz = nr;
3405 snew(ir->opts.nFreeze, nr);
3406 for (i = k = 0; (i < nfreeze); i++)
3408 for (j = 0; (j < DIM); j++, k++)
3410 ir->opts.nFreeze[i][j] = (gmx_strncasecmp(ptr1[k], "Y", 1) == 0);
3411 if (!ir->opts.nFreeze[i][j])
3413 if (gmx_strncasecmp(ptr1[k], "N", 1) != 0)
3415 sprintf(warnbuf, "Please use Y(ES) or N(O) for freezedim only "
3416 "(not %s)", ptr1[k]);
3417 warning(wi, warn_buf);
3422 for (; (i < nr); i++)
3424 for (j = 0; (j < DIM); j++)
3426 ir->opts.nFreeze[i][j] = 0;
3430 nenergy = str_nelem(is->energy, MAXPTR, ptr1);
3431 do_numbering(natoms, groups, nenergy, ptr1, grps, gnames, egcENER,
3432 restnm, egrptpALL_GENREST, bVerbose, wi);
3433 add_wall_energrps(groups, ir->nwall, symtab);
3434 ir->opts.ngener = groups->grps[egcENER].nr;
3435 nvcm = str_nelem(is->vcm, MAXPTR, ptr1);
3437 do_numbering(natoms, groups, nvcm, ptr1, grps, gnames, egcVCM,
3438 restnm, nvcm == 0 ? egrptpALL_GENREST : egrptpPART, bVerbose, wi);
3441 warning(wi, "Some atoms are not part of any center of mass motion removal group.\n"
3442 "This may lead to artifacts.\n"
3443 "In most cases one should use one group for the whole system.");
3446 /* Now we have filled the freeze struct, so we can calculate NRDF */
3447 calc_nrdf(mtop, ir, gnames);
3453 /* Must check per group! */
3454 for (i = 0; (i < ir->opts.ngtc); i++)
3456 ntot += ir->opts.nrdf[i];
3458 if (ntot != (DIM*natoms))
3460 fac = sqrt(ntot/(DIM*natoms));
3463 fprintf(stderr, "Scaling velocities by a factor of %.3f to account for constraints\n"
3464 "and removal of center of mass motion\n", fac);
3466 for (i = 0; (i < natoms); i++)
3468 svmul(fac, v[i], v[i]);
3473 nuser = str_nelem(is->user1, MAXPTR, ptr1);
3474 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser1,
3475 restnm, egrptpALL_GENREST, bVerbose, wi);
3476 nuser = str_nelem(is->user2, MAXPTR, ptr1);
3477 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser2,
3478 restnm, egrptpALL_GENREST, bVerbose, wi);
3479 nuser = str_nelem(is->x_compressed_groups, MAXPTR, ptr1);
3480 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcCompressedX,
3481 restnm, egrptpONE, bVerbose, wi);
3482 nofg = str_nelem(is->orirefitgrp, MAXPTR, ptr1);
3483 do_numbering(natoms, groups, nofg, ptr1, grps, gnames, egcORFIT,
3484 restnm, egrptpALL_GENREST, bVerbose, wi);
3486 /* QMMM input processing */
3487 nQMg = str_nelem(is->QMMM, MAXPTR, ptr1);
3488 nQMmethod = str_nelem(is->QMmethod, MAXPTR, ptr2);
3489 nQMbasis = str_nelem(is->QMbasis, MAXPTR, ptr3);
3490 if ((nQMmethod != nQMg) || (nQMbasis != nQMg))
3492 gmx_fatal(FARGS, "Invalid QMMM input: %d groups %d basissets"
3493 " and %d methods\n", nQMg, nQMbasis, nQMmethod);
3495 /* group rest, if any, is always MM! */
3496 do_numbering(natoms, groups, nQMg, ptr1, grps, gnames, egcQMMM,
3497 restnm, egrptpALL_GENREST, bVerbose, wi);
3498 nr = nQMg; /*atoms->grps[egcQMMM].nr;*/
3499 ir->opts.ngQM = nQMg;
3500 snew(ir->opts.QMmethod, nr);
3501 snew(ir->opts.QMbasis, nr);
3502 for (i = 0; i < nr; i++)
3504 /* input consists of strings: RHF CASSCF PM3 .. These need to be
3505 * converted to the corresponding enum in names.c
3507 ir->opts.QMmethod[i] = search_QMstring(ptr2[i], eQMmethodNR,
3509 ir->opts.QMbasis[i] = search_QMstring(ptr3[i], eQMbasisNR,
3513 nQMmult = str_nelem(is->QMmult, MAXPTR, ptr1);
3514 nQMcharge = str_nelem(is->QMcharge, MAXPTR, ptr2);
3515 nbSH = str_nelem(is->bSH, MAXPTR, ptr3);
3516 snew(ir->opts.QMmult, nr);
3517 snew(ir->opts.QMcharge, nr);
3518 snew(ir->opts.bSH, nr);
3520 for (i = 0; i < nr; i++)
3522 ir->opts.QMmult[i] = strtol(ptr1[i], NULL, 10);
3523 ir->opts.QMcharge[i] = strtol(ptr2[i], NULL, 10);
3524 ir->opts.bSH[i] = (gmx_strncasecmp(ptr3[i], "Y", 1) == 0);
3527 nCASelec = str_nelem(is->CASelectrons, MAXPTR, ptr1);
3528 nCASorb = str_nelem(is->CASorbitals, MAXPTR, ptr2);
3529 snew(ir->opts.CASelectrons, nr);
3530 snew(ir->opts.CASorbitals, nr);
3531 for (i = 0; i < nr; i++)
3533 ir->opts.CASelectrons[i] = strtol(ptr1[i], NULL, 10);
3534 ir->opts.CASorbitals[i] = strtol(ptr2[i], NULL, 10);
3536 /* special optimization options */
3538 nbOPT = str_nelem(is->bOPT, MAXPTR, ptr1);
3539 nbTS = str_nelem(is->bTS, MAXPTR, ptr2);
3540 snew(ir->opts.bOPT, nr);
3541 snew(ir->opts.bTS, nr);
3542 for (i = 0; i < nr; i++)
3544 ir->opts.bOPT[i] = (gmx_strncasecmp(ptr1[i], "Y", 1) == 0);
3545 ir->opts.bTS[i] = (gmx_strncasecmp(ptr2[i], "Y", 1) == 0);
3547 nSAon = str_nelem(is->SAon, MAXPTR, ptr1);
3548 nSAoff = str_nelem(is->SAoff, MAXPTR, ptr2);
3549 nSAsteps = str_nelem(is->SAsteps, MAXPTR, ptr3);
3550 snew(ir->opts.SAon, nr);
3551 snew(ir->opts.SAoff, nr);
3552 snew(ir->opts.SAsteps, nr);
3554 for (i = 0; i < nr; i++)
3556 ir->opts.SAon[i] = strtod(ptr1[i], NULL);
3557 ir->opts.SAoff[i] = strtod(ptr2[i], NULL);
3558 ir->opts.SAsteps[i] = strtol(ptr3[i], NULL, 10);
3560 /* end of QMMM input */
3564 for (i = 0; (i < egcNR); i++)
3566 fprintf(stderr, "%-16s has %d element(s):", gtypes[i], groups->grps[i].nr);
3567 for (j = 0; (j < groups->grps[i].nr); j++)
3569 fprintf(stderr, " %s", *(groups->grpname[groups->grps[i].nm_ind[j]]));
3571 fprintf(stderr, "\n");
3575 nr = groups->grps[egcENER].nr;
3576 snew(ir->opts.egp_flags, nr*nr);
3578 bExcl = do_egp_flag(ir, groups, "energygrp-excl", is->egpexcl, EGP_EXCL);
3579 if (bExcl && ir->cutoff_scheme == ecutsVERLET)
3581 warning_error(wi, "Energy group exclusions are not (yet) implemented for the Verlet scheme");
3583 if (bExcl && EEL_FULL(ir->coulombtype))
3585 warning(wi, "Can not exclude the lattice Coulomb energy between energy groups");
3588 bTable = do_egp_flag(ir, groups, "energygrp-table", is->egptable, EGP_TABLE);
3589 if (bTable && !(ir->vdwtype == evdwUSER) &&
3590 !(ir->coulombtype == eelUSER) && !(ir->coulombtype == eelPMEUSER) &&
3591 !(ir->coulombtype == eelPMEUSERSWITCH))
3593 gmx_fatal(FARGS, "Can only have energy group pair tables in combination with user tables for VdW and/or Coulomb");
3596 decode_cos(is->efield_x, &(ir->ex[XX]));
3597 decode_cos(is->efield_xt, &(ir->et[XX]));
3598 decode_cos(is->efield_y, &(ir->ex[YY]));
3599 decode_cos(is->efield_yt, &(ir->et[YY]));
3600 decode_cos(is->efield_z, &(ir->ex[ZZ]));
3601 decode_cos(is->efield_zt, &(ir->et[ZZ]));
3605 do_adress_index(ir->adress, groups, gnames, &(ir->opts), wi);
3608 for (i = 0; (i < grps->nr); i++)
3620 static void check_disre(gmx_mtop_t *mtop)
3622 gmx_ffparams_t *ffparams;
3623 t_functype *functype;
3625 int i, ndouble, ftype;
3626 int label, old_label;
3628 if (gmx_mtop_ftype_count(mtop, F_DISRES) > 0)
3630 ffparams = &mtop->ffparams;
3631 functype = ffparams->functype;
3632 ip = ffparams->iparams;
3635 for (i = 0; i < ffparams->ntypes; i++)
3637 ftype = functype[i];
3638 if (ftype == F_DISRES)
3640 label = ip[i].disres.label;
3641 if (label == old_label)
3643 fprintf(stderr, "Distance restraint index %d occurs twice\n", label);
3651 gmx_fatal(FARGS, "Found %d double distance restraint indices,\n"
3652 "probably the parameters for multiple pairs in one restraint "
3653 "are not identical\n", ndouble);
3658 static gmx_bool absolute_reference(t_inputrec *ir, gmx_mtop_t *sys,
3659 gmx_bool posres_only,
3663 gmx_mtop_ilistloop_t iloop;
3673 for (d = 0; d < DIM; d++)
3675 AbsRef[d] = (d < ndof_com(ir) ? 0 : 1);
3677 /* Check for freeze groups */
3678 for (g = 0; g < ir->opts.ngfrz; g++)
3680 for (d = 0; d < DIM; d++)
3682 if (ir->opts.nFreeze[g][d] != 0)
3690 /* Check for position restraints */
3691 iloop = gmx_mtop_ilistloop_init(sys);
3692 while (gmx_mtop_ilistloop_next(iloop, &ilist, &nmol))
3695 (AbsRef[XX] == 0 || AbsRef[YY] == 0 || AbsRef[ZZ] == 0))
3697 for (i = 0; i < ilist[F_POSRES].nr; i += 2)
3699 pr = &sys->ffparams.iparams[ilist[F_POSRES].iatoms[i]];
3700 for (d = 0; d < DIM; d++)
3702 if (pr->posres.fcA[d] != 0)
3708 for (i = 0; i < ilist[F_FBPOSRES].nr; i += 2)
3710 /* Check for flat-bottom posres */
3711 pr = &sys->ffparams.iparams[ilist[F_FBPOSRES].iatoms[i]];
3712 if (pr->fbposres.k != 0)
3714 switch (pr->fbposres.geom)
3716 case efbposresSPHERE:
3717 AbsRef[XX] = AbsRef[YY] = AbsRef[ZZ] = 1;
3719 case efbposresCYLINDER:
3720 AbsRef[XX] = AbsRef[YY] = 1;
3722 case efbposresX: /* d=XX */
3723 case efbposresY: /* d=YY */
3724 case efbposresZ: /* d=ZZ */
3725 d = pr->fbposres.geom - efbposresX;
3729 gmx_fatal(FARGS, " Invalid geometry for flat-bottom position restraint.\n"
3730 "Expected nr between 1 and %d. Found %d\n", efbposresNR-1,
3738 return (AbsRef[XX] != 0 && AbsRef[YY] != 0 && AbsRef[ZZ] != 0);
3742 check_combination_rule_differences(const gmx_mtop_t *mtop, int state,
3743 gmx_bool *bC6ParametersWorkWithGeometricRules,
3744 gmx_bool *bC6ParametersWorkWithLBRules,
3745 gmx_bool *bLBRulesPossible)
3747 int ntypes, tpi, tpj, thisLBdiff, thisgeomdiff;
3750 double geometricdiff, LBdiff;
3751 double c6i, c6j, c12i, c12j;
3752 double c6, c6_geometric, c6_LB;
3753 double sigmai, sigmaj, epsi, epsj;
3754 gmx_bool bCanDoLBRules, bCanDoGeometricRules;
3757 /* A tolerance of 1e-5 seems reasonable for (possibly hand-typed)
3758 * force-field floating point parameters.
3761 ptr = getenv("GMX_LJCOMB_TOL");
3766 sscanf(ptr, "%lf", &dbl);
3770 *bC6ParametersWorkWithLBRules = TRUE;
3771 *bC6ParametersWorkWithGeometricRules = TRUE;
3772 bCanDoLBRules = TRUE;
3773 bCanDoGeometricRules = TRUE;
3774 ntypes = mtop->ffparams.atnr;
3775 snew(typecount, ntypes);
3776 gmx_mtop_count_atomtypes(mtop, state, typecount);
3777 geometricdiff = LBdiff = 0.0;
3778 *bLBRulesPossible = TRUE;
3779 for (tpi = 0; tpi < ntypes; ++tpi)
3781 c6i = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c6;
3782 c12i = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c12;
3783 for (tpj = tpi; tpj < ntypes; ++tpj)
3785 c6j = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c6;
3786 c12j = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c12;
3787 c6 = mtop->ffparams.iparams[ntypes * tpi + tpj].lj.c6;
3788 c6_geometric = sqrt(c6i * c6j);
3789 if (!gmx_numzero(c6_geometric))
3791 if (!gmx_numzero(c12i) && !gmx_numzero(c12j))
3793 sigmai = pow(c12i / c6i, 1.0/6.0);
3794 sigmaj = pow(c12j / c6j, 1.0/6.0);
3795 epsi = c6i * c6i /(4.0 * c12i);
3796 epsj = c6j * c6j /(4.0 * c12j);
3797 c6_LB = 4.0 * pow(epsi * epsj, 1.0/2.0) * pow(0.5 * (sigmai + sigmaj), 6);
3801 *bLBRulesPossible = FALSE;
3802 c6_LB = c6_geometric;
3804 bCanDoLBRules = gmx_within_tol(c6_LB, c6, tol);
3807 if (FALSE == bCanDoLBRules)
3809 *bC6ParametersWorkWithLBRules = FALSE;
3812 bCanDoGeometricRules = gmx_within_tol(c6_geometric, c6, tol);
3814 if (FALSE == bCanDoGeometricRules)
3816 *bC6ParametersWorkWithGeometricRules = FALSE;
3824 check_combination_rules(const t_inputrec *ir, const gmx_mtop_t *mtop,
3828 gmx_bool bLBRulesPossible, bC6ParametersWorkWithGeometricRules, bC6ParametersWorkWithLBRules;
3830 check_combination_rule_differences(mtop, 0,
3831 &bC6ParametersWorkWithGeometricRules,
3832 &bC6ParametersWorkWithLBRules,
3834 if (ir->ljpme_combination_rule == eljpmeLB)
3836 if (FALSE == bC6ParametersWorkWithLBRules || FALSE == bLBRulesPossible)
3838 warning(wi, "You are using arithmetic-geometric combination rules "
3839 "in LJ-PME, but your non-bonded C6 parameters do not "
3840 "follow these rules.");
3845 if (FALSE == bC6ParametersWorkWithGeometricRules)
3847 if (ir->eDispCorr != edispcNO)
3849 warning_note(wi, "You are using geometric combination rules in "
3850 "LJ-PME, but your non-bonded C6 parameters do "
3851 "not follow these rules. "
3852 "If your force field uses Lorentz-Berthelot combination rules this "
3853 "will introduce small errors in the forces and energies in "
3854 "your simulations. Dispersion correction will correct total "
3855 "energy and/or pressure, but not forces or surface tensions. "
3856 "Please check the LJ-PME section in the manual "
3857 "before proceeding further.");
3861 warning_note(wi, "You are using geometric combination rules in "
3862 "LJ-PME, but your non-bonded C6 parameters do "
3863 "not follow these rules. "
3864 "If your force field uses Lorentz-Berthelot combination rules this "
3865 "will introduce small errors in the forces and energies in "
3866 "your simulations. Consider using dispersion correction "
3867 "for the total energy and pressure. "
3868 "Please check the LJ-PME section in the manual "
3869 "before proceeding further.");
3875 void triple_check(const char *mdparin, t_inputrec *ir, gmx_mtop_t *sys,
3879 int i, m, c, nmol, npct;
3880 gmx_bool bCharge, bAcc;
3881 real gdt_max, *mgrp, mt;
3883 gmx_mtop_atomloop_block_t aloopb;
3884 gmx_mtop_atomloop_all_t aloop;
3887 char warn_buf[STRLEN];
3889 set_warning_line(wi, mdparin, -1);
3891 if (EI_DYNAMICS(ir->eI) && !EI_SD(ir->eI) && ir->eI != eiBD &&
3892 ir->comm_mode == ecmNO &&
3893 !(absolute_reference(ir, sys, FALSE, AbsRef) || ir->nsteps <= 10))
3895 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");
3898 /* Check for pressure coupling with absolute position restraints */
3899 if (ir->epc != epcNO && ir->refcoord_scaling == erscNO)
3901 absolute_reference(ir, sys, TRUE, AbsRef);
3903 for (m = 0; m < DIM; m++)
3905 if (AbsRef[m] && norm2(ir->compress[m]) > 0)
3907 warning(wi, "You are using pressure coupling with absolute position restraints, this will give artifacts. Use the refcoord_scaling option.");
3915 aloopb = gmx_mtop_atomloop_block_init(sys);
3916 while (gmx_mtop_atomloop_block_next(aloopb, &atom, &nmol))
3918 if (atom->q != 0 || atom->qB != 0)
3926 if (EEL_FULL(ir->coulombtype))
3929 "You are using full electrostatics treatment %s for a system without charges.\n"
3930 "This costs a lot of performance for just processing zeros, consider using %s instead.\n",
3931 EELTYPE(ir->coulombtype), EELTYPE(eelCUT));
3932 warning(wi, err_buf);
3937 if (ir->coulombtype == eelCUT && ir->rcoulomb > 0 && !ir->implicit_solvent)
3940 "You are using a plain Coulomb cut-off, which might produce artifacts.\n"
3941 "You might want to consider using %s electrostatics.\n",
3943 warning_note(wi, err_buf);
3947 /* Check if combination rules used in LJ-PME are the same as in the force field */
3948 if (EVDW_PME(ir->vdwtype))
3950 check_combination_rules(ir, sys, wi);
3953 /* Generalized reaction field */
3954 if (ir->opts.ngtc == 0)
3956 sprintf(err_buf, "No temperature coupling while using coulombtype %s",
3958 CHECK(ir->coulombtype == eelGRF);
3962 sprintf(err_buf, "When using coulombtype = %s"
3963 " ref-t for temperature coupling should be > 0",
3965 CHECK((ir->coulombtype == eelGRF) && (ir->opts.ref_t[0] <= 0));
3968 if (ir->eI == eiSD1 &&
3969 (gmx_mtop_ftype_count(sys, F_CONSTR) > 0 ||
3970 gmx_mtop_ftype_count(sys, F_SETTLE) > 0))
3972 sprintf(warn_buf, "With constraints integrator %s is less accurate, consider using %s instead", ei_names[ir->eI], ei_names[eiSD2]);
3973 warning_note(wi, warn_buf);
3977 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
3979 for (m = 0; (m < DIM); m++)
3981 if (fabs(ir->opts.acc[i][m]) > 1e-6)
3990 snew(mgrp, sys->groups.grps[egcACC].nr);
3991 aloop = gmx_mtop_atomloop_all_init(sys);
3992 while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
3994 mgrp[ggrpnr(&sys->groups, egcACC, i)] += atom->m;
3997 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
3999 for (m = 0; (m < DIM); m++)
4001 acc[m] += ir->opts.acc[i][m]*mgrp[i];
4005 for (m = 0; (m < DIM); m++)
4007 if (fabs(acc[m]) > 1e-6)
4009 const char *dim[DIM] = { "X", "Y", "Z" };
4011 "Net Acceleration in %s direction, will %s be corrected\n",
4012 dim[m], ir->nstcomm != 0 ? "" : "not");
4013 if (ir->nstcomm != 0 && m < ndof_com(ir))
4016 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4018 ir->opts.acc[i][m] -= acc[m];
4026 if (ir->efep != efepNO && ir->fepvals->sc_alpha != 0 &&
4027 !gmx_within_tol(sys->ffparams.reppow, 12.0, 10*GMX_DOUBLE_EPS))
4029 gmx_fatal(FARGS, "Soft-core interactions are only supported with VdW repulsion power 12");
4032 if (ir->ePull != epullNO)
4034 gmx_bool bPullAbsoluteRef;
4036 bPullAbsoluteRef = FALSE;
4037 for (i = 0; i < ir->pull->ncoord; i++)
4039 bPullAbsoluteRef = bPullAbsoluteRef ||
4040 ir->pull->coord[i].group[0] == 0 ||
4041 ir->pull->coord[i].group[1] == 0;
4043 if (bPullAbsoluteRef)
4045 absolute_reference(ir, sys, FALSE, AbsRef);
4046 for (m = 0; m < DIM; m++)
4048 if (ir->pull->dim[m] && !AbsRef[m])
4050 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.");
4056 if (ir->pull->eGeom == epullgDIRPBC)
4058 for (i = 0; i < 3; i++)
4060 for (m = 0; m <= i; m++)
4062 if ((ir->epc != epcNO && ir->compress[i][m] != 0) ||
4063 ir->deform[i][m] != 0)
4065 for (c = 0; c < ir->pull->ncoord; c++)
4067 if (ir->pull->coord[c].vec[m] != 0)
4069 gmx_fatal(FARGS, "Can not have dynamic box while using pull geometry '%s' (dim %c)", EPULLGEOM(ir->pull->eGeom), 'x'+m);
4081 void double_check(t_inputrec *ir, matrix box, gmx_bool bConstr, warninp_t wi)
4085 char warn_buf[STRLEN];
4088 ptr = check_box(ir->ePBC, box);
4091 warning_error(wi, ptr);
4094 if (bConstr && ir->eConstrAlg == econtSHAKE)
4096 if (ir->shake_tol <= 0.0)
4098 sprintf(warn_buf, "ERROR: shake-tol must be > 0 instead of %g\n",
4100 warning_error(wi, warn_buf);
4103 if (IR_TWINRANGE(*ir) && ir->nstlist > 1)
4105 sprintf(warn_buf, "With twin-range cut-off's and SHAKE the virial and the pressure are incorrect.");
4106 if (ir->epc == epcNO)
4108 warning(wi, warn_buf);
4112 warning_error(wi, warn_buf);
4117 if ( (ir->eConstrAlg == econtLINCS) && bConstr)
4119 /* If we have Lincs constraints: */
4120 if (ir->eI == eiMD && ir->etc == etcNO &&
4121 ir->eConstrAlg == econtLINCS && ir->nLincsIter == 1)
4123 sprintf(warn_buf, "For energy conservation with LINCS, lincs_iter should be 2 or larger.\n");
4124 warning_note(wi, warn_buf);
4127 if ((ir->eI == eiCG || ir->eI == eiLBFGS) && (ir->nProjOrder < 8))
4129 sprintf(warn_buf, "For accurate %s with LINCS constraints, lincs-order should be 8 or more.", ei_names[ir->eI]);
4130 warning_note(wi, warn_buf);
4132 if (ir->epc == epcMTTK)
4134 warning_error(wi, "MTTK not compatible with lincs -- use shake instead.");
4138 if (ir->LincsWarnAngle > 90.0)
4140 sprintf(warn_buf, "lincs-warnangle can not be larger than 90 degrees, setting it to 90.\n");
4141 warning(wi, warn_buf);
4142 ir->LincsWarnAngle = 90.0;
4145 if (ir->ePBC != epbcNONE)
4147 if (ir->nstlist == 0)
4149 warning(wi, "With nstlist=0 atoms are only put into the box at step 0, therefore drifting atoms might cause the simulation to crash.");
4151 bTWIN = (ir->rlistlong > ir->rlist);
4152 if (ir->ns_type == ensGRID)
4154 if (sqr(ir->rlistlong) >= max_cutoff2(ir->ePBC, box))
4156 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 %s.\n",
4157 bTWIN ? (ir->rcoulomb == ir->rlistlong ? "rcoulomb" : "rvdw") : "rlist");
4158 warning_error(wi, warn_buf);
4163 min_size = min(box[XX][XX], min(box[YY][YY], box[ZZ][ZZ]));
4164 if (2*ir->rlistlong >= min_size)
4166 sprintf(warn_buf, "ERROR: One of the box lengths is smaller than twice the cut-off length. Increase the box size or decrease rlist.");
4167 warning_error(wi, warn_buf);
4170 fprintf(stderr, "Grid search might allow larger cut-off's than simple search with triclinic boxes.");
4177 void check_chargegroup_radii(const gmx_mtop_t *mtop, const t_inputrec *ir,
4181 real rvdw1, rvdw2, rcoul1, rcoul2;
4182 char warn_buf[STRLEN];
4184 calc_chargegroup_radii(mtop, x, &rvdw1, &rvdw2, &rcoul1, &rcoul2);
4188 printf("Largest charge group radii for Van der Waals: %5.3f, %5.3f nm\n",
4193 printf("Largest charge group radii for Coulomb: %5.3f, %5.3f nm\n",
4199 if (rvdw1 + rvdw2 > ir->rlist ||
4200 rcoul1 + rcoul2 > ir->rlist)
4203 "The sum of the two largest charge group radii (%f) "
4204 "is larger than rlist (%f)\n",
4205 max(rvdw1+rvdw2, rcoul1+rcoul2), ir->rlist);
4206 warning(wi, warn_buf);
4210 /* Here we do not use the zero at cut-off macro,
4211 * since user defined interactions might purposely
4212 * not be zero at the cut-off.
4214 if ((EVDW_IS_ZERO_AT_CUTOFF(ir->vdwtype) ||
4215 ir->vdw_modifier != eintmodNONE) &&
4216 rvdw1 + rvdw2 > ir->rlistlong - ir->rvdw)
4218 sprintf(warn_buf, "The sum of the two largest charge group "
4219 "radii (%f) is larger than %s (%f) - rvdw (%f).\n"
4220 "With exact cut-offs, better performance can be "
4221 "obtained with cutoff-scheme = %s, because it "
4222 "does not use charge groups at all.",
4224 ir->rlistlong > ir->rlist ? "rlistlong" : "rlist",
4225 ir->rlistlong, ir->rvdw,
4226 ecutscheme_names[ecutsVERLET]);
4229 warning(wi, warn_buf);
4233 warning_note(wi, warn_buf);
4236 if ((EEL_IS_ZERO_AT_CUTOFF(ir->coulombtype) ||
4237 ir->coulomb_modifier != eintmodNONE) &&
4238 rcoul1 + rcoul2 > ir->rlistlong - ir->rcoulomb)
4240 sprintf(warn_buf, "The sum of the two largest charge group radii (%f) is larger than %s (%f) - rcoulomb (%f).\n"
4241 "With exact cut-offs, better performance can be obtained with cutoff-scheme = %s, because it does not use charge groups at all.",
4243 ir->rlistlong > ir->rlist ? "rlistlong" : "rlist",
4244 ir->rlistlong, ir->rcoulomb,
4245 ecutscheme_names[ecutsVERLET]);
4248 warning(wi, warn_buf);
4252 warning_note(wi, warn_buf);