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