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 * check out http://www.gromacs.org for more information.
7 * Copyright (c) 2012,2013, by the GROMACS development team, led by
8 * David van der Spoel, Berk Hess, Erik Lindahl, and including many
9 * others, as listed in the AUTHORS file in the top-level source
10 * directory and at http://www.gromacs.org.
12 * GROMACS is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 2.1
15 * of the License, or (at your option) any later version.
17 * GROMACS is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with GROMACS; if not, see
24 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
25 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 * If you want to redistribute modifications to GROMACS, please
28 * consider that scientific software is very special. Version
29 * control is crucial - bugs must be traceable. We will be happy to
30 * consider code for inclusion in the official distribution, but
31 * derived work must not be called official GROMACS. Details are found
32 * in the README & COPYING files - if they are missing, get the
33 * official version at http://www.gromacs.org.
35 * To help us fund GROMACS development, we humbly ask that you cite
36 * the research papers on the package. Check out http://www.gromacs.org.
55 #include "gmx_fatal.h"
57 #include "gpp_atomtype.h"
58 #include "gpp_bond_atomtype.h"
60 void generate_nbparams(int comb, int ftype, t_params *plist, gpp_atomtype_t atype,
65 real c, bi, bj, ci, cj, ci0, ci1, ci2, cj0, cj1, cj2;
68 /* Lean mean shortcuts */
69 nr = get_atomtype_ntypes(atype);
71 snew(plist->param, nr*nr);
74 /* Fill the matrix with force parameters */
82 for (i = k = 0; (i < nr); i++)
84 for (j = 0; (j < nr); j++, k++)
86 for (nf = 0; (nf < nrfp); nf++)
88 ci = get_atomtype_nbparam(i, nf, atype);
89 cj = get_atomtype_nbparam(j, nf, atype);
91 plist->param[k].c[nf] = c;
97 case eCOMB_ARITHMETIC:
98 /* c0 and c1 are sigma and epsilon */
99 for (i = k = 0; (i < nr); i++)
101 for (j = 0; (j < nr); j++, k++)
103 ci0 = get_atomtype_nbparam(i, 0, atype);
104 cj0 = get_atomtype_nbparam(j, 0, atype);
105 ci1 = get_atomtype_nbparam(i, 1, atype);
106 cj1 = get_atomtype_nbparam(j, 1, atype);
107 plist->param[k].c[0] = (fabs(ci0) + fabs(cj0))*0.5;
108 /* Negative sigma signals that c6 should be set to zero later,
109 * so we need to propagate that through the combination rules.
111 if (ci0 < 0 || cj0 < 0)
113 plist->param[k].c[0] *= -1;
115 plist->param[k].c[1] = sqrt(ci1*cj1);
120 case eCOMB_GEOM_SIG_EPS:
121 /* c0 and c1 are sigma and epsilon */
122 for (i = k = 0; (i < nr); i++)
124 for (j = 0; (j < nr); j++, k++)
126 ci0 = get_atomtype_nbparam(i, 0, atype);
127 cj0 = get_atomtype_nbparam(j, 0, atype);
128 ci1 = get_atomtype_nbparam(i, 1, atype);
129 cj1 = get_atomtype_nbparam(j, 1, atype);
130 plist->param[k].c[0] = sqrt(fabs(ci0*cj0));
131 /* Negative sigma signals that c6 should be set to zero later,
132 * so we need to propagate that through the combination rules.
134 if (ci0 < 0 || cj0 < 0)
136 plist->param[k].c[0] *= -1;
138 plist->param[k].c[1] = sqrt(ci1*cj1);
144 gmx_fatal(FARGS, "No such combination rule %d", comb);
148 gmx_incons("Topology processing, generate nb parameters");
153 /* Buckingham rules */
154 for (i = k = 0; (i < nr); i++)
156 for (j = 0; (j < nr); j++, k++)
158 ci0 = get_atomtype_nbparam(i, 0, atype);
159 cj0 = get_atomtype_nbparam(j, 0, atype);
160 ci2 = get_atomtype_nbparam(i, 2, atype);
161 cj2 = get_atomtype_nbparam(j, 2, atype);
162 bi = get_atomtype_nbparam(i, 1, atype);
163 bj = get_atomtype_nbparam(j, 1, atype);
164 plist->param[k].c[0] = sqrt(ci0 * cj0);
165 if ((bi == 0) || (bj == 0))
167 plist->param[k].c[1] = 0;
171 plist->param[k].c[1] = 2.0/(1/bi+1/bj);
173 plist->param[k].c[2] = sqrt(ci2 * cj2);
179 sprintf(errbuf, "Invalid nonbonded type %s",
180 interaction_function[ftype].longname);
181 warning_error(wi, errbuf);
185 static void realloc_nb_params(gpp_atomtype_t at,
186 t_nbparam ***nbparam, t_nbparam ***pair)
188 /* Add space in the non-bonded parameters matrix */
189 int atnr = get_atomtype_ntypes(at);
190 srenew(*nbparam, atnr);
191 snew((*nbparam)[atnr-1], atnr);
195 snew((*pair)[atnr-1], atnr);
199 static void copy_B_from_A(int ftype, double *c)
203 nrfpA = NRFPA(ftype);
204 nrfpB = NRFPB(ftype);
206 /* Copy the B parameters from the first nrfpB A parameters */
207 for (i = 0; (i < nrfpB); i++)
213 void push_at (t_symtab *symtab, gpp_atomtype_t at, t_bond_atomtype bat,
214 char *line, int nb_funct,
215 t_nbparam ***nbparam, t_nbparam ***pair,
222 t_xlate xl[eptNR] = {
230 int nr, i, nfields, j, pt, nfp0 = -1;
231 int batype_nr, nread;
232 char type[STRLEN], btype[STRLEN], ptype[STRLEN];
234 double c[MAXFORCEPARAM];
235 double radius, vol, surftens, gb_radius, S_hct;
236 char tmpfield[12][100]; /* Max 12 fields of width 100 */
241 gmx_bool have_atomic_number;
242 gmx_bool have_bonded_type;
247 /* First assign input line to temporary array */
248 nfields = sscanf(line, "%s%s%s%s%s%s%s%s%s%s%s%s",
249 tmpfield[0], tmpfield[1], tmpfield[2], tmpfield[3], tmpfield[4], tmpfield[5],
250 tmpfield[6], tmpfield[7], tmpfield[8], tmpfield[9], tmpfield[10], tmpfield[11]);
252 /* Comments on optional fields in the atomtypes section:
254 * The force field format is getting a bit old. For OPLS-AA we needed
255 * to add a special bonded atomtype, and for Gerrit Groenhofs QM/MM stuff
256 * we also needed the atomic numbers.
257 * To avoid making all old or user-generated force fields unusable we
258 * have introduced both these quantities as optional columns, and do some
259 * acrobatics to check whether they are present or not.
260 * This will all look much nicer when we switch to XML... sigh.
262 * Field 0 (mandatory) is the nonbonded type name. (string)
263 * Field 1 (optional) is the bonded type (string)
264 * Field 2 (optional) is the atomic number (int)
265 * Field 3 (mandatory) is the mass (numerical)
266 * Field 4 (mandatory) is the charge (numerical)
267 * Field 5 (mandatory) is the particle type (single character)
268 * This is followed by a number of nonbonded parameters.
270 * The safest way to identify the format is the particle type field.
272 * So, here is what we do:
274 * A. Read in the first six fields as strings
275 * B. If field 3 (starting from 0) is a single char, we have neither
276 * bonded_type or atomic numbers.
277 * C. If field 5 is a single char we have both.
278 * D. If field 4 is a single char we check field 1. If this begins with
279 * an alphabetical character we have bonded types, otherwise atomic numbers.
288 if ( (strlen(tmpfield[5]) == 1) && isalpha(tmpfield[5][0]) )
290 have_bonded_type = TRUE;
291 have_atomic_number = TRUE;
293 else if ( (strlen(tmpfield[3]) == 1) && isalpha(tmpfield[3][0]) )
295 have_bonded_type = FALSE;
296 have_atomic_number = FALSE;
300 have_bonded_type = ( isalpha(tmpfield[1][0]) != 0 );
301 have_atomic_number = !have_bonded_type;
304 /* optional fields */
318 if (have_atomic_number)
320 if (have_bonded_type)
322 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf",
323 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1],
324 &radius, &vol, &surftens, &gb_radius);
333 /* have_atomic_number && !have_bonded_type */
334 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf",
335 type, &atomnr, &m, &q, ptype, &c[0], &c[1],
336 &radius, &vol, &surftens, &gb_radius);
346 if (have_bonded_type)
348 /* !have_atomic_number && have_bonded_type */
349 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf%lf%lf%lf%lf",
350 type, btype, &m, &q, ptype, &c[0], &c[1],
351 &radius, &vol, &surftens, &gb_radius);
360 /* !have_atomic_number && !have_bonded_type */
361 nread = sscanf(line, "%s%lf%lf%s%lf%lf%lf%lf%lf%lf",
362 type, &m, &q, ptype, &c[0], &c[1],
363 &radius, &vol, &surftens, &gb_radius);
372 if (!have_bonded_type)
377 if (!have_atomic_number)
387 if (have_atomic_number)
389 if (have_bonded_type)
391 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
392 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2],
393 &radius, &vol, &surftens, &gb_radius);
402 /* have_atomic_number && !have_bonded_type */
403 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
404 type, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2],
405 &radius, &vol, &surftens, &gb_radius);
415 if (have_bonded_type)
417 /* !have_atomic_number && have_bonded_type */
418 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
419 type, btype, &m, &q, ptype, &c[0], &c[1], &c[2],
420 &radius, &vol, &surftens, &gb_radius);
429 /* !have_atomic_number && !have_bonded_type */
430 nread = sscanf(line, "%s%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
431 type, &m, &q, ptype, &c[0], &c[1], &c[2],
432 &radius, &vol, &surftens, &gb_radius);
441 if (!have_bonded_type)
446 if (!have_atomic_number)
454 gmx_fatal(FARGS, "Invalid function type %d in push_at %s %d", nb_funct,
457 for (j = nfp0; (j < MAXFORCEPARAM); j++)
462 if (strlen(type) == 1 && isdigit(type[0]))
464 gmx_fatal(FARGS, "Atom type names can't be single digits.");
467 if (strlen(btype) == 1 && isdigit(btype[0]))
469 gmx_fatal(FARGS, "Bond atom type names can't be single digits.");
472 /* Hack to read old topologies */
473 if (gmx_strcasecmp(ptype, "D") == 0)
477 for (j = 0; (j < eptNR); j++)
479 if (gmx_strcasecmp(ptype, xl[j].entry) == 0)
486 gmx_fatal(FARGS, "Invalid particle type %s on line %s",
492 fprintf(debug, "ptype: %s\n", ptype_str[pt]);
498 for (i = 0; (i < MAXFORCEPARAM); i++)
503 if ((batype_nr = get_bond_atomtype_type(btype, bat)) == NOTSET)
505 add_bond_atomtype(bat, symtab, btype);
507 batype_nr = get_bond_atomtype_type(btype, bat);
509 if ((nr = get_atomtype_type(type, at)) != NOTSET)
511 sprintf(errbuf, "Overriding atomtype %s", type);
513 if ((nr = set_atomtype(nr, at, symtab, atom, type, param, batype_nr,
514 radius, vol, surftens, atomnr, gb_radius, S_hct)) == NOTSET)
516 gmx_fatal(FARGS, "Replacing atomtype %s failed", type);
519 else if ((nr = add_atomtype(at, symtab, atom, type, param,
520 batype_nr, radius, vol,
521 surftens, atomnr, gb_radius, S_hct)) == NOTSET)
523 gmx_fatal(FARGS, "Adding atomtype %s failed", type);
527 /* Add space in the non-bonded parameters matrix */
528 realloc_nb_params(at, nbparam, pair);
534 static void push_bondtype(t_params * bt,
538 gmx_bool bAllowRepeat,
543 gmx_bool bTest, bFound, bCont, bId;
545 int nrfp = NRFP(ftype);
548 /* If bAllowRepeat is TRUE, we allow multiple entries as long as they
549 are on directly _adjacent_ lines.
552 /* First check if our atomtypes are _identical_ (not reversed) to the previous
553 entry. If they are not identical we search for earlier duplicates. If they are
554 we can skip it, since we already searched for the first line
561 if (bAllowRepeat && nr > 1)
563 for (j = 0, bCont = TRUE; (j < nral); j++)
565 bCont = bCont && (b->a[j] == bt->param[nr-2].a[j]);
569 /* Search for earlier duplicates if this entry was not a continuation
570 from the previous line.
575 for (i = 0; (i < nr); i++)
578 for (j = 0; (j < nral); j++)
580 bTest = (bTest && (b->a[j] == bt->param[i].a[j]));
585 for (j = 0; (j < nral); j++)
587 bTest = (bTest && (b->a[nral-1-j] == bt->param[i].a[j]));
595 for (j = 0; (j < nrfp); j++)
597 bId = bId && (bt->param[i].c[j] == b->c[j]);
601 sprintf(errbuf, "Overriding %s parameters.%s",
602 interaction_function[ftype].longname,
604 "\nUse dihedraltype 9 to allow several multiplicity terms. Only consecutive lines are combined. Non-consective lines overwrite each other."
607 fprintf(stderr, " old: ");
608 for (j = 0; (j < nrfp); j++)
610 fprintf(stderr, " %g", bt->param[i].c[j]);
612 fprintf(stderr, " \n new: %s\n\n", line);
616 for (j = 0; (j < nrfp); j++)
618 bt->param[i].c[j] = b->c[j];
629 /* fill the arrays up and down */
630 memcpy(bt->param[bt->nr].c, b->c, sizeof(b->c));
631 memcpy(bt->param[bt->nr].a, b->a, sizeof(b->a));
632 memcpy(bt->param[bt->nr+1].c, b->c, sizeof(b->c));
634 /* The definitions of linear angles depend on the order of atoms,
635 * that means that for atoms i-j-k, with certain parameter a, the
636 * corresponding k-j-i angle will have parameter 1-a.
638 if (ftype == F_LINEAR_ANGLES)
640 bt->param[bt->nr+1].c[0] = 1-bt->param[bt->nr+1].c[0];
641 bt->param[bt->nr+1].c[2] = 1-bt->param[bt->nr+1].c[2];
644 for (j = 0; (j < nral); j++)
646 bt->param[bt->nr+1].a[j] = b->a[nral-1-j];
653 void push_bt(directive d, t_params bt[], int nral,
655 t_bond_atomtype bat, char *line,
658 const char *formal[MAXATOMLIST+1] = {
667 const char *formnl[MAXATOMLIST+1] = {
673 "%*s%*s%*s%*s%*s%*s",
674 "%*s%*s%*s%*s%*s%*s%*s"
676 const char *formlf = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
677 int i, ft, ftype, nn, nrfp, nrfpA, nrfpB;
679 char alc[MAXATOMLIST+1][20];
680 /* One force parameter more, so we can check if we read too many */
681 double c[MAXFORCEPARAM+1];
685 if ((bat && at) || (!bat && !at))
687 gmx_incons("You should pass either bat or at to push_bt");
690 /* Make format string (nral ints+functype) */
691 if ((nn = sscanf(line, formal[nral],
692 alc[0], alc[1], alc[2], alc[3], alc[4], alc[5])) != nral+1)
694 sprintf(errbuf, "Not enough atomtypes (%d instead of %d)", nn-1, nral);
695 warning_error(wi, errbuf);
699 ft = strtol(alc[nral], NULL, 10);
700 ftype = ifunc_index(d, ft);
702 nrfpA = interaction_function[ftype].nrfpA;
703 nrfpB = interaction_function[ftype].nrfpB;
704 strcpy(f1, formnl[nral]);
706 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]))
711 /* Copy the B-state from the A-state */
712 copy_B_from_A(ftype, c);
718 warning_error(wi, "Not enough parameters");
720 else if (nn > nrfpA && nn < nrfp)
722 warning_error(wi, "Too many parameters or not enough parameters for topology B");
726 warning_error(wi, "Too many parameters");
728 for (i = nn; (i < nrfp); i++)
734 for (i = 0; (i < nral); i++)
736 if (at && ((p.a[i] = get_atomtype_type(alc[i], at)) == NOTSET))
738 gmx_fatal(FARGS, "Unknown atomtype %s\n", alc[i]);
740 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
742 gmx_fatal(FARGS, "Unknown bond_atomtype %s\n", alc[i]);
745 for (i = 0; (i < nrfp); i++)
749 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
753 void push_dihedraltype(directive d, t_params bt[],
754 t_bond_atomtype bat, char *line,
757 const char *formal[MAXATOMLIST+1] = {
766 const char *formnl[MAXATOMLIST+1] = {
772 "%*s%*s%*s%*s%*s%*s",
773 "%*s%*s%*s%*s%*s%*s%*s"
775 const char *formlf[MAXFORCEPARAM] = {
781 "%lf%lf%lf%lf%lf%lf",
782 "%lf%lf%lf%lf%lf%lf%lf",
783 "%lf%lf%lf%lf%lf%lf%lf%lf",
784 "%lf%lf%lf%lf%lf%lf%lf%lf%lf",
785 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
786 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
787 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
789 int i, ft, ftype, nn, nrfp, nrfpA, nrfpB, nral;
791 char alc[MAXATOMLIST+1][20];
792 double c[MAXFORCEPARAM];
794 gmx_bool bAllowRepeat;
797 /* This routine accepts dihedraltypes defined from either 2 or 4 atoms.
799 * We first check for 2 atoms with the 3th column being an integer
800 * defining the type. If this isn't the case, we try it with 4 atoms
801 * and the 5th column defining the dihedral type.
803 nn = sscanf(line, formal[4], alc[0], alc[1], alc[2], alc[3], alc[4]);
804 if (nn >= 3 && strlen(alc[2]) == 1 && isdigit(alc[2][0]))
807 ft = strtol(alc[nral], NULL, 10);
808 /* Move atom types around a bit and use 'X' for wildcard atoms
809 * to create a 4-atom dihedral definition with arbitrary atoms in
812 if (alc[2][0] == '2')
814 /* improper - the two atomtypes are 1,4. Use wildcards for 2,3 */
815 strcpy(alc[3], alc[1]);
816 sprintf(alc[2], "X");
817 sprintf(alc[1], "X");
818 /* alc[0] stays put */
822 /* proper - the two atomtypes are 2,3. Use wildcards for 1,4 */
823 sprintf(alc[3], "X");
824 strcpy(alc[2], alc[1]);
825 strcpy(alc[1], alc[0]);
826 sprintf(alc[0], "X");
829 else if (nn == 5 && strlen(alc[4]) == 1 && isdigit(alc[4][0]))
832 ft = strtol(alc[nral], NULL, 10);
836 sprintf(errbuf, "Incorrect number of atomtypes for dihedral (%d instead of 2 or 4)", nn-1);
837 warning_error(wi, errbuf);
843 /* Previously, we have always overwritten parameters if e.g. a torsion
844 with the same atomtypes occurs on multiple lines. However, CHARMM and
845 some other force fields specify multiple dihedrals over some bonds,
846 including cosines with multiplicity 6 and somethimes even higher.
847 Thus, they cannot be represented with Ryckaert-Bellemans terms.
848 To add support for these force fields, Dihedral type 9 is identical to
849 normal proper dihedrals, but repeated entries are allowed.
856 bAllowRepeat = FALSE;
860 ftype = ifunc_index(d, ft);
862 nrfpA = interaction_function[ftype].nrfpA;
863 nrfpB = interaction_function[ftype].nrfpB;
865 strcpy(f1, formnl[nral]);
866 strcat(f1, formlf[nrfp-1]);
868 /* Check number of parameters given */
869 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]))
874 /* Copy the B-state from the A-state */
875 copy_B_from_A(ftype, c);
881 warning_error(wi, "Not enough parameters");
883 else if (nn > nrfpA && nn < nrfp)
885 warning_error(wi, "Too many parameters or not enough parameters for topology B");
889 warning_error(wi, "Too many parameters");
891 for (i = nn; (i < nrfp); i++)
898 for (i = 0; (i < 4); i++)
900 if (!strcmp(alc[i], "X"))
906 if ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET)
908 gmx_fatal(FARGS, "Unknown bond_atomtype %s", alc[i]);
912 for (i = 0; (i < nrfp); i++)
916 /* Always use 4 atoms here, since we created two wildcard atoms
917 * if there wasn't of them 4 already.
919 push_bondtype (&(bt[ftype]), &p, 4, ftype, bAllowRepeat, line, wi);
923 void push_nbt(directive d, t_nbparam **nbt, gpp_atomtype_t atype,
924 char *pline, int nb_funct,
928 const char *form2 = "%*s%*s%*s%lf%lf";
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, atnr, 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 for (i = n; i < nrfp; i++)
976 else if (ftype == F_LJC14_Q)
978 n = sscanf(pline, form5, &c[0], &c[1], &c[2], &c[3], &dum);
981 incorrect_n_param(wi);
987 if (sscanf(pline, form3, &c[0], &c[1], &dum) != 2)
989 incorrect_n_param(wi);
995 if (sscanf(pline, form4, &c[0], &c[1], &c[2], &dum) != 3)
997 incorrect_n_param(wi);
1003 gmx_fatal(FARGS, "Number of force parameters for nonbonded interactions is %d"
1004 " in file %s, line %d", nrfp, __FILE__, __LINE__);
1006 for (i = 0; (i < nrfp); i++)
1011 /* Put the parameters in the matrix */
1012 if ((ai = get_atomtype_type (a0, atype)) == NOTSET)
1014 gmx_fatal(FARGS, "Atomtype %s not found", a0);
1016 if ((aj = get_atomtype_type (a1, atype)) == NOTSET)
1018 gmx_fatal(FARGS, "Atomtype %s not found", a1);
1020 nbp = &(nbt[max(ai, aj)][min(ai, aj)]);
1025 for (i = 0; i < nrfp; i++)
1027 bId = bId && (nbp->c[i] == cr[i]);
1031 sprintf(errbuf, "Overriding non-bonded parameters,");
1032 warning(wi, errbuf);
1033 fprintf(stderr, " old:");
1034 for (i = 0; i < nrfp; i++)
1036 fprintf(stderr, " %g", nbp->c[i]);
1038 fprintf(stderr, " new\n%s\n", pline);
1042 for (i = 0; i < nrfp; i++)
1049 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 ( (nfield = sscanf(line, "%s%lf%lf%lf%lf%lf", atypename, &radius, &vol, &surftens, &gb_radius, &S_hct)) != 6)
1060 sprintf(errbuf, "Too few gb parameters for type %s\n", atypename);
1061 warning(wi, errbuf);
1064 /* Search for atomtype */
1065 atype = get_atomtype_type(atypename, at);
1067 if (atype == NOTSET)
1069 printf("Couldn't find topology match for atomtype %s\n", atypename);
1073 set_atomtype_gbparam(at, atype, radius, vol, surftens, gb_radius, S_hct);
1077 push_cmaptype(directive d, t_params bt[], int nral, gpp_atomtype_t at,
1078 t_bond_atomtype bat, char *line,
1081 const char *formal = "%s%s%s%s%s%s%s%s";
1083 int i, j, ft, ftype, nn, nrfp, nrfpA, nrfpB;
1085 int nxcmap, nycmap, ncmap, read_cmap, sl, nct;
1086 char s[20], alc[MAXATOMLIST+2][20];
1088 gmx_bool bAllowRepeat;
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 */
1132 srenew(bt->cmap, bt->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->cmap[i+(bt->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->cmap[i+ncmap] = bt->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->grid_spacing = nxcmap; /* Or nycmap, they need to be equal */
1186 bt->nc = bt->nc + 1; /* Since we are incrementing here, we need to subtract later, see (*****) */
1187 nct = (nral+1) * bt->nc;
1189 /* Allocate memory for the cmap_types information */
1190 srenew(bt->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->cmap_types[bt->nct++] = get_bond_atomtype_type(alc[i], bat);
1207 /* Assign a type number to this cmap */
1208 bt->cmap_types[bt->nct++] = bt->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) */
1213 gmx_fatal(FARGS, "Incorrect number of atom types (%d) in cmap type %d\n", nct, bt->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,
1230 char *resnumberic, int cgnumber,
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, cgnumber,
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 atomtype overwrites another */
1426 if (gmx_strcasecmp(*((*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...
1469 ti = at->atom[p->a[0]].typeB;
1470 tj = at->atom[p->a[1]].typeB;
1474 ti = at->atom[p->a[0]].type;
1475 tj = at->atom[p->a[1]].type;
1477 pi = &(bt[ftype].param[ntype*ti+tj]);
1478 bFound = ((ti == pi->a[0]) && (tj == pi->a[1]));
1481 /* Search explicitly if we didnt find it */
1484 for (i = 0; ((i < nr) && !bFound); i++)
1486 pi = &(bt[ftype].param[i]);
1489 for (j = 0; ((j < nral) &&
1490 (at->atom[p->a[j]].typeB == pi->a[j])); j++)
1497 for (j = 0; ((j < nral) &&
1498 (at->atom[p->a[j]].type == pi->a[j])); j++)
1503 bFound = (j == nral);
1511 if (nrfp+nrfpB > MAXFORCEPARAM)
1513 gmx_incons("Too many force parameters");
1515 for (j = c_start; (j < nrfpB); j++)
1517 p->c[nrfp+j] = pi->c[j];
1522 for (j = c_start; (j < nrfp); j++)
1530 for (j = c_start; (j < nrfp); j++)
1538 static gmx_bool default_cmap_params(int ftype, t_params bondtype[],
1539 t_atoms *at, gpp_atomtype_t atype,
1540 t_param *p, gmx_bool bB,
1541 int *cmap_type, int *nparam_def)
1543 int i, j, nparam_found;
1545 gmx_bool bFound = FALSE;
1550 /* Match the current cmap angle against the list of cmap_types */
1551 for (i = 0; i < bondtype->nct && !bFound; i += 6)
1560 (get_atomtype_batype(at->atom[p->a[0]].type, atype) == bondtype->cmap_types[i]) &&
1561 (get_atomtype_batype(at->atom[p->a[1]].type, atype) == bondtype->cmap_types[i+1]) &&
1562 (get_atomtype_batype(at->atom[p->a[2]].type, atype) == bondtype->cmap_types[i+2]) &&
1563 (get_atomtype_batype(at->atom[p->a[3]].type, atype) == bondtype->cmap_types[i+3]) &&
1564 (get_atomtype_batype(at->atom[p->a[4]].type, atype) == bondtype->cmap_types[i+4]))
1566 /* Found cmap torsion */
1568 ct = bondtype->cmap_types[i+5];
1574 /* If we did not find a matching type for this cmap torsion */
1577 gmx_fatal(FARGS, "Unknown cmap torsion between atoms %d %d %d %d %d\n",
1578 p->a[0]+1, p->a[1]+1, p->a[2]+1, p->a[3]+1, p->a[4]+1);
1581 *nparam_def = nparam_found;
1587 static gmx_bool default_params(int ftype, t_params bt[],
1588 t_atoms *at, gpp_atomtype_t atype,
1589 t_param *p, gmx_bool bB,
1590 t_param **param_def,
1593 int i, j, nparam_found;
1594 gmx_bool bFound, bSame;
1597 int nr = bt[ftype].nr;
1598 int nral = NRAL(ftype);
1599 int nrfpA = interaction_function[ftype].nrfpA;
1600 int nrfpB = interaction_function[ftype].nrfpB;
1602 if ((!bB && nrfpA == 0) || (bB && nrfpB == 0))
1608 /* We allow wildcards now. The first type (with or without wildcards) that
1609 * fits is used, so you should probably put the wildcarded bondtypes
1610 * at the end of each section.
1614 /* OPLS uses 1000s of dihedraltypes, so in order to speed up the scanning we have a
1615 * special case for this. Check for B state outside loop to speed it up.
1617 if (ftype == F_PDIHS || ftype == F_RBDIHS || ftype == F_IDIHS || ftype == F_PIDIHS)
1621 for (i = 0; ((i < nr) && !bFound); i++)
1623 pi = &(bt[ftype].param[i]);
1626 ((pi->AI == -1) || (get_atomtype_batype(at->atom[p->AI].typeB, atype) == pi->AI)) &&
1627 ((pi->AJ == -1) || (get_atomtype_batype(at->atom[p->AJ].typeB, atype) == pi->AJ)) &&
1628 ((pi->AK == -1) || (get_atomtype_batype(at->atom[p->AK].typeB, atype) == pi->AK)) &&
1629 ((pi->AL == -1) || (get_atomtype_batype(at->atom[p->AL].typeB, atype) == pi->AL))
1636 for (i = 0; ((i < nr) && !bFound); i++)
1638 pi = &(bt[ftype].param[i]);
1641 ((pi->AI == -1) || (get_atomtype_batype(at->atom[p->AI].type, atype) == pi->AI)) &&
1642 ((pi->AJ == -1) || (get_atomtype_batype(at->atom[p->AJ].type, atype) == pi->AJ)) &&
1643 ((pi->AK == -1) || (get_atomtype_batype(at->atom[p->AK].type, atype) == pi->AK)) &&
1644 ((pi->AL == -1) || (get_atomtype_batype(at->atom[p->AL].type, atype) == pi->AL))
1648 /* Find additional matches for this dihedral - necessary for ftype==9 which is used e.g. for charmm.
1649 * The rules in that case is that additional matches HAVE to be on adjacent lines!
1655 /* Continue from current i value */
1656 for (j = i+1; j < nr && bSame; j += 2)
1658 pj = &(bt[ftype].param[j]);
1659 bSame = (pi->AI == pj->AI && pi->AJ == pj->AJ && pi->AK == pj->AK && pi->AL == pj->AL);
1664 /* nparam_found will be increased as long as the numbers match */
1668 else /* Not a dihedral */
1670 for (i = 0; ((i < nr) && !bFound); i++)
1672 pi = &(bt[ftype].param[i]);
1675 for (j = 0; ((j < nral) &&
1676 (get_atomtype_batype(at->atom[p->a[j]].typeB, atype) == pi->a[j])); j++)
1683 for (j = 0; ((j < nral) &&
1684 (get_atomtype_batype(at->atom[p->a[j]].type, atype) == pi->a[j])); j++)
1689 bFound = (j == nral);
1698 *nparam_def = nparam_found;
1705 void push_bond(directive d, t_params bondtype[], t_params bond[],
1706 t_atoms *at, gpp_atomtype_t atype, char *line,
1707 gmx_bool bBonded, gmx_bool bGenPairs, real fudgeQQ,
1708 gmx_bool bZero, gmx_bool *bWarn_copy_A_B,
1711 const char *aaformat[MAXATOMLIST] = {
1719 const char *asformat[MAXATOMLIST] = {
1724 "%*s%*s%*s%*s%*s%*s",
1725 "%*s%*s%*s%*s%*s%*s%*s"
1727 const char *ccformat = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
1728 int nr, i, j, nral, nral_fmt, nread, ftype;
1729 char format[STRLEN];
1730 /* One force parameter more, so we can check if we read too many */
1731 double cc[MAXFORCEPARAM+1];
1732 int aa[MAXATOMLIST+1];
1733 t_param param, paramB, *param_defA, *param_defB;
1734 gmx_bool bFoundA = FALSE, bFoundB = FALSE, bDef, bPert, bSwapParity = FALSE;
1735 int nparam_defA, nparam_defB;
1738 nparam_defA = nparam_defB = 0;
1740 ftype = ifunc_index(d, 1);
1742 for (j = 0; j < MAXATOMLIST; j++)
1746 bDef = (NRFP(ftype) > 0);
1748 if (ftype == F_SETTLE)
1750 /* SETTLE acts on 3 atoms, but the topology format only specifies
1751 * the first atom (for historical reasons).
1760 nread = sscanf(line, aaformat[nral_fmt-1],
1761 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
1763 if (ftype == F_SETTLE)
1770 if (nread < nral_fmt)
1775 else if (nread > nral_fmt)
1777 /* this is a hack to allow for virtual sites with swapped parity */
1778 bSwapParity = (aa[nral] < 0);
1781 aa[nral] = -aa[nral];
1783 ftype = ifunc_index(d, aa[nral]);
1792 gmx_fatal(FARGS, "Negative function types only allowed for %s and %s",
1793 interaction_function[F_VSITE3FAD].longname,
1794 interaction_function[F_VSITE3OUT].longname);
1800 /* Check for double atoms and atoms out of bounds */
1801 for (i = 0; (i < nral); i++)
1803 if (aa[i] < 1 || aa[i] > at->nr)
1805 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
1806 "Atom index (%d) in %s out of bounds (1-%d).\n"
1807 "This probably means that you have inserted topology section \"%s\"\n"
1808 "in a part belonging to a different molecule than you intended to.\n"
1809 "In that case move the \"%s\" section to the right molecule.",
1810 get_warning_file(wi), get_warning_line(wi),
1811 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
1813 for (j = i+1; (j < nral); j++)
1817 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
1818 warning(wi, errbuf);
1823 /* default force parameters */
1824 for (j = 0; (j < MAXATOMLIST); j++)
1826 param.a[j] = aa[j]-1;
1828 for (j = 0; (j < MAXFORCEPARAM); j++)
1833 /* Get force params for normal and free energy perturbation
1834 * studies, as determined by types!
1839 bFoundA = default_params(ftype, bondtype, at, atype, ¶m, FALSE, ¶m_defA, &nparam_defA);
1842 /* Copy the A-state and B-state default parameters */
1843 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
1845 param.c[j] = param_defA->c[j];
1848 bFoundB = default_params(ftype, bondtype, at, atype, ¶m, TRUE, ¶m_defB, &nparam_defB);
1851 /* Copy only the B-state default parameters */
1852 for (j = NRFPA(ftype); (j < NRFP(ftype)); j++)
1854 param.c[j] = param_defB->c[j];
1858 else if (ftype == F_LJ14)
1860 bFoundA = default_nb_params(ftype, bondtype, at, ¶m, 0, FALSE, bGenPairs);
1861 bFoundB = default_nb_params(ftype, bondtype, at, ¶m, 0, TRUE, bGenPairs);
1863 else if (ftype == F_LJC14_Q)
1865 param.c[0] = fudgeQQ;
1866 /* Fill in the A-state charges as default parameters */
1867 param.c[1] = at->atom[param.a[0]].q;
1868 param.c[2] = at->atom[param.a[1]].q;
1869 /* The default LJ parameters are the standard 1-4 parameters */
1870 bFoundA = default_nb_params(F_LJ14, bondtype, at, ¶m, 3, FALSE, bGenPairs);
1873 else if (ftype == F_LJC_PAIRS_NB)
1875 /* Defaults are not supported here */
1881 gmx_incons("Unknown function type in push_bond");
1884 if (nread > nral_fmt)
1886 /* Manually specified parameters - in this case we discard multiple torsion info! */
1888 strcpy(format, asformat[nral_fmt-1]);
1889 strcat(format, ccformat);
1891 nread = sscanf(line, format, &cc[0], &cc[1], &cc[2], &cc[3], &cc[4], &cc[5],
1892 &cc[6], &cc[7], &cc[8], &cc[9], &cc[10], &cc[11], &cc[12]);
1894 if ((nread == NRFPA(ftype)) && (NRFPB(ftype) != 0))
1896 /* We only have to issue a warning if these atoms are perturbed! */
1898 for (j = 0; (j < nral); j++)
1900 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
1903 if (bPert && *bWarn_copy_A_B)
1906 "Some parameters for bonded interaction involving perturbed atoms are specified explicitly in state A, but not B - copying A to B");
1907 warning(wi, errbuf);
1908 *bWarn_copy_A_B = FALSE;
1911 /* If only the A parameters were specified, copy them to the B state */
1912 /* The B-state parameters correspond to the first nrfpB
1913 * A-state parameters.
1915 for (j = 0; (j < NRFPB(ftype)); j++)
1917 cc[nread++] = cc[j];
1921 /* If nread was 0 or EOF, no parameters were read => use defaults.
1922 * If nread was nrfpA we copied above so nread=nrfp.
1923 * If nread was nrfp we are cool.
1924 * For F_LJC14_Q we allow supplying fudgeQQ only.
1925 * Anything else is an error!
1927 if ((nread != 0) && (nread != EOF) && (nread != NRFP(ftype)) &&
1928 !(ftype == F_LJC14_Q && nread == 1))
1930 gmx_fatal(FARGS, "Incorrect number of parameters - found %d, expected %d or %d for %s.",
1931 nread, NRFPA(ftype), NRFP(ftype),
1932 interaction_function[ftype].longname);
1935 for (j = 0; (j < nread); j++)
1940 /* Check whether we have to use the defaults */
1941 if (nread == NRFP(ftype))
1950 /* nread now holds the number of force parameters read! */
1955 /* When we have multiple terms it would be very dangerous to allow perturbations to a different atom type! */
1956 if (ftype == F_PDIHS)
1958 if ((nparam_defA != nparam_defB) || ((nparam_defA > 1 || nparam_defB > 1) && (param_defA != param_defB)))
1961 "Cannot automatically perturb a torsion with multiple terms to different form.\n"
1962 "Please specify perturbed parameters manually for this torsion in your topology!");
1963 warning_error(wi, errbuf);
1967 if (nread > 0 && nread < NRFPA(ftype))
1969 /* Issue an error, do not use defaults */
1970 sprintf(errbuf, "Not enough parameters, there should be at least %d (or 0 for defaults)", NRFPA(ftype));
1971 warning_error(wi, errbuf);
1974 if (nread == 0 || nread == EOF)
1978 if (interaction_function[ftype].flags & IF_VSITE)
1980 /* set them to NOTSET, will be calculated later */
1981 for (j = 0; (j < MAXFORCEPARAM); j++)
1983 param.c[j] = NOTSET;
1988 param.C1 = -1; /* flag to swap parity of vsite construction */
1995 fprintf(stderr, "NOTE: No default %s types, using zeroes\n",
1996 interaction_function[ftype].longname);
2000 sprintf(errbuf, "No default %s types", interaction_function[ftype].longname);
2001 warning_error(wi, errbuf);
2012 param.C0 = 360 - param.C0;
2015 param.C2 = -param.C2;
2022 /* We only have to issue a warning if these atoms are perturbed! */
2024 for (j = 0; (j < nral); j++)
2026 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
2031 sprintf(errbuf, "No default %s types for perturbed atoms, "
2032 "using normal values", interaction_function[ftype].longname);
2033 warning(wi, errbuf);
2039 if ((ftype == F_PDIHS || ftype == F_ANGRES || ftype == F_ANGRESZ)
2040 && param.c[5] != param.c[2])
2042 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2043 " %s multiplicity can not be perturbed %f!=%f",
2044 get_warning_file(wi), get_warning_line(wi),
2045 interaction_function[ftype].longname,
2046 param.c[2], param.c[5]);
2049 if (IS_TABULATED(ftype) && param.c[2] != param.c[0])
2051 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2052 " %s table number can not be perturbed %d!=%d",
2053 get_warning_file(wi), get_warning_line(wi),
2054 interaction_function[ftype].longname,
2055 (int)(param.c[0]+0.5), (int)(param.c[2]+0.5));
2058 /* Dont add R-B dihedrals where all parameters are zero (no interaction) */
2059 if (ftype == F_RBDIHS)
2062 for (i = 0; i < NRFP(ftype); i++)
2064 if (param.c[i] != 0)
2075 /* Put the values in the appropriate arrays */
2076 add_param_to_list (&bond[ftype], ¶m);
2078 /* Push additional torsions from FF for ftype==9 if we have them.
2079 * We have already checked that the A/B states do not differ in this case,
2080 * so we do not have to double-check that again, or the vsite stuff.
2081 * In addition, those torsions cannot be automatically perturbed.
2083 if (bDef && ftype == F_PDIHS)
2085 for (i = 1; i < nparam_defA; i++)
2087 /* Advance pointer! */
2089 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
2091 param.c[j] = param_defA->c[j];
2093 /* And push the next term for this torsion */
2094 add_param_to_list (&bond[ftype], ¶m);
2099 void push_cmap(directive d, t_params bondtype[], t_params bond[],
2100 t_atoms *at, gpp_atomtype_t atype, char *line,
2101 gmx_bool *bWarn_copy_A_B,
2104 const char *aaformat[MAXATOMLIST+1] =
2115 int i, j, nr, ftype, nral, nread, ncmap_params;
2117 int aa[MAXATOMLIST+1];
2120 t_param param, paramB, *param_defA, *param_defB;
2122 ftype = ifunc_index(d, 1);
2124 nr = bondtype[ftype].nr;
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(ftype, 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 bondtype[], t_params bond[],
2195 t_atoms *at, gpp_atomtype_t atype, 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 ret = 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,
2313 if (sscanf(pline, "%s%d", type, &copies) != 2)
2319 /* search moleculename */
2320 for (i = 0; ((i < nrmols) && gmx_strcasecmp(type, *(mols[i].name))); i++)
2332 gmx_fatal(FARGS, "No such moleculetype %s", type);
2336 void init_block2(t_block2 *b2, int natom)
2341 snew(b2->nra, b2->nr);
2342 snew(b2->a, b2->nr);
2343 for (i = 0; (i < b2->nr); i++)
2349 void done_block2(t_block2 *b2)
2355 for (i = 0; (i < b2->nr); i++)
2365 void push_excl(char *line, t_block2 *b2)
2369 char base[STRLEN], format[STRLEN];
2371 if (sscanf(line, "%d", &i) == 0)
2376 if ((1 <= i) && (i <= b2->nr))
2384 fprintf(debug, "Unbound atom %d\n", i-1);
2388 strcpy(base, "%*d");
2391 strcpy(format, base);
2392 strcat(format, "%d");
2393 n = sscanf(line, format, &j);
2396 if ((1 <= j) && (j <= b2->nr))
2399 srenew(b2->a[i], ++(b2->nra[i]));
2400 b2->a[i][b2->nra[i]-1] = j;
2401 /* also add the reverse exclusion! */
2402 srenew(b2->a[j], ++(b2->nra[j]));
2403 b2->a[j][b2->nra[j]-1] = i;
2404 strcat(base, "%*d");
2408 gmx_fatal(FARGS, "Invalid Atomnr j: %d, b2->nr: %d\n", j, b2->nr);
2415 void b_to_b2(t_blocka *b, t_block2 *b2)
2420 for (i = 0; (i < b->nr); i++)
2422 for (j = b->index[i]; (j < b->index[i+1]); j++)
2425 srenew(b2->a[i], ++b2->nra[i]);
2426 b2->a[i][b2->nra[i]-1] = a;
2431 void b2_to_b(t_block2 *b2, t_blocka *b)
2437 for (i = 0; (i < b2->nr); i++)
2440 for (j = 0; (j < b2->nra[i]); j++)
2442 b->a[nra+j] = b2->a[i][j];
2446 /* terminate list */
2450 static int icomp(const void *v1, const void *v2)
2452 return (*((atom_id *) v1))-(*((atom_id *) v2));
2455 void merge_excl(t_blocka *excl, t_block2 *b2)
2465 else if (b2->nr != excl->nr)
2467 gmx_fatal(FARGS, "DEATH HORROR: b2->nr = %d, while excl->nr = %d",
2472 fprintf(debug, "Entering merge_excl\n");
2475 /* First copy all entries from excl to b2 */
2478 /* Count and sort the exclusions */
2480 for (i = 0; (i < b2->nr); i++)
2484 /* remove double entries */
2485 qsort(b2->a[i], (size_t)b2->nra[i], (size_t)sizeof(b2->a[i][0]), icomp);
2487 for (j = 1; (j < b2->nra[i]); j++)
2489 if (b2->a[i][j] != b2->a[i][k-1])
2491 b2->a[i][k] = b2->a[i][j];
2500 srenew(excl->a, excl->nra);
2505 int add_atomtype_decoupled(t_symtab *symtab, gpp_atomtype_t at,
2506 t_nbparam ***nbparam, t_nbparam ***pair)
2512 /* Define an atom type with all parameters set to zero (no interactions) */
2515 /* Type for decoupled atoms could be anything,
2516 * this should be changed automatically later when required.
2518 atom.ptype = eptAtom;
2519 for (i = 0; (i < MAXFORCEPARAM); i++)
2524 nr = add_atomtype(at, symtab, &atom, "decoupled", ¶m, -1, 0.0, 0.0, 0.0, 0, 0, 0);
2526 /* Add space in the non-bonded parameters matrix */
2527 realloc_nb_params(at, nbparam, pair);
2532 static void convert_pairs_to_pairsQ(t_params *plist,
2533 real fudgeQQ, t_atoms *atoms)
2535 t_param *paramp1,*paramp2,*paramnew;
2536 int i,j,p1nr,p2nr,p2newnr;
2538 /* Add the pair list to the pairQ list */
2539 p1nr = plist[F_LJ14].nr;
2540 p2nr = plist[F_LJC14_Q].nr;
2541 p2newnr = p1nr + p2nr;
2542 snew(paramnew,p2newnr);
2544 paramp1 = plist[F_LJ14].param;
2545 paramp2 = plist[F_LJC14_Q].param;
2547 /* Fill in the new F_LJC14_Q array with the old one. NOTE:
2548 it may be possible to just ADD the converted F_LJ14 array
2549 to the old F_LJC14_Q array, but since we have to create
2550 a new sized memory structure, better just to deep copy it all.
2553 for (i = 0; i < p2nr; i++)
2555 /* Copy over parameters */
2556 for (j=0;j<5;j++) /* entries are 0-4 for F_LJC14_Q */
2558 paramnew[i].c[j] = paramp2[i].c[j];
2561 /* copy over atoms */
2564 paramnew[i].a[j] = paramp2[i].a[j];
2568 for (i = p2nr; i < p2newnr; i++)
2572 /* Copy over parameters */
2573 paramnew[i].c[0] = fudgeQQ;
2574 paramnew[i].c[1] = atoms->atom[paramp1[j].a[0]].q;
2575 paramnew[i].c[2] = atoms->atom[paramp1[j].a[1]].q;
2576 paramnew[i].c[3] = paramp1[j].c[0];
2577 paramnew[i].c[4] = paramp1[j].c[1];
2579 /* copy over atoms */
2580 paramnew[i].a[0] = paramp1[j].a[0];
2581 paramnew[i].a[1] = paramp1[j].a[1];
2584 /* free the old pairlists */
2585 sfree(plist[F_LJC14_Q].param);
2586 sfree(plist[F_LJ14].param);
2588 /* now assign the new data to the F_LJC14_Q structure */
2589 plist[F_LJC14_Q].param = paramnew;
2590 plist[F_LJC14_Q].nr = p2newnr;
2592 /* Empty the LJ14 pairlist */
2593 plist[F_LJ14].nr = 0;
2594 plist[F_LJ14].param = NULL;
2597 static void generate_LJCpairsNB(t_molinfo *mol, int nb_funct, t_params *nbp)
2599 int n, ntype, i, j, k;
2606 atom = mol->atoms.atom;
2608 ntype = sqrt(nbp->nr);
2610 for (i = 0; i < MAXATOMLIST; i++)
2612 param.a[i] = NOTSET;
2614 for (i = 0; i < MAXFORCEPARAM; i++)
2616 param.c[i] = NOTSET;
2619 /* Add a pair interaction for all non-excluded atom pairs */
2621 for (i = 0; i < n; i++)
2623 for (j = i+1; j < n; j++)
2626 for (k = excl->index[i]; k < excl->index[i+1]; k++)
2628 if (excl->a[k] == j)
2635 if (nb_funct != F_LJ)
2637 gmx_fatal(FARGS, "Can only generate non-bonded pair interactions for Van der Waals type Lennard-Jones");
2641 param.c[0] = atom[i].q;
2642 param.c[1] = atom[j].q;
2643 param.c[2] = nbp->param[ntype*atom[i].type+atom[j].type].c[0];
2644 param.c[3] = nbp->param[ntype*atom[i].type+atom[j].type].c[1];
2645 add_param_to_list(&mol->plist[F_LJC_PAIRS_NB], ¶m);
2651 static void set_excl_all(t_blocka *excl)
2655 /* Get rid of the current exclusions and exclude all atom pairs */
2657 excl->nra = nat*nat;
2658 srenew(excl->a, excl->nra);
2660 for (i = 0; i < nat; i++)
2663 for (j = 0; j < nat; j++)
2668 excl->index[nat] = k;
2671 static void decouple_atoms(t_atoms *atoms, int atomtype_decouple,
2672 int couple_lam0, int couple_lam1)
2676 for (i = 0; i < atoms->nr; i++)
2678 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamVDW)
2680 atoms->atom[i].q = 0.0;
2682 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamQ)
2684 atoms->atom[i].type = atomtype_decouple;
2686 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamVDW)
2688 atoms->atom[i].qB = 0.0;
2690 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamQ)
2692 atoms->atom[i].typeB = atomtype_decouple;
2697 void convert_moltype_couple(t_molinfo *mol, int atomtype_decouple, real fudgeQQ,
2698 int couple_lam0, int couple_lam1,
2699 gmx_bool bCoupleIntra, int nb_funct, t_params *nbp)
2701 convert_pairs_to_pairsQ(mol->plist, fudgeQQ, &mol->atoms);
2704 generate_LJCpairsNB(mol, nb_funct, nbp);
2705 set_excl_all(&mol->excls);
2707 decouple_atoms(&mol->atoms, atomtype_decouple, couple_lam0, couple_lam1);