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