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