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,2018,2019, 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.
52 #include <unordered_set>
53 #include <sys/types.h>
55 #include "gromacs/fileio/gmxfio.h"
56 #include "gromacs/fileio/warninp.h"
57 #include "gromacs/gmxpreprocess/gmxcpp.h"
58 #include "gromacs/gmxpreprocess/gpp_atomtype.h"
59 #include "gromacs/gmxpreprocess/gpp_bond_atomtype.h"
60 #include "gromacs/gmxpreprocess/gpp_nextnb.h"
61 #include "gromacs/gmxpreprocess/grompp_impl.h"
62 #include "gromacs/gmxpreprocess/readir.h"
63 #include "gromacs/gmxpreprocess/topdirs.h"
64 #include "gromacs/gmxpreprocess/toppush.h"
65 #include "gromacs/gmxpreprocess/topshake.h"
66 #include "gromacs/gmxpreprocess/toputil.h"
67 #include "gromacs/gmxpreprocess/vsite_parm.h"
68 #include "gromacs/math/units.h"
69 #include "gromacs/math/utilities.h"
70 #include "gromacs/mdtypes/inputrec.h"
71 #include "gromacs/mdtypes/md_enums.h"
72 #include "gromacs/pbcutil/pbc.h"
73 #include "gromacs/topology/block.h"
74 #include "gromacs/topology/exclusionblocks.h"
75 #include "gromacs/topology/ifunc.h"
76 #include "gromacs/topology/symtab.h"
77 #include "gromacs/topology/topology.h"
78 #include "gromacs/utility/cstringutil.h"
79 #include "gromacs/utility/fatalerror.h"
80 #include "gromacs/utility/futil.h"
81 #include "gromacs/utility/gmxassert.h"
82 #include "gromacs/utility/pleasecite.h"
83 #include "gromacs/utility/smalloc.h"
85 #define OPENDIR '[' /* starting sign for directive */
86 #define CLOSEDIR ']' /* ending sign for directive */
88 static void gen_pairs(InteractionTypeParameters *nbs, InteractionTypeParameters *pairs, real fudge, int comb)
90 int i, j, ntp, nrfp, nrfpA, nrfpB, nnn;
93 nnn = static_cast<int>(std::sqrt(static_cast<double>(ntp)));
94 GMX_ASSERT(nnn * nnn == ntp, "Number of pairs of generated non-bonded parameters should be a perfect square");
96 nrfpA = interaction_function[F_LJ14].nrfpA;
97 nrfpB = interaction_function[F_LJ14].nrfpB;
100 if ((nrfp != nrfpA) || (nrfpA != nrfpB))
102 gmx_incons("Number of force parameters in gen_pairs wrong");
105 fprintf(stderr, "Generating 1-4 interactions: fudge = %g\n", fudge);
106 snew(pairs->param, pairs->nr);
107 for (i = 0; (i < ntp); i++)
110 pairs->param[i].a[0] = i / nnn;
111 pairs->param[i].a[1] = i % nnn;
112 /* Copy normal and FEP parameters and multiply by fudge factor */
116 for (j = 0; (j < nrfp); j++)
118 /* If we are using sigma/epsilon values, only the epsilon values
119 * should be scaled, but not sigma.
120 * The sigma values have even indices 0,2, etc.
122 if ((comb == eCOMB_ARITHMETIC || comb == eCOMB_GEOM_SIG_EPS) && (j%2 == 0))
131 pairs->param[i].c[j] = scaling*nbs->param[i].c[j];
132 /* NOTE: this should be clear to the compiler, but some gcc 5.2 versions
133 * issue false positive warnings for the pairs->param.c[] indexing below.
135 assert(2*nrfp <= MAXFORCEPARAM);
136 pairs->param[i].c[nrfp+j] = scaling*nbs->param[i].c[j];
141 double check_mol(const gmx_mtop_t *mtop, warninp *wi)
148 /* Check mass and charge */
151 for (const gmx_molblock_t &molb : mtop->molblock)
153 const t_atoms *atoms = &mtop->moltype[molb.type].atoms;
154 for (i = 0; (i < atoms->nr); i++)
156 q += molb.nmol*atoms->atom[i].q;
157 m = atoms->atom[i].m;
158 mB = atoms->atom[i].mB;
159 pt = atoms->atom[i].ptype;
160 /* If the particle is an atom or a nucleus it must have a mass,
161 * else, if it is a shell, a vsite or a bondshell it can have mass zero
163 if (((m <= 0.0) || (mB <= 0.0)) && ((pt == eptAtom) || (pt == eptNucleus)))
165 ri = atoms->atom[i].resind;
166 sprintf(buf, "atom %s (Res %s-%d) has mass %g (state A) / %g (state B)\n",
167 *(atoms->atomname[i]),
168 *(atoms->resinfo[ri].name),
169 atoms->resinfo[ri].nr,
171 warning_error(wi, buf);
174 if (((m != 0) || (mB != 0)) && (pt == eptVSite))
176 ri = atoms->atom[i].resind;
177 sprintf(buf, "virtual site %s (Res %s-%d) has non-zero mass %g (state A) / %g (state B)\n"
178 " Check your topology.\n",
179 *(atoms->atomname[i]),
180 *(atoms->resinfo[ri].name),
181 atoms->resinfo[ri].nr,
183 warning_error(wi, buf);
184 /* The following statements make LINCS break! */
185 /* atoms->atom[i].m=0; */
192 /*! \brief Returns the rounded charge of a molecule, when close to integer, otherwise returns the original charge.
194 * The results of this routine are only used for checking and for
195 * printing warning messages. Thus we can assume that charges of molecules
196 * should be integer. If the user wanted non-integer molecular charge,
197 * an undesired warning is printed and the user should use grompp -maxwarn 1.
199 * \param qMol The total, unrounded, charge of the molecule
200 * \param sumAbsQ The sum of absolute values of the charges, used for determining the tolerance for the rounding.
202 static double roundedMoleculeCharge(double qMol, double sumAbsQ)
204 /* We use a tolerance of 1e-6 for inaccuracies beyond the 6th decimal
205 * of the charges for ascii float truncation in the topology files.
206 * Although the summation here uses double precision, the charges
207 * are read and stored in single precision when real=float. This can
208 * lead to rounding errors of half the least significant bit.
209 * Note that, unfortunately, we can not assume addition of random
210 * rounding errors. It is not entirely unlikely that many charges
211 * have a near half-bit rounding error with the same sign.
213 double tolAbs = 1e-6;
214 double tol = std::max(tolAbs, 0.5*GMX_REAL_EPS*sumAbsQ);
215 double qRound = std::round(qMol);
216 if (std::abs(qMol - qRound) <= tol)
226 static void sum_q(const t_atoms *atoms, int numMols,
227 double *qTotA, double *qTotB)
234 for (int i = 0; i < atoms->nr; i++)
236 qmolA += atoms->atom[i].q;
237 qmolB += atoms->atom[i].qB;
238 sumAbsQA += std::abs(atoms->atom[i].q);
239 sumAbsQB += std::abs(atoms->atom[i].qB);
242 *qTotA += numMols*roundedMoleculeCharge(qmolA, sumAbsQA);
243 *qTotB += numMols*roundedMoleculeCharge(qmolB, sumAbsQB);
246 static void get_nbparm(char *nb_str, char *comb_str, int *nb, int *comb,
250 char warn_buf[STRLEN];
253 for (i = 1; (i < eNBF_NR); i++)
255 if (gmx_strcasecmp(nb_str, enbf_names[i]) == 0)
262 *nb = strtol(nb_str, nullptr, 10);
264 if ((*nb < 1) || (*nb >= eNBF_NR))
266 sprintf(warn_buf, "Invalid nonbond function selector '%s' using %s",
267 nb_str, enbf_names[1]);
268 warning_error(wi, warn_buf);
272 for (i = 1; (i < eCOMB_NR); i++)
274 if (gmx_strcasecmp(comb_str, ecomb_names[i]) == 0)
281 *comb = strtol(comb_str, nullptr, 10);
283 if ((*comb < 1) || (*comb >= eCOMB_NR))
285 sprintf(warn_buf, "Invalid combination rule selector '%s' using %s",
286 comb_str, ecomb_names[1]);
287 warning_error(wi, warn_buf);
292 static char ** cpp_opts(const char *define, const char *include,
297 const char *cppadds[2];
298 char **cppopts = nullptr;
299 const char *option[2] = { "-D", "-I" };
300 const char *nopt[2] = { "define", "include" };
304 char warn_buf[STRLEN];
307 cppadds[1] = include;
308 for (n = 0; (n < 2); n++)
315 while ((*ptr != '\0') && isspace(*ptr))
320 while ((*rptr != '\0') && !isspace(*rptr))
328 strncpy(buf, ptr, len);
329 if (strstr(ptr, option[n]) != ptr)
331 set_warning_line(wi, "mdp file", -1);
332 sprintf(warn_buf, "Malformed %s option %s", nopt[n], buf);
333 warning(wi, warn_buf);
337 srenew(cppopts, ++ncppopts);
338 cppopts[ncppopts-1] = gmx_strdup(buf);
346 srenew(cppopts, ++ncppopts);
347 cppopts[ncppopts-1] = nullptr;
353 static void make_atoms_sys(gmx::ArrayRef<const gmx_molblock_t> molblock,
354 gmx::ArrayRef<const MoleculeInformation> molinfo,
358 atoms->atom = nullptr;
360 for (const gmx_molblock_t &molb : molblock)
362 const t_atoms &mol_atoms = molinfo[molb.type].atoms;
364 srenew(atoms->atom, atoms->nr + molb.nmol*mol_atoms.nr);
366 for (int m = 0; m < molb.nmol; m++)
368 for (int a = 0; a < mol_atoms.nr; a++)
370 atoms->atom[atoms->nr++] = mol_atoms.atom[a];
377 static char **read_topol(const char *infile, const char *outfile,
378 const char *define, const char *include,
382 std::vector<MoleculeInformation> *molinfo,
383 std::unique_ptr<MoleculeInformation> *intermolecular_interactions,
384 gmx::ArrayRef<InteractionTypeParameters> plist,
385 int *combination_rule,
389 std::vector<gmx_molblock_t> *molblock,
390 bool *ffParametrizedWithHBondConstraints,
393 bool usingFullRangeElectrostatics,
398 char *pline = nullptr, **title = nullptr;
399 char line[STRLEN], errbuf[256], comb_str[256], nb_str[256];
401 char *dirstr, *dummy2;
402 int nrcopies, nmol, nscan, ncombs, ncopy;
403 double fLJ, fQQ, fPOW;
404 MoleculeInformation *mi0 = nullptr;
407 t_nbparam **nbparam, **pair;
408 real fudgeLJ = -1; /* Multiplication factor to generate 1-4 from LJ */
409 bool bReadDefaults, bReadMolType, bGenPairs, bWarn_copy_A_B;
410 double qt = 0, qBt = 0; /* total charge */
411 gpp_bond_atomtype *batype;
413 int dcatt = -1, nmol_couple;
414 /* File handling variables */
418 char *tmp_line = nullptr;
419 char warn_buf[STRLEN];
420 const char *floating_point_arithmetic_tip =
421 "Total charge should normally be an integer. See\n"
422 "http://www.gromacs.org/Documentation/Floating_Point_Arithmetic\n"
423 "for discussion on how close it should be to an integer.\n";
424 /* We need to open the output file before opening the input file,
425 * because cpp_open_file can change the current working directory.
429 out = gmx_fio_fopen(outfile, "w");
436 /* open input file */
437 auto cpp_opts_return = cpp_opts(define, include, wi);
438 status = cpp_open_file(infile, &handle, cpp_opts_return);
441 gmx_fatal(FARGS, "%s", cpp_error(&handle, status));
444 /* some local variables */
445 DS_Init(&DS); /* directive stack */
446 nmol = 0; /* no molecules yet... */
447 d = Directive::d_invalid; /* first thing should be a directive */
448 nbparam = nullptr; /* The temporary non-bonded matrix */
449 pair = nullptr; /* The temporary pair interaction matrix */
450 std::vector < std::vector < gmx::ExclusionBlock>> exclusionBlocks;
453 *reppow = 12.0; /* Default value for repulsion power */
455 /* Init the number of CMAP torsion angles and grid spacing */
456 plist[F_CMAP].cmakeGridSpacing = 0;
457 plist[F_CMAP].cmapAngles = 0;
459 bWarn_copy_A_B = bFEP;
461 batype = init_bond_atomtype();
462 /* parse the actual file */
463 bReadDefaults = FALSE;
465 bReadMolType = FALSE;
470 status = cpp_read_line(&handle, STRLEN, line);
471 done = (status == eCPP_EOF);
474 if (status != eCPP_OK)
476 gmx_fatal(FARGS, "%s", cpp_error(&handle, status));
480 fprintf(out, "%s\n", line);
483 set_warning_line(wi, cpp_cur_file(&handle), cpp_cur_linenr(&handle));
485 pline = gmx_strdup(line);
487 /* Strip trailing '\' from pline, if it exists */
489 if ((sl > 0) && (pline[sl-1] == CONTINUE))
494 /* build one long line from several fragments - necessary for CMAP */
495 while (continuing(line))
497 status = cpp_read_line(&handle, STRLEN, line);
498 set_warning_line(wi, cpp_cur_file(&handle), cpp_cur_linenr(&handle));
500 /* Since we depend on the '\' being present to continue to read, we copy line
501 * to a tmp string, strip the '\' from that string, and cat it to pline
503 tmp_line = gmx_strdup(line);
505 sl = strlen(tmp_line);
506 if ((sl > 0) && (tmp_line[sl-1] == CONTINUE))
508 tmp_line[sl-1] = ' ';
511 done = (status == eCPP_EOF);
514 if (status != eCPP_OK)
516 gmx_fatal(FARGS, "%s", cpp_error(&handle, status));
520 fprintf(out, "%s\n", line);
524 srenew(pline, strlen(pline)+strlen(tmp_line)+1);
525 strcat(pline, tmp_line);
529 /* skip trailing and leading spaces and comment text */
530 strip_comment (pline);
533 /* if there is something left... */
534 if (static_cast<int>(strlen(pline)) > 0)
536 if (pline[0] == OPENDIR)
538 /* A directive on this line: copy the directive
539 * without the brackets into dirstr, then
540 * skip spaces and tabs on either side of directive
542 dirstr = gmx_strdup((pline+1));
543 if ((dummy2 = strchr (dirstr, CLOSEDIR)) != nullptr)
549 if ((newd = str2dir(dirstr)) == Directive::d_invalid)
551 sprintf(errbuf, "Invalid directive %s", dirstr);
552 warning_error(wi, errbuf);
556 /* Directive found */
557 if (DS_Check_Order (DS, newd))
564 /* we should print here which directives should have
565 been present, and which actually are */
566 gmx_fatal(FARGS, "%s\nInvalid order for directive %s",
567 cpp_error(&handle, eCPP_SYNTAX), dir2str(newd));
568 /* d = Directive::d_invalid; */
571 if (d == Directive::d_intermolecular_interactions)
573 if (*intermolecular_interactions == nullptr)
575 /* We (mis)use the moleculetype processing
576 * to process the intermolecular interactions
577 * by making a "molecule" of the size of the system.
579 *intermolecular_interactions = std::make_unique<MoleculeInformation>( );
580 mi0 = intermolecular_interactions->get();
582 make_atoms_sys(*molblock, *molinfo,
589 else if (d != Directive::d_invalid)
591 /* Not a directive, just a plain string
592 * use a gigantic switch to decode,
593 * if there is a valid directive!
597 case Directive::d_defaults:
600 gmx_fatal(FARGS, "%s\nFound a second defaults directive.\n",
601 cpp_error(&handle, eCPP_SYNTAX));
603 bReadDefaults = TRUE;
604 nscan = sscanf(pline, "%s%s%s%lf%lf%lf",
605 nb_str, comb_str, genpairs, &fLJ, &fQQ, &fPOW);
616 get_nbparm(nb_str, comb_str, &nb_funct, combination_rule, wi);
619 bGenPairs = (gmx_strncasecmp(genpairs, "Y", 1) == 0);
620 if (nb_funct != eNBF_LJ && bGenPairs)
622 gmx_fatal(FARGS, "Generating pair parameters is only supported with LJ non-bonded interactions");
638 nb_funct = ifunc_index(Directive::d_nonbond_params, nb_funct);
641 case Directive::d_atomtypes:
642 push_at(symtab, atype, batype, pline, nb_funct,
643 &nbparam, bGenPairs ? &pair : nullptr, wi);
646 case Directive::d_bondtypes:
647 push_bt(d, plist, 2, nullptr, batype, pline, wi);
649 case Directive::d_constrainttypes:
650 push_bt(d, plist, 2, nullptr, batype, pline, wi);
652 case Directive::d_pairtypes:
655 push_nbt(d, pair, atype, pline, F_LJ14, wi);
659 push_bt(d, plist, 2, atype, nullptr, pline, wi);
662 case Directive::d_angletypes:
663 push_bt(d, plist, 3, nullptr, batype, pline, wi);
665 case Directive::d_dihedraltypes:
666 /* Special routine that can read both 2 and 4 atom dihedral definitions. */
667 push_dihedraltype(d, plist, batype, pline, wi);
670 case Directive::d_nonbond_params:
671 push_nbt(d, nbparam, atype, pline, nb_funct, wi);
674 case Directive::d_implicit_genborn_params:
675 // Skip this line, so old topologies with
676 // GB parameters can be read.
679 case Directive::d_implicit_surface_params:
680 // Skip this line, so that any topologies
681 // with surface parameters can be read
682 // (even though these were never formally
686 case Directive::d_cmaptypes:
687 push_cmaptype(d, plist, 5, atype, batype, pline, wi);
690 case Directive::d_moleculetype:
695 if (opts->couple_moltype != nullptr &&
696 (opts->couple_lam0 == ecouplamNONE ||
697 opts->couple_lam0 == ecouplamQ ||
698 opts->couple_lam1 == ecouplamNONE ||
699 opts->couple_lam1 == ecouplamQ))
701 dcatt = add_atomtype_decoupled(symtab, atype,
702 &nbparam, bGenPairs ? &pair : nullptr);
704 ntype = get_atomtype_ntypes(atype);
705 ncombs = (ntype*(ntype+1))/2;
706 generate_nbparams(*combination_rule, nb_funct, &(plist[nb_funct]), atype, wi);
707 ncopy = copy_nbparams(nbparam, nb_funct, &(plist[nb_funct]),
709 fprintf(stderr, "Generated %d of the %d non-bonded parameter combinations\n", ncombs-ncopy, ncombs);
710 free_nbparam(nbparam, ntype);
713 gen_pairs(&(plist[nb_funct]), &(plist[F_LJ14]), fudgeLJ, *combination_rule);
714 ncopy = copy_nbparams(pair, nb_funct, &(plist[F_LJ14]),
716 fprintf(stderr, "Generated %d of the %d 1-4 parameter combinations\n", ncombs-ncopy, ncombs);
717 free_nbparam(pair, ntype);
719 /* Copy GBSA parameters to atomtype array? */
724 push_molt(symtab, molinfo, pline, wi);
725 nmol = molinfo->size();
726 exclusionBlocks.emplace_back();
727 mi0 = &molinfo->back();
728 mi0->atoms.haveMass = TRUE;
729 mi0->atoms.haveCharge = TRUE;
730 mi0->atoms.haveType = TRUE;
731 mi0->atoms.haveBState = TRUE;
732 mi0->atoms.havePdbInfo = FALSE;
735 case Directive::d_atoms:
736 push_atom(symtab, &(mi0->cgs), &(mi0->atoms), atype, pline, &lastcg, wi);
739 case Directive::d_pairs:
740 GMX_RELEASE_ASSERT(mi0, "Need to have a valid MoleculeInformation object to work on");
741 push_bond(d, plist, mi0->plist, &(mi0->atoms), atype, pline, FALSE,
742 bGenPairs, *fudgeQQ, bZero, &bWarn_copy_A_B, wi);
744 case Directive::d_pairs_nb:
745 GMX_RELEASE_ASSERT(mi0, "Need to have a valid MoleculeInformation object to work on");
746 push_bond(d, plist, mi0->plist, &(mi0->atoms), atype, pline, FALSE,
747 FALSE, 1.0, bZero, &bWarn_copy_A_B, wi);
750 case Directive::d_vsites2:
751 case Directive::d_vsites3:
752 case Directive::d_vsites4:
753 case Directive::d_bonds:
754 case Directive::d_angles:
755 case Directive::d_constraints:
756 case Directive::d_settles:
757 case Directive::d_position_restraints:
758 case Directive::d_angle_restraints:
759 case Directive::d_angle_restraints_z:
760 case Directive::d_distance_restraints:
761 case Directive::d_orientation_restraints:
762 case Directive::d_dihedral_restraints:
763 case Directive::d_dihedrals:
764 case Directive::d_polarization:
765 case Directive::d_water_polarization:
766 case Directive::d_thole_polarization:
767 GMX_RELEASE_ASSERT(mi0, "Need to have a valid MoleculeInformation object to work on");
768 push_bond(d, plist, mi0->plist, &(mi0->atoms), atype, pline, TRUE,
769 bGenPairs, *fudgeQQ, bZero, &bWarn_copy_A_B, wi);
771 case Directive::d_cmap:
772 GMX_RELEASE_ASSERT(mi0, "Need to have a valid MoleculeInformation object to work on");
773 push_cmap(d, plist, mi0->plist, &(mi0->atoms), atype, pline, wi);
776 case Directive::d_vsitesn:
777 GMX_RELEASE_ASSERT(mi0, "Need to have a valid MoleculeInformation object to work on");
778 push_vsitesn(d, mi0->plist, &(mi0->atoms), pline, wi);
780 case Directive::d_exclusions:
781 GMX_ASSERT(!exclusionBlocks.empty(), "exclusionBlocks must always be allocated so exclusions can be processed");
782 if (exclusionBlocks.back().empty())
784 GMX_RELEASE_ASSERT(mi0, "Need to have a valid MoleculeInformation object to work on");
785 exclusionBlocks.back().resize(mi0->atoms.nr);
787 push_excl(pline, exclusionBlocks.back(), wi);
789 case Directive::d_system:
791 title = put_symtab(symtab, pline);
793 case Directive::d_molecules:
798 push_mol(*molinfo, pline, &whichmol, &nrcopies, wi);
799 mi0 = &((*molinfo)[whichmol]);
800 molblock->resize(molblock->size() + 1);
801 molblock->back().type = whichmol;
802 molblock->back().nmol = nrcopies;
804 bCouple = (opts->couple_moltype != nullptr &&
805 (gmx_strcasecmp("system", opts->couple_moltype) == 0 ||
806 strcmp(*(mi0->name), opts->couple_moltype) == 0));
809 nmol_couple += nrcopies;
812 if (mi0->atoms.nr == 0)
814 gmx_fatal(FARGS, "Molecule type '%s' contains no atoms",
818 "Excluding %d bonded neighbours molecule type '%s'\n",
819 mi0->nrexcl, *mi0->name);
820 sum_q(&mi0->atoms, nrcopies, &qt, &qBt);
821 if (!mi0->bProcessed)
824 generate_excl(mi0->nrexcl,
829 gmx::mergeExclusions(&(mi0->excls), exclusionBlocks[whichmol]);
830 make_shake(mi0->plist, &mi0->atoms, opts->nshake);
836 convert_moltype_couple(mi0, dcatt, *fudgeQQ,
837 opts->couple_lam0, opts->couple_lam1,
839 nb_funct, &(plist[nb_funct]), wi);
841 stupid_fill_block(&mi0->mols, mi0->atoms.nr, TRUE);
842 mi0->bProcessed = TRUE;
847 fprintf (stderr, "case: %d\n", static_cast<int>(d));
848 gmx_incons("unknown directive");
858 // Check that all strings defined with -D were used when processing topology
859 std::string unusedDefineWarning = checkAndWarnForUnusedDefines(*handle);
860 if (!unusedDefineWarning.empty())
862 warning(wi, unusedDefineWarning);
865 sfree(cpp_opts_return);
872 /* List of GROMACS define names for force fields that have been
873 * parametrized using constraints involving hydrogens only.
875 * We should avoid hardcoded names, but this is hopefully only
876 * needed temparorily for discouraging use of constraints=all-bonds.
878 const std::array<std::string, 3> ffDefines = {
883 *ffParametrizedWithHBondConstraints = false;
884 for (const std::string &ffDefine : ffDefines)
886 if (cpp_find_define(&handle, ffDefine))
888 *ffParametrizedWithHBondConstraints = true;
894 if (opts->couple_moltype)
896 if (nmol_couple == 0)
898 gmx_fatal(FARGS, "Did not find any molecules of type '%s' for coupling",
899 opts->couple_moltype);
901 fprintf(stderr, "Coupling %d copies of molecule type '%s'\n",
902 nmol_couple, opts->couple_moltype);
905 /* this is not very clean, but fixes core dump on empty system name */
908 title = put_symtab(symtab, "");
913 sprintf(warn_buf, "System has non-zero total charge: %.6f\n%s\n", qt, floating_point_arithmetic_tip);
914 warning_note(wi, warn_buf);
916 if (fabs(qBt) > 1e-4 && !gmx_within_tol(qBt, qt, 1e-6))
918 sprintf(warn_buf, "State B has non-zero total charge: %.6f\n%s\n", qBt, floating_point_arithmetic_tip);
919 warning_note(wi, warn_buf);
921 if (usingFullRangeElectrostatics && (fabs(qt) > 1e-4 || fabs(qBt) > 1e-4))
923 warning(wi, "You are using Ewald electrostatics in a system with net charge. This can lead to severe artifacts, such as ions moving into regions with low dielectric, due to the uniform background charge. We suggest to neutralize your system with counter ions, possibly in combination with a physiological salt concentration.");
924 please_cite(stdout, "Hub2014a");
929 done_bond_atomtype(&batype);
931 if (*intermolecular_interactions != nullptr)
933 sfree(intermolecular_interactions->get()->atoms.atom);
941 char **do_top(bool bVerbose,
943 const char *topppfile,
947 gmx::ArrayRef<InteractionTypeParameters> plist,
948 int *combination_rule,
949 double *repulsion_power,
953 std::vector<MoleculeInformation> *molinfo,
954 std::unique_ptr<MoleculeInformation> *intermolecular_interactions,
955 const t_inputrec *ir,
956 std::vector<gmx_molblock_t> *molblock,
957 bool *ffParametrizedWithHBondConstraints,
960 /* Tmpfile might contain a long path */
975 printf("processing topology...\n");
977 title = read_topol(topfile, tmpfile, opts->define, opts->include,
979 nrmols, molinfo, intermolecular_interactions,
980 plist, combination_rule, repulsion_power,
981 opts, fudgeQQ, molblock,
982 ffParametrizedWithHBondConstraints,
983 ir->efep != efepNO, bZero,
984 EEL_FULL(ir->coulombtype), wi);
986 if ((*combination_rule != eCOMB_GEOMETRIC) &&
987 (ir->vdwtype == evdwUSER))
989 warning(wi, "Using sigma/epsilon based combination rules with"
990 " user supplied potential function may produce unwanted"
998 * Generate exclusion lists for QM/MM.
1000 * This routine updates the exclusion lists for QM atoms in order to include all other QM
1001 * atoms of this molecule. Moreover, this routine replaces bonds between QM atoms with
1002 * CONNBOND and, when MiMiC is not used, removes bonded interactions between QM and link atoms.
1003 * Finally, in case if MiMiC QM/MM is used - charges of QM atoms are set to 0
1005 * @param molt molecule type with QM atoms
1006 * @param grpnr group informatio
1007 * @param ir input record
1008 * @param qmmmMode QM/MM mode switch: original/MiMiC
1010 static void generate_qmexcl_moltype(gmx_moltype_t *molt, const unsigned char *grpnr,
1011 t_inputrec *ir, GmxQmmmMode qmmmMode)
1013 /* This routine expects molt->ilist to be of size F_NRE and ordered. */
1015 /* generates the exclusions between the individual QM atoms, as
1016 * these interactions should be handled by the QM subroutines and
1017 * not by the gromacs routines
1019 int qm_max = 0, qm_nr = 0, link_nr = 0, link_max = 0;
1020 int *qm_arr = nullptr, *link_arr = nullptr;
1021 bool *bQMMM, *blink;
1023 /* First we search and select the QM atoms in an qm_arr array that
1024 * we use to create the exclusions.
1026 * we take the possibility into account that a user has defined more
1027 * than one QM group:
1029 * for that we also need to do this an ugly work-about just in case
1030 * the QM group contains the entire system...
1033 /* we first search for all the QM atoms and put them in an array
1035 for (int j = 0; j < ir->opts.ngQM; j++)
1037 for (int i = 0; i < molt->atoms.nr; i++)
1039 if (qm_nr >= qm_max)
1042 srenew(qm_arr, qm_max);
1044 if ((grpnr ? grpnr[i] : 0) == j)
1046 qm_arr[qm_nr++] = i;
1047 molt->atoms.atom[i].q = 0.0;
1048 molt->atoms.atom[i].qB = 0.0;
1052 /* bQMMM[..] is an array containin TRUE/FALSE for atoms that are
1053 * QM/not QM. We first set all elements to false. Afterwards we use
1054 * the qm_arr to change the elements corresponding to the QM atoms
1057 snew(bQMMM, molt->atoms.nr);
1058 for (int i = 0; i < molt->atoms.nr; i++)
1062 for (int i = 0; i < qm_nr; i++)
1064 bQMMM[qm_arr[i]] = TRUE;
1067 /* We remove all bonded interactions (i.e. bonds,
1068 * angles, dihedrals, 1-4's), involving the QM atoms. The way they
1069 * are removed is as follows: if the interaction invloves 2 atoms,
1070 * it is removed if both atoms are QMatoms. If it involves 3 atoms,
1071 * it is removed if at least two of the atoms are QM atoms, if the
1072 * interaction involves 4 atoms, it is removed if there are at least
1073 * 2 QM atoms. Since this routine is called once before any forces
1074 * are computed, the top->idef.il[N].iatom[] array (see idef.h) can
1075 * be rewritten at this poitn without any problem. 25-9-2002 */
1077 /* first check whether we already have CONNBONDS.
1078 * Note that if we don't, we don't add a param entry and set ftype=0,
1079 * which is ok, since CONNBONDS does not use parameters.
1081 int ftype_connbond = 0;
1082 int ind_connbond = 0;
1083 if (molt->ilist[F_CONNBONDS].size() != 0)
1085 fprintf(stderr, "nr. of CONNBONDS present already: %d\n",
1086 molt->ilist[F_CONNBONDS].size()/3);
1087 ftype_connbond = molt->ilist[F_CONNBONDS].iatoms[0];
1088 ind_connbond = molt->ilist[F_CONNBONDS].size();
1090 /* now we delete all bonded interactions, except the ones describing
1091 * a chemical bond. These are converted to CONNBONDS
1093 for (int ftype = 0; ftype < F_NRE; ftype++)
1095 if (!(interaction_function[ftype].flags & IF_BOND) ||
1096 ftype == F_CONNBONDS)
1100 int nratoms = interaction_function[ftype].nratoms;
1102 while (j < molt->ilist[ftype].size())
1108 /* Remove an interaction between two atoms when both are
1109 * in the QM region. Note that we don't have to worry about
1110 * link atoms here, as they won't have 2-atom interactions.
1112 int a1 = molt->ilist[ftype].iatoms[1 + j + 0];
1113 int a2 = molt->ilist[ftype].iatoms[1 + j + 1];
1114 bexcl = (bQMMM[a1] && bQMMM[a2]);
1115 /* A chemical bond between two QM atoms will be copied to
1116 * the F_CONNBONDS list, for reasons mentioned above.
1118 if (bexcl && IS_CHEMBOND(ftype))
1120 InteractionList &ilist = molt->ilist[F_CONNBONDS];
1121 ilist.iatoms.resize(ind_connbond + 3);
1122 ilist.iatoms[ind_connbond++] = ftype_connbond;
1123 ilist.iatoms[ind_connbond++] = a1;
1124 ilist.iatoms[ind_connbond++] = a2;
1129 /* MM interactions have to be excluded if they are included
1130 * in the QM already. Because we use a link atom (H atom)
1131 * when the QM/MM boundary runs through a chemical bond, this
1132 * means that as long as one atom is MM, we still exclude,
1133 * as the interaction is included in the QM via:
1134 * QMatom1-QMatom2-QMatom-3-Linkatom.
1137 for (int jj = j + 1; jj < j + 1 + nratoms; jj++)
1139 if (bQMMM[molt->ilist[ftype].iatoms[jj]])
1145 /* MiMiC treats link atoms as quantum atoms - therefore
1146 * we do not need do additional exclusions here */
1147 if (qmmmMode == GmxQmmmMode::GMX_QMMM_MIMIC)
1149 bexcl = numQmAtoms == nratoms;
1153 bexcl = (numQmAtoms >= nratoms - 1);
1156 if (bexcl && ftype == F_SETTLE)
1158 gmx_fatal(FARGS, "Can not apply QM to molecules with SETTLE, replace the moleculetype using QM and SETTLE by one without SETTLE");
1163 /* since the interaction involves QM atoms, these should be
1164 * removed from the MM ilist
1166 InteractionList &ilist = molt->ilist[ftype];
1167 for (int k = j; k < ilist.size() - (nratoms + 1); k++)
1169 ilist.iatoms[k] = ilist.iatoms[k + (nratoms + 1)];
1171 ilist.iatoms.resize(ilist.size() - (nratoms + 1));
1175 j += nratoms+1; /* the +1 is for the functype */
1179 /* Now, we search for atoms bonded to a QM atom because we also want
1180 * to exclude their nonbonded interactions with the QM atoms. The
1181 * reason for this is that this interaction is accounted for in the
1182 * linkatoms interaction with the QMatoms and would be counted
1185 if (qmmmMode != GmxQmmmMode::GMX_QMMM_MIMIC)
1187 for (int i = 0; i < F_NRE; i++)
1192 while (j < molt->ilist[i].size())
1194 int a1 = molt->ilist[i].iatoms[j + 1];
1195 int a2 = molt->ilist[i].iatoms[j + 2];
1196 if ((bQMMM[a1] && !bQMMM[a2]) || (!bQMMM[a1] && bQMMM[a2]))
1198 if (link_nr >= link_max)
1201 srenew(link_arr, link_max);
1205 link_arr[link_nr++] = a2;
1209 link_arr[link_nr++] = a1;
1217 snew(blink, molt->atoms.nr);
1218 for (int i = 0; i < molt->atoms.nr; i++)
1223 if (qmmmMode != GmxQmmmMode::GMX_QMMM_MIMIC)
1225 for (int i = 0; i < link_nr; i++)
1227 blink[link_arr[i]] = TRUE;
1230 /* creating the exclusion block for the QM atoms. Each QM atom has
1231 * as excluded elements all the other QMatoms (and itself).
1234 qmexcl.nr = molt->atoms.nr;
1235 qmexcl.nra = qm_nr*(qm_nr+link_nr)+link_nr*qm_nr;
1236 snew(qmexcl.index, qmexcl.nr+1);
1237 snew(qmexcl.a, qmexcl.nra);
1239 for (int i = 0; i < qmexcl.nr; i++)
1241 qmexcl.index[i] = j;
1244 for (int k = 0; k < qm_nr; k++)
1246 qmexcl.a[k+j] = qm_arr[k];
1248 for (int k = 0; k < link_nr; k++)
1250 qmexcl.a[qm_nr+k+j] = link_arr[k];
1252 j += (qm_nr+link_nr);
1256 for (int k = 0; k < qm_nr; k++)
1258 qmexcl.a[k+j] = qm_arr[k];
1263 qmexcl.index[qmexcl.nr] = j;
1265 /* and merging with the exclusions already present in sys.
1268 std::vector<gmx::ExclusionBlock> qmexcl2(molt->atoms.nr);
1269 gmx::blockaToExclusionBlocks(&qmexcl, qmexcl2);
1270 gmx::mergeExclusions(&(molt->excls), qmexcl2);
1272 /* Finally, we also need to get rid of the pair interactions of the
1273 * classical atom bonded to the boundary QM atoms with the QMatoms,
1274 * as this interaction is already accounted for by the QM, so also
1275 * here we run the risk of double counting! We proceed in a similar
1276 * way as we did above for the other bonded interactions: */
1277 for (int i = F_LJ14; i < F_COUL14; i++)
1279 int nratoms = interaction_function[i].nratoms;
1281 while (j < molt->ilist[i].size())
1283 int a1 = molt->ilist[i].iatoms[j+1];
1284 int a2 = molt->ilist[i].iatoms[j+2];
1285 bool bexcl = ((bQMMM[a1] && bQMMM[a2]) ||
1286 (blink[a1] && bQMMM[a2]) ||
1287 (bQMMM[a1] && blink[a2]));
1290 /* since the interaction involves QM atoms, these should be
1291 * removed from the MM ilist
1293 InteractionList &ilist = molt->ilist[i];
1294 for (int k = j; k < ilist.size() - (nratoms + 1); k++)
1296 ilist.iatoms[k] = ilist.iatoms[k + (nratoms + 1)];
1298 ilist.iatoms.resize(ilist.size() - (nratoms + 1));
1302 j += nratoms+1; /* the +1 is for the functype */
1311 } /* generate_qmexcl */
1313 void generate_qmexcl(gmx_mtop_t *sys, t_inputrec *ir, warninp *wi, GmxQmmmMode qmmmMode)
1315 /* This routine expects molt->molt[m].ilist to be of size F_NRE and ordered.
1318 unsigned char *grpnr;
1319 int mol, nat_mol, nr_mol_with_qm_atoms = 0;
1320 gmx_molblock_t *molb;
1322 int index_offset = 0;
1325 grpnr = sys->groups.grpnr[egcQMMM];
1327 for (size_t mb = 0; mb < sys->molblock.size(); mb++)
1329 molb = &sys->molblock[mb];
1330 nat_mol = sys->moltype[molb->type].atoms.nr;
1331 for (mol = 0; mol < molb->nmol; mol++)
1334 for (int i = 0; i < nat_mol; i++)
1336 if ((grpnr ? grpnr[i] : 0) < (ir->opts.ngQM))
1345 nr_mol_with_qm_atoms++;
1348 /* We need to split this molblock */
1351 /* Split the molblock at this molecule */
1352 auto pos = sys->molblock.begin() + mb + 1;
1353 sys->molblock.insert(pos, sys->molblock[mb]);
1354 sys->molblock[mb ].nmol = mol;
1355 sys->molblock[mb+1].nmol -= mol;
1357 molb = &sys->molblock[mb];
1361 /* Split the molblock after this molecule */
1362 auto pos = sys->molblock.begin() + mb + 1;
1363 sys->molblock.insert(pos, sys->molblock[mb]);
1364 molb = &sys->molblock[mb];
1365 sys->molblock[mb ].nmol = 1;
1366 sys->molblock[mb+1].nmol -= 1;
1369 /* Create a copy of a moltype for a molecule
1370 * containing QM atoms and append it in the end of the list
1372 std::vector<gmx_moltype_t> temp(sys->moltype.size());
1373 for (size_t i = 0; i < sys->moltype.size(); ++i)
1375 copy_moltype(&sys->moltype[i], &temp[i]);
1377 sys->moltype.resize(sys->moltype.size() + 1);
1378 for (size_t i = 0; i < temp.size(); ++i)
1380 copy_moltype(&temp[i], &sys->moltype[i]);
1382 copy_moltype(&sys->moltype[molb->type], &sys->moltype.back());
1383 /* Copy the exclusions to a new array, since this is the only
1384 * thing that needs to be modified for QMMM.
1386 copy_blocka(&sys->moltype[molb->type].excls,
1387 &sys->moltype.back().excls);
1388 /* Set the molecule type for the QMMM molblock */
1389 molb->type = sys->moltype.size() - 1;
1391 generate_qmexcl_moltype(&sys->moltype[molb->type], grpnr, ir, qmmmMode);
1397 index_offset += nat_mol;
1400 if (qmmmMode == GmxQmmmMode::GMX_QMMM_ORIGINAL &&
1401 nr_mol_with_qm_atoms > 1)
1403 /* generate a warning is there are QM atoms in different
1404 * topologies. In this case it is not possible at this stage to
1405 * mutualy exclude the non-bonded interactions via the
1406 * exclusions (AFAIK). Instead, the user is advised to use the
1407 * energy group exclusions in the mdp file
1410 "\nThe QM subsystem is divided over multiple topologies. "
1411 "The mutual non-bonded interactions cannot be excluded. "
1412 "There are two ways to achieve this:\n\n"
1413 "1) merge the topologies, such that the atoms of the QM "
1414 "subsystem are all present in one single topology file. "
1415 "In this case this warning will dissappear\n\n"
1416 "2) exclude the non-bonded interactions explicitly via the "
1417 "energygrp-excl option in the mdp file. if this is the case "
1418 "this warning may be ignored"