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",
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%n";
1083 int i, ft, ftype, nn, nrfp, nrfpA, nrfpB;
1084 int start, nchar_consumed;
1085 int nxcmap, nycmap, ncmap, read_cmap, sl, nct;
1086 char s[20], alc[MAXATOMLIST+2][20];
1090 /* Keep the compiler happy */
1094 GMX_ASSERT(nral == 5, "CMAP requires 5 atoms per interaction");
1096 /* Here we can only check for < 8 */
1097 if ((nn = sscanf(line, formal, alc[0], alc[1], alc[2], alc[3], alc[4], alc[5], alc[6], alc[7], &nchar_consumed)) < nral+3)
1099 sprintf(errbuf, "Incorrect number of atomtypes for cmap (%d instead of 5)", nn-1);
1100 warning_error(wi, errbuf);
1103 start += nchar_consumed;
1105 ft = strtol(alc[nral], NULL, 10);
1106 nxcmap = strtol(alc[nral+1], NULL, 10);
1107 nycmap = strtol(alc[nral+2], NULL, 10);
1109 /* Check for equal grid spacing in x and y dims */
1110 if (nxcmap != nycmap)
1112 gmx_fatal(FARGS, "Not the same grid spacing in x and y for cmap grid: x=%d, y=%d", nxcmap, nycmap);
1115 ncmap = nxcmap*nycmap;
1116 ftype = ifunc_index(d, ft);
1117 nrfpA = strtol(alc[6], NULL, 10)*strtol(alc[6], NULL, 10);
1118 nrfpB = strtol(alc[7], NULL, 10)*strtol(alc[7], NULL, 10);
1121 /* Allocate memory for the CMAP grid */
1122 bt[F_CMAP].ncmap += nrfp;
1123 srenew(bt[F_CMAP].cmap, bt[F_CMAP].ncmap);
1125 /* Read in CMAP parameters */
1127 for (i = 0; i < ncmap; i++)
1129 while (isspace(*(line+start+sl)))
1133 nn = sscanf(line+start+sl, " %s ", s);
1135 bt[F_CMAP].cmap[i+(bt[F_CMAP].ncmap)-nrfp] = strtod(s, NULL);
1143 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]);
1148 /* Check do that we got the number of parameters we expected */
1149 if (read_cmap == nrfpA)
1151 for (i = 0; i < ncmap; i++)
1153 bt[F_CMAP].cmap[i+ncmap] = bt[F_CMAP].cmap[i];
1158 if (read_cmap < nrfpA)
1160 warning_error(wi, "Not enough cmap parameters");
1162 else if (read_cmap > nrfpA && read_cmap < nrfp)
1164 warning_error(wi, "Too many cmap parameters or not enough parameters for topology B");
1166 else if (read_cmap > nrfp)
1168 warning_error(wi, "Too many cmap parameters");
1173 /* Set grid spacing and the number of grids (we assume these numbers to be the same for all grids
1174 * so we can safely assign them each time
1176 bt[F_CMAP].grid_spacing = nxcmap; /* Or nycmap, they need to be equal */
1177 bt[F_CMAP].nc = bt[F_CMAP].nc + 1; /* Since we are incrementing here, we need to subtract later, see (*****) */
1178 nct = (nral+1) * bt[F_CMAP].nc;
1180 /* Allocate memory for the cmap_types information */
1181 srenew(bt[F_CMAP].cmap_types, nct);
1183 for (i = 0; (i < nral); i++)
1185 if (at && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1187 gmx_fatal(FARGS, "Unknown atomtype %s\n", alc[i]);
1189 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1191 gmx_fatal(FARGS, "Unknown bond_atomtype %s\n", alc[i]);
1194 /* Assign a grid number to each cmap_type */
1195 bt[F_CMAP].cmap_types[bt[F_CMAP].nct++] = get_bond_atomtype_type(alc[i], bat);
1198 /* Assign a type number to this cmap */
1199 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 (****) */
1201 /* Check for the correct number of atoms (again) */
1202 if (bt[F_CMAP].nct != nct)
1204 gmx_fatal(FARGS, "Incorrect number of atom types (%d) in cmap type %d\n", nct, bt[F_CMAP].nc);
1207 /* Is this correct?? */
1208 for (i = 0; i < MAXFORCEPARAM; i++)
1213 /* Push the bond to the bondlist */
1214 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
1218 static void push_atom_now(t_symtab *symtab, t_atoms *at, int atomnr,
1220 int type, char *ctype, int ptype,
1222 char *resname, char *name, real m0, real q0,
1223 int typeB, char *ctypeB, real mB, real qB)
1225 int j, resind = 0, resnr;
1229 if (((nr == 0) && (atomnr != 1)) || (nr && (atomnr != at->nr+1)))
1231 gmx_fatal(FARGS, "Atoms in the .top are not numbered consecutively from 1 (rather, atomnr = %d, while at->nr = %d)", atomnr, at->nr);
1234 j = strlen(resnumberic) - 1;
1235 if (isdigit(resnumberic[j]))
1241 ric = resnumberic[j];
1242 if (j == 0 || !isdigit(resnumberic[j-1]))
1244 gmx_fatal(FARGS, "Invalid residue number '%s' for atom %d",
1245 resnumberic, atomnr);
1248 resnr = strtol(resnumberic, NULL, 10);
1252 resind = at->atom[nr-1].resind;
1254 if (nr == 0 || strcmp(resname, *at->resinfo[resind].name) != 0 ||
1255 resnr != at->resinfo[resind].nr ||
1256 ric != at->resinfo[resind].ic)
1266 at->nres = resind + 1;
1267 srenew(at->resinfo, at->nres);
1268 at->resinfo[resind].name = put_symtab(symtab, resname);
1269 at->resinfo[resind].nr = resnr;
1270 at->resinfo[resind].ic = ric;
1274 resind = at->atom[at->nr-1].resind;
1277 /* New atom instance
1278 * get new space for arrays
1280 srenew(at->atom, nr+1);
1281 srenew(at->atomname, nr+1);
1282 srenew(at->atomtype, nr+1);
1283 srenew(at->atomtypeB, nr+1);
1286 at->atom[nr].type = type;
1287 at->atom[nr].ptype = ptype;
1288 at->atom[nr].q = q0;
1289 at->atom[nr].m = m0;
1290 at->atom[nr].typeB = typeB;
1291 at->atom[nr].qB = qB;
1292 at->atom[nr].mB = mB;
1294 at->atom[nr].resind = resind;
1295 at->atom[nr].atomnumber = atomicnumber;
1296 at->atomname[nr] = put_symtab(symtab, name);
1297 at->atomtype[nr] = put_symtab(symtab, ctype);
1298 at->atomtypeB[nr] = put_symtab(symtab, ctypeB);
1302 void push_cg(t_block *block, int *lastindex, int index, int a)
1306 fprintf (debug, "Index %d, Atom %d\n", index, a);
1309 if (((block->nr) && (*lastindex != index)) || (!block->nr))
1311 /* add a new block */
1313 srenew(block->index, block->nr+1);
1315 block->index[block->nr] = a + 1;
1319 void push_atom(t_symtab *symtab, t_block *cgs,
1320 t_atoms *at, gpp_atomtype_t atype, char *line, int *lastcg,
1324 int cgnumber, atomnr, type, typeB, nscan;
1325 char id[STRLEN], ctype[STRLEN], ctypeB[STRLEN],
1326 resnumberic[STRLEN], resname[STRLEN], name[STRLEN], check[STRLEN];
1327 double m, q, mb, qb;
1328 real m0, q0, mB, qB;
1330 /* Make a shortcut for writing in this molecule */
1333 /* Fixed parameters */
1334 if (sscanf(line, "%s%s%s%s%s%d",
1335 id, ctype, resnumberic, resname, name, &cgnumber) != 6)
1340 sscanf(id, "%d", &atomnr);
1341 if ((type = get_atomtype_type(ctype, atype)) == NOTSET)
1343 gmx_fatal(FARGS, "Atomtype %s not found", ctype);
1345 ptype = get_atomtype_ptype(type, atype);
1347 /* Set default from type */
1348 q0 = get_atomtype_qA(type, atype);
1349 m0 = get_atomtype_massA(type, atype);
1354 /* Optional parameters */
1355 nscan = sscanf(line, "%*s%*s%*s%*s%*s%*s%lf%lf%s%lf%lf%s",
1356 &q, &m, ctypeB, &qb, &mb, check);
1358 /* Nasty switch that falls thru all the way down! */
1367 if ((typeB = get_atomtype_type(ctypeB, atype)) == NOTSET)
1369 gmx_fatal(FARGS, "Atomtype %s not found", ctypeB);
1371 qB = get_atomtype_qA(typeB, atype);
1372 mB = get_atomtype_massA(typeB, atype);
1381 warning_error(wi, "Too many parameters");
1390 fprintf(debug, "mB=%g, qB=%g, typeB=%d\n", mB, qB, typeB);
1393 push_cg(cgs, lastcg, cgnumber, nr);
1395 push_atom_now(symtab, at, atomnr, get_atomtype_atomnumber(type, atype),
1396 type, ctype, ptype, resnumberic,
1397 resname, name, m0, q0, typeB,
1398 typeB == type ? ctype : ctypeB, mB, qB);
1401 void push_molt(t_symtab *symtab, int *nmol, t_molinfo **mol, char *line,
1408 if ((sscanf(line, "%s%d", type, &nrexcl)) != 2)
1410 warning_error(wi, "Expected a molecule type name and nrexcl");
1413 /* Test if this moleculetype overwrites another */
1417 if (strcmp(*((*mol)[i].name), type) == 0)
1419 gmx_fatal(FARGS, "moleculetype %s is redefined", type);
1425 srenew(*mol, *nmol);
1426 newmol = &((*mol)[*nmol-1]);
1427 init_molinfo(newmol);
1429 /* Fill in the values */
1430 newmol->name = put_symtab(symtab, type);
1431 newmol->nrexcl = nrexcl;
1432 newmol->excl_set = FALSE;
1435 static gmx_bool default_nb_params(int ftype, t_params bt[], t_atoms *at,
1436 t_param *p, int c_start, gmx_bool bB, gmx_bool bGenPairs)
1438 int i, j, ti, tj, ntype;
1441 int nr = bt[ftype].nr;
1442 int nral = NRAL(ftype);
1443 int nrfp = interaction_function[ftype].nrfpA;
1444 int nrfpB = interaction_function[ftype].nrfpB;
1446 if ((!bB && nrfp == 0) || (bB && nrfpB == 0))
1454 /* First test the generated-pair position to save
1455 * time when we have 1000*1000 entries for e.g. OPLS...
1457 ntype = static_cast<int>(std::sqrt(static_cast<double>(nr)));
1458 GMX_ASSERT(ntype * ntype == nr, "Number of pairs of generated non-bonded parameters should be a perfect square");
1461 ti = at->atom[p->a[0]].typeB;
1462 tj = at->atom[p->a[1]].typeB;
1466 ti = at->atom[p->a[0]].type;
1467 tj = at->atom[p->a[1]].type;
1469 pi = &(bt[ftype].param[ntype*ti+tj]);
1470 bFound = ((ti == pi->a[0]) && (tj == pi->a[1]));
1473 /* Search explicitly if we didnt find it */
1476 for (i = 0; ((i < nr) && !bFound); i++)
1478 pi = &(bt[ftype].param[i]);
1481 for (j = 0; ((j < nral) &&
1482 (at->atom[p->a[j]].typeB == pi->a[j])); j++)
1489 for (j = 0; ((j < nral) &&
1490 (at->atom[p->a[j]].type == pi->a[j])); j++)
1495 bFound = (j == nral);
1503 if (nrfp+nrfpB > MAXFORCEPARAM)
1505 gmx_incons("Too many force parameters");
1507 for (j = c_start; (j < nrfpB); j++)
1509 p->c[nrfp+j] = pi->c[j];
1514 for (j = c_start; (j < nrfp); j++)
1522 for (j = c_start; (j < nrfp); j++)
1530 static gmx_bool default_cmap_params(t_params bondtype[],
1531 t_atoms *at, gpp_atomtype_t atype,
1532 t_param *p, gmx_bool bB,
1533 int *cmap_type, int *nparam_def)
1535 int i, nparam_found;
1537 gmx_bool bFound = FALSE;
1542 /* Match the current cmap angle against the list of cmap_types */
1543 for (i = 0; i < bondtype[F_CMAP].nct && !bFound; i += 6)
1552 (get_atomtype_batype(at->atom[p->a[0]].type, atype) == bondtype[F_CMAP].cmap_types[i]) &&
1553 (get_atomtype_batype(at->atom[p->a[1]].type, atype) == bondtype[F_CMAP].cmap_types[i+1]) &&
1554 (get_atomtype_batype(at->atom[p->a[2]].type, atype) == bondtype[F_CMAP].cmap_types[i+2]) &&
1555 (get_atomtype_batype(at->atom[p->a[3]].type, atype) == bondtype[F_CMAP].cmap_types[i+3]) &&
1556 (get_atomtype_batype(at->atom[p->a[4]].type, atype) == bondtype[F_CMAP].cmap_types[i+4]))
1558 /* Found cmap torsion */
1560 ct = bondtype[F_CMAP].cmap_types[i+5];
1566 /* If we did not find a matching type for this cmap torsion */
1569 gmx_fatal(FARGS, "Unknown cmap torsion between atoms %d %d %d %d %d\n",
1570 p->a[0]+1, p->a[1]+1, p->a[2]+1, p->a[3]+1, p->a[4]+1);
1573 *nparam_def = nparam_found;
1579 /* Returns the number of exact atom type matches, i.e. non wild-card matches,
1580 * returns -1 when there are no matches at all.
1582 static int natom_match(t_param *pi,
1583 int type_i, int type_j, int type_k, int type_l,
1584 const gpp_atomtype_t atype)
1586 if ((pi->ai() == -1 || get_atomtype_batype(type_i, atype) == pi->ai()) &&
1587 (pi->aj() == -1 || get_atomtype_batype(type_j, atype) == pi->aj()) &&
1588 (pi->ak() == -1 || get_atomtype_batype(type_k, atype) == pi->ak()) &&
1589 (pi->al() == -1 || get_atomtype_batype(type_l, atype) == pi->al()))
1592 (pi->ai() == -1 ? 0 : 1) +
1593 (pi->aj() == -1 ? 0 : 1) +
1594 (pi->ak() == -1 ? 0 : 1) +
1595 (pi->al() == -1 ? 0 : 1);
1603 static gmx_bool default_params(int ftype, t_params bt[],
1604 t_atoms *at, gpp_atomtype_t atype,
1605 t_param *p, gmx_bool bB,
1606 t_param **param_def,
1610 gmx_bool bFound, bSame;
1613 int nr = bt[ftype].nr;
1614 int nral = NRAL(ftype);
1615 int nrfpA = interaction_function[ftype].nrfpA;
1616 int nrfpB = interaction_function[ftype].nrfpB;
1618 if ((!bB && nrfpA == 0) || (bB && nrfpB == 0))
1626 if (ftype == F_PDIHS || ftype == F_RBDIHS || ftype == F_IDIHS || ftype == F_PIDIHS)
1628 int nmatch_max = -1;
1632 /* For dihedrals we allow wildcards. We choose the first type
1633 * that has the most real matches, i.e. non-wildcard matches.
1635 for (t = 0; ((t < nr) && nmatch_max < 4); t++)
1640 pt = &(bt[ftype].param[t]);
1643 nmatch = natom_match(pt, at->atom[p->ai()].typeB, at->atom[p->aj()].typeB, at->atom[p->ak()].typeB, at->atom[p->al()].typeB, atype);
1647 nmatch = natom_match(pt, at->atom[p->ai()].type, at->atom[p->aj()].type, at->atom[p->ak()].type, at->atom[p->al()].type, atype);
1649 if (nmatch > nmatch_max)
1651 nmatch_max = nmatch;
1661 pi = &(bt[ftype].param[i]);
1664 /* Find additional matches for this dihedral - necessary
1666 * The rule in that case is that additional matches
1667 * HAVE to be on adjacent lines!
1670 /* Continue from current i value */
1671 for (j = i + 2; j < nr && bSame; j += 2)
1673 pj = &(bt[ftype].param[j]);
1674 bSame = (pi->ai() == pj->ai() && pi->aj() == pj->aj() && pi->ak() == pj->ak() && pi->al() == pj->al());
1679 /* nparam_found will be increased as long as the numbers match */
1683 else /* Not a dihedral */
1687 for (i = 0; ((i < nr) && !bFound); i++)
1689 pi = &(bt[ftype].param[i]);
1692 for (j = 0; ((j < nral) &&
1693 (get_atomtype_batype(at->atom[p->a[j]].typeB, atype) == pi->a[j])); j++)
1700 for (j = 0; ((j < nral) &&
1701 (get_atomtype_batype(at->atom[p->a[j]].type, atype) == pi->a[j])); j++)
1706 bFound = (j == nral);
1715 *nparam_def = nparam_found;
1722 void push_bond(directive d, t_params bondtype[], t_params bond[],
1723 t_atoms *at, gpp_atomtype_t atype, char *line,
1724 gmx_bool bBonded, gmx_bool bGenPairs, real fudgeQQ,
1725 gmx_bool bZero, gmx_bool *bWarn_copy_A_B,
1728 const char *aaformat[MAXATOMLIST] = {
1736 const char *asformat[MAXATOMLIST] = {
1741 "%*s%*s%*s%*s%*s%*s",
1742 "%*s%*s%*s%*s%*s%*s%*s"
1744 const char *ccformat = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
1745 int nr, i, j, nral, nral_fmt, nread, ftype;
1746 char format[STRLEN];
1747 /* One force parameter more, so we can check if we read too many */
1748 double cc[MAXFORCEPARAM+1];
1749 int aa[MAXATOMLIST+1];
1750 t_param param, *param_defA, *param_defB;
1751 gmx_bool bFoundA = FALSE, bFoundB = FALSE, bDef, bPert, bSwapParity = FALSE;
1752 int nparam_defA, nparam_defB;
1755 nparam_defA = nparam_defB = 0;
1757 ftype = ifunc_index(d, 1);
1759 for (j = 0; j < MAXATOMLIST; j++)
1763 bDef = (NRFP(ftype) > 0);
1765 if (ftype == F_SETTLE)
1767 /* SETTLE acts on 3 atoms, but the topology format only specifies
1768 * the first atom (for historical reasons).
1777 nread = sscanf(line, aaformat[nral_fmt-1],
1778 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
1780 if (ftype == F_SETTLE)
1787 if (nread < nral_fmt)
1792 else if (nread > nral_fmt)
1794 /* this is a hack to allow for virtual sites with swapped parity */
1795 bSwapParity = (aa[nral] < 0);
1798 aa[nral] = -aa[nral];
1800 ftype = ifunc_index(d, aa[nral]);
1809 gmx_fatal(FARGS, "Negative function types only allowed for %s and %s",
1810 interaction_function[F_VSITE3FAD].longname,
1811 interaction_function[F_VSITE3OUT].longname);
1817 /* Check for double atoms and atoms out of bounds */
1818 for (i = 0; (i < nral); i++)
1820 if (aa[i] < 1 || aa[i] > at->nr)
1822 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
1823 "Atom index (%d) in %s out of bounds (1-%d).\n"
1824 "This probably means that you have inserted topology section \"%s\"\n"
1825 "in a part belonging to a different molecule than you intended to.\n"
1826 "In that case move the \"%s\" section to the right molecule.",
1827 get_warning_file(wi), get_warning_line(wi),
1828 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
1830 for (j = i+1; (j < nral); j++)
1834 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
1835 warning(wi, errbuf);
1840 /* default force parameters */
1841 for (j = 0; (j < MAXATOMLIST); j++)
1843 param.a[j] = aa[j]-1;
1845 for (j = 0; (j < MAXFORCEPARAM); j++)
1850 /* Get force params for normal and free energy perturbation
1851 * studies, as determined by types!
1856 bFoundA = default_params(ftype, bondtype, at, atype, ¶m, FALSE, ¶m_defA, &nparam_defA);
1859 /* Copy the A-state and B-state default parameters. */
1860 GMX_ASSERT(NRFPA(ftype)+NRFPB(ftype) <= MAXFORCEPARAM, "Bonded interactions may have at most 12 parameters");
1861 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
1863 param.c[j] = param_defA->c[j];
1866 bFoundB = default_params(ftype, bondtype, at, atype, ¶m, TRUE, ¶m_defB, &nparam_defB);
1869 /* Copy only the B-state default parameters */
1870 for (j = NRFPA(ftype); (j < NRFP(ftype)); j++)
1872 param.c[j] = param_defB->c[j];
1876 else if (ftype == F_LJ14)
1878 bFoundA = default_nb_params(ftype, bondtype, at, ¶m, 0, FALSE, bGenPairs);
1879 bFoundB = default_nb_params(ftype, bondtype, at, ¶m, 0, TRUE, bGenPairs);
1881 else if (ftype == F_LJC14_Q)
1883 param.c[0] = fudgeQQ;
1884 /* Fill in the A-state charges as default parameters */
1885 param.c[1] = at->atom[param.a[0]].q;
1886 param.c[2] = at->atom[param.a[1]].q;
1887 /* The default LJ parameters are the standard 1-4 parameters */
1888 bFoundA = default_nb_params(F_LJ14, bondtype, at, ¶m, 3, FALSE, bGenPairs);
1891 else if (ftype == F_LJC_PAIRS_NB)
1893 /* Defaults are not supported here */
1899 gmx_incons("Unknown function type in push_bond");
1902 if (nread > nral_fmt)
1904 /* Manually specified parameters - in this case we discard multiple torsion info! */
1906 strcpy(format, asformat[nral_fmt-1]);
1907 strcat(format, ccformat);
1909 nread = sscanf(line, format, &cc[0], &cc[1], &cc[2], &cc[3], &cc[4], &cc[5],
1910 &cc[6], &cc[7], &cc[8], &cc[9], &cc[10], &cc[11], &cc[12]);
1912 if ((nread == NRFPA(ftype)) && (NRFPB(ftype) != 0))
1914 /* We only have to issue a warning if these atoms are perturbed! */
1916 for (j = 0; (j < nral); j++)
1918 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
1921 if (bPert && *bWarn_copy_A_B)
1924 "Some parameters for bonded interaction involving perturbed atoms are specified explicitly in state A, but not B - copying A to B");
1925 warning(wi, errbuf);
1926 *bWarn_copy_A_B = FALSE;
1929 /* If only the A parameters were specified, copy them to the B state */
1930 /* The B-state parameters correspond to the first nrfpB
1931 * A-state parameters.
1933 for (j = 0; (j < NRFPB(ftype)); j++)
1935 cc[nread++] = cc[j];
1939 /* If nread was 0 or EOF, no parameters were read => use defaults.
1940 * If nread was nrfpA we copied above so nread=nrfp.
1941 * If nread was nrfp we are cool.
1942 * For F_LJC14_Q we allow supplying fudgeQQ only.
1943 * Anything else is an error!
1945 if ((nread != 0) && (nread != EOF) && (nread != NRFP(ftype)) &&
1946 !(ftype == F_LJC14_Q && nread == 1))
1948 gmx_fatal(FARGS, "Incorrect number of parameters - found %d, expected %d or %d for %s.",
1949 nread, NRFPA(ftype), NRFP(ftype),
1950 interaction_function[ftype].longname);
1953 for (j = 0; (j < nread); j++)
1958 /* Check whether we have to use the defaults */
1959 if (nread == NRFP(ftype))
1968 /* nread now holds the number of force parameters read! */
1973 /* When we have multiple terms it would be very dangerous to allow perturbations to a different atom type! */
1974 if (ftype == F_PDIHS)
1976 if ((nparam_defA != nparam_defB) || ((nparam_defA > 1 || nparam_defB > 1) && (param_defA != param_defB)))
1979 "Cannot automatically perturb a torsion with multiple terms to different form.\n"
1980 "Please specify perturbed parameters manually for this torsion in your topology!");
1981 warning_error(wi, errbuf);
1985 if (nread > 0 && nread < NRFPA(ftype))
1987 /* Issue an error, do not use defaults */
1988 sprintf(errbuf, "Not enough parameters, there should be at least %d (or 0 for defaults)", NRFPA(ftype));
1989 warning_error(wi, errbuf);
1992 if (nread == 0 || nread == EOF)
1996 if (interaction_function[ftype].flags & IF_VSITE)
1998 /* set them to NOTSET, will be calculated later */
1999 for (j = 0; (j < MAXFORCEPARAM); j++)
2001 param.c[j] = NOTSET;
2006 param.c1() = -1; /* flag to swap parity of vsite construction */
2013 fprintf(stderr, "NOTE: No default %s types, using zeroes\n",
2014 interaction_function[ftype].longname);
2018 sprintf(errbuf, "No default %s types", interaction_function[ftype].longname);
2019 warning_error(wi, errbuf);
2030 param.c0() = 360 - param.c0();
2033 param.c2() = -param.c2();
2040 /* We only have to issue a warning if these atoms are perturbed! */
2042 for (j = 0; (j < nral); j++)
2044 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
2049 sprintf(errbuf, "No default %s types for perturbed atoms, "
2050 "using normal values", interaction_function[ftype].longname);
2051 warning(wi, errbuf);
2057 if ((ftype == F_PDIHS || ftype == F_ANGRES || ftype == F_ANGRESZ)
2058 && param.c[5] != param.c[2])
2060 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2061 " %s multiplicity can not be perturbed %f!=%f",
2062 get_warning_file(wi), get_warning_line(wi),
2063 interaction_function[ftype].longname,
2064 param.c[2], param.c[5]);
2067 if (IS_TABULATED(ftype) && param.c[2] != param.c[0])
2069 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2070 " %s table number can not be perturbed %d!=%d",
2071 get_warning_file(wi), get_warning_line(wi),
2072 interaction_function[ftype].longname,
2073 (int)(param.c[0]+0.5), (int)(param.c[2]+0.5));
2076 /* Dont add R-B dihedrals where all parameters are zero (no interaction) */
2077 if (ftype == F_RBDIHS)
2080 for (i = 0; i < NRFP(ftype); i++)
2082 if (param.c[i] != 0)
2093 /* Put the values in the appropriate arrays */
2094 add_param_to_list (&bond[ftype], ¶m);
2096 /* Push additional torsions from FF for ftype==9 if we have them.
2097 * We have already checked that the A/B states do not differ in this case,
2098 * so we do not have to double-check that again, or the vsite stuff.
2099 * In addition, those torsions cannot be automatically perturbed.
2101 if (bDef && ftype == F_PDIHS)
2103 for (i = 1; i < nparam_defA; i++)
2105 /* Advance pointer! */
2107 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
2109 param.c[j] = param_defA->c[j];
2111 /* And push the next term for this torsion */
2112 add_param_to_list (&bond[ftype], ¶m);
2117 void push_cmap(directive d, t_params bondtype[], t_params bond[],
2118 t_atoms *at, gpp_atomtype_t atype, char *line,
2121 const char *aaformat[MAXATOMLIST+1] =
2132 int i, j, ftype, nral, nread, ncmap_params;
2134 int aa[MAXATOMLIST+1];
2139 ftype = ifunc_index(d, 1);
2143 nread = sscanf(line, aaformat[nral-1],
2144 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
2151 else if (nread == nral)
2153 ftype = ifunc_index(d, 1);
2156 /* Check for double atoms and atoms out of bounds */
2157 for (i = 0; i < nral; i++)
2159 if (aa[i] < 1 || aa[i] > at->nr)
2161 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2162 "Atom index (%d) in %s out of bounds (1-%d).\n"
2163 "This probably means that you have inserted topology section \"%s\"\n"
2164 "in a part belonging to a different molecule than you intended to.\n"
2165 "In that case move the \"%s\" section to the right molecule.",
2166 get_warning_file(wi), get_warning_line(wi),
2167 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
2170 for (j = i+1; (j < nral); j++)
2174 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
2175 warning(wi, errbuf);
2180 /* default force parameters */
2181 for (j = 0; (j < MAXATOMLIST); j++)
2183 param.a[j] = aa[j]-1;
2185 for (j = 0; (j < MAXFORCEPARAM); j++)
2190 /* Get the cmap type for this cmap angle */
2191 bFound = default_cmap_params(bondtype, at, atype, ¶m, FALSE, &cmap_type, &ncmap_params);
2193 /* We want exactly one parameter (the cmap type in state A (currently no state B) back */
2194 if (bFound && ncmap_params == 1)
2196 /* Put the values in the appropriate arrays */
2197 param.c[0] = cmap_type;
2198 add_param_to_list(&bond[ftype], ¶m);
2202 /* This is essentially the same check as in default_cmap_params() done one more time */
2203 gmx_fatal(FARGS, "Unable to assign a cmap type to torsion %d %d %d %d and %d\n",
2204 param.a[0]+1, param.a[1]+1, param.a[2]+1, param.a[3]+1, param.a[4]+1);
2210 void push_vsitesn(directive d, t_params bond[],
2211 t_atoms *at, char *line,
2215 int type, ftype, j, n, ret, nj, a;
2217 double *weight = NULL, weight_tot;
2220 /* default force parameters */
2221 for (j = 0; (j < MAXATOMLIST); j++)
2223 param.a[j] = NOTSET;
2225 for (j = 0; (j < MAXFORCEPARAM); j++)
2231 ret = sscanf(ptr, "%d%n", &a, &n);
2235 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2236 " Expected an atom index in section \"%s\"",
2237 get_warning_file(wi), get_warning_line(wi),
2243 sscanf(ptr, "%d%n", &type, &n);
2245 ftype = ifunc_index(d, type);
2251 ret = sscanf(ptr, "%d%n", &a, &n);
2258 srenew(weight, nj+20);
2267 /* Here we use the A-state mass as a parameter.
2268 * Note that the B-state mass has no influence.
2270 weight[nj] = at->atom[atc[nj]].m;
2274 ret = sscanf(ptr, "%lf%n", &(weight[nj]), &n);
2278 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2279 " No weight or negative weight found for vsiten constructing atom %d (atom index %d)",
2280 get_warning_file(wi), get_warning_line(wi),
2285 gmx_fatal(FARGS, "Unknown vsiten type %d", type);
2287 weight_tot += weight[nj];
2295 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2296 " Expected more than one atom index in section \"%s\"",
2297 get_warning_file(wi), get_warning_line(wi),
2301 if (weight_tot == 0)
2303 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2304 " The total mass of the construting atoms is zero",
2305 get_warning_file(wi), get_warning_line(wi));
2308 for (j = 0; j < nj; j++)
2310 param.a[1] = atc[j];
2312 param.c[1] = weight[j]/weight_tot;
2313 /* Put the values in the appropriate arrays */
2314 add_param_to_list (&bond[ftype], ¶m);
2321 void push_mol(int nrmols, t_molinfo mols[], char *pline, int *whichmol,
2327 if (sscanf(pline, "%s%d", type, nrcopies) != 2)
2333 /* Search moleculename.
2334 * Here we originally only did case insensitive matching. But because
2335 * some PDB files can have many chains and use case to generate more
2336 * chain-identifiers, which in turn end up in our moleculetype name,
2337 * we added support for case-sensitivity.
2343 for (int i = 0; i < nrmols; i++)
2345 if (strcmp(type, *(mols[i].name)) == 0)
2350 if (gmx_strcasecmp(type, *(mols[i].name)) == 0)
2359 // select the case sensitive match
2360 *whichmol = matchcs;
2364 // avoid matching case-insensitive when we have multiple matches
2367 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);
2371 // select the unique case insensitive match
2372 *whichmol = matchci;
2376 gmx_fatal(FARGS, "No such moleculetype %s", type);
2381 void init_block2(t_block2 *b2, int natom)
2386 snew(b2->nra, b2->nr);
2387 snew(b2->a, b2->nr);
2388 for (i = 0; (i < b2->nr); i++)
2394 void done_block2(t_block2 *b2)
2400 for (i = 0; (i < b2->nr); i++)
2410 void push_excl(char *line, t_block2 *b2)
2414 char base[STRLEN], format[STRLEN];
2416 if (sscanf(line, "%d", &i) == 0)
2421 if ((1 <= i) && (i <= b2->nr))
2429 fprintf(debug, "Unbound atom %d\n", i-1);
2433 strcpy(base, "%*d");
2436 strcpy(format, base);
2437 strcat(format, "%d");
2438 n = sscanf(line, format, &j);
2441 if ((1 <= j) && (j <= b2->nr))
2444 srenew(b2->a[i], ++(b2->nra[i]));
2445 b2->a[i][b2->nra[i]-1] = j;
2446 /* also add the reverse exclusion! */
2447 srenew(b2->a[j], ++(b2->nra[j]));
2448 b2->a[j][b2->nra[j]-1] = i;
2449 strcat(base, "%*d");
2453 gmx_fatal(FARGS, "Invalid Atomnr j: %d, b2->nr: %d\n", j, b2->nr);
2460 void b_to_b2(t_blocka *b, t_block2 *b2)
2465 for (i = 0; (i < b->nr); i++)
2467 for (j = b->index[i]; (j < b->index[i+1]); j++)
2470 srenew(b2->a[i], ++b2->nra[i]);
2471 b2->a[i][b2->nra[i]-1] = a;
2476 void b2_to_b(t_block2 *b2, t_blocka *b)
2482 for (i = 0; (i < b2->nr); i++)
2485 for (j = 0; (j < b2->nra[i]); j++)
2487 b->a[nra+j] = b2->a[i][j];
2491 /* terminate list */
2495 static int icomp(const void *v1, const void *v2)
2497 return (*((int *) v1))-(*((int *) v2));
2500 void merge_excl(t_blocka *excl, t_block2 *b2)
2510 else if (b2->nr != excl->nr)
2512 gmx_fatal(FARGS, "DEATH HORROR: b2->nr = %d, while excl->nr = %d",
2517 fprintf(debug, "Entering merge_excl\n");
2520 /* First copy all entries from excl to b2 */
2523 /* Count and sort the exclusions */
2525 for (i = 0; (i < b2->nr); i++)
2529 /* remove double entries */
2530 qsort(b2->a[i], (size_t)b2->nra[i], (size_t)sizeof(b2->a[i][0]), icomp);
2532 for (j = 1; (j < b2->nra[i]); j++)
2534 if (b2->a[i][j] != b2->a[i][k-1])
2536 b2->a[i][k] = b2->a[i][j];
2545 srenew(excl->a, excl->nra);
2550 int add_atomtype_decoupled(t_symtab *symtab, gpp_atomtype_t at,
2551 t_nbparam ***nbparam, t_nbparam ***pair)
2557 /* Define an atom type with all parameters set to zero (no interactions) */
2560 /* Type for decoupled atoms could be anything,
2561 * this should be changed automatically later when required.
2563 atom.ptype = eptAtom;
2564 for (i = 0; (i < MAXFORCEPARAM); i++)
2569 nr = add_atomtype(at, symtab, &atom, "decoupled", ¶m, -1, 0.0, 0.0, 0.0, 0, 0, 0);
2571 /* Add space in the non-bonded parameters matrix */
2572 realloc_nb_params(at, nbparam, pair);
2577 static void convert_pairs_to_pairsQ(t_params *plist,
2578 real fudgeQQ, t_atoms *atoms)
2580 t_param *paramp1, *paramp2, *paramnew;
2581 int i, j, p1nr, p2nr, p2newnr;
2583 /* Add the pair list to the pairQ list */
2584 p1nr = plist[F_LJ14].nr;
2585 p2nr = plist[F_LJC14_Q].nr;
2586 p2newnr = p1nr + p2nr;
2587 snew(paramnew, p2newnr);
2589 paramp1 = plist[F_LJ14].param;
2590 paramp2 = plist[F_LJC14_Q].param;
2592 /* Fill in the new F_LJC14_Q array with the old one. NOTE:
2593 it may be possible to just ADD the converted F_LJ14 array
2594 to the old F_LJC14_Q array, but since we have to create
2595 a new sized memory structure, better just to deep copy it all.
2598 for (i = 0; i < p2nr; i++)
2600 /* Copy over parameters */
2601 for (j = 0; j < 5; j++) /* entries are 0-4 for F_LJC14_Q */
2603 paramnew[i].c[j] = paramp2[i].c[j];
2606 /* copy over atoms */
2607 for (j = 0; j < 2; j++)
2609 paramnew[i].a[j] = paramp2[i].a[j];
2613 for (i = p2nr; i < p2newnr; i++)
2617 /* Copy over parameters */
2618 paramnew[i].c[0] = fudgeQQ;
2619 paramnew[i].c[1] = atoms->atom[paramp1[j].a[0]].q;
2620 paramnew[i].c[2] = atoms->atom[paramp1[j].a[1]].q;
2621 paramnew[i].c[3] = paramp1[j].c[0];
2622 paramnew[i].c[4] = paramp1[j].c[1];
2624 /* copy over atoms */
2625 paramnew[i].a[0] = paramp1[j].a[0];
2626 paramnew[i].a[1] = paramp1[j].a[1];
2629 /* free the old pairlists */
2630 sfree(plist[F_LJC14_Q].param);
2631 sfree(plist[F_LJ14].param);
2633 /* now assign the new data to the F_LJC14_Q structure */
2634 plist[F_LJC14_Q].param = paramnew;
2635 plist[F_LJC14_Q].nr = p2newnr;
2637 /* Empty the LJ14 pairlist */
2638 plist[F_LJ14].nr = 0;
2639 plist[F_LJ14].param = NULL;
2642 static void generate_LJCpairsNB(t_molinfo *mol, int nb_funct, t_params *nbp)
2644 int n, ntype, i, j, k;
2651 atom = mol->atoms.atom;
2653 ntype = static_cast<int>(std::sqrt(static_cast<double>(nbp->nr)));
2654 GMX_ASSERT(ntype * ntype == nbp->nr, "Number of pairs of generated non-bonded parameters should be a perfect square");
2656 for (i = 0; i < MAXATOMLIST; i++)
2658 param.a[i] = NOTSET;
2660 for (i = 0; i < MAXFORCEPARAM; i++)
2662 param.c[i] = NOTSET;
2665 /* Add a pair interaction for all non-excluded atom pairs */
2667 for (i = 0; i < n; i++)
2669 for (j = i+1; j < n; j++)
2672 for (k = excl->index[i]; k < excl->index[i+1]; k++)
2674 if (excl->a[k] == j)
2681 if (nb_funct != F_LJ)
2683 gmx_fatal(FARGS, "Can only generate non-bonded pair interactions for Van der Waals type Lennard-Jones");
2687 param.c[0] = atom[i].q;
2688 param.c[1] = atom[j].q;
2689 param.c[2] = nbp->param[ntype*atom[i].type+atom[j].type].c[0];
2690 param.c[3] = nbp->param[ntype*atom[i].type+atom[j].type].c[1];
2691 add_param_to_list(&mol->plist[F_LJC_PAIRS_NB], ¶m);
2697 static void set_excl_all(t_blocka *excl)
2701 /* Get rid of the current exclusions and exclude all atom pairs */
2703 excl->nra = nat*nat;
2704 srenew(excl->a, excl->nra);
2706 for (i = 0; i < nat; i++)
2709 for (j = 0; j < nat; j++)
2714 excl->index[nat] = k;
2717 static void decouple_atoms(t_atoms *atoms, int atomtype_decouple,
2718 int couple_lam0, int couple_lam1,
2719 const char *mol_name)
2723 for (i = 0; i < atoms->nr; i++)
2727 atom = &atoms->atom[i];
2729 if (atom->qB != atom->q || atom->typeB != atom->type)
2731 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.",
2732 i + 1, mol_name, "couple-moltype");
2735 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamVDW)
2739 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamQ)
2741 atom->type = atomtype_decouple;
2743 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamVDW)
2747 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamQ)
2749 atom->typeB = atomtype_decouple;
2754 void convert_moltype_couple(t_molinfo *mol, int atomtype_decouple, real fudgeQQ,
2755 int couple_lam0, int couple_lam1,
2756 gmx_bool bCoupleIntra, int nb_funct, t_params *nbp)
2758 convert_pairs_to_pairsQ(mol->plist, fudgeQQ, &mol->atoms);
2761 generate_LJCpairsNB(mol, nb_funct, nbp);
2762 set_excl_all(&mol->excls);
2764 decouple_atoms(&mol->atoms, atomtype_decouple, couple_lam0, couple_lam1,