added Verlet scheme and NxN non-bonded functionality
[gromacs.git] / src / kernel / readir.c
blob81d428bf982401d724589b5cfc174c5e13c98319
1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; c-file-style: "stroustrup"; -*-
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.
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.
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.
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.
31 * For more info, check our website at http://www.gromacs.org
33 * And Hey:
34 * Gallium Rubidium Oxygen Manganese Argon Carbon Silicon
36 #ifdef HAVE_CONFIG_H
37 #include <config.h>
38 #endif
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"
65 #define MAXPTR 254
66 #define NOGID 255
67 #define MAXLAMBDAS 1024
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.
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];
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. */
104 void init_ir(t_inputrec *ir, t_gromppopts *opts)
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);
113 static void GetSimTemps(int ntemps, t_simtemp *simtemp, double *temperature_lambdas)
116 int i;
118 for (i=0;i<ntemps;i++)
120 /* simple linear scaling -- allows more control */
121 if (simtemp->eSimTempScale == esimtempLINEAR)
123 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*temperature_lambdas[i];
125 else if (simtemp->eSimTempScale == esimtempGEOMETRIC) /* should give roughly equal acceptance for constant heat capacity . . . */
127 simtemp->temperatures[i] = simtemp->simtemp_low * pow(simtemp->simtemp_high/simtemp->simtemp_low,(1.0*i)/(ntemps-1));
129 else if (simtemp->eSimTempScale == esimtempEXPONENTIAL)
131 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*((exp(temperature_lambdas[i])-1)/(exp(1.0)-1));
133 else
135 char errorstr[128];
136 sprintf(errorstr,"eSimTempScale=%d not defined",simtemp->eSimTempScale);
137 gmx_fatal(FARGS,errorstr);
144 static void _low_check(gmx_bool b,char *s,warninp_t wi)
146 if (b)
148 warning_error(wi,s);
152 static void check_nst(const char *desc_nst,int nst,
153 const char *desc_p,int *p,
154 warninp_t wi)
156 char buf[STRLEN];
158 if (*p > 0 && *p % nst != 0)
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);
168 static gmx_bool ir_NVE(const t_inputrec *ir)
170 return ((ir->eI == eiMD || EI_VV(ir->eI)) && ir->etc == etcNO);
173 static int lcd(int n1,int n2)
175 int d,i;
177 d = 1;
178 for(i=2; (i<=n1 && i<=n2); i++)
180 if (n1 % i == 0 && n2 % i == 0)
182 d = i;
186 return d;
189 void check_ir(const char *mdparin,t_inputrec *ir, t_gromppopts *opts,
190 warninp_t wi)
191 /* Check internal consistency */
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.
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;
207 set_warning_line(wi,mdparin,-1);
209 /* BASIC CUT-OFF STUFF */
210 if (ir->rcoulomb < 0)
212 warning_error(wi,"rcoulomb should be >= 0");
214 if (ir->rvdw < 0)
216 warning_error(wi,"rvdw should be >= 0");
218 if (ir->rlist < 0 &&
219 !(ir->cutoff_scheme == ecutsVERLET && ir->verletbuf_drift > 0))
221 warning_error(wi,"rlist should be >= 0");
224 if (ir->cutoff_scheme == ecutsGROUP)
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.
233 ir->rlistlong = max_cutoff(ir->rlist,max_cutoff(ir->rvdw,ir->rcoulomb));
235 else if (ir->rlistlong < 0)
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);
242 if (ir->rlistlong == 0 && ir->ePBC != epbcNONE)
244 warning_error(wi,"Can not have an infinite cut-off with PBC");
246 if (ir->rlistlong > 0 && (ir->rlist == 0 || ir->rlistlong < ir->rlist))
248 warning_error(wi,"rlistlong can not be shorter than rlist");
250 if (IR_TWINRANGE(*ir) && ir->nstlist <= 0)
252 warning_error(wi,"Can not have nstlist<=0 with twin-range interactions");
256 if (ir->cutoff_scheme == ecutsVERLET)
258 real rc_max;
260 /* Normal Verlet type neighbor-list, currently only limited feature support */
261 if (inputrec2nboundeddim(ir) < 3)
263 warning_error(wi,"With Verlet lists only full pbc or pbc=xy with walls is supported");
265 if (ir->rcoulomb != ir->rvdw)
267 warning_error(wi,"With Verlet lists rcoulomb!=rvdw is not supported");
269 if (ir->vdwtype != evdwCUT)
271 warning_error(wi,"With Verlet lists only cut-off LJ interactions are supported");
273 if (!(ir->coulombtype == eelCUT ||
274 (EEL_RF(ir->coulombtype) && ir->coulombtype != eelRF_NEC) ||
275 EEL_PME(ir->coulombtype) || ir->coulombtype == eelEWALD))
277 warning_error(wi,"With Verlet lists only cut-off, reaction-field, PME and Ewald electrostatics are supported");
280 if (ir->nstlist <= 0)
282 warning_error(wi,"With Verlet lists nstlist should be larger than 0");
285 if (ir->nstlist < 10)
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.");
290 rc_max = max(ir->rvdw,ir->rcoulomb);
292 if (ir->verletbuf_drift <= 0)
294 if (ir->verletbuf_drift == 0)
296 warning_error(wi,"Can not have an energy drift of exactly 0");
299 if (ir->rlist < rc_max)
301 warning_error(wi,"With verlet lists rlist can not be smaller than rvdw or rcoulomb");
304 if (ir->rlist == rc_max && ir->nstlist > 1)
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.");
309 else
311 if (ir->rlist > rc_max)
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.");
316 if (ir->nstlist == 1)
318 /* No buffer required */
319 ir->rlist = rc_max;
321 else
323 if (EI_DYNAMICS(ir->eI))
325 if (EI_MD(ir->eI) && ir->etc == etcNO)
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.");
330 if (inputrec2nboundeddim(ir) < 3)
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.");
334 /* Set rlist temporarily so we can continue processing */
335 ir->rlist = rc_max;
337 else
339 /* Set the buffer to 5% of the cut-off */
340 ir->rlist = 1.05*rc_max;
345 /* No twin-range calculations with Verlet lists */
346 ir->rlistlong = ir->rlist;
349 /* GENERAL INTEGRATOR STUFF */
350 if (!(ir->eI == eiMD || EI_VV(ir->eI)))
352 ir->etc = etcNO;
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);
358 if (!EI_DYNAMICS(ir->eI))
360 ir->epc = epcNO;
362 if (EI_DYNAMICS(ir->eI))
364 if (ir->nstcalcenergy < 0)
366 ir->nstcalcenergy = ir_optimal_nstcalcenergy(ir);
367 if (ir->nstenergy != 0 && ir->nstenergy < ir->nstcalcenergy)
369 /* nstcalcenergy larger than nstener does not make sense.
370 * We ideally want nstcalcenergy=nstener.
372 if (ir->nstlist > 0)
374 ir->nstcalcenergy = lcd(ir->nstenergy,ir->nstlist);
376 else
378 ir->nstcalcenergy = ir->nstenergy;
382 else if (ir->nstenergy > 0 && ir->nstcalcenergy > ir->nstenergy)
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;
389 if (ir->epc != epcNO)
391 if (ir->nstpcouple < 0)
393 ir->nstpcouple = ir_optimal_nstpcouple(ir);
396 if (IR_TWINRANGE(*ir))
398 check_nst("nstlist",ir->nstlist,
399 "nstcalcenergy",&ir->nstcalcenergy,wi);
400 if (ir->epc != epcNO)
402 check_nst("nstlist",ir->nstlist,
403 "nstpcouple",&ir->nstpcouple,wi);
407 if (ir->nstcalcenergy > 1)
409 /* for storing exact averages nstenergy should be
410 * a multiple of nstcalcenergy
412 check_nst("nstcalcenergy",ir->nstcalcenergy,
413 "nstenergy",&ir->nstenergy,wi);
414 if (ir->efep != efepNO)
416 /* nstdhdl should be a multiple of nstcalcenergy */
417 check_nst("nstcalcenergy",ir->nstcalcenergy,
418 "nstdhdl",&ir->fepvals->nstdhdl,wi);
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)");
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));
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);
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)");
452 /* verify simulated tempering options */
454 if (ir->bSimTemp) {
455 gmx_bool bAllTempZero = TRUE;
456 for (i=0;i<fep->n_lambda;i++)
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)
462 bAllTempZero = FALSE;
465 sprintf(err_buf,"if simulated tempering is on, temperature-lambdas may not be all zero");
466 CHECK(bAllTempZero==TRUE);
468 sprintf(err_buf,"Simulated tempering is currently only compatible with md-vv");
469 CHECK(ir->eI != eiVV);
471 /* check compatability of the temperature coupling with simulated tempering */
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);
478 /* check that the temperatures make sense */
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);
483 sprintf(err_buf,"Higher simulated tempering temperature (%g) must be >= zero",ir->simtempvals->simtemp_high);
484 CHECK(ir->simtempvals->simtemp_high <= 0);
486 sprintf(err_buf,"Lower simulated tempering temperature (%g) must be >= zero",ir->simtempvals->simtemp_low);
487 CHECK(ir->simtempvals->simtemp_low <= 0);
490 /* verify free energy options */
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);
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);
502 /* check validity of options */
503 if (fep->n_lambda > 0 && ir->rlist < max(ir->rvdw,ir->rcoulomb))
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);
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)));
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));
516 sprintf(err_buf,"Free-energy not implemented for Ewald");
517 CHECK(ir->coulombtype==eelEWALD);
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));
523 for (j=0;j<efptNR;j++)
525 for (i=0;i<fep->n_lambda;i++)
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));
532 if ((fep->sc_alpha>0) && (!fep->bScCoul))
534 for (i=0;i<fep->n_lambda;i++)
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))));
546 if ((fep->bScCoul) && (EEL_PME(ir->coulombtype)))
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);
552 /* Free Energy Checks -- In an ideal world, slow growth and FEP would
553 be treated differently, but that's the next step */
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));
563 if ((ir->bSimTemp) || (ir->efep == efepEXPANDED)) {
564 fep = ir->fepvals;
565 expand = ir->expandedvals;
567 /* checking equilibration of weights inputs for validity */
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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)));
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));
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));
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)
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));
644 /* PBC/WALLS */
645 sprintf(err_buf,"walls only work with pbc=%s",epbc_names[epbcXY]);
646 CHECK(ir->nwall && ir->ePBC!=epbcXY);
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;
655 } else {
656 sprintf(err_buf,"Can not have pressure coupling with pbc=%s",
657 epbc_names[ir->ePBC]);
658 CHECK(ir->epc != epcNO);
660 sprintf(err_buf,"Can not have Ewald with pbc=%s",epbc_names[ir->ePBC]);
661 CHECK(EEL_FULL(ir->coulombtype));
663 sprintf(err_buf,"Can not have dispersion correction with pbc=%s",
664 epbc_names[ir->ePBC]);
665 CHECK(ir->eDispCorr != edispcNO);
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));
678 if (ir->nstlist < 0) {
679 warning_error(wi,"Can not have heuristic neighborlist updates without cut-off");
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");
686 /* COMM STUFF */
687 if (ir->nstcomm == 0) {
688 ir->comm_mode = ecmNO;
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);
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;
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).");
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.");
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));
718 /* TEMPERATURE COUPLING */
719 if (ir->etc == etcYES)
721 ir->etc = etcBERENDSEN;
722 warning_note(wi,"Old option for temperature coupling given: "
723 "changing \"yes\" to \"Berendsen\"\n");
726 if ((ir->etc == etcNOSEHOOVER) || (ir->epc == epcMTTK))
728 if (ir->opts.nhchainlength < 1)
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);
735 if (ir->etc==etcNOSEHOOVER && !EI_VV(ir->eI) && ir->opts.nhchainlength > 1)
737 warning_note(wi,"leapfrog does not yet support Nose-Hoover chains, nhchainlength reset to 1");
738 ir->opts.nhchainlength = 1;
741 else
743 ir->opts.nhchainlength = 0;
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));
752 if (ETC_ANDERSEN(ir->etc))
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)));
757 for (i=0;i<ir->opts.ngtc;i++)
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);
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);
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));
773 for (i=0;i<ir->opts.ngtc;i++)
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));
780 if (ir->etc == etcBERENDSEN)
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);
787 if ((ir->etc==etcNOSEHOOVER || ETC_ANDERSEN(ir->etc))
788 && ir->epc==epcBERENDSEN)
790 sprintf(warn_buf,"Using Berendsen pressure coupling invalidates the "
791 "true ensemble for the thermostat");
792 warning(wi,warn_buf);
795 /* PRESSURE COUPLING */
796 if (ir->epc == epcISOTROPIC)
798 ir->epc = epcBERENDSEN;
799 warning_note(wi,"Old option for pressure coupling given: "
800 "changing \"Isotropic\" to \"Berendsen\"\n");
803 if (ir->epc != epcNO)
805 dt_pcoupl = ir->nstpcouple*ir->delta_t;
807 sprintf(err_buf,"tau-p must be > 0 instead of %g\n",ir->tau_p);
808 CHECK(ir->tau_p <= 0);
810 if (ir->tau_p/dt_pcoupl < pcouple_min_integration_steps(ir->epc))
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);
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));
824 if (epcPARRINELLORAHMAN == ir->epc && opts->bGenVel)
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);
839 if (EI_VV(ir->eI))
841 if (ir->epc > epcNO)
843 if ((ir->epc!=epcBERENDSEN) && (ir->epc!=epcMTTK))
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.");
850 /* ELECTROSTATICS */
851 /* More checks are in triple check (grompp.c) */
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);
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);
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;
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);
877 if (EEL_RF(ir->coulombtype)) {
878 /* reaction field (at the cut-off) */
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);
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);
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.
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);
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);
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]);
931 CHECK(ir->rcoulomb != ir->rlist);
935 if (EEL_PME(ir->coulombtype)) {
936 if (ir->pme_order < 3) {
937 warning_error(wi,"pme-order can not be smaller than 3");
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);
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);
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);
962 if (ir->cutoff_scheme == ecutsGROUP)
964 if (EEL_IS_ZERO_AT_CUTOFF(ir->coulombtype)
965 && (ir->rlistlong <= ir->rcoulomb))
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);
971 if (EVDW_SWITCHED(ir->vdwtype) && (ir->rlistlong <= ir->rvdw))
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);
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.");
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)));
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);
994 sprintf(err_buf,"nstlist can not be smaller than -1");
995 CHECK(ir->nstlist < -1);
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.");
1002 if (ir->eI == eiLBFGS && ir->nbfgscorr <= 0) {
1003 warning(wi,"Using L-BFGS with nbfgscorr<=0 just gets you steepest descent.");
1006 /* ENERGY CONSERVATION */
1007 if (ir_NVE(ir) && ir->cutoff_scheme == ecutsGROUP)
1009 if (!EVDW_MIGHT_BE_ZERO_AT_CUTOFF(ir->vdwtype) && ir->rvdw > 0)
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);
1015 if (!EEL_MIGHT_BE_ZERO_AT_CUTOFF(ir->coulombtype) && ir->rcoulomb > 0)
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);
1023 /* IMPLICIT SOLVENT */
1024 if(ir->coulombtype==eelGB_NOTUSED)
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");
1033 if(ir->sa_algorithm==esaSTILL)
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);
1039 if(ir->implicit_solvent==eisGBSA)
1041 sprintf(err_buf,"With GBSA implicit solvent, rgbradii must be equal to rlist.");
1042 CHECK(ir->rgbradii != ir->rlist);
1044 if(ir->coulombtype!=eelCUT)
1046 sprintf(err_buf,"With GBSA, coulombtype must be equal to %s\n",eel_names[eelCUT]);
1047 CHECK(ir->coulombtype!=eelCUT);
1049 if(ir->vdwtype!=evdwCUT)
1051 sprintf(err_buf,"With GBSA, vdw-type must be equal to %s\n",evdw_names[evdwCUT]);
1052 CHECK(ir->vdwtype!=evdwCUT);
1054 if(ir->nstgbradii<1)
1056 sprintf(warn_buf,"Using GBSA with nstgbradii<1, setting nstgbradii=1");
1057 warning_note(wi,warn_buf);
1058 ir->nstgbradii=1;
1060 if(ir->sa_algorithm==esaNO)
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);
1065 if(ir->sa_surface_tension<0 && ir->sa_algorithm!=esaNO)
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);
1070 if(ir->gb_algorithm==egbSTILL)
1072 ir->sa_surface_tension = 0.0049 * CAL2JOULE * 100;
1074 else
1076 ir->sa_surface_tension = 0.0054 * CAL2JOULE * 100;
1079 if(ir->sa_surface_tension==0 && ir->sa_algorithm!=esaNO)
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);
1087 if (ir->bAdress)
1089 if (ir->cutoff_scheme != ecutsGROUP)
1091 warning_error(wi,"AdresS simulation supports only cutoff-scheme=group");
1093 if (!EI_SD(ir->eI))
1095 warning_error(wi,"AdresS simulation supports only stochastic dynamics");
1097 if (ir->epc != epcNO)
1099 warning_error(wi,"AdresS simulation does not support pressure coupling");
1101 if (EEL_FULL(ir->coulombtype))
1103 warning_error(wi,"AdresS simulation does not support long-range electrostatics");
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[])
1115 int np=0;
1116 char *copy0,*copy;
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++;
1134 ltrim(copy);
1136 if (ptr == NULL)
1137 sfree(copy0);
1139 return np;
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)
1149 char *ptr[MAXPTR];
1150 int i;
1152 *n = str_nelem(str,MAXPTR,ptr);
1154 snew(*r,*n);
1155 for(i=0; i<*n; i++) {
1156 (*r)[i] = strtod(ptr[i],NULL);
1160 static void do_fep_params(t_inputrec *ir, char fep_lambda[][STRLEN],char weights[STRLEN]) {
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;
1168 snew(count_fep_lambdas,efptNR);
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 */
1174 for (i=0;i<efptNR;i++)
1176 parse_n_real(fep_lambda[i],&(nfep[i]),&(count_fep_lambdas[i]));
1179 /* now, determine the number of components. All must be either zero, or equal. */
1181 max_n_lambda = 0;
1182 for (i=0;i<efptNR;i++)
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;
1191 for (i=0;i<efptNR;i++)
1193 if (nfep[i] == 0)
1195 ir->fepvals->separate_dvdl[i] = FALSE;
1197 else if (nfep[i] == max_n_lambda)
1199 if (i!=efptTEMPERATURE) /* we treat this differently -- not really a reason to compute the derivative with
1200 respect to the temperature currently */
1202 ir->fepvals->separate_dvdl[i] = TRUE;
1205 else
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);
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;
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;
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))
1223 ir->fepvals->separate_dvdl[efptFEP] = TRUE;
1225 /* otherwise allocate the space for all of the lambdas, and transfer the data */
1226 for (i=0;i<efptNR;i++)
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 */
1232 for (j=0;j<fep->n_lambda;j++)
1234 fep->all_lambda[i][j] = (double)count_fep_lambdas[i][j];
1236 sfree(count_fep_lambdas[i]);
1239 sfree(count_fep_lambdas);
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 */
1244 if ((nfep[efptFEP] == 0) && (fep->init_lambda >= 0) && (fep->init_lambda <= 1))
1246 for (i=0;i<fep->n_lambda;i++)
1248 fep->all_lambda[efptFEP][i] = fep->init_lambda;
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 */
1255 if (max_n_lambda == 0)
1257 bOneLambda = TRUE;
1259 else
1261 for (i=0;i<efptNR;i++)
1263 if ((nfep[i] != 0) && (i!=efptFEP))
1265 bOneLambda = FALSE;
1269 if ((bOneLambda) && (fep->sc_alpha > 0))
1271 fep->bScCoul = TRUE;
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. */
1278 for (i=0;i<efptNR;i++)
1280 if ((nfep[i] == 0) && (i!=efptFEP))
1282 for (j=0;j<fep->n_lambda;j++)
1284 fep->all_lambda[i][j] = fep->all_lambda[efptFEP][j];
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)
1293 if (fep->sc_alpha > 0.1)
1295 gmx_fatal(FARGS,"sc_alpha (%f) for sc_r_power = 48 should usually be between 0.001 and 0.004", fep->sc_alpha);
1299 expand = ir->expandedvals;
1300 /* now read in the weights */
1301 parse_n_real(weights,&nweights,&(expand->init_lambda_weights));
1302 if (nweights == 0)
1304 expand->bInit_weights = FALSE;
1305 snew(expand->init_lambda_weights,fep->n_lambda); /* initialize to zero */
1307 else if (nweights != fep->n_lambda)
1309 gmx_fatal(FARGS,"Number of weights (%d) is not equal to number of lambda values (%d)",
1310 nweights,fep->n_lambda);
1312 else
1314 expand->bInit_weights = TRUE;
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 */
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*/
1327 static void do_simtemp_params(t_inputrec *ir) {
1329 snew(ir->simtempvals->temperatures,ir->fepvals->n_lambda);
1330 GetSimTemps(ir->fepvals->n_lambda,ir->simtempvals,ir->fepvals->all_lambda[efptTEMPERATURE]);
1332 return;
1335 static void do_wall_params(t_inputrec *ir,
1336 char *wall_atomtype, char *wall_density,
1337 t_gromppopts *opts)
1339 int nstr,i;
1340 char *names[MAXPTR];
1341 double dbl;
1343 opts->wall_atomtype[0] = NULL;
1344 opts->wall_atomtype[1] = NULL;
1346 ir->wall_atomtype[0] = -1;
1347 ir->wall_atomtype[1] = -1;
1348 ir->wall_density[0] = 0;
1349 ir->wall_density[1] = 0;
1351 if (ir->nwall > 0)
1353 nstr = str_nelem(wall_atomtype,MAXPTR,names);
1354 if (nstr != ir->nwall)
1356 gmx_fatal(FARGS,"Expected %d elements for wall_atomtype, found %d",
1357 ir->nwall,nstr);
1359 for(i=0; i<ir->nwall; i++)
1361 opts->wall_atomtype[i] = strdup(names[i]);
1364 if (ir->wall_type == ewt93 || ir->wall_type == ewt104) {
1365 nstr = str_nelem(wall_density,MAXPTR,names);
1366 if (nstr != ir->nwall)
1368 gmx_fatal(FARGS,"Expected %d elements for wall-density, found %d",ir->nwall,nstr);
1370 for(i=0; i<ir->nwall; i++)
1372 sscanf(names[i],"%lf",&dbl);
1373 if (dbl <= 0)
1375 gmx_fatal(FARGS,"wall-density[%d] = %f\n",i,dbl);
1377 ir->wall_density[i] = dbl;
1383 static void add_wall_energrps(gmx_groups_t *groups,int nwall,t_symtab *symtab)
1385 int i;
1386 t_grps *grps;
1387 char str[STRLEN];
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++;
1401 void read_expandedparams(int *ninp_p,t_inpfile **inp_p,
1402 t_expanded *expand,warninp_t wi)
1404 int ninp,nerror=0;
1405 t_inpfile *inp;
1407 ninp = *ninp_p;
1408 inp = *inp_p;
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);
1436 *ninp_p = ninp;
1437 *inp_p = inp;
1439 return;
1442 void get_ir(const char *mdparin,const char *mdparout,
1443 t_inputrec *ir,t_gromppopts *opts,
1444 warninp_t wi)
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;
1455 inp = read_inpfile(mdparin, &ninp, NULL, wi);
1457 snew(dumstr[0],STRLEN);
1458 snew(dumstr[1],STRLEN);
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");
1471 /* replace the following commands with the clearer new versions*/
1472 REPL_TYPE("unconstrained-start","continuation");
1473 REPL_TYPE("foreign-lambda","fep-lambdas");
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);
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);
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);
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);
1517 CCTYPE ("TEST PARTICLE INSERTION OPTIONS");
1518 RTYPE ("rtpi", ir->rtpi, 0.05);
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);
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);
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);
1595 CCTYPE("IMPLICIT SOLVENT ALGORITHM");
1596 EETYPE("implicit-solvent", ir->implicit_solvent, eis_names);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
1818 /* expanded ensemble variables */
1819 if (ir->efep==efepEXPANDED || ir->bSimTemp)
1821 read_expandedparams(&ninp,&inp,expand,wi);
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);
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);
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
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);
1862 sfree(inp);
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)");
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)");
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)");
1890 break;
1891 default:
1892 gmx_fatal(FARGS,"Pressure coupling type %s not implemented yet",
1893 epcoupltype_names[ir->epct]);
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];
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");
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];
1921 if (ir->comm_mode == ecmNO)
1922 ir->nstcomm = 0;
1924 opts->couple_moltype = NULL;
1925 if (strlen(couple_moltype) > 0)
1927 if (ir->efep != efepNO)
1929 opts->couple_moltype = strdup(couple_moltype);
1930 if (opts->couple_lam0 == opts->couple_lam1)
1932 warning(wi,"The lambda=0 and lambda=1 states for coupling are identical");
1934 if (ir->eI == eiMD && (opts->couple_lam0 == ecouplamNONE ||
1935 opts->couple_lam1 == ecouplamNONE))
1937 warning(wi,"For proper sampling of the (nearly) decoupled state, stochastic dynamics should be used");
1940 else
1942 warning(wi,"Can not couple a molecule with free_energy = no");
1945 /* FREE ENERGY AND EXPANDED ENSEMBLE OPTIONS */
1946 if (ir->efep != efepNO) {
1947 if (fep->delta_lambda > 0) {
1948 ir->efep = efepSLOWGROWTH;
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. */
1958 if ((ir->efep != efepNO) || ir->bSimTemp)
1960 ir->bExpanded = FALSE;
1961 if ((ir->efep == efepEXPANDED) || ir->bSimTemp)
1963 ir->bExpanded = TRUE;
1965 do_fep_params(ir,fep_lambda,lambda_weights);
1966 if (ir->bSimTemp) { /* done after fep params */
1967 do_simtemp_params(ir);
1970 else
1972 ir->fepvals->n_lambda = 0;
1975 /* WALL PARAMETERS */
1977 do_wall_params(ir,wall_atomtype,wall_density,opts);
1979 /* ORIENTATION RESTRAINT PARAMETERS */
1981 if (opts->bOrire && str_nelem(orirefitgrp,MAXPTR,NULL)!=1) {
1982 warning_error(wi,"ERROR: Need one orientation restraint fit group\n");
1985 /* DEFORMATION PARAMETERS */
1987 clear_mat(ir->deform);
1988 for(i=0; i<6; i++)
1990 dumdub[0][i] = 0;
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++)
1997 ir->deform[i][i] = dumdub[0][i];
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");
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);
2019 sfree(dumstr[0]);
2020 sfree(dumstr[1]);
2023 static int search_QMstring(char *s,int ng,const char *gn[])
2025 /* same as normal search_string, but this one searches QM strings */
2026 int i;
2028 for(i=0; (i<ng); i++)
2029 if (gmx_strcasecmp(s,gn[i]) == 0)
2030 return i;
2032 gmx_fatal(FARGS,"this QM method or basisset (%s) is not implemented\n!",s);
2034 return -1;
2036 } /* search_QMstring */
2039 int search_string(char *s,int ng,char *gn[])
2041 int i;
2043 for(i=0; (i<ng); i++)
2045 if (gmx_strcasecmp(s,gn[i]) == 0)
2047 return i;
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.",
2058 return -1;
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)
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];
2074 if (debug)
2076 fprintf(debug,"Starting numbering %d groups of type %d\n",ng,gtype);
2079 title = gtypes[gtype];
2081 snew(cbuf,natoms);
2082 /* Mark all id's as not set */
2083 for(i=0; (i<natoms); i++)
2085 cbuf[i] = NOGID;
2088 snew(grps->nm_ind,ng+1); /* +1 for possible rest group */
2089 for(i=0; (i<ng); i++)
2091 /* Lookup the group name in the block structure */
2092 gid = search_string(ptrs[i],block->nr,gnames);
2093 if ((grptp != egrptpONE) || (i == 0))
2095 grps->nm_ind[grps->nr++]=gid;
2097 if (debug)
2099 fprintf(debug,"Found gid %d for group %s\n",gid,ptrs[i]);
2102 /* Now go over the atoms in the group */
2103 for(j=block->index[gid]; (j<block->index[gid+1]); j++)
2106 aj=block->a[j];
2108 /* Range checking */
2109 if ((aj < 0) || (aj >= natoms))
2111 gmx_fatal(FARGS,"Invalid atom number %d in indexfile",aj);
2113 /* Lookup up the old group number */
2114 ognr = cbuf[aj];
2115 if (ognr != NOGID)
2117 gmx_fatal(FARGS,"Atom %d in multiple %s groups (%d and %d)",
2118 aj+1,title,ognr+1,i+1);
2120 else
2122 /* Store the group number in buffer */
2123 if (grptp == egrptpONE)
2125 cbuf[aj] = 0;
2127 else
2129 cbuf[aj] = i;
2131 ntot++;
2136 /* Now check whether we have done all atoms */
2137 bRest = FALSE;
2138 if (ntot != natoms)
2140 if (grptp == egrptpALL)
2142 gmx_fatal(FARGS,"%d atoms are not part of any of the %s groups",
2143 natoms-ntot,title);
2145 else if (grptp == egrptpPART)
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);
2151 /* Assign all atoms currently unassigned to a rest group */
2152 for(j=0; (j<natoms); j++)
2154 if (cbuf[j] == NOGID)
2156 cbuf[j] = grps->nr;
2157 bRest = TRUE;
2160 if (grptp != egrptpPART)
2162 if (bVerbose)
2164 fprintf(stderr,
2165 "Making dummy/rest group for %s containing %d elements\n",
2166 title,natoms-ntot);
2168 /* Add group name "rest" */
2169 grps->nm_ind[grps->nr] = restnm;
2171 /* Assign the rest name to all atoms not currently assigned to a group */
2172 for(j=0; (j<natoms); j++)
2174 if (cbuf[j] == NOGID)
2176 cbuf[j] = grps->nr;
2179 grps->nr++;
2183 if (grps->nr == 1 && (ntot == 0 || ntot == natoms))
2185 /* All atoms are part of one (or no) group, no index required */
2186 groups->ngrpnr[gtype] = 0;
2187 groups->grpnr[gtype] = NULL;
2189 else
2191 groups->ngrpnr[gtype] = natoms;
2192 snew(groups->grpnr[gtype],natoms);
2193 for(j=0; (j<natoms); j++)
2195 groups->grpnr[gtype][j] = cbuf[j];
2199 sfree(cbuf);
2201 return (bRest && grptp == egrptpPART);
2204 static void calc_nrdf(gmx_mtop_t *mtop,t_inputrec *ir,char **gnames)
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;
2219 /* Calculate nrdf.
2220 * First calc 3xnr-atoms for each group
2221 * then subtract half a degree of freedom for each constraint
2223 * Only atoms and nuclei contribute to the degrees of freedom...
2226 opts = &ir->opts;
2228 groups = &mtop->groups;
2229 natoms = mtop->natoms;
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.
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);
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;
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;
2256 nrdf_tc [ggrpnr(groups,egcTC ,i)] += 0.5*nrdf2[i];
2257 nrdf_vcm[ggrpnr(groups,egcVCM,i)] += 0.5*nrdf2[i];
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.
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;
2300 ia += interaction_function[ftype].nratoms+1;
2301 i += interaction_function[ftype].nratoms+1;
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;
2314 ia += 4;
2315 i += 4;
2317 as += molt->atoms.nr;
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.
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++;
2335 } else {
2336 nc = 1;
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--;
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)]]);
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.
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");
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++;
2385 /* Correct for VCM removal according to the fraction of each VCM
2386 * group present in this TC group.
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);
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];
2399 if (debug) {
2400 fprintf(debug," nrdf_vcm[%d] = %g, nrdf = %g\n",
2401 j,nrdf_vcm[j],nrdf_tc[i]);
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]);
2415 sfree(nrdf2);
2416 sfree(nrdf_tc);
2417 sfree(nrdf_vcm);
2418 sfree(na_vcm);
2421 static void decode_cos(char *s,t_cosines *cosine,gmx_bool bTime)
2423 char *t;
2424 char format[STRLEN],f1[STRLEN];
2425 double a,phi;
2426 int i;
2428 t=strdup(s);
2429 trim(t);
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);
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");
2454 sfree(t);
2457 static gmx_bool do_egp_flag(t_inputrec *ir,gmx_groups_t *groups,
2458 const char *option,const char *val,int flag)
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.
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;
2470 gnames = groups->grpname;
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;
2499 return bSet;
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)
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];
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);
2540 groups = &mtop->groups;
2541 natoms = mtop->natoms;
2542 symtab = &mtop->symtab;
2544 snew(groups->grpname,grps->nr+1);
2546 for(i=0; (i<grps->nr); i++) {
2547 groups->grpname[i] = put_symtab(symtab,gnames[i]);
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;
2555 set_warning_line(wi,mdparin,-1);
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);
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");
2577 if (bSetTCpar)
2579 if (nr != nref_t)
2581 gmx_fatal(FARGS,"Not enough ref-t and tau-t values!");
2584 tau_min = 1e20;
2585 for(i=0; (i<nr); i++)
2587 ir->opts.tau_t[i] = strtod(ptr1[i],NULL);
2588 if ((ir->eI == eiBD || ir->eI == eiSD2) && ir->opts.tau_t[i] <= 0)
2590 sprintf(warn_buf,"With integrator %s tau-t should be larger than 0",ei_names[ir->eI]);
2591 warning_error(wi,warn_buf);
2594 if (ir->etc != etcVRESCALE && ir->opts.tau_t[i] == 0)
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.");
2599 if (ir->opts.tau_t[i] >= 0)
2601 tau_min = min(tau_min,ir->opts.tau_t[i]);
2604 if (ir->etc != etcNO && ir->nsttcouple == -1)
2606 ir->nsttcouple = ir_optimal_nsttcouple(ir);
2609 if (EI_VV(ir->eI))
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");
2614 if ((ir->epc==epcMTTK) && (ir->etc>etcNO))
2616 int mincouple;
2617 mincouple = ir->nsttcouple;
2618 if (ir->nstpcouple < mincouple)
2620 mincouple = ir->nstpcouple;
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);
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 */
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);
2638 nstcmin = tcouple_min_integration_steps(ir->etc);
2639 if (nstcmin > 1)
2641 if (tau_min/(ir->delta_t*ir->nsttcouple) < nstcmin)
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);
2650 for(i=0; (i<nr); i++)
2652 ir->opts.ref_t[i] = strtod(ptr2[i],NULL);
2653 if (ir->opts.ref_t[i] < 0)
2655 gmx_fatal(FARGS,"ref-t for group %d negative",i);
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)
2662 ir->expandedvals->mc_temp = ir->opts.ref_t[0]; /*for now, set to the first reft */
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;
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;
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];
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);
2717 for(i=0,k=0;i<nr;i++) {
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]);
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++;
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]);
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");
2763 if (ir->ePull != epullNO) {
2764 make_pull_groups(ir->pull,pull_grp,grps,gnames);
2767 if (ir->bRot) {
2768 make_rotation_groups(ir->rot,rot_grp,grps,gnames);
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;
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;
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);
2810 for( ; (i<nr); i++)
2811 for(j=0; (j<DIM); j++)
2812 ir->opts.nFreeze[i][j]=0;
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.");
2829 /* Now we have filled the freeze struct, so we can calculate NRDF */
2830 calc_nrdf(mtop,ir,gnames);
2832 if (v && NULL) {
2833 real fac,ntot=0;
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]);
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);
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);
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
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);
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);
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);
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);
2907 /* special optimization options */
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);
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);
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);
2929 /* end of QMMM input */
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");
2939 nr = groups->grps[egcENER].nr;
2940 snew(ir->opts.egp_flags,nr*nr);
2942 bExcl = do_egp_flag(ir,groups,"energygrp-excl",egpexcl,EGP_EXCL);
2943 if (bExcl && ir->cutoff_scheme == ecutsVERLET)
2945 warning_error(wi,"Energy group exclusions are not (yet) implemented for the Verlet scheme");
2947 if (bExcl && EEL_FULL(ir->coulombtype))
2948 warning(wi,"Can not exclude the lattice Coulomb energy between energy groups");
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");
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);
2963 if (ir->bAdress)
2964 do_adress_index(ir->adress,groups,gnames,&(ir->opts),wi);
2966 for(i=0; (i<grps->nr); i++)
2967 sfree(gnames[i]);
2968 sfree(gnames);
2969 done_blocka(grps);
2970 sfree(grps);
2976 static void check_disre(gmx_mtop_t *mtop)
2978 gmx_ffparams_t *ffparams;
2979 t_functype *functype;
2980 t_iparams *ip;
2981 int i,ndouble,ftype;
2982 int label,old_label;
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++;
2998 old_label = label;
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);
3008 static gmx_bool absolute_reference(t_inputrec *ir,gmx_mtop_t *sys,
3009 gmx_bool posres_only,
3010 ivec AbsRef)
3012 int d,g,i;
3013 gmx_mtop_ilistloop_t iloop;
3014 t_ilist *ilist;
3015 int nmol;
3016 t_iparams *pr;
3018 clear_ivec(AbsRef);
3020 if (!posres_only)
3022 /* Check the COM */
3023 for(d=0; d<DIM; d++)
3025 AbsRef[d] = (d < ndof_com(ir) ? 0 : 1);
3027 /* Check for freeze groups */
3028 for(g=0; g<ir->opts.ngfrz; g++)
3030 for(d=0; d<DIM; d++)
3032 if (ir->opts.nFreeze[g][d] != 0)
3034 AbsRef[d] = 1;
3040 /* Check for position restraints */
3041 iloop = gmx_mtop_ilistloop_init(sys);
3042 while (gmx_mtop_ilistloop_next(iloop,&ilist,&nmol))
3044 if (nmol > 0 &&
3045 (AbsRef[XX] == 0 || AbsRef[YY] == 0 || AbsRef[ZZ] == 0))
3047 for(i=0; i<ilist[F_POSRES].nr; i+=2)
3049 pr = &sys->ffparams.iparams[ilist[F_POSRES].iatoms[i]];
3050 for(d=0; d<DIM; d++)
3052 if (pr->posres.fcA[d] != 0)
3054 AbsRef[d] = 1;
3061 return (AbsRef[XX] != 0 && AbsRef[YY] != 0 && AbsRef[ZZ] != 0);
3064 void triple_check(const char *mdparin,t_inputrec *ir,gmx_mtop_t *sys,
3065 warninp_t wi)
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];
3078 set_warning_line(wi,mdparin,-1);
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");
3086 /* Check for pressure coupling with absolute position restraints */
3087 if (ir->epc != epcNO && ir->refcoord_scaling == erscNO)
3089 absolute_reference(ir,sys,TRUE,AbsRef);
3091 for(m=0; m<DIM; m++)
3093 if (AbsRef[m] && norm2(ir->compress[m]) > 0)
3095 warning(wi,"You are using pressure coupling with absolute position restraints, this will give artifacts. Use the refcoord_scaling option.");
3096 break;
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;
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);
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);
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);
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));
3141 if (ir->eI == eiSD1 &&
3142 (gmx_mtop_ftype_count(sys,F_CONSTR) > 0 ||
3143 gmx_mtop_ftype_count(sys,F_SETTLE) > 0))
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);
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;
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;
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];
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];
3183 sfree(mgrp);
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");
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;
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);
3218 check_disre(sys);
3221 void double_check(t_inputrec *ir,matrix box,gmx_bool bConstr,warninp_t wi)
3223 real min_size;
3224 gmx_bool bTWIN;
3225 char warn_buf[STRLEN];
3226 const char *ptr;
3228 ptr = check_box(ir->ePBC,box);
3229 if (ptr) {
3230 warning_error(wi,ptr);
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);
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);
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);
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);
3262 if (ir->epc==epcMTTK) {
3263 warning_error(wi,"MTTK not compatible with lincs -- use shake instead.");
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;
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.");
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);
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.");
3296 void check_chargegroup_radii(const gmx_mtop_t *mtop,const t_inputrec *ir,
3297 rvec *x,
3298 warninp_t wi)
3300 real rvdw1,rvdw2,rcoul1,rcoul2;
3301 char warn_buf[STRLEN];
3303 calc_chargegroup_radii(mtop,x,&rvdw1,&rvdw2,&rcoul1,&rcoul2);
3305 if (rvdw1 > 0)
3307 printf("Largest charge group radii for Van der Waals: %5.3f, %5.3f nm\n",
3308 rvdw1,rvdw2);
3310 if (rcoul1 > 0)
3312 printf("Largest charge group radii for Coulomb: %5.3f, %5.3f nm\n",
3313 rcoul1,rcoul2);
3316 if (ir->rlist > 0)
3318 if (rvdw1 + rvdw2 > ir->rlist ||
3319 rcoul1 + rcoul2 > ir->rlist)
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);
3324 else
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.
3330 if (EVDW_IS_ZERO_AT_CUTOFF(ir->vdwtype) &&
3331 rvdw1 + rvdw2 > ir->rlist - ir->rvdw)
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))
3338 warning(wi,warn_buf);
3340 else
3342 warning_note(wi,warn_buf);
3345 if (EEL_IS_ZERO_AT_CUTOFF(ir->coulombtype) &&
3346 rcoul1 + rcoul2 > ir->rlistlong - ir->rcoulomb)
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))
3354 warning(wi,warn_buf);
3356 else
3358 warning_note(wi,warn_buf);