Merge branch release-2016
[alexxy/gromacs.git] / src / gromacs / gmxpreprocess / readir.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
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.
10  *
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.
15  *
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.
20  *
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.
25  *
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.
33  *
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.
36  */
37 #include "gmxpre.h"
38
39 #include "readir.h"
40
41 #include <ctype.h>
42 #include <limits.h>
43 #include <stdlib.h>
44
45 #include <cmath>
46
47 #include <algorithm>
48 #include <string>
49
50 #include "gromacs/fileio/readinp.h"
51 #include "gromacs/fileio/warninp.h"
52 #include "gromacs/gmxlib/chargegroup.h"
53 #include "gromacs/gmxlib/network.h"
54 #include "gromacs/gmxpreprocess/keyvaluetreemdpwriter.h"
55 #include "gromacs/gmxpreprocess/toputil.h"
56 #include "gromacs/math/functions.h"
57 #include "gromacs/math/units.h"
58 #include "gromacs/math/vec.h"
59 #include "gromacs/mdlib/calc_verletbuf.h"
60 #include "gromacs/mdrunutility/mdmodules.h"
61 #include "gromacs/mdtypes/inputrec.h"
62 #include "gromacs/mdtypes/md_enums.h"
63 #include "gromacs/mdtypes/pull-params.h"
64 #include "gromacs/options/options.h"
65 #include "gromacs/options/treesupport.h"
66 #include "gromacs/pbcutil/pbc.h"
67 #include "gromacs/topology/block.h"
68 #include "gromacs/topology/ifunc.h"
69 #include "gromacs/topology/index.h"
70 #include "gromacs/topology/mtop_util.h"
71 #include "gromacs/topology/symtab.h"
72 #include "gromacs/topology/topology.h"
73 #include "gromacs/utility/cstringutil.h"
74 #include "gromacs/utility/exceptions.h"
75 #include "gromacs/utility/fatalerror.h"
76 #include "gromacs/utility/filestream.h"
77 #include "gromacs/utility/gmxassert.h"
78 #include "gromacs/utility/ikeyvaluetreeerror.h"
79 #include "gromacs/utility/keyvaluetree.h"
80 #include "gromacs/utility/keyvaluetreebuilder.h"
81 #include "gromacs/utility/keyvaluetreetransform.h"
82 #include "gromacs/utility/smalloc.h"
83 #include "gromacs/utility/stringcompare.h"
84 #include "gromacs/utility/stringutil.h"
85 #include "gromacs/utility/textwriter.h"
86
87 #define MAXPTR 254
88 #define NOGID  255
89
90 /* Resource parameters
91  * Do not change any of these until you read the instruction
92  * in readinp.h. Some cpp's do not take spaces after the backslash
93  * (like the c-shell), which will give you a very weird compiler
94  * message.
95  */
96
97 typedef struct t_inputrec_strings
98 {
99     char tcgrps[STRLEN], tau_t[STRLEN], ref_t[STRLEN],
100          acc[STRLEN], accgrps[STRLEN], freeze[STRLEN], frdim[STRLEN],
101          energy[STRLEN], user1[STRLEN], user2[STRLEN], vcm[STRLEN], x_compressed_groups[STRLEN],
102          couple_moltype[STRLEN], orirefitgrp[STRLEN], egptable[STRLEN], egpexcl[STRLEN],
103          wall_atomtype[STRLEN], wall_density[STRLEN], deform[STRLEN], QMMM[STRLEN],
104          imd_grp[STRLEN];
105     char   fep_lambda[efptNR][STRLEN];
106     char   lambda_weights[STRLEN];
107     char **pull_grp;
108     char **rot_grp;
109     char   anneal[STRLEN], anneal_npoints[STRLEN],
110            anneal_time[STRLEN], anneal_temp[STRLEN];
111     char   QMmethod[STRLEN], QMbasis[STRLEN], QMcharge[STRLEN], QMmult[STRLEN],
112            bSH[STRLEN], CASorbitals[STRLEN], CASelectrons[STRLEN], SAon[STRLEN],
113            SAoff[STRLEN], SAsteps[STRLEN];
114
115 } gmx_inputrec_strings;
116
117 static gmx_inputrec_strings *is = nullptr;
118
119 void init_inputrec_strings()
120 {
121     if (is)
122     {
123         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.");
124     }
125     snew(is, 1);
126 }
127
128 void done_inputrec_strings()
129 {
130     sfree(is);
131     is = nullptr;
132 }
133
134
135 enum {
136     egrptpALL,         /* All particles have to be a member of a group.     */
137     egrptpALL_GENREST, /* A rest group with name is generated for particles *
138                         * that are not part of any group.                   */
139     egrptpPART,        /* As egrptpALL_GENREST, but no name is generated    *
140                         * for the rest group.                               */
141     egrptpONE          /* Merge all selected groups into one group,         *
142                         * make a rest group for the remaining particles.    */
143 };
144
145 static const char *constraints[eshNR+1]    = {
146     "none", "h-bonds", "all-bonds", "h-angles", "all-angles", nullptr
147 };
148
149 static const char *couple_lam[ecouplamNR+1]    = {
150     "vdw-q", "vdw", "q", "none", nullptr
151 };
152
153 static void GetSimTemps(int ntemps, t_simtemp *simtemp, double *temperature_lambdas)
154 {
155
156     int i;
157
158     for (i = 0; i < ntemps; i++)
159     {
160         /* simple linear scaling -- allows more control */
161         if (simtemp->eSimTempScale == esimtempLINEAR)
162         {
163             simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*temperature_lambdas[i];
164         }
165         else if (simtemp->eSimTempScale == esimtempGEOMETRIC)  /* should give roughly equal acceptance for constant heat capacity . . . */
166         {
167             simtemp->temperatures[i] = simtemp->simtemp_low * std::pow(simtemp->simtemp_high/simtemp->simtemp_low, static_cast<real>((1.0*i)/(ntemps-1)));
168         }
169         else if (simtemp->eSimTempScale == esimtempEXPONENTIAL)
170         {
171             simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*(std::expm1(temperature_lambdas[i])/std::expm1(1.0));
172         }
173         else
174         {
175             char errorstr[128];
176             sprintf(errorstr, "eSimTempScale=%d not defined", simtemp->eSimTempScale);
177             gmx_fatal(FARGS, errorstr);
178         }
179     }
180 }
181
182
183
184 static void _low_check(gmx_bool b, const char *s, warninp_t wi)
185 {
186     if (b)
187     {
188         warning_error(wi, s);
189     }
190 }
191
192 static void check_nst(const char *desc_nst, int nst,
193                       const char *desc_p, int *p,
194                       warninp_t wi)
195 {
196     char buf[STRLEN];
197
198     if (*p > 0 && *p % nst != 0)
199     {
200         /* Round up to the next multiple of nst */
201         *p = ((*p)/nst + 1)*nst;
202         sprintf(buf, "%s should be a multiple of %s, changing %s to %d\n",
203                 desc_p, desc_nst, desc_p, *p);
204         warning(wi, buf);
205     }
206 }
207
208 static gmx_bool ir_NVE(const t_inputrec *ir)
209 {
210     return (EI_MD(ir->eI) && ir->etc == etcNO);
211 }
212
213 static int lcd(int n1, int n2)
214 {
215     int d, i;
216
217     d = 1;
218     for (i = 2; (i <= n1 && i <= n2); i++)
219     {
220         if (n1 % i == 0 && n2 % i == 0)
221         {
222             d = i;
223         }
224     }
225
226     return d;
227 }
228
229 static void process_interaction_modifier(const t_inputrec *ir, int *eintmod)
230 {
231     if (*eintmod == eintmodPOTSHIFT_VERLET)
232     {
233         if (ir->cutoff_scheme == ecutsVERLET)
234         {
235             *eintmod = eintmodPOTSHIFT;
236         }
237         else
238         {
239             *eintmod = eintmodNONE;
240         }
241     }
242 }
243
244 void check_ir(const char *mdparin, t_inputrec *ir, t_gromppopts *opts,
245               warninp_t wi)
246 /* Check internal consistency.
247  * NOTE: index groups are not set here yet, don't check things
248  * like temperature coupling group options here, but in triple_check
249  */
250 {
251     /* Strange macro: first one fills the err_buf, and then one can check
252      * the condition, which will print the message and increase the error
253      * counter.
254      */
255 #define CHECK(b) _low_check(b, err_buf, wi)
256     char        err_buf[256], warn_buf[STRLEN];
257     int         i, j;
258     real        dt_pcoupl;
259     t_lambda   *fep    = ir->fepvals;
260     t_expanded *expand = ir->expandedvals;
261
262     set_warning_line(wi, mdparin, -1);
263
264     if (ir->coulombtype == eelRF_NEC_UNSUPPORTED)
265     {
266         sprintf(warn_buf, "%s electrostatics is no longer supported",
267                 eel_names[eelRF_NEC_UNSUPPORTED]);
268         warning_error(wi, warn_buf);
269     }
270
271     /* BASIC CUT-OFF STUFF */
272     if (ir->rcoulomb < 0)
273     {
274         warning_error(wi, "rcoulomb should be >= 0");
275     }
276     if (ir->rvdw < 0)
277     {
278         warning_error(wi, "rvdw should be >= 0");
279     }
280     if (ir->rlist < 0 &&
281         !(ir->cutoff_scheme == ecutsVERLET && ir->verletbuf_tol > 0))
282     {
283         warning_error(wi, "rlist should be >= 0");
284     }
285     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.)");
286     CHECK(ir->nstlist < 0);
287
288     process_interaction_modifier(ir, &ir->coulomb_modifier);
289     process_interaction_modifier(ir, &ir->vdw_modifier);
290
291     if (ir->cutoff_scheme == ecutsGROUP)
292     {
293         warning_note(wi,
294                      "The group cutoff scheme is deprecated since GROMACS 5.0 and will be removed in a future "
295                      "release when all interaction forms are supported for the verlet scheme. The verlet "
296                      "scheme already scales better, and it is compatible with GPUs and other accelerators.");
297
298         if (ir->rlist > 0 && ir->rlist < ir->rcoulomb)
299         {
300             gmx_fatal(FARGS, "rcoulomb must not be greater than rlist (twin-range schemes are not supported)");
301         }
302         if (ir->rlist > 0 && ir->rlist < ir->rvdw)
303         {
304             gmx_fatal(FARGS, "rvdw must not be greater than rlist (twin-range schemes are not supported)");
305         }
306
307         if (ir->rlist == 0 && ir->ePBC != epbcNONE)
308         {
309             warning_error(wi, "Can not have an infinite cut-off with PBC");
310         }
311     }
312
313     if (ir->cutoff_scheme == ecutsVERLET)
314     {
315         real rc_max;
316
317         /* Normal Verlet type neighbor-list, currently only limited feature support */
318         if (inputrec2nboundeddim(ir) < 3)
319         {
320             warning_error(wi, "With Verlet lists only full pbc or pbc=xy with walls is supported");
321         }
322
323         // We don't (yet) have general Verlet kernels for rcoulomb!=rvdw
324         if (ir->rcoulomb != ir->rvdw)
325         {
326             // Since we have PME coulomb + LJ cut-off kernels with rcoulomb>rvdw
327             // for PME load balancing, we can support this exception.
328             bool bUsesPmeTwinRangeKernel = (EEL_PME_EWALD(ir->coulombtype) &&
329                                             ir->vdwtype == evdwCUT &&
330                                             ir->rcoulomb > ir->rvdw);
331             if (!bUsesPmeTwinRangeKernel)
332             {
333                 warning_error(wi, "With Verlet lists rcoulomb!=rvdw is not supported (except for rcoulomb>rvdw with PME electrostatics)");
334             }
335         }
336
337         if (ir->vdwtype == evdwSHIFT || ir->vdwtype == evdwSWITCH)
338         {
339             if (ir->vdw_modifier == eintmodNONE ||
340                 ir->vdw_modifier == eintmodPOTSHIFT)
341             {
342                 ir->vdw_modifier = (ir->vdwtype == evdwSHIFT ? eintmodFORCESWITCH : eintmodPOTSWITCH);
343
344                 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]);
345                 warning_note(wi, warn_buf);
346
347                 ir->vdwtype = evdwCUT;
348             }
349             else
350             {
351                 sprintf(warn_buf, "Unsupported combination of vdwtype=%s and vdw_modifier=%s", evdw_names[ir->vdwtype], eintmod_names[ir->vdw_modifier]);
352                 warning_error(wi, warn_buf);
353             }
354         }
355
356         if (!(ir->vdwtype == evdwCUT || ir->vdwtype == evdwPME))
357         {
358             warning_error(wi, "With Verlet lists only cut-off and PME LJ interactions are supported");
359         }
360         if (!(ir->coulombtype == eelCUT || EEL_RF(ir->coulombtype) ||
361               EEL_PME(ir->coulombtype) || ir->coulombtype == eelEWALD))
362         {
363             warning_error(wi, "With Verlet lists only cut-off, reaction-field, PME and Ewald electrostatics are supported");
364         }
365         if (!(ir->coulomb_modifier == eintmodNONE ||
366               ir->coulomb_modifier == eintmodPOTSHIFT))
367         {
368             sprintf(warn_buf, "coulomb_modifier=%s is not supported with the Verlet cut-off scheme", eintmod_names[ir->coulomb_modifier]);
369             warning_error(wi, warn_buf);
370         }
371
372         if (ir->implicit_solvent != eisNO)
373         {
374             warning_error(wi, "Implicit solvent is not (yet) supported with the with Verlet lists.");
375         }
376
377         if (ir->nstlist <= 0)
378         {
379             warning_error(wi, "With Verlet lists nstlist should be larger than 0");
380         }
381
382         if (ir->nstlist < 10)
383         {
384             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.");
385         }
386
387         rc_max = std::max(ir->rvdw, ir->rcoulomb);
388
389         if (ir->verletbuf_tol <= 0)
390         {
391             if (ir->verletbuf_tol == 0)
392             {
393                 warning_error(wi, "Can not have Verlet buffer tolerance of exactly 0");
394             }
395
396             if (ir->rlist < rc_max)
397             {
398                 warning_error(wi, "With verlet lists rlist can not be smaller than rvdw or rcoulomb");
399             }
400
401             if (ir->rlist == rc_max && ir->nstlist > 1)
402             {
403                 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.");
404             }
405         }
406         else
407         {
408             if (ir->rlist > rc_max)
409             {
410                 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.");
411             }
412
413             if (ir->nstlist == 1)
414             {
415                 /* No buffer required */
416                 ir->rlist = rc_max;
417             }
418             else
419             {
420                 if (EI_DYNAMICS(ir->eI))
421                 {
422                     if (inputrec2nboundeddim(ir) < 3)
423                     {
424                         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.");
425                     }
426                     /* Set rlist temporarily so we can continue processing */
427                     ir->rlist = rc_max;
428                 }
429                 else
430                 {
431                     /* Set the buffer to 5% of the cut-off */
432                     ir->rlist = (1.0 + verlet_buffer_ratio_nodynamics)*rc_max;
433                 }
434             }
435         }
436     }
437
438     /* GENERAL INTEGRATOR STUFF */
439     if (!EI_MD(ir->eI))
440     {
441         if (ir->etc != etcNO)
442         {
443             if (EI_RANDOM(ir->eI))
444             {
445                 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]);
446             }
447             else
448             {
449                 sprintf(warn_buf, "Setting tcoupl from '%s' to 'no'. Temperature coupling does not apply to %s.", etcoupl_names[ir->etc], ei_names[ir->eI]);
450             }
451             warning_note(wi, warn_buf);
452         }
453         ir->etc = etcNO;
454     }
455     if (ir->eI == eiVVAK)
456     {
457         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]);
458         warning_note(wi, warn_buf);
459     }
460     if (!EI_DYNAMICS(ir->eI))
461     {
462         if (ir->epc != epcNO)
463         {
464             sprintf(warn_buf, "Setting pcoupl from '%s' to 'no'. Pressure coupling does not apply to %s.", epcoupl_names[ir->epc], ei_names[ir->eI]);
465             warning_note(wi, warn_buf);
466         }
467         ir->epc = epcNO;
468     }
469     if (EI_DYNAMICS(ir->eI))
470     {
471         if (ir->nstcalcenergy < 0)
472         {
473             ir->nstcalcenergy = ir_optimal_nstcalcenergy(ir);
474             if (ir->nstenergy != 0 && ir->nstenergy < ir->nstcalcenergy)
475             {
476                 /* nstcalcenergy larger than nstener does not make sense.
477                  * We ideally want nstcalcenergy=nstener.
478                  */
479                 if (ir->nstlist > 0)
480                 {
481                     ir->nstcalcenergy = lcd(ir->nstenergy, ir->nstlist);
482                 }
483                 else
484                 {
485                     ir->nstcalcenergy = ir->nstenergy;
486                 }
487             }
488         }
489         else if ( (ir->nstenergy > 0 && ir->nstcalcenergy > ir->nstenergy) ||
490                   (ir->efep != efepNO && ir->fepvals->nstdhdl > 0 &&
491                    (ir->nstcalcenergy > ir->fepvals->nstdhdl) ) )
492
493         {
494             const char *nsten    = "nstenergy";
495             const char *nstdh    = "nstdhdl";
496             const char *min_name = nsten;
497             int         min_nst  = ir->nstenergy;
498
499             /* find the smallest of ( nstenergy, nstdhdl ) */
500             if (ir->efep != efepNO && ir->fepvals->nstdhdl > 0 &&
501                 (ir->nstenergy == 0 || ir->fepvals->nstdhdl < ir->nstenergy))
502             {
503                 min_nst  = ir->fepvals->nstdhdl;
504                 min_name = nstdh;
505             }
506             /* If the user sets nstenergy small, we should respect that */
507             sprintf(warn_buf,
508                     "Setting nstcalcenergy (%d) equal to %s (%d)",
509                     ir->nstcalcenergy, min_name, min_nst);
510             warning_note(wi, warn_buf);
511             ir->nstcalcenergy = min_nst;
512         }
513
514         if (ir->epc != epcNO)
515         {
516             if (ir->nstpcouple < 0)
517             {
518                 ir->nstpcouple = ir_optimal_nstpcouple(ir);
519             }
520         }
521
522         if (ir->nstcalcenergy > 0)
523         {
524             if (ir->efep != efepNO)
525             {
526                 /* nstdhdl should be a multiple of nstcalcenergy */
527                 check_nst("nstcalcenergy", ir->nstcalcenergy,
528                           "nstdhdl", &ir->fepvals->nstdhdl, wi);
529                 /* nstexpanded should be a multiple of nstcalcenergy */
530                 check_nst("nstcalcenergy", ir->nstcalcenergy,
531                           "nstexpanded", &ir->expandedvals->nstexpanded, wi);
532             }
533             /* for storing exact averages nstenergy should be
534              * a multiple of nstcalcenergy
535              */
536             check_nst("nstcalcenergy", ir->nstcalcenergy,
537                       "nstenergy", &ir->nstenergy, wi);
538         }
539     }
540
541     if (ir->nsteps == 0 && !ir->bContinuation)
542     {
543         warning_note(wi, "For a correct single-point energy evaluation with nsteps = 0, use continuation = yes to avoid constraining the input coordinates.");
544     }
545
546     /* LD STUFF */
547     if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
548         ir->bContinuation && ir->ld_seed != -1)
549     {
550         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)");
551     }
552
553     /* TPI STUFF */
554     if (EI_TPI(ir->eI))
555     {
556         sprintf(err_buf, "TPI only works with pbc = %s", epbc_names[epbcXYZ]);
557         CHECK(ir->ePBC != epbcXYZ);
558         sprintf(err_buf, "TPI only works with ns = %s", ens_names[ensGRID]);
559         CHECK(ir->ns_type != ensGRID);
560         sprintf(err_buf, "with TPI nstlist should be larger than zero");
561         CHECK(ir->nstlist <= 0);
562         sprintf(err_buf, "TPI does not work with full electrostatics other than PME");
563         CHECK(EEL_FULL(ir->coulombtype) && !EEL_PME(ir->coulombtype));
564         sprintf(err_buf, "TPI does not work (yet) with the Verlet cut-off scheme");
565         CHECK(ir->cutoff_scheme == ecutsVERLET);
566     }
567
568     /* SHAKE / LINCS */
569     if ( (opts->nshake > 0) && (opts->bMorse) )
570     {
571         sprintf(warn_buf,
572                 "Using morse bond-potentials while constraining bonds is useless");
573         warning(wi, warn_buf);
574     }
575
576     if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
577         ir->bContinuation && ir->ld_seed != -1)
578     {
579         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)");
580     }
581     /* verify simulated tempering options */
582
583     if (ir->bSimTemp)
584     {
585         gmx_bool bAllTempZero = TRUE;
586         for (i = 0; i < fep->n_lambda; i++)
587         {
588             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]);
589             CHECK((fep->all_lambda[efptTEMPERATURE][i] < 0) || (fep->all_lambda[efptTEMPERATURE][i] > 1));
590             if (fep->all_lambda[efptTEMPERATURE][i] > 0)
591             {
592                 bAllTempZero = FALSE;
593             }
594         }
595         sprintf(err_buf, "if simulated tempering is on, temperature-lambdas may not be all zero");
596         CHECK(bAllTempZero == TRUE);
597
598         sprintf(err_buf, "Simulated tempering is currently only compatible with md-vv");
599         CHECK(ir->eI != eiVV);
600
601         /* check compatability of the temperature coupling with simulated tempering */
602
603         if (ir->etc == etcNOSEHOOVER)
604         {
605             sprintf(warn_buf, "Nose-Hoover based temperature control such as [%s] my not be entirelyconsistent with simulated tempering", etcoupl_names[ir->etc]);
606             warning_note(wi, warn_buf);
607         }
608
609         /* check that the temperatures make sense */
610
611         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);
612         CHECK(ir->simtempvals->simtemp_high <= ir->simtempvals->simtemp_low);
613
614         sprintf(err_buf, "Higher simulated tempering temperature (%g) must be >= zero", ir->simtempvals->simtemp_high);
615         CHECK(ir->simtempvals->simtemp_high <= 0);
616
617         sprintf(err_buf, "Lower simulated tempering temperature (%g) must be >= zero", ir->simtempvals->simtemp_low);
618         CHECK(ir->simtempvals->simtemp_low <= 0);
619     }
620
621     /* verify free energy options */
622
623     if (ir->efep != efepNO)
624     {
625         fep = ir->fepvals;
626         sprintf(err_buf, "The soft-core power is %d and can only be 1 or 2",
627                 fep->sc_power);
628         CHECK(fep->sc_alpha != 0 && fep->sc_power != 1 && fep->sc_power != 2);
629
630         sprintf(err_buf, "The soft-core sc-r-power is %d and can only be 6 or 48",
631                 (int)fep->sc_r_power);
632         CHECK(fep->sc_alpha != 0 && fep->sc_r_power != 6.0 && fep->sc_r_power != 48.0);
633
634         sprintf(err_buf, "Can't use positive delta-lambda (%g) if initial state/lambda does not start at zero", fep->delta_lambda);
635         CHECK(fep->delta_lambda > 0 && ((fep->init_fep_state > 0) ||  (fep->init_lambda > 0)));
636
637         sprintf(err_buf, "Can't use positive delta-lambda (%g) with expanded ensemble simulations", fep->delta_lambda);
638         CHECK(fep->delta_lambda > 0 && (ir->efep == efepEXPANDED));
639
640         sprintf(err_buf, "Can only use expanded ensemble with md-vv (for now)");
641         CHECK(!(EI_VV(ir->eI)) && (ir->efep == efepEXPANDED));
642
643         sprintf(err_buf, "Free-energy not implemented for Ewald");
644         CHECK(ir->coulombtype == eelEWALD);
645
646         /* check validty of lambda inputs */
647         if (fep->n_lambda == 0)
648         {
649             /* Clear output in case of no states:*/
650             sprintf(err_buf, "init-lambda-state set to %d: no lambda states are defined.", fep->init_fep_state);
651             CHECK((fep->init_fep_state >= 0) && (fep->n_lambda == 0));
652         }
653         else
654         {
655             sprintf(err_buf, "initial thermodynamic state %d does not exist, only goes to %d", fep->init_fep_state, fep->n_lambda-1);
656             CHECK((fep->init_fep_state >= fep->n_lambda));
657         }
658
659         sprintf(err_buf, "Lambda state must be set, either with init-lambda-state or with init-lambda");
660         CHECK((fep->init_fep_state < 0) && (fep->init_lambda < 0));
661
662         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",
663                 fep->init_lambda, fep->init_fep_state);
664         CHECK((fep->init_fep_state >= 0) && (fep->init_lambda >= 0));
665
666
667
668         if ((fep->init_lambda >= 0) && (fep->delta_lambda == 0))
669         {
670             int n_lambda_terms;
671             n_lambda_terms = 0;
672             for (i = 0; i < efptNR; i++)
673             {
674                 if (fep->separate_dvdl[i])
675                 {
676                     n_lambda_terms++;
677                 }
678             }
679             if (n_lambda_terms > 1)
680             {
681                 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.");
682                 warning(wi, warn_buf);
683             }
684
685             if (n_lambda_terms < 2 && fep->n_lambda > 0)
686             {
687                 warning_note(wi,
688                              "init-lambda is deprecated for setting lambda state (except for slow growth). Use init-lambda-state instead.");
689             }
690         }
691
692         for (j = 0; j < efptNR; j++)
693         {
694             for (i = 0; i < fep->n_lambda; i++)
695             {
696                 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]);
697                 CHECK((fep->all_lambda[j][i] < 0) || (fep->all_lambda[j][i] > 1));
698             }
699         }
700
701         if ((fep->sc_alpha > 0) && (!fep->bScCoul))
702         {
703             for (i = 0; i < fep->n_lambda; i++)
704             {
705                 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],
706                         fep->all_lambda[efptCOUL][i]);
707                 CHECK((fep->sc_alpha > 0) &&
708                       (((fep->all_lambda[efptCOUL][i] > 0.0) &&
709                         (fep->all_lambda[efptCOUL][i] < 1.0)) &&
710                        ((fep->all_lambda[efptVDW][i] > 0.0) &&
711                         (fep->all_lambda[efptVDW][i] < 1.0))));
712             }
713         }
714
715         if ((fep->bScCoul) && (EEL_PME(ir->coulombtype)))
716         {
717             real sigma, lambda, r_sc;
718
719             sigma  = 0.34;
720             /* Maximum estimate for A and B charges equal with lambda power 1 */
721             lambda = 0.5;
722             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);
723             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.",
724                     fep->sc_r_power,
725                     sigma, lambda, r_sc - 1.0, ir->ewald_rtol);
726             warning_note(wi, warn_buf);
727         }
728
729         /*  Free Energy Checks -- In an ideal world, slow growth and FEP would
730             be treated differently, but that's the next step */
731
732         for (i = 0; i < efptNR; i++)
733         {
734             for (j = 0; j < fep->n_lambda; j++)
735             {
736                 sprintf(err_buf, "%s[%d] must be between 0 and 1", efpt_names[i], j);
737                 CHECK((fep->all_lambda[i][j] < 0) || (fep->all_lambda[i][j] > 1));
738             }
739         }
740     }
741
742     if ((ir->bSimTemp) || (ir->efep == efepEXPANDED))
743     {
744         fep    = ir->fepvals;
745
746         /* checking equilibration of weights inputs for validity */
747
748         sprintf(err_buf, "weight-equil-number-all-lambda (%d) is ignored if lmc-weights-equil is not equal to %s",
749                 expand->equil_n_at_lam, elmceq_names[elmceqNUMATLAM]);
750         CHECK((expand->equil_n_at_lam > 0) && (expand->elmceq != elmceqNUMATLAM));
751
752         sprintf(err_buf, "weight-equil-number-samples (%d) is ignored if lmc-weights-equil is not equal to %s",
753                 expand->equil_samples, elmceq_names[elmceqSAMPLES]);
754         CHECK((expand->equil_samples > 0) && (expand->elmceq != elmceqSAMPLES));
755
756         sprintf(err_buf, "weight-equil-number-steps (%d) is ignored if lmc-weights-equil is not equal to %s",
757                 expand->equil_steps, elmceq_names[elmceqSTEPS]);
758         CHECK((expand->equil_steps > 0) && (expand->elmceq != elmceqSTEPS));
759
760         sprintf(err_buf, "weight-equil-wl-delta (%d) is ignored if lmc-weights-equil is not equal to %s",
761                 expand->equil_samples, elmceq_names[elmceqWLDELTA]);
762         CHECK((expand->equil_wl_delta > 0) && (expand->elmceq != elmceqWLDELTA));
763
764         sprintf(err_buf, "weight-equil-count-ratio (%f) is ignored if lmc-weights-equil is not equal to %s",
765                 expand->equil_ratio, elmceq_names[elmceqRATIO]);
766         CHECK((expand->equil_ratio > 0) && (expand->elmceq != elmceqRATIO));
767
768         sprintf(err_buf, "weight-equil-number-all-lambda (%d) must be a positive integer if lmc-weights-equil=%s",
769                 expand->equil_n_at_lam, elmceq_names[elmceqNUMATLAM]);
770         CHECK((expand->equil_n_at_lam <= 0) && (expand->elmceq == elmceqNUMATLAM));
771
772         sprintf(err_buf, "weight-equil-number-samples (%d) must be a positive integer if lmc-weights-equil=%s",
773                 expand->equil_samples, elmceq_names[elmceqSAMPLES]);
774         CHECK((expand->equil_samples <= 0) && (expand->elmceq == elmceqSAMPLES));
775
776         sprintf(err_buf, "weight-equil-number-steps (%d) must be a positive integer if lmc-weights-equil=%s",
777                 expand->equil_steps, elmceq_names[elmceqSTEPS]);
778         CHECK((expand->equil_steps <= 0) && (expand->elmceq == elmceqSTEPS));
779
780         sprintf(err_buf, "weight-equil-wl-delta (%f) must be > 0 if lmc-weights-equil=%s",
781                 expand->equil_wl_delta, elmceq_names[elmceqWLDELTA]);
782         CHECK((expand->equil_wl_delta <= 0) && (expand->elmceq == elmceqWLDELTA));
783
784         sprintf(err_buf, "weight-equil-count-ratio (%f) must be > 0 if lmc-weights-equil=%s",
785                 expand->equil_ratio, elmceq_names[elmceqRATIO]);
786         CHECK((expand->equil_ratio <= 0) && (expand->elmceq == elmceqRATIO));
787
788         sprintf(err_buf, "lmc-weights-equil=%s only possible when lmc-stats = %s or lmc-stats %s",
789                 elmceq_names[elmceqWLDELTA], elamstats_names[elamstatsWL], elamstats_names[elamstatsWWL]);
790         CHECK((expand->elmceq == elmceqWLDELTA) && (!EWL(expand->elamstats)));
791
792         sprintf(err_buf, "lmc-repeats (%d) must be greater than 0", expand->lmc_repeats);
793         CHECK((expand->lmc_repeats <= 0));
794         sprintf(err_buf, "minimum-var-min (%d) must be greater than 0", expand->minvarmin);
795         CHECK((expand->minvarmin <= 0));
796         sprintf(err_buf, "weight-c-range (%d) must be greater or equal to 0", expand->c_range);
797         CHECK((expand->c_range < 0));
798         sprintf(err_buf, "init-lambda-state (%d) must be zero if lmc-forced-nstart (%d)> 0 and lmc-move != 'no'",
799                 fep->init_fep_state, expand->lmc_forced_nstart);
800         CHECK((fep->init_fep_state != 0) && (expand->lmc_forced_nstart > 0) && (expand->elmcmove != elmcmoveNO));
801         sprintf(err_buf, "lmc-forced-nstart (%d) must not be negative", expand->lmc_forced_nstart);
802         CHECK((expand->lmc_forced_nstart < 0));
803         sprintf(err_buf, "init-lambda-state (%d) must be in the interval [0,number of lambdas)", fep->init_fep_state);
804         CHECK((fep->init_fep_state < 0) || (fep->init_fep_state >= fep->n_lambda));
805
806         sprintf(err_buf, "init-wl-delta (%f) must be greater than or equal to 0", expand->init_wl_delta);
807         CHECK((expand->init_wl_delta < 0));
808         sprintf(err_buf, "wl-ratio (%f) must be between 0 and 1", expand->wl_ratio);
809         CHECK((expand->wl_ratio <= 0) || (expand->wl_ratio >= 1));
810         sprintf(err_buf, "wl-scale (%f) must be between 0 and 1", expand->wl_scale);
811         CHECK((expand->wl_scale <= 0) || (expand->wl_scale >= 1));
812
813         /* if there is no temperature control, we need to specify an MC temperature */
814         sprintf(err_buf, "If there is no temperature control, and lmc-mcmove!= 'no',mc_temperature must be set to a positive number");
815         if (expand->nstTij > 0)
816         {
817             sprintf(err_buf, "nstlog must be non-zero");
818             CHECK(ir->nstlog == 0);
819             sprintf(err_buf, "nst-transition-matrix (%d) must be an integer multiple of nstlog (%d)",
820                     expand->nstTij, ir->nstlog);
821             CHECK((expand->nstTij % ir->nstlog) != 0);
822         }
823     }
824
825     /* PBC/WALLS */
826     sprintf(err_buf, "walls only work with pbc=%s", epbc_names[epbcXY]);
827     CHECK(ir->nwall && ir->ePBC != epbcXY);
828
829     /* VACUUM STUFF */
830     if (ir->ePBC != epbcXYZ && ir->nwall != 2)
831     {
832         if (ir->ePBC == epbcNONE)
833         {
834             if (ir->epc != epcNO)
835             {
836                 warning(wi, "Turning off pressure coupling for vacuum system");
837                 ir->epc = epcNO;
838             }
839         }
840         else
841         {
842             sprintf(err_buf, "Can not have pressure coupling with pbc=%s",
843                     epbc_names[ir->ePBC]);
844             CHECK(ir->epc != epcNO);
845         }
846         sprintf(err_buf, "Can not have Ewald with pbc=%s", epbc_names[ir->ePBC]);
847         CHECK(EEL_FULL(ir->coulombtype));
848
849         sprintf(err_buf, "Can not have dispersion correction with pbc=%s",
850                 epbc_names[ir->ePBC]);
851         CHECK(ir->eDispCorr != edispcNO);
852     }
853
854     if (ir->rlist == 0.0)
855     {
856         sprintf(err_buf, "can only have neighborlist cut-off zero (=infinite)\n"
857                 "with coulombtype = %s or coulombtype = %s\n"
858                 "without periodic boundary conditions (pbc = %s) and\n"
859                 "rcoulomb and rvdw set to zero",
860                 eel_names[eelCUT], eel_names[eelUSER], epbc_names[epbcNONE]);
861         CHECK(((ir->coulombtype != eelCUT) && (ir->coulombtype != eelUSER)) ||
862               (ir->ePBC     != epbcNONE) ||
863               (ir->rcoulomb != 0.0)      || (ir->rvdw != 0.0));
864
865         if (ir->nstlist > 0)
866         {
867             warning_note(wi, "Simulating without cut-offs can be (slightly) faster with nstlist=0, nstype=simple and only one MPI rank");
868         }
869     }
870
871     /* COMM STUFF */
872     if (ir->nstcomm == 0)
873     {
874         ir->comm_mode = ecmNO;
875     }
876     if (ir->comm_mode != ecmNO)
877     {
878         if (ir->nstcomm < 0)
879         {
880             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");
881             ir->nstcomm = abs(ir->nstcomm);
882         }
883
884         if (ir->nstcalcenergy > 0 && ir->nstcomm < ir->nstcalcenergy)
885         {
886             warning_note(wi, "nstcomm < nstcalcenergy defeats the purpose of nstcalcenergy, setting nstcomm to nstcalcenergy");
887             ir->nstcomm = ir->nstcalcenergy;
888         }
889
890         if (ir->comm_mode == ecmANGULAR)
891         {
892             sprintf(err_buf, "Can not remove the rotation around the center of mass with periodic molecules");
893             CHECK(ir->bPeriodicMols);
894             if (ir->ePBC != epbcNONE)
895             {
896                 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.");
897             }
898         }
899     }
900
901     if (EI_STATE_VELOCITY(ir->eI) && ir->ePBC == epbcNONE && ir->comm_mode != ecmANGULAR)
902     {
903         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.");
904     }
905
906     /* TEMPERATURE COUPLING */
907     if (ir->etc == etcYES)
908     {
909         ir->etc = etcBERENDSEN;
910         warning_note(wi, "Old option for temperature coupling given: "
911                      "changing \"yes\" to \"Berendsen\"\n");
912     }
913
914     if ((ir->etc == etcNOSEHOOVER) || (ir->epc == epcMTTK))
915     {
916         if (ir->opts.nhchainlength < 1)
917         {
918             sprintf(warn_buf, "number of Nose-Hoover chains (currently %d) cannot be less than 1,reset to 1\n", ir->opts.nhchainlength);
919             ir->opts.nhchainlength = 1;
920             warning(wi, warn_buf);
921         }
922
923         if (ir->etc == etcNOSEHOOVER && !EI_VV(ir->eI) && ir->opts.nhchainlength > 1)
924         {
925             warning_note(wi, "leapfrog does not yet support Nose-Hoover chains, nhchainlength reset to 1");
926             ir->opts.nhchainlength = 1;
927         }
928     }
929     else
930     {
931         ir->opts.nhchainlength = 0;
932     }
933
934     if (ir->eI == eiVVAK)
935     {
936         sprintf(err_buf, "%s implemented primarily for validation, and requires nsttcouple = 1 and nstpcouple = 1.",
937                 ei_names[eiVVAK]);
938         CHECK((ir->nsttcouple != 1) || (ir->nstpcouple != 1));
939     }
940
941     if (ETC_ANDERSEN(ir->etc))
942     {
943         sprintf(err_buf, "%s temperature control not supported for integrator %s.", etcoupl_names[ir->etc], ei_names[ir->eI]);
944         CHECK(!(EI_VV(ir->eI)));
945
946         if (ir->nstcomm > 0 && (ir->etc == etcANDERSEN))
947         {
948             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]);
949             warning_note(wi, warn_buf);
950         }
951
952         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]);
953         CHECK(ir->nstcomm > 1 && (ir->etc == etcANDERSEN));
954     }
955
956     if (ir->etc == etcBERENDSEN)
957     {
958         sprintf(warn_buf, "The %s thermostat does not generate the correct kinetic energy distribution. You might want to consider using the %s thermostat.",
959                 ETCOUPLTYPE(ir->etc), ETCOUPLTYPE(etcVRESCALE));
960         warning_note(wi, warn_buf);
961     }
962
963     if ((ir->etc == etcNOSEHOOVER || ETC_ANDERSEN(ir->etc))
964         && ir->epc == epcBERENDSEN)
965     {
966         sprintf(warn_buf, "Using Berendsen pressure coupling invalidates the "
967                 "true ensemble for the thermostat");
968         warning(wi, warn_buf);
969     }
970
971     /* PRESSURE COUPLING */
972     if (ir->epc == epcISOTROPIC)
973     {
974         ir->epc = epcBERENDSEN;
975         warning_note(wi, "Old option for pressure coupling given: "
976                      "changing \"Isotropic\" to \"Berendsen\"\n");
977     }
978
979     if (ir->epc != epcNO)
980     {
981         dt_pcoupl = ir->nstpcouple*ir->delta_t;
982
983         sprintf(err_buf, "tau-p must be > 0 instead of %g\n", ir->tau_p);
984         CHECK(ir->tau_p <= 0);
985
986         if (ir->tau_p/dt_pcoupl < pcouple_min_integration_steps(ir->epc) - 10*GMX_REAL_EPS)
987         {
988             sprintf(warn_buf, "For proper integration of the %s barostat, tau-p (%g) should be at least %d times larger than nstpcouple*dt (%g)",
989                     EPCOUPLTYPE(ir->epc), ir->tau_p, pcouple_min_integration_steps(ir->epc), dt_pcoupl);
990             warning(wi, warn_buf);
991         }
992
993         sprintf(err_buf, "compressibility must be > 0 when using pressure"
994                 " coupling %s\n", EPCOUPLTYPE(ir->epc));
995         CHECK(ir->compress[XX][XX] < 0 || ir->compress[YY][YY] < 0 ||
996               ir->compress[ZZ][ZZ] < 0 ||
997               (trace(ir->compress) == 0 && ir->compress[YY][XX] <= 0 &&
998                ir->compress[ZZ][XX] <= 0 && ir->compress[ZZ][YY] <= 0));
999
1000         if (epcPARRINELLORAHMAN == ir->epc && opts->bGenVel)
1001         {
1002             sprintf(warn_buf,
1003                     "You are generating velocities so I am assuming you "
1004                     "are equilibrating a system. You are using "
1005                     "%s pressure coupling, but this can be "
1006                     "unstable for equilibration. If your system crashes, try "
1007                     "equilibrating first with Berendsen pressure coupling. If "
1008                     "you are not equilibrating the system, you can probably "
1009                     "ignore this warning.",
1010                     epcoupl_names[ir->epc]);
1011             warning(wi, warn_buf);
1012         }
1013     }
1014
1015     if (EI_VV(ir->eI))
1016     {
1017         if (ir->epc > epcNO)
1018         {
1019             if ((ir->epc != epcBERENDSEN) && (ir->epc != epcMTTK))
1020             {
1021                 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.");
1022             }
1023         }
1024     }
1025     else
1026     {
1027         if (ir->epc == epcMTTK)
1028         {
1029             warning_error(wi, "MTTK pressure coupling requires a Velocity-verlet integrator");
1030         }
1031     }
1032
1033     /* ELECTROSTATICS */
1034     /* More checks are in triple check (grompp.c) */
1035
1036     if (ir->coulombtype == eelSWITCH)
1037     {
1038         sprintf(warn_buf, "coulombtype = %s is only for testing purposes and can lead to serious "
1039                 "artifacts, advice: use coulombtype = %s",
1040                 eel_names[ir->coulombtype],
1041                 eel_names[eelRF_ZERO]);
1042         warning(wi, warn_buf);
1043     }
1044
1045     if (ir->epsilon_r != 1 && ir->implicit_solvent == eisGBSA)
1046     {
1047         sprintf(warn_buf, "epsilon-r = %g with GB implicit solvent, will use this value for inner dielectric", ir->epsilon_r);
1048         warning_note(wi, warn_buf);
1049     }
1050
1051     if (EEL_RF(ir->coulombtype) && ir->epsilon_rf == 1 && ir->epsilon_r != 1)
1052     {
1053         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);
1054         warning(wi, warn_buf);
1055         ir->epsilon_rf = ir->epsilon_r;
1056         ir->epsilon_r  = 1.0;
1057     }
1058
1059     if (ir->epsilon_r == 0)
1060     {
1061         sprintf(err_buf,
1062                 "It is pointless to use long-range or Generalized Born electrostatics with infinite relative permittivity."
1063                 "Since you are effectively turning of electrostatics, a plain cutoff will be much faster.");
1064         CHECK(EEL_FULL(ir->coulombtype) || ir->implicit_solvent == eisGBSA);
1065     }
1066
1067     if (getenv("GMX_DO_GALACTIC_DYNAMICS") == nullptr)
1068     {
1069         sprintf(err_buf, "epsilon-r must be >= 0 instead of %g\n", ir->epsilon_r);
1070         CHECK(ir->epsilon_r < 0);
1071     }
1072
1073     if (EEL_RF(ir->coulombtype))
1074     {
1075         /* reaction field (at the cut-off) */
1076
1077         if (ir->coulombtype == eelRF_ZERO && ir->epsilon_rf != 0)
1078         {
1079             sprintf(warn_buf, "With coulombtype = %s, epsilon-rf must be 0, assuming you meant epsilon_rf=0",
1080                     eel_names[ir->coulombtype]);
1081             warning(wi, warn_buf);
1082             ir->epsilon_rf = 0.0;
1083         }
1084
1085         sprintf(err_buf, "epsilon-rf must be >= epsilon-r");
1086         CHECK((ir->epsilon_rf < ir->epsilon_r && ir->epsilon_rf != 0) ||
1087               (ir->epsilon_r == 0));
1088         if (ir->epsilon_rf == ir->epsilon_r)
1089         {
1090             sprintf(warn_buf, "Using epsilon-rf = epsilon-r with %s does not make sense",
1091                     eel_names[ir->coulombtype]);
1092             warning(wi, warn_buf);
1093         }
1094     }
1095     /* Allow rlist>rcoulomb for tabulated long range stuff. This just
1096      * means the interaction is zero outside rcoulomb, but it helps to
1097      * provide accurate energy conservation.
1098      */
1099     if (ir_coulomb_might_be_zero_at_cutoff(ir))
1100     {
1101         if (ir_coulomb_switched(ir))
1102         {
1103             sprintf(err_buf,
1104                     "With coulombtype = %s rcoulomb_switch must be < rcoulomb. Or, better: Use the potential modifier options!",
1105                     eel_names[ir->coulombtype]);
1106             CHECK(ir->rcoulomb_switch >= ir->rcoulomb);
1107         }
1108     }
1109     else if (ir->coulombtype == eelCUT || EEL_RF(ir->coulombtype))
1110     {
1111         if (ir->cutoff_scheme == ecutsGROUP && ir->coulomb_modifier == eintmodNONE)
1112         {
1113             sprintf(err_buf, "With coulombtype = %s, rcoulomb should be >= rlist unless you use a potential modifier",
1114                     eel_names[ir->coulombtype]);
1115             CHECK(ir->rlist > ir->rcoulomb);
1116         }
1117     }
1118
1119     if (ir->coulombtype == eelSWITCH || ir->coulombtype == eelSHIFT)
1120     {
1121         sprintf(err_buf,
1122                 "Explicit switch/shift coulomb interactions cannot be used in combination with a secondary coulomb-modifier.");
1123         CHECK( ir->coulomb_modifier != eintmodNONE);
1124     }
1125     if (ir->vdwtype == evdwSWITCH || ir->vdwtype == evdwSHIFT)
1126     {
1127         sprintf(err_buf,
1128                 "Explicit switch/shift vdw interactions cannot be used in combination with a secondary vdw-modifier.");
1129         CHECK( ir->vdw_modifier != eintmodNONE);
1130     }
1131
1132     if (ir->coulombtype == eelSWITCH || ir->coulombtype == eelSHIFT ||
1133         ir->vdwtype == evdwSWITCH || ir->vdwtype == evdwSHIFT)
1134     {
1135         sprintf(warn_buf,
1136                 "The switch/shift interaction settings are just for compatibility; you will get better "
1137                 "performance from applying potential modifiers to your interactions!\n");
1138         warning_note(wi, warn_buf);
1139     }
1140
1141     if (ir->coulombtype == eelPMESWITCH || ir->coulomb_modifier == eintmodPOTSWITCH)
1142     {
1143         if (ir->rcoulomb_switch/ir->rcoulomb < 0.9499)
1144         {
1145             real percentage  = 100*(ir->rcoulomb-ir->rcoulomb_switch)/ir->rcoulomb;
1146             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.",
1147                     percentage, ir->rcoulomb_switch, ir->rcoulomb, ir->ewald_rtol);
1148             warning(wi, warn_buf);
1149         }
1150     }
1151
1152     if (ir->vdwtype == evdwSWITCH || ir->vdw_modifier == eintmodPOTSWITCH)
1153     {
1154         if (ir->rvdw_switch == 0)
1155         {
1156             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.");
1157             warning(wi, warn_buf);
1158         }
1159     }
1160
1161     if (EEL_FULL(ir->coulombtype))
1162     {
1163         if (ir->coulombtype == eelPMESWITCH || ir->coulombtype == eelPMEUSER ||
1164             ir->coulombtype == eelPMEUSERSWITCH)
1165         {
1166             sprintf(err_buf, "With coulombtype = %s, rcoulomb must be <= rlist",
1167                     eel_names[ir->coulombtype]);
1168             CHECK(ir->rcoulomb > ir->rlist);
1169         }
1170         else if (ir->cutoff_scheme == ecutsGROUP && ir->coulomb_modifier == eintmodNONE)
1171         {
1172             if (ir->coulombtype == eelPME || ir->coulombtype == eelP3M_AD)
1173             {
1174                 sprintf(err_buf,
1175                         "With coulombtype = %s (without modifier), rcoulomb must be equal to rlist.\n"
1176                         "For optimal energy conservation,consider using\n"
1177                         "a potential modifier.", eel_names[ir->coulombtype]);
1178                 CHECK(ir->rcoulomb != ir->rlist);
1179             }
1180         }
1181     }
1182
1183     if (EEL_PME(ir->coulombtype) || EVDW_PME(ir->vdwtype))
1184     {
1185         // TODO: Move these checks into the ewald module with the options class
1186         int orderMin = 3;
1187         int orderMax = (ir->coulombtype == eelP3M_AD ? 8 : 12);
1188
1189         if (ir->pme_order < orderMin || ir->pme_order > orderMax)
1190         {
1191             sprintf(warn_buf, "With coulombtype = %s, you should have %d <= pme-order <= %d", eel_names[ir->coulombtype], orderMin, orderMax);
1192             warning_error(wi, warn_buf);
1193         }
1194     }
1195
1196     if (ir->nwall == 2 && EEL_FULL(ir->coulombtype))
1197     {
1198         if (ir->ewald_geometry == eewg3D)
1199         {
1200             sprintf(warn_buf, "With pbc=%s you should use ewald-geometry=%s",
1201                     epbc_names[ir->ePBC], eewg_names[eewg3DC]);
1202             warning(wi, warn_buf);
1203         }
1204         /* This check avoids extra pbc coding for exclusion corrections */
1205         sprintf(err_buf, "wall-ewald-zfac should be >= 2");
1206         CHECK(ir->wall_ewald_zfac < 2);
1207     }
1208     if ((ir->ewald_geometry == eewg3DC) && (ir->ePBC != epbcXY) &&
1209         EEL_FULL(ir->coulombtype))
1210     {
1211         sprintf(warn_buf, "With %s and ewald_geometry = %s you should use pbc = %s",
1212                 eel_names[ir->coulombtype], eewg_names[eewg3DC], epbc_names[epbcXY]);
1213         warning(wi, warn_buf);
1214     }
1215     if ((ir->epsilon_surface != 0) && EEL_FULL(ir->coulombtype))
1216     {
1217         if (ir->cutoff_scheme == ecutsVERLET)
1218         {
1219             sprintf(warn_buf, "Since molecules/charge groups are broken using the Verlet scheme, you can not use a dipole correction to the %s electrostatics.",
1220                     eel_names[ir->coulombtype]);
1221             warning(wi, warn_buf);
1222         }
1223         else
1224         {
1225             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",
1226                     eel_names[ir->coulombtype]);
1227             warning_note(wi, warn_buf);
1228         }
1229     }
1230
1231     if (ir_vdw_switched(ir))
1232     {
1233         sprintf(err_buf, "With switched vdw forces or potentials, rvdw-switch must be < rvdw");
1234         CHECK(ir->rvdw_switch >= ir->rvdw);
1235
1236         if (ir->rvdw_switch < 0.5*ir->rvdw)
1237         {
1238             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.",
1239                     ir->rvdw_switch, ir->rvdw);
1240             warning_note(wi, warn_buf);
1241         }
1242     }
1243     else if (ir->vdwtype == evdwCUT || ir->vdwtype == evdwPME)
1244     {
1245         if (ir->cutoff_scheme == ecutsGROUP && ir->vdw_modifier == eintmodNONE)
1246         {
1247             sprintf(err_buf, "With vdwtype = %s, rvdw must be >= rlist unless you use a potential modifier", evdw_names[ir->vdwtype]);
1248             CHECK(ir->rlist > ir->rvdw);
1249         }
1250     }
1251
1252     if (ir->vdwtype == evdwPME)
1253     {
1254         if (!(ir->vdw_modifier == eintmodNONE || ir->vdw_modifier == eintmodPOTSHIFT))
1255         {
1256             sprintf(err_buf, "With vdwtype = %s, the only supported modifiers are %s and %s",
1257                     evdw_names[ir->vdwtype],
1258                     eintmod_names[eintmodPOTSHIFT],
1259                     eintmod_names[eintmodNONE]);
1260             warning_error(wi, err_buf);
1261         }
1262     }
1263
1264     if (ir->cutoff_scheme == ecutsGROUP)
1265     {
1266         if (((ir->coulomb_modifier != eintmodNONE && ir->rcoulomb == ir->rlist) ||
1267              (ir->vdw_modifier != eintmodNONE && ir->rvdw == ir->rlist)))
1268         {
1269             warning_note(wi, "With exact cut-offs, rlist should be "
1270                          "larger than rcoulomb and rvdw, so that there "
1271                          "is a buffer region for particle motion "
1272                          "between neighborsearch steps");
1273         }
1274
1275         if (ir_coulomb_is_zero_at_cutoff(ir) && ir->rlist <= ir->rcoulomb)
1276         {
1277             sprintf(warn_buf, "For energy conservation with switch/shift potentials, rlist should be 0.1 to 0.3 nm larger than rcoulomb.");
1278             warning_note(wi, warn_buf);
1279         }
1280         if (ir_vdw_switched(ir) && (ir->rlist <= ir->rvdw))
1281         {
1282             sprintf(warn_buf, "For energy conservation with switch/shift potentials, rlist should be 0.1 to 0.3 nm larger than rvdw.");
1283             warning_note(wi, warn_buf);
1284         }
1285     }
1286
1287     if (ir->vdwtype == evdwUSER && ir->eDispCorr != edispcNO)
1288     {
1289         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.");
1290     }
1291
1292     if (ir->eI == eiLBFGS && (ir->coulombtype == eelCUT || ir->vdwtype == evdwCUT)
1293         && ir->rvdw != 0)
1294     {
1295         warning(wi, "For efficient BFGS minimization, use switch/shift/pme instead of cut-off.");
1296     }
1297
1298     if (ir->eI == eiLBFGS && ir->nbfgscorr <= 0)
1299     {
1300         warning(wi, "Using L-BFGS with nbfgscorr<=0 just gets you steepest descent.");
1301     }
1302
1303     /* ENERGY CONSERVATION */
1304     if (ir_NVE(ir) && ir->cutoff_scheme == ecutsGROUP)
1305     {
1306         if (!ir_vdw_might_be_zero_at_cutoff(ir) && ir->rvdw > 0 && ir->vdw_modifier == eintmodNONE)
1307         {
1308             sprintf(warn_buf, "You are using a cut-off for VdW interactions with NVE, for good energy conservation use vdwtype = %s (possibly with DispCorr)",
1309                     evdw_names[evdwSHIFT]);
1310             warning_note(wi, warn_buf);
1311         }
1312         if (!ir_coulomb_might_be_zero_at_cutoff(ir) && ir->rcoulomb > 0)
1313         {
1314             sprintf(warn_buf, "You are using a cut-off for electrostatics with NVE, for good energy conservation use coulombtype = %s or %s",
1315                     eel_names[eelPMESWITCH], eel_names[eelRF_ZERO]);
1316             warning_note(wi, warn_buf);
1317         }
1318     }
1319
1320     /* IMPLICIT SOLVENT */
1321     if (ir->coulombtype == eelGB_NOTUSED)
1322     {
1323         sprintf(warn_buf, "Invalid option %s for coulombtype",
1324                 eel_names[ir->coulombtype]);
1325         warning_error(wi, warn_buf);
1326     }
1327
1328     if (ir->sa_algorithm == esaSTILL)
1329     {
1330         sprintf(err_buf, "Still SA algorithm not available yet, use %s or %s instead\n", esa_names[esaAPPROX], esa_names[esaNO]);
1331         CHECK(ir->sa_algorithm == esaSTILL);
1332     }
1333
1334     if (ir->implicit_solvent == eisGBSA)
1335     {
1336         sprintf(err_buf, "With GBSA implicit solvent, rgbradii must be equal to rlist.");
1337         CHECK(ir->rgbradii != ir->rlist);
1338
1339         if (ir->coulombtype != eelCUT)
1340         {
1341             sprintf(err_buf, "With GBSA, coulombtype must be equal to %s\n", eel_names[eelCUT]);
1342             CHECK(ir->coulombtype != eelCUT);
1343         }
1344         if (ir->vdwtype != evdwCUT)
1345         {
1346             sprintf(err_buf, "With GBSA, vdw-type must be equal to %s\n", evdw_names[evdwCUT]);
1347             CHECK(ir->vdwtype != evdwCUT);
1348         }
1349         if (ir->nstgbradii < 1)
1350         {
1351             sprintf(warn_buf, "Using GBSA with nstgbradii<1, setting nstgbradii=1");
1352             warning_note(wi, warn_buf);
1353             ir->nstgbradii = 1;
1354         }
1355         if (ir->sa_algorithm == esaNO)
1356         {
1357             sprintf(warn_buf, "No SA (non-polar) calculation requested together with GB. Are you sure this is what you want?\n");
1358             warning_note(wi, warn_buf);
1359         }
1360         if (ir->sa_surface_tension < 0 && ir->sa_algorithm != esaNO)
1361         {
1362             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");
1363             warning_note(wi, warn_buf);
1364
1365             if (ir->gb_algorithm == egbSTILL)
1366             {
1367                 ir->sa_surface_tension = 0.0049 * CAL2JOULE * 100;
1368             }
1369             else
1370             {
1371                 ir->sa_surface_tension = 0.0054 * CAL2JOULE * 100;
1372             }
1373         }
1374         if (ir->sa_surface_tension == 0 && ir->sa_algorithm != esaNO)
1375         {
1376             sprintf(err_buf, "Surface tension set to 0 while SA-calculation requested\n");
1377             CHECK(ir->sa_surface_tension == 0 && ir->sa_algorithm != esaNO);
1378         }
1379
1380     }
1381
1382     if (ir->bQMMM)
1383     {
1384         if (ir->cutoff_scheme != ecutsGROUP)
1385         {
1386             warning_error(wi, "QMMM is currently only supported with cutoff-scheme=group");
1387         }
1388         if (!EI_DYNAMICS(ir->eI))
1389         {
1390             char buf[STRLEN];
1391             sprintf(buf, "QMMM is only supported with dynamics, not with integrator %s", ei_names[ir->eI]);
1392             warning_error(wi, buf);
1393         }
1394     }
1395
1396     if (ir->bAdress)
1397     {
1398         gmx_fatal(FARGS, "AdResS simulations are no longer supported");
1399     }
1400 }
1401
1402 /* count the number of text elemets separated by whitespace in a string.
1403     str = the input string
1404     maxptr = the maximum number of allowed elements
1405     ptr = the output array of pointers to the first character of each element
1406     returns: the number of elements. */
1407 int str_nelem(const char *str, int maxptr, char *ptr[])
1408 {
1409     int   np = 0;
1410     char *copy0, *copy;
1411
1412     copy0 = gmx_strdup(str);
1413     copy  = copy0;
1414     ltrim(copy);
1415     while (*copy != '\0')
1416     {
1417         if (np >= maxptr)
1418         {
1419             gmx_fatal(FARGS, "Too many groups on line: '%s' (max is %d)",
1420                       str, maxptr);
1421         }
1422         if (ptr)
1423         {
1424             ptr[np] = copy;
1425         }
1426         np++;
1427         while ((*copy != '\0') && !isspace(*copy))
1428         {
1429             copy++;
1430         }
1431         if (*copy != '\0')
1432         {
1433             *copy = '\0';
1434             copy++;
1435         }
1436         ltrim(copy);
1437     }
1438     if (ptr == nullptr)
1439     {
1440         sfree(copy0);
1441     }
1442
1443     return np;
1444 }
1445
1446 /* interpret a number of doubles from a string and put them in an array,
1447    after allocating space for them.
1448    str = the input string
1449    n = the (pre-allocated) number of doubles read
1450    r = the output array of doubles. */
1451 static void parse_n_real(char *str, int *n, real **r, warninp_t wi)
1452 {
1453     char *ptr[MAXPTR];
1454     char *endptr;
1455     int   i;
1456     char  warn_buf[STRLEN];
1457
1458     *n = str_nelem(str, MAXPTR, ptr);
1459
1460     snew(*r, *n);
1461     for (i = 0; i < *n; i++)
1462     {
1463         (*r)[i] = strtod(ptr[i], &endptr);
1464         if (*endptr != 0)
1465         {
1466             sprintf(warn_buf, "Invalid value %s in string in mdp file. Expected a real number.", ptr[i]);
1467             warning_error(wi, warn_buf);
1468         }
1469     }
1470 }
1471
1472 static void do_fep_params(t_inputrec *ir, char fep_lambda[][STRLEN], char weights[STRLEN], warninp_t wi)
1473 {
1474
1475     int         i, j, max_n_lambda, nweights, nfep[efptNR];
1476     t_lambda   *fep    = ir->fepvals;
1477     t_expanded *expand = ir->expandedvals;
1478     real      **count_fep_lambdas;
1479     gmx_bool    bOneLambda = TRUE;
1480
1481     snew(count_fep_lambdas, efptNR);
1482
1483     /* FEP input processing */
1484     /* first, identify the number of lambda values for each type.
1485        All that are nonzero must have the same number */
1486
1487     for (i = 0; i < efptNR; i++)
1488     {
1489         parse_n_real(fep_lambda[i], &(nfep[i]), &(count_fep_lambdas[i]), wi);
1490     }
1491
1492     /* now, determine the number of components.  All must be either zero, or equal. */
1493
1494     max_n_lambda = 0;
1495     for (i = 0; i < efptNR; i++)
1496     {
1497         if (nfep[i] > max_n_lambda)
1498         {
1499             max_n_lambda = nfep[i];  /* here's a nonzero one.  All of them
1500                                         must have the same number if its not zero.*/
1501             break;
1502         }
1503     }
1504
1505     for (i = 0; i < efptNR; i++)
1506     {
1507         if (nfep[i] == 0)
1508         {
1509             ir->fepvals->separate_dvdl[i] = FALSE;
1510         }
1511         else if (nfep[i] == max_n_lambda)
1512         {
1513             if (i != efptTEMPERATURE)  /* we treat this differently -- not really a reason to compute the derivative with
1514                                           respect to the temperature currently */
1515             {
1516                 ir->fepvals->separate_dvdl[i] = TRUE;
1517             }
1518         }
1519         else
1520         {
1521             gmx_fatal(FARGS, "Number of lambdas (%d) for FEP type %s not equal to number of other types (%d)",
1522                       nfep[i], efpt_names[i], max_n_lambda);
1523         }
1524     }
1525     /* we don't print out dhdl if the temperature is changing, since we can't correctly define dhdl in this case */
1526     ir->fepvals->separate_dvdl[efptTEMPERATURE] = FALSE;
1527
1528     /* the number of lambdas is the number we've read in, which is either zero
1529        or the same for all */
1530     fep->n_lambda = max_n_lambda;
1531
1532     /* allocate space for the array of lambda values */
1533     snew(fep->all_lambda, efptNR);
1534     /* if init_lambda is defined, we need to set lambda */
1535     if ((fep->init_lambda > 0) && (fep->n_lambda == 0))
1536     {
1537         ir->fepvals->separate_dvdl[efptFEP] = TRUE;
1538     }
1539     /* otherwise allocate the space for all of the lambdas, and transfer the data */
1540     for (i = 0; i < efptNR; i++)
1541     {
1542         snew(fep->all_lambda[i], fep->n_lambda);
1543         if (nfep[i] > 0)  /* if it's zero, then the count_fep_lambda arrays
1544                              are zero */
1545         {
1546             for (j = 0; j < fep->n_lambda; j++)
1547             {
1548                 fep->all_lambda[i][j] = (double)count_fep_lambdas[i][j];
1549             }
1550             sfree(count_fep_lambdas[i]);
1551         }
1552     }
1553     sfree(count_fep_lambdas);
1554
1555     /* "fep-vals" is either zero or the full number. If zero, we'll need to define fep-lambdas for internal
1556        bookkeeping -- for now, init_lambda */
1557
1558     if ((nfep[efptFEP] == 0) && (fep->init_lambda >= 0))
1559     {
1560         for (i = 0; i < fep->n_lambda; i++)
1561         {
1562             fep->all_lambda[efptFEP][i] = fep->init_lambda;
1563         }
1564     }
1565
1566     /* check to see if only a single component lambda is defined, and soft core is defined.
1567        In this case, turn on coulomb soft core */
1568
1569     if (max_n_lambda == 0)
1570     {
1571         bOneLambda = TRUE;
1572     }
1573     else
1574     {
1575         for (i = 0; i < efptNR; i++)
1576         {
1577             if ((nfep[i] != 0) && (i != efptFEP))
1578             {
1579                 bOneLambda = FALSE;
1580             }
1581         }
1582     }
1583     if ((bOneLambda) && (fep->sc_alpha > 0))
1584     {
1585         fep->bScCoul = TRUE;
1586     }
1587
1588     /* Fill in the others with the efptFEP if they are not explicitly
1589        specified (i.e. nfep[i] == 0).  This means if fep is not defined,
1590        they are all zero. */
1591
1592     for (i = 0; i < efptNR; i++)
1593     {
1594         if ((nfep[i] == 0) && (i != efptFEP))
1595         {
1596             for (j = 0; j < fep->n_lambda; j++)
1597             {
1598                 fep->all_lambda[i][j] = fep->all_lambda[efptFEP][j];
1599             }
1600         }
1601     }
1602
1603
1604     /* make it easier if sc_r_power = 48 by increasing it to the 4th power, to be in the right scale. */
1605     if (fep->sc_r_power == 48)
1606     {
1607         if (fep->sc_alpha > 0.1)
1608         {
1609             gmx_fatal(FARGS, "sc_alpha (%f) for sc_r_power = 48 should usually be between 0.001 and 0.004", fep->sc_alpha);
1610         }
1611     }
1612
1613     /* now read in the weights */
1614     parse_n_real(weights, &nweights, &(expand->init_lambda_weights), wi);
1615     if (nweights == 0)
1616     {
1617         snew(expand->init_lambda_weights, fep->n_lambda); /* initialize to zero */
1618     }
1619     else if (nweights != fep->n_lambda)
1620     {
1621         gmx_fatal(FARGS, "Number of weights (%d) is not equal to number of lambda values (%d)",
1622                   nweights, fep->n_lambda);
1623     }
1624     if ((expand->nstexpanded < 0) && (ir->efep != efepNO))
1625     {
1626         expand->nstexpanded = fep->nstdhdl;
1627         /* if you don't specify nstexpanded when doing expanded ensemble free energy calcs, it is set to nstdhdl */
1628     }
1629     if ((expand->nstexpanded < 0) && ir->bSimTemp)
1630     {
1631         expand->nstexpanded = 2*(int)(ir->opts.tau_t[0]/ir->delta_t);
1632         /* if you don't specify nstexpanded when doing expanded ensemble simulated tempering, it is set to
1633            2*tau_t just to be careful so it's not to frequent  */
1634     }
1635 }
1636
1637
1638 static void do_simtemp_params(t_inputrec *ir)
1639 {
1640
1641     snew(ir->simtempvals->temperatures, ir->fepvals->n_lambda);
1642     GetSimTemps(ir->fepvals->n_lambda, ir->simtempvals, ir->fepvals->all_lambda[efptTEMPERATURE]);
1643
1644     return;
1645 }
1646
1647 static void do_wall_params(t_inputrec *ir,
1648                            char *wall_atomtype, char *wall_density,
1649                            t_gromppopts *opts)
1650 {
1651     int    nstr, i;
1652     char  *names[MAXPTR];
1653     double dbl;
1654
1655     opts->wall_atomtype[0] = nullptr;
1656     opts->wall_atomtype[1] = nullptr;
1657
1658     ir->wall_atomtype[0] = -1;
1659     ir->wall_atomtype[1] = -1;
1660     ir->wall_density[0]  = 0;
1661     ir->wall_density[1]  = 0;
1662
1663     if (ir->nwall > 0)
1664     {
1665         nstr = str_nelem(wall_atomtype, MAXPTR, names);
1666         if (nstr != ir->nwall)
1667         {
1668             gmx_fatal(FARGS, "Expected %d elements for wall_atomtype, found %d",
1669                       ir->nwall, nstr);
1670         }
1671         for (i = 0; i < ir->nwall; i++)
1672         {
1673             opts->wall_atomtype[i] = gmx_strdup(names[i]);
1674         }
1675
1676         if (ir->wall_type == ewt93 || ir->wall_type == ewt104)
1677         {
1678             nstr = str_nelem(wall_density, MAXPTR, names);
1679             if (nstr != ir->nwall)
1680             {
1681                 gmx_fatal(FARGS, "Expected %d elements for wall-density, found %d", ir->nwall, nstr);
1682             }
1683             for (i = 0; i < ir->nwall; i++)
1684             {
1685                 if (sscanf(names[i], "%lf", &dbl) != 1)
1686                 {
1687                     gmx_fatal(FARGS, "Could not parse wall-density value from string '%s'", names[i]);
1688                 }
1689                 if (dbl <= 0)
1690                 {
1691                     gmx_fatal(FARGS, "wall-density[%d] = %f\n", i, dbl);
1692                 }
1693                 ir->wall_density[i] = dbl;
1694             }
1695         }
1696     }
1697 }
1698
1699 static void add_wall_energrps(gmx_groups_t *groups, int nwall, t_symtab *symtab)
1700 {
1701     int     i;
1702     t_grps *grps;
1703     char    str[STRLEN];
1704
1705     if (nwall > 0)
1706     {
1707         srenew(groups->grpname, groups->ngrpname+nwall);
1708         grps = &(groups->grps[egcENER]);
1709         srenew(grps->nm_ind, grps->nr+nwall);
1710         for (i = 0; i < nwall; i++)
1711         {
1712             sprintf(str, "wall%d", i);
1713             groups->grpname[groups->ngrpname] = put_symtab(symtab, str);
1714             grps->nm_ind[grps->nr++]          = groups->ngrpname++;
1715         }
1716     }
1717 }
1718
1719 static void read_expandedparams(int *ninp_p, t_inpfile **inp_p,
1720                                 t_expanded *expand, warninp_t wi)
1721 {
1722     int        ninp;
1723     t_inpfile *inp;
1724
1725     ninp   = *ninp_p;
1726     inp    = *inp_p;
1727
1728     /* read expanded ensemble parameters */
1729     CCTYPE ("expanded ensemble variables");
1730     ITYPE ("nstexpanded", expand->nstexpanded, -1);
1731     EETYPE("lmc-stats", expand->elamstats, elamstats_names);
1732     EETYPE("lmc-move", expand->elmcmove, elmcmove_names);
1733     EETYPE("lmc-weights-equil", expand->elmceq, elmceq_names);
1734     ITYPE ("weight-equil-number-all-lambda", expand->equil_n_at_lam, -1);
1735     ITYPE ("weight-equil-number-samples", expand->equil_samples, -1);
1736     ITYPE ("weight-equil-number-steps", expand->equil_steps, -1);
1737     RTYPE ("weight-equil-wl-delta", expand->equil_wl_delta, -1);
1738     RTYPE ("weight-equil-count-ratio", expand->equil_ratio, -1);
1739     CCTYPE("Seed for Monte Carlo in lambda space");
1740     ITYPE ("lmc-seed", expand->lmc_seed, -1);
1741     RTYPE ("mc-temperature", expand->mc_temp, -1);
1742     ITYPE ("lmc-repeats", expand->lmc_repeats, 1);
1743     ITYPE ("lmc-gibbsdelta", expand->gibbsdeltalam, -1);
1744     ITYPE ("lmc-forced-nstart", expand->lmc_forced_nstart, 0);
1745     EETYPE("symmetrized-transition-matrix", expand->bSymmetrizedTMatrix, yesno_names);
1746     ITYPE("nst-transition-matrix", expand->nstTij, -1);
1747     ITYPE ("mininum-var-min", expand->minvarmin, 100); /*default is reasonable */
1748     ITYPE ("weight-c-range", expand->c_range, 0);      /* default is just C=0 */
1749     RTYPE ("wl-scale", expand->wl_scale, 0.8);
1750     RTYPE ("wl-ratio", expand->wl_ratio, 0.8);
1751     RTYPE ("init-wl-delta", expand->init_wl_delta, 1.0);
1752     EETYPE("wl-oneovert", expand->bWLoneovert, yesno_names);
1753
1754     *ninp_p   = ninp;
1755     *inp_p    = inp;
1756
1757     return;
1758 }
1759
1760 /*! \brief Return whether an end state with the given coupling-lambda
1761  * value describes fully-interacting VDW.
1762  *
1763  * \param[in]  couple_lambda_value  Enumeration ecouplam value describing the end state
1764  * \return                          Whether VDW is on (i.e. the user chose vdw or vdw-q in the .mdp file)
1765  */
1766 static gmx_bool couple_lambda_has_vdw_on(int couple_lambda_value)
1767 {
1768     return (couple_lambda_value == ecouplamVDW ||
1769             couple_lambda_value == ecouplamVDWQ);
1770 }
1771
1772 namespace
1773 {
1774
1775 class MdpErrorHandler : public gmx::IKeyValueTreeErrorHandler
1776 {
1777     public:
1778         explicit MdpErrorHandler(warninp_t wi)
1779             : wi_(wi), mapping_(nullptr)
1780         {
1781         }
1782
1783         void setBackMapping(const gmx::IKeyValueTreeBackMapping &mapping)
1784         {
1785             mapping_ = &mapping;
1786         }
1787
1788         virtual bool onError(gmx::UserInputError *ex, const gmx::KeyValueTreePath &context)
1789         {
1790             ex->prependContext(gmx::formatString("Error in mdp option \"%s\":",
1791                                                  getOptionName(context).c_str()));
1792             std::string message = gmx::formatExceptionMessageToString(*ex);
1793             warning_error(wi_, message.c_str());
1794             return true;
1795         }
1796
1797     private:
1798         std::string getOptionName(const gmx::KeyValueTreePath &context)
1799         {
1800             if (mapping_ != nullptr)
1801             {
1802                 gmx::KeyValueTreePath path = mapping_->originalPath(context);
1803                 GMX_ASSERT(path.size() == 1, "Inconsistent mapping back to mdp options");
1804                 return path[0];
1805             }
1806             GMX_ASSERT(context.size() == 1, "Inconsistent context for mdp option parsing");
1807             return context[0];
1808         }
1809
1810         warninp_t                            wi_;
1811         const gmx::IKeyValueTreeBackMapping *mapping_;
1812 };
1813
1814 } // namespace
1815
1816 void get_ir(const char *mdparin, const char *mdparout,
1817             gmx::MDModules *mdModules, t_inputrec *ir, t_gromppopts *opts,
1818             WriteMdpHeader writeMdpHeader, warninp_t wi)
1819 {
1820     char       *dumstr[2];
1821     double      dumdub[2][6];
1822     t_inpfile  *inp;
1823     const char *tmp;
1824     int         i, j, m, ninp;
1825     char        warn_buf[STRLEN];
1826     t_lambda   *fep    = ir->fepvals;
1827     t_expanded *expand = ir->expandedvals;
1828
1829     init_inputrec_strings();
1830     gmx::TextInputFile stream(mdparin);
1831     inp = read_inpfile(&stream, mdparin, &ninp, wi);
1832
1833     snew(dumstr[0], STRLEN);
1834     snew(dumstr[1], STRLEN);
1835
1836     if (-1 == search_einp(ninp, inp, "cutoff-scheme"))
1837     {
1838         sprintf(warn_buf,
1839                 "%s did not specify a value for the .mdp option "
1840                 "\"cutoff-scheme\". Probably it was first intended for use "
1841                 "with GROMACS before 4.6. In 4.6, the Verlet scheme was "
1842                 "introduced, but the group scheme was still the default. "
1843                 "The default is now the Verlet scheme, so you will observe "
1844                 "different behaviour.", mdparin);
1845         warning_note(wi, warn_buf);
1846     }
1847
1848     /* ignore the following deprecated commands */
1849     REM_TYPE("title");
1850     REM_TYPE("cpp");
1851     REM_TYPE("domain-decomposition");
1852     REM_TYPE("andersen-seed");
1853     REM_TYPE("dihre");
1854     REM_TYPE("dihre-fc");
1855     REM_TYPE("dihre-tau");
1856     REM_TYPE("nstdihreout");
1857     REM_TYPE("nstcheckpoint");
1858     REM_TYPE("optimize-fft");
1859     REM_TYPE("adress_type");
1860     REM_TYPE("adress_const_wf");
1861     REM_TYPE("adress_ex_width");
1862     REM_TYPE("adress_hy_width");
1863     REM_TYPE("adress_ex_forcecap");
1864     REM_TYPE("adress_interface_correction");
1865     REM_TYPE("adress_site");
1866     REM_TYPE("adress_reference_coords");
1867     REM_TYPE("adress_tf_grp_names");
1868     REM_TYPE("adress_cg_grp_names");
1869     REM_TYPE("adress_do_hybridpairs");
1870     REM_TYPE("rlistlong");
1871     REM_TYPE("nstcalclr");
1872     REM_TYPE("pull-print-com2");
1873
1874     /* replace the following commands with the clearer new versions*/
1875     REPL_TYPE("unconstrained-start", "continuation");
1876     REPL_TYPE("foreign-lambda", "fep-lambdas");
1877     REPL_TYPE("verlet-buffer-drift", "verlet-buffer-tolerance");
1878     REPL_TYPE("nstxtcout", "nstxout-compressed");
1879     REPL_TYPE("xtc-grps", "compressed-x-grps");
1880     REPL_TYPE("xtc-precision", "compressed-x-precision");
1881     REPL_TYPE("pull-print-com1", "pull-print-com");
1882
1883     CCTYPE ("VARIOUS PREPROCESSING OPTIONS");
1884     CTYPE ("Preprocessor information: use cpp syntax.");
1885     CTYPE ("e.g.: -I/home/joe/doe -I/home/mary/roe");
1886     STYPE ("include", opts->include,  nullptr);
1887     CTYPE ("e.g.: -DPOSRES -DFLEXIBLE (note these variable names are case sensitive)");
1888     STYPE ("define",  opts->define,   nullptr);
1889
1890     CCTYPE ("RUN CONTROL PARAMETERS");
1891     EETYPE("integrator",  ir->eI,         ei_names);
1892     CTYPE ("Start time and timestep in ps");
1893     RTYPE ("tinit",   ir->init_t, 0.0);
1894     RTYPE ("dt",      ir->delta_t,    0.001);
1895     STEPTYPE ("nsteps",   ir->nsteps,     0);
1896     CTYPE ("For exact run continuation or redoing part of a run");
1897     STEPTYPE ("init-step", ir->init_step,  0);
1898     CTYPE ("Part index is updated automatically on checkpointing (keeps files separate)");
1899     ITYPE ("simulation-part", ir->simulation_part, 1);
1900     CTYPE ("mode for center of mass motion removal");
1901     EETYPE("comm-mode",   ir->comm_mode,  ecm_names);
1902     CTYPE ("number of steps for center of mass motion removal");
1903     ITYPE ("nstcomm", ir->nstcomm,    100);
1904     CTYPE ("group(s) for center of mass motion removal");
1905     STYPE ("comm-grps",   is->vcm,            nullptr);
1906
1907     CCTYPE ("LANGEVIN DYNAMICS OPTIONS");
1908     CTYPE ("Friction coefficient (amu/ps) and random seed");
1909     RTYPE ("bd-fric",     ir->bd_fric,    0.0);
1910     STEPTYPE ("ld-seed",  ir->ld_seed,    -1);
1911
1912     /* Em stuff */
1913     CCTYPE ("ENERGY MINIMIZATION OPTIONS");
1914     CTYPE ("Force tolerance and initial step-size");
1915     RTYPE ("emtol",       ir->em_tol,     10.0);
1916     RTYPE ("emstep",      ir->em_stepsize, 0.01);
1917     CTYPE ("Max number of iterations in relax-shells");
1918     ITYPE ("niter",       ir->niter,      20);
1919     CTYPE ("Step size (ps^2) for minimization of flexible constraints");
1920     RTYPE ("fcstep",      ir->fc_stepsize, 0);
1921     CTYPE ("Frequency of steepest descents steps when doing CG");
1922     ITYPE ("nstcgsteep",  ir->nstcgsteep, 1000);
1923     ITYPE ("nbfgscorr",   ir->nbfgscorr,  10);
1924
1925     CCTYPE ("TEST PARTICLE INSERTION OPTIONS");
1926     RTYPE ("rtpi",    ir->rtpi,   0.05);
1927
1928     /* Output options */
1929     CCTYPE ("OUTPUT CONTROL OPTIONS");
1930     CTYPE ("Output frequency for coords (x), velocities (v) and forces (f)");
1931     ITYPE ("nstxout", ir->nstxout,    0);
1932     ITYPE ("nstvout", ir->nstvout,    0);
1933     ITYPE ("nstfout", ir->nstfout,    0);
1934     CTYPE ("Output frequency for energies to log file and energy file");
1935     ITYPE ("nstlog",  ir->nstlog, 1000);
1936     ITYPE ("nstcalcenergy", ir->nstcalcenergy, 100);
1937     ITYPE ("nstenergy",   ir->nstenergy,  1000);
1938     CTYPE ("Output frequency and precision for .xtc file");
1939     ITYPE ("nstxout-compressed", ir->nstxout_compressed,  0);
1940     RTYPE ("compressed-x-precision", ir->x_compression_precision, 1000.0);
1941     CTYPE ("This selects the subset of atoms for the compressed");
1942     CTYPE ("trajectory file. You can select multiple groups. By");
1943     CTYPE ("default, all atoms will be written.");
1944     STYPE ("compressed-x-grps", is->x_compressed_groups, nullptr);
1945     CTYPE ("Selection of energy groups");
1946     STYPE ("energygrps",  is->energy,         nullptr);
1947
1948     /* Neighbor searching */
1949     CCTYPE ("NEIGHBORSEARCHING PARAMETERS");
1950     CTYPE ("cut-off scheme (Verlet: particle based cut-offs, group: using charge groups)");
1951     EETYPE("cutoff-scheme",     ir->cutoff_scheme,    ecutscheme_names);
1952     CTYPE ("nblist update frequency");
1953     ITYPE ("nstlist", ir->nstlist,    10);
1954     CTYPE ("ns algorithm (simple or grid)");
1955     EETYPE("ns-type",     ir->ns_type,    ens_names);
1956     CTYPE ("Periodic boundary conditions: xyz, no, xy");
1957     EETYPE("pbc",         ir->ePBC,       epbc_names);
1958     EETYPE("periodic-molecules", ir->bPeriodicMols, yesno_names);
1959     CTYPE ("Allowed energy error due to the Verlet buffer in kJ/mol/ps per atom,");
1960     CTYPE ("a value of -1 means: use rlist");
1961     RTYPE("verlet-buffer-tolerance", ir->verletbuf_tol,    0.005);
1962     CTYPE ("nblist cut-off");
1963     RTYPE ("rlist",   ir->rlist,  1.0);
1964     CTYPE ("long-range cut-off for switched potentials");
1965
1966     /* Electrostatics */
1967     CCTYPE ("OPTIONS FOR ELECTROSTATICS AND VDW");
1968     CTYPE ("Method for doing electrostatics");
1969     EETYPE("coulombtype", ir->coulombtype,    eel_names);
1970     EETYPE("coulomb-modifier",    ir->coulomb_modifier,    eintmod_names);
1971     CTYPE ("cut-off lengths");
1972     RTYPE ("rcoulomb-switch", ir->rcoulomb_switch,    0.0);
1973     RTYPE ("rcoulomb",    ir->rcoulomb,   1.0);
1974     CTYPE ("Relative dielectric constant for the medium and the reaction field");
1975     RTYPE ("epsilon-r",   ir->epsilon_r,  1.0);
1976     RTYPE ("epsilon-rf",  ir->epsilon_rf, 0.0);
1977     CTYPE ("Method for doing Van der Waals");
1978     EETYPE("vdw-type",    ir->vdwtype,    evdw_names);
1979     EETYPE("vdw-modifier",    ir->vdw_modifier,    eintmod_names);
1980     CTYPE ("cut-off lengths");
1981     RTYPE ("rvdw-switch", ir->rvdw_switch,    0.0);
1982     RTYPE ("rvdw",    ir->rvdw,   1.0);
1983     CTYPE ("Apply long range dispersion corrections for Energy and Pressure");
1984     EETYPE("DispCorr",    ir->eDispCorr,  edispc_names);
1985     CTYPE ("Extension of the potential lookup tables beyond the cut-off");
1986     RTYPE ("table-extension", ir->tabext, 1.0);
1987     CTYPE ("Separate tables between energy group pairs");
1988     STYPE ("energygrp-table", is->egptable,   nullptr);
1989     CTYPE ("Spacing for the PME/PPPM FFT grid");
1990     RTYPE ("fourierspacing", ir->fourier_spacing, 0.12);
1991     CTYPE ("FFT grid size, when a value is 0 fourierspacing will be used");
1992     ITYPE ("fourier-nx",  ir->nkx,         0);
1993     ITYPE ("fourier-ny",  ir->nky,         0);
1994     ITYPE ("fourier-nz",  ir->nkz,         0);
1995     CTYPE ("EWALD/PME/PPPM parameters");
1996     ITYPE ("pme-order",   ir->pme_order,   4);
1997     RTYPE ("ewald-rtol",  ir->ewald_rtol, 0.00001);
1998     RTYPE ("ewald-rtol-lj", ir->ewald_rtol_lj, 0.001);
1999     EETYPE("lj-pme-comb-rule", ir->ljpme_combination_rule, eljpme_names);
2000     EETYPE("ewald-geometry", ir->ewald_geometry, eewg_names);
2001     RTYPE ("epsilon-surface", ir->epsilon_surface, 0.0);
2002
2003     CCTYPE("IMPLICIT SOLVENT ALGORITHM");
2004     EETYPE("implicit-solvent", ir->implicit_solvent, eis_names);
2005
2006     CCTYPE ("GENERALIZED BORN ELECTROSTATICS");
2007     CTYPE ("Algorithm for calculating Born radii");
2008     EETYPE("gb-algorithm", ir->gb_algorithm, egb_names);
2009     CTYPE ("Frequency of calculating the Born radii inside rlist");
2010     ITYPE ("nstgbradii", ir->nstgbradii, 1);
2011     CTYPE ("Cutoff for Born radii calculation; the contribution from atoms");
2012     CTYPE ("between rlist and rgbradii is updated every nstlist steps");
2013     RTYPE ("rgbradii",  ir->rgbradii, 1.0);
2014     CTYPE ("Dielectric coefficient of the implicit solvent");
2015     RTYPE ("gb-epsilon-solvent", ir->gb_epsilon_solvent, 80.0);
2016     CTYPE ("Salt concentration in M for Generalized Born models");
2017     RTYPE ("gb-saltconc",  ir->gb_saltconc, 0.0);
2018     CTYPE ("Scaling factors used in the OBC GB model. Default values are OBC(II)");
2019     RTYPE ("gb-obc-alpha", ir->gb_obc_alpha, 1.0);
2020     RTYPE ("gb-obc-beta", ir->gb_obc_beta, 0.8);
2021     RTYPE ("gb-obc-gamma", ir->gb_obc_gamma, 4.85);
2022     RTYPE ("gb-dielectric-offset", ir->gb_dielectric_offset, 0.009);
2023     EETYPE("sa-algorithm", ir->sa_algorithm, esa_names);
2024     CTYPE ("Surface tension (kJ/mol/nm^2) for the SA (nonpolar surface) part of GBSA");
2025     CTYPE ("The value -1 will set default value for Still/HCT/OBC GB-models.");
2026     RTYPE ("sa-surface-tension", ir->sa_surface_tension, -1);
2027
2028     /* Coupling stuff */
2029     CCTYPE ("OPTIONS FOR WEAK COUPLING ALGORITHMS");
2030     CTYPE ("Temperature coupling");
2031     EETYPE("tcoupl",  ir->etc,        etcoupl_names);
2032     ITYPE ("nsttcouple", ir->nsttcouple,  -1);
2033     ITYPE("nh-chain-length",     ir->opts.nhchainlength, 10);
2034     EETYPE("print-nose-hoover-chain-variables", ir->bPrintNHChains, yesno_names);
2035     CTYPE ("Groups to couple separately");
2036     STYPE ("tc-grps",     is->tcgrps,         nullptr);
2037     CTYPE ("Time constant (ps) and reference temperature (K)");
2038     STYPE ("tau-t",   is->tau_t,      nullptr);
2039     STYPE ("ref-t",   is->ref_t,      nullptr);
2040     CTYPE ("pressure coupling");
2041     EETYPE("pcoupl",  ir->epc,        epcoupl_names);
2042     EETYPE("pcoupltype",  ir->epct,       epcoupltype_names);
2043     ITYPE ("nstpcouple", ir->nstpcouple,  -1);
2044     CTYPE ("Time constant (ps), compressibility (1/bar) and reference P (bar)");
2045     RTYPE ("tau-p",   ir->tau_p,  1.0);
2046     STYPE ("compressibility", dumstr[0],  nullptr);
2047     STYPE ("ref-p",       dumstr[1],      nullptr);
2048     CTYPE ("Scaling of reference coordinates, No, All or COM");
2049     EETYPE ("refcoord-scaling", ir->refcoord_scaling, erefscaling_names);
2050
2051     /* QMMM */
2052     CCTYPE ("OPTIONS FOR QMMM calculations");
2053     EETYPE("QMMM", ir->bQMMM, yesno_names);
2054     CTYPE ("Groups treated Quantum Mechanically");
2055     STYPE ("QMMM-grps",  is->QMMM,          nullptr);
2056     CTYPE ("QM method");
2057     STYPE("QMmethod",     is->QMmethod, nullptr);
2058     CTYPE ("QMMM scheme");
2059     EETYPE("QMMMscheme",  ir->QMMMscheme,    eQMMMscheme_names);
2060     CTYPE ("QM basisset");
2061     STYPE("QMbasis",      is->QMbasis, nullptr);
2062     CTYPE ("QM charge");
2063     STYPE ("QMcharge",    is->QMcharge, nullptr);
2064     CTYPE ("QM multiplicity");
2065     STYPE ("QMmult",      is->QMmult, nullptr);
2066     CTYPE ("Surface Hopping");
2067     STYPE ("SH",          is->bSH, nullptr);
2068     CTYPE ("CAS space options");
2069     STYPE ("CASorbitals",      is->CASorbitals,   nullptr);
2070     STYPE ("CASelectrons",     is->CASelectrons,  nullptr);
2071     STYPE ("SAon", is->SAon, nullptr);
2072     STYPE ("SAoff", is->SAoff, nullptr);
2073     STYPE ("SAsteps", is->SAsteps, nullptr);
2074     CTYPE ("Scale factor for MM charges");
2075     RTYPE ("MMChargeScaleFactor", ir->scalefactor, 1.0);
2076
2077     /* Simulated annealing */
2078     CCTYPE("SIMULATED ANNEALING");
2079     CTYPE ("Type of annealing for each temperature group (no/single/periodic)");
2080     STYPE ("annealing",   is->anneal,      nullptr);
2081     CTYPE ("Number of time points to use for specifying annealing in each group");
2082     STYPE ("annealing-npoints", is->anneal_npoints, nullptr);
2083     CTYPE ("List of times at the annealing points for each group");
2084     STYPE ("annealing-time",       is->anneal_time,       nullptr);
2085     CTYPE ("Temp. at each annealing point, for each group.");
2086     STYPE ("annealing-temp",  is->anneal_temp,  nullptr);
2087
2088     /* Startup run */
2089     CCTYPE ("GENERATE VELOCITIES FOR STARTUP RUN");
2090     EETYPE("gen-vel",     opts->bGenVel,  yesno_names);
2091     RTYPE ("gen-temp",    opts->tempi,    300.0);
2092     ITYPE ("gen-seed",    opts->seed,     -1);
2093
2094     /* Shake stuff */
2095     CCTYPE ("OPTIONS FOR BONDS");
2096     EETYPE("constraints", opts->nshake,   constraints);
2097     CTYPE ("Type of constraint algorithm");
2098     EETYPE("constraint-algorithm",  ir->eConstrAlg, econstr_names);
2099     CTYPE ("Do not constrain the start configuration");
2100     EETYPE("continuation", ir->bContinuation, yesno_names);
2101     CTYPE ("Use successive overrelaxation to reduce the number of shake iterations");
2102     EETYPE("Shake-SOR", ir->bShakeSOR, yesno_names);
2103     CTYPE ("Relative tolerance of shake");
2104     RTYPE ("shake-tol", ir->shake_tol, 0.0001);
2105     CTYPE ("Highest order in the expansion of the constraint coupling matrix");
2106     ITYPE ("lincs-order", ir->nProjOrder, 4);
2107     CTYPE ("Number of iterations in the final step of LINCS. 1 is fine for");
2108     CTYPE ("normal simulations, but use 2 to conserve energy in NVE runs.");
2109     CTYPE ("For energy minimization with constraints it should be 4 to 8.");
2110     ITYPE ("lincs-iter", ir->nLincsIter, 1);
2111     CTYPE ("Lincs will write a warning to the stderr if in one step a bond");
2112     CTYPE ("rotates over more degrees than");
2113     RTYPE ("lincs-warnangle", ir->LincsWarnAngle, 30.0);
2114     CTYPE ("Convert harmonic bonds to morse potentials");
2115     EETYPE("morse",       opts->bMorse, yesno_names);
2116
2117     /* Energy group exclusions */
2118     CCTYPE ("ENERGY GROUP EXCLUSIONS");
2119     CTYPE ("Pairs of energy groups for which all non-bonded interactions are excluded");
2120     STYPE ("energygrp-excl", is->egpexcl,     nullptr);
2121
2122     /* Walls */
2123     CCTYPE ("WALLS");
2124     CTYPE ("Number of walls, type, atom types, densities and box-z scale factor for Ewald");
2125     ITYPE ("nwall", ir->nwall, 0);
2126     EETYPE("wall-type",     ir->wall_type,   ewt_names);
2127     RTYPE ("wall-r-linpot", ir->wall_r_linpot, -1);
2128     STYPE ("wall-atomtype", is->wall_atomtype, nullptr);
2129     STYPE ("wall-density",  is->wall_density,  nullptr);
2130     RTYPE ("wall-ewald-zfac", ir->wall_ewald_zfac, 3);
2131
2132     /* COM pulling */
2133     CCTYPE("COM PULLING");
2134     EETYPE("pull",          ir->bPull, yesno_names);
2135     if (ir->bPull)
2136     {
2137         snew(ir->pull, 1);
2138         is->pull_grp = read_pullparams(&ninp, &inp, ir->pull, wi);
2139     }
2140
2141     /* Enforced rotation */
2142     CCTYPE("ENFORCED ROTATION");
2143     CTYPE("Enforced rotation: No or Yes");
2144     EETYPE("rotation",       ir->bRot, yesno_names);
2145     if (ir->bRot)
2146     {
2147         snew(ir->rot, 1);
2148         is->rot_grp = read_rotparams(&ninp, &inp, ir->rot, wi);
2149     }
2150
2151     /* Interactive MD */
2152     ir->bIMD = FALSE;
2153     CCTYPE("Group to display and/or manipulate in interactive MD session");
2154     STYPE ("IMD-group", is->imd_grp, nullptr);
2155     if (is->imd_grp[0] != '\0')
2156     {
2157         snew(ir->imd, 1);
2158         ir->bIMD = TRUE;
2159     }
2160
2161     /* Refinement */
2162     CCTYPE("NMR refinement stuff");
2163     CTYPE ("Distance restraints type: No, Simple or Ensemble");
2164     EETYPE("disre",       ir->eDisre,     edisre_names);
2165     CTYPE ("Force weighting of pairs in one distance restraint: Conservative or Equal");
2166     EETYPE("disre-weighting", ir->eDisreWeighting, edisreweighting_names);
2167     CTYPE ("Use sqrt of the time averaged times the instantaneous violation");
2168     EETYPE("disre-mixed", ir->bDisreMixed, yesno_names);
2169     RTYPE ("disre-fc",    ir->dr_fc,  1000.0);
2170     RTYPE ("disre-tau",   ir->dr_tau, 0.0);
2171     CTYPE ("Output frequency for pair distances to energy file");
2172     ITYPE ("nstdisreout", ir->nstdisreout, 100);
2173     CTYPE ("Orientation restraints: No or Yes");
2174     EETYPE("orire",       opts->bOrire,   yesno_names);
2175     CTYPE ("Orientation restraints force constant and tau for time averaging");
2176     RTYPE ("orire-fc",    ir->orires_fc,  0.0);
2177     RTYPE ("orire-tau",   ir->orires_tau, 0.0);
2178     STYPE ("orire-fitgrp", is->orirefitgrp,    nullptr);
2179     CTYPE ("Output frequency for trace(SD) and S to energy file");
2180     ITYPE ("nstorireout", ir->nstorireout, 100);
2181
2182     /* free energy variables */
2183     CCTYPE ("Free energy variables");
2184     EETYPE("free-energy", ir->efep, efep_names);
2185     STYPE ("couple-moltype",  is->couple_moltype,  nullptr);
2186     EETYPE("couple-lambda0", opts->couple_lam0, couple_lam);
2187     EETYPE("couple-lambda1", opts->couple_lam1, couple_lam);
2188     EETYPE("couple-intramol", opts->bCoupleIntra, yesno_names);
2189
2190     RTYPE ("init-lambda", fep->init_lambda, -1); /* start with -1 so
2191                                                     we can recognize if
2192                                                     it was not entered */
2193     ITYPE ("init-lambda-state", fep->init_fep_state, -1);
2194     RTYPE ("delta-lambda", fep->delta_lambda, 0.0);
2195     ITYPE ("nstdhdl", fep->nstdhdl, 50);
2196     STYPE ("fep-lambdas", is->fep_lambda[efptFEP], nullptr);
2197     STYPE ("mass-lambdas", is->fep_lambda[efptMASS], nullptr);
2198     STYPE ("coul-lambdas", is->fep_lambda[efptCOUL], nullptr);
2199     STYPE ("vdw-lambdas", is->fep_lambda[efptVDW], nullptr);
2200     STYPE ("bonded-lambdas", is->fep_lambda[efptBONDED], nullptr);
2201     STYPE ("restraint-lambdas", is->fep_lambda[efptRESTRAINT], nullptr);
2202     STYPE ("temperature-lambdas", is->fep_lambda[efptTEMPERATURE], nullptr);
2203     ITYPE ("calc-lambda-neighbors", fep->lambda_neighbors, 1);
2204     STYPE ("init-lambda-weights", is->lambda_weights, nullptr);
2205     EETYPE("dhdl-print-energy", fep->edHdLPrintEnergy, edHdLPrintEnergy_names);
2206     RTYPE ("sc-alpha", fep->sc_alpha, 0.0);
2207     ITYPE ("sc-power", fep->sc_power, 1);
2208     RTYPE ("sc-r-power", fep->sc_r_power, 6.0);
2209     RTYPE ("sc-sigma", fep->sc_sigma, 0.3);
2210     EETYPE("sc-coul", fep->bScCoul, yesno_names);
2211     ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2212     RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2213     EETYPE("separate-dhdl-file", fep->separate_dhdl_file,
2214            separate_dhdl_file_names);
2215     EETYPE("dhdl-derivatives", fep->dhdl_derivatives, dhdl_derivatives_names);
2216     ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2217     RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2218
2219     /* Non-equilibrium MD stuff */
2220     CCTYPE("Non-equilibrium MD stuff");
2221     STYPE ("acc-grps",    is->accgrps,        nullptr);
2222     STYPE ("accelerate",  is->acc,            nullptr);
2223     STYPE ("freezegrps",  is->freeze,         nullptr);
2224     STYPE ("freezedim",   is->frdim,          nullptr);
2225     RTYPE ("cos-acceleration", ir->cos_accel, 0);
2226     STYPE ("deform",      is->deform,         nullptr);
2227
2228     /* simulated tempering variables */
2229     CCTYPE("simulated tempering variables");
2230     EETYPE("simulated-tempering", ir->bSimTemp, yesno_names);
2231     EETYPE("simulated-tempering-scaling", ir->simtempvals->eSimTempScale, esimtemp_names);
2232     RTYPE("sim-temp-low", ir->simtempvals->simtemp_low, 300.0);
2233     RTYPE("sim-temp-high", ir->simtempvals->simtemp_high, 300.0);
2234
2235     /* expanded ensemble variables */
2236     if (ir->efep == efepEXPANDED || ir->bSimTemp)
2237     {
2238         read_expandedparams(&ninp, &inp, expand, wi);
2239     }
2240
2241     /* Electric fields */
2242     {
2243         gmx::KeyValueTreeObject      convertedValues = flatKeyValueTreeFromInpFile(ninp, inp);
2244         gmx::KeyValueTreeTransformer transform;
2245         transform.rules()->addRule()
2246             .keyMatchType("/", gmx::StringCompareType::CaseAndDashInsensitive);
2247         mdModules->initMdpTransform(transform.rules());
2248         for (const auto &path : transform.mappedPaths())
2249         {
2250             GMX_ASSERT(path.size() == 1, "Inconsistent mapping back to mdp options");
2251             mark_einp_set(ninp, inp, path[0].c_str());
2252         }
2253         MdpErrorHandler              errorHandler(wi);
2254         auto                         result
2255                    = transform.transform(convertedValues, &errorHandler);
2256         ir->params = new gmx::KeyValueTreeObject(result.object());
2257         mdModules->adjustInputrecBasedOnModules(ir);
2258         errorHandler.setBackMapping(result.backMapping());
2259         mdModules->assignOptionsToModules(*ir->params, &errorHandler);
2260     }
2261
2262     /* Ion/water position swapping ("computational electrophysiology") */
2263     CCTYPE("Ion/water position swapping for computational electrophysiology setups");
2264     CTYPE("Swap positions along direction: no, X, Y, Z");
2265     EETYPE("swapcoords", ir->eSwapCoords, eSwapTypes_names);
2266     if (ir->eSwapCoords != eswapNO)
2267     {
2268         char buf[STRLEN];
2269         int  nIonTypes;
2270
2271
2272         snew(ir->swap, 1);
2273         CTYPE("Swap attempt frequency");
2274         ITYPE("swap-frequency", ir->swap->nstswap, 1);
2275         CTYPE("Number of ion types to be controlled");
2276         ITYPE("iontypes", nIonTypes, 1);
2277         if (nIonTypes < 1)
2278         {
2279             warning_error(wi, "You need to provide at least one ion type for position exchanges.");
2280         }
2281         ir->swap->ngrp = nIonTypes + eSwapFixedGrpNR;
2282         snew(ir->swap->grp, ir->swap->ngrp);
2283         for (i = 0; i < ir->swap->ngrp; i++)
2284         {
2285             snew(ir->swap->grp[i].molname, STRLEN);
2286         }
2287         CTYPE("Two index groups that contain the compartment-partitioning atoms");
2288         STYPE("split-group0", ir->swap->grp[eGrpSplit0].molname, nullptr);
2289         STYPE("split-group1", ir->swap->grp[eGrpSplit1].molname, nullptr);
2290         CTYPE("Use center of mass of split groups (yes/no), otherwise center of geometry is used");
2291         EETYPE("massw-split0", ir->swap->massw_split[0], yesno_names);
2292         EETYPE("massw-split1", ir->swap->massw_split[1], yesno_names);
2293
2294         CTYPE("Name of solvent molecules");
2295         STYPE("solvent-group", ir->swap->grp[eGrpSolvent].molname, nullptr);
2296
2297         CTYPE("Split cylinder: radius, upper and lower extension (nm) (this will define the channels)");
2298         CTYPE("Note that the split cylinder settings do not have an influence on the swapping protocol,");
2299         CTYPE("however, if correctly defined, the permeation events are recorded per channel");
2300         RTYPE("cyl0-r", ir->swap->cyl0r, 2.0);
2301         RTYPE("cyl0-up", ir->swap->cyl0u, 1.0);
2302         RTYPE("cyl0-down", ir->swap->cyl0l, 1.0);
2303         RTYPE("cyl1-r", ir->swap->cyl1r, 2.0);
2304         RTYPE("cyl1-up", ir->swap->cyl1u, 1.0);
2305         RTYPE("cyl1-down", ir->swap->cyl1l, 1.0);
2306
2307         CTYPE("Average the number of ions per compartment over these many swap attempt steps");
2308         ITYPE("coupl-steps", ir->swap->nAverage, 10);
2309
2310         CTYPE("Names of the ion types that can be exchanged with solvent molecules,");
2311         CTYPE("and the requested number of ions of this type in compartments A and B");
2312         CTYPE("-1 means fix the numbers as found in step 0");
2313         for (i = 0; i < nIonTypes; i++)
2314         {
2315             int ig = eSwapFixedGrpNR + i;
2316
2317             sprintf(buf, "iontype%d-name", i);
2318             STYPE(buf, ir->swap->grp[ig].molname, nullptr);
2319             sprintf(buf, "iontype%d-in-A", i);
2320             ITYPE(buf, ir->swap->grp[ig].nmolReq[0], -1);
2321             sprintf(buf, "iontype%d-in-B", i);
2322             ITYPE(buf, ir->swap->grp[ig].nmolReq[1], -1);
2323         }
2324
2325         CTYPE("By default (i.e. bulk offset = 0.0), ion/water exchanges happen between layers");
2326         CTYPE("at maximum distance (= bulk concentration) to the split group layers. However,");
2327         CTYPE("an offset b (-1.0 < b < +1.0) can be specified to offset the bulk layer from the middle at 0.0");
2328         CTYPE("towards one of the compartment-partitioning layers (at +/- 1.0).");
2329         RTYPE("bulk-offsetA", ir->swap->bulkOffset[0], 0.0);
2330         RTYPE("bulk-offsetB", ir->swap->bulkOffset[1], 0.0);
2331         if (!(ir->swap->bulkOffset[0] > -1.0 && ir->swap->bulkOffset[0] < 1.0)
2332             || !(ir->swap->bulkOffset[1] > -1.0 && ir->swap->bulkOffset[1] < 1.0) )
2333         {
2334             warning_error(wi, "Bulk layer offsets must be > -1.0 and < 1.0 !");
2335         }
2336
2337         CTYPE("Start to swap ions if threshold difference to requested count is reached");
2338         RTYPE("threshold", ir->swap->threshold, 1.0);
2339     }
2340
2341     /* AdResS is no longer supported, but we need mdrun to be able to refuse to run old AdResS .tpr files */
2342     EETYPE("adress", ir->bAdress, yesno_names);
2343
2344     /* User defined thingies */
2345     CCTYPE ("User defined thingies");
2346     STYPE ("user1-grps",  is->user1,          nullptr);
2347     STYPE ("user2-grps",  is->user2,          nullptr);
2348     ITYPE ("userint1",    ir->userint1,   0);
2349     ITYPE ("userint2",    ir->userint2,   0);
2350     ITYPE ("userint3",    ir->userint3,   0);
2351     ITYPE ("userint4",    ir->userint4,   0);
2352     RTYPE ("userreal1",   ir->userreal1,  0);
2353     RTYPE ("userreal2",   ir->userreal2,  0);
2354     RTYPE ("userreal3",   ir->userreal3,  0);
2355     RTYPE ("userreal4",   ir->userreal4,  0);
2356 #undef CTYPE
2357
2358     {
2359         gmx::TextOutputFile stream(mdparout);
2360         write_inpfile(&stream, mdparout, ninp, inp, FALSE, writeMdpHeader, wi);
2361
2362         // Transform module data into a flat key-value tree for output.
2363         gmx::KeyValueTreeBuilder       builder;
2364         gmx::KeyValueTreeObjectBuilder builderObject = builder.rootObject();
2365         mdModules->buildMdpOutput(&builderObject);
2366         {
2367             gmx::TextWriter writer(&stream);
2368             writeKeyValueTreeAsMdp(&writer, builder.build());
2369         }
2370         stream.close();
2371     }
2372
2373     for (i = 0; (i < ninp); i++)
2374     {
2375         sfree(inp[i].name);
2376         sfree(inp[i].value);
2377     }
2378     sfree(inp);
2379
2380     /* Process options if necessary */
2381     for (m = 0; m < 2; m++)
2382     {
2383         for (i = 0; i < 2*DIM; i++)
2384         {
2385             dumdub[m][i] = 0.0;
2386         }
2387         if (ir->epc)
2388         {
2389             switch (ir->epct)
2390             {
2391                 case epctISOTROPIC:
2392                     if (sscanf(dumstr[m], "%lf", &(dumdub[m][XX])) != 1)
2393                     {
2394                         warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 1)");
2395                     }
2396                     dumdub[m][YY] = dumdub[m][ZZ] = dumdub[m][XX];
2397                     break;
2398                 case epctSEMIISOTROPIC:
2399                 case epctSURFACETENSION:
2400                     if (sscanf(dumstr[m], "%lf%lf", &(dumdub[m][XX]), &(dumdub[m][ZZ])) != 2)
2401                     {
2402                         warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 2)");
2403                     }
2404                     dumdub[m][YY] = dumdub[m][XX];
2405                     break;
2406                 case epctANISOTROPIC:
2407                     if (sscanf(dumstr[m], "%lf%lf%lf%lf%lf%lf",
2408                                &(dumdub[m][XX]), &(dumdub[m][YY]), &(dumdub[m][ZZ]),
2409                                &(dumdub[m][3]), &(dumdub[m][4]), &(dumdub[m][5])) != 6)
2410                     {
2411                         warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 6)");
2412                     }
2413                     break;
2414                 default:
2415                     gmx_fatal(FARGS, "Pressure coupling type %s not implemented yet",
2416                               epcoupltype_names[ir->epct]);
2417             }
2418         }
2419     }
2420     clear_mat(ir->ref_p);
2421     clear_mat(ir->compress);
2422     for (i = 0; i < DIM; i++)
2423     {
2424         ir->ref_p[i][i]    = dumdub[1][i];
2425         ir->compress[i][i] = dumdub[0][i];
2426     }
2427     if (ir->epct == epctANISOTROPIC)
2428     {
2429         ir->ref_p[XX][YY] = dumdub[1][3];
2430         ir->ref_p[XX][ZZ] = dumdub[1][4];
2431         ir->ref_p[YY][ZZ] = dumdub[1][5];
2432         if (ir->ref_p[XX][YY] != 0 && ir->ref_p[XX][ZZ] != 0 && ir->ref_p[YY][ZZ] != 0)
2433         {
2434             warning(wi, "All off-diagonal reference pressures are non-zero. Are you sure you want to apply a threefold shear stress?\n");
2435         }
2436         ir->compress[XX][YY] = dumdub[0][3];
2437         ir->compress[XX][ZZ] = dumdub[0][4];
2438         ir->compress[YY][ZZ] = dumdub[0][5];
2439         for (i = 0; i < DIM; i++)
2440         {
2441             for (m = 0; m < i; m++)
2442             {
2443                 ir->ref_p[i][m]    = ir->ref_p[m][i];
2444                 ir->compress[i][m] = ir->compress[m][i];
2445             }
2446         }
2447     }
2448
2449     if (ir->comm_mode == ecmNO)
2450     {
2451         ir->nstcomm = 0;
2452     }
2453
2454     opts->couple_moltype = nullptr;
2455     if (strlen(is->couple_moltype) > 0)
2456     {
2457         if (ir->efep != efepNO)
2458         {
2459             opts->couple_moltype = gmx_strdup(is->couple_moltype);
2460             if (opts->couple_lam0 == opts->couple_lam1)
2461             {
2462                 warning(wi, "The lambda=0 and lambda=1 states for coupling are identical");
2463             }
2464             if (ir->eI == eiMD && (opts->couple_lam0 == ecouplamNONE ||
2465                                    opts->couple_lam1 == ecouplamNONE))
2466             {
2467                 warning(wi, "For proper sampling of the (nearly) decoupled state, stochastic dynamics should be used");
2468             }
2469         }
2470         else
2471         {
2472             warning_note(wi, "Free energy is turned off, so we will not decouple the molecule listed in your input.");
2473         }
2474     }
2475     /* FREE ENERGY AND EXPANDED ENSEMBLE OPTIONS */
2476     if (ir->efep != efepNO)
2477     {
2478         if (fep->delta_lambda > 0)
2479         {
2480             ir->efep = efepSLOWGROWTH;
2481         }
2482     }
2483
2484     if (fep->edHdLPrintEnergy == edHdLPrintEnergyYES)
2485     {
2486         fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2487         warning_note(wi, "Old option for dhdl-print-energy given: "
2488                      "changing \"yes\" to \"total\"\n");
2489     }
2490
2491     if (ir->bSimTemp && (fep->edHdLPrintEnergy == edHdLPrintEnergyNO))
2492     {
2493         /* always print out the energy to dhdl if we are doing
2494            expanded ensemble, since we need the total energy for
2495            analysis if the temperature is changing. In some
2496            conditions one may only want the potential energy, so
2497            we will allow that if the appropriate mdp setting has
2498            been enabled. Otherwise, total it is:
2499          */
2500         fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2501     }
2502
2503     if ((ir->efep != efepNO) || ir->bSimTemp)
2504     {
2505         ir->bExpanded = FALSE;
2506         if ((ir->efep == efepEXPANDED) || ir->bSimTemp)
2507         {
2508             ir->bExpanded = TRUE;
2509         }
2510         do_fep_params(ir, is->fep_lambda, is->lambda_weights, wi);
2511         if (ir->bSimTemp) /* done after fep params */
2512         {
2513             do_simtemp_params(ir);
2514         }
2515
2516         /* Because sc-coul (=FALSE by default) only acts on the lambda state
2517          * setup and not on the old way of specifying the free-energy setup,
2518          * we should check for using soft-core when not needed, since that
2519          * can complicate the sampling significantly.
2520          * Note that we only check for the automated coupling setup.
2521          * If the (advanced) user does FEP through manual topology changes,
2522          * this check will not be triggered.
2523          */
2524         if (ir->efep != efepNO && ir->fepvals->n_lambda == 0 &&
2525             ir->fepvals->sc_alpha != 0 &&
2526             (couple_lambda_has_vdw_on(opts->couple_lam0) &&
2527              couple_lambda_has_vdw_on(opts->couple_lam1)))
2528         {
2529             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.");
2530         }
2531     }
2532     else
2533     {
2534         ir->fepvals->n_lambda = 0;
2535     }
2536
2537     /* WALL PARAMETERS */
2538
2539     do_wall_params(ir, is->wall_atomtype, is->wall_density, opts);
2540
2541     /* ORIENTATION RESTRAINT PARAMETERS */
2542
2543     if (opts->bOrire && str_nelem(is->orirefitgrp, MAXPTR, nullptr) != 1)
2544     {
2545         warning_error(wi, "ERROR: Need one orientation restraint fit group\n");
2546     }
2547
2548     /* DEFORMATION PARAMETERS */
2549
2550     clear_mat(ir->deform);
2551     for (i = 0; i < 6; i++)
2552     {
2553         dumdub[0][i] = 0;
2554     }
2555
2556     double gmx_unused canary;
2557     int               ndeform = sscanf(is->deform, "%lf %lf %lf %lf %lf %lf %lf",
2558                                        &(dumdub[0][0]), &(dumdub[0][1]), &(dumdub[0][2]),
2559                                        &(dumdub[0][3]), &(dumdub[0][4]), &(dumdub[0][5]), &canary);
2560
2561     if (strlen(is->deform) > 0 && ndeform != 6)
2562     {
2563         warning_error(wi, gmx::formatString("Cannot parse exactly 6 box deformation velocities from string '%s'", is->deform).c_str());
2564     }
2565     for (i = 0; i < 3; i++)
2566     {
2567         ir->deform[i][i] = dumdub[0][i];
2568     }
2569     ir->deform[YY][XX] = dumdub[0][3];
2570     ir->deform[ZZ][XX] = dumdub[0][4];
2571     ir->deform[ZZ][YY] = dumdub[0][5];
2572     if (ir->epc != epcNO)
2573     {
2574         for (i = 0; i < 3; i++)
2575         {
2576             for (j = 0; j <= i; j++)
2577             {
2578                 if (ir->deform[i][j] != 0 && ir->compress[i][j] != 0)
2579                 {
2580                     warning_error(wi, "A box element has deform set and compressibility > 0");
2581                 }
2582             }
2583         }
2584         for (i = 0; i < 3; i++)
2585         {
2586             for (j = 0; j < i; j++)
2587             {
2588                 if (ir->deform[i][j] != 0)
2589                 {
2590                     for (m = j; m < DIM; m++)
2591                     {
2592                         if (ir->compress[m][j] != 0)
2593                         {
2594                             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.");
2595                             warning(wi, warn_buf);
2596                         }
2597                     }
2598                 }
2599             }
2600         }
2601     }
2602
2603     /* Ion/water position swapping checks */
2604     if (ir->eSwapCoords != eswapNO)
2605     {
2606         if (ir->swap->nstswap < 1)
2607         {
2608             warning_error(wi, "swap_frequency must be 1 or larger when ion swapping is requested");
2609         }
2610         if (ir->swap->nAverage < 1)
2611         {
2612             warning_error(wi, "coupl_steps must be 1 or larger.\n");
2613         }
2614         if (ir->swap->threshold < 1.0)
2615         {
2616             warning_error(wi, "Ion count threshold must be at least 1.\n");
2617         }
2618     }
2619
2620     sfree(dumstr[0]);
2621     sfree(dumstr[1]);
2622 }
2623
2624 static int search_QMstring(const char *s, int ng, const char *gn[])
2625 {
2626     /* same as normal search_string, but this one searches QM strings */
2627     int i;
2628
2629     for (i = 0; (i < ng); i++)
2630     {
2631         if (gmx_strcasecmp(s, gn[i]) == 0)
2632         {
2633             return i;
2634         }
2635     }
2636
2637     gmx_fatal(FARGS, "this QM method or basisset (%s) is not implemented\n!", s);
2638
2639     return -1;
2640
2641 } /* search_QMstring */
2642
2643 /* We would like gn to be const as well, but C doesn't allow this */
2644 /* TODO this is utility functionality (search for the index of a
2645    string in a collection), so should be refactored and located more
2646    centrally. */
2647 int search_string(const char *s, int ng, char *gn[])
2648 {
2649     int i;
2650
2651     for (i = 0; (i < ng); i++)
2652     {
2653         if (gmx_strcasecmp(s, gn[i]) == 0)
2654         {
2655             return i;
2656         }
2657     }
2658
2659     gmx_fatal(FARGS,
2660               "Group %s referenced in the .mdp file was not found in the index file.\n"
2661               "Group names must match either [moleculetype] names or custom index group\n"
2662               "names, in which case you must supply an index file to the '-n' option\n"
2663               "of grompp.",
2664               s);
2665
2666     return -1;
2667 }
2668
2669 static gmx_bool do_numbering(int natoms, gmx_groups_t *groups, int ng, char *ptrs[],
2670                              t_blocka *block, char *gnames[],
2671                              int gtype, int restnm,
2672                              int grptp, gmx_bool bVerbose,
2673                              warninp_t wi)
2674 {
2675     unsigned short *cbuf;
2676     t_grps         *grps = &(groups->grps[gtype]);
2677     int             i, j, gid, aj, ognr, ntot = 0;
2678     const char     *title;
2679     gmx_bool        bRest;
2680     char            warn_buf[STRLEN];
2681
2682     if (debug)
2683     {
2684         fprintf(debug, "Starting numbering %d groups of type %d\n", ng, gtype);
2685     }
2686
2687     title = gtypes[gtype];
2688
2689     snew(cbuf, natoms);
2690     /* Mark all id's as not set */
2691     for (i = 0; (i < natoms); i++)
2692     {
2693         cbuf[i] = NOGID;
2694     }
2695
2696     snew(grps->nm_ind, ng+1); /* +1 for possible rest group */
2697     for (i = 0; (i < ng); i++)
2698     {
2699         /* Lookup the group name in the block structure */
2700         gid = search_string(ptrs[i], block->nr, gnames);
2701         if ((grptp != egrptpONE) || (i == 0))
2702         {
2703             grps->nm_ind[grps->nr++] = gid;
2704         }
2705         if (debug)
2706         {
2707             fprintf(debug, "Found gid %d for group %s\n", gid, ptrs[i]);
2708         }
2709
2710         /* Now go over the atoms in the group */
2711         for (j = block->index[gid]; (j < block->index[gid+1]); j++)
2712         {
2713
2714             aj = block->a[j];
2715
2716             /* Range checking */
2717             if ((aj < 0) || (aj >= natoms))
2718             {
2719                 gmx_fatal(FARGS, "Invalid atom number %d in indexfile", aj);
2720             }
2721             /* Lookup up the old group number */
2722             ognr = cbuf[aj];
2723             if (ognr != NOGID)
2724             {
2725                 gmx_fatal(FARGS, "Atom %d in multiple %s groups (%d and %d)",
2726                           aj+1, title, ognr+1, i+1);
2727             }
2728             else
2729             {
2730                 /* Store the group number in buffer */
2731                 if (grptp == egrptpONE)
2732                 {
2733                     cbuf[aj] = 0;
2734                 }
2735                 else
2736                 {
2737                     cbuf[aj] = i;
2738                 }
2739                 ntot++;
2740             }
2741         }
2742     }
2743
2744     /* Now check whether we have done all atoms */
2745     bRest = FALSE;
2746     if (ntot != natoms)
2747     {
2748         if (grptp == egrptpALL)
2749         {
2750             gmx_fatal(FARGS, "%d atoms are not part of any of the %s groups",
2751                       natoms-ntot, title);
2752         }
2753         else if (grptp == egrptpPART)
2754         {
2755             sprintf(warn_buf, "%d atoms are not part of any of the %s groups",
2756                     natoms-ntot, title);
2757             warning_note(wi, warn_buf);
2758         }
2759         /* Assign all atoms currently unassigned to a rest group */
2760         for (j = 0; (j < natoms); j++)
2761         {
2762             if (cbuf[j] == NOGID)
2763             {
2764                 cbuf[j] = grps->nr;
2765                 bRest   = TRUE;
2766             }
2767         }
2768         if (grptp != egrptpPART)
2769         {
2770             if (bVerbose)
2771             {
2772                 fprintf(stderr,
2773                         "Making dummy/rest group for %s containing %d elements\n",
2774                         title, natoms-ntot);
2775             }
2776             /* Add group name "rest" */
2777             grps->nm_ind[grps->nr] = restnm;
2778
2779             /* Assign the rest name to all atoms not currently assigned to a group */
2780             for (j = 0; (j < natoms); j++)
2781             {
2782                 if (cbuf[j] == NOGID)
2783                 {
2784                     cbuf[j] = grps->nr;
2785                 }
2786             }
2787             grps->nr++;
2788         }
2789     }
2790
2791     if (grps->nr == 1 && (ntot == 0 || ntot == natoms))
2792     {
2793         /* All atoms are part of one (or no) group, no index required */
2794         groups->ngrpnr[gtype] = 0;
2795         groups->grpnr[gtype]  = nullptr;
2796     }
2797     else
2798     {
2799         groups->ngrpnr[gtype] = natoms;
2800         snew(groups->grpnr[gtype], natoms);
2801         for (j = 0; (j < natoms); j++)
2802         {
2803             groups->grpnr[gtype][j] = cbuf[j];
2804         }
2805     }
2806
2807     sfree(cbuf);
2808
2809     return (bRest && grptp == egrptpPART);
2810 }
2811
2812 static void calc_nrdf(gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
2813 {
2814     t_grpopts              *opts;
2815     gmx_groups_t           *groups;
2816     pull_params_t          *pull;
2817     int                     natoms, ai, aj, i, j, d, g, imin, jmin;
2818     t_iatom                *ia;
2819     int                    *nrdf2, *na_vcm, na_tot;
2820     double                 *nrdf_tc, *nrdf_vcm, nrdf_uc, *nrdf_vcm_sub;
2821     ivec                   *dof_vcm;
2822     gmx_mtop_atomloop_all_t aloop;
2823     int                     mb, mol, ftype, as;
2824     gmx_molblock_t         *molb;
2825     gmx_moltype_t          *molt;
2826
2827     /* Calculate nrdf.
2828      * First calc 3xnr-atoms for each group
2829      * then subtract half a degree of freedom for each constraint
2830      *
2831      * Only atoms and nuclei contribute to the degrees of freedom...
2832      */
2833
2834     opts = &ir->opts;
2835
2836     groups = &mtop->groups;
2837     natoms = mtop->natoms;
2838
2839     /* Allocate one more for a possible rest group */
2840     /* We need to sum degrees of freedom into doubles,
2841      * since floats give too low nrdf's above 3 million atoms.
2842      */
2843     snew(nrdf_tc, groups->grps[egcTC].nr+1);
2844     snew(nrdf_vcm, groups->grps[egcVCM].nr+1);
2845     snew(dof_vcm, groups->grps[egcVCM].nr+1);
2846     snew(na_vcm, groups->grps[egcVCM].nr+1);
2847     snew(nrdf_vcm_sub, groups->grps[egcVCM].nr+1);
2848
2849     for (i = 0; i < groups->grps[egcTC].nr; i++)
2850     {
2851         nrdf_tc[i] = 0;
2852     }
2853     for (i = 0; i < groups->grps[egcVCM].nr+1; i++)
2854     {
2855         nrdf_vcm[i]     = 0;
2856         clear_ivec(dof_vcm[i]);
2857         na_vcm[i]       = 0;
2858         nrdf_vcm_sub[i] = 0;
2859     }
2860
2861     snew(nrdf2, natoms);
2862     aloop = gmx_mtop_atomloop_all_init(mtop);
2863     const t_atom *atom;
2864     while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
2865     {
2866         nrdf2[i] = 0;
2867         if (atom->ptype == eptAtom || atom->ptype == eptNucleus)
2868         {
2869             g = ggrpnr(groups, egcFREEZE, i);
2870             for (d = 0; d < DIM; d++)
2871             {
2872                 if (opts->nFreeze[g][d] == 0)
2873                 {
2874                     /* Add one DOF for particle i (counted as 2*1) */
2875                     nrdf2[i]                              += 2;
2876                     /* VCM group i has dim d as a DOF */
2877                     dof_vcm[ggrpnr(groups, egcVCM, i)][d]  = 1;
2878                 }
2879             }
2880             nrdf_tc [ggrpnr(groups, egcTC, i)]  += 0.5*nrdf2[i];
2881             nrdf_vcm[ggrpnr(groups, egcVCM, i)] += 0.5*nrdf2[i];
2882         }
2883     }
2884
2885     as = 0;
2886     for (mb = 0; mb < mtop->nmolblock; mb++)
2887     {
2888         molb = &mtop->molblock[mb];
2889         molt = &mtop->moltype[molb->type];
2890         atom = molt->atoms.atom;
2891         for (mol = 0; mol < molb->nmol; mol++)
2892         {
2893             for (ftype = F_CONSTR; ftype <= F_CONSTRNC; ftype++)
2894             {
2895                 ia = molt->ilist[ftype].iatoms;
2896                 for (i = 0; i < molt->ilist[ftype].nr; )
2897                 {
2898                     /* Subtract degrees of freedom for the constraints,
2899                      * if the particles still have degrees of freedom left.
2900                      * If one of the particles is a vsite or a shell, then all
2901                      * constraint motion will go there, but since they do not
2902                      * contribute to the constraints the degrees of freedom do not
2903                      * change.
2904                      */
2905                     ai = as + ia[1];
2906                     aj = as + ia[2];
2907                     if (((atom[ia[1]].ptype == eptNucleus) ||
2908                          (atom[ia[1]].ptype == eptAtom)) &&
2909                         ((atom[ia[2]].ptype == eptNucleus) ||
2910                          (atom[ia[2]].ptype == eptAtom)))
2911                     {
2912                         if (nrdf2[ai] > 0)
2913                         {
2914                             jmin = 1;
2915                         }
2916                         else
2917                         {
2918                             jmin = 2;
2919                         }
2920                         if (nrdf2[aj] > 0)
2921                         {
2922                             imin = 1;
2923                         }
2924                         else
2925                         {
2926                             imin = 2;
2927                         }
2928                         imin       = std::min(imin, nrdf2[ai]);
2929                         jmin       = std::min(jmin, nrdf2[aj]);
2930                         nrdf2[ai] -= imin;
2931                         nrdf2[aj] -= jmin;
2932                         nrdf_tc [ggrpnr(groups, egcTC, ai)]  -= 0.5*imin;
2933                         nrdf_tc [ggrpnr(groups, egcTC, aj)]  -= 0.5*jmin;
2934                         nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2935                         nrdf_vcm[ggrpnr(groups, egcVCM, aj)] -= 0.5*jmin;
2936                     }
2937                     ia += interaction_function[ftype].nratoms+1;
2938                     i  += interaction_function[ftype].nratoms+1;
2939                 }
2940             }
2941             ia = molt->ilist[F_SETTLE].iatoms;
2942             for (i = 0; i < molt->ilist[F_SETTLE].nr; )
2943             {
2944                 /* Subtract 1 dof from every atom in the SETTLE */
2945                 for (j = 0; j < 3; j++)
2946                 {
2947                     ai         = as + ia[1+j];
2948                     imin       = std::min(2, nrdf2[ai]);
2949                     nrdf2[ai] -= imin;
2950                     nrdf_tc [ggrpnr(groups, egcTC, ai)]  -= 0.5*imin;
2951                     nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2952                 }
2953                 ia += 4;
2954                 i  += 4;
2955             }
2956             as += molt->atoms.nr;
2957         }
2958     }
2959
2960     if (ir->bPull)
2961     {
2962         /* Correct nrdf for the COM constraints.
2963          * We correct using the TC and VCM group of the first atom
2964          * in the reference and pull group. If atoms in one pull group
2965          * belong to different TC or VCM groups it is anyhow difficult
2966          * to determine the optimal nrdf assignment.
2967          */
2968         pull = ir->pull;
2969
2970         for (i = 0; i < pull->ncoord; i++)
2971         {
2972             if (pull->coord[i].eType != epullCONSTRAINT)
2973             {
2974                 continue;
2975             }
2976
2977             imin = 1;
2978
2979             for (j = 0; j < 2; j++)
2980             {
2981                 const t_pull_group *pgrp;
2982
2983                 pgrp = &pull->group[pull->coord[i].group[j]];
2984
2985                 if (pgrp->nat > 0)
2986                 {
2987                     /* Subtract 1/2 dof from each group */
2988                     ai = pgrp->ind[0];
2989                     nrdf_tc [ggrpnr(groups, egcTC, ai)]  -= 0.5*imin;
2990                     nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2991                     if (nrdf_tc[ggrpnr(groups, egcTC, ai)] < 0)
2992                     {
2993                         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)]]);
2994                     }
2995                 }
2996                 else
2997                 {
2998                     /* We need to subtract the whole DOF from group j=1 */
2999                     imin += 1;
3000                 }
3001             }
3002         }
3003     }
3004
3005     if (ir->nstcomm != 0)
3006     {
3007         int ndim_rm_vcm;
3008
3009         /* We remove COM motion up to dim ndof_com() */
3010         ndim_rm_vcm = ndof_com(ir);
3011
3012         /* Subtract ndim_rm_vcm (or less with frozen dimensions) from
3013          * the number of degrees of freedom in each vcm group when COM
3014          * translation is removed and 6 when rotation is removed as well.
3015          */
3016         for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3017         {
3018             switch (ir->comm_mode)
3019             {
3020                 case ecmLINEAR:
3021                 case ecmLINEAR_ACCELERATION_CORRECTION:
3022                     nrdf_vcm_sub[j] = 0;
3023                     for (d = 0; d < ndim_rm_vcm; d++)
3024                     {
3025                         if (dof_vcm[j][d])
3026                         {
3027                             nrdf_vcm_sub[j]++;
3028                         }
3029                     }
3030                     break;
3031                 case ecmANGULAR:
3032                     nrdf_vcm_sub[j] = 6;
3033                     break;
3034                 default:
3035                     gmx_incons("Checking comm_mode");
3036             }
3037         }
3038
3039         for (i = 0; i < groups->grps[egcTC].nr; i++)
3040         {
3041             /* Count the number of atoms of TC group i for every VCM group */
3042             for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3043             {
3044                 na_vcm[j] = 0;
3045             }
3046             na_tot = 0;
3047             for (ai = 0; ai < natoms; ai++)
3048             {
3049                 if (ggrpnr(groups, egcTC, ai) == i)
3050                 {
3051                     na_vcm[ggrpnr(groups, egcVCM, ai)]++;
3052                     na_tot++;
3053                 }
3054             }
3055             /* Correct for VCM removal according to the fraction of each VCM
3056              * group present in this TC group.
3057              */
3058             nrdf_uc = nrdf_tc[i];
3059             if (debug)
3060             {
3061                 fprintf(debug, "T-group[%d] nrdf_uc = %g\n", i, nrdf_uc);
3062             }
3063             nrdf_tc[i] = 0;
3064             for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3065             {
3066                 if (nrdf_vcm[j] > nrdf_vcm_sub[j])
3067                 {
3068                     nrdf_tc[i] += nrdf_uc*((double)na_vcm[j]/(double)na_tot)*
3069                         (nrdf_vcm[j] - nrdf_vcm_sub[j])/nrdf_vcm[j];
3070                 }
3071                 if (debug)
3072                 {
3073                     fprintf(debug, "  nrdf_vcm[%d] = %g, nrdf = %g\n",
3074                             j, nrdf_vcm[j], nrdf_tc[i]);
3075                 }
3076             }
3077         }
3078     }
3079     for (i = 0; (i < groups->grps[egcTC].nr); i++)
3080     {
3081         opts->nrdf[i] = nrdf_tc[i];
3082         if (opts->nrdf[i] < 0)
3083         {
3084             opts->nrdf[i] = 0;
3085         }
3086         fprintf(stderr,
3087                 "Number of degrees of freedom in T-Coupling group %s is %.2f\n",
3088                 gnames[groups->grps[egcTC].nm_ind[i]], opts->nrdf[i]);
3089     }
3090
3091     sfree(nrdf2);
3092     sfree(nrdf_tc);
3093     sfree(nrdf_vcm);
3094     sfree(dof_vcm);
3095     sfree(na_vcm);
3096     sfree(nrdf_vcm_sub);
3097 }
3098
3099 static gmx_bool do_egp_flag(t_inputrec *ir, gmx_groups_t *groups,
3100                             const char *option, const char *val, int flag)
3101 {
3102     /* The maximum number of energy group pairs would be MAXPTR*(MAXPTR+1)/2.
3103      * But since this is much larger than STRLEN, such a line can not be parsed.
3104      * The real maximum is the number of names that fit in a string: STRLEN/2.
3105      */
3106 #define EGP_MAX (STRLEN/2)
3107     int      nelem, i, j, k, nr;
3108     char    *names[EGP_MAX];
3109     char  ***gnames;
3110     gmx_bool bSet;
3111
3112     gnames = groups->grpname;
3113
3114     nelem = str_nelem(val, EGP_MAX, names);
3115     if (nelem % 2 != 0)
3116     {
3117         gmx_fatal(FARGS, "The number of groups for %s is odd", option);
3118     }
3119     nr   = groups->grps[egcENER].nr;
3120     bSet = FALSE;
3121     for (i = 0; i < nelem/2; i++)
3122     {
3123         j = 0;
3124         while ((j < nr) &&
3125                gmx_strcasecmp(names[2*i], *(gnames[groups->grps[egcENER].nm_ind[j]])))
3126         {
3127             j++;
3128         }
3129         if (j == nr)
3130         {
3131             gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3132                       names[2*i], option);
3133         }
3134         k = 0;
3135         while ((k < nr) &&
3136                gmx_strcasecmp(names[2*i+1], *(gnames[groups->grps[egcENER].nm_ind[k]])))
3137         {
3138             k++;
3139         }
3140         if (k == nr)
3141         {
3142             gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3143                       names[2*i+1], option);
3144         }
3145         if ((j < nr) && (k < nr))
3146         {
3147             ir->opts.egp_flags[nr*j+k] |= flag;
3148             ir->opts.egp_flags[nr*k+j] |= flag;
3149             bSet = TRUE;
3150         }
3151     }
3152
3153     return bSet;
3154 }
3155
3156
3157 static void make_swap_groups(
3158         t_swapcoords  *swap,
3159         t_blocka      *grps,
3160         char         **gnames)
3161 {
3162     int          ig = -1, i = 0, gind;
3163     t_swapGroup *swapg;
3164
3165
3166     /* Just a quick check here, more thorough checks are in mdrun */
3167     if (strcmp(swap->grp[eGrpSplit0].molname, swap->grp[eGrpSplit1].molname) == 0)
3168     {
3169         gmx_fatal(FARGS, "The split groups can not both be '%s'.", swap->grp[eGrpSplit0].molname);
3170     }
3171
3172     /* Get the index atoms of the split0, split1, solvent, and swap groups */
3173     for (ig = 0; ig < swap->ngrp; ig++)
3174     {
3175         swapg      = &swap->grp[ig];
3176         gind       = search_string(swap->grp[ig].molname, grps->nr, gnames);
3177         swapg->nat = grps->index[gind+1] - grps->index[gind];
3178
3179         if (swapg->nat > 0)
3180         {
3181             fprintf(stderr, "%s group '%s' contains %d atoms.\n",
3182                     ig < 3 ? eSwapFixedGrp_names[ig] : "Swap",
3183                     swap->grp[ig].molname, swapg->nat);
3184             snew(swapg->ind, swapg->nat);
3185             for (i = 0; i < swapg->nat; i++)
3186             {
3187                 swapg->ind[i] = grps->a[grps->index[gind]+i];
3188             }
3189         }
3190         else
3191         {
3192             gmx_fatal(FARGS, "Swap group %s does not contain any atoms.", swap->grp[ig].molname);
3193         }
3194     }
3195 }
3196
3197
3198 static void make_IMD_group(t_IMD *IMDgroup, char *IMDgname, t_blocka *grps, char **gnames)
3199 {
3200     int      ig, i;
3201
3202
3203     ig            = search_string(IMDgname, grps->nr, gnames);
3204     IMDgroup->nat = grps->index[ig+1] - grps->index[ig];
3205
3206     if (IMDgroup->nat > 0)
3207     {
3208         fprintf(stderr, "Group '%s' with %d atoms can be activated for interactive molecular dynamics (IMD).\n",
3209                 IMDgname, IMDgroup->nat);
3210         snew(IMDgroup->ind, IMDgroup->nat);
3211         for (i = 0; i < IMDgroup->nat; i++)
3212         {
3213             IMDgroup->ind[i] = grps->a[grps->index[ig]+i];
3214         }
3215     }
3216 }
3217
3218
3219 void do_index(const char* mdparin, const char *ndx,
3220               gmx_mtop_t *mtop,
3221               gmx_bool bVerbose,
3222               t_inputrec *ir,
3223               warninp_t wi)
3224 {
3225     t_blocka     *grps;
3226     gmx_groups_t *groups;
3227     int           natoms;
3228     t_symtab     *symtab;
3229     t_atoms       atoms_all;
3230     char          warnbuf[STRLEN], **gnames;
3231     int           nr, ntcg, ntau_t, nref_t, nacc, nofg, nSA, nSA_points, nSA_time, nSA_temp;
3232     real          tau_min;
3233     int           nstcmin;
3234     int           nacg, nfreeze, nfrdim, nenergy, nvcm, nuser;
3235     char         *ptr1[MAXPTR], *ptr2[MAXPTR], *ptr3[MAXPTR];
3236     int           i, j, k, restnm;
3237     gmx_bool      bExcl, bTable, bSetTCpar, bAnneal, bRest;
3238     int           nQMmethod, nQMbasis, nQMg;
3239     char          warn_buf[STRLEN];
3240     char*         endptr;
3241
3242     if (bVerbose)
3243     {
3244         fprintf(stderr, "processing index file...\n");
3245     }
3246     if (ndx == nullptr)
3247     {
3248         snew(grps, 1);
3249         snew(grps->index, 1);
3250         snew(gnames, 1);
3251         atoms_all = gmx_mtop_global_atoms(mtop);
3252         analyse(&atoms_all, grps, &gnames, FALSE, TRUE);
3253         done_atom(&atoms_all);
3254     }
3255     else
3256     {
3257         grps = init_index(ndx, &gnames);
3258     }
3259
3260     groups = &mtop->groups;
3261     natoms = mtop->natoms;
3262     symtab = &mtop->symtab;
3263
3264     snew(groups->grpname, grps->nr+1);
3265
3266     for (i = 0; (i < grps->nr); i++)
3267     {
3268         groups->grpname[i] = put_symtab(symtab, gnames[i]);
3269     }
3270     groups->grpname[i] = put_symtab(symtab, "rest");
3271     restnm             = i;
3272     srenew(gnames, grps->nr+1);
3273     gnames[restnm]   = *(groups->grpname[i]);
3274     groups->ngrpname = grps->nr+1;
3275
3276     set_warning_line(wi, mdparin, -1);
3277
3278     ntau_t = str_nelem(is->tau_t, MAXPTR, ptr1);
3279     nref_t = str_nelem(is->ref_t, MAXPTR, ptr2);
3280     ntcg   = str_nelem(is->tcgrps, MAXPTR, ptr3);
3281     if ((ntau_t != ntcg) || (nref_t != ntcg))
3282     {
3283         gmx_fatal(FARGS, "Invalid T coupling input: %d groups, %d ref-t values and "
3284                   "%d tau-t values", ntcg, nref_t, ntau_t);
3285     }
3286
3287     bSetTCpar = (ir->etc || EI_SD(ir->eI) || ir->eI == eiBD || EI_TPI(ir->eI));
3288     do_numbering(natoms, groups, ntcg, ptr3, grps, gnames, egcTC,
3289                  restnm, bSetTCpar ? egrptpALL : egrptpALL_GENREST, bVerbose, wi);
3290     nr            = groups->grps[egcTC].nr;
3291     ir->opts.ngtc = nr;
3292     snew(ir->opts.nrdf, nr);
3293     snew(ir->opts.tau_t, nr);
3294     snew(ir->opts.ref_t, nr);
3295     if (ir->eI == eiBD && ir->bd_fric == 0)
3296     {
3297         fprintf(stderr, "bd-fric=0, so tau-t will be used as the inverse friction constant(s)\n");
3298     }
3299
3300     if (bSetTCpar)
3301     {
3302         if (nr != nref_t)
3303         {
3304             gmx_fatal(FARGS, "Not enough ref-t and tau-t values!");
3305         }
3306
3307         tau_min = 1e20;
3308         for (i = 0; (i < nr); i++)
3309         {
3310             ir->opts.tau_t[i] = strtod(ptr1[i], &endptr);
3311             if (*endptr != 0)
3312             {
3313                 warning_error(wi, "Invalid value for mdp option tau-t. tau-t should only consist of real numbers separated by spaces.");
3314             }
3315             if ((ir->eI == eiBD) && ir->opts.tau_t[i] <= 0)
3316             {
3317                 sprintf(warn_buf, "With integrator %s tau-t should be larger than 0", ei_names[ir->eI]);
3318                 warning_error(wi, warn_buf);
3319             }
3320
3321             if (ir->etc != etcVRESCALE && ir->opts.tau_t[i] == 0)
3322             {
3323                 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.");
3324             }
3325
3326             if (ir->opts.tau_t[i] >= 0)
3327             {
3328                 tau_min = std::min(tau_min, ir->opts.tau_t[i]);
3329             }
3330         }
3331         if (ir->etc != etcNO && ir->nsttcouple == -1)
3332         {
3333             ir->nsttcouple = ir_optimal_nsttcouple(ir);
3334         }
3335
3336         if (EI_VV(ir->eI))
3337         {
3338             if ((ir->etc == etcNOSEHOOVER) && (ir->epc == epcBERENDSEN))
3339             {
3340                 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");
3341             }
3342             if (ir->epc == epcMTTK)
3343             {
3344                 if (ir->etc != etcNOSEHOOVER)
3345                 {
3346                     gmx_fatal(FARGS, "Cannot do MTTK pressure coupling without Nose-Hoover temperature control");
3347                 }
3348                 else
3349                 {
3350                     if (ir->nstpcouple != ir->nsttcouple)
3351                     {
3352                         int mincouple = std::min(ir->nstpcouple, ir->nsttcouple);
3353                         ir->nstpcouple = ir->nsttcouple = mincouple;
3354                         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);
3355                         warning_note(wi, warn_buf);
3356                     }
3357                 }
3358             }
3359         }
3360         /* velocity verlet with averaged kinetic energy KE = 0.5*(v(t+1/2) - v(t-1/2)) is implemented
3361            primarily for testing purposes, and does not work with temperature coupling other than 1 */
3362
3363         if (ETC_ANDERSEN(ir->etc))
3364         {
3365             if (ir->nsttcouple != 1)
3366             {
3367                 ir->nsttcouple = 1;
3368                 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");
3369                 warning_note(wi, warn_buf);
3370             }
3371         }
3372         nstcmin = tcouple_min_integration_steps(ir->etc);
3373         if (nstcmin > 1)
3374         {
3375             if (tau_min/(ir->delta_t*ir->nsttcouple) < nstcmin - 10*GMX_REAL_EPS)
3376             {
3377                 sprintf(warn_buf, "For proper integration of the %s thermostat, tau-t (%g) should be at least %d times larger than nsttcouple*dt (%g)",
3378                         ETCOUPLTYPE(ir->etc),
3379                         tau_min, nstcmin,
3380                         ir->nsttcouple*ir->delta_t);
3381                 warning(wi, warn_buf);
3382             }
3383         }
3384         for (i = 0; (i < nr); i++)
3385         {
3386             ir->opts.ref_t[i] = strtod(ptr2[i], &endptr);
3387             if (*endptr != 0)
3388             {
3389                 warning_error(wi, "Invalid value for mdp option ref-t. ref-t should only consist of real numbers separated by spaces.");
3390             }
3391             if (ir->opts.ref_t[i] < 0)
3392             {
3393                 gmx_fatal(FARGS, "ref-t for group %d negative", i);
3394             }
3395         }
3396         /* set the lambda mc temperature to the md integrator temperature (which should be defined
3397            if we are in this conditional) if mc_temp is negative */
3398         if (ir->expandedvals->mc_temp < 0)
3399         {
3400             ir->expandedvals->mc_temp = ir->opts.ref_t[0]; /*for now, set to the first reft */
3401         }
3402     }
3403
3404     /* Simulated annealing for each group. There are nr groups */
3405     nSA = str_nelem(is->anneal, MAXPTR, ptr1);
3406     if (nSA == 1 && (ptr1[0][0] == 'n' || ptr1[0][0] == 'N'))
3407     {
3408         nSA = 0;
3409     }
3410     if (nSA > 0 && nSA != nr)
3411     {
3412         gmx_fatal(FARGS, "Not enough annealing values: %d (for %d groups)\n", nSA, nr);
3413     }
3414     else
3415     {
3416         snew(ir->opts.annealing, nr);
3417         snew(ir->opts.anneal_npoints, nr);
3418         snew(ir->opts.anneal_time, nr);
3419         snew(ir->opts.anneal_temp, nr);
3420         for (i = 0; i < nr; i++)
3421         {
3422             ir->opts.annealing[i]      = eannNO;
3423             ir->opts.anneal_npoints[i] = 0;
3424             ir->opts.anneal_time[i]    = nullptr;
3425             ir->opts.anneal_temp[i]    = nullptr;
3426         }
3427         if (nSA > 0)
3428         {
3429             bAnneal = FALSE;
3430             for (i = 0; i < nr; i++)
3431             {
3432                 if (ptr1[i][0] == 'n' || ptr1[i][0] == 'N')
3433                 {
3434                     ir->opts.annealing[i] = eannNO;
3435                 }
3436                 else if (ptr1[i][0] == 's' || ptr1[i][0] == 'S')
3437                 {
3438                     ir->opts.annealing[i] = eannSINGLE;
3439                     bAnneal               = TRUE;
3440                 }
3441                 else if (ptr1[i][0] == 'p' || ptr1[i][0] == 'P')
3442                 {
3443                     ir->opts.annealing[i] = eannPERIODIC;
3444                     bAnneal               = TRUE;
3445                 }
3446             }
3447             if (bAnneal)
3448             {
3449                 /* Read the other fields too */
3450                 nSA_points = str_nelem(is->anneal_npoints, MAXPTR, ptr1);
3451                 if (nSA_points != nSA)
3452                 {
3453                     gmx_fatal(FARGS, "Found %d annealing-npoints values for %d groups\n", nSA_points, nSA);
3454                 }
3455                 for (k = 0, i = 0; i < nr; i++)
3456                 {
3457                     ir->opts.anneal_npoints[i] = strtol(ptr1[i], &endptr, 10);
3458                     if (*endptr != 0)
3459                     {
3460                         warning_error(wi, "Invalid value for mdp option annealing-npoints. annealing should only consist of integers separated by spaces.");
3461                     }
3462                     if (ir->opts.anneal_npoints[i] == 1)
3463                     {
3464                         gmx_fatal(FARGS, "Please specify at least a start and an end point for annealing\n");
3465                     }
3466                     snew(ir->opts.anneal_time[i], ir->opts.anneal_npoints[i]);
3467                     snew(ir->opts.anneal_temp[i], ir->opts.anneal_npoints[i]);
3468                     k += ir->opts.anneal_npoints[i];
3469                 }
3470
3471                 nSA_time = str_nelem(is->anneal_time, MAXPTR, ptr1);
3472                 if (nSA_time != k)
3473                 {
3474                     gmx_fatal(FARGS, "Found %d annealing-time values, wanted %d\n", nSA_time, k);
3475                 }
3476                 nSA_temp = str_nelem(is->anneal_temp, MAXPTR, ptr2);
3477                 if (nSA_temp != k)
3478                 {
3479                     gmx_fatal(FARGS, "Found %d annealing-temp values, wanted %d\n", nSA_temp, k);
3480                 }
3481
3482                 for (i = 0, k = 0; i < nr; i++)
3483                 {
3484
3485                     for (j = 0; j < ir->opts.anneal_npoints[i]; j++)
3486                     {
3487                         ir->opts.anneal_time[i][j] = strtod(ptr1[k], &endptr);
3488                         if (*endptr != 0)
3489                         {
3490                             warning_error(wi, "Invalid value for mdp option anneal-time. anneal-time should only consist of real numbers separated by spaces.");
3491                         }
3492                         ir->opts.anneal_temp[i][j] = strtod(ptr2[k], &endptr);
3493                         if (*endptr != 0)
3494                         {
3495                             warning_error(wi, "Invalid value for anneal-temp. anneal-temp should only consist of real numbers separated by spaces.");
3496                         }
3497                         if (j == 0)
3498                         {
3499                             if (ir->opts.anneal_time[i][0] > (ir->init_t+GMX_REAL_EPS))
3500                             {
3501                                 gmx_fatal(FARGS, "First time point for annealing > init_t.\n");
3502                             }
3503                         }
3504                         else
3505                         {
3506                             /* j>0 */
3507                             if (ir->opts.anneal_time[i][j] < ir->opts.anneal_time[i][j-1])
3508                             {
3509                                 gmx_fatal(FARGS, "Annealing timepoints out of order: t=%f comes after t=%f\n",
3510                                           ir->opts.anneal_time[i][j], ir->opts.anneal_time[i][j-1]);
3511                             }
3512                         }
3513                         if (ir->opts.anneal_temp[i][j] < 0)
3514                         {
3515                             gmx_fatal(FARGS, "Found negative temperature in annealing: %f\n", ir->opts.anneal_temp[i][j]);
3516                         }
3517                         k++;
3518                     }
3519                 }
3520                 /* Print out some summary information, to make sure we got it right */
3521                 for (i = 0, k = 0; i < nr; i++)
3522                 {
3523                     if (ir->opts.annealing[i] != eannNO)
3524                     {
3525                         j = groups->grps[egcTC].nm_ind[i];
3526                         fprintf(stderr, "Simulated annealing for group %s: %s, %d timepoints\n",
3527                                 *(groups->grpname[j]), eann_names[ir->opts.annealing[i]],
3528                                 ir->opts.anneal_npoints[i]);
3529                         fprintf(stderr, "Time (ps)   Temperature (K)\n");
3530                         /* All terms except the last one */
3531                         for (j = 0; j < (ir->opts.anneal_npoints[i]-1); j++)
3532                         {
3533                             fprintf(stderr, "%9.1f      %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3534                         }
3535
3536                         /* Finally the last one */
3537                         j = ir->opts.anneal_npoints[i]-1;
3538                         if (ir->opts.annealing[i] == eannSINGLE)
3539                         {
3540                             fprintf(stderr, "%9.1f-     %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3541                         }
3542                         else
3543                         {
3544                             fprintf(stderr, "%9.1f      %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3545                             if (fabs(ir->opts.anneal_temp[i][j]-ir->opts.anneal_temp[i][0]) > GMX_REAL_EPS)
3546                             {
3547                                 warning_note(wi, "There is a temperature jump when your annealing loops back.\n");
3548                             }
3549                         }
3550                     }
3551                 }
3552             }
3553         }
3554     }
3555
3556     if (ir->bPull)
3557     {
3558         make_pull_groups(ir->pull, is->pull_grp, grps, gnames);
3559
3560         make_pull_coords(ir->pull);
3561     }
3562
3563     if (ir->bRot)
3564     {
3565         make_rotation_groups(ir->rot, is->rot_grp, grps, gnames);
3566     }
3567
3568     if (ir->eSwapCoords != eswapNO)
3569     {
3570         make_swap_groups(ir->swap, grps, gnames);
3571     }
3572
3573     /* Make indices for IMD session */
3574     if (ir->bIMD)
3575     {
3576         make_IMD_group(ir->imd, is->imd_grp, grps, gnames);
3577     }
3578
3579     nacc = str_nelem(is->acc, MAXPTR, ptr1);
3580     nacg = str_nelem(is->accgrps, MAXPTR, ptr2);
3581     if (nacg*DIM != nacc)
3582     {
3583         gmx_fatal(FARGS, "Invalid Acceleration input: %d groups and %d acc. values",
3584                   nacg, nacc);
3585     }
3586     do_numbering(natoms, groups, nacg, ptr2, grps, gnames, egcACC,
3587                  restnm, egrptpALL_GENREST, bVerbose, wi);
3588     nr = groups->grps[egcACC].nr;
3589     snew(ir->opts.acc, nr);
3590     ir->opts.ngacc = nr;
3591
3592     for (i = k = 0; (i < nacg); i++)
3593     {
3594         for (j = 0; (j < DIM); j++, k++)
3595         {
3596             ir->opts.acc[i][j] = strtod(ptr1[k], &endptr);
3597             if (*endptr != 0)
3598             {
3599                 warning_error(wi, "Invalid value for mdp option accelerate. accelerate should only consist of real numbers separated by spaces.");
3600             }
3601         }
3602     }
3603     for (; (i < nr); i++)
3604     {
3605         for (j = 0; (j < DIM); j++)
3606         {
3607             ir->opts.acc[i][j] = 0;
3608         }
3609     }
3610
3611     nfrdim  = str_nelem(is->frdim, MAXPTR, ptr1);
3612     nfreeze = str_nelem(is->freeze, MAXPTR, ptr2);
3613     if (nfrdim != DIM*nfreeze)
3614     {
3615         gmx_fatal(FARGS, "Invalid Freezing input: %d groups and %d freeze values",
3616                   nfreeze, nfrdim);
3617     }
3618     do_numbering(natoms, groups, nfreeze, ptr2, grps, gnames, egcFREEZE,
3619                  restnm, egrptpALL_GENREST, bVerbose, wi);
3620     nr             = groups->grps[egcFREEZE].nr;
3621     ir->opts.ngfrz = nr;
3622     snew(ir->opts.nFreeze, nr);
3623     for (i = k = 0; (i < nfreeze); i++)
3624     {
3625         for (j = 0; (j < DIM); j++, k++)
3626         {
3627             ir->opts.nFreeze[i][j] = (gmx_strncasecmp(ptr1[k], "Y", 1) == 0);
3628             if (!ir->opts.nFreeze[i][j])
3629             {
3630                 if (gmx_strncasecmp(ptr1[k], "N", 1) != 0)
3631                 {
3632                     sprintf(warnbuf, "Please use Y(ES) or N(O) for freezedim only "
3633                             "(not %s)", ptr1[k]);
3634                     warning(wi, warn_buf);
3635                 }
3636             }
3637         }
3638     }
3639     for (; (i < nr); i++)
3640     {
3641         for (j = 0; (j < DIM); j++)
3642         {
3643             ir->opts.nFreeze[i][j] = 0;
3644         }
3645     }
3646
3647     nenergy = str_nelem(is->energy, MAXPTR, ptr1);
3648     do_numbering(natoms, groups, nenergy, ptr1, grps, gnames, egcENER,
3649                  restnm, egrptpALL_GENREST, bVerbose, wi);
3650     add_wall_energrps(groups, ir->nwall, symtab);
3651     ir->opts.ngener = groups->grps[egcENER].nr;
3652     nvcm            = str_nelem(is->vcm, MAXPTR, ptr1);
3653     bRest           =
3654         do_numbering(natoms, groups, nvcm, ptr1, grps, gnames, egcVCM,
3655                      restnm, nvcm == 0 ? egrptpALL_GENREST : egrptpPART, bVerbose, wi);
3656     if (bRest)
3657     {
3658         warning(wi, "Some atoms are not part of any center of mass motion removal group.\n"
3659                 "This may lead to artifacts.\n"
3660                 "In most cases one should use one group for the whole system.");
3661     }
3662
3663     /* Now we have filled the freeze struct, so we can calculate NRDF */
3664     calc_nrdf(mtop, ir, gnames);
3665
3666     nuser = str_nelem(is->user1, MAXPTR, ptr1);
3667     do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser1,
3668                  restnm, egrptpALL_GENREST, bVerbose, wi);
3669     nuser = str_nelem(is->user2, MAXPTR, ptr1);
3670     do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser2,
3671                  restnm, egrptpALL_GENREST, bVerbose, wi);
3672     nuser = str_nelem(is->x_compressed_groups, MAXPTR, ptr1);
3673     do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcCompressedX,
3674                  restnm, egrptpONE, bVerbose, wi);
3675     nofg = str_nelem(is->orirefitgrp, MAXPTR, ptr1);
3676     do_numbering(natoms, groups, nofg, ptr1, grps, gnames, egcORFIT,
3677                  restnm, egrptpALL_GENREST, bVerbose, wi);
3678
3679     /* QMMM input processing */
3680     nQMg          = str_nelem(is->QMMM, MAXPTR, ptr1);
3681     nQMmethod     = str_nelem(is->QMmethod, MAXPTR, ptr2);
3682     nQMbasis      = str_nelem(is->QMbasis, MAXPTR, ptr3);
3683     if ((nQMmethod != nQMg) || (nQMbasis != nQMg))
3684     {
3685         gmx_fatal(FARGS, "Invalid QMMM input: %d groups %d basissets"
3686                   " and %d methods\n", nQMg, nQMbasis, nQMmethod);
3687     }
3688     /* group rest, if any, is always MM! */
3689     do_numbering(natoms, groups, nQMg, ptr1, grps, gnames, egcQMMM,
3690                  restnm, egrptpALL_GENREST, bVerbose, wi);
3691     nr            = nQMg; /*atoms->grps[egcQMMM].nr;*/
3692     ir->opts.ngQM = nQMg;
3693     snew(ir->opts.QMmethod, nr);
3694     snew(ir->opts.QMbasis, nr);
3695     for (i = 0; i < nr; i++)
3696     {
3697         /* input consists of strings: RHF CASSCF PM3 .. These need to be
3698          * converted to the corresponding enum in names.c
3699          */
3700         ir->opts.QMmethod[i] = search_QMstring(ptr2[i], eQMmethodNR,
3701                                                eQMmethod_names);
3702         ir->opts.QMbasis[i]  = search_QMstring(ptr3[i], eQMbasisNR,
3703                                                eQMbasis_names);
3704
3705     }
3706     str_nelem(is->QMmult, MAXPTR, ptr1);
3707     str_nelem(is->QMcharge, MAXPTR, ptr2);
3708     str_nelem(is->bSH, MAXPTR, ptr3);
3709     snew(ir->opts.QMmult, nr);
3710     snew(ir->opts.QMcharge, nr);
3711     snew(ir->opts.bSH, nr);
3712
3713     for (i = 0; i < nr; i++)
3714     {
3715         ir->opts.QMmult[i]   = strtol(ptr1[i], &endptr, 10);
3716         if (*endptr != 0)
3717         {
3718             warning_error(wi, "Invalid value for mdp option QMmult. QMmult should only consist of integers separated by spaces.");
3719         }
3720         ir->opts.QMcharge[i] = strtol(ptr2[i], &endptr, 10);
3721         if (*endptr != 0)
3722         {
3723             warning_error(wi, "Invalid value for mdp option QMcharge. QMcharge should only consist of integers separated by spaces.");
3724         }
3725         ir->opts.bSH[i]      = (gmx_strncasecmp(ptr3[i], "Y", 1) == 0);
3726     }
3727
3728     str_nelem(is->CASelectrons, MAXPTR, ptr1);
3729     str_nelem(is->CASorbitals, MAXPTR, ptr2);
3730     snew(ir->opts.CASelectrons, nr);
3731     snew(ir->opts.CASorbitals, nr);
3732     for (i = 0; i < nr; i++)
3733     {
3734         ir->opts.CASelectrons[i] = strtol(ptr1[i], &endptr, 10);
3735         if (*endptr != 0)
3736         {
3737             warning_error(wi, "Invalid value for mdp option CASelectrons. CASelectrons should only consist of integers separated by spaces.");
3738         }
3739         ir->opts.CASorbitals[i]  = strtol(ptr2[i], &endptr, 10);
3740         if (*endptr != 0)
3741         {
3742             warning_error(wi, "Invalid value for mdp option CASorbitals. CASorbitals should only consist of integers separated by spaces.");
3743         }
3744     }
3745
3746     str_nelem(is->SAon, MAXPTR, ptr1);
3747     str_nelem(is->SAoff, MAXPTR, ptr2);
3748     str_nelem(is->SAsteps, MAXPTR, ptr3);
3749     snew(ir->opts.SAon, nr);
3750     snew(ir->opts.SAoff, nr);
3751     snew(ir->opts.SAsteps, nr);
3752
3753     for (i = 0; i < nr; i++)
3754     {
3755         ir->opts.SAon[i]    = strtod(ptr1[i], &endptr);
3756         if (*endptr != 0)
3757         {
3758             warning_error(wi, "Invalid value for mdp option SAon. SAon should only consist of real numbers separated by spaces.");
3759         }
3760         ir->opts.SAoff[i]   = strtod(ptr2[i], &endptr);
3761         if (*endptr != 0)
3762         {
3763             warning_error(wi, "Invalid value for mdp option SAoff. SAoff should only consist of real numbers separated by spaces.");
3764         }
3765         ir->opts.SAsteps[i] = strtol(ptr3[i], &endptr, 10);
3766         if (*endptr != 0)
3767         {
3768             warning_error(wi, "Invalid value for mdp option SAsteps. SAsteps should only consist of integers separated by spaces.");
3769         }
3770     }
3771     /* end of QMMM input */
3772
3773     if (bVerbose)
3774     {
3775         for (i = 0; (i < egcNR); i++)
3776         {
3777             fprintf(stderr, "%-16s has %d element(s):", gtypes[i], groups->grps[i].nr);
3778             for (j = 0; (j < groups->grps[i].nr); j++)
3779             {
3780                 fprintf(stderr, " %s", *(groups->grpname[groups->grps[i].nm_ind[j]]));
3781             }
3782             fprintf(stderr, "\n");
3783         }
3784     }
3785
3786     nr = groups->grps[egcENER].nr;
3787     snew(ir->opts.egp_flags, nr*nr);
3788
3789     bExcl = do_egp_flag(ir, groups, "energygrp-excl", is->egpexcl, EGP_EXCL);
3790     if (bExcl && ir->cutoff_scheme == ecutsVERLET)
3791     {
3792         warning_error(wi, "Energy group exclusions are not (yet) implemented for the Verlet scheme");
3793     }
3794     if (bExcl && EEL_FULL(ir->coulombtype))
3795     {
3796         warning(wi, "Can not exclude the lattice Coulomb energy between energy groups");
3797     }
3798
3799     bTable = do_egp_flag(ir, groups, "energygrp-table", is->egptable, EGP_TABLE);
3800     if (bTable && !(ir->vdwtype == evdwUSER) &&
3801         !(ir->coulombtype == eelUSER) && !(ir->coulombtype == eelPMEUSER) &&
3802         !(ir->coulombtype == eelPMEUSERSWITCH))
3803     {
3804         gmx_fatal(FARGS, "Can only have energy group pair tables in combination with user tables for VdW and/or Coulomb");
3805     }
3806
3807     for (i = 0; (i < grps->nr); i++)
3808     {
3809         sfree(gnames[i]);
3810     }
3811     sfree(gnames);
3812     done_blocka(grps);
3813     sfree(grps);
3814
3815 }
3816
3817
3818
3819 static void check_disre(gmx_mtop_t *mtop)
3820 {
3821     gmx_ffparams_t *ffparams;
3822     t_functype     *functype;
3823     t_iparams      *ip;
3824     int             i, ndouble, ftype;
3825     int             label, old_label;
3826
3827     if (gmx_mtop_ftype_count(mtop, F_DISRES) > 0)
3828     {
3829         ffparams  = &mtop->ffparams;
3830         functype  = ffparams->functype;
3831         ip        = ffparams->iparams;
3832         ndouble   = 0;
3833         old_label = -1;
3834         for (i = 0; i < ffparams->ntypes; i++)
3835         {
3836             ftype = functype[i];
3837             if (ftype == F_DISRES)
3838             {
3839                 label = ip[i].disres.label;
3840                 if (label == old_label)
3841                 {
3842                     fprintf(stderr, "Distance restraint index %d occurs twice\n", label);
3843                     ndouble++;
3844                 }
3845                 old_label = label;
3846             }
3847         }
3848         if (ndouble > 0)
3849         {
3850             gmx_fatal(FARGS, "Found %d double distance restraint indices,\n"
3851                       "probably the parameters for multiple pairs in one restraint "
3852                       "are not identical\n", ndouble);
3853         }
3854     }
3855 }
3856
3857 static gmx_bool absolute_reference(t_inputrec *ir, gmx_mtop_t *sys,
3858                                    gmx_bool posres_only,
3859                                    ivec AbsRef)
3860 {
3861     int                  d, g, i;
3862     gmx_mtop_ilistloop_t iloop;
3863     t_ilist             *ilist;
3864     int                  nmol;
3865     t_iparams           *pr;
3866
3867     clear_ivec(AbsRef);
3868
3869     if (!posres_only)
3870     {
3871         /* Check the COM */
3872         for (d = 0; d < DIM; d++)
3873         {
3874             AbsRef[d] = (d < ndof_com(ir) ? 0 : 1);
3875         }
3876         /* Check for freeze groups */
3877         for (g = 0; g < ir->opts.ngfrz; g++)
3878         {
3879             for (d = 0; d < DIM; d++)
3880             {
3881                 if (ir->opts.nFreeze[g][d] != 0)
3882                 {
3883                     AbsRef[d] = 1;
3884                 }
3885             }
3886         }
3887     }
3888
3889     /* Check for position restraints */
3890     iloop = gmx_mtop_ilistloop_init(sys);
3891     while (gmx_mtop_ilistloop_next(iloop, &ilist, &nmol))
3892     {
3893         if (nmol > 0 &&
3894             (AbsRef[XX] == 0 || AbsRef[YY] == 0 || AbsRef[ZZ] == 0))
3895         {
3896             for (i = 0; i < ilist[F_POSRES].nr; i += 2)
3897             {
3898                 pr = &sys->ffparams.iparams[ilist[F_POSRES].iatoms[i]];
3899                 for (d = 0; d < DIM; d++)
3900                 {
3901                     if (pr->posres.fcA[d] != 0)
3902                     {
3903                         AbsRef[d] = 1;
3904                     }
3905                 }
3906             }
3907             for (i = 0; i < ilist[F_FBPOSRES].nr; i += 2)
3908             {
3909                 /* Check for flat-bottom posres */
3910                 pr = &sys->ffparams.iparams[ilist[F_FBPOSRES].iatoms[i]];
3911                 if (pr->fbposres.k != 0)
3912                 {
3913                     switch (pr->fbposres.geom)
3914                     {
3915                         case efbposresSPHERE:
3916                             AbsRef[XX] = AbsRef[YY] = AbsRef[ZZ] = 1;
3917                             break;
3918                         case efbposresCYLINDERX:
3919                             AbsRef[YY] = AbsRef[ZZ] = 1;
3920                             break;
3921                         case efbposresCYLINDERY:
3922                             AbsRef[XX] = AbsRef[ZZ] = 1;
3923                             break;
3924                         case efbposresCYLINDER:
3925                         /* efbposres is a synonym for efbposresCYLINDERZ for backwards compatibility */
3926                         case efbposresCYLINDERZ:
3927                             AbsRef[XX] = AbsRef[YY] = 1;
3928                             break;
3929                         case efbposresX: /* d=XX */
3930                         case efbposresY: /* d=YY */
3931                         case efbposresZ: /* d=ZZ */
3932                             d         = pr->fbposres.geom - efbposresX;
3933                             AbsRef[d] = 1;
3934                             break;
3935                         default:
3936                             gmx_fatal(FARGS, " Invalid geometry for flat-bottom position restraint.\n"
3937                                       "Expected nr between 1 and %d. Found %d\n", efbposresNR-1,
3938                                       pr->fbposres.geom);
3939                     }
3940                 }
3941             }
3942         }
3943     }
3944
3945     return (AbsRef[XX] != 0 && AbsRef[YY] != 0 && AbsRef[ZZ] != 0);
3946 }
3947
3948 static void
3949 check_combination_rule_differences(const gmx_mtop_t *mtop, int state,
3950                                    gmx_bool *bC6ParametersWorkWithGeometricRules,
3951                                    gmx_bool *bC6ParametersWorkWithLBRules,
3952                                    gmx_bool *bLBRulesPossible)
3953 {
3954     int           ntypes, tpi, tpj;
3955     int          *typecount;
3956     real          tol;
3957     double        c6i, c6j, c12i, c12j;
3958     double        c6, c6_geometric, c6_LB;
3959     double        sigmai, sigmaj, epsi, epsj;
3960     gmx_bool      bCanDoLBRules, bCanDoGeometricRules;
3961     const char   *ptr;
3962
3963     /* A tolerance of 1e-5 seems reasonable for (possibly hand-typed)
3964      * force-field floating point parameters.
3965      */
3966     tol = 1e-5;
3967     ptr = getenv("GMX_LJCOMB_TOL");
3968     if (ptr != nullptr)
3969     {
3970         double            dbl;
3971         double gmx_unused canary;
3972
3973         if (sscanf(ptr, "%lf%lf", &dbl, &canary) != 1)
3974         {
3975             gmx_fatal(FARGS, "Could not parse a single floating-point number from GMX_LJCOMB_TOL (%s)", ptr);
3976         }
3977         tol = dbl;
3978     }
3979
3980     *bC6ParametersWorkWithLBRules         = TRUE;
3981     *bC6ParametersWorkWithGeometricRules  = TRUE;
3982     bCanDoLBRules                         = TRUE;
3983     ntypes                                = mtop->ffparams.atnr;
3984     snew(typecount, ntypes);
3985     gmx_mtop_count_atomtypes(mtop, state, typecount);
3986     *bLBRulesPossible       = TRUE;
3987     for (tpi = 0; tpi < ntypes; ++tpi)
3988     {
3989         c6i  = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c6;
3990         c12i = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c12;
3991         for (tpj = tpi; tpj < ntypes; ++tpj)
3992         {
3993             c6j          = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c6;
3994             c12j         = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c12;
3995             c6           = mtop->ffparams.iparams[ntypes * tpi + tpj].lj.c6;
3996             c6_geometric = std::sqrt(c6i * c6j);
3997             if (!gmx_numzero(c6_geometric))
3998             {
3999                 if (!gmx_numzero(c12i) && !gmx_numzero(c12j))
4000                 {
4001                     sigmai   = gmx::sixthroot(c12i / c6i);
4002                     sigmaj   = gmx::sixthroot(c12j / c6j);
4003                     epsi     = c6i * c6i /(4.0 * c12i);
4004                     epsj     = c6j * c6j /(4.0 * c12j);
4005                     c6_LB    = 4.0 * std::sqrt(epsi * epsj) * gmx::power6(0.5 * (sigmai + sigmaj));
4006                 }
4007                 else
4008                 {
4009                     *bLBRulesPossible = FALSE;
4010                     c6_LB             = c6_geometric;
4011                 }
4012                 bCanDoLBRules = gmx_within_tol(c6_LB, c6, tol);
4013             }
4014
4015             if (FALSE == bCanDoLBRules)
4016             {
4017                 *bC6ParametersWorkWithLBRules = FALSE;
4018             }
4019
4020             bCanDoGeometricRules = gmx_within_tol(c6_geometric, c6, tol);
4021
4022             if (FALSE == bCanDoGeometricRules)
4023             {
4024                 *bC6ParametersWorkWithGeometricRules = FALSE;
4025             }
4026         }
4027     }
4028     sfree(typecount);
4029 }
4030
4031 static void
4032 check_combination_rules(const t_inputrec *ir, const gmx_mtop_t *mtop,
4033                         warninp_t wi)
4034 {
4035     gmx_bool bLBRulesPossible, bC6ParametersWorkWithGeometricRules, bC6ParametersWorkWithLBRules;
4036
4037     check_combination_rule_differences(mtop, 0,
4038                                        &bC6ParametersWorkWithGeometricRules,
4039                                        &bC6ParametersWorkWithLBRules,
4040                                        &bLBRulesPossible);
4041     if (ir->ljpme_combination_rule == eljpmeLB)
4042     {
4043         if (FALSE == bC6ParametersWorkWithLBRules || FALSE == bLBRulesPossible)
4044         {
4045             warning(wi, "You are using arithmetic-geometric combination rules "
4046                     "in LJ-PME, but your non-bonded C6 parameters do not "
4047                     "follow these rules.");
4048         }
4049     }
4050     else
4051     {
4052         if (FALSE == bC6ParametersWorkWithGeometricRules)
4053         {
4054             if (ir->eDispCorr != edispcNO)
4055             {
4056                 warning_note(wi, "You are using geometric combination rules in "
4057                              "LJ-PME, but your non-bonded C6 parameters do "
4058                              "not follow these rules. "
4059                              "This will introduce very small errors in the forces and energies in "
4060                              "your simulations. Dispersion correction will correct total energy "
4061                              "and/or pressure for isotropic systems, but not forces or surface tensions.");
4062             }
4063             else
4064             {
4065                 warning_note(wi, "You are using geometric combination rules in "
4066                              "LJ-PME, but your non-bonded C6 parameters do "
4067                              "not follow these rules. "
4068                              "This will introduce very small errors in the forces and energies in "
4069                              "your simulations. If your system is homogeneous, consider using dispersion correction "
4070                              "for the total energy and pressure.");
4071             }
4072         }
4073     }
4074 }
4075
4076 void triple_check(const char *mdparin, t_inputrec *ir, gmx_mtop_t *sys,
4077                   warninp_t wi)
4078 {
4079     char                      err_buf[STRLEN];
4080     int                       i, m, c, nmol;
4081     gmx_bool                  bCharge, bAcc;
4082     real                     *mgrp, mt;
4083     rvec                      acc;
4084     gmx_mtop_atomloop_block_t aloopb;
4085     gmx_mtop_atomloop_all_t   aloop;
4086     ivec                      AbsRef;
4087     char                      warn_buf[STRLEN];
4088
4089     set_warning_line(wi, mdparin, -1);
4090
4091     if (ir->cutoff_scheme == ecutsVERLET &&
4092         ir->verletbuf_tol > 0 &&
4093         ir->nstlist > 1 &&
4094         ((EI_MD(ir->eI) || EI_SD(ir->eI)) &&
4095          (ir->etc == etcVRESCALE || ir->etc == etcBERENDSEN)))
4096     {
4097         /* Check if a too small Verlet buffer might potentially
4098          * cause more drift than the thermostat can couple off.
4099          */
4100         /* Temperature error fraction for warning and suggestion */
4101         const real T_error_warn    = 0.002;
4102         const real T_error_suggest = 0.001;
4103         /* For safety: 2 DOF per atom (typical with constraints) */
4104         const real nrdf_at         = 2;
4105         real       T, tau, max_T_error;
4106         int        i;
4107
4108         T   = 0;
4109         tau = 0;
4110         for (i = 0; i < ir->opts.ngtc; i++)
4111         {
4112             T   = std::max(T, ir->opts.ref_t[i]);
4113             tau = std::max(tau, ir->opts.tau_t[i]);
4114         }
4115         if (T > 0)
4116         {
4117             /* This is a worst case estimate of the temperature error,
4118              * assuming perfect buffer estimation and no cancelation
4119              * of errors. The factor 0.5 is because energy distributes
4120              * equally over Ekin and Epot.
4121              */
4122             max_T_error = 0.5*tau*ir->verletbuf_tol/(nrdf_at*BOLTZ*T);
4123             if (max_T_error > T_error_warn)
4124             {
4125                 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.",
4126                         ir->verletbuf_tol, T, tau,
4127                         100*max_T_error,
4128                         100*T_error_suggest,
4129                         ir->verletbuf_tol*T_error_suggest/max_T_error);
4130                 warning(wi, warn_buf);
4131             }
4132         }
4133     }
4134
4135     if (ETC_ANDERSEN(ir->etc))
4136     {
4137         int i;
4138
4139         for (i = 0; i < ir->opts.ngtc; i++)
4140         {
4141             sprintf(err_buf, "all tau_t must currently be equal using Andersen temperature control, violated for group %d", i);
4142             CHECK(ir->opts.tau_t[0] != ir->opts.tau_t[i]);
4143             sprintf(err_buf, "all tau_t must be positive using Andersen temperature control, tau_t[%d]=%10.6f",
4144                     i, ir->opts.tau_t[i]);
4145             CHECK(ir->opts.tau_t[i] < 0);
4146         }
4147
4148         if (ir->etc == etcANDERSENMASSIVE && ir->comm_mode != ecmNO)
4149         {
4150             for (i = 0; i < ir->opts.ngtc; i++)
4151             {
4152                 int nsteps = static_cast<int>(ir->opts.tau_t[i]/ir->delta_t + 0.5);
4153                 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);
4154                 CHECK(nsteps % ir->nstcomm != 0);
4155             }
4156         }
4157     }
4158
4159     if (EI_DYNAMICS(ir->eI) && !EI_SD(ir->eI) && ir->eI != eiBD &&
4160         ir->comm_mode == ecmNO &&
4161         !(absolute_reference(ir, sys, FALSE, AbsRef) || ir->nsteps <= 10) &&
4162         !ETC_ANDERSEN(ir->etc))
4163     {
4164         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");
4165     }
4166
4167     /* Check for pressure coupling with absolute position restraints */
4168     if (ir->epc != epcNO && ir->refcoord_scaling == erscNO)
4169     {
4170         absolute_reference(ir, sys, TRUE, AbsRef);
4171         {
4172             for (m = 0; m < DIM; m++)
4173             {
4174                 if (AbsRef[m] && norm2(ir->compress[m]) > 0)
4175                 {
4176                     warning(wi, "You are using pressure coupling with absolute position restraints, this will give artifacts. Use the refcoord_scaling option.");
4177                     break;
4178                 }
4179             }
4180         }
4181     }
4182
4183     bCharge = FALSE;
4184     aloopb  = gmx_mtop_atomloop_block_init(sys);
4185     const t_atom *atom;
4186     while (gmx_mtop_atomloop_block_next(aloopb, &atom, &nmol))
4187     {
4188         if (atom->q != 0 || atom->qB != 0)
4189         {
4190             bCharge = TRUE;
4191         }
4192     }
4193
4194     if (!bCharge)
4195     {
4196         if (EEL_FULL(ir->coulombtype))
4197         {
4198             sprintf(err_buf,
4199                     "You are using full electrostatics treatment %s for a system without charges.\n"
4200                     "This costs a lot of performance for just processing zeros, consider using %s instead.\n",
4201                     EELTYPE(ir->coulombtype), EELTYPE(eelCUT));
4202             warning(wi, err_buf);
4203         }
4204     }
4205     else
4206     {
4207         if (ir->coulombtype == eelCUT && ir->rcoulomb > 0 && !ir->implicit_solvent)
4208         {
4209             sprintf(err_buf,
4210                     "You are using a plain Coulomb cut-off, which might produce artifacts.\n"
4211                     "You might want to consider using %s electrostatics.\n",
4212                     EELTYPE(eelPME));
4213             warning_note(wi, err_buf);
4214         }
4215     }
4216
4217     /* Check if combination rules used in LJ-PME are the same as in the force field */
4218     if (EVDW_PME(ir->vdwtype))
4219     {
4220         check_combination_rules(ir, sys, wi);
4221     }
4222
4223     /* Generalized reaction field */
4224     if (ir->opts.ngtc == 0)
4225     {
4226         sprintf(err_buf, "No temperature coupling while using coulombtype %s",
4227                 eel_names[eelGRF]);
4228         CHECK(ir->coulombtype == eelGRF);
4229     }
4230     else
4231     {
4232         sprintf(err_buf, "When using coulombtype = %s"
4233                 " ref-t for temperature coupling should be > 0",
4234                 eel_names[eelGRF]);
4235         CHECK((ir->coulombtype == eelGRF) && (ir->opts.ref_t[0] <= 0));
4236     }
4237
4238     bAcc = FALSE;
4239     for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4240     {
4241         for (m = 0; (m < DIM); m++)
4242         {
4243             if (fabs(ir->opts.acc[i][m]) > 1e-6)
4244             {
4245                 bAcc = TRUE;
4246             }
4247         }
4248     }
4249     if (bAcc)
4250     {
4251         clear_rvec(acc);
4252         snew(mgrp, sys->groups.grps[egcACC].nr);
4253         aloop = gmx_mtop_atomloop_all_init(sys);
4254         const t_atom *atom;
4255         while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
4256         {
4257             mgrp[ggrpnr(&sys->groups, egcACC, i)] += atom->m;
4258         }
4259         mt = 0.0;
4260         for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4261         {
4262             for (m = 0; (m < DIM); m++)
4263             {
4264                 acc[m] += ir->opts.acc[i][m]*mgrp[i];
4265             }
4266             mt += mgrp[i];
4267         }
4268         for (m = 0; (m < DIM); m++)
4269         {
4270             if (fabs(acc[m]) > 1e-6)
4271             {
4272                 const char *dim[DIM] = { "X", "Y", "Z" };
4273                 fprintf(stderr,
4274                         "Net Acceleration in %s direction, will %s be corrected\n",
4275                         dim[m], ir->nstcomm != 0 ? "" : "not");
4276                 if (ir->nstcomm != 0 && m < ndof_com(ir))
4277                 {
4278                     acc[m] /= mt;
4279                     for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4280                     {
4281                         ir->opts.acc[i][m] -= acc[m];
4282                     }
4283                 }
4284             }
4285         }
4286         sfree(mgrp);
4287     }
4288
4289     if (ir->efep != efepNO && ir->fepvals->sc_alpha != 0 &&
4290         !gmx_within_tol(sys->ffparams.reppow, 12.0, 10*GMX_DOUBLE_EPS))
4291     {
4292         gmx_fatal(FARGS, "Soft-core interactions are only supported with VdW repulsion power 12");
4293     }
4294
4295     if (ir->bPull)
4296     {
4297         gmx_bool bWarned;
4298
4299         bWarned = FALSE;
4300         for (i = 0; i < ir->pull->ncoord && !bWarned; i++)
4301         {
4302             if (ir->pull->coord[i].group[0] == 0 ||
4303                 ir->pull->coord[i].group[1] == 0)
4304             {
4305                 absolute_reference(ir, sys, FALSE, AbsRef);
4306                 for (m = 0; m < DIM; m++)
4307                 {
4308                     if (ir->pull->coord[i].dim[m] && !AbsRef[m])
4309                     {
4310                         warning(wi, "You are using an absolute reference for pulling, but the rest of the system does not have an absolute reference. This will lead to artifacts.");
4311                         bWarned = TRUE;
4312                         break;
4313                     }
4314                 }
4315             }
4316         }
4317
4318         for (i = 0; i < 3; i++)
4319         {
4320             for (m = 0; m <= i; m++)
4321             {
4322                 if ((ir->epc != epcNO && ir->compress[i][m] != 0) ||
4323                     ir->deform[i][m] != 0)
4324                 {
4325                     for (c = 0; c < ir->pull->ncoord; c++)
4326                     {
4327                         if (ir->pull->coord[c].eGeom == epullgDIRPBC &&
4328                             ir->pull->coord[c].vec[m] != 0)
4329                         {
4330                             gmx_fatal(FARGS, "Can not have dynamic box while using pull geometry '%s' (dim %c)", EPULLGEOM(ir->pull->coord[c].eGeom), 'x'+m);
4331                         }
4332                     }
4333                 }
4334             }
4335         }
4336     }
4337
4338     check_disre(sys);
4339 }
4340
4341 void double_check(t_inputrec *ir, matrix box,
4342                   gmx_bool bHasNormalConstraints,
4343                   gmx_bool bHasAnyConstraints,
4344                   warninp_t wi)
4345 {
4346     real        min_size;
4347     char        warn_buf[STRLEN];
4348     const char *ptr;
4349
4350     ptr = check_box(ir->ePBC, box);
4351     if (ptr)
4352     {
4353         warning_error(wi, ptr);
4354     }
4355
4356     if (bHasNormalConstraints && ir->eConstrAlg == econtSHAKE)
4357     {
4358         if (ir->shake_tol <= 0.0)
4359         {
4360             sprintf(warn_buf, "ERROR: shake-tol must be > 0 instead of %g\n",
4361                     ir->shake_tol);
4362             warning_error(wi, warn_buf);
4363         }
4364     }
4365
4366     if ( (ir->eConstrAlg == econtLINCS) && bHasNormalConstraints)
4367     {
4368         /* If we have Lincs constraints: */
4369         if (ir->eI == eiMD && ir->etc == etcNO &&
4370             ir->eConstrAlg == econtLINCS && ir->nLincsIter == 1)
4371         {
4372             sprintf(warn_buf, "For energy conservation with LINCS, lincs_iter should be 2 or larger.\n");
4373             warning_note(wi, warn_buf);
4374         }
4375
4376         if ((ir->eI == eiCG || ir->eI == eiLBFGS) && (ir->nProjOrder < 8))
4377         {
4378             sprintf(warn_buf, "For accurate %s with LINCS constraints, lincs-order should be 8 or more.", ei_names[ir->eI]);
4379             warning_note(wi, warn_buf);
4380         }
4381         if (ir->epc == epcMTTK)
4382         {
4383             warning_error(wi, "MTTK not compatible with lincs -- use shake instead.");
4384         }
4385     }
4386
4387     if (bHasAnyConstraints && ir->epc == epcMTTK)
4388     {
4389         warning_error(wi, "Constraints are not implemented with MTTK pressure control.");
4390     }
4391
4392     if (ir->LincsWarnAngle > 90.0)
4393     {
4394         sprintf(warn_buf, "lincs-warnangle can not be larger than 90 degrees, setting it to 90.\n");
4395         warning(wi, warn_buf);
4396         ir->LincsWarnAngle = 90.0;
4397     }
4398
4399     if (ir->ePBC != epbcNONE)
4400     {
4401         if (ir->nstlist == 0)
4402         {
4403             warning(wi, "With nstlist=0 atoms are only put into the box at step 0, therefore drifting atoms might cause the simulation to crash.");
4404         }
4405         if (ir->ns_type == ensGRID)
4406         {
4407             if (gmx::square(ir->rlist) >= max_cutoff2(ir->ePBC, box))
4408             {
4409                 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");
4410                 warning_error(wi, warn_buf);
4411             }
4412         }
4413         else
4414         {
4415             min_size = std::min(box[XX][XX], std::min(box[YY][YY], box[ZZ][ZZ]));
4416             if (2*ir->rlist >= min_size)
4417             {
4418                 sprintf(warn_buf, "ERROR: One of the box lengths is smaller than twice the cut-off length. Increase the box size or decrease rlist.");
4419                 warning_error(wi, warn_buf);
4420                 if (TRICLINIC(box))
4421                 {
4422                     fprintf(stderr, "Grid search might allow larger cut-off's than simple search with triclinic boxes.");
4423                 }
4424             }
4425         }
4426     }
4427 }
4428
4429 void check_chargegroup_radii(const gmx_mtop_t *mtop, const t_inputrec *ir,
4430                              rvec *x,
4431                              warninp_t wi)
4432 {
4433     real rvdw1, rvdw2, rcoul1, rcoul2;
4434     char warn_buf[STRLEN];
4435
4436     calc_chargegroup_radii(mtop, x, &rvdw1, &rvdw2, &rcoul1, &rcoul2);
4437
4438     if (rvdw1 > 0)
4439     {
4440         printf("Largest charge group radii for Van der Waals: %5.3f, %5.3f nm\n",
4441                rvdw1, rvdw2);
4442     }
4443     if (rcoul1 > 0)
4444     {
4445         printf("Largest charge group radii for Coulomb:       %5.3f, %5.3f nm\n",
4446                rcoul1, rcoul2);
4447     }
4448
4449     if (ir->rlist > 0)
4450     {
4451         if (rvdw1  + rvdw2  > ir->rlist ||
4452             rcoul1 + rcoul2 > ir->rlist)
4453         {
4454             sprintf(warn_buf,
4455                     "The sum of the two largest charge group radii (%f) "
4456                     "is larger than rlist (%f)\n",
4457                     std::max(rvdw1+rvdw2, rcoul1+rcoul2), ir->rlist);
4458             warning(wi, warn_buf);
4459         }
4460         else
4461         {
4462             /* Here we do not use the zero at cut-off macro,
4463              * since user defined interactions might purposely
4464              * not be zero at the cut-off.
4465              */
4466             if (ir_vdw_is_zero_at_cutoff(ir) &&
4467                 rvdw1 + rvdw2 > ir->rlist - ir->rvdw)
4468             {
4469                 sprintf(warn_buf, "The sum of the two largest charge group "
4470                         "radii (%f) is larger than rlist (%f) - rvdw (%f).\n"
4471                         "With exact cut-offs, better performance can be "
4472                         "obtained with cutoff-scheme = %s, because it "
4473                         "does not use charge groups at all.",
4474                         rvdw1+rvdw2,
4475                         ir->rlist, ir->rvdw,
4476                         ecutscheme_names[ecutsVERLET]);
4477                 if (ir_NVE(ir))
4478                 {
4479                     warning(wi, warn_buf);
4480                 }
4481                 else
4482                 {
4483                     warning_note(wi, warn_buf);
4484                 }
4485             }
4486             if (ir_coulomb_is_zero_at_cutoff(ir) &&
4487                 rcoul1 + rcoul2 > ir->rlist - ir->rcoulomb)
4488             {
4489                 sprintf(warn_buf, "The sum of the two largest charge group radii (%f) is larger than rlist (%f) - rcoulomb (%f).\n"
4490                         "With exact cut-offs, better performance can be obtained with cutoff-scheme = %s, because it does not use charge groups at all.",
4491                         rcoul1+rcoul2,
4492                         ir->rlist, ir->rcoulomb,
4493                         ecutscheme_names[ecutsVERLET]);
4494                 if (ir_NVE(ir))
4495                 {
4496                     warning(wi, warn_buf);
4497                 }
4498                 else
4499                 {
4500                     warning_note(wi, warn_buf);
4501                 }
4502             }
4503         }
4504     }
4505 }