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