Fix compiler warning in cpuinfo for non-x86 architectures
[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, 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 postive 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 postive 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
1790     /* replace the following commands with the clearer new versions*/
1791     REPL_TYPE("unconstrained-start", "continuation");
1792     REPL_TYPE("foreign-lambda", "fep-lambdas");
1793     REPL_TYPE("verlet-buffer-drift", "verlet-buffer-tolerance");
1794     REPL_TYPE("nstxtcout", "nstxout-compressed");
1795     REPL_TYPE("xtc-grps", "compressed-x-grps");
1796     REPL_TYPE("xtc-precision", "compressed-x-precision");
1797
1798     CCTYPE ("VARIOUS PREPROCESSING OPTIONS");
1799     CTYPE ("Preprocessor information: use cpp syntax.");
1800     CTYPE ("e.g.: -I/home/joe/doe -I/home/mary/roe");
1801     STYPE ("include", opts->include,  NULL);
1802     CTYPE ("e.g.: -DPOSRES -DFLEXIBLE (note these variable names are case sensitive)");
1803     STYPE ("define",  opts->define,   NULL);
1804
1805     CCTYPE ("RUN CONTROL PARAMETERS");
1806     EETYPE("integrator",  ir->eI,         ei_names);
1807     CTYPE ("Start time and timestep in ps");
1808     RTYPE ("tinit",   ir->init_t, 0.0);
1809     RTYPE ("dt",      ir->delta_t,    0.001);
1810     STEPTYPE ("nsteps",   ir->nsteps,     0);
1811     CTYPE ("For exact run continuation or redoing part of a run");
1812     STEPTYPE ("init-step", ir->init_step,  0);
1813     CTYPE ("Part index is updated automatically on checkpointing (keeps files separate)");
1814     ITYPE ("simulation-part", ir->simulation_part, 1);
1815     CTYPE ("mode for center of mass motion removal");
1816     EETYPE("comm-mode",   ir->comm_mode,  ecm_names);
1817     CTYPE ("number of steps for center of mass motion removal");
1818     ITYPE ("nstcomm", ir->nstcomm,    100);
1819     CTYPE ("group(s) for center of mass motion removal");
1820     STYPE ("comm-grps",   is->vcm,            NULL);
1821
1822     CCTYPE ("LANGEVIN DYNAMICS OPTIONS");
1823     CTYPE ("Friction coefficient (amu/ps) and random seed");
1824     RTYPE ("bd-fric",     ir->bd_fric,    0.0);
1825     STEPTYPE ("ld-seed",  ir->ld_seed,    -1);
1826
1827     /* Em stuff */
1828     CCTYPE ("ENERGY MINIMIZATION OPTIONS");
1829     CTYPE ("Force tolerance and initial step-size");
1830     RTYPE ("emtol",       ir->em_tol,     10.0);
1831     RTYPE ("emstep",      ir->em_stepsize, 0.01);
1832     CTYPE ("Max number of iterations in relax-shells");
1833     ITYPE ("niter",       ir->niter,      20);
1834     CTYPE ("Step size (ps^2) for minimization of flexible constraints");
1835     RTYPE ("fcstep",      ir->fc_stepsize, 0);
1836     CTYPE ("Frequency of steepest descents steps when doing CG");
1837     ITYPE ("nstcgsteep",  ir->nstcgsteep, 1000);
1838     ITYPE ("nbfgscorr",   ir->nbfgscorr,  10);
1839
1840     CCTYPE ("TEST PARTICLE INSERTION OPTIONS");
1841     RTYPE ("rtpi",    ir->rtpi,   0.05);
1842
1843     /* Output options */
1844     CCTYPE ("OUTPUT CONTROL OPTIONS");
1845     CTYPE ("Output frequency for coords (x), velocities (v) and forces (f)");
1846     ITYPE ("nstxout", ir->nstxout,    0);
1847     ITYPE ("nstvout", ir->nstvout,    0);
1848     ITYPE ("nstfout", ir->nstfout,    0);
1849     CTYPE ("Output frequency for energies to log file and energy file");
1850     ITYPE ("nstlog",  ir->nstlog, 1000);
1851     ITYPE ("nstcalcenergy", ir->nstcalcenergy, 100);
1852     ITYPE ("nstenergy",   ir->nstenergy,  1000);
1853     CTYPE ("Output frequency and precision for .xtc file");
1854     ITYPE ("nstxout-compressed", ir->nstxout_compressed,  0);
1855     RTYPE ("compressed-x-precision", ir->x_compression_precision, 1000.0);
1856     CTYPE ("This selects the subset of atoms for the compressed");
1857     CTYPE ("trajectory file. You can select multiple groups. By");
1858     CTYPE ("default, all atoms will be written.");
1859     STYPE ("compressed-x-grps", is->x_compressed_groups, NULL);
1860     CTYPE ("Selection of energy groups");
1861     STYPE ("energygrps",  is->energy,         NULL);
1862
1863     /* Neighbor searching */
1864     CCTYPE ("NEIGHBORSEARCHING PARAMETERS");
1865     CTYPE ("cut-off scheme (Verlet: particle based cut-offs, group: using charge groups)");
1866     EETYPE("cutoff-scheme",     ir->cutoff_scheme,    ecutscheme_names);
1867     CTYPE ("nblist update frequency");
1868     ITYPE ("nstlist", ir->nstlist,    10);
1869     CTYPE ("ns algorithm (simple or grid)");
1870     EETYPE("ns-type",     ir->ns_type,    ens_names);
1871     CTYPE ("Periodic boundary conditions: xyz, no, xy");
1872     EETYPE("pbc",         ir->ePBC,       epbc_names);
1873     EETYPE("periodic-molecules", ir->bPeriodicMols, yesno_names);
1874     CTYPE ("Allowed energy error due to the Verlet buffer in kJ/mol/ps per atom,");
1875     CTYPE ("a value of -1 means: use rlist");
1876     RTYPE("verlet-buffer-tolerance", ir->verletbuf_tol,    0.005);
1877     CTYPE ("nblist cut-off");
1878     RTYPE ("rlist",   ir->rlist,  1.0);
1879     CTYPE ("long-range cut-off for switched potentials");
1880
1881     /* Electrostatics */
1882     CCTYPE ("OPTIONS FOR ELECTROSTATICS AND VDW");
1883     CTYPE ("Method for doing electrostatics");
1884     EETYPE("coulombtype", ir->coulombtype,    eel_names);
1885     EETYPE("coulomb-modifier",    ir->coulomb_modifier,    eintmod_names);
1886     CTYPE ("cut-off lengths");
1887     RTYPE ("rcoulomb-switch", ir->rcoulomb_switch,    0.0);
1888     RTYPE ("rcoulomb",    ir->rcoulomb,   1.0);
1889     CTYPE ("Relative dielectric constant for the medium and the reaction field");
1890     RTYPE ("epsilon-r",   ir->epsilon_r,  1.0);
1891     RTYPE ("epsilon-rf",  ir->epsilon_rf, 0.0);
1892     CTYPE ("Method for doing Van der Waals");
1893     EETYPE("vdw-type",    ir->vdwtype,    evdw_names);
1894     EETYPE("vdw-modifier",    ir->vdw_modifier,    eintmod_names);
1895     CTYPE ("cut-off lengths");
1896     RTYPE ("rvdw-switch", ir->rvdw_switch,    0.0);
1897     RTYPE ("rvdw",    ir->rvdw,   1.0);
1898     CTYPE ("Apply long range dispersion corrections for Energy and Pressure");
1899     EETYPE("DispCorr",    ir->eDispCorr,  edispc_names);
1900     CTYPE ("Extension of the potential lookup tables beyond the cut-off");
1901     RTYPE ("table-extension", ir->tabext, 1.0);
1902     CTYPE ("Separate tables between energy group pairs");
1903     STYPE ("energygrp-table", is->egptable,   NULL);
1904     CTYPE ("Spacing for the PME/PPPM FFT grid");
1905     RTYPE ("fourierspacing", ir->fourier_spacing, 0.12);
1906     CTYPE ("FFT grid size, when a value is 0 fourierspacing will be used");
1907     ITYPE ("fourier-nx",  ir->nkx,         0);
1908     ITYPE ("fourier-ny",  ir->nky,         0);
1909     ITYPE ("fourier-nz",  ir->nkz,         0);
1910     CTYPE ("EWALD/PME/PPPM parameters");
1911     ITYPE ("pme-order",   ir->pme_order,   4);
1912     RTYPE ("ewald-rtol",  ir->ewald_rtol, 0.00001);
1913     RTYPE ("ewald-rtol-lj", ir->ewald_rtol_lj, 0.001);
1914     EETYPE("lj-pme-comb-rule", ir->ljpme_combination_rule, eljpme_names);
1915     EETYPE("ewald-geometry", ir->ewald_geometry, eewg_names);
1916     RTYPE ("epsilon-surface", ir->epsilon_surface, 0.0);
1917
1918     CCTYPE("IMPLICIT SOLVENT ALGORITHM");
1919     EETYPE("implicit-solvent", ir->implicit_solvent, eis_names);
1920
1921     CCTYPE ("GENERALIZED BORN ELECTROSTATICS");
1922     CTYPE ("Algorithm for calculating Born radii");
1923     EETYPE("gb-algorithm", ir->gb_algorithm, egb_names);
1924     CTYPE ("Frequency of calculating the Born radii inside rlist");
1925     ITYPE ("nstgbradii", ir->nstgbradii, 1);
1926     CTYPE ("Cutoff for Born radii calculation; the contribution from atoms");
1927     CTYPE ("between rlist and rgbradii is updated every nstlist steps");
1928     RTYPE ("rgbradii",  ir->rgbradii, 1.0);
1929     CTYPE ("Dielectric coefficient of the implicit solvent");
1930     RTYPE ("gb-epsilon-solvent", ir->gb_epsilon_solvent, 80.0);
1931     CTYPE ("Salt concentration in M for Generalized Born models");
1932     RTYPE ("gb-saltconc",  ir->gb_saltconc, 0.0);
1933     CTYPE ("Scaling factors used in the OBC GB model. Default values are OBC(II)");
1934     RTYPE ("gb-obc-alpha", ir->gb_obc_alpha, 1.0);
1935     RTYPE ("gb-obc-beta", ir->gb_obc_beta, 0.8);
1936     RTYPE ("gb-obc-gamma", ir->gb_obc_gamma, 4.85);
1937     RTYPE ("gb-dielectric-offset", ir->gb_dielectric_offset, 0.009);
1938     EETYPE("sa-algorithm", ir->sa_algorithm, esa_names);
1939     CTYPE ("Surface tension (kJ/mol/nm^2) for the SA (nonpolar surface) part of GBSA");
1940     CTYPE ("The value -1 will set default value for Still/HCT/OBC GB-models.");
1941     RTYPE ("sa-surface-tension", ir->sa_surface_tension, -1);
1942
1943     /* Coupling stuff */
1944     CCTYPE ("OPTIONS FOR WEAK COUPLING ALGORITHMS");
1945     CTYPE ("Temperature coupling");
1946     EETYPE("tcoupl",  ir->etc,        etcoupl_names);
1947     ITYPE ("nsttcouple", ir->nsttcouple,  -1);
1948     ITYPE("nh-chain-length",     ir->opts.nhchainlength, 10);
1949     EETYPE("print-nose-hoover-chain-variables", ir->bPrintNHChains, yesno_names);
1950     CTYPE ("Groups to couple separately");
1951     STYPE ("tc-grps",     is->tcgrps,         NULL);
1952     CTYPE ("Time constant (ps) and reference temperature (K)");
1953     STYPE ("tau-t",   is->tau_t,      NULL);
1954     STYPE ("ref-t",   is->ref_t,      NULL);
1955     CTYPE ("pressure coupling");
1956     EETYPE("pcoupl",  ir->epc,        epcoupl_names);
1957     EETYPE("pcoupltype",  ir->epct,       epcoupltype_names);
1958     ITYPE ("nstpcouple", ir->nstpcouple,  -1);
1959     CTYPE ("Time constant (ps), compressibility (1/bar) and reference P (bar)");
1960     RTYPE ("tau-p",   ir->tau_p,  1.0);
1961     STYPE ("compressibility", dumstr[0],  NULL);
1962     STYPE ("ref-p",       dumstr[1],      NULL);
1963     CTYPE ("Scaling of reference coordinates, No, All or COM");
1964     EETYPE ("refcoord-scaling", ir->refcoord_scaling, erefscaling_names);
1965
1966     /* QMMM */
1967     CCTYPE ("OPTIONS FOR QMMM calculations");
1968     EETYPE("QMMM", ir->bQMMM, yesno_names);
1969     CTYPE ("Groups treated Quantum Mechanically");
1970     STYPE ("QMMM-grps",  is->QMMM,          NULL);
1971     CTYPE ("QM method");
1972     STYPE("QMmethod",     is->QMmethod, NULL);
1973     CTYPE ("QMMM scheme");
1974     EETYPE("QMMMscheme",  ir->QMMMscheme,    eQMMMscheme_names);
1975     CTYPE ("QM basisset");
1976     STYPE("QMbasis",      is->QMbasis, NULL);
1977     CTYPE ("QM charge");
1978     STYPE ("QMcharge",    is->QMcharge, NULL);
1979     CTYPE ("QM multiplicity");
1980     STYPE ("QMmult",      is->QMmult, NULL);
1981     CTYPE ("Surface Hopping");
1982     STYPE ("SH",          is->bSH, NULL);
1983     CTYPE ("CAS space options");
1984     STYPE ("CASorbitals",      is->CASorbitals,   NULL);
1985     STYPE ("CASelectrons",     is->CASelectrons,  NULL);
1986     STYPE ("SAon", is->SAon, NULL);
1987     STYPE ("SAoff", is->SAoff, NULL);
1988     STYPE ("SAsteps", is->SAsteps, NULL);
1989     CTYPE ("Scale factor for MM charges");
1990     RTYPE ("MMChargeScaleFactor", ir->scalefactor, 1.0);
1991     CTYPE ("Optimization of QM subsystem");
1992     STYPE ("bOPT",          is->bOPT, NULL);
1993     STYPE ("bTS",          is->bTS, NULL);
1994
1995     /* Simulated annealing */
1996     CCTYPE("SIMULATED ANNEALING");
1997     CTYPE ("Type of annealing for each temperature group (no/single/periodic)");
1998     STYPE ("annealing",   is->anneal,      NULL);
1999     CTYPE ("Number of time points to use for specifying annealing in each group");
2000     STYPE ("annealing-npoints", is->anneal_npoints, NULL);
2001     CTYPE ("List of times at the annealing points for each group");
2002     STYPE ("annealing-time",       is->anneal_time,       NULL);
2003     CTYPE ("Temp. at each annealing point, for each group.");
2004     STYPE ("annealing-temp",  is->anneal_temp,  NULL);
2005
2006     /* Startup run */
2007     CCTYPE ("GENERATE VELOCITIES FOR STARTUP RUN");
2008     EETYPE("gen-vel",     opts->bGenVel,  yesno_names);
2009     RTYPE ("gen-temp",    opts->tempi,    300.0);
2010     ITYPE ("gen-seed",    opts->seed,     -1);
2011
2012     /* Shake stuff */
2013     CCTYPE ("OPTIONS FOR BONDS");
2014     EETYPE("constraints", opts->nshake,   constraints);
2015     CTYPE ("Type of constraint algorithm");
2016     EETYPE("constraint-algorithm",  ir->eConstrAlg, econstr_names);
2017     CTYPE ("Do not constrain the start configuration");
2018     EETYPE("continuation", ir->bContinuation, yesno_names);
2019     CTYPE ("Use successive overrelaxation to reduce the number of shake iterations");
2020     EETYPE("Shake-SOR", ir->bShakeSOR, yesno_names);
2021     CTYPE ("Relative tolerance of shake");
2022     RTYPE ("shake-tol", ir->shake_tol, 0.0001);
2023     CTYPE ("Highest order in the expansion of the constraint coupling matrix");
2024     ITYPE ("lincs-order", ir->nProjOrder, 4);
2025     CTYPE ("Number of iterations in the final step of LINCS. 1 is fine for");
2026     CTYPE ("normal simulations, but use 2 to conserve energy in NVE runs.");
2027     CTYPE ("For energy minimization with constraints it should be 4 to 8.");
2028     ITYPE ("lincs-iter", ir->nLincsIter, 1);
2029     CTYPE ("Lincs will write a warning to the stderr if in one step a bond");
2030     CTYPE ("rotates over more degrees than");
2031     RTYPE ("lincs-warnangle", ir->LincsWarnAngle, 30.0);
2032     CTYPE ("Convert harmonic bonds to morse potentials");
2033     EETYPE("morse",       opts->bMorse, yesno_names);
2034
2035     /* Energy group exclusions */
2036     CCTYPE ("ENERGY GROUP EXCLUSIONS");
2037     CTYPE ("Pairs of energy groups for which all non-bonded interactions are excluded");
2038     STYPE ("energygrp-excl", is->egpexcl,     NULL);
2039
2040     /* Walls */
2041     CCTYPE ("WALLS");
2042     CTYPE ("Number of walls, type, atom types, densities and box-z scale factor for Ewald");
2043     ITYPE ("nwall", ir->nwall, 0);
2044     EETYPE("wall-type",     ir->wall_type,   ewt_names);
2045     RTYPE ("wall-r-linpot", ir->wall_r_linpot, -1);
2046     STYPE ("wall-atomtype", is->wall_atomtype, NULL);
2047     STYPE ("wall-density",  is->wall_density,  NULL);
2048     RTYPE ("wall-ewald-zfac", ir->wall_ewald_zfac, 3);
2049
2050     /* COM pulling */
2051     CCTYPE("COM PULLING");
2052     EETYPE("pull",          ir->bPull, yesno_names);
2053     if (ir->bPull)
2054     {
2055         snew(ir->pull, 1);
2056         is->pull_grp = read_pullparams(&ninp, &inp, ir->pull, wi);
2057     }
2058
2059     /* Enforced rotation */
2060     CCTYPE("ENFORCED ROTATION");
2061     CTYPE("Enforced rotation: No or Yes");
2062     EETYPE("rotation",       ir->bRot, yesno_names);
2063     if (ir->bRot)
2064     {
2065         snew(ir->rot, 1);
2066         is->rot_grp = read_rotparams(&ninp, &inp, ir->rot, wi);
2067     }
2068
2069     /* Interactive MD */
2070     ir->bIMD = FALSE;
2071     CCTYPE("Group to display and/or manipulate in interactive MD session");
2072     STYPE ("IMD-group", is->imd_grp, NULL);
2073     if (is->imd_grp[0] != '\0')
2074     {
2075         snew(ir->imd, 1);
2076         ir->bIMD = TRUE;
2077     }
2078
2079     /* Refinement */
2080     CCTYPE("NMR refinement stuff");
2081     CTYPE ("Distance restraints type: No, Simple or Ensemble");
2082     EETYPE("disre",       ir->eDisre,     edisre_names);
2083     CTYPE ("Force weighting of pairs in one distance restraint: Conservative or Equal");
2084     EETYPE("disre-weighting", ir->eDisreWeighting, edisreweighting_names);
2085     CTYPE ("Use sqrt of the time averaged times the instantaneous violation");
2086     EETYPE("disre-mixed", ir->bDisreMixed, yesno_names);
2087     RTYPE ("disre-fc",    ir->dr_fc,  1000.0);
2088     RTYPE ("disre-tau",   ir->dr_tau, 0.0);
2089     CTYPE ("Output frequency for pair distances to energy file");
2090     ITYPE ("nstdisreout", ir->nstdisreout, 100);
2091     CTYPE ("Orientation restraints: No or Yes");
2092     EETYPE("orire",       opts->bOrire,   yesno_names);
2093     CTYPE ("Orientation restraints force constant and tau for time averaging");
2094     RTYPE ("orire-fc",    ir->orires_fc,  0.0);
2095     RTYPE ("orire-tau",   ir->orires_tau, 0.0);
2096     STYPE ("orire-fitgrp", is->orirefitgrp,    NULL);
2097     CTYPE ("Output frequency for trace(SD) and S to energy file");
2098     ITYPE ("nstorireout", ir->nstorireout, 100);
2099
2100     /* free energy variables */
2101     CCTYPE ("Free energy variables");
2102     EETYPE("free-energy", ir->efep, efep_names);
2103     STYPE ("couple-moltype",  is->couple_moltype,  NULL);
2104     EETYPE("couple-lambda0", opts->couple_lam0, couple_lam);
2105     EETYPE("couple-lambda1", opts->couple_lam1, couple_lam);
2106     EETYPE("couple-intramol", opts->bCoupleIntra, yesno_names);
2107
2108     RTYPE ("init-lambda", fep->init_lambda, -1); /* start with -1 so
2109                                                     we can recognize if
2110                                                     it was not entered */
2111     ITYPE ("init-lambda-state", fep->init_fep_state, -1);
2112     RTYPE ("delta-lambda", fep->delta_lambda, 0.0);
2113     ITYPE ("nstdhdl", fep->nstdhdl, 50);
2114     STYPE ("fep-lambdas", is->fep_lambda[efptFEP], NULL);
2115     STYPE ("mass-lambdas", is->fep_lambda[efptMASS], NULL);
2116     STYPE ("coul-lambdas", is->fep_lambda[efptCOUL], NULL);
2117     STYPE ("vdw-lambdas", is->fep_lambda[efptVDW], NULL);
2118     STYPE ("bonded-lambdas", is->fep_lambda[efptBONDED], NULL);
2119     STYPE ("restraint-lambdas", is->fep_lambda[efptRESTRAINT], NULL);
2120     STYPE ("temperature-lambdas", is->fep_lambda[efptTEMPERATURE], NULL);
2121     ITYPE ("calc-lambda-neighbors", fep->lambda_neighbors, 1);
2122     STYPE ("init-lambda-weights", is->lambda_weights, NULL);
2123     EETYPE("dhdl-print-energy", fep->edHdLPrintEnergy, edHdLPrintEnergy_names);
2124     RTYPE ("sc-alpha", fep->sc_alpha, 0.0);
2125     ITYPE ("sc-power", fep->sc_power, 1);
2126     RTYPE ("sc-r-power", fep->sc_r_power, 6.0);
2127     RTYPE ("sc-sigma", fep->sc_sigma, 0.3);
2128     EETYPE("sc-coul", fep->bScCoul, yesno_names);
2129     ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2130     RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2131     EETYPE("separate-dhdl-file", fep->separate_dhdl_file,
2132            separate_dhdl_file_names);
2133     EETYPE("dhdl-derivatives", fep->dhdl_derivatives, dhdl_derivatives_names);
2134     ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2135     RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2136
2137     /* Non-equilibrium MD stuff */
2138     CCTYPE("Non-equilibrium MD stuff");
2139     STYPE ("acc-grps",    is->accgrps,        NULL);
2140     STYPE ("accelerate",  is->acc,            NULL);
2141     STYPE ("freezegrps",  is->freeze,         NULL);
2142     STYPE ("freezedim",   is->frdim,          NULL);
2143     RTYPE ("cos-acceleration", ir->cos_accel, 0);
2144     STYPE ("deform",      is->deform,         NULL);
2145
2146     /* simulated tempering variables */
2147     CCTYPE("simulated tempering variables");
2148     EETYPE("simulated-tempering", ir->bSimTemp, yesno_names);
2149     EETYPE("simulated-tempering-scaling", ir->simtempvals->eSimTempScale, esimtemp_names);
2150     RTYPE("sim-temp-low", ir->simtempvals->simtemp_low, 300.0);
2151     RTYPE("sim-temp-high", ir->simtempvals->simtemp_high, 300.0);
2152
2153     /* expanded ensemble variables */
2154     if (ir->efep == efepEXPANDED || ir->bSimTemp)
2155     {
2156         read_expandedparams(&ninp, &inp, expand, wi);
2157     }
2158
2159     /* Electric fields */
2160     CCTYPE("Electric fields");
2161     CTYPE ("Format is number of terms (int) and for all terms an amplitude (real)");
2162     CTYPE ("and a phase angle (real)");
2163     STYPE ("E-x",     is->efield_x,   NULL);
2164     CTYPE ("Time dependent (pulsed) electric field. Format is omega, time for pulse");
2165     CTYPE ("peak, and sigma (width) for pulse. Sigma = 0 removes pulse, leaving");
2166     CTYPE ("the field to be a cosine function.");
2167     STYPE ("E-xt",    is->efield_xt,  NULL);
2168     STYPE ("E-y",     is->efield_y,   NULL);
2169     STYPE ("E-yt",    is->efield_yt,  NULL);
2170     STYPE ("E-z",     is->efield_z,   NULL);
2171     STYPE ("E-zt",    is->efield_zt,  NULL);
2172
2173     /* Ion/water position swapping ("computational electrophysiology") */
2174     CCTYPE("Ion/water position swapping for computational electrophysiology setups");
2175     CTYPE("Swap positions along direction: no, X, Y, Z");
2176     EETYPE("swapcoords", ir->eSwapCoords, eSwapTypes_names);
2177     if (ir->eSwapCoords != eswapNO)
2178     {
2179         char buf[STRLEN];
2180         int  nIonTypes;
2181
2182
2183         snew(ir->swap, 1);
2184         CTYPE("Swap attempt frequency");
2185         ITYPE("swap-frequency", ir->swap->nstswap, 1);
2186         CTYPE("Number of ion types to be controlled");
2187         ITYPE("iontypes", nIonTypes, 1);
2188         if (nIonTypes < 1)
2189         {
2190             warning_error(wi, "You need to provide at least one ion type for position exchanges.");
2191         }
2192         ir->swap->ngrp = nIonTypes + eSwapFixedGrpNR;
2193         snew(ir->swap->grp, ir->swap->ngrp);
2194         for (i = 0; i < ir->swap->ngrp; i++)
2195         {
2196             snew(ir->swap->grp[i].molname, STRLEN);
2197         }
2198         CTYPE("Two index groups that contain the compartment-partitioning atoms");
2199         STYPE("split-group0", ir->swap->grp[eGrpSplit0].molname, NULL);
2200         STYPE("split-group1", ir->swap->grp[eGrpSplit1].molname, NULL);
2201         CTYPE("Use center of mass of split groups (yes/no), otherwise center of geometry is used");
2202         EETYPE("massw-split0", ir->swap->massw_split[0], yesno_names);
2203         EETYPE("massw-split1", ir->swap->massw_split[1], yesno_names);
2204
2205         CTYPE("Name of solvent molecules");
2206         STYPE("solvent-group", ir->swap->grp[eGrpSolvent].molname, NULL);
2207
2208         CTYPE("Split cylinder: radius, upper and lower extension (nm) (this will define the channels)");
2209         CTYPE("Note that the split cylinder settings do not have an influence on the swapping protocol,");
2210         CTYPE("however, if correctly defined, the permeation events are recorded per channel");
2211         RTYPE("cyl0-r", ir->swap->cyl0r, 2.0);
2212         RTYPE("cyl0-up", ir->swap->cyl0u, 1.0);
2213         RTYPE("cyl0-down", ir->swap->cyl0l, 1.0);
2214         RTYPE("cyl1-r", ir->swap->cyl1r, 2.0);
2215         RTYPE("cyl1-up", ir->swap->cyl1u, 1.0);
2216         RTYPE("cyl1-down", ir->swap->cyl1l, 1.0);
2217
2218         CTYPE("Average the number of ions per compartment over these many swap attempt steps");
2219         ITYPE("coupl-steps", ir->swap->nAverage, 10);
2220
2221         CTYPE("Names of the ion types that can be exchanged with solvent molecules,");
2222         CTYPE("and the requested number of ions of this type in compartments A and B");
2223         CTYPE("-1 means fix the numbers as found in step 0");
2224         for (i = 0; i < nIonTypes; i++)
2225         {
2226             int ig = eSwapFixedGrpNR + i;
2227
2228             sprintf(buf, "iontype%d-name", i);
2229             STYPE(buf, ir->swap->grp[ig].molname, NULL);
2230             sprintf(buf, "iontype%d-in-A", i);
2231             ITYPE(buf, ir->swap->grp[ig].nmolReq[0], -1);
2232             sprintf(buf, "iontype%d-in-B", i);
2233             ITYPE(buf, ir->swap->grp[ig].nmolReq[1], -1);
2234         }
2235
2236         CTYPE("By default (i.e. bulk offset = 0.0), ion/water exchanges happen between layers");
2237         CTYPE("at maximum distance (= bulk concentration) to the split group layers. However,");
2238         CTYPE("an offset b (-1.0 < b < +1.0) can be specified to offset the bulk layer from the middle at 0.0");
2239         CTYPE("towards one of the compartment-partitioning layers (at +/- 1.0).");
2240         RTYPE("bulk-offsetA", ir->swap->bulkOffset[0], 0.0);
2241         RTYPE("bulk-offsetB", ir->swap->bulkOffset[1], 0.0);
2242         if (!(ir->swap->bulkOffset[0] > -1.0 && ir->swap->bulkOffset[0] < 1.0)
2243             || !(ir->swap->bulkOffset[1] > -1.0 && ir->swap->bulkOffset[1] < 1.0) )
2244         {
2245             warning_error(wi, "Bulk layer offsets must be > -1.0 and < 1.0 !");
2246         }
2247
2248         CTYPE("Start to swap ions if threshold difference to requested count is reached");
2249         RTYPE("threshold", ir->swap->threshold, 1.0);
2250     }
2251
2252     /* AdResS is no longer supported, but we need mdrun to be able to refuse to run old AdResS .tpr files */
2253     EETYPE("adress", ir->bAdress, yesno_names);
2254
2255     /* User defined thingies */
2256     CCTYPE ("User defined thingies");
2257     STYPE ("user1-grps",  is->user1,          NULL);
2258     STYPE ("user2-grps",  is->user2,          NULL);
2259     ITYPE ("userint1",    ir->userint1,   0);
2260     ITYPE ("userint2",    ir->userint2,   0);
2261     ITYPE ("userint3",    ir->userint3,   0);
2262     ITYPE ("userint4",    ir->userint4,   0);
2263     RTYPE ("userreal1",   ir->userreal1,  0);
2264     RTYPE ("userreal2",   ir->userreal2,  0);
2265     RTYPE ("userreal3",   ir->userreal3,  0);
2266     RTYPE ("userreal4",   ir->userreal4,  0);
2267 #undef CTYPE
2268
2269     write_inpfile(mdparout, ninp, inp, FALSE, wi);
2270     for (i = 0; (i < ninp); i++)
2271     {
2272         sfree(inp[i].name);
2273         sfree(inp[i].value);
2274     }
2275     sfree(inp);
2276
2277     /* Process options if necessary */
2278     for (m = 0; m < 2; m++)
2279     {
2280         for (i = 0; i < 2*DIM; i++)
2281         {
2282             dumdub[m][i] = 0.0;
2283         }
2284         if (ir->epc)
2285         {
2286             switch (ir->epct)
2287             {
2288                 case epctISOTROPIC:
2289                     if (sscanf(dumstr[m], "%lf", &(dumdub[m][XX])) != 1)
2290                     {
2291                         warning_error(wi, "Pressure coupling not enough values (I need 1)");
2292                     }
2293                     dumdub[m][YY] = dumdub[m][ZZ] = dumdub[m][XX];
2294                     break;
2295                 case epctSEMIISOTROPIC:
2296                 case epctSURFACETENSION:
2297                     if (sscanf(dumstr[m], "%lf%lf",
2298                                &(dumdub[m][XX]), &(dumdub[m][ZZ])) != 2)
2299                     {
2300                         warning_error(wi, "Pressure coupling not enough values (I need 2)");
2301                     }
2302                     dumdub[m][YY] = dumdub[m][XX];
2303                     break;
2304                 case epctANISOTROPIC:
2305                     if (sscanf(dumstr[m], "%lf%lf%lf%lf%lf%lf",
2306                                &(dumdub[m][XX]), &(dumdub[m][YY]), &(dumdub[m][ZZ]),
2307                                &(dumdub[m][3]), &(dumdub[m][4]), &(dumdub[m][5])) != 6)
2308                     {
2309                         warning_error(wi, "Pressure coupling not enough values (I need 6)");
2310                     }
2311                     break;
2312                 default:
2313                     gmx_fatal(FARGS, "Pressure coupling type %s not implemented yet",
2314                               epcoupltype_names[ir->epct]);
2315             }
2316         }
2317     }
2318     clear_mat(ir->ref_p);
2319     clear_mat(ir->compress);
2320     for (i = 0; i < DIM; i++)
2321     {
2322         ir->ref_p[i][i]    = dumdub[1][i];
2323         ir->compress[i][i] = dumdub[0][i];
2324     }
2325     if (ir->epct == epctANISOTROPIC)
2326     {
2327         ir->ref_p[XX][YY] = dumdub[1][3];
2328         ir->ref_p[XX][ZZ] = dumdub[1][4];
2329         ir->ref_p[YY][ZZ] = dumdub[1][5];
2330         if (ir->ref_p[XX][YY] != 0 && ir->ref_p[XX][ZZ] != 0 && ir->ref_p[YY][ZZ] != 0)
2331         {
2332             warning(wi, "All off-diagonal reference pressures are non-zero. Are you sure you want to apply a threefold shear stress?\n");
2333         }
2334         ir->compress[XX][YY] = dumdub[0][3];
2335         ir->compress[XX][ZZ] = dumdub[0][4];
2336         ir->compress[YY][ZZ] = dumdub[0][5];
2337         for (i = 0; i < DIM; i++)
2338         {
2339             for (m = 0; m < i; m++)
2340             {
2341                 ir->ref_p[i][m]    = ir->ref_p[m][i];
2342                 ir->compress[i][m] = ir->compress[m][i];
2343             }
2344         }
2345     }
2346
2347     if (ir->comm_mode == ecmNO)
2348     {
2349         ir->nstcomm = 0;
2350     }
2351
2352     opts->couple_moltype = NULL;
2353     if (strlen(is->couple_moltype) > 0)
2354     {
2355         if (ir->efep != efepNO)
2356         {
2357             opts->couple_moltype = gmx_strdup(is->couple_moltype);
2358             if (opts->couple_lam0 == opts->couple_lam1)
2359             {
2360                 warning(wi, "The lambda=0 and lambda=1 states for coupling are identical");
2361             }
2362             if (ir->eI == eiMD && (opts->couple_lam0 == ecouplamNONE ||
2363                                    opts->couple_lam1 == ecouplamNONE))
2364             {
2365                 warning(wi, "For proper sampling of the (nearly) decoupled state, stochastic dynamics should be used");
2366             }
2367         }
2368         else
2369         {
2370             warning_note(wi, "Free energy is turned off, so we will not decouple the molecule listed in your input.");
2371         }
2372     }
2373     /* FREE ENERGY AND EXPANDED ENSEMBLE OPTIONS */
2374     if (ir->efep != efepNO)
2375     {
2376         if (fep->delta_lambda > 0)
2377         {
2378             ir->efep = efepSLOWGROWTH;
2379         }
2380     }
2381
2382     if (fep->edHdLPrintEnergy == edHdLPrintEnergyYES)
2383     {
2384         fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2385         warning_note(wi, "Old option for dhdl-print-energy given: "
2386                      "changing \"yes\" to \"total\"\n");
2387     }
2388
2389     if (ir->bSimTemp && (fep->edHdLPrintEnergy == edHdLPrintEnergyNO))
2390     {
2391         /* always print out the energy to dhdl if we are doing
2392            expanded ensemble, since we need the total energy for
2393            analysis if the temperature is changing. In some
2394            conditions one may only want the potential energy, so
2395            we will allow that if the appropriate mdp setting has
2396            been enabled. Otherwise, total it is:
2397          */
2398         fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2399     }
2400
2401     if ((ir->efep != efepNO) || ir->bSimTemp)
2402     {
2403         ir->bExpanded = FALSE;
2404         if ((ir->efep == efepEXPANDED) || ir->bSimTemp)
2405         {
2406             ir->bExpanded = TRUE;
2407         }
2408         do_fep_params(ir, is->fep_lambda, is->lambda_weights, wi);
2409         if (ir->bSimTemp) /* done after fep params */
2410         {
2411             do_simtemp_params(ir);
2412         }
2413
2414         /* Because sc-coul (=FALSE by default) only acts on the lambda state
2415          * setup and not on the old way of specifying the free-energy setup,
2416          * we should check for using soft-core when not needed, since that
2417          * can complicate the sampling significantly.
2418          * Note that we only check for the automated coupling setup.
2419          * If the (advanced) user does FEP through manual topology changes,
2420          * this check will not be triggered.
2421          */
2422         if (ir->efep != efepNO && ir->fepvals->n_lambda == 0 &&
2423             ir->fepvals->sc_alpha != 0 &&
2424             (couple_lambda_has_vdw_on(opts->couple_lam0) &&
2425              couple_lambda_has_vdw_on(opts->couple_lam1)))
2426         {
2427             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.");
2428         }
2429     }
2430     else
2431     {
2432         ir->fepvals->n_lambda = 0;
2433     }
2434
2435     /* WALL PARAMETERS */
2436
2437     do_wall_params(ir, is->wall_atomtype, is->wall_density, opts);
2438
2439     /* ORIENTATION RESTRAINT PARAMETERS */
2440
2441     if (opts->bOrire && str_nelem(is->orirefitgrp, MAXPTR, NULL) != 1)
2442     {
2443         warning_error(wi, "ERROR: Need one orientation restraint fit group\n");
2444     }
2445
2446     /* DEFORMATION PARAMETERS */
2447
2448     clear_mat(ir->deform);
2449     for (i = 0; i < 6; i++)
2450     {
2451         dumdub[0][i] = 0;
2452     }
2453     sscanf(is->deform, "%lf %lf %lf %lf %lf %lf",
2454            &(dumdub[0][0]), &(dumdub[0][1]), &(dumdub[0][2]),
2455            &(dumdub[0][3]), &(dumdub[0][4]), &(dumdub[0][5]));
2456     for (i = 0; i < 3; i++)
2457     {
2458         ir->deform[i][i] = dumdub[0][i];
2459     }
2460     ir->deform[YY][XX] = dumdub[0][3];
2461     ir->deform[ZZ][XX] = dumdub[0][4];
2462     ir->deform[ZZ][YY] = dumdub[0][5];
2463     if (ir->epc != epcNO)
2464     {
2465         for (i = 0; i < 3; i++)
2466         {
2467             for (j = 0; j <= i; j++)
2468             {
2469                 if (ir->deform[i][j] != 0 && ir->compress[i][j] != 0)
2470                 {
2471                     warning_error(wi, "A box element has deform set and compressibility > 0");
2472                 }
2473             }
2474         }
2475         for (i = 0; i < 3; i++)
2476         {
2477             for (j = 0; j < i; j++)
2478             {
2479                 if (ir->deform[i][j] != 0)
2480                 {
2481                     for (m = j; m < DIM; m++)
2482                     {
2483                         if (ir->compress[m][j] != 0)
2484                         {
2485                             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.");
2486                             warning(wi, warn_buf);
2487                         }
2488                     }
2489                 }
2490             }
2491         }
2492     }
2493
2494     /* Ion/water position swapping checks */
2495     if (ir->eSwapCoords != eswapNO)
2496     {
2497         if (ir->swap->nstswap < 1)
2498         {
2499             warning_error(wi, "swap_frequency must be 1 or larger when ion swapping is requested");
2500         }
2501         if (ir->swap->nAverage < 1)
2502         {
2503             warning_error(wi, "coupl_steps must be 1 or larger.\n");
2504         }
2505         if (ir->swap->threshold < 1.0)
2506         {
2507             warning_error(wi, "Ion count threshold must be at least 1.\n");
2508         }
2509     }
2510
2511     sfree(dumstr[0]);
2512     sfree(dumstr[1]);
2513 }
2514
2515 static int search_QMstring(const char *s, int ng, const char *gn[])
2516 {
2517     /* same as normal search_string, but this one searches QM strings */
2518     int i;
2519
2520     for (i = 0; (i < ng); i++)
2521     {
2522         if (gmx_strcasecmp(s, gn[i]) == 0)
2523         {
2524             return i;
2525         }
2526     }
2527
2528     gmx_fatal(FARGS, "this QM method or basisset (%s) is not implemented\n!", s);
2529
2530     return -1;
2531
2532 } /* search_QMstring */
2533
2534 /* We would like gn to be const as well, but C doesn't allow this */
2535 /* TODO this is utility functionality (search for the index of a
2536    string in a collection), so should be refactored and located more
2537    centrally. */
2538 int search_string(const char *s, int ng, char *gn[])
2539 {
2540     int i;
2541
2542     for (i = 0; (i < ng); i++)
2543     {
2544         if (gmx_strcasecmp(s, gn[i]) == 0)
2545         {
2546             return i;
2547         }
2548     }
2549
2550     gmx_fatal(FARGS,
2551               "Group %s referenced in the .mdp file was not found in the index file.\n"
2552               "Group names must match either [moleculetype] names or custom index group\n"
2553               "names, in which case you must supply an index file to the '-n' option\n"
2554               "of grompp.",
2555               s);
2556
2557     return -1;
2558 }
2559
2560 static gmx_bool do_numbering(int natoms, gmx_groups_t *groups, int ng, char *ptrs[],
2561                              t_blocka *block, char *gnames[],
2562                              int gtype, int restnm,
2563                              int grptp, gmx_bool bVerbose,
2564                              warninp_t wi)
2565 {
2566     unsigned short *cbuf;
2567     t_grps         *grps = &(groups->grps[gtype]);
2568     int             i, j, gid, aj, ognr, ntot = 0;
2569     const char     *title;
2570     gmx_bool        bRest;
2571     char            warn_buf[STRLEN];
2572
2573     if (debug)
2574     {
2575         fprintf(debug, "Starting numbering %d groups of type %d\n", ng, gtype);
2576     }
2577
2578     title = gtypes[gtype];
2579
2580     snew(cbuf, natoms);
2581     /* Mark all id's as not set */
2582     for (i = 0; (i < natoms); i++)
2583     {
2584         cbuf[i] = NOGID;
2585     }
2586
2587     snew(grps->nm_ind, ng+1); /* +1 for possible rest group */
2588     for (i = 0; (i < ng); i++)
2589     {
2590         /* Lookup the group name in the block structure */
2591         gid = search_string(ptrs[i], block->nr, gnames);
2592         if ((grptp != egrptpONE) || (i == 0))
2593         {
2594             grps->nm_ind[grps->nr++] = gid;
2595         }
2596         if (debug)
2597         {
2598             fprintf(debug, "Found gid %d for group %s\n", gid, ptrs[i]);
2599         }
2600
2601         /* Now go over the atoms in the group */
2602         for (j = block->index[gid]; (j < block->index[gid+1]); j++)
2603         {
2604
2605             aj = block->a[j];
2606
2607             /* Range checking */
2608             if ((aj < 0) || (aj >= natoms))
2609             {
2610                 gmx_fatal(FARGS, "Invalid atom number %d in indexfile", aj);
2611             }
2612             /* Lookup up the old group number */
2613             ognr = cbuf[aj];
2614             if (ognr != NOGID)
2615             {
2616                 gmx_fatal(FARGS, "Atom %d in multiple %s groups (%d and %d)",
2617                           aj+1, title, ognr+1, i+1);
2618             }
2619             else
2620             {
2621                 /* Store the group number in buffer */
2622                 if (grptp == egrptpONE)
2623                 {
2624                     cbuf[aj] = 0;
2625                 }
2626                 else
2627                 {
2628                     cbuf[aj] = i;
2629                 }
2630                 ntot++;
2631             }
2632         }
2633     }
2634
2635     /* Now check whether we have done all atoms */
2636     bRest = FALSE;
2637     if (ntot != natoms)
2638     {
2639         if (grptp == egrptpALL)
2640         {
2641             gmx_fatal(FARGS, "%d atoms are not part of any of the %s groups",
2642                       natoms-ntot, title);
2643         }
2644         else if (grptp == egrptpPART)
2645         {
2646             sprintf(warn_buf, "%d atoms are not part of any of the %s groups",
2647                     natoms-ntot, title);
2648             warning_note(wi, warn_buf);
2649         }
2650         /* Assign all atoms currently unassigned to a rest group */
2651         for (j = 0; (j < natoms); j++)
2652         {
2653             if (cbuf[j] == NOGID)
2654             {
2655                 cbuf[j] = grps->nr;
2656                 bRest   = TRUE;
2657             }
2658         }
2659         if (grptp != egrptpPART)
2660         {
2661             if (bVerbose)
2662             {
2663                 fprintf(stderr,
2664                         "Making dummy/rest group for %s containing %d elements\n",
2665                         title, natoms-ntot);
2666             }
2667             /* Add group name "rest" */
2668             grps->nm_ind[grps->nr] = restnm;
2669
2670             /* Assign the rest name to all atoms not currently assigned to a group */
2671             for (j = 0; (j < natoms); j++)
2672             {
2673                 if (cbuf[j] == NOGID)
2674                 {
2675                     cbuf[j] = grps->nr;
2676                 }
2677             }
2678             grps->nr++;
2679         }
2680     }
2681
2682     if (grps->nr == 1 && (ntot == 0 || ntot == natoms))
2683     {
2684         /* All atoms are part of one (or no) group, no index required */
2685         groups->ngrpnr[gtype] = 0;
2686         groups->grpnr[gtype]  = NULL;
2687     }
2688     else
2689     {
2690         groups->ngrpnr[gtype] = natoms;
2691         snew(groups->grpnr[gtype], natoms);
2692         for (j = 0; (j < natoms); j++)
2693         {
2694             groups->grpnr[gtype][j] = cbuf[j];
2695         }
2696     }
2697
2698     sfree(cbuf);
2699
2700     return (bRest && grptp == egrptpPART);
2701 }
2702
2703 static void calc_nrdf(gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
2704 {
2705     t_grpopts              *opts;
2706     gmx_groups_t           *groups;
2707     pull_params_t          *pull;
2708     int                     natoms, ai, aj, i, j, d, g, imin, jmin;
2709     t_iatom                *ia;
2710     int                    *nrdf2, *na_vcm, na_tot;
2711     double                 *nrdf_tc, *nrdf_vcm, nrdf_uc, n_sub = 0;
2712     gmx_mtop_atomloop_all_t aloop;
2713     t_atom                 *atom;
2714     int                     mb, mol, ftype, as;
2715     gmx_molblock_t         *molb;
2716     gmx_moltype_t          *molt;
2717
2718     /* Calculate nrdf.
2719      * First calc 3xnr-atoms for each group
2720      * then subtract half a degree of freedom for each constraint
2721      *
2722      * Only atoms and nuclei contribute to the degrees of freedom...
2723      */
2724
2725     opts = &ir->opts;
2726
2727     groups = &mtop->groups;
2728     natoms = mtop->natoms;
2729
2730     /* Allocate one more for a possible rest group */
2731     /* We need to sum degrees of freedom into doubles,
2732      * since floats give too low nrdf's above 3 million atoms.
2733      */
2734     snew(nrdf_tc, groups->grps[egcTC].nr+1);
2735     snew(nrdf_vcm, groups->grps[egcVCM].nr+1);
2736     snew(na_vcm, groups->grps[egcVCM].nr+1);
2737
2738     for (i = 0; i < groups->grps[egcTC].nr; i++)
2739     {
2740         nrdf_tc[i] = 0;
2741     }
2742     for (i = 0; i < groups->grps[egcVCM].nr+1; i++)
2743     {
2744         nrdf_vcm[i] = 0;
2745     }
2746
2747     snew(nrdf2, natoms);
2748     aloop = gmx_mtop_atomloop_all_init(mtop);
2749     while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
2750     {
2751         nrdf2[i] = 0;
2752         if (atom->ptype == eptAtom || atom->ptype == eptNucleus)
2753         {
2754             g = ggrpnr(groups, egcFREEZE, i);
2755             /* Double count nrdf for particle i */
2756             for (d = 0; d < DIM; d++)
2757             {
2758                 if (opts->nFreeze[g][d] == 0)
2759                 {
2760                     nrdf2[i] += 2;
2761                 }
2762             }
2763             nrdf_tc [ggrpnr(groups, egcTC, i)]  += 0.5*nrdf2[i];
2764             nrdf_vcm[ggrpnr(groups, egcVCM, i)] += 0.5*nrdf2[i];
2765         }
2766     }
2767
2768     as = 0;
2769     for (mb = 0; mb < mtop->nmolblock; mb++)
2770     {
2771         molb = &mtop->molblock[mb];
2772         molt = &mtop->moltype[molb->type];
2773         atom = molt->atoms.atom;
2774         for (mol = 0; mol < molb->nmol; mol++)
2775         {
2776             for (ftype = F_CONSTR; ftype <= F_CONSTRNC; ftype++)
2777             {
2778                 ia = molt->ilist[ftype].iatoms;
2779                 for (i = 0; i < molt->ilist[ftype].nr; )
2780                 {
2781                     /* Subtract degrees of freedom for the constraints,
2782                      * if the particles still have degrees of freedom left.
2783                      * If one of the particles is a vsite or a shell, then all
2784                      * constraint motion will go there, but since they do not
2785                      * contribute to the constraints the degrees of freedom do not
2786                      * change.
2787                      */
2788                     ai = as + ia[1];
2789                     aj = as + ia[2];
2790                     if (((atom[ia[1]].ptype == eptNucleus) ||
2791                          (atom[ia[1]].ptype == eptAtom)) &&
2792                         ((atom[ia[2]].ptype == eptNucleus) ||
2793                          (atom[ia[2]].ptype == eptAtom)))
2794                     {
2795                         if (nrdf2[ai] > 0)
2796                         {
2797                             jmin = 1;
2798                         }
2799                         else
2800                         {
2801                             jmin = 2;
2802                         }
2803                         if (nrdf2[aj] > 0)
2804                         {
2805                             imin = 1;
2806                         }
2807                         else
2808                         {
2809                             imin = 2;
2810                         }
2811                         imin       = std::min(imin, nrdf2[ai]);
2812                         jmin       = std::min(jmin, nrdf2[aj]);
2813                         nrdf2[ai] -= imin;
2814                         nrdf2[aj] -= jmin;
2815                         nrdf_tc [ggrpnr(groups, egcTC, ai)]  -= 0.5*imin;
2816                         nrdf_tc [ggrpnr(groups, egcTC, aj)]  -= 0.5*jmin;
2817                         nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2818                         nrdf_vcm[ggrpnr(groups, egcVCM, aj)] -= 0.5*jmin;
2819                     }
2820                     ia += interaction_function[ftype].nratoms+1;
2821                     i  += interaction_function[ftype].nratoms+1;
2822                 }
2823             }
2824             ia = molt->ilist[F_SETTLE].iatoms;
2825             for (i = 0; i < molt->ilist[F_SETTLE].nr; )
2826             {
2827                 /* Subtract 1 dof from every atom in the SETTLE */
2828                 for (j = 0; j < 3; j++)
2829                 {
2830                     ai         = as + ia[1+j];
2831                     imin       = std::min(2, nrdf2[ai]);
2832                     nrdf2[ai] -= imin;
2833                     nrdf_tc [ggrpnr(groups, egcTC, ai)]  -= 0.5*imin;
2834                     nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2835                 }
2836                 ia += 4;
2837                 i  += 4;
2838             }
2839             as += molt->atoms.nr;
2840         }
2841     }
2842
2843     if (ir->bPull)
2844     {
2845         /* Correct nrdf for the COM constraints.
2846          * We correct using the TC and VCM group of the first atom
2847          * in the reference and pull group. If atoms in one pull group
2848          * belong to different TC or VCM groups it is anyhow difficult
2849          * to determine the optimal nrdf assignment.
2850          */
2851         pull = ir->pull;
2852
2853         for (i = 0; i < pull->ncoord; i++)
2854         {
2855             if (pull->coord[i].eType != epullCONSTRAINT)
2856             {
2857                 continue;
2858             }
2859
2860             imin = 1;
2861
2862             for (j = 0; j < 2; j++)
2863             {
2864                 const t_pull_group *pgrp;
2865
2866                 pgrp = &pull->group[pull->coord[i].group[j]];
2867
2868                 if (pgrp->nat > 0)
2869                 {
2870                     /* Subtract 1/2 dof from each group */
2871                     ai = pgrp->ind[0];
2872                     nrdf_tc [ggrpnr(groups, egcTC, ai)]  -= 0.5*imin;
2873                     nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2874                     if (nrdf_tc[ggrpnr(groups, egcTC, ai)] < 0)
2875                     {
2876                         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)]]);
2877                     }
2878                 }
2879                 else
2880                 {
2881                     /* We need to subtract the whole DOF from group j=1 */
2882                     imin += 1;
2883                 }
2884             }
2885         }
2886     }
2887
2888     if (ir->nstcomm != 0)
2889     {
2890         /* Subtract 3 from the number of degrees of freedom in each vcm group
2891          * when com translation is removed and 6 when rotation is removed
2892          * as well.
2893          */
2894         switch (ir->comm_mode)
2895         {
2896             case ecmLINEAR:
2897                 n_sub = ndof_com(ir);
2898                 break;
2899             case ecmANGULAR:
2900                 n_sub = 6;
2901                 break;
2902             default:
2903                 gmx_incons("Checking comm_mode");
2904         }
2905
2906         for (i = 0; i < groups->grps[egcTC].nr; i++)
2907         {
2908             /* Count the number of atoms of TC group i for every VCM group */
2909             for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
2910             {
2911                 na_vcm[j] = 0;
2912             }
2913             na_tot = 0;
2914             for (ai = 0; ai < natoms; ai++)
2915             {
2916                 if (ggrpnr(groups, egcTC, ai) == i)
2917                 {
2918                     na_vcm[ggrpnr(groups, egcVCM, ai)]++;
2919                     na_tot++;
2920                 }
2921             }
2922             /* Correct for VCM removal according to the fraction of each VCM
2923              * group present in this TC group.
2924              */
2925             nrdf_uc = nrdf_tc[i];
2926             if (debug)
2927             {
2928                 fprintf(debug, "T-group[%d] nrdf_uc = %g, n_sub = %g\n",
2929                         i, nrdf_uc, n_sub);
2930             }
2931             nrdf_tc[i] = 0;
2932             for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
2933             {
2934                 if (nrdf_vcm[j] > n_sub)
2935                 {
2936                     nrdf_tc[i] += nrdf_uc*((double)na_vcm[j]/(double)na_tot)*
2937                         (nrdf_vcm[j] - n_sub)/nrdf_vcm[j];
2938                 }
2939                 if (debug)
2940                 {
2941                     fprintf(debug, "  nrdf_vcm[%d] = %g, nrdf = %g\n",
2942                             j, nrdf_vcm[j], nrdf_tc[i]);
2943                 }
2944             }
2945         }
2946     }
2947     for (i = 0; (i < groups->grps[egcTC].nr); i++)
2948     {
2949         opts->nrdf[i] = nrdf_tc[i];
2950         if (opts->nrdf[i] < 0)
2951         {
2952             opts->nrdf[i] = 0;
2953         }
2954         fprintf(stderr,
2955                 "Number of degrees of freedom in T-Coupling group %s is %.2f\n",
2956                 gnames[groups->grps[egcTC].nm_ind[i]], opts->nrdf[i]);
2957     }
2958
2959     sfree(nrdf2);
2960     sfree(nrdf_tc);
2961     sfree(nrdf_vcm);
2962     sfree(na_vcm);
2963 }
2964
2965 static void decode_cos(char *s, t_cosines *cosine)
2966 {
2967     char   *t;
2968     char    format[STRLEN], f1[STRLEN];
2969     double  a, phi;
2970     int     i;
2971
2972     t = gmx_strdup(s);
2973     trim(t);
2974
2975     cosine->n   = 0;
2976     cosine->a   = NULL;
2977     cosine->phi = NULL;
2978     if (strlen(t))
2979     {
2980         sscanf(t, "%d", &(cosine->n));
2981         if (cosine->n <= 0)
2982         {
2983             cosine->n = 0;
2984         }
2985         else
2986         {
2987             snew(cosine->a, cosine->n);
2988             snew(cosine->phi, cosine->n);
2989
2990             sprintf(format, "%%*d");
2991             for (i = 0; (i < cosine->n); i++)
2992             {
2993                 strcpy(f1, format);
2994                 strcat(f1, "%lf%lf");
2995                 if (sscanf(t, f1, &a, &phi) < 2)
2996                 {
2997                     gmx_fatal(FARGS, "Invalid input for electric field shift: '%s'", t);
2998                 }
2999                 cosine->a[i]   = a;
3000                 cosine->phi[i] = phi;
3001                 strcat(format, "%*lf%*lf");
3002             }
3003         }
3004     }
3005     sfree(t);
3006 }
3007
3008 static gmx_bool do_egp_flag(t_inputrec *ir, gmx_groups_t *groups,
3009                             const char *option, const char *val, int flag)
3010 {
3011     /* The maximum number of energy group pairs would be MAXPTR*(MAXPTR+1)/2.
3012      * But since this is much larger than STRLEN, such a line can not be parsed.
3013      * The real maximum is the number of names that fit in a string: STRLEN/2.
3014      */
3015 #define EGP_MAX (STRLEN/2)
3016     int      nelem, i, j, k, nr;
3017     char    *names[EGP_MAX];
3018     char  ***gnames;
3019     gmx_bool bSet;
3020
3021     gnames = groups->grpname;
3022
3023     nelem = str_nelem(val, EGP_MAX, names);
3024     if (nelem % 2 != 0)
3025     {
3026         gmx_fatal(FARGS, "The number of groups for %s is odd", option);
3027     }
3028     nr   = groups->grps[egcENER].nr;
3029     bSet = FALSE;
3030     for (i = 0; i < nelem/2; i++)
3031     {
3032         j = 0;
3033         while ((j < nr) &&
3034                gmx_strcasecmp(names[2*i], *(gnames[groups->grps[egcENER].nm_ind[j]])))
3035         {
3036             j++;
3037         }
3038         if (j == nr)
3039         {
3040             gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3041                       names[2*i], option);
3042         }
3043         k = 0;
3044         while ((k < nr) &&
3045                gmx_strcasecmp(names[2*i+1], *(gnames[groups->grps[egcENER].nm_ind[k]])))
3046         {
3047             k++;
3048         }
3049         if (k == nr)
3050         {
3051             gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3052                       names[2*i+1], option);
3053         }
3054         if ((j < nr) && (k < nr))
3055         {
3056             ir->opts.egp_flags[nr*j+k] |= flag;
3057             ir->opts.egp_flags[nr*k+j] |= flag;
3058             bSet = TRUE;
3059         }
3060     }
3061
3062     return bSet;
3063 }
3064
3065
3066 static void make_swap_groups(
3067         t_swapcoords  *swap,
3068         t_blocka      *grps,
3069         char         **gnames)
3070 {
3071     int          ig = -1, i = 0, gind;
3072     t_swapGroup *swapg;
3073
3074
3075     /* Just a quick check here, more thorough checks are in mdrun */
3076     if (strcmp(swap->grp[eGrpSplit0].molname, swap->grp[eGrpSplit1].molname) == 0)
3077     {
3078         gmx_fatal(FARGS, "The split groups can not both be '%s'.", swap->grp[eGrpSplit0].molname);
3079     }
3080
3081     /* Get the index atoms of the split0, split1, solvent, and swap groups */
3082     for (ig = 0; ig < swap->ngrp; ig++)
3083     {
3084         swapg      = &swap->grp[ig];
3085         gind       = search_string(swap->grp[ig].molname, grps->nr, gnames);
3086         swapg->nat = grps->index[gind+1] - grps->index[gind];
3087
3088         if (swapg->nat > 0)
3089         {
3090             fprintf(stderr, "%s group '%s' contains %d atoms.\n",
3091                     ig < 3 ? eSwapFixedGrp_names[ig] : "Swap",
3092                     swap->grp[ig].molname, swapg->nat);
3093             snew(swapg->ind, swapg->nat);
3094             for (i = 0; i < swapg->nat; i++)
3095             {
3096                 swapg->ind[i] = grps->a[grps->index[gind]+i];
3097             }
3098         }
3099         else
3100         {
3101             gmx_fatal(FARGS, "Swap group %s does not contain any atoms.", swap->grp[ig].molname);
3102         }
3103     }
3104 }
3105
3106
3107 void make_IMD_group(t_IMD *IMDgroup, char *IMDgname, t_blocka *grps, char **gnames)
3108 {
3109     int      ig, i;
3110
3111
3112     ig            = search_string(IMDgname, grps->nr, gnames);
3113     IMDgroup->nat = grps->index[ig+1] - grps->index[ig];
3114
3115     if (IMDgroup->nat > 0)
3116     {
3117         fprintf(stderr, "Group '%s' with %d atoms can be activated for interactive molecular dynamics (IMD).\n",
3118                 IMDgname, IMDgroup->nat);
3119         snew(IMDgroup->ind, IMDgroup->nat);
3120         for (i = 0; i < IMDgroup->nat; i++)
3121         {
3122             IMDgroup->ind[i] = grps->a[grps->index[ig]+i];
3123         }
3124     }
3125 }
3126
3127
3128 void do_index(const char* mdparin, const char *ndx,
3129               gmx_mtop_t *mtop,
3130               gmx_bool bVerbose,
3131               t_inputrec *ir,
3132               warninp_t wi)
3133 {
3134     t_blocka     *grps;
3135     gmx_groups_t *groups;
3136     int           natoms;
3137     t_symtab     *symtab;
3138     t_atoms       atoms_all;
3139     char          warnbuf[STRLEN], **gnames;
3140     int           nr, ntcg, ntau_t, nref_t, nacc, nofg, nSA, nSA_points, nSA_time, nSA_temp;
3141     real          tau_min;
3142     int           nstcmin;
3143     int           nacg, nfreeze, nfrdim, nenergy, nvcm, nuser;
3144     char         *ptr1[MAXPTR], *ptr2[MAXPTR], *ptr3[MAXPTR];
3145     int           i, j, k, restnm;
3146     gmx_bool      bExcl, bTable, bSetTCpar, bAnneal, bRest;
3147     int           nQMmethod, nQMbasis, nQMg;
3148     char          warn_buf[STRLEN];
3149     char*         endptr;
3150
3151     if (bVerbose)
3152     {
3153         fprintf(stderr, "processing index file...\n");
3154     }
3155     if (ndx == NULL)
3156     {
3157         snew(grps, 1);
3158         snew(grps->index, 1);
3159         snew(gnames, 1);
3160         atoms_all = gmx_mtop_global_atoms(mtop);
3161         analyse(&atoms_all, grps, &gnames, FALSE, TRUE);
3162         done_atom(&atoms_all);
3163     }
3164     else
3165     {
3166         grps = init_index(ndx, &gnames);
3167     }
3168
3169     groups = &mtop->groups;
3170     natoms = mtop->natoms;
3171     symtab = &mtop->symtab;
3172
3173     snew(groups->grpname, grps->nr+1);
3174
3175     for (i = 0; (i < grps->nr); i++)
3176     {
3177         groups->grpname[i] = put_symtab(symtab, gnames[i]);
3178     }
3179     groups->grpname[i] = put_symtab(symtab, "rest");
3180     restnm             = i;
3181     srenew(gnames, grps->nr+1);
3182     gnames[restnm]   = *(groups->grpname[i]);
3183     groups->ngrpname = grps->nr+1;
3184
3185     set_warning_line(wi, mdparin, -1);
3186
3187     ntau_t = str_nelem(is->tau_t, MAXPTR, ptr1);
3188     nref_t = str_nelem(is->ref_t, MAXPTR, ptr2);
3189     ntcg   = str_nelem(is->tcgrps, MAXPTR, ptr3);
3190     if ((ntau_t != ntcg) || (nref_t != ntcg))
3191     {
3192         gmx_fatal(FARGS, "Invalid T coupling input: %d groups, %d ref-t values and "
3193                   "%d tau-t values", ntcg, nref_t, ntau_t);
3194     }
3195
3196     bSetTCpar = (ir->etc || EI_SD(ir->eI) || ir->eI == eiBD || EI_TPI(ir->eI));
3197     do_numbering(natoms, groups, ntcg, ptr3, grps, gnames, egcTC,
3198                  restnm, bSetTCpar ? egrptpALL : egrptpALL_GENREST, bVerbose, wi);
3199     nr            = groups->grps[egcTC].nr;
3200     ir->opts.ngtc = nr;
3201     snew(ir->opts.nrdf, nr);
3202     snew(ir->opts.tau_t, nr);
3203     snew(ir->opts.ref_t, nr);
3204     if (ir->eI == eiBD && ir->bd_fric == 0)
3205     {
3206         fprintf(stderr, "bd-fric=0, so tau-t will be used as the inverse friction constant(s)\n");
3207     }
3208
3209     if (bSetTCpar)
3210     {
3211         if (nr != nref_t)
3212         {
3213             gmx_fatal(FARGS, "Not enough ref-t and tau-t values!");
3214         }
3215
3216         tau_min = 1e20;
3217         for (i = 0; (i < nr); i++)
3218         {
3219             ir->opts.tau_t[i] = strtod(ptr1[i], &endptr);
3220             if (*endptr != 0)
3221             {
3222                 warning_error(wi, "Invalid value for mdp option tau-t. tau-t should only consist of real numbers separated by spaces.");
3223             }
3224             if ((ir->eI == eiBD || ir->eI == eiSD2) && ir->opts.tau_t[i] <= 0)
3225             {
3226                 sprintf(warn_buf, "With integrator %s tau-t should be larger than 0", ei_names[ir->eI]);
3227                 warning_error(wi, warn_buf);
3228             }
3229
3230             if (ir->etc != etcVRESCALE && ir->opts.tau_t[i] == 0)
3231             {
3232                 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.");
3233             }
3234
3235             if (ir->opts.tau_t[i] >= 0)
3236             {
3237                 tau_min = std::min(tau_min, ir->opts.tau_t[i]);
3238             }
3239         }
3240         if (ir->etc != etcNO && ir->nsttcouple == -1)
3241         {
3242             ir->nsttcouple = ir_optimal_nsttcouple(ir);
3243         }
3244
3245         if (EI_VV(ir->eI))
3246         {
3247             if ((ir->etc == etcNOSEHOOVER) && (ir->epc == epcBERENDSEN))
3248             {
3249                 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");
3250             }
3251             if ((ir->epc == epcMTTK) && (ir->etc > etcNO))
3252             {
3253                 if (ir->nstpcouple != ir->nsttcouple)
3254                 {
3255                     int mincouple = std::min(ir->nstpcouple, ir->nsttcouple);
3256                     ir->nstpcouple = ir->nsttcouple = mincouple;
3257                     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);
3258                     warning_note(wi, warn_buf);
3259                 }
3260             }
3261         }
3262         /* velocity verlet with averaged kinetic energy KE = 0.5*(v(t+1/2) - v(t-1/2)) is implemented
3263            primarily for testing purposes, and does not work with temperature coupling other than 1 */
3264
3265         if (ETC_ANDERSEN(ir->etc))
3266         {
3267             if (ir->nsttcouple != 1)
3268             {
3269                 ir->nsttcouple = 1;
3270                 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");
3271                 warning_note(wi, warn_buf);
3272             }
3273         }
3274         nstcmin = tcouple_min_integration_steps(ir->etc);
3275         if (nstcmin > 1)
3276         {
3277             if (tau_min/(ir->delta_t*ir->nsttcouple) < nstcmin - 10*GMX_REAL_EPS)
3278             {
3279                 sprintf(warn_buf, "For proper integration of the %s thermostat, tau-t (%g) should be at least %d times larger than nsttcouple*dt (%g)",
3280                         ETCOUPLTYPE(ir->etc),
3281                         tau_min, nstcmin,
3282                         ir->nsttcouple*ir->delta_t);
3283                 warning(wi, warn_buf);
3284             }
3285         }
3286         for (i = 0; (i < nr); i++)
3287         {
3288             ir->opts.ref_t[i] = strtod(ptr2[i], &endptr);
3289             if (*endptr != 0)
3290             {
3291                 warning_error(wi, "Invalid value for mdp option ref-t. ref-t should only consist of real numbers separated by spaces.");
3292             }
3293             if (ir->opts.ref_t[i] < 0)
3294             {
3295                 gmx_fatal(FARGS, "ref-t for group %d negative", i);
3296             }
3297         }
3298         /* set the lambda mc temperature to the md integrator temperature (which should be defined
3299            if we are in this conditional) if mc_temp is negative */
3300         if (ir->expandedvals->mc_temp < 0)
3301         {
3302             ir->expandedvals->mc_temp = ir->opts.ref_t[0]; /*for now, set to the first reft */
3303         }
3304     }
3305
3306     /* Simulated annealing for each group. There are nr groups */
3307     nSA = str_nelem(is->anneal, MAXPTR, ptr1);
3308     if (nSA == 1 && (ptr1[0][0] == 'n' || ptr1[0][0] == 'N'))
3309     {
3310         nSA = 0;
3311     }
3312     if (nSA > 0 && nSA != nr)
3313     {
3314         gmx_fatal(FARGS, "Not enough annealing values: %d (for %d groups)\n", nSA, nr);
3315     }
3316     else
3317     {
3318         snew(ir->opts.annealing, nr);
3319         snew(ir->opts.anneal_npoints, nr);
3320         snew(ir->opts.anneal_time, nr);
3321         snew(ir->opts.anneal_temp, nr);
3322         for (i = 0; i < nr; i++)
3323         {
3324             ir->opts.annealing[i]      = eannNO;
3325             ir->opts.anneal_npoints[i] = 0;
3326             ir->opts.anneal_time[i]    = NULL;
3327             ir->opts.anneal_temp[i]    = NULL;
3328         }
3329         if (nSA > 0)
3330         {
3331             bAnneal = FALSE;
3332             for (i = 0; i < nr; i++)
3333             {
3334                 if (ptr1[i][0] == 'n' || ptr1[i][0] == 'N')
3335                 {
3336                     ir->opts.annealing[i] = eannNO;
3337                 }
3338                 else if (ptr1[i][0] == 's' || ptr1[i][0] == 'S')
3339                 {
3340                     ir->opts.annealing[i] = eannSINGLE;
3341                     bAnneal               = TRUE;
3342                 }
3343                 else if (ptr1[i][0] == 'p' || ptr1[i][0] == 'P')
3344                 {
3345                     ir->opts.annealing[i] = eannPERIODIC;
3346                     bAnneal               = TRUE;
3347                 }
3348             }
3349             if (bAnneal)
3350             {
3351                 /* Read the other fields too */
3352                 nSA_points = str_nelem(is->anneal_npoints, MAXPTR, ptr1);
3353                 if (nSA_points != nSA)
3354                 {
3355                     gmx_fatal(FARGS, "Found %d annealing-npoints values for %d groups\n", nSA_points, nSA);
3356                 }
3357                 for (k = 0, i = 0; i < nr; i++)
3358                 {
3359                     ir->opts.anneal_npoints[i] = strtol(ptr1[i], &endptr, 10);
3360                     if (*endptr != 0)
3361                     {
3362                         warning_error(wi, "Invalid value for mdp option annealing-npoints. annealing should only consist of integers separated by spaces.");
3363                     }
3364                     if (ir->opts.anneal_npoints[i] == 1)
3365                     {
3366                         gmx_fatal(FARGS, "Please specify at least a start and an end point for annealing\n");
3367                     }
3368                     snew(ir->opts.anneal_time[i], ir->opts.anneal_npoints[i]);
3369                     snew(ir->opts.anneal_temp[i], ir->opts.anneal_npoints[i]);
3370                     k += ir->opts.anneal_npoints[i];
3371                 }
3372
3373                 nSA_time = str_nelem(is->anneal_time, MAXPTR, ptr1);
3374                 if (nSA_time != k)
3375                 {
3376                     gmx_fatal(FARGS, "Found %d annealing-time values, wanter %d\n", nSA_time, k);
3377                 }
3378                 nSA_temp = str_nelem(is->anneal_temp, MAXPTR, ptr2);
3379                 if (nSA_temp != k)
3380                 {
3381                     gmx_fatal(FARGS, "Found %d annealing-temp values, wanted %d\n", nSA_temp, k);
3382                 }
3383
3384                 for (i = 0, k = 0; i < nr; i++)
3385                 {
3386
3387                     for (j = 0; j < ir->opts.anneal_npoints[i]; j++)
3388                     {
3389                         ir->opts.anneal_time[i][j] = strtod(ptr1[k], &endptr);
3390                         if (*endptr != 0)
3391                         {
3392                             warning_error(wi, "Invalid value for mdp option anneal-time. anneal-time should only consist of real numbers separated by spaces.");
3393                         }
3394                         ir->opts.anneal_temp[i][j] = strtod(ptr2[k], &endptr);
3395                         if (*endptr != 0)
3396                         {
3397                             warning_error(wi, "Invalid value for anneal-temp. anneal-temp should only consist of real numbers separated by spaces.");
3398                         }
3399                         if (j == 0)
3400                         {
3401                             if (ir->opts.anneal_time[i][0] > (ir->init_t+GMX_REAL_EPS))
3402                             {
3403                                 gmx_fatal(FARGS, "First time point for annealing > init_t.\n");
3404                             }
3405                         }
3406                         else
3407                         {
3408                             /* j>0 */
3409                             if (ir->opts.anneal_time[i][j] < ir->opts.anneal_time[i][j-1])
3410                             {
3411                                 gmx_fatal(FARGS, "Annealing timepoints out of order: t=%f comes after t=%f\n",
3412                                           ir->opts.anneal_time[i][j], ir->opts.anneal_time[i][j-1]);
3413                             }
3414                         }
3415                         if (ir->opts.anneal_temp[i][j] < 0)
3416                         {
3417                             gmx_fatal(FARGS, "Found negative temperature in annealing: %f\n", ir->opts.anneal_temp[i][j]);
3418                         }
3419                         k++;
3420                     }
3421                 }
3422                 /* Print out some summary information, to make sure we got it right */
3423                 for (i = 0, k = 0; i < nr; i++)
3424                 {
3425                     if (ir->opts.annealing[i] != eannNO)
3426                     {
3427                         j = groups->grps[egcTC].nm_ind[i];
3428                         fprintf(stderr, "Simulated annealing for group %s: %s, %d timepoints\n",
3429                                 *(groups->grpname[j]), eann_names[ir->opts.annealing[i]],
3430                                 ir->opts.anneal_npoints[i]);
3431                         fprintf(stderr, "Time (ps)   Temperature (K)\n");
3432                         /* All terms except the last one */
3433                         for (j = 0; j < (ir->opts.anneal_npoints[i]-1); j++)
3434                         {
3435                             fprintf(stderr, "%9.1f      %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3436                         }
3437
3438                         /* Finally the last one */
3439                         j = ir->opts.anneal_npoints[i]-1;
3440                         if (ir->opts.annealing[i] == eannSINGLE)
3441                         {
3442                             fprintf(stderr, "%9.1f-     %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3443                         }
3444                         else
3445                         {
3446                             fprintf(stderr, "%9.1f      %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3447                             if (fabs(ir->opts.anneal_temp[i][j]-ir->opts.anneal_temp[i][0]) > GMX_REAL_EPS)
3448                             {
3449                                 warning_note(wi, "There is a temperature jump when your annealing loops back.\n");
3450                             }
3451                         }
3452                     }
3453                 }
3454             }
3455         }
3456     }
3457
3458     if (ir->bPull)
3459     {
3460         make_pull_groups(ir->pull, is->pull_grp, grps, gnames);
3461
3462         make_pull_coords(ir->pull);
3463     }
3464
3465     if (ir->bRot)
3466     {
3467         make_rotation_groups(ir->rot, is->rot_grp, grps, gnames);
3468     }
3469
3470     if (ir->eSwapCoords != eswapNO)
3471     {
3472         make_swap_groups(ir->swap, grps, gnames);
3473     }
3474
3475     /* Make indices for IMD session */
3476     if (ir->bIMD)
3477     {
3478         make_IMD_group(ir->imd, is->imd_grp, grps, gnames);
3479     }
3480
3481     nacc = str_nelem(is->acc, MAXPTR, ptr1);
3482     nacg = str_nelem(is->accgrps, MAXPTR, ptr2);
3483     if (nacg*DIM != nacc)
3484     {
3485         gmx_fatal(FARGS, "Invalid Acceleration input: %d groups and %d acc. values",
3486                   nacg, nacc);
3487     }
3488     do_numbering(natoms, groups, nacg, ptr2, grps, gnames, egcACC,
3489                  restnm, egrptpALL_GENREST, bVerbose, wi);
3490     nr = groups->grps[egcACC].nr;
3491     snew(ir->opts.acc, nr);
3492     ir->opts.ngacc = nr;
3493
3494     for (i = k = 0; (i < nacg); i++)
3495     {
3496         for (j = 0; (j < DIM); j++, k++)
3497         {
3498             ir->opts.acc[i][j] = strtod(ptr1[k], &endptr);
3499             if (*endptr != 0)
3500             {
3501                 warning_error(wi, "Invalid value for mdp option accelerate. accelerate should only consist of real numbers separated by spaces.");
3502             }
3503         }
3504     }
3505     for (; (i < nr); i++)
3506     {
3507         for (j = 0; (j < DIM); j++)
3508         {
3509             ir->opts.acc[i][j] = 0;
3510         }
3511     }
3512
3513     nfrdim  = str_nelem(is->frdim, MAXPTR, ptr1);
3514     nfreeze = str_nelem(is->freeze, MAXPTR, ptr2);
3515     if (nfrdim != DIM*nfreeze)
3516     {
3517         gmx_fatal(FARGS, "Invalid Freezing input: %d groups and %d freeze values",
3518                   nfreeze, nfrdim);
3519     }
3520     do_numbering(natoms, groups, nfreeze, ptr2, grps, gnames, egcFREEZE,
3521                  restnm, egrptpALL_GENREST, bVerbose, wi);
3522     nr             = groups->grps[egcFREEZE].nr;
3523     ir->opts.ngfrz = nr;
3524     snew(ir->opts.nFreeze, nr);
3525     for (i = k = 0; (i < nfreeze); i++)
3526     {
3527         for (j = 0; (j < DIM); j++, k++)
3528         {
3529             ir->opts.nFreeze[i][j] = (gmx_strncasecmp(ptr1[k], "Y", 1) == 0);
3530             if (!ir->opts.nFreeze[i][j])
3531             {
3532                 if (gmx_strncasecmp(ptr1[k], "N", 1) != 0)
3533                 {
3534                     sprintf(warnbuf, "Please use Y(ES) or N(O) for freezedim only "
3535                             "(not %s)", ptr1[k]);
3536                     warning(wi, warn_buf);
3537                 }
3538             }
3539         }
3540     }
3541     for (; (i < nr); i++)
3542     {
3543         for (j = 0; (j < DIM); j++)
3544         {
3545             ir->opts.nFreeze[i][j] = 0;
3546         }
3547     }
3548
3549     nenergy = str_nelem(is->energy, MAXPTR, ptr1);
3550     do_numbering(natoms, groups, nenergy, ptr1, grps, gnames, egcENER,
3551                  restnm, egrptpALL_GENREST, bVerbose, wi);
3552     add_wall_energrps(groups, ir->nwall, symtab);
3553     ir->opts.ngener = groups->grps[egcENER].nr;
3554     nvcm            = str_nelem(is->vcm, MAXPTR, ptr1);
3555     bRest           =
3556         do_numbering(natoms, groups, nvcm, ptr1, grps, gnames, egcVCM,
3557                      restnm, nvcm == 0 ? egrptpALL_GENREST : egrptpPART, bVerbose, wi);
3558     if (bRest)
3559     {
3560         warning(wi, "Some atoms are not part of any center of mass motion removal group.\n"
3561                 "This may lead to artifacts.\n"
3562                 "In most cases one should use one group for the whole system.");
3563     }
3564
3565     /* Now we have filled the freeze struct, so we can calculate NRDF */
3566     calc_nrdf(mtop, ir, gnames);
3567
3568     nuser = str_nelem(is->user1, MAXPTR, ptr1);
3569     do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser1,
3570                  restnm, egrptpALL_GENREST, bVerbose, wi);
3571     nuser = str_nelem(is->user2, MAXPTR, ptr1);
3572     do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser2,
3573                  restnm, egrptpALL_GENREST, bVerbose, wi);
3574     nuser = str_nelem(is->x_compressed_groups, MAXPTR, ptr1);
3575     do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcCompressedX,
3576                  restnm, egrptpONE, bVerbose, wi);
3577     nofg = str_nelem(is->orirefitgrp, MAXPTR, ptr1);
3578     do_numbering(natoms, groups, nofg, ptr1, grps, gnames, egcORFIT,
3579                  restnm, egrptpALL_GENREST, bVerbose, wi);
3580
3581     /* QMMM input processing */
3582     nQMg          = str_nelem(is->QMMM, MAXPTR, ptr1);
3583     nQMmethod     = str_nelem(is->QMmethod, MAXPTR, ptr2);
3584     nQMbasis      = str_nelem(is->QMbasis, MAXPTR, ptr3);
3585     if ((nQMmethod != nQMg) || (nQMbasis != nQMg))
3586     {
3587         gmx_fatal(FARGS, "Invalid QMMM input: %d groups %d basissets"
3588                   " and %d methods\n", nQMg, nQMbasis, nQMmethod);
3589     }
3590     /* group rest, if any, is always MM! */
3591     do_numbering(natoms, groups, nQMg, ptr1, grps, gnames, egcQMMM,
3592                  restnm, egrptpALL_GENREST, bVerbose, wi);
3593     nr            = nQMg; /*atoms->grps[egcQMMM].nr;*/
3594     ir->opts.ngQM = nQMg;
3595     snew(ir->opts.QMmethod, nr);
3596     snew(ir->opts.QMbasis, nr);
3597     for (i = 0; i < nr; i++)
3598     {
3599         /* input consists of strings: RHF CASSCF PM3 .. These need to be
3600          * converted to the corresponding enum in names.c
3601          */
3602         ir->opts.QMmethod[i] = search_QMstring(ptr2[i], eQMmethodNR,
3603                                                eQMmethod_names);
3604         ir->opts.QMbasis[i]  = search_QMstring(ptr3[i], eQMbasisNR,
3605                                                eQMbasis_names);
3606
3607     }
3608     str_nelem(is->QMmult, MAXPTR, ptr1);
3609     str_nelem(is->QMcharge, MAXPTR, ptr2);
3610     str_nelem(is->bSH, MAXPTR, ptr3);
3611     snew(ir->opts.QMmult, nr);
3612     snew(ir->opts.QMcharge, nr);
3613     snew(ir->opts.bSH, nr);
3614
3615     for (i = 0; i < nr; i++)
3616     {
3617         ir->opts.QMmult[i]   = strtol(ptr1[i], &endptr, 10);
3618         if (*endptr != 0)
3619         {
3620             warning_error(wi, "Invalid value for mdp option QMmult. QMmult should only consist of integers separated by spaces.");
3621         }
3622         ir->opts.QMcharge[i] = strtol(ptr2[i], &endptr, 10);
3623         if (*endptr != 0)
3624         {
3625             warning_error(wi, "Invalid value for mdp option QMcharge. QMcharge should only consist of integers separated by spaces.");
3626         }
3627         ir->opts.bSH[i]      = (gmx_strncasecmp(ptr3[i], "Y", 1) == 0);
3628     }
3629
3630     str_nelem(is->CASelectrons, MAXPTR, ptr1);
3631     str_nelem(is->CASorbitals, MAXPTR, ptr2);
3632     snew(ir->opts.CASelectrons, nr);
3633     snew(ir->opts.CASorbitals, nr);
3634     for (i = 0; i < nr; i++)
3635     {
3636         ir->opts.CASelectrons[i] = strtol(ptr1[i], &endptr, 10);
3637         if (*endptr != 0)
3638         {
3639             warning_error(wi, "Invalid value for mdp option CASelectrons. CASelectrons should only consist of integers separated by spaces.");
3640         }
3641         ir->opts.CASorbitals[i]  = strtol(ptr2[i], &endptr, 10);
3642         if (*endptr != 0)
3643         {
3644             warning_error(wi, "Invalid value for mdp option CASorbitals. CASorbitals should only consist of integers separated by spaces.");
3645         }
3646     }
3647     /* special optimization options */
3648
3649     str_nelem(is->bOPT, MAXPTR, ptr1);
3650     str_nelem(is->bTS, MAXPTR, ptr2);
3651     snew(ir->opts.bOPT, nr);
3652     snew(ir->opts.bTS, nr);
3653     for (i = 0; i < nr; i++)
3654     {
3655         ir->opts.bOPT[i] = (gmx_strncasecmp(ptr1[i], "Y", 1) == 0);
3656         ir->opts.bTS[i]  = (gmx_strncasecmp(ptr2[i], "Y", 1) == 0);
3657     }
3658     str_nelem(is->SAon, MAXPTR, ptr1);
3659     str_nelem(is->SAoff, MAXPTR, ptr2);
3660     str_nelem(is->SAsteps, MAXPTR, ptr3);
3661     snew(ir->opts.SAon, nr);
3662     snew(ir->opts.SAoff, nr);
3663     snew(ir->opts.SAsteps, nr);
3664
3665     for (i = 0; i < nr; i++)
3666     {
3667         ir->opts.SAon[i]    = strtod(ptr1[i], &endptr);
3668         if (*endptr != 0)
3669         {
3670             warning_error(wi, "Invalid value for mdp option SAon. SAon should only consist of real numbers separated by spaces.");
3671         }
3672         ir->opts.SAoff[i]   = strtod(ptr2[i], &endptr);
3673         if (*endptr != 0)
3674         {
3675             warning_error(wi, "Invalid value for mdp option SAoff. SAoff should only consist of real numbers separated by spaces.");
3676         }
3677         ir->opts.SAsteps[i] = strtol(ptr3[i], &endptr, 10);
3678         if (*endptr != 0)
3679         {
3680             warning_error(wi, "Invalid value for mdp option SAsteps. SAsteps should only consist of integers separated by spaces.");
3681         }
3682     }
3683     /* end of QMMM input */
3684
3685     if (bVerbose)
3686     {
3687         for (i = 0; (i < egcNR); i++)
3688         {
3689             fprintf(stderr, "%-16s has %d element(s):", gtypes[i], groups->grps[i].nr);
3690             for (j = 0; (j < groups->grps[i].nr); j++)
3691             {
3692                 fprintf(stderr, " %s", *(groups->grpname[groups->grps[i].nm_ind[j]]));
3693             }
3694             fprintf(stderr, "\n");
3695         }
3696     }
3697
3698     nr = groups->grps[egcENER].nr;
3699     snew(ir->opts.egp_flags, nr*nr);
3700
3701     bExcl = do_egp_flag(ir, groups, "energygrp-excl", is->egpexcl, EGP_EXCL);
3702     if (bExcl && ir->cutoff_scheme == ecutsVERLET)
3703     {
3704         warning_error(wi, "Energy group exclusions are not (yet) implemented for the Verlet scheme");
3705     }
3706     if (bExcl && EEL_FULL(ir->coulombtype))
3707     {
3708         warning(wi, "Can not exclude the lattice Coulomb energy between energy groups");
3709     }
3710
3711     bTable = do_egp_flag(ir, groups, "energygrp-table", is->egptable, EGP_TABLE);
3712     if (bTable && !(ir->vdwtype == evdwUSER) &&
3713         !(ir->coulombtype == eelUSER) && !(ir->coulombtype == eelPMEUSER) &&
3714         !(ir->coulombtype == eelPMEUSERSWITCH))
3715     {
3716         gmx_fatal(FARGS, "Can only have energy group pair tables in combination with user tables for VdW and/or Coulomb");
3717     }
3718
3719     decode_cos(is->efield_x, &(ir->ex[XX]));
3720     decode_cos(is->efield_xt, &(ir->et[XX]));
3721     decode_cos(is->efield_y, &(ir->ex[YY]));
3722     decode_cos(is->efield_yt, &(ir->et[YY]));
3723     decode_cos(is->efield_z, &(ir->ex[ZZ]));
3724     decode_cos(is->efield_zt, &(ir->et[ZZ]));
3725
3726     for (i = 0; (i < grps->nr); i++)
3727     {
3728         sfree(gnames[i]);
3729     }
3730     sfree(gnames);
3731     done_blocka(grps);
3732     sfree(grps);
3733
3734 }
3735
3736
3737
3738 static void check_disre(gmx_mtop_t *mtop)
3739 {
3740     gmx_ffparams_t *ffparams;
3741     t_functype     *functype;
3742     t_iparams      *ip;
3743     int             i, ndouble, ftype;
3744     int             label, old_label;
3745
3746     if (gmx_mtop_ftype_count(mtop, F_DISRES) > 0)
3747     {
3748         ffparams  = &mtop->ffparams;
3749         functype  = ffparams->functype;
3750         ip        = ffparams->iparams;
3751         ndouble   = 0;
3752         old_label = -1;
3753         for (i = 0; i < ffparams->ntypes; i++)
3754         {
3755             ftype = functype[i];
3756             if (ftype == F_DISRES)
3757             {
3758                 label = ip[i].disres.label;
3759                 if (label == old_label)
3760                 {
3761                     fprintf(stderr, "Distance restraint index %d occurs twice\n", label);
3762                     ndouble++;
3763                 }
3764                 old_label = label;
3765             }
3766         }
3767         if (ndouble > 0)
3768         {
3769             gmx_fatal(FARGS, "Found %d double distance restraint indices,\n"
3770                       "probably the parameters for multiple pairs in one restraint "
3771                       "are not identical\n", ndouble);
3772         }
3773     }
3774 }
3775
3776 static gmx_bool absolute_reference(t_inputrec *ir, gmx_mtop_t *sys,
3777                                    gmx_bool posres_only,
3778                                    ivec AbsRef)
3779 {
3780     int                  d, g, i;
3781     gmx_mtop_ilistloop_t iloop;
3782     t_ilist             *ilist;
3783     int                  nmol;
3784     t_iparams           *pr;
3785
3786     clear_ivec(AbsRef);
3787
3788     if (!posres_only)
3789     {
3790         /* Check the COM */
3791         for (d = 0; d < DIM; d++)
3792         {
3793             AbsRef[d] = (d < ndof_com(ir) ? 0 : 1);
3794         }
3795         /* Check for freeze groups */
3796         for (g = 0; g < ir->opts.ngfrz; g++)
3797         {
3798             for (d = 0; d < DIM; d++)
3799             {
3800                 if (ir->opts.nFreeze[g][d] != 0)
3801                 {
3802                     AbsRef[d] = 1;
3803                 }
3804             }
3805         }
3806     }
3807
3808     /* Check for position restraints */
3809     iloop = gmx_mtop_ilistloop_init(sys);
3810     while (gmx_mtop_ilistloop_next(iloop, &ilist, &nmol))
3811     {
3812         if (nmol > 0 &&
3813             (AbsRef[XX] == 0 || AbsRef[YY] == 0 || AbsRef[ZZ] == 0))
3814         {
3815             for (i = 0; i < ilist[F_POSRES].nr; i += 2)
3816             {
3817                 pr = &sys->ffparams.iparams[ilist[F_POSRES].iatoms[i]];
3818                 for (d = 0; d < DIM; d++)
3819                 {
3820                     if (pr->posres.fcA[d] != 0)
3821                     {
3822                         AbsRef[d] = 1;
3823                     }
3824                 }
3825             }
3826             for (i = 0; i < ilist[F_FBPOSRES].nr; i += 2)
3827             {
3828                 /* Check for flat-bottom posres */
3829                 pr = &sys->ffparams.iparams[ilist[F_FBPOSRES].iatoms[i]];
3830                 if (pr->fbposres.k != 0)
3831                 {
3832                     switch (pr->fbposres.geom)
3833                     {
3834                         case efbposresSPHERE:
3835                             AbsRef[XX] = AbsRef[YY] = AbsRef[ZZ] = 1;
3836                             break;
3837                         case efbposresCYLINDERX:
3838                             AbsRef[YY] = AbsRef[ZZ] = 1;
3839                             break;
3840                         case efbposresCYLINDERY:
3841                             AbsRef[XX] = AbsRef[ZZ] = 1;
3842                             break;
3843                         case efbposresCYLINDER:
3844                         /* efbposres is a synonym for efbposresCYLINDERZ for backwards compatibility */
3845                         case efbposresCYLINDERZ:
3846                             AbsRef[XX] = AbsRef[YY] = 1;
3847                             break;
3848                         case efbposresX: /* d=XX */
3849                         case efbposresY: /* d=YY */
3850                         case efbposresZ: /* d=ZZ */
3851                             d         = pr->fbposres.geom - efbposresX;
3852                             AbsRef[d] = 1;
3853                             break;
3854                         default:
3855                             gmx_fatal(FARGS, " Invalid geometry for flat-bottom position restraint.\n"
3856                                       "Expected nr between 1 and %d. Found %d\n", efbposresNR-1,
3857                                       pr->fbposres.geom);
3858                     }
3859                 }
3860             }
3861         }
3862     }
3863
3864     return (AbsRef[XX] != 0 && AbsRef[YY] != 0 && AbsRef[ZZ] != 0);
3865 }
3866
3867 static void
3868 check_combination_rule_differences(const gmx_mtop_t *mtop, int state,
3869                                    gmx_bool *bC6ParametersWorkWithGeometricRules,
3870                                    gmx_bool *bC6ParametersWorkWithLBRules,
3871                                    gmx_bool *bLBRulesPossible)
3872 {
3873     int           ntypes, tpi, tpj;
3874     int          *typecount;
3875     real          tol;
3876     double        c6i, c6j, c12i, c12j;
3877     double        c6, c6_geometric, c6_LB;
3878     double        sigmai, sigmaj, epsi, epsj;
3879     gmx_bool      bCanDoLBRules, bCanDoGeometricRules;
3880     const char   *ptr;
3881
3882     /* A tolerance of 1e-5 seems reasonable for (possibly hand-typed)
3883      * force-field floating point parameters.
3884      */
3885     tol = 1e-5;
3886     ptr = getenv("GMX_LJCOMB_TOL");
3887     if (ptr != NULL)
3888     {
3889         double dbl;
3890
3891         sscanf(ptr, "%lf", &dbl);
3892         tol = dbl;
3893     }
3894
3895     *bC6ParametersWorkWithLBRules         = TRUE;
3896     *bC6ParametersWorkWithGeometricRules  = TRUE;
3897     bCanDoLBRules                         = TRUE;
3898     ntypes                                = mtop->ffparams.atnr;
3899     snew(typecount, ntypes);
3900     gmx_mtop_count_atomtypes(mtop, state, typecount);
3901     *bLBRulesPossible       = TRUE;
3902     for (tpi = 0; tpi < ntypes; ++tpi)
3903     {
3904         c6i  = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c6;
3905         c12i = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c12;
3906         for (tpj = tpi; tpj < ntypes; ++tpj)
3907         {
3908             c6j          = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c6;
3909             c12j         = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c12;
3910             c6           = mtop->ffparams.iparams[ntypes * tpi + tpj].lj.c6;
3911             c6_geometric = std::sqrt(c6i * c6j);
3912             if (!gmx_numzero(c6_geometric))
3913             {
3914                 if (!gmx_numzero(c12i) && !gmx_numzero(c12j))
3915                 {
3916                     sigmai   = gmx::sixthroot(c12i / c6i);
3917                     sigmaj   = gmx::sixthroot(c12j / c6j);
3918                     epsi     = c6i * c6i /(4.0 * c12i);
3919                     epsj     = c6j * c6j /(4.0 * c12j);
3920                     c6_LB    = 4.0 * std::sqrt(epsi * epsj) * gmx::power6(0.5 * (sigmai + sigmaj));
3921                 }
3922                 else
3923                 {
3924                     *bLBRulesPossible = FALSE;
3925                     c6_LB             = c6_geometric;
3926                 }
3927                 bCanDoLBRules = gmx_within_tol(c6_LB, c6, tol);
3928             }
3929
3930             if (FALSE == bCanDoLBRules)
3931             {
3932                 *bC6ParametersWorkWithLBRules = FALSE;
3933             }
3934
3935             bCanDoGeometricRules = gmx_within_tol(c6_geometric, c6, tol);
3936
3937             if (FALSE == bCanDoGeometricRules)
3938             {
3939                 *bC6ParametersWorkWithGeometricRules = FALSE;
3940             }
3941         }
3942     }
3943     sfree(typecount);
3944 }
3945
3946 static void
3947 check_combination_rules(const t_inputrec *ir, const gmx_mtop_t *mtop,
3948                         warninp_t wi)
3949 {
3950     gmx_bool bLBRulesPossible, bC6ParametersWorkWithGeometricRules, bC6ParametersWorkWithLBRules;
3951
3952     check_combination_rule_differences(mtop, 0,
3953                                        &bC6ParametersWorkWithGeometricRules,
3954                                        &bC6ParametersWorkWithLBRules,
3955                                        &bLBRulesPossible);
3956     if (ir->ljpme_combination_rule == eljpmeLB)
3957     {
3958         if (FALSE == bC6ParametersWorkWithLBRules || FALSE == bLBRulesPossible)
3959         {
3960             warning(wi, "You are using arithmetic-geometric combination rules "
3961                     "in LJ-PME, but your non-bonded C6 parameters do not "
3962                     "follow these rules.");
3963         }
3964     }
3965     else
3966     {
3967         if (FALSE == bC6ParametersWorkWithGeometricRules)
3968         {
3969             if (ir->eDispCorr != edispcNO)
3970             {
3971                 warning_note(wi, "You are using geometric combination rules in "
3972                              "LJ-PME, but your non-bonded C6 parameters do "
3973                              "not follow these rules. "
3974                              "This will introduce very small errors in the forces and energies in "
3975                              "your simulations. Dispersion correction will correct total energy "
3976                              "and/or pressure for isotropic systems, but not forces or surface tensions.");
3977             }
3978             else
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. If your system is homogeneous, consider using dispersion correction "
3985                              "for the total energy and pressure.");
3986             }
3987         }
3988     }
3989 }
3990
3991 void triple_check(const char *mdparin, t_inputrec *ir, gmx_mtop_t *sys,
3992                   warninp_t wi)
3993 {
3994     char                      err_buf[STRLEN];
3995     int                       i, m, c, nmol;
3996     gmx_bool                  bCharge, bAcc;
3997     real                     *mgrp, mt;
3998     rvec                      acc;
3999     gmx_mtop_atomloop_block_t aloopb;
4000     gmx_mtop_atomloop_all_t   aloop;
4001     t_atom                   *atom;
4002     ivec                      AbsRef;
4003     char                      warn_buf[STRLEN];
4004
4005     set_warning_line(wi, mdparin, -1);
4006
4007     if (ir->cutoff_scheme == ecutsVERLET &&
4008         ir->verletbuf_tol > 0 &&
4009         ir->nstlist > 1 &&
4010         ((EI_MD(ir->eI) || EI_SD(ir->eI)) &&
4011          (ir->etc == etcVRESCALE || ir->etc == etcBERENDSEN)))
4012     {
4013         /* Check if a too small Verlet buffer might potentially
4014          * cause more drift than the thermostat can couple off.
4015          */
4016         /* Temperature error fraction for warning and suggestion */
4017         const real T_error_warn    = 0.002;
4018         const real T_error_suggest = 0.001;
4019         /* For safety: 2 DOF per atom (typical with constraints) */
4020         const real nrdf_at         = 2;
4021         real       T, tau, max_T_error;
4022         int        i;
4023
4024         T   = 0;
4025         tau = 0;
4026         for (i = 0; i < ir->opts.ngtc; i++)
4027         {
4028             T   = std::max(T, ir->opts.ref_t[i]);
4029             tau = std::max(tau, ir->opts.tau_t[i]);
4030         }
4031         if (T > 0)
4032         {
4033             /* This is a worst case estimate of the temperature error,
4034              * assuming perfect buffer estimation and no cancelation
4035              * of errors. The factor 0.5 is because energy distributes
4036              * equally over Ekin and Epot.
4037              */
4038             max_T_error = 0.5*tau*ir->verletbuf_tol/(nrdf_at*BOLTZ*T);
4039             if (max_T_error > T_error_warn)
4040             {
4041                 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.",
4042                         ir->verletbuf_tol, T, tau,
4043                         100*max_T_error,
4044                         100*T_error_suggest,
4045                         ir->verletbuf_tol*T_error_suggest/max_T_error);
4046                 warning(wi, warn_buf);
4047             }
4048         }
4049     }
4050
4051     if (ETC_ANDERSEN(ir->etc))
4052     {
4053         int i;
4054
4055         for (i = 0; i < ir->opts.ngtc; i++)
4056         {
4057             sprintf(err_buf, "all tau_t must currently be equal using Andersen temperature control, violated for group %d", i);
4058             CHECK(ir->opts.tau_t[0] != ir->opts.tau_t[i]);
4059             sprintf(err_buf, "all tau_t must be postive using Andersen temperature control, tau_t[%d]=%10.6f",
4060                     i, ir->opts.tau_t[i]);
4061             CHECK(ir->opts.tau_t[i] < 0);
4062         }
4063
4064         for (i = 0; i < ir->opts.ngtc; i++)
4065         {
4066             int nsteps = (int)(ir->opts.tau_t[i]/ir->delta_t);
4067             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);
4068             CHECK((nsteps % ir->nstcomm) && (ir->etc == etcANDERSENMASSIVE));
4069         }
4070     }
4071
4072     if (EI_DYNAMICS(ir->eI) && !EI_SD(ir->eI) && ir->eI != eiBD &&
4073         ir->comm_mode == ecmNO &&
4074         !(absolute_reference(ir, sys, FALSE, AbsRef) || ir->nsteps <= 10) &&
4075         !ETC_ANDERSEN(ir->etc))
4076     {
4077         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");
4078     }
4079
4080     /* Check for pressure coupling with absolute position restraints */
4081     if (ir->epc != epcNO && ir->refcoord_scaling == erscNO)
4082     {
4083         absolute_reference(ir, sys, TRUE, AbsRef);
4084         {
4085             for (m = 0; m < DIM; m++)
4086             {
4087                 if (AbsRef[m] && norm2(ir->compress[m]) > 0)
4088                 {
4089                     warning(wi, "You are using pressure coupling with absolute position restraints, this will give artifacts. Use the refcoord_scaling option.");
4090                     break;
4091                 }
4092             }
4093         }
4094     }
4095
4096     bCharge = FALSE;
4097     aloopb  = gmx_mtop_atomloop_block_init(sys);
4098     while (gmx_mtop_atomloop_block_next(aloopb, &atom, &nmol))
4099     {
4100         if (atom->q != 0 || atom->qB != 0)
4101         {
4102             bCharge = TRUE;
4103         }
4104     }
4105
4106     if (!bCharge)
4107     {
4108         if (EEL_FULL(ir->coulombtype))
4109         {
4110             sprintf(err_buf,
4111                     "You are using full electrostatics treatment %s for a system without charges.\n"
4112                     "This costs a lot of performance for just processing zeros, consider using %s instead.\n",
4113                     EELTYPE(ir->coulombtype), EELTYPE(eelCUT));
4114             warning(wi, err_buf);
4115         }
4116     }
4117     else
4118     {
4119         if (ir->coulombtype == eelCUT && ir->rcoulomb > 0 && !ir->implicit_solvent)
4120         {
4121             sprintf(err_buf,
4122                     "You are using a plain Coulomb cut-off, which might produce artifacts.\n"
4123                     "You might want to consider using %s electrostatics.\n",
4124                     EELTYPE(eelPME));
4125             warning_note(wi, err_buf);
4126         }
4127     }
4128
4129     /* Check if combination rules used in LJ-PME are the same as in the force field */
4130     if (EVDW_PME(ir->vdwtype))
4131     {
4132         check_combination_rules(ir, sys, wi);
4133     }
4134
4135     /* Generalized reaction field */
4136     if (ir->opts.ngtc == 0)
4137     {
4138         sprintf(err_buf, "No temperature coupling while using coulombtype %s",
4139                 eel_names[eelGRF]);
4140         CHECK(ir->coulombtype == eelGRF);
4141     }
4142     else
4143     {
4144         sprintf(err_buf, "When using coulombtype = %s"
4145                 " ref-t for temperature coupling should be > 0",
4146                 eel_names[eelGRF]);
4147         CHECK((ir->coulombtype == eelGRF) && (ir->opts.ref_t[0] <= 0));
4148     }
4149
4150     if (ir->eI == eiSD2)
4151     {
4152         sprintf(warn_buf, "The stochastic dynamics integrator %s is deprecated, since\n"
4153                 "it is slower than integrator %s and is slightly less accurate\n"
4154                 "with constraints. Use the %s integrator.",
4155                 ei_names[ir->eI], ei_names[eiSD1], ei_names[eiSD1]);
4156         warning_note(wi, warn_buf);
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 }