Enable missing declarations warning
[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], bTS[STRLEN], bOPT[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     CTYPE ("Optimization of QM subsystem");
2077     STYPE ("bOPT",          is->bOPT, nullptr);
2078     STYPE ("bTS",          is->bTS, nullptr);
2079
2080     /* Simulated annealing */
2081     CCTYPE("SIMULATED ANNEALING");
2082     CTYPE ("Type of annealing for each temperature group (no/single/periodic)");
2083     STYPE ("annealing",   is->anneal,      nullptr);
2084     CTYPE ("Number of time points to use for specifying annealing in each group");
2085     STYPE ("annealing-npoints", is->anneal_npoints, nullptr);
2086     CTYPE ("List of times at the annealing points for each group");
2087     STYPE ("annealing-time",       is->anneal_time,       nullptr);
2088     CTYPE ("Temp. at each annealing point, for each group.");
2089     STYPE ("annealing-temp",  is->anneal_temp,  nullptr);
2090
2091     /* Startup run */
2092     CCTYPE ("GENERATE VELOCITIES FOR STARTUP RUN");
2093     EETYPE("gen-vel",     opts->bGenVel,  yesno_names);
2094     RTYPE ("gen-temp",    opts->tempi,    300.0);
2095     ITYPE ("gen-seed",    opts->seed,     -1);
2096
2097     /* Shake stuff */
2098     CCTYPE ("OPTIONS FOR BONDS");
2099     EETYPE("constraints", opts->nshake,   constraints);
2100     CTYPE ("Type of constraint algorithm");
2101     EETYPE("constraint-algorithm",  ir->eConstrAlg, econstr_names);
2102     CTYPE ("Do not constrain the start configuration");
2103     EETYPE("continuation", ir->bContinuation, yesno_names);
2104     CTYPE ("Use successive overrelaxation to reduce the number of shake iterations");
2105     EETYPE("Shake-SOR", ir->bShakeSOR, yesno_names);
2106     CTYPE ("Relative tolerance of shake");
2107     RTYPE ("shake-tol", ir->shake_tol, 0.0001);
2108     CTYPE ("Highest order in the expansion of the constraint coupling matrix");
2109     ITYPE ("lincs-order", ir->nProjOrder, 4);
2110     CTYPE ("Number of iterations in the final step of LINCS. 1 is fine for");
2111     CTYPE ("normal simulations, but use 2 to conserve energy in NVE runs.");
2112     CTYPE ("For energy minimization with constraints it should be 4 to 8.");
2113     ITYPE ("lincs-iter", ir->nLincsIter, 1);
2114     CTYPE ("Lincs will write a warning to the stderr if in one step a bond");
2115     CTYPE ("rotates over more degrees than");
2116     RTYPE ("lincs-warnangle", ir->LincsWarnAngle, 30.0);
2117     CTYPE ("Convert harmonic bonds to morse potentials");
2118     EETYPE("morse",       opts->bMorse, yesno_names);
2119
2120     /* Energy group exclusions */
2121     CCTYPE ("ENERGY GROUP EXCLUSIONS");
2122     CTYPE ("Pairs of energy groups for which all non-bonded interactions are excluded");
2123     STYPE ("energygrp-excl", is->egpexcl,     nullptr);
2124
2125     /* Walls */
2126     CCTYPE ("WALLS");
2127     CTYPE ("Number of walls, type, atom types, densities and box-z scale factor for Ewald");
2128     ITYPE ("nwall", ir->nwall, 0);
2129     EETYPE("wall-type",     ir->wall_type,   ewt_names);
2130     RTYPE ("wall-r-linpot", ir->wall_r_linpot, -1);
2131     STYPE ("wall-atomtype", is->wall_atomtype, nullptr);
2132     STYPE ("wall-density",  is->wall_density,  nullptr);
2133     RTYPE ("wall-ewald-zfac", ir->wall_ewald_zfac, 3);
2134
2135     /* COM pulling */
2136     CCTYPE("COM PULLING");
2137     EETYPE("pull",          ir->bPull, yesno_names);
2138     if (ir->bPull)
2139     {
2140         snew(ir->pull, 1);
2141         is->pull_grp = read_pullparams(&ninp, &inp, ir->pull, wi);
2142     }
2143
2144     /* Enforced rotation */
2145     CCTYPE("ENFORCED ROTATION");
2146     CTYPE("Enforced rotation: No or Yes");
2147     EETYPE("rotation",       ir->bRot, yesno_names);
2148     if (ir->bRot)
2149     {
2150         snew(ir->rot, 1);
2151         is->rot_grp = read_rotparams(&ninp, &inp, ir->rot, wi);
2152     }
2153
2154     /* Interactive MD */
2155     ir->bIMD = FALSE;
2156     CCTYPE("Group to display and/or manipulate in interactive MD session");
2157     STYPE ("IMD-group", is->imd_grp, nullptr);
2158     if (is->imd_grp[0] != '\0')
2159     {
2160         snew(ir->imd, 1);
2161         ir->bIMD = TRUE;
2162     }
2163
2164     /* Refinement */
2165     CCTYPE("NMR refinement stuff");
2166     CTYPE ("Distance restraints type: No, Simple or Ensemble");
2167     EETYPE("disre",       ir->eDisre,     edisre_names);
2168     CTYPE ("Force weighting of pairs in one distance restraint: Conservative or Equal");
2169     EETYPE("disre-weighting", ir->eDisreWeighting, edisreweighting_names);
2170     CTYPE ("Use sqrt of the time averaged times the instantaneous violation");
2171     EETYPE("disre-mixed", ir->bDisreMixed, yesno_names);
2172     RTYPE ("disre-fc",    ir->dr_fc,  1000.0);
2173     RTYPE ("disre-tau",   ir->dr_tau, 0.0);
2174     CTYPE ("Output frequency for pair distances to energy file");
2175     ITYPE ("nstdisreout", ir->nstdisreout, 100);
2176     CTYPE ("Orientation restraints: No or Yes");
2177     EETYPE("orire",       opts->bOrire,   yesno_names);
2178     CTYPE ("Orientation restraints force constant and tau for time averaging");
2179     RTYPE ("orire-fc",    ir->orires_fc,  0.0);
2180     RTYPE ("orire-tau",   ir->orires_tau, 0.0);
2181     STYPE ("orire-fitgrp", is->orirefitgrp,    nullptr);
2182     CTYPE ("Output frequency for trace(SD) and S to energy file");
2183     ITYPE ("nstorireout", ir->nstorireout, 100);
2184
2185     /* free energy variables */
2186     CCTYPE ("Free energy variables");
2187     EETYPE("free-energy", ir->efep, efep_names);
2188     STYPE ("couple-moltype",  is->couple_moltype,  nullptr);
2189     EETYPE("couple-lambda0", opts->couple_lam0, couple_lam);
2190     EETYPE("couple-lambda1", opts->couple_lam1, couple_lam);
2191     EETYPE("couple-intramol", opts->bCoupleIntra, yesno_names);
2192
2193     RTYPE ("init-lambda", fep->init_lambda, -1); /* start with -1 so
2194                                                     we can recognize if
2195                                                     it was not entered */
2196     ITYPE ("init-lambda-state", fep->init_fep_state, -1);
2197     RTYPE ("delta-lambda", fep->delta_lambda, 0.0);
2198     ITYPE ("nstdhdl", fep->nstdhdl, 50);
2199     STYPE ("fep-lambdas", is->fep_lambda[efptFEP], nullptr);
2200     STYPE ("mass-lambdas", is->fep_lambda[efptMASS], nullptr);
2201     STYPE ("coul-lambdas", is->fep_lambda[efptCOUL], nullptr);
2202     STYPE ("vdw-lambdas", is->fep_lambda[efptVDW], nullptr);
2203     STYPE ("bonded-lambdas", is->fep_lambda[efptBONDED], nullptr);
2204     STYPE ("restraint-lambdas", is->fep_lambda[efptRESTRAINT], nullptr);
2205     STYPE ("temperature-lambdas", is->fep_lambda[efptTEMPERATURE], nullptr);
2206     ITYPE ("calc-lambda-neighbors", fep->lambda_neighbors, 1);
2207     STYPE ("init-lambda-weights", is->lambda_weights, nullptr);
2208     EETYPE("dhdl-print-energy", fep->edHdLPrintEnergy, edHdLPrintEnergy_names);
2209     RTYPE ("sc-alpha", fep->sc_alpha, 0.0);
2210     ITYPE ("sc-power", fep->sc_power, 1);
2211     RTYPE ("sc-r-power", fep->sc_r_power, 6.0);
2212     RTYPE ("sc-sigma", fep->sc_sigma, 0.3);
2213     EETYPE("sc-coul", fep->bScCoul, yesno_names);
2214     ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2215     RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2216     EETYPE("separate-dhdl-file", fep->separate_dhdl_file,
2217            separate_dhdl_file_names);
2218     EETYPE("dhdl-derivatives", fep->dhdl_derivatives, dhdl_derivatives_names);
2219     ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2220     RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2221
2222     /* Non-equilibrium MD stuff */
2223     CCTYPE("Non-equilibrium MD stuff");
2224     STYPE ("acc-grps",    is->accgrps,        nullptr);
2225     STYPE ("accelerate",  is->acc,            nullptr);
2226     STYPE ("freezegrps",  is->freeze,         nullptr);
2227     STYPE ("freezedim",   is->frdim,          nullptr);
2228     RTYPE ("cos-acceleration", ir->cos_accel, 0);
2229     STYPE ("deform",      is->deform,         nullptr);
2230
2231     /* simulated tempering variables */
2232     CCTYPE("simulated tempering variables");
2233     EETYPE("simulated-tempering", ir->bSimTemp, yesno_names);
2234     EETYPE("simulated-tempering-scaling", ir->simtempvals->eSimTempScale, esimtemp_names);
2235     RTYPE("sim-temp-low", ir->simtempvals->simtemp_low, 300.0);
2236     RTYPE("sim-temp-high", ir->simtempvals->simtemp_high, 300.0);
2237
2238     /* expanded ensemble variables */
2239     if (ir->efep == efepEXPANDED || ir->bSimTemp)
2240     {
2241         read_expandedparams(&ninp, &inp, expand, wi);
2242     }
2243
2244     /* Electric fields */
2245     {
2246         gmx::KeyValueTreeObject      convertedValues = flatKeyValueTreeFromInpFile(ninp, inp);
2247         gmx::KeyValueTreeTransformer transform;
2248         transform.rules()->addRule()
2249             .keyMatchType("/", gmx::StringCompareType::CaseAndDashInsensitive);
2250         mdModules->initMdpTransform(transform.rules());
2251         for (const auto &path : transform.mappedPaths())
2252         {
2253             GMX_ASSERT(path.size() == 1, "Inconsistent mapping back to mdp options");
2254             mark_einp_set(ninp, inp, path[0].c_str());
2255         }
2256         MdpErrorHandler              errorHandler(wi);
2257         auto                         result
2258                    = transform.transform(convertedValues, &errorHandler);
2259         ir->params = new gmx::KeyValueTreeObject(result.object());
2260         mdModules->adjustInputrecBasedOnModules(ir);
2261         errorHandler.setBackMapping(result.backMapping());
2262         mdModules->assignOptionsToModules(*ir->params, &errorHandler);
2263     }
2264
2265     /* Ion/water position swapping ("computational electrophysiology") */
2266     CCTYPE("Ion/water position swapping for computational electrophysiology setups");
2267     CTYPE("Swap positions along direction: no, X, Y, Z");
2268     EETYPE("swapcoords", ir->eSwapCoords, eSwapTypes_names);
2269     if (ir->eSwapCoords != eswapNO)
2270     {
2271         char buf[STRLEN];
2272         int  nIonTypes;
2273
2274
2275         snew(ir->swap, 1);
2276         CTYPE("Swap attempt frequency");
2277         ITYPE("swap-frequency", ir->swap->nstswap, 1);
2278         CTYPE("Number of ion types to be controlled");
2279         ITYPE("iontypes", nIonTypes, 1);
2280         if (nIonTypes < 1)
2281         {
2282             warning_error(wi, "You need to provide at least one ion type for position exchanges.");
2283         }
2284         ir->swap->ngrp = nIonTypes + eSwapFixedGrpNR;
2285         snew(ir->swap->grp, ir->swap->ngrp);
2286         for (i = 0; i < ir->swap->ngrp; i++)
2287         {
2288             snew(ir->swap->grp[i].molname, STRLEN);
2289         }
2290         CTYPE("Two index groups that contain the compartment-partitioning atoms");
2291         STYPE("split-group0", ir->swap->grp[eGrpSplit0].molname, nullptr);
2292         STYPE("split-group1", ir->swap->grp[eGrpSplit1].molname, nullptr);
2293         CTYPE("Use center of mass of split groups (yes/no), otherwise center of geometry is used");
2294         EETYPE("massw-split0", ir->swap->massw_split[0], yesno_names);
2295         EETYPE("massw-split1", ir->swap->massw_split[1], yesno_names);
2296
2297         CTYPE("Name of solvent molecules");
2298         STYPE("solvent-group", ir->swap->grp[eGrpSolvent].molname, nullptr);
2299
2300         CTYPE("Split cylinder: radius, upper and lower extension (nm) (this will define the channels)");
2301         CTYPE("Note that the split cylinder settings do not have an influence on the swapping protocol,");
2302         CTYPE("however, if correctly defined, the permeation events are recorded per channel");
2303         RTYPE("cyl0-r", ir->swap->cyl0r, 2.0);
2304         RTYPE("cyl0-up", ir->swap->cyl0u, 1.0);
2305         RTYPE("cyl0-down", ir->swap->cyl0l, 1.0);
2306         RTYPE("cyl1-r", ir->swap->cyl1r, 2.0);
2307         RTYPE("cyl1-up", ir->swap->cyl1u, 1.0);
2308         RTYPE("cyl1-down", ir->swap->cyl1l, 1.0);
2309
2310         CTYPE("Average the number of ions per compartment over these many swap attempt steps");
2311         ITYPE("coupl-steps", ir->swap->nAverage, 10);
2312
2313         CTYPE("Names of the ion types that can be exchanged with solvent molecules,");
2314         CTYPE("and the requested number of ions of this type in compartments A and B");
2315         CTYPE("-1 means fix the numbers as found in step 0");
2316         for (i = 0; i < nIonTypes; i++)
2317         {
2318             int ig = eSwapFixedGrpNR + i;
2319
2320             sprintf(buf, "iontype%d-name", i);
2321             STYPE(buf, ir->swap->grp[ig].molname, nullptr);
2322             sprintf(buf, "iontype%d-in-A", i);
2323             ITYPE(buf, ir->swap->grp[ig].nmolReq[0], -1);
2324             sprintf(buf, "iontype%d-in-B", i);
2325             ITYPE(buf, ir->swap->grp[ig].nmolReq[1], -1);
2326         }
2327
2328         CTYPE("By default (i.e. bulk offset = 0.0), ion/water exchanges happen between layers");
2329         CTYPE("at maximum distance (= bulk concentration) to the split group layers. However,");
2330         CTYPE("an offset b (-1.0 < b < +1.0) can be specified to offset the bulk layer from the middle at 0.0");
2331         CTYPE("towards one of the compartment-partitioning layers (at +/- 1.0).");
2332         RTYPE("bulk-offsetA", ir->swap->bulkOffset[0], 0.0);
2333         RTYPE("bulk-offsetB", ir->swap->bulkOffset[1], 0.0);
2334         if (!(ir->swap->bulkOffset[0] > -1.0 && ir->swap->bulkOffset[0] < 1.0)
2335             || !(ir->swap->bulkOffset[1] > -1.0 && ir->swap->bulkOffset[1] < 1.0) )
2336         {
2337             warning_error(wi, "Bulk layer offsets must be > -1.0 and < 1.0 !");
2338         }
2339
2340         CTYPE("Start to swap ions if threshold difference to requested count is reached");
2341         RTYPE("threshold", ir->swap->threshold, 1.0);
2342     }
2343
2344     /* AdResS is no longer supported, but we need mdrun to be able to refuse to run old AdResS .tpr files */
2345     EETYPE("adress", ir->bAdress, yesno_names);
2346
2347     /* User defined thingies */
2348     CCTYPE ("User defined thingies");
2349     STYPE ("user1-grps",  is->user1,          nullptr);
2350     STYPE ("user2-grps",  is->user2,          nullptr);
2351     ITYPE ("userint1",    ir->userint1,   0);
2352     ITYPE ("userint2",    ir->userint2,   0);
2353     ITYPE ("userint3",    ir->userint3,   0);
2354     ITYPE ("userint4",    ir->userint4,   0);
2355     RTYPE ("userreal1",   ir->userreal1,  0);
2356     RTYPE ("userreal2",   ir->userreal2,  0);
2357     RTYPE ("userreal3",   ir->userreal3,  0);
2358     RTYPE ("userreal4",   ir->userreal4,  0);
2359 #undef CTYPE
2360
2361     {
2362         gmx::TextOutputFile stream(mdparout);
2363         write_inpfile(&stream, mdparout, ninp, inp, FALSE, writeMdpHeader, wi);
2364
2365         // Transform module data into a flat key-value tree for output.
2366         gmx::KeyValueTreeBuilder       builder;
2367         gmx::KeyValueTreeObjectBuilder builderObject = builder.rootObject();
2368         mdModules->buildMdpOutput(&builderObject);
2369         {
2370             gmx::TextWriter writer(&stream);
2371             writeKeyValueTreeAsMdp(&writer, builder.build());
2372         }
2373         stream.close();
2374     }
2375
2376     for (i = 0; (i < ninp); i++)
2377     {
2378         sfree(inp[i].name);
2379         sfree(inp[i].value);
2380     }
2381     sfree(inp);
2382
2383     /* Process options if necessary */
2384     for (m = 0; m < 2; m++)
2385     {
2386         for (i = 0; i < 2*DIM; i++)
2387         {
2388             dumdub[m][i] = 0.0;
2389         }
2390         if (ir->epc)
2391         {
2392             switch (ir->epct)
2393             {
2394                 case epctISOTROPIC:
2395                     if (sscanf(dumstr[m], "%lf", &(dumdub[m][XX])) != 1)
2396                     {
2397                         warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 1)");
2398                     }
2399                     dumdub[m][YY] = dumdub[m][ZZ] = dumdub[m][XX];
2400                     break;
2401                 case epctSEMIISOTROPIC:
2402                 case epctSURFACETENSION:
2403                     if (sscanf(dumstr[m], "%lf%lf", &(dumdub[m][XX]), &(dumdub[m][ZZ])) != 2)
2404                     {
2405                         warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 2)");
2406                     }
2407                     dumdub[m][YY] = dumdub[m][XX];
2408                     break;
2409                 case epctANISOTROPIC:
2410                     if (sscanf(dumstr[m], "%lf%lf%lf%lf%lf%lf",
2411                                &(dumdub[m][XX]), &(dumdub[m][YY]), &(dumdub[m][ZZ]),
2412                                &(dumdub[m][3]), &(dumdub[m][4]), &(dumdub[m][5])) != 6)
2413                     {
2414                         warning_error(wi, "Pressure coupling incorrect number of values (I need exactly 6)");
2415                     }
2416                     break;
2417                 default:
2418                     gmx_fatal(FARGS, "Pressure coupling type %s not implemented yet",
2419                               epcoupltype_names[ir->epct]);
2420             }
2421         }
2422     }
2423     clear_mat(ir->ref_p);
2424     clear_mat(ir->compress);
2425     for (i = 0; i < DIM; i++)
2426     {
2427         ir->ref_p[i][i]    = dumdub[1][i];
2428         ir->compress[i][i] = dumdub[0][i];
2429     }
2430     if (ir->epct == epctANISOTROPIC)
2431     {
2432         ir->ref_p[XX][YY] = dumdub[1][3];
2433         ir->ref_p[XX][ZZ] = dumdub[1][4];
2434         ir->ref_p[YY][ZZ] = dumdub[1][5];
2435         if (ir->ref_p[XX][YY] != 0 && ir->ref_p[XX][ZZ] != 0 && ir->ref_p[YY][ZZ] != 0)
2436         {
2437             warning(wi, "All off-diagonal reference pressures are non-zero. Are you sure you want to apply a threefold shear stress?\n");
2438         }
2439         ir->compress[XX][YY] = dumdub[0][3];
2440         ir->compress[XX][ZZ] = dumdub[0][4];
2441         ir->compress[YY][ZZ] = dumdub[0][5];
2442         for (i = 0; i < DIM; i++)
2443         {
2444             for (m = 0; m < i; m++)
2445             {
2446                 ir->ref_p[i][m]    = ir->ref_p[m][i];
2447                 ir->compress[i][m] = ir->compress[m][i];
2448             }
2449         }
2450     }
2451
2452     if (ir->comm_mode == ecmNO)
2453     {
2454         ir->nstcomm = 0;
2455     }
2456
2457     opts->couple_moltype = nullptr;
2458     if (strlen(is->couple_moltype) > 0)
2459     {
2460         if (ir->efep != efepNO)
2461         {
2462             opts->couple_moltype = gmx_strdup(is->couple_moltype);
2463             if (opts->couple_lam0 == opts->couple_lam1)
2464             {
2465                 warning(wi, "The lambda=0 and lambda=1 states for coupling are identical");
2466             }
2467             if (ir->eI == eiMD && (opts->couple_lam0 == ecouplamNONE ||
2468                                    opts->couple_lam1 == ecouplamNONE))
2469             {
2470                 warning(wi, "For proper sampling of the (nearly) decoupled state, stochastic dynamics should be used");
2471             }
2472         }
2473         else
2474         {
2475             warning_note(wi, "Free energy is turned off, so we will not decouple the molecule listed in your input.");
2476         }
2477     }
2478     /* FREE ENERGY AND EXPANDED ENSEMBLE OPTIONS */
2479     if (ir->efep != efepNO)
2480     {
2481         if (fep->delta_lambda > 0)
2482         {
2483             ir->efep = efepSLOWGROWTH;
2484         }
2485     }
2486
2487     if (fep->edHdLPrintEnergy == edHdLPrintEnergyYES)
2488     {
2489         fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2490         warning_note(wi, "Old option for dhdl-print-energy given: "
2491                      "changing \"yes\" to \"total\"\n");
2492     }
2493
2494     if (ir->bSimTemp && (fep->edHdLPrintEnergy == edHdLPrintEnergyNO))
2495     {
2496         /* always print out the energy to dhdl if we are doing
2497            expanded ensemble, since we need the total energy for
2498            analysis if the temperature is changing. In some
2499            conditions one may only want the potential energy, so
2500            we will allow that if the appropriate mdp setting has
2501            been enabled. Otherwise, total it is:
2502          */
2503         fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2504     }
2505
2506     if ((ir->efep != efepNO) || ir->bSimTemp)
2507     {
2508         ir->bExpanded = FALSE;
2509         if ((ir->efep == efepEXPANDED) || ir->bSimTemp)
2510         {
2511             ir->bExpanded = TRUE;
2512         }
2513         do_fep_params(ir, is->fep_lambda, is->lambda_weights, wi);
2514         if (ir->bSimTemp) /* done after fep params */
2515         {
2516             do_simtemp_params(ir);
2517         }
2518
2519         /* Because sc-coul (=FALSE by default) only acts on the lambda state
2520          * setup and not on the old way of specifying the free-energy setup,
2521          * we should check for using soft-core when not needed, since that
2522          * can complicate the sampling significantly.
2523          * Note that we only check for the automated coupling setup.
2524          * If the (advanced) user does FEP through manual topology changes,
2525          * this check will not be triggered.
2526          */
2527         if (ir->efep != efepNO && ir->fepvals->n_lambda == 0 &&
2528             ir->fepvals->sc_alpha != 0 &&
2529             (couple_lambda_has_vdw_on(opts->couple_lam0) &&
2530              couple_lambda_has_vdw_on(opts->couple_lam1)))
2531         {
2532             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.");
2533         }
2534     }
2535     else
2536     {
2537         ir->fepvals->n_lambda = 0;
2538     }
2539
2540     /* WALL PARAMETERS */
2541
2542     do_wall_params(ir, is->wall_atomtype, is->wall_density, opts);
2543
2544     /* ORIENTATION RESTRAINT PARAMETERS */
2545
2546     if (opts->bOrire && str_nelem(is->orirefitgrp, MAXPTR, nullptr) != 1)
2547     {
2548         warning_error(wi, "ERROR: Need one orientation restraint fit group\n");
2549     }
2550
2551     /* DEFORMATION PARAMETERS */
2552
2553     clear_mat(ir->deform);
2554     for (i = 0; i < 6; i++)
2555     {
2556         dumdub[0][i] = 0;
2557     }
2558
2559     double gmx_unused canary;
2560     int               ndeform = sscanf(is->deform, "%lf %lf %lf %lf %lf %lf %lf",
2561                                        &(dumdub[0][0]), &(dumdub[0][1]), &(dumdub[0][2]),
2562                                        &(dumdub[0][3]), &(dumdub[0][4]), &(dumdub[0][5]), &canary);
2563
2564     if (strlen(is->deform) > 0 && ndeform != 6)
2565     {
2566         warning_error(wi, gmx::formatString("Cannot parse exactly 6 box deformation velocities from string '%s'", is->deform).c_str());
2567     }
2568     for (i = 0; i < 3; i++)
2569     {
2570         ir->deform[i][i] = dumdub[0][i];
2571     }
2572     ir->deform[YY][XX] = dumdub[0][3];
2573     ir->deform[ZZ][XX] = dumdub[0][4];
2574     ir->deform[ZZ][YY] = dumdub[0][5];
2575     if (ir->epc != epcNO)
2576     {
2577         for (i = 0; i < 3; i++)
2578         {
2579             for (j = 0; j <= i; j++)
2580             {
2581                 if (ir->deform[i][j] != 0 && ir->compress[i][j] != 0)
2582                 {
2583                     warning_error(wi, "A box element has deform set and compressibility > 0");
2584                 }
2585             }
2586         }
2587         for (i = 0; i < 3; i++)
2588         {
2589             for (j = 0; j < i; j++)
2590             {
2591                 if (ir->deform[i][j] != 0)
2592                 {
2593                     for (m = j; m < DIM; m++)
2594                     {
2595                         if (ir->compress[m][j] != 0)
2596                         {
2597                             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.");
2598                             warning(wi, warn_buf);
2599                         }
2600                     }
2601                 }
2602             }
2603         }
2604     }
2605
2606     /* Ion/water position swapping checks */
2607     if (ir->eSwapCoords != eswapNO)
2608     {
2609         if (ir->swap->nstswap < 1)
2610         {
2611             warning_error(wi, "swap_frequency must be 1 or larger when ion swapping is requested");
2612         }
2613         if (ir->swap->nAverage < 1)
2614         {
2615             warning_error(wi, "coupl_steps must be 1 or larger.\n");
2616         }
2617         if (ir->swap->threshold < 1.0)
2618         {
2619             warning_error(wi, "Ion count threshold must be at least 1.\n");
2620         }
2621     }
2622
2623     sfree(dumstr[0]);
2624     sfree(dumstr[1]);
2625 }
2626
2627 static int search_QMstring(const char *s, int ng, const char *gn[])
2628 {
2629     /* same as normal search_string, but this one searches QM strings */
2630     int i;
2631
2632     for (i = 0; (i < ng); i++)
2633     {
2634         if (gmx_strcasecmp(s, gn[i]) == 0)
2635         {
2636             return i;
2637         }
2638     }
2639
2640     gmx_fatal(FARGS, "this QM method or basisset (%s) is not implemented\n!", s);
2641
2642     return -1;
2643
2644 } /* search_QMstring */
2645
2646 /* We would like gn to be const as well, but C doesn't allow this */
2647 /* TODO this is utility functionality (search for the index of a
2648    string in a collection), so should be refactored and located more
2649    centrally. */
2650 int search_string(const char *s, int ng, char *gn[])
2651 {
2652     int i;
2653
2654     for (i = 0; (i < ng); i++)
2655     {
2656         if (gmx_strcasecmp(s, gn[i]) == 0)
2657         {
2658             return i;
2659         }
2660     }
2661
2662     gmx_fatal(FARGS,
2663               "Group %s referenced in the .mdp file was not found in the index file.\n"
2664               "Group names must match either [moleculetype] names or custom index group\n"
2665               "names, in which case you must supply an index file to the '-n' option\n"
2666               "of grompp.",
2667               s);
2668
2669     return -1;
2670 }
2671
2672 static gmx_bool do_numbering(int natoms, gmx_groups_t *groups, int ng, char *ptrs[],
2673                              t_blocka *block, char *gnames[],
2674                              int gtype, int restnm,
2675                              int grptp, gmx_bool bVerbose,
2676                              warninp_t wi)
2677 {
2678     unsigned short *cbuf;
2679     t_grps         *grps = &(groups->grps[gtype]);
2680     int             i, j, gid, aj, ognr, ntot = 0;
2681     const char     *title;
2682     gmx_bool        bRest;
2683     char            warn_buf[STRLEN];
2684
2685     if (debug)
2686     {
2687         fprintf(debug, "Starting numbering %d groups of type %d\n", ng, gtype);
2688     }
2689
2690     title = gtypes[gtype];
2691
2692     snew(cbuf, natoms);
2693     /* Mark all id's as not set */
2694     for (i = 0; (i < natoms); i++)
2695     {
2696         cbuf[i] = NOGID;
2697     }
2698
2699     snew(grps->nm_ind, ng+1); /* +1 for possible rest group */
2700     for (i = 0; (i < ng); i++)
2701     {
2702         /* Lookup the group name in the block structure */
2703         gid = search_string(ptrs[i], block->nr, gnames);
2704         if ((grptp != egrptpONE) || (i == 0))
2705         {
2706             grps->nm_ind[grps->nr++] = gid;
2707         }
2708         if (debug)
2709         {
2710             fprintf(debug, "Found gid %d for group %s\n", gid, ptrs[i]);
2711         }
2712
2713         /* Now go over the atoms in the group */
2714         for (j = block->index[gid]; (j < block->index[gid+1]); j++)
2715         {
2716
2717             aj = block->a[j];
2718
2719             /* Range checking */
2720             if ((aj < 0) || (aj >= natoms))
2721             {
2722                 gmx_fatal(FARGS, "Invalid atom number %d in indexfile", aj);
2723             }
2724             /* Lookup up the old group number */
2725             ognr = cbuf[aj];
2726             if (ognr != NOGID)
2727             {
2728                 gmx_fatal(FARGS, "Atom %d in multiple %s groups (%d and %d)",
2729                           aj+1, title, ognr+1, i+1);
2730             }
2731             else
2732             {
2733                 /* Store the group number in buffer */
2734                 if (grptp == egrptpONE)
2735                 {
2736                     cbuf[aj] = 0;
2737                 }
2738                 else
2739                 {
2740                     cbuf[aj] = i;
2741                 }
2742                 ntot++;
2743             }
2744         }
2745     }
2746
2747     /* Now check whether we have done all atoms */
2748     bRest = FALSE;
2749     if (ntot != natoms)
2750     {
2751         if (grptp == egrptpALL)
2752         {
2753             gmx_fatal(FARGS, "%d atoms are not part of any of the %s groups",
2754                       natoms-ntot, title);
2755         }
2756         else if (grptp == egrptpPART)
2757         {
2758             sprintf(warn_buf, "%d atoms are not part of any of the %s groups",
2759                     natoms-ntot, title);
2760             warning_note(wi, warn_buf);
2761         }
2762         /* Assign all atoms currently unassigned to a rest group */
2763         for (j = 0; (j < natoms); j++)
2764         {
2765             if (cbuf[j] == NOGID)
2766             {
2767                 cbuf[j] = grps->nr;
2768                 bRest   = TRUE;
2769             }
2770         }
2771         if (grptp != egrptpPART)
2772         {
2773             if (bVerbose)
2774             {
2775                 fprintf(stderr,
2776                         "Making dummy/rest group for %s containing %d elements\n",
2777                         title, natoms-ntot);
2778             }
2779             /* Add group name "rest" */
2780             grps->nm_ind[grps->nr] = restnm;
2781
2782             /* Assign the rest name to all atoms not currently assigned to a group */
2783             for (j = 0; (j < natoms); j++)
2784             {
2785                 if (cbuf[j] == NOGID)
2786                 {
2787                     cbuf[j] = grps->nr;
2788                 }
2789             }
2790             grps->nr++;
2791         }
2792     }
2793
2794     if (grps->nr == 1 && (ntot == 0 || ntot == natoms))
2795     {
2796         /* All atoms are part of one (or no) group, no index required */
2797         groups->ngrpnr[gtype] = 0;
2798         groups->grpnr[gtype]  = nullptr;
2799     }
2800     else
2801     {
2802         groups->ngrpnr[gtype] = natoms;
2803         snew(groups->grpnr[gtype], natoms);
2804         for (j = 0; (j < natoms); j++)
2805         {
2806             groups->grpnr[gtype][j] = cbuf[j];
2807         }
2808     }
2809
2810     sfree(cbuf);
2811
2812     return (bRest && grptp == egrptpPART);
2813 }
2814
2815 static void calc_nrdf(gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
2816 {
2817     t_grpopts              *opts;
2818     gmx_groups_t           *groups;
2819     pull_params_t          *pull;
2820     int                     natoms, ai, aj, i, j, d, g, imin, jmin;
2821     t_iatom                *ia;
2822     int                    *nrdf2, *na_vcm, na_tot;
2823     double                 *nrdf_tc, *nrdf_vcm, nrdf_uc, *nrdf_vcm_sub;
2824     ivec                   *dof_vcm;
2825     gmx_mtop_atomloop_all_t aloop;
2826     int                     mb, mol, ftype, as;
2827     gmx_molblock_t         *molb;
2828     gmx_moltype_t          *molt;
2829
2830     /* Calculate nrdf.
2831      * First calc 3xnr-atoms for each group
2832      * then subtract half a degree of freedom for each constraint
2833      *
2834      * Only atoms and nuclei contribute to the degrees of freedom...
2835      */
2836
2837     opts = &ir->opts;
2838
2839     groups = &mtop->groups;
2840     natoms = mtop->natoms;
2841
2842     /* Allocate one more for a possible rest group */
2843     /* We need to sum degrees of freedom into doubles,
2844      * since floats give too low nrdf's above 3 million atoms.
2845      */
2846     snew(nrdf_tc, groups->grps[egcTC].nr+1);
2847     snew(nrdf_vcm, groups->grps[egcVCM].nr+1);
2848     snew(dof_vcm, groups->grps[egcVCM].nr+1);
2849     snew(na_vcm, groups->grps[egcVCM].nr+1);
2850     snew(nrdf_vcm_sub, groups->grps[egcVCM].nr+1);
2851
2852     for (i = 0; i < groups->grps[egcTC].nr; i++)
2853     {
2854         nrdf_tc[i] = 0;
2855     }
2856     for (i = 0; i < groups->grps[egcVCM].nr+1; i++)
2857     {
2858         nrdf_vcm[i]     = 0;
2859         clear_ivec(dof_vcm[i]);
2860         na_vcm[i]       = 0;
2861         nrdf_vcm_sub[i] = 0;
2862     }
2863
2864     snew(nrdf2, natoms);
2865     aloop = gmx_mtop_atomloop_all_init(mtop);
2866     const t_atom *atom;
2867     while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
2868     {
2869         nrdf2[i] = 0;
2870         if (atom->ptype == eptAtom || atom->ptype == eptNucleus)
2871         {
2872             g = ggrpnr(groups, egcFREEZE, i);
2873             for (d = 0; d < DIM; d++)
2874             {
2875                 if (opts->nFreeze[g][d] == 0)
2876                 {
2877                     /* Add one DOF for particle i (counted as 2*1) */
2878                     nrdf2[i]                              += 2;
2879                     /* VCM group i has dim d as a DOF */
2880                     dof_vcm[ggrpnr(groups, egcVCM, i)][d]  = 1;
2881                 }
2882             }
2883             nrdf_tc [ggrpnr(groups, egcTC, i)]  += 0.5*nrdf2[i];
2884             nrdf_vcm[ggrpnr(groups, egcVCM, i)] += 0.5*nrdf2[i];
2885         }
2886     }
2887
2888     as = 0;
2889     for (mb = 0; mb < mtop->nmolblock; mb++)
2890     {
2891         molb = &mtop->molblock[mb];
2892         molt = &mtop->moltype[molb->type];
2893         atom = molt->atoms.atom;
2894         for (mol = 0; mol < molb->nmol; mol++)
2895         {
2896             for (ftype = F_CONSTR; ftype <= F_CONSTRNC; ftype++)
2897             {
2898                 ia = molt->ilist[ftype].iatoms;
2899                 for (i = 0; i < molt->ilist[ftype].nr; )
2900                 {
2901                     /* Subtract degrees of freedom for the constraints,
2902                      * if the particles still have degrees of freedom left.
2903                      * If one of the particles is a vsite or a shell, then all
2904                      * constraint motion will go there, but since they do not
2905                      * contribute to the constraints the degrees of freedom do not
2906                      * change.
2907                      */
2908                     ai = as + ia[1];
2909                     aj = as + ia[2];
2910                     if (((atom[ia[1]].ptype == eptNucleus) ||
2911                          (atom[ia[1]].ptype == eptAtom)) &&
2912                         ((atom[ia[2]].ptype == eptNucleus) ||
2913                          (atom[ia[2]].ptype == eptAtom)))
2914                     {
2915                         if (nrdf2[ai] > 0)
2916                         {
2917                             jmin = 1;
2918                         }
2919                         else
2920                         {
2921                             jmin = 2;
2922                         }
2923                         if (nrdf2[aj] > 0)
2924                         {
2925                             imin = 1;
2926                         }
2927                         else
2928                         {
2929                             imin = 2;
2930                         }
2931                         imin       = std::min(imin, nrdf2[ai]);
2932                         jmin       = std::min(jmin, nrdf2[aj]);
2933                         nrdf2[ai] -= imin;
2934                         nrdf2[aj] -= jmin;
2935                         nrdf_tc [ggrpnr(groups, egcTC, ai)]  -= 0.5*imin;
2936                         nrdf_tc [ggrpnr(groups, egcTC, aj)]  -= 0.5*jmin;
2937                         nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2938                         nrdf_vcm[ggrpnr(groups, egcVCM, aj)] -= 0.5*jmin;
2939                     }
2940                     ia += interaction_function[ftype].nratoms+1;
2941                     i  += interaction_function[ftype].nratoms+1;
2942                 }
2943             }
2944             ia = molt->ilist[F_SETTLE].iatoms;
2945             for (i = 0; i < molt->ilist[F_SETTLE].nr; )
2946             {
2947                 /* Subtract 1 dof from every atom in the SETTLE */
2948                 for (j = 0; j < 3; j++)
2949                 {
2950                     ai         = as + ia[1+j];
2951                     imin       = std::min(2, nrdf2[ai]);
2952                     nrdf2[ai] -= imin;
2953                     nrdf_tc [ggrpnr(groups, egcTC, ai)]  -= 0.5*imin;
2954                     nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2955                 }
2956                 ia += 4;
2957                 i  += 4;
2958             }
2959             as += molt->atoms.nr;
2960         }
2961     }
2962
2963     if (ir->bPull)
2964     {
2965         /* Correct nrdf for the COM constraints.
2966          * We correct using the TC and VCM group of the first atom
2967          * in the reference and pull group. If atoms in one pull group
2968          * belong to different TC or VCM groups it is anyhow difficult
2969          * to determine the optimal nrdf assignment.
2970          */
2971         pull = ir->pull;
2972
2973         for (i = 0; i < pull->ncoord; i++)
2974         {
2975             if (pull->coord[i].eType != epullCONSTRAINT)
2976             {
2977                 continue;
2978             }
2979
2980             imin = 1;
2981
2982             for (j = 0; j < 2; j++)
2983             {
2984                 const t_pull_group *pgrp;
2985
2986                 pgrp = &pull->group[pull->coord[i].group[j]];
2987
2988                 if (pgrp->nat > 0)
2989                 {
2990                     /* Subtract 1/2 dof from each group */
2991                     ai = pgrp->ind[0];
2992                     nrdf_tc [ggrpnr(groups, egcTC, ai)]  -= 0.5*imin;
2993                     nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2994                     if (nrdf_tc[ggrpnr(groups, egcTC, ai)] < 0)
2995                     {
2996                         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)]]);
2997                     }
2998                 }
2999                 else
3000                 {
3001                     /* We need to subtract the whole DOF from group j=1 */
3002                     imin += 1;
3003                 }
3004             }
3005         }
3006     }
3007
3008     if (ir->nstcomm != 0)
3009     {
3010         int ndim_rm_vcm;
3011
3012         /* We remove COM motion up to dim ndof_com() */
3013         ndim_rm_vcm = ndof_com(ir);
3014
3015         /* Subtract ndim_rm_vcm (or less with frozen dimensions) from
3016          * the number of degrees of freedom in each vcm group when COM
3017          * translation is removed and 6 when rotation is removed as well.
3018          */
3019         for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3020         {
3021             switch (ir->comm_mode)
3022             {
3023                 case ecmLINEAR:
3024                     nrdf_vcm_sub[j] = 0;
3025                     for (d = 0; d < ndim_rm_vcm; d++)
3026                     {
3027                         if (dof_vcm[j][d])
3028                         {
3029                             nrdf_vcm_sub[j]++;
3030                         }
3031                     }
3032                     break;
3033                 case ecmANGULAR:
3034                     nrdf_vcm_sub[j] = 6;
3035                     break;
3036                 default:
3037                     gmx_incons("Checking comm_mode");
3038             }
3039         }
3040
3041         for (i = 0; i < groups->grps[egcTC].nr; i++)
3042         {
3043             /* Count the number of atoms of TC group i for every VCM group */
3044             for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3045             {
3046                 na_vcm[j] = 0;
3047             }
3048             na_tot = 0;
3049             for (ai = 0; ai < natoms; ai++)
3050             {
3051                 if (ggrpnr(groups, egcTC, ai) == i)
3052                 {
3053                     na_vcm[ggrpnr(groups, egcVCM, ai)]++;
3054                     na_tot++;
3055                 }
3056             }
3057             /* Correct for VCM removal according to the fraction of each VCM
3058              * group present in this TC group.
3059              */
3060             nrdf_uc = nrdf_tc[i];
3061             if (debug)
3062             {
3063                 fprintf(debug, "T-group[%d] nrdf_uc = %g\n", i, nrdf_uc);
3064             }
3065             nrdf_tc[i] = 0;
3066             for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
3067             {
3068                 if (nrdf_vcm[j] > nrdf_vcm_sub[j])
3069                 {
3070                     nrdf_tc[i] += nrdf_uc*((double)na_vcm[j]/(double)na_tot)*
3071                         (nrdf_vcm[j] - nrdf_vcm_sub[j])/nrdf_vcm[j];
3072                 }
3073                 if (debug)
3074                 {
3075                     fprintf(debug, "  nrdf_vcm[%d] = %g, nrdf = %g\n",
3076                             j, nrdf_vcm[j], nrdf_tc[i]);
3077                 }
3078             }
3079         }
3080     }
3081     for (i = 0; (i < groups->grps[egcTC].nr); i++)
3082     {
3083         opts->nrdf[i] = nrdf_tc[i];
3084         if (opts->nrdf[i] < 0)
3085         {
3086             opts->nrdf[i] = 0;
3087         }
3088         fprintf(stderr,
3089                 "Number of degrees of freedom in T-Coupling group %s is %.2f\n",
3090                 gnames[groups->grps[egcTC].nm_ind[i]], opts->nrdf[i]);
3091     }
3092
3093     sfree(nrdf2);
3094     sfree(nrdf_tc);
3095     sfree(nrdf_vcm);
3096     sfree(dof_vcm);
3097     sfree(na_vcm);
3098     sfree(nrdf_vcm_sub);
3099 }
3100
3101 static gmx_bool do_egp_flag(t_inputrec *ir, gmx_groups_t *groups,
3102                             const char *option, const char *val, int flag)
3103 {
3104     /* The maximum number of energy group pairs would be MAXPTR*(MAXPTR+1)/2.
3105      * But since this is much larger than STRLEN, such a line can not be parsed.
3106      * The real maximum is the number of names that fit in a string: STRLEN/2.
3107      */
3108 #define EGP_MAX (STRLEN/2)
3109     int      nelem, i, j, k, nr;
3110     char    *names[EGP_MAX];
3111     char  ***gnames;
3112     gmx_bool bSet;
3113
3114     gnames = groups->grpname;
3115
3116     nelem = str_nelem(val, EGP_MAX, names);
3117     if (nelem % 2 != 0)
3118     {
3119         gmx_fatal(FARGS, "The number of groups for %s is odd", option);
3120     }
3121     nr   = groups->grps[egcENER].nr;
3122     bSet = FALSE;
3123     for (i = 0; i < nelem/2; i++)
3124     {
3125         j = 0;
3126         while ((j < nr) &&
3127                gmx_strcasecmp(names[2*i], *(gnames[groups->grps[egcENER].nm_ind[j]])))
3128         {
3129             j++;
3130         }
3131         if (j == nr)
3132         {
3133             gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3134                       names[2*i], option);
3135         }
3136         k = 0;
3137         while ((k < nr) &&
3138                gmx_strcasecmp(names[2*i+1], *(gnames[groups->grps[egcENER].nm_ind[k]])))
3139         {
3140             k++;
3141         }
3142         if (k == nr)
3143         {
3144             gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3145                       names[2*i+1], option);
3146         }
3147         if ((j < nr) && (k < nr))
3148         {
3149             ir->opts.egp_flags[nr*j+k] |= flag;
3150             ir->opts.egp_flags[nr*k+j] |= flag;
3151             bSet = TRUE;
3152         }
3153     }
3154
3155     return bSet;
3156 }
3157
3158
3159 static void make_swap_groups(
3160         t_swapcoords  *swap,
3161         t_blocka      *grps,
3162         char         **gnames)
3163 {
3164     int          ig = -1, i = 0, gind;
3165     t_swapGroup *swapg;
3166
3167
3168     /* Just a quick check here, more thorough checks are in mdrun */
3169     if (strcmp(swap->grp[eGrpSplit0].molname, swap->grp[eGrpSplit1].molname) == 0)
3170     {
3171         gmx_fatal(FARGS, "The split groups can not both be '%s'.", swap->grp[eGrpSplit0].molname);
3172     }
3173
3174     /* Get the index atoms of the split0, split1, solvent, and swap groups */
3175     for (ig = 0; ig < swap->ngrp; ig++)
3176     {
3177         swapg      = &swap->grp[ig];
3178         gind       = search_string(swap->grp[ig].molname, grps->nr, gnames);
3179         swapg->nat = grps->index[gind+1] - grps->index[gind];
3180
3181         if (swapg->nat > 0)
3182         {
3183             fprintf(stderr, "%s group '%s' contains %d atoms.\n",
3184                     ig < 3 ? eSwapFixedGrp_names[ig] : "Swap",
3185                     swap->grp[ig].molname, swapg->nat);
3186             snew(swapg->ind, swapg->nat);
3187             for (i = 0; i < swapg->nat; i++)
3188             {
3189                 swapg->ind[i] = grps->a[grps->index[gind]+i];
3190             }
3191         }
3192         else
3193         {
3194             gmx_fatal(FARGS, "Swap group %s does not contain any atoms.", swap->grp[ig].molname);
3195         }
3196     }
3197 }
3198
3199
3200 static void make_IMD_group(t_IMD *IMDgroup, char *IMDgname, t_blocka *grps, char **gnames)
3201 {
3202     int      ig, i;
3203
3204
3205     ig            = search_string(IMDgname, grps->nr, gnames);
3206     IMDgroup->nat = grps->index[ig+1] - grps->index[ig];
3207
3208     if (IMDgroup->nat > 0)
3209     {
3210         fprintf(stderr, "Group '%s' with %d atoms can be activated for interactive molecular dynamics (IMD).\n",
3211                 IMDgname, IMDgroup->nat);
3212         snew(IMDgroup->ind, IMDgroup->nat);
3213         for (i = 0; i < IMDgroup->nat; i++)
3214         {
3215             IMDgroup->ind[i] = grps->a[grps->index[ig]+i];
3216         }
3217     }
3218 }
3219
3220
3221 void do_index(const char* mdparin, const char *ndx,
3222               gmx_mtop_t *mtop,
3223               gmx_bool bVerbose,
3224               t_inputrec *ir,
3225               warninp_t wi)
3226 {
3227     t_blocka     *grps;
3228     gmx_groups_t *groups;
3229     int           natoms;
3230     t_symtab     *symtab;
3231     t_atoms       atoms_all;
3232     char          warnbuf[STRLEN], **gnames;
3233     int           nr, ntcg, ntau_t, nref_t, nacc, nofg, nSA, nSA_points, nSA_time, nSA_temp;
3234     real          tau_min;
3235     int           nstcmin;
3236     int           nacg, nfreeze, nfrdim, nenergy, nvcm, nuser;
3237     char         *ptr1[MAXPTR], *ptr2[MAXPTR], *ptr3[MAXPTR];
3238     int           i, j, k, restnm;
3239     gmx_bool      bExcl, bTable, bSetTCpar, bAnneal, bRest;
3240     int           nQMmethod, nQMbasis, nQMg;
3241     char          warn_buf[STRLEN];
3242     char*         endptr;
3243
3244     if (bVerbose)
3245     {
3246         fprintf(stderr, "processing index file...\n");
3247     }
3248     if (ndx == nullptr)
3249     {
3250         snew(grps, 1);
3251         snew(grps->index, 1);
3252         snew(gnames, 1);
3253         atoms_all = gmx_mtop_global_atoms(mtop);
3254         analyse(&atoms_all, grps, &gnames, FALSE, TRUE);
3255         done_atom(&atoms_all);
3256     }
3257     else
3258     {
3259         grps = init_index(ndx, &gnames);
3260     }
3261
3262     groups = &mtop->groups;
3263     natoms = mtop->natoms;
3264     symtab = &mtop->symtab;
3265
3266     snew(groups->grpname, grps->nr+1);
3267
3268     for (i = 0; (i < grps->nr); i++)
3269     {
3270         groups->grpname[i] = put_symtab(symtab, gnames[i]);
3271     }
3272     groups->grpname[i] = put_symtab(symtab, "rest");
3273     restnm             = i;
3274     srenew(gnames, grps->nr+1);
3275     gnames[restnm]   = *(groups->grpname[i]);
3276     groups->ngrpname = grps->nr+1;
3277
3278     set_warning_line(wi, mdparin, -1);
3279
3280     ntau_t = str_nelem(is->tau_t, MAXPTR, ptr1);
3281     nref_t = str_nelem(is->ref_t, MAXPTR, ptr2);
3282     ntcg   = str_nelem(is->tcgrps, MAXPTR, ptr3);
3283     if ((ntau_t != ntcg) || (nref_t != ntcg))
3284     {
3285         gmx_fatal(FARGS, "Invalid T coupling input: %d groups, %d ref-t values and "
3286                   "%d tau-t values", ntcg, nref_t, ntau_t);
3287     }
3288
3289     bSetTCpar = (ir->etc || EI_SD(ir->eI) || ir->eI == eiBD || EI_TPI(ir->eI));
3290     do_numbering(natoms, groups, ntcg, ptr3, grps, gnames, egcTC,
3291                  restnm, bSetTCpar ? egrptpALL : egrptpALL_GENREST, bVerbose, wi);
3292     nr            = groups->grps[egcTC].nr;
3293     ir->opts.ngtc = nr;
3294     snew(ir->opts.nrdf, nr);
3295     snew(ir->opts.tau_t, nr);
3296     snew(ir->opts.ref_t, nr);
3297     if (ir->eI == eiBD && ir->bd_fric == 0)
3298     {
3299         fprintf(stderr, "bd-fric=0, so tau-t will be used as the inverse friction constant(s)\n");
3300     }
3301
3302     if (bSetTCpar)
3303     {
3304         if (nr != nref_t)
3305         {
3306             gmx_fatal(FARGS, "Not enough ref-t and tau-t values!");
3307         }
3308
3309         tau_min = 1e20;
3310         for (i = 0; (i < nr); i++)
3311         {
3312             ir->opts.tau_t[i] = strtod(ptr1[i], &endptr);
3313             if (*endptr != 0)
3314             {
3315                 warning_error(wi, "Invalid value for mdp option tau-t. tau-t should only consist of real numbers separated by spaces.");
3316             }
3317             if ((ir->eI == eiBD) && ir->opts.tau_t[i] <= 0)
3318             {
3319                 sprintf(warn_buf, "With integrator %s tau-t should be larger than 0", ei_names[ir->eI]);
3320                 warning_error(wi, warn_buf);
3321             }
3322
3323             if (ir->etc != etcVRESCALE && ir->opts.tau_t[i] == 0)
3324             {
3325                 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.");
3326             }
3327
3328             if (ir->opts.tau_t[i] >= 0)
3329             {
3330                 tau_min = std::min(tau_min, ir->opts.tau_t[i]);
3331             }
3332         }
3333         if (ir->etc != etcNO && ir->nsttcouple == -1)
3334         {
3335             ir->nsttcouple = ir_optimal_nsttcouple(ir);
3336         }
3337
3338         if (EI_VV(ir->eI))
3339         {
3340             if ((ir->etc == etcNOSEHOOVER) && (ir->epc == epcBERENDSEN))
3341             {
3342                 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");
3343             }
3344             if (ir->epc == epcMTTK)
3345             {
3346                 if (ir->etc != etcNOSEHOOVER)
3347                 {
3348                     gmx_fatal(FARGS, "Cannot do MTTK pressure coupling without Nose-Hoover temperature control");
3349                 }
3350                 else
3351                 {
3352                     if (ir->nstpcouple != ir->nsttcouple)
3353                     {
3354                         int mincouple = std::min(ir->nstpcouple, ir->nsttcouple);
3355                         ir->nstpcouple = ir->nsttcouple = mincouple;
3356                         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);
3357                         warning_note(wi, warn_buf);
3358                     }
3359                 }
3360             }
3361         }
3362         /* velocity verlet with averaged kinetic energy KE = 0.5*(v(t+1/2) - v(t-1/2)) is implemented
3363            primarily for testing purposes, and does not work with temperature coupling other than 1 */
3364
3365         if (ETC_ANDERSEN(ir->etc))
3366         {
3367             if (ir->nsttcouple != 1)
3368             {
3369                 ir->nsttcouple = 1;
3370                 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");
3371                 warning_note(wi, warn_buf);
3372             }
3373         }
3374         nstcmin = tcouple_min_integration_steps(ir->etc);
3375         if (nstcmin > 1)
3376         {
3377             if (tau_min/(ir->delta_t*ir->nsttcouple) < nstcmin - 10*GMX_REAL_EPS)
3378             {
3379                 sprintf(warn_buf, "For proper integration of the %s thermostat, tau-t (%g) should be at least %d times larger than nsttcouple*dt (%g)",
3380                         ETCOUPLTYPE(ir->etc),
3381                         tau_min, nstcmin,
3382                         ir->nsttcouple*ir->delta_t);
3383                 warning(wi, warn_buf);
3384             }
3385         }
3386         for (i = 0; (i < nr); i++)
3387         {
3388             ir->opts.ref_t[i] = strtod(ptr2[i], &endptr);
3389             if (*endptr != 0)
3390             {
3391                 warning_error(wi, "Invalid value for mdp option ref-t. ref-t should only consist of real numbers separated by spaces.");
3392             }
3393             if (ir->opts.ref_t[i] < 0)
3394             {
3395                 gmx_fatal(FARGS, "ref-t for group %d negative", i);
3396             }
3397         }
3398         /* set the lambda mc temperature to the md integrator temperature (which should be defined
3399            if we are in this conditional) if mc_temp is negative */
3400         if (ir->expandedvals->mc_temp < 0)
3401         {
3402             ir->expandedvals->mc_temp = ir->opts.ref_t[0]; /*for now, set to the first reft */
3403         }
3404     }
3405
3406     /* Simulated annealing for each group. There are nr groups */
3407     nSA = str_nelem(is->anneal, MAXPTR, ptr1);
3408     if (nSA == 1 && (ptr1[0][0] == 'n' || ptr1[0][0] == 'N'))
3409     {
3410         nSA = 0;
3411     }
3412     if (nSA > 0 && nSA != nr)
3413     {
3414         gmx_fatal(FARGS, "Not enough annealing values: %d (for %d groups)\n", nSA, nr);
3415     }
3416     else
3417     {
3418         snew(ir->opts.annealing, nr);
3419         snew(ir->opts.anneal_npoints, nr);
3420         snew(ir->opts.anneal_time, nr);
3421         snew(ir->opts.anneal_temp, nr);
3422         for (i = 0; i < nr; i++)
3423         {
3424             ir->opts.annealing[i]      = eannNO;
3425             ir->opts.anneal_npoints[i] = 0;
3426             ir->opts.anneal_time[i]    = nullptr;
3427             ir->opts.anneal_temp[i]    = nullptr;
3428         }
3429         if (nSA > 0)
3430         {
3431             bAnneal = FALSE;
3432             for (i = 0; i < nr; i++)
3433             {
3434                 if (ptr1[i][0] == 'n' || ptr1[i][0] == 'N')
3435                 {
3436                     ir->opts.annealing[i] = eannNO;
3437                 }
3438                 else if (ptr1[i][0] == 's' || ptr1[i][0] == 'S')
3439                 {
3440                     ir->opts.annealing[i] = eannSINGLE;
3441                     bAnneal               = TRUE;
3442                 }
3443                 else if (ptr1[i][0] == 'p' || ptr1[i][0] == 'P')
3444                 {
3445                     ir->opts.annealing[i] = eannPERIODIC;
3446                     bAnneal               = TRUE;
3447                 }
3448             }
3449             if (bAnneal)
3450             {
3451                 /* Read the other fields too */
3452                 nSA_points = str_nelem(is->anneal_npoints, MAXPTR, ptr1);
3453                 if (nSA_points != nSA)
3454                 {
3455                     gmx_fatal(FARGS, "Found %d annealing-npoints values for %d groups\n", nSA_points, nSA);
3456                 }
3457                 for (k = 0, i = 0; i < nr; i++)
3458                 {
3459                     ir->opts.anneal_npoints[i] = strtol(ptr1[i], &endptr, 10);
3460                     if (*endptr != 0)
3461                     {
3462                         warning_error(wi, "Invalid value for mdp option annealing-npoints. annealing should only consist of integers separated by spaces.");
3463                     }
3464                     if (ir->opts.anneal_npoints[i] == 1)
3465                     {
3466                         gmx_fatal(FARGS, "Please specify at least a start and an end point for annealing\n");
3467                     }
3468                     snew(ir->opts.anneal_time[i], ir->opts.anneal_npoints[i]);
3469                     snew(ir->opts.anneal_temp[i], ir->opts.anneal_npoints[i]);
3470                     k += ir->opts.anneal_npoints[i];
3471                 }
3472
3473                 nSA_time = str_nelem(is->anneal_time, MAXPTR, ptr1);
3474                 if (nSA_time != k)
3475                 {
3476                     gmx_fatal(FARGS, "Found %d annealing-time values, wanted %d\n", nSA_time, k);
3477                 }
3478                 nSA_temp = str_nelem(is->anneal_temp, MAXPTR, ptr2);
3479                 if (nSA_temp != k)
3480                 {
3481                     gmx_fatal(FARGS, "Found %d annealing-temp values, wanted %d\n", nSA_temp, k);
3482                 }
3483
3484                 for (i = 0, k = 0; i < nr; i++)
3485                 {
3486
3487                     for (j = 0; j < ir->opts.anneal_npoints[i]; j++)
3488                     {
3489                         ir->opts.anneal_time[i][j] = strtod(ptr1[k], &endptr);
3490                         if (*endptr != 0)
3491                         {
3492                             warning_error(wi, "Invalid value for mdp option anneal-time. anneal-time should only consist of real numbers separated by spaces.");
3493                         }
3494                         ir->opts.anneal_temp[i][j] = strtod(ptr2[k], &endptr);
3495                         if (*endptr != 0)
3496                         {
3497                             warning_error(wi, "Invalid value for anneal-temp. anneal-temp should only consist of real numbers separated by spaces.");
3498                         }
3499                         if (j == 0)
3500                         {
3501                             if (ir->opts.anneal_time[i][0] > (ir->init_t+GMX_REAL_EPS))
3502                             {
3503                                 gmx_fatal(FARGS, "First time point for annealing > init_t.\n");
3504                             }
3505                         }
3506                         else
3507                         {
3508                             /* j>0 */
3509                             if (ir->opts.anneal_time[i][j] < ir->opts.anneal_time[i][j-1])
3510                             {
3511                                 gmx_fatal(FARGS, "Annealing timepoints out of order: t=%f comes after t=%f\n",
3512                                           ir->opts.anneal_time[i][j], ir->opts.anneal_time[i][j-1]);
3513                             }
3514                         }
3515                         if (ir->opts.anneal_temp[i][j] < 0)
3516                         {
3517                             gmx_fatal(FARGS, "Found negative temperature in annealing: %f\n", ir->opts.anneal_temp[i][j]);
3518                         }
3519                         k++;
3520                     }
3521                 }
3522                 /* Print out some summary information, to make sure we got it right */
3523                 for (i = 0, k = 0; i < nr; i++)
3524                 {
3525                     if (ir->opts.annealing[i] != eannNO)
3526                     {
3527                         j = groups->grps[egcTC].nm_ind[i];
3528                         fprintf(stderr, "Simulated annealing for group %s: %s, %d timepoints\n",
3529                                 *(groups->grpname[j]), eann_names[ir->opts.annealing[i]],
3530                                 ir->opts.anneal_npoints[i]);
3531                         fprintf(stderr, "Time (ps)   Temperature (K)\n");
3532                         /* All terms except the last one */
3533                         for (j = 0; j < (ir->opts.anneal_npoints[i]-1); j++)
3534                         {
3535                             fprintf(stderr, "%9.1f      %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3536                         }
3537
3538                         /* Finally the last one */
3539                         j = ir->opts.anneal_npoints[i]-1;
3540                         if (ir->opts.annealing[i] == eannSINGLE)
3541                         {
3542                             fprintf(stderr, "%9.1f-     %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3543                         }
3544                         else
3545                         {
3546                             fprintf(stderr, "%9.1f      %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3547                             if (fabs(ir->opts.anneal_temp[i][j]-ir->opts.anneal_temp[i][0]) > GMX_REAL_EPS)
3548                             {
3549                                 warning_note(wi, "There is a temperature jump when your annealing loops back.\n");
3550                             }
3551                         }
3552                     }
3553                 }
3554             }
3555         }
3556     }
3557
3558     if (ir->bPull)
3559     {
3560         make_pull_groups(ir->pull, is->pull_grp, grps, gnames);
3561
3562         make_pull_coords(ir->pull);
3563     }
3564
3565     if (ir->bRot)
3566     {
3567         make_rotation_groups(ir->rot, is->rot_grp, grps, gnames);
3568     }
3569
3570     if (ir->eSwapCoords != eswapNO)
3571     {
3572         make_swap_groups(ir->swap, grps, gnames);
3573     }
3574
3575     /* Make indices for IMD session */
3576     if (ir->bIMD)
3577     {
3578         make_IMD_group(ir->imd, is->imd_grp, grps, gnames);
3579     }
3580
3581     nacc = str_nelem(is->acc, MAXPTR, ptr1);
3582     nacg = str_nelem(is->accgrps, MAXPTR, ptr2);
3583     if (nacg*DIM != nacc)
3584     {
3585         gmx_fatal(FARGS, "Invalid Acceleration input: %d groups and %d acc. values",
3586                   nacg, nacc);
3587     }
3588     do_numbering(natoms, groups, nacg, ptr2, grps, gnames, egcACC,
3589                  restnm, egrptpALL_GENREST, bVerbose, wi);
3590     nr = groups->grps[egcACC].nr;
3591     snew(ir->opts.acc, nr);
3592     ir->opts.ngacc = nr;
3593
3594     for (i = k = 0; (i < nacg); i++)
3595     {
3596         for (j = 0; (j < DIM); j++, k++)
3597         {
3598             ir->opts.acc[i][j] = strtod(ptr1[k], &endptr);
3599             if (*endptr != 0)
3600             {
3601                 warning_error(wi, "Invalid value for mdp option accelerate. accelerate should only consist of real numbers separated by spaces.");
3602             }
3603         }
3604     }
3605     for (; (i < nr); i++)
3606     {
3607         for (j = 0; (j < DIM); j++)
3608         {
3609             ir->opts.acc[i][j] = 0;
3610         }
3611     }
3612
3613     nfrdim  = str_nelem(is->frdim, MAXPTR, ptr1);
3614     nfreeze = str_nelem(is->freeze, MAXPTR, ptr2);
3615     if (nfrdim != DIM*nfreeze)
3616     {
3617         gmx_fatal(FARGS, "Invalid Freezing input: %d groups and %d freeze values",
3618                   nfreeze, nfrdim);
3619     }
3620     do_numbering(natoms, groups, nfreeze, ptr2, grps, gnames, egcFREEZE,
3621                  restnm, egrptpALL_GENREST, bVerbose, wi);
3622     nr             = groups->grps[egcFREEZE].nr;
3623     ir->opts.ngfrz = nr;
3624     snew(ir->opts.nFreeze, nr);
3625     for (i = k = 0; (i < nfreeze); i++)
3626     {
3627         for (j = 0; (j < DIM); j++, k++)
3628         {
3629             ir->opts.nFreeze[i][j] = (gmx_strncasecmp(ptr1[k], "Y", 1) == 0);
3630             if (!ir->opts.nFreeze[i][j])
3631             {
3632                 if (gmx_strncasecmp(ptr1[k], "N", 1) != 0)
3633                 {
3634                     sprintf(warnbuf, "Please use Y(ES) or N(O) for freezedim only "
3635                             "(not %s)", ptr1[k]);
3636                     warning(wi, warn_buf);
3637                 }
3638             }
3639         }
3640     }
3641     for (; (i < nr); i++)
3642     {
3643         for (j = 0; (j < DIM); j++)
3644         {
3645             ir->opts.nFreeze[i][j] = 0;
3646         }
3647     }
3648
3649     nenergy = str_nelem(is->energy, MAXPTR, ptr1);
3650     do_numbering(natoms, groups, nenergy, ptr1, grps, gnames, egcENER,
3651                  restnm, egrptpALL_GENREST, bVerbose, wi);
3652     add_wall_energrps(groups, ir->nwall, symtab);
3653     ir->opts.ngener = groups->grps[egcENER].nr;
3654     nvcm            = str_nelem(is->vcm, MAXPTR, ptr1);
3655     bRest           =
3656         do_numbering(natoms, groups, nvcm, ptr1, grps, gnames, egcVCM,
3657                      restnm, nvcm == 0 ? egrptpALL_GENREST : egrptpPART, bVerbose, wi);
3658     if (bRest)
3659     {
3660         warning(wi, "Some atoms are not part of any center of mass motion removal group.\n"
3661                 "This may lead to artifacts.\n"
3662                 "In most cases one should use one group for the whole system.");
3663     }
3664
3665     /* Now we have filled the freeze struct, so we can calculate NRDF */
3666     calc_nrdf(mtop, ir, gnames);
3667
3668     nuser = str_nelem(is->user1, MAXPTR, ptr1);
3669     do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser1,
3670                  restnm, egrptpALL_GENREST, bVerbose, wi);
3671     nuser = str_nelem(is->user2, MAXPTR, ptr1);
3672     do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser2,
3673                  restnm, egrptpALL_GENREST, bVerbose, wi);
3674     nuser = str_nelem(is->x_compressed_groups, MAXPTR, ptr1);
3675     do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcCompressedX,
3676                  restnm, egrptpONE, bVerbose, wi);
3677     nofg = str_nelem(is->orirefitgrp, MAXPTR, ptr1);
3678     do_numbering(natoms, groups, nofg, ptr1, grps, gnames, egcORFIT,
3679                  restnm, egrptpALL_GENREST, bVerbose, wi);
3680
3681     /* QMMM input processing */
3682     nQMg          = str_nelem(is->QMMM, MAXPTR, ptr1);
3683     nQMmethod     = str_nelem(is->QMmethod, MAXPTR, ptr2);
3684     nQMbasis      = str_nelem(is->QMbasis, MAXPTR, ptr3);
3685     if ((nQMmethod != nQMg) || (nQMbasis != nQMg))
3686     {
3687         gmx_fatal(FARGS, "Invalid QMMM input: %d groups %d basissets"
3688                   " and %d methods\n", nQMg, nQMbasis, nQMmethod);
3689     }
3690     /* group rest, if any, is always MM! */
3691     do_numbering(natoms, groups, nQMg, ptr1, grps, gnames, egcQMMM,
3692                  restnm, egrptpALL_GENREST, bVerbose, wi);
3693     nr            = nQMg; /*atoms->grps[egcQMMM].nr;*/
3694     ir->opts.ngQM = nQMg;
3695     snew(ir->opts.QMmethod, nr);
3696     snew(ir->opts.QMbasis, nr);
3697     for (i = 0; i < nr; i++)
3698     {
3699         /* input consists of strings: RHF CASSCF PM3 .. These need to be
3700          * converted to the corresponding enum in names.c
3701          */
3702         ir->opts.QMmethod[i] = search_QMstring(ptr2[i], eQMmethodNR,
3703                                                eQMmethod_names);
3704         ir->opts.QMbasis[i]  = search_QMstring(ptr3[i], eQMbasisNR,
3705                                                eQMbasis_names);
3706
3707     }
3708     str_nelem(is->QMmult, MAXPTR, ptr1);
3709     str_nelem(is->QMcharge, MAXPTR, ptr2);
3710     str_nelem(is->bSH, MAXPTR, ptr3);
3711     snew(ir->opts.QMmult, nr);
3712     snew(ir->opts.QMcharge, nr);
3713     snew(ir->opts.bSH, nr);
3714
3715     for (i = 0; i < nr; i++)
3716     {
3717         ir->opts.QMmult[i]   = strtol(ptr1[i], &endptr, 10);
3718         if (*endptr != 0)
3719         {
3720             warning_error(wi, "Invalid value for mdp option QMmult. QMmult should only consist of integers separated by spaces.");
3721         }
3722         ir->opts.QMcharge[i] = strtol(ptr2[i], &endptr, 10);
3723         if (*endptr != 0)
3724         {
3725             warning_error(wi, "Invalid value for mdp option QMcharge. QMcharge should only consist of integers separated by spaces.");
3726         }
3727         ir->opts.bSH[i]      = (gmx_strncasecmp(ptr3[i], "Y", 1) == 0);
3728     }
3729
3730     str_nelem(is->CASelectrons, MAXPTR, ptr1);
3731     str_nelem(is->CASorbitals, MAXPTR, ptr2);
3732     snew(ir->opts.CASelectrons, nr);
3733     snew(ir->opts.CASorbitals, nr);
3734     for (i = 0; i < nr; i++)
3735     {
3736         ir->opts.CASelectrons[i] = strtol(ptr1[i], &endptr, 10);
3737         if (*endptr != 0)
3738         {
3739             warning_error(wi, "Invalid value for mdp option CASelectrons. CASelectrons should only consist of integers separated by spaces.");
3740         }
3741         ir->opts.CASorbitals[i]  = strtol(ptr2[i], &endptr, 10);
3742         if (*endptr != 0)
3743         {
3744             warning_error(wi, "Invalid value for mdp option CASorbitals. CASorbitals should only consist of integers separated by spaces.");
3745         }
3746     }
3747     /* special optimization options */
3748
3749     str_nelem(is->bOPT, MAXPTR, ptr1);
3750     str_nelem(is->bTS, MAXPTR, ptr2);
3751     snew(ir->opts.bOPT, nr);
3752     snew(ir->opts.bTS, nr);
3753     for (i = 0; i < nr; i++)
3754     {
3755         ir->opts.bOPT[i] = (gmx_strncasecmp(ptr1[i], "Y", 1) == 0);
3756         ir->opts.bTS[i]  = (gmx_strncasecmp(ptr2[i], "Y", 1) == 0);
3757     }
3758     str_nelem(is->SAon, MAXPTR, ptr1);
3759     str_nelem(is->SAoff, MAXPTR, ptr2);
3760     str_nelem(is->SAsteps, MAXPTR, ptr3);
3761     snew(ir->opts.SAon, nr);
3762     snew(ir->opts.SAoff, nr);
3763     snew(ir->opts.SAsteps, nr);
3764
3765     for (i = 0; i < nr; i++)
3766     {
3767         ir->opts.SAon[i]    = strtod(ptr1[i], &endptr);
3768         if (*endptr != 0)
3769         {
3770             warning_error(wi, "Invalid value for mdp option SAon. SAon should only consist of real numbers separated by spaces.");
3771         }
3772         ir->opts.SAoff[i]   = strtod(ptr2[i], &endptr);
3773         if (*endptr != 0)
3774         {
3775             warning_error(wi, "Invalid value for mdp option SAoff. SAoff should only consist of real numbers separated by spaces.");
3776         }
3777         ir->opts.SAsteps[i] = strtol(ptr3[i], &endptr, 10);
3778         if (*endptr != 0)
3779         {
3780             warning_error(wi, "Invalid value for mdp option SAsteps. SAsteps should only consist of integers separated by spaces.");
3781         }
3782     }
3783     /* end of QMMM input */
3784
3785     if (bVerbose)
3786     {
3787         for (i = 0; (i < egcNR); i++)
3788         {
3789             fprintf(stderr, "%-16s has %d element(s):", gtypes[i], groups->grps[i].nr);
3790             for (j = 0; (j < groups->grps[i].nr); j++)
3791             {
3792                 fprintf(stderr, " %s", *(groups->grpname[groups->grps[i].nm_ind[j]]));
3793             }
3794             fprintf(stderr, "\n");
3795         }
3796     }
3797
3798     nr = groups->grps[egcENER].nr;
3799     snew(ir->opts.egp_flags, nr*nr);
3800
3801     bExcl = do_egp_flag(ir, groups, "energygrp-excl", is->egpexcl, EGP_EXCL);
3802     if (bExcl && ir->cutoff_scheme == ecutsVERLET)
3803     {
3804         warning_error(wi, "Energy group exclusions are not (yet) implemented for the Verlet scheme");
3805     }
3806     if (bExcl && EEL_FULL(ir->coulombtype))
3807     {
3808         warning(wi, "Can not exclude the lattice Coulomb energy between energy groups");
3809     }
3810
3811     bTable = do_egp_flag(ir, groups, "energygrp-table", is->egptable, EGP_TABLE);
3812     if (bTable && !(ir->vdwtype == evdwUSER) &&
3813         !(ir->coulombtype == eelUSER) && !(ir->coulombtype == eelPMEUSER) &&
3814         !(ir->coulombtype == eelPMEUSERSWITCH))
3815     {
3816         gmx_fatal(FARGS, "Can only have energy group pair tables in combination with user tables for VdW and/or Coulomb");
3817     }
3818
3819     for (i = 0; (i < grps->nr); i++)
3820     {
3821         sfree(gnames[i]);
3822     }
3823     sfree(gnames);
3824     done_blocka(grps);
3825     sfree(grps);
3826
3827 }
3828
3829
3830
3831 static void check_disre(gmx_mtop_t *mtop)
3832 {
3833     gmx_ffparams_t *ffparams;
3834     t_functype     *functype;
3835     t_iparams      *ip;
3836     int             i, ndouble, ftype;
3837     int             label, old_label;
3838
3839     if (gmx_mtop_ftype_count(mtop, F_DISRES) > 0)
3840     {
3841         ffparams  = &mtop->ffparams;
3842         functype  = ffparams->functype;
3843         ip        = ffparams->iparams;
3844         ndouble   = 0;
3845         old_label = -1;
3846         for (i = 0; i < ffparams->ntypes; i++)
3847         {
3848             ftype = functype[i];
3849             if (ftype == F_DISRES)
3850             {
3851                 label = ip[i].disres.label;
3852                 if (label == old_label)
3853                 {
3854                     fprintf(stderr, "Distance restraint index %d occurs twice\n", label);
3855                     ndouble++;
3856                 }
3857                 old_label = label;
3858             }
3859         }
3860         if (ndouble > 0)
3861         {
3862             gmx_fatal(FARGS, "Found %d double distance restraint indices,\n"
3863                       "probably the parameters for multiple pairs in one restraint "
3864                       "are not identical\n", ndouble);
3865         }
3866     }
3867 }
3868
3869 static gmx_bool absolute_reference(t_inputrec *ir, gmx_mtop_t *sys,
3870                                    gmx_bool posres_only,
3871                                    ivec AbsRef)
3872 {
3873     int                  d, g, i;
3874     gmx_mtop_ilistloop_t iloop;
3875     t_ilist             *ilist;
3876     int                  nmol;
3877     t_iparams           *pr;
3878
3879     clear_ivec(AbsRef);
3880
3881     if (!posres_only)
3882     {
3883         /* Check the COM */
3884         for (d = 0; d < DIM; d++)
3885         {
3886             AbsRef[d] = (d < ndof_com(ir) ? 0 : 1);
3887         }
3888         /* Check for freeze groups */
3889         for (g = 0; g < ir->opts.ngfrz; g++)
3890         {
3891             for (d = 0; d < DIM; d++)
3892             {
3893                 if (ir->opts.nFreeze[g][d] != 0)
3894                 {
3895                     AbsRef[d] = 1;
3896                 }
3897             }
3898         }
3899     }
3900
3901     /* Check for position restraints */
3902     iloop = gmx_mtop_ilistloop_init(sys);
3903     while (gmx_mtop_ilistloop_next(iloop, &ilist, &nmol))
3904     {
3905         if (nmol > 0 &&
3906             (AbsRef[XX] == 0 || AbsRef[YY] == 0 || AbsRef[ZZ] == 0))
3907         {
3908             for (i = 0; i < ilist[F_POSRES].nr; i += 2)
3909             {
3910                 pr = &sys->ffparams.iparams[ilist[F_POSRES].iatoms[i]];
3911                 for (d = 0; d < DIM; d++)
3912                 {
3913                     if (pr->posres.fcA[d] != 0)
3914                     {
3915                         AbsRef[d] = 1;
3916                     }
3917                 }
3918             }
3919             for (i = 0; i < ilist[F_FBPOSRES].nr; i += 2)
3920             {
3921                 /* Check for flat-bottom posres */
3922                 pr = &sys->ffparams.iparams[ilist[F_FBPOSRES].iatoms[i]];
3923                 if (pr->fbposres.k != 0)
3924                 {
3925                     switch (pr->fbposres.geom)
3926                     {
3927                         case efbposresSPHERE:
3928                             AbsRef[XX] = AbsRef[YY] = AbsRef[ZZ] = 1;
3929                             break;
3930                         case efbposresCYLINDERX:
3931                             AbsRef[YY] = AbsRef[ZZ] = 1;
3932                             break;
3933                         case efbposresCYLINDERY:
3934                             AbsRef[XX] = AbsRef[ZZ] = 1;
3935                             break;
3936                         case efbposresCYLINDER:
3937                         /* efbposres is a synonym for efbposresCYLINDERZ for backwards compatibility */
3938                         case efbposresCYLINDERZ:
3939                             AbsRef[XX] = AbsRef[YY] = 1;
3940                             break;
3941                         case efbposresX: /* d=XX */
3942                         case efbposresY: /* d=YY */
3943                         case efbposresZ: /* d=ZZ */
3944                             d         = pr->fbposres.geom - efbposresX;
3945                             AbsRef[d] = 1;
3946                             break;
3947                         default:
3948                             gmx_fatal(FARGS, " Invalid geometry for flat-bottom position restraint.\n"
3949                                       "Expected nr between 1 and %d. Found %d\n", efbposresNR-1,
3950                                       pr->fbposres.geom);
3951                     }
3952                 }
3953             }
3954         }
3955     }
3956
3957     return (AbsRef[XX] != 0 && AbsRef[YY] != 0 && AbsRef[ZZ] != 0);
3958 }
3959
3960 static void
3961 check_combination_rule_differences(const gmx_mtop_t *mtop, int state,
3962                                    gmx_bool *bC6ParametersWorkWithGeometricRules,
3963                                    gmx_bool *bC6ParametersWorkWithLBRules,
3964                                    gmx_bool *bLBRulesPossible)
3965 {
3966     int           ntypes, tpi, tpj;
3967     int          *typecount;
3968     real          tol;
3969     double        c6i, c6j, c12i, c12j;
3970     double        c6, c6_geometric, c6_LB;
3971     double        sigmai, sigmaj, epsi, epsj;
3972     gmx_bool      bCanDoLBRules, bCanDoGeometricRules;
3973     const char   *ptr;
3974
3975     /* A tolerance of 1e-5 seems reasonable for (possibly hand-typed)
3976      * force-field floating point parameters.
3977      */
3978     tol = 1e-5;
3979     ptr = getenv("GMX_LJCOMB_TOL");
3980     if (ptr != nullptr)
3981     {
3982         double            dbl;
3983         double gmx_unused canary;
3984
3985         if (sscanf(ptr, "%lf%lf", &dbl, &canary) != 1)
3986         {
3987             gmx_fatal(FARGS, "Could not parse a single floating-point number from GMX_LJCOMB_TOL (%s)", ptr);
3988         }
3989         tol = dbl;
3990     }
3991
3992     *bC6ParametersWorkWithLBRules         = TRUE;
3993     *bC6ParametersWorkWithGeometricRules  = TRUE;
3994     bCanDoLBRules                         = TRUE;
3995     ntypes                                = mtop->ffparams.atnr;
3996     snew(typecount, ntypes);
3997     gmx_mtop_count_atomtypes(mtop, state, typecount);
3998     *bLBRulesPossible       = TRUE;
3999     for (tpi = 0; tpi < ntypes; ++tpi)
4000     {
4001         c6i  = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c6;
4002         c12i = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c12;
4003         for (tpj = tpi; tpj < ntypes; ++tpj)
4004         {
4005             c6j          = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c6;
4006             c12j         = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c12;
4007             c6           = mtop->ffparams.iparams[ntypes * tpi + tpj].lj.c6;
4008             c6_geometric = std::sqrt(c6i * c6j);
4009             if (!gmx_numzero(c6_geometric))
4010             {
4011                 if (!gmx_numzero(c12i) && !gmx_numzero(c12j))
4012                 {
4013                     sigmai   = gmx::sixthroot(c12i / c6i);
4014                     sigmaj   = gmx::sixthroot(c12j / c6j);
4015                     epsi     = c6i * c6i /(4.0 * c12i);
4016                     epsj     = c6j * c6j /(4.0 * c12j);
4017                     c6_LB    = 4.0 * std::sqrt(epsi * epsj) * gmx::power6(0.5 * (sigmai + sigmaj));
4018                 }
4019                 else
4020                 {
4021                     *bLBRulesPossible = FALSE;
4022                     c6_LB             = c6_geometric;
4023                 }
4024                 bCanDoLBRules = gmx_within_tol(c6_LB, c6, tol);
4025             }
4026
4027             if (FALSE == bCanDoLBRules)
4028             {
4029                 *bC6ParametersWorkWithLBRules = FALSE;
4030             }
4031
4032             bCanDoGeometricRules = gmx_within_tol(c6_geometric, c6, tol);
4033
4034             if (FALSE == bCanDoGeometricRules)
4035             {
4036                 *bC6ParametersWorkWithGeometricRules = FALSE;
4037             }
4038         }
4039     }
4040     sfree(typecount);
4041 }
4042
4043 static void
4044 check_combination_rules(const t_inputrec *ir, const gmx_mtop_t *mtop,
4045                         warninp_t wi)
4046 {
4047     gmx_bool bLBRulesPossible, bC6ParametersWorkWithGeometricRules, bC6ParametersWorkWithLBRules;
4048
4049     check_combination_rule_differences(mtop, 0,
4050                                        &bC6ParametersWorkWithGeometricRules,
4051                                        &bC6ParametersWorkWithLBRules,
4052                                        &bLBRulesPossible);
4053     if (ir->ljpme_combination_rule == eljpmeLB)
4054     {
4055         if (FALSE == bC6ParametersWorkWithLBRules || FALSE == bLBRulesPossible)
4056         {
4057             warning(wi, "You are using arithmetic-geometric combination rules "
4058                     "in LJ-PME, but your non-bonded C6 parameters do not "
4059                     "follow these rules.");
4060         }
4061     }
4062     else
4063     {
4064         if (FALSE == bC6ParametersWorkWithGeometricRules)
4065         {
4066             if (ir->eDispCorr != edispcNO)
4067             {
4068                 warning_note(wi, "You are using geometric combination rules in "
4069                              "LJ-PME, but your non-bonded C6 parameters do "
4070                              "not follow these rules. "
4071                              "This will introduce very small errors in the forces and energies in "
4072                              "your simulations. Dispersion correction will correct total energy "
4073                              "and/or pressure for isotropic systems, but not forces or surface tensions.");
4074             }
4075             else
4076             {
4077                 warning_note(wi, "You are using geometric combination rules in "
4078                              "LJ-PME, but your non-bonded C6 parameters do "
4079                              "not follow these rules. "
4080                              "This will introduce very small errors in the forces and energies in "
4081                              "your simulations. If your system is homogeneous, consider using dispersion correction "
4082                              "for the total energy and pressure.");
4083             }
4084         }
4085     }
4086 }
4087
4088 void triple_check(const char *mdparin, t_inputrec *ir, gmx_mtop_t *sys,
4089                   warninp_t wi)
4090 {
4091     char                      err_buf[STRLEN];
4092     int                       i, m, c, nmol;
4093     gmx_bool                  bCharge, bAcc;
4094     real                     *mgrp, mt;
4095     rvec                      acc;
4096     gmx_mtop_atomloop_block_t aloopb;
4097     gmx_mtop_atomloop_all_t   aloop;
4098     ivec                      AbsRef;
4099     char                      warn_buf[STRLEN];
4100
4101     set_warning_line(wi, mdparin, -1);
4102
4103     if (ir->cutoff_scheme == ecutsVERLET &&
4104         ir->verletbuf_tol > 0 &&
4105         ir->nstlist > 1 &&
4106         ((EI_MD(ir->eI) || EI_SD(ir->eI)) &&
4107          (ir->etc == etcVRESCALE || ir->etc == etcBERENDSEN)))
4108     {
4109         /* Check if a too small Verlet buffer might potentially
4110          * cause more drift than the thermostat can couple off.
4111          */
4112         /* Temperature error fraction for warning and suggestion */
4113         const real T_error_warn    = 0.002;
4114         const real T_error_suggest = 0.001;
4115         /* For safety: 2 DOF per atom (typical with constraints) */
4116         const real nrdf_at         = 2;
4117         real       T, tau, max_T_error;
4118         int        i;
4119
4120         T   = 0;
4121         tau = 0;
4122         for (i = 0; i < ir->opts.ngtc; i++)
4123         {
4124             T   = std::max(T, ir->opts.ref_t[i]);
4125             tau = std::max(tau, ir->opts.tau_t[i]);
4126         }
4127         if (T > 0)
4128         {
4129             /* This is a worst case estimate of the temperature error,
4130              * assuming perfect buffer estimation and no cancelation
4131              * of errors. The factor 0.5 is because energy distributes
4132              * equally over Ekin and Epot.
4133              */
4134             max_T_error = 0.5*tau*ir->verletbuf_tol/(nrdf_at*BOLTZ*T);
4135             if (max_T_error > T_error_warn)
4136             {
4137                 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.",
4138                         ir->verletbuf_tol, T, tau,
4139                         100*max_T_error,
4140                         100*T_error_suggest,
4141                         ir->verletbuf_tol*T_error_suggest/max_T_error);
4142                 warning(wi, warn_buf);
4143             }
4144         }
4145     }
4146
4147     if (ETC_ANDERSEN(ir->etc))
4148     {
4149         int i;
4150
4151         for (i = 0; i < ir->opts.ngtc; i++)
4152         {
4153             sprintf(err_buf, "all tau_t must currently be equal using Andersen temperature control, violated for group %d", i);
4154             CHECK(ir->opts.tau_t[0] != ir->opts.tau_t[i]);
4155             sprintf(err_buf, "all tau_t must be positive using Andersen temperature control, tau_t[%d]=%10.6f",
4156                     i, ir->opts.tau_t[i]);
4157             CHECK(ir->opts.tau_t[i] < 0);
4158         }
4159
4160         for (i = 0; i < ir->opts.ngtc; i++)
4161         {
4162             int nsteps = (int)(ir->opts.tau_t[i]/ir->delta_t);
4163             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);
4164             CHECK((nsteps % ir->nstcomm) && (ir->etc == etcANDERSENMASSIVE));
4165         }
4166     }
4167
4168     if (EI_DYNAMICS(ir->eI) && !EI_SD(ir->eI) && ir->eI != eiBD &&
4169         ir->comm_mode == ecmNO &&
4170         !(absolute_reference(ir, sys, FALSE, AbsRef) || ir->nsteps <= 10) &&
4171         !ETC_ANDERSEN(ir->etc))
4172     {
4173         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");
4174     }
4175
4176     /* Check for pressure coupling with absolute position restraints */
4177     if (ir->epc != epcNO && ir->refcoord_scaling == erscNO)
4178     {
4179         absolute_reference(ir, sys, TRUE, AbsRef);
4180         {
4181             for (m = 0; m < DIM; m++)
4182             {
4183                 if (AbsRef[m] && norm2(ir->compress[m]) > 0)
4184                 {
4185                     warning(wi, "You are using pressure coupling with absolute position restraints, this will give artifacts. Use the refcoord_scaling option.");
4186                     break;
4187                 }
4188             }
4189         }
4190     }
4191
4192     bCharge = FALSE;
4193     aloopb  = gmx_mtop_atomloop_block_init(sys);
4194     const t_atom *atom;
4195     while (gmx_mtop_atomloop_block_next(aloopb, &atom, &nmol))
4196     {
4197         if (atom->q != 0 || atom->qB != 0)
4198         {
4199             bCharge = TRUE;
4200         }
4201     }
4202
4203     if (!bCharge)
4204     {
4205         if (EEL_FULL(ir->coulombtype))
4206         {
4207             sprintf(err_buf,
4208                     "You are using full electrostatics treatment %s for a system without charges.\n"
4209                     "This costs a lot of performance for just processing zeros, consider using %s instead.\n",
4210                     EELTYPE(ir->coulombtype), EELTYPE(eelCUT));
4211             warning(wi, err_buf);
4212         }
4213     }
4214     else
4215     {
4216         if (ir->coulombtype == eelCUT && ir->rcoulomb > 0 && !ir->implicit_solvent)
4217         {
4218             sprintf(err_buf,
4219                     "You are using a plain Coulomb cut-off, which might produce artifacts.\n"
4220                     "You might want to consider using %s electrostatics.\n",
4221                     EELTYPE(eelPME));
4222             warning_note(wi, err_buf);
4223         }
4224     }
4225
4226     /* Check if combination rules used in LJ-PME are the same as in the force field */
4227     if (EVDW_PME(ir->vdwtype))
4228     {
4229         check_combination_rules(ir, sys, wi);
4230     }
4231
4232     /* Generalized reaction field */
4233     if (ir->opts.ngtc == 0)
4234     {
4235         sprintf(err_buf, "No temperature coupling while using coulombtype %s",
4236                 eel_names[eelGRF]);
4237         CHECK(ir->coulombtype == eelGRF);
4238     }
4239     else
4240     {
4241         sprintf(err_buf, "When using coulombtype = %s"
4242                 " ref-t for temperature coupling should be > 0",
4243                 eel_names[eelGRF]);
4244         CHECK((ir->coulombtype == eelGRF) && (ir->opts.ref_t[0] <= 0));
4245     }
4246
4247     bAcc = FALSE;
4248     for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4249     {
4250         for (m = 0; (m < DIM); m++)
4251         {
4252             if (fabs(ir->opts.acc[i][m]) > 1e-6)
4253             {
4254                 bAcc = TRUE;
4255             }
4256         }
4257     }
4258     if (bAcc)
4259     {
4260         clear_rvec(acc);
4261         snew(mgrp, sys->groups.grps[egcACC].nr);
4262         aloop = gmx_mtop_atomloop_all_init(sys);
4263         const t_atom *atom;
4264         while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
4265         {
4266             mgrp[ggrpnr(&sys->groups, egcACC, i)] += atom->m;
4267         }
4268         mt = 0.0;
4269         for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4270         {
4271             for (m = 0; (m < DIM); m++)
4272             {
4273                 acc[m] += ir->opts.acc[i][m]*mgrp[i];
4274             }
4275             mt += mgrp[i];
4276         }
4277         for (m = 0; (m < DIM); m++)
4278         {
4279             if (fabs(acc[m]) > 1e-6)
4280             {
4281                 const char *dim[DIM] = { "X", "Y", "Z" };
4282                 fprintf(stderr,
4283                         "Net Acceleration in %s direction, will %s be corrected\n",
4284                         dim[m], ir->nstcomm != 0 ? "" : "not");
4285                 if (ir->nstcomm != 0 && m < ndof_com(ir))
4286                 {
4287                     acc[m] /= mt;
4288                     for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4289                     {
4290                         ir->opts.acc[i][m] -= acc[m];
4291                     }
4292                 }
4293             }
4294         }
4295         sfree(mgrp);
4296     }
4297
4298     if (ir->efep != efepNO && ir->fepvals->sc_alpha != 0 &&
4299         !gmx_within_tol(sys->ffparams.reppow, 12.0, 10*GMX_DOUBLE_EPS))
4300     {
4301         gmx_fatal(FARGS, "Soft-core interactions are only supported with VdW repulsion power 12");
4302     }
4303
4304     if (ir->bPull)
4305     {
4306         gmx_bool bWarned;
4307
4308         bWarned = FALSE;
4309         for (i = 0; i < ir->pull->ncoord && !bWarned; i++)
4310         {
4311             if (ir->pull->coord[i].group[0] == 0 ||
4312                 ir->pull->coord[i].group[1] == 0)
4313             {
4314                 absolute_reference(ir, sys, FALSE, AbsRef);
4315                 for (m = 0; m < DIM; m++)
4316                 {
4317                     if (ir->pull->coord[i].dim[m] && !AbsRef[m])
4318                     {
4319                         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.");
4320                         bWarned = TRUE;
4321                         break;
4322                     }
4323                 }
4324             }
4325         }
4326
4327         for (i = 0; i < 3; i++)
4328         {
4329             for (m = 0; m <= i; m++)
4330             {
4331                 if ((ir->epc != epcNO && ir->compress[i][m] != 0) ||
4332                     ir->deform[i][m] != 0)
4333                 {
4334                     for (c = 0; c < ir->pull->ncoord; c++)
4335                     {
4336                         if (ir->pull->coord[c].eGeom == epullgDIRPBC &&
4337                             ir->pull->coord[c].vec[m] != 0)
4338                         {
4339                             gmx_fatal(FARGS, "Can not have dynamic box while using pull geometry '%s' (dim %c)", EPULLGEOM(ir->pull->coord[c].eGeom), 'x'+m);
4340                         }
4341                     }
4342                 }
4343             }
4344         }
4345     }
4346
4347     check_disre(sys);
4348 }
4349
4350 void double_check(t_inputrec *ir, matrix box,
4351                   gmx_bool bHasNormalConstraints,
4352                   gmx_bool bHasAnyConstraints,
4353                   warninp_t wi)
4354 {
4355     real        min_size;
4356     char        warn_buf[STRLEN];
4357     const char *ptr;
4358
4359     ptr = check_box(ir->ePBC, box);
4360     if (ptr)
4361     {
4362         warning_error(wi, ptr);
4363     }
4364
4365     if (bHasNormalConstraints && ir->eConstrAlg == econtSHAKE)
4366     {
4367         if (ir->shake_tol <= 0.0)
4368         {
4369             sprintf(warn_buf, "ERROR: shake-tol must be > 0 instead of %g\n",
4370                     ir->shake_tol);
4371             warning_error(wi, warn_buf);
4372         }
4373     }
4374
4375     if ( (ir->eConstrAlg == econtLINCS) && bHasNormalConstraints)
4376     {
4377         /* If we have Lincs constraints: */
4378         if (ir->eI == eiMD && ir->etc == etcNO &&
4379             ir->eConstrAlg == econtLINCS && ir->nLincsIter == 1)
4380         {
4381             sprintf(warn_buf, "For energy conservation with LINCS, lincs_iter should be 2 or larger.\n");
4382             warning_note(wi, warn_buf);
4383         }
4384
4385         if ((ir->eI == eiCG || ir->eI == eiLBFGS) && (ir->nProjOrder < 8))
4386         {
4387             sprintf(warn_buf, "For accurate %s with LINCS constraints, lincs-order should be 8 or more.", ei_names[ir->eI]);
4388             warning_note(wi, warn_buf);
4389         }
4390         if (ir->epc == epcMTTK)
4391         {
4392             warning_error(wi, "MTTK not compatible with lincs -- use shake instead.");
4393         }
4394     }
4395
4396     if (bHasAnyConstraints && ir->epc == epcMTTK)
4397     {
4398         warning_error(wi, "Constraints are not implemented with MTTK pressure control.");
4399     }
4400
4401     if (ir->LincsWarnAngle > 90.0)
4402     {
4403         sprintf(warn_buf, "lincs-warnangle can not be larger than 90 degrees, setting it to 90.\n");
4404         warning(wi, warn_buf);
4405         ir->LincsWarnAngle = 90.0;
4406     }
4407
4408     if (ir->ePBC != epbcNONE)
4409     {
4410         if (ir->nstlist == 0)
4411         {
4412             warning(wi, "With nstlist=0 atoms are only put into the box at step 0, therefore drifting atoms might cause the simulation to crash.");
4413         }
4414         if (ir->ns_type == ensGRID)
4415         {
4416             if (gmx::square(ir->rlist) >= max_cutoff2(ir->ePBC, box))
4417             {
4418                 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");
4419                 warning_error(wi, warn_buf);
4420             }
4421         }
4422         else
4423         {
4424             min_size = std::min(box[XX][XX], std::min(box[YY][YY], box[ZZ][ZZ]));
4425             if (2*ir->rlist >= min_size)
4426             {
4427                 sprintf(warn_buf, "ERROR: One of the box lengths is smaller than twice the cut-off length. Increase the box size or decrease rlist.");
4428                 warning_error(wi, warn_buf);
4429                 if (TRICLINIC(box))
4430                 {
4431                     fprintf(stderr, "Grid search might allow larger cut-off's than simple search with triclinic boxes.");
4432                 }
4433             }
4434         }
4435     }
4436 }
4437
4438 void check_chargegroup_radii(const gmx_mtop_t *mtop, const t_inputrec *ir,
4439                              rvec *x,
4440                              warninp_t wi)
4441 {
4442     real rvdw1, rvdw2, rcoul1, rcoul2;
4443     char warn_buf[STRLEN];
4444
4445     calc_chargegroup_radii(mtop, x, &rvdw1, &rvdw2, &rcoul1, &rcoul2);
4446
4447     if (rvdw1 > 0)
4448     {
4449         printf("Largest charge group radii for Van der Waals: %5.3f, %5.3f nm\n",
4450                rvdw1, rvdw2);
4451     }
4452     if (rcoul1 > 0)
4453     {
4454         printf("Largest charge group radii for Coulomb:       %5.3f, %5.3f nm\n",
4455                rcoul1, rcoul2);
4456     }
4457
4458     if (ir->rlist > 0)
4459     {
4460         if (rvdw1  + rvdw2  > ir->rlist ||
4461             rcoul1 + rcoul2 > ir->rlist)
4462         {
4463             sprintf(warn_buf,
4464                     "The sum of the two largest charge group radii (%f) "
4465                     "is larger than rlist (%f)\n",
4466                     std::max(rvdw1+rvdw2, rcoul1+rcoul2), ir->rlist);
4467             warning(wi, warn_buf);
4468         }
4469         else
4470         {
4471             /* Here we do not use the zero at cut-off macro,
4472              * since user defined interactions might purposely
4473              * not be zero at the cut-off.
4474              */
4475             if (ir_vdw_is_zero_at_cutoff(ir) &&
4476                 rvdw1 + rvdw2 > ir->rlist - ir->rvdw)
4477             {
4478                 sprintf(warn_buf, "The sum of the two largest charge group "
4479                         "radii (%f) is larger than rlist (%f) - rvdw (%f).\n"
4480                         "With exact cut-offs, better performance can be "
4481                         "obtained with cutoff-scheme = %s, because it "
4482                         "does not use charge groups at all.",
4483                         rvdw1+rvdw2,
4484                         ir->rlist, ir->rvdw,
4485                         ecutscheme_names[ecutsVERLET]);
4486                 if (ir_NVE(ir))
4487                 {
4488                     warning(wi, warn_buf);
4489                 }
4490                 else
4491                 {
4492                     warning_note(wi, warn_buf);
4493                 }
4494             }
4495             if (ir_coulomb_is_zero_at_cutoff(ir) &&
4496                 rcoul1 + rcoul2 > ir->rlist - ir->rcoulomb)
4497             {
4498                 sprintf(warn_buf, "The sum of the two largest charge group radii (%f) is larger than rlist (%f) - rcoulomb (%f).\n"
4499                         "With exact cut-offs, better performance can be obtained with cutoff-scheme = %s, because it does not use charge groups at all.",
4500                         rcoul1+rcoul2,
4501                         ir->rlist, ir->rcoulomb,
4502                         ecutscheme_names[ecutsVERLET]);
4503                 if (ir_NVE(ir))
4504                 {
4505                     warning(wi, warn_buf);
4506                 }
4507                 else
4508                 {
4509                     warning_note(wi, warn_buf);
4510                 }
4511             }
4512         }
4513     }
4514 }