1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; c-file-style: "stroustrup"; -*-
4 * This source code is part of
8 * GROningen MAchine for Chemical Simulations
11 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
12 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
13 * Copyright (c) 2001-2004, The GROMACS development team,
14 * check out http://www.gromacs.org for more information.
16 * This program is free software; you can redistribute it and/or
17 * modify it under the terms of the GNU General Public License
18 * as published by the Free Software Foundation; either version 2
19 * of the License, or (at your option) any later version.
21 * If you want to redistribute modifications, please consider that
22 * scientific software is very special. Version control is crucial -
23 * bugs must be traceable. We will be happy to consider code for
24 * inclusion in the official distribution, but derived work must not
25 * be called official GROMACS. Details are found in the README & COPYING
26 * files - if they are missing, get the official version at www.gromacs.org.
28 * To help us fund GROMACS development, we humbly ask that you cite
29 * the papers on the package - you can find them in the top README file.
31 * For more info, check our website at http://www.gromacs.org
34 * Gallium Rubidium Oxygen Manganese Argon Carbon Silicon
48 #include "gmx_fatal.h"
61 #include "mtop_util.h"
62 #include "chargegroup.h"
67 #define MAXLAMBDAS 1024
69 /* Resource parameters
70 * Do not change any of these until you read the instruction
71 * in readinp.h. Some cpp's do not take spaces after the backslash
72 * (like the c-shell), which will give you a very weird compiler
76 static char tcgrps[STRLEN],tau_t[STRLEN],ref_t[STRLEN],
77 acc[STRLEN],accgrps[STRLEN],freeze[STRLEN],frdim[STRLEN],
78 energy[STRLEN],user1[STRLEN],user2[STRLEN],vcm[STRLEN],xtc_grps[STRLEN],
79 couple_moltype[STRLEN],orirefitgrp[STRLEN],egptable[STRLEN],egpexcl[STRLEN],
80 wall_atomtype[STRLEN],wall_density[STRLEN],deform[STRLEN],QMMM[STRLEN];
81 static char fep_lambda[efptNR][STRLEN];
82 static char lambda_weights[STRLEN];
83 static char **pull_grp;
84 static char **rot_grp;
85 static char anneal[STRLEN],anneal_npoints[STRLEN],
86 anneal_time[STRLEN],anneal_temp[STRLEN];
87 static char QMmethod[STRLEN],QMbasis[STRLEN],QMcharge[STRLEN],QMmult[STRLEN],
88 bSH[STRLEN],CASorbitals[STRLEN], CASelectrons[STRLEN],SAon[STRLEN],
89 SAoff[STRLEN],SAsteps[STRLEN],bTS[STRLEN],bOPT[STRLEN];
90 static char efield_x[STRLEN],efield_xt[STRLEN],efield_y[STRLEN],
91 efield_yt[STRLEN],efield_z[STRLEN],efield_zt[STRLEN];
94 egrptpALL, /* All particles have to be a member of a group. */
95 egrptpALL_GENREST, /* A rest group with name is generated for particles *
96 * that are not part of any group. */
97 egrptpPART, /* As egrptpALL_GENREST, but no name is generated *
98 * for the rest group. */
99 egrptpONE /* Merge all selected groups into one group, *
100 * make a rest group for the remaining particles. */
104 void init_ir(t_inputrec *ir, t_gromppopts *opts)
106 snew(opts->include,STRLEN);
107 snew(opts->define,STRLEN);
109 snew(ir->expandedvals,1);
110 snew(ir->simtempvals,1);
113 static void GetSimTemps(int ntemps, t_simtemp *simtemp, double *temperature_lambdas)
118 for (i=0;i<ntemps;i++)
120 /* simple linear scaling -- allows more control */
121 if (simtemp->eSimTempScale == esimtempLINEAR)
123 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*temperature_lambdas[i];
125 else if (simtemp->eSimTempScale == esimtempGEOMETRIC) /* should give roughly equal acceptance for constant heat capacity . . . */
127 simtemp->temperatures[i] = simtemp->simtemp_low * pow(simtemp->simtemp_high/simtemp->simtemp_low,(1.0*i)/(ntemps-1));
129 else if (simtemp->eSimTempScale == esimtempEXPONENTIAL)
131 simtemp->temperatures[i] = simtemp->simtemp_low + (simtemp->simtemp_high-simtemp->simtemp_low)*((exp(temperature_lambdas[i])-1)/(exp(1.0)-1));
136 sprintf(errorstr,"eSimTempScale=%d not defined",simtemp->eSimTempScale);
137 gmx_fatal(FARGS,errorstr);
144 static void _low_check(gmx_bool b,char *s,warninp_t wi)
152 static void check_nst(const char *desc_nst,int nst,
153 const char *desc_p,int *p,
158 if (*p > 0 && *p % nst != 0)
160 /* Round up to the next multiple of nst */
161 *p = ((*p)/nst + 1)*nst;
162 sprintf(buf,"%s should be a multiple of %s, changing %s to %d\n",
163 desc_p,desc_nst,desc_p,*p);
168 static gmx_bool ir_NVE(const t_inputrec *ir)
170 return ((ir->eI == eiMD || EI_VV(ir->eI)) && ir->etc == etcNO);
173 static int lcd(int n1,int n2)
178 for(i=2; (i<=n1 && i<=n2); i++)
180 if (n1 % i == 0 && n2 % i == 0)
189 static void process_interaction_modifier(const t_inputrec *ir,int *eintmod)
191 if (*eintmod == eintmodPOTSHIFT_VERLET)
193 if (ir->cutoff_scheme == ecutsVERLET)
195 *eintmod = eintmodPOTSHIFT;
199 *eintmod = eintmodNONE;
204 void check_ir(const char *mdparin,t_inputrec *ir, t_gromppopts *opts,
206 /* Check internal consistency */
208 /* Strange macro: first one fills the err_buf, and then one can check
209 * the condition, which will print the message and increase the error
212 #define CHECK(b) _low_check(b,err_buf,wi)
213 char err_buf[256],warn_buf[STRLEN];
219 t_lambda *fep = ir->fepvals;
220 t_expanded *expand = ir->expandedvals;
222 set_warning_line(wi,mdparin,-1);
224 /* BASIC CUT-OFF STUFF */
225 if (ir->rcoulomb < 0)
227 warning_error(wi,"rcoulomb should be >= 0");
231 warning_error(wi,"rvdw should be >= 0");
234 !(ir->cutoff_scheme == ecutsVERLET && ir->verletbuf_drift > 0))
236 warning_error(wi,"rlist should be >= 0");
239 process_interaction_modifier(ir,&ir->coulomb_modifier);
240 process_interaction_modifier(ir,&ir->vdw_modifier);
242 if (ir->cutoff_scheme == ecutsGROUP)
244 if (ir->coulomb_modifier != eintmodNONE ||
245 ir->vdw_modifier != eintmodNONE)
247 warning_error(wi,"potential modifiers are not supported (yet) with the group cut-off scheme");
250 /* BASIC CUT-OFF STUFF */
251 if (ir->rlist == 0 ||
252 !((EEL_MIGHT_BE_ZERO_AT_CUTOFF(ir->coulombtype) && ir->rcoulomb > ir->rlist) ||
253 (EVDW_MIGHT_BE_ZERO_AT_CUTOFF(ir->vdwtype) && ir->rvdw > ir->rlist))) {
254 /* No switched potential and/or no twin-range:
255 * we can set the long-range cut-off to the maximum of the other cut-offs.
257 ir->rlistlong = max_cutoff(ir->rlist,max_cutoff(ir->rvdw,ir->rcoulomb));
259 else if (ir->rlistlong < 0)
261 ir->rlistlong = max_cutoff(ir->rlist,max_cutoff(ir->rvdw,ir->rcoulomb));
262 sprintf(warn_buf,"rlistlong was not set, setting it to %g (no buffer)",
264 warning(wi,warn_buf);
266 if (ir->rlistlong == 0 && ir->ePBC != epbcNONE)
268 warning_error(wi,"Can not have an infinite cut-off with PBC");
270 if (ir->rlistlong > 0 && (ir->rlist == 0 || ir->rlistlong < ir->rlist))
272 warning_error(wi,"rlistlong can not be shorter than rlist");
274 if (IR_TWINRANGE(*ir) && ir->nstlist <= 0)
276 warning_error(wi,"Can not have nstlist<=0 with twin-range interactions");
280 if (ir->cutoff_scheme == ecutsVERLET)
284 /* Normal Verlet type neighbor-list, currently only limited feature support */
285 if (inputrec2nboundeddim(ir) < 3)
287 warning_error(wi,"With Verlet lists only full pbc or pbc=xy with walls is supported");
289 if (ir->rcoulomb != ir->rvdw)
291 warning_error(wi,"With Verlet lists rcoulomb!=rvdw is not supported");
293 if (ir->vdwtype != evdwCUT)
295 warning_error(wi,"With Verlet lists only cut-off LJ interactions are supported");
297 if (!(ir->coulombtype == eelCUT ||
298 (EEL_RF(ir->coulombtype) && ir->coulombtype != eelRF_NEC) ||
299 EEL_PME(ir->coulombtype) || ir->coulombtype == eelEWALD))
301 warning_error(wi,"With Verlet lists only cut-off, reaction-field, PME and Ewald electrostatics are supported");
304 if (ir->nstlist <= 0)
306 warning_error(wi,"With Verlet lists nstlist should be larger than 0");
309 if (ir->nstlist < 10)
311 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.");
314 rc_max = max(ir->rvdw,ir->rcoulomb);
316 if (ir->verletbuf_drift <= 0)
318 if (ir->verletbuf_drift == 0)
320 warning_error(wi,"Can not have an energy drift of exactly 0");
323 if (ir->rlist < rc_max)
325 warning_error(wi,"With verlet lists rlist can not be smaller than rvdw or rcoulomb");
328 if (ir->rlist == rc_max && ir->nstlist > 1)
330 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.");
335 if (ir->rlist > rc_max)
337 warning_note(wi,"You have set rlist larger than the interaction cut-off, but you also have verlet-buffer-drift > 0. Will set rlist using verlet-buffer-drift.");
340 if (ir->nstlist == 1)
342 /* No buffer required */
347 if (EI_DYNAMICS(ir->eI))
349 if (EI_MD(ir->eI) && ir->etc == etcNO)
351 warning_error(wi,"Temperature coupling is required for calculating rlist using the energy drift with verlet-buffer-drift > 0. Either use temperature coupling or set rlist yourself together with verlet-buffer-drift = -1.");
354 if (inputrec2nboundeddim(ir) < 3)
356 warning_error(wi,"The box volume is required for calculating rlist from the energy drift with verlet-buffer-drift > 0. You are using at least one unbounded dimension, so no volume can be computed. Either use a finite box, or set rlist yourself together with verlet-buffer-drift = -1.");
358 /* Set rlist temporarily so we can continue processing */
363 /* Set the buffer to 5% of the cut-off */
364 ir->rlist = 1.05*rc_max;
369 /* No twin-range calculations with Verlet lists */
370 ir->rlistlong = ir->rlist;
373 /* GENERAL INTEGRATOR STUFF */
374 if (!(ir->eI == eiMD || EI_VV(ir->eI)))
378 if (ir->eI == eiVVAK) {
379 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]);
380 warning_note(wi,warn_buf);
382 if (!EI_DYNAMICS(ir->eI))
386 if (EI_DYNAMICS(ir->eI))
388 if (ir->nstcalcenergy < 0)
390 ir->nstcalcenergy = ir_optimal_nstcalcenergy(ir);
391 if (ir->nstenergy != 0 && ir->nstenergy < ir->nstcalcenergy)
393 /* nstcalcenergy larger than nstener does not make sense.
394 * We ideally want nstcalcenergy=nstener.
398 ir->nstcalcenergy = lcd(ir->nstenergy,ir->nstlist);
402 ir->nstcalcenergy = ir->nstenergy;
406 else if (ir->nstenergy > 0 && ir->nstcalcenergy > ir->nstenergy)
408 /* If the user sets nstenergy small, we should respect that */
409 sprintf(warn_buf,"Setting nstcalcenergy (%d) equal to nstenergy (%d)",ir->nstcalcenergy,ir->nstenergy);
410 ir->nstcalcenergy = ir->nstenergy;
413 if (ir->epc != epcNO)
415 if (ir->nstpcouple < 0)
417 ir->nstpcouple = ir_optimal_nstpcouple(ir);
420 if (IR_TWINRANGE(*ir))
422 check_nst("nstlist",ir->nstlist,
423 "nstcalcenergy",&ir->nstcalcenergy,wi);
424 if (ir->epc != epcNO)
426 check_nst("nstlist",ir->nstlist,
427 "nstpcouple",&ir->nstpcouple,wi);
431 if (ir->nstcalcenergy > 1)
433 /* for storing exact averages nstenergy should be
434 * a multiple of nstcalcenergy
436 check_nst("nstcalcenergy",ir->nstcalcenergy,
437 "nstenergy",&ir->nstenergy,wi);
438 if (ir->efep != efepNO)
440 /* nstdhdl should be a multiple of nstcalcenergy */
441 check_nst("nstcalcenergy",ir->nstcalcenergy,
442 "nstdhdl",&ir->fepvals->nstdhdl,wi);
448 if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
449 ir->bContinuation && ir->ld_seed != -1) {
450 warning_note(wi,"You are doing a continuation with SD or BD, make sure that ld_seed is different from the previous run (using ld_seed=-1 will ensure this)");
454 if (EI_TPI(ir->eI)) {
455 sprintf(err_buf,"TPI only works with pbc = %s",epbc_names[epbcXYZ]);
456 CHECK(ir->ePBC != epbcXYZ);
457 sprintf(err_buf,"TPI only works with ns = %s",ens_names[ensGRID]);
458 CHECK(ir->ns_type != ensGRID);
459 sprintf(err_buf,"with TPI nstlist should be larger than zero");
460 CHECK(ir->nstlist <= 0);
461 sprintf(err_buf,"TPI does not work with full electrostatics other than PME");
462 CHECK(EEL_FULL(ir->coulombtype) && !EEL_PME(ir->coulombtype));
466 if ( (opts->nshake > 0) && (opts->bMorse) ) {
468 "Using morse bond-potentials while constraining bonds is useless");
469 warning(wi,warn_buf);
472 if ((EI_SD(ir->eI) || ir->eI == eiBD) &&
473 ir->bContinuation && ir->ld_seed != -1) {
474 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)");
476 /* verify simulated tempering options */
479 gmx_bool bAllTempZero = TRUE;
480 for (i=0;i<fep->n_lambda;i++)
482 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]);
483 CHECK((fep->all_lambda[efptTEMPERATURE][i] < 0) || (fep->all_lambda[efptTEMPERATURE][i] > 1));
484 if (fep->all_lambda[efptTEMPERATURE][i] > 0)
486 bAllTempZero = FALSE;
489 sprintf(err_buf,"if simulated tempering is on, temperature-lambdas may not be all zero");
490 CHECK(bAllTempZero==TRUE);
492 sprintf(err_buf,"Simulated tempering is currently only compatible with md-vv");
493 CHECK(ir->eI != eiVV);
495 /* check compatability of the temperature coupling with simulated tempering */
497 if (ir->etc == etcNOSEHOOVER) {
498 sprintf(warn_buf,"Nose-Hoover based temperature control such as [%s] my not be entirelyconsistent with simulated tempering",etcoupl_names[ir->etc]);
499 warning_note(wi,warn_buf);
502 /* check that the temperatures make sense */
504 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);
505 CHECK(ir->simtempvals->simtemp_high <= ir->simtempvals->simtemp_low);
507 sprintf(err_buf,"Higher simulated tempering temperature (%g) must be >= zero",ir->simtempvals->simtemp_high);
508 CHECK(ir->simtempvals->simtemp_high <= 0);
510 sprintf(err_buf,"Lower simulated tempering temperature (%g) must be >= zero",ir->simtempvals->simtemp_low);
511 CHECK(ir->simtempvals->simtemp_low <= 0);
514 /* verify free energy options */
516 if (ir->efep != efepNO) {
518 sprintf(err_buf,"The soft-core power is %d and can only be 1 or 2",
520 CHECK(fep->sc_alpha!=0 && fep->sc_power!=1 && fep->sc_power!=2);
522 sprintf(err_buf,"The soft-core sc-r-power is %d and can only be 6 or 48",
523 (int)fep->sc_r_power);
524 CHECK(fep->sc_alpha!=0 && fep->sc_r_power!=6.0 && fep->sc_r_power!=48.0);
526 /* check validity of options */
527 if (fep->n_lambda > 0 && ir->rlist < max(ir->rvdw,ir->rcoulomb))
530 "For foreign lambda free energy differences it is assumed that the soft-core interactions have no effect beyond the neighborlist cut-off");
531 warning(wi,warn_buf);
534 sprintf(err_buf,"Can't use postive delta-lambda (%g) if initial state/lambda does not start at zero",fep->delta_lambda);
535 CHECK(fep->delta_lambda > 0 && ((fep->init_fep_state !=0) || (fep->init_lambda !=0)));
537 sprintf(err_buf,"Can't use postive delta-lambda (%g) with expanded ensemble simulations",fep->delta_lambda);
538 CHECK(fep->delta_lambda > 0 && (ir->efep == efepEXPANDED));
540 sprintf(err_buf,"Free-energy not implemented for Ewald");
541 CHECK(ir->coulombtype==eelEWALD);
543 /* check validty of lambda inputs */
544 sprintf(err_buf,"initial thermodynamic state %d does not exist, only goes to %d",fep->init_fep_state,fep->n_lambda);
545 CHECK((fep->init_fep_state > fep->n_lambda));
547 for (j=0;j<efptNR;j++)
549 for (i=0;i<fep->n_lambda;i++)
551 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]);
552 CHECK((fep->all_lambda[j][i] < 0) || (fep->all_lambda[j][i] > 1));
556 if ((fep->sc_alpha>0) && (!fep->bScCoul))
558 for (i=0;i<fep->n_lambda;i++)
560 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],
561 fep->all_lambda[efptCOUL][i]);
562 CHECK((fep->sc_alpha>0) &&
563 (((fep->all_lambda[efptCOUL][i] > 0.0) &&
564 (fep->all_lambda[efptCOUL][i] < 1.0)) &&
565 ((fep->all_lambda[efptVDW][i] > 0.0) &&
566 (fep->all_lambda[efptVDW][i] < 1.0))));
570 if ((fep->bScCoul) && (EEL_PME(ir->coulombtype)))
572 sprintf(warn_buf,"With coulomb soft core, the reciprocal space calculation will not necessarily cancel. It may be necessary to decrease the reciprocal space energy, and increase the cutoff radius to get sufficiently close matches to energies with free energy turned off.");
573 warning(wi, warn_buf);
576 /* Free Energy Checks -- In an ideal world, slow growth and FEP would
577 be treated differently, but that's the next step */
579 for (i=0;i<efptNR;i++) {
580 for (j=0;j<fep->n_lambda;j++) {
581 sprintf(err_buf,"%s[%d] must be between 0 and 1",efpt_names[i],j);
582 CHECK((fep->all_lambda[i][j] < 0) || (fep->all_lambda[i][j] > 1));
587 if ((ir->bSimTemp) || (ir->efep == efepEXPANDED)) {
589 expand = ir->expandedvals;
591 /* checking equilibration of weights inputs for validity */
593 sprintf(err_buf,"weight-equil-number-all-lambda (%d) is ignored if lmc-weights-equil is not equal to %s",
594 expand->equil_n_at_lam,elmceq_names[elmceqNUMATLAM]);
595 CHECK((expand->equil_n_at_lam>0) && (expand->elmceq!=elmceqNUMATLAM));
597 sprintf(err_buf,"weight-equil-number-samples (%d) is ignored if lmc-weights-equil is not equal to %s",
598 expand->equil_samples,elmceq_names[elmceqSAMPLES]);
599 CHECK((expand->equil_samples>0) && (expand->elmceq!=elmceqSAMPLES));
601 sprintf(err_buf,"weight-equil-number-steps (%d) is ignored if lmc-weights-equil is not equal to %s",
602 expand->equil_steps,elmceq_names[elmceqSTEPS]);
603 CHECK((expand->equil_steps>0) && (expand->elmceq!=elmceqSTEPS));
605 sprintf(err_buf,"weight-equil-wl-delta (%d) is ignored if lmc-weights-equil is not equal to %s",
606 expand->equil_samples,elmceq_names[elmceqWLDELTA]);
607 CHECK((expand->equil_wl_delta>0) && (expand->elmceq!=elmceqWLDELTA));
609 sprintf(err_buf,"weight-equil-count-ratio (%f) is ignored if lmc-weights-equil is not equal to %s",
610 expand->equil_ratio,elmceq_names[elmceqRATIO]);
611 CHECK((expand->equil_ratio>0) && (expand->elmceq!=elmceqRATIO));
613 sprintf(err_buf,"weight-equil-number-all-lambda (%d) must be a positive integer if lmc-weights-equil=%s",
614 expand->equil_n_at_lam,elmceq_names[elmceqNUMATLAM]);
615 CHECK((expand->equil_n_at_lam<=0) && (expand->elmceq==elmceqNUMATLAM));
617 sprintf(err_buf,"weight-equil-number-samples (%d) must be a positive integer if lmc-weights-equil=%s",
618 expand->equil_samples,elmceq_names[elmceqSAMPLES]);
619 CHECK((expand->equil_samples<=0) && (expand->elmceq==elmceqSAMPLES));
621 sprintf(err_buf,"weight-equil-number-steps (%d) must be a positive integer if lmc-weights-equil=%s",
622 expand->equil_steps,elmceq_names[elmceqSTEPS]);
623 CHECK((expand->equil_steps<=0) && (expand->elmceq==elmceqSTEPS));
625 sprintf(err_buf,"weight-equil-wl-delta (%f) must be > 0 if lmc-weights-equil=%s",
626 expand->equil_wl_delta,elmceq_names[elmceqWLDELTA]);
627 CHECK((expand->equil_wl_delta<=0) && (expand->elmceq==elmceqWLDELTA));
629 sprintf(err_buf,"weight-equil-count-ratio (%f) must be > 0 if lmc-weights-equil=%s",
630 expand->equil_ratio,elmceq_names[elmceqRATIO]);
631 CHECK((expand->equil_ratio<=0) && (expand->elmceq==elmceqRATIO));
633 sprintf(err_buf,"lmc-weights-equil=%s only possible when lmc-stats = %s or lmc-stats %s",
634 elmceq_names[elmceqWLDELTA],elamstats_names[elamstatsWL],elamstats_names[elamstatsWWL]);
635 CHECK((expand->elmceq==elmceqWLDELTA) && (!EWL(expand->elamstats)));
637 sprintf(err_buf,"lmc-repeats (%d) must be greater than 0",expand->lmc_repeats);
638 CHECK((expand->lmc_repeats <= 0));
639 sprintf(err_buf,"minimum-var-min (%d) must be greater than 0",expand->minvarmin);
640 CHECK((expand->minvarmin <= 0));
641 sprintf(err_buf,"weight-c-range (%d) must be greater or equal to 0",expand->c_range);
642 CHECK((expand->c_range < 0));
643 sprintf(err_buf,"init-lambda-state (%d) must be zero if lmc-forced-nstart (%d)> 0 and lmc-move != 'no'",
644 fep->init_fep_state, expand->lmc_forced_nstart);
645 CHECK((fep->init_fep_state!=0) && (expand->lmc_forced_nstart>0) && (expand->elmcmove!=elmcmoveNO));
646 sprintf(err_buf,"lmc-forced-nstart (%d) must not be negative",expand->lmc_forced_nstart);
647 CHECK((expand->lmc_forced_nstart < 0));
648 sprintf(err_buf,"init-lambda-state (%d) must be in the interval [0,number of lambdas)",fep->init_fep_state);
649 CHECK((fep->init_fep_state < 0) || (fep->init_fep_state >= fep->n_lambda));
651 sprintf(err_buf,"init-wl-delta (%f) must be greater than or equal to 0",expand->init_wl_delta);
652 CHECK((expand->init_wl_delta < 0));
653 sprintf(err_buf,"wl-ratio (%f) must be between 0 and 1",expand->wl_ratio);
654 CHECK((expand->wl_ratio <= 0) || (expand->wl_ratio >= 1));
655 sprintf(err_buf,"wl-scale (%f) must be between 0 and 1",expand->wl_scale);
656 CHECK((expand->wl_scale <= 0) || (expand->wl_scale >= 1));
658 /* if there is no temperature control, we need to specify an MC temperature */
659 sprintf(err_buf,"If there is no temperature control, and lmc-mcmove!= 'no',mc_temperature must be set to a positive number");
660 if (expand->nstTij > 0)
662 sprintf(err_buf,"nst-transition-matrix (%d) must be an integer multiple of nstlog (%d)",
663 expand->nstTij,ir->nstlog);
664 CHECK((mod(expand->nstTij,ir->nstlog)!=0));
669 sprintf(err_buf,"walls only work with pbc=%s",epbc_names[epbcXY]);
670 CHECK(ir->nwall && ir->ePBC!=epbcXY);
673 if (ir->ePBC != epbcXYZ && ir->nwall != 2) {
674 if (ir->ePBC == epbcNONE) {
675 if (ir->epc != epcNO) {
676 warning(wi,"Turning off pressure coupling for vacuum system");
680 sprintf(err_buf,"Can not have pressure coupling with pbc=%s",
681 epbc_names[ir->ePBC]);
682 CHECK(ir->epc != epcNO);
684 sprintf(err_buf,"Can not have Ewald with pbc=%s",epbc_names[ir->ePBC]);
685 CHECK(EEL_FULL(ir->coulombtype));
687 sprintf(err_buf,"Can not have dispersion correction with pbc=%s",
688 epbc_names[ir->ePBC]);
689 CHECK(ir->eDispCorr != edispcNO);
692 if (ir->rlist == 0.0) {
693 sprintf(err_buf,"can only have neighborlist cut-off zero (=infinite)\n"
694 "with coulombtype = %s or coulombtype = %s\n"
695 "without periodic boundary conditions (pbc = %s) and\n"
696 "rcoulomb and rvdw set to zero",
697 eel_names[eelCUT],eel_names[eelUSER],epbc_names[epbcNONE]);
698 CHECK(((ir->coulombtype != eelCUT) && (ir->coulombtype != eelUSER)) ||
699 (ir->ePBC != epbcNONE) ||
700 (ir->rcoulomb != 0.0) || (ir->rvdw != 0.0));
702 if (ir->nstlist < 0) {
703 warning_error(wi,"Can not have heuristic neighborlist updates without cut-off");
705 if (ir->nstlist > 0) {
706 warning_note(wi,"Simulating without cut-offs is usually (slightly) faster with nstlist=0, nstype=simple and particle decomposition");
711 if (ir->nstcomm == 0) {
712 ir->comm_mode = ecmNO;
714 if (ir->comm_mode != ecmNO) {
715 if (ir->nstcomm < 0) {
716 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");
717 ir->nstcomm = abs(ir->nstcomm);
720 if (ir->nstcalcenergy > 0 && ir->nstcomm < ir->nstcalcenergy) {
721 warning_note(wi,"nstcomm < nstcalcenergy defeats the purpose of nstcalcenergy, setting nstcomm to nstcalcenergy");
722 ir->nstcomm = ir->nstcalcenergy;
725 if (ir->comm_mode == ecmANGULAR) {
726 sprintf(err_buf,"Can not remove the rotation around the center of mass with periodic molecules");
727 CHECK(ir->bPeriodicMols);
728 if (ir->ePBC != epbcNONE)
729 warning(wi,"Removing the rotation around the center of mass in a periodic system (this is not a problem when you have only one molecule).");
733 if (EI_STATE_VELOCITY(ir->eI) && ir->ePBC == epbcNONE && ir->comm_mode != ecmANGULAR) {
734 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.");
737 sprintf(err_buf,"Twin-range neighbour searching (NS) with simple NS"
738 " algorithm not implemented");
739 CHECK(((ir->rcoulomb > ir->rlist) || (ir->rvdw > ir->rlist))
740 && (ir->ns_type == ensSIMPLE));
742 /* TEMPERATURE COUPLING */
743 if (ir->etc == etcYES)
745 ir->etc = etcBERENDSEN;
746 warning_note(wi,"Old option for temperature coupling given: "
747 "changing \"yes\" to \"Berendsen\"\n");
750 if ((ir->etc == etcNOSEHOOVER) || (ir->epc == epcMTTK))
752 if (ir->opts.nhchainlength < 1)
754 sprintf(warn_buf,"number of Nose-Hoover chains (currently %d) cannot be less than 1,reset to 1\n",ir->opts.nhchainlength);
755 ir->opts.nhchainlength =1;
756 warning(wi,warn_buf);
759 if (ir->etc==etcNOSEHOOVER && !EI_VV(ir->eI) && ir->opts.nhchainlength > 1)
761 warning_note(wi,"leapfrog does not yet support Nose-Hoover chains, nhchainlength reset to 1");
762 ir->opts.nhchainlength = 1;
767 ir->opts.nhchainlength = 0;
770 if (ir->eI == eiVVAK) {
771 sprintf(err_buf,"%s implemented primarily for validation, and requires nsttcouple = 1 and nstpcouple = 1.",
773 CHECK((ir->nsttcouple != 1) || (ir->nstpcouple != 1));
776 if (ETC_ANDERSEN(ir->etc))
778 sprintf(err_buf,"%s temperature control not supported for integrator %s.",etcoupl_names[ir->etc],ei_names[ir->eI]);
779 CHECK(!(EI_VV(ir->eI)));
781 for (i=0;i<ir->opts.ngtc;i++)
783 sprintf(err_buf,"all tau_t must currently be equal using Andersen temperature control, violated for group %d",i);
784 CHECK(ir->opts.tau_t[0] != ir->opts.tau_t[i]);
785 sprintf(err_buf,"all tau_t must be postive using Andersen temperature control, tau_t[%d]=%10.6f",
786 i,ir->opts.tau_t[i]);
787 CHECK(ir->opts.tau_t[i]<0);
789 if (ir->nstcomm > 0 && (ir->etc == etcANDERSEN)) {
790 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]);
791 warning_note(wi,warn_buf);
794 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]);
795 CHECK(ir->nstcomm > 1 && (ir->etc == etcANDERSEN));
797 for (i=0;i<ir->opts.ngtc;i++)
799 int nsteps = (int)(ir->opts.tau_t[i]/ir->delta_t);
800 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);
801 CHECK((nsteps % ir->nstcomm) && (ir->etc == etcANDERSENMASSIVE));
804 if (ir->etc == etcBERENDSEN)
806 sprintf(warn_buf,"The %s thermostat does not generate the correct kinetic energy distribution. You might want to consider using the %s thermostat.",
807 ETCOUPLTYPE(ir->etc),ETCOUPLTYPE(etcVRESCALE));
808 warning_note(wi,warn_buf);
811 if ((ir->etc==etcNOSEHOOVER || ETC_ANDERSEN(ir->etc))
812 && ir->epc==epcBERENDSEN)
814 sprintf(warn_buf,"Using Berendsen pressure coupling invalidates the "
815 "true ensemble for the thermostat");
816 warning(wi,warn_buf);
819 /* PRESSURE COUPLING */
820 if (ir->epc == epcISOTROPIC)
822 ir->epc = epcBERENDSEN;
823 warning_note(wi,"Old option for pressure coupling given: "
824 "changing \"Isotropic\" to \"Berendsen\"\n");
827 if (ir->epc != epcNO)
829 dt_pcoupl = ir->nstpcouple*ir->delta_t;
831 sprintf(err_buf,"tau-p must be > 0 instead of %g\n",ir->tau_p);
832 CHECK(ir->tau_p <= 0);
834 if (ir->tau_p/dt_pcoupl < pcouple_min_integration_steps(ir->epc))
836 sprintf(warn_buf,"For proper integration of the %s barostat, tau-p (%g) should be at least %d times larger than nstpcouple*dt (%g)",
837 EPCOUPLTYPE(ir->epc),ir->tau_p,pcouple_min_integration_steps(ir->epc),dt_pcoupl);
838 warning(wi,warn_buf);
841 sprintf(err_buf,"compressibility must be > 0 when using pressure"
842 " coupling %s\n",EPCOUPLTYPE(ir->epc));
843 CHECK(ir->compress[XX][XX] < 0 || ir->compress[YY][YY] < 0 ||
844 ir->compress[ZZ][ZZ] < 0 ||
845 (trace(ir->compress) == 0 && ir->compress[YY][XX] <= 0 &&
846 ir->compress[ZZ][XX] <= 0 && ir->compress[ZZ][YY] <= 0));
848 if (epcPARRINELLORAHMAN == ir->epc && opts->bGenVel)
851 "You are generating velocities so I am assuming you "
852 "are equilibrating a system. You are using "
853 "%s pressure coupling, but this can be "
854 "unstable for equilibration. If your system crashes, try "
855 "equilibrating first with Berendsen pressure coupling. If "
856 "you are not equilibrating the system, you can probably "
857 "ignore this warning.",
858 epcoupl_names[ir->epc]);
859 warning(wi,warn_buf);
867 if ((ir->epc!=epcBERENDSEN) && (ir->epc!=epcMTTK))
869 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.");
875 /* More checks are in triple check (grompp.c) */
877 if (ir->coulombtype == eelSWITCH) {
878 sprintf(warn_buf,"coulombtype = %s is only for testing purposes and can lead to serious artifacts, advice: use coulombtype = %s",
879 eel_names[ir->coulombtype],
880 eel_names[eelRF_ZERO]);
881 warning(wi,warn_buf);
884 if (ir->epsilon_r!=1 && ir->implicit_solvent==eisGBSA) {
885 sprintf(warn_buf,"epsilon-r = %g with GB implicit solvent, will use this value for inner dielectric",ir->epsilon_r);
886 warning_note(wi,warn_buf);
889 if (EEL_RF(ir->coulombtype) && ir->epsilon_rf==1 && ir->epsilon_r!=1) {
890 sprintf(warn_buf,"epsilon-r = %g and epsilon-rf = 1 with reaction field, assuming old format and exchanging epsilon-r and epsilon-rf",ir->epsilon_r);
891 warning(wi,warn_buf);
892 ir->epsilon_rf = ir->epsilon_r;
896 if (getenv("GALACTIC_DYNAMICS") == NULL) {
897 sprintf(err_buf,"epsilon-r must be >= 0 instead of %g\n",ir->epsilon_r);
898 CHECK(ir->epsilon_r < 0);
901 if (EEL_RF(ir->coulombtype)) {
902 /* reaction field (at the cut-off) */
904 if (ir->coulombtype == eelRF_ZERO) {
905 sprintf(err_buf,"With coulombtype = %s, epsilon-rf must be 0",
906 eel_names[ir->coulombtype]);
907 CHECK(ir->epsilon_rf != 0);
910 sprintf(err_buf,"epsilon-rf must be >= epsilon-r");
911 CHECK((ir->epsilon_rf < ir->epsilon_r && ir->epsilon_rf != 0) ||
912 (ir->epsilon_r == 0));
913 if (ir->epsilon_rf == ir->epsilon_r) {
914 sprintf(warn_buf,"Using epsilon-rf = epsilon-r with %s does not make sense",
915 eel_names[ir->coulombtype]);
916 warning(wi,warn_buf);
919 /* Allow rlist>rcoulomb for tabulated long range stuff. This just
920 * means the interaction is zero outside rcoulomb, but it helps to
921 * provide accurate energy conservation.
923 if (EEL_MIGHT_BE_ZERO_AT_CUTOFF(ir->coulombtype)) {
924 if (EEL_SWITCHED(ir->coulombtype)) {
926 "With coulombtype = %s rcoulomb_switch must be < rcoulomb",
927 eel_names[ir->coulombtype]);
928 CHECK(ir->rcoulomb_switch >= ir->rcoulomb);
930 } else if (ir->coulombtype == eelCUT || EEL_RF(ir->coulombtype)) {
931 if (ir->cutoff_scheme == ecutsGROUP) {
932 sprintf(err_buf,"With coulombtype = %s, rcoulomb must be >= rlist",
933 eel_names[ir->coulombtype]);
934 CHECK(ir->rlist > ir->rcoulomb);
938 if (EEL_FULL(ir->coulombtype)) {
939 if (ir->coulombtype==eelPMESWITCH || ir->coulombtype==eelPMEUSER ||
940 ir->coulombtype==eelPMEUSERSWITCH) {
941 sprintf(err_buf,"With coulombtype = %s, rcoulomb must be <= rlist",
942 eel_names[ir->coulombtype]);
943 CHECK(ir->rcoulomb > ir->rlist);
944 } else if (ir->cutoff_scheme == ecutsGROUP) {
945 if (ir->coulombtype == eelPME || ir->coulombtype == eelP3M_AD) {
947 "With coulombtype = %s, rcoulomb must be equal to rlist\n"
948 "If you want optimal energy conservation or exact integration use %s",
949 eel_names[ir->coulombtype],eel_names[eelPMESWITCH]);
952 "With coulombtype = %s, rcoulomb must be equal to rlist",
953 eel_names[ir->coulombtype]);
955 CHECK(ir->rcoulomb != ir->rlist);
959 if (EEL_PME(ir->coulombtype)) {
960 if (ir->pme_order < 3) {
961 warning_error(wi,"pme-order can not be smaller than 3");
965 if (ir->nwall==2 && EEL_FULL(ir->coulombtype)) {
966 if (ir->ewald_geometry == eewg3D) {
967 sprintf(warn_buf,"With pbc=%s you should use ewald-geometry=%s",
968 epbc_names[ir->ePBC],eewg_names[eewg3DC]);
969 warning(wi,warn_buf);
971 /* This check avoids extra pbc coding for exclusion corrections */
972 sprintf(err_buf,"wall-ewald-zfac should be >= 2");
973 CHECK(ir->wall_ewald_zfac < 2);
976 if (EVDW_SWITCHED(ir->vdwtype)) {
977 sprintf(err_buf,"With vdwtype = %s rvdw-switch must be < rvdw",
978 evdw_names[ir->vdwtype]);
979 CHECK(ir->rvdw_switch >= ir->rvdw);
980 } else if (ir->vdwtype == evdwCUT) {
981 if (ir->cutoff_scheme == ecutsGROUP) {
982 sprintf(err_buf,"With vdwtype = %s, rvdw must be >= rlist",evdw_names[ir->vdwtype]);
983 CHECK(ir->rlist > ir->rvdw);
986 if (ir->cutoff_scheme == ecutsGROUP)
988 if (EEL_IS_ZERO_AT_CUTOFF(ir->coulombtype)
989 && (ir->rlistlong <= ir->rcoulomb))
991 sprintf(warn_buf,"For energy conservation with switch/shift potentials, %s should be 0.1 to 0.3 nm larger than rcoulomb.",
992 IR_TWINRANGE(*ir) ? "rlistlong" : "rlist");
993 warning_note(wi,warn_buf);
995 if (EVDW_SWITCHED(ir->vdwtype) && (ir->rlistlong <= ir->rvdw))
997 sprintf(warn_buf,"For energy conservation with switch/shift potentials, %s should be 0.1 to 0.3 nm larger than rvdw.",
998 IR_TWINRANGE(*ir) ? "rlistlong" : "rlist");
999 warning_note(wi,warn_buf);
1003 if (ir->vdwtype == evdwUSER && ir->eDispCorr != edispcNO) {
1004 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.");
1007 if (ir->nstlist == -1) {
1009 "nstlist=-1 only works with switched or shifted potentials,\n"
1010 "suggestion: use vdw-type=%s and coulomb-type=%s",
1011 evdw_names[evdwSHIFT],eel_names[eelPMESWITCH]);
1012 CHECK(!(EEL_MIGHT_BE_ZERO_AT_CUTOFF(ir->coulombtype) &&
1013 EVDW_MIGHT_BE_ZERO_AT_CUTOFF(ir->vdwtype)));
1015 sprintf(err_buf,"With nstlist=-1 rvdw and rcoulomb should be smaller than rlist to account for diffusion and possibly charge-group radii");
1016 CHECK(ir->rvdw >= ir->rlist || ir->rcoulomb >= ir->rlist);
1018 sprintf(err_buf,"nstlist can not be smaller than -1");
1019 CHECK(ir->nstlist < -1);
1021 if (ir->eI == eiLBFGS && (ir->coulombtype==eelCUT || ir->vdwtype==evdwCUT)
1023 warning(wi,"For efficient BFGS minimization, use switch/shift/pme instead of cut-off.");
1026 if (ir->eI == eiLBFGS && ir->nbfgscorr <= 0) {
1027 warning(wi,"Using L-BFGS with nbfgscorr<=0 just gets you steepest descent.");
1030 /* ENERGY CONSERVATION */
1031 if (ir_NVE(ir) && ir->cutoff_scheme == ecutsGROUP)
1033 if (!EVDW_MIGHT_BE_ZERO_AT_CUTOFF(ir->vdwtype) && ir->rvdw > 0)
1035 sprintf(warn_buf,"You are using a cut-off for VdW interactions with NVE, for good energy conservation use vdwtype = %s (possibly with DispCorr)",
1036 evdw_names[evdwSHIFT]);
1037 warning_note(wi,warn_buf);
1039 if (!EEL_MIGHT_BE_ZERO_AT_CUTOFF(ir->coulombtype) && ir->rcoulomb > 0)
1041 sprintf(warn_buf,"You are using a cut-off for electrostatics with NVE, for good energy conservation use coulombtype = %s or %s",
1042 eel_names[eelPMESWITCH],eel_names[eelRF_ZERO]);
1043 warning_note(wi,warn_buf);
1047 /* IMPLICIT SOLVENT */
1048 if(ir->coulombtype==eelGB_NOTUSED)
1050 ir->coulombtype=eelCUT;
1051 ir->implicit_solvent=eisGBSA;
1052 fprintf(stderr,"Note: Old option for generalized born electrostatics given:\n"
1053 "Changing coulombtype from \"generalized-born\" to \"cut-off\" and instead\n"
1054 "setting implicit-solvent value to \"GBSA\" in input section.\n");
1057 if(ir->sa_algorithm==esaSTILL)
1059 sprintf(err_buf,"Still SA algorithm not available yet, use %s or %s instead\n",esa_names[esaAPPROX],esa_names[esaNO]);
1060 CHECK(ir->sa_algorithm == esaSTILL);
1063 if(ir->implicit_solvent==eisGBSA)
1065 sprintf(err_buf,"With GBSA implicit solvent, rgbradii must be equal to rlist.");
1066 CHECK(ir->rgbradii != ir->rlist);
1068 if(ir->coulombtype!=eelCUT)
1070 sprintf(err_buf,"With GBSA, coulombtype must be equal to %s\n",eel_names[eelCUT]);
1071 CHECK(ir->coulombtype!=eelCUT);
1073 if(ir->vdwtype!=evdwCUT)
1075 sprintf(err_buf,"With GBSA, vdw-type must be equal to %s\n",evdw_names[evdwCUT]);
1076 CHECK(ir->vdwtype!=evdwCUT);
1078 if(ir->nstgbradii<1)
1080 sprintf(warn_buf,"Using GBSA with nstgbradii<1, setting nstgbradii=1");
1081 warning_note(wi,warn_buf);
1084 if(ir->sa_algorithm==esaNO)
1086 sprintf(warn_buf,"No SA (non-polar) calculation requested together with GB. Are you sure this is what you want?\n");
1087 warning_note(wi,warn_buf);
1089 if(ir->sa_surface_tension<0 && ir->sa_algorithm!=esaNO)
1091 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");
1092 warning_note(wi,warn_buf);
1094 if(ir->gb_algorithm==egbSTILL)
1096 ir->sa_surface_tension = 0.0049 * CAL2JOULE * 100;
1100 ir->sa_surface_tension = 0.0054 * CAL2JOULE * 100;
1103 if(ir->sa_surface_tension==0 && ir->sa_algorithm!=esaNO)
1105 sprintf(err_buf, "Surface tension set to 0 while SA-calculation requested\n");
1106 CHECK(ir->sa_surface_tension==0 && ir->sa_algorithm!=esaNO);
1113 if (ir->cutoff_scheme != ecutsGROUP)
1115 warning_error(wi,"AdresS simulation supports only cutoff-scheme=group");
1119 warning_error(wi,"AdresS simulation supports only stochastic dynamics");
1121 if (ir->epc != epcNO)
1123 warning_error(wi,"AdresS simulation does not support pressure coupling");
1125 if (EEL_FULL(ir->coulombtype))
1127 warning_error(wi,"AdresS simulation does not support long-range electrostatics");
1132 /* count the number of text elemets separated by whitespace in a string.
1133 str = the input string
1134 maxptr = the maximum number of allowed elements
1135 ptr = the output array of pointers to the first character of each element
1136 returns: the number of elements. */
1137 int str_nelem(const char *str,int maxptr,char *ptr[])
1145 while (*copy != '\0') {
1147 gmx_fatal(FARGS,"Too many groups on line: '%s' (max is %d)",
1152 while ((*copy != '\0') && !isspace(*copy))
1154 if (*copy != '\0') {
1166 /* interpret a number of doubles from a string and put them in an array,
1167 after allocating space for them.
1168 str = the input string
1169 n = the (pre-allocated) number of doubles read
1170 r = the output array of doubles. */
1171 static void parse_n_real(char *str,int *n,real **r)
1176 *n = str_nelem(str,MAXPTR,ptr);
1179 for(i=0; i<*n; i++) {
1180 (*r)[i] = strtod(ptr[i],NULL);
1184 static void do_fep_params(t_inputrec *ir, char fep_lambda[][STRLEN],char weights[STRLEN]) {
1186 int i,j,max_n_lambda,nweights,nfep[efptNR];
1187 t_lambda *fep = ir->fepvals;
1188 t_expanded *expand = ir->expandedvals;
1189 real **count_fep_lambdas;
1190 gmx_bool bOneLambda = TRUE;
1192 snew(count_fep_lambdas,efptNR);
1194 /* FEP input processing */
1195 /* first, identify the number of lambda values for each type.
1196 All that are nonzero must have the same number */
1198 for (i=0;i<efptNR;i++)
1200 parse_n_real(fep_lambda[i],&(nfep[i]),&(count_fep_lambdas[i]));
1203 /* now, determine the number of components. All must be either zero, or equal. */
1206 for (i=0;i<efptNR;i++)
1208 if (nfep[i] > max_n_lambda) {
1209 max_n_lambda = nfep[i]; /* here's a nonzero one. All of them
1210 must have the same number if its not zero.*/
1215 for (i=0;i<efptNR;i++)
1219 ir->fepvals->separate_dvdl[i] = FALSE;
1221 else if (nfep[i] == max_n_lambda)
1223 if (i!=efptTEMPERATURE) /* we treat this differently -- not really a reason to compute the derivative with
1224 respect to the temperature currently */
1226 ir->fepvals->separate_dvdl[i] = TRUE;
1231 gmx_fatal(FARGS,"Number of lambdas (%d) for FEP type %s not equal to number of other types (%d)",
1232 nfep[i],efpt_names[i],max_n_lambda);
1235 /* we don't print out dhdl if the temperature is changing, since we can't correctly define dhdl in this case */
1236 ir->fepvals->separate_dvdl[efptTEMPERATURE] = FALSE;
1238 /* the number of lambdas is the number we've read in, which is either zero
1239 or the same for all */
1240 fep->n_lambda = max_n_lambda;
1242 /* allocate space for the array of lambda values */
1243 snew(fep->all_lambda,efptNR);
1244 /* if init_lambda is defined, we need to set lambda */
1245 if ((fep->init_lambda > 0) && (fep->n_lambda == 0))
1247 ir->fepvals->separate_dvdl[efptFEP] = TRUE;
1249 /* otherwise allocate the space for all of the lambdas, and transfer the data */
1250 for (i=0;i<efptNR;i++)
1252 snew(fep->all_lambda[i],fep->n_lambda);
1253 if (nfep[i] > 0) /* if it's zero, then the count_fep_lambda arrays
1256 for (j=0;j<fep->n_lambda;j++)
1258 fep->all_lambda[i][j] = (double)count_fep_lambdas[i][j];
1260 sfree(count_fep_lambdas[i]);
1263 sfree(count_fep_lambdas);
1265 /* "fep-vals" is either zero or the full number. If zero, we'll need to define fep-lambdas for internal
1266 bookkeeping -- for now, init_lambda */
1268 if ((nfep[efptFEP] == 0) && (fep->init_lambda >= 0) && (fep->init_lambda <= 1))
1270 for (i=0;i<fep->n_lambda;i++)
1272 fep->all_lambda[efptFEP][i] = fep->init_lambda;
1276 /* check to see if only a single component lambda is defined, and soft core is defined.
1277 In this case, turn on coulomb soft core */
1279 if (max_n_lambda == 0)
1285 for (i=0;i<efptNR;i++)
1287 if ((nfep[i] != 0) && (i!=efptFEP))
1293 if ((bOneLambda) && (fep->sc_alpha > 0))
1295 fep->bScCoul = TRUE;
1298 /* Fill in the others with the efptFEP if they are not explicitly
1299 specified (i.e. nfep[i] == 0). This means if fep is not defined,
1300 they are all zero. */
1302 for (i=0;i<efptNR;i++)
1304 if ((nfep[i] == 0) && (i!=efptFEP))
1306 for (j=0;j<fep->n_lambda;j++)
1308 fep->all_lambda[i][j] = fep->all_lambda[efptFEP][j];
1314 /* make it easier if sc_r_power = 48 by increasing it to the 4th power, to be in the right scale. */
1315 if (fep->sc_r_power == 48)
1317 if (fep->sc_alpha > 0.1)
1319 gmx_fatal(FARGS,"sc_alpha (%f) for sc_r_power = 48 should usually be between 0.001 and 0.004", fep->sc_alpha);
1323 expand = ir->expandedvals;
1324 /* now read in the weights */
1325 parse_n_real(weights,&nweights,&(expand->init_lambda_weights));
1328 expand->bInit_weights = FALSE;
1329 snew(expand->init_lambda_weights,fep->n_lambda); /* initialize to zero */
1331 else if (nweights != fep->n_lambda)
1333 gmx_fatal(FARGS,"Number of weights (%d) is not equal to number of lambda values (%d)",
1334 nweights,fep->n_lambda);
1338 expand->bInit_weights = TRUE;
1340 if ((expand->nstexpanded < 0) && (ir->efep != efepNO)) {
1341 expand->nstexpanded = fep->nstdhdl;
1342 /* if you don't specify nstexpanded when doing expanded ensemble free energy calcs, it is set to nstdhdl */
1344 if ((expand->nstexpanded < 0) && ir->bSimTemp) {
1345 expand->nstexpanded = ir->nstlist;
1346 /* if you don't specify nstexpanded when doing expanded ensemble simulated tempering, it is set to nstlist*/
1351 static void do_simtemp_params(t_inputrec *ir) {
1353 snew(ir->simtempvals->temperatures,ir->fepvals->n_lambda);
1354 GetSimTemps(ir->fepvals->n_lambda,ir->simtempvals,ir->fepvals->all_lambda[efptTEMPERATURE]);
1359 static void do_wall_params(t_inputrec *ir,
1360 char *wall_atomtype, char *wall_density,
1364 char *names[MAXPTR];
1367 opts->wall_atomtype[0] = NULL;
1368 opts->wall_atomtype[1] = NULL;
1370 ir->wall_atomtype[0] = -1;
1371 ir->wall_atomtype[1] = -1;
1372 ir->wall_density[0] = 0;
1373 ir->wall_density[1] = 0;
1377 nstr = str_nelem(wall_atomtype,MAXPTR,names);
1378 if (nstr != ir->nwall)
1380 gmx_fatal(FARGS,"Expected %d elements for wall_atomtype, found %d",
1383 for(i=0; i<ir->nwall; i++)
1385 opts->wall_atomtype[i] = strdup(names[i]);
1388 if (ir->wall_type == ewt93 || ir->wall_type == ewt104) {
1389 nstr = str_nelem(wall_density,MAXPTR,names);
1390 if (nstr != ir->nwall)
1392 gmx_fatal(FARGS,"Expected %d elements for wall-density, found %d",ir->nwall,nstr);
1394 for(i=0; i<ir->nwall; i++)
1396 sscanf(names[i],"%lf",&dbl);
1399 gmx_fatal(FARGS,"wall-density[%d] = %f\n",i,dbl);
1401 ir->wall_density[i] = dbl;
1407 static void add_wall_energrps(gmx_groups_t *groups,int nwall,t_symtab *symtab)
1414 srenew(groups->grpname,groups->ngrpname+nwall);
1415 grps = &(groups->grps[egcENER]);
1416 srenew(grps->nm_ind,grps->nr+nwall);
1417 for(i=0; i<nwall; i++) {
1418 sprintf(str,"wall%d",i);
1419 groups->grpname[groups->ngrpname] = put_symtab(symtab,str);
1420 grps->nm_ind[grps->nr++] = groups->ngrpname++;
1425 void read_expandedparams(int *ninp_p,t_inpfile **inp_p,
1426 t_expanded *expand,warninp_t wi)
1434 /* read expanded ensemble parameters */
1435 CCTYPE ("expanded ensemble variables");
1436 ITYPE ("nstexpanded",expand->nstexpanded,-1);
1437 EETYPE("lmc-stats", expand->elamstats, elamstats_names);
1438 EETYPE("lmc-move", expand->elmcmove, elmcmove_names);
1439 EETYPE("lmc-weights-equil",expand->elmceq,elmceq_names);
1440 ITYPE ("weight-equil-number-all-lambda",expand->equil_n_at_lam,-1);
1441 ITYPE ("weight-equil-number-samples",expand->equil_samples,-1);
1442 ITYPE ("weight-equil-number-steps",expand->equil_steps,-1);
1443 RTYPE ("weight-equil-wl-delta",expand->equil_wl_delta,-1);
1444 RTYPE ("weight-equil-count-ratio",expand->equil_ratio,-1);
1445 CCTYPE("Seed for Monte Carlo in lambda space");
1446 ITYPE ("lmc-seed",expand->lmc_seed,-1);
1447 RTYPE ("mc-temperature",expand->mc_temp,-1);
1448 ITYPE ("lmc-repeats",expand->lmc_repeats,1);
1449 ITYPE ("lmc-gibbsdelta",expand->gibbsdeltalam,-1);
1450 ITYPE ("lmc-forced-nstart",expand->lmc_forced_nstart,0);
1451 EETYPE("symmetrized-transition-matrix", expand->bSymmetrizedTMatrix, yesno_names);
1452 ITYPE("nst-transition-matrix", expand->nstTij, -1);
1453 ITYPE ("mininum-var-min",expand->minvarmin, 100); /*default is reasonable */
1454 ITYPE ("weight-c-range",expand->c_range, 0); /* default is just C=0 */
1455 RTYPE ("wl-scale",expand->wl_scale,0.8);
1456 RTYPE ("wl-ratio",expand->wl_ratio,0.8);
1457 RTYPE ("init-wl-delta",expand->init_wl_delta,1.0);
1458 EETYPE("wl-oneovert",expand->bWLoneovert,yesno_names);
1466 void get_ir(const char *mdparin,const char *mdparout,
1467 t_inputrec *ir,t_gromppopts *opts,
1471 double dumdub[2][6];
1475 char warn_buf[STRLEN];
1476 t_lambda *fep = ir->fepvals;
1477 t_expanded *expand = ir->expandedvals;
1479 inp = read_inpfile(mdparin, &ninp, NULL, wi);
1481 snew(dumstr[0],STRLEN);
1482 snew(dumstr[1],STRLEN);
1484 /* remove the following deprecated commands */
1487 REM_TYPE("domain-decomposition");
1488 REM_TYPE("andersen-seed");
1490 REM_TYPE("dihre-fc");
1491 REM_TYPE("dihre-tau");
1492 REM_TYPE("nstdihreout");
1493 REM_TYPE("nstcheckpoint");
1495 /* replace the following commands with the clearer new versions*/
1496 REPL_TYPE("unconstrained-start","continuation");
1497 REPL_TYPE("foreign-lambda","fep-lambdas");
1499 CCTYPE ("VARIOUS PREPROCESSING OPTIONS");
1500 CTYPE ("Preprocessor information: use cpp syntax.");
1501 CTYPE ("e.g.: -I/home/joe/doe -I/home/mary/roe");
1502 STYPE ("include", opts->include, NULL);
1503 CTYPE ("e.g.: -DPOSRES -DFLEXIBLE (note these variable names are case sensitive)");
1504 STYPE ("define", opts->define, NULL);
1506 CCTYPE ("RUN CONTROL PARAMETERS");
1507 EETYPE("integrator", ir->eI, ei_names);
1508 CTYPE ("Start time and timestep in ps");
1509 RTYPE ("tinit", ir->init_t, 0.0);
1510 RTYPE ("dt", ir->delta_t, 0.001);
1511 STEPTYPE ("nsteps", ir->nsteps, 0);
1512 CTYPE ("For exact run continuation or redoing part of a run");
1513 STEPTYPE ("init-step",ir->init_step, 0);
1514 CTYPE ("Part index is updated automatically on checkpointing (keeps files separate)");
1515 ITYPE ("simulation-part", ir->simulation_part, 1);
1516 CTYPE ("mode for center of mass motion removal");
1517 EETYPE("comm-mode", ir->comm_mode, ecm_names);
1518 CTYPE ("number of steps for center of mass motion removal");
1519 ITYPE ("nstcomm", ir->nstcomm, 100);
1520 CTYPE ("group(s) for center of mass motion removal");
1521 STYPE ("comm-grps", vcm, NULL);
1523 CCTYPE ("LANGEVIN DYNAMICS OPTIONS");
1524 CTYPE ("Friction coefficient (amu/ps) and random seed");
1525 RTYPE ("bd-fric", ir->bd_fric, 0.0);
1526 ITYPE ("ld-seed", ir->ld_seed, 1993);
1529 CCTYPE ("ENERGY MINIMIZATION OPTIONS");
1530 CTYPE ("Force tolerance and initial step-size");
1531 RTYPE ("emtol", ir->em_tol, 10.0);
1532 RTYPE ("emstep", ir->em_stepsize,0.01);
1533 CTYPE ("Max number of iterations in relax-shells");
1534 ITYPE ("niter", ir->niter, 20);
1535 CTYPE ("Step size (ps^2) for minimization of flexible constraints");
1536 RTYPE ("fcstep", ir->fc_stepsize, 0);
1537 CTYPE ("Frequency of steepest descents steps when doing CG");
1538 ITYPE ("nstcgsteep", ir->nstcgsteep, 1000);
1539 ITYPE ("nbfgscorr", ir->nbfgscorr, 10);
1541 CCTYPE ("TEST PARTICLE INSERTION OPTIONS");
1542 RTYPE ("rtpi", ir->rtpi, 0.05);
1544 /* Output options */
1545 CCTYPE ("OUTPUT CONTROL OPTIONS");
1546 CTYPE ("Output frequency for coords (x), velocities (v) and forces (f)");
1547 ITYPE ("nstxout", ir->nstxout, 0);
1548 ITYPE ("nstvout", ir->nstvout, 0);
1549 ITYPE ("nstfout", ir->nstfout, 0);
1550 ir->nstcheckpoint = 1000;
1551 CTYPE ("Output frequency for energies to log file and energy file");
1552 ITYPE ("nstlog", ir->nstlog, 1000);
1553 ITYPE ("nstcalcenergy",ir->nstcalcenergy, 100);
1554 ITYPE ("nstenergy", ir->nstenergy, 1000);
1555 CTYPE ("Output frequency and precision for .xtc file");
1556 ITYPE ("nstxtcout", ir->nstxtcout, 0);
1557 RTYPE ("xtc-precision",ir->xtcprec, 1000.0);
1558 CTYPE ("This selects the subset of atoms for the .xtc file. You can");
1559 CTYPE ("select multiple groups. By default all atoms will be written.");
1560 STYPE ("xtc-grps", xtc_grps, NULL);
1561 CTYPE ("Selection of energy groups");
1562 STYPE ("energygrps", energy, NULL);
1564 /* Neighbor searching */
1565 CCTYPE ("NEIGHBORSEARCHING PARAMETERS");
1566 CTYPE ("cut-off scheme (group: using charge groups, Verlet: particle based cut-offs)");
1567 EETYPE("cutoff-scheme", ir->cutoff_scheme, ecutscheme_names);
1568 CTYPE ("nblist update frequency");
1569 ITYPE ("nstlist", ir->nstlist, 10);
1570 CTYPE ("ns algorithm (simple or grid)");
1571 EETYPE("ns-type", ir->ns_type, ens_names);
1572 /* set ndelta to the optimal value of 2 */
1574 CTYPE ("Periodic boundary conditions: xyz, no, xy");
1575 EETYPE("pbc", ir->ePBC, epbc_names);
1576 EETYPE("periodic-molecules", ir->bPeriodicMols, yesno_names);
1577 CTYPE ("Allowed energy drift due to the Verlet buffer in kJ/mol/ps per atom,");
1578 CTYPE ("a value of -1 means: use rlist");
1579 RTYPE("verlet-buffer-drift", ir->verletbuf_drift, 0.005);
1580 CTYPE ("nblist cut-off");
1581 RTYPE ("rlist", ir->rlist, -1);
1582 CTYPE ("long-range cut-off for switched potentials");
1583 RTYPE ("rlistlong", ir->rlistlong, -1);
1585 /* Electrostatics */
1586 CCTYPE ("OPTIONS FOR ELECTROSTATICS AND VDW");
1587 CTYPE ("Method for doing electrostatics");
1588 EETYPE("coulombtype", ir->coulombtype, eel_names);
1589 EETYPE("coulomb-modifier", ir->coulomb_modifier, eintmod_names);
1590 CTYPE ("cut-off lengths");
1591 RTYPE ("rcoulomb-switch", ir->rcoulomb_switch, 0.0);
1592 RTYPE ("rcoulomb", ir->rcoulomb, -1);
1593 CTYPE ("Relative dielectric constant for the medium and the reaction field");
1594 RTYPE ("epsilon-r", ir->epsilon_r, 1.0);
1595 RTYPE ("epsilon-rf", ir->epsilon_rf, 0.0);
1596 CTYPE ("Method for doing Van der Waals");
1597 EETYPE("vdw-type", ir->vdwtype, evdw_names);
1598 EETYPE("vdw-modifier", ir->vdw_modifier, eintmod_names);
1599 CTYPE ("cut-off lengths");
1600 RTYPE ("rvdw-switch", ir->rvdw_switch, 0.0);
1601 RTYPE ("rvdw", ir->rvdw, -1);
1602 CTYPE ("Apply long range dispersion corrections for Energy and Pressure");
1603 EETYPE("DispCorr", ir->eDispCorr, edispc_names);
1604 CTYPE ("Extension of the potential lookup tables beyond the cut-off");
1605 RTYPE ("table-extension", ir->tabext, 1.0);
1606 CTYPE ("Seperate tables between energy group pairs");
1607 STYPE ("energygrp-table", egptable, NULL);
1608 CTYPE ("Spacing for the PME/PPPM FFT grid");
1609 RTYPE ("fourierspacing", ir->fourier_spacing,0.12);
1610 CTYPE ("FFT grid size, when a value is 0 fourierspacing will be used");
1611 ITYPE ("fourier-nx", ir->nkx, 0);
1612 ITYPE ("fourier-ny", ir->nky, 0);
1613 ITYPE ("fourier-nz", ir->nkz, 0);
1614 CTYPE ("EWALD/PME/PPPM parameters");
1615 ITYPE ("pme-order", ir->pme_order, 4);
1616 RTYPE ("ewald-rtol", ir->ewald_rtol, 0.00001);
1617 EETYPE("ewald-geometry", ir->ewald_geometry, eewg_names);
1618 RTYPE ("epsilon-surface", ir->epsilon_surface, 0.0);
1619 EETYPE("optimize-fft",ir->bOptFFT, yesno_names);
1621 CCTYPE("IMPLICIT SOLVENT ALGORITHM");
1622 EETYPE("implicit-solvent", ir->implicit_solvent, eis_names);
1624 CCTYPE ("GENERALIZED BORN ELECTROSTATICS");
1625 CTYPE ("Algorithm for calculating Born radii");
1626 EETYPE("gb-algorithm", ir->gb_algorithm, egb_names);
1627 CTYPE ("Frequency of calculating the Born radii inside rlist");
1628 ITYPE ("nstgbradii", ir->nstgbradii, 1);
1629 CTYPE ("Cutoff for Born radii calculation; the contribution from atoms");
1630 CTYPE ("between rlist and rgbradii is updated every nstlist steps");
1631 RTYPE ("rgbradii", ir->rgbradii, 1.0);
1632 CTYPE ("Dielectric coefficient of the implicit solvent");
1633 RTYPE ("gb-epsilon-solvent",ir->gb_epsilon_solvent, 80.0);
1634 CTYPE ("Salt concentration in M for Generalized Born models");
1635 RTYPE ("gb-saltconc", ir->gb_saltconc, 0.0);
1636 CTYPE ("Scaling factors used in the OBC GB model. Default values are OBC(II)");
1637 RTYPE ("gb-obc-alpha", ir->gb_obc_alpha, 1.0);
1638 RTYPE ("gb-obc-beta", ir->gb_obc_beta, 0.8);
1639 RTYPE ("gb-obc-gamma", ir->gb_obc_gamma, 4.85);
1640 RTYPE ("gb-dielectric-offset", ir->gb_dielectric_offset, 0.009);
1641 EETYPE("sa-algorithm", ir->sa_algorithm, esa_names);
1642 CTYPE ("Surface tension (kJ/mol/nm^2) for the SA (nonpolar surface) part of GBSA");
1643 CTYPE ("The value -1 will set default value for Still/HCT/OBC GB-models.");
1644 RTYPE ("sa-surface-tension", ir->sa_surface_tension, -1);
1646 /* Coupling stuff */
1647 CCTYPE ("OPTIONS FOR WEAK COUPLING ALGORITHMS");
1648 CTYPE ("Temperature coupling");
1649 EETYPE("tcoupl", ir->etc, etcoupl_names);
1650 ITYPE ("nsttcouple", ir->nsttcouple, -1);
1651 ITYPE("nh-chain-length", ir->opts.nhchainlength, NHCHAINLENGTH);
1652 EETYPE("print-nose-hoover-chain-variables", ir->bPrintNHChains, yesno_names);
1653 CTYPE ("Groups to couple separately");
1654 STYPE ("tc-grps", tcgrps, NULL);
1655 CTYPE ("Time constant (ps) and reference temperature (K)");
1656 STYPE ("tau-t", tau_t, NULL);
1657 STYPE ("ref-t", ref_t, NULL);
1658 CTYPE ("pressure coupling");
1659 EETYPE("pcoupl", ir->epc, epcoupl_names);
1660 EETYPE("pcoupltype", ir->epct, epcoupltype_names);
1661 ITYPE ("nstpcouple", ir->nstpcouple, -1);
1662 CTYPE ("Time constant (ps), compressibility (1/bar) and reference P (bar)");
1663 RTYPE ("tau-p", ir->tau_p, 1.0);
1664 STYPE ("compressibility", dumstr[0], NULL);
1665 STYPE ("ref-p", dumstr[1], NULL);
1666 CTYPE ("Scaling of reference coordinates, No, All or COM");
1667 EETYPE ("refcoord-scaling",ir->refcoord_scaling,erefscaling_names);
1670 CCTYPE ("OPTIONS FOR QMMM calculations");
1671 EETYPE("QMMM", ir->bQMMM, yesno_names);
1672 CTYPE ("Groups treated Quantum Mechanically");
1673 STYPE ("QMMM-grps", QMMM, NULL);
1674 CTYPE ("QM method");
1675 STYPE("QMmethod", QMmethod, NULL);
1676 CTYPE ("QMMM scheme");
1677 EETYPE("QMMMscheme", ir->QMMMscheme, eQMMMscheme_names);
1678 CTYPE ("QM basisset");
1679 STYPE("QMbasis", QMbasis, NULL);
1680 CTYPE ("QM charge");
1681 STYPE ("QMcharge", QMcharge,NULL);
1682 CTYPE ("QM multiplicity");
1683 STYPE ("QMmult", QMmult,NULL);
1684 CTYPE ("Surface Hopping");
1685 STYPE ("SH", bSH, NULL);
1686 CTYPE ("CAS space options");
1687 STYPE ("CASorbitals", CASorbitals, NULL);
1688 STYPE ("CASelectrons", CASelectrons, NULL);
1689 STYPE ("SAon", SAon, NULL);
1690 STYPE ("SAoff",SAoff,NULL);
1691 STYPE ("SAsteps", SAsteps, NULL);
1692 CTYPE ("Scale factor for MM charges");
1693 RTYPE ("MMChargeScaleFactor", ir->scalefactor, 1.0);
1694 CTYPE ("Optimization of QM subsystem");
1695 STYPE ("bOPT", bOPT, NULL);
1696 STYPE ("bTS", bTS, NULL);
1698 /* Simulated annealing */
1699 CCTYPE("SIMULATED ANNEALING");
1700 CTYPE ("Type of annealing for each temperature group (no/single/periodic)");
1701 STYPE ("annealing", anneal, NULL);
1702 CTYPE ("Number of time points to use for specifying annealing in each group");
1703 STYPE ("annealing-npoints", anneal_npoints, NULL);
1704 CTYPE ("List of times at the annealing points for each group");
1705 STYPE ("annealing-time", anneal_time, NULL);
1706 CTYPE ("Temp. at each annealing point, for each group.");
1707 STYPE ("annealing-temp", anneal_temp, NULL);
1710 CCTYPE ("GENERATE VELOCITIES FOR STARTUP RUN");
1711 EETYPE("gen-vel", opts->bGenVel, yesno_names);
1712 RTYPE ("gen-temp", opts->tempi, 300.0);
1713 ITYPE ("gen-seed", opts->seed, 173529);
1716 CCTYPE ("OPTIONS FOR BONDS");
1717 EETYPE("constraints", opts->nshake, constraints);
1718 CTYPE ("Type of constraint algorithm");
1719 EETYPE("constraint-algorithm", ir->eConstrAlg, econstr_names);
1720 CTYPE ("Do not constrain the start configuration");
1721 EETYPE("continuation", ir->bContinuation, yesno_names);
1722 CTYPE ("Use successive overrelaxation to reduce the number of shake iterations");
1723 EETYPE("Shake-SOR", ir->bShakeSOR, yesno_names);
1724 CTYPE ("Relative tolerance of shake");
1725 RTYPE ("shake-tol", ir->shake_tol, 0.0001);
1726 CTYPE ("Highest order in the expansion of the constraint coupling matrix");
1727 ITYPE ("lincs-order", ir->nProjOrder, 4);
1728 CTYPE ("Number of iterations in the final step of LINCS. 1 is fine for");
1729 CTYPE ("normal simulations, but use 2 to conserve energy in NVE runs.");
1730 CTYPE ("For energy minimization with constraints it should be 4 to 8.");
1731 ITYPE ("lincs-iter", ir->nLincsIter, 1);
1732 CTYPE ("Lincs will write a warning to the stderr if in one step a bond");
1733 CTYPE ("rotates over more degrees than");
1734 RTYPE ("lincs-warnangle", ir->LincsWarnAngle, 30.0);
1735 CTYPE ("Convert harmonic bonds to morse potentials");
1736 EETYPE("morse", opts->bMorse,yesno_names);
1738 /* Energy group exclusions */
1739 CCTYPE ("ENERGY GROUP EXCLUSIONS");
1740 CTYPE ("Pairs of energy groups for which all non-bonded interactions are excluded");
1741 STYPE ("energygrp-excl", egpexcl, NULL);
1745 CTYPE ("Number of walls, type, atom types, densities and box-z scale factor for Ewald");
1746 ITYPE ("nwall", ir->nwall, 0);
1747 EETYPE("wall-type", ir->wall_type, ewt_names);
1748 RTYPE ("wall-r-linpot", ir->wall_r_linpot, -1);
1749 STYPE ("wall-atomtype", wall_atomtype, NULL);
1750 STYPE ("wall-density", wall_density, NULL);
1751 RTYPE ("wall-ewald-zfac", ir->wall_ewald_zfac, 3);
1754 CCTYPE("COM PULLING");
1755 CTYPE("Pull type: no, umbrella, constraint or constant-force");
1756 EETYPE("pull", ir->ePull, epull_names);
1757 if (ir->ePull != epullNO) {
1759 pull_grp = read_pullparams(&ninp,&inp,ir->pull,&opts->pull_start,wi);
1762 /* Enforced rotation */
1763 CCTYPE("ENFORCED ROTATION");
1764 CTYPE("Enforced rotation: No or Yes");
1765 EETYPE("rotation", ir->bRot, yesno_names);
1768 rot_grp = read_rotparams(&ninp,&inp,ir->rot,wi);
1772 CCTYPE("NMR refinement stuff");
1773 CTYPE ("Distance restraints type: No, Simple or Ensemble");
1774 EETYPE("disre", ir->eDisre, edisre_names);
1775 CTYPE ("Force weighting of pairs in one distance restraint: Conservative or Equal");
1776 EETYPE("disre-weighting", ir->eDisreWeighting, edisreweighting_names);
1777 CTYPE ("Use sqrt of the time averaged times the instantaneous violation");
1778 EETYPE("disre-mixed", ir->bDisreMixed, yesno_names);
1779 RTYPE ("disre-fc", ir->dr_fc, 1000.0);
1780 RTYPE ("disre-tau", ir->dr_tau, 0.0);
1781 CTYPE ("Output frequency for pair distances to energy file");
1782 ITYPE ("nstdisreout", ir->nstdisreout, 100);
1783 CTYPE ("Orientation restraints: No or Yes");
1784 EETYPE("orire", opts->bOrire, yesno_names);
1785 CTYPE ("Orientation restraints force constant and tau for time averaging");
1786 RTYPE ("orire-fc", ir->orires_fc, 0.0);
1787 RTYPE ("orire-tau", ir->orires_tau, 0.0);
1788 STYPE ("orire-fitgrp",orirefitgrp, NULL);
1789 CTYPE ("Output frequency for trace(SD) and S to energy file");
1790 ITYPE ("nstorireout", ir->nstorireout, 100);
1792 /* free energy variables */
1793 CCTYPE ("Free energy variables");
1794 EETYPE("free-energy", ir->efep, efep_names);
1795 STYPE ("couple-moltype", couple_moltype, NULL);
1796 EETYPE("couple-lambda0", opts->couple_lam0, couple_lam);
1797 EETYPE("couple-lambda1", opts->couple_lam1, couple_lam);
1798 EETYPE("couple-intramol", opts->bCoupleIntra, yesno_names);
1800 RTYPE ("init-lambda", fep->init_lambda,-1); /* start with -1 so
1802 it was not entered */
1803 ITYPE ("init-lambda-state", fep->init_fep_state,0);
1804 RTYPE ("delta-lambda",fep->delta_lambda,0.0);
1805 ITYPE ("nstdhdl",fep->nstdhdl, 10);
1806 STYPE ("fep-lambdas", fep_lambda[efptFEP], NULL);
1807 STYPE ("mass-lambdas", fep_lambda[efptMASS], NULL);
1808 STYPE ("coul-lambdas", fep_lambda[efptCOUL], NULL);
1809 STYPE ("vdw-lambdas", fep_lambda[efptVDW], NULL);
1810 STYPE ("bonded-lambdas", fep_lambda[efptBONDED], NULL);
1811 STYPE ("restraint-lambdas", fep_lambda[efptRESTRAINT], NULL);
1812 STYPE ("temperature-lambdas", fep_lambda[efptTEMPERATURE], NULL);
1813 STYPE ("init-lambda-weights",lambda_weights,NULL);
1814 EETYPE("dhdl-print-energy", fep->bPrintEnergy, yesno_names);
1815 RTYPE ("sc-alpha",fep->sc_alpha,0.0);
1816 ITYPE ("sc-power",fep->sc_power,1);
1817 RTYPE ("sc-r-power",fep->sc_r_power,6.0);
1818 RTYPE ("sc-sigma",fep->sc_sigma,0.3);
1819 EETYPE("sc-coul",fep->bScCoul,yesno_names);
1820 ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
1821 RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
1822 EETYPE("separate-dhdl-file", fep->separate_dhdl_file,
1823 separate_dhdl_file_names);
1824 EETYPE("dhdl-derivatives", fep->dhdl_derivatives, dhdl_derivatives_names);
1825 ITYPE ("dh_hist_size", fep->dh_hist_size, 0);
1826 RTYPE ("dh_hist_spacing", fep->dh_hist_spacing, 0.1);
1828 /* Non-equilibrium MD stuff */
1829 CCTYPE("Non-equilibrium MD stuff");
1830 STYPE ("acc-grps", accgrps, NULL);
1831 STYPE ("accelerate", acc, NULL);
1832 STYPE ("freezegrps", freeze, NULL);
1833 STYPE ("freezedim", frdim, NULL);
1834 RTYPE ("cos-acceleration", ir->cos_accel, 0);
1835 STYPE ("deform", deform, NULL);
1837 /* simulated tempering variables */
1838 CCTYPE("simulated tempering variables");
1839 EETYPE("simulated-tempering",ir->bSimTemp,yesno_names);
1840 EETYPE("simulated-tempering-scaling",ir->simtempvals->eSimTempScale,esimtemp_names);
1841 RTYPE("sim-temp-low",ir->simtempvals->simtemp_low,300.0);
1842 RTYPE("sim-temp-high",ir->simtempvals->simtemp_high,300.0);
1844 /* expanded ensemble variables */
1845 if (ir->efep==efepEXPANDED || ir->bSimTemp)
1847 read_expandedparams(&ninp,&inp,expand,wi);
1850 /* Electric fields */
1851 CCTYPE("Electric fields");
1852 CTYPE ("Format is number of terms (int) and for all terms an amplitude (real)");
1853 CTYPE ("and a phase angle (real)");
1854 STYPE ("E-x", efield_x, NULL);
1855 STYPE ("E-xt", efield_xt, NULL);
1856 STYPE ("E-y", efield_y, NULL);
1857 STYPE ("E-yt", efield_yt, NULL);
1858 STYPE ("E-z", efield_z, NULL);
1859 STYPE ("E-zt", efield_zt, NULL);
1861 /* AdResS defined thingies */
1862 CCTYPE ("AdResS parameters");
1863 EETYPE("adress", ir->bAdress, yesno_names);
1866 read_adressparams(&ninp,&inp,ir->adress,wi);
1869 /* User defined thingies */
1870 CCTYPE ("User defined thingies");
1871 STYPE ("user1-grps", user1, NULL);
1872 STYPE ("user2-grps", user2, NULL);
1873 ITYPE ("userint1", ir->userint1, 0);
1874 ITYPE ("userint2", ir->userint2, 0);
1875 ITYPE ("userint3", ir->userint3, 0);
1876 ITYPE ("userint4", ir->userint4, 0);
1877 RTYPE ("userreal1", ir->userreal1, 0);
1878 RTYPE ("userreal2", ir->userreal2, 0);
1879 RTYPE ("userreal3", ir->userreal3, 0);
1880 RTYPE ("userreal4", ir->userreal4, 0);
1883 write_inpfile(mdparout,ninp,inp,FALSE,wi);
1884 for (i=0; (i<ninp); i++) {
1886 sfree(inp[i].value);
1890 /* Process options if necessary */
1891 for(m=0; m<2; m++) {
1892 for(i=0; i<2*DIM; i++)
1897 if (sscanf(dumstr[m],"%lf",&(dumdub[m][XX]))!=1) {
1898 warning_error(wi,"Pressure coupling not enough values (I need 1)");
1900 dumdub[m][YY]=dumdub[m][ZZ]=dumdub[m][XX];
1902 case epctSEMIISOTROPIC:
1903 case epctSURFACETENSION:
1904 if (sscanf(dumstr[m],"%lf%lf",
1905 &(dumdub[m][XX]),&(dumdub[m][ZZ]))!=2) {
1906 warning_error(wi,"Pressure coupling not enough values (I need 2)");
1908 dumdub[m][YY]=dumdub[m][XX];
1910 case epctANISOTROPIC:
1911 if (sscanf(dumstr[m],"%lf%lf%lf%lf%lf%lf",
1912 &(dumdub[m][XX]),&(dumdub[m][YY]),&(dumdub[m][ZZ]),
1913 &(dumdub[m][3]),&(dumdub[m][4]),&(dumdub[m][5]))!=6) {
1914 warning_error(wi,"Pressure coupling not enough values (I need 6)");
1918 gmx_fatal(FARGS,"Pressure coupling type %s not implemented yet",
1919 epcoupltype_names[ir->epct]);
1923 clear_mat(ir->ref_p);
1924 clear_mat(ir->compress);
1925 for(i=0; i<DIM; i++) {
1926 ir->ref_p[i][i] = dumdub[1][i];
1927 ir->compress[i][i] = dumdub[0][i];
1929 if (ir->epct == epctANISOTROPIC) {
1930 ir->ref_p[XX][YY] = dumdub[1][3];
1931 ir->ref_p[XX][ZZ] = dumdub[1][4];
1932 ir->ref_p[YY][ZZ] = dumdub[1][5];
1933 if (ir->ref_p[XX][YY]!=0 && ir->ref_p[XX][ZZ]!=0 && ir->ref_p[YY][ZZ]!=0) {
1934 warning(wi,"All off-diagonal reference pressures are non-zero. Are you sure you want to apply a threefold shear stress?\n");
1936 ir->compress[XX][YY] = dumdub[0][3];
1937 ir->compress[XX][ZZ] = dumdub[0][4];
1938 ir->compress[YY][ZZ] = dumdub[0][5];
1939 for(i=0; i<DIM; i++) {
1940 for(m=0; m<i; m++) {
1941 ir->ref_p[i][m] = ir->ref_p[m][i];
1942 ir->compress[i][m] = ir->compress[m][i];
1947 if (ir->comm_mode == ecmNO)
1950 opts->couple_moltype = NULL;
1951 if (strlen(couple_moltype) > 0)
1953 if (ir->efep != efepNO)
1955 opts->couple_moltype = strdup(couple_moltype);
1956 if (opts->couple_lam0 == opts->couple_lam1)
1958 warning(wi,"The lambda=0 and lambda=1 states for coupling are identical");
1960 if (ir->eI == eiMD && (opts->couple_lam0 == ecouplamNONE ||
1961 opts->couple_lam1 == ecouplamNONE))
1963 warning(wi,"For proper sampling of the (nearly) decoupled state, stochastic dynamics should be used");
1968 warning(wi,"Can not couple a molecule with free_energy = no");
1971 /* FREE ENERGY AND EXPANDED ENSEMBLE OPTIONS */
1972 if (ir->efep != efepNO) {
1973 if (fep->delta_lambda > 0) {
1974 ir->efep = efepSLOWGROWTH;
1979 fep->bPrintEnergy = TRUE;
1980 /* always print out the energy to dhdl if we are doing expanded ensemble, since we need the total energy
1981 if the temperature is changing. */
1984 if ((ir->efep != efepNO) || ir->bSimTemp)
1986 ir->bExpanded = FALSE;
1987 if ((ir->efep == efepEXPANDED) || ir->bSimTemp)
1989 ir->bExpanded = TRUE;
1991 do_fep_params(ir,fep_lambda,lambda_weights);
1992 if (ir->bSimTemp) { /* done after fep params */
1993 do_simtemp_params(ir);
1998 ir->fepvals->n_lambda = 0;
2001 /* WALL PARAMETERS */
2003 do_wall_params(ir,wall_atomtype,wall_density,opts);
2005 /* ORIENTATION RESTRAINT PARAMETERS */
2007 if (opts->bOrire && str_nelem(orirefitgrp,MAXPTR,NULL)!=1) {
2008 warning_error(wi,"ERROR: Need one orientation restraint fit group\n");
2011 /* DEFORMATION PARAMETERS */
2013 clear_mat(ir->deform);
2018 m = sscanf(deform,"%lf %lf %lf %lf %lf %lf",
2019 &(dumdub[0][0]),&(dumdub[0][1]),&(dumdub[0][2]),
2020 &(dumdub[0][3]),&(dumdub[0][4]),&(dumdub[0][5]));
2023 ir->deform[i][i] = dumdub[0][i];
2025 ir->deform[YY][XX] = dumdub[0][3];
2026 ir->deform[ZZ][XX] = dumdub[0][4];
2027 ir->deform[ZZ][YY] = dumdub[0][5];
2028 if (ir->epc != epcNO) {
2031 if (ir->deform[i][j]!=0 && ir->compress[i][j]!=0) {
2032 warning_error(wi,"A box element has deform set and compressibility > 0");
2036 if (ir->deform[i][j]!=0) {
2037 for(m=j; m<DIM; m++)
2038 if (ir->compress[m][j]!=0) {
2039 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.");
2040 warning(wi,warn_buf);
2049 static int search_QMstring(char *s,int ng,const char *gn[])
2051 /* same as normal search_string, but this one searches QM strings */
2054 for(i=0; (i<ng); i++)
2055 if (gmx_strcasecmp(s,gn[i]) == 0)
2058 gmx_fatal(FARGS,"this QM method or basisset (%s) is not implemented\n!",s);
2062 } /* search_QMstring */
2065 int search_string(char *s,int ng,char *gn[])
2069 for(i=0; (i<ng); i++)
2071 if (gmx_strcasecmp(s,gn[i]) == 0)
2078 "Group %s referenced in the .mdp file was not found in the index file.\n"
2079 "Group names must match either [moleculetype] names or custom index group\n"
2080 "names, in which case you must supply an index file to the '-n' option\n"
2087 static gmx_bool do_numbering(int natoms,gmx_groups_t *groups,int ng,char *ptrs[],
2088 t_blocka *block,char *gnames[],
2089 int gtype,int restnm,
2090 int grptp,gmx_bool bVerbose,
2093 unsigned short *cbuf;
2094 t_grps *grps=&(groups->grps[gtype]);
2095 int i,j,gid,aj,ognr,ntot=0;
2098 char warn_buf[STRLEN];
2102 fprintf(debug,"Starting numbering %d groups of type %d\n",ng,gtype);
2105 title = gtypes[gtype];
2108 /* Mark all id's as not set */
2109 for(i=0; (i<natoms); i++)
2114 snew(grps->nm_ind,ng+1); /* +1 for possible rest group */
2115 for(i=0; (i<ng); i++)
2117 /* Lookup the group name in the block structure */
2118 gid = search_string(ptrs[i],block->nr,gnames);
2119 if ((grptp != egrptpONE) || (i == 0))
2121 grps->nm_ind[grps->nr++]=gid;
2125 fprintf(debug,"Found gid %d for group %s\n",gid,ptrs[i]);
2128 /* Now go over the atoms in the group */
2129 for(j=block->index[gid]; (j<block->index[gid+1]); j++)
2134 /* Range checking */
2135 if ((aj < 0) || (aj >= natoms))
2137 gmx_fatal(FARGS,"Invalid atom number %d in indexfile",aj);
2139 /* Lookup up the old group number */
2143 gmx_fatal(FARGS,"Atom %d in multiple %s groups (%d and %d)",
2144 aj+1,title,ognr+1,i+1);
2148 /* Store the group number in buffer */
2149 if (grptp == egrptpONE)
2162 /* Now check whether we have done all atoms */
2166 if (grptp == egrptpALL)
2168 gmx_fatal(FARGS,"%d atoms are not part of any of the %s groups",
2171 else if (grptp == egrptpPART)
2173 sprintf(warn_buf,"%d atoms are not part of any of the %s groups",
2175 warning_note(wi,warn_buf);
2177 /* Assign all atoms currently unassigned to a rest group */
2178 for(j=0; (j<natoms); j++)
2180 if (cbuf[j] == NOGID)
2186 if (grptp != egrptpPART)
2191 "Making dummy/rest group for %s containing %d elements\n",
2194 /* Add group name "rest" */
2195 grps->nm_ind[grps->nr] = restnm;
2197 /* Assign the rest name to all atoms not currently assigned to a group */
2198 for(j=0; (j<natoms); j++)
2200 if (cbuf[j] == NOGID)
2209 if (grps->nr == 1 && (ntot == 0 || ntot == natoms))
2211 /* All atoms are part of one (or no) group, no index required */
2212 groups->ngrpnr[gtype] = 0;
2213 groups->grpnr[gtype] = NULL;
2217 groups->ngrpnr[gtype] = natoms;
2218 snew(groups->grpnr[gtype],natoms);
2219 for(j=0; (j<natoms); j++)
2221 groups->grpnr[gtype][j] = cbuf[j];
2227 return (bRest && grptp == egrptpPART);
2230 static void calc_nrdf(gmx_mtop_t *mtop,t_inputrec *ir,char **gnames)
2233 gmx_groups_t *groups;
2235 int natoms,ai,aj,i,j,d,g,imin,jmin,nc;
2237 int *nrdf2,*na_vcm,na_tot;
2238 double *nrdf_tc,*nrdf_vcm,nrdf_uc,n_sub=0;
2239 gmx_mtop_atomloop_all_t aloop;
2241 int mb,mol,ftype,as;
2242 gmx_molblock_t *molb;
2243 gmx_moltype_t *molt;
2246 * First calc 3xnr-atoms for each group
2247 * then subtract half a degree of freedom for each constraint
2249 * Only atoms and nuclei contribute to the degrees of freedom...
2254 groups = &mtop->groups;
2255 natoms = mtop->natoms;
2257 /* Allocate one more for a possible rest group */
2258 /* We need to sum degrees of freedom into doubles,
2259 * since floats give too low nrdf's above 3 million atoms.
2261 snew(nrdf_tc,groups->grps[egcTC].nr+1);
2262 snew(nrdf_vcm,groups->grps[egcVCM].nr+1);
2263 snew(na_vcm,groups->grps[egcVCM].nr+1);
2265 for(i=0; i<groups->grps[egcTC].nr; i++)
2267 for(i=0; i<groups->grps[egcVCM].nr+1; i++)
2271 aloop = gmx_mtop_atomloop_all_init(mtop);
2272 while (gmx_mtop_atomloop_all_next(aloop,&i,&atom)) {
2274 if (atom->ptype == eptAtom || atom->ptype == eptNucleus) {
2275 g = ggrpnr(groups,egcFREEZE,i);
2276 /* Double count nrdf for particle i */
2277 for(d=0; d<DIM; d++) {
2278 if (opts->nFreeze[g][d] == 0) {
2282 nrdf_tc [ggrpnr(groups,egcTC ,i)] += 0.5*nrdf2[i];
2283 nrdf_vcm[ggrpnr(groups,egcVCM,i)] += 0.5*nrdf2[i];
2288 for(mb=0; mb<mtop->nmolblock; mb++) {
2289 molb = &mtop->molblock[mb];
2290 molt = &mtop->moltype[molb->type];
2291 atom = molt->atoms.atom;
2292 for(mol=0; mol<molb->nmol; mol++) {
2293 for (ftype=F_CONSTR; ftype<=F_CONSTRNC; ftype++) {
2294 ia = molt->ilist[ftype].iatoms;
2295 for(i=0; i<molt->ilist[ftype].nr; ) {
2296 /* Subtract degrees of freedom for the constraints,
2297 * if the particles still have degrees of freedom left.
2298 * If one of the particles is a vsite or a shell, then all
2299 * constraint motion will go there, but since they do not
2300 * contribute to the constraints the degrees of freedom do not
2305 if (((atom[ia[1]].ptype == eptNucleus) ||
2306 (atom[ia[1]].ptype == eptAtom)) &&
2307 ((atom[ia[2]].ptype == eptNucleus) ||
2308 (atom[ia[2]].ptype == eptAtom))) {
2317 imin = min(imin,nrdf2[ai]);
2318 jmin = min(jmin,nrdf2[aj]);
2321 nrdf_tc [ggrpnr(groups,egcTC ,ai)] -= 0.5*imin;
2322 nrdf_tc [ggrpnr(groups,egcTC ,aj)] -= 0.5*jmin;
2323 nrdf_vcm[ggrpnr(groups,egcVCM,ai)] -= 0.5*imin;
2324 nrdf_vcm[ggrpnr(groups,egcVCM,aj)] -= 0.5*jmin;
2326 ia += interaction_function[ftype].nratoms+1;
2327 i += interaction_function[ftype].nratoms+1;
2330 ia = molt->ilist[F_SETTLE].iatoms;
2331 for(i=0; i<molt->ilist[F_SETTLE].nr; ) {
2332 /* Subtract 1 dof from every atom in the SETTLE */
2333 for(j=0; j<3; j++) {
2335 imin = min(2,nrdf2[ai]);
2337 nrdf_tc [ggrpnr(groups,egcTC ,ai)] -= 0.5*imin;
2338 nrdf_vcm[ggrpnr(groups,egcVCM,ai)] -= 0.5*imin;
2343 as += molt->atoms.nr;
2347 if (ir->ePull == epullCONSTRAINT) {
2348 /* Correct nrdf for the COM constraints.
2349 * We correct using the TC and VCM group of the first atom
2350 * in the reference and pull group. If atoms in one pull group
2351 * belong to different TC or VCM groups it is anyhow difficult
2352 * to determine the optimal nrdf assignment.
2355 if (pull->eGeom == epullgPOS) {
2357 for(i=0; i<DIM; i++) {
2364 for(i=0; i<pull->ngrp; i++) {
2366 if (pull->grp[0].nat > 0) {
2367 /* Subtract 1/2 dof from the reference group */
2368 ai = pull->grp[0].ind[0];
2369 if (nrdf_tc[ggrpnr(groups,egcTC,ai)] > 1) {
2370 nrdf_tc [ggrpnr(groups,egcTC ,ai)] -= 0.5;
2371 nrdf_vcm[ggrpnr(groups,egcVCM,ai)] -= 0.5;
2375 /* Subtract 1/2 dof from the pulled group */
2376 ai = pull->grp[1+i].ind[0];
2377 nrdf_tc [ggrpnr(groups,egcTC ,ai)] -= 0.5*imin;
2378 nrdf_vcm[ggrpnr(groups,egcVCM,ai)] -= 0.5*imin;
2379 if (nrdf_tc[ggrpnr(groups,egcTC,ai)] < 0)
2380 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)]]);
2384 if (ir->nstcomm != 0) {
2385 /* Subtract 3 from the number of degrees of freedom in each vcm group
2386 * when com translation is removed and 6 when rotation is removed
2389 switch (ir->comm_mode) {
2391 n_sub = ndof_com(ir);
2398 gmx_incons("Checking comm_mode");
2401 for(i=0; i<groups->grps[egcTC].nr; i++) {
2402 /* Count the number of atoms of TC group i for every VCM group */
2403 for(j=0; j<groups->grps[egcVCM].nr+1; j++)
2406 for(ai=0; ai<natoms; ai++)
2407 if (ggrpnr(groups,egcTC,ai) == i) {
2408 na_vcm[ggrpnr(groups,egcVCM,ai)]++;
2411 /* Correct for VCM removal according to the fraction of each VCM
2412 * group present in this TC group.
2414 nrdf_uc = nrdf_tc[i];
2416 fprintf(debug,"T-group[%d] nrdf_uc = %g, n_sub = %g\n",
2420 for(j=0; j<groups->grps[egcVCM].nr+1; j++) {
2421 if (nrdf_vcm[j] > n_sub) {
2422 nrdf_tc[i] += nrdf_uc*((double)na_vcm[j]/(double)na_tot)*
2423 (nrdf_vcm[j] - n_sub)/nrdf_vcm[j];
2426 fprintf(debug," nrdf_vcm[%d] = %g, nrdf = %g\n",
2427 j,nrdf_vcm[j],nrdf_tc[i]);
2432 for(i=0; (i<groups->grps[egcTC].nr); i++) {
2433 opts->nrdf[i] = nrdf_tc[i];
2434 if (opts->nrdf[i] < 0)
2437 "Number of degrees of freedom in T-Coupling group %s is %.2f\n",
2438 gnames[groups->grps[egcTC].nm_ind[i]],opts->nrdf[i]);
2447 static void decode_cos(char *s,t_cosines *cosine,gmx_bool bTime)
2450 char format[STRLEN],f1[STRLEN];
2461 sscanf(t,"%d",&(cosine->n));
2462 if (cosine->n <= 0) {
2465 snew(cosine->a,cosine->n);
2466 snew(cosine->phi,cosine->n);
2468 sprintf(format,"%%*d");
2469 for(i=0; (i<cosine->n); i++) {
2471 strcat(f1,"%lf%lf");
2472 if (sscanf(t,f1,&a,&phi) < 2)
2473 gmx_fatal(FARGS,"Invalid input for electric field shift: '%s'",t);
2476 strcat(format,"%*lf%*lf");
2483 static gmx_bool do_egp_flag(t_inputrec *ir,gmx_groups_t *groups,
2484 const char *option,const char *val,int flag)
2486 /* The maximum number of energy group pairs would be MAXPTR*(MAXPTR+1)/2.
2487 * But since this is much larger than STRLEN, such a line can not be parsed.
2488 * The real maximum is the number of names that fit in a string: STRLEN/2.
2490 #define EGP_MAX (STRLEN/2)
2492 char *names[EGP_MAX];
2496 gnames = groups->grpname;
2498 nelem = str_nelem(val,EGP_MAX,names);
2500 gmx_fatal(FARGS,"The number of groups for %s is odd",option);
2501 nr = groups->grps[egcENER].nr;
2503 for(i=0; i<nelem/2; i++) {
2506 gmx_strcasecmp(names[2*i],*(gnames[groups->grps[egcENER].nm_ind[j]])))
2509 gmx_fatal(FARGS,"%s in %s is not an energy group\n",
2513 gmx_strcasecmp(names[2*i+1],*(gnames[groups->grps[egcENER].nm_ind[k]])))
2516 gmx_fatal(FARGS,"%s in %s is not an energy group\n",
2517 names[2*i+1],option);
2518 if ((j < nr) && (k < nr)) {
2519 ir->opts.egp_flags[nr*j+k] |= flag;
2520 ir->opts.egp_flags[nr*k+j] |= flag;
2528 void do_index(const char* mdparin, const char *ndx,
2531 t_inputrec *ir,rvec *v,
2535 gmx_groups_t *groups;
2539 char warnbuf[STRLEN],**gnames;
2540 int nr,ntcg,ntau_t,nref_t,nacc,nofg,nSA,nSA_points,nSA_time,nSA_temp;
2543 int nacg,nfreeze,nfrdim,nenergy,nvcm,nuser;
2544 char *ptr1[MAXPTR],*ptr2[MAXPTR],*ptr3[MAXPTR];
2547 gmx_bool bExcl,bTable,bSetTCpar,bAnneal,bRest;
2548 int nQMmethod,nQMbasis,nQMcharge,nQMmult,nbSH,nCASorb,nCASelec,
2549 nSAon,nSAoff,nSAsteps,nQMg,nbOPT,nbTS;
2550 char warn_buf[STRLEN];
2553 fprintf(stderr,"processing index file...\n");
2557 snew(grps->index,1);
2559 atoms_all = gmx_mtop_global_atoms(mtop);
2560 analyse(&atoms_all,grps,&gnames,FALSE,TRUE);
2561 free_t_atoms(&atoms_all,FALSE);
2563 grps = init_index(ndx,&gnames);
2566 groups = &mtop->groups;
2567 natoms = mtop->natoms;
2568 symtab = &mtop->symtab;
2570 snew(groups->grpname,grps->nr+1);
2572 for(i=0; (i<grps->nr); i++) {
2573 groups->grpname[i] = put_symtab(symtab,gnames[i]);
2575 groups->grpname[i] = put_symtab(symtab,"rest");
2577 srenew(gnames,grps->nr+1);
2578 gnames[restnm] = *(groups->grpname[i]);
2579 groups->ngrpname = grps->nr+1;
2581 set_warning_line(wi,mdparin,-1);
2583 ntau_t = str_nelem(tau_t,MAXPTR,ptr1);
2584 nref_t = str_nelem(ref_t,MAXPTR,ptr2);
2585 ntcg = str_nelem(tcgrps,MAXPTR,ptr3);
2586 if ((ntau_t != ntcg) || (nref_t != ntcg)) {
2587 gmx_fatal(FARGS,"Invalid T coupling input: %d groups, %d ref-t values and "
2588 "%d tau-t values",ntcg,nref_t,ntau_t);
2591 bSetTCpar = (ir->etc || EI_SD(ir->eI) || ir->eI==eiBD || EI_TPI(ir->eI));
2592 do_numbering(natoms,groups,ntcg,ptr3,grps,gnames,egcTC,
2593 restnm,bSetTCpar ? egrptpALL : egrptpALL_GENREST,bVerbose,wi);
2594 nr = groups->grps[egcTC].nr;
2596 snew(ir->opts.nrdf,nr);
2597 snew(ir->opts.tau_t,nr);
2598 snew(ir->opts.ref_t,nr);
2599 if (ir->eI==eiBD && ir->bd_fric==0) {
2600 fprintf(stderr,"bd-fric=0, so tau-t will be used as the inverse friction constant(s)\n");
2607 gmx_fatal(FARGS,"Not enough ref-t and tau-t values!");
2611 for(i=0; (i<nr); i++)
2613 ir->opts.tau_t[i] = strtod(ptr1[i],NULL);
2614 if ((ir->eI == eiBD || ir->eI == eiSD2) && ir->opts.tau_t[i] <= 0)
2616 sprintf(warn_buf,"With integrator %s tau-t should be larger than 0",ei_names[ir->eI]);
2617 warning_error(wi,warn_buf);
2620 if (ir->etc != etcVRESCALE && ir->opts.tau_t[i] == 0)
2622 warning_note(wi,"tau-t = -1 is the new value to signal that a group should not have temperature coupling. Treating your use of tau-t = 0 as if you used -1.");
2625 if (ir->opts.tau_t[i] >= 0)
2627 tau_min = min(tau_min,ir->opts.tau_t[i]);
2630 if (ir->etc != etcNO && ir->nsttcouple == -1)
2632 ir->nsttcouple = ir_optimal_nsttcouple(ir);
2637 if ((ir->etc==etcNOSEHOOVER) && (ir->epc==epcBERENDSEN)) {
2638 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");
2640 if ((ir->epc==epcMTTK) && (ir->etc>etcNO))
2643 mincouple = ir->nsttcouple;
2644 if (ir->nstpcouple < mincouple)
2646 mincouple = ir->nstpcouple;
2648 ir->nstpcouple = mincouple;
2649 ir->nsttcouple = mincouple;
2650 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);
2651 warning_note(wi,warn_buf);
2654 /* velocity verlet with averaged kinetic energy KE = 0.5*(v(t+1/2) - v(t-1/2)) is implemented
2655 primarily for testing purposes, and does not work with temperature coupling other than 1 */
2657 if (ETC_ANDERSEN(ir->etc)) {
2658 if (ir->nsttcouple != 1) {
2660 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");
2661 warning_note(wi,warn_buf);
2664 nstcmin = tcouple_min_integration_steps(ir->etc);
2667 if (tau_min/(ir->delta_t*ir->nsttcouple) < nstcmin)
2669 sprintf(warn_buf,"For proper integration of the %s thermostat, tau-t (%g) should be at least %d times larger than nsttcouple*dt (%g)",
2670 ETCOUPLTYPE(ir->etc),
2672 ir->nsttcouple*ir->delta_t);
2673 warning(wi,warn_buf);
2676 for(i=0; (i<nr); i++)
2678 ir->opts.ref_t[i] = strtod(ptr2[i],NULL);
2679 if (ir->opts.ref_t[i] < 0)
2681 gmx_fatal(FARGS,"ref-t for group %d negative",i);
2684 /* set the lambda mc temperature to the md integrator temperature (which should be defined
2685 if we are in this conditional) if mc_temp is negative */
2686 if (ir->expandedvals->mc_temp < 0)
2688 ir->expandedvals->mc_temp = ir->opts.ref_t[0]; /*for now, set to the first reft */
2692 /* Simulated annealing for each group. There are nr groups */
2693 nSA = str_nelem(anneal,MAXPTR,ptr1);
2694 if (nSA == 1 && (ptr1[0][0]=='n' || ptr1[0][0]=='N'))
2696 if(nSA>0 && nSA != nr)
2697 gmx_fatal(FARGS,"Not enough annealing values: %d (for %d groups)\n",nSA,nr);
2699 snew(ir->opts.annealing,nr);
2700 snew(ir->opts.anneal_npoints,nr);
2701 snew(ir->opts.anneal_time,nr);
2702 snew(ir->opts.anneal_temp,nr);
2704 ir->opts.annealing[i]=eannNO;
2705 ir->opts.anneal_npoints[i]=0;
2706 ir->opts.anneal_time[i]=NULL;
2707 ir->opts.anneal_temp[i]=NULL;
2712 if(ptr1[i][0]=='n' || ptr1[i][0]=='N') {
2713 ir->opts.annealing[i]=eannNO;
2714 } else if(ptr1[i][0]=='s'|| ptr1[i][0]=='S') {
2715 ir->opts.annealing[i]=eannSINGLE;
2717 } else if(ptr1[i][0]=='p'|| ptr1[i][0]=='P') {
2718 ir->opts.annealing[i]=eannPERIODIC;
2723 /* Read the other fields too */
2724 nSA_points = str_nelem(anneal_npoints,MAXPTR,ptr1);
2726 gmx_fatal(FARGS,"Found %d annealing-npoints values for %d groups\n",nSA_points,nSA);
2727 for(k=0,i=0;i<nr;i++) {
2728 ir->opts.anneal_npoints[i]=strtol(ptr1[i],NULL,10);
2729 if(ir->opts.anneal_npoints[i]==1)
2730 gmx_fatal(FARGS,"Please specify at least a start and an end point for annealing\n");
2731 snew(ir->opts.anneal_time[i],ir->opts.anneal_npoints[i]);
2732 snew(ir->opts.anneal_temp[i],ir->opts.anneal_npoints[i]);
2733 k += ir->opts.anneal_npoints[i];
2736 nSA_time = str_nelem(anneal_time,MAXPTR,ptr1);
2738 gmx_fatal(FARGS,"Found %d annealing-time values, wanter %d\n",nSA_time,k);
2739 nSA_temp = str_nelem(anneal_temp,MAXPTR,ptr2);
2741 gmx_fatal(FARGS,"Found %d annealing-temp values, wanted %d\n",nSA_temp,k);
2743 for(i=0,k=0;i<nr;i++) {
2745 for(j=0;j<ir->opts.anneal_npoints[i];j++) {
2746 ir->opts.anneal_time[i][j]=strtod(ptr1[k],NULL);
2747 ir->opts.anneal_temp[i][j]=strtod(ptr2[k],NULL);
2749 if(ir->opts.anneal_time[i][0] > (ir->init_t+GMX_REAL_EPS))
2750 gmx_fatal(FARGS,"First time point for annealing > init_t.\n");
2753 if(ir->opts.anneal_time[i][j]<ir->opts.anneal_time[i][j-1])
2754 gmx_fatal(FARGS,"Annealing timepoints out of order: t=%f comes after t=%f\n",
2755 ir->opts.anneal_time[i][j],ir->opts.anneal_time[i][j-1]);
2757 if(ir->opts.anneal_temp[i][j]<0)
2758 gmx_fatal(FARGS,"Found negative temperature in annealing: %f\n",ir->opts.anneal_temp[i][j]);
2762 /* Print out some summary information, to make sure we got it right */
2763 for(i=0,k=0;i<nr;i++) {
2764 if(ir->opts.annealing[i]!=eannNO) {
2765 j = groups->grps[egcTC].nm_ind[i];
2766 fprintf(stderr,"Simulated annealing for group %s: %s, %d timepoints\n",
2767 *(groups->grpname[j]),eann_names[ir->opts.annealing[i]],
2768 ir->opts.anneal_npoints[i]);
2769 fprintf(stderr,"Time (ps) Temperature (K)\n");
2770 /* All terms except the last one */
2771 for(j=0;j<(ir->opts.anneal_npoints[i]-1);j++)
2772 fprintf(stderr,"%9.1f %5.1f\n",ir->opts.anneal_time[i][j],ir->opts.anneal_temp[i][j]);
2774 /* Finally the last one */
2775 j = ir->opts.anneal_npoints[i]-1;
2776 if(ir->opts.annealing[i]==eannSINGLE)
2777 fprintf(stderr,"%9.1f- %5.1f\n",ir->opts.anneal_time[i][j],ir->opts.anneal_temp[i][j]);
2779 fprintf(stderr,"%9.1f %5.1f\n",ir->opts.anneal_time[i][j],ir->opts.anneal_temp[i][j]);
2780 if(fabs(ir->opts.anneal_temp[i][j]-ir->opts.anneal_temp[i][0])>GMX_REAL_EPS)
2781 warning_note(wi,"There is a temperature jump when your annealing loops back.\n");
2789 if (ir->ePull != epullNO) {
2790 make_pull_groups(ir->pull,pull_grp,grps,gnames);
2794 make_rotation_groups(ir->rot,rot_grp,grps,gnames);
2797 nacc = str_nelem(acc,MAXPTR,ptr1);
2798 nacg = str_nelem(accgrps,MAXPTR,ptr2);
2799 if (nacg*DIM != nacc)
2800 gmx_fatal(FARGS,"Invalid Acceleration input: %d groups and %d acc. values",
2802 do_numbering(natoms,groups,nacg,ptr2,grps,gnames,egcACC,
2803 restnm,egrptpALL_GENREST,bVerbose,wi);
2804 nr = groups->grps[egcACC].nr;
2805 snew(ir->opts.acc,nr);
2808 for(i=k=0; (i<nacg); i++)
2809 for(j=0; (j<DIM); j++,k++)
2810 ir->opts.acc[i][j]=strtod(ptr1[k],NULL);
2812 for(j=0; (j<DIM); j++)
2813 ir->opts.acc[i][j]=0;
2815 nfrdim = str_nelem(frdim,MAXPTR,ptr1);
2816 nfreeze = str_nelem(freeze,MAXPTR,ptr2);
2817 if (nfrdim != DIM*nfreeze)
2818 gmx_fatal(FARGS,"Invalid Freezing input: %d groups and %d freeze values",
2820 do_numbering(natoms,groups,nfreeze,ptr2,grps,gnames,egcFREEZE,
2821 restnm,egrptpALL_GENREST,bVerbose,wi);
2822 nr = groups->grps[egcFREEZE].nr;
2824 snew(ir->opts.nFreeze,nr);
2825 for(i=k=0; (i<nfreeze); i++)
2826 for(j=0; (j<DIM); j++,k++) {
2827 ir->opts.nFreeze[i][j]=(gmx_strncasecmp(ptr1[k],"Y",1)==0);
2828 if (!ir->opts.nFreeze[i][j]) {
2829 if (gmx_strncasecmp(ptr1[k],"N",1) != 0) {
2830 sprintf(warnbuf,"Please use Y(ES) or N(O) for freezedim only "
2831 "(not %s)", ptr1[k]);
2832 warning(wi,warn_buf);
2837 for(j=0; (j<DIM); j++)
2838 ir->opts.nFreeze[i][j]=0;
2840 nenergy=str_nelem(energy,MAXPTR,ptr1);
2841 do_numbering(natoms,groups,nenergy,ptr1,grps,gnames,egcENER,
2842 restnm,egrptpALL_GENREST,bVerbose,wi);
2843 add_wall_energrps(groups,ir->nwall,symtab);
2844 ir->opts.ngener = groups->grps[egcENER].nr;
2845 nvcm=str_nelem(vcm,MAXPTR,ptr1);
2847 do_numbering(natoms,groups,nvcm,ptr1,grps,gnames,egcVCM,
2848 restnm,nvcm==0 ? egrptpALL_GENREST : egrptpPART,bVerbose,wi);
2850 warning(wi,"Some atoms are not part of any center of mass motion removal group.\n"
2851 "This may lead to artifacts.\n"
2852 "In most cases one should use one group for the whole system.");
2855 /* Now we have filled the freeze struct, so we can calculate NRDF */
2856 calc_nrdf(mtop,ir,gnames);
2861 /* Must check per group! */
2862 for(i=0; (i<ir->opts.ngtc); i++)
2863 ntot += ir->opts.nrdf[i];
2864 if (ntot != (DIM*natoms)) {
2865 fac = sqrt(ntot/(DIM*natoms));
2867 fprintf(stderr,"Scaling velocities by a factor of %.3f to account for constraints\n"
2868 "and removal of center of mass motion\n",fac);
2869 for(i=0; (i<natoms); i++)
2870 svmul(fac,v[i],v[i]);
2874 nuser=str_nelem(user1,MAXPTR,ptr1);
2875 do_numbering(natoms,groups,nuser,ptr1,grps,gnames,egcUser1,
2876 restnm,egrptpALL_GENREST,bVerbose,wi);
2877 nuser=str_nelem(user2,MAXPTR,ptr1);
2878 do_numbering(natoms,groups,nuser,ptr1,grps,gnames,egcUser2,
2879 restnm,egrptpALL_GENREST,bVerbose,wi);
2880 nuser=str_nelem(xtc_grps,MAXPTR,ptr1);
2881 do_numbering(natoms,groups,nuser,ptr1,grps,gnames,egcXTC,
2882 restnm,egrptpONE,bVerbose,wi);
2883 nofg = str_nelem(orirefitgrp,MAXPTR,ptr1);
2884 do_numbering(natoms,groups,nofg,ptr1,grps,gnames,egcORFIT,
2885 restnm,egrptpALL_GENREST,bVerbose,wi);
2887 /* QMMM input processing */
2888 nQMg = str_nelem(QMMM,MAXPTR,ptr1);
2889 nQMmethod = str_nelem(QMmethod,MAXPTR,ptr2);
2890 nQMbasis = str_nelem(QMbasis,MAXPTR,ptr3);
2891 if((nQMmethod != nQMg)||(nQMbasis != nQMg)){
2892 gmx_fatal(FARGS,"Invalid QMMM input: %d groups %d basissets"
2893 " and %d methods\n",nQMg,nQMbasis,nQMmethod);
2895 /* group rest, if any, is always MM! */
2896 do_numbering(natoms,groups,nQMg,ptr1,grps,gnames,egcQMMM,
2897 restnm,egrptpALL_GENREST,bVerbose,wi);
2898 nr = nQMg; /*atoms->grps[egcQMMM].nr;*/
2899 ir->opts.ngQM = nQMg;
2900 snew(ir->opts.QMmethod,nr);
2901 snew(ir->opts.QMbasis,nr);
2903 /* input consists of strings: RHF CASSCF PM3 .. These need to be
2904 * converted to the corresponding enum in names.c
2906 ir->opts.QMmethod[i] = search_QMstring(ptr2[i],eQMmethodNR,
2908 ir->opts.QMbasis[i] = search_QMstring(ptr3[i],eQMbasisNR,
2912 nQMmult = str_nelem(QMmult,MAXPTR,ptr1);
2913 nQMcharge = str_nelem(QMcharge,MAXPTR,ptr2);
2914 nbSH = str_nelem(bSH,MAXPTR,ptr3);
2915 snew(ir->opts.QMmult,nr);
2916 snew(ir->opts.QMcharge,nr);
2917 snew(ir->opts.bSH,nr);
2920 ir->opts.QMmult[i] = strtol(ptr1[i],NULL,10);
2921 ir->opts.QMcharge[i] = strtol(ptr2[i],NULL,10);
2922 ir->opts.bSH[i] = (gmx_strncasecmp(ptr3[i],"Y",1)==0);
2925 nCASelec = str_nelem(CASelectrons,MAXPTR,ptr1);
2926 nCASorb = str_nelem(CASorbitals,MAXPTR,ptr2);
2927 snew(ir->opts.CASelectrons,nr);
2928 snew(ir->opts.CASorbitals,nr);
2930 ir->opts.CASelectrons[i]= strtol(ptr1[i],NULL,10);
2931 ir->opts.CASorbitals[i] = strtol(ptr2[i],NULL,10);
2933 /* special optimization options */
2935 nbOPT = str_nelem(bOPT,MAXPTR,ptr1);
2936 nbTS = str_nelem(bTS,MAXPTR,ptr2);
2937 snew(ir->opts.bOPT,nr);
2938 snew(ir->opts.bTS,nr);
2940 ir->opts.bOPT[i] = (gmx_strncasecmp(ptr1[i],"Y",1)==0);
2941 ir->opts.bTS[i] = (gmx_strncasecmp(ptr2[i],"Y",1)==0);
2943 nSAon = str_nelem(SAon,MAXPTR,ptr1);
2944 nSAoff = str_nelem(SAoff,MAXPTR,ptr2);
2945 nSAsteps = str_nelem(SAsteps,MAXPTR,ptr3);
2946 snew(ir->opts.SAon,nr);
2947 snew(ir->opts.SAoff,nr);
2948 snew(ir->opts.SAsteps,nr);
2951 ir->opts.SAon[i] = strtod(ptr1[i],NULL);
2952 ir->opts.SAoff[i] = strtod(ptr2[i],NULL);
2953 ir->opts.SAsteps[i] = strtol(ptr3[i],NULL,10);
2955 /* end of QMMM input */
2958 for(i=0; (i<egcNR); i++) {
2959 fprintf(stderr,"%-16s has %d element(s):",gtypes[i],groups->grps[i].nr);
2960 for(j=0; (j<groups->grps[i].nr); j++)
2961 fprintf(stderr," %s",*(groups->grpname[groups->grps[i].nm_ind[j]]));
2962 fprintf(stderr,"\n");
2965 nr = groups->grps[egcENER].nr;
2966 snew(ir->opts.egp_flags,nr*nr);
2968 bExcl = do_egp_flag(ir,groups,"energygrp-excl",egpexcl,EGP_EXCL);
2969 if (bExcl && ir->cutoff_scheme == ecutsVERLET)
2971 warning_error(wi,"Energy group exclusions are not (yet) implemented for the Verlet scheme");
2973 if (bExcl && EEL_FULL(ir->coulombtype))
2974 warning(wi,"Can not exclude the lattice Coulomb energy between energy groups");
2976 bTable = do_egp_flag(ir,groups,"energygrp-table",egptable,EGP_TABLE);
2977 if (bTable && !(ir->vdwtype == evdwUSER) &&
2978 !(ir->coulombtype == eelUSER) && !(ir->coulombtype == eelPMEUSER) &&
2979 !(ir->coulombtype == eelPMEUSERSWITCH))
2980 gmx_fatal(FARGS,"Can only have energy group pair tables in combination with user tables for VdW and/or Coulomb");
2982 decode_cos(efield_x,&(ir->ex[XX]),FALSE);
2983 decode_cos(efield_xt,&(ir->et[XX]),TRUE);
2984 decode_cos(efield_y,&(ir->ex[YY]),FALSE);
2985 decode_cos(efield_yt,&(ir->et[YY]),TRUE);
2986 decode_cos(efield_z,&(ir->ex[ZZ]),FALSE);
2987 decode_cos(efield_zt,&(ir->et[ZZ]),TRUE);
2990 do_adress_index(ir->adress,groups,gnames,&(ir->opts),wi);
2992 for(i=0; (i<grps->nr); i++)
3002 static void check_disre(gmx_mtop_t *mtop)
3004 gmx_ffparams_t *ffparams;
3005 t_functype *functype;
3007 int i,ndouble,ftype;
3008 int label,old_label;
3010 if (gmx_mtop_ftype_count(mtop,F_DISRES) > 0) {
3011 ffparams = &mtop->ffparams;
3012 functype = ffparams->functype;
3013 ip = ffparams->iparams;
3016 for(i=0; i<ffparams->ntypes; i++) {
3017 ftype = functype[i];
3018 if (ftype == F_DISRES) {
3019 label = ip[i].disres.label;
3020 if (label == old_label) {
3021 fprintf(stderr,"Distance restraint index %d occurs twice\n",label);
3028 gmx_fatal(FARGS,"Found %d double distance restraint indices,\n"
3029 "probably the parameters for multiple pairs in one restraint "
3030 "are not identical\n",ndouble);
3034 static gmx_bool absolute_reference(t_inputrec *ir,gmx_mtop_t *sys,
3035 gmx_bool posres_only,
3039 gmx_mtop_ilistloop_t iloop;
3049 for(d=0; d<DIM; d++)
3051 AbsRef[d] = (d < ndof_com(ir) ? 0 : 1);
3053 /* Check for freeze groups */
3054 for(g=0; g<ir->opts.ngfrz; g++)
3056 for(d=0; d<DIM; d++)
3058 if (ir->opts.nFreeze[g][d] != 0)
3066 /* Check for position restraints */
3067 iloop = gmx_mtop_ilistloop_init(sys);
3068 while (gmx_mtop_ilistloop_next(iloop,&ilist,&nmol))
3071 (AbsRef[XX] == 0 || AbsRef[YY] == 0 || AbsRef[ZZ] == 0))
3073 for(i=0; i<ilist[F_POSRES].nr; i+=2)
3075 pr = &sys->ffparams.iparams[ilist[F_POSRES].iatoms[i]];
3076 for(d=0; d<DIM; d++)
3078 if (pr->posres.fcA[d] != 0)
3084 for(i=0; i<ilist[F_FBPOSRES].nr; i+=2)
3086 /* Check for flat-bottom posres */
3087 pr = &sys->ffparams.iparams[ilist[F_FBPOSRES].iatoms[i]];
3088 if (pr->fbposres.k != 0)
3090 switch(pr->fbposres.geom)
3092 case efbposresSPHERE:
3093 AbsRef[XX] = AbsRef[YY] = AbsRef[ZZ] = 1;
3095 case efbposresCYLINDER:
3096 AbsRef[XX] = AbsRef[YY] = 1;
3098 case efbposresX: /* d=XX */
3099 case efbposresY: /* d=YY */
3100 case efbposresZ: /* d=ZZ */
3101 d = pr->fbposres.geom - efbposresX;
3105 gmx_fatal(FARGS," Invalid geometry for flat-bottom position restraint.\n"
3106 "Expected nr between 1 and %d. Found %d\n", efbposresNR-1,
3114 return (AbsRef[XX] != 0 && AbsRef[YY] != 0 && AbsRef[ZZ] != 0);
3117 void triple_check(const char *mdparin,t_inputrec *ir,gmx_mtop_t *sys,
3121 int i,m,g,nmol,npct;
3122 gmx_bool bCharge,bAcc;
3123 real gdt_max,*mgrp,mt;
3125 gmx_mtop_atomloop_block_t aloopb;
3126 gmx_mtop_atomloop_all_t aloop;
3129 char warn_buf[STRLEN];
3131 set_warning_line(wi,mdparin,-1);
3133 if (EI_DYNAMICS(ir->eI) && !EI_SD(ir->eI) && ir->eI != eiBD &&
3134 ir->comm_mode == ecmNO &&
3135 !(absolute_reference(ir,sys,FALSE,AbsRef) || ir->nsteps <= 10)) {
3136 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");
3139 /* Check for pressure coupling with absolute position restraints */
3140 if (ir->epc != epcNO && ir->refcoord_scaling == erscNO)
3142 absolute_reference(ir,sys,TRUE,AbsRef);
3144 for(m=0; m<DIM; m++)
3146 if (AbsRef[m] && norm2(ir->compress[m]) > 0)
3148 warning(wi,"You are using pressure coupling with absolute position restraints, this will give artifacts. Use the refcoord_scaling option.");
3156 aloopb = gmx_mtop_atomloop_block_init(sys);
3157 while (gmx_mtop_atomloop_block_next(aloopb,&atom,&nmol)) {
3158 if (atom->q != 0 || atom->qB != 0) {
3164 if (EEL_FULL(ir->coulombtype)) {
3166 "You are using full electrostatics treatment %s for a system without charges.\n"
3167 "This costs a lot of performance for just processing zeros, consider using %s instead.\n",
3168 EELTYPE(ir->coulombtype),EELTYPE(eelCUT));
3169 warning(wi,err_buf);
3172 if (ir->coulombtype == eelCUT && ir->rcoulomb > 0 && !ir->implicit_solvent) {
3174 "You are using a plain Coulomb cut-off, which might produce artifacts.\n"
3175 "You might want to consider using %s electrostatics.\n",
3177 warning_note(wi,err_buf);
3181 /* Generalized reaction field */
3182 if (ir->opts.ngtc == 0) {
3183 sprintf(err_buf,"No temperature coupling while using coulombtype %s",
3185 CHECK(ir->coulombtype == eelGRF);
3188 sprintf(err_buf,"When using coulombtype = %s"
3189 " ref-t for temperature coupling should be > 0",
3191 CHECK((ir->coulombtype == eelGRF) && (ir->opts.ref_t[0] <= 0));
3194 if (ir->eI == eiSD1 &&
3195 (gmx_mtop_ftype_count(sys,F_CONSTR) > 0 ||
3196 gmx_mtop_ftype_count(sys,F_SETTLE) > 0))
3198 sprintf(warn_buf,"With constraints integrator %s is less accurate, consider using %s instead",ei_names[ir->eI],ei_names[eiSD2]);
3199 warning_note(wi,warn_buf);
3203 for(i=0; (i<sys->groups.grps[egcACC].nr); i++) {
3204 for(m=0; (m<DIM); m++) {
3205 if (fabs(ir->opts.acc[i][m]) > 1e-6) {
3212 snew(mgrp,sys->groups.grps[egcACC].nr);
3213 aloop = gmx_mtop_atomloop_all_init(sys);
3214 while (gmx_mtop_atomloop_all_next(aloop,&i,&atom)) {
3215 mgrp[ggrpnr(&sys->groups,egcACC,i)] += atom->m;
3218 for(i=0; (i<sys->groups.grps[egcACC].nr); i++) {
3219 for(m=0; (m<DIM); m++)
3220 acc[m] += ir->opts.acc[i][m]*mgrp[i];
3223 for(m=0; (m<DIM); m++) {
3224 if (fabs(acc[m]) > 1e-6) {
3225 const char *dim[DIM] = { "X", "Y", "Z" };
3227 "Net Acceleration in %s direction, will %s be corrected\n",
3228 dim[m],ir->nstcomm != 0 ? "" : "not");
3229 if (ir->nstcomm != 0 && m < ndof_com(ir)) {
3231 for (i=0; (i<sys->groups.grps[egcACC].nr); i++)
3232 ir->opts.acc[i][m] -= acc[m];
3239 if (ir->efep != efepNO && ir->fepvals->sc_alpha != 0 &&
3240 !gmx_within_tol(sys->ffparams.reppow,12.0,10*GMX_DOUBLE_EPS)) {
3241 gmx_fatal(FARGS,"Soft-core interactions are only supported with VdW repulsion power 12");
3244 if (ir->ePull != epullNO) {
3245 if (ir->pull->grp[0].nat == 0) {
3246 absolute_reference(ir,sys,FALSE,AbsRef);
3247 for(m=0; m<DIM; m++) {
3248 if (ir->pull->dim[m] && !AbsRef[m]) {
3249 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.");
3255 if (ir->pull->eGeom == epullgDIRPBC) {
3256 for(i=0; i<3; i++) {
3257 for(m=0; m<=i; m++) {
3258 if ((ir->epc != epcNO && ir->compress[i][m] != 0) ||
3259 ir->deform[i][m] != 0) {
3260 for(g=1; g<ir->pull->ngrp; g++) {
3261 if (ir->pull->grp[g].vec[m] != 0) {
3262 gmx_fatal(FARGS,"Can not have dynamic box while using pull geometry '%s' (dim %c)",EPULLGEOM(ir->pull->eGeom),'x'+m);
3274 void double_check(t_inputrec *ir,matrix box,gmx_bool bConstr,warninp_t wi)
3278 char warn_buf[STRLEN];
3281 ptr = check_box(ir->ePBC,box);
3283 warning_error(wi,ptr);
3286 if (bConstr && ir->eConstrAlg == econtSHAKE) {
3287 if (ir->shake_tol <= 0.0) {
3288 sprintf(warn_buf,"ERROR: shake-tol must be > 0 instead of %g\n",
3290 warning_error(wi,warn_buf);
3293 if (IR_TWINRANGE(*ir) && ir->nstlist > 1) {
3294 sprintf(warn_buf,"With twin-range cut-off's and SHAKE the virial and the pressure are incorrect.");
3295 if (ir->epc == epcNO) {
3296 warning(wi,warn_buf);
3298 warning_error(wi,warn_buf);
3303 if( (ir->eConstrAlg == econtLINCS) && bConstr) {
3304 /* If we have Lincs constraints: */
3305 if(ir->eI==eiMD && ir->etc==etcNO &&
3306 ir->eConstrAlg==econtLINCS && ir->nLincsIter==1) {
3307 sprintf(warn_buf,"For energy conservation with LINCS, lincs_iter should be 2 or larger.\n");
3308 warning_note(wi,warn_buf);
3311 if ((ir->eI == eiCG || ir->eI == eiLBFGS) && (ir->nProjOrder<8)) {
3312 sprintf(warn_buf,"For accurate %s with LINCS constraints, lincs-order should be 8 or more.",ei_names[ir->eI]);
3313 warning_note(wi,warn_buf);
3315 if (ir->epc==epcMTTK) {
3316 warning_error(wi,"MTTK not compatible with lincs -- use shake instead.");
3320 if (ir->LincsWarnAngle > 90.0) {
3321 sprintf(warn_buf,"lincs-warnangle can not be larger than 90 degrees, setting it to 90.\n");
3322 warning(wi,warn_buf);
3323 ir->LincsWarnAngle = 90.0;
3326 if (ir->ePBC != epbcNONE) {
3327 if (ir->nstlist == 0) {
3328 warning(wi,"With nstlist=0 atoms are only put into the box at step 0, therefore drifting atoms might cause the simulation to crash.");
3330 bTWIN = (ir->rlistlong > ir->rlist);
3331 if (ir->ns_type == ensGRID) {
3332 if (sqr(ir->rlistlong) >= max_cutoff2(ir->ePBC,box)) {
3333 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",
3334 bTWIN ? (ir->rcoulomb==ir->rlistlong ? "rcoulomb" : "rvdw"):"rlist");
3335 warning_error(wi,warn_buf);
3338 min_size = min(box[XX][XX],min(box[YY][YY],box[ZZ][ZZ]));
3339 if (2*ir->rlistlong >= min_size) {
3340 sprintf(warn_buf,"ERROR: One of the box lengths is smaller than twice the cut-off length. Increase the box size or decrease rlist.");
3341 warning_error(wi,warn_buf);
3343 fprintf(stderr,"Grid search might allow larger cut-off's than simple search with triclinic boxes.");
3349 void check_chargegroup_radii(const gmx_mtop_t *mtop,const t_inputrec *ir,
3353 real rvdw1,rvdw2,rcoul1,rcoul2;
3354 char warn_buf[STRLEN];
3356 calc_chargegroup_radii(mtop,x,&rvdw1,&rvdw2,&rcoul1,&rcoul2);
3360 printf("Largest charge group radii for Van der Waals: %5.3f, %5.3f nm\n",
3365 printf("Largest charge group radii for Coulomb: %5.3f, %5.3f nm\n",
3371 if (rvdw1 + rvdw2 > ir->rlist ||
3372 rcoul1 + rcoul2 > ir->rlist)
3374 sprintf(warn_buf,"The sum of the two largest charge group radii (%f) is larger than rlist (%f)\n",max(rvdw1+rvdw2,rcoul1+rcoul2),ir->rlist);
3375 warning(wi,warn_buf);
3379 /* Here we do not use the zero at cut-off macro,
3380 * since user defined interactions might purposely
3381 * not be zero at the cut-off.
3383 if (EVDW_IS_ZERO_AT_CUTOFF(ir->vdwtype) &&
3384 rvdw1 + rvdw2 > ir->rlist - ir->rvdw)
3386 sprintf(warn_buf,"The sum of the two largest charge group radii (%f) is larger than rlist (%f) - rvdw (%f)\n",
3388 ir->rlist,ir->rvdw);
3391 warning(wi,warn_buf);
3395 warning_note(wi,warn_buf);
3398 if (EEL_IS_ZERO_AT_CUTOFF(ir->coulombtype) &&
3399 rcoul1 + rcoul2 > ir->rlistlong - ir->rcoulomb)
3401 sprintf(warn_buf,"The sum of the two largest charge group radii (%f) is larger than %s (%f) - rcoulomb (%f)\n",
3403 ir->rlistlong > ir->rlist ? "rlistlong" : "rlist",
3404 ir->rlistlong,ir->rcoulomb);
3407 warning(wi,warn_buf);
3411 warning_note(wi,warn_buf);