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