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