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