Removed include of types/ifunc.h from typedefs.h
[gromacs.git] / src / gromacs / gmxpreprocess / readir.cpp
blobf2af500673934ad4dd2424c64034af10cda45df6
1 /*
2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
37 #include "gmxpre.h"
39 #include "readir.h"
41 #include <ctype.h>
42 #include <limits.h>
43 #include <stdlib.h>
45 #include <cmath>
47 #include <algorithm>
49 #include "gromacs/gmxpreprocess/toputil.h"
50 #include "gromacs/legacyheaders/chargegroup.h"
51 #include "gromacs/legacyheaders/inputrec.h"
52 #include "gromacs/legacyheaders/names.h"
53 #include "gromacs/legacyheaders/network.h"
54 #include "gromacs/legacyheaders/readinp.h"
55 #include "gromacs/legacyheaders/typedefs.h"
56 #include "gromacs/legacyheaders/warninp.h"
57 #include "gromacs/legacyheaders/types/ifunc.h"
58 #include "gromacs/math/units.h"
59 #include "gromacs/math/vec.h"
60 #include "gromacs/mdlib/calc_verletbuf.h"
61 #include "gromacs/pbcutil/pbc.h"
62 #include "gromacs/topology/block.h"
63 #include "gromacs/topology/index.h"
64 #include "gromacs/topology/mtop_util.h"
65 #include "gromacs/topology/symtab.h"
66 #include "gromacs/utility/cstringutil.h"
67 #include "gromacs/utility/fatalerror.h"
68 #include "gromacs/utility/smalloc.h"
70 #define MAXPTR 254
71 #define NOGID 255
73 /* Resource parameters
74 * Do not change any of these until you read the instruction
75 * in readinp.h. Some cpp's do not take spaces after the backslash
76 * (like the c-shell), which will give you a very weird compiler
77 * message.
80 typedef struct t_inputrec_strings
82 char tcgrps[STRLEN], tau_t[STRLEN], ref_t[STRLEN],
83 acc[STRLEN], accgrps[STRLEN], freeze[STRLEN], frdim[STRLEN],
84 energy[STRLEN], user1[STRLEN], user2[STRLEN], vcm[STRLEN], x_compressed_groups[STRLEN],
85 couple_moltype[STRLEN], orirefitgrp[STRLEN], egptable[STRLEN], egpexcl[STRLEN],
86 wall_atomtype[STRLEN], wall_density[STRLEN], deform[STRLEN], QMMM[STRLEN],
87 imd_grp[STRLEN];
88 char fep_lambda[efptNR][STRLEN];
89 char lambda_weights[STRLEN];
90 char **pull_grp;
91 char **rot_grp;
92 char anneal[STRLEN], anneal_npoints[STRLEN],
93 anneal_time[STRLEN], anneal_temp[STRLEN];
94 char QMmethod[STRLEN], QMbasis[STRLEN], QMcharge[STRLEN], QMmult[STRLEN],
95 bSH[STRLEN], CASorbitals[STRLEN], CASelectrons[STRLEN], SAon[STRLEN],
96 SAoff[STRLEN], SAsteps[STRLEN], bTS[STRLEN], bOPT[STRLEN];
97 char efield_x[STRLEN], efield_xt[STRLEN], efield_y[STRLEN],
98 efield_yt[STRLEN], efield_z[STRLEN], efield_zt[STRLEN];
100 } gmx_inputrec_strings;
102 static gmx_inputrec_strings *is = NULL;
104 void init_inputrec_strings()
106 if (is)
108 gmx_incons("Attempted to call init_inputrec_strings before calling done_inputrec_strings. Only one inputrec (i.e. .mdp file) can be parsed at a time.");
110 snew(is, 1);
113 void done_inputrec_strings()
115 sfree(is);
116 is = NULL;
119 static char swapgrp[STRLEN], splitgrp0[STRLEN], splitgrp1[STRLEN], solgrp[STRLEN];
121 enum {
122 egrptpALL, /* All particles have to be a member of a group. */
123 egrptpALL_GENREST, /* A rest group with name is generated for particles *
124 * that are not part of any group. */
125 egrptpPART, /* As egrptpALL_GENREST, but no name is generated *
126 * for the rest group. */
127 egrptpONE /* Merge all selected groups into one group, *
128 * make a rest group for the remaining particles. */
131 static const char *constraints[eshNR+1] = {
132 "none", "h-bonds", "all-bonds", "h-angles", "all-angles", NULL
135 static const char *couple_lam[ecouplamNR+1] = {
136 "vdw-q", "vdw", "q", "none", NULL
139 void init_ir(t_inputrec *ir, t_gromppopts *opts)
141 snew(opts->include, STRLEN);
142 snew(opts->define, STRLEN);
143 snew(ir->fepvals, 1);
144 snew(ir->expandedvals, 1);
145 snew(ir->simtempvals, 1);
148 static void GetSimTemps(int ntemps, t_simtemp *simtemp, double *temperature_lambdas)
151 int i;
153 for (i = 0; i < ntemps; i++)
155 /* simple linear scaling -- allows more control */
156 if (simtemp->eSimTempScale == esimtempLINEAR)
158 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*temperature_lambdas[i];
160 else if (simtemp->eSimTempScale == esimtempGEOMETRIC) /* should give roughly equal acceptance for constant heat capacity . . . */
162 simtemp->temperatures[i] = simtemp->simtemp_low * std::pow(simtemp->simtemp_high/simtemp->simtemp_low, static_cast<real>((1.0*i)/(ntemps-1)));
164 else if (simtemp->eSimTempScale == esimtempEXPONENTIAL)
166 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*(gmx_expm1(temperature_lambdas[i])/gmx_expm1(1.0));
168 else
170 char errorstr[128];
171 sprintf(errorstr, "eSimTempScale=%d not defined", simtemp->eSimTempScale);
172 gmx_fatal(FARGS, errorstr);
179 static void _low_check(gmx_bool b, const char *s, warninp_t wi)
181 if (b)
183 warning_error(wi, s);
187 static void check_nst(const char *desc_nst, int nst,
188 const char *desc_p, int *p,
189 warninp_t wi)
191 char buf[STRLEN];
193 if (*p > 0 && *p % nst != 0)
195 /* Round up to the next multiple of nst */
196 *p = ((*p)/nst + 1)*nst;
197 sprintf(buf, "%s should be a multiple of %s, changing %s to %d\n",
198 desc_p, desc_nst, desc_p, *p);
199 warning(wi, buf);
203 static gmx_bool ir_NVE(const t_inputrec *ir)
205 return ((ir->eI == eiMD || EI_VV(ir->eI)) && ir->etc == etcNO);
208 static int lcd(int n1, int n2)
210 int d, i;
212 d = 1;
213 for (i = 2; (i <= n1 && i <= n2); i++)
215 if (n1 % i == 0 && n2 % i == 0)
217 d = i;
221 return d;
224 static void process_interaction_modifier(const t_inputrec *ir, int *eintmod)
226 if (*eintmod == eintmodPOTSHIFT_VERLET)
228 if (ir->cutoff_scheme == ecutsVERLET)
230 *eintmod = eintmodPOTSHIFT;
232 else
234 *eintmod = eintmodNONE;
239 void check_ir(const char *mdparin, t_inputrec *ir, t_gromppopts *opts,
240 warninp_t wi)
241 /* Check internal consistency.
242 * NOTE: index groups are not set here yet, don't check things
243 * like temperature coupling group options here, but in triple_check
246 /* Strange macro: first one fills the err_buf, and then one can check
247 * the condition, which will print the message and increase the error
248 * counter.
250 #define CHECK(b) _low_check(b, err_buf, wi)
251 char err_buf[256], warn_buf[STRLEN];
252 int i, j;
253 real dt_pcoupl;
254 t_lambda *fep = ir->fepvals;
255 t_expanded *expand = ir->expandedvals;
257 set_warning_line(wi, mdparin, -1);
259 /* BASIC CUT-OFF STUFF */
260 if (ir->rcoulomb < 0)
262 warning_error(wi, "rcoulomb should be >= 0");
264 if (ir->rvdw < 0)
266 warning_error(wi, "rvdw should be >= 0");
268 if (ir->rlist < 0 &&
269 !(ir->cutoff_scheme == ecutsVERLET && ir->verletbuf_tol > 0))
271 warning_error(wi, "rlist should be >= 0");
273 sprintf(err_buf, "nstlist can not be smaller than 0. (If you were trying to use the heuristic neighbour-list update scheme for efficient buffering for improved energy conservation, please use the Verlet cut-off scheme instead.)");
274 CHECK(ir->nstlist < 0);
276 process_interaction_modifier(ir, &ir->coulomb_modifier);
277 process_interaction_modifier(ir, &ir->vdw_modifier);
279 if (ir->cutoff_scheme == ecutsGROUP)
281 warning_note(wi,
282 "The group cutoff scheme is deprecated since GROMACS 5.0 and will be removed in a future "
283 "release when all interaction forms are supported for the verlet scheme. The verlet "
284 "scheme already scales better, and it is compatible with GPUs and other accelerators.");
286 /* BASIC CUT-OFF STUFF */
287 if (ir->rlist == 0 ||
288 !((ir_coulomb_might_be_zero_at_cutoff(ir) && ir->rcoulomb > ir->rlist) ||
289 (ir_vdw_might_be_zero_at_cutoff(ir) && ir->rvdw > ir->rlist)))
291 /* No switched potential and/or no twin-range:
292 * we can set the long-range cut-off to the maximum of the other cut-offs.
294 ir->rlistlong = max_cutoff(ir->rlist, max_cutoff(ir->rvdw, ir->rcoulomb));
296 else if (ir->rlistlong < 0)
298 ir->rlistlong = max_cutoff(ir->rlist, max_cutoff(ir->rvdw, ir->rcoulomb));
299 sprintf(warn_buf, "rlistlong was not set, setting it to %g (no buffer)",
300 ir->rlistlong);
301 warning(wi, warn_buf);
303 if (ir->rlistlong == 0 && ir->ePBC != epbcNONE)
305 warning_error(wi, "Can not have an infinite cut-off with PBC");
307 if (ir->rlistlong > 0 && (ir->rlist == 0 || ir->rlistlong < ir->rlist))
309 warning_error(wi, "rlistlong can not be shorter than rlist");
311 if (IR_TWINRANGE(*ir) && ir->nstlist == 0)
313 warning_error(wi, "Can not have nstlist == 0 with twin-range interactions");
317 if (ir->rlistlong == ir->rlist)
319 ir->nstcalclr = 0;
321 else if (ir->rlistlong > ir->rlist && ir->nstcalclr == 0)
323 warning_error(wi, "With different cutoffs for electrostatics and VdW, nstcalclr must be -1 or a positive number");
326 if (ir->cutoff_scheme == ecutsVERLET)
328 real rc_max;
330 /* Normal Verlet type neighbor-list, currently only limited feature support */
331 if (inputrec2nboundeddim(ir) < 3)
333 warning_error(wi, "With Verlet lists only full pbc or pbc=xy with walls is supported");
335 if (ir->rcoulomb != ir->rvdw)
337 warning_error(wi, "With Verlet lists rcoulomb!=rvdw is not supported");
339 if (ir->vdwtype == evdwSHIFT || ir->vdwtype == evdwSWITCH)
341 if (ir->vdw_modifier == eintmodNONE ||
342 ir->vdw_modifier == eintmodPOTSHIFT)
344 ir->vdw_modifier = (ir->vdwtype == evdwSHIFT ? eintmodFORCESWITCH : eintmodPOTSWITCH);
346 sprintf(warn_buf, "Replacing vdwtype=%s by the equivalent combination of vdwtype=%s and vdw_modifier=%s", evdw_names[ir->vdwtype], evdw_names[evdwCUT], eintmod_names[ir->vdw_modifier]);
347 warning_note(wi, warn_buf);
349 ir->vdwtype = evdwCUT;
351 else
353 sprintf(warn_buf, "Unsupported combination of vdwtype=%s and vdw_modifier=%s", evdw_names[ir->vdwtype], eintmod_names[ir->vdw_modifier]);
354 warning_error(wi, warn_buf);
358 if (!(ir->vdwtype == evdwCUT || ir->vdwtype == evdwPME))
360 warning_error(wi, "With Verlet lists only cut-off and PME LJ interactions are supported");
362 if (!(ir->coulombtype == eelCUT ||
363 (EEL_RF(ir->coulombtype) && ir->coulombtype != eelRF_NEC) ||
364 EEL_PME(ir->coulombtype) || ir->coulombtype == eelEWALD))
366 warning_error(wi, "With Verlet lists only cut-off, reaction-field, PME and Ewald electrostatics are supported");
368 if (!(ir->coulomb_modifier == eintmodNONE ||
369 ir->coulomb_modifier == eintmodPOTSHIFT))
371 sprintf(warn_buf, "coulomb_modifier=%s is not supported with the Verlet cut-off scheme", eintmod_names[ir->coulomb_modifier]);
372 warning_error(wi, warn_buf);
375 if (ir->implicit_solvent != eisNO)
377 warning_error(wi, "Implicit solvent is not (yet) supported with the with Verlet lists.");
380 if (ir->nstlist <= 0)
382 warning_error(wi, "With Verlet lists nstlist should be larger than 0");
385 if (ir->nstlist < 10)
387 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.");
390 rc_max = std::max(ir->rvdw, ir->rcoulomb);
392 if (ir->verletbuf_tol <= 0)
394 if (ir->verletbuf_tol == 0)
396 warning_error(wi, "Can not have Verlet buffer tolerance of exactly 0");
399 if (ir->rlist < rc_max)
401 warning_error(wi, "With verlet lists rlist can not be smaller than rvdw or rcoulomb");
404 if (ir->rlist == rc_max && ir->nstlist > 1)
406 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.");
409 else
411 if (ir->rlist > rc_max)
413 warning_note(wi, "You have set rlist larger than the interaction cut-off, but you also have verlet-buffer-tolerance > 0. Will set rlist using verlet-buffer-tolerance.");
416 if (ir->nstlist == 1)
418 /* No buffer required */
419 ir->rlist = rc_max;
421 else
423 if (EI_DYNAMICS(ir->eI))
425 if (inputrec2nboundeddim(ir) < 3)
427 warning_error(wi, "The box volume is required for calculating rlist from the energy drift with verlet-buffer-tolerance > 0. You are using at least one unbounded dimension, so no volume can be computed. Either use a finite box, or set rlist yourself together with verlet-buffer-tolerance = -1.");
429 /* Set rlist temporarily so we can continue processing */
430 ir->rlist = rc_max;
432 else
434 /* Set the buffer to 5% of the cut-off */
435 ir->rlist = (1.0 + verlet_buffer_ratio_nodynamics)*rc_max;
440 /* No twin-range calculations with Verlet lists */
441 ir->rlistlong = ir->rlist;
444 if (ir->nstcalclr == -1)
446 /* if rlist=rlistlong, this will later be changed to nstcalclr=0 */
447 ir->nstcalclr = ir->nstlist;
449 else if (ir->nstcalclr > 0)
451 if (ir->nstlist > 0 && (ir->nstlist % ir->nstcalclr != 0))
453 warning_error(wi, "nstlist must be evenly divisible by nstcalclr. Use nstcalclr = -1 to automatically follow nstlist");
456 else if (ir->nstcalclr < -1)
458 warning_error(wi, "nstcalclr must be a positive number (divisor of nstcalclr), or -1 to follow nstlist.");
461 if (EEL_PME(ir->coulombtype) && ir->rcoulomb > ir->rlist && ir->nstcalclr > 1)
463 warning_error(wi, "When used with PME, the long-range component of twin-range interactions must be updated every step (nstcalclr)");
466 /* GENERAL INTEGRATOR STUFF */
467 if (!(ir->eI == eiMD || EI_VV(ir->eI)))
469 ir->etc = etcNO;
471 if (ir->eI == eiVVAK)
473 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]);
474 warning_note(wi, warn_buf);
476 if (!EI_DYNAMICS(ir->eI))
478 ir->epc = epcNO;
480 if (EI_DYNAMICS(ir->eI))
482 if (ir->nstcalcenergy < 0)
484 ir->nstcalcenergy = ir_optimal_nstcalcenergy(ir);
485 if (ir->nstenergy != 0 && ir->nstenergy < ir->nstcalcenergy)
487 /* nstcalcenergy larger than nstener does not make sense.
488 * We ideally want nstcalcenergy=nstener.
490 if (ir->nstlist > 0)
492 ir->nstcalcenergy = lcd(ir->nstenergy, ir->nstlist);
494 else
496 ir->nstcalcenergy = ir->nstenergy;
500 else if ( (ir->nstenergy > 0 && ir->nstcalcenergy > ir->nstenergy) ||
501 (ir->efep != efepNO && ir->fepvals->nstdhdl > 0 &&
502 (ir->nstcalcenergy > ir->fepvals->nstdhdl) ) )
505 const char *nsten = "nstenergy";
506 const char *nstdh = "nstdhdl";
507 const char *min_name = nsten;
508 int min_nst = ir->nstenergy;
510 /* find the smallest of ( nstenergy, nstdhdl ) */
511 if (ir->efep != efepNO && ir->fepvals->nstdhdl > 0 &&
512 (ir->nstenergy == 0 || ir->fepvals->nstdhdl < ir->nstenergy))
514 min_nst = ir->fepvals->nstdhdl;
515 min_name = nstdh;
517 /* If the user sets nstenergy small, we should respect that */
518 sprintf(warn_buf,
519 "Setting nstcalcenergy (%d) equal to %s (%d)",
520 ir->nstcalcenergy, min_name, min_nst);
521 warning_note(wi, warn_buf);
522 ir->nstcalcenergy = min_nst;
525 if (ir->epc != epcNO)
527 if (ir->nstpcouple < 0)
529 ir->nstpcouple = ir_optimal_nstpcouple(ir);
532 if (IR_TWINRANGE(*ir))
534 check_nst("nstcalclr", ir->nstcalclr,
535 "nstcalcenergy", &ir->nstcalcenergy, wi);
536 if (ir->epc != epcNO)
538 check_nst("nstlist", ir->nstlist,
539 "nstpcouple", &ir->nstpcouple, wi);
543 if (ir->nstcalcenergy > 0)
545 if (ir->efep != efepNO)
547 /* nstdhdl should be a multiple of nstcalcenergy */
548 check_nst("nstcalcenergy", ir->nstcalcenergy,
549 "nstdhdl", &ir->fepvals->nstdhdl, wi);
550 /* nstexpanded should be a multiple of nstcalcenergy */
551 check_nst("nstcalcenergy", ir->nstcalcenergy,
552 "nstexpanded", &ir->expandedvals->nstexpanded, wi);
554 /* for storing exact averages nstenergy should be
555 * a multiple of nstcalcenergy
557 check_nst("nstcalcenergy", ir->nstcalcenergy,
558 "nstenergy", &ir->nstenergy, wi);
562 if (ir->nsteps == 0 && !ir->bContinuation)
564 warning_note(wi, "For a correct single-point energy evaluation with nsteps = 0, use continuation = yes to avoid constraining the input coordinates.");
567 /* LD STUFF */
568 if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
569 ir->bContinuation && ir->ld_seed != -1)
571 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)");
574 /* TPI STUFF */
575 if (EI_TPI(ir->eI))
577 sprintf(err_buf, "TPI only works with pbc = %s", epbc_names[epbcXYZ]);
578 CHECK(ir->ePBC != epbcXYZ);
579 sprintf(err_buf, "TPI only works with ns = %s", ens_names[ensGRID]);
580 CHECK(ir->ns_type != ensGRID);
581 sprintf(err_buf, "with TPI nstlist should be larger than zero");
582 CHECK(ir->nstlist <= 0);
583 sprintf(err_buf, "TPI does not work with full electrostatics other than PME");
584 CHECK(EEL_FULL(ir->coulombtype) && !EEL_PME(ir->coulombtype));
585 sprintf(err_buf, "TPI does not work (yet) with the Verlet cut-off scheme");
586 CHECK(ir->cutoff_scheme == ecutsVERLET);
589 /* SHAKE / LINCS */
590 if ( (opts->nshake > 0) && (opts->bMorse) )
592 sprintf(warn_buf,
593 "Using morse bond-potentials while constraining bonds is useless");
594 warning(wi, warn_buf);
597 if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
598 ir->bContinuation && ir->ld_seed != -1)
600 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)");
602 /* verify simulated tempering options */
604 if (ir->bSimTemp)
606 gmx_bool bAllTempZero = TRUE;
607 for (i = 0; i < fep->n_lambda; i++)
609 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]);
610 CHECK((fep->all_lambda[efptTEMPERATURE][i] < 0) || (fep->all_lambda[efptTEMPERATURE][i] > 1));
611 if (fep->all_lambda[efptTEMPERATURE][i] > 0)
613 bAllTempZero = FALSE;
616 sprintf(err_buf, "if simulated tempering is on, temperature-lambdas may not be all zero");
617 CHECK(bAllTempZero == TRUE);
619 sprintf(err_buf, "Simulated tempering is currently only compatible with md-vv");
620 CHECK(ir->eI != eiVV);
622 /* check compatability of the temperature coupling with simulated tempering */
624 if (ir->etc == etcNOSEHOOVER)
626 sprintf(warn_buf, "Nose-Hoover based temperature control such as [%s] my not be entirelyconsistent with simulated tempering", etcoupl_names[ir->etc]);
627 warning_note(wi, warn_buf);
630 /* check that the temperatures make sense */
632 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);
633 CHECK(ir->simtempvals->simtemp_high <= ir->simtempvals->simtemp_low);
635 sprintf(err_buf, "Higher simulated tempering temperature (%g) must be >= zero", ir->simtempvals->simtemp_high);
636 CHECK(ir->simtempvals->simtemp_high <= 0);
638 sprintf(err_buf, "Lower simulated tempering temperature (%g) must be >= zero", ir->simtempvals->simtemp_low);
639 CHECK(ir->simtempvals->simtemp_low <= 0);
642 /* verify free energy options */
644 if (ir->efep != efepNO)
646 fep = ir->fepvals;
647 sprintf(err_buf, "The soft-core power is %d and can only be 1 or 2",
648 fep->sc_power);
649 CHECK(fep->sc_alpha != 0 && fep->sc_power != 1 && fep->sc_power != 2);
651 sprintf(err_buf, "The soft-core sc-r-power is %d and can only be 6 or 48",
652 (int)fep->sc_r_power);
653 CHECK(fep->sc_alpha != 0 && fep->sc_r_power != 6.0 && fep->sc_r_power != 48.0);
655 sprintf(err_buf, "Can't use postive delta-lambda (%g) if initial state/lambda does not start at zero", fep->delta_lambda);
656 CHECK(fep->delta_lambda > 0 && ((fep->init_fep_state > 0) || (fep->init_lambda > 0)));
658 sprintf(err_buf, "Can't use postive delta-lambda (%g) with expanded ensemble simulations", fep->delta_lambda);
659 CHECK(fep->delta_lambda > 0 && (ir->efep == efepEXPANDED));
661 sprintf(err_buf, "Can only use expanded ensemble with md-vv (for now)");
662 CHECK(!(EI_VV(ir->eI)) && (ir->efep == efepEXPANDED));
664 sprintf(err_buf, "Free-energy not implemented for Ewald");
665 CHECK(ir->coulombtype == eelEWALD);
667 /* check validty of lambda inputs */
668 if (fep->n_lambda == 0)
670 /* Clear output in case of no states:*/
671 sprintf(err_buf, "init-lambda-state set to %d: no lambda states are defined.", fep->init_fep_state);
672 CHECK((fep->init_fep_state >= 0) && (fep->n_lambda == 0));
674 else
676 sprintf(err_buf, "initial thermodynamic state %d does not exist, only goes to %d", fep->init_fep_state, fep->n_lambda-1);
677 CHECK((fep->init_fep_state >= fep->n_lambda));
680 sprintf(err_buf, "Lambda state must be set, either with init-lambda-state or with init-lambda");
681 CHECK((fep->init_fep_state < 0) && (fep->init_lambda < 0));
683 sprintf(err_buf, "init-lambda=%g while init-lambda-state=%d. Lambda state must be set either with init-lambda-state or with init-lambda, but not both",
684 fep->init_lambda, fep->init_fep_state);
685 CHECK((fep->init_fep_state >= 0) && (fep->init_lambda >= 0));
689 if ((fep->init_lambda >= 0) && (fep->delta_lambda == 0))
691 int n_lambda_terms;
692 n_lambda_terms = 0;
693 for (i = 0; i < efptNR; i++)
695 if (fep->separate_dvdl[i])
697 n_lambda_terms++;
700 if (n_lambda_terms > 1)
702 sprintf(warn_buf, "If lambda vector states (fep-lambdas, coul-lambdas etc.) are set, don't use init-lambda to set lambda state (except for slow growth). Use init-lambda-state instead.");
703 warning(wi, warn_buf);
706 if (n_lambda_terms < 2 && fep->n_lambda > 0)
708 warning_note(wi,
709 "init-lambda is deprecated for setting lambda state (except for slow growth). Use init-lambda-state instead.");
713 for (j = 0; j < efptNR; j++)
715 for (i = 0; i < fep->n_lambda; i++)
717 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]);
718 CHECK((fep->all_lambda[j][i] < 0) || (fep->all_lambda[j][i] > 1));
722 if ((fep->sc_alpha > 0) && (!fep->bScCoul))
724 for (i = 0; i < fep->n_lambda; i++)
726 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],
727 fep->all_lambda[efptCOUL][i]);
728 CHECK((fep->sc_alpha > 0) &&
729 (((fep->all_lambda[efptCOUL][i] > 0.0) &&
730 (fep->all_lambda[efptCOUL][i] < 1.0)) &&
731 ((fep->all_lambda[efptVDW][i] > 0.0) &&
732 (fep->all_lambda[efptVDW][i] < 1.0))));
736 if ((fep->bScCoul) && (EEL_PME(ir->coulombtype)))
738 real sigma, lambda, r_sc;
740 sigma = 0.34;
741 /* Maximum estimate for A and B charges equal with lambda power 1 */
742 lambda = 0.5;
743 r_sc = std::pow(lambda*fep->sc_alpha*std::pow(sigma/ir->rcoulomb, fep->sc_r_power) + 1.0, 1.0/fep->sc_r_power);
744 sprintf(warn_buf, "With PME there is a minor soft core effect present at the cut-off, proportional to (LJsigma/rcoulomb)^%g. This could have a minor effect on energy conservation, but usually other effects dominate. With a common sigma value of %g nm the fraction of the particle-particle potential at the cut-off at lambda=%g is around %.1e, while ewald-rtol is %.1e.",
745 fep->sc_r_power,
746 sigma, lambda, r_sc - 1.0, ir->ewald_rtol);
747 warning_note(wi, warn_buf);
750 /* Free Energy Checks -- In an ideal world, slow growth and FEP would
751 be treated differently, but that's the next step */
753 for (i = 0; i < efptNR; i++)
755 for (j = 0; j < fep->n_lambda; j++)
757 sprintf(err_buf, "%s[%d] must be between 0 and 1", efpt_names[i], j);
758 CHECK((fep->all_lambda[i][j] < 0) || (fep->all_lambda[i][j] > 1));
762 if (IR_TWINRANGE(*ir))
764 sprintf(err_buf, "nstdhdl must be divisible by nstcalclr");
765 CHECK(ir->fepvals->nstdhdl > 0 &&
766 ir->fepvals->nstdhdl % ir->nstcalclr != 0);
768 if (ir->efep == efepEXPANDED)
770 sprintf(err_buf, "nstexpanded must be divisible by nstcalclr");
771 CHECK(ir->expandedvals->nstexpanded % ir->nstcalclr != 0);
776 if ((ir->bSimTemp) || (ir->efep == efepEXPANDED))
778 fep = ir->fepvals;
780 /* checking equilibration of weights inputs for validity */
782 sprintf(err_buf, "weight-equil-number-all-lambda (%d) is ignored if lmc-weights-equil is not equal to %s",
783 expand->equil_n_at_lam, elmceq_names[elmceqNUMATLAM]);
784 CHECK((expand->equil_n_at_lam > 0) && (expand->elmceq != elmceqNUMATLAM));
786 sprintf(err_buf, "weight-equil-number-samples (%d) is ignored if lmc-weights-equil is not equal to %s",
787 expand->equil_samples, elmceq_names[elmceqSAMPLES]);
788 CHECK((expand->equil_samples > 0) && (expand->elmceq != elmceqSAMPLES));
790 sprintf(err_buf, "weight-equil-number-steps (%d) is ignored if lmc-weights-equil is not equal to %s",
791 expand->equil_steps, elmceq_names[elmceqSTEPS]);
792 CHECK((expand->equil_steps > 0) && (expand->elmceq != elmceqSTEPS));
794 sprintf(err_buf, "weight-equil-wl-delta (%d) is ignored if lmc-weights-equil is not equal to %s",
795 expand->equil_samples, elmceq_names[elmceqWLDELTA]);
796 CHECK((expand->equil_wl_delta > 0) && (expand->elmceq != elmceqWLDELTA));
798 sprintf(err_buf, "weight-equil-count-ratio (%f) is ignored if lmc-weights-equil is not equal to %s",
799 expand->equil_ratio, elmceq_names[elmceqRATIO]);
800 CHECK((expand->equil_ratio > 0) && (expand->elmceq != elmceqRATIO));
802 sprintf(err_buf, "weight-equil-number-all-lambda (%d) must be a positive integer if lmc-weights-equil=%s",
803 expand->equil_n_at_lam, elmceq_names[elmceqNUMATLAM]);
804 CHECK((expand->equil_n_at_lam <= 0) && (expand->elmceq == elmceqNUMATLAM));
806 sprintf(err_buf, "weight-equil-number-samples (%d) must be a positive integer if lmc-weights-equil=%s",
807 expand->equil_samples, elmceq_names[elmceqSAMPLES]);
808 CHECK((expand->equil_samples <= 0) && (expand->elmceq == elmceqSAMPLES));
810 sprintf(err_buf, "weight-equil-number-steps (%d) must be a positive integer if lmc-weights-equil=%s",
811 expand->equil_steps, elmceq_names[elmceqSTEPS]);
812 CHECK((expand->equil_steps <= 0) && (expand->elmceq == elmceqSTEPS));
814 sprintf(err_buf, "weight-equil-wl-delta (%f) must be > 0 if lmc-weights-equil=%s",
815 expand->equil_wl_delta, elmceq_names[elmceqWLDELTA]);
816 CHECK((expand->equil_wl_delta <= 0) && (expand->elmceq == elmceqWLDELTA));
818 sprintf(err_buf, "weight-equil-count-ratio (%f) must be > 0 if lmc-weights-equil=%s",
819 expand->equil_ratio, elmceq_names[elmceqRATIO]);
820 CHECK((expand->equil_ratio <= 0) && (expand->elmceq == elmceqRATIO));
822 sprintf(err_buf, "lmc-weights-equil=%s only possible when lmc-stats = %s or lmc-stats %s",
823 elmceq_names[elmceqWLDELTA], elamstats_names[elamstatsWL], elamstats_names[elamstatsWWL]);
824 CHECK((expand->elmceq == elmceqWLDELTA) && (!EWL(expand->elamstats)));
826 sprintf(err_buf, "lmc-repeats (%d) must be greater than 0", expand->lmc_repeats);
827 CHECK((expand->lmc_repeats <= 0));
828 sprintf(err_buf, "minimum-var-min (%d) must be greater than 0", expand->minvarmin);
829 CHECK((expand->minvarmin <= 0));
830 sprintf(err_buf, "weight-c-range (%d) must be greater or equal to 0", expand->c_range);
831 CHECK((expand->c_range < 0));
832 sprintf(err_buf, "init-lambda-state (%d) must be zero if lmc-forced-nstart (%d)> 0 and lmc-move != 'no'",
833 fep->init_fep_state, expand->lmc_forced_nstart);
834 CHECK((fep->init_fep_state != 0) && (expand->lmc_forced_nstart > 0) && (expand->elmcmove != elmcmoveNO));
835 sprintf(err_buf, "lmc-forced-nstart (%d) must not be negative", expand->lmc_forced_nstart);
836 CHECK((expand->lmc_forced_nstart < 0));
837 sprintf(err_buf, "init-lambda-state (%d) must be in the interval [0,number of lambdas)", fep->init_fep_state);
838 CHECK((fep->init_fep_state < 0) || (fep->init_fep_state >= fep->n_lambda));
840 sprintf(err_buf, "init-wl-delta (%f) must be greater than or equal to 0", expand->init_wl_delta);
841 CHECK((expand->init_wl_delta < 0));
842 sprintf(err_buf, "wl-ratio (%f) must be between 0 and 1", expand->wl_ratio);
843 CHECK((expand->wl_ratio <= 0) || (expand->wl_ratio >= 1));
844 sprintf(err_buf, "wl-scale (%f) must be between 0 and 1", expand->wl_scale);
845 CHECK((expand->wl_scale <= 0) || (expand->wl_scale >= 1));
847 /* if there is no temperature control, we need to specify an MC temperature */
848 sprintf(err_buf, "If there is no temperature control, and lmc-mcmove!= 'no',mc_temperature must be set to a positive number");
849 if (expand->nstTij > 0)
851 sprintf(err_buf, "nstlog must be non-zero");
852 CHECK(ir->nstlog != 0);
853 sprintf(err_buf, "nst-transition-matrix (%d) must be an integer multiple of nstlog (%d)",
854 expand->nstTij, ir->nstlog);
855 CHECK((expand->nstTij % ir->nstlog) != 0);
859 /* PBC/WALLS */
860 sprintf(err_buf, "walls only work with pbc=%s", epbc_names[epbcXY]);
861 CHECK(ir->nwall && ir->ePBC != epbcXY);
863 /* VACUUM STUFF */
864 if (ir->ePBC != epbcXYZ && ir->nwall != 2)
866 if (ir->ePBC == epbcNONE)
868 if (ir->epc != epcNO)
870 warning(wi, "Turning off pressure coupling for vacuum system");
871 ir->epc = epcNO;
874 else
876 sprintf(err_buf, "Can not have pressure coupling with pbc=%s",
877 epbc_names[ir->ePBC]);
878 CHECK(ir->epc != epcNO);
880 sprintf(err_buf, "Can not have Ewald with pbc=%s", epbc_names[ir->ePBC]);
881 CHECK(EEL_FULL(ir->coulombtype));
883 sprintf(err_buf, "Can not have dispersion correction with pbc=%s",
884 epbc_names[ir->ePBC]);
885 CHECK(ir->eDispCorr != edispcNO);
888 if (ir->rlist == 0.0)
890 sprintf(err_buf, "can only have neighborlist cut-off zero (=infinite)\n"
891 "with coulombtype = %s or coulombtype = %s\n"
892 "without periodic boundary conditions (pbc = %s) and\n"
893 "rcoulomb and rvdw set to zero",
894 eel_names[eelCUT], eel_names[eelUSER], epbc_names[epbcNONE]);
895 CHECK(((ir->coulombtype != eelCUT) && (ir->coulombtype != eelUSER)) ||
896 (ir->ePBC != epbcNONE) ||
897 (ir->rcoulomb != 0.0) || (ir->rvdw != 0.0));
899 if (ir->nstlist > 0)
901 warning_note(wi, "Simulating without cut-offs can be (slightly) faster with nstlist=0, nstype=simple and only one MPI rank");
905 /* COMM STUFF */
906 if (ir->nstcomm == 0)
908 ir->comm_mode = ecmNO;
910 if (ir->comm_mode != ecmNO)
912 if (ir->nstcomm < 0)
914 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");
915 ir->nstcomm = abs(ir->nstcomm);
918 if (ir->nstcalcenergy > 0 && ir->nstcomm < ir->nstcalcenergy)
920 warning_note(wi, "nstcomm < nstcalcenergy defeats the purpose of nstcalcenergy, setting nstcomm to nstcalcenergy");
921 ir->nstcomm = ir->nstcalcenergy;
924 if (ir->comm_mode == ecmANGULAR)
926 sprintf(err_buf, "Can not remove the rotation around the center of mass with periodic molecules");
927 CHECK(ir->bPeriodicMols);
928 if (ir->ePBC != epbcNONE)
930 warning(wi, "Removing the rotation around the center of mass in a periodic system, this can lead to artifacts. Only use this on a single (cluster of) molecules. This cluster should not cross periodic boundaries.");
935 if (EI_STATE_VELOCITY(ir->eI) && ir->ePBC == epbcNONE && ir->comm_mode != ecmANGULAR)
937 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.");
940 sprintf(err_buf, "Twin-range neighbour searching (NS) with simple NS"
941 " algorithm not implemented");
942 CHECK(((ir->rcoulomb > ir->rlist) || (ir->rvdw > ir->rlist))
943 && (ir->ns_type == ensSIMPLE));
945 /* TEMPERATURE COUPLING */
946 if (ir->etc == etcYES)
948 ir->etc = etcBERENDSEN;
949 warning_note(wi, "Old option for temperature coupling given: "
950 "changing \"yes\" to \"Berendsen\"\n");
953 if ((ir->etc == etcNOSEHOOVER) || (ir->epc == epcMTTK))
955 if (ir->opts.nhchainlength < 1)
957 sprintf(warn_buf, "number of Nose-Hoover chains (currently %d) cannot be less than 1,reset to 1\n", ir->opts.nhchainlength);
958 ir->opts.nhchainlength = 1;
959 warning(wi, warn_buf);
962 if (ir->etc == etcNOSEHOOVER && !EI_VV(ir->eI) && ir->opts.nhchainlength > 1)
964 warning_note(wi, "leapfrog does not yet support Nose-Hoover chains, nhchainlength reset to 1");
965 ir->opts.nhchainlength = 1;
968 else
970 ir->opts.nhchainlength = 0;
973 if (ir->eI == eiVVAK)
975 sprintf(err_buf, "%s implemented primarily for validation, and requires nsttcouple = 1 and nstpcouple = 1.",
976 ei_names[eiVVAK]);
977 CHECK((ir->nsttcouple != 1) || (ir->nstpcouple != 1));
980 if (ETC_ANDERSEN(ir->etc))
982 sprintf(err_buf, "%s temperature control not supported for integrator %s.", etcoupl_names[ir->etc], ei_names[ir->eI]);
983 CHECK(!(EI_VV(ir->eI)));
985 if (ir->nstcomm > 0 && (ir->etc == etcANDERSEN))
987 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]);
988 warning_note(wi, warn_buf);
991 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]);
992 CHECK(ir->nstcomm > 1 && (ir->etc == etcANDERSEN));
995 if (ir->etc == etcBERENDSEN)
997 sprintf(warn_buf, "The %s thermostat does not generate the correct kinetic energy distribution. You might want to consider using the %s thermostat.",
998 ETCOUPLTYPE(ir->etc), ETCOUPLTYPE(etcVRESCALE));
999 warning_note(wi, warn_buf);
1002 if ((ir->etc == etcNOSEHOOVER || ETC_ANDERSEN(ir->etc))
1003 && ir->epc == epcBERENDSEN)
1005 sprintf(warn_buf, "Using Berendsen pressure coupling invalidates the "
1006 "true ensemble for the thermostat");
1007 warning(wi, warn_buf);
1010 /* PRESSURE COUPLING */
1011 if (ir->epc == epcISOTROPIC)
1013 ir->epc = epcBERENDSEN;
1014 warning_note(wi, "Old option for pressure coupling given: "
1015 "changing \"Isotropic\" to \"Berendsen\"\n");
1018 if (ir->epc != epcNO)
1020 dt_pcoupl = ir->nstpcouple*ir->delta_t;
1022 sprintf(err_buf, "tau-p must be > 0 instead of %g\n", ir->tau_p);
1023 CHECK(ir->tau_p <= 0);
1025 if (ir->tau_p/dt_pcoupl < pcouple_min_integration_steps(ir->epc) - 10*GMX_REAL_EPS)
1027 sprintf(warn_buf, "For proper integration of the %s barostat, tau-p (%g) should be at least %d times larger than nstpcouple*dt (%g)",
1028 EPCOUPLTYPE(ir->epc), ir->tau_p, pcouple_min_integration_steps(ir->epc), dt_pcoupl);
1029 warning(wi, warn_buf);
1032 sprintf(err_buf, "compressibility must be > 0 when using pressure"
1033 " coupling %s\n", EPCOUPLTYPE(ir->epc));
1034 CHECK(ir->compress[XX][XX] < 0 || ir->compress[YY][YY] < 0 ||
1035 ir->compress[ZZ][ZZ] < 0 ||
1036 (trace(ir->compress) == 0 && ir->compress[YY][XX] <= 0 &&
1037 ir->compress[ZZ][XX] <= 0 && ir->compress[ZZ][YY] <= 0));
1039 if (epcPARRINELLORAHMAN == ir->epc && opts->bGenVel)
1041 sprintf(warn_buf,
1042 "You are generating velocities so I am assuming you "
1043 "are equilibrating a system. You are using "
1044 "%s pressure coupling, but this can be "
1045 "unstable for equilibration. If your system crashes, try "
1046 "equilibrating first with Berendsen pressure coupling. If "
1047 "you are not equilibrating the system, you can probably "
1048 "ignore this warning.",
1049 epcoupl_names[ir->epc]);
1050 warning(wi, warn_buf);
1054 if (EI_VV(ir->eI))
1056 if (ir->epc > epcNO)
1058 if ((ir->epc != epcBERENDSEN) && (ir->epc != epcMTTK))
1060 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.");
1064 else
1066 if (ir->epc == epcMTTK)
1068 warning_error(wi, "MTTK pressure coupling requires a Velocity-verlet integrator");
1072 /* ELECTROSTATICS */
1073 /* More checks are in triple check (grompp.c) */
1075 if (ir->coulombtype == eelSWITCH)
1077 sprintf(warn_buf, "coulombtype = %s is only for testing purposes and can lead to serious "
1078 "artifacts, advice: use coulombtype = %s",
1079 eel_names[ir->coulombtype],
1080 eel_names[eelRF_ZERO]);
1081 warning(wi, warn_buf);
1084 if (ir->epsilon_r != 1 && ir->implicit_solvent == eisGBSA)
1086 sprintf(warn_buf, "epsilon-r = %g with GB implicit solvent, will use this value for inner dielectric", ir->epsilon_r);
1087 warning_note(wi, warn_buf);
1090 if (EEL_RF(ir->coulombtype) && ir->epsilon_rf == 1 && ir->epsilon_r != 1)
1092 sprintf(warn_buf, "epsilon-r = %g and epsilon-rf = 1 with reaction field, proceeding assuming old format and exchanging epsilon-r and epsilon-rf", ir->epsilon_r);
1093 warning(wi, warn_buf);
1094 ir->epsilon_rf = ir->epsilon_r;
1095 ir->epsilon_r = 1.0;
1098 if (ir->epsilon_r == 0)
1100 sprintf(err_buf,
1101 "It is pointless to use long-range or Generalized Born electrostatics with infinite relative permittivity."
1102 "Since you are effectively turning of electrostatics, a plain cutoff will be much faster.");
1103 CHECK(EEL_FULL(ir->coulombtype) || ir->implicit_solvent == eisGBSA);
1106 if (getenv("GMX_DO_GALACTIC_DYNAMICS") == NULL)
1108 sprintf(err_buf, "epsilon-r must be >= 0 instead of %g\n", ir->epsilon_r);
1109 CHECK(ir->epsilon_r < 0);
1112 if (EEL_RF(ir->coulombtype))
1114 /* reaction field (at the cut-off) */
1116 if (ir->coulombtype == eelRF_ZERO)
1118 sprintf(warn_buf, "With coulombtype = %s, epsilon-rf must be 0, assuming you meant epsilon_rf=0",
1119 eel_names[ir->coulombtype]);
1120 CHECK(ir->epsilon_rf != 0);
1121 ir->epsilon_rf = 0.0;
1124 sprintf(err_buf, "epsilon-rf must be >= epsilon-r");
1125 CHECK((ir->epsilon_rf < ir->epsilon_r && ir->epsilon_rf != 0) ||
1126 (ir->epsilon_r == 0));
1127 if (ir->epsilon_rf == ir->epsilon_r)
1129 sprintf(warn_buf, "Using epsilon-rf = epsilon-r with %s does not make sense",
1130 eel_names[ir->coulombtype]);
1131 warning(wi, warn_buf);
1134 /* Allow rlist>rcoulomb for tabulated long range stuff. This just
1135 * means the interaction is zero outside rcoulomb, but it helps to
1136 * provide accurate energy conservation.
1138 if (ir_coulomb_might_be_zero_at_cutoff(ir))
1140 if (ir_coulomb_switched(ir))
1142 sprintf(err_buf,
1143 "With coulombtype = %s rcoulomb_switch must be < rcoulomb. Or, better: Use the potential modifier options!",
1144 eel_names[ir->coulombtype]);
1145 CHECK(ir->rcoulomb_switch >= ir->rcoulomb);
1148 else if (ir->coulombtype == eelCUT || EEL_RF(ir->coulombtype))
1150 if (ir->cutoff_scheme == ecutsGROUP && ir->coulomb_modifier == eintmodNONE)
1152 sprintf(err_buf, "With coulombtype = %s, rcoulomb should be >= rlist unless you use a potential modifier",
1153 eel_names[ir->coulombtype]);
1154 CHECK(ir->rlist > ir->rcoulomb);
1158 if (ir->coulombtype == eelSWITCH || ir->coulombtype == eelSHIFT)
1160 sprintf(err_buf,
1161 "Explicit switch/shift coulomb interactions cannot be used in combination with a secondary coulomb-modifier.");
1162 CHECK( ir->coulomb_modifier != eintmodNONE);
1164 if (ir->vdwtype == evdwSWITCH || ir->vdwtype == evdwSHIFT)
1166 sprintf(err_buf,
1167 "Explicit switch/shift vdw interactions cannot be used in combination with a secondary vdw-modifier.");
1168 CHECK( ir->vdw_modifier != eintmodNONE);
1171 if (ir->coulombtype == eelSWITCH || ir->coulombtype == eelSHIFT ||
1172 ir->vdwtype == evdwSWITCH || ir->vdwtype == evdwSHIFT)
1174 sprintf(warn_buf,
1175 "The switch/shift interaction settings are just for compatibility; you will get better "
1176 "performance from applying potential modifiers to your interactions!\n");
1177 warning_note(wi, warn_buf);
1180 if (ir->coulombtype == eelPMESWITCH || ir->coulomb_modifier == eintmodPOTSWITCH)
1182 if (ir->rcoulomb_switch/ir->rcoulomb < 0.9499)
1184 real percentage = 100*(ir->rcoulomb-ir->rcoulomb_switch)/ir->rcoulomb;
1185 sprintf(warn_buf, "The switching range should be 5%% or less (currently %.2f%% using a switching range of %4f-%4f) for accurate electrostatic energies, energy conservation will be good regardless, since ewald_rtol = %g.",
1186 percentage, ir->rcoulomb_switch, ir->rcoulomb, ir->ewald_rtol);
1187 warning(wi, warn_buf);
1191 if (ir->vdwtype == evdwSWITCH || ir->vdw_modifier == eintmodPOTSWITCH)
1193 if (ir->rvdw_switch == 0)
1195 sprintf(warn_buf, "rvdw-switch is equal 0 even though you are using a switched Lennard-Jones potential. This suggests it was not set in the mdp, which can lead to large energy errors. In GROMACS, 0.05 to 0.1 nm is often a reasonable vdw switching range.");
1196 warning(wi, warn_buf);
1200 if (EEL_FULL(ir->coulombtype))
1202 if (ir->coulombtype == eelPMESWITCH || ir->coulombtype == eelPMEUSER ||
1203 ir->coulombtype == eelPMEUSERSWITCH)
1205 sprintf(err_buf, "With coulombtype = %s, rcoulomb must be <= rlist",
1206 eel_names[ir->coulombtype]);
1207 CHECK(ir->rcoulomb > ir->rlist);
1209 else if (ir->cutoff_scheme == ecutsGROUP && ir->coulomb_modifier == eintmodNONE)
1211 if (ir->coulombtype == eelPME || ir->coulombtype == eelP3M_AD)
1213 sprintf(err_buf,
1214 "With coulombtype = %s (without modifier), rcoulomb must be equal to rlist,\n"
1215 "or rlistlong if nstcalclr=1. For optimal energy conservation,consider using\n"
1216 "a potential modifier.", eel_names[ir->coulombtype]);
1217 if (ir->nstcalclr == 1)
1219 CHECK(ir->rcoulomb != ir->rlist && ir->rcoulomb != ir->rlistlong);
1221 else
1223 CHECK(ir->rcoulomb != ir->rlist);
1229 if (EEL_PME(ir->coulombtype) || EVDW_PME(ir->vdwtype))
1231 if (ir->pme_order < 3)
1233 warning_error(wi, "pme-order can not be smaller than 3");
1237 if (ir->nwall == 2 && EEL_FULL(ir->coulombtype))
1239 if (ir->ewald_geometry == eewg3D)
1241 sprintf(warn_buf, "With pbc=%s you should use ewald-geometry=%s",
1242 epbc_names[ir->ePBC], eewg_names[eewg3DC]);
1243 warning(wi, warn_buf);
1245 /* This check avoids extra pbc coding for exclusion corrections */
1246 sprintf(err_buf, "wall-ewald-zfac should be >= 2");
1247 CHECK(ir->wall_ewald_zfac < 2);
1249 if ((ir->ewald_geometry == eewg3DC) && (ir->ePBC != epbcXY) &&
1250 EEL_FULL(ir->coulombtype))
1252 sprintf(warn_buf, "With %s and ewald_geometry = %s you should use pbc = %s",
1253 eel_names[ir->coulombtype], eewg_names[eewg3DC], epbc_names[epbcXY]);
1254 warning(wi, warn_buf);
1256 if ((ir->epsilon_surface != 0) && EEL_FULL(ir->coulombtype))
1258 if (ir->cutoff_scheme == ecutsVERLET)
1260 sprintf(warn_buf, "Since molecules/charge groups are broken using the Verlet scheme, you can not use a dipole correction to the %s electrostatics.",
1261 eel_names[ir->coulombtype]);
1262 warning(wi, warn_buf);
1264 else
1266 sprintf(warn_buf, "Dipole corrections to %s electrostatics only work if all charge groups that can cross PBC boundaries are dipoles. If this is not the case set epsilon_surface to 0",
1267 eel_names[ir->coulombtype]);
1268 warning_note(wi, warn_buf);
1272 if (ir_vdw_switched(ir))
1274 sprintf(err_buf, "With switched vdw forces or potentials, rvdw-switch must be < rvdw");
1275 CHECK(ir->rvdw_switch >= ir->rvdw);
1277 if (ir->rvdw_switch < 0.5*ir->rvdw)
1279 sprintf(warn_buf, "You are applying a switch function to vdw forces or potentials from %g to %g nm, which is more than half the interaction range, whereas switch functions are intended to act only close to the cut-off.",
1280 ir->rvdw_switch, ir->rvdw);
1281 warning_note(wi, warn_buf);
1284 else if (ir->vdwtype == evdwCUT || ir->vdwtype == evdwPME)
1286 if (ir->cutoff_scheme == ecutsGROUP && ir->vdw_modifier == eintmodNONE)
1288 sprintf(err_buf, "With vdwtype = %s, rvdw must be >= rlist unless you use a potential modifier", evdw_names[ir->vdwtype]);
1289 CHECK(ir->rlist > ir->rvdw);
1293 if (ir->vdwtype == evdwPME)
1295 if (!(ir->vdw_modifier == eintmodNONE || ir->vdw_modifier == eintmodPOTSHIFT))
1297 sprintf(err_buf, "With vdwtype = %s, the only supported modifiers are %s a\
1298 nd %s",
1299 evdw_names[ir->vdwtype],
1300 eintmod_names[eintmodPOTSHIFT],
1301 eintmod_names[eintmodNONE]);
1305 if (ir->cutoff_scheme == ecutsGROUP)
1307 if (((ir->coulomb_modifier != eintmodNONE && ir->rcoulomb == ir->rlist) ||
1308 (ir->vdw_modifier != eintmodNONE && ir->rvdw == ir->rlist)))
1310 warning_note(wi, "With exact cut-offs, rlist should be "
1311 "larger than rcoulomb and rvdw, so that there "
1312 "is a buffer region for particle motion "
1313 "between neighborsearch steps");
1316 if (ir_coulomb_is_zero_at_cutoff(ir) && ir->rlistlong <= ir->rcoulomb)
1318 sprintf(warn_buf, "For energy conservation with switch/shift potentials, %s should be 0.1 to 0.3 nm larger than rcoulomb.",
1319 IR_TWINRANGE(*ir) ? "rlistlong" : "rlist");
1320 warning_note(wi, warn_buf);
1322 if (ir_vdw_switched(ir) && (ir->rlistlong <= ir->rvdw))
1324 sprintf(warn_buf, "For energy conservation with switch/shift potentials, %s should be 0.1 to 0.3 nm larger than rvdw.",
1325 IR_TWINRANGE(*ir) ? "rlistlong" : "rlist");
1326 warning_note(wi, warn_buf);
1330 if (ir->vdwtype == evdwUSER && ir->eDispCorr != edispcNO)
1332 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.");
1335 if (ir->eI == eiLBFGS && (ir->coulombtype == eelCUT || ir->vdwtype == evdwCUT)
1336 && ir->rvdw != 0)
1338 warning(wi, "For efficient BFGS minimization, use switch/shift/pme instead of cut-off.");
1341 if (ir->eI == eiLBFGS && ir->nbfgscorr <= 0)
1343 warning(wi, "Using L-BFGS with nbfgscorr<=0 just gets you steepest descent.");
1346 /* ENERGY CONSERVATION */
1347 if (ir_NVE(ir) && ir->cutoff_scheme == ecutsGROUP)
1349 if (!ir_vdw_might_be_zero_at_cutoff(ir) && ir->rvdw > 0 && ir->vdw_modifier == eintmodNONE)
1351 sprintf(warn_buf, "You are using a cut-off for VdW interactions with NVE, for good energy conservation use vdwtype = %s (possibly with DispCorr)",
1352 evdw_names[evdwSHIFT]);
1353 warning_note(wi, warn_buf);
1355 if (!ir_coulomb_might_be_zero_at_cutoff(ir) && ir->rcoulomb > 0)
1357 sprintf(warn_buf, "You are using a cut-off for electrostatics with NVE, for good energy conservation use coulombtype = %s or %s",
1358 eel_names[eelPMESWITCH], eel_names[eelRF_ZERO]);
1359 warning_note(wi, warn_buf);
1363 if (EI_VV(ir->eI) && IR_TWINRANGE(*ir) && ir->nstlist > 1)
1365 sprintf(warn_buf, "Twin-range multiple time stepping does not work with integrator %s.", ei_names[ir->eI]);
1366 warning_error(wi, warn_buf);
1369 /* IMPLICIT SOLVENT */
1370 if (ir->coulombtype == eelGB_NOTUSED)
1372 sprintf(warn_buf, "Invalid option %s for coulombtype",
1373 eel_names[ir->coulombtype]);
1374 warning_error(wi, warn_buf);
1377 if (ir->sa_algorithm == esaSTILL)
1379 sprintf(err_buf, "Still SA algorithm not available yet, use %s or %s instead\n", esa_names[esaAPPROX], esa_names[esaNO]);
1380 CHECK(ir->sa_algorithm == esaSTILL);
1383 if (ir->implicit_solvent == eisGBSA)
1385 sprintf(err_buf, "With GBSA implicit solvent, rgbradii must be equal to rlist.");
1386 CHECK(ir->rgbradii != ir->rlist);
1388 if (ir->coulombtype != eelCUT)
1390 sprintf(err_buf, "With GBSA, coulombtype must be equal to %s\n", eel_names[eelCUT]);
1391 CHECK(ir->coulombtype != eelCUT);
1393 if (ir->vdwtype != evdwCUT)
1395 sprintf(err_buf, "With GBSA, vdw-type must be equal to %s\n", evdw_names[evdwCUT]);
1396 CHECK(ir->vdwtype != evdwCUT);
1398 if (ir->nstgbradii < 1)
1400 sprintf(warn_buf, "Using GBSA with nstgbradii<1, setting nstgbradii=1");
1401 warning_note(wi, warn_buf);
1402 ir->nstgbradii = 1;
1404 if (ir->sa_algorithm == esaNO)
1406 sprintf(warn_buf, "No SA (non-polar) calculation requested together with GB. Are you sure this is what you want?\n");
1407 warning_note(wi, warn_buf);
1409 if (ir->sa_surface_tension < 0 && ir->sa_algorithm != esaNO)
1411 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");
1412 warning_note(wi, warn_buf);
1414 if (ir->gb_algorithm == egbSTILL)
1416 ir->sa_surface_tension = 0.0049 * CAL2JOULE * 100;
1418 else
1420 ir->sa_surface_tension = 0.0054 * CAL2JOULE * 100;
1423 if (ir->sa_surface_tension == 0 && ir->sa_algorithm != esaNO)
1425 sprintf(err_buf, "Surface tension set to 0 while SA-calculation requested\n");
1426 CHECK(ir->sa_surface_tension == 0 && ir->sa_algorithm != esaNO);
1431 if (ir->bAdress)
1433 if (ir->cutoff_scheme != ecutsGROUP)
1435 warning_error(wi, "AdresS simulation supports only cutoff-scheme=group");
1437 if (!EI_SD(ir->eI))
1439 warning_error(wi, "AdresS simulation supports only stochastic dynamics");
1441 if (ir->epc != epcNO)
1443 warning_error(wi, "AdresS simulation does not support pressure coupling");
1445 if (EEL_FULL(ir->coulombtype))
1447 warning_error(wi, "AdresS simulation does not support long-range electrostatics");
1452 /* count the number of text elemets separated by whitespace in a string.
1453 str = the input string
1454 maxptr = the maximum number of allowed elements
1455 ptr = the output array of pointers to the first character of each element
1456 returns: the number of elements. */
1457 int str_nelem(const char *str, int maxptr, char *ptr[])
1459 int np = 0;
1460 char *copy0, *copy;
1462 copy0 = gmx_strdup(str);
1463 copy = copy0;
1464 ltrim(copy);
1465 while (*copy != '\0')
1467 if (np >= maxptr)
1469 gmx_fatal(FARGS, "Too many groups on line: '%s' (max is %d)",
1470 str, maxptr);
1472 if (ptr)
1474 ptr[np] = copy;
1476 np++;
1477 while ((*copy != '\0') && !isspace(*copy))
1479 copy++;
1481 if (*copy != '\0')
1483 *copy = '\0';
1484 copy++;
1486 ltrim(copy);
1488 if (ptr == NULL)
1490 sfree(copy0);
1493 return np;
1496 /* interpret a number of doubles from a string and put them in an array,
1497 after allocating space for them.
1498 str = the input string
1499 n = the (pre-allocated) number of doubles read
1500 r = the output array of doubles. */
1501 static void parse_n_real(char *str, int *n, real **r, warninp_t wi)
1503 char *ptr[MAXPTR];
1504 char *endptr;
1505 int i;
1506 char warn_buf[STRLEN];
1508 *n = str_nelem(str, MAXPTR, ptr);
1510 snew(*r, *n);
1511 for (i = 0; i < *n; i++)
1513 (*r)[i] = strtod(ptr[i], &endptr);
1514 if (*endptr != 0)
1516 sprintf(warn_buf, "Invalid value %s in string in mdp file. Expected a real number.", ptr[i]);
1517 warning_error(wi, warn_buf);
1522 static void do_fep_params(t_inputrec *ir, char fep_lambda[][STRLEN], char weights[STRLEN], warninp_t wi)
1525 int i, j, max_n_lambda, nweights, nfep[efptNR];
1526 t_lambda *fep = ir->fepvals;
1527 t_expanded *expand = ir->expandedvals;
1528 real **count_fep_lambdas;
1529 gmx_bool bOneLambda = TRUE;
1531 snew(count_fep_lambdas, efptNR);
1533 /* FEP input processing */
1534 /* first, identify the number of lambda values for each type.
1535 All that are nonzero must have the same number */
1537 for (i = 0; i < efptNR; i++)
1539 parse_n_real(fep_lambda[i], &(nfep[i]), &(count_fep_lambdas[i]), wi);
1542 /* now, determine the number of components. All must be either zero, or equal. */
1544 max_n_lambda = 0;
1545 for (i = 0; i < efptNR; i++)
1547 if (nfep[i] > max_n_lambda)
1549 max_n_lambda = nfep[i]; /* here's a nonzero one. All of them
1550 must have the same number if its not zero.*/
1551 break;
1555 for (i = 0; i < efptNR; i++)
1557 if (nfep[i] == 0)
1559 ir->fepvals->separate_dvdl[i] = FALSE;
1561 else if (nfep[i] == max_n_lambda)
1563 if (i != efptTEMPERATURE) /* we treat this differently -- not really a reason to compute the derivative with
1564 respect to the temperature currently */
1566 ir->fepvals->separate_dvdl[i] = TRUE;
1569 else
1571 gmx_fatal(FARGS, "Number of lambdas (%d) for FEP type %s not equal to number of other types (%d)",
1572 nfep[i], efpt_names[i], max_n_lambda);
1575 /* we don't print out dhdl if the temperature is changing, since we can't correctly define dhdl in this case */
1576 ir->fepvals->separate_dvdl[efptTEMPERATURE] = FALSE;
1578 /* the number of lambdas is the number we've read in, which is either zero
1579 or the same for all */
1580 fep->n_lambda = max_n_lambda;
1582 /* allocate space for the array of lambda values */
1583 snew(fep->all_lambda, efptNR);
1584 /* if init_lambda is defined, we need to set lambda */
1585 if ((fep->init_lambda > 0) && (fep->n_lambda == 0))
1587 ir->fepvals->separate_dvdl[efptFEP] = TRUE;
1589 /* otherwise allocate the space for all of the lambdas, and transfer the data */
1590 for (i = 0; i < efptNR; i++)
1592 snew(fep->all_lambda[i], fep->n_lambda);
1593 if (nfep[i] > 0) /* if it's zero, then the count_fep_lambda arrays
1594 are zero */
1596 for (j = 0; j < fep->n_lambda; j++)
1598 fep->all_lambda[i][j] = (double)count_fep_lambdas[i][j];
1600 sfree(count_fep_lambdas[i]);
1603 sfree(count_fep_lambdas);
1605 /* "fep-vals" is either zero or the full number. If zero, we'll need to define fep-lambdas for internal
1606 bookkeeping -- for now, init_lambda */
1608 if ((nfep[efptFEP] == 0) && (fep->init_lambda >= 0))
1610 for (i = 0; i < fep->n_lambda; i++)
1612 fep->all_lambda[efptFEP][i] = fep->init_lambda;
1616 /* check to see if only a single component lambda is defined, and soft core is defined.
1617 In this case, turn on coulomb soft core */
1619 if (max_n_lambda == 0)
1621 bOneLambda = TRUE;
1623 else
1625 for (i = 0; i < efptNR; i++)
1627 if ((nfep[i] != 0) && (i != efptFEP))
1629 bOneLambda = FALSE;
1633 if ((bOneLambda) && (fep->sc_alpha > 0))
1635 fep->bScCoul = TRUE;
1638 /* Fill in the others with the efptFEP if they are not explicitly
1639 specified (i.e. nfep[i] == 0). This means if fep is not defined,
1640 they are all zero. */
1642 for (i = 0; i < efptNR; i++)
1644 if ((nfep[i] == 0) && (i != efptFEP))
1646 for (j = 0; j < fep->n_lambda; j++)
1648 fep->all_lambda[i][j] = fep->all_lambda[efptFEP][j];
1654 /* make it easier if sc_r_power = 48 by increasing it to the 4th power, to be in the right scale. */
1655 if (fep->sc_r_power == 48)
1657 if (fep->sc_alpha > 0.1)
1659 gmx_fatal(FARGS, "sc_alpha (%f) for sc_r_power = 48 should usually be between 0.001 and 0.004", fep->sc_alpha);
1663 /* now read in the weights */
1664 parse_n_real(weights, &nweights, &(expand->init_lambda_weights), wi);
1665 if (nweights == 0)
1667 snew(expand->init_lambda_weights, fep->n_lambda); /* initialize to zero */
1669 else if (nweights != fep->n_lambda)
1671 gmx_fatal(FARGS, "Number of weights (%d) is not equal to number of lambda values (%d)",
1672 nweights, fep->n_lambda);
1674 if ((expand->nstexpanded < 0) && (ir->efep != efepNO))
1676 expand->nstexpanded = fep->nstdhdl;
1677 /* if you don't specify nstexpanded when doing expanded ensemble free energy calcs, it is set to nstdhdl */
1679 if ((expand->nstexpanded < 0) && ir->bSimTemp)
1681 expand->nstexpanded = 2*(int)(ir->opts.tau_t[0]/ir->delta_t);
1682 /* if you don't specify nstexpanded when doing expanded ensemble simulated tempering, it is set to
1683 2*tau_t just to be careful so it's not to frequent */
1688 static void do_simtemp_params(t_inputrec *ir)
1691 snew(ir->simtempvals->temperatures, ir->fepvals->n_lambda);
1692 GetSimTemps(ir->fepvals->n_lambda, ir->simtempvals, ir->fepvals->all_lambda[efptTEMPERATURE]);
1694 return;
1697 static void do_wall_params(t_inputrec *ir,
1698 char *wall_atomtype, char *wall_density,
1699 t_gromppopts *opts)
1701 int nstr, i;
1702 char *names[MAXPTR];
1703 double dbl;
1705 opts->wall_atomtype[0] = NULL;
1706 opts->wall_atomtype[1] = NULL;
1708 ir->wall_atomtype[0] = -1;
1709 ir->wall_atomtype[1] = -1;
1710 ir->wall_density[0] = 0;
1711 ir->wall_density[1] = 0;
1713 if (ir->nwall > 0)
1715 nstr = str_nelem(wall_atomtype, MAXPTR, names);
1716 if (nstr != ir->nwall)
1718 gmx_fatal(FARGS, "Expected %d elements for wall_atomtype, found %d",
1719 ir->nwall, nstr);
1721 for (i = 0; i < ir->nwall; i++)
1723 opts->wall_atomtype[i] = gmx_strdup(names[i]);
1726 if (ir->wall_type == ewt93 || ir->wall_type == ewt104)
1728 nstr = str_nelem(wall_density, MAXPTR, names);
1729 if (nstr != ir->nwall)
1731 gmx_fatal(FARGS, "Expected %d elements for wall-density, found %d", ir->nwall, nstr);
1733 for (i = 0; i < ir->nwall; i++)
1735 sscanf(names[i], "%lf", &dbl);
1736 if (dbl <= 0)
1738 gmx_fatal(FARGS, "wall-density[%d] = %f\n", i, dbl);
1740 ir->wall_density[i] = dbl;
1746 static void add_wall_energrps(gmx_groups_t *groups, int nwall, t_symtab *symtab)
1748 int i;
1749 t_grps *grps;
1750 char str[STRLEN];
1752 if (nwall > 0)
1754 srenew(groups->grpname, groups->ngrpname+nwall);
1755 grps = &(groups->grps[egcENER]);
1756 srenew(grps->nm_ind, grps->nr+nwall);
1757 for (i = 0; i < nwall; i++)
1759 sprintf(str, "wall%d", i);
1760 groups->grpname[groups->ngrpname] = put_symtab(symtab, str);
1761 grps->nm_ind[grps->nr++] = groups->ngrpname++;
1766 void read_expandedparams(int *ninp_p, t_inpfile **inp_p,
1767 t_expanded *expand, warninp_t wi)
1769 int ninp;
1770 t_inpfile *inp;
1772 ninp = *ninp_p;
1773 inp = *inp_p;
1775 /* read expanded ensemble parameters */
1776 CCTYPE ("expanded ensemble variables");
1777 ITYPE ("nstexpanded", expand->nstexpanded, -1);
1778 EETYPE("lmc-stats", expand->elamstats, elamstats_names);
1779 EETYPE("lmc-move", expand->elmcmove, elmcmove_names);
1780 EETYPE("lmc-weights-equil", expand->elmceq, elmceq_names);
1781 ITYPE ("weight-equil-number-all-lambda", expand->equil_n_at_lam, -1);
1782 ITYPE ("weight-equil-number-samples", expand->equil_samples, -1);
1783 ITYPE ("weight-equil-number-steps", expand->equil_steps, -1);
1784 RTYPE ("weight-equil-wl-delta", expand->equil_wl_delta, -1);
1785 RTYPE ("weight-equil-count-ratio", expand->equil_ratio, -1);
1786 CCTYPE("Seed for Monte Carlo in lambda space");
1787 ITYPE ("lmc-seed", expand->lmc_seed, -1);
1788 RTYPE ("mc-temperature", expand->mc_temp, -1);
1789 ITYPE ("lmc-repeats", expand->lmc_repeats, 1);
1790 ITYPE ("lmc-gibbsdelta", expand->gibbsdeltalam, -1);
1791 ITYPE ("lmc-forced-nstart", expand->lmc_forced_nstart, 0);
1792 EETYPE("symmetrized-transition-matrix", expand->bSymmetrizedTMatrix, yesno_names);
1793 ITYPE("nst-transition-matrix", expand->nstTij, -1);
1794 ITYPE ("mininum-var-min", expand->minvarmin, 100); /*default is reasonable */
1795 ITYPE ("weight-c-range", expand->c_range, 0); /* default is just C=0 */
1796 RTYPE ("wl-scale", expand->wl_scale, 0.8);
1797 RTYPE ("wl-ratio", expand->wl_ratio, 0.8);
1798 RTYPE ("init-wl-delta", expand->init_wl_delta, 1.0);
1799 EETYPE("wl-oneovert", expand->bWLoneovert, yesno_names);
1801 *ninp_p = ninp;
1802 *inp_p = inp;
1804 return;
1807 /*! \brief Return whether an end state with the given coupling-lambda
1808 * value describes fully-interacting VDW.
1810 * \param[in] couple_lambda_value Enumeration ecouplam value describing the end state
1811 * \return Whether VDW is on (i.e. the user chose vdw or vdw-q in the .mdp file)
1813 static gmx_bool couple_lambda_has_vdw_on(int couple_lambda_value)
1815 return (couple_lambda_value == ecouplamVDW ||
1816 couple_lambda_value == ecouplamVDWQ);
1819 void get_ir(const char *mdparin, const char *mdparout,
1820 t_inputrec *ir, t_gromppopts *opts,
1821 warninp_t wi)
1823 char *dumstr[2];
1824 double dumdub[2][6];
1825 t_inpfile *inp;
1826 const char *tmp;
1827 int i, j, m, ninp;
1828 char warn_buf[STRLEN];
1829 t_lambda *fep = ir->fepvals;
1830 t_expanded *expand = ir->expandedvals;
1832 init_inputrec_strings();
1833 inp = read_inpfile(mdparin, &ninp, wi);
1835 snew(dumstr[0], STRLEN);
1836 snew(dumstr[1], STRLEN);
1838 if (-1 == search_einp(ninp, inp, "cutoff-scheme"))
1840 sprintf(warn_buf,
1841 "%s did not specify a value for the .mdp option "
1842 "\"cutoff-scheme\". Probably it was first intended for use "
1843 "with GROMACS before 4.6. In 4.6, the Verlet scheme was "
1844 "introduced, but the group scheme was still the default. "
1845 "The default is now the Verlet scheme, so you will observe "
1846 "different behaviour.", mdparin);
1847 warning_note(wi, warn_buf);
1850 /* ignore the following deprecated commands */
1851 REM_TYPE("title");
1852 REM_TYPE("cpp");
1853 REM_TYPE("domain-decomposition");
1854 REM_TYPE("andersen-seed");
1855 REM_TYPE("dihre");
1856 REM_TYPE("dihre-fc");
1857 REM_TYPE("dihre-tau");
1858 REM_TYPE("nstdihreout");
1859 REM_TYPE("nstcheckpoint");
1860 REM_TYPE("optimize-fft");
1862 /* replace the following commands with the clearer new versions*/
1863 REPL_TYPE("unconstrained-start", "continuation");
1864 REPL_TYPE("foreign-lambda", "fep-lambdas");
1865 REPL_TYPE("verlet-buffer-drift", "verlet-buffer-tolerance");
1866 REPL_TYPE("nstxtcout", "nstxout-compressed");
1867 REPL_TYPE("xtc-grps", "compressed-x-grps");
1868 REPL_TYPE("xtc-precision", "compressed-x-precision");
1870 CCTYPE ("VARIOUS PREPROCESSING OPTIONS");
1871 CTYPE ("Preprocessor information: use cpp syntax.");
1872 CTYPE ("e.g.: -I/home/joe/doe -I/home/mary/roe");
1873 STYPE ("include", opts->include, NULL);
1874 CTYPE ("e.g.: -DPOSRES -DFLEXIBLE (note these variable names are case sensitive)");
1875 STYPE ("define", opts->define, NULL);
1877 CCTYPE ("RUN CONTROL PARAMETERS");
1878 EETYPE("integrator", ir->eI, ei_names);
1879 CTYPE ("Start time and timestep in ps");
1880 RTYPE ("tinit", ir->init_t, 0.0);
1881 RTYPE ("dt", ir->delta_t, 0.001);
1882 STEPTYPE ("nsteps", ir->nsteps, 0);
1883 CTYPE ("For exact run continuation or redoing part of a run");
1884 STEPTYPE ("init-step", ir->init_step, 0);
1885 CTYPE ("Part index is updated automatically on checkpointing (keeps files separate)");
1886 ITYPE ("simulation-part", ir->simulation_part, 1);
1887 CTYPE ("mode for center of mass motion removal");
1888 EETYPE("comm-mode", ir->comm_mode, ecm_names);
1889 CTYPE ("number of steps for center of mass motion removal");
1890 ITYPE ("nstcomm", ir->nstcomm, 100);
1891 CTYPE ("group(s) for center of mass motion removal");
1892 STYPE ("comm-grps", is->vcm, NULL);
1894 CCTYPE ("LANGEVIN DYNAMICS OPTIONS");
1895 CTYPE ("Friction coefficient (amu/ps) and random seed");
1896 RTYPE ("bd-fric", ir->bd_fric, 0.0);
1897 STEPTYPE ("ld-seed", ir->ld_seed, -1);
1899 /* Em stuff */
1900 CCTYPE ("ENERGY MINIMIZATION OPTIONS");
1901 CTYPE ("Force tolerance and initial step-size");
1902 RTYPE ("emtol", ir->em_tol, 10.0);
1903 RTYPE ("emstep", ir->em_stepsize, 0.01);
1904 CTYPE ("Max number of iterations in relax-shells");
1905 ITYPE ("niter", ir->niter, 20);
1906 CTYPE ("Step size (ps^2) for minimization of flexible constraints");
1907 RTYPE ("fcstep", ir->fc_stepsize, 0);
1908 CTYPE ("Frequency of steepest descents steps when doing CG");
1909 ITYPE ("nstcgsteep", ir->nstcgsteep, 1000);
1910 ITYPE ("nbfgscorr", ir->nbfgscorr, 10);
1912 CCTYPE ("TEST PARTICLE INSERTION OPTIONS");
1913 RTYPE ("rtpi", ir->rtpi, 0.05);
1915 /* Output options */
1916 CCTYPE ("OUTPUT CONTROL OPTIONS");
1917 CTYPE ("Output frequency for coords (x), velocities (v) and forces (f)");
1918 ITYPE ("nstxout", ir->nstxout, 0);
1919 ITYPE ("nstvout", ir->nstvout, 0);
1920 ITYPE ("nstfout", ir->nstfout, 0);
1921 CTYPE ("Output frequency for energies to log file and energy file");
1922 ITYPE ("nstlog", ir->nstlog, 1000);
1923 ITYPE ("nstcalcenergy", ir->nstcalcenergy, 100);
1924 ITYPE ("nstenergy", ir->nstenergy, 1000);
1925 CTYPE ("Output frequency and precision for .xtc file");
1926 ITYPE ("nstxout-compressed", ir->nstxout_compressed, 0);
1927 RTYPE ("compressed-x-precision", ir->x_compression_precision, 1000.0);
1928 CTYPE ("This selects the subset of atoms for the compressed");
1929 CTYPE ("trajectory file. You can select multiple groups. By");
1930 CTYPE ("default, all atoms will be written.");
1931 STYPE ("compressed-x-grps", is->x_compressed_groups, NULL);
1932 CTYPE ("Selection of energy groups");
1933 STYPE ("energygrps", is->energy, NULL);
1935 /* Neighbor searching */
1936 CCTYPE ("NEIGHBORSEARCHING PARAMETERS");
1937 CTYPE ("cut-off scheme (Verlet: particle based cut-offs, group: using charge groups)");
1938 EETYPE("cutoff-scheme", ir->cutoff_scheme, ecutscheme_names);
1939 CTYPE ("nblist update frequency");
1940 ITYPE ("nstlist", ir->nstlist, 10);
1941 CTYPE ("ns algorithm (simple or grid)");
1942 EETYPE("ns-type", ir->ns_type, ens_names);
1943 CTYPE ("Periodic boundary conditions: xyz, no, xy");
1944 EETYPE("pbc", ir->ePBC, epbc_names);
1945 EETYPE("periodic-molecules", ir->bPeriodicMols, yesno_names);
1946 CTYPE ("Allowed energy error due to the Verlet buffer in kJ/mol/ps per atom,");
1947 CTYPE ("a value of -1 means: use rlist");
1948 RTYPE("verlet-buffer-tolerance", ir->verletbuf_tol, 0.005);
1949 CTYPE ("nblist cut-off");
1950 RTYPE ("rlist", ir->rlist, 1.0);
1951 CTYPE ("long-range cut-off for switched potentials");
1952 RTYPE ("rlistlong", ir->rlistlong, -1);
1953 ITYPE ("nstcalclr", ir->nstcalclr, -1);
1955 /* Electrostatics */
1956 CCTYPE ("OPTIONS FOR ELECTROSTATICS AND VDW");
1957 CTYPE ("Method for doing electrostatics");
1958 EETYPE("coulombtype", ir->coulombtype, eel_names);
1959 EETYPE("coulomb-modifier", ir->coulomb_modifier, eintmod_names);
1960 CTYPE ("cut-off lengths");
1961 RTYPE ("rcoulomb-switch", ir->rcoulomb_switch, 0.0);
1962 RTYPE ("rcoulomb", ir->rcoulomb, 1.0);
1963 CTYPE ("Relative dielectric constant for the medium and the reaction field");
1964 RTYPE ("epsilon-r", ir->epsilon_r, 1.0);
1965 RTYPE ("epsilon-rf", ir->epsilon_rf, 0.0);
1966 CTYPE ("Method for doing Van der Waals");
1967 EETYPE("vdw-type", ir->vdwtype, evdw_names);
1968 EETYPE("vdw-modifier", ir->vdw_modifier, eintmod_names);
1969 CTYPE ("cut-off lengths");
1970 RTYPE ("rvdw-switch", ir->rvdw_switch, 0.0);
1971 RTYPE ("rvdw", ir->rvdw, 1.0);
1972 CTYPE ("Apply long range dispersion corrections for Energy and Pressure");
1973 EETYPE("DispCorr", ir->eDispCorr, edispc_names);
1974 CTYPE ("Extension of the potential lookup tables beyond the cut-off");
1975 RTYPE ("table-extension", ir->tabext, 1.0);
1976 CTYPE ("Separate tables between energy group pairs");
1977 STYPE ("energygrp-table", is->egptable, NULL);
1978 CTYPE ("Spacing for the PME/PPPM FFT grid");
1979 RTYPE ("fourierspacing", ir->fourier_spacing, 0.12);
1980 CTYPE ("FFT grid size, when a value is 0 fourierspacing will be used");
1981 ITYPE ("fourier-nx", ir->nkx, 0);
1982 ITYPE ("fourier-ny", ir->nky, 0);
1983 ITYPE ("fourier-nz", ir->nkz, 0);
1984 CTYPE ("EWALD/PME/PPPM parameters");
1985 ITYPE ("pme-order", ir->pme_order, 4);
1986 RTYPE ("ewald-rtol", ir->ewald_rtol, 0.00001);
1987 RTYPE ("ewald-rtol-lj", ir->ewald_rtol_lj, 0.001);
1988 EETYPE("lj-pme-comb-rule", ir->ljpme_combination_rule, eljpme_names);
1989 EETYPE("ewald-geometry", ir->ewald_geometry, eewg_names);
1990 RTYPE ("epsilon-surface", ir->epsilon_surface, 0.0);
1992 CCTYPE("IMPLICIT SOLVENT ALGORITHM");
1993 EETYPE("implicit-solvent", ir->implicit_solvent, eis_names);
1995 CCTYPE ("GENERALIZED BORN ELECTROSTATICS");
1996 CTYPE ("Algorithm for calculating Born radii");
1997 EETYPE("gb-algorithm", ir->gb_algorithm, egb_names);
1998 CTYPE ("Frequency of calculating the Born radii inside rlist");
1999 ITYPE ("nstgbradii", ir->nstgbradii, 1);
2000 CTYPE ("Cutoff for Born radii calculation; the contribution from atoms");
2001 CTYPE ("between rlist and rgbradii is updated every nstlist steps");
2002 RTYPE ("rgbradii", ir->rgbradii, 1.0);
2003 CTYPE ("Dielectric coefficient of the implicit solvent");
2004 RTYPE ("gb-epsilon-solvent", ir->gb_epsilon_solvent, 80.0);
2005 CTYPE ("Salt concentration in M for Generalized Born models");
2006 RTYPE ("gb-saltconc", ir->gb_saltconc, 0.0);
2007 CTYPE ("Scaling factors used in the OBC GB model. Default values are OBC(II)");
2008 RTYPE ("gb-obc-alpha", ir->gb_obc_alpha, 1.0);
2009 RTYPE ("gb-obc-beta", ir->gb_obc_beta, 0.8);
2010 RTYPE ("gb-obc-gamma", ir->gb_obc_gamma, 4.85);
2011 RTYPE ("gb-dielectric-offset", ir->gb_dielectric_offset, 0.009);
2012 EETYPE("sa-algorithm", ir->sa_algorithm, esa_names);
2013 CTYPE ("Surface tension (kJ/mol/nm^2) for the SA (nonpolar surface) part of GBSA");
2014 CTYPE ("The value -1 will set default value for Still/HCT/OBC GB-models.");
2015 RTYPE ("sa-surface-tension", ir->sa_surface_tension, -1);
2017 /* Coupling stuff */
2018 CCTYPE ("OPTIONS FOR WEAK COUPLING ALGORITHMS");
2019 CTYPE ("Temperature coupling");
2020 EETYPE("tcoupl", ir->etc, etcoupl_names);
2021 ITYPE ("nsttcouple", ir->nsttcouple, -1);
2022 ITYPE("nh-chain-length", ir->opts.nhchainlength, 10);
2023 EETYPE("print-nose-hoover-chain-variables", ir->bPrintNHChains, yesno_names);
2024 CTYPE ("Groups to couple separately");
2025 STYPE ("tc-grps", is->tcgrps, NULL);
2026 CTYPE ("Time constant (ps) and reference temperature (K)");
2027 STYPE ("tau-t", is->tau_t, NULL);
2028 STYPE ("ref-t", is->ref_t, NULL);
2029 CTYPE ("pressure coupling");
2030 EETYPE("pcoupl", ir->epc, epcoupl_names);
2031 EETYPE("pcoupltype", ir->epct, epcoupltype_names);
2032 ITYPE ("nstpcouple", ir->nstpcouple, -1);
2033 CTYPE ("Time constant (ps), compressibility (1/bar) and reference P (bar)");
2034 RTYPE ("tau-p", ir->tau_p, 1.0);
2035 STYPE ("compressibility", dumstr[0], NULL);
2036 STYPE ("ref-p", dumstr[1], NULL);
2037 CTYPE ("Scaling of reference coordinates, No, All or COM");
2038 EETYPE ("refcoord-scaling", ir->refcoord_scaling, erefscaling_names);
2040 /* QMMM */
2041 CCTYPE ("OPTIONS FOR QMMM calculations");
2042 EETYPE("QMMM", ir->bQMMM, yesno_names);
2043 CTYPE ("Groups treated Quantum Mechanically");
2044 STYPE ("QMMM-grps", is->QMMM, NULL);
2045 CTYPE ("QM method");
2046 STYPE("QMmethod", is->QMmethod, NULL);
2047 CTYPE ("QMMM scheme");
2048 EETYPE("QMMMscheme", ir->QMMMscheme, eQMMMscheme_names);
2049 CTYPE ("QM basisset");
2050 STYPE("QMbasis", is->QMbasis, NULL);
2051 CTYPE ("QM charge");
2052 STYPE ("QMcharge", is->QMcharge, NULL);
2053 CTYPE ("QM multiplicity");
2054 STYPE ("QMmult", is->QMmult, NULL);
2055 CTYPE ("Surface Hopping");
2056 STYPE ("SH", is->bSH, NULL);
2057 CTYPE ("CAS space options");
2058 STYPE ("CASorbitals", is->CASorbitals, NULL);
2059 STYPE ("CASelectrons", is->CASelectrons, NULL);
2060 STYPE ("SAon", is->SAon, NULL);
2061 STYPE ("SAoff", is->SAoff, NULL);
2062 STYPE ("SAsteps", is->SAsteps, NULL);
2063 CTYPE ("Scale factor for MM charges");
2064 RTYPE ("MMChargeScaleFactor", ir->scalefactor, 1.0);
2065 CTYPE ("Optimization of QM subsystem");
2066 STYPE ("bOPT", is->bOPT, NULL);
2067 STYPE ("bTS", is->bTS, NULL);
2069 /* Simulated annealing */
2070 CCTYPE("SIMULATED ANNEALING");
2071 CTYPE ("Type of annealing for each temperature group (no/single/periodic)");
2072 STYPE ("annealing", is->anneal, NULL);
2073 CTYPE ("Number of time points to use for specifying annealing in each group");
2074 STYPE ("annealing-npoints", is->anneal_npoints, NULL);
2075 CTYPE ("List of times at the annealing points for each group");
2076 STYPE ("annealing-time", is->anneal_time, NULL);
2077 CTYPE ("Temp. at each annealing point, for each group.");
2078 STYPE ("annealing-temp", is->anneal_temp, NULL);
2080 /* Startup run */
2081 CCTYPE ("GENERATE VELOCITIES FOR STARTUP RUN");
2082 EETYPE("gen-vel", opts->bGenVel, yesno_names);
2083 RTYPE ("gen-temp", opts->tempi, 300.0);
2084 ITYPE ("gen-seed", opts->seed, -1);
2086 /* Shake stuff */
2087 CCTYPE ("OPTIONS FOR BONDS");
2088 EETYPE("constraints", opts->nshake, constraints);
2089 CTYPE ("Type of constraint algorithm");
2090 EETYPE("constraint-algorithm", ir->eConstrAlg, econstr_names);
2091 CTYPE ("Do not constrain the start configuration");
2092 EETYPE("continuation", ir->bContinuation, yesno_names);
2093 CTYPE ("Use successive overrelaxation to reduce the number of shake iterations");
2094 EETYPE("Shake-SOR", ir->bShakeSOR, yesno_names);
2095 CTYPE ("Relative tolerance of shake");
2096 RTYPE ("shake-tol", ir->shake_tol, 0.0001);
2097 CTYPE ("Highest order in the expansion of the constraint coupling matrix");
2098 ITYPE ("lincs-order", ir->nProjOrder, 4);
2099 CTYPE ("Number of iterations in the final step of LINCS. 1 is fine for");
2100 CTYPE ("normal simulations, but use 2 to conserve energy in NVE runs.");
2101 CTYPE ("For energy minimization with constraints it should be 4 to 8.");
2102 ITYPE ("lincs-iter", ir->nLincsIter, 1);
2103 CTYPE ("Lincs will write a warning to the stderr if in one step a bond");
2104 CTYPE ("rotates over more degrees than");
2105 RTYPE ("lincs-warnangle", ir->LincsWarnAngle, 30.0);
2106 CTYPE ("Convert harmonic bonds to morse potentials");
2107 EETYPE("morse", opts->bMorse, yesno_names);
2109 /* Energy group exclusions */
2110 CCTYPE ("ENERGY GROUP EXCLUSIONS");
2111 CTYPE ("Pairs of energy groups for which all non-bonded interactions are excluded");
2112 STYPE ("energygrp-excl", is->egpexcl, NULL);
2114 /* Walls */
2115 CCTYPE ("WALLS");
2116 CTYPE ("Number of walls, type, atom types, densities and box-z scale factor for Ewald");
2117 ITYPE ("nwall", ir->nwall, 0);
2118 EETYPE("wall-type", ir->wall_type, ewt_names);
2119 RTYPE ("wall-r-linpot", ir->wall_r_linpot, -1);
2120 STYPE ("wall-atomtype", is->wall_atomtype, NULL);
2121 STYPE ("wall-density", is->wall_density, NULL);
2122 RTYPE ("wall-ewald-zfac", ir->wall_ewald_zfac, 3);
2124 /* COM pulling */
2125 CCTYPE("COM PULLING");
2126 EETYPE("pull", ir->bPull, yesno_names);
2127 if (ir->bPull)
2129 snew(ir->pull, 1);
2130 is->pull_grp = read_pullparams(&ninp, &inp, ir->pull, wi);
2133 /* Enforced rotation */
2134 CCTYPE("ENFORCED ROTATION");
2135 CTYPE("Enforced rotation: No or Yes");
2136 EETYPE("rotation", ir->bRot, yesno_names);
2137 if (ir->bRot)
2139 snew(ir->rot, 1);
2140 is->rot_grp = read_rotparams(&ninp, &inp, ir->rot, wi);
2143 /* Interactive MD */
2144 ir->bIMD = FALSE;
2145 CCTYPE("Group to display and/or manipulate in interactive MD session");
2146 STYPE ("IMD-group", is->imd_grp, NULL);
2147 if (is->imd_grp[0] != '\0')
2149 snew(ir->imd, 1);
2150 ir->bIMD = TRUE;
2153 /* Refinement */
2154 CCTYPE("NMR refinement stuff");
2155 CTYPE ("Distance restraints type: No, Simple or Ensemble");
2156 EETYPE("disre", ir->eDisre, edisre_names);
2157 CTYPE ("Force weighting of pairs in one distance restraint: Conservative or Equal");
2158 EETYPE("disre-weighting", ir->eDisreWeighting, edisreweighting_names);
2159 CTYPE ("Use sqrt of the time averaged times the instantaneous violation");
2160 EETYPE("disre-mixed", ir->bDisreMixed, yesno_names);
2161 RTYPE ("disre-fc", ir->dr_fc, 1000.0);
2162 RTYPE ("disre-tau", ir->dr_tau, 0.0);
2163 CTYPE ("Output frequency for pair distances to energy file");
2164 ITYPE ("nstdisreout", ir->nstdisreout, 100);
2165 CTYPE ("Orientation restraints: No or Yes");
2166 EETYPE("orire", opts->bOrire, yesno_names);
2167 CTYPE ("Orientation restraints force constant and tau for time averaging");
2168 RTYPE ("orire-fc", ir->orires_fc, 0.0);
2169 RTYPE ("orire-tau", ir->orires_tau, 0.0);
2170 STYPE ("orire-fitgrp", is->orirefitgrp, NULL);
2171 CTYPE ("Output frequency for trace(SD) and S to energy file");
2172 ITYPE ("nstorireout", ir->nstorireout, 100);
2174 /* free energy variables */
2175 CCTYPE ("Free energy variables");
2176 EETYPE("free-energy", ir->efep, efep_names);
2177 STYPE ("couple-moltype", is->couple_moltype, NULL);
2178 EETYPE("couple-lambda0", opts->couple_lam0, couple_lam);
2179 EETYPE("couple-lambda1", opts->couple_lam1, couple_lam);
2180 EETYPE("couple-intramol", opts->bCoupleIntra, yesno_names);
2182 RTYPE ("init-lambda", fep->init_lambda, -1); /* start with -1 so
2183 we can recognize if
2184 it was not entered */
2185 ITYPE ("init-lambda-state", fep->init_fep_state, -1);
2186 RTYPE ("delta-lambda", fep->delta_lambda, 0.0);
2187 ITYPE ("nstdhdl", fep->nstdhdl, 50);
2188 STYPE ("fep-lambdas", is->fep_lambda[efptFEP], NULL);
2189 STYPE ("mass-lambdas", is->fep_lambda[efptMASS], NULL);
2190 STYPE ("coul-lambdas", is->fep_lambda[efptCOUL], NULL);
2191 STYPE ("vdw-lambdas", is->fep_lambda[efptVDW], NULL);
2192 STYPE ("bonded-lambdas", is->fep_lambda[efptBONDED], NULL);
2193 STYPE ("restraint-lambdas", is->fep_lambda[efptRESTRAINT], NULL);
2194 STYPE ("temperature-lambdas", is->fep_lambda[efptTEMPERATURE], NULL);
2195 ITYPE ("calc-lambda-neighbors", fep->lambda_neighbors, 1);
2196 STYPE ("init-lambda-weights", is->lambda_weights, NULL);
2197 EETYPE("dhdl-print-energy", fep->edHdLPrintEnergy, edHdLPrintEnergy_names);
2198 RTYPE ("sc-alpha", fep->sc_alpha, 0.0);
2199 ITYPE ("sc-power", fep->sc_power, 1);
2200 RTYPE ("sc-r-power", fep->sc_r_power, 6.0);
2201 RTYPE ("sc-sigma", fep->sc_sigma, 0.3);
2202 EETYPE("sc-coul", fep->bScCoul, yesno_names);
2203 ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2204 RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2205 EETYPE("separate-dhdl-file", fep->separate_dhdl_file,
2206 separate_dhdl_file_names);
2207 EETYPE("dhdl-derivatives", fep->dhdl_derivatives, dhdl_derivatives_names);
2208 ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
2209 RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
2211 /* Non-equilibrium MD stuff */
2212 CCTYPE("Non-equilibrium MD stuff");
2213 STYPE ("acc-grps", is->accgrps, NULL);
2214 STYPE ("accelerate", is->acc, NULL);
2215 STYPE ("freezegrps", is->freeze, NULL);
2216 STYPE ("freezedim", is->frdim, NULL);
2217 RTYPE ("cos-acceleration", ir->cos_accel, 0);
2218 STYPE ("deform", is->deform, NULL);
2220 /* simulated tempering variables */
2221 CCTYPE("simulated tempering variables");
2222 EETYPE("simulated-tempering", ir->bSimTemp, yesno_names);
2223 EETYPE("simulated-tempering-scaling", ir->simtempvals->eSimTempScale, esimtemp_names);
2224 RTYPE("sim-temp-low", ir->simtempvals->simtemp_low, 300.0);
2225 RTYPE("sim-temp-high", ir->simtempvals->simtemp_high, 300.0);
2227 /* expanded ensemble variables */
2228 if (ir->efep == efepEXPANDED || ir->bSimTemp)
2230 read_expandedparams(&ninp, &inp, expand, wi);
2233 /* Electric fields */
2234 CCTYPE("Electric fields");
2235 CTYPE ("Format is number of terms (int) and for all terms an amplitude (real)");
2236 CTYPE ("and a phase angle (real)");
2237 STYPE ("E-x", is->efield_x, NULL);
2238 CTYPE ("Time dependent (pulsed) electric field. Format is omega, time for pulse");
2239 CTYPE ("peak, and sigma (width) for pulse. Sigma = 0 removes pulse, leaving");
2240 CTYPE ("the field to be a cosine function.");
2241 STYPE ("E-xt", is->efield_xt, NULL);
2242 STYPE ("E-y", is->efield_y, NULL);
2243 STYPE ("E-yt", is->efield_yt, NULL);
2244 STYPE ("E-z", is->efield_z, NULL);
2245 STYPE ("E-zt", is->efield_zt, NULL);
2247 CCTYPE("Ion/water position swapping for computational electrophysiology setups");
2248 CTYPE("Swap positions along direction: no, X, Y, Z");
2249 EETYPE("swapcoords", ir->eSwapCoords, eSwapTypes_names);
2250 if (ir->eSwapCoords != eswapNO)
2252 snew(ir->swap, 1);
2253 CTYPE("Swap attempt frequency");
2254 ITYPE("swap-frequency", ir->swap->nstswap, 1);
2255 CTYPE("Two index groups that contain the compartment-partitioning atoms");
2256 STYPE("split-group0", splitgrp0, NULL);
2257 STYPE("split-group1", splitgrp1, NULL);
2258 CTYPE("Use center of mass of split groups (yes/no), otherwise center of geometry is used");
2259 EETYPE("massw-split0", ir->swap->massw_split[0], yesno_names);
2260 EETYPE("massw-split1", ir->swap->massw_split[1], yesno_names);
2262 CTYPE("Group name of ions that can be exchanged with solvent molecules");
2263 STYPE("swap-group", swapgrp, NULL);
2264 CTYPE("Group name of solvent molecules");
2265 STYPE("solvent-group", solgrp, NULL);
2267 CTYPE("Split cylinder: radius, upper and lower extension (nm) (this will define the channels)");
2268 CTYPE("Note that the split cylinder settings do not have an influence on the swapping protocol,");
2269 CTYPE("however, if correctly defined, the ion permeation events are counted per channel");
2270 RTYPE("cyl0-r", ir->swap->cyl0r, 2.0);
2271 RTYPE("cyl0-up", ir->swap->cyl0u, 1.0);
2272 RTYPE("cyl0-down", ir->swap->cyl0l, 1.0);
2273 RTYPE("cyl1-r", ir->swap->cyl1r, 2.0);
2274 RTYPE("cyl1-up", ir->swap->cyl1u, 1.0);
2275 RTYPE("cyl1-down", ir->swap->cyl1l, 1.0);
2277 CTYPE("Average the number of ions per compartment over these many swap attempt steps");
2278 ITYPE("coupl-steps", ir->swap->nAverage, 10);
2279 CTYPE("Requested number of anions and cations for each of the two compartments");
2280 CTYPE("-1 means fix the numbers as found in time step 0");
2281 ITYPE("anionsA", ir->swap->nanions[0], -1);
2282 ITYPE("cationsA", ir->swap->ncations[0], -1);
2283 ITYPE("anionsB", ir->swap->nanions[1], -1);
2284 ITYPE("cationsB", ir->swap->ncations[1], -1);
2285 CTYPE("Start to swap ions if threshold difference to requested count is reached");
2286 RTYPE("threshold", ir->swap->threshold, 1.0);
2289 /* AdResS defined thingies */
2290 CCTYPE ("AdResS parameters");
2291 EETYPE("adress", ir->bAdress, yesno_names);
2292 if (ir->bAdress)
2294 snew(ir->adress, 1);
2295 read_adressparams(&ninp, &inp, ir->adress, wi);
2298 /* User defined thingies */
2299 CCTYPE ("User defined thingies");
2300 STYPE ("user1-grps", is->user1, NULL);
2301 STYPE ("user2-grps", is->user2, NULL);
2302 ITYPE ("userint1", ir->userint1, 0);
2303 ITYPE ("userint2", ir->userint2, 0);
2304 ITYPE ("userint3", ir->userint3, 0);
2305 ITYPE ("userint4", ir->userint4, 0);
2306 RTYPE ("userreal1", ir->userreal1, 0);
2307 RTYPE ("userreal2", ir->userreal2, 0);
2308 RTYPE ("userreal3", ir->userreal3, 0);
2309 RTYPE ("userreal4", ir->userreal4, 0);
2310 #undef CTYPE
2312 write_inpfile(mdparout, ninp, inp, FALSE, wi);
2313 for (i = 0; (i < ninp); i++)
2315 sfree(inp[i].name);
2316 sfree(inp[i].value);
2318 sfree(inp);
2320 /* Process options if necessary */
2321 for (m = 0; m < 2; m++)
2323 for (i = 0; i < 2*DIM; i++)
2325 dumdub[m][i] = 0.0;
2327 if (ir->epc)
2329 switch (ir->epct)
2331 case epctISOTROPIC:
2332 if (sscanf(dumstr[m], "%lf", &(dumdub[m][XX])) != 1)
2334 warning_error(wi, "Pressure coupling not enough values (I need 1)");
2336 dumdub[m][YY] = dumdub[m][ZZ] = dumdub[m][XX];
2337 break;
2338 case epctSEMIISOTROPIC:
2339 case epctSURFACETENSION:
2340 if (sscanf(dumstr[m], "%lf%lf",
2341 &(dumdub[m][XX]), &(dumdub[m][ZZ])) != 2)
2343 warning_error(wi, "Pressure coupling not enough values (I need 2)");
2345 dumdub[m][YY] = dumdub[m][XX];
2346 break;
2347 case epctANISOTROPIC:
2348 if (sscanf(dumstr[m], "%lf%lf%lf%lf%lf%lf",
2349 &(dumdub[m][XX]), &(dumdub[m][YY]), &(dumdub[m][ZZ]),
2350 &(dumdub[m][3]), &(dumdub[m][4]), &(dumdub[m][5])) != 6)
2352 warning_error(wi, "Pressure coupling not enough values (I need 6)");
2354 break;
2355 default:
2356 gmx_fatal(FARGS, "Pressure coupling type %s not implemented yet",
2357 epcoupltype_names[ir->epct]);
2361 clear_mat(ir->ref_p);
2362 clear_mat(ir->compress);
2363 for (i = 0; i < DIM; i++)
2365 ir->ref_p[i][i] = dumdub[1][i];
2366 ir->compress[i][i] = dumdub[0][i];
2368 if (ir->epct == epctANISOTROPIC)
2370 ir->ref_p[XX][YY] = dumdub[1][3];
2371 ir->ref_p[XX][ZZ] = dumdub[1][4];
2372 ir->ref_p[YY][ZZ] = dumdub[1][5];
2373 if (ir->ref_p[XX][YY] != 0 && ir->ref_p[XX][ZZ] != 0 && ir->ref_p[YY][ZZ] != 0)
2375 warning(wi, "All off-diagonal reference pressures are non-zero. Are you sure you want to apply a threefold shear stress?\n");
2377 ir->compress[XX][YY] = dumdub[0][3];
2378 ir->compress[XX][ZZ] = dumdub[0][4];
2379 ir->compress[YY][ZZ] = dumdub[0][5];
2380 for (i = 0; i < DIM; i++)
2382 for (m = 0; m < i; m++)
2384 ir->ref_p[i][m] = ir->ref_p[m][i];
2385 ir->compress[i][m] = ir->compress[m][i];
2390 if (ir->comm_mode == ecmNO)
2392 ir->nstcomm = 0;
2395 opts->couple_moltype = NULL;
2396 if (strlen(is->couple_moltype) > 0)
2398 if (ir->efep != efepNO)
2400 opts->couple_moltype = gmx_strdup(is->couple_moltype);
2401 if (opts->couple_lam0 == opts->couple_lam1)
2403 warning(wi, "The lambda=0 and lambda=1 states for coupling are identical");
2405 if (ir->eI == eiMD && (opts->couple_lam0 == ecouplamNONE ||
2406 opts->couple_lam1 == ecouplamNONE))
2408 warning(wi, "For proper sampling of the (nearly) decoupled state, stochastic dynamics should be used");
2411 else
2413 warning_note(wi, "Free energy is turned off, so we will not decouple the molecule listed in your input.");
2416 /* FREE ENERGY AND EXPANDED ENSEMBLE OPTIONS */
2417 if (ir->efep != efepNO)
2419 if (fep->delta_lambda > 0)
2421 ir->efep = efepSLOWGROWTH;
2425 if (fep->edHdLPrintEnergy == edHdLPrintEnergyYES)
2427 fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2428 warning_note(wi, "Old option for dhdl-print-energy given: "
2429 "changing \"yes\" to \"total\"\n");
2432 if (ir->bSimTemp && (fep->edHdLPrintEnergy == edHdLPrintEnergyNO))
2434 /* always print out the energy to dhdl if we are doing
2435 expanded ensemble, since we need the total energy for
2436 analysis if the temperature is changing. In some
2437 conditions one may only want the potential energy, so
2438 we will allow that if the appropriate mdp setting has
2439 been enabled. Otherwise, total it is:
2441 fep->edHdLPrintEnergy = edHdLPrintEnergyTOTAL;
2444 if ((ir->efep != efepNO) || ir->bSimTemp)
2446 ir->bExpanded = FALSE;
2447 if ((ir->efep == efepEXPANDED) || ir->bSimTemp)
2449 ir->bExpanded = TRUE;
2451 do_fep_params(ir, is->fep_lambda, is->lambda_weights, wi);
2452 if (ir->bSimTemp) /* done after fep params */
2454 do_simtemp_params(ir);
2457 /* Because sc-coul (=FALSE by default) only acts on the lambda state
2458 * setup and not on the old way of specifying the free-energy setup,
2459 * we should check for using soft-core when not needed, since that
2460 * can complicate the sampling significantly.
2461 * Note that we only check for the automated coupling setup.
2462 * If the (advanced) user does FEP through manual topology changes,
2463 * this check will not be triggered.
2465 if (ir->efep != efepNO && ir->fepvals->n_lambda == 0 &&
2466 ir->fepvals->sc_alpha != 0 &&
2467 (couple_lambda_has_vdw_on(opts->couple_lam0) &&
2468 couple_lambda_has_vdw_on(opts->couple_lam1)))
2470 warning(wi, "You are using soft-core interactions while the Van der Waals interactions are not decoupled (note that the sc-coul option is only active when using lambda states). Although this will not lead to errors, you will need much more sampling than without soft-core interactions. Consider using sc-alpha=0.");
2473 else
2475 ir->fepvals->n_lambda = 0;
2478 /* WALL PARAMETERS */
2480 do_wall_params(ir, is->wall_atomtype, is->wall_density, opts);
2482 /* ORIENTATION RESTRAINT PARAMETERS */
2484 if (opts->bOrire && str_nelem(is->orirefitgrp, MAXPTR, NULL) != 1)
2486 warning_error(wi, "ERROR: Need one orientation restraint fit group\n");
2489 /* DEFORMATION PARAMETERS */
2491 clear_mat(ir->deform);
2492 for (i = 0; i < 6; i++)
2494 dumdub[0][i] = 0;
2496 sscanf(is->deform, "%lf %lf %lf %lf %lf %lf",
2497 &(dumdub[0][0]), &(dumdub[0][1]), &(dumdub[0][2]),
2498 &(dumdub[0][3]), &(dumdub[0][4]), &(dumdub[0][5]));
2499 for (i = 0; i < 3; i++)
2501 ir->deform[i][i] = dumdub[0][i];
2503 ir->deform[YY][XX] = dumdub[0][3];
2504 ir->deform[ZZ][XX] = dumdub[0][4];
2505 ir->deform[ZZ][YY] = dumdub[0][5];
2506 if (ir->epc != epcNO)
2508 for (i = 0; i < 3; i++)
2510 for (j = 0; j <= i; j++)
2512 if (ir->deform[i][j] != 0 && ir->compress[i][j] != 0)
2514 warning_error(wi, "A box element has deform set and compressibility > 0");
2518 for (i = 0; i < 3; i++)
2520 for (j = 0; j < i; j++)
2522 if (ir->deform[i][j] != 0)
2524 for (m = j; m < DIM; m++)
2526 if (ir->compress[m][j] != 0)
2528 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.");
2529 warning(wi, warn_buf);
2537 /* Ion/water position swapping checks */
2538 if (ir->eSwapCoords != eswapNO)
2540 if (ir->swap->nstswap < 1)
2542 warning_error(wi, "swap_frequency must be 1 or larger when ion swapping is requested");
2544 if (ir->swap->nAverage < 1)
2546 warning_error(wi, "coupl_steps must be 1 or larger.\n");
2548 if (ir->swap->threshold < 1.0)
2550 warning_error(wi, "Ion count threshold must be at least 1.\n");
2554 sfree(dumstr[0]);
2555 sfree(dumstr[1]);
2558 static int search_QMstring(const char *s, int ng, const char *gn[])
2560 /* same as normal search_string, but this one searches QM strings */
2561 int i;
2563 for (i = 0; (i < ng); i++)
2565 if (gmx_strcasecmp(s, gn[i]) == 0)
2567 return i;
2571 gmx_fatal(FARGS, "this QM method or basisset (%s) is not implemented\n!", s);
2573 return -1;
2575 } /* search_QMstring */
2577 /* We would like gn to be const as well, but C doesn't allow this */
2578 /* TODO this is utility functionality (search for the index of a
2579 string in a collection), so should be refactored and located more
2580 centrally. */
2581 int search_string(const char *s, int ng, char *gn[])
2583 int i;
2585 for (i = 0; (i < ng); i++)
2587 if (gmx_strcasecmp(s, gn[i]) == 0)
2589 return i;
2593 gmx_fatal(FARGS,
2594 "Group %s referenced in the .mdp file was not found in the index file.\n"
2595 "Group names must match either [moleculetype] names or custom index group\n"
2596 "names, in which case you must supply an index file to the '-n' option\n"
2597 "of grompp.",
2600 return -1;
2603 static gmx_bool do_numbering(int natoms, gmx_groups_t *groups, int ng, char *ptrs[],
2604 t_blocka *block, char *gnames[],
2605 int gtype, int restnm,
2606 int grptp, gmx_bool bVerbose,
2607 warninp_t wi)
2609 unsigned short *cbuf;
2610 t_grps *grps = &(groups->grps[gtype]);
2611 int i, j, gid, aj, ognr, ntot = 0;
2612 const char *title;
2613 gmx_bool bRest;
2614 char warn_buf[STRLEN];
2616 if (debug)
2618 fprintf(debug, "Starting numbering %d groups of type %d\n", ng, gtype);
2621 title = gtypes[gtype];
2623 snew(cbuf, natoms);
2624 /* Mark all id's as not set */
2625 for (i = 0; (i < natoms); i++)
2627 cbuf[i] = NOGID;
2630 snew(grps->nm_ind, ng+1); /* +1 for possible rest group */
2631 for (i = 0; (i < ng); i++)
2633 /* Lookup the group name in the block structure */
2634 gid = search_string(ptrs[i], block->nr, gnames);
2635 if ((grptp != egrptpONE) || (i == 0))
2637 grps->nm_ind[grps->nr++] = gid;
2639 if (debug)
2641 fprintf(debug, "Found gid %d for group %s\n", gid, ptrs[i]);
2644 /* Now go over the atoms in the group */
2645 for (j = block->index[gid]; (j < block->index[gid+1]); j++)
2648 aj = block->a[j];
2650 /* Range checking */
2651 if ((aj < 0) || (aj >= natoms))
2653 gmx_fatal(FARGS, "Invalid atom number %d in indexfile", aj);
2655 /* Lookup up the old group number */
2656 ognr = cbuf[aj];
2657 if (ognr != NOGID)
2659 gmx_fatal(FARGS, "Atom %d in multiple %s groups (%d and %d)",
2660 aj+1, title, ognr+1, i+1);
2662 else
2664 /* Store the group number in buffer */
2665 if (grptp == egrptpONE)
2667 cbuf[aj] = 0;
2669 else
2671 cbuf[aj] = i;
2673 ntot++;
2678 /* Now check whether we have done all atoms */
2679 bRest = FALSE;
2680 if (ntot != natoms)
2682 if (grptp == egrptpALL)
2684 gmx_fatal(FARGS, "%d atoms are not part of any of the %s groups",
2685 natoms-ntot, title);
2687 else if (grptp == egrptpPART)
2689 sprintf(warn_buf, "%d atoms are not part of any of the %s groups",
2690 natoms-ntot, title);
2691 warning_note(wi, warn_buf);
2693 /* Assign all atoms currently unassigned to a rest group */
2694 for (j = 0; (j < natoms); j++)
2696 if (cbuf[j] == NOGID)
2698 cbuf[j] = grps->nr;
2699 bRest = TRUE;
2702 if (grptp != egrptpPART)
2704 if (bVerbose)
2706 fprintf(stderr,
2707 "Making dummy/rest group for %s containing %d elements\n",
2708 title, natoms-ntot);
2710 /* Add group name "rest" */
2711 grps->nm_ind[grps->nr] = restnm;
2713 /* Assign the rest name to all atoms not currently assigned to a group */
2714 for (j = 0; (j < natoms); j++)
2716 if (cbuf[j] == NOGID)
2718 cbuf[j] = grps->nr;
2721 grps->nr++;
2725 if (grps->nr == 1 && (ntot == 0 || ntot == natoms))
2727 /* All atoms are part of one (or no) group, no index required */
2728 groups->ngrpnr[gtype] = 0;
2729 groups->grpnr[gtype] = NULL;
2731 else
2733 groups->ngrpnr[gtype] = natoms;
2734 snew(groups->grpnr[gtype], natoms);
2735 for (j = 0; (j < natoms); j++)
2737 groups->grpnr[gtype][j] = cbuf[j];
2741 sfree(cbuf);
2743 return (bRest && grptp == egrptpPART);
2746 static void calc_nrdf(gmx_mtop_t *mtop, t_inputrec *ir, char **gnames)
2748 t_grpopts *opts;
2749 gmx_groups_t *groups;
2750 pull_params_t *pull;
2751 int natoms, ai, aj, i, j, d, g, imin, jmin;
2752 t_iatom *ia;
2753 int *nrdf2, *na_vcm, na_tot;
2754 double *nrdf_tc, *nrdf_vcm, nrdf_uc, n_sub = 0;
2755 gmx_mtop_atomloop_all_t aloop;
2756 t_atom *atom;
2757 int mb, mol, ftype, as;
2758 gmx_molblock_t *molb;
2759 gmx_moltype_t *molt;
2761 /* Calculate nrdf.
2762 * First calc 3xnr-atoms for each group
2763 * then subtract half a degree of freedom for each constraint
2765 * Only atoms and nuclei contribute to the degrees of freedom...
2768 opts = &ir->opts;
2770 groups = &mtop->groups;
2771 natoms = mtop->natoms;
2773 /* Allocate one more for a possible rest group */
2774 /* We need to sum degrees of freedom into doubles,
2775 * since floats give too low nrdf's above 3 million atoms.
2777 snew(nrdf_tc, groups->grps[egcTC].nr+1);
2778 snew(nrdf_vcm, groups->grps[egcVCM].nr+1);
2779 snew(na_vcm, groups->grps[egcVCM].nr+1);
2781 for (i = 0; i < groups->grps[egcTC].nr; i++)
2783 nrdf_tc[i] = 0;
2785 for (i = 0; i < groups->grps[egcVCM].nr+1; i++)
2787 nrdf_vcm[i] = 0;
2790 snew(nrdf2, natoms);
2791 aloop = gmx_mtop_atomloop_all_init(mtop);
2792 while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
2794 nrdf2[i] = 0;
2795 if (atom->ptype == eptAtom || atom->ptype == eptNucleus)
2797 g = ggrpnr(groups, egcFREEZE, i);
2798 /* Double count nrdf for particle i */
2799 for (d = 0; d < DIM; d++)
2801 if (opts->nFreeze[g][d] == 0)
2803 nrdf2[i] += 2;
2806 nrdf_tc [ggrpnr(groups, egcTC, i)] += 0.5*nrdf2[i];
2807 nrdf_vcm[ggrpnr(groups, egcVCM, i)] += 0.5*nrdf2[i];
2811 as = 0;
2812 for (mb = 0; mb < mtop->nmolblock; mb++)
2814 molb = &mtop->molblock[mb];
2815 molt = &mtop->moltype[molb->type];
2816 atom = molt->atoms.atom;
2817 for (mol = 0; mol < molb->nmol; mol++)
2819 for (ftype = F_CONSTR; ftype <= F_CONSTRNC; ftype++)
2821 ia = molt->ilist[ftype].iatoms;
2822 for (i = 0; i < molt->ilist[ftype].nr; )
2824 /* Subtract degrees of freedom for the constraints,
2825 * if the particles still have degrees of freedom left.
2826 * If one of the particles is a vsite or a shell, then all
2827 * constraint motion will go there, but since they do not
2828 * contribute to the constraints the degrees of freedom do not
2829 * change.
2831 ai = as + ia[1];
2832 aj = as + ia[2];
2833 if (((atom[ia[1]].ptype == eptNucleus) ||
2834 (atom[ia[1]].ptype == eptAtom)) &&
2835 ((atom[ia[2]].ptype == eptNucleus) ||
2836 (atom[ia[2]].ptype == eptAtom)))
2838 if (nrdf2[ai] > 0)
2840 jmin = 1;
2842 else
2844 jmin = 2;
2846 if (nrdf2[aj] > 0)
2848 imin = 1;
2850 else
2852 imin = 2;
2854 imin = std::min(imin, nrdf2[ai]);
2855 jmin = std::min(jmin, nrdf2[aj]);
2856 nrdf2[ai] -= imin;
2857 nrdf2[aj] -= jmin;
2858 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
2859 nrdf_tc [ggrpnr(groups, egcTC, aj)] -= 0.5*jmin;
2860 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2861 nrdf_vcm[ggrpnr(groups, egcVCM, aj)] -= 0.5*jmin;
2863 ia += interaction_function[ftype].nratoms+1;
2864 i += interaction_function[ftype].nratoms+1;
2867 ia = molt->ilist[F_SETTLE].iatoms;
2868 for (i = 0; i < molt->ilist[F_SETTLE].nr; )
2870 /* Subtract 1 dof from every atom in the SETTLE */
2871 for (j = 0; j < 3; j++)
2873 ai = as + ia[1+j];
2874 imin = std::min(2, nrdf2[ai]);
2875 nrdf2[ai] -= imin;
2876 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
2877 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2879 ia += 4;
2880 i += 4;
2882 as += molt->atoms.nr;
2886 if (ir->bPull)
2888 /* Correct nrdf for the COM constraints.
2889 * We correct using the TC and VCM group of the first atom
2890 * in the reference and pull group. If atoms in one pull group
2891 * belong to different TC or VCM groups it is anyhow difficult
2892 * to determine the optimal nrdf assignment.
2894 pull = ir->pull;
2896 for (i = 0; i < pull->ncoord; i++)
2898 if (pull->coord[i].eType != epullCONSTRAINT)
2900 continue;
2903 imin = 1;
2905 for (j = 0; j < 2; j++)
2907 const t_pull_group *pgrp;
2909 pgrp = &pull->group[pull->coord[i].group[j]];
2911 if (pgrp->nat > 0)
2913 /* Subtract 1/2 dof from each group */
2914 ai = pgrp->ind[0];
2915 nrdf_tc [ggrpnr(groups, egcTC, ai)] -= 0.5*imin;
2916 nrdf_vcm[ggrpnr(groups, egcVCM, ai)] -= 0.5*imin;
2917 if (nrdf_tc[ggrpnr(groups, egcTC, ai)] < 0)
2919 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)]]);
2922 else
2924 /* We need to subtract the whole DOF from group j=1 */
2925 imin += 1;
2931 if (ir->nstcomm != 0)
2933 /* Subtract 3 from the number of degrees of freedom in each vcm group
2934 * when com translation is removed and 6 when rotation is removed
2935 * as well.
2937 switch (ir->comm_mode)
2939 case ecmLINEAR:
2940 n_sub = ndof_com(ir);
2941 break;
2942 case ecmANGULAR:
2943 n_sub = 6;
2944 break;
2945 default:
2946 gmx_incons("Checking comm_mode");
2949 for (i = 0; i < groups->grps[egcTC].nr; i++)
2951 /* Count the number of atoms of TC group i for every VCM group */
2952 for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
2954 na_vcm[j] = 0;
2956 na_tot = 0;
2957 for (ai = 0; ai < natoms; ai++)
2959 if (ggrpnr(groups, egcTC, ai) == i)
2961 na_vcm[ggrpnr(groups, egcVCM, ai)]++;
2962 na_tot++;
2965 /* Correct for VCM removal according to the fraction of each VCM
2966 * group present in this TC group.
2968 nrdf_uc = nrdf_tc[i];
2969 if (debug)
2971 fprintf(debug, "T-group[%d] nrdf_uc = %g, n_sub = %g\n",
2972 i, nrdf_uc, n_sub);
2974 nrdf_tc[i] = 0;
2975 for (j = 0; j < groups->grps[egcVCM].nr+1; j++)
2977 if (nrdf_vcm[j] > n_sub)
2979 nrdf_tc[i] += nrdf_uc*((double)na_vcm[j]/(double)na_tot)*
2980 (nrdf_vcm[j] - n_sub)/nrdf_vcm[j];
2982 if (debug)
2984 fprintf(debug, " nrdf_vcm[%d] = %g, nrdf = %g\n",
2985 j, nrdf_vcm[j], nrdf_tc[i]);
2990 for (i = 0; (i < groups->grps[egcTC].nr); i++)
2992 opts->nrdf[i] = nrdf_tc[i];
2993 if (opts->nrdf[i] < 0)
2995 opts->nrdf[i] = 0;
2997 fprintf(stderr,
2998 "Number of degrees of freedom in T-Coupling group %s is %.2f\n",
2999 gnames[groups->grps[egcTC].nm_ind[i]], opts->nrdf[i]);
3002 sfree(nrdf2);
3003 sfree(nrdf_tc);
3004 sfree(nrdf_vcm);
3005 sfree(na_vcm);
3008 static void decode_cos(char *s, t_cosines *cosine)
3010 char *t;
3011 char format[STRLEN], f1[STRLEN];
3012 double a, phi;
3013 int i;
3015 t = gmx_strdup(s);
3016 trim(t);
3018 cosine->n = 0;
3019 cosine->a = NULL;
3020 cosine->phi = NULL;
3021 if (strlen(t))
3023 sscanf(t, "%d", &(cosine->n));
3024 if (cosine->n <= 0)
3026 cosine->n = 0;
3028 else
3030 snew(cosine->a, cosine->n);
3031 snew(cosine->phi, cosine->n);
3033 sprintf(format, "%%*d");
3034 for (i = 0; (i < cosine->n); i++)
3036 strcpy(f1, format);
3037 strcat(f1, "%lf%lf");
3038 if (sscanf(t, f1, &a, &phi) < 2)
3040 gmx_fatal(FARGS, "Invalid input for electric field shift: '%s'", t);
3042 cosine->a[i] = a;
3043 cosine->phi[i] = phi;
3044 strcat(format, "%*lf%*lf");
3048 sfree(t);
3051 static gmx_bool do_egp_flag(t_inputrec *ir, gmx_groups_t *groups,
3052 const char *option, const char *val, int flag)
3054 /* The maximum number of energy group pairs would be MAXPTR*(MAXPTR+1)/2.
3055 * But since this is much larger than STRLEN, such a line can not be parsed.
3056 * The real maximum is the number of names that fit in a string: STRLEN/2.
3058 #define EGP_MAX (STRLEN/2)
3059 int nelem, i, j, k, nr;
3060 char *names[EGP_MAX];
3061 char ***gnames;
3062 gmx_bool bSet;
3064 gnames = groups->grpname;
3066 nelem = str_nelem(val, EGP_MAX, names);
3067 if (nelem % 2 != 0)
3069 gmx_fatal(FARGS, "The number of groups for %s is odd", option);
3071 nr = groups->grps[egcENER].nr;
3072 bSet = FALSE;
3073 for (i = 0; i < nelem/2; i++)
3075 j = 0;
3076 while ((j < nr) &&
3077 gmx_strcasecmp(names[2*i], *(gnames[groups->grps[egcENER].nm_ind[j]])))
3079 j++;
3081 if (j == nr)
3083 gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3084 names[2*i], option);
3086 k = 0;
3087 while ((k < nr) &&
3088 gmx_strcasecmp(names[2*i+1], *(gnames[groups->grps[egcENER].nm_ind[k]])))
3090 k++;
3092 if (k == nr)
3094 gmx_fatal(FARGS, "%s in %s is not an energy group\n",
3095 names[2*i+1], option);
3097 if ((j < nr) && (k < nr))
3099 ir->opts.egp_flags[nr*j+k] |= flag;
3100 ir->opts.egp_flags[nr*k+j] |= flag;
3101 bSet = TRUE;
3105 return bSet;
3109 static void make_swap_groups(
3110 t_swapcoords *swap,
3111 char *swapgname,
3112 char *splitg0name,
3113 char *splitg1name,
3114 char *solgname,
3115 t_blocka *grps,
3116 char **gnames)
3118 int ig = -1, i = 0, j;
3119 char *splitg;
3122 /* Just a quick check here, more thorough checks are in mdrun */
3123 if (strcmp(splitg0name, splitg1name) == 0)
3125 gmx_fatal(FARGS, "The split groups can not both be '%s'.", splitg0name);
3128 /* First get the swap group index atoms */
3129 ig = search_string(swapgname, grps->nr, gnames);
3130 swap->nat = grps->index[ig+1] - grps->index[ig];
3131 if (swap->nat > 0)
3133 fprintf(stderr, "Swap group '%s' contains %d atoms.\n", swapgname, swap->nat);
3134 snew(swap->ind, swap->nat);
3135 for (i = 0; i < swap->nat; i++)
3137 swap->ind[i] = grps->a[grps->index[ig]+i];
3140 else
3142 gmx_fatal(FARGS, "You defined an empty group of atoms for swapping.");
3145 /* Now do so for the split groups */
3146 for (j = 0; j < 2; j++)
3148 if (j == 0)
3150 splitg = splitg0name;
3152 else
3154 splitg = splitg1name;
3157 ig = search_string(splitg, grps->nr, gnames);
3158 swap->nat_split[j] = grps->index[ig+1] - grps->index[ig];
3159 if (swap->nat_split[j] > 0)
3161 fprintf(stderr, "Split group %d '%s' contains %d atom%s.\n",
3162 j, splitg, swap->nat_split[j], (swap->nat_split[j] > 1) ? "s" : "");
3163 snew(swap->ind_split[j], swap->nat_split[j]);
3164 for (i = 0; i < swap->nat_split[j]; i++)
3166 swap->ind_split[j][i] = grps->a[grps->index[ig]+i];
3169 else
3171 gmx_fatal(FARGS, "Split group %d has to contain at least 1 atom!", j);
3175 /* Now get the solvent group index atoms */
3176 ig = search_string(solgname, grps->nr, gnames);
3177 swap->nat_sol = grps->index[ig+1] - grps->index[ig];
3178 if (swap->nat_sol > 0)
3180 fprintf(stderr, "Solvent group '%s' contains %d atoms.\n", solgname, swap->nat_sol);
3181 snew(swap->ind_sol, swap->nat_sol);
3182 for (i = 0; i < swap->nat_sol; i++)
3184 swap->ind_sol[i] = grps->a[grps->index[ig]+i];
3187 else
3189 gmx_fatal(FARGS, "You defined an empty group of solvent. Cannot exchange ions.");
3194 void make_IMD_group(t_IMD *IMDgroup, char *IMDgname, t_blocka *grps, char **gnames)
3196 int ig, i;
3199 ig = search_string(IMDgname, grps->nr, gnames);
3200 IMDgroup->nat = grps->index[ig+1] - grps->index[ig];
3202 if (IMDgroup->nat > 0)
3204 fprintf(stderr, "Group '%s' with %d atoms can be activated for interactive molecular dynamics (IMD).\n",
3205 IMDgname, IMDgroup->nat);
3206 snew(IMDgroup->ind, IMDgroup->nat);
3207 for (i = 0; i < IMDgroup->nat; i++)
3209 IMDgroup->ind[i] = grps->a[grps->index[ig]+i];
3215 void do_index(const char* mdparin, const char *ndx,
3216 gmx_mtop_t *mtop,
3217 gmx_bool bVerbose,
3218 t_inputrec *ir,
3219 warninp_t wi)
3221 t_blocka *grps;
3222 gmx_groups_t *groups;
3223 int natoms;
3224 t_symtab *symtab;
3225 t_atoms atoms_all;
3226 char warnbuf[STRLEN], **gnames;
3227 int nr, ntcg, ntau_t, nref_t, nacc, nofg, nSA, nSA_points, nSA_time, nSA_temp;
3228 real tau_min;
3229 int nstcmin;
3230 int nacg, nfreeze, nfrdim, nenergy, nvcm, nuser;
3231 char *ptr1[MAXPTR], *ptr2[MAXPTR], *ptr3[MAXPTR];
3232 int i, j, k, restnm;
3233 gmx_bool bExcl, bTable, bSetTCpar, bAnneal, bRest;
3234 int nQMmethod, nQMbasis, nQMg;
3235 char warn_buf[STRLEN];
3236 char* endptr;
3238 if (bVerbose)
3240 fprintf(stderr, "processing index file...\n");
3242 debug_gmx();
3243 if (ndx == NULL)
3245 snew(grps, 1);
3246 snew(grps->index, 1);
3247 snew(gnames, 1);
3248 atoms_all = gmx_mtop_global_atoms(mtop);
3249 analyse(&atoms_all, grps, &gnames, FALSE, TRUE);
3250 done_atom(&atoms_all);
3252 else
3254 grps = init_index(ndx, &gnames);
3257 groups = &mtop->groups;
3258 natoms = mtop->natoms;
3259 symtab = &mtop->symtab;
3261 snew(groups->grpname, grps->nr+1);
3263 for (i = 0; (i < grps->nr); i++)
3265 groups->grpname[i] = put_symtab(symtab, gnames[i]);
3267 groups->grpname[i] = put_symtab(symtab, "rest");
3268 restnm = i;
3269 srenew(gnames, grps->nr+1);
3270 gnames[restnm] = *(groups->grpname[i]);
3271 groups->ngrpname = grps->nr+1;
3273 set_warning_line(wi, mdparin, -1);
3275 ntau_t = str_nelem(is->tau_t, MAXPTR, ptr1);
3276 nref_t = str_nelem(is->ref_t, MAXPTR, ptr2);
3277 ntcg = str_nelem(is->tcgrps, MAXPTR, ptr3);
3278 if ((ntau_t != ntcg) || (nref_t != ntcg))
3280 gmx_fatal(FARGS, "Invalid T coupling input: %d groups, %d ref-t values and "
3281 "%d tau-t values", ntcg, nref_t, ntau_t);
3284 bSetTCpar = (ir->etc || EI_SD(ir->eI) || ir->eI == eiBD || EI_TPI(ir->eI));
3285 do_numbering(natoms, groups, ntcg, ptr3, grps, gnames, egcTC,
3286 restnm, bSetTCpar ? egrptpALL : egrptpALL_GENREST, bVerbose, wi);
3287 nr = groups->grps[egcTC].nr;
3288 ir->opts.ngtc = nr;
3289 snew(ir->opts.nrdf, nr);
3290 snew(ir->opts.tau_t, nr);
3291 snew(ir->opts.ref_t, nr);
3292 if (ir->eI == eiBD && ir->bd_fric == 0)
3294 fprintf(stderr, "bd-fric=0, so tau-t will be used as the inverse friction constant(s)\n");
3297 if (bSetTCpar)
3299 if (nr != nref_t)
3301 gmx_fatal(FARGS, "Not enough ref-t and tau-t values!");
3304 tau_min = 1e20;
3305 for (i = 0; (i < nr); i++)
3307 ir->opts.tau_t[i] = strtod(ptr1[i], &endptr);
3308 if (*endptr != 0)
3310 warning_error(wi, "Invalid value for mdp option tau-t. tau-t should only consist of real numbers separated by spaces.");
3312 if ((ir->eI == eiBD || ir->eI == eiSD2) && ir->opts.tau_t[i] <= 0)
3314 sprintf(warn_buf, "With integrator %s tau-t should be larger than 0", ei_names[ir->eI]);
3315 warning_error(wi, warn_buf);
3318 if (ir->etc != etcVRESCALE && ir->opts.tau_t[i] == 0)
3320 warning_note(wi, "tau-t = -1 is the value to signal that a group should not have temperature coupling. Treating your use of tau-t = 0 as if you used -1.");
3323 if (ir->opts.tau_t[i] >= 0)
3325 tau_min = std::min(tau_min, ir->opts.tau_t[i]);
3328 if (ir->etc != etcNO && ir->nsttcouple == -1)
3330 ir->nsttcouple = ir_optimal_nsttcouple(ir);
3333 if (EI_VV(ir->eI))
3335 if ((ir->etc == etcNOSEHOOVER) && (ir->epc == epcBERENDSEN))
3337 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");
3339 if ((ir->epc == epcMTTK) && (ir->etc > etcNO))
3341 if (ir->nstpcouple != ir->nsttcouple)
3343 int mincouple = std::min(ir->nstpcouple, ir->nsttcouple);
3344 ir->nstpcouple = ir->nsttcouple = mincouple;
3345 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);
3346 warning_note(wi, warn_buf);
3350 /* velocity verlet with averaged kinetic energy KE = 0.5*(v(t+1/2) - v(t-1/2)) is implemented
3351 primarily for testing purposes, and does not work with temperature coupling other than 1 */
3353 if (ETC_ANDERSEN(ir->etc))
3355 if (ir->nsttcouple != 1)
3357 ir->nsttcouple = 1;
3358 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");
3359 warning_note(wi, warn_buf);
3362 nstcmin = tcouple_min_integration_steps(ir->etc);
3363 if (nstcmin > 1)
3365 if (tau_min/(ir->delta_t*ir->nsttcouple) < nstcmin - 10*GMX_REAL_EPS)
3367 sprintf(warn_buf, "For proper integration of the %s thermostat, tau-t (%g) should be at least %d times larger than nsttcouple*dt (%g)",
3368 ETCOUPLTYPE(ir->etc),
3369 tau_min, nstcmin,
3370 ir->nsttcouple*ir->delta_t);
3371 warning(wi, warn_buf);
3374 for (i = 0; (i < nr); i++)
3376 ir->opts.ref_t[i] = strtod(ptr2[i], &endptr);
3377 if (*endptr != 0)
3379 warning_error(wi, "Invalid value for mdp option ref-t. ref-t should only consist of real numbers separated by spaces.");
3381 if (ir->opts.ref_t[i] < 0)
3383 gmx_fatal(FARGS, "ref-t for group %d negative", i);
3386 /* set the lambda mc temperature to the md integrator temperature (which should be defined
3387 if we are in this conditional) if mc_temp is negative */
3388 if (ir->expandedvals->mc_temp < 0)
3390 ir->expandedvals->mc_temp = ir->opts.ref_t[0]; /*for now, set to the first reft */
3394 /* Simulated annealing for each group. There are nr groups */
3395 nSA = str_nelem(is->anneal, MAXPTR, ptr1);
3396 if (nSA == 1 && (ptr1[0][0] == 'n' || ptr1[0][0] == 'N'))
3398 nSA = 0;
3400 if (nSA > 0 && nSA != nr)
3402 gmx_fatal(FARGS, "Not enough annealing values: %d (for %d groups)\n", nSA, nr);
3404 else
3406 snew(ir->opts.annealing, nr);
3407 snew(ir->opts.anneal_npoints, nr);
3408 snew(ir->opts.anneal_time, nr);
3409 snew(ir->opts.anneal_temp, nr);
3410 for (i = 0; i < nr; i++)
3412 ir->opts.annealing[i] = eannNO;
3413 ir->opts.anneal_npoints[i] = 0;
3414 ir->opts.anneal_time[i] = NULL;
3415 ir->opts.anneal_temp[i] = NULL;
3417 if (nSA > 0)
3419 bAnneal = FALSE;
3420 for (i = 0; i < nr; i++)
3422 if (ptr1[i][0] == 'n' || ptr1[i][0] == 'N')
3424 ir->opts.annealing[i] = eannNO;
3426 else if (ptr1[i][0] == 's' || ptr1[i][0] == 'S')
3428 ir->opts.annealing[i] = eannSINGLE;
3429 bAnneal = TRUE;
3431 else if (ptr1[i][0] == 'p' || ptr1[i][0] == 'P')
3433 ir->opts.annealing[i] = eannPERIODIC;
3434 bAnneal = TRUE;
3437 if (bAnneal)
3439 /* Read the other fields too */
3440 nSA_points = str_nelem(is->anneal_npoints, MAXPTR, ptr1);
3441 if (nSA_points != nSA)
3443 gmx_fatal(FARGS, "Found %d annealing-npoints values for %d groups\n", nSA_points, nSA);
3445 for (k = 0, i = 0; i < nr; i++)
3447 ir->opts.anneal_npoints[i] = strtol(ptr1[i], &endptr, 10);
3448 if (*endptr != 0)
3450 warning_error(wi, "Invalid value for mdp option annealing-npoints. annealing should only consist of integers separated by spaces.");
3452 if (ir->opts.anneal_npoints[i] == 1)
3454 gmx_fatal(FARGS, "Please specify at least a start and an end point for annealing\n");
3456 snew(ir->opts.anneal_time[i], ir->opts.anneal_npoints[i]);
3457 snew(ir->opts.anneal_temp[i], ir->opts.anneal_npoints[i]);
3458 k += ir->opts.anneal_npoints[i];
3461 nSA_time = str_nelem(is->anneal_time, MAXPTR, ptr1);
3462 if (nSA_time != k)
3464 gmx_fatal(FARGS, "Found %d annealing-time values, wanter %d\n", nSA_time, k);
3466 nSA_temp = str_nelem(is->anneal_temp, MAXPTR, ptr2);
3467 if (nSA_temp != k)
3469 gmx_fatal(FARGS, "Found %d annealing-temp values, wanted %d\n", nSA_temp, k);
3472 for (i = 0, k = 0; i < nr; i++)
3475 for (j = 0; j < ir->opts.anneal_npoints[i]; j++)
3477 ir->opts.anneal_time[i][j] = strtod(ptr1[k], &endptr);
3478 if (*endptr != 0)
3480 warning_error(wi, "Invalid value for mdp option anneal-time. anneal-time should only consist of real numbers separated by spaces.");
3482 ir->opts.anneal_temp[i][j] = strtod(ptr2[k], &endptr);
3483 if (*endptr != 0)
3485 warning_error(wi, "Invalid value for anneal-temp. anneal-temp should only consist of real numbers separated by spaces.");
3487 if (j == 0)
3489 if (ir->opts.anneal_time[i][0] > (ir->init_t+GMX_REAL_EPS))
3491 gmx_fatal(FARGS, "First time point for annealing > init_t.\n");
3494 else
3496 /* j>0 */
3497 if (ir->opts.anneal_time[i][j] < ir->opts.anneal_time[i][j-1])
3499 gmx_fatal(FARGS, "Annealing timepoints out of order: t=%f comes after t=%f\n",
3500 ir->opts.anneal_time[i][j], ir->opts.anneal_time[i][j-1]);
3503 if (ir->opts.anneal_temp[i][j] < 0)
3505 gmx_fatal(FARGS, "Found negative temperature in annealing: %f\n", ir->opts.anneal_temp[i][j]);
3507 k++;
3510 /* Print out some summary information, to make sure we got it right */
3511 for (i = 0, k = 0; i < nr; i++)
3513 if (ir->opts.annealing[i] != eannNO)
3515 j = groups->grps[egcTC].nm_ind[i];
3516 fprintf(stderr, "Simulated annealing for group %s: %s, %d timepoints\n",
3517 *(groups->grpname[j]), eann_names[ir->opts.annealing[i]],
3518 ir->opts.anneal_npoints[i]);
3519 fprintf(stderr, "Time (ps) Temperature (K)\n");
3520 /* All terms except the last one */
3521 for (j = 0; j < (ir->opts.anneal_npoints[i]-1); j++)
3523 fprintf(stderr, "%9.1f %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3526 /* Finally the last one */
3527 j = ir->opts.anneal_npoints[i]-1;
3528 if (ir->opts.annealing[i] == eannSINGLE)
3530 fprintf(stderr, "%9.1f- %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3532 else
3534 fprintf(stderr, "%9.1f %5.1f\n", ir->opts.anneal_time[i][j], ir->opts.anneal_temp[i][j]);
3535 if (fabs(ir->opts.anneal_temp[i][j]-ir->opts.anneal_temp[i][0]) > GMX_REAL_EPS)
3537 warning_note(wi, "There is a temperature jump when your annealing loops back.\n");
3546 if (ir->bPull)
3548 make_pull_groups(ir->pull, is->pull_grp, grps, gnames);
3550 make_pull_coords(ir->pull);
3553 if (ir->bRot)
3555 make_rotation_groups(ir->rot, is->rot_grp, grps, gnames);
3558 if (ir->eSwapCoords != eswapNO)
3560 make_swap_groups(ir->swap, swapgrp, splitgrp0, splitgrp1, solgrp, grps, gnames);
3563 /* Make indices for IMD session */
3564 if (ir->bIMD)
3566 make_IMD_group(ir->imd, is->imd_grp, grps, gnames);
3569 nacc = str_nelem(is->acc, MAXPTR, ptr1);
3570 nacg = str_nelem(is->accgrps, MAXPTR, ptr2);
3571 if (nacg*DIM != nacc)
3573 gmx_fatal(FARGS, "Invalid Acceleration input: %d groups and %d acc. values",
3574 nacg, nacc);
3576 do_numbering(natoms, groups, nacg, ptr2, grps, gnames, egcACC,
3577 restnm, egrptpALL_GENREST, bVerbose, wi);
3578 nr = groups->grps[egcACC].nr;
3579 snew(ir->opts.acc, nr);
3580 ir->opts.ngacc = nr;
3582 for (i = k = 0; (i < nacg); i++)
3584 for (j = 0; (j < DIM); j++, k++)
3586 ir->opts.acc[i][j] = strtod(ptr1[k], &endptr);
3587 if (*endptr != 0)
3589 warning_error(wi, "Invalid value for mdp option accelerate. accelerate should only consist of real numbers separated by spaces.");
3593 for (; (i < nr); i++)
3595 for (j = 0; (j < DIM); j++)
3597 ir->opts.acc[i][j] = 0;
3601 nfrdim = str_nelem(is->frdim, MAXPTR, ptr1);
3602 nfreeze = str_nelem(is->freeze, MAXPTR, ptr2);
3603 if (nfrdim != DIM*nfreeze)
3605 gmx_fatal(FARGS, "Invalid Freezing input: %d groups and %d freeze values",
3606 nfreeze, nfrdim);
3608 do_numbering(natoms, groups, nfreeze, ptr2, grps, gnames, egcFREEZE,
3609 restnm, egrptpALL_GENREST, bVerbose, wi);
3610 nr = groups->grps[egcFREEZE].nr;
3611 ir->opts.ngfrz = nr;
3612 snew(ir->opts.nFreeze, nr);
3613 for (i = k = 0; (i < nfreeze); i++)
3615 for (j = 0; (j < DIM); j++, k++)
3617 ir->opts.nFreeze[i][j] = (gmx_strncasecmp(ptr1[k], "Y", 1) == 0);
3618 if (!ir->opts.nFreeze[i][j])
3620 if (gmx_strncasecmp(ptr1[k], "N", 1) != 0)
3622 sprintf(warnbuf, "Please use Y(ES) or N(O) for freezedim only "
3623 "(not %s)", ptr1[k]);
3624 warning(wi, warn_buf);
3629 for (; (i < nr); i++)
3631 for (j = 0; (j < DIM); j++)
3633 ir->opts.nFreeze[i][j] = 0;
3637 nenergy = str_nelem(is->energy, MAXPTR, ptr1);
3638 do_numbering(natoms, groups, nenergy, ptr1, grps, gnames, egcENER,
3639 restnm, egrptpALL_GENREST, bVerbose, wi);
3640 add_wall_energrps(groups, ir->nwall, symtab);
3641 ir->opts.ngener = groups->grps[egcENER].nr;
3642 nvcm = str_nelem(is->vcm, MAXPTR, ptr1);
3643 bRest =
3644 do_numbering(natoms, groups, nvcm, ptr1, grps, gnames, egcVCM,
3645 restnm, nvcm == 0 ? egrptpALL_GENREST : egrptpPART, bVerbose, wi);
3646 if (bRest)
3648 warning(wi, "Some atoms are not part of any center of mass motion removal group.\n"
3649 "This may lead to artifacts.\n"
3650 "In most cases one should use one group for the whole system.");
3653 /* Now we have filled the freeze struct, so we can calculate NRDF */
3654 calc_nrdf(mtop, ir, gnames);
3656 nuser = str_nelem(is->user1, MAXPTR, ptr1);
3657 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser1,
3658 restnm, egrptpALL_GENREST, bVerbose, wi);
3659 nuser = str_nelem(is->user2, MAXPTR, ptr1);
3660 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcUser2,
3661 restnm, egrptpALL_GENREST, bVerbose, wi);
3662 nuser = str_nelem(is->x_compressed_groups, MAXPTR, ptr1);
3663 do_numbering(natoms, groups, nuser, ptr1, grps, gnames, egcCompressedX,
3664 restnm, egrptpONE, bVerbose, wi);
3665 nofg = str_nelem(is->orirefitgrp, MAXPTR, ptr1);
3666 do_numbering(natoms, groups, nofg, ptr1, grps, gnames, egcORFIT,
3667 restnm, egrptpALL_GENREST, bVerbose, wi);
3669 /* QMMM input processing */
3670 nQMg = str_nelem(is->QMMM, MAXPTR, ptr1);
3671 nQMmethod = str_nelem(is->QMmethod, MAXPTR, ptr2);
3672 nQMbasis = str_nelem(is->QMbasis, MAXPTR, ptr3);
3673 if ((nQMmethod != nQMg) || (nQMbasis != nQMg))
3675 gmx_fatal(FARGS, "Invalid QMMM input: %d groups %d basissets"
3676 " and %d methods\n", nQMg, nQMbasis, nQMmethod);
3678 /* group rest, if any, is always MM! */
3679 do_numbering(natoms, groups, nQMg, ptr1, grps, gnames, egcQMMM,
3680 restnm, egrptpALL_GENREST, bVerbose, wi);
3681 nr = nQMg; /*atoms->grps[egcQMMM].nr;*/
3682 ir->opts.ngQM = nQMg;
3683 snew(ir->opts.QMmethod, nr);
3684 snew(ir->opts.QMbasis, nr);
3685 for (i = 0; i < nr; i++)
3687 /* input consists of strings: RHF CASSCF PM3 .. These need to be
3688 * converted to the corresponding enum in names.c
3690 ir->opts.QMmethod[i] = search_QMstring(ptr2[i], eQMmethodNR,
3691 eQMmethod_names);
3692 ir->opts.QMbasis[i] = search_QMstring(ptr3[i], eQMbasisNR,
3693 eQMbasis_names);
3696 str_nelem(is->QMmult, MAXPTR, ptr1);
3697 str_nelem(is->QMcharge, MAXPTR, ptr2);
3698 str_nelem(is->bSH, MAXPTR, ptr3);
3699 snew(ir->opts.QMmult, nr);
3700 snew(ir->opts.QMcharge, nr);
3701 snew(ir->opts.bSH, nr);
3703 for (i = 0; i < nr; i++)
3705 ir->opts.QMmult[i] = strtol(ptr1[i], &endptr, 10);
3706 if (*endptr != 0)
3708 warning_error(wi, "Invalid value for mdp option QMmult. QMmult should only consist of integers separated by spaces.");
3710 ir->opts.QMcharge[i] = strtol(ptr2[i], &endptr, 10);
3711 if (*endptr != 0)
3713 warning_error(wi, "Invalid value for mdp option QMcharge. QMcharge should only consist of integers separated by spaces.");
3715 ir->opts.bSH[i] = (gmx_strncasecmp(ptr3[i], "Y", 1) == 0);
3718 str_nelem(is->CASelectrons, MAXPTR, ptr1);
3719 str_nelem(is->CASorbitals, MAXPTR, ptr2);
3720 snew(ir->opts.CASelectrons, nr);
3721 snew(ir->opts.CASorbitals, nr);
3722 for (i = 0; i < nr; i++)
3724 ir->opts.CASelectrons[i] = strtol(ptr1[i], &endptr, 10);
3725 if (*endptr != 0)
3727 warning_error(wi, "Invalid value for mdp option CASelectrons. CASelectrons should only consist of integers separated by spaces.");
3729 ir->opts.CASorbitals[i] = strtol(ptr2[i], &endptr, 10);
3730 if (*endptr != 0)
3732 warning_error(wi, "Invalid value for mdp option CASorbitals. CASorbitals should only consist of integers separated by spaces.");
3735 /* special optimization options */
3737 str_nelem(is->bOPT, MAXPTR, ptr1);
3738 str_nelem(is->bTS, MAXPTR, ptr2);
3739 snew(ir->opts.bOPT, nr);
3740 snew(ir->opts.bTS, nr);
3741 for (i = 0; i < nr; i++)
3743 ir->opts.bOPT[i] = (gmx_strncasecmp(ptr1[i], "Y", 1) == 0);
3744 ir->opts.bTS[i] = (gmx_strncasecmp(ptr2[i], "Y", 1) == 0);
3746 str_nelem(is->SAon, MAXPTR, ptr1);
3747 str_nelem(is->SAoff, MAXPTR, ptr2);
3748 str_nelem(is->SAsteps, MAXPTR, ptr3);
3749 snew(ir->opts.SAon, nr);
3750 snew(ir->opts.SAoff, nr);
3751 snew(ir->opts.SAsteps, nr);
3753 for (i = 0; i < nr; i++)
3755 ir->opts.SAon[i] = strtod(ptr1[i], &endptr);
3756 if (*endptr != 0)
3758 warning_error(wi, "Invalid value for mdp option SAon. SAon should only consist of real numbers separated by spaces.");
3760 ir->opts.SAoff[i] = strtod(ptr2[i], &endptr);
3761 if (*endptr != 0)
3763 warning_error(wi, "Invalid value for mdp option SAoff. SAoff should only consist of real numbers separated by spaces.");
3765 ir->opts.SAsteps[i] = strtol(ptr3[i], &endptr, 10);
3766 if (*endptr != 0)
3768 warning_error(wi, "Invalid value for mdp option SAsteps. SAsteps should only consist of integers separated by spaces.");
3771 /* end of QMMM input */
3773 if (bVerbose)
3775 for (i = 0; (i < egcNR); i++)
3777 fprintf(stderr, "%-16s has %d element(s):", gtypes[i], groups->grps[i].nr);
3778 for (j = 0; (j < groups->grps[i].nr); j++)
3780 fprintf(stderr, " %s", *(groups->grpname[groups->grps[i].nm_ind[j]]));
3782 fprintf(stderr, "\n");
3786 nr = groups->grps[egcENER].nr;
3787 snew(ir->opts.egp_flags, nr*nr);
3789 bExcl = do_egp_flag(ir, groups, "energygrp-excl", is->egpexcl, EGP_EXCL);
3790 if (bExcl && ir->cutoff_scheme == ecutsVERLET)
3792 warning_error(wi, "Energy group exclusions are not (yet) implemented for the Verlet scheme");
3794 if (bExcl && EEL_FULL(ir->coulombtype))
3796 warning(wi, "Can not exclude the lattice Coulomb energy between energy groups");
3799 bTable = do_egp_flag(ir, groups, "energygrp-table", is->egptable, EGP_TABLE);
3800 if (bTable && !(ir->vdwtype == evdwUSER) &&
3801 !(ir->coulombtype == eelUSER) && !(ir->coulombtype == eelPMEUSER) &&
3802 !(ir->coulombtype == eelPMEUSERSWITCH))
3804 gmx_fatal(FARGS, "Can only have energy group pair tables in combination with user tables for VdW and/or Coulomb");
3807 decode_cos(is->efield_x, &(ir->ex[XX]));
3808 decode_cos(is->efield_xt, &(ir->et[XX]));
3809 decode_cos(is->efield_y, &(ir->ex[YY]));
3810 decode_cos(is->efield_yt, &(ir->et[YY]));
3811 decode_cos(is->efield_z, &(ir->ex[ZZ]));
3812 decode_cos(is->efield_zt, &(ir->et[ZZ]));
3814 if (ir->bAdress)
3816 do_adress_index(ir->adress, groups, gnames, &(ir->opts), wi);
3819 for (i = 0; (i < grps->nr); i++)
3821 sfree(gnames[i]);
3823 sfree(gnames);
3824 done_blocka(grps);
3825 sfree(grps);
3831 static void check_disre(gmx_mtop_t *mtop)
3833 gmx_ffparams_t *ffparams;
3834 t_functype *functype;
3835 t_iparams *ip;
3836 int i, ndouble, ftype;
3837 int label, old_label;
3839 if (gmx_mtop_ftype_count(mtop, F_DISRES) > 0)
3841 ffparams = &mtop->ffparams;
3842 functype = ffparams->functype;
3843 ip = ffparams->iparams;
3844 ndouble = 0;
3845 old_label = -1;
3846 for (i = 0; i < ffparams->ntypes; i++)
3848 ftype = functype[i];
3849 if (ftype == F_DISRES)
3851 label = ip[i].disres.label;
3852 if (label == old_label)
3854 fprintf(stderr, "Distance restraint index %d occurs twice\n", label);
3855 ndouble++;
3857 old_label = label;
3860 if (ndouble > 0)
3862 gmx_fatal(FARGS, "Found %d double distance restraint indices,\n"
3863 "probably the parameters for multiple pairs in one restraint "
3864 "are not identical\n", ndouble);
3869 static gmx_bool absolute_reference(t_inputrec *ir, gmx_mtop_t *sys,
3870 gmx_bool posres_only,
3871 ivec AbsRef)
3873 int d, g, i;
3874 gmx_mtop_ilistloop_t iloop;
3875 t_ilist *ilist;
3876 int nmol;
3877 t_iparams *pr;
3879 clear_ivec(AbsRef);
3881 if (!posres_only)
3883 /* Check the COM */
3884 for (d = 0; d < DIM; d++)
3886 AbsRef[d] = (d < ndof_com(ir) ? 0 : 1);
3888 /* Check for freeze groups */
3889 for (g = 0; g < ir->opts.ngfrz; g++)
3891 for (d = 0; d < DIM; d++)
3893 if (ir->opts.nFreeze[g][d] != 0)
3895 AbsRef[d] = 1;
3901 /* Check for position restraints */
3902 iloop = gmx_mtop_ilistloop_init(sys);
3903 while (gmx_mtop_ilistloop_next(iloop, &ilist, &nmol))
3905 if (nmol > 0 &&
3906 (AbsRef[XX] == 0 || AbsRef[YY] == 0 || AbsRef[ZZ] == 0))
3908 for (i = 0; i < ilist[F_POSRES].nr; i += 2)
3910 pr = &sys->ffparams.iparams[ilist[F_POSRES].iatoms[i]];
3911 for (d = 0; d < DIM; d++)
3913 if (pr->posres.fcA[d] != 0)
3915 AbsRef[d] = 1;
3919 for (i = 0; i < ilist[F_FBPOSRES].nr; i += 2)
3921 /* Check for flat-bottom posres */
3922 pr = &sys->ffparams.iparams[ilist[F_FBPOSRES].iatoms[i]];
3923 if (pr->fbposres.k != 0)
3925 switch (pr->fbposres.geom)
3927 case efbposresSPHERE:
3928 AbsRef[XX] = AbsRef[YY] = AbsRef[ZZ] = 1;
3929 break;
3930 case efbposresCYLINDERX:
3931 AbsRef[YY] = AbsRef[ZZ] = 1;
3932 break;
3933 case efbposresCYLINDERY:
3934 AbsRef[XX] = AbsRef[ZZ] = 1;
3935 break;
3936 case efbposresCYLINDER:
3937 /* efbposres is a synonym for efbposresCYLINDERZ for backwards compatibility */
3938 case efbposresCYLINDERZ:
3939 AbsRef[XX] = AbsRef[YY] = 1;
3940 break;
3941 case efbposresX: /* d=XX */
3942 case efbposresY: /* d=YY */
3943 case efbposresZ: /* d=ZZ */
3944 d = pr->fbposres.geom - efbposresX;
3945 AbsRef[d] = 1;
3946 break;
3947 default:
3948 gmx_fatal(FARGS, " Invalid geometry for flat-bottom position restraint.\n"
3949 "Expected nr between 1 and %d. Found %d\n", efbposresNR-1,
3950 pr->fbposres.geom);
3957 return (AbsRef[XX] != 0 && AbsRef[YY] != 0 && AbsRef[ZZ] != 0);
3960 static void
3961 check_combination_rule_differences(const gmx_mtop_t *mtop, int state,
3962 gmx_bool *bC6ParametersWorkWithGeometricRules,
3963 gmx_bool *bC6ParametersWorkWithLBRules,
3964 gmx_bool *bLBRulesPossible)
3966 int ntypes, tpi, tpj;
3967 int *typecount;
3968 real tol;
3969 double c6i, c6j, c12i, c12j;
3970 double c6, c6_geometric, c6_LB;
3971 double sigmai, sigmaj, epsi, epsj;
3972 gmx_bool bCanDoLBRules, bCanDoGeometricRules;
3973 const char *ptr;
3975 /* A tolerance of 1e-5 seems reasonable for (possibly hand-typed)
3976 * force-field floating point parameters.
3978 tol = 1e-5;
3979 ptr = getenv("GMX_LJCOMB_TOL");
3980 if (ptr != NULL)
3982 double dbl;
3984 sscanf(ptr, "%lf", &dbl);
3985 tol = dbl;
3988 *bC6ParametersWorkWithLBRules = TRUE;
3989 *bC6ParametersWorkWithGeometricRules = TRUE;
3990 bCanDoLBRules = TRUE;
3991 ntypes = mtop->ffparams.atnr;
3992 snew(typecount, ntypes);
3993 gmx_mtop_count_atomtypes(mtop, state, typecount);
3994 *bLBRulesPossible = TRUE;
3995 for (tpi = 0; tpi < ntypes; ++tpi)
3997 c6i = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c6;
3998 c12i = mtop->ffparams.iparams[(ntypes + 1) * tpi].lj.c12;
3999 for (tpj = tpi; tpj < ntypes; ++tpj)
4001 c6j = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c6;
4002 c12j = mtop->ffparams.iparams[(ntypes + 1) * tpj].lj.c12;
4003 c6 = mtop->ffparams.iparams[ntypes * tpi + tpj].lj.c6;
4004 c6_geometric = std::sqrt(c6i * c6j);
4005 if (!gmx_numzero(c6_geometric))
4007 if (!gmx_numzero(c12i) && !gmx_numzero(c12j))
4009 sigmai = std::pow(c12i / c6i, 1.0/6.0);
4010 sigmaj = std::pow(c12j / c6j, 1.0/6.0);
4011 epsi = c6i * c6i /(4.0 * c12i);
4012 epsj = c6j * c6j /(4.0 * c12j);
4013 c6_LB = 4.0 * std::pow(epsi * epsj, 1.0/2.0) * std::pow(0.5 * (sigmai + sigmaj), 6);
4015 else
4017 *bLBRulesPossible = FALSE;
4018 c6_LB = c6_geometric;
4020 bCanDoLBRules = gmx_within_tol(c6_LB, c6, tol);
4023 if (FALSE == bCanDoLBRules)
4025 *bC6ParametersWorkWithLBRules = FALSE;
4028 bCanDoGeometricRules = gmx_within_tol(c6_geometric, c6, tol);
4030 if (FALSE == bCanDoGeometricRules)
4032 *bC6ParametersWorkWithGeometricRules = FALSE;
4036 sfree(typecount);
4039 static void
4040 check_combination_rules(const t_inputrec *ir, const gmx_mtop_t *mtop,
4041 warninp_t wi)
4043 gmx_bool bLBRulesPossible, bC6ParametersWorkWithGeometricRules, bC6ParametersWorkWithLBRules;
4045 check_combination_rule_differences(mtop, 0,
4046 &bC6ParametersWorkWithGeometricRules,
4047 &bC6ParametersWorkWithLBRules,
4048 &bLBRulesPossible);
4049 if (ir->ljpme_combination_rule == eljpmeLB)
4051 if (FALSE == bC6ParametersWorkWithLBRules || FALSE == bLBRulesPossible)
4053 warning(wi, "You are using arithmetic-geometric combination rules "
4054 "in LJ-PME, but your non-bonded C6 parameters do not "
4055 "follow these rules.");
4058 else
4060 if (FALSE == bC6ParametersWorkWithGeometricRules)
4062 if (ir->eDispCorr != edispcNO)
4064 warning_note(wi, "You are using geometric combination rules in "
4065 "LJ-PME, but your non-bonded C6 parameters do "
4066 "not follow these rules. "
4067 "This will introduce very small errors in the forces and energies in "
4068 "your simulations. Dispersion correction will correct total energy "
4069 "and/or pressure for isotropic systems, but not forces or surface tensions.");
4071 else
4073 warning_note(wi, "You are using geometric combination rules in "
4074 "LJ-PME, but your non-bonded C6 parameters do "
4075 "not follow these rules. "
4076 "This will introduce very small errors in the forces and energies in "
4077 "your simulations. If your system is homogeneous, consider using dispersion correction "
4078 "for the total energy and pressure.");
4084 void triple_check(const char *mdparin, t_inputrec *ir, gmx_mtop_t *sys,
4085 warninp_t wi)
4087 char err_buf[STRLEN];
4088 int i, m, c, nmol;
4089 gmx_bool bCharge, bAcc;
4090 real *mgrp, mt;
4091 rvec acc;
4092 gmx_mtop_atomloop_block_t aloopb;
4093 gmx_mtop_atomloop_all_t aloop;
4094 t_atom *atom;
4095 ivec AbsRef;
4096 char warn_buf[STRLEN];
4098 set_warning_line(wi, mdparin, -1);
4100 if (ir->cutoff_scheme == ecutsVERLET &&
4101 ir->verletbuf_tol > 0 &&
4102 ir->nstlist > 1 &&
4103 ((EI_MD(ir->eI) || EI_SD(ir->eI)) &&
4104 (ir->etc == etcVRESCALE || ir->etc == etcBERENDSEN)))
4106 /* Check if a too small Verlet buffer might potentially
4107 * cause more drift than the thermostat can couple off.
4109 /* Temperature error fraction for warning and suggestion */
4110 const real T_error_warn = 0.002;
4111 const real T_error_suggest = 0.001;
4112 /* For safety: 2 DOF per atom (typical with constraints) */
4113 const real nrdf_at = 2;
4114 real T, tau, max_T_error;
4115 int i;
4117 T = 0;
4118 tau = 0;
4119 for (i = 0; i < ir->opts.ngtc; i++)
4121 T = std::max(T, ir->opts.ref_t[i]);
4122 tau = std::max(tau, ir->opts.tau_t[i]);
4124 if (T > 0)
4126 /* This is a worst case estimate of the temperature error,
4127 * assuming perfect buffer estimation and no cancelation
4128 * of errors. The factor 0.5 is because energy distributes
4129 * equally over Ekin and Epot.
4131 max_T_error = 0.5*tau*ir->verletbuf_tol/(nrdf_at*BOLTZ*T);
4132 if (max_T_error > T_error_warn)
4134 sprintf(warn_buf, "With a verlet-buffer-tolerance of %g kJ/mol/ps, a reference temperature of %g and a tau_t of %g, your temperature might be off by up to %.1f%%. To ensure the error is below %.1f%%, decrease verlet-buffer-tolerance to %.0e or decrease tau_t.",
4135 ir->verletbuf_tol, T, tau,
4136 100*max_T_error,
4137 100*T_error_suggest,
4138 ir->verletbuf_tol*T_error_suggest/max_T_error);
4139 warning(wi, warn_buf);
4144 if (ETC_ANDERSEN(ir->etc))
4146 int i;
4148 for (i = 0; i < ir->opts.ngtc; i++)
4150 sprintf(err_buf, "all tau_t must currently be equal using Andersen temperature control, violated for group %d", i);
4151 CHECK(ir->opts.tau_t[0] != ir->opts.tau_t[i]);
4152 sprintf(err_buf, "all tau_t must be postive using Andersen temperature control, tau_t[%d]=%10.6f",
4153 i, ir->opts.tau_t[i]);
4154 CHECK(ir->opts.tau_t[i] < 0);
4157 for (i = 0; i < ir->opts.ngtc; i++)
4159 int nsteps = (int)(ir->opts.tau_t[i]/ir->delta_t);
4160 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);
4161 CHECK((nsteps % ir->nstcomm) && (ir->etc == etcANDERSENMASSIVE));
4165 if (EI_DYNAMICS(ir->eI) && !EI_SD(ir->eI) && ir->eI != eiBD &&
4166 ir->comm_mode == ecmNO &&
4167 !(absolute_reference(ir, sys, FALSE, AbsRef) || ir->nsteps <= 10) &&
4168 !ETC_ANDERSEN(ir->etc))
4170 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");
4173 /* Check for pressure coupling with absolute position restraints */
4174 if (ir->epc != epcNO && ir->refcoord_scaling == erscNO)
4176 absolute_reference(ir, sys, TRUE, AbsRef);
4178 for (m = 0; m < DIM; m++)
4180 if (AbsRef[m] && norm2(ir->compress[m]) > 0)
4182 warning(wi, "You are using pressure coupling with absolute position restraints, this will give artifacts. Use the refcoord_scaling option.");
4183 break;
4189 bCharge = FALSE;
4190 aloopb = gmx_mtop_atomloop_block_init(sys);
4191 while (gmx_mtop_atomloop_block_next(aloopb, &atom, &nmol))
4193 if (atom->q != 0 || atom->qB != 0)
4195 bCharge = TRUE;
4199 if (!bCharge)
4201 if (EEL_FULL(ir->coulombtype))
4203 sprintf(err_buf,
4204 "You are using full electrostatics treatment %s for a system without charges.\n"
4205 "This costs a lot of performance for just processing zeros, consider using %s instead.\n",
4206 EELTYPE(ir->coulombtype), EELTYPE(eelCUT));
4207 warning(wi, err_buf);
4210 else
4212 if (ir->coulombtype == eelCUT && ir->rcoulomb > 0 && !ir->implicit_solvent)
4214 sprintf(err_buf,
4215 "You are using a plain Coulomb cut-off, which might produce artifacts.\n"
4216 "You might want to consider using %s electrostatics.\n",
4217 EELTYPE(eelPME));
4218 warning_note(wi, err_buf);
4222 /* Check if combination rules used in LJ-PME are the same as in the force field */
4223 if (EVDW_PME(ir->vdwtype))
4225 check_combination_rules(ir, sys, wi);
4228 /* Generalized reaction field */
4229 if (ir->opts.ngtc == 0)
4231 sprintf(err_buf, "No temperature coupling while using coulombtype %s",
4232 eel_names[eelGRF]);
4233 CHECK(ir->coulombtype == eelGRF);
4235 else
4237 sprintf(err_buf, "When using coulombtype = %s"
4238 " ref-t for temperature coupling should be > 0",
4239 eel_names[eelGRF]);
4240 CHECK((ir->coulombtype == eelGRF) && (ir->opts.ref_t[0] <= 0));
4243 if (ir->eI == eiSD2)
4245 sprintf(warn_buf, "The stochastic dynamics integrator %s is deprecated, since\n"
4246 "it is slower than integrator %s and is slightly less accurate\n"
4247 "with constraints. Use the %s integrator.",
4248 ei_names[ir->eI], ei_names[eiSD1], ei_names[eiSD1]);
4249 warning_note(wi, warn_buf);
4252 bAcc = FALSE;
4253 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4255 for (m = 0; (m < DIM); m++)
4257 if (fabs(ir->opts.acc[i][m]) > 1e-6)
4259 bAcc = TRUE;
4263 if (bAcc)
4265 clear_rvec(acc);
4266 snew(mgrp, sys->groups.grps[egcACC].nr);
4267 aloop = gmx_mtop_atomloop_all_init(sys);
4268 while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
4270 mgrp[ggrpnr(&sys->groups, egcACC, i)] += atom->m;
4272 mt = 0.0;
4273 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4275 for (m = 0; (m < DIM); m++)
4277 acc[m] += ir->opts.acc[i][m]*mgrp[i];
4279 mt += mgrp[i];
4281 for (m = 0; (m < DIM); m++)
4283 if (fabs(acc[m]) > 1e-6)
4285 const char *dim[DIM] = { "X", "Y", "Z" };
4286 fprintf(stderr,
4287 "Net Acceleration in %s direction, will %s be corrected\n",
4288 dim[m], ir->nstcomm != 0 ? "" : "not");
4289 if (ir->nstcomm != 0 && m < ndof_com(ir))
4291 acc[m] /= mt;
4292 for (i = 0; (i < sys->groups.grps[egcACC].nr); i++)
4294 ir->opts.acc[i][m] -= acc[m];
4299 sfree(mgrp);
4302 if (ir->efep != efepNO && ir->fepvals->sc_alpha != 0 &&
4303 !gmx_within_tol(sys->ffparams.reppow, 12.0, 10*GMX_DOUBLE_EPS))
4305 gmx_fatal(FARGS, "Soft-core interactions are only supported with VdW repulsion power 12");
4308 if (ir->bPull)
4310 gmx_bool bWarned;
4312 bWarned = FALSE;
4313 for (i = 0; i < ir->pull->ncoord && !bWarned; i++)
4315 if (ir->pull->coord[i].group[0] == 0 ||
4316 ir->pull->coord[i].group[1] == 0)
4318 absolute_reference(ir, sys, FALSE, AbsRef);
4319 for (m = 0; m < DIM; m++)
4321 if (ir->pull->coord[i].dim[m] && !AbsRef[m])
4323 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.");
4324 bWarned = TRUE;
4325 break;
4331 for (i = 0; i < 3; i++)
4333 for (m = 0; m <= i; m++)
4335 if ((ir->epc != epcNO && ir->compress[i][m] != 0) ||
4336 ir->deform[i][m] != 0)
4338 for (c = 0; c < ir->pull->ncoord; c++)
4340 if (ir->pull->coord[c].eGeom == epullgDIRPBC &&
4341 ir->pull->coord[c].vec[m] != 0)
4343 gmx_fatal(FARGS, "Can not have dynamic box while using pull geometry '%s' (dim %c)", EPULLGEOM(ir->pull->coord[c].eGeom), 'x'+m);
4351 check_disre(sys);
4354 void double_check(t_inputrec *ir, matrix box,
4355 gmx_bool bHasNormalConstraints,
4356 gmx_bool bHasAnyConstraints,
4357 warninp_t wi)
4359 real min_size;
4360 gmx_bool bTWIN;
4361 char warn_buf[STRLEN];
4362 const char *ptr;
4364 ptr = check_box(ir->ePBC, box);
4365 if (ptr)
4367 warning_error(wi, ptr);
4370 if (bHasNormalConstraints && ir->eConstrAlg == econtSHAKE)
4372 if (ir->shake_tol <= 0.0)
4374 sprintf(warn_buf, "ERROR: shake-tol must be > 0 instead of %g\n",
4375 ir->shake_tol);
4376 warning_error(wi, warn_buf);
4379 if (IR_TWINRANGE(*ir) && ir->nstlist > 1)
4381 sprintf(warn_buf, "With twin-range cut-off's and SHAKE the virial and the pressure are incorrect.");
4382 if (ir->epc == epcNO)
4384 warning(wi, warn_buf);
4386 else
4388 warning_error(wi, warn_buf);
4393 if ( (ir->eConstrAlg == econtLINCS) && bHasNormalConstraints)
4395 /* If we have Lincs constraints: */
4396 if (ir->eI == eiMD && ir->etc == etcNO &&
4397 ir->eConstrAlg == econtLINCS && ir->nLincsIter == 1)
4399 sprintf(warn_buf, "For energy conservation with LINCS, lincs_iter should be 2 or larger.\n");
4400 warning_note(wi, warn_buf);
4403 if ((ir->eI == eiCG || ir->eI == eiLBFGS) && (ir->nProjOrder < 8))
4405 sprintf(warn_buf, "For accurate %s with LINCS constraints, lincs-order should be 8 or more.", ei_names[ir->eI]);
4406 warning_note(wi, warn_buf);
4408 if (ir->epc == epcMTTK)
4410 warning_error(wi, "MTTK not compatible with lincs -- use shake instead.");
4414 if (bHasAnyConstraints && ir->epc == epcMTTK)
4416 warning_error(wi, "Constraints are not implemented with MTTK pressure control.");
4419 if (ir->LincsWarnAngle > 90.0)
4421 sprintf(warn_buf, "lincs-warnangle can not be larger than 90 degrees, setting it to 90.\n");
4422 warning(wi, warn_buf);
4423 ir->LincsWarnAngle = 90.0;
4426 if (ir->ePBC != epbcNONE)
4428 if (ir->nstlist == 0)
4430 warning(wi, "With nstlist=0 atoms are only put into the box at step 0, therefore drifting atoms might cause the simulation to crash.");
4432 bTWIN = (ir->rlistlong > ir->rlist);
4433 if (ir->ns_type == ensGRID)
4435 if (sqr(ir->rlistlong) >= max_cutoff2(ir->ePBC, box))
4437 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",
4438 bTWIN ? (ir->rcoulomb == ir->rlistlong ? "rcoulomb" : "rvdw") : "rlist");
4439 warning_error(wi, warn_buf);
4442 else
4444 min_size = std::min(box[XX][XX], std::min(box[YY][YY], box[ZZ][ZZ]));
4445 if (2*ir->rlistlong >= min_size)
4447 sprintf(warn_buf, "ERROR: One of the box lengths is smaller than twice the cut-off length. Increase the box size or decrease rlist.");
4448 warning_error(wi, warn_buf);
4449 if (TRICLINIC(box))
4451 fprintf(stderr, "Grid search might allow larger cut-off's than simple search with triclinic boxes.");
4458 void check_chargegroup_radii(const gmx_mtop_t *mtop, const t_inputrec *ir,
4459 rvec *x,
4460 warninp_t wi)
4462 real rvdw1, rvdw2, rcoul1, rcoul2;
4463 char warn_buf[STRLEN];
4465 calc_chargegroup_radii(mtop, x, &rvdw1, &rvdw2, &rcoul1, &rcoul2);
4467 if (rvdw1 > 0)
4469 printf("Largest charge group radii for Van der Waals: %5.3f, %5.3f nm\n",
4470 rvdw1, rvdw2);
4472 if (rcoul1 > 0)
4474 printf("Largest charge group radii for Coulomb: %5.3f, %5.3f nm\n",
4475 rcoul1, rcoul2);
4478 if (ir->rlist > 0)
4480 if (rvdw1 + rvdw2 > ir->rlist ||
4481 rcoul1 + rcoul2 > ir->rlist)
4483 sprintf(warn_buf,
4484 "The sum of the two largest charge group radii (%f) "
4485 "is larger than rlist (%f)\n",
4486 std::max(rvdw1+rvdw2, rcoul1+rcoul2), ir->rlist);
4487 warning(wi, warn_buf);
4489 else
4491 /* Here we do not use the zero at cut-off macro,
4492 * since user defined interactions might purposely
4493 * not be zero at the cut-off.
4495 if (ir_vdw_is_zero_at_cutoff(ir) &&
4496 rvdw1 + rvdw2 > ir->rlistlong - ir->rvdw)
4498 sprintf(warn_buf, "The sum of the two largest charge group "
4499 "radii (%f) is larger than %s (%f) - rvdw (%f).\n"
4500 "With exact cut-offs, better performance can be "
4501 "obtained with cutoff-scheme = %s, because it "
4502 "does not use charge groups at all.",
4503 rvdw1+rvdw2,
4504 ir->rlistlong > ir->rlist ? "rlistlong" : "rlist",
4505 ir->rlistlong, ir->rvdw,
4506 ecutscheme_names[ecutsVERLET]);
4507 if (ir_NVE(ir))
4509 warning(wi, warn_buf);
4511 else
4513 warning_note(wi, warn_buf);
4516 if (ir_coulomb_is_zero_at_cutoff(ir) &&
4517 rcoul1 + rcoul2 > ir->rlistlong - ir->rcoulomb)
4519 sprintf(warn_buf, "The sum of the two largest charge group radii (%f) is larger than %s (%f) - rcoulomb (%f).\n"
4520 "With exact cut-offs, better performance can be obtained with cutoff-scheme = %s, because it does not use charge groups at all.",
4521 rcoul1+rcoul2,
4522 ir->rlistlong > ir->rlist ? "rlistlong" : "rlist",
4523 ir->rlistlong, ir->rcoulomb,
4524 ecutscheme_names[ecutsVERLET]);
4525 if (ir_NVE(ir))
4527 warning(wi, warn_buf);
4529 else
4531 warning_note(wi, warn_buf);