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, 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.
49 #include "gromacs/fileio/warninp.h"
50 #include "gromacs/gmxpreprocess/gpp_atomtype.h"
51 #include "gromacs/gmxpreprocess/gpp_bond_atomtype.h"
52 #include "gromacs/gmxpreprocess/notset.h"
53 #include "gromacs/gmxpreprocess/readir.h"
54 #include "gromacs/gmxpreprocess/topdirs.h"
55 #include "gromacs/gmxpreprocess/toputil.h"
56 #include "gromacs/mdtypes/md_enums.h"
57 #include "gromacs/topology/ifunc.h"
58 #include "gromacs/topology/symtab.h"
59 #include "gromacs/utility/arrayref.h"
60 #include "gromacs/utility/cstringutil.h"
61 #include "gromacs/utility/fatalerror.h"
62 #include "gromacs/utility/gmxassert.h"
63 #include "gromacs/utility/smalloc.h"
65 void generate_nbparams(int comb, int ftype, t_params *plist, gpp_atomtype_t atype,
70 real c, bi, bj, ci, cj, ci0, ci1, ci2, cj0, cj1, cj2;
73 /* Lean mean shortcuts */
74 nr = get_atomtype_ntypes(atype);
76 snew(plist->param, nr*nr);
79 /* Fill the matrix with force parameters */
87 for (i = k = 0; (i < nr); i++)
89 for (j = 0; (j < nr); j++, k++)
91 for (nf = 0; (nf < nrfp); nf++)
93 ci = get_atomtype_nbparam(i, nf, atype);
94 cj = get_atomtype_nbparam(j, nf, atype);
95 c = std::sqrt(ci * cj);
96 plist->param[k].c[nf] = c;
102 case eCOMB_ARITHMETIC:
103 /* c0 and c1 are sigma and epsilon */
104 for (i = k = 0; (i < nr); i++)
106 for (j = 0; (j < nr); j++, k++)
108 ci0 = get_atomtype_nbparam(i, 0, atype);
109 cj0 = get_atomtype_nbparam(j, 0, atype);
110 ci1 = get_atomtype_nbparam(i, 1, atype);
111 cj1 = get_atomtype_nbparam(j, 1, atype);
112 plist->param[k].c[0] = (fabs(ci0) + fabs(cj0))*0.5;
113 /* Negative sigma signals that c6 should be set to zero later,
114 * so we need to propagate that through the combination rules.
116 if (ci0 < 0 || cj0 < 0)
118 plist->param[k].c[0] *= -1;
120 plist->param[k].c[1] = std::sqrt(ci1*cj1);
125 case eCOMB_GEOM_SIG_EPS:
126 /* c0 and c1 are sigma and epsilon */
127 for (i = k = 0; (i < nr); i++)
129 for (j = 0; (j < nr); j++, k++)
131 ci0 = get_atomtype_nbparam(i, 0, atype);
132 cj0 = get_atomtype_nbparam(j, 0, atype);
133 ci1 = get_atomtype_nbparam(i, 1, atype);
134 cj1 = get_atomtype_nbparam(j, 1, atype);
135 plist->param[k].c[0] = std::sqrt(fabs(ci0*cj0));
136 /* Negative sigma signals that c6 should be set to zero later,
137 * so we need to propagate that through the combination rules.
139 if (ci0 < 0 || cj0 < 0)
141 plist->param[k].c[0] *= -1;
143 plist->param[k].c[1] = std::sqrt(ci1*cj1);
149 sprintf(errbuf, "No such combination rule %d", comb);
150 warning_error_and_exit(wi, errbuf, FARGS);
154 gmx_incons("Topology processing, generate nb parameters");
159 /* Buckingham rules */
160 for (i = k = 0; (i < nr); i++)
162 for (j = 0; (j < nr); j++, k++)
164 ci0 = get_atomtype_nbparam(i, 0, atype);
165 cj0 = get_atomtype_nbparam(j, 0, atype);
166 ci2 = get_atomtype_nbparam(i, 2, atype);
167 cj2 = get_atomtype_nbparam(j, 2, atype);
168 bi = get_atomtype_nbparam(i, 1, atype);
169 bj = get_atomtype_nbparam(j, 1, atype);
170 plist->param[k].c[0] = std::sqrt(ci0 * cj0);
171 if ((bi == 0) || (bj == 0))
173 plist->param[k].c[1] = 0;
177 plist->param[k].c[1] = 2.0/(1/bi+1/bj);
179 plist->param[k].c[2] = std::sqrt(ci2 * cj2);
185 sprintf(errbuf, "Invalid nonbonded type %s",
186 interaction_function[ftype].longname);
187 warning_error(wi, errbuf);
191 static void realloc_nb_params(gpp_atomtype_t at,
192 t_nbparam ***nbparam, t_nbparam ***pair)
194 /* Add space in the non-bonded parameters matrix */
195 int atnr = get_atomtype_ntypes(at);
196 srenew(*nbparam, atnr);
197 snew((*nbparam)[atnr-1], atnr);
201 snew((*pair)[atnr-1], atnr);
205 static void copy_B_from_A(int ftype, double *c)
209 nrfpA = NRFPA(ftype);
210 nrfpB = NRFPB(ftype);
212 /* Copy the B parameters from the first nrfpB A parameters */
213 for (i = 0; (i < nrfpB); i++)
219 void push_at (t_symtab *symtab, gpp_atomtype_t at, t_bond_atomtype bat,
220 char *line, int nb_funct,
221 t_nbparam ***nbparam, t_nbparam ***pair,
228 t_xlate xl[eptNR] = {
236 int nr, i, nfields, j, pt, nfp0 = -1;
237 int batype_nr, nread;
238 char type[STRLEN], btype[STRLEN], ptype[STRLEN];
240 double c[MAXFORCEPARAM];
241 char tmpfield[12][100]; /* Max 12 fields of width 100 */
246 gmx_bool have_atomic_number;
247 gmx_bool have_bonded_type;
252 /* First assign input line to temporary array */
253 nfields = sscanf(line, "%s%s%s%s%s%s%s%s%s%s%s%s",
254 tmpfield[0], tmpfield[1], tmpfield[2], tmpfield[3], tmpfield[4], tmpfield[5],
255 tmpfield[6], tmpfield[7], tmpfield[8], tmpfield[9], tmpfield[10], tmpfield[11]);
257 /* Comments on optional fields in the atomtypes section:
259 * The force field format is getting a bit old. For OPLS-AA we needed
260 * to add a special bonded atomtype, and for Gerrit Groenhofs QM/MM stuff
261 * we also needed the atomic numbers.
262 * To avoid making all old or user-generated force fields unusable we
263 * have introduced both these quantities as optional columns, and do some
264 * acrobatics to check whether they are present or not.
265 * This will all look much nicer when we switch to XML... sigh.
267 * Field 0 (mandatory) is the nonbonded type name. (string)
268 * Field 1 (optional) is the bonded type (string)
269 * Field 2 (optional) is the atomic number (int)
270 * Field 3 (mandatory) is the mass (numerical)
271 * Field 4 (mandatory) is the charge (numerical)
272 * Field 5 (mandatory) is the particle type (single character)
273 * This is followed by a number of nonbonded parameters.
275 * The safest way to identify the format is the particle type field.
277 * So, here is what we do:
279 * A. Read in the first six fields as strings
280 * B. If field 3 (starting from 0) is a single char, we have neither
281 * bonded_type or atomic numbers.
282 * C. If field 5 is a single char we have both.
283 * D. If field 4 is a single char we check field 1. If this begins with
284 * an alphabetical character we have bonded types, otherwise atomic numbers.
293 if ( (strlen(tmpfield[5]) == 1) && isalpha(tmpfield[5][0]) )
295 have_bonded_type = TRUE;
296 have_atomic_number = TRUE;
298 else if ( (strlen(tmpfield[3]) == 1) && isalpha(tmpfield[3][0]) )
300 have_bonded_type = FALSE;
301 have_atomic_number = FALSE;
305 have_bonded_type = ( isalpha(tmpfield[1][0]) != 0 );
306 have_atomic_number = !have_bonded_type;
309 /* optional fields */
318 if (have_atomic_number)
320 if (have_bonded_type)
322 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf",
323 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1]);
332 /* have_atomic_number && !have_bonded_type */
333 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf",
334 type, &atomnr, &m, &q, ptype, &c[0], &c[1]);
344 if (have_bonded_type)
346 /* !have_atomic_number && have_bonded_type */
347 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf",
348 type, btype, &m, &q, ptype, &c[0], &c[1]);
357 /* !have_atomic_number && !have_bonded_type */
358 nread = sscanf(line, "%s%lf%lf%s%lf%lf",
359 type, &m, &q, ptype, &c[0], &c[1]);
368 if (!have_bonded_type)
373 if (!have_atomic_number)
383 if (have_atomic_number)
385 if (have_bonded_type)
387 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf%lf",
388 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2]);
397 /* have_atomic_number && !have_bonded_type */
398 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf%lf",
399 type, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2]);
409 if (have_bonded_type)
411 /* !have_atomic_number && have_bonded_type */
412 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf%lf",
413 type, btype, &m, &q, ptype, &c[0], &c[1], &c[2]);
422 /* !have_atomic_number && !have_bonded_type */
423 nread = sscanf(line, "%s%lf%lf%s%lf%lf%lf",
424 type, &m, &q, ptype, &c[0], &c[1], &c[2]);
433 if (!have_bonded_type)
438 if (!have_atomic_number)
446 sprintf(errbuf, "Invalid function type %d in push_at", nb_funct);
447 warning_error_and_exit(wi, errbuf, FARGS);
449 for (j = nfp0; (j < MAXFORCEPARAM); j++)
454 if (strlen(type) == 1 && isdigit(type[0]))
456 warning_error_and_exit(wi, "Atom type names can't be single digits.", FARGS);
459 if (strlen(btype) == 1 && isdigit(btype[0]))
461 warning_error_and_exit(wi, "Bond atom type names can't be single digits.", FARGS);
464 /* Hack to read old topologies */
465 if (gmx_strcasecmp(ptype, "D") == 0)
469 for (j = 0; (j < eptNR); j++)
471 if (gmx_strcasecmp(ptype, xl[j].entry) == 0)
478 sprintf(errbuf, "Invalid particle type %s", ptype);
479 warning_error_and_exit(wi, errbuf, FARGS);
484 fprintf(debug, "ptype: %s\n", ptype_str[pt]);
490 for (i = 0; (i < MAXFORCEPARAM); i++)
495 if ((batype_nr = get_bond_atomtype_type(btype, bat)) == NOTSET)
497 add_bond_atomtype(bat, symtab, btype);
499 batype_nr = get_bond_atomtype_type(btype, bat);
501 if ((nr = get_atomtype_type(type, at)) != NOTSET)
503 sprintf(errbuf, "Overriding atomtype %s", type);
505 if ((nr = set_atomtype(nr, at, symtab, atom, type, param, batype_nr,
508 sprintf(errbuf, "Replacing atomtype %s failed", type);
509 warning_error_and_exit(wi, errbuf, FARGS);
512 else if ((add_atomtype(at, symtab, atom, type, param,
513 batype_nr, atomnr)) == NOTSET)
515 sprintf(errbuf, "Adding atomtype %s failed", type);
516 warning_error_and_exit(wi, errbuf, FARGS);
520 /* Add space in the non-bonded parameters matrix */
521 realloc_nb_params(at, nbparam, pair);
527 //! Return whether the contents of \c a and \c b are the same, considering also reversed order.
528 template <typename T>
529 static bool equalEitherForwardOrBackward(gmx::ArrayRef<const T> a, gmx::ArrayRef<const T> b)
531 return (std::equal(a.begin(), a.end(), b.begin()) ||
532 std::equal(a.begin(), a.end(), b.rbegin()));
535 static void push_bondtype(t_params * bt,
539 gmx_bool bAllowRepeat,
544 int nrfp = NRFP(ftype);
547 /* If bAllowRepeat is TRUE, we allow multiple entries as long as they
548 are on directly _adjacent_ lines.
551 /* First check if our atomtypes are _identical_ (not reversed) to the previous
552 entry. If they are not identical we search for earlier duplicates. If they are
553 we can skip it, since we already searched for the first line
557 bool isContinuationOfBlock = false;
558 if (bAllowRepeat && nr > 1)
560 isContinuationOfBlock = true;
561 for (int j = 0; j < nral; j++)
563 if (b->a[j] != bt->param[nr - 2].a[j])
565 isContinuationOfBlock = false;
570 /* Search for earlier duplicates if this entry was not a continuation
571 from the previous line.
573 bool addBondType = true;
574 bool haveWarned = false;
575 bool haveErrored = false;
576 for (int i = 0; (i < nr); i++)
578 gmx::ArrayRef<const int> bParams(b->a, b->a + nral);
579 gmx::ArrayRef<const int> testParams(bt->param[i].a, bt->param[i].a + nral);
580 if (equalEitherForwardOrBackward(bParams, testParams))
582 GMX_ASSERT(nrfp <= MAXFORCEPARAM, "This is ensured in other places, but we need this assert to keep the clang analyzer happy");
583 // TODO consider improving the following code by using:
584 // bool identicalParameters = std::equal(bt->param[i].c, bt->param[i].c + nrfp, b->c);
585 bool identicalParameters = true;
586 for (int j = 0; (j < nrfp); j++)
588 identicalParameters = identicalParameters && (bt->param[i].c[j] == b->c[j]);
591 if (!bAllowRepeat || identicalParameters)
596 if (!identicalParameters)
600 /* With dihedral type 9 we only allow for repeating
601 * of the same parameters with blocks with 1 entry.
602 * Allowing overriding is too complex to check.
604 if (!isContinuationOfBlock && !haveErrored)
606 warning_error(wi, "Encountered a second block of parameters for dihedral type 9 for the same atoms, with either different parameters and/or the first block has multiple lines. This is not supported.");
610 else if (!haveWarned)
612 sprintf(errbuf, "Overriding %s parameters.%s",
613 interaction_function[ftype].longname,
615 "\nUse dihedraltype 9 to allow several multiplicity terms. Only consecutive lines are combined. Non-consective lines overwrite each other."
619 fprintf(stderr, " old: ");
620 for (int j = 0; (j < nrfp); j++)
622 fprintf(stderr, " %g", bt->param[i].c[j]);
624 fprintf(stderr, " \n new: %s\n\n", line);
630 if (!identicalParameters && !bAllowRepeat)
632 /* Overwrite the parameters with the latest ones */
633 // TODO considering improving the following code by replacing with:
634 // std::copy(b->c, b->c + nrfp, bt->param[i].c);
635 for (int j = 0; (j < nrfp); j++)
637 bt->param[i].c[j] = b->c[j];
648 /* fill the arrays up and down */
649 memcpy(bt->param[bt->nr].c, b->c, sizeof(b->c));
650 memcpy(bt->param[bt->nr].a, b->a, sizeof(b->a));
651 memcpy(bt->param[bt->nr+1].c, b->c, sizeof(b->c));
653 /* The definitions of linear angles depend on the order of atoms,
654 * that means that for atoms i-j-k, with certain parameter a, the
655 * corresponding k-j-i angle will have parameter 1-a.
657 if (ftype == F_LINEAR_ANGLES)
659 bt->param[bt->nr+1].c[0] = 1-bt->param[bt->nr+1].c[0];
660 bt->param[bt->nr+1].c[2] = 1-bt->param[bt->nr+1].c[2];
663 for (int j = 0; (j < nral); j++)
665 bt->param[bt->nr+1].a[j] = b->a[nral-1-j];
672 void push_bt(directive d, t_params bt[], int nral,
674 t_bond_atomtype bat, char *line,
677 const char *formal[MAXATOMLIST+1] = {
686 const char *formnl[MAXATOMLIST+1] = {
692 "%*s%*s%*s%*s%*s%*s",
693 "%*s%*s%*s%*s%*s%*s%*s"
695 const char *formlf = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
696 int i, ft, ftype, nn, nrfp, nrfpA;
698 char alc[MAXATOMLIST+1][20];
699 /* One force parameter more, so we can check if we read too many */
700 double c[MAXFORCEPARAM+1];
704 if ((bat && at) || (!bat && !at))
706 gmx_incons("You should pass either bat or at to push_bt");
709 /* Make format string (nral ints+functype) */
710 if ((nn = sscanf(line, formal[nral],
711 alc[0], alc[1], alc[2], alc[3], alc[4], alc[5])) != nral+1)
713 sprintf(errbuf, "Not enough atomtypes (%d instead of %d)", nn-1, nral);
714 warning_error(wi, errbuf);
718 ft = strtol(alc[nral], nullptr, 10);
719 ftype = ifunc_index(d, ft);
721 nrfpA = interaction_function[ftype].nrfpA;
722 strcpy(f1, formnl[nral]);
724 if ((nn = sscanf(line, f1, &c[0], &c[1], &c[2], &c[3], &c[4], &c[5], &c[6], &c[7], &c[8], &c[9], &c[10], &c[11], &c[12]))
729 /* Copy the B-state from the A-state */
730 copy_B_from_A(ftype, c);
736 warning_error(wi, "Not enough parameters");
738 else if (nn > nrfpA && nn < nrfp)
740 warning_error(wi, "Too many parameters or not enough parameters for topology B");
744 warning_error(wi, "Too many parameters");
746 for (i = nn; (i < nrfp); i++)
752 for (i = 0; (i < nral); i++)
754 if (at && ((p.a[i] = get_atomtype_type(alc[i], at)) == NOTSET))
756 sprintf(errbuf, "Unknown atomtype %s\n", alc[i]);
757 warning_error_and_exit(wi, errbuf, FARGS);
759 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
761 sprintf(errbuf, "Unknown bond_atomtype %s\n", alc[i]);
762 warning_error_and_exit(wi, errbuf, FARGS);
765 for (i = 0; (i < nrfp); i++)
769 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
773 void push_dihedraltype(directive d, t_params bt[],
774 t_bond_atomtype bat, char *line,
777 const char *formal[MAXATOMLIST+1] = {
786 const char *formnl[MAXATOMLIST+1] = {
792 "%*s%*s%*s%*s%*s%*s",
793 "%*s%*s%*s%*s%*s%*s%*s"
795 const char *formlf[MAXFORCEPARAM] = {
801 "%lf%lf%lf%lf%lf%lf",
802 "%lf%lf%lf%lf%lf%lf%lf",
803 "%lf%lf%lf%lf%lf%lf%lf%lf",
804 "%lf%lf%lf%lf%lf%lf%lf%lf%lf",
805 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
806 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
807 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
809 int i, ft, ftype, nn, nrfp, nrfpA, nral;
811 char alc[MAXATOMLIST+1][20];
812 double c[MAXFORCEPARAM];
814 gmx_bool bAllowRepeat;
817 /* This routine accepts dihedraltypes defined from either 2 or 4 atoms.
819 * We first check for 2 atoms with the 3th column being an integer
820 * defining the type. If this isn't the case, we try it with 4 atoms
821 * and the 5th column defining the dihedral type.
823 nn = sscanf(line, formal[4], alc[0], alc[1], alc[2], alc[3], alc[4]);
824 if (nn >= 3 && strlen(alc[2]) == 1 && isdigit(alc[2][0]))
827 ft = strtol(alc[nral], nullptr, 10);
828 /* Move atom types around a bit and use 'X' for wildcard atoms
829 * to create a 4-atom dihedral definition with arbitrary atoms in
832 if (alc[2][0] == '2')
834 /* improper - the two atomtypes are 1,4. Use wildcards for 2,3 */
835 strcpy(alc[3], alc[1]);
836 sprintf(alc[2], "X");
837 sprintf(alc[1], "X");
838 /* alc[0] stays put */
842 /* proper - the two atomtypes are 2,3. Use wildcards for 1,4 */
843 sprintf(alc[3], "X");
844 strcpy(alc[2], alc[1]);
845 strcpy(alc[1], alc[0]);
846 sprintf(alc[0], "X");
849 else if (nn == 5 && strlen(alc[4]) == 1 && isdigit(alc[4][0]))
852 ft = strtol(alc[nral], nullptr, 10);
856 sprintf(errbuf, "Incorrect number of atomtypes for dihedral (%d instead of 2 or 4)", nn-1);
857 warning_error(wi, errbuf);
863 /* Previously, we have always overwritten parameters if e.g. a torsion
864 with the same atomtypes occurs on multiple lines. However, CHARMM and
865 some other force fields specify multiple dihedrals over some bonds,
866 including cosines with multiplicity 6 and somethimes even higher.
867 Thus, they cannot be represented with Ryckaert-Bellemans terms.
868 To add support for these force fields, Dihedral type 9 is identical to
869 normal proper dihedrals, but repeated entries are allowed.
876 bAllowRepeat = FALSE;
880 ftype = ifunc_index(d, ft);
882 nrfpA = interaction_function[ftype].nrfpA;
884 strcpy(f1, formnl[nral]);
885 strcat(f1, formlf[nrfp-1]);
887 /* Check number of parameters given */
888 if ((nn = sscanf(line, f1, &c[0], &c[1], &c[2], &c[3], &c[4], &c[5], &c[6], &c[7], &c[8], &c[9], &c[10], &c[11]))
893 /* Copy the B-state from the A-state */
894 copy_B_from_A(ftype, c);
900 warning_error(wi, "Not enough parameters");
902 else if (nn > nrfpA && nn < nrfp)
904 warning_error(wi, "Too many parameters or not enough parameters for topology B");
908 warning_error(wi, "Too many parameters");
910 for (i = nn; (i < nrfp); i++)
917 for (i = 0; (i < 4); i++)
919 if (!strcmp(alc[i], "X"))
925 if ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET)
927 sprintf(errbuf, "Unknown bond_atomtype %s", alc[i]);
928 warning_error_and_exit(wi, errbuf, FARGS);
932 for (i = 0; (i < nrfp); i++)
936 /* Always use 4 atoms here, since we created two wildcard atoms
937 * if there wasn't of them 4 already.
939 push_bondtype (&(bt[ftype]), &p, 4, ftype, bAllowRepeat, line, wi);
943 void push_nbt(directive d, t_nbparam **nbt, gpp_atomtype_t atype,
944 char *pline, int nb_funct,
948 const char *form3 = "%*s%*s%*s%lf%lf%lf";
949 const char *form4 = "%*s%*s%*s%lf%lf%lf%lf";
950 const char *form5 = "%*s%*s%*s%lf%lf%lf%lf%lf";
952 int i, f, n, ftype, nrfp;
960 if (sscanf (pline, "%s%s%d", a0, a1, &f) != 3)
966 ftype = ifunc_index(d, f);
968 if (ftype != nb_funct)
970 sprintf(errbuf, "Trying to add %s while the default nonbond type is %s",
971 interaction_function[ftype].longname,
972 interaction_function[nb_funct].longname);
973 warning_error(wi, errbuf);
977 /* Get the force parameters */
981 n = sscanf(pline, form4, &c[0], &c[1], &c[2], &c[3]);
987 /* When the B topology parameters are not set,
988 * copy them from topology A
990 GMX_ASSERT(nrfp <= 4, "LJ-14 cannot have more than 4 parameters");
991 for (i = n; i < nrfp; i++)
996 else if (ftype == F_LJC14_Q)
998 n = sscanf(pline, form5, &c[0], &c[1], &c[2], &c[3], &dum);
1001 incorrect_n_param(wi);
1007 if (sscanf(pline, form3, &c[0], &c[1], &dum) != 2)
1009 incorrect_n_param(wi);
1015 if (sscanf(pline, form4, &c[0], &c[1], &c[2], &dum) != 3)
1017 incorrect_n_param(wi);
1023 sprintf(errbuf, "Number of force parameters for nonbonded interactions is %d", nrfp);
1024 warning_error_and_exit(wi, errbuf, FARGS);
1026 for (i = 0; (i < nrfp); i++)
1031 /* Put the parameters in the matrix */
1032 if ((ai = get_atomtype_type (a0, atype)) == NOTSET)
1034 sprintf(errbuf, "Atomtype %s not found", a0);
1035 warning_error_and_exit(wi, errbuf, FARGS);
1037 if ((aj = get_atomtype_type (a1, atype)) == NOTSET)
1039 sprintf(errbuf, "Atomtype %s not found", a1);
1040 warning_error_and_exit(wi, errbuf, FARGS);
1042 nbp = &(nbt[std::max(ai, aj)][std::min(ai, aj)]);
1047 for (i = 0; i < nrfp; i++)
1049 bId = bId && (nbp->c[i] == cr[i]);
1053 sprintf(errbuf, "Overriding non-bonded parameters,");
1054 warning(wi, errbuf);
1055 fprintf(stderr, " old:");
1056 for (i = 0; i < nrfp; i++)
1058 fprintf(stderr, " %g", nbp->c[i]);
1060 fprintf(stderr, " new\n%s\n", pline);
1064 for (i = 0; i < nrfp; i++)
1071 push_cmaptype(directive d, t_params bt[], int nral, gpp_atomtype_t at,
1072 t_bond_atomtype bat, char *line,
1075 const char *formal = "%s%s%s%s%s%s%s%s%n";
1077 int i, ft, ftype, nn, nrfp, nrfpA, nrfpB;
1078 int start, nchar_consumed;
1079 int nxcmap, nycmap, ncmap, read_cmap, sl, nct;
1080 char s[20], alc[MAXATOMLIST+2][20];
1082 char errbuf[STRLEN];
1084 /* Keep the compiler happy */
1088 GMX_ASSERT(nral == 5, "CMAP requires 5 atoms per interaction");
1090 /* Here we can only check for < 8 */
1091 if ((nn = sscanf(line, formal, alc[0], alc[1], alc[2], alc[3], alc[4], alc[5], alc[6], alc[7], &nchar_consumed)) < nral+3)
1093 sprintf(errbuf, "Incorrect number of atomtypes for cmap (%d instead of 5)", nn-1);
1094 warning_error(wi, errbuf);
1097 start += nchar_consumed;
1099 ft = strtol(alc[nral], nullptr, 10);
1100 nxcmap = strtol(alc[nral+1], nullptr, 10);
1101 nycmap = strtol(alc[nral+2], nullptr, 10);
1103 /* Check for equal grid spacing in x and y dims */
1104 if (nxcmap != nycmap)
1106 sprintf(errbuf, "Not the same grid spacing in x and y for cmap grid: x=%d, y=%d", nxcmap, nycmap);
1107 warning_error(wi, errbuf);
1110 ncmap = nxcmap*nycmap;
1111 ftype = ifunc_index(d, ft);
1112 nrfpA = strtol(alc[6], nullptr, 10)*strtol(alc[6], nullptr, 10);
1113 nrfpB = strtol(alc[7], nullptr, 10)*strtol(alc[7], nullptr, 10);
1116 /* Allocate memory for the CMAP grid */
1117 bt[F_CMAP].ncmap += nrfp;
1118 srenew(bt[F_CMAP].cmap, bt[F_CMAP].ncmap);
1120 /* Read in CMAP parameters */
1122 for (i = 0; i < ncmap; i++)
1124 while (isspace(*(line+start+sl)))
1128 nn = sscanf(line+start+sl, " %s ", s);
1130 bt[F_CMAP].cmap[i+(bt[F_CMAP].ncmap)-nrfp] = strtod(s, nullptr);
1138 sprintf(errbuf, "Error in reading cmap parameter for angle %s %s %s %s %s", alc[0], alc[1], alc[2], alc[3], alc[4]);
1139 warning_error(wi, errbuf);
1144 /* Check do that we got the number of parameters we expected */
1145 if (read_cmap == nrfpA)
1147 for (i = 0; i < ncmap; i++)
1149 bt[F_CMAP].cmap[i+ncmap] = bt[F_CMAP].cmap[i];
1154 if (read_cmap < nrfpA)
1156 warning_error(wi, "Not enough cmap parameters");
1158 else if (read_cmap > nrfpA && read_cmap < nrfp)
1160 warning_error(wi, "Too many cmap parameters or not enough parameters for topology B");
1162 else if (read_cmap > nrfp)
1164 warning_error(wi, "Too many cmap parameters");
1169 /* Set grid spacing and the number of grids (we assume these numbers to be the same for all grids
1170 * so we can safely assign them each time
1172 bt[F_CMAP].grid_spacing = nxcmap; /* Or nycmap, they need to be equal */
1173 bt[F_CMAP].nc = bt[F_CMAP].nc + 1; /* Since we are incrementing here, we need to subtract later, see (*****) */
1174 nct = (nral+1) * bt[F_CMAP].nc;
1176 /* Allocate memory for the cmap_types information */
1177 srenew(bt[F_CMAP].cmap_types, nct);
1179 for (i = 0; (i < nral); i++)
1181 if (at && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1183 sprintf(errbuf, "Unknown atomtype %s\n", alc[i]);
1184 warning_error(wi, errbuf);
1186 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1188 sprintf(errbuf, "Unknown bond_atomtype %s\n", alc[i]);
1189 warning_error(wi, errbuf);
1192 /* Assign a grid number to each cmap_type */
1193 bt[F_CMAP].cmap_types[bt[F_CMAP].nct++] = get_bond_atomtype_type(alc[i], bat);
1196 /* Assign a type number to this cmap */
1197 bt[F_CMAP].cmap_types[bt[F_CMAP].nct++] = bt[F_CMAP].nc-1; /* Since we inremented earlier, we need to subtrac here, to get the types right (****) */
1199 /* Check for the correct number of atoms (again) */
1200 if (bt[F_CMAP].nct != nct)
1202 sprintf(errbuf, "Incorrect number of atom types (%d) in cmap type %d\n", nct, bt[F_CMAP].nc);
1203 warning_error(wi, errbuf);
1206 /* Is this correct?? */
1207 for (i = 0; i < MAXFORCEPARAM; i++)
1212 /* Push the bond to the bondlist */
1213 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
1217 static void push_atom_now(t_symtab *symtab, t_atoms *at, int atomnr,
1219 int type, char *ctype, int ptype,
1221 char *resname, char *name, real m0, real q0,
1222 int typeB, char *ctypeB, real mB, real qB,
1225 int j, resind = 0, resnr;
1228 char errbuf[STRLEN];
1230 if (((nr == 0) && (atomnr != 1)) || (nr && (atomnr != at->nr+1)))
1232 sprintf(errbuf, "Atoms in the .top are not numbered consecutively from 1 (rather, atomnr = %d, while at->nr = %d)", atomnr, at->nr);
1233 warning_error_and_exit(wi, errbuf, FARGS);
1236 j = strlen(resnumberic) - 1;
1237 if (isdigit(resnumberic[j]))
1243 ric = resnumberic[j];
1244 if (j == 0 || !isdigit(resnumberic[j-1]))
1246 sprintf(errbuf, "Invalid residue number '%s' for atom %d",
1247 resnumberic, atomnr);
1248 warning_error_and_exit(wi, errbuf, FARGS);
1251 resnr = strtol(resnumberic, nullptr, 10);
1255 resind = at->atom[nr-1].resind;
1257 if (nr == 0 || strcmp(resname, *at->resinfo[resind].name) != 0 ||
1258 resnr != at->resinfo[resind].nr ||
1259 ric != at->resinfo[resind].ic)
1269 at->nres = resind + 1;
1270 srenew(at->resinfo, at->nres);
1271 at->resinfo[resind].name = put_symtab(symtab, resname);
1272 at->resinfo[resind].nr = resnr;
1273 at->resinfo[resind].ic = ric;
1277 resind = at->atom[at->nr-1].resind;
1280 /* New atom instance
1281 * get new space for arrays
1283 srenew(at->atom, nr+1);
1284 srenew(at->atomname, nr+1);
1285 srenew(at->atomtype, nr+1);
1286 srenew(at->atomtypeB, nr+1);
1289 at->atom[nr].type = type;
1290 at->atom[nr].ptype = ptype;
1291 at->atom[nr].q = q0;
1292 at->atom[nr].m = m0;
1293 at->atom[nr].typeB = typeB;
1294 at->atom[nr].qB = qB;
1295 at->atom[nr].mB = mB;
1297 at->atom[nr].resind = resind;
1298 at->atom[nr].atomnumber = atomicnumber;
1299 at->atomname[nr] = put_symtab(symtab, name);
1300 at->atomtype[nr] = put_symtab(symtab, ctype);
1301 at->atomtypeB[nr] = put_symtab(symtab, ctypeB);
1305 static void push_cg(t_block *block, int *lastindex, int index, int a)
1309 fprintf (debug, "Index %d, Atom %d\n", index, a);
1312 if (((block->nr) && (*lastindex != index)) || (!block->nr))
1314 /* add a new block */
1316 srenew(block->index, block->nr+1);
1318 block->index[block->nr] = a + 1;
1322 void push_atom(t_symtab *symtab, t_block *cgs,
1323 t_atoms *at, gpp_atomtype_t atype, char *line, int *lastcg,
1327 int cgnumber, atomnr, type, typeB, nscan;
1328 char id[STRLEN], ctype[STRLEN], ctypeB[STRLEN],
1329 resnumberic[STRLEN], resname[STRLEN], name[STRLEN], check[STRLEN];
1330 double m, q, mb, qb;
1331 real m0, q0, mB, qB;
1332 char errbuf[STRLEN];
1334 /* Make a shortcut for writing in this molecule */
1337 /* Fixed parameters */
1338 if (sscanf(line, "%s%s%s%s%s%d",
1339 id, ctype, resnumberic, resname, name, &cgnumber) != 6)
1344 sscanf(id, "%d", &atomnr);
1345 if ((type = get_atomtype_type(ctype, atype)) == NOTSET)
1347 sprintf(errbuf, "Atomtype %s not found", ctype);
1348 warning_error_and_exit(wi, errbuf, FARGS);
1350 ptype = get_atomtype_ptype(type, atype);
1352 /* Set default from type */
1353 q0 = get_atomtype_qA(type, atype);
1354 m0 = get_atomtype_massA(type, atype);
1359 /* Optional parameters */
1360 nscan = sscanf(line, "%*s%*s%*s%*s%*s%*s%lf%lf%s%lf%lf%s",
1361 &q, &m, ctypeB, &qb, &mb, check);
1363 /* Nasty switch that falls thru all the way down! */
1372 if ((typeB = get_atomtype_type(ctypeB, atype)) == NOTSET)
1374 sprintf(errbuf, "Atomtype %s not found", ctypeB);
1375 warning_error_and_exit(wi, errbuf, FARGS);
1377 qB = get_atomtype_qA(typeB, atype);
1378 mB = get_atomtype_massA(typeB, atype);
1387 warning_error(wi, "Too many parameters");
1396 fprintf(debug, "mB=%g, qB=%g, typeB=%d\n", mB, qB, typeB);
1399 push_cg(cgs, lastcg, cgnumber, nr);
1401 push_atom_now(symtab, at, atomnr, get_atomtype_atomnumber(type, atype),
1402 type, ctype, ptype, resnumberic,
1403 resname, name, m0, q0, typeB,
1404 typeB == type ? ctype : ctypeB, mB, qB, wi);
1407 void push_molt(t_symtab *symtab, int *nmol, t_molinfo **mol, char *line,
1413 char errbuf[STRLEN];
1415 if ((sscanf(line, "%s%d", type, &nrexcl)) != 2)
1417 warning_error(wi, "Expected a molecule type name and nrexcl");
1420 /* Test if this moleculetype overwrites another */
1424 if (strcmp(*((*mol)[i].name), type) == 0)
1426 sprintf(errbuf, "moleculetype %s is redefined", type);
1427 warning_error_and_exit(wi, errbuf, FARGS);
1433 srenew(*mol, *nmol);
1434 newmol = &((*mol)[*nmol-1]);
1435 init_molinfo(newmol);
1437 /* Fill in the values */
1438 newmol->name = put_symtab(symtab, type);
1439 newmol->nrexcl = nrexcl;
1440 newmol->excl_set = FALSE;
1443 static gmx_bool default_nb_params(int ftype, t_params bt[], t_atoms *at,
1444 t_param *p, int c_start, gmx_bool bB, gmx_bool bGenPairs)
1446 int i, j, ti, tj, ntype;
1448 t_param *pi = nullptr;
1449 int nr = bt[ftype].nr;
1450 int nral = NRAL(ftype);
1451 int nrfp = interaction_function[ftype].nrfpA;
1452 int nrfpB = interaction_function[ftype].nrfpB;
1454 if ((!bB && nrfp == 0) || (bB && nrfpB == 0))
1462 /* First test the generated-pair position to save
1463 * time when we have 1000*1000 entries for e.g. OPLS...
1465 ntype = static_cast<int>(std::sqrt(static_cast<double>(nr)));
1466 GMX_ASSERT(ntype * ntype == nr, "Number of pairs of generated non-bonded parameters should be a perfect square");
1469 ti = at->atom[p->a[0]].typeB;
1470 tj = at->atom[p->a[1]].typeB;
1474 ti = at->atom[p->a[0]].type;
1475 tj = at->atom[p->a[1]].type;
1477 pi = &(bt[ftype].param[ntype*ti+tj]);
1478 bFound = ((ti == pi->a[0]) && (tj == pi->a[1]));
1481 /* Search explicitly if we didnt find it */
1484 for (i = 0; ((i < nr) && !bFound); i++)
1486 pi = &(bt[ftype].param[i]);
1489 for (j = 0; ((j < nral) &&
1490 (at->atom[p->a[j]].typeB == pi->a[j])); j++)
1497 for (j = 0; ((j < nral) &&
1498 (at->atom[p->a[j]].type == pi->a[j])); j++)
1503 bFound = (j == nral);
1511 if (nrfp+nrfpB > MAXFORCEPARAM)
1513 gmx_incons("Too many force parameters");
1515 for (j = c_start; (j < nrfpB); j++)
1517 p->c[nrfp+j] = pi->c[j];
1522 for (j = c_start; (j < nrfp); j++)
1530 for (j = c_start; (j < nrfp); j++)
1538 static gmx_bool default_cmap_params(t_params bondtype[],
1539 t_atoms *at, gpp_atomtype_t atype,
1540 t_param *p, gmx_bool bB,
1541 int *cmap_type, int *nparam_def,
1544 int i, nparam_found;
1546 gmx_bool bFound = FALSE;
1547 char errbuf[STRLEN];
1552 /* Match the current cmap angle against the list of cmap_types */
1553 for (i = 0; i < bondtype[F_CMAP].nct && !bFound; i += 6)
1562 (get_atomtype_batype(at->atom[p->a[0]].type, atype) == bondtype[F_CMAP].cmap_types[i]) &&
1563 (get_atomtype_batype(at->atom[p->a[1]].type, atype) == bondtype[F_CMAP].cmap_types[i+1]) &&
1564 (get_atomtype_batype(at->atom[p->a[2]].type, atype) == bondtype[F_CMAP].cmap_types[i+2]) &&
1565 (get_atomtype_batype(at->atom[p->a[3]].type, atype) == bondtype[F_CMAP].cmap_types[i+3]) &&
1566 (get_atomtype_batype(at->atom[p->a[4]].type, atype) == bondtype[F_CMAP].cmap_types[i+4]))
1568 /* Found cmap torsion */
1570 ct = bondtype[F_CMAP].cmap_types[i+5];
1576 /* If we did not find a matching type for this cmap torsion */
1579 sprintf(errbuf, "Unknown cmap torsion between atoms %d %d %d %d %d",
1580 p->a[0]+1, p->a[1]+1, p->a[2]+1, p->a[3]+1, p->a[4]+1);
1581 warning_error_and_exit(wi, errbuf, FARGS);
1584 *nparam_def = nparam_found;
1590 /* Returns the number of exact atom type matches, i.e. non wild-card matches,
1591 * returns -1 when there are no matches at all.
1593 static int natom_match(t_param *pi,
1594 int type_i, int type_j, int type_k, int type_l,
1595 const gpp_atomtype_t atype)
1597 if ((pi->ai() == -1 || get_atomtype_batype(type_i, atype) == pi->ai()) &&
1598 (pi->aj() == -1 || get_atomtype_batype(type_j, atype) == pi->aj()) &&
1599 (pi->ak() == -1 || get_atomtype_batype(type_k, atype) == pi->ak()) &&
1600 (pi->al() == -1 || get_atomtype_batype(type_l, atype) == pi->al()))
1603 (pi->ai() == -1 ? 0 : 1) +
1604 (pi->aj() == -1 ? 0 : 1) +
1605 (pi->ak() == -1 ? 0 : 1) +
1606 (pi->al() == -1 ? 0 : 1);
1614 static gmx_bool default_params(int ftype, t_params bt[],
1615 t_atoms *at, gpp_atomtype_t atype,
1616 t_param *p, gmx_bool bB,
1617 t_param **param_def,
1621 gmx_bool bFound, bSame;
1622 t_param *pi = nullptr;
1623 t_param *pj = nullptr;
1624 int nr = bt[ftype].nr;
1625 int nral = NRAL(ftype);
1626 int nrfpA = interaction_function[ftype].nrfpA;
1627 int nrfpB = interaction_function[ftype].nrfpB;
1629 if ((!bB && nrfpA == 0) || (bB && nrfpB == 0))
1637 if (ftype == F_PDIHS || ftype == F_RBDIHS || ftype == F_IDIHS || ftype == F_PIDIHS)
1639 int nmatch_max = -1;
1643 /* For dihedrals we allow wildcards. We choose the first type
1644 * that has the most real matches, i.e. non-wildcard matches.
1646 for (t = 0; ((t < nr) && nmatch_max < 4); t++)
1651 pt = &(bt[ftype].param[t]);
1654 nmatch = natom_match(pt, at->atom[p->ai()].typeB, at->atom[p->aj()].typeB, at->atom[p->ak()].typeB, at->atom[p->al()].typeB, atype);
1658 nmatch = natom_match(pt, at->atom[p->ai()].type, at->atom[p->aj()].type, at->atom[p->ak()].type, at->atom[p->al()].type, atype);
1660 if (nmatch > nmatch_max)
1662 nmatch_max = nmatch;
1672 pi = &(bt[ftype].param[i]);
1675 /* Find additional matches for this dihedral - necessary
1677 * The rule in that case is that additional matches
1678 * HAVE to be on adjacent lines!
1681 /* Continue from current i value */
1682 for (j = i + 2; j < nr && bSame; j += 2)
1684 pj = &(bt[ftype].param[j]);
1685 bSame = (pi->ai() == pj->ai() && pi->aj() == pj->aj() && pi->ak() == pj->ak() && pi->al() == pj->al());
1690 /* nparam_found will be increased as long as the numbers match */
1694 else /* Not a dihedral */
1698 for (i = 0; ((i < nr) && !bFound); i++)
1700 pi = &(bt[ftype].param[i]);
1703 for (j = 0; ((j < nral) &&
1704 (get_atomtype_batype(at->atom[p->a[j]].typeB, atype) == pi->a[j])); j++)
1711 for (j = 0; ((j < nral) &&
1712 (get_atomtype_batype(at->atom[p->a[j]].type, atype) == pi->a[j])); j++)
1717 bFound = (j == nral);
1726 *nparam_def = nparam_found;
1733 void push_bond(directive d, t_params bondtype[], t_params bond[],
1734 t_atoms *at, gpp_atomtype_t atype, char *line,
1735 gmx_bool bBonded, gmx_bool bGenPairs, real fudgeQQ,
1736 gmx_bool bZero, gmx_bool *bWarn_copy_A_B,
1739 const char *aaformat[MAXATOMLIST] = {
1747 const char *asformat[MAXATOMLIST] = {
1752 "%*s%*s%*s%*s%*s%*s",
1753 "%*s%*s%*s%*s%*s%*s%*s"
1755 const char *ccformat = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
1756 int nr, i, j, nral, nral_fmt, nread, ftype;
1757 char format[STRLEN];
1758 /* One force parameter more, so we can check if we read too many */
1759 double cc[MAXFORCEPARAM+1];
1760 int aa[MAXATOMLIST+1];
1761 t_param param, *param_defA, *param_defB;
1762 gmx_bool bFoundA = FALSE, bFoundB = FALSE, bDef, bPert, bSwapParity = FALSE;
1763 int nparam_defA, nparam_defB;
1764 char errbuf[STRLEN];
1766 nparam_defA = nparam_defB = 0;
1768 ftype = ifunc_index(d, 1);
1770 for (j = 0; j < MAXATOMLIST; j++)
1774 bDef = (NRFP(ftype) > 0);
1776 if (ftype == F_SETTLE)
1778 /* SETTLE acts on 3 atoms, but the topology format only specifies
1779 * the first atom (for historical reasons).
1788 nread = sscanf(line, aaformat[nral_fmt-1],
1789 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
1791 if (ftype == F_SETTLE)
1798 if (nread < nral_fmt)
1803 else if (nread > nral_fmt)
1805 /* this is a hack to allow for virtual sites with swapped parity */
1806 bSwapParity = (aa[nral] < 0);
1809 aa[nral] = -aa[nral];
1811 ftype = ifunc_index(d, aa[nral]);
1820 sprintf(errbuf, "Negative function types only allowed for %s and %s",
1821 interaction_function[F_VSITE3FAD].longname,
1822 interaction_function[F_VSITE3OUT].longname);
1823 warning_error_and_exit(wi, errbuf, FARGS);
1829 /* Check for double atoms and atoms out of bounds */
1830 for (i = 0; (i < nral); i++)
1832 if (aa[i] < 1 || aa[i] > at->nr)
1834 sprintf(errbuf, "Atom index (%d) in %s out of bounds (1-%d).\n"
1835 "This probably means that you have inserted topology section \"%s\"\n"
1836 "in a part belonging to a different molecule than you intended to.\n"
1837 "In that case move the \"%s\" section to the right molecule.",
1838 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
1839 warning_error_and_exit(wi, errbuf, FARGS);
1841 for (j = i+1; (j < nral); j++)
1843 GMX_ASSERT(j < MAXATOMLIST + 1, "Values from nral=NRAL() will satisfy this, we assert to keep gcc 4 happy");
1846 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
1847 if (ftype == F_ANGRES)
1849 /* Since the angle restraints uses 2 pairs of atoms to
1850 * defines an angle between vectors, it can be useful
1851 * to use one atom twice, so we only issue a note here.
1853 warning_note(wi, errbuf);
1857 warning_error(wi, errbuf);
1863 /* default force parameters */
1864 for (j = 0; (j < MAXATOMLIST); j++)
1866 param.a[j] = aa[j]-1;
1868 for (j = 0; (j < MAXFORCEPARAM); j++)
1873 /* Get force params for normal and free energy perturbation
1874 * studies, as determined by types!
1879 bFoundA = default_params(ftype, bondtype, at, atype, ¶m, FALSE, ¶m_defA, &nparam_defA);
1882 /* Copy the A-state and B-state default parameters. */
1883 GMX_ASSERT(NRFPA(ftype)+NRFPB(ftype) <= MAXFORCEPARAM, "Bonded interactions may have at most 12 parameters");
1884 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
1886 param.c[j] = param_defA->c[j];
1889 bFoundB = default_params(ftype, bondtype, at, atype, ¶m, TRUE, ¶m_defB, &nparam_defB);
1892 /* Copy only the B-state default parameters */
1893 for (j = NRFPA(ftype); (j < NRFP(ftype)); j++)
1895 param.c[j] = param_defB->c[j];
1899 else if (ftype == F_LJ14)
1901 bFoundA = default_nb_params(ftype, bondtype, at, ¶m, 0, FALSE, bGenPairs);
1902 bFoundB = default_nb_params(ftype, bondtype, at, ¶m, 0, TRUE, bGenPairs);
1904 else if (ftype == F_LJC14_Q)
1906 param.c[0] = fudgeQQ;
1907 /* Fill in the A-state charges as default parameters */
1908 param.c[1] = at->atom[param.a[0]].q;
1909 param.c[2] = at->atom[param.a[1]].q;
1910 /* The default LJ parameters are the standard 1-4 parameters */
1911 bFoundA = default_nb_params(F_LJ14, bondtype, at, ¶m, 3, FALSE, bGenPairs);
1914 else if (ftype == F_LJC_PAIRS_NB)
1916 /* Defaults are not supported here */
1922 gmx_incons("Unknown function type in push_bond");
1925 if (nread > nral_fmt)
1927 /* Manually specified parameters - in this case we discard multiple torsion info! */
1929 strcpy(format, asformat[nral_fmt-1]);
1930 strcat(format, ccformat);
1932 nread = sscanf(line, format, &cc[0], &cc[1], &cc[2], &cc[3], &cc[4], &cc[5],
1933 &cc[6], &cc[7], &cc[8], &cc[9], &cc[10], &cc[11], &cc[12]);
1935 if ((nread == NRFPA(ftype)) && (NRFPB(ftype) != 0))
1937 /* We only have to issue a warning if these atoms are perturbed! */
1939 for (j = 0; (j < nral); j++)
1941 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
1944 if (bPert && *bWarn_copy_A_B)
1947 "Some parameters for bonded interaction involving perturbed atoms are specified explicitly in state A, but not B - copying A to B");
1948 warning(wi, errbuf);
1949 *bWarn_copy_A_B = FALSE;
1952 /* If only the A parameters were specified, copy them to the B state */
1953 /* The B-state parameters correspond to the first nrfpB
1954 * A-state parameters.
1956 for (j = 0; (j < NRFPB(ftype)); j++)
1958 cc[nread++] = cc[j];
1962 /* If nread was 0 or EOF, no parameters were read => use defaults.
1963 * If nread was nrfpA we copied above so nread=nrfp.
1964 * If nread was nrfp we are cool.
1965 * For F_LJC14_Q we allow supplying fudgeQQ only.
1966 * Anything else is an error!
1968 if ((nread != 0) && (nread != EOF) && (nread != NRFP(ftype)) &&
1969 !(ftype == F_LJC14_Q && nread == 1))
1971 sprintf(errbuf, "Incorrect number of parameters - found %d, expected %d or %d for %s (after the function type).",
1972 nread, NRFPA(ftype), NRFP(ftype), interaction_function[ftype].longname);
1973 warning_error_and_exit(wi, errbuf, FARGS);
1976 for (j = 0; (j < nread); j++)
1981 /* Check whether we have to use the defaults */
1982 if (nread == NRFP(ftype))
1991 /* nread now holds the number of force parameters read! */
1996 /* When we have multiple terms it would be very dangerous to allow perturbations to a different atom type! */
1997 if (ftype == F_PDIHS)
1999 if ((nparam_defA != nparam_defB) || ((nparam_defA > 1 || nparam_defB > 1) && (param_defA != param_defB)))
2002 "Cannot automatically perturb a torsion with multiple terms to different form.\n"
2003 "Please specify perturbed parameters manually for this torsion in your topology!");
2004 warning_error(wi, errbuf);
2008 if (nread > 0 && nread < NRFPA(ftype))
2010 /* Issue an error, do not use defaults */
2011 sprintf(errbuf, "Not enough parameters, there should be at least %d (or 0 for defaults)", NRFPA(ftype));
2012 warning_error(wi, errbuf);
2015 if (nread == 0 || nread == EOF)
2019 if (interaction_function[ftype].flags & IF_VSITE)
2021 /* set them to NOTSET, will be calculated later */
2022 for (j = 0; (j < MAXFORCEPARAM); j++)
2024 param.c[j] = NOTSET;
2029 param.c1() = -1; /* flag to swap parity of vsite construction */
2036 fprintf(stderr, "NOTE: No default %s types, using zeroes\n",
2037 interaction_function[ftype].longname);
2041 sprintf(errbuf, "No default %s types", interaction_function[ftype].longname);
2042 warning_error(wi, errbuf);
2053 param.c0() = 360 - param.c0();
2056 param.c2() = -param.c2();
2063 /* We only have to issue a warning if these atoms are perturbed! */
2065 for (j = 0; (j < nral); j++)
2067 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
2072 sprintf(errbuf, "No default %s types for perturbed atoms, "
2073 "using normal values", interaction_function[ftype].longname);
2074 warning(wi, errbuf);
2080 if ((ftype == F_PDIHS || ftype == F_ANGRES || ftype == F_ANGRESZ)
2081 && param.c[5] != param.c[2])
2083 sprintf(errbuf, "%s multiplicity can not be perturbed %f!=%f",
2084 interaction_function[ftype].longname,
2085 param.c[2], param.c[5]);
2086 warning_error_and_exit(wi, errbuf, FARGS);
2089 if (IS_TABULATED(ftype) && param.c[2] != param.c[0])
2091 sprintf(errbuf, "%s table number can not be perturbed %d!=%d",
2092 interaction_function[ftype].longname,
2093 (int)(param.c[0]+0.5), (int)(param.c[2]+0.5));
2094 warning_error_and_exit(wi, errbuf, FARGS);
2097 /* Dont add R-B dihedrals where all parameters are zero (no interaction) */
2098 if (ftype == F_RBDIHS)
2101 for (i = 0; i < NRFP(ftype); i++)
2103 if (param.c[i] != 0)
2114 /* Put the values in the appropriate arrays */
2115 add_param_to_list (&bond[ftype], ¶m);
2117 /* Push additional torsions from FF for ftype==9 if we have them.
2118 * We have already checked that the A/B states do not differ in this case,
2119 * so we do not have to double-check that again, or the vsite stuff.
2120 * In addition, those torsions cannot be automatically perturbed.
2122 if (bDef && ftype == F_PDIHS)
2124 for (i = 1; i < nparam_defA; i++)
2126 /* Advance pointer! */
2128 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
2130 param.c[j] = param_defA->c[j];
2132 /* And push the next term for this torsion */
2133 add_param_to_list (&bond[ftype], ¶m);
2138 void push_cmap(directive d, t_params bondtype[], t_params bond[],
2139 t_atoms *at, gpp_atomtype_t atype, char *line,
2142 const char *aaformat[MAXATOMLIST+1] =
2153 int i, j, ftype, nral, nread, ncmap_params;
2155 int aa[MAXATOMLIST+1];
2156 char errbuf[STRLEN];
2160 ftype = ifunc_index(d, 1);
2164 nread = sscanf(line, aaformat[nral-1],
2165 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
2172 else if (nread == nral)
2174 ftype = ifunc_index(d, 1);
2177 /* Check for double atoms and atoms out of bounds */
2178 for (i = 0; i < nral; i++)
2180 if (aa[i] < 1 || aa[i] > at->nr)
2182 sprintf(errbuf, "Atom index (%d) in %s out of bounds (1-%d).\n"
2183 "This probably means that you have inserted topology section \"%s\"\n"
2184 "in a part belonging to a different molecule than you intended to.\n"
2185 "In that case move the \"%s\" section to the right molecule.",
2186 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
2187 warning_error_and_exit(wi, errbuf, FARGS);
2190 for (j = i+1; (j < nral); j++)
2194 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
2195 warning_error(wi, errbuf);
2200 /* default force parameters */
2201 for (j = 0; (j < MAXATOMLIST); j++)
2203 param.a[j] = aa[j]-1;
2205 for (j = 0; (j < MAXFORCEPARAM); j++)
2210 /* Get the cmap type for this cmap angle */
2211 bFound = default_cmap_params(bondtype, at, atype, ¶m, FALSE, &cmap_type, &ncmap_params, wi);
2213 /* We want exactly one parameter (the cmap type in state A (currently no state B) back */
2214 if (bFound && ncmap_params == 1)
2216 /* Put the values in the appropriate arrays */
2217 param.c[0] = cmap_type;
2218 add_param_to_list(&bond[ftype], ¶m);
2222 /* This is essentially the same check as in default_cmap_params() done one more time */
2223 sprintf(errbuf, "Unable to assign a cmap type to torsion %d %d %d %d and %d\n",
2224 param.a[0]+1, param.a[1]+1, param.a[2]+1, param.a[3]+1, param.a[4]+1);
2225 warning_error_and_exit(wi, errbuf, FARGS);
2231 void push_vsitesn(directive d, t_params bond[],
2232 t_atoms *at, char *line,
2236 int type, ftype, j, n, ret, nj, a;
2238 double *weight = nullptr, weight_tot;
2240 char errbuf[STRLEN];
2242 /* default force parameters */
2243 for (j = 0; (j < MAXATOMLIST); j++)
2245 param.a[j] = NOTSET;
2247 for (j = 0; (j < MAXFORCEPARAM); j++)
2253 ret = sscanf(ptr, "%d%n", &a, &n);
2257 sprintf(errbuf, "Expected an atom index in section \"%s\"",
2259 warning_error_and_exit(wi, errbuf, FARGS);
2264 sscanf(ptr, "%d%n", &type, &n);
2266 ftype = ifunc_index(d, type);
2272 ret = sscanf(ptr, "%d%n", &a, &n);
2279 srenew(weight, nj+20);
2288 /* Here we use the A-state mass as a parameter.
2289 * Note that the B-state mass has no influence.
2291 weight[nj] = at->atom[atc[nj]].m;
2295 ret = sscanf(ptr, "%lf%n", &(weight[nj]), &n);
2299 sprintf(errbuf, "No weight or negative weight found for vsiten constructing atom %d (atom index %d)",
2301 warning_error_and_exit(wi, errbuf, FARGS);
2305 sprintf(errbuf, "Unknown vsiten type %d", type);
2306 warning_error_and_exit(wi, errbuf, FARGS);
2308 weight_tot += weight[nj];
2316 sprintf(errbuf, "Expected more than one atom index in section \"%s\"",
2318 warning_error_and_exit(wi, errbuf, FARGS);
2321 if (weight_tot == 0)
2323 warning_error_and_exit(wi, "The total mass of the construting atoms is zero", FARGS);
2326 for (j = 0; j < nj; j++)
2328 param.a[1] = atc[j];
2330 param.c[1] = weight[j]/weight_tot;
2331 /* Put the values in the appropriate arrays */
2332 add_param_to_list (&bond[ftype], ¶m);
2339 void push_mol(int nrmols, t_molinfo mols[], char *pline, int *whichmol,
2344 char errbuf[STRLEN];
2346 if (sscanf(pline, "%s%d", type, nrcopies) != 2)
2352 /* Search moleculename.
2353 * Here we originally only did case insensitive matching. But because
2354 * some PDB files can have many chains and use case to generate more
2355 * chain-identifiers, which in turn end up in our moleculetype name,
2356 * we added support for case-sensitivity.
2362 for (int i = 0; i < nrmols; i++)
2364 if (strcmp(type, *(mols[i].name)) == 0)
2369 if (gmx_strcasecmp(type, *(mols[i].name)) == 0)
2378 // select the case sensitive match
2379 *whichmol = matchcs;
2383 // avoid matching case-insensitive when we have multiple matches
2386 sprintf(errbuf, "For moleculetype '%s' in [ system ] %d case insensitive matches, but %d case sensitive matches were found. Check the case of the characters in the moleculetypes.", type, nrci, nrcs);
2387 warning_error_and_exit(wi, errbuf, FARGS);
2391 // select the unique case insensitive match
2392 *whichmol = matchci;
2396 sprintf(errbuf, "No such moleculetype %s", type);
2397 warning_error_and_exit(wi, errbuf, FARGS);
2402 void init_block2(t_block2 *b2, int natom)
2407 snew(b2->nra, b2->nr);
2408 snew(b2->a, b2->nr);
2409 for (i = 0; (i < b2->nr); i++)
2415 void done_block2(t_block2 *b2)
2421 for (i = 0; (i < b2->nr); i++)
2431 void push_excl(char *line, t_block2 *b2, warninp_t wi)
2435 char base[STRLEN], format[STRLEN];
2436 char errbuf[STRLEN];
2438 if (sscanf(line, "%d", &i) == 0)
2443 if ((1 <= i) && (i <= b2->nr))
2451 fprintf(debug, "Unbound atom %d\n", i-1);
2455 strcpy(base, "%*d");
2458 strcpy(format, base);
2459 strcat(format, "%d");
2460 n = sscanf(line, format, &j);
2463 if ((1 <= j) && (j <= b2->nr))
2466 srenew(b2->a[i], ++(b2->nra[i]));
2467 b2->a[i][b2->nra[i]-1] = j;
2468 /* also add the reverse exclusion! */
2469 srenew(b2->a[j], ++(b2->nra[j]));
2470 b2->a[j][b2->nra[j]-1] = i;
2471 strcat(base, "%*d");
2475 sprintf(errbuf, "Invalid Atomnr j: %d, b2->nr: %d\n", j, b2->nr);
2476 warning_error_and_exit(wi, errbuf, FARGS);
2483 void b_to_b2(t_blocka *b, t_block2 *b2)
2488 for (i = 0; (i < b->nr); i++)
2490 for (j = b->index[i]; (j < b->index[i+1]); j++)
2493 srenew(b2->a[i], ++b2->nra[i]);
2494 b2->a[i][b2->nra[i]-1] = a;
2499 void b2_to_b(t_block2 *b2, t_blocka *b)
2505 for (i = 0; (i < b2->nr); i++)
2508 for (j = 0; (j < b2->nra[i]); j++)
2510 b->a[nra+j] = b2->a[i][j];
2514 /* terminate list */
2518 static int icomp(const void *v1, const void *v2)
2520 return (*((int *) v1))-(*((int *) v2));
2523 void merge_excl(t_blocka *excl, t_block2 *b2, warninp_t wi)
2528 char errbuf[STRLEN];
2534 else if (b2->nr != excl->nr)
2536 sprintf(errbuf, "DEATH HORROR: b2->nr = %d, while excl->nr = %d",
2538 warning_error_and_exit(wi, errbuf, FARGS);
2542 fprintf(debug, "Entering merge_excl\n");
2545 /* First copy all entries from excl to b2 */
2548 /* Count and sort the exclusions */
2550 for (i = 0; (i < b2->nr); i++)
2554 /* remove double entries */
2555 qsort(b2->a[i], (size_t)b2->nra[i], (size_t)sizeof(b2->a[i][0]), icomp);
2557 for (j = 1; (j < b2->nra[i]); j++)
2559 if (b2->a[i][j] != b2->a[i][k-1])
2561 b2->a[i][k] = b2->a[i][j];
2570 srenew(excl->a, excl->nra);
2575 int add_atomtype_decoupled(t_symtab *symtab, gpp_atomtype_t at,
2576 t_nbparam ***nbparam, t_nbparam ***pair)
2582 /* Define an atom type with all parameters set to zero (no interactions) */
2585 /* Type for decoupled atoms could be anything,
2586 * this should be changed automatically later when required.
2588 atom.ptype = eptAtom;
2589 for (i = 0; (i < MAXFORCEPARAM); i++)
2594 nr = add_atomtype(at, symtab, &atom, "decoupled", ¶m, -1, 0);
2596 /* Add space in the non-bonded parameters matrix */
2597 realloc_nb_params(at, nbparam, pair);
2602 static void convert_pairs_to_pairsQ(t_params *plist,
2603 real fudgeQQ, t_atoms *atoms)
2605 t_param *paramp1, *paramp2, *paramnew;
2606 int i, j, p1nr, p2nr, p2newnr;
2608 /* Add the pair list to the pairQ list */
2609 p1nr = plist[F_LJ14].nr;
2610 p2nr = plist[F_LJC14_Q].nr;
2611 p2newnr = p1nr + p2nr;
2612 snew(paramnew, p2newnr);
2614 paramp1 = plist[F_LJ14].param;
2615 paramp2 = plist[F_LJC14_Q].param;
2617 /* Fill in the new F_LJC14_Q array with the old one. NOTE:
2618 it may be possible to just ADD the converted F_LJ14 array
2619 to the old F_LJC14_Q array, but since we have to create
2620 a new sized memory structure, better just to deep copy it all.
2623 for (i = 0; i < p2nr; i++)
2625 /* Copy over parameters */
2626 for (j = 0; j < 5; j++) /* entries are 0-4 for F_LJC14_Q */
2628 paramnew[i].c[j] = paramp2[i].c[j];
2631 /* copy over atoms */
2632 for (j = 0; j < 2; j++)
2634 paramnew[i].a[j] = paramp2[i].a[j];
2638 for (i = p2nr; i < p2newnr; i++)
2642 /* Copy over parameters */
2643 paramnew[i].c[0] = fudgeQQ;
2644 paramnew[i].c[1] = atoms->atom[paramp1[j].a[0]].q;
2645 paramnew[i].c[2] = atoms->atom[paramp1[j].a[1]].q;
2646 paramnew[i].c[3] = paramp1[j].c[0];
2647 paramnew[i].c[4] = paramp1[j].c[1];
2649 /* copy over atoms */
2650 paramnew[i].a[0] = paramp1[j].a[0];
2651 paramnew[i].a[1] = paramp1[j].a[1];
2654 /* free the old pairlists */
2655 sfree(plist[F_LJC14_Q].param);
2656 sfree(plist[F_LJ14].param);
2658 /* now assign the new data to the F_LJC14_Q structure */
2659 plist[F_LJC14_Q].param = paramnew;
2660 plist[F_LJC14_Q].nr = p2newnr;
2662 /* Empty the LJ14 pairlist */
2663 plist[F_LJ14].nr = 0;
2664 plist[F_LJ14].param = nullptr;
2667 static void generate_LJCpairsNB(t_molinfo *mol, int nb_funct, t_params *nbp, warninp_t wi)
2669 int n, ntype, i, j, k;
2674 char errbuf[STRLEN];
2677 atom = mol->atoms.atom;
2679 ntype = static_cast<int>(std::sqrt(static_cast<double>(nbp->nr)));
2680 GMX_ASSERT(ntype * ntype == nbp->nr, "Number of pairs of generated non-bonded parameters should be a perfect square");
2682 for (i = 0; i < MAXATOMLIST; i++)
2684 param.a[i] = NOTSET;
2686 for (i = 0; i < MAXFORCEPARAM; i++)
2688 param.c[i] = NOTSET;
2691 /* Add a pair interaction for all non-excluded atom pairs */
2693 for (i = 0; i < n; i++)
2695 for (j = i+1; j < n; j++)
2698 for (k = excl->index[i]; k < excl->index[i+1]; k++)
2700 if (excl->a[k] == j)
2707 if (nb_funct != F_LJ)
2709 sprintf(errbuf, "Can only generate non-bonded pair interactions for Van der Waals type Lennard-Jones");
2710 warning_error_and_exit(wi, errbuf, FARGS);
2714 param.c[0] = atom[i].q;
2715 param.c[1] = atom[j].q;
2716 param.c[2] = nbp->param[ntype*atom[i].type+atom[j].type].c[0];
2717 param.c[3] = nbp->param[ntype*atom[i].type+atom[j].type].c[1];
2718 add_param_to_list(&mol->plist[F_LJC_PAIRS_NB], ¶m);
2724 static void set_excl_all(t_blocka *excl)
2728 /* Get rid of the current exclusions and exclude all atom pairs */
2730 excl->nra = nat*nat;
2731 srenew(excl->a, excl->nra);
2733 for (i = 0; i < nat; i++)
2736 for (j = 0; j < nat; j++)
2741 excl->index[nat] = k;
2744 static void decouple_atoms(t_atoms *atoms, int atomtype_decouple,
2745 int couple_lam0, int couple_lam1,
2746 const char *mol_name, warninp_t wi)
2749 char errbuf[STRLEN];
2751 for (i = 0; i < atoms->nr; i++)
2755 atom = &atoms->atom[i];
2757 if (atom->qB != atom->q || atom->typeB != atom->type)
2759 sprintf(errbuf, "Atom %d in molecule type '%s' has different A and B state charges and/or atom types set in the topology file as well as through the mdp option '%s'. You can not use both these methods simultaneously.",
2760 i + 1, mol_name, "couple-moltype");
2761 warning_error_and_exit(wi, errbuf, FARGS);
2764 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamVDW)
2768 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamQ)
2770 atom->type = atomtype_decouple;
2772 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamVDW)
2776 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamQ)
2778 atom->typeB = atomtype_decouple;
2783 void convert_moltype_couple(t_molinfo *mol, int atomtype_decouple, real fudgeQQ,
2784 int couple_lam0, int couple_lam1,
2785 gmx_bool bCoupleIntra, int nb_funct, t_params *nbp,
2788 convert_pairs_to_pairsQ(mol->plist, fudgeQQ, &mol->atoms);
2791 generate_LJCpairsNB(mol, nb_funct, nbp, wi);
2792 set_excl_all(&mol->excls);
2794 decouple_atoms(&mol->atoms, atomtype_decouple, couple_lam0, couple_lam1,