Add AWH biasing module + tests
[gromacs.git] / src / gromacs / gmxpreprocess / readir.cpp
blob18ec42bb75377c1b0cc9d4113027c06b90853f5f
1 /*
2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2013,2014,2015,2016,2017, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
37 #include "gmxpre.h"
39 #include "readir.h"
41 #include <ctype.h>
42 #include <limits.h>
43 #include <stdlib.h>
45 #include <cmath>
47 #include <algorithm>
48 #include <string>
50 #include "gromacs/awh/read-params.h"
51 #include "gromacs/fileio/readinp.h"
52 #include "gromacs/fileio/warninp.h"
53 #include "gromacs/gmxlib/chargegroup.h"
54 #include "gromacs/gmxlib/network.h"
55 #include "gromacs/gmxpreprocess/keyvaluetreemdpwriter.h"
56 #include "gromacs/gmxpreprocess/toputil.h"
57 #include "gromacs/math/functions.h"
58 #include "gromacs/math/units.h"
59 #include "gromacs/math/vec.h"
60 #include "gromacs/mdlib/calc_verletbuf.h"
61 #include "gromacs/mdrunutility/mdmodules.h"
62 #include "gromacs/mdtypes/inputrec.h"
63 #include "gromacs/mdtypes/md_enums.h"
64 #include "gromacs/mdtypes/pull-params.h"
65 #include "gromacs/options/options.h"
66 #include "gromacs/options/treesupport.h"
67 #include "gromacs/pbcutil/pbc.h"
68 #include "gromacs/topology/block.h"
69 #include "gromacs/topology/ifunc.h"
70 #include "gromacs/topology/index.h"
71 #include "gromacs/topology/mtop_util.h"
72 #include "gromacs/topology/symtab.h"
73 #include "gromacs/topology/topology.h"
74 #include "gromacs/utility/cstringutil.h"
75 #include "gromacs/utility/exceptions.h"
76 #include "gromacs/utility/fatalerror.h"
77 #include "gromacs/utility/filestream.h"
78 #include "gromacs/utility/gmxassert.h"
79 #include "gromacs/utility/ikeyvaluetreeerror.h"
80 #include "gromacs/utility/keyvaluetree.h"
81 #include "gromacs/utility/keyvaluetreebuilder.h"
82 #include "gromacs/utility/keyvaluetreetransform.h"
83 #include "gromacs/utility/smalloc.h"
84 #include "gromacs/utility/stringcompare.h"
85 #include "gromacs/utility/stringutil.h"
86 #include "gromacs/utility/textwriter.h"
88 #define MAXPTR 254
89 #define NOGID 255
91 /* Resource parameters
92 * Do not change any of these until you read the instruction
93 * in readinp.h. Some cpp's do not take spaces after the backslash
94 * (like the c-shell), which will give you a very weird compiler
95 * message.
98 typedef struct t_inputrec_strings
100 char tcgrps[STRLEN], tau_t[STRLEN], ref_t[STRLEN],
101 acc[STRLEN], accgrps[STRLEN], freeze[STRLEN], frdim[STRLEN],
102 energy[STRLEN], user1[STRLEN], user2[STRLEN], vcm[STRLEN], x_compressed_groups[STRLEN],
103 couple_moltype[STRLEN], orirefitgrp[STRLEN], egptable[STRLEN], egpexcl[STRLEN],
104 wall_atomtype[STRLEN], wall_density[STRLEN], deform[STRLEN], QMMM[STRLEN],
105 imd_grp[STRLEN];
106 char fep_lambda[efptNR][STRLEN];
107 char lambda_weights[STRLEN];
108 char **pull_grp;
109 char **rot_grp;
110 char anneal[STRLEN], anneal_npoints[STRLEN],
111 anneal_time[STRLEN], anneal_temp[STRLEN];
112 char QMmethod[STRLEN], QMbasis[STRLEN], QMcharge[STRLEN], QMmult[STRLEN],
113 bSH[STRLEN], CASorbitals[STRLEN], CASelectrons[STRLEN], SAon[STRLEN],
114 SAoff[STRLEN], SAsteps[STRLEN];
116 } gmx_inputrec_strings;
118 static gmx_inputrec_strings *is = nullptr;
120 void init_inputrec_strings()
122 if (is)
124 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.");
126 snew(is, 1);
129 void done_inputrec_strings()
131 sfree(is);
132 is = nullptr;
136 enum {
137 egrptpALL, /* All particles have to be a member of a group. */
138 egrptpALL_GENREST, /* A rest group with name is generated for particles *
139 * that are not part of any group. */
140 egrptpPART, /* As egrptpALL_GENREST, but no name is generated *
141 * for the rest group. */
142 egrptpONE /* Merge all selected groups into one group, *
143 * make a rest group for the remaining particles. */
146 static const char *constraints[eshNR+1] = {
147 "none", "h-bonds", "all-bonds", "h-angles", "all-angles", nullptr
150 static const char *couple_lam[ecouplamNR+1] = {
151 "vdw-q", "vdw", "q", "none", nullptr
154 static void GetSimTemps(int ntemps, t_simtemp *simtemp, double *temperature_lambdas)
157 int i;
159 for (i = 0; i < ntemps; i++)
161 /* simple linear scaling -- allows more control */
162 if (simtemp->eSimTempScale == esimtempLINEAR)
164 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*temperature_lambdas[i];
166 else if (simtemp->eSimTempScale == esimtempGEOMETRIC) /* should give roughly equal acceptance for constant heat capacity . . . */
168 simtemp->temperatures[i] = simtemp->simtemp_low * std::pow(simtemp->simtemp_high/simtemp->simtemp_low, static_cast<real>((1.0*i)/(ntemps-1)));
170 else if (simtemp->eSimTempScale == esimtempEXPONENTIAL)
172 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*(std::expm1(temperature_lambdas[i])/std::expm1(1.0));
174 else
176 char errorstr[128];
177 sprintf(errorstr, "eSimTempScale=%d not defined", simtemp->eSimTempScale);
178 gmx_fatal(FARGS, errorstr);
185 static void _low_check(gmx_bool b, const char *s, warninp_t wi)
187 if (b)
189 warning_error(wi, s);
193 static void check_nst(const char *desc_nst, int nst,
194 const char *desc_p, int *p,
195 warninp_t wi)
197 char buf[STRLEN];
199 if (*p > 0 && *p % nst != 0)
201 /* Round up to the next multiple of nst */
202 *p = ((*p)/nst + 1)*nst;
203 sprintf(buf, "%s should be a multiple of %s, changing %s to %d\n",
204 desc_p, desc_nst, desc_p, *p);
205 warning(wi, buf);
209 static gmx_bool ir_NVE(const t_inputrec *ir)
211 return (EI_MD(ir->eI) && ir->etc == etcNO);
214 static int lcd(int n1, int n2)
216 int d, i;
218 d = 1;
219 for (i = 2; (i <= n1 && i <= n2); i++)
221 if (n1 % i == 0 && n2 % i == 0)
223 d = i;
227 return d;
230 static void process_interaction_modifier(const t_inputrec *ir, int *eintmod)
232 if (*eintmod == eintmodPOTSHIFT_VERLET)
234 if (ir->cutoff_scheme == ecutsVERLET)
236 *eintmod = eintmodPOTSHIFT;
238 else
240 *eintmod = eintmodNONE;
245 void check_ir(const char *mdparin, t_inputrec *ir, t_gromppopts *opts,
246 warninp_t wi)
247 /* Check internal consistency.
248 * NOTE: index groups are not set here yet, don't check things
249 * like temperature coupling group options here, but in triple_check
252 /* Strange macro: first one fills the err_buf, and then one can check
253 * the condition, which will print the message and increase the error
254 * counter.
256 #define CHECK(b) _low_check(b, err_buf, wi)
257 char err_buf[256], warn_buf[STRLEN];
258 int i, j;
259 real dt_pcoupl;
260 t_lambda *fep = ir->fepvals;
261 t_expanded *expand = ir->expandedvals;
263 set_warning_line(wi, mdparin, -1);
265 if (ir->coulombtype == eelRF_NEC_UNSUPPORTED)
267 sprintf(warn_buf, "%s electrostatics is no longer supported",
268 eel_names[eelRF_NEC_UNSUPPORTED]);
269 warning_error(wi, warn_buf);
272 /* BASIC CUT-OFF STUFF */
273 if (ir->rcoulomb < 0)
275 warning_error(wi, "rcoulomb should be >= 0");
277 if (ir->rvdw < 0)
279 warning_error(wi, "rvdw should be >= 0");
281 if (ir->rlist < 0 &&
282 !(ir->cutoff_scheme == ecutsVERLET && ir->verletbuf_tol > 0))
284 warning_error(wi, "rlist should be >= 0");
286 sprintf(err_buf, "nstlist can not be smaller than 0. (If you were trying to use the heuristic neighbour-list update scheme for efficient buffering for improved energy conservation, please use the Verlet cut-off scheme instead.)");
287 CHECK(ir->nstlist < 0);
289 process_interaction_modifier(ir, &ir->coulomb_modifier);
290 process_interaction_modifier(ir, &ir->vdw_modifier);
292 if (ir->cutoff_scheme == ecutsGROUP)
294 warning_note(wi,
295 "The group cutoff scheme is deprecated since GROMACS 5.0 and will be removed in a future "
296 "release when all interaction forms are supported for the verlet scheme. The verlet "
297 "scheme already scales better, and it is compatible with GPUs and other accelerators.");
299 if (ir->rlist > 0 && ir->rlist < ir->rcoulomb)
301 gmx_fatal(FARGS, "rcoulomb must not be greater than rlist (twin-range schemes are not supported)");
303 if (ir->rlist > 0 && ir->rlist < ir->rvdw)
305 gmx_fatal(FARGS, "rvdw must not be greater than rlist (twin-range schemes are not supported)");
308 if (ir->rlist == 0 && ir->ePBC != epbcNONE)
310 warning_error(wi, "Can not have an infinite cut-off with PBC");
314 if (ir->cutoff_scheme == ecutsVERLET)
316 real rc_max;
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");
324 // We don't (yet) have general Verlet kernels for rcoulomb!=rvdw
325 if (ir->rcoulomb != ir->rvdw)
327 // Since we have PME coulomb + LJ cut-off kernels with rcoulomb>rvdw
328 // for PME load balancing, we can support this exception.
329 bool bUsesPmeTwinRangeKernel = (EEL_PME_EWALD(ir->coulombtype) &&
330 ir->vdwtype == evdwCUT &&
331 ir->rcoulomb > ir->rvdw);
332 if (!bUsesPmeTwinRangeKernel)
334 warning_error(wi, "With Verlet lists rcoulomb!=rvdw is not supported (except for rcoulomb>rvdw with PME electrostatics)");
338 if (ir->vdwtype == evdwSHIFT || ir->vdwtype == evdwSWITCH)
340 if (ir->vdw_modifier == eintmodNONE ||
341 ir->vdw_modifier == eintmodPOTSHIFT)
343 ir->vdw_modifier = (ir->vdwtype == evdwSHIFT ? eintmodFORCESWITCH : eintmodPOTSWITCH);
345 sprintf(warn_buf, "Replacing vdwtype=%s by the equivalent combination of vdwtype=%s and vdw_modifier=%s", evdw_names[ir->vdwtype], evdw_names[evdwCUT], eintmod_names[ir->vdw_modifier]);
346 warning_note(wi, warn_buf);
348 ir->vdwtype = evdwCUT;
350 else
352 sprintf(warn_buf, "Unsupported combination of vdwtype=%s and vdw_modifier=%s", evdw_names[ir->vdwtype], eintmod_names[ir->vdw_modifier]);
353 warning_error(wi, warn_buf);
357 if (!(ir->vdwtype == evdwCUT || ir->vdwtype == evdwPME))
359 warning_error(wi, "With Verlet lists only cut-off and PME LJ interactions are supported");
361 if (!(ir->coulombtype == eelCUT || EEL_RF(ir->coulombtype) ||
362 EEL_PME(ir->coulombtype) || ir->coulombtype == eelEWALD))
364 warning_error(wi, "With Verlet lists only cut-off, reaction-field, PME and Ewald electrostatics are supported");
366 if (!(ir->coulomb_modifier == eintmodNONE ||
367 ir->coulomb_modifier == eintmodPOTSHIFT))
369 sprintf(warn_buf, "coulomb_modifier=%s is not supported with the Verlet cut-off scheme", eintmod_names[ir->coulomb_modifier]);
370 warning_error(wi, warn_buf);
373 if (ir->implicit_solvent != eisNO)
375 warning_error(wi, "Implicit solvent is not (yet) supported with the with Verlet lists.");
378 if (ir->nstlist <= 0)
380 warning_error(wi, "With Verlet lists nstlist should be larger than 0");
383 if (ir->nstlist < 10)
385 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.");
388 rc_max = std::max(ir->rvdw, ir->rcoulomb);
390 if (ir->verletbuf_tol <= 0)
392 if (ir->verletbuf_tol == 0)
394 warning_error(wi, "Can not have Verlet buffer tolerance of exactly 0");
397 if (ir->rlist < rc_max)
399 warning_error(wi, "With verlet lists rlist can not be smaller than rvdw or rcoulomb");
402 if (ir->rlist == rc_max && ir->nstlist > 1)
404 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.");
407 else
409 if (ir->rlist > rc_max)
411 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.");
414 if (ir->nstlist == 1)
416 /* No buffer required */
417 ir->rlist = rc_max;
419 else
421 if (EI_DYNAMICS(ir->eI))
423 if (inputrec2nboundeddim(ir) < 3)
425 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.");
427 /* Set rlist temporarily so we can continue processing */
428 ir->rlist = rc_max;
430 else
432 /* Set the buffer to 5% of the cut-off */
433 ir->rlist = (1.0 + verlet_buffer_ratio_nodynamics)*rc_max;
439 /* GENERAL INTEGRATOR STUFF */
440 if (!EI_MD(ir->eI))
442 if (ir->etc != etcNO)
444 if (EI_RANDOM(ir->eI))
446 sprintf(warn_buf, "Setting tcoupl from '%s' to 'no'. %s handles temperature coupling implicitly. See the documentation for more information on which parameters affect temperature for %s.", etcoupl_names[ir->etc], ei_names[ir->eI], ei_names[ir->eI]);
448 else
450 sprintf(warn_buf, "Setting tcoupl from '%s' to 'no'. Temperature coupling does not apply to %s.", etcoupl_names[ir->etc], ei_names[ir->eI]);
452 warning_note(wi, warn_buf);
454 ir->etc = etcNO;
456 if (ir->eI == eiVVAK)
458 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]);
459 warning_note(wi, warn_buf);
461 if (!EI_DYNAMICS(ir->eI))
463 if (ir->epc != epcNO)
465 sprintf(warn_buf, "Setting pcoupl from '%s' to 'no'. Pressure coupling does not apply to %s.", epcoupl_names[ir->epc], ei_names[ir->eI]);
466 warning_note(wi, warn_buf);
468 ir->epc = epcNO;
470 if (EI_DYNAMICS(ir->eI))
472 if (ir->nstcalcenergy < 0)
474 ir->nstcalcenergy = ir_optimal_nstcalcenergy(ir);
475 if (ir->nstenergy != 0 && ir->nstenergy < ir->nstcalcenergy)
477 /* nstcalcenergy larger than nstener does not make sense.
478 * We ideally want nstcalcenergy=nstener.
480 if (ir->nstlist > 0)
482 ir->nstcalcenergy = lcd(ir->nstenergy, ir->nstlist);
484 else
486 ir->nstcalcenergy = ir->nstenergy;
490 else if ( (ir->nstenergy > 0 && ir->nstcalcenergy > ir->nstenergy) ||
491 (ir->efep != efepNO && ir->fepvals->nstdhdl > 0 &&
492 (ir->nstcalcenergy > ir->fepvals->nstdhdl) ) )
495 const char *nsten = "nstenergy";
496 const char *nstdh = "nstdhdl";
497 const char *min_name = nsten;
498 int min_nst = ir->nstenergy;
500 /* find the smallest of ( nstenergy, nstdhdl ) */
501 if (ir->efep != efepNO && ir->fepvals->nstdhdl > 0 &&
502 (ir->nstenergy == 0 || ir->fepvals->nstdhdl < ir->nstenergy))
504 min_nst = ir->fepvals->nstdhdl;
505 min_name = nstdh;
507 /* If the user sets nstenergy small, we should respect that */
508 sprintf(warn_buf,
509 "Setting nstcalcenergy (%d) equal to %s (%d)",
510 ir->nstcalcenergy, min_name, min_nst);
511 warning_note(wi, warn_buf);
512 ir->nstcalcenergy = min_nst;
515 if (ir->epc != epcNO)
517 if (ir->nstpcouple < 0)
519 ir->nstpcouple = ir_optimal_nstpcouple(ir);
523 if (ir->nstcalcenergy > 0)
525 if (ir->efep != efepNO)
527 /* nstdhdl should be a multiple of nstcalcenergy */
528 check_nst("nstcalcenergy", ir->nstcalcenergy,
529 "nstdhdl", &ir->fepvals->nstdhdl, wi);
530 /* nstexpanded should be a multiple of nstcalcenergy */
531 check_nst("nstcalcenergy", ir->nstcalcenergy,
532 "nstexpanded", &ir->expandedvals->nstexpanded, wi);
534 /* for storing exact averages nstenergy should be
535 * a multiple of nstcalcenergy
537 check_nst("nstcalcenergy", ir->nstcalcenergy,
538 "nstenergy", &ir->nstenergy, wi);
542 if (ir->nsteps == 0 && !ir->bContinuation)
544 warning_note(wi, "For a correct single-point energy evaluation with nsteps = 0, use continuation = yes to avoid constraining the input coordinates.");
547 /* LD STUFF */
548 if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
549 ir->bContinuation && ir->ld_seed != -1)
551 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)");
554 /* TPI STUFF */
555 if (EI_TPI(ir->eI))
557 sprintf(err_buf, "TPI only works with pbc = %s", epbc_names[epbcXYZ]);
558 CHECK(ir->ePBC != epbcXYZ);
559 sprintf(err_buf, "TPI only works with ns = %s", ens_names[ensGRID]);
560 CHECK(ir->ns_type != ensGRID);
561 sprintf(err_buf, "with TPI nstlist should be larger than zero");
562 CHECK(ir->nstlist <= 0);
563 sprintf(err_buf, "TPI does not work with full electrostatics other than PME");
564 CHECK(EEL_FULL(ir->coulombtype) && !EEL_PME(ir->coulombtype));
565 sprintf(err_buf, "TPI does not work (yet) with the Verlet cut-off scheme");
566 CHECK(ir->cutoff_scheme == ecutsVERLET);
569 /* SHAKE / LINCS */
570 if ( (opts->nshake > 0) && (opts->bMorse) )
572 sprintf(warn_buf,
573 "Using morse bond-potentials while constraining bonds is useless");
574 warning(wi, warn_buf);
577 if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
578 ir->bContinuation && ir->ld_seed != -1)
580 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)");
582 /* verify simulated tempering options */
584 if (ir->bSimTemp)
586 gmx_bool bAllTempZero = TRUE;
587 for (i = 0; i < fep->n_lambda; i++)
589 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]);
590 CHECK((fep->all_lambda[efptTEMPERATURE][i] < 0) || (fep->all_lambda[efptTEMPERATURE][i] > 1));
591 if (fep->all_lambda[efptTEMPERATURE][i] > 0)
593 bAllTempZero = FALSE;
596 sprintf(err_buf, "if simulated tempering is on, temperature-lambdas may not be all zero");
597 CHECK(bAllTempZero == TRUE);
599 sprintf(err_buf, "Simulated tempering is currently only compatible with md-vv");
600 CHECK(ir->eI != eiVV);
602 /* check compatability of the temperature coupling with simulated tempering */
604 if (ir->etc == etcNOSEHOOVER)
606 sprintf(warn_buf, "Nose-Hoover based temperature control such as [%s] my not be entirelyconsistent with simulated tempering", etcoupl_names[ir->etc]);
607 warning_note(wi, warn_buf);
610 /* check that the temperatures make sense */
612 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);
613 CHECK(ir->simtempvals->simtemp_high <= ir->simtempvals->simtemp_low);
615 sprintf(err_buf, "Higher simulated tempering temperature (%g) must be >= zero", ir->simtempvals->simtemp_high);
616 CHECK(ir->simtempvals->simtemp_high <= 0);
618 sprintf(err_buf, "Lower simulated tempering temperature (%g) must be >= zero", ir->simtempvals->simtemp_low);
619 CHECK(ir->simtempvals->simtemp_low <= 0);
622 /* verify free energy options */
624 if (ir->efep != efepNO)
626 fep = ir->fepvals;
627 sprintf(err_buf, "The soft-core power is %d and can only be 1 or 2",
628 fep->sc_power);
629 CHECK(fep->sc_alpha != 0 && fep->sc_power != 1 && fep->sc_power != 2);
631 sprintf(err_buf, "The soft-core sc-r-power is %d and can only be 6 or 48",
632 (int)fep->sc_r_power);
633 CHECK(fep->sc_alpha != 0 && fep->sc_r_power != 6.0 && fep->sc_r_power != 48.0);
635 sprintf(err_buf, "Can't use positive delta-lambda (%g) if initial state/lambda does not start at zero", fep->delta_lambda);
636 CHECK(fep->delta_lambda > 0 && ((fep->init_fep_state > 0) || (fep->init_lambda > 0)));
638 sprintf(err_buf, "Can't use positive delta-lambda (%g) with expanded ensemble simulations", fep->delta_lambda);
639 CHECK(fep->delta_lambda > 0 && (ir->efep == efepEXPANDED));
641 sprintf(err_buf, "Can only use expanded ensemble with md-vv (for now)");
642 CHECK(!(EI_VV(ir->eI)) && (ir->efep == efepEXPANDED));
644 sprintf(err_buf, "Free-energy not implemented for Ewald");
645 CHECK(ir->coulombtype == eelEWALD);
647 /* check validty of lambda inputs */
648 if (fep->n_lambda == 0)
650 /* Clear output in case of no states:*/
651 sprintf(err_buf, "init-lambda-state set to %d: no lambda states are defined.", fep->init_fep_state);
652 CHECK((fep->init_fep_state >= 0) && (fep->n_lambda == 0));
654 else
656 sprintf(err_buf, "initial thermodynamic state %d does not exist, only goes to %d", fep->init_fep_state, fep->n_lambda-1);
657 CHECK((fep->init_fep_state >= fep->n_lambda));
660 sprintf(err_buf, "Lambda state must be set, either with init-lambda-state or with init-lambda");
661 CHECK((fep->init_fep_state < 0) && (fep->init_lambda < 0));
663 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",
664 fep->init_lambda, fep->init_fep_state);
665 CHECK((fep->init_fep_state >= 0) && (fep->init_lambda >= 0));
669 if ((fep->init_lambda >= 0) && (fep->delta_lambda == 0))
671 int n_lambda_terms;
672 n_lambda_terms = 0;
673 for (i = 0; i < efptNR; i++)
675 if (fep->separate_dvdl[i])
677 n_lambda_terms++;
680 if (n_lambda_terms > 1)
682 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.");
683 warning(wi, warn_buf);
686 if (n_lambda_terms < 2 && fep->n_lambda > 0)
688 warning_note(wi,
689 "init-lambda is deprecated for setting lambda state (except for slow growth). Use init-lambda-state instead.");
693 for (j = 0; j < efptNR; j++)
695 for (i = 0; i < fep->n_lambda; i++)
697 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]);
698 CHECK((fep->all_lambda[j][i] < 0) || (fep->all_lambda[j][i] > 1));
702 if ((fep->sc_alpha > 0) && (!fep->bScCoul))
704 for (i = 0; i < fep->n_lambda; i++)
706 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],
707 fep->all_lambda[efptCOUL][i]);
708 CHECK((fep->sc_alpha > 0) &&
709 (((fep->all_lambda[efptCOUL][i] > 0.0) &&
710 (fep->all_lambda[efptCOUL][i] < 1.0)) &&
711 ((fep->all_lambda[efptVDW][i] > 0.0) &&
712 (fep->all_lambda[efptVDW][i] < 1.0))));
716 if ((fep->bScCoul) && (EEL_PME(ir->coulombtype)))
718 real sigma, lambda, r_sc;
720 sigma = 0.34;
721 /* Maximum estimate for A and B charges equal with lambda power 1 */
722 lambda = 0.5;
723 r_sc = std::pow(lambda*fep->sc_alpha*std::pow(sigma/ir->rcoulomb, fep->sc_r_power) + 1.0, 1.0/fep->sc_r_power);
724 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.",
725 fep->sc_r_power,
726 sigma, lambda, r_sc - 1.0, ir->ewald_rtol);
727 warning_note(wi, warn_buf);
730 /* Free Energy Checks -- In an ideal world, slow growth and FEP would
731 be treated differently, but that's the next step */
733 for (i = 0; i < efptNR; i++)
735 for (j = 0; j < fep->n_lambda; j++)
737 sprintf(err_buf, "%s[%d] must be between 0 and 1", efpt_names[i], j);
738 CHECK((fep->all_lambda[i][j] < 0) || (fep->all_lambda[i][j] > 1));
743 if ((ir->bSimTemp) || (ir->efep == efepEXPANDED))
745 fep = ir->fepvals;
747 /* checking equilibration of weights inputs for validity */
749 sprintf(err_buf, "weight-equil-number-all-lambda (%d) is ignored if lmc-weights-equil is not equal to %s",
750 expand->equil_n_at_lam, elmceq_names[elmceqNUMATLAM]);
751 CHECK((expand->equil_n_at_lam > 0) && (expand->elmceq != elmceqNUMATLAM));
753 sprintf(err_buf, "weight-equil-number-samples (%d) is ignored if lmc-weights-equil is not equal to %s",
754 expand->equil_samples, elmceq_names[elmceqSAMPLES]);
755 CHECK((expand->equil_samples > 0) && (expand->elmceq != elmceqSAMPLES));
757 sprintf(err_buf, "weight-equil-number-steps (%d) is ignored if lmc-weights-equil is not equal to %s",
758 expand->equil_steps, elmceq_names[elmceqSTEPS]);
759 CHECK((expand->equil_steps > 0) && (expand->elmceq != elmceqSTEPS));
761 sprintf(err_buf, "weight-equil-wl-delta (%d) is ignored if lmc-weights-equil is not equal to %s",
762 expand->equil_samples, elmceq_names[elmceqWLDELTA]);
763 CHECK((expand->equil_wl_delta > 0) && (expand->elmceq != elmceqWLDELTA));
765 sprintf(err_buf, "weight-equil-count-ratio (%f) is ignored if lmc-weights-equil is not equal to %s",
766 expand->equil_ratio, elmceq_names[elmceqRATIO]);
767 CHECK((expand->equil_ratio > 0) && (expand->elmceq != elmceqRATIO));
769 sprintf(err_buf, "weight-equil-number-all-lambda (%d) must be a positive integer if lmc-weights-equil=%s",
770 expand->equil_n_at_lam, elmceq_names[elmceqNUMATLAM]);
771 CHECK((expand->equil_n_at_lam <= 0) && (expand->elmceq == elmceqNUMATLAM));
773 sprintf(err_buf, "weight-equil-number-samples (%d) must be a positive integer if lmc-weights-equil=%s",
774 expand->equil_samples, elmceq_names[elmceqSAMPLES]);
775 CHECK((expand->equil_samples <= 0) && (expand->elmceq == elmceqSAMPLES));
777 sprintf(err_buf, "weight-equil-number-steps (%d) must be a positive integer if lmc-weights-equil=%s",
778 expand->equil_steps, elmceq_names[elmceqSTEPS]);
779 CHECK((expand->equil_steps <= 0) && (expand->elmceq == elmceqSTEPS));
781 sprintf(err_buf, "weight-equil-wl-delta (%f) must be > 0 if lmc-weights-equil=%s",
782 expand->equil_wl_delta, elmceq_names[elmceqWLDELTA]);
783 CHECK((expand->equil_wl_delta <= 0) && (expand->elmceq == elmceqWLDELTA));
785 sprintf(err_buf, "weight-equil-count-ratio (%f) must be > 0 if lmc-weights-equil=%s",
786 expand->equil_ratio, elmceq_names[elmceqRATIO]);
787 CHECK((expand->equil_ratio <= 0) && (expand->elmceq == elmceqRATIO));
789 sprintf(err_buf, "lmc-weights-equil=%s only possible when lmc-stats = %s or lmc-stats %s",
790 elmceq_names[elmceqWLDELTA], elamstats_names[elamstatsWL], elamstats_names[elamstatsWWL]);
791 CHECK((expand->elmceq == elmceqWLDELTA) && (!EWL(expand->elamstats)));
793 sprintf(err_buf, "lmc-repeats (%d) must be greater than 0", expand->lmc_repeats);
794 CHECK((expand->lmc_repeats <= 0));
795 sprintf(err_buf, "minimum-var-min (%d) must be greater than 0", expand->minvarmin);
796 CHECK((expand->minvarmin <= 0));
797 sprintf(err_buf, "weight-c-range (%d) must be greater or equal to 0", expand->c_range);
798 CHECK((expand->c_range < 0));
799 sprintf(err_buf, "init-lambda-state (%d) must be zero if lmc-forced-nstart (%d)> 0 and lmc-move != 'no'",
800 fep->init_fep_state, expand->lmc_forced_nstart);
801 CHECK((fep->init_fep_state != 0) && (expand->lmc_forced_nstart > 0) && (expand->elmcmove != elmcmoveNO));
802 sprintf(err_buf, "lmc-forced-nstart (%d) must not be negative", expand->lmc_forced_nstart);
803 CHECK((expand->lmc_forced_nstart < 0));
804 sprintf(err_buf, "init-lambda-state (%d) must be in the interval [0,number of lambdas)", fep->init_fep_state);
805 CHECK((fep->init_fep_state < 0) || (fep->init_fep_state >= fep->n_lambda));
807 sprintf(err_buf, "init-wl-delta (%f) must be greater than or equal to 0", expand->init_wl_delta);
808 CHECK((expand->init_wl_delta < 0));
809 sprintf(err_buf, "wl-ratio (%f) must be between 0 and 1", expand->wl_ratio);
810 CHECK((expand->wl_ratio <= 0) || (expand->wl_ratio >= 1));
811 sprintf(err_buf, "wl-scale (%f) must be between 0 and 1", expand->wl_scale);
812 CHECK((expand->wl_scale <= 0) || (expand->wl_scale >= 1));
814 /* if there is no temperature control, we need to specify an MC temperature */
815 sprintf(err_buf, "If there is no temperature control, and lmc-mcmove!= 'no',mc_temperature must be set to a positive number");
816 if (expand->nstTij > 0)
818 sprintf(err_buf, "nstlog must be non-zero");
819 CHECK(ir->nstlog == 0);
820 sprintf(err_buf, "nst-transition-matrix (%d) must be an integer multiple of nstlog (%d)",
821 expand->nstTij, ir->nstlog);
822 CHECK((expand->nstTij % ir->nstlog) != 0);
826 /* PBC/WALLS */
827 sprintf(err_buf, "walls only work with pbc=%s", epbc_names[epbcXY]);
828 CHECK(ir->nwall && ir->ePBC != epbcXY);
830 /* VACUUM STUFF */
831 if (ir->ePBC != epbcXYZ && ir->nwall != 2)
833 if (ir->ePBC == epbcNONE)
835 if (ir->epc != epcNO)
837 warning(wi, "Turning off pressure coupling for vacuum system");
838 ir->epc = epcNO;
841 else
843 sprintf(err_buf, "Can not have pressure coupling with pbc=%s",
844 epbc_names[ir->ePBC]);
845 CHECK(ir->epc != epcNO);
847 sprintf(err_buf, "Can not have Ewald with pbc=%s", epbc_names[ir->ePBC]);
848 CHECK(EEL_FULL(ir->coulombtype));
850 sprintf(err_buf, "Can not have dispersion correction with pbc=%s",
851 epbc_names[ir->ePBC]);
852 CHECK(ir->eDispCorr != edispcNO);
855 if (ir->rlist == 0.0)
857 sprintf(err_buf, "can only have neighborlist cut-off zero (=infinite)\n"
858 "with coulombtype = %s or coulombtype = %s\n"
859 "without periodic boundary conditions (pbc = %s) and\n"
860 "rcoulomb and rvdw set to zero",
861 eel_names[eelCUT], eel_names[eelUSER], epbc_names[epbcNONE]);
862 CHECK(((ir->coulombtype != eelCUT) && (ir->coulombtype != eelUSER)) ||
863 (ir->ePBC != epbcNONE) ||
864 (ir->rcoulomb != 0.0) || (ir->rvdw != 0.0));
866 if (ir->nstlist > 0)
868 warning_note(wi, "Simulating without cut-offs can be (slightly) faster with nstlist=0, nstype=simple and only one MPI rank");
872 /* COMM STUFF */
873 if (ir->nstcomm == 0)
875 ir->comm_mode = ecmNO;
877 if (ir->comm_mode != ecmNO)
879 if (ir->nstcomm < 0)
881 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");
882 ir->nstcomm = abs(ir->nstcomm);
885 if (ir->nstcalcenergy > 0 && ir->nstcomm < ir->nstcalcenergy)
887 warning_note(wi, "nstcomm < nstcalcenergy defeats the purpose of nstcalcenergy, setting nstcomm to nstcalcenergy");
888 ir->nstcomm = ir->nstcalcenergy;
891 if (ir->comm_mode == ecmANGULAR)
893 sprintf(err_buf, "Can not remove the rotation around the center of mass with periodic molecules");
894 CHECK(ir->bPeriodicMols);
895 if (ir->ePBC != epbcNONE)
897 warning(wi, "Removing the rotation around the center of mass in a periodic system, this can lead to artifacts. Only use this on a single (cluster of) molecules. This cluster should not cross periodic boundaries.");
902 if (EI_STATE_VELOCITY(ir->eI) && ir->ePBC == epbcNONE && ir->comm_mode != ecmANGULAR)
904 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.");
907 /* TEMPERATURE COUPLING */
908 if (ir->etc == etcYES)
910 ir->etc = etcBERENDSEN;
911 warning_note(wi, "Old option for temperature coupling given: "
912 "changing \"yes\" to \"Berendsen\"\n");
915 if ((ir->etc == etcNOSEHOOVER) || (ir->epc == epcMTTK))
917 if (ir->opts.nhchainlength < 1)
919 sprintf(warn_buf, "number of Nose-Hoover chains (currently %d) cannot be less than 1,reset to 1\n", ir->opts.nhchainlength);
920 ir->opts.nhchainlength = 1;
921 warning(wi, warn_buf);
924 if (ir->etc == etcNOSEHOOVER && !EI_VV(ir->eI) && ir->opts.nhchainlength > 1)
926 warning_note(wi, "leapfrog does not yet support Nose-Hoover chains, nhchainlength reset to 1");
927 ir->opts.nhchainlength = 1;
930 else
932 ir->opts.nhchainlength = 0;
935 if (ir->eI == eiVVAK)
937 sprintf(err_buf, "%s implemented primarily for validation, and requires nsttcouple = 1 and nstpcouple = 1.",
938 ei_names[eiVVAK]);
939 CHECK((ir->nsttcouple != 1) || (ir->nstpcouple != 1));
942 if (ETC_ANDERSEN(ir->etc))
944 sprintf(err_buf, "%s temperature control not supported for integrator %s.", etcoupl_names[ir->etc], ei_names[ir->eI]);
945 CHECK(!(EI_VV(ir->eI)));
947 if (ir->nstcomm > 0 && (ir->etc == etcANDERSEN))
949 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]);
950 warning_note(wi, warn_buf);
953 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]);
954 CHECK(ir->nstcomm > 1 && (ir->etc == etcANDERSEN));
957 if (ir->etc == etcBERENDSEN)
959 sprintf(warn_buf, "The %s thermostat does not generate the correct kinetic energy distribution. You might want to consider using the %s thermostat.",
960 ETCOUPLTYPE(ir->etc), ETCOUPLTYPE(etcVRESCALE));
961 warning_note(wi, warn_buf);
964 if ((ir->etc == etcNOSEHOOVER || ETC_ANDERSEN(ir->etc))
965 && ir->epc == epcBERENDSEN)
967 sprintf(warn_buf, "Using Berendsen pressure coupling invalidates the "
968 "true ensemble for the thermostat");
969 warning(wi, warn_buf);
972 /* PRESSURE COUPLING */
973 if (ir->epc == epcISOTROPIC)
975 ir->epc = epcBERENDSEN;
976 warning_note(wi, "Old option for pressure coupling given: "
977 "changing \"Isotropic\" to \"Berendsen\"\n");
980 if (ir->epc != epcNO)
982 dt_pcoupl = ir->nstpcouple*ir->delta_t;
984 sprintf(err_buf, "tau-p must be > 0 instead of %g\n", ir->tau_p);
985 CHECK(ir->tau_p <= 0);
987 if (ir->tau_p/dt_pcoupl < pcouple_min_integration_steps(ir->epc) - 10*GMX_REAL_EPS)
989 sprintf(warn_buf, "For proper integration of the %s barostat, tau-p (%g) should be at least %d times larger than nstpcouple*dt (%g)",
990 EPCOUPLTYPE(ir->epc), ir->tau_p, pcouple_min_integration_steps(ir->epc), dt_pcoupl);
991 warning(wi, warn_buf);
994 sprintf(err_buf, "compressibility must be > 0 when using pressure"
995 " coupling %s\n", EPCOUPLTYPE(ir->epc));
996 CHECK(ir->compress[XX][XX] < 0 || ir->compress[YY][YY] < 0 ||
997 ir->compress[ZZ][ZZ] < 0 ||
998 (trace(ir->compress) == 0 && ir->compress[YY][XX] <= 0 &&
999 ir->compress[ZZ][XX] <= 0 && ir->compress[ZZ][YY] <= 0));
1001 if (epcPARRINELLORAHMAN == ir->epc && opts->bGenVel)
1003 sprintf(warn_buf,
1004 "You are generating velocities so I am assuming you "
1005 "are equilibrating a system. You are using "
1006 "%s pressure coupling, but this can be "
1007 "unstable for equilibration. If your system crashes, try "
1008 "equilibrating first with Berendsen pressure coupling. If "
1009 "you are not equilibrating the system, you can probably "
1010 "ignore this warning.",
1011 epcoupl_names[ir->epc]);
1012 warning(wi, warn_buf);
1016 if (EI_VV(ir->eI))
1018 if (ir->epc > epcNO)
1020 if ((ir->epc != epcBERENDSEN) && (ir->epc != epcMTTK))
1022 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.");
1026 else
1028 if (ir->epc == epcMTTK)
1030 warning_error(wi, "MTTK pressure coupling requires a Velocity-verlet integrator");
1034 /* ELECTROSTATICS */
1035 /* More checks are in triple check (grompp.c) */
1037 if (ir->coulombtype == eelSWITCH)
1039 sprintf(warn_buf, "coulombtype = %s is only for testing purposes and can lead to serious "
1040 "artifacts, advice: use coulombtype = %s",
1041 eel_names[ir->coulombtype],
1042 eel_names[eelRF_ZERO]);
1043 warning(wi, warn_buf);
1046 if (ir->epsilon_r != 1 && ir->implicit_solvent == eisGBSA)
1048 sprintf(warn_buf, "epsilon-r = %g with GB implicit solvent, will use this value for inner dielectric", ir->epsilon_r);
1049 warning_note(wi, warn_buf);
1052 if (EEL_RF(ir->coulombtype) && ir->epsilon_rf == 1 && ir->epsilon_r != 1)
1054 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);
1055 warning(wi, warn_buf);
1056 ir->epsilon_rf = ir->epsilon_r;
1057 ir->epsilon_r = 1.0;
1060 if (ir->epsilon_r == 0)
1062 sprintf(err_buf,
1063 "It is pointless to use long-range or Generalized Born electrostatics with infinite relative permittivity."
1064 "Since you are effectively turning of electrostatics, a plain cutoff will be much faster.");
1065 CHECK(EEL_FULL(ir->coulombtype) || ir->implicit_solvent == eisGBSA);
1068 if (getenv("GMX_DO_GALACTIC_DYNAMICS") == nullptr)
1070 sprintf(err_buf, "epsilon-r must be >= 0 instead of %g\n", ir->epsilon_r);
1071 CHECK(ir->epsilon_r < 0);
1074 if (EEL_RF(ir->coulombtype))
1076 /* reaction field (at the cut-off) */
1078 if (ir->coulombtype == eelRF_ZERO && ir->epsilon_rf != 0)
1080 sprintf(warn_buf, "With coulombtype = %s, epsilon-rf must be 0, assuming you meant epsilon_rf=0",
1081 eel_names[ir->coulombtype]);
1082 warning(wi, warn_buf);
1083 ir->epsilon_rf = 0.0;
1086 sprintf(err_buf, "epsilon-rf must be >= epsilon-r");
1087 CHECK((ir->epsilon_rf < ir->epsilon_r && ir->epsilon_rf != 0) ||
1088 (ir->epsilon_r == 0));
1089 if (ir->epsilon_rf == ir->epsilon_r)
1091 sprintf(warn_buf, "Using epsilon-rf = epsilon-r with %s does not make sense",
1092 eel_names[ir->coulombtype]);
1093 warning(wi, warn_buf);
1096 /* Allow rlist>rcoulomb for tabulated long range stuff. This just
1097 * means the interaction is zero outside rcoulomb, but it helps to
1098 * provide accurate energy conservation.
1100 if (ir_coulomb_might_be_zero_at_cutoff(ir))
1102 if (ir_coulomb_switched(ir))
1104 sprintf(err_buf,
1105 "With coulombtype = %s rcoulomb_switch must be < rcoulomb. Or, better: Use the potential modifier options!",
1106 eel_names[ir->coulombtype]);
1107 CHECK(ir->rcoulomb_switch >= ir->rcoulomb);
1110 else if (ir->coulombtype == eelCUT || EEL_RF(ir->coulombtype))
1112 if (ir->cutoff_scheme == ecutsGROUP && ir->coulomb_modifier == eintmodNONE)
1114 sprintf(err_buf, "With coulombtype = %s, rcoulomb should be >= rlist unless you use a potential modifier",
1115 eel_names[ir->coulombtype]);
1116 CHECK(ir->rlist > ir->rcoulomb);
1120 if (ir->coulombtype == eelSWITCH || ir->coulombtype == eelSHIFT)
1122 sprintf(err_buf,
1123 "Explicit switch/shift coulomb interactions cannot be used in combination with a secondary coulomb-modifier.");
1124 CHECK( ir->coulomb_modifier != eintmodNONE);
1126 if (ir->vdwtype == evdwSWITCH || ir->vdwtype == evdwSHIFT)
1128 sprintf(err_buf,
1129 "Explicit switch/shift vdw interactions cannot be used in combination with a secondary vdw-modifier.");
1130 CHECK( ir->vdw_modifier != eintmodNONE);
1133 if (ir->coulombtype == eelSWITCH || ir->coulombtype == eelSHIFT ||
1134 ir->vdwtype == evdwSWITCH || ir->vdwtype == evdwSHIFT)
1136 sprintf(warn_buf,
1137 "The switch/shift interaction settings are just for compatibility; you will get better "
1138 "performance from applying potential modifiers to your interactions!\n");
1139 warning_note(wi, warn_buf);
1142 if (ir->coulombtype == eelPMESWITCH || ir->coulomb_modifier == eintmodPOTSWITCH)
1144 if (ir->rcoulomb_switch/ir->rcoulomb < 0.9499)
1146 real percentage = 100*(ir->rcoulomb-ir->rcoulomb_switch)/ir->rcoulomb;
1147 sprintf(warn_buf, "The switching range should be 5%% or less (currently %.2f%% using a switching range of %4f-%4f) for accurate electrostatic energies, energy conservation will be good regardless, since ewald_rtol = %g.",
1148 percentage, ir->rcoulomb_switch, ir->rcoulomb, ir->ewald_rtol);
1149 warning(wi, warn_buf);
1153 if (ir->vdwtype == evdwSWITCH || ir->vdw_modifier == eintmodPOTSWITCH)
1155 if (ir->rvdw_switch == 0)
1157 sprintf(warn_buf, "rvdw-switch is equal 0 even though you are using a switched Lennard-Jones potential. This suggests it was not set in the mdp, which can lead to large energy errors. In GROMACS, 0.05 to 0.1 nm is often a reasonable vdw switching range.");
1158 warning(wi, warn_buf);
1162 if (EEL_FULL(ir->coulombtype))
1164 if (ir->coulombtype == eelPMESWITCH || ir->coulombtype == eelPMEUSER ||
1165 ir->coulombtype == eelPMEUSERSWITCH)
1167 sprintf(err_buf, "With coulombtype = %s, rcoulomb must be <= rlist",
1168 eel_names[ir->coulombtype]);
1169 CHECK(ir->rcoulomb > ir->rlist);
1171 else if (ir->cutoff_scheme == ecutsGROUP && ir->coulomb_modifier == eintmodNONE)
1173 if (ir->coulombtype == eelPME || ir->coulombtype == eelP3M_AD)
1175 sprintf(err_buf,
1176 "With coulombtype = %s (without modifier), rcoulomb must be equal to rlist.\n"
1177 "For optimal energy conservation,consider using\n"
1178 "a potential modifier.", eel_names[ir->coulombtype]);
1179 CHECK(ir->rcoulomb != ir->rlist);
1184 if (EEL_PME(ir->coulombtype) || EVDW_PME(ir->vdwtype))
1186 // TODO: Move these checks into the ewald module with the options class
1187 int orderMin = 3;
1188 int orderMax = (ir->coulombtype == eelP3M_AD ? 8 : 12);
1190 if (ir->pme_order < orderMin || ir->pme_order > orderMax)
1192 sprintf(warn_buf, "With coulombtype = %s, you should have %d <= pme-order <= %d", eel_names[ir->coulombtype], orderMin, orderMax);
1193 warning_error(wi, warn_buf);
1197 if (ir->nwall == 2 && EEL_FULL(ir->coulombtype))
1199 if (ir->ewald_geometry == eewg3D)
1201 sprintf(warn_buf, "With pbc=%s you should use ewald-geometry=%s",
1202 epbc_names[ir->ePBC], eewg_names[eewg3DC]);
1203 warning(wi, warn_buf);
1205 /* This check avoids extra pbc coding for exclusion corrections */
1206 sprintf(err_buf, "wall-ewald-zfac should be >= 2");
1207 CHECK(ir->wall_ewald_zfac < 2);
1209 if ((ir->ewald_geometry == eewg3DC) && (ir->ePBC != epbcXY) &&
1210 EEL_FULL(ir->coulombtype))
1212 sprintf(warn_buf, "With %s and ewald_geometry = %s you should use pbc = %s",
1213 eel_names[ir->coulombtype], eewg_names[eewg3DC], epbc_names[epbcXY]);
1214 warning(wi, warn_buf);
1216 if ((ir->epsilon_surface != 0) && EEL_FULL(ir->coulombtype))
1218 if (ir->cutoff_scheme == ecutsVERLET)
1220 sprintf(warn_buf, "Since molecules/charge groups are broken using the Verlet scheme, you can not use a dipole correction to the %s electrostatics.",
1221 eel_names[ir->coulombtype]);
1222 warning(wi, warn_buf);
1224 else
1226 sprintf(warn_buf, "Dipole corrections to %s electrostatics only work if all charge groups that can cross PBC boundaries are dipoles. If this is not the case set epsilon_surface to 0",
1227 eel_names[ir->coulombtype]);
1228 warning_note(wi, warn_buf);
1232 if (ir_vdw_switched(ir))
1234 sprintf(err_buf, "With switched vdw forces or potentials, rvdw-switch must be < rvdw");
1235 CHECK(ir->rvdw_switch >= ir->rvdw);
1237 if (ir->rvdw_switch < 0.5*ir->rvdw)
1239 sprintf(warn_buf, "You are applying a switch function to vdw forces or potentials from %g to %g nm, which is more than half the interaction range, whereas switch functions are intended to act only close to the cut-off.",
1240 ir->rvdw_switch, ir->rvdw);
1241 warning_note(wi, warn_buf);
1244 else if (ir->vdwtype == evdwCUT || ir->vdwtype == evdwPME)
1246 if (ir->cutoff_scheme == ecutsGROUP && ir->vdw_modifier == eintmodNONE)
1248 sprintf(err_buf, "With vdwtype = %s, rvdw must be >= rlist unless you use a potential modifier", evdw_names[ir->vdwtype]);
1249 CHECK(ir->rlist > ir->rvdw);
1253 if (ir->vdwtype == evdwPME)
1255 if (!(ir->vdw_modifier == eintmodNONE || ir->vdw_modifier == eintmodPOTSHIFT))
1257 sprintf(err_buf, "With vdwtype = %s, the only supported modifiers are %s and %s",
1258 evdw_names[ir->vdwtype],
1259 eintmod_names[eintmodPOTSHIFT],
1260 eintmod_names[eintmodNONE]);
1261 warning_error(wi, err_buf);
1265 if (ir->cutoff_scheme == ecutsGROUP)
1267 if (((ir->coulomb_modifier != eintmodNONE && ir->rcoulomb == ir->rlist) ||
1268 (ir->vdw_modifier != eintmodNONE && ir->rvdw == ir->rlist)))
1270 warning_note(wi, "With exact cut-offs, rlist should be "
1271 "larger than rcoulomb and rvdw, so that there "
1272 "is a buffer region for particle motion "
1273 "between neighborsearch steps");
1276 if (ir_coulomb_is_zero_at_cutoff(ir) && ir->rlist <= ir->rcoulomb)
1278 sprintf(warn_buf, "For energy conservation with switch/shift potentials, rlist should be 0.1 to 0.3 nm larger than rcoulomb.");
1279 warning_note(wi, warn_buf);
1281 if (ir_vdw_switched(ir) && (ir->rlist <= ir->rvdw))
1283 sprintf(warn_buf, "For energy conservation with switch/shift potentials, rlist should be 0.1 to 0.3 nm larger than rvdw.");
1284 warning_note(wi, warn_buf);
1288 if (ir->vdwtype == evdwUSER && ir->eDispCorr != edispcNO)
1290 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.");
1293 if (ir->eI == eiLBFGS && (ir->coulombtype == eelCUT || ir->vdwtype == evdwCUT)
1294 && ir->rvdw != 0)
1296 warning(wi, "For efficient BFGS minimization, use switch/shift/pme instead of cut-off.");
1299 if (ir->eI == eiLBFGS && ir->nbfgscorr <= 0)
1301 warning(wi, "Using L-BFGS with nbfgscorr<=0 just gets you steepest descent.");
1304 /* ENERGY CONSERVATION */
1305 if (ir_NVE(ir) && ir->cutoff_scheme == ecutsGROUP)
1307 if (!ir_vdw_might_be_zero_at_cutoff(ir) && ir->rvdw > 0 && ir->vdw_modifier == eintmodNONE)
1309 sprintf(warn_buf, "You are using a cut-off for VdW interactions with NVE, for good energy conservation use vdwtype = %s (possibly with DispCorr)",
1310 evdw_names[evdwSHIFT]);
1311 warning_note(wi, warn_buf);
1313 if (!ir_coulomb_might_be_zero_at_cutoff(ir) && ir->rcoulomb > 0)
1315 sprintf(warn_buf, "You are using a cut-off for electrostatics with NVE, for good energy conservation use coulombtype = %s or %s",
1316 eel_names[eelPMESWITCH], eel_names[eelRF_ZERO]);
1317 warning_note(wi, warn_buf);
1321 /* IMPLICIT SOLVENT */
1322 if (ir->coulombtype == eelGB_NOTUSED)
1324 sprintf(warn_buf, "Invalid option %s for coulombtype",
1325 eel_names[ir->coulombtype]);
1326 warning_error(wi, warn_buf);
1329 if (ir->sa_algorithm == esaSTILL)
1331 sprintf(err_buf, "Still SA algorithm not available yet, use %s or %s instead\n", esa_names[esaAPPROX], esa_names[esaNO]);
1332 CHECK(ir->sa_algorithm == esaSTILL);
1335 if (ir->implicit_solvent == eisGBSA)
1337 sprintf(err_buf, "With GBSA implicit solvent, rgbradii must be equal to rlist.");
1338 CHECK(ir->rgbradii != ir->rlist);
1340 if (ir->coulombtype != eelCUT)
1342 sprintf(err_buf, "With GBSA, coulombtype must be equal to %s\n", eel_names[eelCUT]);
1343 CHECK(ir->coulombtype != eelCUT);
1345 if (ir->vdwtype != evdwCUT)
1347 sprintf(err_buf, "With GBSA, vdw-type must be equal to %s\n", evdw_names[evdwCUT]);
1348 CHECK(ir->vdwtype != evdwCUT);
1350 if (ir->nstgbradii < 1)
1352 sprintf(warn_buf, "Using GBSA with nstgbradii<1, setting nstgbradii=1");
1353 warning_note(wi, warn_buf);
1354 ir->nstgbradii = 1;
1356 if (ir->sa_algorithm == esaNO)
1358 sprintf(warn_buf, "No SA (non-polar) calculation requested together with GB. Are you sure this is what you want?\n");
1359 warning_note(wi, warn_buf);
1361 if (ir->sa_surface_tension < 0 && ir->sa_algorithm != esaNO)
1363 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");
1364 warning_note(wi, warn_buf);
1366 if (ir->gb_algorithm == egbSTILL)
1368 ir->sa_surface_tension = 0.0049 * CAL2JOULE * 100;
1370 else
1372 ir->sa_surface_tension = 0.0054 * CAL2JOULE * 100;
1375 if (ir->sa_surface_tension == 0 && ir->sa_algorithm != esaNO)
1377 sprintf(err_buf, "Surface tension set to 0 while SA-calculation requested\n");
1378 CHECK(ir->sa_surface_tension == 0 && ir->sa_algorithm != esaNO);
1383 if (ir->bQMMM)
1385 if (ir->cutoff_scheme != ecutsGROUP)
1387 warning_error(wi, "QMMM is currently only supported with cutoff-scheme=group");
1389 if (!EI_DYNAMICS(ir->eI))
1391 char buf[STRLEN];
1392 sprintf(buf, "QMMM is only supported with dynamics, not with integrator %s", ei_names[ir->eI]);
1393 warning_error(wi, buf);
1397 if (ir->bAdress)
1399 gmx_fatal(FARGS, "AdResS simulations are no longer supported");
1403 /* count the number of text elemets separated by whitespace in a string.
1404 str = the input string
1405 maxptr = the maximum number of allowed elements
1406 ptr = the output array of pointers to the first character of each element
1407 returns: the number of elements. */
1408 int str_nelem(const char *str, int maxptr, char *ptr[])
1410 int np = 0;
1411 char *copy0, *copy;
1413 copy0 = gmx_strdup(str);
1414 copy = copy0;
1415 ltrim(copy);
1416 while (*copy != '\0')
1418 if (np >= maxptr)
1420 gmx_fatal(FARGS, "Too many groups on line: '%s' (max is %d)",
1421 str, maxptr);
1423 if (ptr)
1425 ptr[np] = copy;
1427 np++;
1428 while ((*copy != '\0') && !isspace(*copy))
1430 copy++;
1432 if (*copy != '\0')
1434 *copy = '\0';
1435 copy++;
1437 ltrim(copy);
1439 if (ptr == nullptr)
1441 sfree(copy0);
1444 return np;
1447 /* interpret a number of doubles from a string and put them in an array,
1448 after allocating space for them.
1449 str = the input string
1450 n = the (pre-allocated) number of doubles read
1451 r = the output array of doubles. */
1452 static void parse_n_real(char *str, int *n, real **r, warninp_t wi)
1454 char *ptr[MAXPTR];
1455 char *endptr;
1456 int i;
1457 char warn_buf[STRLEN];
1459 *n = str_nelem(str, MAXPTR, ptr);
1461 snew(*r, *n);
1462 for (i = 0; i < *n; i++)
1464 (*r)[i] = strtod(ptr[i], &endptr);
1465 if (*endptr != 0)
1467 sprintf(warn_buf, "Invalid value %s in string in mdp file. Expected a real number.", ptr[i]);
1468 warning_error(wi, warn_buf);
1473 static void do_fep_params(t_inputrec *ir, char fep_lambda[][STRLEN], char weights[STRLEN], warninp_t wi)
1476 int i, j, max_n_lambda, nweights, nfep[efptNR];
1477 t_lambda *fep = ir->fepvals;
1478 t_expanded *expand = ir->expandedvals;
1479 real **count_fep_lambdas;
1480 gmx_bool bOneLambda = TRUE;
1482 snew(count_fep_lambdas, efptNR);
1484 /* FEP input processing */
1485 /* first, identify the number of lambda values for each type.
1486 All that are nonzero must have the same number */
1488 for (i = 0; i < efptNR; i++)
1490 parse_n_real(fep_lambda[i], &(nfep[i]), &(count_fep_lambdas[i]), wi);
1493 /* now, determine the number of components. All must be either zero, or equal. */
1495 max_n_lambda = 0;
1496 for (i = 0; i < efptNR; i++)
1498 if (nfep[i] > max_n_lambda)
1500 max_n_lambda = nfep[i]; /* here's a nonzero one. All of them
1501 must have the same number if its not zero.*/
1502 break;
1506 for (i = 0; i < efptNR; i++)
1508 if (nfep[i] == 0)
1510 ir->fepvals->separate_dvdl[i] = FALSE;
1512 else if (nfep[i] == max_n_lambda)
1514 if (i != efptTEMPERATURE) /* we treat this differently -- not really a reason to compute the derivative with
1515 respect to the temperature currently */
1517 ir->fepvals->separate_dvdl[i] = TRUE;
1520 else
1522 gmx_fatal(FARGS, "Number of lambdas (%d) for FEP type %s not equal to number of other types (%d)",
1523 nfep[i], efpt_names[i], max_n_lambda);
1526 /* we don't print out dhdl if the temperature is changing, since we can't correctly define dhdl in this case */
1527 ir->fepvals->separate_dvdl[efptTEMPERATURE] = FALSE;
1529 /* the number of lambdas is the number we've read in, which is either zero
1530 or the same for all */
1531 fep->n_lambda = max_n_lambda;
1533 /* allocate space for the array of lambda values */
1534 snew(fep->all_lambda, efptNR);
1535 /* if init_lambda is defined, we need to set lambda */
1536 if ((fep->init_lambda > 0) && (fep->n_lambda == 0))
1538 ir->fepvals->separate_dvdl[efptFEP] = TRUE;
1540 /* otherwise allocate the space for all of the lambdas, and transfer the data */
1541 for (i = 0; i < efptNR; i++)
1543 snew(fep->all_lambda[i], fep->n_lambda);
1544 if (nfep[i] > 0) /* if it's zero, then the count_fep_lambda arrays
1545 are zero */
1547 for (j = 0; j < fep->n_lambda; j++)
1549 fep->all_lambda[i][j] = (double)count_fep_lambdas[i][j];
1551 sfree(count_fep_lambdas[i]);
1554 sfree(count_fep_lambdas);
1556 /* "fep-vals" is either zero or the full number. If zero, we'll need to define fep-lambdas for internal
1557 bookkeeping -- for now, init_lambda */
1559 if ((nfep[efptFEP] == 0) && (fep->init_lambda >= 0))
1561 for (i = 0; i < fep->n_lambda; i++)
1563 fep->all_lambda[efptFEP][i] = fep->init_lambda;
1567 /* check to see if only a single component lambda is defined, and soft core is defined.
1568 In this case, turn on coulomb soft core */
1570 if (max_n_lambda == 0)
1572 bOneLambda = TRUE;
1574 else
1576 for (i = 0; i < efptNR; i++)
1578 if ((nfep[i] != 0) && (i != efptFEP))
1580 bOneLambda = FALSE;
1584 if ((bOneLambda) && (fep->sc_alpha > 0))
1586 fep->bScCoul = TRUE;
1589 /* Fill in the others with the efptFEP if they are not explicitly
1590 specified (i.e. nfep[i] == 0). This means if fep is not defined,
1591 they are all zero. */
1593 for (i = 0; i < efptNR; i++)
1595 if ((nfep[i] == 0) && (i != efptFEP))
1597 for (j = 0; j < fep->n_lambda; j++)
1599 fep->all_lambda[i][j] = fep->all_lambda[efptFEP][j];
1605 /* make it easier if sc_r_power = 48 by increasing it to the 4th power, to be in the right scale. */
1606 if (fep->sc_r_power == 48)
1608 if (fep->sc_alpha > 0.1)
1610 gmx_fatal(FARGS, "sc_alpha (%f) for sc_r_power = 48 should usually be between 0.001 and 0.004", fep->sc_alpha);
1614 /* now read in the weights */
1615 parse_n_real(weights, &nweights, &(expand->init_lambda_weights), wi);
1616 if (nweights == 0)
1618 snew(expand->init_lambda_weights, fep->n_lambda); /* initialize to zero */
1620 else if (nweights != fep->n_lambda)
1622 gmx_fatal(FARGS, "Number of weights (%d) is not equal to number of lambda values (%d)",
1623 nweights, fep->n_lambda);
1625 if ((expand->nstexpanded < 0) && (ir->efep != efepNO))
1627 expand->nstexpanded = fep->nstdhdl;
1628 /* if you don't specify nstexpanded when doing expanded ensemble free energy calcs, it is set to nstdhdl */
1630 if ((expand->nstexpanded < 0) && ir->bSimTemp)
1632 expand->nstexpanded = 2*(int)(ir->opts.tau_t[0]/ir->delta_t);
1633 /* if you don't specify nstexpanded when doing expanded ensemble simulated tempering, it is set to
1634 2*tau_t just to be careful so it's not to frequent */
1639 static void do_simtemp_params(t_inputrec *ir)
1642 snew(ir->simtempvals->temperatures, ir->fepvals->n_lambda);
1643 GetSimTemps(ir->fepvals->n_lambda, ir->simtempvals, ir->fepvals->all_lambda[efptTEMPERATURE]);
1645 return;
1648 static void do_wall_params(t_inputrec *ir,
1649 char *wall_atomtype, char *wall_density,
1650 t_gromppopts *opts)
1652 int nstr, i;
1653 char *names[MAXPTR];
1654 double dbl;
1656 opts->wall_atomtype[0] = nullptr;
1657 opts->wall_atomtype[1] = nullptr;
1659 ir->wall_atomtype[0] = -1;
1660 ir->wall_atomtype[1] = -1;
1661 ir->wall_density[0] = 0;
1662 ir->wall_density[1] = 0;
1664 if (ir->nwall > 0)
1666 nstr = str_nelem(wall_atomtype, MAXPTR, names);
1667 if (nstr != ir->nwall)
1669 gmx_fatal(FARGS, "Expected %d elements for wall_atomtype, found %d",
1670 ir->nwall, nstr);
1672 for (i = 0; i < ir->nwall; i++)
1674 opts->wall_atomtype[i] = gmx_strdup(names[i]);
1677 if (ir->wall_type == ewt93 || ir->wall_type == ewt104)
1679 nstr = str_nelem(wall_density, MAXPTR, names);
1680 if (nstr != ir->nwall)
1682 gmx_fatal(FARGS, "Expected %d elements for wall-density, found %d", ir->nwall, nstr);
1684 for (i = 0; i < ir->nwall; i++)
1686 if (sscanf(names[i], "%lf", &dbl) != 1)
1688 gmx_fatal(FARGS, "Could not parse wall-density value from string '%s'", names[i]);
1690 if (dbl <= 0)
1692 gmx_fatal(FARGS, "wall-density[%d] = %f\n", i, dbl);
1694 ir->wall_density[i] = dbl;
1700 static void add_wall_energrps(gmx_groups_t *groups, int nwall, t_symtab *symtab)
1702 int i;
1703 t_grps *grps;
1704 char str[STRLEN];
1706 if (nwall > 0)
1708 srenew(groups->grpname, groups->ngrpname+nwall);
1709 grps = &(groups->grps[egcENER]);
1710 srenew(grps->nm_ind, grps->nr+nwall);
1711 for (i = 0; i < nwall; i++)
1713 sprintf(str, "wall%d", i);
1714 groups->grpname[groups->ngrpname] = put_symtab(symtab, str);
1715 grps->nm_ind[grps->nr++] = groups->ngrpname++;
1720 static void read_expandedparams(int *ninp_p, t_inpfile **inp_p,
1721 t_expanded *expand, warninp_t wi)
1723 int ninp;
1724 t_inpfile *inp;
1726 ninp = *ninp_p;
1727 inp = *inp_p;
1729 /* read expanded ensemble parameters */
1730 CCTYPE ("expanded ensemble variables");
1731 ITYPE ("nstexpanded", expand->nstexpanded, -1);
1732 EETYPE("lmc-stats", expand->elamstats, elamstats_names);
1733 EETYPE("lmc-move", expand->elmcmove, elmcmove_names);
1734 EETYPE("lmc-weights-equil", expand->elmceq, elmceq_names);
1735 ITYPE ("weight-equil-number-all-lambda", expand->equil_n_at_lam, -1);
1736 ITYPE ("weight-equil-number-samples", expand->equil_samples, -1);
1737 ITYPE ("weight-equil-number-steps", expand->equil_steps, -1);
1738 RTYPE ("weight-equil-wl-delta", expand->equil_wl_delta, -1);
1739 RTYPE ("weight-equil-count-ratio", expand->equil_ratio, -1);
1740 CCTYPE("Seed for Monte Carlo in lambda space");
1741 ITYPE ("lmc-seed", expand->lmc_seed, -1);
1742 RTYPE ("mc-temperature", expand->mc_temp, -1);
1743 ITYPE ("lmc-repeats", expand->lmc_repeats, 1);
1744 ITYPE ("lmc-gibbsdelta", expand->gibbsdeltalam, -1);
1745 ITYPE ("lmc-forced-nstart", expand->lmc_forced_nstart, 0);
1746 EETYPE("symmetrized-transition-matrix", expand->bSymmetrizedTMatrix, yesno_names);
1747 ITYPE("nst-transition-matrix", expand->nstTij, -1);
1748 ITYPE ("mininum-var-min", expand->minvarmin, 100); /*default is reasonable */
1749 ITYPE ("weight-c-range", expand->c_range, 0); /* default is just C=0 */
1750 RTYPE ("wl-scale", expand->wl_scale, 0.8);
1751 RTYPE ("wl-ratio", expand->wl_ratio, 0.8);
1752 RTYPE ("init-wl-delta", expand->init_wl_delta, 1.0);
1753 EETYPE("wl-oneovert", expand->bWLoneovert, yesno_names);
1755 *ninp_p = ninp;
1756 *inp_p = inp;
1758 return;
1761 /*! \brief Return whether an end state with the given coupling-lambda
1762 * value describes fully-interacting VDW.
1764 * \param[in] couple_lambda_value Enumeration ecouplam value describing the end state
1765 * \return Whether VDW is on (i.e. the user chose vdw or vdw-q in the .mdp file)
1767 static gmx_bool couple_lambda_has_vdw_on(int couple_lambda_value)
1769 return (couple_lambda_value == ecouplamVDW ||
1770 couple_lambda_value == ecouplamVDWQ);
1773 namespace
1776 class MdpErrorHandler : public gmx::IKeyValueTreeErrorHandler
1778 public:
1779 explicit MdpErrorHandler(warninp_t wi)
1780 : wi_(wi), mapping_(nullptr)
1784 void setBackMapping(const gmx::IKeyValueTreeBackMapping &mapping)
1786 mapping_ = &mapping;
1789 virtual bool onError(gmx::UserInputError *ex, const gmx::KeyValueTreePath &context)
1791 ex->prependContext(gmx::formatString("Error in mdp option \"%s\":",
1792 getOptionName(context).c_str()));
1793 std::string message = gmx::formatExceptionMessageToString(*ex);
1794 warning_error(wi_, message.c_str());
1795 return true;
1798 private:
1799 std::string getOptionName(const gmx::KeyValueTreePath &context)
1801 if (mapping_ != nullptr)
1803 gmx::KeyValueTreePath path = mapping_->originalPath(context);
1804 GMX_ASSERT(path.size() == 1, "Inconsistent mapping back to mdp options");
1805 return path[0];
1807 GMX_ASSERT(context.size() == 1, "Inconsistent context for mdp option parsing");
1808 return context[0];
1811 warninp_t wi_;
1812 const gmx::IKeyValueTreeBackMapping *mapping_;
1815 } // namespace
1817 void get_ir(const char *mdparin, const char *mdparout,
1818 gmx::MDModules *mdModules, t_inputrec *ir, t_gromppopts *opts,
1819 WriteMdpHeader writeMdpHeader, warninp_t wi)
1821 char *dumstr[2];
1822 double dumdub[2][6];
1823 t_inpfile *inp;
1824 const char *tmp;
1825 int i, j, m, ninp;
1826 char warn_buf[STRLEN];
1827 t_lambda *fep = ir->fepvals;
1828 t_expanded *expand = ir->expandedvals;
1830 init_inputrec_strings();
1831 gmx::TextInputFile stream(mdparin);
1832 inp = read_inpfile(&stream, mdparin, &ninp, wi);
1834 snew(dumstr[0], STRLEN);
1835 snew(dumstr[1], STRLEN);
1837 if (-1 == search_einp(ninp, inp, "cutoff-scheme"))
1839 sprintf(warn_buf,
1840 "%s did not specify a value for the .mdp option "
1841 "\"cutoff-scheme\". Probably it was first intended for use "
1842 "with GROMACS before 4.6. In 4.6, the Verlet scheme was "
1843 "introduced, but the group scheme was still the default. "
1844 "The default is now the Verlet scheme, so you will observe "
1845 "different behaviour.", mdparin);
1846 warning_note(wi, warn_buf);
1849 /* ignore the following deprecated commands */
1850 REM_TYPE("title");
1851 REM_TYPE("cpp");
1852 REM_TYPE("domain-decomposition");
1853 REM_TYPE("andersen-seed");
1854 REM_TYPE("dihre");
1855 REM_TYPE("dihre-fc");
1856 REM_TYPE("dihre-tau");
1857 REM_TYPE("nstdihreout");
1858 REM_TYPE("nstcheckpoint");
1859 REM_TYPE("optimize-fft");
1860 REM_TYPE("adress_type");
1861 REM_TYPE("adress_const_wf");
1862 REM_TYPE("adress_ex_width");
1863 REM_TYPE("adress_hy_width");
1864 REM_TYPE("adress_ex_forcecap");
1865 REM_TYPE("adress_interface_correction");
1866 REM_TYPE("adress_site");
1867 REM_TYPE("adress_reference_coords");
1868 REM_TYPE("adress_tf_grp_names");
1869 REM_TYPE("adress_cg_grp_names");
1870 REM_TYPE("adress_do_hybridpairs");
1871 REM_TYPE("rlistlong");
1872 REM_TYPE("nstcalclr");
1873 REM_TYPE("pull-print-com2");
1875 /* replace the following commands with the clearer new versions*/
1876 REPL_TYPE("unconstrained-start", "continuation");
1877 REPL_TYPE("foreign-lambda", "fep-lambdas");
1878 REPL_TYPE("verlet-buffer-drift", "verlet-buffer-tolerance");
1879 REPL_TYPE("nstxtcout", "nstxout-compressed");
1880 REPL_TYPE("xtc-grps", "compressed-x-grps");
1881 REPL_TYPE("xtc-precision", "compressed-x-precision");
1882 REPL_TYPE("pull-print-com1", "pull-print-com");
1884 CCTYPE ("VARIOUS PREPROCESSING OPTIONS");
1885 CTYPE ("Preprocessor information: use cpp syntax.");
1886 CTYPE ("e.g.: -I/home/joe/doe -I/home/mary/roe");
1887 STYPE ("include", opts->include, nullptr);
1888 CTYPE ("e.g.: -DPOSRES -DFLEXIBLE (note these variable names are case sensitive)");
1889 STYPE ("define", opts->define, nullptr);
1891 CCTYPE ("RUN CONTROL PARAMETERS");
1892 EETYPE("integrator", ir->eI, ei_names);
1893 CTYPE ("Start time and timestep in ps");
1894 RTYPE ("tinit", ir->init_t, 0.0);
1895 RTYPE ("dt", ir->delta_t, 0.001);
1896 STEPTYPE ("nsteps", ir->nsteps, 0);
1897 CTYPE ("For exact run continuation or redoing part of a run");
1898 STEPTYPE ("init-step", ir->init_step, 0);
1899 CTYPE ("Part index is updated automatically on checkpointing (keeps files separate)");
1900 ITYPE ("simulation-part", ir->simulation_part, 1);
1901 CTYPE ("mode for center of mass motion removal");
1902 EETYPE("comm-mode", ir->comm_mode, ecm_names);
1903 CTYPE ("number of steps for center of mass motion removal");
1904 ITYPE ("nstcomm", ir->nstcomm, 100);
1905 CTYPE ("group(s) for center of mass motion removal");
1906 STYPE ("comm-grps", is->vcm, nullptr);
1908 CCTYPE ("LANGEVIN DYNAMICS OPTIONS");
1909 CTYPE ("Friction coefficient (amu/ps) and random seed");
1910 RTYPE ("bd-fric", ir->bd_fric, 0.0);
1911 STEPTYPE ("ld-seed", ir->ld_seed, -1);
1913 /* Em stuff */
1914 CCTYPE ("ENERGY MINIMIZATION OPTIONS");
1915 CTYPE ("Force tolerance and initial step-size");
1916 RTYPE ("emtol", ir->em_tol, 10.0);
1917 RTYPE ("emstep", ir->em_stepsize, 0.01);
1918 CTYPE ("Max number of iterations in relax-shells");
1919 ITYPE ("niter", ir->niter, 20);
1920 CTYPE ("Step size (ps^2) for minimization of flexible constraints");
1921 RTYPE ("fcstep", ir->fc_stepsize, 0);
1922 CTYPE ("Frequency of steepest descents steps when doing CG");
1923 ITYPE ("nstcgsteep", ir->nstcgsteep, 1000);
1924 ITYPE ("nbfgscorr", ir->nbfgscorr, 10);
1926 CCTYPE ("TEST PARTICLE INSERTION OPTIONS");
1927 RTYPE ("rtpi", ir->rtpi, 0.05);
1929 /* Output options */
1930 CCTYPE ("OUTPUT CONTROL OPTIONS");
1931 CTYPE ("Output frequency for coords (x), velocities (v) and forces (f)");
1932 ITYPE ("nstxout", ir->nstxout, 0);
1933 ITYPE ("nstvout", ir->nstvout, 0);
1934 ITYPE ("nstfout", ir->nstfout, 0);
1935 CTYPE ("Output frequency for energies to log file and energy file");
1936 ITYPE ("nstlog", ir->nstlog, 1000);
1937 ITYPE ("nstcalcenergy", ir->nstcalcenergy, 100);
1938 ITYPE ("nstenergy", ir->nstenergy, 1000);
1939 CTYPE ("Output frequency and precision for .xtc file");
1940 ITYPE ("nstxout-compressed", ir->nstxout_compressed, 0);
1941 RTYPE ("compressed-x-precision", ir->x_compression_precision, 1000.0);
1942 CTYPE ("This selects the subset of atoms for the compressed");
1943 CTYPE ("trajectory file. You can select multiple groups. By");
1944 CTYPE ("default, all atoms will be written.");
1945 STYPE ("compressed-x-grps", is->x_compressed_groups, nullptr);
1946 CTYPE ("Selection of energy groups");
1947 STYPE ("energygrps", is->energy, nullptr);
1949 /* Neighbor searching */
1950 CCTYPE ("NEIGHBORSEARCHING PARAMETERS");
1951 CTYPE ("cut-off scheme (Verlet: particle based cut-offs, group: using charge groups)");
1952 EETYPE("cutoff-scheme", ir->cutoff_scheme, ecutscheme_names);
1953 CTYPE ("nblist update frequency");
1954 ITYPE ("nstlist", ir->nstlist, 10);
1955 CTYPE ("ns algorithm (simple or grid)");
1956 EETYPE("ns-type", ir->ns_type, ens_names);
1957 CTYPE ("Periodic boundary conditions: xyz, no, xy");
1958 EETYPE("pbc", ir->ePBC, epbc_names);
1959 EETYPE("periodic-molecules", ir->bPeriodicMols, yesno_names);
1960 CTYPE ("Allowed energy error due to the Verlet buffer in kJ/mol/ps per atom,");
1961 CTYPE ("a value of -1 means: use rlist");
1962 RTYPE("verlet-buffer-tolerance", ir->verletbuf_tol, 0.005);
1963 CTYPE ("nblist cut-off");
1964 RTYPE ("rlist", ir->rlist, 1.0);
1965 CTYPE ("long-range cut-off for switched potentials");
1967 /* Electrostatics */
1968 CCTYPE ("OPTIONS FOR ELECTROSTATICS AND VDW");
1969 CTYPE ("Method for doing electrostatics");
1970 EETYPE("coulombtype", ir->coulombtype, eel_names);
1971 EETYPE("coulomb-modifier", ir->coulomb_modifier, eintmod_names);
1972 CTYPE ("cut-off lengths");
1973 RTYPE ("rcoulomb-switch", ir->rcoulomb_switch, 0.0);
1974 RTYPE ("rcoulomb", ir->rcoulomb, 1.0);
1975 CTYPE ("Relative dielectric constant for the medium and the reaction field");
1976 RTYPE ("epsilon-r", ir->epsilon_r, 1.0);
1977 RTYPE ("epsilon-rf", ir->epsilon_rf, 0.0);
1978 CTYPE ("Method for doing Van der Waals");
1979 EETYPE("vdw-type", ir->vdwtype, evdw_names);
1980 EETYPE("vdw-modifier", ir->vdw_modifier, eintmod_names);
1981 CTYPE ("cut-off lengths");
1982 RTYPE ("rvdw-switch", ir->rvdw_switch, 0.0);
1983 RTYPE ("rvdw", ir->rvdw, 1.0);
1984 CTYPE ("Apply long range dispersion corrections for Energy and Pressure");
1985 EETYPE("DispCorr", ir->eDispCorr, edispc_names);
1986 CTYPE ("Extension of the potential lookup tables beyond the cut-off");
1987 RTYPE ("table-extension", ir->tabext, 1.0);
1988 CTYPE ("Separate tables between energy group pairs");
1989 STYPE ("energygrp-table", is->egptable, nullptr);
1990 CTYPE ("Spacing for the PME/PPPM FFT grid");
1991 RTYPE ("fourierspacing", ir->fourier_spacing, 0.12);
1992 CTYPE ("FFT grid size, when a value is 0 fourierspacing will be used");
1993 ITYPE ("fourier-nx", ir->nkx, 0);
1994 ITYPE ("fourier-ny", ir->nky, 0);
1995 ITYPE ("fourier-nz", ir->nkz, 0);
1996 CTYPE ("EWALD/PME/PPPM parameters");
1997 ITYPE ("pme-order", ir->pme_order, 4);
1998 RTYPE ("ewald-rtol", ir->ewald_rtol, 0.00001);
1999 RTYPE ("ewald-rtol-lj", ir->ewald_rtol_lj, 0.001);
2000 EETYPE("lj-pme-comb-rule", ir->ljpme_combination_rule, eljpme_names);
2001 EETYPE("ewald-geometry", ir->ewald_geometry, eewg_names);
2002 RTYPE ("epsilon-surface", ir->epsilon_surface, 0.0);
2004 CCTYPE("IMPLICIT SOLVENT ALGORITHM");
2005 EETYPE("implicit-solvent", ir->implicit_solvent, eis_names);
2007 CCTYPE ("GENERALIZED BORN ELECTROSTATICS");
2008 CTYPE ("Algorithm for calculating Born radii");
2009 EETYPE("gb-algorithm", ir->gb_algorithm, egb_names);
2010 CTYPE ("Frequency of calculating the Born radii inside rlist");
2011 ITYPE ("nstgbradii", ir->nstgbradii, 1);
2012 CTYPE ("Cutoff for Born radii calculation; the contribution from atoms");
2013 CTYPE ("between rlist and rgbradii is updated every nstlist steps");
2014 RTYPE ("rgbradii", ir->rgbradii, 1.0);
2015 CTYPE ("Dielectric coefficient of the implicit solvent");
2016 RTYPE ("gb-epsilon-solvent", ir->gb_epsilon_solvent, 80.0);
2017 CTYPE ("Salt concentration in M for Generalized Born models");
2018 RTYPE ("gb-saltconc", ir->gb_saltconc, 0.0);
2019 CTYPE ("Scaling factors used in the OBC GB model. Default values are OBC(II)");
2020 RTYPE ("gb-obc-alpha", ir->gb_obc_alpha, 1.0);
2021 RTYPE ("gb-obc-beta", ir->gb_obc_beta, 0.8);
2022 RTYPE ("gb-obc-gamma", ir->gb_obc_gamma, 4.85);
2023 RTYPE ("gb-dielectric-offset", ir->gb_dielectric_offset, 0.009);
2024 EETYPE("sa-algorithm", ir->sa_algorithm, esa_names);
2025 CTYPE ("Surface tension (kJ/mol/nm^2) for the SA (nonpolar surface) part of GBSA");
2026 CTYPE ("The value -1 will set default value for Still/HCT/OBC GB-models.");
2027 RTYPE ("sa-surface-tension", ir->sa_surface_tension, -1);
2029 /* Coupling stuff */
2030 CCTYPE ("OPTIONS FOR WEAK COUPLING ALGORITHMS");
2031 CTYPE ("Temperature coupling");
2032 EETYPE("tcoupl", ir->etc, etcoupl_names);
2033 ITYPE ("nsttcouple", ir->nsttcouple, -1);
2034 ITYPE("nh-chain-length", ir->opts.nhchainlength, 10);
2035 EETYPE("print-nose-hoover-chain-variables", ir->bPrintNHChains, yesno_names);
2036 CTYPE ("Groups to couple separately");
2037 STYPE ("tc-grps", is->tcgrps, nullptr);
2038 CTYPE ("Time constant (ps) and reference temperature (K)");
2039 STYPE ("tau-t", is->tau_t, nullptr);
2040 STYPE ("ref-t", is->ref_t, nullptr);
2041 CTYPE ("pressure coupling");
2042 EETYPE("pcoupl", ir->epc, epcoupl_names);
2043 EETYPE("pcoupltype", ir->epct, epcoupltype_names);
2044 ITYPE ("nstpcouple", ir->nstpcouple, -1);
2045 CTYPE ("Time constant (ps), compressibility (1/bar) and reference P (bar)");
2046 RTYPE ("tau-p", ir->tau_p, 1.0);
2047 STYPE ("compressibility", dumstr[0], nullptr);
2048 STYPE ("ref-p", dumstr[1], nullptr);
2049 CTYPE ("Scaling of reference coordinates, No, All or COM");
2050 EETYPE ("refcoord-scaling", ir->refcoord_scaling, erefscaling_names);
2052 /* QMMM */
2053 CCTYPE ("OPTIONS FOR QMMM calculations");
2054 EETYPE("QMMM", ir->bQMMM, yesno_names);
2055 CTYPE ("Groups treated Quantum Mechanically");
2056 STYPE ("QMMM-grps", is->QMMM, nullptr);
2057 CTYPE ("QM method");
2058 STYPE("QMmethod", is->QMmethod, nullptr);
2059 CTYPE ("QMMM scheme");
2060 EETYPE("QMMMscheme", ir->QMMMscheme, eQMMMscheme_names);
2061 CTYPE ("QM basisset");
2062 STYPE("QMbasis", is->QMbasis, nullptr);
2063 CTYPE ("QM charge");
2064 STYPE ("QMcharge", is->QMcharge, nullptr);
2065 CTYPE ("QM multiplicity");
2066 STYPE ("QMmult", is->QMmult, nullptr);
2067 CTYPE ("Surface Hopping");
2068 STYPE ("SH", is->bSH, nullptr);
2069 CTYPE ("CAS space options");
2070 STYPE ("CASorbitals", is->CASorbitals, nullptr);
2071 STYPE ("CASelectrons", is->CASelectrons, nullptr);
2072 STYPE ("SAon", is->SAon, nullptr);
2073 STYPE ("SAoff", is->SAoff, nullptr);
2074 STYPE ("SAsteps", is->SAsteps, nullptr);
2075 CTYPE ("Scale factor for MM charges");
2076 RTYPE ("MMChargeScaleFactor", ir->scalefactor, 1.0);
2078 /* Simulated annealing */
2079 CCTYPE("SIMULATED ANNEALING");
2080 CTYPE ("Type of annealing for each temperature group (no/single/periodic)");
2081 STYPE ("annealing", is->anneal, nullptr);
2082 CTYPE ("Number of time points to use for specifying annealing in each group");
2083 STYPE ("annealing-npoints", is->anneal_npoints, nullptr);
2084 CTYPE ("List of times at the annealing points for each group");
2085 STYPE ("annealing-time", is->anneal_time, nullptr);
2086 CTYPE ("Temp. at each annealing point, for each group.");
2087 STYPE ("annealing-temp", is->anneal_temp, nullptr);
2089 /* Startup run */
2090 CCTYPE ("GENERATE VELOCITIES FOR STARTUP RUN");
2091 EETYPE("gen-vel", opts->bGenVel, yesno_names);
2092 RTYPE ("gen-temp", opts->tempi, 300.0);
2093 ITYPE ("gen-seed", opts->seed, -1);
2095 /* Shake stuff */
2096 CCTYPE ("OPTIONS FOR BONDS");
2097 EETYPE("constraints", opts->nshake, constraints);
2098 CTYPE ("Type of constraint algorithm");
2099 EETYPE("constraint-algorithm", ir->eConstrAlg, econstr_names);
2100 CTYPE ("Do not constrain the start configuration");
2101 EETYPE("continuation", ir->bContinuation, yesno_names);
2102 CTYPE ("Use successive overrelaxation to reduce the number of shake iterations");
2103 EETYPE("Shake-SOR", ir->bShakeSOR, yesno_names);
2104 CTYPE ("Relative tolerance of shake");
2105 RTYPE ("shake-tol", ir->shake_tol, 0.0001);
2106 CTYPE ("Highest order in the expansion of the constraint coupling matrix");
2107 ITYPE ("lincs-order", ir->nProjOrder, 4);
2108 CTYPE ("Number of iterations in the final step of LINCS. 1 is fine for");
2109 CTYPE ("normal simulations, but use 2 to conserve energy in NVE runs.");
2110 CTYPE ("For energy minimization with constraints it should be 4 to 8.");
2111 ITYPE ("lincs-iter", ir->nLincsIter, 1);
2112 CTYPE ("Lincs will write a warning to the stderr if in one step a bond");
2113 CTYPE ("rotates over more degrees than");
2114 RTYPE ("lincs-warnangle", ir->LincsWarnAngle, 30.0);
2115 CTYPE ("Convert harmonic bonds to morse potentials");
2116 EETYPE("morse", opts->bMorse, yesno_names);
2118 /* Energy group exclusions */
2119 CCTYPE ("ENERGY GROUP EXCLUSIONS");
2120 CTYPE ("Pairs of energy groups for which all non-bonded interactions are excluded");
2121 STYPE ("energygrp-excl", is->egpexcl, nullptr);
2123 /* Walls */
2124 CCTYPE ("WALLS");
2125 CTYPE ("Number of walls, type, atom types, densities and box-z scale factor for Ewald");
2126 ITYPE ("nwall", ir->nwall, 0);
2127 EETYPE("wall-type", ir->wall_type, ewt_names);
2128 RTYPE ("wall-r-linpot", ir->wall_r_linpot, -1);
2129 STYPE ("wall-atomtype", is->wall_atomtype, nullptr);
2130 STYPE ("wall-density", is->wall_density, nullptr);
2131 RTYPE ("wall-ewald-zfac", ir->wall_ewald_zfac, 3);
2133 /* COM pulling */
2134 CCTYPE("COM PULLING");
2135 EETYPE("pull", ir->bPull, yesno_names);
2136 if (ir->bPull)
2138 snew(ir->pull, 1);
2139 is->pull_grp = read_pullparams(&ninp, &inp, ir->pull, wi);
2142 /* AWH biasing
2143 NOTE: needs COM pulling input */
2144 CCTYPE("AWH biasing");
2145 EETYPE("awh", ir->bDoAwh, yesno_names);
2146 if (ir->bDoAwh)
2148 if (ir->bPull)
2150 ir->awhParams = gmx::readAndCheckAwhParams(&ninp, &inp, ir, wi);
2152 else
2154 gmx_fatal(FARGS, "AWH biasing is only compatible with COM pulling turned on");
2158 /* Enforced rotation */
2159 CCTYPE("ENFORCED ROTATION");
2160 CTYPE("Enforced rotation: No or Yes");
2161 EETYPE("rotation", ir->bRot, yesno_names);
2162 if (ir->bRot)
2164 snew(ir->rot, 1);
2165 is->rot_grp = read_rotparams(&ninp, &inp, ir->rot, wi);
2168 /* Interactive MD */
2169 ir->bIMD = FALSE;
2170 CCTYPE("Group to display and/or manipulate in interactive MD session");
2171 STYPE ("IMD-group", is->imd_grp, nullptr);
2172 if (is->imd_grp[0] != '\0')
2174 snew(ir->imd, 1);
2175 ir->bIMD = TRUE;
2178 /* Refinement */
2179 CCTYPE("NMR refinement stuff");
2180 CTYPE ("Distance restraints type: No, Simple or Ensemble");
2181 EETYPE("disre", ir->eDisre, edisre_names);
2182 CTYPE ("Force weighting of pairs in one distance restraint: Conservative or Equal");
2183 EETYPE("disre-weighting", ir->eDisreWeighting, edisreweighting_names);
2184 CTYPE ("Use sqrt of the time averaged times the instantaneous violation");
2185 EETYPE("disre-mixed", ir->bDisreMixed, yesno_names);
2186 RTYPE ("disre-fc", ir->dr_fc, 1000.0);
2187 RTYPE ("disre-tau", ir->dr_tau, 0.0);
2188 CTYPE ("Output frequency for pair distances to energy file");
2189 ITYPE ("nstdisreout", ir->nstdisreout, 100);
2190 CTYPE ("Orientation restraints: No or Yes");
2191 EETYPE("orire", opts->bOrire, yesno_names);
2192 CTYPE ("Orientation restraints force constant and tau for time averaging");
2193 RTYPE ("orire-fc", ir->orires_fc, 0.0);
2194 RTYPE ("orire-tau", ir->orires_tau, 0.0);
2195 STYPE ("orire-fitgrp", is->orirefitgrp, nullptr);
2196 CTYPE ("Output frequency for trace(SD) and S to energy file");
2197 ITYPE ("nstorireout", ir->nstorireout, 100);
2199 /* free energy variables */
2200 CCTYPE ("Free energy variables");
2201 EETYPE("free-energy", ir->efep, efep_names);
2202 STYPE ("couple-moltype", is->couple_moltype, nullptr);
2203 EETYPE("couple-lambda0", opts->couple_lam0, couple_lam);
2204 EETYPE("couple-lambda1", opts->couple_lam1, couple_lam);
2205 EETYPE("couple-intramol", opts->bCoupleIntra, yesno_names);
2207 RTYPE ("init-lambda", fep->init_lambda, -1); /* start with -1 so
2208 we can recognize if
2209 it was not entered */
2210 ITYPE ("init-lambda-state", fep->init_fep_state, -1);
2211 RTYPE ("delta-lambda", fep->delta_lambda, 0.0);
2212 ITYPE ("nstdhdl", fep->nstdhdl, 50);
2213 STYPE ("fep-lambdas", is->fep_lambda[efptFEP], nullptr);
2214 STYPE ("mass-lambdas", is->fep_lambda[efptMASS], nullptr);
2215 STYPE ("coul-lambdas", is->fep_lambda[efptCOUL], nullptr);
2216 STYPE ("vdw-lambdas", is->fep_lambda[efptVDW], nullptr);
2217 STYPE ("bonded-lambdas", is->fep_lambda[efptBONDED], nullptr);
2218 STYPE ("restraint-lambdas", is->fep_lambda[efptRESTRAINT], nullptr);
2219 STYPE ("temperature-lambdas", is->fep_lambda[efptTEMPERATURE], nullptr);
2220 ITYPE ("calc-lambda-neighbors", fep->lambda_neighbors, 1);
2221 STYPE ("init-lambda-weights", is->lambda_weights, nullptr);
2222 EETYPE("dhdl-print-energy", fep->edHdLPrintEnergy, edHdLPrintEnergy_names);
2223 RTYPE ("sc-alpha", fep->sc_alpha, 0.0);
2224 ITYPE ("sc-power", fep->sc_power, 1);
2225 RTYPE ("sc-r-power", fep->sc_r_power, 6.0);
2226 RTYPE ("sc-sigma", fep->sc_sigma, 0.3);
2227 EETYPE("sc-coul", fep->bScCoul, yesno_names);
2228 ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2229 RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2230 EETYPE("separate-dhdl-file", fep->separate_dhdl_file,
2231 separate_dhdl_file_names);
2232 EETYPE("dhdl-derivatives", fep->dhdl_derivatives, dhdl_derivatives_names);
2233 ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2234 RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2236 /* Non-equilibrium MD stuff */
2237 CCTYPE("Non-equilibrium MD stuff");
2238 STYPE ("acc-grps", is->accgrps, nullptr);
2239 STYPE ("accelerate", is->acc, nullptr);
2240 STYPE ("freezegrps", is->freeze, nullptr);
2241 STYPE ("freezedim", is->frdim, nullptr);
2242 RTYPE ("cos-acceleration", ir->cos_accel, 0);
2243 STYPE ("deform", is->deform, nullptr);
2245 /* simulated tempering variables */
2246 CCTYPE("simulated tempering variables");
2247 EETYPE("simulated-tempering", ir->bSimTemp, yesno_names);
2248 EETYPE("simulated-tempering-scaling", ir->simtempvals->eSimTempScale, esimtemp_names);
2249 RTYPE("sim-temp-low", ir->simtempvals->simtemp_low, 300.0);
2250 RTYPE("sim-temp-high", ir->simtempvals->simtemp_high, 300.0);
2252 /* expanded ensemble variables */
2253 if (ir->efep == efepEXPANDED || ir->bSimTemp)
2255 read_expandedparams(&ninp, &inp, expand, wi);
2258 /* Electric fields */
2260 gmx::KeyValueTreeObject convertedValues = flatKeyValueTreeFromInpFile(ninp, inp);
2261 gmx::KeyValueTreeTransformer transform;
2262 transform.rules()->addRule()
2263 .keyMatchType("/", gmx::StringCompareType::CaseAndDashInsensitive);
2264 mdModules->initMdpTransform(transform.rules());
2265 for (const auto &path : transform.mappedPaths())
2267 GMX_ASSERT(path.size() == 1, "Inconsistent mapping back to mdp options");
2268 mark_einp_set(ninp, inp, path[0].c_str());
2270 MdpErrorHandler errorHandler(wi);
2271 auto result
2272 = transform.transform(convertedValues, &errorHandler);
2273 ir->params = new gmx::KeyValueTreeObject(result.object());
2274 mdModules->adjustInputrecBasedOnModules(ir);
2275 errorHandler.setBackMapping(result.backMapping());
2276 mdModules->assignOptionsToModules(*ir->params, &errorHandler);
2279 /* Ion/water position swapping ("computational electrophysiology") */
2280 CCTYPE("Ion/water position swapping for computational electrophysiology setups");
2281 CTYPE("Swap positions along direction: no, X, Y, Z");
2282 EETYPE("swapcoords", ir->eSwapCoords, eSwapTypes_names);
2283 if (ir->eSwapCoords != eswapNO)
2285 char buf[STRLEN];
2286 int nIonTypes;
2289 snew(ir->swap, 1);
2290 CTYPE("Swap attempt frequency");
2291 ITYPE("swap-frequency", ir->swap->nstswap, 1);
2292 CTYPE("Number of ion types to be controlled");
2293 ITYPE("iontypes", nIonTypes, 1);
2294 if (nIonTypes < 1)
2296 warning_error(wi, "You need to provide at least one ion type for position exchanges.");
2298 ir->swap->ngrp = nIonTypes + eSwapFixedGrpNR;
2299 snew(ir->swap->grp, ir->swap->ngrp);
2300 for (i = 0; i < ir->swap->ngrp; i++)
2302 snew(ir->swap->grp[i].molname, STRLEN);
2304 CTYPE("Two index groups that contain the compartment-partitioning atoms");
2305 STYPE("split-group0", ir->swap->grp[eGrpSplit0].molname, nullptr);
2306 STYPE("split-group1", ir->swap->grp[eGrpSplit1].molname, nullptr);
2307 CTYPE("Use center of mass of split groups (yes/no), otherwise center of geometry is used");
2308 EETYPE("massw-split0", ir->swap->massw_split[0], yesno_names);
2309 EETYPE("massw-split1", ir->swap->massw_split[1], yesno_names);
2311 CTYPE("Name of solvent molecules");
2312 STYPE("solvent-group", ir->swap->grp[eGrpSolvent].molname, nullptr);
2314 CTYPE("Split cylinder: radius, upper and lower extension (nm) (this will define the channels)");
2315 CTYPE("Note that the split cylinder settings do not have an influence on the swapping protocol,");
2316 CTYPE("however, if correctly defined, the permeation events are recorded per channel");
2317 RTYPE("cyl0-r", ir->swap->cyl0r, 2.0);
2318 RTYPE("cyl0-up", ir->swap->cyl0u, 1.0);
2319 RTYPE("cyl0-down", ir->swap->cyl0l, 1.0);
2320 RTYPE("cyl1-r", ir->swap->cyl1r, 2.0);
2321 RTYPE("cyl1-up", ir->swap->cyl1u, 1.0);
2322 RTYPE("cyl1-down", ir->swap->cyl1l, 1.0);
2324 CTYPE("Average the number of ions per compartment over these many swap attempt steps");
2325 ITYPE("coupl-steps", ir->swap->nAverage, 10);
2327 CTYPE("Names of the ion types that can be exchanged with solvent molecules,");
2328 CTYPE("and the requested number of ions of this type in compartments A and B");
2329 CTYPE("-1 means fix the numbers as found in step 0");
2330 for (i = 0; i < nIonTypes; i++)
2332 int ig = eSwapFixedGrpNR + i;
2334 sprintf(buf, "iontype%d-name", i);
2335 STYPE(buf, ir->swap->grp[ig].molname, nullptr);
2336 sprintf(buf, "iontype%d-in-A", i);
2337 ITYPE(buf, ir->swap->grp[ig].nmolReq[0], -1);
2338 sprintf(buf, "iontype%d-in-B", i);
2339 ITYPE(buf, ir->swap->grp[ig].nmolReq[1], -1);
2342 CTYPE("By default (i.e. bulk offset = 0.0), ion/water exchanges happen between layers");
2343 CTYPE("at maximum distance (= bulk concentration) to the split group layers. However,");
2344 CTYPE("an offset b (-1.0 < b < +1.0) can be specified to offset the bulk layer from the middle at 0.0");
2345 CTYPE("towards one of the compartment-partitioning layers (at +/- 1.0).");
2346 RTYPE("bulk-offsetA", ir->swap->bulkOffset[0], 0.0);
2347 RTYPE("bulk-offsetB", ir->swap->bulkOffset[1], 0.0);
2348 if (!(ir->swap->bulkOffset[0] > -1.0 && ir->swap->bulkOffset[0] < 1.0)
2349 || !(ir->swap->bulkOffset[1] > -1.0 && ir->swap->bulkOffset[1] < 1.0) )
2351 warning_error(wi, "Bulk layer offsets must be > -1.0 and < 1.0 !");
2354 CTYPE("Start to swap ions if threshold difference to requested count is reached");
2355 RTYPE("threshold", ir->swap->threshold, 1.0);
2358 /* AdResS is no longer supported, but we need mdrun to be able to refuse to run old AdResS .tpr files */
2359 EETYPE("adress", ir->bAdress, yesno_names);
2361 /* User defined thingies */
2362 CCTYPE ("User defined thingies");
2363 STYPE ("user1-grps", is->user1, nullptr);
2364 STYPE ("user2-grps", is->user2, nullptr);
2365 ITYPE ("userint1", ir->userint1, 0);
2366 ITYPE ("userint2", ir->userint2, 0);
2367 ITYPE ("userint3", ir->userint3, 0);
2368 ITYPE ("userint4", ir->userint4, 0);
2369 RTYPE ("userreal1", ir->userreal1, 0);
2370 RTYPE ("userreal2", ir->userreal2, 0);
2371 RTYPE ("userreal3", ir->userreal3, 0);
2372 RTYPE ("userreal4", ir->userreal4, 0);
2373 #undef CTYPE
2376 gmx::TextOutputFile stream(mdparout);
2377 write_inpfile(&stream, mdparout, ninp, inp, FALSE, writeMdpHeader, wi);
2379 // Transform module data into a flat key-value tree for output.
2380 gmx::KeyValueTreeBuilder builder;
2381 gmx::KeyValueTreeObjectBuilder builderObject = builder.rootObject();
2382 mdModules->buildMdpOutput(&builderObject);
2384 gmx::TextWriter writer(&stream);
2385 writeKeyValueTreeAsMdp(&writer, builder.build());
2387 stream.close();
2390 for (i = 0; (i < ninp); i++)
2392 sfree(inp[i].name);
2393 sfree(inp[i].value);
2395 sfree(inp);
2397 /* Process options if necessary */
2398 for (m = 0; m < 2; m++)
2400 for (i = 0; i < 2*DIM; i++)
2402 dumdub[m][i] = 0.0;
2404 if (ir->epc)
2406 switch (ir->epct)
2408 case epctISOTROPIC:
2409 if (sscanf(dumstr[m], "%lf", &(dumdub[m][XX])) != 1)
2411 warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 1)");
2413 dumdub[m][YY] = dumdub[m][ZZ] = dumdub[m][XX];
2414 break;
2415 case epctSEMIISOTROPIC:
2416 case epctSURFACETENSION:
2417 if (sscanf(dumstr[m], "%lf%lf", &(dumdub[m][XX]), &(dumdub[m][ZZ])) != 2)
2419 warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 2)");
2421 dumdub[m][YY] = dumdub[m][XX];
2422 break;
2423 case epctANISOTROPIC:
2424 if (sscanf(dumstr[m], "%lf%lf%lf%lf%lf%lf",
2425 &(dumdub[m][XX]), &(dumdub[m][YY]), &(dumdub[m][ZZ]),
2426 &(dumdub[m][3]), &(dumdub[m][4]), &(dumdub[m][5])) != 6)
2428 warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 6)");
2430 break;
2431 default:
2432 gmx_fatal(FARGS, "Pressure coupling type %s not implemented yet",
2433 epcoupltype_names[ir->epct]);
2437 clear_mat(ir->ref_p);
2438 clear_mat(ir->compress);
2439 for (i = 0; i < DIM; i++)
2441 ir->ref_p[i][i] = dumdub[1][i];
2442 ir->compress[i][i] = dumdub[0][i];
2444 if (ir->epct == epctANISOTROPIC)
2446 ir->ref_p[XX][YY] = dumdub[1][3];
2447 ir->ref_p[XX][ZZ] = dumdub[1][4];
2448 ir->ref_p[YY][ZZ] = dumdub[1][5];
2449 if (ir->ref_p[XX][YY] != 0 && ir->ref_p[XX][ZZ] != 0 && ir->ref_p[YY][ZZ] != 0)
2451 warning(wi, "All off-diagonal reference pressures are non-zero. Are you sure you want to apply a threefold shear stress?\n");
2453 ir->compress[XX][YY] = dumdub[0][3];
2454 ir->compress[XX][ZZ] = dumdub[0][4];
2455 ir->compress[YY][ZZ] = dumdub[0][5];
2456 for (i = 0; i < DIM; i++)
2458 for (m = 0; m < i; m++)
2460 ir->ref_p[i][m] = ir->ref_p[m][i];
2461 ir->compress[i][m] = ir->compress[m][i];
2466 if (ir->comm_mode == ecmNO)
2468 ir->nstcomm = 0;
2471 opts->couple_moltype = nullptr;
2472 if (strlen(is->couple_moltype) > 0)
2474 if (ir->efep != efepNO)
2476 opts->couple_moltype = gmx_strdup(is->couple_moltype);
2477 if (opts->couple_lam0 == opts->couple_lam1)
2479 warning(wi, "The lambda=0 and lambda=1 states for coupling are identical");
2481 if (ir->eI == eiMD && (opts->couple_lam0 == ecouplamNONE ||
2482 opts->couple_lam1 == ecouplamNONE))
2484 warning(wi, "For proper sampling of the (nearly) decoupled state, stochastic dynamics should be used");
2487 else
2489 warning_note(wi, "Free energy is turned off, so we will not decouple the molecule listed in your input.");
2492 /* FREE ENERGY AND EXPANDED ENSEMBLE OPTIONS */
2493 if (ir->efep != efepNO)
2495 if (fep->delta_lambda > 0)
2497 ir->efep = efepSLOWGROWTH;
2501 if (fep->edHdLPrintEnergy == edHdLPrintEnergyYES)
2503 fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2504 warning_note(wi, "Old option for dhdl-print-energy given: "
2505 "changing \"yes\" to \"total\"\n");
2508 if (ir->bSimTemp && (fep->edHdLPrintEnergy == edHdLPrintEnergyNO))
2510 /* always print out the energy to dhdl if we are doing
2511 expanded ensemble, since we need the total energy for
2512 analysis if the temperature is changing. In some
2513 conditions one may only want the potential energy, so
2514 we will allow that if the appropriate mdp setting has
2515 been enabled. Otherwise, total it is:
2517 fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2520 if ((ir->efep != efepNO) || ir->bSimTemp)
2522 ir->bExpanded = FALSE;
2523 if ((ir->efep == efepEXPANDED) || ir->bSimTemp)
2525 ir->bExpanded = TRUE;
2527 do_fep_params(ir, is->fep_lambda, is->lambda_weights, wi);
2528 if (ir->bSimTemp) /* done after fep params */
2530 do_simtemp_params(ir);
2533 /* Because sc-coul (=FALSE by default) only acts on the lambda state
2534 * setup and not on the old way of specifying the free-energy setup,
2535 * we should check for using soft-core when not needed, since that
2536 * can complicate the sampling significantly.
2537 * Note that we only check for the automated coupling setup.
2538 * If the (advanced) user does FEP through manual topology changes,
2539 * this check will not be triggered.
2541 if (ir->efep != efepNO && ir->fepvals->n_lambda == 0 &&
2542 ir->fepvals->sc_alpha != 0 &&
2543 (couple_lambda_has_vdw_on(opts->couple_lam0) &&
2544 couple_lambda_has_vdw_on(opts->couple_lam1)))
2546 warning(wi, "You are using soft-core interactions while the Van der Waals interactions are not decoupled (note that the sc-coul option is only active when using lambda states). Although this will not lead to errors, you will need much more sampling than without soft-core interactions. Consider using sc-alpha=0.");
2549 else
2551 ir->fepvals->n_lambda = 0;
2554 /* WALL PARAMETERS */
2556 do_wall_params(ir, is->wall_atomtype, is->wall_density, opts);
2558 /* ORIENTATION RESTRAINT PARAMETERS */
2560 if (opts->bOrire && str_nelem(is->orirefitgrp, MAXPTR, nullptr) != 1)
2562 warning_error(wi, "ERROR: Need one orientation restraint fit group\n");
2565 /* DEFORMATION PARAMETERS */
2567 clear_mat(ir->deform);
2568 for (i = 0; i < 6; i++)
2570 dumdub[0][i] = 0;
2573 double gmx_unused canary;
2574 int ndeform = sscanf(is->deform, "%lf %lf %lf %lf %lf %lf %lf",
2575 &(dumdub[0][0]), &(dumdub[0][1]), &(dumdub[0][2]),
2576 &(dumdub[0][3]), &(dumdub[0][4]), &(dumdub[0][5]), &canary);
2578 if (strlen(is->deform) > 0 && ndeform != 6)
2580 warning_error(wi, gmx::formatString("Cannot parse exactly 6 box deformation velocities from string '%s'", is->deform).c_str());
2582 for (i = 0; i < 3; i++)
2584 ir->deform[i][i] = dumdub[0][i];
2586 ir->deform[YY][XX] = dumdub[0][3];
2587 ir->deform[ZZ][XX] = dumdub[0][4];
2588 ir->deform[ZZ][YY] = dumdub[0][5];
2589 if (ir->epc != epcNO)
2591 for (i = 0; i < 3; i++)
2593 for (j = 0; j <= i; j++)
2595 if (ir->deform[i][j] != 0 && ir->compress[i][j] != 0)
2597 warning_error(wi, "A box element has deform set and compressibility > 0");
2601 for (i = 0; i < 3; i++)
2603 for (j = 0; j < i; j++)
2605 if (ir->deform[i][j] != 0)
2607 for (m = j; m < DIM; m++)
2609 if (ir->compress[m][j] != 0)
2611 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.");
2612 warning(wi, warn_buf);
2620 /* Ion/water position swapping checks */
2621 if (ir->eSwapCoords != eswapNO)
2623 if (ir->swap->nstswap < 1)
2625 warning_error(wi, "swap_frequency must be 1 or larger when ion swapping is requested");
2627 if (ir->swap->nAverage < 1)
2629 warning_error(wi, "coupl_steps must be 1 or larger.\n");
2631 if (ir->swap->threshold < 1.0)
2633 warning_error(wi, "Ion count threshold must be at least 1.\n");
2637 sfree(dumstr[0]);
2638 sfree(dumstr[1]);
2641 static int search_QMstring(const char *s, int ng, const char *gn[])
2643 /* same as normal search_string, but this one searches QM strings */
2644 int i;
2646 for (i = 0; (i < ng); i++)
2648 if (gmx_strcasecmp(s, gn[i]) == 0)
2650 return i;
2654 gmx_fatal(FARGS, "this QM method or basisset (%s) is not implemented\n!", s);
2656 return -1;
2658 } /* search_QMstring */
2660 /* We would like gn to be const as well, but C doesn't allow this */
2661 /* TODO this is utility functionality (search for the index of a
2662 string in a collection), so should be refactored and located more
2663 centrally. */
2664 int search_string(const char *s, int ng, char *gn[])
2666 int i;
2668 for (i = 0; (i < ng); i++)
2670 if (gmx_strcasecmp(s, gn[i]) == 0)
2672 return i;
2676 gmx_fatal(FARGS,
2677 "Group %s referenced in the .mdp file was not found in the index file.\n"
2678 "Group names must match either [moleculetype] names or custom index group\n"
2679 "names, in which case you must supply an index file to the '-n' option\n"
2680 "of grompp.",
2683 return -1;
2686 static gmx_bool do_numbering(int natoms, gmx_groups_t *groups, int ng, char *ptrs[],
2687 t_blocka *block, char *gnames[],
2688 int gtype, int restnm,
2689 int grptp, gmx_bool bVerbose,
2690 warninp_t wi)
2692 unsigned short *cbuf;
2693 t_grps *grps = &(groups->grps[gtype]);
2694 int i, j, gid, aj, ognr, ntot = 0;
2695 const char *title;
2696 gmx_bool bRest;
2697 char warn_buf[STRLEN];
2699 if (debug)
2701 fprintf(debug, "Starting numbering %d groups of type %d\n", ng, gtype);
2704 title = gtypes[gtype];
2706 snew(cbuf, natoms);
2707 /* Mark all id's as not set */
2708 for (i = 0; (i < natoms); i++)
2710 cbuf[i] = NOGID;
2713 snew(grps->nm_ind, ng+1); /* +1 for possible rest group */
2714 for (i = 0; (i < ng); i++)
2716 /* Lookup the group name in the block structure */
2717 gid = search_string(ptrs[i], block->nr, gnames);
2718 if ((grptp != egrptpONE) || (i == 0))
2720 grps->nm_ind[grps->nr++] = gid;
2722 if (debug)
2724 fprintf(debug, "Found gid %d for group %s\n", gid, ptrs[i]);
2727 /* Now go over the atoms in the group */
2728 for (j = block->index[gid]; (j < block->index[gid+1]); j++)
2731 aj = block->a[j];
2733 /* Range checking */
2734 if ((aj < 0) || (aj >= natoms))
2736 gmx_fatal(FARGS, "Invalid atom number %d in indexfile", aj);
2738 /* Lookup up the old group number */
2739 ognr = cbuf[aj];
2740 if (ognr != NOGID)
2742 gmx_fatal(FARGS, "Atom %d in multiple %s groups (%d and %d)",
2743 aj+1, title, ognr+1, i+1);
2745 else
2747 /* Store the group number in buffer */
2748 if (grptp == egrptpONE)
2750 cbuf[aj] = 0;
2752 else
2754 cbuf[aj] = i;
2756 ntot++;
2761 /* Now check whether we have done all atoms */
2762 bRest = FALSE;
2763 if (ntot != natoms)
2765 if (grptp == egrptpALL)
2767 gmx_fatal(FARGS, "%d atoms are not part of any of the %s groups",
2768 natoms-ntot, title);
2770 else if (grptp == egrptpPART)
2772 sprintf(warn_buf, "%d atoms are not part of any of the %s groups",
2773 natoms-ntot, title);
2774 warning_note(wi, warn_buf);
2776 /* Assign all atoms currently unassigned to a rest group */
2777 for (j = 0; (j < natoms); j++)
2779 if (cbuf[j] == NOGID)
2781 cbuf[j] = grps->nr;
2782 bRest = TRUE;
2785 if (grptp != egrptpPART)
2787 if (bVerbose)
2789 fprintf(stderr,
2790 "Making dummy/rest group for %s containing %d elements\n",
2791 title, natoms-ntot);
2793 /* Add group name "rest" */
2794 grps->nm_ind[grps->nr] = restnm;
2796 /* Assign the rest name to all atoms not currently assigned to a group */
2797 for (j = 0; (j < natoms); j++)
2799 if (cbuf[j] == NOGID)
2801 cbuf[j] = grps->nr;
2804 grps->nr++;
2808 if (grps->nr == 1 && (ntot == 0 || ntot == natoms))
2810 /* All atoms are part of one (or no) group, no index required */
2811 groups->ngrpnr[gtype] = 0;
2812 groups->grpnr[gtype] = nullptr;
2814 else
2816 groups->ngrpnr[gtype] = natoms;
2817 snew(groups->grpnr[gtype], natoms);
2818 for (j = 0; (j < natoms); j++)
2820 groups->grpnr[gtype][j] = cbuf[j];
2824 sfree(cbuf);
2826 return (bRest && grptp == egrptpPART);
2829 static void calc_nrdf(gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
2831 t_grpopts *opts;
2832 gmx_groups_t *groups;
2833 pull_params_t *pull;
2834 int natoms, ai, aj, i, j, d, g, imin, jmin;
2835 t_iatom *ia;
2836 int *nrdf2, *na_vcm, na_tot;
2837 double *nrdf_tc, *nrdf_vcm, nrdf_uc, *nrdf_vcm_sub;
2838 ivec *dof_vcm;
2839 gmx_mtop_atomloop_all_t aloop;
2840 int mb, mol, ftype, as;
2841 gmx_molblock_t *molb;
2842 gmx_moltype_t *molt;
2844 /* Calculate nrdf.
2845 * First calc 3xnr-atoms for each group
2846 * then subtract half a degree of freedom for each constraint
2848 * Only atoms and nuclei contribute to the degrees of freedom...
2851 opts = &ir->opts;
2853 groups = &mtop->groups;
2854 natoms = mtop->natoms;
2856 /* Allocate one more for a possible rest group */
2857 /* We need to sum degrees of freedom into doubles,
2858 * since floats give too low nrdf's above 3 million atoms.
2860 snew(nrdf_tc, groups->grps[egcTC].nr+1);
2861 snew(nrdf_vcm, groups->grps[egcVCM].nr+1);
2862 snew(dof_vcm, groups->grps[egcVCM].nr+1);
2863 snew(na_vcm, groups->grps[egcVCM].nr+1);
2864 snew(nrdf_vcm_sub, groups->grps[egcVCM].nr+1);
2866 for (i = 0; i < groups->grps[egcTC].nr; i++)
2868 nrdf_tc[i] = 0;
2870 for (i = 0; i < groups->grps[egcVCM].nr+1; i++)
2872 nrdf_vcm[i] = 0;
2873 clear_ivec(dof_vcm[i]);
2874 na_vcm[i] = 0;
2875 nrdf_vcm_sub[i] = 0;
2878 snew(nrdf2, natoms);
2879 aloop = gmx_mtop_atomloop_all_init(mtop);
2880 const t_atom *atom;
2881 while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
2883 nrdf2[i] = 0;
2884 if (atom->ptype == eptAtom || atom->ptype == eptNucleus)
2886 g = ggrpnr(groups, egcFREEZE, i);
2887 for (d = 0; d < DIM; d++)
2889 if (opts->nFreeze[g][d] == 0)
2891 /* Add one DOF for particle i (counted as 2*1) */
2892 nrdf2[i] += 2;
2893 /* VCM group i has dim d as a DOF */
2894 dof_vcm[ggrpnr(groups, egcVCM, i)][d] = 1;
2897 nrdf_tc [ggrpnr(groups, egcTC, i)] += 0.5*nrdf2[i];
2898 nrdf_vcm[ggrpnr(groups, egcVCM, i)] += 0.5*nrdf2[i];
2902 as = 0;
2903 for (mb = 0; mb < mtop->nmolblock; mb++)
2905 molb = &mtop->molblock[mb];
2906 molt = &mtop->moltype[molb->type];
2907 atom = molt->atoms.atom;
2908 for (mol = 0; mol < molb->nmol; mol++)
2910 for (ftype = F_CONSTR; ftype <= F_CONSTRNC; ftype++)
2912 ia = molt->ilist[ftype].iatoms;
2913 for (i = 0; i < molt->ilist[ftype].nr; )
2915 /* Subtract degrees of freedom for the constraints,
2916 * if the particles still have degrees of freedom left.
2917 * If one of the particles is a vsite or a shell, then all
2918 * constraint motion will go there, but since they do not
2919 * contribute to the constraints the degrees of freedom do not
2920 * change.
2922 ai = as + ia[1];
2923 aj = as + ia[2];
2924 if (((atom[ia[1]].ptype == eptNucleus) ||
2925 (atom[ia[1]].ptype == eptAtom)) &&
2926 ((atom[ia[2]].ptype == eptNucleus) ||
2927 (atom[ia[2]].ptype == eptAtom)))
2929 if (nrdf2[ai] > 0)
2931 jmin = 1;
2933 else
2935 jmin = 2;
2937 if (nrdf2[aj] > 0)
2939 imin = 1;
2941 else
2943 imin = 2;
2945 imin = std::min(imin, nrdf2[ai]);
2946 jmin = std::min(jmin, nrdf2[aj]);
2947 nrdf2[ai] -= imin;
2948 nrdf2[aj] -= jmin;
2949 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
2950 nrdf_tc [ggrpnr(groups, egcTC, aj)] -= 0.5*jmin;
2951 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2952 nrdf_vcm[ggrpnr(groups, egcVCM, aj)] -= 0.5*jmin;
2954 ia += interaction_function[ftype].nratoms+1;
2955 i += interaction_function[ftype].nratoms+1;
2958 ia = molt->ilist[F_SETTLE].iatoms;
2959 for (i = 0; i < molt->ilist[F_SETTLE].nr; )
2961 /* Subtract 1 dof from every atom in the SETTLE */
2962 for (j = 0; j < 3; j++)
2964 ai = as + ia[1+j];
2965 imin = std::min(2, nrdf2[ai]);
2966 nrdf2[ai] -= imin;
2967 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
2968 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2970 ia += 4;
2971 i += 4;
2973 as += molt->atoms.nr;
2977 if (ir->bPull)
2979 /* Correct nrdf for the COM constraints.
2980 * We correct using the TC and VCM group of the first atom
2981 * in the reference and pull group. If atoms in one pull group
2982 * belong to different TC or VCM groups it is anyhow difficult
2983 * to determine the optimal nrdf assignment.
2985 pull = ir->pull;
2987 for (i = 0; i < pull->ncoord; i++)
2989 if (pull->coord[i].eType != epullCONSTRAINT)
2991 continue;
2994 imin = 1;
2996 for (j = 0; j < 2; j++)
2998 const t_pull_group *pgrp;
3000 pgrp = &pull->group[pull->coord[i].group[j]];
3002 if (pgrp->nat > 0)
3004 /* Subtract 1/2 dof from each group */
3005 ai = pgrp->ind[0];
3006 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
3007 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
3008 if (nrdf_tc[ggrpnr(groups, egcTC, ai)] < 0)
3010 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)]]);
3013 else
3015 /* We need to subtract the whole DOF from group j=1 */
3016 imin += 1;
3022 if (ir->nstcomm != 0)
3024 int ndim_rm_vcm;
3026 /* We remove COM motion up to dim ndof_com() */
3027 ndim_rm_vcm = ndof_com(ir);
3029 /* Subtract ndim_rm_vcm (or less with frozen dimensions) from
3030 * the number of degrees of freedom in each vcm group when COM
3031 * translation is removed and 6 when rotation is removed as well.
3033 for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3035 switch (ir->comm_mode)
3037 case ecmLINEAR:
3038 case ecmLINEAR_ACCELERATION_CORRECTION:
3039 nrdf_vcm_sub[j] = 0;
3040 for (d = 0; d < ndim_rm_vcm; d++)
3042 if (dof_vcm[j][d])
3044 nrdf_vcm_sub[j]++;
3047 break;
3048 case ecmANGULAR:
3049 nrdf_vcm_sub[j] = 6;
3050 break;
3051 default:
3052 gmx_incons("Checking comm_mode");
3056 for (i = 0; i < groups->grps[egcTC].nr; i++)
3058 /* Count the number of atoms of TC group i for every VCM group */
3059 for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3061 na_vcm[j] = 0;
3063 na_tot = 0;
3064 for (ai = 0; ai < natoms; ai++)
3066 if (ggrpnr(groups, egcTC, ai) == i)
3068 na_vcm[ggrpnr(groups, egcVCM, ai)]++;
3069 na_tot++;
3072 /* Correct for VCM removal according to the fraction of each VCM
3073 * group present in this TC group.
3075 nrdf_uc = nrdf_tc[i];
3076 if (debug)
3078 fprintf(debug, "T-group[%d] nrdf_uc = %g\n", i, nrdf_uc);
3080 nrdf_tc[i] = 0;
3081 for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3083 if (nrdf_vcm[j] > nrdf_vcm_sub[j])
3085 nrdf_tc[i] += nrdf_uc*((double)na_vcm[j]/(double)na_tot)*
3086 (nrdf_vcm[j] - nrdf_vcm_sub[j])/nrdf_vcm[j];
3088 if (debug)
3090 fprintf(debug, " nrdf_vcm[%d] = %g, nrdf = %g\n",
3091 j, nrdf_vcm[j], nrdf_tc[i]);
3096 for (i = 0; (i < groups->grps[egcTC].nr); i++)
3098 opts->nrdf[i] = nrdf_tc[i];
3099 if (opts->nrdf[i] < 0)
3101 opts->nrdf[i] = 0;
3103 fprintf(stderr,
3104 "Number of degrees of freedom in T-Coupling group %s is %.2f\n",
3105 gnames[groups->grps[egcTC].nm_ind[i]], opts->nrdf[i]);
3108 sfree(nrdf2);
3109 sfree(nrdf_tc);
3110 sfree(nrdf_vcm);
3111 sfree(dof_vcm);
3112 sfree(na_vcm);
3113 sfree(nrdf_vcm_sub);
3116 static gmx_bool do_egp_flag(t_inputrec *ir, gmx_groups_t *groups,
3117 const char *option, const char *val, int flag)
3119 /* The maximum number of energy group pairs would be MAXPTR*(MAXPTR+1)/2.
3120 * But since this is much larger than STRLEN, such a line can not be parsed.
3121 * The real maximum is the number of names that fit in a string: STRLEN/2.
3123 #define EGP_MAX (STRLEN/2)
3124 int nelem, i, j, k, nr;
3125 char *names[EGP_MAX];
3126 char ***gnames;
3127 gmx_bool bSet;
3129 gnames = groups->grpname;
3131 nelem = str_nelem(val, EGP_MAX, names);
3132 if (nelem % 2 != 0)
3134 gmx_fatal(FARGS, "The number of groups for %s is odd", option);
3136 nr = groups->grps[egcENER].nr;
3137 bSet = FALSE;
3138 for (i = 0; i < nelem/2; i++)
3140 j = 0;
3141 while ((j < nr) &&
3142 gmx_strcasecmp(names[2*i], *(gnames[groups->grps[egcENER].nm_ind[j]])))
3144 j++;
3146 if (j == nr)
3148 gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3149 names[2*i], option);
3151 k = 0;
3152 while ((k < nr) &&
3153 gmx_strcasecmp(names[2*i+1], *(gnames[groups->grps[egcENER].nm_ind[k]])))
3155 k++;
3157 if (k == nr)
3159 gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3160 names[2*i+1], option);
3162 if ((j < nr) && (k < nr))
3164 ir->opts.egp_flags[nr*j+k] |= flag;
3165 ir->opts.egp_flags[nr*k+j] |= flag;
3166 bSet = TRUE;
3170 return bSet;
3174 static void make_swap_groups(
3175 t_swapcoords *swap,
3176 t_blocka *grps,
3177 char **gnames)
3179 int ig = -1, i = 0, gind;
3180 t_swapGroup *swapg;
3183 /* Just a quick check here, more thorough checks are in mdrun */
3184 if (strcmp(swap->grp[eGrpSplit0].molname, swap->grp[eGrpSplit1].molname) == 0)
3186 gmx_fatal(FARGS, "The split groups can not both be '%s'.", swap->grp[eGrpSplit0].molname);
3189 /* Get the index atoms of the split0, split1, solvent, and swap groups */
3190 for (ig = 0; ig < swap->ngrp; ig++)
3192 swapg = &swap->grp[ig];
3193 gind = search_string(swap->grp[ig].molname, grps->nr, gnames);
3194 swapg->nat = grps->index[gind+1] - grps->index[gind];
3196 if (swapg->nat > 0)
3198 fprintf(stderr, "%s group '%s' contains %d atoms.\n",
3199 ig < 3 ? eSwapFixedGrp_names[ig] : "Swap",
3200 swap->grp[ig].molname, swapg->nat);
3201 snew(swapg->ind, swapg->nat);
3202 for (i = 0; i < swapg->nat; i++)
3204 swapg->ind[i] = grps->a[grps->index[gind]+i];
3207 else
3209 gmx_fatal(FARGS, "Swap group %s does not contain any atoms.", swap->grp[ig].molname);
3215 static void make_IMD_group(t_IMD *IMDgroup, char *IMDgname, t_blocka *grps, char **gnames)
3217 int ig, i;
3220 ig = search_string(IMDgname, grps->nr, gnames);
3221 IMDgroup->nat = grps->index[ig+1] - grps->index[ig];
3223 if (IMDgroup->nat > 0)
3225 fprintf(stderr, "Group '%s' with %d atoms can be activated for interactive molecular dynamics (IMD).\n",
3226 IMDgname, IMDgroup->nat);
3227 snew(IMDgroup->ind, IMDgroup->nat);
3228 for (i = 0; i < IMDgroup->nat; i++)
3230 IMDgroup->ind[i] = grps->a[grps->index[ig]+i];
3236 void do_index(const char* mdparin, const char *ndx,
3237 gmx_mtop_t *mtop,
3238 gmx_bool bVerbose,
3239 t_inputrec *ir,
3240 warninp_t wi)
3242 t_blocka *grps;
3243 gmx_groups_t *groups;
3244 int natoms;
3245 t_symtab *symtab;
3246 t_atoms atoms_all;
3247 char warnbuf[STRLEN], **gnames;
3248 int nr, ntcg, ntau_t, nref_t, nacc, nofg, nSA, nSA_points, nSA_time, nSA_temp;
3249 real tau_min;
3250 int nstcmin;
3251 int nacg, nfreeze, nfrdim, nenergy, nvcm, nuser;
3252 char *ptr1[MAXPTR], *ptr2[MAXPTR], *ptr3[MAXPTR];
3253 int i, j, k, restnm;
3254 gmx_bool bExcl, bTable, bSetTCpar, bAnneal, bRest;
3255 int nQMmethod, nQMbasis, nQMg;
3256 char warn_buf[STRLEN];
3257 char* endptr;
3259 if (bVerbose)
3261 fprintf(stderr, "processing index file...\n");
3263 if (ndx == nullptr)
3265 snew(grps, 1);
3266 snew(grps->index, 1);
3267 snew(gnames, 1);
3268 atoms_all = gmx_mtop_global_atoms(mtop);
3269 analyse(&atoms_all, grps, &gnames, FALSE, TRUE);
3270 done_atom(&atoms_all);
3272 else
3274 grps = init_index(ndx, &gnames);
3277 groups = &mtop->groups;
3278 natoms = mtop->natoms;
3279 symtab = &mtop->symtab;
3281 snew(groups->grpname, grps->nr+1);
3283 for (i = 0; (i < grps->nr); i++)
3285 groups->grpname[i] = put_symtab(symtab, gnames[i]);
3287 groups->grpname[i] = put_symtab(symtab, "rest");
3288 restnm = i;
3289 srenew(gnames, grps->nr+1);
3290 gnames[restnm] = *(groups->grpname[i]);
3291 groups->ngrpname = grps->nr+1;
3293 set_warning_line(wi, mdparin, -1);
3295 ntau_t = str_nelem(is->tau_t, MAXPTR, ptr1);
3296 nref_t = str_nelem(is->ref_t, MAXPTR, ptr2);
3297 ntcg = str_nelem(is->tcgrps, MAXPTR, ptr3);
3298 if ((ntau_t != ntcg) || (nref_t != ntcg))
3300 gmx_fatal(FARGS, "Invalid T coupling input: %d groups, %d ref-t values and "
3301 "%d tau-t values", ntcg, nref_t, ntau_t);
3304 bSetTCpar = (ir->etc || EI_SD(ir->eI) || ir->eI == eiBD || EI_TPI(ir->eI));
3305 do_numbering(natoms, groups, ntcg, ptr3, grps, gnames, egcTC,
3306 restnm, bSetTCpar ? egrptpALL : egrptpALL_GENREST, bVerbose, wi);
3307 nr = groups->grps[egcTC].nr;
3308 ir->opts.ngtc = nr;
3309 snew(ir->opts.nrdf, nr);
3310 snew(ir->opts.tau_t, nr);
3311 snew(ir->opts.ref_t, nr);
3312 if (ir->eI == eiBD && ir->bd_fric == 0)
3314 fprintf(stderr, "bd-fric=0, so tau-t will be used as the inverse friction constant(s)\n");
3317 if (bSetTCpar)
3319 if (nr != nref_t)
3321 gmx_fatal(FARGS, "Not enough ref-t and tau-t values!");
3324 tau_min = 1e20;
3325 for (i = 0; (i < nr); i++)
3327 ir->opts.tau_t[i] = strtod(ptr1[i], &endptr);
3328 if (*endptr != 0)
3330 warning_error(wi, "Invalid value for mdp option tau-t. tau-t should only consist of real numbers separated by spaces.");
3332 if ((ir->eI == eiBD) && ir->opts.tau_t[i] <= 0)
3334 sprintf(warn_buf, "With integrator %s tau-t should be larger than 0", ei_names[ir->eI]);
3335 warning_error(wi, warn_buf);
3338 if (ir->etc != etcVRESCALE && ir->opts.tau_t[i] == 0)
3340 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.");
3343 if (ir->opts.tau_t[i] >= 0)
3345 tau_min = std::min(tau_min, ir->opts.tau_t[i]);
3348 if (ir->etc != etcNO && ir->nsttcouple == -1)
3350 ir->nsttcouple = ir_optimal_nsttcouple(ir);
3353 if (EI_VV(ir->eI))
3355 if ((ir->etc == etcNOSEHOOVER) && (ir->epc == epcBERENDSEN))
3357 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");
3359 if (ir->epc == epcMTTK)
3361 if (ir->etc != etcNOSEHOOVER)
3363 gmx_fatal(FARGS, "Cannot do MTTK pressure coupling without Nose-Hoover temperature control");
3365 else
3367 if (ir->nstpcouple != ir->nsttcouple)
3369 int mincouple = std::min(ir->nstpcouple, ir->nsttcouple);
3370 ir->nstpcouple = ir->nsttcouple = mincouple;
3371 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);
3372 warning_note(wi, warn_buf);
3377 /* velocity verlet with averaged kinetic energy KE = 0.5*(v(t+1/2) - v(t-1/2)) is implemented
3378 primarily for testing purposes, and does not work with temperature coupling other than 1 */
3380 if (ETC_ANDERSEN(ir->etc))
3382 if (ir->nsttcouple != 1)
3384 ir->nsttcouple = 1;
3385 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");
3386 warning_note(wi, warn_buf);
3389 nstcmin = tcouple_min_integration_steps(ir->etc);
3390 if (nstcmin > 1)
3392 if (tau_min/(ir->delta_t*ir->nsttcouple) < nstcmin - 10*GMX_REAL_EPS)
3394 sprintf(warn_buf, "For proper integration of the %s thermostat, tau-t (%g) should be at least %d times larger than nsttcouple*dt (%g)",
3395 ETCOUPLTYPE(ir->etc),
3396 tau_min, nstcmin,
3397 ir->nsttcouple*ir->delta_t);
3398 warning(wi, warn_buf);
3401 for (i = 0; (i < nr); i++)
3403 ir->opts.ref_t[i] = strtod(ptr2[i], &endptr);
3404 if (*endptr != 0)
3406 warning_error(wi, "Invalid value for mdp option ref-t. ref-t should only consist of real numbers separated by spaces.");
3408 if (ir->opts.ref_t[i] < 0)
3410 gmx_fatal(FARGS, "ref-t for group %d negative", i);
3413 /* set the lambda mc temperature to the md integrator temperature (which should be defined
3414 if we are in this conditional) if mc_temp is negative */
3415 if (ir->expandedvals->mc_temp < 0)
3417 ir->expandedvals->mc_temp = ir->opts.ref_t[0]; /*for now, set to the first reft */
3421 /* Simulated annealing for each group. There are nr groups */
3422 nSA = str_nelem(is->anneal, MAXPTR, ptr1);
3423 if (nSA == 1 && (ptr1[0][0] == 'n' || ptr1[0][0] == 'N'))
3425 nSA = 0;
3427 if (nSA > 0 && nSA != nr)
3429 gmx_fatal(FARGS, "Not enough annealing values: %d (for %d groups)\n", nSA, nr);
3431 else
3433 snew(ir->opts.annealing, nr);
3434 snew(ir->opts.anneal_npoints, nr);
3435 snew(ir->opts.anneal_time, nr);
3436 snew(ir->opts.anneal_temp, nr);
3437 for (i = 0; i < nr; i++)
3439 ir->opts.annealing[i] = eannNO;
3440 ir->opts.anneal_npoints[i] = 0;
3441 ir->opts.anneal_time[i] = nullptr;
3442 ir->opts.anneal_temp[i] = nullptr;
3444 if (nSA > 0)
3446 bAnneal = FALSE;
3447 for (i = 0; i < nr; i++)
3449 if (ptr1[i][0] == 'n' || ptr1[i][0] == 'N')
3451 ir->opts.annealing[i] = eannNO;
3453 else if (ptr1[i][0] == 's' || ptr1[i][0] == 'S')
3455 ir->opts.annealing[i] = eannSINGLE;
3456 bAnneal = TRUE;
3458 else if (ptr1[i][0] == 'p' || ptr1[i][0] == 'P')
3460 ir->opts.annealing[i] = eannPERIODIC;
3461 bAnneal = TRUE;
3464 if (bAnneal)
3466 /* Read the other fields too */
3467 nSA_points = str_nelem(is->anneal_npoints, MAXPTR, ptr1);
3468 if (nSA_points != nSA)
3470 gmx_fatal(FARGS, "Found %d annealing-npoints values for %d groups\n", nSA_points, nSA);
3472 for (k = 0, i = 0; i < nr; i++)
3474 ir->opts.anneal_npoints[i] = strtol(ptr1[i], &endptr, 10);
3475 if (*endptr != 0)
3477 warning_error(wi, "Invalid value for mdp option annealing-npoints. annealing should only consist of integers separated by spaces.");
3479 if (ir->opts.anneal_npoints[i] == 1)
3481 gmx_fatal(FARGS, "Please specify at least a start and an end point for annealing\n");
3483 snew(ir->opts.anneal_time[i], ir->opts.anneal_npoints[i]);
3484 snew(ir->opts.anneal_temp[i], ir->opts.anneal_npoints[i]);
3485 k += ir->opts.anneal_npoints[i];
3488 nSA_time = str_nelem(is->anneal_time, MAXPTR, ptr1);
3489 if (nSA_time != k)
3491 gmx_fatal(FARGS, "Found %d annealing-time values, wanted %d\n", nSA_time, k);
3493 nSA_temp = str_nelem(is->anneal_temp, MAXPTR, ptr2);
3494 if (nSA_temp != k)
3496 gmx_fatal(FARGS, "Found %d annealing-temp values, wanted %d\n", nSA_temp, k);
3499 for (i = 0, k = 0; i < nr; i++)
3502 for (j = 0; j < ir->opts.anneal_npoints[i]; j++)
3504 ir->opts.anneal_time[i][j] = strtod(ptr1[k], &endptr);
3505 if (*endptr != 0)
3507 warning_error(wi, "Invalid value for mdp option anneal-time. anneal-time should only consist of real numbers separated by spaces.");
3509 ir->opts.anneal_temp[i][j] = strtod(ptr2[k], &endptr);
3510 if (*endptr != 0)
3512 warning_error(wi, "Invalid value for anneal-temp. anneal-temp should only consist of real numbers separated by spaces.");
3514 if (j == 0)
3516 if (ir->opts.anneal_time[i][0] > (ir->init_t+GMX_REAL_EPS))
3518 gmx_fatal(FARGS, "First time point for annealing > init_t.\n");
3521 else
3523 /* j>0 */
3524 if (ir->opts.anneal_time[i][j] < ir->opts.anneal_time[i][j-1])
3526 gmx_fatal(FARGS, "Annealing timepoints out of order: t=%f comes after t=%f\n",
3527 ir->opts.anneal_time[i][j], ir->opts.anneal_time[i][j-1]);
3530 if (ir->opts.anneal_temp[i][j] < 0)
3532 gmx_fatal(FARGS, "Found negative temperature in annealing: %f\n", ir->opts.anneal_temp[i][j]);
3534 k++;
3537 /* Print out some summary information, to make sure we got it right */
3538 for (i = 0, k = 0; i < nr; i++)
3540 if (ir->opts.annealing[i] != eannNO)
3542 j = groups->grps[egcTC].nm_ind[i];
3543 fprintf(stderr, "Simulated annealing for group %s: %s, %d timepoints\n",
3544 *(groups->grpname[j]), eann_names[ir->opts.annealing[i]],
3545 ir->opts.anneal_npoints[i]);
3546 fprintf(stderr, "Time (ps) Temperature (K)\n");
3547 /* All terms except the last one */
3548 for (j = 0; j < (ir->opts.anneal_npoints[i]-1); j++)
3550 fprintf(stderr, "%9.1f %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3553 /* Finally the last one */
3554 j = ir->opts.anneal_npoints[i]-1;
3555 if (ir->opts.annealing[i] == eannSINGLE)
3557 fprintf(stderr, "%9.1f- %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3559 else
3561 fprintf(stderr, "%9.1f %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3562 if (fabs(ir->opts.anneal_temp[i][j]-ir->opts.anneal_temp[i][0]) > GMX_REAL_EPS)
3564 warning_note(wi, "There is a temperature jump when your annealing loops back.\n");
3573 if (ir->bPull)
3575 make_pull_groups(ir->pull, is->pull_grp, grps, gnames);
3577 make_pull_coords(ir->pull);
3580 if (ir->bRot)
3582 make_rotation_groups(ir->rot, is->rot_grp, grps, gnames);
3585 if (ir->eSwapCoords != eswapNO)
3587 make_swap_groups(ir->swap, grps, gnames);
3590 /* Make indices for IMD session */
3591 if (ir->bIMD)
3593 make_IMD_group(ir->imd, is->imd_grp, grps, gnames);
3596 nacc = str_nelem(is->acc, MAXPTR, ptr1);
3597 nacg = str_nelem(is->accgrps, MAXPTR, ptr2);
3598 if (nacg*DIM != nacc)
3600 gmx_fatal(FARGS, "Invalid Acceleration input: %d groups and %d acc. values",
3601 nacg, nacc);
3603 do_numbering(natoms, groups, nacg, ptr2, grps, gnames, egcACC,
3604 restnm, egrptpALL_GENREST, bVerbose, wi);
3605 nr = groups->grps[egcACC].nr;
3606 snew(ir->opts.acc, nr);
3607 ir->opts.ngacc = nr;
3609 for (i = k = 0; (i < nacg); i++)
3611 for (j = 0; (j < DIM); j++, k++)
3613 ir->opts.acc[i][j] = strtod(ptr1[k], &endptr);
3614 if (*endptr != 0)
3616 warning_error(wi, "Invalid value for mdp option accelerate. accelerate should only consist of real numbers separated by spaces.");
3620 for (; (i < nr); i++)
3622 for (j = 0; (j < DIM); j++)
3624 ir->opts.acc[i][j] = 0;
3628 nfrdim = str_nelem(is->frdim, MAXPTR, ptr1);
3629 nfreeze = str_nelem(is->freeze, MAXPTR, ptr2);
3630 if (nfrdim != DIM*nfreeze)
3632 gmx_fatal(FARGS, "Invalid Freezing input: %d groups and %d freeze values",
3633 nfreeze, nfrdim);
3635 do_numbering(natoms, groups, nfreeze, ptr2, grps, gnames, egcFREEZE,
3636 restnm, egrptpALL_GENREST, bVerbose, wi);
3637 nr = groups->grps[egcFREEZE].nr;
3638 ir->opts.ngfrz = nr;
3639 snew(ir->opts.nFreeze, nr);
3640 for (i = k = 0; (i < nfreeze); i++)
3642 for (j = 0; (j < DIM); j++, k++)
3644 ir->opts.nFreeze[i][j] = (gmx_strncasecmp(ptr1[k], "Y", 1) == 0);
3645 if (!ir->opts.nFreeze[i][j])
3647 if (gmx_strncasecmp(ptr1[k], "N", 1) != 0)
3649 sprintf(warnbuf, "Please use Y(ES) or N(O) for freezedim only "
3650 "(not %s)", ptr1[k]);
3651 warning(wi, warn_buf);
3656 for (; (i < nr); i++)
3658 for (j = 0; (j < DIM); j++)
3660 ir->opts.nFreeze[i][j] = 0;
3664 nenergy = str_nelem(is->energy, MAXPTR, ptr1);
3665 do_numbering(natoms, groups, nenergy, ptr1, grps, gnames, egcENER,
3666 restnm, egrptpALL_GENREST, bVerbose, wi);
3667 add_wall_energrps(groups, ir->nwall, symtab);
3668 ir->opts.ngener = groups->grps[egcENER].nr;
3669 nvcm = str_nelem(is->vcm, MAXPTR, ptr1);
3670 bRest =
3671 do_numbering(natoms, groups, nvcm, ptr1, grps, gnames, egcVCM,
3672 restnm, nvcm == 0 ? egrptpALL_GENREST : egrptpPART, bVerbose, wi);
3673 if (bRest)
3675 warning(wi, "Some atoms are not part of any center of mass motion removal group.\n"
3676 "This may lead to artifacts.\n"
3677 "In most cases one should use one group for the whole system.");
3680 /* Now we have filled the freeze struct, so we can calculate NRDF */
3681 calc_nrdf(mtop, ir, gnames);
3683 nuser = str_nelem(is->user1, MAXPTR, ptr1);
3684 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser1,
3685 restnm, egrptpALL_GENREST, bVerbose, wi);
3686 nuser = str_nelem(is->user2, MAXPTR, ptr1);
3687 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser2,
3688 restnm, egrptpALL_GENREST, bVerbose, wi);
3689 nuser = str_nelem(is->x_compressed_groups, MAXPTR, ptr1);
3690 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcCompressedX,
3691 restnm, egrptpONE, bVerbose, wi);
3692 nofg = str_nelem(is->orirefitgrp, MAXPTR, ptr1);
3693 do_numbering(natoms, groups, nofg, ptr1, grps, gnames, egcORFIT,
3694 restnm, egrptpALL_GENREST, bVerbose, wi);
3696 /* QMMM input processing */
3697 nQMg = str_nelem(is->QMMM, MAXPTR, ptr1);
3698 nQMmethod = str_nelem(is->QMmethod, MAXPTR, ptr2);
3699 nQMbasis = str_nelem(is->QMbasis, MAXPTR, ptr3);
3700 if ((nQMmethod != nQMg) || (nQMbasis != nQMg))
3702 gmx_fatal(FARGS, "Invalid QMMM input: %d groups %d basissets"
3703 " and %d methods\n", nQMg, nQMbasis, nQMmethod);
3705 /* group rest, if any, is always MM! */
3706 do_numbering(natoms, groups, nQMg, ptr1, grps, gnames, egcQMMM,
3707 restnm, egrptpALL_GENREST, bVerbose, wi);
3708 nr = nQMg; /*atoms->grps[egcQMMM].nr;*/
3709 ir->opts.ngQM = nQMg;
3710 snew(ir->opts.QMmethod, nr);
3711 snew(ir->opts.QMbasis, nr);
3712 for (i = 0; i < nr; i++)
3714 /* input consists of strings: RHF CASSCF PM3 .. These need to be
3715 * converted to the corresponding enum in names.c
3717 ir->opts.QMmethod[i] = search_QMstring(ptr2[i], eQMmethodNR,
3718 eQMmethod_names);
3719 ir->opts.QMbasis[i] = search_QMstring(ptr3[i], eQMbasisNR,
3720 eQMbasis_names);
3723 str_nelem(is->QMmult, MAXPTR, ptr1);
3724 str_nelem(is->QMcharge, MAXPTR, ptr2);
3725 str_nelem(is->bSH, MAXPTR, ptr3);
3726 snew(ir->opts.QMmult, nr);
3727 snew(ir->opts.QMcharge, nr);
3728 snew(ir->opts.bSH, nr);
3730 for (i = 0; i < nr; i++)
3732 ir->opts.QMmult[i] = strtol(ptr1[i], &endptr, 10);
3733 if (*endptr != 0)
3735 warning_error(wi, "Invalid value for mdp option QMmult. QMmult should only consist of integers separated by spaces.");
3737 ir->opts.QMcharge[i] = strtol(ptr2[i], &endptr, 10);
3738 if (*endptr != 0)
3740 warning_error(wi, "Invalid value for mdp option QMcharge. QMcharge should only consist of integers separated by spaces.");
3742 ir->opts.bSH[i] = (gmx_strncasecmp(ptr3[i], "Y", 1) == 0);
3745 str_nelem(is->CASelectrons, MAXPTR, ptr1);
3746 str_nelem(is->CASorbitals, MAXPTR, ptr2);
3747 snew(ir->opts.CASelectrons, nr);
3748 snew(ir->opts.CASorbitals, nr);
3749 for (i = 0; i < nr; i++)
3751 ir->opts.CASelectrons[i] = strtol(ptr1[i], &endptr, 10);
3752 if (*endptr != 0)
3754 warning_error(wi, "Invalid value for mdp option CASelectrons. CASelectrons should only consist of integers separated by spaces.");
3756 ir->opts.CASorbitals[i] = strtol(ptr2[i], &endptr, 10);
3757 if (*endptr != 0)
3759 warning_error(wi, "Invalid value for mdp option CASorbitals. CASorbitals should only consist of integers separated by spaces.");
3763 str_nelem(is->SAon, MAXPTR, ptr1);
3764 str_nelem(is->SAoff, MAXPTR, ptr2);
3765 str_nelem(is->SAsteps, MAXPTR, ptr3);
3766 snew(ir->opts.SAon, nr);
3767 snew(ir->opts.SAoff, nr);
3768 snew(ir->opts.SAsteps, nr);
3770 for (i = 0; i < nr; i++)
3772 ir->opts.SAon[i] = strtod(ptr1[i], &endptr);
3773 if (*endptr != 0)
3775 warning_error(wi, "Invalid value for mdp option SAon. SAon should only consist of real numbers separated by spaces.");
3777 ir->opts.SAoff[i] = strtod(ptr2[i], &endptr);
3778 if (*endptr != 0)
3780 warning_error(wi, "Invalid value for mdp option SAoff. SAoff should only consist of real numbers separated by spaces.");
3782 ir->opts.SAsteps[i] = strtol(ptr3[i], &endptr, 10);
3783 if (*endptr != 0)
3785 warning_error(wi, "Invalid value for mdp option SAsteps. SAsteps should only consist of integers separated by spaces.");
3788 /* end of QMMM input */
3790 if (bVerbose)
3792 for (i = 0; (i < egcNR); i++)
3794 fprintf(stderr, "%-16s has %d element(s):", gtypes[i], groups->grps[i].nr);
3795 for (j = 0; (j < groups->grps[i].nr); j++)
3797 fprintf(stderr, " %s", *(groups->grpname[groups->grps[i].nm_ind[j]]));
3799 fprintf(stderr, "\n");
3803 nr = groups->grps[egcENER].nr;
3804 snew(ir->opts.egp_flags, nr*nr);
3806 bExcl = do_egp_flag(ir, groups, "energygrp-excl", is->egpexcl, EGP_EXCL);
3807 if (bExcl && ir->cutoff_scheme == ecutsVERLET)
3809 warning_error(wi, "Energy group exclusions are not (yet) implemented for the Verlet scheme");
3811 if (bExcl && EEL_FULL(ir->coulombtype))
3813 warning(wi, "Can not exclude the lattice Coulomb energy between energy groups");
3816 bTable = do_egp_flag(ir, groups, "energygrp-table", is->egptable, EGP_TABLE);
3817 if (bTable && !(ir->vdwtype == evdwUSER) &&
3818 !(ir->coulombtype == eelUSER) && !(ir->coulombtype == eelPMEUSER) &&
3819 !(ir->coulombtype == eelPMEUSERSWITCH))
3821 gmx_fatal(FARGS, "Can only have energy group pair tables in combination with user tables for VdW and/or Coulomb");
3824 for (i = 0; (i < grps->nr); i++)
3826 sfree(gnames[i]);
3828 sfree(gnames);
3829 done_blocka(grps);
3830 sfree(grps);
3836 static void check_disre(gmx_mtop_t *mtop)
3838 gmx_ffparams_t *ffparams;
3839 t_functype *functype;
3840 t_iparams *ip;
3841 int i, ndouble, ftype;
3842 int label, old_label;
3844 if (gmx_mtop_ftype_count(mtop, F_DISRES) > 0)
3846 ffparams = &mtop->ffparams;
3847 functype = ffparams->functype;
3848 ip = ffparams->iparams;
3849 ndouble = 0;
3850 old_label = -1;
3851 for (i = 0; i < ffparams->ntypes; i++)
3853 ftype = functype[i];
3854 if (ftype == F_DISRES)
3856 label = ip[i].disres.label;
3857 if (label == old_label)
3859 fprintf(stderr, "Distance restraint index %d occurs twice\n", label);
3860 ndouble++;
3862 old_label = label;
3865 if (ndouble > 0)
3867 gmx_fatal(FARGS, "Found %d double distance restraint indices,\n"
3868 "probably the parameters for multiple pairs in one restraint "
3869 "are not identical\n", ndouble);
3874 static gmx_bool absolute_reference(t_inputrec *ir, gmx_mtop_t *sys,
3875 gmx_bool posres_only,
3876 ivec AbsRef)
3878 int d, g, i;
3879 gmx_mtop_ilistloop_t iloop;
3880 t_ilist *ilist;
3881 int nmol;
3882 t_iparams *pr;
3884 clear_ivec(AbsRef);
3886 if (!posres_only)
3888 /* Check the COM */
3889 for (d = 0; d < DIM; d++)
3891 AbsRef[d] = (d < ndof_com(ir) ? 0 : 1);
3893 /* Check for freeze groups */
3894 for (g = 0; g < ir->opts.ngfrz; g++)
3896 for (d = 0; d < DIM; d++)
3898 if (ir->opts.nFreeze[g][d] != 0)
3900 AbsRef[d] = 1;
3906 /* Check for position restraints */
3907 iloop = gmx_mtop_ilistloop_init(sys);
3908 while (gmx_mtop_ilistloop_next(iloop, &ilist, &nmol))
3910 if (nmol > 0 &&
3911 (AbsRef[XX] == 0 || AbsRef[YY] == 0 || AbsRef[ZZ] == 0))
3913 for (i = 0; i < ilist[F_POSRES].nr; i += 2)
3915 pr = &sys->ffparams.iparams[ilist[F_POSRES].iatoms[i]];
3916 for (d = 0; d < DIM; d++)
3918 if (pr->posres.fcA[d] != 0)
3920 AbsRef[d] = 1;
3924 for (i = 0; i < ilist[F_FBPOSRES].nr; i += 2)
3926 /* Check for flat-bottom posres */
3927 pr = &sys->ffparams.iparams[ilist[F_FBPOSRES].iatoms[i]];
3928 if (pr->fbposres.k != 0)
3930 switch (pr->fbposres.geom)
3932 case efbposresSPHERE:
3933 AbsRef[XX] = AbsRef[YY] = AbsRef[ZZ] = 1;
3934 break;
3935 case efbposresCYLINDERX:
3936 AbsRef[YY] = AbsRef[ZZ] = 1;
3937 break;
3938 case efbposresCYLINDERY:
3939 AbsRef[XX] = AbsRef[ZZ] = 1;
3940 break;
3941 case efbposresCYLINDER:
3942 /* efbposres is a synonym for efbposresCYLINDERZ for backwards compatibility */
3943 case efbposresCYLINDERZ:
3944 AbsRef[XX] = AbsRef[YY] = 1;
3945 break;
3946 case efbposresX: /* d=XX */
3947 case efbposresY: /* d=YY */
3948 case efbposresZ: /* d=ZZ */
3949 d = pr->fbposres.geom - efbposresX;
3950 AbsRef[d] = 1;
3951 break;
3952 default:
3953 gmx_fatal(FARGS, " Invalid geometry for flat-bottom position restraint.\n"
3954 "Expected nr between 1 and %d. Found %d\n", efbposresNR-1,
3955 pr->fbposres.geom);
3962 return (AbsRef[XX] != 0 && AbsRef[YY] != 0 && AbsRef[ZZ] != 0);
3965 static void
3966 check_combination_rule_differences(const gmx_mtop_t *mtop, int state,
3967 gmx_bool *bC6ParametersWorkWithGeometricRules,
3968 gmx_bool *bC6ParametersWorkWithLBRules,
3969 gmx_bool *bLBRulesPossible)
3971 int ntypes, tpi, tpj;
3972 int *typecount;
3973 real tol;
3974 double c6i, c6j, c12i, c12j;
3975 double c6, c6_geometric, c6_LB;
3976 double sigmai, sigmaj, epsi, epsj;
3977 gmx_bool bCanDoLBRules, bCanDoGeometricRules;
3978 const char *ptr;
3980 /* A tolerance of 1e-5 seems reasonable for (possibly hand-typed)
3981 * force-field floating point parameters.
3983 tol = 1e-5;
3984 ptr = getenv("GMX_LJCOMB_TOL");
3985 if (ptr != nullptr)
3987 double dbl;
3988 double gmx_unused canary;
3990 if (sscanf(ptr, "%lf%lf", &dbl, &canary) != 1)
3992 gmx_fatal(FARGS, "Could not parse a single floating-point number from GMX_LJCOMB_TOL (%s)", ptr);
3994 tol = dbl;
3997 *bC6ParametersWorkWithLBRules = TRUE;
3998 *bC6ParametersWorkWithGeometricRules = TRUE;
3999 bCanDoLBRules = TRUE;
4000 ntypes = mtop->ffparams.atnr;
4001 snew(typecount, ntypes);
4002 gmx_mtop_count_atomtypes(mtop, state, typecount);
4003 *bLBRulesPossible = TRUE;
4004 for (tpi = 0; tpi < ntypes; ++tpi)
4006 c6i = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c6;
4007 c12i = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c12;
4008 for (tpj = tpi; tpj < ntypes; ++tpj)
4010 c6j = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c6;
4011 c12j = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c12;
4012 c6 = mtop->ffparams.iparams[ntypes * tpi + tpj].lj.c6;
4013 c6_geometric = std::sqrt(c6i * c6j);
4014 if (!gmx_numzero(c6_geometric))
4016 if (!gmx_numzero(c12i) && !gmx_numzero(c12j))
4018 sigmai = gmx::sixthroot(c12i / c6i);
4019 sigmaj = gmx::sixthroot(c12j / c6j);
4020 epsi = c6i * c6i /(4.0 * c12i);
4021 epsj = c6j * c6j /(4.0 * c12j);
4022 c6_LB = 4.0 * std::sqrt(epsi * epsj) * gmx::power6(0.5 * (sigmai + sigmaj));
4024 else
4026 *bLBRulesPossible = FALSE;
4027 c6_LB = c6_geometric;
4029 bCanDoLBRules = gmx_within_tol(c6_LB, c6, tol);
4032 if (FALSE == bCanDoLBRules)
4034 *bC6ParametersWorkWithLBRules = FALSE;
4037 bCanDoGeometricRules = gmx_within_tol(c6_geometric, c6, tol);
4039 if (FALSE == bCanDoGeometricRules)
4041 *bC6ParametersWorkWithGeometricRules = FALSE;
4045 sfree(typecount);
4048 static void
4049 check_combination_rules(const t_inputrec *ir, const gmx_mtop_t *mtop,
4050 warninp_t wi)
4052 gmx_bool bLBRulesPossible, bC6ParametersWorkWithGeometricRules, bC6ParametersWorkWithLBRules;
4054 check_combination_rule_differences(mtop, 0,
4055 &bC6ParametersWorkWithGeometricRules,
4056 &bC6ParametersWorkWithLBRules,
4057 &bLBRulesPossible);
4058 if (ir->ljpme_combination_rule == eljpmeLB)
4060 if (FALSE == bC6ParametersWorkWithLBRules || FALSE == bLBRulesPossible)
4062 warning(wi, "You are using arithmetic-geometric combination rules "
4063 "in LJ-PME, but your non-bonded C6 parameters do not "
4064 "follow these rules.");
4067 else
4069 if (FALSE == bC6ParametersWorkWithGeometricRules)
4071 if (ir->eDispCorr != edispcNO)
4073 warning_note(wi, "You are using geometric combination rules in "
4074 "LJ-PME, but your non-bonded C6 parameters do "
4075 "not follow these rules. "
4076 "This will introduce very small errors in the forces and energies in "
4077 "your simulations. Dispersion correction will correct total energy "
4078 "and/or pressure for isotropic systems, but not forces or surface tensions.");
4080 else
4082 warning_note(wi, "You are using geometric combination rules in "
4083 "LJ-PME, but your non-bonded C6 parameters do "
4084 "not follow these rules. "
4085 "This will introduce very small errors in the forces and energies in "
4086 "your simulations. If your system is homogeneous, consider using dispersion correction "
4087 "for the total energy and pressure.");
4093 void triple_check(const char *mdparin, t_inputrec *ir, gmx_mtop_t *sys,
4094 warninp_t wi)
4096 char err_buf[STRLEN];
4097 int i, m, c, nmol;
4098 gmx_bool bCharge, bAcc;
4099 real *mgrp, mt;
4100 rvec acc;
4101 gmx_mtop_atomloop_block_t aloopb;
4102 gmx_mtop_atomloop_all_t aloop;
4103 ivec AbsRef;
4104 char warn_buf[STRLEN];
4106 set_warning_line(wi, mdparin, -1);
4108 if (ir->cutoff_scheme == ecutsVERLET &&
4109 ir->verletbuf_tol > 0 &&
4110 ir->nstlist > 1 &&
4111 ((EI_MD(ir->eI) || EI_SD(ir->eI)) &&
4112 (ir->etc == etcVRESCALE || ir->etc == etcBERENDSEN)))
4114 /* Check if a too small Verlet buffer might potentially
4115 * cause more drift than the thermostat can couple off.
4117 /* Temperature error fraction for warning and suggestion */
4118 const real T_error_warn = 0.002;
4119 const real T_error_suggest = 0.001;
4120 /* For safety: 2 DOF per atom (typical with constraints) */
4121 const real nrdf_at = 2;
4122 real T, tau, max_T_error;
4123 int i;
4125 T = 0;
4126 tau = 0;
4127 for (i = 0; i < ir->opts.ngtc; i++)
4129 T = std::max(T, ir->opts.ref_t[i]);
4130 tau = std::max(tau, ir->opts.tau_t[i]);
4132 if (T > 0)
4134 /* This is a worst case estimate of the temperature error,
4135 * assuming perfect buffer estimation and no cancelation
4136 * of errors. The factor 0.5 is because energy distributes
4137 * equally over Ekin and Epot.
4139 max_T_error = 0.5*tau*ir->verletbuf_tol/(nrdf_at*BOLTZ*T);
4140 if (max_T_error > T_error_warn)
4142 sprintf(warn_buf, "With a verlet-buffer-tolerance of %g kJ/mol/ps, a reference temperature of %g and a tau_t of %g, your temperature might be off by up to %.1f%%. To ensure the error is below %.1f%%, decrease verlet-buffer-tolerance to %.0e or decrease tau_t.",
4143 ir->verletbuf_tol, T, tau,
4144 100*max_T_error,
4145 100*T_error_suggest,
4146 ir->verletbuf_tol*T_error_suggest/max_T_error);
4147 warning(wi, warn_buf);
4152 if (ETC_ANDERSEN(ir->etc))
4154 int i;
4156 for (i = 0; i < ir->opts.ngtc; i++)
4158 sprintf(err_buf, "all tau_t must currently be equal using Andersen temperature control, violated for group %d", i);
4159 CHECK(ir->opts.tau_t[0] != ir->opts.tau_t[i]);
4160 sprintf(err_buf, "all tau_t must be positive using Andersen temperature control, tau_t[%d]=%10.6f",
4161 i, ir->opts.tau_t[i]);
4162 CHECK(ir->opts.tau_t[i] < 0);
4165 if (ir->etc == etcANDERSENMASSIVE && ir->comm_mode != ecmNO)
4167 for (i = 0; i < ir->opts.ngtc; i++)
4169 int nsteps = static_cast<int>(ir->opts.tau_t[i]/ir->delta_t + 0.5);
4170 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);
4171 CHECK(nsteps % ir->nstcomm != 0);
4176 if (EI_DYNAMICS(ir->eI) && !EI_SD(ir->eI) && ir->eI != eiBD &&
4177 ir->comm_mode == ecmNO &&
4178 !(absolute_reference(ir, sys, FALSE, AbsRef) || ir->nsteps <= 10) &&
4179 !ETC_ANDERSEN(ir->etc))
4181 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");
4184 /* Check for pressure coupling with absolute position restraints */
4185 if (ir->epc != epcNO && ir->refcoord_scaling == erscNO)
4187 absolute_reference(ir, sys, TRUE, AbsRef);
4189 for (m = 0; m < DIM; m++)
4191 if (AbsRef[m] && norm2(ir->compress[m]) > 0)
4193 warning(wi, "You are using pressure coupling with absolute position restraints, this will give artifacts. Use the refcoord_scaling option.");
4194 break;
4200 bCharge = FALSE;
4201 aloopb = gmx_mtop_atomloop_block_init(sys);
4202 const t_atom *atom;
4203 while (gmx_mtop_atomloop_block_next(aloopb, &atom, &nmol))
4205 if (atom->q != 0 || atom->qB != 0)
4207 bCharge = TRUE;
4211 if (!bCharge)
4213 if (EEL_FULL(ir->coulombtype))
4215 sprintf(err_buf,
4216 "You are using full electrostatics treatment %s for a system without charges.\n"
4217 "This costs a lot of performance for just processing zeros, consider using %s instead.\n",
4218 EELTYPE(ir->coulombtype), EELTYPE(eelCUT));
4219 warning(wi, err_buf);
4222 else
4224 if (ir->coulombtype == eelCUT && ir->rcoulomb > 0 && !ir->implicit_solvent)
4226 sprintf(err_buf,
4227 "You are using a plain Coulomb cut-off, which might produce artifacts.\n"
4228 "You might want to consider using %s electrostatics.\n",
4229 EELTYPE(eelPME));
4230 warning_note(wi, err_buf);
4234 /* Check if combination rules used in LJ-PME are the same as in the force field */
4235 if (EVDW_PME(ir->vdwtype))
4237 check_combination_rules(ir, sys, wi);
4240 /* Generalized reaction field */
4241 if (ir->opts.ngtc == 0)
4243 sprintf(err_buf, "No temperature coupling while using coulombtype %s",
4244 eel_names[eelGRF]);
4245 CHECK(ir->coulombtype == eelGRF);
4247 else
4249 sprintf(err_buf, "When using coulombtype = %s"
4250 " ref-t for temperature coupling should be > 0",
4251 eel_names[eelGRF]);
4252 CHECK((ir->coulombtype == eelGRF) && (ir->opts.ref_t[0] <= 0));
4255 bAcc = FALSE;
4256 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4258 for (m = 0; (m < DIM); m++)
4260 if (fabs(ir->opts.acc[i][m]) > 1e-6)
4262 bAcc = TRUE;
4266 if (bAcc)
4268 clear_rvec(acc);
4269 snew(mgrp, sys->groups.grps[egcACC].nr);
4270 aloop = gmx_mtop_atomloop_all_init(sys);
4271 const t_atom *atom;
4272 while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
4274 mgrp[ggrpnr(&sys->groups, egcACC, i)] += atom->m;
4276 mt = 0.0;
4277 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4279 for (m = 0; (m < DIM); m++)
4281 acc[m] += ir->opts.acc[i][m]*mgrp[i];
4283 mt += mgrp[i];
4285 for (m = 0; (m < DIM); m++)
4287 if (fabs(acc[m]) > 1e-6)
4289 const char *dim[DIM] = { "X", "Y", "Z" };
4290 fprintf(stderr,
4291 "Net Acceleration in %s direction, will %s be corrected\n",
4292 dim[m], ir->nstcomm != 0 ? "" : "not");
4293 if (ir->nstcomm != 0 && m < ndof_com(ir))
4295 acc[m] /= mt;
4296 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4298 ir->opts.acc[i][m] -= acc[m];
4303 sfree(mgrp);
4306 if (ir->efep != efepNO && ir->fepvals->sc_alpha != 0 &&
4307 !gmx_within_tol(sys->ffparams.reppow, 12.0, 10*GMX_DOUBLE_EPS))
4309 gmx_fatal(FARGS, "Soft-core interactions are only supported with VdW repulsion power 12");
4312 if (ir->bPull)
4314 gmx_bool bWarned;
4316 bWarned = FALSE;
4317 for (i = 0; i < ir->pull->ncoord && !bWarned; i++)
4319 if (ir->pull->coord[i].group[0] == 0 ||
4320 ir->pull->coord[i].group[1] == 0)
4322 absolute_reference(ir, sys, FALSE, AbsRef);
4323 for (m = 0; m < DIM; m++)
4325 if (ir->pull->coord[i].dim[m] && !AbsRef[m])
4327 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.");
4328 bWarned = TRUE;
4329 break;
4335 for (i = 0; i < 3; i++)
4337 for (m = 0; m <= i; m++)
4339 if ((ir->epc != epcNO && ir->compress[i][m] != 0) ||
4340 ir->deform[i][m] != 0)
4342 for (c = 0; c < ir->pull->ncoord; c++)
4344 if (ir->pull->coord[c].eGeom == epullgDIRPBC &&
4345 ir->pull->coord[c].vec[m] != 0)
4347 gmx_fatal(FARGS, "Can not have dynamic box while using pull geometry '%s' (dim %c)", EPULLGEOM(ir->pull->coord[c].eGeom), 'x'+m);
4355 check_disre(sys);
4358 void double_check(t_inputrec *ir, matrix box,
4359 gmx_bool bHasNormalConstraints,
4360 gmx_bool bHasAnyConstraints,
4361 warninp_t wi)
4363 real min_size;
4364 char warn_buf[STRLEN];
4365 const char *ptr;
4367 ptr = check_box(ir->ePBC, box);
4368 if (ptr)
4370 warning_error(wi, ptr);
4373 if (bHasNormalConstraints && ir->eConstrAlg == econtSHAKE)
4375 if (ir->shake_tol <= 0.0)
4377 sprintf(warn_buf, "ERROR: shake-tol must be > 0 instead of %g\n",
4378 ir->shake_tol);
4379 warning_error(wi, warn_buf);
4383 if ( (ir->eConstrAlg == econtLINCS) && bHasNormalConstraints)
4385 /* If we have Lincs constraints: */
4386 if (ir->eI == eiMD && ir->etc == etcNO &&
4387 ir->eConstrAlg == econtLINCS && ir->nLincsIter == 1)
4389 sprintf(warn_buf, "For energy conservation with LINCS, lincs_iter should be 2 or larger.\n");
4390 warning_note(wi, warn_buf);
4393 if ((ir->eI == eiCG || ir->eI == eiLBFGS) && (ir->nProjOrder < 8))
4395 sprintf(warn_buf, "For accurate %s with LINCS constraints, lincs-order should be 8 or more.", ei_names[ir->eI]);
4396 warning_note(wi, warn_buf);
4398 if (ir->epc == epcMTTK)
4400 warning_error(wi, "MTTK not compatible with lincs -- use shake instead.");
4404 if (bHasAnyConstraints && ir->epc == epcMTTK)
4406 warning_error(wi, "Constraints are not implemented with MTTK pressure control.");
4409 if (ir->LincsWarnAngle > 90.0)
4411 sprintf(warn_buf, "lincs-warnangle can not be larger than 90 degrees, setting it to 90.\n");
4412 warning(wi, warn_buf);
4413 ir->LincsWarnAngle = 90.0;
4416 if (ir->ePBC != epbcNONE)
4418 if (ir->nstlist == 0)
4420 warning(wi, "With nstlist=0 atoms are only put into the box at step 0, therefore drifting atoms might cause the simulation to crash.");
4422 if (ir->ns_type == ensGRID)
4424 if (gmx::square(ir->rlist) >= max_cutoff2(ir->ePBC, box))
4426 sprintf(warn_buf, "ERROR: The cut-off length is longer than half the shortest box vector or longer than the smallest box diagonal element. Increase the box size or decrease rlist.\n");
4427 warning_error(wi, warn_buf);
4430 else
4432 min_size = std::min(box[XX][XX], std::min(box[YY][YY], box[ZZ][ZZ]));
4433 if (2*ir->rlist >= min_size)
4435 sprintf(warn_buf, "ERROR: One of the box lengths is smaller than twice the cut-off length. Increase the box size or decrease rlist.");
4436 warning_error(wi, warn_buf);
4437 if (TRICLINIC(box))
4439 fprintf(stderr, "Grid search might allow larger cut-off's than simple search with triclinic boxes.");
4446 void check_chargegroup_radii(const gmx_mtop_t *mtop, const t_inputrec *ir,
4447 rvec *x,
4448 warninp_t wi)
4450 real rvdw1, rvdw2, rcoul1, rcoul2;
4451 char warn_buf[STRLEN];
4453 calc_chargegroup_radii(mtop, x, &rvdw1, &rvdw2, &rcoul1, &rcoul2);
4455 if (rvdw1 > 0)
4457 printf("Largest charge group radii for Van der Waals: %5.3f, %5.3f nm\n",
4458 rvdw1, rvdw2);
4460 if (rcoul1 > 0)
4462 printf("Largest charge group radii for Coulomb: %5.3f, %5.3f nm\n",
4463 rcoul1, rcoul2);
4466 if (ir->rlist > 0)
4468 if (rvdw1 + rvdw2 > ir->rlist ||
4469 rcoul1 + rcoul2 > ir->rlist)
4471 sprintf(warn_buf,
4472 "The sum of the two largest charge group radii (%f) "
4473 "is larger than rlist (%f)\n",
4474 std::max(rvdw1+rvdw2, rcoul1+rcoul2), ir->rlist);
4475 warning(wi, warn_buf);
4477 else
4479 /* Here we do not use the zero at cut-off macro,
4480 * since user defined interactions might purposely
4481 * not be zero at the cut-off.
4483 if (ir_vdw_is_zero_at_cutoff(ir) &&
4484 rvdw1 + rvdw2 > ir->rlist - ir->rvdw)
4486 sprintf(warn_buf, "The sum of the two largest charge group "
4487 "radii (%f) is larger than rlist (%f) - rvdw (%f).\n"
4488 "With exact cut-offs, better performance can be "
4489 "obtained with cutoff-scheme = %s, because it "
4490 "does not use charge groups at all.",
4491 rvdw1+rvdw2,
4492 ir->rlist, ir->rvdw,
4493 ecutscheme_names[ecutsVERLET]);
4494 if (ir_NVE(ir))
4496 warning(wi, warn_buf);
4498 else
4500 warning_note(wi, warn_buf);
4503 if (ir_coulomb_is_zero_at_cutoff(ir) &&
4504 rcoul1 + rcoul2 > ir->rlist - ir->rcoulomb)
4506 sprintf(warn_buf, "The sum of the two largest charge group radii (%f) is larger than rlist (%f) - rcoulomb (%f).\n"
4507 "With exact cut-offs, better performance can be obtained with cutoff-scheme = %s, because it does not use charge groups at all.",
4508 rcoul1+rcoul2,
4509 ir->rlist, ir->rcoulomb,
4510 ecutscheme_names[ecutsVERLET]);
4511 if (ir_NVE(ir))
4513 warning(wi, warn_buf);
4515 else
4517 warning_note(wi, warn_buf);