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