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, 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/fileio/warninp.h"
49 #include "gromacs/gmxpreprocess/gpp_atomtype.h"
50 #include "gromacs/gmxpreprocess/gpp_bond_atomtype.h"
51 #include "gromacs/gmxpreprocess/notset.h"
52 #include "gromacs/gmxpreprocess/readir.h"
53 #include "gromacs/gmxpreprocess/topdirs.h"
54 #include "gromacs/gmxpreprocess/toputil.h"
55 #include "gromacs/mdtypes/md_enums.h"
56 #include "gromacs/topology/ifunc.h"
57 #include "gromacs/topology/symtab.h"
58 #include "gromacs/utility/cstringutil.h"
59 #include "gromacs/utility/fatalerror.h"
60 #include "gromacs/utility/gmxassert.h"
61 #include "gromacs/utility/smalloc.h"
63 void generate_nbparams(int comb, int ftype, t_params *plist, gpp_atomtype_t atype,
68 real c, bi, bj, ci, cj, ci0, ci1, ci2, cj0, cj1, cj2;
71 /* Lean mean shortcuts */
72 nr = get_atomtype_ntypes(atype);
74 snew(plist->param, nr*nr);
77 /* Fill the matrix with force parameters */
85 for (i = k = 0; (i < nr); i++)
87 for (j = 0; (j < nr); j++, k++)
89 for (nf = 0; (nf < nrfp); nf++)
91 ci = get_atomtype_nbparam(i, nf, atype);
92 cj = get_atomtype_nbparam(j, nf, atype);
93 c = std::sqrt(ci * cj);
94 plist->param[k].c[nf] = c;
100 case eCOMB_ARITHMETIC:
101 /* c0 and c1 are sigma and epsilon */
102 for (i = k = 0; (i < nr); i++)
104 for (j = 0; (j < nr); j++, k++)
106 ci0 = get_atomtype_nbparam(i, 0, atype);
107 cj0 = get_atomtype_nbparam(j, 0, atype);
108 ci1 = get_atomtype_nbparam(i, 1, atype);
109 cj1 = get_atomtype_nbparam(j, 1, atype);
110 plist->param[k].c[0] = (fabs(ci0) + fabs(cj0))*0.5;
111 /* Negative sigma signals that c6 should be set to zero later,
112 * so we need to propagate that through the combination rules.
114 if (ci0 < 0 || cj0 < 0)
116 plist->param[k].c[0] *= -1;
118 plist->param[k].c[1] = std::sqrt(ci1*cj1);
123 case eCOMB_GEOM_SIG_EPS:
124 /* c0 and c1 are sigma and epsilon */
125 for (i = k = 0; (i < nr); i++)
127 for (j = 0; (j < nr); j++, k++)
129 ci0 = get_atomtype_nbparam(i, 0, atype);
130 cj0 = get_atomtype_nbparam(j, 0, atype);
131 ci1 = get_atomtype_nbparam(i, 1, atype);
132 cj1 = get_atomtype_nbparam(j, 1, atype);
133 plist->param[k].c[0] = std::sqrt(fabs(ci0*cj0));
134 /* Negative sigma signals that c6 should be set to zero later,
135 * so we need to propagate that through the combination rules.
137 if (ci0 < 0 || cj0 < 0)
139 plist->param[k].c[0] *= -1;
141 plist->param[k].c[1] = std::sqrt(ci1*cj1);
147 gmx_fatal(FARGS, "No such combination rule %d", comb);
151 gmx_incons("Topology processing, generate nb parameters");
156 /* Buckingham rules */
157 for (i = k = 0; (i < nr); i++)
159 for (j = 0; (j < nr); j++, k++)
161 ci0 = get_atomtype_nbparam(i, 0, atype);
162 cj0 = get_atomtype_nbparam(j, 0, atype);
163 ci2 = get_atomtype_nbparam(i, 2, atype);
164 cj2 = get_atomtype_nbparam(j, 2, atype);
165 bi = get_atomtype_nbparam(i, 1, atype);
166 bj = get_atomtype_nbparam(j, 1, atype);
167 plist->param[k].c[0] = std::sqrt(ci0 * cj0);
168 if ((bi == 0) || (bj == 0))
170 plist->param[k].c[1] = 0;
174 plist->param[k].c[1] = 2.0/(1/bi+1/bj);
176 plist->param[k].c[2] = std::sqrt(ci2 * cj2);
182 sprintf(errbuf, "Invalid nonbonded type %s",
183 interaction_function[ftype].longname);
184 warning_error(wi, errbuf);
188 static void realloc_nb_params(gpp_atomtype_t at,
189 t_nbparam ***nbparam, t_nbparam ***pair)
191 /* Add space in the non-bonded parameters matrix */
192 int atnr = get_atomtype_ntypes(at);
193 srenew(*nbparam, atnr);
194 snew((*nbparam)[atnr-1], atnr);
198 snew((*pair)[atnr-1], atnr);
202 static void copy_B_from_A(int ftype, double *c)
206 nrfpA = NRFPA(ftype);
207 nrfpB = NRFPB(ftype);
209 /* Copy the B parameters from the first nrfpB A parameters */
210 for (i = 0; (i < nrfpB); i++)
216 void push_at (t_symtab *symtab, gpp_atomtype_t at, t_bond_atomtype bat,
217 char *line, int nb_funct,
218 t_nbparam ***nbparam, t_nbparam ***pair,
225 t_xlate xl[eptNR] = {
233 int nr, i, nfields, j, pt, nfp0 = -1;
234 int batype_nr, nread;
235 char type[STRLEN], btype[STRLEN], ptype[STRLEN];
237 double c[MAXFORCEPARAM];
238 double radius, vol, surftens, gb_radius, S_hct;
239 char tmpfield[12][100]; /* Max 12 fields of width 100 */
244 gmx_bool have_atomic_number;
245 gmx_bool have_bonded_type;
250 /* First assign input line to temporary array */
251 nfields = sscanf(line, "%s%s%s%s%s%s%s%s%s%s%s%s",
252 tmpfield[0], tmpfield[1], tmpfield[2], tmpfield[3], tmpfield[4], tmpfield[5],
253 tmpfield[6], tmpfield[7], tmpfield[8], tmpfield[9], tmpfield[10], tmpfield[11]);
255 /* Comments on optional fields in the atomtypes section:
257 * The force field format is getting a bit old. For OPLS-AA we needed
258 * to add a special bonded atomtype, and for Gerrit Groenhofs QM/MM stuff
259 * we also needed the atomic numbers.
260 * To avoid making all old or user-generated force fields unusable we
261 * have introduced both these quantities as optional columns, and do some
262 * acrobatics to check whether they are present or not.
263 * This will all look much nicer when we switch to XML... sigh.
265 * Field 0 (mandatory) is the nonbonded type name. (string)
266 * Field 1 (optional) is the bonded type (string)
267 * Field 2 (optional) is the atomic number (int)
268 * Field 3 (mandatory) is the mass (numerical)
269 * Field 4 (mandatory) is the charge (numerical)
270 * Field 5 (mandatory) is the particle type (single character)
271 * This is followed by a number of nonbonded parameters.
273 * The safest way to identify the format is the particle type field.
275 * So, here is what we do:
277 * A. Read in the first six fields as strings
278 * B. If field 3 (starting from 0) is a single char, we have neither
279 * bonded_type or atomic numbers.
280 * C. If field 5 is a single char we have both.
281 * D. If field 4 is a single char we check field 1. If this begins with
282 * an alphabetical character we have bonded types, otherwise atomic numbers.
291 if ( (strlen(tmpfield[5]) == 1) && isalpha(tmpfield[5][0]) )
293 have_bonded_type = TRUE;
294 have_atomic_number = TRUE;
296 else if ( (strlen(tmpfield[3]) == 1) && isalpha(tmpfield[3][0]) )
298 have_bonded_type = FALSE;
299 have_atomic_number = FALSE;
303 have_bonded_type = ( isalpha(tmpfield[1][0]) != 0 );
304 have_atomic_number = !have_bonded_type;
307 /* optional fields */
321 if (have_atomic_number)
323 if (have_bonded_type)
325 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf",
326 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1],
327 &radius, &vol, &surftens, &gb_radius);
336 /* have_atomic_number && !have_bonded_type */
337 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf",
338 type, &atomnr, &m, &q, ptype, &c[0], &c[1],
339 &radius, &vol, &surftens, &gb_radius);
349 if (have_bonded_type)
351 /* !have_atomic_number && have_bonded_type */
352 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf%lf%lf%lf%lf",
353 type, btype, &m, &q, ptype, &c[0], &c[1],
354 &radius, &vol, &surftens, &gb_radius);
363 /* !have_atomic_number && !have_bonded_type */
364 nread = sscanf(line, "%s%lf%lf%s%lf%lf%lf%lf%lf%lf",
365 type, &m, &q, ptype, &c[0], &c[1],
366 &radius, &vol, &surftens, &gb_radius);
375 if (!have_bonded_type)
380 if (!have_atomic_number)
390 if (have_atomic_number)
392 if (have_bonded_type)
394 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
395 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2],
396 &radius, &vol, &surftens, &gb_radius);
405 /* have_atomic_number && !have_bonded_type */
406 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
407 type, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2],
408 &radius, &vol, &surftens, &gb_radius);
418 if (have_bonded_type)
420 /* !have_atomic_number && have_bonded_type */
421 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
422 type, btype, &m, &q, ptype, &c[0], &c[1], &c[2],
423 &radius, &vol, &surftens, &gb_radius);
432 /* !have_atomic_number && !have_bonded_type */
433 nread = sscanf(line, "%s%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
434 type, &m, &q, ptype, &c[0], &c[1], &c[2],
435 &radius, &vol, &surftens, &gb_radius);
444 if (!have_bonded_type)
449 if (!have_atomic_number)
457 gmx_fatal(FARGS, "Invalid function type %d in push_at %s %d", nb_funct,
460 for (j = nfp0; (j < MAXFORCEPARAM); j++)
465 if (strlen(type) == 1 && isdigit(type[0]))
467 gmx_fatal(FARGS, "Atom type names can't be single digits.");
470 if (strlen(btype) == 1 && isdigit(btype[0]))
472 gmx_fatal(FARGS, "Bond atom type names can't be single digits.");
475 /* Hack to read old topologies */
476 if (gmx_strcasecmp(ptype, "D") == 0)
480 for (j = 0; (j < eptNR); j++)
482 if (gmx_strcasecmp(ptype, xl[j].entry) == 0)
489 gmx_fatal(FARGS, "Invalid particle type %s on line %s",
492 /* cppcheck-suppress arrayIndexOutOfBounds #6329 */
496 fprintf(debug, "ptype: %s\n", ptype_str[pt]);
502 for (i = 0; (i < MAXFORCEPARAM); i++)
507 if ((batype_nr = get_bond_atomtype_type(btype, bat)) == NOTSET)
509 add_bond_atomtype(bat, symtab, btype);
511 batype_nr = get_bond_atomtype_type(btype, bat);
513 if ((nr = get_atomtype_type(type, at)) != NOTSET)
515 sprintf(errbuf, "Overriding atomtype %s", type);
517 if ((nr = set_atomtype(nr, at, symtab, atom, type, param, batype_nr,
518 radius, vol, surftens, atomnr, gb_radius, S_hct)) == NOTSET)
520 gmx_fatal(FARGS, "Replacing atomtype %s failed", type);
523 else if ((add_atomtype(at, symtab, atom, type, param,
524 batype_nr, radius, vol,
525 surftens, atomnr, gb_radius, S_hct)) == NOTSET)
527 gmx_fatal(FARGS, "Adding atomtype %s failed", type);
531 /* Add space in the non-bonded parameters matrix */
532 realloc_nb_params(at, nbparam, pair);
538 static void push_bondtype(t_params * bt,
542 gmx_bool bAllowRepeat,
547 gmx_bool bTest, bFound, bCont, bId;
549 int nrfp = NRFP(ftype);
552 /* If bAllowRepeat is TRUE, we allow multiple entries as long as they
553 are on directly _adjacent_ lines.
556 /* First check if our atomtypes are _identical_ (not reversed) to the previous
557 entry. If they are not identical we search for earlier duplicates. If they are
558 we can skip it, since we already searched for the first line
565 if (bAllowRepeat && nr > 1)
567 for (j = 0, bCont = TRUE; (j < nral); j++)
569 bCont = bCont && (b->a[j] == bt->param[nr-2].a[j]);
573 /* Search for earlier duplicates if this entry was not a continuation
574 from the previous line.
579 for (i = 0; (i < nr); i++)
582 for (j = 0; (j < nral); j++)
584 bTest = (bTest && (b->a[j] == bt->param[i].a[j]));
589 for (j = 0; (j < nral); j++)
591 bTest = (bTest && (b->a[nral-1-j] == bt->param[i].a[j]));
599 for (j = 0; (j < nrfp); j++)
601 bId = bId && (bt->param[i].c[j] == b->c[j]);
605 sprintf(errbuf, "Overriding %s parameters.%s",
606 interaction_function[ftype].longname,
608 "\nUse dihedraltype 9 to allow several multiplicity terms. Only consecutive lines are combined. Non-consective lines overwrite each other."
611 fprintf(stderr, " old: ");
612 for (j = 0; (j < nrfp); j++)
614 fprintf(stderr, " %g", bt->param[i].c[j]);
616 fprintf(stderr, " \n new: %s\n\n", line);
620 for (j = 0; (j < nrfp); j++)
622 bt->param[i].c[j] = b->c[j];
633 /* fill the arrays up and down */
634 memcpy(bt->param[bt->nr].c, b->c, sizeof(b->c));
635 memcpy(bt->param[bt->nr].a, b->a, sizeof(b->a));
636 memcpy(bt->param[bt->nr+1].c, b->c, sizeof(b->c));
638 /* The definitions of linear angles depend on the order of atoms,
639 * that means that for atoms i-j-k, with certain parameter a, the
640 * corresponding k-j-i angle will have parameter 1-a.
642 if (ftype == F_LINEAR_ANGLES)
644 bt->param[bt->nr+1].c[0] = 1-bt->param[bt->nr+1].c[0];
645 bt->param[bt->nr+1].c[2] = 1-bt->param[bt->nr+1].c[2];
648 for (j = 0; (j < nral); j++)
650 bt->param[bt->nr+1].a[j] = b->a[nral-1-j];
657 void push_bt(directive d, t_params bt[], int nral,
659 t_bond_atomtype bat, char *line,
662 const char *formal[MAXATOMLIST+1] = {
671 const char *formnl[MAXATOMLIST+1] = {
677 "%*s%*s%*s%*s%*s%*s",
678 "%*s%*s%*s%*s%*s%*s%*s"
680 const char *formlf = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
681 int i, ft, ftype, nn, nrfp, nrfpA;
683 char alc[MAXATOMLIST+1][20];
684 /* One force parameter more, so we can check if we read too many */
685 double c[MAXFORCEPARAM+1];
689 if ((bat && at) || (!bat && !at))
691 gmx_incons("You should pass either bat or at to push_bt");
694 /* Make format string (nral ints+functype) */
695 if ((nn = sscanf(line, formal[nral],
696 alc[0], alc[1], alc[2], alc[3], alc[4], alc[5])) != nral+1)
698 sprintf(errbuf, "Not enough atomtypes (%d instead of %d)", nn-1, nral);
699 warning_error(wi, errbuf);
703 ft = strtol(alc[nral], NULL, 10);
704 ftype = ifunc_index(d, ft);
706 nrfpA = interaction_function[ftype].nrfpA;
707 strcpy(f1, formnl[nral]);
709 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]))
714 /* Copy the B-state from the A-state */
715 copy_B_from_A(ftype, c);
721 warning_error(wi, "Not enough parameters");
723 else if (nn > nrfpA && nn < nrfp)
725 warning_error(wi, "Too many parameters or not enough parameters for topology B");
729 warning_error(wi, "Too many parameters");
731 for (i = nn; (i < nrfp); i++)
737 for (i = 0; (i < nral); i++)
739 if (at && ((p.a[i] = get_atomtype_type(alc[i], at)) == NOTSET))
741 gmx_fatal(FARGS, "Unknown atomtype %s\n", alc[i]);
743 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
745 gmx_fatal(FARGS, "Unknown bond_atomtype %s\n", alc[i]);
748 for (i = 0; (i < nrfp); i++)
752 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
756 void push_dihedraltype(directive d, t_params bt[],
757 t_bond_atomtype bat, char *line,
760 const char *formal[MAXATOMLIST+1] = {
769 const char *formnl[MAXATOMLIST+1] = {
775 "%*s%*s%*s%*s%*s%*s",
776 "%*s%*s%*s%*s%*s%*s%*s"
778 const char *formlf[MAXFORCEPARAM] = {
784 "%lf%lf%lf%lf%lf%lf",
785 "%lf%lf%lf%lf%lf%lf%lf",
786 "%lf%lf%lf%lf%lf%lf%lf%lf",
787 "%lf%lf%lf%lf%lf%lf%lf%lf%lf",
788 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
789 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
790 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
792 int i, ft, ftype, nn, nrfp, nrfpA, nral;
794 char alc[MAXATOMLIST+1][20];
795 double c[MAXFORCEPARAM];
797 gmx_bool bAllowRepeat;
800 /* This routine accepts dihedraltypes defined from either 2 or 4 atoms.
802 * We first check for 2 atoms with the 3th column being an integer
803 * defining the type. If this isn't the case, we try it with 4 atoms
804 * and the 5th column defining the dihedral type.
806 nn = sscanf(line, formal[4], alc[0], alc[1], alc[2], alc[3], alc[4]);
807 if (nn >= 3 && strlen(alc[2]) == 1 && isdigit(alc[2][0]))
810 ft = strtol(alc[nral], NULL, 10);
811 /* Move atom types around a bit and use 'X' for wildcard atoms
812 * to create a 4-atom dihedral definition with arbitrary atoms in
815 if (alc[2][0] == '2')
817 /* improper - the two atomtypes are 1,4. Use wildcards for 2,3 */
818 strcpy(alc[3], alc[1]);
819 sprintf(alc[2], "X");
820 sprintf(alc[1], "X");
821 /* alc[0] stays put */
825 /* proper - the two atomtypes are 2,3. Use wildcards for 1,4 */
826 sprintf(alc[3], "X");
827 strcpy(alc[2], alc[1]);
828 strcpy(alc[1], alc[0]);
829 sprintf(alc[0], "X");
832 else if (nn == 5 && strlen(alc[4]) == 1 && isdigit(alc[4][0]))
835 ft = strtol(alc[nral], NULL, 10);
839 sprintf(errbuf, "Incorrect number of atomtypes for dihedral (%d instead of 2 or 4)", nn-1);
840 warning_error(wi, errbuf);
846 /* Previously, we have always overwritten parameters if e.g. a torsion
847 with the same atomtypes occurs on multiple lines. However, CHARMM and
848 some other force fields specify multiple dihedrals over some bonds,
849 including cosines with multiplicity 6 and somethimes even higher.
850 Thus, they cannot be represented with Ryckaert-Bellemans terms.
851 To add support for these force fields, Dihedral type 9 is identical to
852 normal proper dihedrals, but repeated entries are allowed.
859 bAllowRepeat = FALSE;
863 ftype = ifunc_index(d, ft);
865 nrfpA = interaction_function[ftype].nrfpA;
867 strcpy(f1, formnl[nral]);
868 strcat(f1, formlf[nrfp-1]);
870 /* Check number of parameters given */
871 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]))
876 /* Copy the B-state from the A-state */
877 copy_B_from_A(ftype, c);
883 warning_error(wi, "Not enough parameters");
885 else if (nn > nrfpA && nn < nrfp)
887 warning_error(wi, "Too many parameters or not enough parameters for topology B");
891 warning_error(wi, "Too many parameters");
893 for (i = nn; (i < nrfp); i++)
900 for (i = 0; (i < 4); i++)
902 if (!strcmp(alc[i], "X"))
908 if ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET)
910 gmx_fatal(FARGS, "Unknown bond_atomtype %s", alc[i]);
914 for (i = 0; (i < nrfp); i++)
918 /* Always use 4 atoms here, since we created two wildcard atoms
919 * if there wasn't of them 4 already.
921 push_bondtype (&(bt[ftype]), &p, 4, ftype, bAllowRepeat, line, wi);
925 void push_nbt(directive d, t_nbparam **nbt, gpp_atomtype_t atype,
926 char *pline, int nb_funct,
930 const char *form3 = "%*s%*s%*s%lf%lf%lf";
931 const char *form4 = "%*s%*s%*s%lf%lf%lf%lf";
932 const char *form5 = "%*s%*s%*s%lf%lf%lf%lf%lf";
934 int i, f, n, ftype, nrfp;
942 if (sscanf (pline, "%s%s%d", a0, a1, &f) != 3)
948 ftype = ifunc_index(d, f);
950 if (ftype != nb_funct)
952 sprintf(errbuf, "Trying to add %s while the default nonbond type is %s",
953 interaction_function[ftype].longname,
954 interaction_function[nb_funct].longname);
955 warning_error(wi, errbuf);
959 /* Get the force parameters */
963 n = sscanf(pline, form4, &c[0], &c[1], &c[2], &c[3]);
969 /* When the B topology parameters are not set,
970 * copy them from topology A
972 GMX_ASSERT(nrfp <= 4, "LJ-14 cannot have more than 4 parameters");
973 for (i = n; i < nrfp; i++)
978 else if (ftype == F_LJC14_Q)
980 n = sscanf(pline, form5, &c[0], &c[1], &c[2], &c[3], &dum);
983 incorrect_n_param(wi);
989 if (sscanf(pline, form3, &c[0], &c[1], &dum) != 2)
991 incorrect_n_param(wi);
997 if (sscanf(pline, form4, &c[0], &c[1], &c[2], &dum) != 3)
999 incorrect_n_param(wi);
1005 gmx_fatal(FARGS, "Number of force parameters for nonbonded interactions is %d"
1006 " in file %s, line %d", nrfp, __FILE__, __LINE__);
1008 for (i = 0; (i < nrfp); i++)
1013 /* Put the parameters in the matrix */
1014 if ((ai = get_atomtype_type (a0, atype)) == NOTSET)
1016 gmx_fatal(FARGS, "Atomtype %s not found", a0);
1018 if ((aj = get_atomtype_type (a1, atype)) == NOTSET)
1020 gmx_fatal(FARGS, "Atomtype %s not found", a1);
1022 nbp = &(nbt[std::max(ai, aj)][std::min(ai, aj)]);
1027 for (i = 0; i < nrfp; i++)
1029 bId = bId && (nbp->c[i] == cr[i]);
1033 sprintf(errbuf, "Overriding non-bonded parameters,");
1034 warning(wi, errbuf);
1035 fprintf(stderr, " old:");
1036 for (i = 0; i < nrfp; i++)
1038 fprintf(stderr, " %g", nbp->c[i]);
1040 fprintf(stderr, " new\n%s\n", pline);
1044 for (i = 0; i < nrfp; i++)
1051 push_gb_params (gpp_atomtype_t at, char *line,
1055 double radius, vol, surftens, gb_radius, S_hct;
1056 char atypename[STRLEN];
1057 char errbuf[STRLEN];
1059 if ( (sscanf(line, "%s%lf%lf%lf%lf%lf", atypename, &radius, &vol, &surftens, &gb_radius, &S_hct)) != 6)
1061 sprintf(errbuf, "Too few gb parameters for type %s\n", atypename);
1062 warning(wi, errbuf);
1065 /* Search for atomtype */
1066 atype = get_atomtype_type(atypename, at);
1068 if (atype == NOTSET)
1070 printf("Couldn't find topology match for atomtype %s\n", atypename);
1074 set_atomtype_gbparam(at, atype, radius, vol, surftens, gb_radius, S_hct);
1078 push_cmaptype(directive d, t_params bt[], int nral, gpp_atomtype_t at,
1079 t_bond_atomtype bat, char *line,
1082 const char *formal = "%s%s%s%s%s%s%s%s";
1084 int i, ft, ftype, nn, nrfp, nrfpA, nrfpB;
1086 int nxcmap, nycmap, ncmap, read_cmap, sl, nct;
1087 char s[20], alc[MAXATOMLIST+2][20];
1091 /* Keep the compiler happy */
1095 if ((nn = sscanf(line, formal, alc[0], alc[1], alc[2], alc[3], alc[4], alc[5], alc[6], alc[7])) != nral+3)
1097 sprintf(errbuf, "Incorrect number of atomtypes for cmap (%d instead of 5)", nn-1);
1098 warning_error(wi, errbuf);
1102 /* Compute an offset for each line where the cmap parameters start
1103 * ie. where the atom types and grid spacing information ends
1105 for (i = 0; i < nn; i++)
1107 start += (int)strlen(alc[i]);
1110 /* There are nn-1 spaces between the atom types and the grid spacing info in the cmap.itp file */
1111 /* start is the position on the line where we start to read the actual cmap grid data from the itp file */
1112 start = start + nn -1;
1114 ft = strtol(alc[nral], NULL, 10);
1115 nxcmap = strtol(alc[nral+1], NULL, 10);
1116 nycmap = strtol(alc[nral+2], NULL, 10);
1118 /* Check for equal grid spacing in x and y dims */
1119 if (nxcmap != nycmap)
1121 gmx_fatal(FARGS, "Not the same grid spacing in x and y for cmap grid: x=%d, y=%d", nxcmap, nycmap);
1124 ncmap = nxcmap*nycmap;
1125 ftype = ifunc_index(d, ft);
1126 nrfpA = strtol(alc[6], NULL, 10)*strtol(alc[6], NULL, 10);
1127 nrfpB = strtol(alc[7], NULL, 10)*strtol(alc[7], NULL, 10);
1130 /* Allocate memory for the CMAP grid */
1131 bt[F_CMAP].ncmap += nrfp;
1132 srenew(bt[F_CMAP].cmap, bt[F_CMAP].ncmap);
1134 /* Read in CMAP parameters */
1136 for (i = 0; i < ncmap; i++)
1138 while (isspace(*(line+start+sl)))
1142 nn = sscanf(line+start+sl, " %s ", s);
1144 bt[F_CMAP].cmap[i+(bt[F_CMAP].ncmap)-nrfp] = strtod(s, NULL);
1152 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]);
1157 /* Check do that we got the number of parameters we expected */
1158 if (read_cmap == nrfpA)
1160 for (i = 0; i < ncmap; i++)
1162 bt[F_CMAP].cmap[i+ncmap] = bt[F_CMAP].cmap[i];
1167 if (read_cmap < nrfpA)
1169 warning_error(wi, "Not enough cmap parameters");
1171 else if (read_cmap > nrfpA && read_cmap < nrfp)
1173 warning_error(wi, "Too many cmap parameters or not enough parameters for topology B");
1175 else if (read_cmap > nrfp)
1177 warning_error(wi, "Too many cmap parameters");
1182 /* Set grid spacing and the number of grids (we assume these numbers to be the same for all grids
1183 * so we can safely assign them each time
1185 bt[F_CMAP].grid_spacing = nxcmap; /* Or nycmap, they need to be equal */
1186 bt[F_CMAP].nc = bt[F_CMAP].nc + 1; /* Since we are incrementing here, we need to subtract later, see (*****) */
1187 nct = (nral+1) * bt[F_CMAP].nc;
1189 /* Allocate memory for the cmap_types information */
1190 srenew(bt[F_CMAP].cmap_types, nct);
1192 for (i = 0; (i < nral); i++)
1194 if (at && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1196 gmx_fatal(FARGS, "Unknown atomtype %s\n", alc[i]);
1198 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1200 gmx_fatal(FARGS, "Unknown bond_atomtype %s\n", alc[i]);
1203 /* Assign a grid number to each cmap_type */
1204 bt[F_CMAP].cmap_types[bt[F_CMAP].nct++] = get_bond_atomtype_type(alc[i], bat);
1207 /* Assign a type number to this cmap */
1208 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 (****) */
1210 /* Check for the correct number of atoms (again) */
1211 if (bt[F_CMAP].nct != nct)
1213 gmx_fatal(FARGS, "Incorrect number of atom types (%d) in cmap type %d\n", nct, bt[F_CMAP].nc);
1216 /* Is this correct?? */
1217 for (i = 0; i < MAXFORCEPARAM; i++)
1222 /* Push the bond to the bondlist */
1223 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
1227 static void push_atom_now(t_symtab *symtab, t_atoms *at, int atomnr,
1229 int type, char *ctype, int ptype,
1231 char *resname, char *name, real m0, real q0,
1232 int typeB, char *ctypeB, real mB, real qB)
1234 int j, resind = 0, resnr;
1238 if (((nr == 0) && (atomnr != 1)) || (nr && (atomnr != at->nr+1)))
1240 gmx_fatal(FARGS, "Atoms in the .top are not numbered consecutively from 1 (rather, atomnr = %d, while at->nr = %d)", atomnr, at->nr);
1243 j = strlen(resnumberic) - 1;
1244 if (isdigit(resnumberic[j]))
1250 ric = resnumberic[j];
1251 if (j == 0 || !isdigit(resnumberic[j-1]))
1253 gmx_fatal(FARGS, "Invalid residue number '%s' for atom %d",
1254 resnumberic, atomnr);
1257 resnr = strtol(resnumberic, NULL, 10);
1261 resind = at->atom[nr-1].resind;
1263 if (nr == 0 || strcmp(resname, *at->resinfo[resind].name) != 0 ||
1264 resnr != at->resinfo[resind].nr ||
1265 ric != at->resinfo[resind].ic)
1275 at->nres = resind + 1;
1276 srenew(at->resinfo, at->nres);
1277 at->resinfo[resind].name = put_symtab(symtab, resname);
1278 at->resinfo[resind].nr = resnr;
1279 at->resinfo[resind].ic = ric;
1283 resind = at->atom[at->nr-1].resind;
1286 /* New atom instance
1287 * get new space for arrays
1289 srenew(at->atom, nr+1);
1290 srenew(at->atomname, nr+1);
1291 srenew(at->atomtype, nr+1);
1292 srenew(at->atomtypeB, nr+1);
1295 at->atom[nr].type = type;
1296 at->atom[nr].ptype = ptype;
1297 at->atom[nr].q = q0;
1298 at->atom[nr].m = m0;
1299 at->atom[nr].typeB = typeB;
1300 at->atom[nr].qB = qB;
1301 at->atom[nr].mB = mB;
1303 at->atom[nr].resind = resind;
1304 at->atom[nr].atomnumber = atomicnumber;
1305 at->atomname[nr] = put_symtab(symtab, name);
1306 at->atomtype[nr] = put_symtab(symtab, ctype);
1307 at->atomtypeB[nr] = put_symtab(symtab, ctypeB);
1311 void push_cg(t_block *block, int *lastindex, int index, int a)
1315 fprintf (debug, "Index %d, Atom %d\n", index, a);
1318 if (((block->nr) && (*lastindex != index)) || (!block->nr))
1320 /* add a new block */
1322 srenew(block->index, block->nr+1);
1324 block->index[block->nr] = a + 1;
1328 void push_atom(t_symtab *symtab, t_block *cgs,
1329 t_atoms *at, gpp_atomtype_t atype, char *line, int *lastcg,
1333 int cgnumber, atomnr, type, typeB, nscan;
1334 char id[STRLEN], ctype[STRLEN], ctypeB[STRLEN],
1335 resnumberic[STRLEN], resname[STRLEN], name[STRLEN], check[STRLEN];
1336 double m, q, mb, qb;
1337 real m0, q0, mB, qB;
1339 /* Make a shortcut for writing in this molecule */
1342 /* Fixed parameters */
1343 if (sscanf(line, "%s%s%s%s%s%d",
1344 id, ctype, resnumberic, resname, name, &cgnumber) != 6)
1349 sscanf(id, "%d", &atomnr);
1350 if ((type = get_atomtype_type(ctype, atype)) == NOTSET)
1352 gmx_fatal(FARGS, "Atomtype %s not found", ctype);
1354 ptype = get_atomtype_ptype(type, atype);
1356 /* Set default from type */
1357 q0 = get_atomtype_qA(type, atype);
1358 m0 = get_atomtype_massA(type, atype);
1363 /* Optional parameters */
1364 nscan = sscanf(line, "%*s%*s%*s%*s%*s%*s%lf%lf%s%lf%lf%s",
1365 &q, &m, ctypeB, &qb, &mb, check);
1367 /* Nasty switch that falls thru all the way down! */
1376 if ((typeB = get_atomtype_type(ctypeB, atype)) == NOTSET)
1378 gmx_fatal(FARGS, "Atomtype %s not found", ctypeB);
1380 qB = get_atomtype_qA(typeB, atype);
1381 mB = get_atomtype_massA(typeB, atype);
1390 warning_error(wi, "Too many parameters");
1399 fprintf(debug, "mB=%g, qB=%g, typeB=%d\n", mB, qB, typeB);
1402 push_cg(cgs, lastcg, cgnumber, nr);
1404 push_atom_now(symtab, at, atomnr, get_atomtype_atomnumber(type, atype),
1405 type, ctype, ptype, resnumberic,
1406 resname, name, m0, q0, typeB,
1407 typeB == type ? ctype : ctypeB, mB, qB);
1410 void push_molt(t_symtab *symtab, int *nmol, t_molinfo **mol, char *line,
1417 if ((sscanf(line, "%s%d", type, &nrexcl)) != 2)
1419 warning_error(wi, "Expected a molecule type name and nrexcl");
1422 /* Test if this moleculetype overwrites another */
1426 if (strcmp(*((*mol)[i].name), type) == 0)
1428 gmx_fatal(FARGS, "moleculetype %s is redefined", type);
1434 srenew(*mol, *nmol);
1435 newmol = &((*mol)[*nmol-1]);
1436 init_molinfo(newmol);
1438 /* Fill in the values */
1439 newmol->name = put_symtab(symtab, type);
1440 newmol->nrexcl = nrexcl;
1441 newmol->excl_set = FALSE;
1444 static gmx_bool default_nb_params(int ftype, t_params bt[], t_atoms *at,
1445 t_param *p, int c_start, gmx_bool bB, gmx_bool bGenPairs)
1447 int i, j, ti, tj, ntype;
1450 int nr = bt[ftype].nr;
1451 int nral = NRAL(ftype);
1452 int nrfp = interaction_function[ftype].nrfpA;
1453 int nrfpB = interaction_function[ftype].nrfpB;
1455 if ((!bB && nrfp == 0) || (bB && nrfpB == 0))
1463 /* First test the generated-pair position to save
1464 * time when we have 1000*1000 entries for e.g. OPLS...
1466 ntype = static_cast<int>(std::sqrt(static_cast<double>(nr)));
1467 GMX_ASSERT(ntype * ntype == nr, "Number of pairs of generated non-bonded parameters should be a perfect square");
1470 ti = at->atom[p->a[0]].typeB;
1471 tj = at->atom[p->a[1]].typeB;
1475 ti = at->atom[p->a[0]].type;
1476 tj = at->atom[p->a[1]].type;
1478 pi = &(bt[ftype].param[ntype*ti+tj]);
1479 bFound = ((ti == pi->a[0]) && (tj == pi->a[1]));
1482 /* Search explicitly if we didnt find it */
1485 for (i = 0; ((i < nr) && !bFound); i++)
1487 pi = &(bt[ftype].param[i]);
1490 for (j = 0; ((j < nral) &&
1491 (at->atom[p->a[j]].typeB == pi->a[j])); j++)
1498 for (j = 0; ((j < nral) &&
1499 (at->atom[p->a[j]].type == pi->a[j])); j++)
1504 bFound = (j == nral);
1512 if (nrfp+nrfpB > MAXFORCEPARAM)
1514 gmx_incons("Too many force parameters");
1516 for (j = c_start; (j < nrfpB); j++)
1518 p->c[nrfp+j] = pi->c[j];
1523 for (j = c_start; (j < nrfp); j++)
1531 for (j = c_start; (j < nrfp); j++)
1539 static gmx_bool default_cmap_params(t_params bondtype[],
1540 t_atoms *at, gpp_atomtype_t atype,
1541 t_param *p, gmx_bool bB,
1542 int *cmap_type, int *nparam_def)
1544 int i, nparam_found;
1546 gmx_bool bFound = FALSE;
1551 /* Match the current cmap angle against the list of cmap_types */
1552 for (i = 0; i < bondtype[F_CMAP].nct && !bFound; i += 6)
1561 (get_atomtype_batype(at->atom[p->a[0]].type, atype) == bondtype[F_CMAP].cmap_types[i]) &&
1562 (get_atomtype_batype(at->atom[p->a[1]].type, atype) == bondtype[F_CMAP].cmap_types[i+1]) &&
1563 (get_atomtype_batype(at->atom[p->a[2]].type, atype) == bondtype[F_CMAP].cmap_types[i+2]) &&
1564 (get_atomtype_batype(at->atom[p->a[3]].type, atype) == bondtype[F_CMAP].cmap_types[i+3]) &&
1565 (get_atomtype_batype(at->atom[p->a[4]].type, atype) == bondtype[F_CMAP].cmap_types[i+4]))
1567 /* Found cmap torsion */
1569 ct = bondtype[F_CMAP].cmap_types[i+5];
1575 /* If we did not find a matching type for this cmap torsion */
1578 gmx_fatal(FARGS, "Unknown cmap torsion between atoms %d %d %d %d %d\n",
1579 p->a[0]+1, p->a[1]+1, p->a[2]+1, p->a[3]+1, p->a[4]+1);
1582 *nparam_def = nparam_found;
1588 static gmx_bool default_params(int ftype, t_params bt[],
1589 t_atoms *at, gpp_atomtype_t atype,
1590 t_param *p, gmx_bool bB,
1591 t_param **param_def,
1594 int i, j, nparam_found;
1595 gmx_bool bFound, bSame;
1598 int nr = bt[ftype].nr;
1599 int nral = NRAL(ftype);
1600 int nrfpA = interaction_function[ftype].nrfpA;
1601 int nrfpB = interaction_function[ftype].nrfpB;
1603 if ((!bB && nrfpA == 0) || (bB && nrfpB == 0))
1609 /* We allow wildcards now. The first type (with or without wildcards) that
1610 * fits is used, so you should probably put the wildcarded bondtypes
1611 * at the end of each section.
1615 /* OPLS uses 1000s of dihedraltypes, so in order to speed up the scanning we have a
1616 * special case for this. Check for B state outside loop to speed it up.
1618 if (ftype == F_PDIHS || ftype == F_RBDIHS || ftype == F_IDIHS || ftype == F_PIDIHS)
1622 for (i = 0; ((i < nr) && !bFound); i++)
1624 pi = &(bt[ftype].param[i]);
1627 ((pi->ai() == -1) || (get_atomtype_batype(at->atom[p->ai()].typeB, atype) == pi->ai())) &&
1628 ((pi->aj() == -1) || (get_atomtype_batype(at->atom[p->aj()].typeB, atype) == pi->aj())) &&
1629 ((pi->ak() == -1) || (get_atomtype_batype(at->atom[p->ak()].typeB, atype) == pi->ak())) &&
1630 ((pi->al() == -1) || (get_atomtype_batype(at->atom[p->al()].typeB, atype) == pi->al()))
1637 for (i = 0; ((i < nr) && !bFound); i++)
1639 pi = &(bt[ftype].param[i]);
1642 ((pi->ai() == -1) || (get_atomtype_batype(at->atom[p->ai()].type, atype) == pi->ai())) &&
1643 ((pi->aj() == -1) || (get_atomtype_batype(at->atom[p->aj()].type, atype) == pi->aj())) &&
1644 ((pi->ak() == -1) || (get_atomtype_batype(at->atom[p->ak()].type, atype) == pi->ak())) &&
1645 ((pi->al() == -1) || (get_atomtype_batype(at->atom[p->al()].type, atype) == pi->al()))
1649 /* Find additional matches for this dihedral - necessary for ftype==9 which is used e.g. for charmm.
1650 * The rules in that case is that additional matches HAVE to be on adjacent lines!
1656 /* Continue from current i value */
1657 for (j = i+1; j < nr && bSame; j += 2)
1659 pj = &(bt[ftype].param[j]);
1660 bSame = (pi->ai() == pj->ai() && pi->aj() == pj->aj() && pi->ak() == pj->ak() && pi->al() == pj->al());
1665 /* nparam_found will be increased as long as the numbers match */
1669 else /* Not a dihedral */
1671 for (i = 0; ((i < nr) && !bFound); i++)
1673 pi = &(bt[ftype].param[i]);
1676 for (j = 0; ((j < nral) &&
1677 (get_atomtype_batype(at->atom[p->a[j]].typeB, atype) == pi->a[j])); j++)
1684 for (j = 0; ((j < nral) &&
1685 (get_atomtype_batype(at->atom[p->a[j]].type, atype) == pi->a[j])); j++)
1690 bFound = (j == nral);
1699 *nparam_def = nparam_found;
1706 void push_bond(directive d, t_params bondtype[], t_params bond[],
1707 t_atoms *at, gpp_atomtype_t atype, char *line,
1708 gmx_bool bBonded, gmx_bool bGenPairs, real fudgeQQ,
1709 gmx_bool bZero, gmx_bool *bWarn_copy_A_B,
1712 const char *aaformat[MAXATOMLIST] = {
1720 const char *asformat[MAXATOMLIST] = {
1725 "%*s%*s%*s%*s%*s%*s",
1726 "%*s%*s%*s%*s%*s%*s%*s"
1728 const char *ccformat = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
1729 int nr, i, j, nral, nral_fmt, nread, ftype;
1730 char format[STRLEN];
1731 /* One force parameter more, so we can check if we read too many */
1732 double cc[MAXFORCEPARAM+1];
1733 int aa[MAXATOMLIST+1];
1734 t_param param, *param_defA, *param_defB;
1735 gmx_bool bFoundA = FALSE, bFoundB = FALSE, bDef, bPert, bSwapParity = FALSE;
1736 int nparam_defA, nparam_defB;
1739 nparam_defA = nparam_defB = 0;
1741 ftype = ifunc_index(d, 1);
1743 for (j = 0; j < MAXATOMLIST; j++)
1747 bDef = (NRFP(ftype) > 0);
1749 if (ftype == F_SETTLE)
1751 /* SETTLE acts on 3 atoms, but the topology format only specifies
1752 * the first atom (for historical reasons).
1761 nread = sscanf(line, aaformat[nral_fmt-1],
1762 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
1764 if (ftype == F_SETTLE)
1771 if (nread < nral_fmt)
1776 else if (nread > nral_fmt)
1778 /* this is a hack to allow for virtual sites with swapped parity */
1779 bSwapParity = (aa[nral] < 0);
1782 aa[nral] = -aa[nral];
1784 ftype = ifunc_index(d, aa[nral]);
1793 gmx_fatal(FARGS, "Negative function types only allowed for %s and %s",
1794 interaction_function[F_VSITE3FAD].longname,
1795 interaction_function[F_VSITE3OUT].longname);
1801 /* Check for double atoms and atoms out of bounds */
1802 for (i = 0; (i < nral); i++)
1804 if (aa[i] < 1 || aa[i] > at->nr)
1806 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
1807 "Atom index (%d) in %s out of bounds (1-%d).\n"
1808 "This probably means that you have inserted topology section \"%s\"\n"
1809 "in a part belonging to a different molecule than you intended to.\n"
1810 "In that case move the \"%s\" section to the right molecule.",
1811 get_warning_file(wi), get_warning_line(wi),
1812 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
1814 for (j = i+1; (j < nral); j++)
1818 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
1819 warning(wi, errbuf);
1824 /* default force parameters */
1825 for (j = 0; (j < MAXATOMLIST); j++)
1827 param.a[j] = aa[j]-1;
1829 for (j = 0; (j < MAXFORCEPARAM); j++)
1834 /* Get force params for normal and free energy perturbation
1835 * studies, as determined by types!
1840 bFoundA = default_params(ftype, bondtype, at, atype, ¶m, FALSE, ¶m_defA, &nparam_defA);
1843 /* Copy the A-state and B-state default parameters. */
1844 GMX_ASSERT(NRFPA(ftype)+NRFPB(ftype) <= MAXFORCEPARAM, "Bonded interactions may have at most 12 parameters");
1845 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
1847 param.c[j] = param_defA->c[j];
1850 bFoundB = default_params(ftype, bondtype, at, atype, ¶m, TRUE, ¶m_defB, &nparam_defB);
1853 /* Copy only the B-state default parameters */
1854 for (j = NRFPA(ftype); (j < NRFP(ftype)); j++)
1856 param.c[j] = param_defB->c[j];
1860 else if (ftype == F_LJ14)
1862 bFoundA = default_nb_params(ftype, bondtype, at, ¶m, 0, FALSE, bGenPairs);
1863 bFoundB = default_nb_params(ftype, bondtype, at, ¶m, 0, TRUE, bGenPairs);
1865 else if (ftype == F_LJC14_Q)
1867 param.c[0] = fudgeQQ;
1868 /* Fill in the A-state charges as default parameters */
1869 param.c[1] = at->atom[param.a[0]].q;
1870 param.c[2] = at->atom[param.a[1]].q;
1871 /* The default LJ parameters are the standard 1-4 parameters */
1872 bFoundA = default_nb_params(F_LJ14, bondtype, at, ¶m, 3, FALSE, bGenPairs);
1875 else if (ftype == F_LJC_PAIRS_NB)
1877 /* Defaults are not supported here */
1883 gmx_incons("Unknown function type in push_bond");
1886 if (nread > nral_fmt)
1888 /* Manually specified parameters - in this case we discard multiple torsion info! */
1890 strcpy(format, asformat[nral_fmt-1]);
1891 strcat(format, ccformat);
1893 nread = sscanf(line, format, &cc[0], &cc[1], &cc[2], &cc[3], &cc[4], &cc[5],
1894 &cc[6], &cc[7], &cc[8], &cc[9], &cc[10], &cc[11], &cc[12]);
1896 if ((nread == NRFPA(ftype)) && (NRFPB(ftype) != 0))
1898 /* We only have to issue a warning if these atoms are perturbed! */
1900 for (j = 0; (j < nral); j++)
1902 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
1905 if (bPert && *bWarn_copy_A_B)
1908 "Some parameters for bonded interaction involving perturbed atoms are specified explicitly in state A, but not B - copying A to B");
1909 warning(wi, errbuf);
1910 *bWarn_copy_A_B = FALSE;
1913 /* If only the A parameters were specified, copy them to the B state */
1914 /* The B-state parameters correspond to the first nrfpB
1915 * A-state parameters.
1917 for (j = 0; (j < NRFPB(ftype)); j++)
1919 cc[nread++] = cc[j];
1923 /* If nread was 0 or EOF, no parameters were read => use defaults.
1924 * If nread was nrfpA we copied above so nread=nrfp.
1925 * If nread was nrfp we are cool.
1926 * For F_LJC14_Q we allow supplying fudgeQQ only.
1927 * Anything else is an error!
1929 if ((nread != 0) && (nread != EOF) && (nread != NRFP(ftype)) &&
1930 !(ftype == F_LJC14_Q && nread == 1))
1932 gmx_fatal(FARGS, "Incorrect number of parameters - found %d, expected %d or %d for %s.",
1933 nread, NRFPA(ftype), NRFP(ftype),
1934 interaction_function[ftype].longname);
1937 for (j = 0; (j < nread); j++)
1942 /* Check whether we have to use the defaults */
1943 if (nread == NRFP(ftype))
1952 /* nread now holds the number of force parameters read! */
1957 /* When we have multiple terms it would be very dangerous to allow perturbations to a different atom type! */
1958 if (ftype == F_PDIHS)
1960 if ((nparam_defA != nparam_defB) || ((nparam_defA > 1 || nparam_defB > 1) && (param_defA != param_defB)))
1963 "Cannot automatically perturb a torsion with multiple terms to different form.\n"
1964 "Please specify perturbed parameters manually for this torsion in your topology!");
1965 warning_error(wi, errbuf);
1969 if (nread > 0 && nread < NRFPA(ftype))
1971 /* Issue an error, do not use defaults */
1972 sprintf(errbuf, "Not enough parameters, there should be at least %d (or 0 for defaults)", NRFPA(ftype));
1973 warning_error(wi, errbuf);
1976 if (nread == 0 || nread == EOF)
1980 if (interaction_function[ftype].flags & IF_VSITE)
1982 /* set them to NOTSET, will be calculated later */
1983 for (j = 0; (j < MAXFORCEPARAM); j++)
1985 param.c[j] = NOTSET;
1990 param.c1() = -1; /* flag to swap parity of vsite construction */
1997 fprintf(stderr, "NOTE: No default %s types, using zeroes\n",
1998 interaction_function[ftype].longname);
2002 sprintf(errbuf, "No default %s types", interaction_function[ftype].longname);
2003 warning_error(wi, errbuf);
2014 param.c0() = 360 - param.c0();
2017 param.c2() = -param.c2();
2024 /* We only have to issue a warning if these atoms are perturbed! */
2026 for (j = 0; (j < nral); j++)
2028 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
2033 sprintf(errbuf, "No default %s types for perturbed atoms, "
2034 "using normal values", interaction_function[ftype].longname);
2035 warning(wi, errbuf);
2041 if ((ftype == F_PDIHS || ftype == F_ANGRES || ftype == F_ANGRESZ)
2042 && param.c[5] != param.c[2])
2044 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2045 " %s multiplicity can not be perturbed %f!=%f",
2046 get_warning_file(wi), get_warning_line(wi),
2047 interaction_function[ftype].longname,
2048 param.c[2], param.c[5]);
2051 if (IS_TABULATED(ftype) && param.c[2] != param.c[0])
2053 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2054 " %s table number can not be perturbed %d!=%d",
2055 get_warning_file(wi), get_warning_line(wi),
2056 interaction_function[ftype].longname,
2057 (int)(param.c[0]+0.5), (int)(param.c[2]+0.5));
2060 /* Dont add R-B dihedrals where all parameters are zero (no interaction) */
2061 if (ftype == F_RBDIHS)
2064 for (i = 0; i < NRFP(ftype); i++)
2066 if (param.c[i] != 0)
2077 /* Put the values in the appropriate arrays */
2078 add_param_to_list (&bond[ftype], ¶m);
2080 /* Push additional torsions from FF for ftype==9 if we have them.
2081 * We have already checked that the A/B states do not differ in this case,
2082 * so we do not have to double-check that again, or the vsite stuff.
2083 * In addition, those torsions cannot be automatically perturbed.
2085 if (bDef && ftype == F_PDIHS)
2087 for (i = 1; i < nparam_defA; i++)
2089 /* Advance pointer! */
2091 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
2093 param.c[j] = param_defA->c[j];
2095 /* And push the next term for this torsion */
2096 add_param_to_list (&bond[ftype], ¶m);
2101 void push_cmap(directive d, t_params bondtype[], t_params bond[],
2102 t_atoms *at, gpp_atomtype_t atype, char *line,
2105 const char *aaformat[MAXATOMLIST+1] =
2116 int i, j, ftype, nral, nread, ncmap_params;
2118 int aa[MAXATOMLIST+1];
2123 ftype = ifunc_index(d, 1);
2127 nread = sscanf(line, aaformat[nral-1],
2128 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
2135 else if (nread == nral)
2137 ftype = ifunc_index(d, 1);
2140 /* Check for double atoms and atoms out of bounds */
2141 for (i = 0; i < nral; i++)
2143 if (aa[i] < 1 || aa[i] > at->nr)
2145 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2146 "Atom index (%d) in %s out of bounds (1-%d).\n"
2147 "This probably means that you have inserted topology section \"%s\"\n"
2148 "in a part belonging to a different molecule than you intended to.\n"
2149 "In that case move the \"%s\" section to the right molecule.",
2150 get_warning_file(wi), get_warning_line(wi),
2151 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
2154 for (j = i+1; (j < nral); j++)
2158 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
2159 warning(wi, errbuf);
2164 /* default force parameters */
2165 for (j = 0; (j < MAXATOMLIST); j++)
2167 param.a[j] = aa[j]-1;
2169 for (j = 0; (j < MAXFORCEPARAM); j++)
2174 /* Get the cmap type for this cmap angle */
2175 bFound = default_cmap_params(bondtype, at, atype, ¶m, FALSE, &cmap_type, &ncmap_params);
2177 /* We want exactly one parameter (the cmap type in state A (currently no state B) back */
2178 if (bFound && ncmap_params == 1)
2180 /* Put the values in the appropriate arrays */
2181 param.c[0] = cmap_type;
2182 add_param_to_list(&bond[ftype], ¶m);
2186 /* This is essentially the same check as in default_cmap_params() done one more time */
2187 gmx_fatal(FARGS, "Unable to assign a cmap type to torsion %d %d %d %d and %d\n",
2188 param.a[0]+1, param.a[1]+1, param.a[2]+1, param.a[3]+1, param.a[4]+1);
2194 void push_vsitesn(directive d, t_params bond[],
2195 t_atoms *at, char *line,
2199 int type, ftype, j, n, ret, nj, a;
2201 double *weight = NULL, weight_tot;
2204 /* default force parameters */
2205 for (j = 0; (j < MAXATOMLIST); j++)
2207 param.a[j] = NOTSET;
2209 for (j = 0; (j < MAXFORCEPARAM); j++)
2215 ret = sscanf(ptr, "%d%n", &a, &n);
2219 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2220 " Expected an atom index in section \"%s\"",
2221 get_warning_file(wi), get_warning_line(wi),
2227 sscanf(ptr, "%d%n", &type, &n);
2229 ftype = ifunc_index(d, type);
2235 ret = sscanf(ptr, "%d%n", &a, &n);
2242 srenew(weight, nj+20);
2251 /* Here we use the A-state mass as a parameter.
2252 * Note that the B-state mass has no influence.
2254 weight[nj] = at->atom[atc[nj]].m;
2258 ret = sscanf(ptr, "%lf%n", &(weight[nj]), &n);
2262 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2263 " No weight or negative weight found for vsiten constructing atom %d (atom index %d)",
2264 get_warning_file(wi), get_warning_line(wi),
2269 gmx_fatal(FARGS, "Unknown vsiten type %d", type);
2271 weight_tot += weight[nj];
2279 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2280 " Expected more than one atom index in section \"%s\"",
2281 get_warning_file(wi), get_warning_line(wi),
2285 if (weight_tot == 0)
2287 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2288 " The total mass of the construting atoms is zero",
2289 get_warning_file(wi), get_warning_line(wi));
2292 for (j = 0; j < nj; j++)
2294 param.a[1] = atc[j];
2296 param.c[1] = weight[j]/weight_tot;
2297 /* Put the values in the appropriate arrays */
2298 add_param_to_list (&bond[ftype], ¶m);
2305 void push_mol(int nrmols, t_molinfo mols[], char *pline, int *whichmol,
2311 if (sscanf(pline, "%s%d", type, nrcopies) != 2)
2317 /* Search moleculename.
2318 * Here we originally only did case insensitive matching. But because
2319 * some PDB files can have many chains and use case to generate more
2320 * chain-identifiers, which in turn end up in our moleculetype name,
2321 * we added support for case-sensitivity.
2327 for (int i = 0; i < nrmols; i++)
2329 if (strcmp(type, *(mols[i].name)) == 0)
2334 if (gmx_strcasecmp(type, *(mols[i].name)) == 0)
2343 // select the case sensitive match
2344 *whichmol = matchcs;
2348 // avoid matching case-insensitive when we have multiple matches
2351 gmx_fatal(FARGS, "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);
2355 // select the unique case insensitive match
2356 *whichmol = matchci;
2360 gmx_fatal(FARGS, "No such moleculetype %s", type);
2365 void init_block2(t_block2 *b2, int natom)
2370 snew(b2->nra, b2->nr);
2371 snew(b2->a, b2->nr);
2372 for (i = 0; (i < b2->nr); i++)
2378 void done_block2(t_block2 *b2)
2384 for (i = 0; (i < b2->nr); i++)
2394 void push_excl(char *line, t_block2 *b2)
2398 char base[STRLEN], format[STRLEN];
2400 if (sscanf(line, "%d", &i) == 0)
2405 if ((1 <= i) && (i <= b2->nr))
2413 fprintf(debug, "Unbound atom %d\n", i-1);
2417 strcpy(base, "%*d");
2420 strcpy(format, base);
2421 strcat(format, "%d");
2422 n = sscanf(line, format, &j);
2425 if ((1 <= j) && (j <= b2->nr))
2428 srenew(b2->a[i], ++(b2->nra[i]));
2429 b2->a[i][b2->nra[i]-1] = j;
2430 /* also add the reverse exclusion! */
2431 srenew(b2->a[j], ++(b2->nra[j]));
2432 b2->a[j][b2->nra[j]-1] = i;
2433 strcat(base, "%*d");
2437 gmx_fatal(FARGS, "Invalid Atomnr j: %d, b2->nr: %d\n", j, b2->nr);
2444 void b_to_b2(t_blocka *b, t_block2 *b2)
2449 for (i = 0; (i < b->nr); i++)
2451 for (j = b->index[i]; (j < b->index[i+1]); j++)
2454 srenew(b2->a[i], ++b2->nra[i]);
2455 b2->a[i][b2->nra[i]-1] = a;
2460 void b2_to_b(t_block2 *b2, t_blocka *b)
2466 for (i = 0; (i < b2->nr); i++)
2469 for (j = 0; (j < b2->nra[i]); j++)
2471 b->a[nra+j] = b2->a[i][j];
2475 /* terminate list */
2479 static int icomp(const void *v1, const void *v2)
2481 return (*((int *) v1))-(*((int *) v2));
2484 void merge_excl(t_blocka *excl, t_block2 *b2)
2494 else if (b2->nr != excl->nr)
2496 gmx_fatal(FARGS, "DEATH HORROR: b2->nr = %d, while excl->nr = %d",
2501 fprintf(debug, "Entering merge_excl\n");
2504 /* First copy all entries from excl to b2 */
2507 /* Count and sort the exclusions */
2509 for (i = 0; (i < b2->nr); i++)
2513 /* remove double entries */
2514 qsort(b2->a[i], (size_t)b2->nra[i], (size_t)sizeof(b2->a[i][0]), icomp);
2516 for (j = 1; (j < b2->nra[i]); j++)
2518 if (b2->a[i][j] != b2->a[i][k-1])
2520 b2->a[i][k] = b2->a[i][j];
2529 srenew(excl->a, excl->nra);
2534 int add_atomtype_decoupled(t_symtab *symtab, gpp_atomtype_t at,
2535 t_nbparam ***nbparam, t_nbparam ***pair)
2541 /* Define an atom type with all parameters set to zero (no interactions) */
2544 /* Type for decoupled atoms could be anything,
2545 * this should be changed automatically later when required.
2547 atom.ptype = eptAtom;
2548 for (i = 0; (i < MAXFORCEPARAM); i++)
2553 nr = add_atomtype(at, symtab, &atom, "decoupled", ¶m, -1, 0.0, 0.0, 0.0, 0, 0, 0);
2555 /* Add space in the non-bonded parameters matrix */
2556 realloc_nb_params(at, nbparam, pair);
2561 static void convert_pairs_to_pairsQ(t_params *plist,
2562 real fudgeQQ, t_atoms *atoms)
2564 t_param *paramp1, *paramp2, *paramnew;
2565 int i, j, p1nr, p2nr, p2newnr;
2567 /* Add the pair list to the pairQ list */
2568 p1nr = plist[F_LJ14].nr;
2569 p2nr = plist[F_LJC14_Q].nr;
2570 p2newnr = p1nr + p2nr;
2571 snew(paramnew, p2newnr);
2573 paramp1 = plist[F_LJ14].param;
2574 paramp2 = plist[F_LJC14_Q].param;
2576 /* Fill in the new F_LJC14_Q array with the old one. NOTE:
2577 it may be possible to just ADD the converted F_LJ14 array
2578 to the old F_LJC14_Q array, but since we have to create
2579 a new sized memory structure, better just to deep copy it all.
2582 for (i = 0; i < p2nr; i++)
2584 /* Copy over parameters */
2585 for (j = 0; j < 5; j++) /* entries are 0-4 for F_LJC14_Q */
2587 paramnew[i].c[j] = paramp2[i].c[j];
2590 /* copy over atoms */
2591 for (j = 0; j < 2; j++)
2593 paramnew[i].a[j] = paramp2[i].a[j];
2597 for (i = p2nr; i < p2newnr; i++)
2601 /* Copy over parameters */
2602 paramnew[i].c[0] = fudgeQQ;
2603 paramnew[i].c[1] = atoms->atom[paramp1[j].a[0]].q;
2604 paramnew[i].c[2] = atoms->atom[paramp1[j].a[1]].q;
2605 paramnew[i].c[3] = paramp1[j].c[0];
2606 paramnew[i].c[4] = paramp1[j].c[1];
2608 /* copy over atoms */
2609 paramnew[i].a[0] = paramp1[j].a[0];
2610 paramnew[i].a[1] = paramp1[j].a[1];
2613 /* free the old pairlists */
2614 sfree(plist[F_LJC14_Q].param);
2615 sfree(plist[F_LJ14].param);
2617 /* now assign the new data to the F_LJC14_Q structure */
2618 plist[F_LJC14_Q].param = paramnew;
2619 plist[F_LJC14_Q].nr = p2newnr;
2621 /* Empty the LJ14 pairlist */
2622 plist[F_LJ14].nr = 0;
2623 plist[F_LJ14].param = NULL;
2626 static void generate_LJCpairsNB(t_molinfo *mol, int nb_funct, t_params *nbp)
2628 int n, ntype, i, j, k;
2635 atom = mol->atoms.atom;
2637 ntype = static_cast<int>(std::sqrt(static_cast<double>(nbp->nr)));
2638 GMX_ASSERT(ntype * ntype == nbp->nr, "Number of pairs of generated non-bonded parameters should be a perfect square");
2640 for (i = 0; i < MAXATOMLIST; i++)
2642 param.a[i] = NOTSET;
2644 for (i = 0; i < MAXFORCEPARAM; i++)
2646 param.c[i] = NOTSET;
2649 /* Add a pair interaction for all non-excluded atom pairs */
2651 for (i = 0; i < n; i++)
2653 for (j = i+1; j < n; j++)
2656 for (k = excl->index[i]; k < excl->index[i+1]; k++)
2658 if (excl->a[k] == j)
2665 if (nb_funct != F_LJ)
2667 gmx_fatal(FARGS, "Can only generate non-bonded pair interactions for Van der Waals type Lennard-Jones");
2671 param.c[0] = atom[i].q;
2672 param.c[1] = atom[j].q;
2673 param.c[2] = nbp->param[ntype*atom[i].type+atom[j].type].c[0];
2674 param.c[3] = nbp->param[ntype*atom[i].type+atom[j].type].c[1];
2675 add_param_to_list(&mol->plist[F_LJC_PAIRS_NB], ¶m);
2681 static void set_excl_all(t_blocka *excl)
2685 /* Get rid of the current exclusions and exclude all atom pairs */
2687 excl->nra = nat*nat;
2688 srenew(excl->a, excl->nra);
2690 for (i = 0; i < nat; i++)
2693 for (j = 0; j < nat; j++)
2698 excl->index[nat] = k;
2701 static void decouple_atoms(t_atoms *atoms, int atomtype_decouple,
2702 int couple_lam0, int couple_lam1,
2703 const char *mol_name)
2707 for (i = 0; i < atoms->nr; i++)
2711 atom = &atoms->atom[i];
2713 if (atom->qB != atom->q || atom->typeB != atom->type)
2715 gmx_fatal(FARGS, "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.",
2716 i + 1, mol_name, "couple-moltype");
2719 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamVDW)
2723 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamQ)
2725 atom->type = atomtype_decouple;
2727 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamVDW)
2731 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamQ)
2733 atom->typeB = atomtype_decouple;
2738 void convert_moltype_couple(t_molinfo *mol, int atomtype_decouple, real fudgeQQ,
2739 int couple_lam0, int couple_lam1,
2740 gmx_bool bCoupleIntra, int nb_funct, t_params *nbp)
2742 convert_pairs_to_pairsQ(mol->plist, fudgeQQ, &mol->atoms);
2745 generate_LJCpairsNB(mol, nb_funct, nbp);
2746 set_excl_all(&mol->excls);
2748 decouple_atoms(&mol->atoms, atomtype_decouple, couple_lam0, couple_lam1,