Add AWH biasing module + tests
[gromacs.git] / src / gromacs / gmxpreprocess / grompp.cpp
blobeb85a4207c46cb9f71e4df0facffbeecd0332232
1 /*
2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2013,2014,2015,2016,2017, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
37 #include "gmxpre.h"
39 #include "grompp.h"
41 #include <errno.h>
42 #include <limits.h>
43 #include <string.h>
45 #include <cmath>
47 #include <algorithm>
49 #include <sys/types.h>
51 #include "gromacs/awh/read-params.h"
52 #include "gromacs/commandline/pargs.h"
53 #include "gromacs/ewald/ewald-utils.h"
54 #include "gromacs/ewald/pme.h"
55 #include "gromacs/fft/calcgrid.h"
56 #include "gromacs/fileio/confio.h"
57 #include "gromacs/fileio/enxio.h"
58 #include "gromacs/fileio/tpxio.h"
59 #include "gromacs/fileio/trxio.h"
60 #include "gromacs/fileio/warninp.h"
61 #include "gromacs/gmxpreprocess/add_par.h"
62 #include "gromacs/gmxpreprocess/convparm.h"
63 #include "gromacs/gmxpreprocess/gen_maxwell_velocities.h"
64 #include "gromacs/gmxpreprocess/gpp_atomtype.h"
65 #include "gromacs/gmxpreprocess/grompp-impl.h"
66 #include "gromacs/gmxpreprocess/notset.h"
67 #include "gromacs/gmxpreprocess/readir.h"
68 #include "gromacs/gmxpreprocess/tomorse.h"
69 #include "gromacs/gmxpreprocess/topio.h"
70 #include "gromacs/gmxpreprocess/toputil.h"
71 #include "gromacs/gmxpreprocess/vsite_parm.h"
72 #include "gromacs/imd/imd.h"
73 #include "gromacs/math/functions.h"
74 #include "gromacs/math/invertmatrix.h"
75 #include "gromacs/math/units.h"
76 #include "gromacs/math/vec.h"
77 #include "gromacs/mdlib/calc_verletbuf.h"
78 #include "gromacs/mdlib/compute_io.h"
79 #include "gromacs/mdlib/constr.h"
80 #include "gromacs/mdlib/genborn.h"
81 #include "gromacs/mdlib/perf_est.h"
82 #include "gromacs/mdrunutility/mdmodules.h"
83 #include "gromacs/mdtypes/inputrec.h"
84 #include "gromacs/mdtypes/md_enums.h"
85 #include "gromacs/mdtypes/nblist.h"
86 #include "gromacs/mdtypes/state.h"
87 #include "gromacs/pbcutil/boxutilities.h"
88 #include "gromacs/pbcutil/pbc.h"
89 #include "gromacs/pulling/pull.h"
90 #include "gromacs/random/seed.h"
91 #include "gromacs/topology/ifunc.h"
92 #include "gromacs/topology/mtop_util.h"
93 #include "gromacs/topology/symtab.h"
94 #include "gromacs/topology/topology.h"
95 #include "gromacs/trajectory/trajectoryframe.h"
96 #include "gromacs/utility/arraysize.h"
97 #include "gromacs/utility/cstringutil.h"
98 #include "gromacs/utility/exceptions.h"
99 #include "gromacs/utility/fatalerror.h"
100 #include "gromacs/utility/futil.h"
101 #include "gromacs/utility/gmxassert.h"
102 #include "gromacs/utility/smalloc.h"
103 #include "gromacs/utility/snprintf.h"
105 static int rm_interactions(int ifunc, int nrmols, t_molinfo mols[])
107 int i, n;
109 n = 0;
110 /* For all the molecule types */
111 for (i = 0; i < nrmols; i++)
113 n += mols[i].plist[ifunc].nr;
114 mols[i].plist[ifunc].nr = 0;
116 return n;
119 static int check_atom_names(const char *fn1, const char *fn2,
120 gmx_mtop_t *mtop, const t_atoms *at)
122 int mb, m, i, j, nmismatch;
123 t_atoms *tat;
124 #define MAXMISMATCH 20
126 if (mtop->natoms != at->nr)
128 gmx_incons("comparing atom names");
131 nmismatch = 0;
132 i = 0;
133 for (mb = 0; mb < mtop->nmolblock; mb++)
135 tat = &mtop->moltype[mtop->molblock[mb].type].atoms;
136 for (m = 0; m < mtop->molblock[mb].nmol; m++)
138 for (j = 0; j < tat->nr; j++)
140 if (strcmp( *(tat->atomname[j]), *(at->atomname[i]) ) != 0)
142 if (nmismatch < MAXMISMATCH)
144 fprintf(stderr,
145 "Warning: atom name %d in %s and %s does not match (%s - %s)\n",
146 i+1, fn1, fn2, *(tat->atomname[j]), *(at->atomname[i]));
148 else if (nmismatch == MAXMISMATCH)
150 fprintf(stderr, "(more than %d non-matching atom names)\n", MAXMISMATCH);
152 nmismatch++;
154 i++;
159 return nmismatch;
162 static void check_eg_vs_cg(gmx_mtop_t *mtop)
164 int astart, mb, m, cg, j, firstj;
165 unsigned char firsteg, eg;
166 gmx_moltype_t *molt;
168 /* Go through all the charge groups and make sure all their
169 * atoms are in the same energy group.
172 astart = 0;
173 for (mb = 0; mb < mtop->nmolblock; mb++)
175 molt = &mtop->moltype[mtop->molblock[mb].type];
176 for (m = 0; m < mtop->molblock[mb].nmol; m++)
178 for (cg = 0; cg < molt->cgs.nr; cg++)
180 /* Get the energy group of the first atom in this charge group */
181 firstj = astart + molt->cgs.index[cg];
182 firsteg = ggrpnr(&mtop->groups, egcENER, firstj);
183 for (j = molt->cgs.index[cg]+1; j < molt->cgs.index[cg+1]; j++)
185 eg = ggrpnr(&mtop->groups, egcENER, astart+j);
186 if (eg != firsteg)
188 gmx_fatal(FARGS, "atoms %d and %d in charge group %d of molecule type '%s' are in different energy groups",
189 firstj+1, astart+j+1, cg+1, *molt->name);
193 astart += molt->atoms.nr;
198 static void check_cg_sizes(const char *topfn, t_block *cgs, warninp_t wi)
200 int maxsize, cg;
201 char warn_buf[STRLEN];
203 maxsize = 0;
204 for (cg = 0; cg < cgs->nr; cg++)
206 maxsize = std::max(maxsize, cgs->index[cg+1]-cgs->index[cg]);
209 if (maxsize > MAX_CHARGEGROUP_SIZE)
211 gmx_fatal(FARGS, "The largest charge group contains %d atoms. The maximum is %d.", maxsize, MAX_CHARGEGROUP_SIZE);
213 else if (maxsize > 10)
215 set_warning_line(wi, topfn, -1);
216 sprintf(warn_buf,
217 "The largest charge group contains %d atoms.\n"
218 "Since atoms only see each other when the centers of geometry of the charge groups they belong to are within the cut-off distance, too large charge groups can lead to serious cut-off artifacts.\n"
219 "For efficiency and accuracy, charge group should consist of a few atoms.\n"
220 "For all-atom force fields use: CH3, CH2, CH, NH2, NH, OH, CO2, CO, etc.",
221 maxsize);
222 warning_note(wi, warn_buf);
226 static void check_bonds_timestep(gmx_mtop_t *mtop, double dt, warninp_t wi)
228 /* This check is not intended to ensure accurate integration,
229 * rather it is to signal mistakes in the mdp settings.
230 * A common mistake is to forget to turn on constraints
231 * for MD after energy minimization with flexible bonds.
232 * This check can also detect too large time steps for flexible water
233 * models, but such errors will often be masked by the constraints
234 * mdp options, which turns flexible water into water with bond constraints,
235 * but without an angle constraint. Unfortunately such incorrect use
236 * of water models can not easily be detected without checking
237 * for specific model names.
239 * The stability limit of leap-frog or velocity verlet is 4.44 steps
240 * per oscillational period.
241 * But accurate bonds distributions are lost far before that limit.
242 * To allow relatively common schemes (although not common with Gromacs)
243 * of dt=1 fs without constraints and dt=2 fs with only H-bond constraints
244 * we set the note limit to 10.
246 int min_steps_warn = 5;
247 int min_steps_note = 10;
248 t_iparams *ip;
249 int molt;
250 gmx_moltype_t *moltype, *w_moltype;
251 t_atom *atom;
252 t_ilist *ilist, *ilb, *ilc, *ils;
253 int ftype;
254 int i, a1, a2, w_a1, w_a2, j;
255 real twopi2, limit2, fc, re, m1, m2, period2, w_period2;
256 gmx_bool bFound, bWater, bWarn;
257 char warn_buf[STRLEN];
259 ip = mtop->ffparams.iparams;
261 twopi2 = gmx::square(2*M_PI);
263 limit2 = gmx::square(min_steps_note*dt);
265 w_a1 = w_a2 = -1;
266 w_period2 = -1.0;
268 w_moltype = nullptr;
269 for (molt = 0; molt < mtop->nmoltype; molt++)
271 moltype = &mtop->moltype[molt];
272 atom = moltype->atoms.atom;
273 ilist = moltype->ilist;
274 ilc = &ilist[F_CONSTR];
275 ils = &ilist[F_SETTLE];
276 for (ftype = 0; ftype < F_NRE; ftype++)
278 if (!(ftype == F_BONDS || ftype == F_G96BONDS || ftype == F_HARMONIC))
280 continue;
283 ilb = &ilist[ftype];
284 for (i = 0; i < ilb->nr; i += 3)
286 fc = ip[ilb->iatoms[i]].harmonic.krA;
287 re = ip[ilb->iatoms[i]].harmonic.rA;
288 if (ftype == F_G96BONDS)
290 /* Convert squared sqaure fc to harmonic fc */
291 fc = 2*fc*re;
293 a1 = ilb->iatoms[i+1];
294 a2 = ilb->iatoms[i+2];
295 m1 = atom[a1].m;
296 m2 = atom[a2].m;
297 if (fc > 0 && m1 > 0 && m2 > 0)
299 period2 = twopi2*m1*m2/((m1 + m2)*fc);
301 else
303 period2 = GMX_FLOAT_MAX;
305 if (debug)
307 fprintf(debug, "fc %g m1 %g m2 %g period %g\n",
308 fc, m1, m2, std::sqrt(period2));
310 if (period2 < limit2)
312 bFound = FALSE;
313 for (j = 0; j < ilc->nr; j += 3)
315 if ((ilc->iatoms[j+1] == a1 && ilc->iatoms[j+2] == a2) ||
316 (ilc->iatoms[j+1] == a2 && ilc->iatoms[j+2] == a1))
318 bFound = TRUE;
321 for (j = 0; j < ils->nr; j += 4)
323 if ((a1 == ils->iatoms[j+1] || a1 == ils->iatoms[j+2] || a1 == ils->iatoms[j+3]) &&
324 (a2 == ils->iatoms[j+1] || a2 == ils->iatoms[j+2] || a2 == ils->iatoms[j+3]))
326 bFound = TRUE;
329 if (!bFound &&
330 (w_moltype == nullptr || period2 < w_period2))
332 w_moltype = moltype;
333 w_a1 = a1;
334 w_a2 = a2;
335 w_period2 = period2;
342 if (w_moltype != nullptr)
344 bWarn = (w_period2 < gmx::square(min_steps_warn*dt));
345 /* A check that would recognize most water models */
346 bWater = ((*w_moltype->atoms.atomname[0])[0] == 'O' &&
347 w_moltype->atoms.nr <= 5);
348 sprintf(warn_buf, "The bond in molecule-type %s between atoms %d %s and %d %s has an estimated oscillational period of %.1e ps, which is less than %d times the time step of %.1e ps.\n"
349 "%s",
350 *w_moltype->name,
351 w_a1+1, *w_moltype->atoms.atomname[w_a1],
352 w_a2+1, *w_moltype->atoms.atomname[w_a2],
353 std::sqrt(w_period2), bWarn ? min_steps_warn : min_steps_note, dt,
354 bWater ?
355 "Maybe you asked for fexible water." :
356 "Maybe you forgot to change the constraints mdp option.");
357 if (bWarn)
359 warning(wi, warn_buf);
361 else
363 warning_note(wi, warn_buf);
368 static void check_vel(gmx_mtop_t *mtop, rvec v[])
370 gmx_mtop_atomloop_all_t aloop;
371 const t_atom *atom;
372 int a;
374 aloop = gmx_mtop_atomloop_all_init(mtop);
375 while (gmx_mtop_atomloop_all_next(aloop, &a, &atom))
377 if (atom->ptype == eptShell ||
378 atom->ptype == eptBond ||
379 atom->ptype == eptVSite)
381 clear_rvec(v[a]);
386 static void check_shells_inputrec(gmx_mtop_t *mtop,
387 t_inputrec *ir,
388 warninp_t wi)
390 gmx_mtop_atomloop_all_t aloop;
391 const t_atom *atom;
392 int a, nshells = 0;
393 char warn_buf[STRLEN];
395 aloop = gmx_mtop_atomloop_all_init(mtop);
396 while (gmx_mtop_atomloop_all_next(aloop, &a, &atom))
398 if (atom->ptype == eptShell ||
399 atom->ptype == eptBond)
401 nshells++;
404 if ((nshells > 0) && (ir->nstcalcenergy != 1))
406 set_warning_line(wi, "unknown", -1);
407 snprintf(warn_buf, STRLEN,
408 "There are %d shells, changing nstcalcenergy from %d to 1",
409 nshells, ir->nstcalcenergy);
410 ir->nstcalcenergy = 1;
411 warning(wi, warn_buf);
415 /* TODO Decide whether this function can be consolidated with
416 * gmx_mtop_ftype_count */
417 static gmx_bool nint_ftype(gmx_mtop_t *mtop, t_molinfo *mi, int ftype)
419 int nint, mb;
421 nint = 0;
422 for (mb = 0; mb < mtop->nmolblock; mb++)
424 nint += mtop->molblock[mb].nmol*mi[mtop->molblock[mb].type].plist[ftype].nr;
427 return nint;
430 /* This routine reorders the molecule type array
431 * in the order of use in the molblocks,
432 * unused molecule types are deleted.
434 static void renumber_moltypes(gmx_mtop_t *sys,
435 int *nmolinfo, t_molinfo **molinfo)
437 int *order, norder, i;
438 int mb, mi;
439 t_molinfo *minew;
441 snew(order, *nmolinfo);
442 norder = 0;
443 for (mb = 0; mb < sys->nmolblock; mb++)
445 for (i = 0; i < norder; i++)
447 if (order[i] == sys->molblock[mb].type)
449 break;
452 if (i == norder)
454 /* This type did not occur yet, add it */
455 order[norder] = sys->molblock[mb].type;
456 /* Renumber the moltype in the topology */
457 norder++;
459 sys->molblock[mb].type = i;
462 /* We still need to reorder the molinfo structs */
463 snew(minew, norder);
464 for (mi = 0; mi < *nmolinfo; mi++)
466 for (i = 0; i < norder; i++)
468 if (order[i] == mi)
470 break;
473 if (i == norder)
475 done_mi(&(*molinfo)[mi]);
477 else
479 minew[i] = (*molinfo)[mi];
482 sfree(*molinfo);
484 *nmolinfo = norder;
485 *molinfo = minew;
488 static void molinfo2mtop(int nmi, t_molinfo *mi, gmx_mtop_t *mtop)
490 int m;
491 gmx_moltype_t *molt;
493 mtop->nmoltype = nmi;
494 snew(mtop->moltype, nmi);
495 for (m = 0; m < nmi; m++)
497 molt = &mtop->moltype[m];
498 molt->name = mi[m].name;
499 molt->atoms = mi[m].atoms;
500 /* ilists are copied later */
501 molt->cgs = mi[m].cgs;
502 molt->excls = mi[m].excls;
506 static void
507 new_status(const char *topfile, const char *topppfile, const char *confin,
508 t_gromppopts *opts, t_inputrec *ir, gmx_bool bZero,
509 gmx_bool bGenVel, gmx_bool bVerbose, t_state *state,
510 gpp_atomtype_t atype, gmx_mtop_t *sys,
511 int *nmi, t_molinfo **mi, t_molinfo **intermolecular_interactions,
512 t_params plist[],
513 int *comb, double *reppow, real *fudgeQQ,
514 gmx_bool bMorse,
515 warninp_t wi)
517 t_molinfo *molinfo = nullptr;
518 int nmolblock;
519 gmx_molblock_t *molblock, *molbs;
520 int mb, i, nrmols, nmismatch;
521 char buf[STRLEN];
522 gmx_bool bGB = FALSE;
523 char warn_buf[STRLEN];
525 init_mtop(sys);
527 /* Set gmx_boolean for GB */
528 if (ir->implicit_solvent)
530 bGB = TRUE;
533 /* TOPOLOGY processing */
534 sys->name = do_top(bVerbose, topfile, topppfile, opts, bZero, &(sys->symtab),
535 plist, comb, reppow, fudgeQQ,
536 atype, &nrmols, &molinfo, intermolecular_interactions,
538 &nmolblock, &molblock, bGB,
539 wi);
541 sys->nmolblock = 0;
542 snew(sys->molblock, nmolblock);
544 sys->natoms = 0;
545 for (mb = 0; mb < nmolblock; mb++)
547 if (sys->nmolblock > 0 &&
548 molblock[mb].type == sys->molblock[sys->nmolblock-1].type)
550 /* Merge consecutive blocks with the same molecule type */
551 sys->molblock[sys->nmolblock-1].nmol += molblock[mb].nmol;
552 sys->natoms += molblock[mb].nmol*sys->molblock[sys->nmolblock-1].natoms_mol;
554 else if (molblock[mb].nmol > 0)
556 /* Add a new molblock to the topology */
557 molbs = &sys->molblock[sys->nmolblock];
558 *molbs = molblock[mb];
559 molbs->natoms_mol = molinfo[molbs->type].atoms.nr;
560 molbs->nposres_xA = 0;
561 molbs->nposres_xB = 0;
562 sys->natoms += molbs->nmol*molbs->natoms_mol;
563 sys->nmolblock++;
566 if (sys->nmolblock == 0)
568 gmx_fatal(FARGS, "No molecules were defined in the system");
571 renumber_moltypes(sys, &nrmols, &molinfo);
573 if (bMorse)
575 convert_harmonics(nrmols, molinfo, atype);
578 if (ir->eDisre == edrNone)
580 i = rm_interactions(F_DISRES, nrmols, molinfo);
581 if (i > 0)
583 set_warning_line(wi, "unknown", -1);
584 sprintf(warn_buf, "disre = no, removed %d distance restraints", i);
585 warning_note(wi, warn_buf);
588 if (opts->bOrire == FALSE)
590 i = rm_interactions(F_ORIRES, nrmols, molinfo);
591 if (i > 0)
593 set_warning_line(wi, "unknown", -1);
594 sprintf(warn_buf, "orire = no, removed %d orientation restraints", i);
595 warning_note(wi, warn_buf);
599 /* Copy structures from msys to sys */
600 molinfo2mtop(nrmols, molinfo, sys);
602 gmx_mtop_finalize(sys);
604 /* COORDINATE file processing */
605 if (bVerbose)
607 fprintf(stderr, "processing coordinates...\n");
610 t_topology *conftop;
611 rvec *x = nullptr;
612 rvec *v = nullptr;
613 snew(conftop, 1);
614 read_tps_conf(confin, conftop, nullptr, &x, &v, state->box, FALSE);
615 state->natoms = conftop->atoms.nr;
616 if (state->natoms != sys->natoms)
618 gmx_fatal(FARGS, "number of coordinates in coordinate file (%s, %d)\n"
619 " does not match topology (%s, %d)",
620 confin, state->natoms, topfile, sys->natoms);
622 /* It would be nice to get rid of the copies below, but we don't know
623 * a priori if the number of atoms in confin matches what we expect.
625 state->flags |= (1 << estX);
626 if (v != NULL)
628 state->flags |= (1 << estV);
630 state_change_natoms(state, state->natoms);
631 for (int i = 0; i < state->natoms; i++)
633 copy_rvec(x[i], state->x[i]);
635 sfree(x);
636 if (v != nullptr)
638 for (int i = 0; i < state->natoms; i++)
640 copy_rvec(v[i], state->v[i]);
642 sfree(v);
644 /* This call fixes the box shape for runs with pressure scaling */
645 set_box_rel(ir, state);
647 nmismatch = check_atom_names(topfile, confin, sys, &conftop->atoms);
648 done_top(conftop);
649 sfree(conftop);
651 if (nmismatch)
653 sprintf(buf, "%d non-matching atom name%s\n"
654 "atom names from %s will be used\n"
655 "atom names from %s will be ignored\n",
656 nmismatch, (nmismatch == 1) ? "" : "s", topfile, confin);
657 warning(wi, buf);
660 /* Do more checks, mostly related to constraints */
661 if (bVerbose)
663 fprintf(stderr, "double-checking input for internal consistency...\n");
666 int bHasNormalConstraints = 0 < (nint_ftype(sys, molinfo, F_CONSTR) +
667 nint_ftype(sys, molinfo, F_CONSTRNC));
668 int bHasAnyConstraints = bHasNormalConstraints || 0 < nint_ftype(sys, molinfo, F_SETTLE);
669 double_check(ir, state->box,
670 bHasNormalConstraints,
671 bHasAnyConstraints,
672 wi);
675 if (bGenVel)
677 real *mass;
678 gmx_mtop_atomloop_all_t aloop;
679 const t_atom *atom;
681 snew(mass, state->natoms);
682 aloop = gmx_mtop_atomloop_all_init(sys);
683 while (gmx_mtop_atomloop_all_next(aloop, &i, &atom))
685 mass[i] = atom->m;
688 if (opts->seed == -1)
690 opts->seed = static_cast<int>(gmx::makeRandomSeed());
691 fprintf(stderr, "Setting gen_seed to %d\n", opts->seed);
693 state->flags |= (1 << estV);
694 maxwell_speed(opts->tempi, opts->seed, sys, as_rvec_array(state->v.data()));
696 stop_cm(stdout, state->natoms, mass, as_rvec_array(state->x.data()), as_rvec_array(state->v.data()));
697 sfree(mass);
700 *nmi = nrmols;
701 *mi = molinfo;
704 static void copy_state(const char *slog, t_trxframe *fr,
705 gmx_bool bReadVel, t_state *state,
706 double *use_time)
708 int i;
710 if (fr->not_ok & FRAME_NOT_OK)
712 gmx_fatal(FARGS, "Can not start from an incomplete frame");
714 if (!fr->bX)
716 gmx_fatal(FARGS, "Did not find a frame with coordinates in file %s",
717 slog);
720 for (i = 0; i < state->natoms; i++)
722 copy_rvec(fr->x[i], state->x[i]);
724 if (bReadVel)
726 if (!fr->bV)
728 gmx_incons("Trajecory frame unexpectedly does not contain velocities");
730 for (i = 0; i < state->natoms; i++)
732 copy_rvec(fr->v[i], state->v[i]);
735 if (fr->bBox)
737 copy_mat(fr->box, state->box);
740 *use_time = fr->time;
743 static void cont_status(const char *slog, const char *ener,
744 gmx_bool bNeedVel, gmx_bool bGenVel, real fr_time,
745 t_inputrec *ir, t_state *state,
746 gmx_mtop_t *sys,
747 const gmx_output_env_t *oenv)
748 /* If fr_time == -1 read the last frame available which is complete */
750 gmx_bool bReadVel;
751 t_trxframe fr;
752 t_trxstatus *fp;
753 int i;
754 double use_time;
756 bReadVel = (bNeedVel && !bGenVel);
758 fprintf(stderr,
759 "Reading Coordinates%s and Box size from old trajectory\n",
760 bReadVel ? ", Velocities" : "");
761 if (fr_time == -1)
763 fprintf(stderr, "Will read whole trajectory\n");
765 else
767 fprintf(stderr, "Will read till time %g\n", fr_time);
769 if (!bReadVel)
771 if (bGenVel)
773 fprintf(stderr, "Velocities generated: "
774 "ignoring velocities in input trajectory\n");
776 read_first_frame(oenv, &fp, slog, &fr, TRX_NEED_X);
778 else
780 read_first_frame(oenv, &fp, slog, &fr, TRX_NEED_X | TRX_NEED_V);
782 if (!fr.bV)
784 fprintf(stderr,
785 "\n"
786 "WARNING: Did not find a frame with velocities in file %s,\n"
787 " all velocities will be set to zero!\n\n", slog);
788 for (i = 0; i < sys->natoms; i++)
790 clear_rvec(state->v[i]);
792 close_trx(fp);
793 /* Search for a frame without velocities */
794 bReadVel = FALSE;
795 read_first_frame(oenv, &fp, slog, &fr, TRX_NEED_X);
799 state->natoms = fr.natoms;
801 if (sys->natoms != state->natoms)
803 gmx_fatal(FARGS, "Number of atoms in Topology "
804 "is not the same as in Trajectory");
806 copy_state(slog, &fr, bReadVel, state, &use_time);
808 /* Find the appropriate frame */
809 while ((fr_time == -1 || fr.time < fr_time) &&
810 read_next_frame(oenv, fp, &fr))
812 copy_state(slog, &fr, bReadVel, state, &use_time);
815 close_trx(fp);
817 /* Set the relative box lengths for preserving the box shape.
818 * Note that this call can lead to differences in the last bit
819 * with respect to using gmx convert-tpr to create a [REF].tpx[ref] file.
821 set_box_rel(ir, state);
823 fprintf(stderr, "Using frame at t = %g ps\n", use_time);
824 fprintf(stderr, "Starting time for run is %g ps\n", ir->init_t);
826 if ((ir->epc != epcNO || ir->etc == etcNOSEHOOVER) && ener)
828 get_enx_state(ener, use_time, &sys->groups, ir, state);
829 preserve_box_shape(ir, state->box_rel, state->boxv);
833 static void read_posres(gmx_mtop_t *mtop, t_molinfo *molinfo, gmx_bool bTopB,
834 const char *fn,
835 int rc_scaling, int ePBC,
836 rvec com,
837 warninp_t wi)
839 gmx_bool *hadAtom;
840 rvec *x, *v, *xp;
841 dvec sum;
842 double totmass;
843 t_topology *top;
844 matrix box, invbox;
845 int natoms, npbcdim = 0;
846 char warn_buf[STRLEN];
847 int a, i, ai, j, k, mb, nat_molb;
848 gmx_molblock_t *molb;
849 t_params *pr, *prfb;
850 t_atom *atom;
852 snew(top, 1);
853 read_tps_conf(fn, top, nullptr, &x, &v, box, FALSE);
854 natoms = top->atoms.nr;
855 done_top(top);
856 sfree(top);
857 if (natoms != mtop->natoms)
859 sprintf(warn_buf, "The number of atoms in %s (%d) does not match the number of atoms in the topology (%d). Will assume that the first %d atoms in the topology and %s match.", fn, natoms, mtop->natoms, std::min(mtop->natoms, natoms), fn);
860 warning(wi, warn_buf);
863 npbcdim = ePBC2npbcdim(ePBC);
864 clear_rvec(com);
865 if (rc_scaling != erscNO)
867 copy_mat(box, invbox);
868 for (j = npbcdim; j < DIM; j++)
870 clear_rvec(invbox[j]);
871 invbox[j][j] = 1;
873 gmx::invertBoxMatrix(invbox, invbox);
876 /* Copy the reference coordinates to mtop */
877 clear_dvec(sum);
878 totmass = 0;
879 a = 0;
880 snew(hadAtom, natoms);
881 for (mb = 0; mb < mtop->nmolblock; mb++)
883 molb = &mtop->molblock[mb];
884 nat_molb = molb->nmol*mtop->moltype[molb->type].atoms.nr;
885 pr = &(molinfo[molb->type].plist[F_POSRES]);
886 prfb = &(molinfo[molb->type].plist[F_FBPOSRES]);
887 if (pr->nr > 0 || prfb->nr > 0)
889 atom = mtop->moltype[molb->type].atoms.atom;
890 for (i = 0; (i < pr->nr); i++)
892 ai = pr->param[i].ai();
893 if (ai >= natoms)
895 gmx_fatal(FARGS, "Position restraint atom index (%d) in moltype '%s' is larger than number of atoms in %s (%d).\n",
896 ai+1, *molinfo[molb->type].name, fn, natoms);
898 hadAtom[ai] = TRUE;
899 if (rc_scaling == erscCOM)
901 /* Determine the center of mass of the posres reference coordinates */
902 for (j = 0; j < npbcdim; j++)
904 sum[j] += atom[ai].m*x[a+ai][j];
906 totmass += atom[ai].m;
909 /* Same for flat-bottomed posres, but do not count an atom twice for COM */
910 for (i = 0; (i < prfb->nr); i++)
912 ai = prfb->param[i].ai();
913 if (ai >= natoms)
915 gmx_fatal(FARGS, "Position restraint atom index (%d) in moltype '%s' is larger than number of atoms in %s (%d).\n",
916 ai+1, *molinfo[molb->type].name, fn, natoms);
918 if (rc_scaling == erscCOM && hadAtom[ai] == FALSE)
920 /* Determine the center of mass of the posres reference coordinates */
921 for (j = 0; j < npbcdim; j++)
923 sum[j] += atom[ai].m*x[a+ai][j];
925 totmass += atom[ai].m;
928 if (!bTopB)
930 molb->nposres_xA = nat_molb;
931 snew(molb->posres_xA, molb->nposres_xA);
932 for (i = 0; i < nat_molb; i++)
934 copy_rvec(x[a+i], molb->posres_xA[i]);
937 else
939 molb->nposres_xB = nat_molb;
940 snew(molb->posres_xB, molb->nposres_xB);
941 for (i = 0; i < nat_molb; i++)
943 copy_rvec(x[a+i], molb->posres_xB[i]);
947 a += nat_molb;
949 if (rc_scaling == erscCOM)
951 if (totmass == 0)
953 gmx_fatal(FARGS, "The total mass of the position restraint atoms is 0");
955 for (j = 0; j < npbcdim; j++)
957 com[j] = sum[j]/totmass;
959 fprintf(stderr, "The center of mass of the position restraint coord's is %6.3f %6.3f %6.3f\n", com[XX], com[YY], com[ZZ]);
962 if (rc_scaling != erscNO)
964 GMX_ASSERT(npbcdim <= DIM, "Only DIM dimensions can have PBC");
966 for (mb = 0; mb < mtop->nmolblock; mb++)
968 molb = &mtop->molblock[mb];
969 nat_molb = molb->nmol*mtop->moltype[molb->type].atoms.nr;
970 if (molb->nposres_xA > 0 || molb->nposres_xB > 0)
972 xp = (!bTopB ? molb->posres_xA : molb->posres_xB);
973 for (i = 0; i < nat_molb; i++)
975 for (j = 0; j < npbcdim; j++)
977 if (rc_scaling == erscALL)
979 /* Convert from Cartesian to crystal coordinates */
980 xp[i][j] *= invbox[j][j];
981 for (k = j+1; k < npbcdim; k++)
983 xp[i][j] += invbox[k][j]*xp[i][k];
986 else if (rc_scaling == erscCOM)
988 /* Subtract the center of mass */
989 xp[i][j] -= com[j];
996 if (rc_scaling == erscCOM)
998 /* Convert the COM from Cartesian to crystal coordinates */
999 for (j = 0; j < npbcdim; j++)
1001 com[j] *= invbox[j][j];
1002 for (k = j+1; k < npbcdim; k++)
1004 com[j] += invbox[k][j]*com[k];
1010 sfree(x);
1011 sfree(v);
1012 sfree(hadAtom);
1015 static void gen_posres(gmx_mtop_t *mtop, t_molinfo *mi,
1016 const char *fnA, const char *fnB,
1017 int rc_scaling, int ePBC,
1018 rvec com, rvec comB,
1019 warninp_t wi)
1021 read_posres (mtop, mi, FALSE, fnA, rc_scaling, ePBC, com, wi);
1022 /* It is safer to simply read the b-state posres rather than trying
1023 * to be smart and copy the positions.
1025 read_posres(mtop, mi, TRUE, fnB, rc_scaling, ePBC, comB, wi);
1028 static void set_wall_atomtype(gpp_atomtype_t at, t_gromppopts *opts,
1029 t_inputrec *ir, warninp_t wi)
1031 int i;
1032 char warn_buf[STRLEN];
1034 if (ir->nwall > 0)
1036 fprintf(stderr, "Searching the wall atom type(s)\n");
1038 for (i = 0; i < ir->nwall; i++)
1040 ir->wall_atomtype[i] = get_atomtype_type(opts->wall_atomtype[i], at);
1041 if (ir->wall_atomtype[i] == NOTSET)
1043 sprintf(warn_buf, "Specified wall atom type %s is not defined", opts->wall_atomtype[i]);
1044 warning_error(wi, warn_buf);
1049 static int nrdf_internal(t_atoms *atoms)
1051 int i, nmass, nrdf;
1053 nmass = 0;
1054 for (i = 0; i < atoms->nr; i++)
1056 /* Vsite ptype might not be set here yet, so also check the mass */
1057 if ((atoms->atom[i].ptype == eptAtom ||
1058 atoms->atom[i].ptype == eptNucleus)
1059 && atoms->atom[i].m > 0)
1061 nmass++;
1064 switch (nmass)
1066 case 0: nrdf = 0; break;
1067 case 1: nrdf = 0; break;
1068 case 2: nrdf = 1; break;
1069 default: nrdf = nmass*3 - 6; break;
1072 return nrdf;
1075 static void
1076 spline1d( double dx,
1077 double * y,
1078 int n,
1079 double * u,
1080 double * y2 )
1082 int i;
1083 double p, q;
1085 y2[0] = 0.0;
1086 u[0] = 0.0;
1088 for (i = 1; i < n-1; i++)
1090 p = 0.5*y2[i-1]+2.0;
1091 y2[i] = -0.5/p;
1092 q = (y[i+1]-2.0*y[i]+y[i-1])/dx;
1093 u[i] = (3.0*q/dx-0.5*u[i-1])/p;
1096 y2[n-1] = 0.0;
1098 for (i = n-2; i >= 0; i--)
1100 y2[i] = y2[i]*y2[i+1]+u[i];
1105 static void
1106 interpolate1d( double xmin,
1107 double dx,
1108 double * ya,
1109 double * y2a,
1110 double x,
1111 double * y,
1112 double * y1)
1114 int ix;
1115 double a, b;
1117 ix = static_cast<int>((x-xmin)/dx);
1119 a = (xmin+(ix+1)*dx-x)/dx;
1120 b = (x-xmin-ix*dx)/dx;
1122 *y = a*ya[ix]+b*ya[ix+1]+((a*a*a-a)*y2a[ix]+(b*b*b-b)*y2a[ix+1])*(dx*dx)/6.0;
1123 *y1 = (ya[ix+1]-ya[ix])/dx-(3.0*a*a-1.0)/6.0*dx*y2a[ix]+(3.0*b*b-1.0)/6.0*dx*y2a[ix+1];
1127 static void
1128 setup_cmap (int grid_spacing,
1129 int nc,
1130 real * grid,
1131 gmx_cmap_t * cmap_grid)
1133 double *tmp_u, *tmp_u2, *tmp_yy, *tmp_y1, *tmp_t2, *tmp_grid;
1135 int i, j, k, ii, jj, kk, idx;
1136 int offset;
1137 double dx, xmin, v, v1, v2, v12;
1138 double phi, psi;
1140 snew(tmp_u, 2*grid_spacing);
1141 snew(tmp_u2, 2*grid_spacing);
1142 snew(tmp_yy, 2*grid_spacing);
1143 snew(tmp_y1, 2*grid_spacing);
1144 snew(tmp_t2, 2*grid_spacing*2*grid_spacing);
1145 snew(tmp_grid, 2*grid_spacing*2*grid_spacing);
1147 dx = 360.0/grid_spacing;
1148 xmin = -180.0-dx*grid_spacing/2;
1150 for (kk = 0; kk < nc; kk++)
1152 /* Compute an offset depending on which cmap we are using
1153 * Offset will be the map number multiplied with the
1154 * grid_spacing * grid_spacing * 2
1156 offset = kk * grid_spacing * grid_spacing * 2;
1158 for (i = 0; i < 2*grid_spacing; i++)
1160 ii = (i+grid_spacing-grid_spacing/2)%grid_spacing;
1162 for (j = 0; j < 2*grid_spacing; j++)
1164 jj = (j+grid_spacing-grid_spacing/2)%grid_spacing;
1165 tmp_grid[i*grid_spacing*2+j] = grid[offset+ii*grid_spacing+jj];
1169 for (i = 0; i < 2*grid_spacing; i++)
1171 spline1d(dx, &(tmp_grid[2*grid_spacing*i]), 2*grid_spacing, tmp_u, &(tmp_t2[2*grid_spacing*i]));
1174 for (i = grid_spacing/2; i < grid_spacing+grid_spacing/2; i++)
1176 ii = i-grid_spacing/2;
1177 phi = ii*dx-180.0;
1179 for (j = grid_spacing/2; j < grid_spacing+grid_spacing/2; j++)
1181 jj = j-grid_spacing/2;
1182 psi = jj*dx-180.0;
1184 for (k = 0; k < 2*grid_spacing; k++)
1186 interpolate1d(xmin, dx, &(tmp_grid[2*grid_spacing*k]),
1187 &(tmp_t2[2*grid_spacing*k]), psi, &tmp_yy[k], &tmp_y1[k]);
1190 spline1d(dx, tmp_yy, 2*grid_spacing, tmp_u, tmp_u2);
1191 interpolate1d(xmin, dx, tmp_yy, tmp_u2, phi, &v, &v1);
1192 spline1d(dx, tmp_y1, 2*grid_spacing, tmp_u, tmp_u2);
1193 interpolate1d(xmin, dx, tmp_y1, tmp_u2, phi, &v2, &v12);
1195 idx = ii*grid_spacing+jj;
1196 cmap_grid->cmapdata[kk].cmap[idx*4] = grid[offset+ii*grid_spacing+jj];
1197 cmap_grid->cmapdata[kk].cmap[idx*4+1] = v1;
1198 cmap_grid->cmapdata[kk].cmap[idx*4+2] = v2;
1199 cmap_grid->cmapdata[kk].cmap[idx*4+3] = v12;
1205 static void init_cmap_grid(gmx_cmap_t *cmap_grid, int ngrid, int grid_spacing)
1207 int i, nelem;
1209 cmap_grid->ngrid = ngrid;
1210 cmap_grid->grid_spacing = grid_spacing;
1211 nelem = cmap_grid->grid_spacing*cmap_grid->grid_spacing;
1213 snew(cmap_grid->cmapdata, ngrid);
1215 for (i = 0; i < cmap_grid->ngrid; i++)
1217 snew(cmap_grid->cmapdata[i].cmap, 4*nelem);
1222 static int count_constraints(gmx_mtop_t *mtop, t_molinfo *mi, warninp_t wi)
1224 int count, count_mol, i, mb;
1225 gmx_molblock_t *molb;
1226 t_params *plist;
1227 char buf[STRLEN];
1229 count = 0;
1230 for (mb = 0; mb < mtop->nmolblock; mb++)
1232 count_mol = 0;
1233 molb = &mtop->molblock[mb];
1234 plist = mi[molb->type].plist;
1236 for (i = 0; i < F_NRE; i++)
1238 if (i == F_SETTLE)
1240 count_mol += 3*plist[i].nr;
1242 else if (interaction_function[i].flags & IF_CONSTRAINT)
1244 count_mol += plist[i].nr;
1248 if (count_mol > nrdf_internal(&mi[molb->type].atoms))
1250 sprintf(buf,
1251 "Molecule type '%s' has %d constraints.\n"
1252 "For stability and efficiency there should not be more constraints than internal number of degrees of freedom: %d.\n",
1253 *mi[molb->type].name, count_mol,
1254 nrdf_internal(&mi[molb->type].atoms));
1255 warning(wi, buf);
1257 count += molb->nmol*count_mol;
1260 return count;
1263 static void check_gbsa_params_charged(gmx_mtop_t *sys, gpp_atomtype_t atype)
1265 int i, nmiss, natoms, mt;
1266 real q;
1267 const t_atoms *atoms;
1269 nmiss = 0;
1270 for (mt = 0; mt < sys->nmoltype; mt++)
1272 atoms = &sys->moltype[mt].atoms;
1273 natoms = atoms->nr;
1275 for (i = 0; i < natoms; i++)
1277 q = atoms->atom[i].q;
1278 if ((get_atomtype_radius(atoms->atom[i].type, atype) == 0 ||
1279 get_atomtype_vol(atoms->atom[i].type, atype) == 0 ||
1280 get_atomtype_surftens(atoms->atom[i].type, atype) == 0 ||
1281 get_atomtype_gb_radius(atoms->atom[i].type, atype) == 0 ||
1282 get_atomtype_S_hct(atoms->atom[i].type, atype) == 0) &&
1283 q != 0)
1285 fprintf(stderr, "\nGB parameter(s) zero for atom type '%s' while charge is %g\n",
1286 get_atomtype_name(atoms->atom[i].type, atype), q);
1287 nmiss++;
1292 if (nmiss > 0)
1294 gmx_fatal(FARGS, "Can't do GB electrostatics; the implicit_genborn_params section of the forcefield has parameters with value zero for %d atomtypes that occur as charged atoms.", nmiss);
1299 static void check_gbsa_params(gpp_atomtype_t atype)
1301 int nmiss, i;
1303 /* If we are doing GBSA, check that we got the parameters we need
1304 * This checking is to see if there are GBSA paratmeters for all
1305 * atoms in the force field. To go around this for testing purposes
1306 * comment out the nerror++ counter temporarily
1308 nmiss = 0;
1309 for (i = 0; i < get_atomtype_ntypes(atype); i++)
1311 if (get_atomtype_radius(i, atype) < 0 ||
1312 get_atomtype_vol(i, atype) < 0 ||
1313 get_atomtype_surftens(i, atype) < 0 ||
1314 get_atomtype_gb_radius(i, atype) < 0 ||
1315 get_atomtype_S_hct(i, atype) < 0)
1317 fprintf(stderr, "\nGB parameter(s) missing or negative for atom type '%s'\n",
1318 get_atomtype_name(i, atype));
1319 nmiss++;
1323 if (nmiss > 0)
1325 gmx_fatal(FARGS, "Can't do GB electrostatics; the implicit_genborn_params section of the forcefield is missing parameters for %d atomtypes or they might be negative.", nmiss);
1330 static real calc_temp(const gmx_mtop_t *mtop,
1331 const t_inputrec *ir,
1332 rvec *v)
1334 gmx_mtop_atomloop_all_t aloop;
1335 const t_atom *atom;
1336 int a;
1338 double sum_mv2 = 0;
1339 aloop = gmx_mtop_atomloop_all_init(mtop);
1340 while (gmx_mtop_atomloop_all_next(aloop, &a, &atom))
1342 sum_mv2 += atom->m*norm2(v[a]);
1345 double nrdf = 0;
1346 for (int g = 0; g < ir->opts.ngtc; g++)
1348 nrdf += ir->opts.nrdf[g];
1351 return sum_mv2/(nrdf*BOLTZ);
1354 static real get_max_reference_temp(const t_inputrec *ir,
1355 warninp_t wi)
1357 real ref_t;
1358 int i;
1359 gmx_bool bNoCoupl;
1361 ref_t = 0;
1362 bNoCoupl = FALSE;
1363 for (i = 0; i < ir->opts.ngtc; i++)
1365 if (ir->opts.tau_t[i] < 0)
1367 bNoCoupl = TRUE;
1369 else
1371 ref_t = std::max(ref_t, ir->opts.ref_t[i]);
1375 if (bNoCoupl)
1377 char buf[STRLEN];
1379 sprintf(buf, "Some temperature coupling groups do not use temperature coupling. We will assume their temperature is not more than %.3f K. If their temperature is higher, the energy error and the Verlet buffer might be underestimated.",
1380 ref_t);
1381 warning(wi, buf);
1384 return ref_t;
1387 /* Checks if there are unbound atoms in moleculetype molt.
1388 * Prints a note for each unbound atoms and a warning if any is present.
1390 static void checkForUnboundAtoms(const gmx_moltype_t *molt,
1391 gmx_bool bVerbose,
1392 warninp_t wi)
1394 const t_atoms *atoms = &molt->atoms;
1396 if (atoms->nr == 1)
1398 /* Only one atom, there can't be unbound atoms */
1399 return;
1402 std::vector<int> count(atoms->nr, 0);
1404 for (int ftype = 0; ftype < F_NRE; ftype++)
1406 if (((interaction_function[ftype].flags & IF_BOND) && ftype != F_CONNBONDS) ||
1407 (interaction_function[ftype].flags & IF_CONSTRAINT) ||
1408 ftype == F_SETTLE)
1410 const t_ilist *il = &molt->ilist[ftype];
1411 int nral = NRAL(ftype);
1413 for (int i = 0; i < il->nr; i += 1 + nral)
1415 for (int j = 0; j < nral; j++)
1417 count[il->iatoms[i + 1 + j]]++;
1423 int numDanglingAtoms = 0;
1424 for (int a = 0; a < atoms->nr; a++)
1426 if (atoms->atom[a].ptype != eptVSite &&
1427 count[a] == 0)
1429 if (bVerbose)
1431 fprintf(stderr, "\nAtom %d '%s' in moleculetype '%s' is not bound by a potential or constraint to any other atom in the same moleculetype.\n",
1432 a + 1, *atoms->atomname[a], *molt->name);
1434 numDanglingAtoms++;
1438 if (numDanglingAtoms > 0)
1440 char buf[STRLEN];
1441 sprintf(buf, "In moleculetype '%s' %d atoms are not bound by a potential or constraint to any other atom in the same moleculetype. Although technically this might not cause issues in a simulation, this often means that the user forgot to add a bond/potential/constraint or put multiple molecules in the same moleculetype definition by mistake. Run with -v to get information for each atom.",
1442 *molt->name, numDanglingAtoms);
1443 warning_note(wi, buf);
1447 /* Checks all moleculetypes for unbound atoms */
1448 static void checkForUnboundAtoms(const gmx_mtop_t *mtop,
1449 gmx_bool bVerbose,
1450 warninp_t wi)
1452 for (int mt = 0; mt < mtop->nmoltype; mt++)
1454 checkForUnboundAtoms(&mtop->moltype[mt], bVerbose, wi);
1458 /*! \brief Checks if there are decoupled modes in moleculetype \p molt.
1460 * The specific decoupled modes this routine check for are angle modes
1461 * where the two bonds are constrained and the atoms a both ends are only
1462 * involved in a single constraint; the mass of the two atoms needs to
1463 * differ by more than \p massFactorThreshold.
1465 static bool haveDecoupledModeInMol(const gmx_moltype_t *molt,
1466 const t_iparams *iparams,
1467 real massFactorThreshold)
1469 if (molt->ilist[F_CONSTR].nr == 0 && molt->ilist[F_CONSTRNC].nr == 0)
1471 return false;
1474 const t_atom * atom = molt->atoms.atom;
1476 int numFlexibleConstraints;
1477 t_blocka atomToConstraints = make_at2con(0, molt->atoms.nr,
1478 molt->ilist, iparams,
1479 FALSE,
1480 &numFlexibleConstraints);
1482 bool haveDecoupledMode = false;
1483 for (int ftype = 0; ftype < F_NRE; ftype++)
1485 if (interaction_function[ftype].flags & IF_ATYPE)
1487 const int nral = NRAL(ftype);
1488 const t_ilist *il = &molt->ilist[ftype];
1489 for (int i = 0; i < il->nr; i += 1 + nral)
1491 /* Here we check for the mass difference between the atoms
1492 * at both ends of the angle, that the atoms at the ends have
1493 * 1 contraint and the atom in the middle at least 3; we check
1494 * that the 3 atoms are linked by constraints below.
1495 * We check for at least three constraints for the middle atom,
1496 * since with only the two bonds in the angle, we have 3-atom
1497 * molecule, which has much more thermal exhange in this single
1498 * angle mode than molecules with more atoms.
1499 * Note that this check also catches molecules where more atoms
1500 * are connected to one or more atoms in the angle, but by
1501 * bond potentials instead of angles. But such cases will not
1502 * occur in "normal" molecules and it doesn't hurt running
1503 * those with higher accuracy settings as well.
1505 int a0 = il->iatoms[1 + i];
1506 int a1 = il->iatoms[1 + i + 1];
1507 int a2 = il->iatoms[1 + i + 2];
1508 if ((atom[a0].m > atom[a2].m*massFactorThreshold ||
1509 atom[a2].m > atom[a0].m*massFactorThreshold) &&
1510 atomToConstraints.index[a0 + 1] - atomToConstraints.index[a0] == 1 &&
1511 atomToConstraints.index[a2 + 1] - atomToConstraints.index[a2] == 1 &&
1512 atomToConstraints.index[a1 + 1] - atomToConstraints.index[a1] >= 3)
1514 int constraint0 = atomToConstraints.a[atomToConstraints.index[a0]];
1515 int constraint2 = atomToConstraints.a[atomToConstraints.index[a2]];
1517 bool foundAtom0 = false;
1518 bool foundAtom2 = false;
1519 for (int conIndex = atomToConstraints.index[a1]; conIndex < atomToConstraints.index[a1 + 1]; conIndex++)
1521 if (atomToConstraints.a[conIndex] == constraint0)
1523 foundAtom0 = true;
1525 if (atomToConstraints.a[conIndex] == constraint2)
1527 foundAtom2 = true;
1530 if (foundAtom0 && foundAtom2)
1532 haveDecoupledMode = true;
1539 done_blocka(&atomToConstraints);
1541 return haveDecoupledMode;
1544 /*! \brief Checks if the Verlet buffer and constraint accuracy is sufficient for decoupled dynamic modes.
1546 * When decoupled modes are present and the accuray in insufficient,
1547 * this routine issues a warning if the accuracy is insufficient.
1549 static void checkDecoupledModeAccuracy(const gmx_mtop_t *mtop,
1550 const t_inputrec *ir,
1551 warninp_t wi)
1553 /* We only have issues with decoupled modes with normal MD.
1554 * With stochastic dynamics equipartitioning is enforced strongly.
1556 if (!EI_MD(ir->eI))
1558 return;
1561 /* When atoms of very different mass are involved in an angle potential
1562 * and both bonds in the angle are constrained, the dynamic modes in such
1563 * angles have very different periods and significant energy exchange
1564 * takes several nanoseconds. Thus even a small amount of error in
1565 * different algorithms can lead to violation of equipartitioning.
1566 * The parameters below are mainly based on an all-atom chloroform model
1567 * with all bonds constrained. Equipartitioning is off by more than 1%
1568 * (need to run 5-10 ns) when the difference in mass between H and Cl
1569 * is more than a factor 13 and the accuracy is less than the thresholds
1570 * given below. This has been verified on some other molecules.
1572 * Note that the buffer and shake parameters have unit length and
1573 * energy/time, respectively, so they will "only" work correctly
1574 * for atomistic force fields using MD units.
1576 const real massFactorThreshold = 13.0;
1577 const real bufferToleranceThreshold = 1e-4;
1578 const int lincsIterationThreshold = 2;
1579 const int lincsOrderThreshold = 4;
1580 const real shakeToleranceThreshold = 0.005*ir->delta_t;
1582 bool lincsWithSufficientTolerance = (ir->eConstrAlg == econtLINCS && ir->nLincsIter >= lincsIterationThreshold && ir->nProjOrder >= lincsOrderThreshold);
1583 bool shakeWithSufficientTolerance = (ir->eConstrAlg == econtSHAKE && ir->shake_tol <= 1.1*shakeToleranceThreshold);
1584 if (ir->cutoff_scheme == ecutsVERLET &&
1585 ir->verletbuf_tol <= 1.1*bufferToleranceThreshold &&
1586 (lincsWithSufficientTolerance || shakeWithSufficientTolerance))
1588 return;
1591 bool haveDecoupledMode = false;
1592 for (int mt = 0; mt < mtop->nmoltype; mt++)
1594 if (haveDecoupledModeInMol(&mtop->moltype[mt], mtop->ffparams.iparams,
1595 massFactorThreshold))
1597 haveDecoupledMode = true;
1601 if (haveDecoupledMode)
1603 char modeMessage[STRLEN];
1604 sprintf(modeMessage, "There are atoms at both ends of an angle, connected by constraints and with masses that differ by more than a factor of %g. This means that there are likely dynamic modes that are only very weakly coupled.",
1605 massFactorThreshold);
1606 char buf[STRLEN];
1607 if (ir->cutoff_scheme == ecutsVERLET)
1609 sprintf(buf, "%s To ensure good equipartitioning, you need to either not use constraints on all bonds (but, if possible, only on bonds involving hydrogens) or use integrator = %s or decrease one or more tolerances: verlet-buffer-tolerance <= %g, LINCS iterations >= %d, LINCS order >= %d or SHAKE tolerance <= %g",
1610 modeMessage,
1611 ei_names[eiSD1],
1612 bufferToleranceThreshold,
1613 lincsIterationThreshold, lincsOrderThreshold,
1614 shakeToleranceThreshold);
1616 else
1618 sprintf(buf, "%s To ensure good equipartitioning, we suggest to switch to the %s cutoff-scheme, since that allows for better control over the Verlet buffer size and thus over the energy drift.",
1619 modeMessage,
1620 ecutscheme_names[ecutsVERLET]);
1622 warning(wi, buf);
1626 static void set_verlet_buffer(const gmx_mtop_t *mtop,
1627 t_inputrec *ir,
1628 real buffer_temp,
1629 matrix box,
1630 warninp_t wi)
1632 real rlist_1x1;
1633 int n_nonlin_vsite;
1634 char warn_buf[STRLEN];
1636 printf("Determining Verlet buffer for a tolerance of %g kJ/mol/ps at %g K\n", ir->verletbuf_tol, buffer_temp);
1638 /* Calculate the buffer size for simple atom vs atoms list */
1639 VerletbufListSetup listSetup1x1;
1640 listSetup1x1.cluster_size_i = 1;
1641 listSetup1x1.cluster_size_j = 1;
1642 calc_verlet_buffer_size(mtop, det(box), ir, ir->nstlist, ir->nstlist - 1,
1643 buffer_temp, &listSetup1x1,
1644 &n_nonlin_vsite, &rlist_1x1);
1646 /* Set the pair-list buffer size in ir */
1647 VerletbufListSetup listSetup4x4 =
1648 verletbufGetSafeListSetup(ListSetupType::CpuNoSimd);
1649 calc_verlet_buffer_size(mtop, det(box), ir, ir->nstlist, ir->nstlist - 1,
1650 buffer_temp, &listSetup4x4,
1651 &n_nonlin_vsite, &ir->rlist);
1653 if (n_nonlin_vsite > 0)
1655 sprintf(warn_buf, "There are %d non-linear virtual site constructions. Their contribution to the energy error is approximated. In most cases this does not affect the error significantly.", n_nonlin_vsite);
1656 warning_note(wi, warn_buf);
1659 printf("Calculated rlist for %dx%d atom pair-list as %.3f nm, buffer size %.3f nm\n",
1660 1, 1, rlist_1x1, rlist_1x1-std::max(ir->rvdw, ir->rcoulomb));
1662 printf("Set rlist, assuming %dx%d atom pair-list, to %.3f nm, buffer size %.3f nm\n",
1663 listSetup4x4.cluster_size_i, listSetup4x4.cluster_size_j,
1664 ir->rlist, ir->rlist-std::max(ir->rvdw, ir->rcoulomb));
1666 printf("Note that mdrun will redetermine rlist based on the actual pair-list setup\n");
1668 if (gmx::square(ir->rlist) >= max_cutoff2(ir->ePBC, box))
1670 gmx_fatal(FARGS, "The pair-list cut-off (%g nm) is longer than half the shortest box vector or longer than the smallest box diagonal element (%g nm). Increase the box size or decrease nstlist or increase verlet-buffer-tolerance.", ir->rlist, std::sqrt(max_cutoff2(ir->ePBC, box)));
1674 int gmx_grompp(int argc, char *argv[])
1676 const char *desc[] = {
1677 "[THISMODULE] (the gromacs preprocessor)",
1678 "reads a molecular topology file, checks the validity of the",
1679 "file, expands the topology from a molecular description to an atomic",
1680 "description. The topology file contains information about",
1681 "molecule types and the number of molecules, the preprocessor",
1682 "copies each molecule as needed. ",
1683 "There is no limitation on the number of molecule types. ",
1684 "Bonds and bond-angles can be converted into constraints, separately",
1685 "for hydrogens and heavy atoms.",
1686 "Then a coordinate file is read and velocities can be generated",
1687 "from a Maxwellian distribution if requested.",
1688 "[THISMODULE] also reads parameters for [gmx-mdrun] ",
1689 "(eg. number of MD steps, time step, cut-off), and others such as",
1690 "NEMD parameters, which are corrected so that the net acceleration",
1691 "is zero.",
1692 "Eventually a binary file is produced that can serve as the sole input",
1693 "file for the MD program.[PAR]",
1695 "[THISMODULE] uses the atom names from the topology file. The atom names",
1696 "in the coordinate file (option [TT]-c[tt]) are only read to generate",
1697 "warnings when they do not match the atom names in the topology.",
1698 "Note that the atom names are irrelevant for the simulation as",
1699 "only the atom types are used for generating interaction parameters.[PAR]",
1701 "[THISMODULE] uses a built-in preprocessor to resolve includes, macros, ",
1702 "etc. The preprocessor supports the following keywords::",
1704 " #ifdef VARIABLE",
1705 " #ifndef VARIABLE",
1706 " #else",
1707 " #endif",
1708 " #define VARIABLE",
1709 " #undef VARIABLE",
1710 " #include \"filename\"",
1711 " #include <filename>",
1713 "The functioning of these statements in your topology may be modulated by",
1714 "using the following two flags in your [REF].mdp[ref] file::",
1716 " define = -DVARIABLE1 -DVARIABLE2",
1717 " include = -I/home/john/doe",
1719 "For further information a C-programming textbook may help you out.",
1720 "Specifying the [TT]-pp[tt] flag will get the pre-processed",
1721 "topology file written out so that you can verify its contents.[PAR]",
1723 "When using position restraints, a file with restraint coordinates",
1724 "must be supplied with [TT]-r[tt] (can be the same file as supplied",
1725 "for [TT]-c[tt]). For free energy calculations, separate reference",
1726 "coordinates for the B topology can be supplied with [TT]-rb[tt],",
1727 "otherwise they will be equal to those of the A topology.[PAR]",
1729 "Starting coordinates can be read from trajectory with [TT]-t[tt].",
1730 "The last frame with coordinates and velocities will be read,",
1731 "unless the [TT]-time[tt] option is used. Only if this information",
1732 "is absent will the coordinates in the [TT]-c[tt] file be used.",
1733 "Note that these velocities will not be used when [TT]gen_vel = yes[tt]",
1734 "in your [REF].mdp[ref] file. An energy file can be supplied with",
1735 "[TT]-e[tt] to read Nose-Hoover and/or Parrinello-Rahman coupling",
1736 "variables.[PAR]",
1738 "[THISMODULE] can be used to restart simulations (preserving",
1739 "continuity) by supplying just a checkpoint file with [TT]-t[tt].",
1740 "However, for simply changing the number of run steps to extend",
1741 "a run, using [gmx-convert-tpr] is more convenient than [THISMODULE].",
1742 "You then supply the old checkpoint file directly to [gmx-mdrun]",
1743 "with [TT]-cpi[tt]. If you wish to change the ensemble or things",
1744 "like output frequency, then supplying the checkpoint file to",
1745 "[THISMODULE] with [TT]-t[tt] along with a new [REF].mdp[ref] file",
1746 "with [TT]-f[tt] is the recommended procedure. Actually preserving",
1747 "the ensemble (if possible) still requires passing the checkpoint",
1748 "file to [gmx-mdrun] [TT]-cpi[tt].[PAR]",
1750 "By default, all bonded interactions which have constant energy due to",
1751 "virtual site constructions will be removed. If this constant energy is",
1752 "not zero, this will result in a shift in the total energy. All bonded",
1753 "interactions can be kept by turning off [TT]-rmvsbds[tt]. Additionally,",
1754 "all constraints for distances which will be constant anyway because",
1755 "of virtual site constructions will be removed. If any constraints remain",
1756 "which involve virtual sites, a fatal error will result.[PAR]"
1758 "To verify your run input file, please take note of all warnings",
1759 "on the screen, and correct where necessary. Do also look at the contents",
1760 "of the [TT]mdout.mdp[tt] file; this contains comment lines, as well as",
1761 "the input that [THISMODULE] has read. If in doubt, you can start [THISMODULE]",
1762 "with the [TT]-debug[tt] option which will give you more information",
1763 "in a file called [TT]grompp.log[tt] (along with real debug info). You",
1764 "can see the contents of the run input file with the [gmx-dump]",
1765 "program. [gmx-check] can be used to compare the contents of two",
1766 "run input files.[PAR]"
1768 "The [TT]-maxwarn[tt] option can be used to override warnings printed",
1769 "by [THISMODULE] that otherwise halt output. In some cases, warnings are",
1770 "harmless, but usually they are not. The user is advised to carefully",
1771 "interpret the output messages before attempting to bypass them with",
1772 "this option."
1774 t_gromppopts *opts;
1775 gmx_mtop_t *sys;
1776 int nmi;
1777 t_molinfo *mi, *intermolecular_interactions;
1778 gpp_atomtype_t atype;
1779 int nvsite, comb, mt;
1780 t_params *plist;
1781 real fudgeQQ;
1782 double reppow;
1783 const char *mdparin;
1784 int ntype;
1785 gmx_bool bNeedVel, bGenVel;
1786 gmx_bool have_atomnumber;
1787 gmx_output_env_t *oenv;
1788 gmx_bool bVerbose = FALSE;
1789 warninp_t wi;
1790 char warn_buf[STRLEN];
1792 t_filenm fnm[] = {
1793 { efMDP, nullptr, nullptr, ffREAD },
1794 { efMDP, "-po", "mdout", ffWRITE },
1795 { efSTX, "-c", nullptr, ffREAD },
1796 { efSTX, "-r", "restraint", ffOPTRD },
1797 { efSTX, "-rb", "restraint", ffOPTRD },
1798 { efNDX, nullptr, nullptr, ffOPTRD },
1799 { efTOP, nullptr, nullptr, ffREAD },
1800 { efTOP, "-pp", "processed", ffOPTWR },
1801 { efTPR, "-o", nullptr, ffWRITE },
1802 { efTRN, "-t", nullptr, ffOPTRD },
1803 { efEDR, "-e", nullptr, ffOPTRD },
1804 /* This group is needed by the VMD viewer as the start configuration for IMD sessions: */
1805 { efGRO, "-imd", "imdgroup", ffOPTWR },
1806 { efTRN, "-ref", "rotref", ffOPTRW }
1808 #define NFILE asize(fnm)
1810 /* Command line options */
1811 gmx_bool bRenum = TRUE;
1812 gmx_bool bRmVSBds = TRUE, bZero = FALSE;
1813 int i, maxwarn = 0;
1814 real fr_time = -1;
1815 t_pargs pa[] = {
1816 { "-v", FALSE, etBOOL, {&bVerbose},
1817 "Be loud and noisy" },
1818 { "-time", FALSE, etREAL, {&fr_time},
1819 "Take frame at or first after this time." },
1820 { "-rmvsbds", FALSE, etBOOL, {&bRmVSBds},
1821 "Remove constant bonded interactions with virtual sites" },
1822 { "-maxwarn", FALSE, etINT, {&maxwarn},
1823 "Number of allowed warnings during input processing. Not for normal use and may generate unstable systems" },
1824 { "-zero", FALSE, etBOOL, {&bZero},
1825 "Set parameters for bonded interactions without defaults to zero instead of generating an error" },
1826 { "-renum", FALSE, etBOOL, {&bRenum},
1827 "Renumber atomtypes and minimize number of atomtypes" }
1830 /* Parse the command line */
1831 if (!parse_common_args(&argc, argv, 0, NFILE, fnm, asize(pa), pa,
1832 asize(desc), desc, 0, nullptr, &oenv))
1834 return 0;
1837 /* Initiate some variables */
1838 gmx::MDModules mdModules;
1839 t_inputrec irInstance;
1840 t_inputrec *ir = &irInstance;
1841 snew(opts, 1);
1842 snew(opts->include, STRLEN);
1843 snew(opts->define, STRLEN);
1845 wi = init_warning(TRUE, maxwarn);
1847 /* PARAMETER file processing */
1848 mdparin = opt2fn("-f", NFILE, fnm);
1849 set_warning_line(wi, mdparin, -1);
1852 get_ir(mdparin, opt2fn("-po", NFILE, fnm), &mdModules, ir, opts, WriteMdpHeader::yes, wi);
1854 GMX_CATCH_ALL_AND_EXIT_WITH_FATAL_ERROR;
1856 if (bVerbose)
1858 fprintf(stderr, "checking input for internal consistency...\n");
1860 check_ir(mdparin, ir, opts, wi);
1862 if (ir->ld_seed == -1)
1864 ir->ld_seed = static_cast<int>(gmx::makeRandomSeed());
1865 fprintf(stderr, "Setting the LD random seed to %" GMX_PRId64 "\n", ir->ld_seed);
1868 if (ir->expandedvals->lmc_seed == -1)
1870 ir->expandedvals->lmc_seed = static_cast<int>(gmx::makeRandomSeed());
1871 fprintf(stderr, "Setting the lambda MC random seed to %d\n", ir->expandedvals->lmc_seed);
1874 bNeedVel = EI_STATE_VELOCITY(ir->eI);
1875 bGenVel = (bNeedVel && opts->bGenVel);
1876 if (bGenVel && ir->bContinuation)
1878 sprintf(warn_buf,
1879 "Generating velocities is inconsistent with attempting "
1880 "to continue a previous run. Choose only one of "
1881 "gen-vel = yes and continuation = yes.");
1882 warning_error(wi, warn_buf);
1885 snew(plist, F_NRE);
1886 init_plist(plist);
1887 snew(sys, 1);
1888 atype = init_atomtype();
1889 if (debug)
1891 pr_symtab(debug, 0, "Just opened", &sys->symtab);
1894 const char *fn = ftp2fn(efTOP, NFILE, fnm);
1895 if (!gmx_fexist(fn))
1897 gmx_fatal(FARGS, "%s does not exist", fn);
1900 t_state state;
1901 new_status(fn, opt2fn_null("-pp", NFILE, fnm), opt2fn("-c", NFILE, fnm),
1902 opts, ir, bZero, bGenVel, bVerbose, &state,
1903 atype, sys, &nmi, &mi, &intermolecular_interactions,
1904 plist, &comb, &reppow, &fudgeQQ,
1905 opts->bMorse,
1906 wi);
1908 if (debug)
1910 pr_symtab(debug, 0, "After new_status", &sys->symtab);
1913 nvsite = 0;
1914 /* set parameters for virtual site construction (not for vsiten) */
1915 for (mt = 0; mt < sys->nmoltype; mt++)
1917 nvsite +=
1918 set_vsites(bVerbose, &sys->moltype[mt].atoms, atype, mi[mt].plist);
1920 /* now throw away all obsolete bonds, angles and dihedrals: */
1921 /* note: constraints are ALWAYS removed */
1922 if (nvsite)
1924 for (mt = 0; mt < sys->nmoltype; mt++)
1926 clean_vsite_bondeds(mi[mt].plist, sys->moltype[mt].atoms.nr, bRmVSBds);
1930 if (ir->cutoff_scheme == ecutsVERLET)
1932 fprintf(stderr, "Removing all charge groups because cutoff-scheme=%s\n",
1933 ecutscheme_names[ir->cutoff_scheme]);
1935 /* Remove all charge groups */
1936 gmx_mtop_remove_chargegroups(sys);
1939 if (count_constraints(sys, mi, wi) && (ir->eConstrAlg == econtSHAKE))
1941 if (ir->eI == eiCG || ir->eI == eiLBFGS)
1943 sprintf(warn_buf, "Can not do %s with %s, use %s",
1944 EI(ir->eI), econstr_names[econtSHAKE], econstr_names[econtLINCS]);
1945 warning_error(wi, warn_buf);
1947 if (ir->bPeriodicMols)
1949 sprintf(warn_buf, "Can not do periodic molecules with %s, use %s",
1950 econstr_names[econtSHAKE], econstr_names[econtLINCS]);
1951 warning_error(wi, warn_buf);
1955 if (EI_SD (ir->eI) && ir->etc != etcNO)
1957 warning_note(wi, "Temperature coupling is ignored with SD integrators.");
1960 /* If we are doing QM/MM, check that we got the atom numbers */
1961 have_atomnumber = TRUE;
1962 for (i = 0; i < get_atomtype_ntypes(atype); i++)
1964 have_atomnumber = have_atomnumber && (get_atomtype_atomnumber(i, atype) >= 0);
1966 if (!have_atomnumber && ir->bQMMM)
1968 warning_error(wi,
1969 "\n"
1970 "It appears as if you are trying to run a QM/MM calculation, but the force\n"
1971 "field you are using does not contain atom numbers fields. This is an\n"
1972 "optional field (introduced in GROMACS 3.3) for general runs, but mandatory\n"
1973 "for QM/MM. The good news is that it is easy to add - put the atom number as\n"
1974 "an integer just before the mass column in ffXXXnb.itp.\n"
1975 "NB: United atoms have the same atom numbers as normal ones.\n\n");
1978 /* Check for errors in the input now, since they might cause problems
1979 * during processing further down.
1981 check_warning_error(wi, FARGS);
1983 if (nint_ftype(sys, mi, F_POSRES) > 0 ||
1984 nint_ftype(sys, mi, F_FBPOSRES) > 0)
1986 const char *fn = opt2fn("-r", NFILE, fnm);
1987 const char *fnB;
1989 if (opt2bSet("-rb", NFILE, fnm))
1991 fnB = opt2fn("-rb", NFILE, fnm);
1993 else
1995 fnB = fn;
1998 if (bVerbose)
2000 fprintf(stderr, "Reading position restraint coords from %s", fn);
2001 if (strcmp(fn, fnB) == 0)
2003 fprintf(stderr, "\n");
2005 else
2007 fprintf(stderr, " and %s\n", fnB);
2010 gen_posres(sys, mi, fn, fnB,
2011 ir->refcoord_scaling, ir->ePBC,
2012 ir->posres_com, ir->posres_comB,
2013 wi);
2016 /* If we are using CMAP, setup the pre-interpolation grid */
2017 if (plist[F_CMAP].ncmap > 0)
2019 init_cmap_grid(&sys->ffparams.cmap_grid, plist[F_CMAP].nc, plist[F_CMAP].grid_spacing);
2020 setup_cmap(plist[F_CMAP].grid_spacing, plist[F_CMAP].nc, plist[F_CMAP].cmap, &sys->ffparams.cmap_grid);
2023 set_wall_atomtype(atype, opts, ir, wi);
2024 if (bRenum)
2026 renum_atype(plist, sys, ir->wall_atomtype, atype, bVerbose);
2027 get_atomtype_ntypes(atype);
2030 if (ir->implicit_solvent != eisNO)
2032 /* Now we have renumbered the atom types, we can check the GBSA params */
2033 check_gbsa_params(atype);
2035 /* Check that all atoms that have charge and/or LJ-parameters also have
2036 * sensible GB-parameters
2038 check_gbsa_params_charged(sys, atype);
2041 /* PELA: Copy the atomtype data to the topology atomtype list */
2042 copy_atomtype_atomtypes(atype, &(sys->atomtypes));
2044 if (debug)
2046 pr_symtab(debug, 0, "After renum_atype", &sys->symtab);
2049 if (bVerbose)
2051 fprintf(stderr, "converting bonded parameters...\n");
2054 ntype = get_atomtype_ntypes(atype);
2055 convert_params(ntype, plist, mi, intermolecular_interactions,
2056 comb, reppow, fudgeQQ, sys);
2058 if (debug)
2060 pr_symtab(debug, 0, "After convert_params", &sys->symtab);
2063 /* set ptype to VSite for virtual sites */
2064 for (mt = 0; mt < sys->nmoltype; mt++)
2066 set_vsites_ptype(FALSE, &sys->moltype[mt]);
2068 if (debug)
2070 pr_symtab(debug, 0, "After virtual sites", &sys->symtab);
2072 /* Check velocity for virtual sites and shells */
2073 if (bGenVel)
2075 check_vel(sys, as_rvec_array(state.v.data()));
2078 /* check for shells and inpurecs */
2079 check_shells_inputrec(sys, ir, wi);
2081 /* check masses */
2082 check_mol(sys, wi);
2084 checkForUnboundAtoms(sys, bVerbose, wi);
2086 for (i = 0; i < sys->nmoltype; i++)
2088 check_cg_sizes(ftp2fn(efTOP, NFILE, fnm), &sys->moltype[i].cgs, wi);
2091 if (EI_DYNAMICS(ir->eI) && ir->eI != eiBD)
2093 check_bonds_timestep(sys, ir->delta_t, wi);
2096 checkDecoupledModeAccuracy(sys, ir, wi);
2098 if (EI_ENERGY_MINIMIZATION(ir->eI) && 0 == ir->nsteps)
2100 warning_note(wi, "Zero-step energy minimization will alter the coordinates before calculating the energy. If you just want the energy of a single point, try zero-step MD (with unconstrained_start = yes). To do multiple single-point energy evaluations of different configurations of the same topology, use mdrun -rerun.");
2103 check_warning_error(wi, FARGS);
2105 if (bVerbose)
2107 fprintf(stderr, "initialising group options...\n");
2109 do_index(mdparin, ftp2fn_null(efNDX, NFILE, fnm),
2110 sys, bVerbose, ir,
2111 wi);
2113 if (ir->cutoff_scheme == ecutsVERLET && ir->verletbuf_tol > 0)
2115 if (EI_DYNAMICS(ir->eI) && inputrec2nboundeddim(ir) == 3)
2117 real buffer_temp;
2119 if (EI_MD(ir->eI) && ir->etc == etcNO)
2121 if (bGenVel)
2123 buffer_temp = opts->tempi;
2125 else
2127 buffer_temp = calc_temp(sys, ir, as_rvec_array(state.v.data()));
2129 if (buffer_temp > 0)
2131 sprintf(warn_buf, "NVE simulation: will use the initial temperature of %.3f K for determining the Verlet buffer size", buffer_temp);
2132 warning_note(wi, warn_buf);
2134 else
2136 sprintf(warn_buf, "NVE simulation with an initial temperature of zero: will use a Verlet buffer of %d%%. Check your energy drift!",
2137 (int)(verlet_buffer_ratio_NVE_T0*100 + 0.5));
2138 warning_note(wi, warn_buf);
2141 else
2143 buffer_temp = get_max_reference_temp(ir, wi);
2146 if (EI_MD(ir->eI) && ir->etc == etcNO && buffer_temp == 0)
2148 /* NVE with initial T=0: we add a fixed ratio to rlist.
2149 * Since we don't actually use verletbuf_tol, we set it to -1
2150 * so it can't be misused later.
2152 ir->rlist *= 1.0 + verlet_buffer_ratio_NVE_T0;
2153 ir->verletbuf_tol = -1;
2155 else
2157 /* We warn for NVE simulations with a drift tolerance that
2158 * might result in a 1(.1)% drift over the total run-time.
2159 * Note that we can't warn when nsteps=0, since we don't
2160 * know how many steps the user intends to run.
2162 if (EI_MD(ir->eI) && ir->etc == etcNO && ir->nstlist > 1 &&
2163 ir->nsteps > 0)
2165 const real driftTolerance = 0.01;
2166 /* We use 2 DOF per atom = 2kT pot+kin energy,
2167 * to be on the safe side with constraints.
2169 const real totalEnergyDriftPerAtomPerPicosecond = 2*BOLTZ*buffer_temp/(ir->nsteps*ir->delta_t);
2171 if (ir->verletbuf_tol > 1.1*driftTolerance*totalEnergyDriftPerAtomPerPicosecond)
2173 sprintf(warn_buf, "You are using a Verlet buffer tolerance of %g kJ/mol/ps for an NVE simulation of length %g ps, which can give a final drift of %d%%. For conserving energy to %d%% when using constraints, you might need to set verlet-buffer-tolerance to %.1e.",
2174 ir->verletbuf_tol, ir->nsteps*ir->delta_t,
2175 (int)(ir->verletbuf_tol/totalEnergyDriftPerAtomPerPicosecond*100 + 0.5),
2176 (int)(100*driftTolerance + 0.5),
2177 driftTolerance*totalEnergyDriftPerAtomPerPicosecond);
2178 warning_note(wi, warn_buf);
2182 set_verlet_buffer(sys, ir, buffer_temp, state.box, wi);
2187 /* Init the temperature coupling state */
2188 init_gtc_state(&state, ir->opts.ngtc, 0, ir->opts.nhchainlength); /* need to add nnhpres here? */
2190 if (bVerbose)
2192 fprintf(stderr, "Checking consistency between energy and charge groups...\n");
2194 check_eg_vs_cg(sys);
2196 if (debug)
2198 pr_symtab(debug, 0, "After index", &sys->symtab);
2201 triple_check(mdparin, ir, sys, wi);
2202 close_symtab(&sys->symtab);
2203 if (debug)
2205 pr_symtab(debug, 0, "After close", &sys->symtab);
2208 /* make exclusions between QM atoms */
2209 if (ir->bQMMM)
2211 if (ir->QMMMscheme == eQMMMschemenormal && ir->ns_type == ensSIMPLE)
2213 gmx_fatal(FARGS, "electrostatic embedding only works with grid neighboursearching, use ns-type=grid instead\n");
2215 else
2217 generate_qmexcl(sys, ir, wi);
2221 if (ftp2bSet(efTRN, NFILE, fnm))
2223 if (bVerbose)
2225 fprintf(stderr, "getting data from old trajectory ...\n");
2227 cont_status(ftp2fn(efTRN, NFILE, fnm), ftp2fn_null(efEDR, NFILE, fnm),
2228 bNeedVel, bGenVel, fr_time, ir, &state, sys, oenv);
2231 if (ir->ePBC == epbcXY && ir->nwall != 2)
2233 clear_rvec(state.box[ZZ]);
2236 if (ir->cutoff_scheme != ecutsVERLET && ir->rlist > 0)
2238 set_warning_line(wi, mdparin, -1);
2239 check_chargegroup_radii(sys, ir, as_rvec_array(state.x.data()), wi);
2242 if (EEL_FULL(ir->coulombtype) || EVDW_PME(ir->vdwtype))
2244 /* Calculate the optimal grid dimensions */
2245 matrix scaledBox;
2246 EwaldBoxZScaler boxScaler(*ir);
2247 boxScaler.scaleBox(state.box, scaledBox);
2249 if (ir->nkx > 0 && ir->nky > 0 && ir->nkz > 0)
2251 /* Mark fourier_spacing as not used */
2252 ir->fourier_spacing = 0;
2254 else if (ir->nkx != 0 && ir->nky != 0 && ir->nkz != 0)
2256 set_warning_line(wi, mdparin, -1);
2257 warning_error(wi, "Some of the Fourier grid sizes are set, but all of them need to be set.");
2259 const int minGridSize = minimalPmeGridSize(ir->pme_order);
2260 calcFftGrid(stdout, scaledBox, ir->fourier_spacing, minGridSize,
2261 &(ir->nkx), &(ir->nky), &(ir->nkz));
2262 if (ir->nkx < minGridSize ||
2263 ir->nky < minGridSize ||
2264 ir->nkz < minGridSize)
2266 warning_error(wi, "The PME grid size should be >= 2*(pme-order - 1); either manually increase the grid size or decrease pme-order");
2270 /* MRS: eventually figure out better logic for initializing the fep
2271 values that makes declaring the lambda and declaring the state not
2272 potentially conflict if not handled correctly. */
2273 if (ir->efep != efepNO)
2275 state.fep_state = ir->fepvals->init_fep_state;
2276 for (i = 0; i < efptNR; i++)
2278 /* init_lambda trumps state definitions*/
2279 if (ir->fepvals->init_lambda >= 0)
2281 state.lambda[i] = ir->fepvals->init_lambda;
2283 else
2285 if (ir->fepvals->all_lambda[i] == nullptr)
2287 gmx_fatal(FARGS, "Values of lambda not set for a free energy calculation!");
2289 else
2291 state.lambda[i] = ir->fepvals->all_lambda[i][state.fep_state];
2297 struct pull_t *pull = nullptr;
2299 if (ir->bPull)
2301 pull = set_pull_init(ir, sys, as_rvec_array(state.x.data()), state.box, state.lambda[efptMASS], oenv);
2304 /* Modules that supply external potential for pull coordinates
2305 * should register those potentials here. finish_pull() will check
2306 * that providers have been registerd for all external potentials.
2309 if (ir->bDoAwh)
2311 setStateDependentAwhParams(ir->awhParams, ir->pull, pull,
2312 state.box, ir->ePBC, &ir->opts, wi);
2315 if (ir->bPull)
2317 finish_pull(pull);
2320 if (ir->bRot)
2322 set_reference_positions(ir->rot, as_rvec_array(state.x.data()), state.box,
2323 opt2fn("-ref", NFILE, fnm), opt2bSet("-ref", NFILE, fnm),
2324 wi);
2327 /* reset_multinr(sys); */
2329 if (EEL_PME(ir->coulombtype))
2331 float ratio = pme_load_estimate(sys, ir, state.box);
2332 fprintf(stderr, "Estimate for the relative computational load of the PME mesh part: %.2f\n", ratio);
2333 /* With free energy we might need to do PME both for the A and B state
2334 * charges. This will double the cost, but the optimal performance will
2335 * then probably be at a slightly larger cut-off and grid spacing.
2337 if ((ir->efep == efepNO && ratio > 1.0/2.0) ||
2338 (ir->efep != efepNO && ratio > 2.0/3.0))
2340 warning_note(wi,
2341 "The optimal PME mesh load for parallel simulations is below 0.5\n"
2342 "and for highly parallel simulations between 0.25 and 0.33,\n"
2343 "for higher performance, increase the cut-off and the PME grid spacing.\n");
2344 if (ir->efep != efepNO)
2346 warning_note(wi,
2347 "For free energy simulations, the optimal load limit increases from 0.5 to 0.667\n");
2353 char warn_buf[STRLEN];
2354 double cio = compute_io(ir, sys->natoms, &sys->groups, F_NRE, 1);
2355 sprintf(warn_buf, "This run will generate roughly %.0f Mb of data", cio);
2356 if (cio > 2000)
2358 set_warning_line(wi, mdparin, -1);
2359 warning_note(wi, warn_buf);
2361 else
2363 printf("%s\n", warn_buf);
2367 if (bVerbose)
2369 fprintf(stderr, "writing run input file...\n");
2372 done_warning(wi, FARGS);
2373 write_tpx_state(ftp2fn(efTPR, NFILE, fnm), ir, &state, sys);
2375 /* Output IMD group, if bIMD is TRUE */
2376 write_IMDgroup_to_file(ir->bIMD, ir, &state, sys, NFILE, fnm);
2378 done_atomtype(atype);
2379 done_mtop(sys);
2380 done_inputrec_strings();
2382 return 0;