2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
48 #include "gromacs/gmxpreprocess/gpp_atomtype.h"
49 #include "gromacs/gmxpreprocess/gpp_bond_atomtype.h"
50 #include "gromacs/gmxpreprocess/readir.h"
51 #include "gromacs/gmxpreprocess/topdirs.h"
52 #include "gromacs/gmxpreprocess/toputil.h"
53 #include "gromacs/legacyheaders/macros.h"
54 #include "gromacs/legacyheaders/names.h"
55 #include "gromacs/legacyheaders/warninp.h"
56 #include "gromacs/topology/symtab.h"
57 #include "gromacs/utility/cstringutil.h"
58 #include "gromacs/utility/fatalerror.h"
59 #include "gromacs/utility/gmxassert.h"
60 #include "gromacs/utility/smalloc.h"
62 void generate_nbparams(int comb, int ftype, t_params *plist, gpp_atomtype_t atype,
67 real c, bi, bj, ci, cj, ci0, ci1, ci2, cj0, cj1, cj2;
70 /* Lean mean shortcuts */
71 nr = get_atomtype_ntypes(atype);
73 snew(plist->param, nr*nr);
76 /* Fill the matrix with force parameters */
84 for (i = k = 0; (i < nr); i++)
86 for (j = 0; (j < nr); j++, k++)
88 for (nf = 0; (nf < nrfp); nf++)
90 ci = get_atomtype_nbparam(i, nf, atype);
91 cj = get_atomtype_nbparam(j, nf, atype);
92 c = std::sqrt(ci * cj);
93 plist->param[k].c[nf] = c;
99 case eCOMB_ARITHMETIC:
100 /* c0 and c1 are sigma and epsilon */
101 for (i = k = 0; (i < nr); i++)
103 for (j = 0; (j < nr); j++, k++)
105 ci0 = get_atomtype_nbparam(i, 0, atype);
106 cj0 = get_atomtype_nbparam(j, 0, atype);
107 ci1 = get_atomtype_nbparam(i, 1, atype);
108 cj1 = get_atomtype_nbparam(j, 1, atype);
109 plist->param[k].c[0] = (fabs(ci0) + fabs(cj0))*0.5;
110 /* Negative sigma signals that c6 should be set to zero later,
111 * so we need to propagate that through the combination rules.
113 if (ci0 < 0 || cj0 < 0)
115 plist->param[k].c[0] *= -1;
117 plist->param[k].c[1] = std::sqrt(ci1*cj1);
122 case eCOMB_GEOM_SIG_EPS:
123 /* c0 and c1 are sigma and epsilon */
124 for (i = k = 0; (i < nr); i++)
126 for (j = 0; (j < nr); j++, k++)
128 ci0 = get_atomtype_nbparam(i, 0, atype);
129 cj0 = get_atomtype_nbparam(j, 0, atype);
130 ci1 = get_atomtype_nbparam(i, 1, atype);
131 cj1 = get_atomtype_nbparam(j, 1, atype);
132 plist->param[k].c[0] = std::sqrt(fabs(ci0*cj0));
133 /* Negative sigma signals that c6 should be set to zero later,
134 * so we need to propagate that through the combination rules.
136 if (ci0 < 0 || cj0 < 0)
138 plist->param[k].c[0] *= -1;
140 plist->param[k].c[1] = std::sqrt(ci1*cj1);
146 gmx_fatal(FARGS, "No such combination rule %d", comb);
150 gmx_incons("Topology processing, generate nb parameters");
155 /* Buckingham rules */
156 for (i = k = 0; (i < nr); i++)
158 for (j = 0; (j < nr); j++, k++)
160 ci0 = get_atomtype_nbparam(i, 0, atype);
161 cj0 = get_atomtype_nbparam(j, 0, atype);
162 ci2 = get_atomtype_nbparam(i, 2, atype);
163 cj2 = get_atomtype_nbparam(j, 2, atype);
164 bi = get_atomtype_nbparam(i, 1, atype);
165 bj = get_atomtype_nbparam(j, 1, atype);
166 plist->param[k].c[0] = std::sqrt(ci0 * cj0);
167 if ((bi == 0) || (bj == 0))
169 plist->param[k].c[1] = 0;
173 plist->param[k].c[1] = 2.0/(1/bi+1/bj);
175 plist->param[k].c[2] = std::sqrt(ci2 * cj2);
181 sprintf(errbuf, "Invalid nonbonded type %s",
182 interaction_function[ftype].longname);
183 warning_error(wi, errbuf);
187 static void realloc_nb_params(gpp_atomtype_t at,
188 t_nbparam ***nbparam, t_nbparam ***pair)
190 /* Add space in the non-bonded parameters matrix */
191 int atnr = get_atomtype_ntypes(at);
192 srenew(*nbparam, atnr);
193 snew((*nbparam)[atnr-1], atnr);
197 snew((*pair)[atnr-1], atnr);
201 static void copy_B_from_A(int ftype, double *c)
205 nrfpA = NRFPA(ftype);
206 nrfpB = NRFPB(ftype);
208 /* Copy the B parameters from the first nrfpB A parameters */
209 for (i = 0; (i < nrfpB); i++)
215 void push_at (t_symtab *symtab, gpp_atomtype_t at, t_bond_atomtype bat,
216 char *line, int nb_funct,
217 t_nbparam ***nbparam, t_nbparam ***pair,
224 t_xlate xl[eptNR] = {
232 int nr, i, nfields, j, pt, nfp0 = -1;
233 int batype_nr, nread;
234 char type[STRLEN], btype[STRLEN], ptype[STRLEN];
236 double c[MAXFORCEPARAM];
237 double radius, vol, surftens, gb_radius, S_hct;
238 char tmpfield[12][100]; /* Max 12 fields of width 100 */
243 gmx_bool have_atomic_number;
244 gmx_bool have_bonded_type;
249 /* First assign input line to temporary array */
250 nfields = sscanf(line, "%s%s%s%s%s%s%s%s%s%s%s%s",
251 tmpfield[0], tmpfield[1], tmpfield[2], tmpfield[3], tmpfield[4], tmpfield[5],
252 tmpfield[6], tmpfield[7], tmpfield[8], tmpfield[9], tmpfield[10], tmpfield[11]);
254 /* Comments on optional fields in the atomtypes section:
256 * The force field format is getting a bit old. For OPLS-AA we needed
257 * to add a special bonded atomtype, and for Gerrit Groenhofs QM/MM stuff
258 * we also needed the atomic numbers.
259 * To avoid making all old or user-generated force fields unusable we
260 * have introduced both these quantities as optional columns, and do some
261 * acrobatics to check whether they are present or not.
262 * This will all look much nicer when we switch to XML... sigh.
264 * Field 0 (mandatory) is the nonbonded type name. (string)
265 * Field 1 (optional) is the bonded type (string)
266 * Field 2 (optional) is the atomic number (int)
267 * Field 3 (mandatory) is the mass (numerical)
268 * Field 4 (mandatory) is the charge (numerical)
269 * Field 5 (mandatory) is the particle type (single character)
270 * This is followed by a number of nonbonded parameters.
272 * The safest way to identify the format is the particle type field.
274 * So, here is what we do:
276 * A. Read in the first six fields as strings
277 * B. If field 3 (starting from 0) is a single char, we have neither
278 * bonded_type or atomic numbers.
279 * C. If field 5 is a single char we have both.
280 * D. If field 4 is a single char we check field 1. If this begins with
281 * an alphabetical character we have bonded types, otherwise atomic numbers.
290 if ( (strlen(tmpfield[5]) == 1) && isalpha(tmpfield[5][0]) )
292 have_bonded_type = TRUE;
293 have_atomic_number = TRUE;
295 else if ( (strlen(tmpfield[3]) == 1) && isalpha(tmpfield[3][0]) )
297 have_bonded_type = FALSE;
298 have_atomic_number = FALSE;
302 have_bonded_type = ( isalpha(tmpfield[1][0]) != 0 );
303 have_atomic_number = !have_bonded_type;
306 /* optional fields */
320 if (have_atomic_number)
322 if (have_bonded_type)
324 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf",
325 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1],
326 &radius, &vol, &surftens, &gb_radius);
335 /* have_atomic_number && !have_bonded_type */
336 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf",
337 type, &atomnr, &m, &q, ptype, &c[0], &c[1],
338 &radius, &vol, &surftens, &gb_radius);
348 if (have_bonded_type)
350 /* !have_atomic_number && have_bonded_type */
351 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf%lf%lf%lf%lf",
352 type, btype, &m, &q, ptype, &c[0], &c[1],
353 &radius, &vol, &surftens, &gb_radius);
362 /* !have_atomic_number && !have_bonded_type */
363 nread = sscanf(line, "%s%lf%lf%s%lf%lf%lf%lf%lf%lf",
364 type, &m, &q, ptype, &c[0], &c[1],
365 &radius, &vol, &surftens, &gb_radius);
374 if (!have_bonded_type)
379 if (!have_atomic_number)
389 if (have_atomic_number)
391 if (have_bonded_type)
393 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
394 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2],
395 &radius, &vol, &surftens, &gb_radius);
404 /* have_atomic_number && !have_bonded_type */
405 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
406 type, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2],
407 &radius, &vol, &surftens, &gb_radius);
417 if (have_bonded_type)
419 /* !have_atomic_number && have_bonded_type */
420 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
421 type, btype, &m, &q, ptype, &c[0], &c[1], &c[2],
422 &radius, &vol, &surftens, &gb_radius);
431 /* !have_atomic_number && !have_bonded_type */
432 nread = sscanf(line, "%s%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
433 type, &m, &q, ptype, &c[0], &c[1], &c[2],
434 &radius, &vol, &surftens, &gb_radius);
443 if (!have_bonded_type)
448 if (!have_atomic_number)
456 gmx_fatal(FARGS, "Invalid function type %d in push_at %s %d", nb_funct,
459 for (j = nfp0; (j < MAXFORCEPARAM); j++)
464 if (strlen(type) == 1 && isdigit(type[0]))
466 gmx_fatal(FARGS, "Atom type names can't be single digits.");
469 if (strlen(btype) == 1 && isdigit(btype[0]))
471 gmx_fatal(FARGS, "Bond atom type names can't be single digits.");
474 /* Hack to read old topologies */
475 if (gmx_strcasecmp(ptype, "D") == 0)
479 for (j = 0; (j < eptNR); j++)
481 if (gmx_strcasecmp(ptype, xl[j].entry) == 0)
488 gmx_fatal(FARGS, "Invalid particle type %s on line %s",
491 /* cppcheck-suppress arrayIndexOutOfBounds #6329 */
495 fprintf(debug, "ptype: %s\n", ptype_str[pt]);
501 for (i = 0; (i < MAXFORCEPARAM); i++)
506 if ((batype_nr = get_bond_atomtype_type(btype, bat)) == NOTSET)
508 add_bond_atomtype(bat, symtab, btype);
510 batype_nr = get_bond_atomtype_type(btype, bat);
512 if ((nr = get_atomtype_type(type, at)) != NOTSET)
514 sprintf(errbuf, "Overriding atomtype %s", type);
516 if ((nr = set_atomtype(nr, at, symtab, atom, type, param, batype_nr,
517 radius, vol, surftens, atomnr, gb_radius, S_hct)) == NOTSET)
519 gmx_fatal(FARGS, "Replacing atomtype %s failed", type);
522 else if ((add_atomtype(at, symtab, atom, type, param,
523 batype_nr, radius, vol,
524 surftens, atomnr, gb_radius, S_hct)) == NOTSET)
526 gmx_fatal(FARGS, "Adding atomtype %s failed", type);
530 /* Add space in the non-bonded parameters matrix */
531 realloc_nb_params(at, nbparam, pair);
537 static void push_bondtype(t_params * bt,
541 gmx_bool bAllowRepeat,
546 gmx_bool bTest, bFound, bCont, bId;
548 int nrfp = NRFP(ftype);
551 /* If bAllowRepeat is TRUE, we allow multiple entries as long as they
552 are on directly _adjacent_ lines.
555 /* First check if our atomtypes are _identical_ (not reversed) to the previous
556 entry. If they are not identical we search for earlier duplicates. If they are
557 we can skip it, since we already searched for the first line
564 if (bAllowRepeat && nr > 1)
566 for (j = 0, bCont = TRUE; (j < nral); j++)
568 bCont = bCont && (b->a[j] == bt->param[nr-2].a[j]);
572 /* Search for earlier duplicates if this entry was not a continuation
573 from the previous line.
578 for (i = 0; (i < nr); i++)
581 for (j = 0; (j < nral); j++)
583 bTest = (bTest && (b->a[j] == bt->param[i].a[j]));
588 for (j = 0; (j < nral); j++)
590 bTest = (bTest && (b->a[nral-1-j] == bt->param[i].a[j]));
598 for (j = 0; (j < nrfp); j++)
600 bId = bId && (bt->param[i].c[j] == b->c[j]);
604 sprintf(errbuf, "Overriding %s parameters.%s",
605 interaction_function[ftype].longname,
607 "\nUse dihedraltype 9 to allow several multiplicity terms. Only consecutive lines are combined. Non-consective lines overwrite each other."
610 fprintf(stderr, " old: ");
611 for (j = 0; (j < nrfp); j++)
613 fprintf(stderr, " %g", bt->param[i].c[j]);
615 fprintf(stderr, " \n new: %s\n\n", line);
619 for (j = 0; (j < nrfp); j++)
621 bt->param[i].c[j] = b->c[j];
632 /* fill the arrays up and down */
633 memcpy(bt->param[bt->nr].c, b->c, sizeof(b->c));
634 memcpy(bt->param[bt->nr].a, b->a, sizeof(b->a));
635 memcpy(bt->param[bt->nr+1].c, b->c, sizeof(b->c));
637 /* The definitions of linear angles depend on the order of atoms,
638 * that means that for atoms i-j-k, with certain parameter a, the
639 * corresponding k-j-i angle will have parameter 1-a.
641 if (ftype == F_LINEAR_ANGLES)
643 bt->param[bt->nr+1].c[0] = 1-bt->param[bt->nr+1].c[0];
644 bt->param[bt->nr+1].c[2] = 1-bt->param[bt->nr+1].c[2];
647 for (j = 0; (j < nral); j++)
649 bt->param[bt->nr+1].a[j] = b->a[nral-1-j];
656 void push_bt(directive d, t_params bt[], int nral,
658 t_bond_atomtype bat, char *line,
661 const char *formal[MAXATOMLIST+1] = {
670 const char *formnl[MAXATOMLIST+1] = {
676 "%*s%*s%*s%*s%*s%*s",
677 "%*s%*s%*s%*s%*s%*s%*s"
679 const char *formlf = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
680 int i, ft, ftype, nn, nrfp, nrfpA;
682 char alc[MAXATOMLIST+1][20];
683 /* One force parameter more, so we can check if we read too many */
684 double c[MAXFORCEPARAM+1];
688 if ((bat && at) || (!bat && !at))
690 gmx_incons("You should pass either bat or at to push_bt");
693 /* Make format string (nral ints+functype) */
694 if ((nn = sscanf(line, formal[nral],
695 alc[0], alc[1], alc[2], alc[3], alc[4], alc[5])) != nral+1)
697 sprintf(errbuf, "Not enough atomtypes (%d instead of %d)", nn-1, nral);
698 warning_error(wi, errbuf);
702 ft = strtol(alc[nral], NULL, 10);
703 ftype = ifunc_index(d, ft);
705 nrfpA = interaction_function[ftype].nrfpA;
706 strcpy(f1, formnl[nral]);
708 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]))
713 /* Copy the B-state from the A-state */
714 copy_B_from_A(ftype, c);
720 warning_error(wi, "Not enough parameters");
722 else if (nn > nrfpA && nn < nrfp)
724 warning_error(wi, "Too many parameters or not enough parameters for topology B");
728 warning_error(wi, "Too many parameters");
730 for (i = nn; (i < nrfp); i++)
736 for (i = 0; (i < nral); i++)
738 if (at && ((p.a[i] = get_atomtype_type(alc[i], at)) == NOTSET))
740 gmx_fatal(FARGS, "Unknown atomtype %s\n", alc[i]);
742 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
744 gmx_fatal(FARGS, "Unknown bond_atomtype %s\n", alc[i]);
747 for (i = 0; (i < nrfp); i++)
751 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
755 void push_dihedraltype(directive d, t_params bt[],
756 t_bond_atomtype bat, char *line,
759 const char *formal[MAXATOMLIST+1] = {
768 const char *formnl[MAXATOMLIST+1] = {
774 "%*s%*s%*s%*s%*s%*s",
775 "%*s%*s%*s%*s%*s%*s%*s"
777 const char *formlf[MAXFORCEPARAM] = {
783 "%lf%lf%lf%lf%lf%lf",
784 "%lf%lf%lf%lf%lf%lf%lf",
785 "%lf%lf%lf%lf%lf%lf%lf%lf",
786 "%lf%lf%lf%lf%lf%lf%lf%lf%lf",
787 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
788 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
789 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
791 int i, ft, ftype, nn, nrfp, nrfpA, nral;
793 char alc[MAXATOMLIST+1][20];
794 double c[MAXFORCEPARAM];
796 gmx_bool bAllowRepeat;
799 /* This routine accepts dihedraltypes defined from either 2 or 4 atoms.
801 * We first check for 2 atoms with the 3th column being an integer
802 * defining the type. If this isn't the case, we try it with 4 atoms
803 * and the 5th column defining the dihedral type.
805 nn = sscanf(line, formal[4], alc[0], alc[1], alc[2], alc[3], alc[4]);
806 if (nn >= 3 && strlen(alc[2]) == 1 && isdigit(alc[2][0]))
809 ft = strtol(alc[nral], NULL, 10);
810 /* Move atom types around a bit and use 'X' for wildcard atoms
811 * to create a 4-atom dihedral definition with arbitrary atoms in
814 if (alc[2][0] == '2')
816 /* improper - the two atomtypes are 1,4. Use wildcards for 2,3 */
817 strcpy(alc[3], alc[1]);
818 sprintf(alc[2], "X");
819 sprintf(alc[1], "X");
820 /* alc[0] stays put */
824 /* proper - the two atomtypes are 2,3. Use wildcards for 1,4 */
825 sprintf(alc[3], "X");
826 strcpy(alc[2], alc[1]);
827 strcpy(alc[1], alc[0]);
828 sprintf(alc[0], "X");
831 else if (nn == 5 && strlen(alc[4]) == 1 && isdigit(alc[4][0]))
834 ft = strtol(alc[nral], NULL, 10);
838 sprintf(errbuf, "Incorrect number of atomtypes for dihedral (%d instead of 2 or 4)", nn-1);
839 warning_error(wi, errbuf);
845 /* Previously, we have always overwritten parameters if e.g. a torsion
846 with the same atomtypes occurs on multiple lines. However, CHARMM and
847 some other force fields specify multiple dihedrals over some bonds,
848 including cosines with multiplicity 6 and somethimes even higher.
849 Thus, they cannot be represented with Ryckaert-Bellemans terms.
850 To add support for these force fields, Dihedral type 9 is identical to
851 normal proper dihedrals, but repeated entries are allowed.
858 bAllowRepeat = FALSE;
862 ftype = ifunc_index(d, ft);
864 nrfpA = interaction_function[ftype].nrfpA;
866 strcpy(f1, formnl[nral]);
867 strcat(f1, formlf[nrfp-1]);
869 /* Check number of parameters given */
870 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]))
875 /* Copy the B-state from the A-state */
876 copy_B_from_A(ftype, c);
882 warning_error(wi, "Not enough parameters");
884 else if (nn > nrfpA && nn < nrfp)
886 warning_error(wi, "Too many parameters or not enough parameters for topology B");
890 warning_error(wi, "Too many parameters");
892 for (i = nn; (i < nrfp); i++)
899 for (i = 0; (i < 4); i++)
901 if (!strcmp(alc[i], "X"))
907 if ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET)
909 gmx_fatal(FARGS, "Unknown bond_atomtype %s", alc[i]);
913 for (i = 0; (i < nrfp); i++)
917 /* Always use 4 atoms here, since we created two wildcard atoms
918 * if there wasn't of them 4 already.
920 push_bondtype (&(bt[ftype]), &p, 4, ftype, bAllowRepeat, line, wi);
924 void push_nbt(directive d, t_nbparam **nbt, gpp_atomtype_t atype,
925 char *pline, int nb_funct,
929 const char *form3 = "%*s%*s%*s%lf%lf%lf";
930 const char *form4 = "%*s%*s%*s%lf%lf%lf%lf";
931 const char *form5 = "%*s%*s%*s%lf%lf%lf%lf%lf";
933 int i, f, n, ftype, nrfp;
941 if (sscanf (pline, "%s%s%d", a0, a1, &f) != 3)
947 ftype = ifunc_index(d, f);
949 if (ftype != nb_funct)
951 sprintf(errbuf, "Trying to add %s while the default nonbond type is %s",
952 interaction_function[ftype].longname,
953 interaction_function[nb_funct].longname);
954 warning_error(wi, errbuf);
958 /* Get the force parameters */
962 n = sscanf(pline, form4, &c[0], &c[1], &c[2], &c[3]);
968 /* When the B topology parameters are not set,
969 * copy them from topology A
971 GMX_ASSERT(nrfp <= 4, "LJ-14 cannot have more than 4 parameters");
972 for (i = n; i < nrfp; i++)
977 else if (ftype == F_LJC14_Q)
979 n = sscanf(pline, form5, &c[0], &c[1], &c[2], &c[3], &dum);
982 incorrect_n_param(wi);
988 if (sscanf(pline, form3, &c[0], &c[1], &dum) != 2)
990 incorrect_n_param(wi);
996 if (sscanf(pline, form4, &c[0], &c[1], &c[2], &dum) != 3)
998 incorrect_n_param(wi);
1004 gmx_fatal(FARGS, "Number of force parameters for nonbonded interactions is %d"
1005 " in file %s, line %d", nrfp, __FILE__, __LINE__);
1007 for (i = 0; (i < nrfp); i++)
1012 /* Put the parameters in the matrix */
1013 if ((ai = get_atomtype_type (a0, atype)) == NOTSET)
1015 gmx_fatal(FARGS, "Atomtype %s not found", a0);
1017 if ((aj = get_atomtype_type (a1, atype)) == NOTSET)
1019 gmx_fatal(FARGS, "Atomtype %s not found", a1);
1021 nbp = &(nbt[std::max(ai, aj)][std::min(ai, aj)]);
1026 for (i = 0; i < nrfp; i++)
1028 bId = bId && (nbp->c[i] == cr[i]);
1032 sprintf(errbuf, "Overriding non-bonded parameters,");
1033 warning(wi, errbuf);
1034 fprintf(stderr, " old:");
1035 for (i = 0; i < nrfp; i++)
1037 fprintf(stderr, " %g", nbp->c[i]);
1039 fprintf(stderr, " new\n%s\n", pline);
1043 for (i = 0; i < nrfp; i++)
1050 push_gb_params (gpp_atomtype_t at, char *line,
1054 double radius, vol, surftens, gb_radius, S_hct;
1055 char atypename[STRLEN];
1056 char errbuf[STRLEN];
1058 if ( (sscanf(line, "%s%lf%lf%lf%lf%lf", atypename, &radius, &vol, &surftens, &gb_radius, &S_hct)) != 6)
1060 sprintf(errbuf, "Too few gb parameters for type %s\n", atypename);
1061 warning(wi, errbuf);
1064 /* Search for atomtype */
1065 atype = get_atomtype_type(atypename, at);
1067 if (atype == NOTSET)
1069 printf("Couldn't find topology match for atomtype %s\n", atypename);
1073 set_atomtype_gbparam(at, atype, radius, vol, surftens, gb_radius, S_hct);
1077 push_cmaptype(directive d, t_params bt[], int nral, gpp_atomtype_t at,
1078 t_bond_atomtype bat, char *line,
1081 const char *formal = "%s%s%s%s%s%s%s%s";
1083 int i, ft, ftype, nn, nrfp, nrfpA, nrfpB;
1085 int nxcmap, nycmap, ncmap, read_cmap, sl, nct;
1086 char s[20], alc[MAXATOMLIST+2][20];
1090 /* Keep the compiler happy */
1094 if ((nn = sscanf(line, formal, alc[0], alc[1], alc[2], alc[3], alc[4], alc[5], alc[6], alc[7])) != nral+3)
1096 sprintf(errbuf, "Incorrect number of atomtypes for cmap (%d instead of 5)", nn-1);
1097 warning_error(wi, errbuf);
1101 /* Compute an offset for each line where the cmap parameters start
1102 * ie. where the atom types and grid spacing information ends
1104 for (i = 0; i < nn; i++)
1106 start += (int)strlen(alc[i]);
1109 /* There are nn-1 spaces between the atom types and the grid spacing info in the cmap.itp file */
1110 /* start is the position on the line where we start to read the actual cmap grid data from the itp file */
1111 start = start + nn -1;
1113 ft = strtol(alc[nral], NULL, 10);
1114 nxcmap = strtol(alc[nral+1], NULL, 10);
1115 nycmap = strtol(alc[nral+2], NULL, 10);
1117 /* Check for equal grid spacing in x and y dims */
1118 if (nxcmap != nycmap)
1120 gmx_fatal(FARGS, "Not the same grid spacing in x and y for cmap grid: x=%d, y=%d", nxcmap, nycmap);
1123 ncmap = nxcmap*nycmap;
1124 ftype = ifunc_index(d, ft);
1125 nrfpA = strtol(alc[6], NULL, 10)*strtol(alc[6], NULL, 10);
1126 nrfpB = strtol(alc[7], NULL, 10)*strtol(alc[7], NULL, 10);
1129 /* Allocate memory for the CMAP grid */
1130 bt[F_CMAP].ncmap += nrfp;
1131 srenew(bt[F_CMAP].cmap, bt[F_CMAP].ncmap);
1133 /* Read in CMAP parameters */
1135 for (i = 0; i < ncmap; i++)
1137 while (isspace(*(line+start+sl)))
1141 nn = sscanf(line+start+sl, " %s ", s);
1143 bt[F_CMAP].cmap[i+(bt[F_CMAP].ncmap)-nrfp] = strtod(s, NULL);
1151 gmx_fatal(FARGS, "Error in reading cmap parameter for angle %s %s %s %s %s", alc[0], alc[1], alc[2], alc[3], alc[4]);
1156 /* Check do that we got the number of parameters we expected */
1157 if (read_cmap == nrfpA)
1159 for (i = 0; i < ncmap; i++)
1161 bt[F_CMAP].cmap[i+ncmap] = bt[F_CMAP].cmap[i];
1166 if (read_cmap < nrfpA)
1168 warning_error(wi, "Not enough cmap parameters");
1170 else if (read_cmap > nrfpA && read_cmap < nrfp)
1172 warning_error(wi, "Too many cmap parameters or not enough parameters for topology B");
1174 else if (read_cmap > nrfp)
1176 warning_error(wi, "Too many cmap parameters");
1181 /* Set grid spacing and the number of grids (we assume these numbers to be the same for all grids
1182 * so we can safely assign them each time
1184 bt[F_CMAP].grid_spacing = nxcmap; /* Or nycmap, they need to be equal */
1185 bt[F_CMAP].nc = bt[F_CMAP].nc + 1; /* Since we are incrementing here, we need to subtract later, see (*****) */
1186 nct = (nral+1) * bt[F_CMAP].nc;
1188 /* Allocate memory for the cmap_types information */
1189 srenew(bt[F_CMAP].cmap_types, nct);
1191 for (i = 0; (i < nral); i++)
1193 if (at && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1195 gmx_fatal(FARGS, "Unknown atomtype %s\n", alc[i]);
1197 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1199 gmx_fatal(FARGS, "Unknown bond_atomtype %s\n", alc[i]);
1202 /* Assign a grid number to each cmap_type */
1203 bt[F_CMAP].cmap_types[bt[F_CMAP].nct++] = get_bond_atomtype_type(alc[i], bat);
1206 /* Assign a type number to this cmap */
1207 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 (****) */
1209 /* Check for the correct number of atoms (again) */
1210 if (bt[F_CMAP].nct != nct)
1212 gmx_fatal(FARGS, "Incorrect number of atom types (%d) in cmap type %d\n", nct, bt[F_CMAP].nc);
1215 /* Is this correct?? */
1216 for (i = 0; i < MAXFORCEPARAM; i++)
1221 /* Push the bond to the bondlist */
1222 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
1226 static void push_atom_now(t_symtab *symtab, t_atoms *at, int atomnr,
1228 int type, char *ctype, int ptype,
1230 char *resname, char *name, real m0, real q0,
1231 int typeB, char *ctypeB, real mB, real qB)
1233 int j, resind = 0, resnr;
1237 if (((nr == 0) && (atomnr != 1)) || (nr && (atomnr != at->nr+1)))
1239 gmx_fatal(FARGS, "Atoms in the .top are not numbered consecutively from 1 (rather, atomnr = %d, while at->nr = %d)", atomnr, at->nr);
1242 j = strlen(resnumberic) - 1;
1243 if (isdigit(resnumberic[j]))
1249 ric = resnumberic[j];
1250 if (j == 0 || !isdigit(resnumberic[j-1]))
1252 gmx_fatal(FARGS, "Invalid residue number '%s' for atom %d",
1253 resnumberic, atomnr);
1256 resnr = strtol(resnumberic, NULL, 10);
1260 resind = at->atom[nr-1].resind;
1262 if (nr == 0 || strcmp(resname, *at->resinfo[resind].name) != 0 ||
1263 resnr != at->resinfo[resind].nr ||
1264 ric != at->resinfo[resind].ic)
1274 at->nres = resind + 1;
1275 srenew(at->resinfo, at->nres);
1276 at->resinfo[resind].name = put_symtab(symtab, resname);
1277 at->resinfo[resind].nr = resnr;
1278 at->resinfo[resind].ic = ric;
1282 resind = at->atom[at->nr-1].resind;
1285 /* New atom instance
1286 * get new space for arrays
1288 srenew(at->atom, nr+1);
1289 srenew(at->atomname, nr+1);
1290 srenew(at->atomtype, nr+1);
1291 srenew(at->atomtypeB, nr+1);
1294 at->atom[nr].type = type;
1295 at->atom[nr].ptype = ptype;
1296 at->atom[nr].q = q0;
1297 at->atom[nr].m = m0;
1298 at->atom[nr].typeB = typeB;
1299 at->atom[nr].qB = qB;
1300 at->atom[nr].mB = mB;
1302 at->atom[nr].resind = resind;
1303 at->atom[nr].atomnumber = atomicnumber;
1304 at->atomname[nr] = put_symtab(symtab, name);
1305 at->atomtype[nr] = put_symtab(symtab, ctype);
1306 at->atomtypeB[nr] = put_symtab(symtab, ctypeB);
1310 void push_cg(t_block *block, int *lastindex, int index, int a)
1314 fprintf (debug, "Index %d, Atom %d\n", index, a);
1317 if (((block->nr) && (*lastindex != index)) || (!block->nr))
1319 /* add a new block */
1321 srenew(block->index, block->nr+1);
1323 block->index[block->nr] = a + 1;
1327 void push_atom(t_symtab *symtab, t_block *cgs,
1328 t_atoms *at, gpp_atomtype_t atype, char *line, int *lastcg,
1332 int cgnumber, atomnr, type, typeB, nscan;
1333 char id[STRLEN], ctype[STRLEN], ctypeB[STRLEN],
1334 resnumberic[STRLEN], resname[STRLEN], name[STRLEN], check[STRLEN];
1335 double m, q, mb, qb;
1336 real m0, q0, mB, qB;
1338 /* Make a shortcut for writing in this molecule */
1341 /* Fixed parameters */
1342 if (sscanf(line, "%s%s%s%s%s%d",
1343 id, ctype, resnumberic, resname, name, &cgnumber) != 6)
1348 sscanf(id, "%d", &atomnr);
1349 if ((type = get_atomtype_type(ctype, atype)) == NOTSET)
1351 gmx_fatal(FARGS, "Atomtype %s not found", ctype);
1353 ptype = get_atomtype_ptype(type, atype);
1355 /* Set default from type */
1356 q0 = get_atomtype_qA(type, atype);
1357 m0 = get_atomtype_massA(type, atype);
1362 /* Optional parameters */
1363 nscan = sscanf(line, "%*s%*s%*s%*s%*s%*s%lf%lf%s%lf%lf%s",
1364 &q, &m, ctypeB, &qb, &mb, check);
1366 /* Nasty switch that falls thru all the way down! */
1375 if ((typeB = get_atomtype_type(ctypeB, atype)) == NOTSET)
1377 gmx_fatal(FARGS, "Atomtype %s not found", ctypeB);
1379 qB = get_atomtype_qA(typeB, atype);
1380 mB = get_atomtype_massA(typeB, atype);
1389 warning_error(wi, "Too many parameters");
1398 fprintf(debug, "mB=%g, qB=%g, typeB=%d\n", mB, qB, typeB);
1401 push_cg(cgs, lastcg, cgnumber, nr);
1403 push_atom_now(symtab, at, atomnr, get_atomtype_atomnumber(type, atype),
1404 type, ctype, ptype, resnumberic,
1405 resname, name, m0, q0, typeB,
1406 typeB == type ? ctype : ctypeB, mB, qB);
1409 void push_molt(t_symtab *symtab, int *nmol, t_molinfo **mol, char *line,
1416 if ((sscanf(line, "%s%d", type, &nrexcl)) != 2)
1418 warning_error(wi, "Expected a molecule type name and nrexcl");
1421 /* Test if this atomtype overwrites another */
1425 if (gmx_strcasecmp(*((*mol)[i].name), type) == 0)
1427 gmx_fatal(FARGS, "moleculetype %s is redefined", type);
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;
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)
1543 int i, nparam_found;
1545 gmx_bool bFound = FALSE;
1550 /* Match the current cmap angle against the list of cmap_types */
1551 for (i = 0; i < bondtype[F_CMAP].nct && !bFound; i += 6)
1560 (get_atomtype_batype(at->atom[p->a[0]].type, atype) == bondtype[F_CMAP].cmap_types[i]) &&
1561 (get_atomtype_batype(at->atom[p->a[1]].type, atype) == bondtype[F_CMAP].cmap_types[i+1]) &&
1562 (get_atomtype_batype(at->atom[p->a[2]].type, atype) == bondtype[F_CMAP].cmap_types[i+2]) &&
1563 (get_atomtype_batype(at->atom[p->a[3]].type, atype) == bondtype[F_CMAP].cmap_types[i+3]) &&
1564 (get_atomtype_batype(at->atom[p->a[4]].type, atype) == bondtype[F_CMAP].cmap_types[i+4]))
1566 /* Found cmap torsion */
1568 ct = bondtype[F_CMAP].cmap_types[i+5];
1574 /* If we did not find a matching type for this cmap torsion */
1577 gmx_fatal(FARGS, "Unknown cmap torsion between atoms %d %d %d %d %d\n",
1578 p->a[0]+1, p->a[1]+1, p->a[2]+1, p->a[3]+1, p->a[4]+1);
1581 *nparam_def = nparam_found;
1587 static gmx_bool default_params(int ftype, t_params bt[],
1588 t_atoms *at, gpp_atomtype_t atype,
1589 t_param *p, gmx_bool bB,
1590 t_param **param_def,
1593 int i, j, nparam_found;
1594 gmx_bool bFound, bSame;
1597 int nr = bt[ftype].nr;
1598 int nral = NRAL(ftype);
1599 int nrfpA = interaction_function[ftype].nrfpA;
1600 int nrfpB = interaction_function[ftype].nrfpB;
1602 if ((!bB && nrfpA == 0) || (bB && nrfpB == 0))
1608 /* We allow wildcards now. The first type (with or without wildcards) that
1609 * fits is used, so you should probably put the wildcarded bondtypes
1610 * at the end of each section.
1614 /* OPLS uses 1000s of dihedraltypes, so in order to speed up the scanning we have a
1615 * special case for this. Check for B state outside loop to speed it up.
1617 if (ftype == F_PDIHS || ftype == F_RBDIHS || ftype == F_IDIHS || ftype == F_PIDIHS)
1621 for (i = 0; ((i < nr) && !bFound); i++)
1623 pi = &(bt[ftype].param[i]);
1626 ((pi->AI == -1) || (get_atomtype_batype(at->atom[p->AI].typeB, atype) == pi->AI)) &&
1627 ((pi->AJ == -1) || (get_atomtype_batype(at->atom[p->AJ].typeB, atype) == pi->AJ)) &&
1628 ((pi->AK == -1) || (get_atomtype_batype(at->atom[p->AK].typeB, atype) == pi->AK)) &&
1629 ((pi->AL == -1) || (get_atomtype_batype(at->atom[p->AL].typeB, atype) == pi->AL))
1636 for (i = 0; ((i < nr) && !bFound); i++)
1638 pi = &(bt[ftype].param[i]);
1641 ((pi->AI == -1) || (get_atomtype_batype(at->atom[p->AI].type, atype) == pi->AI)) &&
1642 ((pi->AJ == -1) || (get_atomtype_batype(at->atom[p->AJ].type, atype) == pi->AJ)) &&
1643 ((pi->AK == -1) || (get_atomtype_batype(at->atom[p->AK].type, atype) == pi->AK)) &&
1644 ((pi->AL == -1) || (get_atomtype_batype(at->atom[p->AL].type, atype) == pi->AL))
1648 /* Find additional matches for this dihedral - necessary for ftype==9 which is used e.g. for charmm.
1649 * The rules in that case is that additional matches HAVE to be on adjacent lines!
1655 /* Continue from current i value */
1656 for (j = i+1; j < nr && bSame; j += 2)
1658 pj = &(bt[ftype].param[j]);
1659 bSame = (pi->AI == pj->AI && pi->AJ == pj->AJ && pi->AK == pj->AK && pi->AL == pj->AL);
1664 /* nparam_found will be increased as long as the numbers match */
1668 else /* Not a dihedral */
1670 for (i = 0; ((i < nr) && !bFound); i++)
1672 pi = &(bt[ftype].param[i]);
1675 for (j = 0; ((j < nral) &&
1676 (get_atomtype_batype(at->atom[p->a[j]].typeB, atype) == pi->a[j])); j++)
1683 for (j = 0; ((j < nral) &&
1684 (get_atomtype_batype(at->atom[p->a[j]].type, atype) == pi->a[j])); j++)
1689 bFound = (j == nral);
1698 *nparam_def = nparam_found;
1705 void push_bond(directive d, t_params bondtype[], t_params bond[],
1706 t_atoms *at, gpp_atomtype_t atype, char *line,
1707 gmx_bool bBonded, gmx_bool bGenPairs, real fudgeQQ,
1708 gmx_bool bZero, gmx_bool *bWarn_copy_A_B,
1711 const char *aaformat[MAXATOMLIST] = {
1719 const char *asformat[MAXATOMLIST] = {
1724 "%*s%*s%*s%*s%*s%*s",
1725 "%*s%*s%*s%*s%*s%*s%*s"
1727 const char *ccformat = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
1728 int nr, i, j, nral, nral_fmt, nread, ftype;
1729 char format[STRLEN];
1730 /* One force parameter more, so we can check if we read too many */
1731 double cc[MAXFORCEPARAM+1];
1732 int aa[MAXATOMLIST+1];
1733 t_param param, *param_defA, *param_defB;
1734 gmx_bool bFoundA = FALSE, bFoundB = FALSE, bDef, bPert, bSwapParity = FALSE;
1735 int nparam_defA, nparam_defB;
1738 nparam_defA = nparam_defB = 0;
1740 ftype = ifunc_index(d, 1);
1742 for (j = 0; j < MAXATOMLIST; j++)
1746 bDef = (NRFP(ftype) > 0);
1748 if (ftype == F_SETTLE)
1750 /* SETTLE acts on 3 atoms, but the topology format only specifies
1751 * the first atom (for historical reasons).
1760 nread = sscanf(line, aaformat[nral_fmt-1],
1761 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
1763 if (ftype == F_SETTLE)
1770 if (nread < nral_fmt)
1775 else if (nread > nral_fmt)
1777 /* this is a hack to allow for virtual sites with swapped parity */
1778 bSwapParity = (aa[nral] < 0);
1781 aa[nral] = -aa[nral];
1783 ftype = ifunc_index(d, aa[nral]);
1792 gmx_fatal(FARGS, "Negative function types only allowed for %s and %s",
1793 interaction_function[F_VSITE3FAD].longname,
1794 interaction_function[F_VSITE3OUT].longname);
1800 /* Check for double atoms and atoms out of bounds */
1801 for (i = 0; (i < nral); i++)
1803 if (aa[i] < 1 || aa[i] > at->nr)
1805 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
1806 "Atom index (%d) in %s out of bounds (1-%d).\n"
1807 "This probably means that you have inserted topology section \"%s\"\n"
1808 "in a part belonging to a different molecule than you intended to.\n"
1809 "In that case move the \"%s\" section to the right molecule.",
1810 get_warning_file(wi), get_warning_line(wi),
1811 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
1813 for (j = i+1; (j < nral); j++)
1817 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
1818 warning(wi, errbuf);
1823 /* default force parameters */
1824 for (j = 0; (j < MAXATOMLIST); j++)
1826 param.a[j] = aa[j]-1;
1828 for (j = 0; (j < MAXFORCEPARAM); j++)
1833 /* Get force params for normal and free energy perturbation
1834 * studies, as determined by types!
1839 bFoundA = default_params(ftype, bondtype, at, atype, ¶m, FALSE, ¶m_defA, &nparam_defA);
1842 /* Copy the A-state and B-state default parameters. */
1843 GMX_ASSERT(NRFPA(ftype)+NRFPB(ftype) <= MAXFORCEPARAM, "Bonded interactions may have at most 12 parameters");
1844 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
1846 param.c[j] = param_defA->c[j];
1849 bFoundB = default_params(ftype, bondtype, at, atype, ¶m, TRUE, ¶m_defB, &nparam_defB);
1852 /* Copy only the B-state default parameters */
1853 for (j = NRFPA(ftype); (j < NRFP(ftype)); j++)
1855 param.c[j] = param_defB->c[j];
1859 else if (ftype == F_LJ14)
1861 bFoundA = default_nb_params(ftype, bondtype, at, ¶m, 0, FALSE, bGenPairs);
1862 bFoundB = default_nb_params(ftype, bondtype, at, ¶m, 0, TRUE, bGenPairs);
1864 else if (ftype == F_LJC14_Q)
1866 param.c[0] = fudgeQQ;
1867 /* Fill in the A-state charges as default parameters */
1868 param.c[1] = at->atom[param.a[0]].q;
1869 param.c[2] = at->atom[param.a[1]].q;
1870 /* The default LJ parameters are the standard 1-4 parameters */
1871 bFoundA = default_nb_params(F_LJ14, bondtype, at, ¶m, 3, FALSE, bGenPairs);
1874 else if (ftype == F_LJC_PAIRS_NB)
1876 /* Defaults are not supported here */
1882 gmx_incons("Unknown function type in push_bond");
1885 if (nread > nral_fmt)
1887 /* Manually specified parameters - in this case we discard multiple torsion info! */
1889 strcpy(format, asformat[nral_fmt-1]);
1890 strcat(format, ccformat);
1892 nread = sscanf(line, format, &cc[0], &cc[1], &cc[2], &cc[3], &cc[4], &cc[5],
1893 &cc[6], &cc[7], &cc[8], &cc[9], &cc[10], &cc[11], &cc[12]);
1895 if ((nread == NRFPA(ftype)) && (NRFPB(ftype) != 0))
1897 /* We only have to issue a warning if these atoms are perturbed! */
1899 for (j = 0; (j < nral); j++)
1901 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
1904 if (bPert && *bWarn_copy_A_B)
1907 "Some parameters for bonded interaction involving perturbed atoms are specified explicitly in state A, but not B - copying A to B");
1908 warning(wi, errbuf);
1909 *bWarn_copy_A_B = FALSE;
1912 /* If only the A parameters were specified, copy them to the B state */
1913 /* The B-state parameters correspond to the first nrfpB
1914 * A-state parameters.
1916 for (j = 0; (j < NRFPB(ftype)); j++)
1918 cc[nread++] = cc[j];
1922 /* If nread was 0 or EOF, no parameters were read => use defaults.
1923 * If nread was nrfpA we copied above so nread=nrfp.
1924 * If nread was nrfp we are cool.
1925 * For F_LJC14_Q we allow supplying fudgeQQ only.
1926 * Anything else is an error!
1928 if ((nread != 0) && (nread != EOF) && (nread != NRFP(ftype)) &&
1929 !(ftype == F_LJC14_Q && nread == 1))
1931 gmx_fatal(FARGS, "Incorrect number of parameters - found %d, expected %d or %d for %s.",
1932 nread, NRFPA(ftype), NRFP(ftype),
1933 interaction_function[ftype].longname);
1936 for (j = 0; (j < nread); j++)
1941 /* Check whether we have to use the defaults */
1942 if (nread == NRFP(ftype))
1951 /* nread now holds the number of force parameters read! */
1956 /* When we have multiple terms it would be very dangerous to allow perturbations to a different atom type! */
1957 if (ftype == F_PDIHS)
1959 if ((nparam_defA != nparam_defB) || ((nparam_defA > 1 || nparam_defB > 1) && (param_defA != param_defB)))
1962 "Cannot automatically perturb a torsion with multiple terms to different form.\n"
1963 "Please specify perturbed parameters manually for this torsion in your topology!");
1964 warning_error(wi, errbuf);
1968 if (nread > 0 && nread < NRFPA(ftype))
1970 /* Issue an error, do not use defaults */
1971 sprintf(errbuf, "Not enough parameters, there should be at least %d (or 0 for defaults)", NRFPA(ftype));
1972 warning_error(wi, errbuf);
1975 if (nread == 0 || nread == EOF)
1979 if (interaction_function[ftype].flags & IF_VSITE)
1981 /* set them to NOTSET, will be calculated later */
1982 for (j = 0; (j < MAXFORCEPARAM); j++)
1984 param.c[j] = NOTSET;
1989 param.C1 = -1; /* flag to swap parity of vsite construction */
1996 fprintf(stderr, "NOTE: No default %s types, using zeroes\n",
1997 interaction_function[ftype].longname);
2001 sprintf(errbuf, "No default %s types", interaction_function[ftype].longname);
2002 warning_error(wi, errbuf);
2013 param.C0 = 360 - param.C0;
2016 param.C2 = -param.C2;
2023 /* We only have to issue a warning if these atoms are perturbed! */
2025 for (j = 0; (j < nral); j++)
2027 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
2032 sprintf(errbuf, "No default %s types for perturbed atoms, "
2033 "using normal values", interaction_function[ftype].longname);
2034 warning(wi, errbuf);
2040 if ((ftype == F_PDIHS || ftype == F_ANGRES || ftype == F_ANGRESZ)
2041 && param.c[5] != param.c[2])
2043 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2044 " %s multiplicity can not be perturbed %f!=%f",
2045 get_warning_file(wi), get_warning_line(wi),
2046 interaction_function[ftype].longname,
2047 param.c[2], param.c[5]);
2050 if (IS_TABULATED(ftype) && param.c[2] != param.c[0])
2052 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2053 " %s table number can not be perturbed %d!=%d",
2054 get_warning_file(wi), get_warning_line(wi),
2055 interaction_function[ftype].longname,
2056 (int)(param.c[0]+0.5), (int)(param.c[2]+0.5));
2059 /* Dont add R-B dihedrals where all parameters are zero (no interaction) */
2060 if (ftype == F_RBDIHS)
2063 for (i = 0; i < NRFP(ftype); i++)
2065 if (param.c[i] != 0)
2076 /* Put the values in the appropriate arrays */
2077 add_param_to_list (&bond[ftype], ¶m);
2079 /* Push additional torsions from FF for ftype==9 if we have them.
2080 * We have already checked that the A/B states do not differ in this case,
2081 * so we do not have to double-check that again, or the vsite stuff.
2082 * In addition, those torsions cannot be automatically perturbed.
2084 if (bDef && ftype == F_PDIHS)
2086 for (i = 1; i < nparam_defA; i++)
2088 /* Advance pointer! */
2090 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
2092 param.c[j] = param_defA->c[j];
2094 /* And push the next term for this torsion */
2095 add_param_to_list (&bond[ftype], ¶m);
2100 void push_cmap(directive d, t_params bondtype[], t_params bond[],
2101 t_atoms *at, gpp_atomtype_t atype, char *line,
2104 const char *aaformat[MAXATOMLIST+1] =
2115 int i, j, ftype, nral, nread, ncmap_params;
2117 int aa[MAXATOMLIST+1];
2122 ftype = ifunc_index(d, 1);
2126 nread = sscanf(line, aaformat[nral-1],
2127 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
2134 else if (nread == nral)
2136 ftype = ifunc_index(d, 1);
2139 /* Check for double atoms and atoms out of bounds */
2140 for (i = 0; i < nral; i++)
2142 if (aa[i] < 1 || aa[i] > at->nr)
2144 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2145 "Atom index (%d) in %s out of bounds (1-%d).\n"
2146 "This probably means that you have inserted topology section \"%s\"\n"
2147 "in a part belonging to a different molecule than you intended to.\n"
2148 "In that case move the \"%s\" section to the right molecule.",
2149 get_warning_file(wi), get_warning_line(wi),
2150 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
2153 for (j = i+1; (j < nral); j++)
2157 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
2158 warning(wi, errbuf);
2163 /* default force parameters */
2164 for (j = 0; (j < MAXATOMLIST); j++)
2166 param.a[j] = aa[j]-1;
2168 for (j = 0; (j < MAXFORCEPARAM); j++)
2173 /* Get the cmap type for this cmap angle */
2174 bFound = default_cmap_params(bondtype, at, atype, ¶m, FALSE, &cmap_type, &ncmap_params);
2176 /* We want exactly one parameter (the cmap type in state A (currently no state B) back */
2177 if (bFound && ncmap_params == 1)
2179 /* Put the values in the appropriate arrays */
2180 param.c[0] = cmap_type;
2181 add_param_to_list(&bond[ftype], ¶m);
2185 /* This is essentially the same check as in default_cmap_params() done one more time */
2186 gmx_fatal(FARGS, "Unable to assign a cmap type to torsion %d %d %d %d and %d\n",
2187 param.a[0]+1, param.a[1]+1, param.a[2]+1, param.a[3]+1, param.a[4]+1);
2193 void push_vsitesn(directive d, t_params bond[],
2194 t_atoms *at, char *line,
2198 int type, ftype, j, n, ret, nj, a;
2200 double *weight = NULL, weight_tot;
2203 /* default force parameters */
2204 for (j = 0; (j < MAXATOMLIST); j++)
2206 param.a[j] = NOTSET;
2208 for (j = 0; (j < MAXFORCEPARAM); j++)
2214 ret = sscanf(ptr, "%d%n", &a, &n);
2218 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2219 " Expected an atom index in section \"%s\"",
2220 get_warning_file(wi), get_warning_line(wi),
2226 sscanf(ptr, "%d%n", &type, &n);
2228 ftype = ifunc_index(d, type);
2234 ret = sscanf(ptr, "%d%n", &a, &n);
2241 srenew(weight, nj+20);
2250 /* Here we use the A-state mass as a parameter.
2251 * Note that the B-state mass has no influence.
2253 weight[nj] = at->atom[atc[nj]].m;
2257 ret = sscanf(ptr, "%lf%n", &(weight[nj]), &n);
2261 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2262 " No weight or negative weight found for vsiten constructing atom %d (atom index %d)",
2263 get_warning_file(wi), get_warning_line(wi),
2268 gmx_fatal(FARGS, "Unknown vsiten type %d", type);
2270 weight_tot += weight[nj];
2278 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2279 " Expected more than one atom index in section \"%s\"",
2280 get_warning_file(wi), get_warning_line(wi),
2284 if (weight_tot == 0)
2286 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2287 " The total mass of the construting atoms is zero",
2288 get_warning_file(wi), get_warning_line(wi));
2291 for (j = 0; j < nj; j++)
2293 param.a[1] = atc[j];
2295 param.c[1] = weight[j]/weight_tot;
2296 /* Put the values in the appropriate arrays */
2297 add_param_to_list (&bond[ftype], ¶m);
2304 void push_mol(int nrmols, t_molinfo mols[], char *pline, int *whichmol,
2312 if (sscanf(pline, "%s%d", type, &copies) != 2)
2318 /* search moleculename */
2319 for (i = 0; ((i < nrmols) && gmx_strcasecmp(type, *(mols[i].name))); i++)
2331 gmx_fatal(FARGS, "No such moleculetype %s", type);
2335 void init_block2(t_block2 *b2, int natom)
2340 snew(b2->nra, b2->nr);
2341 snew(b2->a, b2->nr);
2342 for (i = 0; (i < b2->nr); i++)
2348 void done_block2(t_block2 *b2)
2354 for (i = 0; (i < b2->nr); i++)
2364 void push_excl(char *line, t_block2 *b2)
2368 char base[STRLEN], format[STRLEN];
2370 if (sscanf(line, "%d", &i) == 0)
2375 if ((1 <= i) && (i <= b2->nr))
2383 fprintf(debug, "Unbound atom %d\n", i-1);
2387 strcpy(base, "%*d");
2390 strcpy(format, base);
2391 strcat(format, "%d");
2392 n = sscanf(line, format, &j);
2395 if ((1 <= j) && (j <= b2->nr))
2398 srenew(b2->a[i], ++(b2->nra[i]));
2399 b2->a[i][b2->nra[i]-1] = j;
2400 /* also add the reverse exclusion! */
2401 srenew(b2->a[j], ++(b2->nra[j]));
2402 b2->a[j][b2->nra[j]-1] = i;
2403 strcat(base, "%*d");
2407 gmx_fatal(FARGS, "Invalid Atomnr j: %d, b2->nr: %d\n", j, b2->nr);
2414 void b_to_b2(t_blocka *b, t_block2 *b2)
2419 for (i = 0; (i < b->nr); i++)
2421 for (j = b->index[i]; (j < b->index[i+1]); j++)
2424 srenew(b2->a[i], ++b2->nra[i]);
2425 b2->a[i][b2->nra[i]-1] = a;
2430 void b2_to_b(t_block2 *b2, t_blocka *b)
2436 for (i = 0; (i < b2->nr); i++)
2439 for (j = 0; (j < b2->nra[i]); j++)
2441 b->a[nra+j] = b2->a[i][j];
2445 /* terminate list */
2449 static int icomp(const void *v1, const void *v2)
2451 return (*((atom_id *) v1))-(*((atom_id *) v2));
2454 void merge_excl(t_blocka *excl, t_block2 *b2)
2464 else if (b2->nr != excl->nr)
2466 gmx_fatal(FARGS, "DEATH HORROR: b2->nr = %d, while excl->nr = %d",
2471 fprintf(debug, "Entering merge_excl\n");
2474 /* First copy all entries from excl to b2 */
2477 /* Count and sort the exclusions */
2479 for (i = 0; (i < b2->nr); i++)
2483 /* remove double entries */
2484 qsort(b2->a[i], (size_t)b2->nra[i], (size_t)sizeof(b2->a[i][0]), icomp);
2486 for (j = 1; (j < b2->nra[i]); j++)
2488 if (b2->a[i][j] != b2->a[i][k-1])
2490 b2->a[i][k] = b2->a[i][j];
2499 srenew(excl->a, excl->nra);
2504 int add_atomtype_decoupled(t_symtab *symtab, gpp_atomtype_t at,
2505 t_nbparam ***nbparam, t_nbparam ***pair)
2511 /* Define an atom type with all parameters set to zero (no interactions) */
2514 /* Type for decoupled atoms could be anything,
2515 * this should be changed automatically later when required.
2517 atom.ptype = eptAtom;
2518 for (i = 0; (i < MAXFORCEPARAM); i++)
2523 nr = add_atomtype(at, symtab, &atom, "decoupled", ¶m, -1, 0.0, 0.0, 0.0, 0, 0, 0);
2525 /* Add space in the non-bonded parameters matrix */
2526 realloc_nb_params(at, nbparam, pair);
2531 static void convert_pairs_to_pairsQ(t_params *plist,
2532 real fudgeQQ, t_atoms *atoms)
2534 t_param *paramp1, *paramp2, *paramnew;
2535 int i, j, p1nr, p2nr, p2newnr;
2537 /* Add the pair list to the pairQ list */
2538 p1nr = plist[F_LJ14].nr;
2539 p2nr = plist[F_LJC14_Q].nr;
2540 p2newnr = p1nr + p2nr;
2541 snew(paramnew, p2newnr);
2543 paramp1 = plist[F_LJ14].param;
2544 paramp2 = plist[F_LJC14_Q].param;
2546 /* Fill in the new F_LJC14_Q array with the old one. NOTE:
2547 it may be possible to just ADD the converted F_LJ14 array
2548 to the old F_LJC14_Q array, but since we have to create
2549 a new sized memory structure, better just to deep copy it all.
2552 for (i = 0; i < p2nr; i++)
2554 /* Copy over parameters */
2555 for (j = 0; j < 5; j++) /* entries are 0-4 for F_LJC14_Q */
2557 paramnew[i].c[j] = paramp2[i].c[j];
2560 /* copy over atoms */
2561 for (j = 0; j < 2; j++)
2563 paramnew[i].a[j] = paramp2[i].a[j];
2567 for (i = p2nr; i < p2newnr; i++)
2571 /* Copy over parameters */
2572 paramnew[i].c[0] = fudgeQQ;
2573 paramnew[i].c[1] = atoms->atom[paramp1[j].a[0]].q;
2574 paramnew[i].c[2] = atoms->atom[paramp1[j].a[1]].q;
2575 paramnew[i].c[3] = paramp1[j].c[0];
2576 paramnew[i].c[4] = paramp1[j].c[1];
2578 /* copy over atoms */
2579 paramnew[i].a[0] = paramp1[j].a[0];
2580 paramnew[i].a[1] = paramp1[j].a[1];
2583 /* free the old pairlists */
2584 sfree(plist[F_LJC14_Q].param);
2585 sfree(plist[F_LJ14].param);
2587 /* now assign the new data to the F_LJC14_Q structure */
2588 plist[F_LJC14_Q].param = paramnew;
2589 plist[F_LJC14_Q].nr = p2newnr;
2591 /* Empty the LJ14 pairlist */
2592 plist[F_LJ14].nr = 0;
2593 plist[F_LJ14].param = NULL;
2596 static void generate_LJCpairsNB(t_molinfo *mol, int nb_funct, t_params *nbp)
2598 int n, ntype, i, j, k;
2605 atom = mol->atoms.atom;
2607 ntype = static_cast<int>(std::sqrt(static_cast<double>(nbp->nr)));
2608 GMX_ASSERT(ntype * ntype == nbp->nr, "Number of pairs of generated non-bonded parameters should be a perfect square");
2610 for (i = 0; i < MAXATOMLIST; i++)
2612 param.a[i] = NOTSET;
2614 for (i = 0; i < MAXFORCEPARAM; i++)
2616 param.c[i] = NOTSET;
2619 /* Add a pair interaction for all non-excluded atom pairs */
2621 for (i = 0; i < n; i++)
2623 for (j = i+1; j < n; j++)
2626 for (k = excl->index[i]; k < excl->index[i+1]; k++)
2628 if (excl->a[k] == j)
2635 if (nb_funct != F_LJ)
2637 gmx_fatal(FARGS, "Can only generate non-bonded pair interactions for Van der Waals type Lennard-Jones");
2641 param.c[0] = atom[i].q;
2642 param.c[1] = atom[j].q;
2643 param.c[2] = nbp->param[ntype*atom[i].type+atom[j].type].c[0];
2644 param.c[3] = nbp->param[ntype*atom[i].type+atom[j].type].c[1];
2645 add_param_to_list(&mol->plist[F_LJC_PAIRS_NB], ¶m);
2651 static void set_excl_all(t_blocka *excl)
2655 /* Get rid of the current exclusions and exclude all atom pairs */
2657 excl->nra = nat*nat;
2658 srenew(excl->a, excl->nra);
2660 for (i = 0; i < nat; i++)
2663 for (j = 0; j < nat; j++)
2668 excl->index[nat] = k;
2671 static void decouple_atoms(t_atoms *atoms, int atomtype_decouple,
2672 int couple_lam0, int couple_lam1)
2676 for (i = 0; i < atoms->nr; i++)
2678 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamVDW)
2680 atoms->atom[i].q = 0.0;
2682 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamQ)
2684 atoms->atom[i].type = atomtype_decouple;
2686 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamVDW)
2688 atoms->atom[i].qB = 0.0;
2690 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamQ)
2692 atoms->atom[i].typeB = atomtype_decouple;
2697 void convert_moltype_couple(t_molinfo *mol, int atomtype_decouple, real fudgeQQ,
2698 int couple_lam0, int couple_lam1,
2699 gmx_bool bCoupleIntra, int nb_funct, t_params *nbp)
2701 convert_pairs_to_pairsQ(mol->plist, fudgeQQ, &mol->atoms);
2704 generate_LJCpairsNB(mol, nb_funct, nbp);
2705 set_excl_all(&mol->excls);
2707 decouple_atoms(&mol->atoms, atomtype_decouple, couple_lam0, couple_lam1);