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, 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.
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 epsilon and sigma */
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] = (ci0+cj0)*0.5;
108 plist->param[k].c[1] = sqrt(ci1*cj1);
113 case eCOMB_GEOM_SIG_EPS:
114 /* c0 and c1 are epsilon and sigma */
115 for (i = k = 0; (i < nr); i++)
117 for (j = 0; (j < nr); j++, k++)
119 ci0 = get_atomtype_nbparam(i, 0, atype);
120 cj0 = get_atomtype_nbparam(j, 0, atype);
121 ci1 = get_atomtype_nbparam(i, 1, atype);
122 cj1 = get_atomtype_nbparam(j, 1, atype);
123 plist->param[k].c[0] = sqrt(ci0*cj0);
124 plist->param[k].c[1] = sqrt(ci1*cj1);
130 gmx_fatal(FARGS, "No such combination rule %d", comb);
134 gmx_incons("Topology processing, generate nb parameters");
139 /* Buckingham rules */
140 for (i = k = 0; (i < nr); i++)
142 for (j = 0; (j < nr); j++, k++)
144 ci0 = get_atomtype_nbparam(i, 0, atype);
145 cj0 = get_atomtype_nbparam(j, 0, atype);
146 ci2 = get_atomtype_nbparam(i, 2, atype);
147 cj2 = get_atomtype_nbparam(j, 2, atype);
148 bi = get_atomtype_nbparam(i, 1, atype);
149 bj = get_atomtype_nbparam(j, 1, atype);
150 plist->param[k].c[0] = sqrt(ci0 * cj0);
151 if ((bi == 0) || (bj == 0))
153 plist->param[k].c[1] = 0;
157 plist->param[k].c[1] = 2.0/(1/bi+1/bj);
159 plist->param[k].c[2] = sqrt(ci2 * cj2);
165 sprintf(errbuf, "Invalid nonbonded type %s",
166 interaction_function[ftype].longname);
167 warning_error(wi, errbuf);
171 static void realloc_nb_params(gpp_atomtype_t at,
172 t_nbparam ***nbparam, t_nbparam ***pair)
174 /* Add space in the non-bonded parameters matrix */
175 int atnr = get_atomtype_ntypes(at);
176 srenew(*nbparam, atnr);
177 snew((*nbparam)[atnr-1], atnr);
181 snew((*pair)[atnr-1], atnr);
185 static void copy_B_from_A(int ftype, double *c)
189 nrfpA = NRFPA(ftype);
190 nrfpB = NRFPB(ftype);
192 /* Copy the B parameters from the first nrfpB A parameters */
193 for (i = 0; (i < nrfpB); i++)
199 void push_at (t_symtab *symtab, gpp_atomtype_t at, t_bond_atomtype bat,
200 char *line, int nb_funct,
201 t_nbparam ***nbparam, t_nbparam ***pair,
208 t_xlate xl[eptNR] = {
216 int nr, i, nfields, j, pt, nfp0 = -1;
217 int batype_nr, nread;
218 char type[STRLEN], btype[STRLEN], ptype[STRLEN];
220 double c[MAXFORCEPARAM];
221 double radius, vol, surftens, gb_radius, S_hct;
222 char tmpfield[12][100]; /* Max 12 fields of width 100 */
227 gmx_bool have_atomic_number;
228 gmx_bool have_bonded_type;
233 /* First assign input line to temporary array */
234 nfields = sscanf(line, "%s%s%s%s%s%s%s%s%s%s%s%s",
235 tmpfield[0], tmpfield[1], tmpfield[2], tmpfield[3], tmpfield[4], tmpfield[5],
236 tmpfield[6], tmpfield[7], tmpfield[8], tmpfield[9], tmpfield[10], tmpfield[11]);
238 /* Comments on optional fields in the atomtypes section:
240 * The force field format is getting a bit old. For OPLS-AA we needed
241 * to add a special bonded atomtype, and for Gerrit Groenhofs QM/MM stuff
242 * we also needed the atomic numbers.
243 * To avoid making all old or user-generated force fields unusable we
244 * have introduced both these quantities as optional columns, and do some
245 * acrobatics to check whether they are present or not.
246 * This will all look much nicer when we switch to XML... sigh.
248 * Field 0 (mandatory) is the nonbonded type name. (string)
249 * Field 1 (optional) is the bonded type (string)
250 * Field 2 (optional) is the atomic number (int)
251 * Field 3 (mandatory) is the mass (numerical)
252 * Field 4 (mandatory) is the charge (numerical)
253 * Field 5 (mandatory) is the particle type (single character)
254 * This is followed by a number of nonbonded parameters.
256 * The safest way to identify the format is the particle type field.
258 * So, here is what we do:
260 * A. Read in the first six fields as strings
261 * B. If field 3 (starting from 0) is a single char, we have neither
262 * bonded_type or atomic numbers.
263 * C. If field 5 is a single char we have both.
264 * D. If field 4 is a single char we check field 1. If this begins with
265 * an alphabetical character we have bonded types, otherwise atomic numbers.
274 if ( (strlen(tmpfield[5]) == 1) && isalpha(tmpfield[5][0]) )
276 have_bonded_type = TRUE;
277 have_atomic_number = TRUE;
279 else if ( (strlen(tmpfield[3]) == 1) && isalpha(tmpfield[3][0]) )
281 have_bonded_type = FALSE;
282 have_atomic_number = FALSE;
286 have_bonded_type = ( isalpha(tmpfield[1][0]) != 0 );
287 have_atomic_number = !have_bonded_type;
290 /* optional fields */
304 if (have_atomic_number)
306 if (have_bonded_type)
308 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf",
309 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1],
310 &radius, &vol, &surftens, &gb_radius);
319 /* have_atomic_number && !have_bonded_type */
320 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf",
321 type, &atomnr, &m, &q, ptype, &c[0], &c[1],
322 &radius, &vol, &surftens, &gb_radius);
332 if (have_bonded_type)
334 /* !have_atomic_number && have_bonded_type */
335 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf%lf%lf%lf%lf",
336 type, btype, &m, &q, ptype, &c[0], &c[1],
337 &radius, &vol, &surftens, &gb_radius);
346 /* !have_atomic_number && !have_bonded_type */
347 nread = sscanf(line, "%s%lf%lf%s%lf%lf%lf%lf%lf%lf",
348 type, &m, &q, ptype, &c[0], &c[1],
349 &radius, &vol, &surftens, &gb_radius);
358 if (!have_bonded_type)
363 if (!have_atomic_number)
373 if (have_atomic_number)
375 if (have_bonded_type)
377 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
378 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2],
379 &radius, &vol, &surftens, &gb_radius);
388 /* have_atomic_number && !have_bonded_type */
389 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
390 type, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2],
391 &radius, &vol, &surftens, &gb_radius);
401 if (have_bonded_type)
403 /* !have_atomic_number && have_bonded_type */
404 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
405 type, btype, &m, &q, ptype, &c[0], &c[1], &c[2],
406 &radius, &vol, &surftens, &gb_radius);
415 /* !have_atomic_number && !have_bonded_type */
416 nread = sscanf(line, "%s%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
417 type, &m, &q, ptype, &c[0], &c[1], &c[2],
418 &radius, &vol, &surftens, &gb_radius);
427 if (!have_bonded_type)
432 if (!have_atomic_number)
440 gmx_fatal(FARGS, "Invalid function type %d in push_at %s %d", nb_funct,
443 for (j = nfp0; (j < MAXFORCEPARAM); j++)
448 if (strlen(type) == 1 && isdigit(type[0]))
450 gmx_fatal(FARGS, "Atom type names can't be single digits.");
453 if (strlen(btype) == 1 && isdigit(btype[0]))
455 gmx_fatal(FARGS, "Bond atom type names can't be single digits.");
458 /* Hack to read old topologies */
459 if (gmx_strcasecmp(ptype, "D") == 0)
463 for (j = 0; (j < eptNR); j++)
465 if (gmx_strcasecmp(ptype, xl[j].entry) == 0)
472 gmx_fatal(FARGS, "Invalid particle type %s on line %s",
478 fprintf(debug, "ptype: %s\n", ptype_str[pt]);
484 for (i = 0; (i < MAXFORCEPARAM); i++)
489 if ((batype_nr = get_bond_atomtype_type(btype, bat)) == NOTSET)
491 add_bond_atomtype(bat, symtab, btype);
493 batype_nr = get_bond_atomtype_type(btype, bat);
495 if ((nr = get_atomtype_type(type, at)) != NOTSET)
497 sprintf(errbuf, "Overriding atomtype %s", type);
499 if ((nr = set_atomtype(nr, at, symtab, atom, type, param, batype_nr,
500 radius, vol, surftens, atomnr, gb_radius, S_hct)) == NOTSET)
502 gmx_fatal(FARGS, "Replacing atomtype %s failed", type);
505 else if ((nr = add_atomtype(at, symtab, atom, type, param,
506 batype_nr, radius, vol,
507 surftens, atomnr, gb_radius, S_hct)) == NOTSET)
509 gmx_fatal(FARGS, "Adding atomtype %s failed", type);
513 /* Add space in the non-bonded parameters matrix */
514 realloc_nb_params(at, nbparam, pair);
520 static void push_bondtype(t_params * bt,
524 gmx_bool bAllowRepeat,
529 gmx_bool bTest, bFound, bCont, bId;
531 int nrfp = NRFP(ftype);
534 /* If bAllowRepeat is TRUE, we allow multiple entries as long as they
535 are on directly _adjacent_ lines.
538 /* First check if our atomtypes are _identical_ (not reversed) to the previous
539 entry. If they are not identical we search for earlier duplicates. If they are
540 we can skip it, since we already searched for the first line
547 if (bAllowRepeat && nr > 1)
549 for (j = 0, bCont = TRUE; (j < nral); j++)
551 bCont = bCont && (b->a[j] == bt->param[nr-2].a[j]);
555 /* Search for earlier duplicates if this entry was not a continuation
556 from the previous line.
561 for (i = 0; (i < nr); i++)
564 for (j = 0; (j < nral); j++)
566 bTest = (bTest && (b->a[j] == bt->param[i].a[j]));
571 for (j = 0; (j < nral); j++)
573 bTest = (bTest && (b->a[nral-1-j] == bt->param[i].a[j]));
581 for (j = 0; (j < nrfp); j++)
583 bId = bId && (bt->param[i].c[j] == b->c[j]);
587 sprintf(errbuf, "Overriding %s parameters.%s",
588 interaction_function[ftype].longname,
589 (ftype == F_PDIHS) ? "\nUse dihedraltype 4 to allow several multiplicity terms." : "");
591 fprintf(stderr, " old:");
592 for (j = 0; (j < nrfp); j++)
594 fprintf(stderr, " %g", bt->param[i].c[j]);
596 fprintf(stderr, " \n new: %s\n\n", line);
600 for (j = 0; (j < nrfp); j++)
602 bt->param[i].c[j] = b->c[j];
613 /* fill the arrays up and down */
614 memcpy(bt->param[bt->nr].c, b->c, sizeof(b->c));
615 memcpy(bt->param[bt->nr].a, b->a, sizeof(b->a));
616 memcpy(bt->param[bt->nr+1].c, b->c, sizeof(b->c));
618 /* The definitions of linear angles depend on the order of atoms,
619 * that means that for atoms i-j-k, with certain parameter a, the
620 * corresponding k-j-i angle will have parameter 1-a.
622 if (ftype == F_LINEAR_ANGLES)
624 bt->param[bt->nr+1].c[0] = 1-bt->param[bt->nr+1].c[0];
625 bt->param[bt->nr+1].c[2] = 1-bt->param[bt->nr+1].c[2];
628 for (j = 0; (j < nral); j++)
630 bt->param[bt->nr+1].a[j] = b->a[nral-1-j];
637 void push_bt(directive d, t_params bt[], int nral,
639 t_bond_atomtype bat, char *line,
642 const char *formal[MAXATOMLIST+1] = {
651 const char *formnl[MAXATOMLIST+1] = {
657 "%*s%*s%*s%*s%*s%*s",
658 "%*s%*s%*s%*s%*s%*s%*s"
660 const char *formlf = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
661 int i, ft, ftype, nn, nrfp, nrfpA, nrfpB;
663 char alc[MAXATOMLIST+1][20];
664 /* One force parameter more, so we can check if we read too many */
665 double c[MAXFORCEPARAM+1];
669 if ((bat && at) || (!bat && !at))
671 gmx_incons("You should pass either bat or at to push_bt");
674 /* Make format string (nral ints+functype) */
675 if ((nn = sscanf(line, formal[nral],
676 alc[0], alc[1], alc[2], alc[3], alc[4], alc[5])) != nral+1)
678 sprintf(errbuf, "Not enough atomtypes (%d instead of %d)", nn-1, nral);
679 warning_error(wi, errbuf);
683 ft = strtol(alc[nral], NULL, 10);
684 ftype = ifunc_index(d, ft);
686 nrfpA = interaction_function[ftype].nrfpA;
687 nrfpB = interaction_function[ftype].nrfpB;
688 strcpy(f1, formnl[nral]);
690 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]))
695 /* Copy the B-state from the A-state */
696 copy_B_from_A(ftype, c);
702 warning_error(wi, "Not enough parameters");
704 else if (nn > nrfpA && nn < nrfp)
706 warning_error(wi, "Too many parameters or not enough parameters for topology B");
710 warning_error(wi, "Too many parameters");
712 for (i = nn; (i < nrfp); i++)
718 for (i = 0; (i < nral); i++)
720 if (at && ((p.a[i] = get_atomtype_type(alc[i], at)) == NOTSET))
722 gmx_fatal(FARGS, "Unknown atomtype %s\n", alc[i]);
724 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
726 gmx_fatal(FARGS, "Unknown bond_atomtype %s\n", alc[i]);
729 for (i = 0; (i < nrfp); i++)
733 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
737 void push_dihedraltype(directive d, t_params bt[],
738 t_bond_atomtype bat, char *line,
741 const char *formal[MAXATOMLIST+1] = {
750 const char *formnl[MAXATOMLIST+1] = {
756 "%*s%*s%*s%*s%*s%*s",
757 "%*s%*s%*s%*s%*s%*s%*s"
759 const char *formlf[MAXFORCEPARAM] = {
765 "%lf%lf%lf%lf%lf%lf",
766 "%lf%lf%lf%lf%lf%lf%lf",
767 "%lf%lf%lf%lf%lf%lf%lf%lf",
768 "%lf%lf%lf%lf%lf%lf%lf%lf%lf",
769 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
770 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
771 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
773 int i, ft, ftype, nn, nrfp, nrfpA, nrfpB, nral;
775 char alc[MAXATOMLIST+1][20];
776 double c[MAXFORCEPARAM];
778 gmx_bool bAllowRepeat;
781 /* This routine accepts dihedraltypes defined from either 2 or 4 atoms.
783 * We first check for 2 atoms with the 3th column being an integer
784 * defining the type. If this isn't the case, we try it with 4 atoms
785 * and the 5th column defining the dihedral type.
787 nn = sscanf(line, formal[4], alc[0], alc[1], alc[2], alc[3], alc[4]);
788 if (nn >= 3 && strlen(alc[2]) == 1 && isdigit(alc[2][0]))
791 ft = strtol(alc[nral], NULL, 10);
792 /* Move atom types around a bit and use 'X' for wildcard atoms
793 * to create a 4-atom dihedral definition with arbitrary atoms in
796 if (alc[2][0] == '2')
798 /* improper - the two atomtypes are 1,4. Use wildcards for 2,3 */
799 strcpy(alc[3], alc[1]);
800 sprintf(alc[2], "X");
801 sprintf(alc[1], "X");
802 /* alc[0] stays put */
806 /* proper - the two atomtypes are 2,3. Use wildcards for 1,4 */
807 sprintf(alc[3], "X");
808 strcpy(alc[2], alc[1]);
809 strcpy(alc[1], alc[0]);
810 sprintf(alc[0], "X");
813 else if (nn == 5 && strlen(alc[4]) == 1 && isdigit(alc[4][0]))
816 ft = strtol(alc[nral], NULL, 10);
820 sprintf(errbuf, "Incorrect number of atomtypes for dihedral (%d instead of 2 or 4)", nn-1);
821 warning_error(wi, errbuf);
827 /* Previously, we have always overwritten parameters if e.g. a torsion
828 with the same atomtypes occurs on multiple lines. However, CHARMM and
829 some other force fields specify multiple dihedrals over some bonds,
830 including cosines with multiplicity 6 and somethimes even higher.
831 Thus, they cannot be represented with Ryckaert-Bellemans terms.
832 To add support for these force fields, Dihedral type 9 is identical to
833 normal proper dihedrals, but repeated entries are allowed.
840 bAllowRepeat = FALSE;
844 ftype = ifunc_index(d, ft);
846 nrfpA = interaction_function[ftype].nrfpA;
847 nrfpB = interaction_function[ftype].nrfpB;
849 strcpy(f1, formnl[nral]);
850 strcat(f1, formlf[nrfp-1]);
852 /* Check number of parameters given */
853 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]))
858 /* Copy the B-state from the A-state */
859 copy_B_from_A(ftype, c);
865 warning_error(wi, "Not enough parameters");
867 else if (nn > nrfpA && nn < nrfp)
869 warning_error(wi, "Too many parameters or not enough parameters for topology B");
873 warning_error(wi, "Too many parameters");
875 for (i = nn; (i < nrfp); i++)
882 for (i = 0; (i < 4); i++)
884 if (!strcmp(alc[i], "X"))
890 if ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET)
892 gmx_fatal(FARGS, "Unknown bond_atomtype %s", alc[i]);
896 for (i = 0; (i < nrfp); i++)
900 /* Always use 4 atoms here, since we created two wildcard atoms
901 * if there wasn't of them 4 already.
903 push_bondtype (&(bt[ftype]), &p, 4, ftype, bAllowRepeat, line, wi);
907 void push_nbt(directive d, t_nbparam **nbt, gpp_atomtype_t atype,
908 char *pline, int nb_funct,
912 const char *form2 = "%*s%*s%*s%lf%lf";
913 const char *form3 = "%*s%*s%*s%lf%lf%lf";
914 const char *form4 = "%*s%*s%*s%lf%lf%lf%lf";
915 const char *form5 = "%*s%*s%*s%lf%lf%lf%lf%lf";
917 int i, f, n, ftype, atnr, nrfp;
925 if (sscanf (pline, "%s%s%d", a0, a1, &f) != 3)
931 ftype = ifunc_index(d, f);
933 if (ftype != nb_funct)
935 sprintf(errbuf, "Trying to add %s while the default nonbond type is %s",
936 interaction_function[ftype].longname,
937 interaction_function[nb_funct].longname);
938 warning_error(wi, errbuf);
942 /* Get the force parameters */
946 n = sscanf(pline, form4, &c[0], &c[1], &c[2], &c[3]);
952 /* When the B topology parameters are not set,
953 * copy them from topology A
956 for (i = n; i < nrfp; i++)
961 else if (ftype == F_LJC14_Q)
963 n = sscanf(pline, form5, &c[0], &c[1], &c[2], &c[3], &dum);
966 incorrect_n_param(wi);
972 if (sscanf(pline, form3, &c[0], &c[1], &dum) != 2)
974 incorrect_n_param(wi);
980 if (sscanf(pline, form4, &c[0], &c[1], &c[2], &dum) != 3)
982 incorrect_n_param(wi);
988 gmx_fatal(FARGS, "Number of force parameters for nonbonded interactions is %d"
989 " in file %s, line %d", nrfp, __FILE__, __LINE__);
991 for (i = 0; (i < nrfp); i++)
996 /* Put the parameters in the matrix */
997 if ((ai = get_atomtype_type (a0, atype)) == NOTSET)
999 gmx_fatal(FARGS, "Atomtype %s not found", a0);
1001 if ((aj = get_atomtype_type (a1, atype)) == NOTSET)
1003 gmx_fatal(FARGS, "Atomtype %s not found", a1);
1005 nbp = &(nbt[max(ai, aj)][min(ai, aj)]);
1010 for (i = 0; i < nrfp; i++)
1012 bId = bId && (nbp->c[i] == cr[i]);
1016 sprintf(errbuf, "Overriding non-bonded parameters,");
1017 warning(wi, errbuf);
1018 fprintf(stderr, " old:");
1019 for (i = 0; i < nrfp; i++)
1021 fprintf(stderr, " %g", nbp->c[i]);
1023 fprintf(stderr, " new\n%s\n", pline);
1027 for (i = 0; i < nrfp; i++)
1034 push_gb_params (gpp_atomtype_t at, char *line,
1039 double radius, vol, surftens, gb_radius, S_hct;
1040 char atypename[STRLEN];
1041 char errbuf[STRLEN];
1043 if ( (nfield = sscanf(line, "%s%lf%lf%lf%lf%lf", atypename, &radius, &vol, &surftens, &gb_radius, &S_hct)) != 6)
1045 sprintf(errbuf, "Too few gb parameters for type %s\n", atypename);
1046 warning(wi, errbuf);
1049 /* Search for atomtype */
1050 atype = get_atomtype_type(atypename, at);
1052 if (atype == NOTSET)
1054 printf("Couldn't find topology match for atomtype %s\n", atypename);
1058 set_atomtype_gbparam(at, atype, radius, vol, surftens, gb_radius, S_hct);
1062 push_cmaptype(directive d, t_params bt[], int nral, gpp_atomtype_t at,
1063 t_bond_atomtype bat, char *line,
1066 const char *formal = "%s%s%s%s%s%s%s%s";
1068 int i, j, ft, ftype, nn, nrfp, nrfpA, nrfpB;
1070 int nxcmap, nycmap, ncmap, read_cmap, sl, nct;
1071 char s[20], alc[MAXATOMLIST+2][20];
1073 gmx_bool bAllowRepeat;
1076 /* Keep the compiler happy */
1080 if ((nn = sscanf(line, formal, alc[0], alc[1], alc[2], alc[3], alc[4], alc[5], alc[6], alc[7])) != nral+3)
1082 sprintf(errbuf, "Incorrect number of atomtypes for cmap (%d instead of 5)", nn-1);
1083 warning_error(wi, errbuf);
1087 /* Compute an offset for each line where the cmap parameters start
1088 * ie. where the atom types and grid spacing information ends
1090 for (i = 0; i < nn; i++)
1092 start += (int)strlen(alc[i]);
1095 /* There are nn-1 spaces between the atom types and the grid spacing info in the cmap.itp file */
1096 /* start is the position on the line where we start to read the actual cmap grid data from the itp file */
1097 start = start + nn -1;
1099 ft = strtol(alc[nral], NULL, 10);
1100 nxcmap = strtol(alc[nral+1], NULL, 10);
1101 nycmap = strtol(alc[nral+2], NULL, 10);
1103 /* Check for equal grid spacing in x and y dims */
1104 if (nxcmap != nycmap)
1106 gmx_fatal(FARGS, "Not the same grid spacing in x and y for cmap grid: x=%d, y=%d", nxcmap, nycmap);
1109 ncmap = nxcmap*nycmap;
1110 ftype = ifunc_index(d, ft);
1111 nrfpA = strtol(alc[6], NULL, 10)*strtol(alc[6], NULL, 10);
1112 nrfpB = strtol(alc[7], NULL, 10)*strtol(alc[7], NULL, 10);
1115 /* Allocate memory for the CMAP grid */
1117 srenew(bt->cmap, bt->ncmap);
1119 /* Read in CMAP parameters */
1121 for (i = 0; i < ncmap; i++)
1123 while (isspace(*(line+start+sl)))
1127 nn = sscanf(line+start+sl, " %s ", s);
1129 bt->cmap[i+(bt->ncmap)-nrfp] = strtod(s, NULL);
1137 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]);
1142 /* Check do that we got the number of parameters we expected */
1143 if (read_cmap == nrfpA)
1145 for (i = 0; i < ncmap; i++)
1147 bt->cmap[i+ncmap] = bt->cmap[i];
1152 if (read_cmap < nrfpA)
1154 warning_error(wi, "Not enough cmap parameters");
1156 else if (read_cmap > nrfpA && read_cmap < nrfp)
1158 warning_error(wi, "Too many cmap parameters or not enough parameters for topology B");
1160 else if (read_cmap > nrfp)
1162 warning_error(wi, "Too many cmap parameters");
1167 /* Set grid spacing and the number of grids (we assume these numbers to be the same for all grids
1168 * so we can safely assign them each time
1170 bt->grid_spacing = nxcmap; /* Or nycmap, they need to be equal */
1171 bt->nc = bt->nc + 1; /* Since we are incrementing here, we need to subtract later, see (*****) */
1172 nct = (nral+1) * bt->nc;
1174 /* Allocate memory for the cmap_types information */
1175 srenew(bt->cmap_types, nct);
1177 for (i = 0; (i < nral); i++)
1179 if (at && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1181 gmx_fatal(FARGS, "Unknown atomtype %s\n", alc[i]);
1183 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1185 gmx_fatal(FARGS, "Unknown bond_atomtype %s\n", alc[i]);
1188 /* Assign a grid number to each cmap_type */
1189 bt->cmap_types[bt->nct++] = get_bond_atomtype_type(alc[i], bat);
1192 /* Assign a type number to this cmap */
1193 bt->cmap_types[bt->nct++] = bt->nc-1; /* Since we inremented earlier, we need to subtrac here, to get the types right (****) */
1195 /* Check for the correct number of atoms (again) */
1198 gmx_fatal(FARGS, "Incorrect number of atom types (%d) in cmap type %d\n", nct, bt->nc);
1201 /* Is this correct?? */
1202 for (i = 0; i < MAXFORCEPARAM; i++)
1207 /* Push the bond to the bondlist */
1208 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
1212 static void push_atom_now(t_symtab *symtab, t_atoms *at, int atomnr,
1214 int type, char *ctype, int ptype,
1216 char *resname, char *name, real m0, real q0,
1217 int typeB, char *ctypeB, real mB, real qB)
1219 int j, resind = 0, resnr;
1223 if (((nr == 0) && (atomnr != 1)) || (nr && (atomnr != at->nr+1)))
1225 gmx_fatal(FARGS, "Atoms in the .top are not numbered consecutively from 1 (rather, atomnr = %d, while at->nr = %d)", atomnr, at->nr);
1228 j = strlen(resnumberic) - 1;
1229 if (isdigit(resnumberic[j]))
1235 ric = resnumberic[j];
1236 if (j == 0 || !isdigit(resnumberic[j-1]))
1238 gmx_fatal(FARGS, "Invalid residue number '%s' for atom %d",
1239 resnumberic, atomnr);
1242 resnr = strtol(resnumberic, NULL, 10);
1246 resind = at->atom[nr-1].resind;
1248 if (nr == 0 || strcmp(resname, *at->resinfo[resind].name) != 0 ||
1249 resnr != at->resinfo[resind].nr ||
1250 ric != at->resinfo[resind].ic)
1260 at->nres = resind + 1;
1261 srenew(at->resinfo, at->nres);
1262 at->resinfo[resind].name = put_symtab(symtab, resname);
1263 at->resinfo[resind].nr = resnr;
1264 at->resinfo[resind].ic = ric;
1268 resind = at->atom[at->nr-1].resind;
1271 /* New atom instance
1272 * get new space for arrays
1274 srenew(at->atom, nr+1);
1275 srenew(at->atomname, nr+1);
1276 srenew(at->atomtype, nr+1);
1277 srenew(at->atomtypeB, nr+1);
1280 at->atom[nr].type = type;
1281 at->atom[nr].ptype = ptype;
1282 at->atom[nr].q = q0;
1283 at->atom[nr].m = m0;
1284 at->atom[nr].typeB = typeB;
1285 at->atom[nr].qB = qB;
1286 at->atom[nr].mB = mB;
1288 at->atom[nr].resind = resind;
1289 at->atom[nr].atomnumber = atomicnumber;
1290 at->atomname[nr] = put_symtab(symtab, name);
1291 at->atomtype[nr] = put_symtab(symtab, ctype);
1292 at->atomtypeB[nr] = put_symtab(symtab, ctypeB);
1296 void push_cg(t_block *block, int *lastindex, int index, int a)
1300 fprintf (debug, "Index %d, Atom %d\n", index, a);
1303 if (((block->nr) && (*lastindex != index)) || (!block->nr))
1305 /* add a new block */
1307 srenew(block->index, block->nr+1);
1309 block->index[block->nr] = a + 1;
1313 void push_atom(t_symtab *symtab, t_block *cgs,
1314 t_atoms *at, gpp_atomtype_t atype, char *line, int *lastcg,
1318 int cgnumber, atomnr, type, typeB, nscan;
1319 char id[STRLEN], ctype[STRLEN], ctypeB[STRLEN],
1320 resnumberic[STRLEN], resname[STRLEN], name[STRLEN], check[STRLEN];
1321 double m, q, mb, qb;
1322 real m0, q0, mB, qB;
1324 /* Make a shortcut for writing in this molecule */
1327 /* Fixed parameters */
1328 if (sscanf(line, "%s%s%s%s%s%d",
1329 id, ctype, resnumberic, resname, name, &cgnumber) != 6)
1334 sscanf(id, "%d", &atomnr);
1335 if ((type = get_atomtype_type(ctype, atype)) == NOTSET)
1337 gmx_fatal(FARGS, "Atomtype %s not found", ctype);
1339 ptype = get_atomtype_ptype(type, atype);
1341 /* Set default from type */
1342 q0 = get_atomtype_qA(type, atype);
1343 m0 = get_atomtype_massA(type, atype);
1348 /* Optional parameters */
1349 nscan = sscanf(line, "%*s%*s%*s%*s%*s%*s%lf%lf%s%lf%lf%s",
1350 &q, &m, ctypeB, &qb, &mb, check);
1352 /* Nasty switch that falls thru all the way down! */
1361 if ((typeB = get_atomtype_type(ctypeB, atype)) == NOTSET)
1363 gmx_fatal(FARGS, "Atomtype %s not found", ctypeB);
1365 qB = get_atomtype_qA(typeB, atype);
1366 mB = get_atomtype_massA(typeB, atype);
1375 warning_error(wi, "Too many parameters");
1384 fprintf(debug, "mB=%g, qB=%g, typeB=%d\n", mB, qB, typeB);
1387 push_cg(cgs, lastcg, cgnumber, nr);
1389 push_atom_now(symtab, at, atomnr, get_atomtype_atomnumber(type, atype),
1390 type, ctype, ptype, resnumberic,
1391 resname, name, m0, q0, typeB,
1392 typeB == type ? ctype : ctypeB, mB, qB);
1395 void push_molt(t_symtab *symtab, int *nmol, t_molinfo **mol, char *line,
1402 if ((sscanf(line, "%s%d", type, &nrexcl)) != 2)
1404 warning_error(wi, "Expected a molecule type name and nrexcl");
1407 /* Test if this atomtype overwrites another */
1411 if (gmx_strcasecmp(*((*mol)[i].name), type) == 0)
1413 gmx_fatal(FARGS, "moleculetype %s is redefined", type);
1419 srenew(*mol, *nmol);
1420 newmol = &((*mol)[*nmol-1]);
1421 init_molinfo(newmol);
1423 /* Fill in the values */
1424 newmol->name = put_symtab(symtab, type);
1425 newmol->nrexcl = nrexcl;
1426 newmol->excl_set = FALSE;
1429 static gmx_bool default_nb_params(int ftype, t_params bt[], t_atoms *at,
1430 t_param *p, int c_start, gmx_bool bB, gmx_bool bGenPairs)
1432 int i, j, ti, tj, ntype;
1435 int nr = bt[ftype].nr;
1436 int nral = NRAL(ftype);
1437 int nrfp = interaction_function[ftype].nrfpA;
1438 int nrfpB = interaction_function[ftype].nrfpB;
1440 if ((!bB && nrfp == 0) || (bB && nrfpB == 0))
1448 /* First test the generated-pair position to save
1449 * time when we have 1000*1000 entries for e.g. OPLS...
1454 ti = at->atom[p->a[0]].typeB;
1455 tj = at->atom[p->a[1]].typeB;
1459 ti = at->atom[p->a[0]].type;
1460 tj = at->atom[p->a[1]].type;
1462 pi = &(bt[ftype].param[ntype*ti+tj]);
1463 bFound = ((ti == pi->a[0]) && (tj == pi->a[1]));
1466 /* Search explicitly if we didnt find it */
1469 for (i = 0; ((i < nr) && !bFound); i++)
1471 pi = &(bt[ftype].param[i]);
1474 for (j = 0; ((j < nral) &&
1475 (at->atom[p->a[j]].typeB == pi->a[j])); j++)
1482 for (j = 0; ((j < nral) &&
1483 (at->atom[p->a[j]].type == pi->a[j])); j++)
1488 bFound = (j == nral);
1496 if (nrfp+nrfpB > MAXFORCEPARAM)
1498 gmx_incons("Too many force parameters");
1500 for (j = c_start; (j < nrfpB); j++)
1502 p->c[nrfp+j] = pi->c[j];
1507 for (j = c_start; (j < nrfp); j++)
1515 for (j = c_start; (j < nrfp); j++)
1523 static gmx_bool default_cmap_params(t_params bondtype[],
1524 t_atoms *at, gpp_atomtype_t atype,
1525 t_param *p, gmx_bool bB,
1526 int *cmap_type, int *nparam_def)
1528 int i, j, nparam_found;
1530 gmx_bool bFound = FALSE;
1535 /* Match the current cmap angle against the list of cmap_types */
1536 for (i = 0; i < bondtype->nct && !bFound; i += 6)
1545 (get_atomtype_batype(at->atom[p->a[0]].type, atype) == bondtype->cmap_types[i]) &&
1546 (get_atomtype_batype(at->atom[p->a[1]].type, atype) == bondtype->cmap_types[i+1]) &&
1547 (get_atomtype_batype(at->atom[p->a[2]].type, atype) == bondtype->cmap_types[i+2]) &&
1548 (get_atomtype_batype(at->atom[p->a[3]].type, atype) == bondtype->cmap_types[i+3]) &&
1549 (get_atomtype_batype(at->atom[p->a[4]].type, atype) == bondtype->cmap_types[i+4]))
1551 /* Found cmap torsion */
1553 ct = bondtype->cmap_types[i+5];
1559 /* If we did not find a matching type for this cmap torsion */
1562 gmx_fatal(FARGS, "Unknown cmap torsion between atoms %d %d %d %d %d\n",
1563 p->a[0]+1, p->a[1]+1, p->a[2]+1, p->a[3]+1, p->a[4]+1);
1566 *nparam_def = nparam_found;
1572 static gmx_bool default_params(int ftype, t_params bt[],
1573 t_atoms *at, gpp_atomtype_t atype,
1574 t_param *p, gmx_bool bB,
1575 t_param **param_def,
1578 int i, j, nparam_found;
1579 gmx_bool bFound, bSame;
1582 int nr = bt[ftype].nr;
1583 int nral = NRAL(ftype);
1584 int nrfpA = interaction_function[ftype].nrfpA;
1585 int nrfpB = interaction_function[ftype].nrfpB;
1587 if ((!bB && nrfpA == 0) || (bB && nrfpB == 0))
1593 /* We allow wildcards now. The first type (with or without wildcards) that
1594 * fits is used, so you should probably put the wildcarded bondtypes
1595 * at the end of each section.
1599 /* OPLS uses 1000s of dihedraltypes, so in order to speed up the scanning we have a
1600 * special case for this. Check for B state outside loop to speed it up.
1602 if (ftype == F_PDIHS || ftype == F_RBDIHS || ftype == F_IDIHS || ftype == F_PIDIHS)
1606 for (i = 0; ((i < nr) && !bFound); i++)
1608 pi = &(bt[ftype].param[i]);
1611 ((pi->AI == -1) || (get_atomtype_batype(at->atom[p->AI].typeB, atype) == pi->AI)) &&
1612 ((pi->AJ == -1) || (get_atomtype_batype(at->atom[p->AJ].typeB, atype) == pi->AJ)) &&
1613 ((pi->AK == -1) || (get_atomtype_batype(at->atom[p->AK].typeB, atype) == pi->AK)) &&
1614 ((pi->AL == -1) || (get_atomtype_batype(at->atom[p->AL].typeB, atype) == pi->AL))
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].type, atype) == pi->AI)) &&
1627 ((pi->AJ == -1) || (get_atomtype_batype(at->atom[p->AJ].type, atype) == pi->AJ)) &&
1628 ((pi->AK == -1) || (get_atomtype_batype(at->atom[p->AK].type, atype) == pi->AK)) &&
1629 ((pi->AL == -1) || (get_atomtype_batype(at->atom[p->AL].type, atype) == pi->AL))
1633 /* Find additional matches for this dihedral - necessary for ftype==9 which is used e.g. for charmm.
1634 * The rules in that case is that additional matches HAVE to be on adjacent lines!
1640 /* Continue from current i value */
1641 for (j = i+1; j < nr && bSame; j += 2)
1643 pj = &(bt[ftype].param[j]);
1644 bSame = (pi->AI == pj->AI && pi->AJ == pj->AJ && pi->AK == pj->AK && pi->AL == pj->AL);
1649 /* nparam_found will be increased as long as the numbers match */
1653 else /* Not a dihedral */
1655 for (i = 0; ((i < nr) && !bFound); i++)
1657 pi = &(bt[ftype].param[i]);
1660 for (j = 0; ((j < nral) &&
1661 (get_atomtype_batype(at->atom[p->a[j]].typeB, atype) == pi->a[j])); j++)
1668 for (j = 0; ((j < nral) &&
1669 (get_atomtype_batype(at->atom[p->a[j]].type, atype) == pi->a[j])); j++)
1674 bFound = (j == nral);
1683 *nparam_def = nparam_found;
1690 void push_bond(directive d, t_params bondtype[], t_params bond[],
1691 t_atoms *at, gpp_atomtype_t atype, char *line,
1692 gmx_bool bBonded, gmx_bool bGenPairs, real fudgeQQ,
1693 gmx_bool bZero, gmx_bool *bWarn_copy_A_B,
1696 const char *aaformat[MAXATOMLIST] = {
1704 const char *asformat[MAXATOMLIST] = {
1709 "%*s%*s%*s%*s%*s%*s",
1710 "%*s%*s%*s%*s%*s%*s%*s"
1712 const char *ccformat = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
1713 int nr, i, j, nral, nral_fmt, nread, ftype;
1714 char format[STRLEN];
1715 /* One force parameter more, so we can check if we read too many */
1716 double cc[MAXFORCEPARAM+1];
1717 int aa[MAXATOMLIST+1];
1718 t_param param, paramB, *param_defA, *param_defB;
1719 gmx_bool bFoundA = FALSE, bFoundB = FALSE, bDef, bPert, bSwapParity = FALSE;
1720 int nparam_defA, nparam_defB;
1723 nparam_defA = nparam_defB = 0;
1725 ftype = ifunc_index(d, 1);
1727 for (j = 0; j < MAXATOMLIST; j++)
1731 bDef = (NRFP(ftype) > 0);
1733 if (ftype == F_SETTLE)
1735 /* SETTLE acts on 3 atoms, but the topology format only specifies
1736 * the first atom (for historical reasons).
1745 nread = sscanf(line, aaformat[nral_fmt-1],
1746 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
1748 if (ftype == F_SETTLE)
1755 if (nread < nral_fmt)
1760 else if (nread > nral_fmt)
1762 /* this is a hack to allow for virtual sites with swapped parity */
1763 bSwapParity = (aa[nral] < 0);
1766 aa[nral] = -aa[nral];
1768 ftype = ifunc_index(d, aa[nral]);
1777 gmx_fatal(FARGS, "Negative function types only allowed for %s and %s",
1778 interaction_function[F_VSITE3FAD].longname,
1779 interaction_function[F_VSITE3OUT].longname);
1785 /* Check for double atoms and atoms out of bounds */
1786 for (i = 0; (i < nral); i++)
1788 if (aa[i] < 1 || aa[i] > at->nr)
1790 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
1791 "Atom index (%d) in %s out of bounds (1-%d).\n"
1792 "This probably means that you have inserted topology section \"%s\"\n"
1793 "in a part belonging to a different molecule than you intended to.\n"
1794 "In that case move the \"%s\" section to the right molecule.",
1795 get_warning_file(wi), get_warning_line(wi),
1796 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
1798 for (j = i+1; (j < nral); j++)
1802 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
1803 warning(wi, errbuf);
1808 /* default force parameters */
1809 for (j = 0; (j < MAXATOMLIST); j++)
1811 param.a[j] = aa[j]-1;
1813 for (j = 0; (j < MAXFORCEPARAM); j++)
1818 /* Get force params for normal and free energy perturbation
1819 * studies, as determined by types!
1824 bFoundA = default_params(ftype, bondtype, at, atype, ¶m, FALSE, ¶m_defA, &nparam_defA);
1827 /* Copy the A-state and B-state default parameters. */
1828 assert(NRFPA(ftype)+NRFPB(ftype) <= MAXFORCEPARAM);
1829 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
1831 param.c[j] = param_defA->c[j];
1834 bFoundB = default_params(ftype, bondtype, at, atype, ¶m, TRUE, ¶m_defB, &nparam_defB);
1837 /* Copy only the B-state default parameters */
1838 for (j = NRFPA(ftype); (j < NRFP(ftype)); j++)
1840 param.c[j] = param_defB->c[j];
1844 else if (ftype == F_LJ14)
1846 bFoundA = default_nb_params(ftype, bondtype, at, ¶m, 0, FALSE, bGenPairs);
1847 bFoundB = default_nb_params(ftype, bondtype, at, ¶m, 0, TRUE, bGenPairs);
1849 else if (ftype == F_LJC14_Q)
1851 param.c[0] = fudgeQQ;
1852 /* Fill in the A-state charges as default parameters */
1853 param.c[1] = at->atom[param.a[0]].q;
1854 param.c[2] = at->atom[param.a[1]].q;
1855 /* The default LJ parameters are the standard 1-4 parameters */
1856 bFoundA = default_nb_params(F_LJ14, bondtype, at, ¶m, 3, FALSE, bGenPairs);
1859 else if (ftype == F_LJC_PAIRS_NB)
1861 /* Defaults are not supported here */
1867 gmx_incons("Unknown function type in push_bond");
1870 if (nread > nral_fmt)
1872 /* Manually specified parameters - in this case we discard multiple torsion info! */
1874 strcpy(format, asformat[nral_fmt-1]);
1875 strcat(format, ccformat);
1877 nread = sscanf(line, format, &cc[0], &cc[1], &cc[2], &cc[3], &cc[4], &cc[5],
1878 &cc[6], &cc[7], &cc[8], &cc[9], &cc[10], &cc[11], &cc[12]);
1880 if ((nread == NRFPA(ftype)) && (NRFPB(ftype) != 0))
1882 /* We only have to issue a warning if these atoms are perturbed! */
1884 for (j = 0; (j < nral); j++)
1886 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
1889 if (bPert && *bWarn_copy_A_B)
1892 "Some parameters for bonded interaction involving perturbed atoms are specified explicitly in state A, but not B - copying A to B");
1893 warning(wi, errbuf);
1894 *bWarn_copy_A_B = FALSE;
1897 /* If only the A parameters were specified, copy them to the B state */
1898 /* The B-state parameters correspond to the first nrfpB
1899 * A-state parameters.
1901 for (j = 0; (j < NRFPB(ftype)); j++)
1903 cc[nread++] = cc[j];
1907 /* If nread was 0 or EOF, no parameters were read => use defaults.
1908 * If nread was nrfpA we copied above so nread=nrfp.
1909 * If nread was nrfp we are cool.
1910 * For F_LJC14_Q we allow supplying fudgeQQ only.
1911 * Anything else is an error!
1913 if ((nread != 0) && (nread != EOF) && (nread != NRFP(ftype)) &&
1914 !(ftype == F_LJC14_Q && nread == 1))
1916 gmx_fatal(FARGS, "Incorrect number of parameters - found %d, expected %d or %d for %s.",
1917 nread, NRFPA(ftype), NRFP(ftype),
1918 interaction_function[ftype].longname);
1921 for (j = 0; (j < nread); j++)
1926 /* Check whether we have to use the defaults */
1927 if (nread == NRFP(ftype))
1936 /* nread now holds the number of force parameters read! */
1941 /* When we have multiple terms it would be very dangerous to allow perturbations to a different atom type! */
1942 if (ftype == F_PDIHS)
1944 if ((nparam_defA != nparam_defB) || ((nparam_defA > 1 || nparam_defB > 1) && (param_defA != param_defB)))
1947 "Cannot automatically perturb a torsion with multiple terms to different form.\n"
1948 "Please specify perturbed parameters manually for this torsion in your topology!");
1949 warning_error(wi, errbuf);
1953 if (nread > 0 && nread < NRFPA(ftype))
1955 /* Issue an error, do not use defaults */
1956 sprintf(errbuf, "Not enough parameters, there should be at least %d (or 0 for defaults)", NRFPA(ftype));
1957 warning_error(wi, errbuf);
1960 if (nread == 0 || nread == EOF)
1964 if (interaction_function[ftype].flags & IF_VSITE)
1966 /* set them to NOTSET, will be calculated later */
1967 for (j = 0; (j < MAXFORCEPARAM); j++)
1969 param.c[j] = NOTSET;
1974 param.C1 = -1; /* flag to swap parity of vsite construction */
1981 fprintf(stderr, "NOTE: No default %s types, using zeroes\n",
1982 interaction_function[ftype].longname);
1986 sprintf(errbuf, "No default %s types", interaction_function[ftype].longname);
1987 warning_error(wi, errbuf);
1998 param.C0 = 360 - param.C0;
2001 param.C2 = -param.C2;
2008 /* We only have to issue a warning if these atoms are perturbed! */
2010 for (j = 0; (j < nral); j++)
2012 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
2017 sprintf(errbuf, "No default %s types for perturbed atoms, "
2018 "using normal values", interaction_function[ftype].longname);
2019 warning(wi, errbuf);
2025 if ((ftype == F_PDIHS || ftype == F_ANGRES || ftype == F_ANGRESZ)
2026 && param.c[5] != param.c[2])
2028 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2029 " %s multiplicity can not be perturbed %f!=%f",
2030 get_warning_file(wi), get_warning_line(wi),
2031 interaction_function[ftype].longname,
2032 param.c[2], param.c[5]);
2035 if (IS_TABULATED(ftype) && param.c[2] != param.c[0])
2037 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2038 " %s table number can not be perturbed %d!=%d",
2039 get_warning_file(wi), get_warning_line(wi),
2040 interaction_function[ftype].longname,
2041 (int)(param.c[0]+0.5), (int)(param.c[2]+0.5));
2044 /* Dont add R-B dihedrals where all parameters are zero (no interaction) */
2045 if (ftype == F_RBDIHS)
2048 for (i = 0; i < NRFP(ftype); i++)
2050 if (param.c[i] != 0)
2061 /* Put the values in the appropriate arrays */
2062 add_param_to_list (&bond[ftype], ¶m);
2064 /* Push additional torsions from FF for ftype==9 if we have them.
2065 * We have already checked that the A/B states do not differ in this case,
2066 * so we do not have to double-check that again, or the vsite stuff.
2067 * In addition, those torsions cannot be automatically perturbed.
2069 if (bDef && ftype == F_PDIHS)
2071 for (i = 1; i < nparam_defA; i++)
2073 /* Advance pointer! */
2075 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
2077 param.c[j] = param_defA->c[j];
2079 /* And push the next term for this torsion */
2080 add_param_to_list (&bond[ftype], ¶m);
2085 void push_cmap(directive d, t_params bondtype[], t_params bond[],
2086 t_atoms *at, gpp_atomtype_t atype, char *line,
2089 const char *aaformat[MAXATOMLIST+1] =
2100 int i, j, nr, ftype, nral, nread, ncmap_params;
2102 int aa[MAXATOMLIST+1];
2105 t_param param, paramB, *param_defA, *param_defB;
2107 ftype = ifunc_index(d, 1);
2109 nr = bondtype[ftype].nr;
2112 nread = sscanf(line, aaformat[nral-1],
2113 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
2120 else if (nread == nral)
2122 ftype = ifunc_index(d, 1);
2125 /* Check for double atoms and atoms out of bounds */
2126 for (i = 0; i < nral; i++)
2128 if (aa[i] < 1 || aa[i] > at->nr)
2130 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2131 "Atom index (%d) in %s out of bounds (1-%d).\n"
2132 "This probably means that you have inserted topology section \"%s\"\n"
2133 "in a part belonging to a different molecule than you intended to.\n"
2134 "In that case move the \"%s\" section to the right molecule.",
2135 get_warning_file(wi), get_warning_line(wi),
2136 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
2139 for (j = i+1; (j < nral); j++)
2143 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
2144 warning(wi, errbuf);
2149 /* default force parameters */
2150 for (j = 0; (j < MAXATOMLIST); j++)
2152 param.a[j] = aa[j]-1;
2154 for (j = 0; (j < MAXFORCEPARAM); j++)
2159 /* Get the cmap type for this cmap angle */
2160 bFound = default_cmap_params(bondtype, at, atype, ¶m, FALSE, &cmap_type, &ncmap_params);
2162 /* We want exactly one parameter (the cmap type in state A (currently no state B) back */
2163 if (bFound && ncmap_params == 1)
2165 /* Put the values in the appropriate arrays */
2166 param.c[0] = cmap_type;
2167 add_param_to_list(&bond[ftype], ¶m);
2171 /* This is essentially the same check as in default_cmap_params() done one more time */
2172 gmx_fatal(FARGS, "Unable to assign a cmap type to torsion %d %d %d %d and %d\n",
2173 param.a[0]+1, param.a[1]+1, param.a[2]+1, param.a[3]+1, param.a[4]+1);
2179 void push_vsitesn(directive d, t_params bond[],
2180 t_atoms *at, char *line,
2184 int type, ftype, j, n, ret, nj, a;
2186 double *weight = NULL, weight_tot;
2189 /* default force parameters */
2190 for (j = 0; (j < MAXATOMLIST); j++)
2192 param.a[j] = NOTSET;
2194 for (j = 0; (j < MAXFORCEPARAM); j++)
2200 ret = sscanf(ptr, "%d%n", &a, &n);
2204 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2205 " Expected an atom index in section \"%s\"",
2206 get_warning_file(wi), get_warning_line(wi),
2212 ret = sscanf(ptr, "%d%n", &type, &n);
2214 ftype = ifunc_index(d, type);
2220 ret = sscanf(ptr, "%d%n", &a, &n);
2227 srenew(weight, nj+20);
2236 /* Here we use the A-state mass as a parameter.
2237 * Note that the B-state mass has no influence.
2239 weight[nj] = at->atom[atc[nj]].m;
2243 ret = sscanf(ptr, "%lf%n", &(weight[nj]), &n);
2247 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2248 " No weight or negative weight found for vsiten constructing atom %d (atom index %d)",
2249 get_warning_file(wi), get_warning_line(wi),
2254 gmx_fatal(FARGS, "Unknown vsiten type %d", type);
2256 weight_tot += weight[nj];
2264 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2265 " Expected more than one atom index in section \"%s\"",
2266 get_warning_file(wi), get_warning_line(wi),
2270 if (weight_tot == 0)
2272 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2273 " The total mass of the construting atoms is zero",
2274 get_warning_file(wi), get_warning_line(wi));
2277 for (j = 0; j < nj; j++)
2279 param.a[1] = atc[j];
2281 param.c[1] = weight[j]/weight_tot;
2282 /* Put the values in the appropriate arrays */
2283 add_param_to_list (&bond[ftype], ¶m);
2290 void push_mol(int nrmols, t_molinfo mols[], char *pline, int *whichmol,
2298 if (sscanf(pline, "%s%d", type, &copies) != 2)
2304 /* search moleculename */
2305 for (i = 0; ((i < nrmols) && gmx_strcasecmp(type, *(mols[i].name))); i++)
2317 gmx_fatal(FARGS, "No such moleculetype %s", type);
2321 void init_block2(t_block2 *b2, int natom)
2326 snew(b2->nra, b2->nr);
2327 snew(b2->a, b2->nr);
2328 for (i = 0; (i < b2->nr); i++)
2334 void done_block2(t_block2 *b2)
2340 for (i = 0; (i < b2->nr); i++)
2350 void push_excl(char *line, t_block2 *b2)
2354 char base[STRLEN], format[STRLEN];
2356 if (sscanf(line, "%d", &i) == 0)
2361 if ((1 <= i) && (i <= b2->nr))
2369 fprintf(debug, "Unbound atom %d\n", i-1);
2373 strcpy(base, "%*d");
2376 strcpy(format, base);
2377 strcat(format, "%d");
2378 n = sscanf(line, format, &j);
2381 if ((1 <= j) && (j <= b2->nr))
2384 srenew(b2->a[i], ++(b2->nra[i]));
2385 b2->a[i][b2->nra[i]-1] = j;
2386 /* also add the reverse exclusion! */
2387 srenew(b2->a[j], ++(b2->nra[j]));
2388 b2->a[j][b2->nra[j]-1] = i;
2389 strcat(base, "%*d");
2393 gmx_fatal(FARGS, "Invalid Atomnr j: %d, b2->nr: %d\n", j, b2->nr);
2400 void b_to_b2(t_blocka *b, t_block2 *b2)
2405 for (i = 0; (i < b->nr); i++)
2407 for (j = b->index[i]; (j < b->index[i+1]); j++)
2410 srenew(b2->a[i], ++b2->nra[i]);
2411 b2->a[i][b2->nra[i]-1] = a;
2416 void b2_to_b(t_block2 *b2, t_blocka *b)
2422 for (i = 0; (i < b2->nr); i++)
2425 for (j = 0; (j < b2->nra[i]); j++)
2427 b->a[nra+j] = b2->a[i][j];
2431 /* terminate list */
2435 static int icomp(const void *v1, const void *v2)
2437 return (*((atom_id *) v1))-(*((atom_id *) v2));
2440 void merge_excl(t_blocka *excl, t_block2 *b2)
2450 else if (b2->nr != excl->nr)
2452 gmx_fatal(FARGS, "DEATH HORROR: b2->nr = %d, while excl->nr = %d",
2457 fprintf(debug, "Entering merge_excl\n");
2460 /* First copy all entries from excl to b2 */
2463 /* Count and sort the exclusions */
2465 for (i = 0; (i < b2->nr); i++)
2469 /* remove double entries */
2470 qsort(b2->a[i], (size_t)b2->nra[i], (size_t)sizeof(b2->a[i][0]), icomp);
2472 for (j = 1; (j < b2->nra[i]); j++)
2474 if (b2->a[i][j] != b2->a[i][k-1])
2476 b2->a[i][k] = b2->a[i][j];
2485 srenew(excl->a, excl->nra);
2490 int add_atomtype_decoupled(t_symtab *symtab, gpp_atomtype_t at,
2491 t_nbparam ***nbparam, t_nbparam ***pair)
2497 /* Define an atom type with all parameters set to zero (no interactions) */
2500 /* Type for decoupled atoms could be anything,
2501 * this should be changed automatically later when required.
2503 atom.ptype = eptAtom;
2504 for (i = 0; (i < MAXFORCEPARAM); i++)
2509 nr = add_atomtype(at, symtab, &atom, "decoupled", ¶m, -1, 0.0, 0.0, 0.0, 0, 0, 0);
2511 /* Add space in the non-bonded parameters matrix */
2512 realloc_nb_params(at, nbparam, pair);
2517 static void convert_pairs_to_pairsQ(t_params *plist,
2518 real fudgeQQ, t_atoms *atoms)
2520 t_param *paramp1, *paramp2, *paramnew;
2521 int i, j, p1nr, p2nr, p2newnr;
2523 /* Add the pair list to the pairQ list */
2524 p1nr = plist[F_LJ14].nr;
2525 p2nr = plist[F_LJC14_Q].nr;
2526 p2newnr = p1nr + p2nr;
2527 snew(paramnew, p2newnr);
2529 paramp1 = plist[F_LJ14].param;
2530 paramp2 = plist[F_LJC14_Q].param;
2532 /* Fill in the new F_LJC14_Q array with the old one. NOTE:
2533 it may be possible to just ADD the converted F_LJ14 array
2534 to the old F_LJC14_Q array, but since we have to create
2535 a new sized memory structure, better just to deep copy it all.
2538 for (i = 0; i < p2nr; i++)
2540 /* Copy over parameters */
2541 for (j = 0; j < 5; j++) /* entries are 0-4 for F_LJC14_Q */
2543 paramnew[i].c[j] = paramp2[i].c[j];
2546 /* copy over atoms */
2547 for (j = 0; j < 2; j++)
2549 paramnew[i].a[j] = paramp2[i].a[j];
2553 for (i = p2nr; i < p2newnr; i++)
2557 /* Copy over parameters */
2558 paramnew[i].c[0] = fudgeQQ;
2559 paramnew[i].c[1] = atoms->atom[paramp1[j].a[0]].q;
2560 paramnew[i].c[2] = atoms->atom[paramp1[j].a[1]].q;
2561 paramnew[i].c[3] = paramp1[j].c[0];
2562 paramnew[i].c[4] = paramp1[j].c[1];
2564 /* copy over atoms */
2565 paramnew[i].a[0] = paramp1[j].a[0];
2566 paramnew[i].a[1] = paramp1[j].a[1];
2569 /* free the old pairlists */
2570 sfree(plist[F_LJC14_Q].param);
2571 sfree(plist[F_LJ14].param);
2573 /* now assign the new data to the F_LJC14_Q structure */
2574 plist[F_LJC14_Q].param = paramnew;
2575 plist[F_LJC14_Q].nr = p2newnr;
2577 /* Empty the LJ14 pairlist */
2578 plist[F_LJ14].nr = 0;
2579 plist[F_LJ14].param = NULL;
2582 static void generate_LJCpairsNB(t_molinfo *mol, int nb_funct, t_params *nbp)
2584 int n, ntype, i, j, k;
2591 atom = mol->atoms.atom;
2593 ntype = sqrt(nbp->nr);
2595 for (i = 0; i < MAXATOMLIST; i++)
2597 param.a[i] = NOTSET;
2599 for (i = 0; i < MAXFORCEPARAM; i++)
2601 param.c[i] = NOTSET;
2604 /* Add a pair interaction for all non-excluded atom pairs */
2606 for (i = 0; i < n; i++)
2608 for (j = i+1; j < n; j++)
2611 for (k = excl->index[i]; k < excl->index[i+1]; k++)
2613 if (excl->a[k] == j)
2620 if (nb_funct != F_LJ)
2622 gmx_fatal(FARGS, "Can only generate non-bonded pair interactions for Van der Waals type Lennard-Jones");
2626 param.c[0] = atom[i].q;
2627 param.c[1] = atom[j].q;
2628 param.c[2] = nbp->param[ntype*atom[i].type+atom[j].type].c[0];
2629 param.c[3] = nbp->param[ntype*atom[i].type+atom[j].type].c[1];
2630 add_param_to_list(&mol->plist[F_LJC_PAIRS_NB], ¶m);
2636 static void set_excl_all(t_blocka *excl)
2640 /* Get rid of the current exclusions and exclude all atom pairs */
2642 excl->nra = nat*nat;
2643 srenew(excl->a, excl->nra);
2645 for (i = 0; i < nat; i++)
2648 for (j = 0; j < nat; j++)
2653 excl->index[nat] = k;
2656 static void decouple_atoms(t_atoms *atoms, int atomtype_decouple,
2657 int couple_lam0, int couple_lam1)
2661 for (i = 0; i < atoms->nr; i++)
2663 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamVDW)
2665 atoms->atom[i].q = 0.0;
2667 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamQ)
2669 atoms->atom[i].type = atomtype_decouple;
2671 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamVDW)
2673 atoms->atom[i].qB = 0.0;
2675 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamQ)
2677 atoms->atom[i].typeB = atomtype_decouple;
2682 void convert_moltype_couple(t_molinfo *mol, int atomtype_decouple, real fudgeQQ,
2683 int couple_lam0, int couple_lam1,
2684 gmx_bool bCoupleIntra, int nb_funct, t_params *nbp)
2686 convert_pairs_to_pairsQ(mol->plist, fudgeQQ, &mol->atoms);
2689 generate_LJCpairsNB(mol, nb_funct, nbp);
2690 set_excl_all(&mol->excls);
2692 decouple_atoms(&mol->atoms, atomtype_decouple, couple_lam0, couple_lam1);