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