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