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