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