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