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