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.
53 #include "gpp_atomtype.h"
54 #include "gpp_bond_atomtype.h"
56 #include "gromacs/topology/symtab.h"
57 #include "gromacs/utility/cstringutil.h"
58 #include "gromacs/utility/fatalerror.h"
59 #include "gromacs/utility/smalloc.h"
61 void generate_nbparams(int comb, int ftype, t_params *plist, gpp_atomtype_t atype,
66 real c, bi, bj, ci, cj, ci0, ci1, ci2, cj0, cj1, cj2;
69 /* Lean mean shortcuts */
70 nr = get_atomtype_ntypes(atype);
72 snew(plist->param, nr*nr);
75 /* Fill the matrix with force parameters */
83 for (i = k = 0; (i < nr); i++)
85 for (j = 0; (j < nr); j++, k++)
87 for (nf = 0; (nf < nrfp); nf++)
89 ci = get_atomtype_nbparam(i, nf, atype);
90 cj = get_atomtype_nbparam(j, nf, atype);
92 plist->param[k].c[nf] = c;
98 case eCOMB_ARITHMETIC:
99 /* c0 and c1 are epsilon and sigma */
100 for (i = k = 0; (i < nr); i++)
102 for (j = 0; (j < nr); j++, k++)
104 ci0 = get_atomtype_nbparam(i, 0, atype);
105 cj0 = get_atomtype_nbparam(j, 0, atype);
106 ci1 = get_atomtype_nbparam(i, 1, atype);
107 cj1 = get_atomtype_nbparam(j, 1, atype);
108 plist->param[k].c[0] = (ci0+cj0)*0.5;
109 plist->param[k].c[1] = sqrt(ci1*cj1);
114 case eCOMB_GEOM_SIG_EPS:
115 /* c0 and c1 are epsilon and sigma */
116 for (i = k = 0; (i < nr); i++)
118 for (j = 0; (j < nr); j++, k++)
120 ci0 = get_atomtype_nbparam(i, 0, atype);
121 cj0 = get_atomtype_nbparam(j, 0, atype);
122 ci1 = get_atomtype_nbparam(i, 1, atype);
123 cj1 = get_atomtype_nbparam(j, 1, atype);
124 plist->param[k].c[0] = sqrt(ci0*cj0);
125 plist->param[k].c[1] = sqrt(ci1*cj1);
131 gmx_fatal(FARGS, "No such combination rule %d", comb);
135 gmx_incons("Topology processing, generate nb parameters");
140 /* Buckingham rules */
141 for (i = k = 0; (i < nr); i++)
143 for (j = 0; (j < nr); j++, k++)
145 ci0 = get_atomtype_nbparam(i, 0, atype);
146 cj0 = get_atomtype_nbparam(j, 0, atype);
147 ci2 = get_atomtype_nbparam(i, 2, atype);
148 cj2 = get_atomtype_nbparam(j, 2, atype);
149 bi = get_atomtype_nbparam(i, 1, atype);
150 bj = get_atomtype_nbparam(j, 1, atype);
151 plist->param[k].c[0] = sqrt(ci0 * cj0);
152 if ((bi == 0) || (bj == 0))
154 plist->param[k].c[1] = 0;
158 plist->param[k].c[1] = 2.0/(1/bi+1/bj);
160 plist->param[k].c[2] = sqrt(ci2 * cj2);
166 sprintf(errbuf, "Invalid nonbonded type %s",
167 interaction_function[ftype].longname);
168 warning_error(wi, errbuf);
172 static void realloc_nb_params(gpp_atomtype_t at,
173 t_nbparam ***nbparam, t_nbparam ***pair)
175 /* Add space in the non-bonded parameters matrix */
176 int atnr = get_atomtype_ntypes(at);
177 srenew(*nbparam, atnr);
178 snew((*nbparam)[atnr-1], atnr);
182 snew((*pair)[atnr-1], atnr);
186 static void copy_B_from_A(int ftype, double *c)
190 nrfpA = NRFPA(ftype);
191 nrfpB = NRFPB(ftype);
193 /* Copy the B parameters from the first nrfpB A parameters */
194 for (i = 0; (i < nrfpB); i++)
200 void push_at (t_symtab *symtab, gpp_atomtype_t at, t_bond_atomtype bat,
201 char *line, int nb_funct,
202 t_nbparam ***nbparam, t_nbparam ***pair,
209 t_xlate xl[eptNR] = {
217 int nr, i, nfields, j, pt, nfp0 = -1;
218 int batype_nr, nread;
219 char type[STRLEN], btype[STRLEN], ptype[STRLEN];
221 double c[MAXFORCEPARAM];
222 double radius, vol, surftens, gb_radius, S_hct;
223 char tmpfield[12][100]; /* Max 12 fields of width 100 */
228 gmx_bool have_atomic_number;
229 gmx_bool have_bonded_type;
234 /* First assign input line to temporary array */
235 nfields = sscanf(line, "%s%s%s%s%s%s%s%s%s%s%s%s",
236 tmpfield[0], tmpfield[1], tmpfield[2], tmpfield[3], tmpfield[4], tmpfield[5],
237 tmpfield[6], tmpfield[7], tmpfield[8], tmpfield[9], tmpfield[10], tmpfield[11]);
239 /* Comments on optional fields in the atomtypes section:
241 * The force field format is getting a bit old. For OPLS-AA we needed
242 * to add a special bonded atomtype, and for Gerrit Groenhofs QM/MM stuff
243 * we also needed the atomic numbers.
244 * To avoid making all old or user-generated force fields unusable we
245 * have introduced both these quantities as optional columns, and do some
246 * acrobatics to check whether they are present or not.
247 * This will all look much nicer when we switch to XML... sigh.
249 * Field 0 (mandatory) is the nonbonded type name. (string)
250 * Field 1 (optional) is the bonded type (string)
251 * Field 2 (optional) is the atomic number (int)
252 * Field 3 (mandatory) is the mass (numerical)
253 * Field 4 (mandatory) is the charge (numerical)
254 * Field 5 (mandatory) is the particle type (single character)
255 * This is followed by a number of nonbonded parameters.
257 * The safest way to identify the format is the particle type field.
259 * So, here is what we do:
261 * A. Read in the first six fields as strings
262 * B. If field 3 (starting from 0) is a single char, we have neither
263 * bonded_type or atomic numbers.
264 * C. If field 5 is a single char we have both.
265 * D. If field 4 is a single char we check field 1. If this begins with
266 * an alphabetical character we have bonded types, otherwise atomic numbers.
275 if ( (strlen(tmpfield[5]) == 1) && isalpha(tmpfield[5][0]) )
277 have_bonded_type = TRUE;
278 have_atomic_number = TRUE;
280 else if ( (strlen(tmpfield[3]) == 1) && isalpha(tmpfield[3][0]) )
282 have_bonded_type = FALSE;
283 have_atomic_number = FALSE;
287 have_bonded_type = ( isalpha(tmpfield[1][0]) != 0 );
288 have_atomic_number = !have_bonded_type;
291 /* optional fields */
305 if (have_atomic_number)
307 if (have_bonded_type)
309 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf",
310 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1],
311 &radius, &vol, &surftens, &gb_radius);
320 /* have_atomic_number && !have_bonded_type */
321 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf",
322 type, &atomnr, &m, &q, ptype, &c[0], &c[1],
323 &radius, &vol, &surftens, &gb_radius);
333 if (have_bonded_type)
335 /* !have_atomic_number && have_bonded_type */
336 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf%lf%lf%lf%lf",
337 type, btype, &m, &q, ptype, &c[0], &c[1],
338 &radius, &vol, &surftens, &gb_radius);
347 /* !have_atomic_number && !have_bonded_type */
348 nread = sscanf(line, "%s%lf%lf%s%lf%lf%lf%lf%lf%lf",
349 type, &m, &q, ptype, &c[0], &c[1],
350 &radius, &vol, &surftens, &gb_radius);
359 if (!have_bonded_type)
364 if (!have_atomic_number)
374 if (have_atomic_number)
376 if (have_bonded_type)
378 nread = sscanf(line, "%s%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
379 type, btype, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2],
380 &radius, &vol, &surftens, &gb_radius);
389 /* have_atomic_number && !have_bonded_type */
390 nread = sscanf(line, "%s%d%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
391 type, &atomnr, &m, &q, ptype, &c[0], &c[1], &c[2],
392 &radius, &vol, &surftens, &gb_radius);
402 if (have_bonded_type)
404 /* !have_atomic_number && have_bonded_type */
405 nread = sscanf(line, "%s%s%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
406 type, btype, &m, &q, ptype, &c[0], &c[1], &c[2],
407 &radius, &vol, &surftens, &gb_radius);
416 /* !have_atomic_number && !have_bonded_type */
417 nread = sscanf(line, "%s%lf%lf%s%lf%lf%lf%lf%lf%lf%lf",
418 type, &m, &q, ptype, &c[0], &c[1], &c[2],
419 &radius, &vol, &surftens, &gb_radius);
428 if (!have_bonded_type)
433 if (!have_atomic_number)
441 gmx_fatal(FARGS, "Invalid function type %d in push_at %s %d", nb_funct,
444 for (j = nfp0; (j < MAXFORCEPARAM); j++)
449 if (strlen(type) == 1 && isdigit(type[0]))
451 gmx_fatal(FARGS, "Atom type names can't be single digits.");
454 if (strlen(btype) == 1 && isdigit(btype[0]))
456 gmx_fatal(FARGS, "Bond atom type names can't be single digits.");
459 /* Hack to read old topologies */
460 if (gmx_strcasecmp(ptype, "D") == 0)
464 for (j = 0; (j < eptNR); j++)
466 if (gmx_strcasecmp(ptype, xl[j].entry) == 0)
473 gmx_fatal(FARGS, "Invalid particle type %s on line %s",
479 fprintf(debug, "ptype: %s\n", ptype_str[pt]);
485 for (i = 0; (i < MAXFORCEPARAM); i++)
490 if ((batype_nr = get_bond_atomtype_type(btype, bat)) == NOTSET)
492 add_bond_atomtype(bat, symtab, btype);
494 batype_nr = get_bond_atomtype_type(btype, bat);
496 if ((nr = get_atomtype_type(type, at)) != NOTSET)
498 sprintf(errbuf, "Overriding atomtype %s", type);
500 if ((nr = set_atomtype(nr, at, symtab, atom, type, param, batype_nr,
501 radius, vol, surftens, atomnr, gb_radius, S_hct)) == NOTSET)
503 gmx_fatal(FARGS, "Replacing atomtype %s failed", type);
506 else if ((nr = add_atomtype(at, symtab, atom, type, param,
507 batype_nr, radius, vol,
508 surftens, atomnr, gb_radius, S_hct)) == NOTSET)
510 gmx_fatal(FARGS, "Adding atomtype %s failed", type);
514 /* Add space in the non-bonded parameters matrix */
515 realloc_nb_params(at, nbparam, pair);
521 static void push_bondtype(t_params * bt,
525 gmx_bool bAllowRepeat,
530 gmx_bool bTest, bFound, bCont, bId;
532 int nrfp = NRFP(ftype);
535 /* If bAllowRepeat is TRUE, we allow multiple entries as long as they
536 are on directly _adjacent_ lines.
539 /* First check if our atomtypes are _identical_ (not reversed) to the previous
540 entry. If they are not identical we search for earlier duplicates. If they are
541 we can skip it, since we already searched for the first line
548 if (bAllowRepeat && nr > 1)
550 for (j = 0, bCont = TRUE; (j < nral); j++)
552 bCont = bCont && (b->a[j] == bt->param[nr-2].a[j]);
556 /* Search for earlier duplicates if this entry was not a continuation
557 from the previous line.
562 for (i = 0; (i < nr); i++)
565 for (j = 0; (j < nral); j++)
567 bTest = (bTest && (b->a[j] == bt->param[i].a[j]));
572 for (j = 0; (j < nral); j++)
574 bTest = (bTest && (b->a[nral-1-j] == bt->param[i].a[j]));
582 for (j = 0; (j < nrfp); j++)
584 bId = bId && (bt->param[i].c[j] == b->c[j]);
588 sprintf(errbuf, "Overriding %s parameters.%s",
589 interaction_function[ftype].longname,
590 (ftype == F_PDIHS) ? "\nUse dihedraltype 4 to allow several multiplicity terms." : "");
592 fprintf(stderr, " old:");
593 for (j = 0; (j < nrfp); j++)
595 fprintf(stderr, " %g", bt->param[i].c[j]);
597 fprintf(stderr, " \n new: %s\n\n", line);
601 for (j = 0; (j < nrfp); j++)
603 bt->param[i].c[j] = b->c[j];
614 /* fill the arrays up and down */
615 memcpy(bt->param[bt->nr].c, b->c, sizeof(b->c));
616 memcpy(bt->param[bt->nr].a, b->a, sizeof(b->a));
617 memcpy(bt->param[bt->nr+1].c, b->c, sizeof(b->c));
619 /* The definitions of linear angles depend on the order of atoms,
620 * that means that for atoms i-j-k, with certain parameter a, the
621 * corresponding k-j-i angle will have parameter 1-a.
623 if (ftype == F_LINEAR_ANGLES)
625 bt->param[bt->nr+1].c[0] = 1-bt->param[bt->nr+1].c[0];
626 bt->param[bt->nr+1].c[2] = 1-bt->param[bt->nr+1].c[2];
629 for (j = 0; (j < nral); j++)
631 bt->param[bt->nr+1].a[j] = b->a[nral-1-j];
638 void push_bt(directive d, t_params bt[], int nral,
640 t_bond_atomtype bat, char *line,
643 const char *formal[MAXATOMLIST+1] = {
652 const char *formnl[MAXATOMLIST+1] = {
658 "%*s%*s%*s%*s%*s%*s",
659 "%*s%*s%*s%*s%*s%*s%*s"
661 const char *formlf = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
662 int i, ft, ftype, nn, nrfp, nrfpA, nrfpB;
664 char alc[MAXATOMLIST+1][20];
665 /* One force parameter more, so we can check if we read too many */
666 double c[MAXFORCEPARAM+1];
670 if ((bat && at) || (!bat && !at))
672 gmx_incons("You should pass either bat or at to push_bt");
675 /* Make format string (nral ints+functype) */
676 if ((nn = sscanf(line, formal[nral],
677 alc[0], alc[1], alc[2], alc[3], alc[4], alc[5])) != nral+1)
679 sprintf(errbuf, "Not enough atomtypes (%d instead of %d)", nn-1, nral);
680 warning_error(wi, errbuf);
684 ft = strtol(alc[nral], NULL, 10);
685 ftype = ifunc_index(d, ft);
687 nrfpA = interaction_function[ftype].nrfpA;
688 nrfpB = interaction_function[ftype].nrfpB;
689 strcpy(f1, formnl[nral]);
691 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]))
696 /* Copy the B-state from the A-state */
697 copy_B_from_A(ftype, c);
703 warning_error(wi, "Not enough parameters");
705 else if (nn > nrfpA && nn < nrfp)
707 warning_error(wi, "Too many parameters or not enough parameters for topology B");
711 warning_error(wi, "Too many parameters");
713 for (i = nn; (i < nrfp); i++)
719 for (i = 0; (i < nral); i++)
721 if (at && ((p.a[i] = get_atomtype_type(alc[i], at)) == NOTSET))
723 gmx_fatal(FARGS, "Unknown atomtype %s\n", alc[i]);
725 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
727 gmx_fatal(FARGS, "Unknown bond_atomtype %s\n", alc[i]);
730 for (i = 0; (i < nrfp); i++)
734 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
738 void push_dihedraltype(directive d, t_params bt[],
739 t_bond_atomtype bat, char *line,
742 const char *formal[MAXATOMLIST+1] = {
751 const char *formnl[MAXATOMLIST+1] = {
757 "%*s%*s%*s%*s%*s%*s",
758 "%*s%*s%*s%*s%*s%*s%*s"
760 const char *formlf[MAXFORCEPARAM] = {
766 "%lf%lf%lf%lf%lf%lf",
767 "%lf%lf%lf%lf%lf%lf%lf",
768 "%lf%lf%lf%lf%lf%lf%lf%lf",
769 "%lf%lf%lf%lf%lf%lf%lf%lf%lf",
770 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
771 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
772 "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",
774 int i, ft, ftype, nn, nrfp, nrfpA, nrfpB, nral;
776 char alc[MAXATOMLIST+1][20];
777 double c[MAXFORCEPARAM];
779 gmx_bool bAllowRepeat;
782 /* This routine accepts dihedraltypes defined from either 2 or 4 atoms.
784 * We first check for 2 atoms with the 3th column being an integer
785 * defining the type. If this isn't the case, we try it with 4 atoms
786 * and the 5th column defining the dihedral type.
788 nn = sscanf(line, formal[4], alc[0], alc[1], alc[2], alc[3], alc[4]);
789 if (nn >= 3 && strlen(alc[2]) == 1 && isdigit(alc[2][0]))
792 ft = strtol(alc[nral], NULL, 10);
793 /* Move atom types around a bit and use 'X' for wildcard atoms
794 * to create a 4-atom dihedral definition with arbitrary atoms in
797 if (alc[2][0] == '2')
799 /* improper - the two atomtypes are 1,4. Use wildcards for 2,3 */
800 strcpy(alc[3], alc[1]);
801 sprintf(alc[2], "X");
802 sprintf(alc[1], "X");
803 /* alc[0] stays put */
807 /* proper - the two atomtypes are 2,3. Use wildcards for 1,4 */
808 sprintf(alc[3], "X");
809 strcpy(alc[2], alc[1]);
810 strcpy(alc[1], alc[0]);
811 sprintf(alc[0], "X");
814 else if (nn == 5 && strlen(alc[4]) == 1 && isdigit(alc[4][0]))
817 ft = strtol(alc[nral], NULL, 10);
821 sprintf(errbuf, "Incorrect number of atomtypes for dihedral (%d instead of 2 or 4)", nn-1);
822 warning_error(wi, errbuf);
828 /* Previously, we have always overwritten parameters if e.g. a torsion
829 with the same atomtypes occurs on multiple lines. However, CHARMM and
830 some other force fields specify multiple dihedrals over some bonds,
831 including cosines with multiplicity 6 and somethimes even higher.
832 Thus, they cannot be represented with Ryckaert-Bellemans terms.
833 To add support for these force fields, Dihedral type 9 is identical to
834 normal proper dihedrals, but repeated entries are allowed.
841 bAllowRepeat = FALSE;
845 ftype = ifunc_index(d, ft);
847 nrfpA = interaction_function[ftype].nrfpA;
848 nrfpB = interaction_function[ftype].nrfpB;
850 strcpy(f1, formnl[nral]);
851 strcat(f1, formlf[nrfp-1]);
853 /* Check number of parameters given */
854 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]))
859 /* Copy the B-state from the A-state */
860 copy_B_from_A(ftype, c);
866 warning_error(wi, "Not enough parameters");
868 else if (nn > nrfpA && nn < nrfp)
870 warning_error(wi, "Too many parameters or not enough parameters for topology B");
874 warning_error(wi, "Too many parameters");
876 for (i = nn; (i < nrfp); i++)
883 for (i = 0; (i < 4); i++)
885 if (!strcmp(alc[i], "X"))
891 if ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET)
893 gmx_fatal(FARGS, "Unknown bond_atomtype %s", alc[i]);
897 for (i = 0; (i < nrfp); i++)
901 /* Always use 4 atoms here, since we created two wildcard atoms
902 * if there wasn't of them 4 already.
904 push_bondtype (&(bt[ftype]), &p, 4, ftype, bAllowRepeat, line, wi);
908 void push_nbt(directive d, t_nbparam **nbt, gpp_atomtype_t atype,
909 char *pline, int nb_funct,
913 const char *form2 = "%*s%*s%*s%lf%lf";
914 const char *form3 = "%*s%*s%*s%lf%lf%lf";
915 const char *form4 = "%*s%*s%*s%lf%lf%lf%lf";
916 const char *form5 = "%*s%*s%*s%lf%lf%lf%lf%lf";
918 int i, f, n, ftype, atnr, nrfp;
926 if (sscanf (pline, "%s%s%d", a0, a1, &f) != 3)
932 ftype = ifunc_index(d, f);
934 if (ftype != nb_funct)
936 sprintf(errbuf, "Trying to add %s while the default nonbond type is %s",
937 interaction_function[ftype].longname,
938 interaction_function[nb_funct].longname);
939 warning_error(wi, errbuf);
943 /* Get the force parameters */
947 n = sscanf(pline, form4, &c[0], &c[1], &c[2], &c[3]);
953 /* When the B topology parameters are not set,
954 * copy them from topology A
957 for (i = n; i < nrfp; i++)
962 else if (ftype == F_LJC14_Q)
964 n = sscanf(pline, form5, &c[0], &c[1], &c[2], &c[3], &dum);
967 incorrect_n_param(wi);
973 if (sscanf(pline, form3, &c[0], &c[1], &dum) != 2)
975 incorrect_n_param(wi);
981 if (sscanf(pline, form4, &c[0], &c[1], &c[2], &dum) != 3)
983 incorrect_n_param(wi);
989 gmx_fatal(FARGS, "Number of force parameters for nonbonded interactions is %d"
990 " in file %s, line %d", nrfp, __FILE__, __LINE__);
992 for (i = 0; (i < nrfp); i++)
997 /* Put the parameters in the matrix */
998 if ((ai = get_atomtype_type (a0, atype)) == NOTSET)
1000 gmx_fatal(FARGS, "Atomtype %s not found", a0);
1002 if ((aj = get_atomtype_type (a1, atype)) == NOTSET)
1004 gmx_fatal(FARGS, "Atomtype %s not found", a1);
1006 nbp = &(nbt[max(ai, aj)][min(ai, aj)]);
1011 for (i = 0; i < nrfp; i++)
1013 bId = bId && (nbp->c[i] == cr[i]);
1017 sprintf(errbuf, "Overriding non-bonded parameters,");
1018 warning(wi, errbuf);
1019 fprintf(stderr, " old:");
1020 for (i = 0; i < nrfp; i++)
1022 fprintf(stderr, " %g", nbp->c[i]);
1024 fprintf(stderr, " new\n%s\n", pline);
1028 for (i = 0; i < nrfp; i++)
1035 push_gb_params (gpp_atomtype_t at, char *line,
1040 double radius, vol, surftens, gb_radius, S_hct;
1041 char atypename[STRLEN];
1042 char errbuf[STRLEN];
1044 if ( (nfield = sscanf(line, "%s%lf%lf%lf%lf%lf", atypename, &radius, &vol, &surftens, &gb_radius, &S_hct)) != 6)
1046 sprintf(errbuf, "Too few gb parameters for type %s\n", atypename);
1047 warning(wi, errbuf);
1050 /* Search for atomtype */
1051 atype = get_atomtype_type(atypename, at);
1053 if (atype == NOTSET)
1055 printf("Couldn't find topology match for atomtype %s\n", atypename);
1059 set_atomtype_gbparam(at, atype, radius, vol, surftens, gb_radius, S_hct);
1063 push_cmaptype(directive d, t_params bt[], int nral, gpp_atomtype_t at,
1064 t_bond_atomtype bat, char *line,
1067 const char *formal = "%s%s%s%s%s%s%s%s";
1069 int i, j, ft, ftype, nn, nrfp, nrfpA, nrfpB;
1071 int nxcmap, nycmap, ncmap, read_cmap, sl, nct;
1072 char s[20], alc[MAXATOMLIST+2][20];
1074 gmx_bool bAllowRepeat;
1077 /* Keep the compiler happy */
1081 if ((nn = sscanf(line, formal, alc[0], alc[1], alc[2], alc[3], alc[4], alc[5], alc[6], alc[7])) != nral+3)
1083 sprintf(errbuf, "Incorrect number of atomtypes for cmap (%d instead of 5)", nn-1);
1084 warning_error(wi, errbuf);
1088 /* Compute an offset for each line where the cmap parameters start
1089 * ie. where the atom types and grid spacing information ends
1091 for (i = 0; i < nn; i++)
1093 start += (int)strlen(alc[i]);
1096 /* There are nn-1 spaces between the atom types and the grid spacing info in the cmap.itp file */
1097 /* start is the position on the line where we start to read the actual cmap grid data from the itp file */
1098 start = start + nn -1;
1100 ft = strtol(alc[nral], NULL, 10);
1101 nxcmap = strtol(alc[nral+1], NULL, 10);
1102 nycmap = strtol(alc[nral+2], NULL, 10);
1104 /* Check for equal grid spacing in x and y dims */
1105 if (nxcmap != nycmap)
1107 gmx_fatal(FARGS, "Not the same grid spacing in x and y for cmap grid: x=%d, y=%d", nxcmap, nycmap);
1110 ncmap = nxcmap*nycmap;
1111 ftype = ifunc_index(d, ft);
1112 nrfpA = strtol(alc[6], NULL, 10)*strtol(alc[6], NULL, 10);
1113 nrfpB = strtol(alc[7], NULL, 10)*strtol(alc[7], NULL, 10);
1116 /* Allocate memory for the CMAP grid */
1118 srenew(bt->cmap, bt->ncmap);
1120 /* Read in CMAP parameters */
1122 for (i = 0; i < ncmap; i++)
1124 while (isspace(*(line+start+sl)))
1128 nn = sscanf(line+start+sl, " %s ", s);
1130 bt->cmap[i+(bt->ncmap)-nrfp] = strtod(s, NULL);
1138 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]);
1143 /* Check do that we got the number of parameters we expected */
1144 if (read_cmap == nrfpA)
1146 for (i = 0; i < ncmap; i++)
1148 bt->cmap[i+ncmap] = bt->cmap[i];
1153 if (read_cmap < nrfpA)
1155 warning_error(wi, "Not enough cmap parameters");
1157 else if (read_cmap > nrfpA && read_cmap < nrfp)
1159 warning_error(wi, "Too many cmap parameters or not enough parameters for topology B");
1161 else if (read_cmap > nrfp)
1163 warning_error(wi, "Too many cmap parameters");
1168 /* Set grid spacing and the number of grids (we assume these numbers to be the same for all grids
1169 * so we can safely assign them each time
1171 bt->grid_spacing = nxcmap; /* Or nycmap, they need to be equal */
1172 bt->nc = bt->nc + 1; /* Since we are incrementing here, we need to subtract later, see (*****) */
1173 nct = (nral+1) * bt->nc;
1175 /* Allocate memory for the cmap_types information */
1176 srenew(bt->cmap_types, nct);
1178 for (i = 0; (i < nral); i++)
1180 if (at && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1182 gmx_fatal(FARGS, "Unknown atomtype %s\n", alc[i]);
1184 else if (bat && ((p.a[i] = get_bond_atomtype_type(alc[i], bat)) == NOTSET))
1186 gmx_fatal(FARGS, "Unknown bond_atomtype %s\n", alc[i]);
1189 /* Assign a grid number to each cmap_type */
1190 bt->cmap_types[bt->nct++] = get_bond_atomtype_type(alc[i], bat);
1193 /* Assign a type number to this cmap */
1194 bt->cmap_types[bt->nct++] = bt->nc-1; /* Since we inremented earlier, we need to subtrac here, to get the types right (****) */
1196 /* Check for the correct number of atoms (again) */
1199 gmx_fatal(FARGS, "Incorrect number of atom types (%d) in cmap type %d\n", nct, bt->nc);
1202 /* Is this correct?? */
1203 for (i = 0; i < MAXFORCEPARAM; i++)
1208 /* Push the bond to the bondlist */
1209 push_bondtype (&(bt[ftype]), &p, nral, ftype, FALSE, line, wi);
1213 static void push_atom_now(t_symtab *symtab, t_atoms *at, int atomnr,
1215 int type, char *ctype, int ptype,
1217 char *resname, char *name, real m0, real q0,
1218 int typeB, char *ctypeB, real mB, real qB)
1220 int j, resind = 0, resnr;
1224 if (((nr == 0) && (atomnr != 1)) || (nr && (atomnr != at->nr+1)))
1226 gmx_fatal(FARGS, "Atoms in the .top are not numbered consecutively from 1 (rather, atomnr = %d, while at->nr = %d)", atomnr, at->nr);
1229 j = strlen(resnumberic) - 1;
1230 if (isdigit(resnumberic[j]))
1236 ric = resnumberic[j];
1237 if (j == 0 || !isdigit(resnumberic[j-1]))
1239 gmx_fatal(FARGS, "Invalid residue number '%s' for atom %d",
1240 resnumberic, atomnr);
1243 resnr = strtol(resnumberic, NULL, 10);
1247 resind = at->atom[nr-1].resind;
1249 if (nr == 0 || strcmp(resname, *at->resinfo[resind].name) != 0 ||
1250 resnr != at->resinfo[resind].nr ||
1251 ric != at->resinfo[resind].ic)
1261 at->nres = resind + 1;
1262 srenew(at->resinfo, at->nres);
1263 at->resinfo[resind].name = put_symtab(symtab, resname);
1264 at->resinfo[resind].nr = resnr;
1265 at->resinfo[resind].ic = ric;
1269 resind = at->atom[at->nr-1].resind;
1272 /* New atom instance
1273 * get new space for arrays
1275 srenew(at->atom, nr+1);
1276 srenew(at->atomname, nr+1);
1277 srenew(at->atomtype, nr+1);
1278 srenew(at->atomtypeB, nr+1);
1281 at->atom[nr].type = type;
1282 at->atom[nr].ptype = ptype;
1283 at->atom[nr].q = q0;
1284 at->atom[nr].m = m0;
1285 at->atom[nr].typeB = typeB;
1286 at->atom[nr].qB = qB;
1287 at->atom[nr].mB = mB;
1289 at->atom[nr].resind = resind;
1290 at->atom[nr].atomnumber = atomicnumber;
1291 at->atomname[nr] = put_symtab(symtab, name);
1292 at->atomtype[nr] = put_symtab(symtab, ctype);
1293 at->atomtypeB[nr] = put_symtab(symtab, ctypeB);
1297 void push_cg(t_block *block, int *lastindex, int index, int a)
1301 fprintf (debug, "Index %d, Atom %d\n", index, a);
1304 if (((block->nr) && (*lastindex != index)) || (!block->nr))
1306 /* add a new block */
1308 srenew(block->index, block->nr+1);
1310 block->index[block->nr] = a + 1;
1314 void push_atom(t_symtab *symtab, t_block *cgs,
1315 t_atoms *at, gpp_atomtype_t atype, char *line, int *lastcg,
1319 int cgnumber, atomnr, type, typeB, nscan;
1320 char id[STRLEN], ctype[STRLEN], ctypeB[STRLEN],
1321 resnumberic[STRLEN], resname[STRLEN], name[STRLEN], check[STRLEN];
1322 double m, q, mb, qb;
1323 real m0, q0, mB, qB;
1325 /* Make a shortcut for writing in this molecule */
1328 /* Fixed parameters */
1329 if (sscanf(line, "%s%s%s%s%s%d",
1330 id, ctype, resnumberic, resname, name, &cgnumber) != 6)
1335 sscanf(id, "%d", &atomnr);
1336 if ((type = get_atomtype_type(ctype, atype)) == NOTSET)
1338 gmx_fatal(FARGS, "Atomtype %s not found", ctype);
1340 ptype = get_atomtype_ptype(type, atype);
1342 /* Set default from type */
1343 q0 = get_atomtype_qA(type, atype);
1344 m0 = get_atomtype_massA(type, atype);
1349 /* Optional parameters */
1350 nscan = sscanf(line, "%*s%*s%*s%*s%*s%*s%lf%lf%s%lf%lf%s",
1351 &q, &m, ctypeB, &qb, &mb, check);
1353 /* Nasty switch that falls thru all the way down! */
1362 if ((typeB = get_atomtype_type(ctypeB, atype)) == NOTSET)
1364 gmx_fatal(FARGS, "Atomtype %s not found", ctypeB);
1366 qB = get_atomtype_qA(typeB, atype);
1367 mB = get_atomtype_massA(typeB, atype);
1376 warning_error(wi, "Too many parameters");
1385 fprintf(debug, "mB=%g, qB=%g, typeB=%d\n", mB, qB, typeB);
1388 push_cg(cgs, lastcg, cgnumber, nr);
1390 push_atom_now(symtab, at, atomnr, get_atomtype_atomnumber(type, atype),
1391 type, ctype, ptype, resnumberic,
1392 resname, name, m0, q0, typeB,
1393 typeB == type ? ctype : ctypeB, mB, qB);
1396 void push_molt(t_symtab *symtab, int *nmol, t_molinfo **mol, char *line,
1403 if ((sscanf(line, "%s%d", type, &nrexcl)) != 2)
1405 warning_error(wi, "Expected a molecule type name and nrexcl");
1408 /* Test if this atomtype overwrites another */
1412 if (gmx_strcasecmp(*((*mol)[i].name), type) == 0)
1414 gmx_fatal(FARGS, "moleculetype %s is redefined", type);
1420 srenew(*mol, *nmol);
1421 newmol = &((*mol)[*nmol-1]);
1422 init_molinfo(newmol);
1424 /* Fill in the values */
1425 newmol->name = put_symtab(symtab, type);
1426 newmol->nrexcl = nrexcl;
1427 newmol->excl_set = FALSE;
1430 static gmx_bool default_nb_params(int ftype, t_params bt[], t_atoms *at,
1431 t_param *p, int c_start, gmx_bool bB, gmx_bool bGenPairs)
1433 int i, j, ti, tj, ntype;
1436 int nr = bt[ftype].nr;
1437 int nral = NRAL(ftype);
1438 int nrfp = interaction_function[ftype].nrfpA;
1439 int nrfpB = interaction_function[ftype].nrfpB;
1441 if ((!bB && nrfp == 0) || (bB && nrfpB == 0))
1449 /* First test the generated-pair position to save
1450 * time when we have 1000*1000 entries for e.g. OPLS...
1455 ti = at->atom[p->a[0]].typeB;
1456 tj = at->atom[p->a[1]].typeB;
1460 ti = at->atom[p->a[0]].type;
1461 tj = at->atom[p->a[1]].type;
1463 pi = &(bt[ftype].param[ntype*ti+tj]);
1464 bFound = ((ti == pi->a[0]) && (tj == pi->a[1]));
1467 /* Search explicitly if we didnt find it */
1470 for (i = 0; ((i < nr) && !bFound); i++)
1472 pi = &(bt[ftype].param[i]);
1475 for (j = 0; ((j < nral) &&
1476 (at->atom[p->a[j]].typeB == pi->a[j])); j++)
1483 for (j = 0; ((j < nral) &&
1484 (at->atom[p->a[j]].type == pi->a[j])); j++)
1489 bFound = (j == nral);
1497 if (nrfp+nrfpB > MAXFORCEPARAM)
1499 gmx_incons("Too many force parameters");
1501 for (j = c_start; (j < nrfpB); j++)
1503 p->c[nrfp+j] = pi->c[j];
1508 for (j = c_start; (j < nrfp); j++)
1516 for (j = c_start; (j < nrfp); j++)
1524 static gmx_bool default_cmap_params(t_params bondtype[],
1525 t_atoms *at, gpp_atomtype_t atype,
1526 t_param *p, gmx_bool bB,
1527 int *cmap_type, int *nparam_def)
1529 int i, j, nparam_found;
1531 gmx_bool bFound = FALSE;
1536 /* Match the current cmap angle against the list of cmap_types */
1537 for (i = 0; i < bondtype->nct && !bFound; i += 6)
1546 (get_atomtype_batype(at->atom[p->a[0]].type, atype) == bondtype->cmap_types[i]) &&
1547 (get_atomtype_batype(at->atom[p->a[1]].type, atype) == bondtype->cmap_types[i+1]) &&
1548 (get_atomtype_batype(at->atom[p->a[2]].type, atype) == bondtype->cmap_types[i+2]) &&
1549 (get_atomtype_batype(at->atom[p->a[3]].type, atype) == bondtype->cmap_types[i+3]) &&
1550 (get_atomtype_batype(at->atom[p->a[4]].type, atype) == bondtype->cmap_types[i+4]))
1552 /* Found cmap torsion */
1554 ct = bondtype->cmap_types[i+5];
1560 /* If we did not find a matching type for this cmap torsion */
1563 gmx_fatal(FARGS, "Unknown cmap torsion between atoms %d %d %d %d %d\n",
1564 p->a[0]+1, p->a[1]+1, p->a[2]+1, p->a[3]+1, p->a[4]+1);
1567 *nparam_def = nparam_found;
1573 static gmx_bool default_params(int ftype, t_params bt[],
1574 t_atoms *at, gpp_atomtype_t atype,
1575 t_param *p, gmx_bool bB,
1576 t_param **param_def,
1579 int i, j, nparam_found;
1580 gmx_bool bFound, bSame;
1583 int nr = bt[ftype].nr;
1584 int nral = NRAL(ftype);
1585 int nrfpA = interaction_function[ftype].nrfpA;
1586 int nrfpB = interaction_function[ftype].nrfpB;
1588 if ((!bB && nrfpA == 0) || (bB && nrfpB == 0))
1594 /* We allow wildcards now. The first type (with or without wildcards) that
1595 * fits is used, so you should probably put the wildcarded bondtypes
1596 * at the end of each section.
1600 /* OPLS uses 1000s of dihedraltypes, so in order to speed up the scanning we have a
1601 * special case for this. Check for B state outside loop to speed it up.
1603 if (ftype == F_PDIHS || ftype == F_RBDIHS || ftype == F_IDIHS || ftype == F_PIDIHS)
1607 for (i = 0; ((i < nr) && !bFound); i++)
1609 pi = &(bt[ftype].param[i]);
1612 ((pi->AI == -1) || (get_atomtype_batype(at->atom[p->AI].typeB, atype) == pi->AI)) &&
1613 ((pi->AJ == -1) || (get_atomtype_batype(at->atom[p->AJ].typeB, atype) == pi->AJ)) &&
1614 ((pi->AK == -1) || (get_atomtype_batype(at->atom[p->AK].typeB, atype) == pi->AK)) &&
1615 ((pi->AL == -1) || (get_atomtype_batype(at->atom[p->AL].typeB, atype) == pi->AL))
1622 for (i = 0; ((i < nr) && !bFound); i++)
1624 pi = &(bt[ftype].param[i]);
1627 ((pi->AI == -1) || (get_atomtype_batype(at->atom[p->AI].type, atype) == pi->AI)) &&
1628 ((pi->AJ == -1) || (get_atomtype_batype(at->atom[p->AJ].type, atype) == pi->AJ)) &&
1629 ((pi->AK == -1) || (get_atomtype_batype(at->atom[p->AK].type, atype) == pi->AK)) &&
1630 ((pi->AL == -1) || (get_atomtype_batype(at->atom[p->AL].type, atype) == pi->AL))
1634 /* Find additional matches for this dihedral - necessary for ftype==9 which is used e.g. for charmm.
1635 * The rules in that case is that additional matches HAVE to be on adjacent lines!
1641 /* Continue from current i value */
1642 for (j = i+1; j < nr && bSame; j += 2)
1644 pj = &(bt[ftype].param[j]);
1645 bSame = (pi->AI == pj->AI && pi->AJ == pj->AJ && pi->AK == pj->AK && pi->AL == pj->AL);
1650 /* nparam_found will be increased as long as the numbers match */
1654 else /* Not a dihedral */
1656 for (i = 0; ((i < nr) && !bFound); i++)
1658 pi = &(bt[ftype].param[i]);
1661 for (j = 0; ((j < nral) &&
1662 (get_atomtype_batype(at->atom[p->a[j]].typeB, atype) == pi->a[j])); j++)
1669 for (j = 0; ((j < nral) &&
1670 (get_atomtype_batype(at->atom[p->a[j]].type, atype) == pi->a[j])); j++)
1675 bFound = (j == nral);
1684 *nparam_def = nparam_found;
1691 void push_bond(directive d, t_params bondtype[], t_params bond[],
1692 t_atoms *at, gpp_atomtype_t atype, char *line,
1693 gmx_bool bBonded, gmx_bool bGenPairs, real fudgeQQ,
1694 gmx_bool bZero, gmx_bool *bWarn_copy_A_B,
1697 const char *aaformat[MAXATOMLIST] = {
1705 const char *asformat[MAXATOMLIST] = {
1710 "%*s%*s%*s%*s%*s%*s",
1711 "%*s%*s%*s%*s%*s%*s%*s"
1713 const char *ccformat = "%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf";
1714 int nr, i, j, nral, nral_fmt, nread, ftype;
1715 char format[STRLEN];
1716 /* One force parameter more, so we can check if we read too many */
1717 double cc[MAXFORCEPARAM+1];
1718 int aa[MAXATOMLIST+1];
1719 t_param param, paramB, *param_defA, *param_defB;
1720 gmx_bool bFoundA = FALSE, bFoundB = FALSE, bDef, bPert, bSwapParity = FALSE;
1721 int nparam_defA, nparam_defB;
1724 nparam_defA = nparam_defB = 0;
1726 ftype = ifunc_index(d, 1);
1728 for (j = 0; j < MAXATOMLIST; j++)
1732 bDef = (NRFP(ftype) > 0);
1734 if (ftype == F_SETTLE)
1736 /* SETTLE acts on 3 atoms, but the topology format only specifies
1737 * the first atom (for historical reasons).
1746 nread = sscanf(line, aaformat[nral_fmt-1],
1747 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
1749 if (ftype == F_SETTLE)
1756 if (nread < nral_fmt)
1761 else if (nread > nral_fmt)
1763 /* this is a hack to allow for virtual sites with swapped parity */
1764 bSwapParity = (aa[nral] < 0);
1767 aa[nral] = -aa[nral];
1769 ftype = ifunc_index(d, aa[nral]);
1778 gmx_fatal(FARGS, "Negative function types only allowed for %s and %s",
1779 interaction_function[F_VSITE3FAD].longname,
1780 interaction_function[F_VSITE3OUT].longname);
1786 /* Check for double atoms and atoms out of bounds */
1787 for (i = 0; (i < nral); i++)
1789 if (aa[i] < 1 || aa[i] > at->nr)
1791 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
1792 "Atom index (%d) in %s out of bounds (1-%d).\n"
1793 "This probably means that you have inserted topology section \"%s\"\n"
1794 "in a part belonging to a different molecule than you intended to.\n"
1795 "In that case move the \"%s\" section to the right molecule.",
1796 get_warning_file(wi), get_warning_line(wi),
1797 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
1799 for (j = i+1; (j < nral); j++)
1803 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
1804 warning(wi, errbuf);
1809 /* default force parameters */
1810 for (j = 0; (j < MAXATOMLIST); j++)
1812 param.a[j] = aa[j]-1;
1814 for (j = 0; (j < MAXFORCEPARAM); j++)
1819 /* Get force params for normal and free energy perturbation
1820 * studies, as determined by types!
1825 bFoundA = default_params(ftype, bondtype, at, atype, ¶m, FALSE, ¶m_defA, &nparam_defA);
1828 /* Copy the A-state and B-state default parameters. */
1829 assert(NRFPA(ftype)+NRFPB(ftype) <= MAXFORCEPARAM);
1830 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
1832 param.c[j] = param_defA->c[j];
1835 bFoundB = default_params(ftype, bondtype, at, atype, ¶m, TRUE, ¶m_defB, &nparam_defB);
1838 /* Copy only the B-state default parameters */
1839 for (j = NRFPA(ftype); (j < NRFP(ftype)); j++)
1841 param.c[j] = param_defB->c[j];
1845 else if (ftype == F_LJ14)
1847 bFoundA = default_nb_params(ftype, bondtype, at, ¶m, 0, FALSE, bGenPairs);
1848 bFoundB = default_nb_params(ftype, bondtype, at, ¶m, 0, TRUE, bGenPairs);
1850 else if (ftype == F_LJC14_Q)
1852 param.c[0] = fudgeQQ;
1853 /* Fill in the A-state charges as default parameters */
1854 param.c[1] = at->atom[param.a[0]].q;
1855 param.c[2] = at->atom[param.a[1]].q;
1856 /* The default LJ parameters are the standard 1-4 parameters */
1857 bFoundA = default_nb_params(F_LJ14, bondtype, at, ¶m, 3, FALSE, bGenPairs);
1860 else if (ftype == F_LJC_PAIRS_NB)
1862 /* Defaults are not supported here */
1868 gmx_incons("Unknown function type in push_bond");
1871 if (nread > nral_fmt)
1873 /* Manually specified parameters - in this case we discard multiple torsion info! */
1875 strcpy(format, asformat[nral_fmt-1]);
1876 strcat(format, ccformat);
1878 nread = sscanf(line, format, &cc[0], &cc[1], &cc[2], &cc[3], &cc[4], &cc[5],
1879 &cc[6], &cc[7], &cc[8], &cc[9], &cc[10], &cc[11], &cc[12]);
1881 if ((nread == NRFPA(ftype)) && (NRFPB(ftype) != 0))
1883 /* We only have to issue a warning if these atoms are perturbed! */
1885 for (j = 0; (j < nral); j++)
1887 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
1890 if (bPert && *bWarn_copy_A_B)
1893 "Some parameters for bonded interaction involving perturbed atoms are specified explicitly in state A, but not B - copying A to B");
1894 warning(wi, errbuf);
1895 *bWarn_copy_A_B = FALSE;
1898 /* If only the A parameters were specified, copy them to the B state */
1899 /* The B-state parameters correspond to the first nrfpB
1900 * A-state parameters.
1902 for (j = 0; (j < NRFPB(ftype)); j++)
1904 cc[nread++] = cc[j];
1908 /* If nread was 0 or EOF, no parameters were read => use defaults.
1909 * If nread was nrfpA we copied above so nread=nrfp.
1910 * If nread was nrfp we are cool.
1911 * For F_LJC14_Q we allow supplying fudgeQQ only.
1912 * Anything else is an error!
1914 if ((nread != 0) && (nread != EOF) && (nread != NRFP(ftype)) &&
1915 !(ftype == F_LJC14_Q && nread == 1))
1917 gmx_fatal(FARGS, "Incorrect number of parameters - found %d, expected %d or %d for %s.",
1918 nread, NRFPA(ftype), NRFP(ftype),
1919 interaction_function[ftype].longname);
1922 for (j = 0; (j < nread); j++)
1927 /* Check whether we have to use the defaults */
1928 if (nread == NRFP(ftype))
1937 /* nread now holds the number of force parameters read! */
1942 /* When we have multiple terms it would be very dangerous to allow perturbations to a different atom type! */
1943 if (ftype == F_PDIHS)
1945 if ((nparam_defA != nparam_defB) || ((nparam_defA > 1 || nparam_defB > 1) && (param_defA != param_defB)))
1948 "Cannot automatically perturb a torsion with multiple terms to different form.\n"
1949 "Please specify perturbed parameters manually for this torsion in your topology!");
1950 warning_error(wi, errbuf);
1954 if (nread > 0 && nread < NRFPA(ftype))
1956 /* Issue an error, do not use defaults */
1957 sprintf(errbuf, "Not enough parameters, there should be at least %d (or 0 for defaults)", NRFPA(ftype));
1958 warning_error(wi, errbuf);
1961 if (nread == 0 || nread == EOF)
1965 if (interaction_function[ftype].flags & IF_VSITE)
1967 /* set them to NOTSET, will be calculated later */
1968 for (j = 0; (j < MAXFORCEPARAM); j++)
1970 param.c[j] = NOTSET;
1975 param.C1 = -1; /* flag to swap parity of vsite construction */
1982 fprintf(stderr, "NOTE: No default %s types, using zeroes\n",
1983 interaction_function[ftype].longname);
1987 sprintf(errbuf, "No default %s types", interaction_function[ftype].longname);
1988 warning_error(wi, errbuf);
1999 param.C0 = 360 - param.C0;
2002 param.C2 = -param.C2;
2009 /* We only have to issue a warning if these atoms are perturbed! */
2011 for (j = 0; (j < nral); j++)
2013 bPert = bPert || PERTURBED(at->atom[param.a[j]]);
2018 sprintf(errbuf, "No default %s types for perturbed atoms, "
2019 "using normal values", interaction_function[ftype].longname);
2020 warning(wi, errbuf);
2026 if ((ftype == F_PDIHS || ftype == F_ANGRES || ftype == F_ANGRESZ)
2027 && param.c[5] != param.c[2])
2029 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2030 " %s multiplicity can not be perturbed %f!=%f",
2031 get_warning_file(wi), get_warning_line(wi),
2032 interaction_function[ftype].longname,
2033 param.c[2], param.c[5]);
2036 if (IS_TABULATED(ftype) && param.c[2] != param.c[0])
2038 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2039 " %s table number can not be perturbed %d!=%d",
2040 get_warning_file(wi), get_warning_line(wi),
2041 interaction_function[ftype].longname,
2042 (int)(param.c[0]+0.5), (int)(param.c[2]+0.5));
2045 /* Dont add R-B dihedrals where all parameters are zero (no interaction) */
2046 if (ftype == F_RBDIHS)
2049 for (i = 0; i < NRFP(ftype); i++)
2051 if (param.c[i] != 0)
2062 /* Put the values in the appropriate arrays */
2063 add_param_to_list (&bond[ftype], ¶m);
2065 /* Push additional torsions from FF for ftype==9 if we have them.
2066 * We have already checked that the A/B states do not differ in this case,
2067 * so we do not have to double-check that again, or the vsite stuff.
2068 * In addition, those torsions cannot be automatically perturbed.
2070 if (bDef && ftype == F_PDIHS)
2072 for (i = 1; i < nparam_defA; i++)
2074 /* Advance pointer! */
2076 for (j = 0; (j < NRFPA(ftype)+NRFPB(ftype)); j++)
2078 param.c[j] = param_defA->c[j];
2080 /* And push the next term for this torsion */
2081 add_param_to_list (&bond[ftype], ¶m);
2086 void push_cmap(directive d, t_params bondtype[], t_params bond[],
2087 t_atoms *at, gpp_atomtype_t atype, char *line,
2090 const char *aaformat[MAXATOMLIST+1] =
2101 int i, j, nr, ftype, nral, nread, ncmap_params;
2103 int aa[MAXATOMLIST+1];
2106 t_param param, paramB, *param_defA, *param_defB;
2108 ftype = ifunc_index(d, 1);
2110 nr = bondtype[ftype].nr;
2113 nread = sscanf(line, aaformat[nral-1],
2114 &aa[0], &aa[1], &aa[2], &aa[3], &aa[4], &aa[5]);
2121 else if (nread == nral)
2123 ftype = ifunc_index(d, 1);
2126 /* Check for double atoms and atoms out of bounds */
2127 for (i = 0; i < nral; i++)
2129 if (aa[i] < 1 || aa[i] > at->nr)
2131 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2132 "Atom index (%d) in %s out of bounds (1-%d).\n"
2133 "This probably means that you have inserted topology section \"%s\"\n"
2134 "in a part belonging to a different molecule than you intended to.\n"
2135 "In that case move the \"%s\" section to the right molecule.",
2136 get_warning_file(wi), get_warning_line(wi),
2137 aa[i], dir2str(d), at->nr, dir2str(d), dir2str(d));
2140 for (j = i+1; (j < nral); j++)
2144 sprintf(errbuf, "Duplicate atom index (%d) in %s", aa[i], dir2str(d));
2145 warning(wi, errbuf);
2150 /* default force parameters */
2151 for (j = 0; (j < MAXATOMLIST); j++)
2153 param.a[j] = aa[j]-1;
2155 for (j = 0; (j < MAXFORCEPARAM); j++)
2160 /* Get the cmap type for this cmap angle */
2161 bFound = default_cmap_params(bondtype, at, atype, ¶m, FALSE, &cmap_type, &ncmap_params);
2163 /* We want exactly one parameter (the cmap type in state A (currently no state B) back */
2164 if (bFound && ncmap_params == 1)
2166 /* Put the values in the appropriate arrays */
2167 param.c[0] = cmap_type;
2168 add_param_to_list(&bond[ftype], ¶m);
2172 /* This is essentially the same check as in default_cmap_params() done one more time */
2173 gmx_fatal(FARGS, "Unable to assign a cmap type to torsion %d %d %d %d and %d\n",
2174 param.a[0]+1, param.a[1]+1, param.a[2]+1, param.a[3]+1, param.a[4]+1);
2180 void push_vsitesn(directive d, t_params bond[],
2181 t_atoms *at, char *line,
2185 int type, ftype, j, n, ret, nj, a;
2187 double *weight = NULL, weight_tot;
2190 /* default force parameters */
2191 for (j = 0; (j < MAXATOMLIST); j++)
2193 param.a[j] = NOTSET;
2195 for (j = 0; (j < MAXFORCEPARAM); j++)
2201 ret = sscanf(ptr, "%d%n", &a, &n);
2205 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2206 " Expected an atom index in section \"%s\"",
2207 get_warning_file(wi), get_warning_line(wi),
2213 ret = sscanf(ptr, "%d%n", &type, &n);
2215 ftype = ifunc_index(d, type);
2221 ret = sscanf(ptr, "%d%n", &a, &n);
2228 srenew(weight, nj+20);
2237 /* Here we use the A-state mass as a parameter.
2238 * Note that the B-state mass has no influence.
2240 weight[nj] = at->atom[atc[nj]].m;
2244 ret = sscanf(ptr, "%lf%n", &(weight[nj]), &n);
2248 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2249 " No weight or negative weight found for vsiten constructing atom %d (atom index %d)",
2250 get_warning_file(wi), get_warning_line(wi),
2255 gmx_fatal(FARGS, "Unknown vsiten type %d", type);
2257 weight_tot += weight[nj];
2265 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2266 " Expected more than one atom index in section \"%s\"",
2267 get_warning_file(wi), get_warning_line(wi),
2271 if (weight_tot == 0)
2273 gmx_fatal(FARGS, "[ file %s, line %d ]:\n"
2274 " The total mass of the construting atoms is zero",
2275 get_warning_file(wi), get_warning_line(wi));
2278 for (j = 0; j < nj; j++)
2280 param.a[1] = atc[j];
2282 param.c[1] = weight[j]/weight_tot;
2283 /* Put the values in the appropriate arrays */
2284 add_param_to_list (&bond[ftype], ¶m);
2291 void push_mol(int nrmols, t_molinfo mols[], char *pline, int *whichmol,
2299 if (sscanf(pline, "%s%d", type, &copies) != 2)
2305 /* search moleculename */
2306 for (i = 0; ((i < nrmols) && gmx_strcasecmp(type, *(mols[i].name))); i++)
2318 gmx_fatal(FARGS, "No such moleculetype %s", type);
2322 void init_block2(t_block2 *b2, int natom)
2327 snew(b2->nra, b2->nr);
2328 snew(b2->a, b2->nr);
2329 for (i = 0; (i < b2->nr); i++)
2335 void done_block2(t_block2 *b2)
2341 for (i = 0; (i < b2->nr); i++)
2351 void push_excl(char *line, t_block2 *b2)
2355 char base[STRLEN], format[STRLEN];
2357 if (sscanf(line, "%d", &i) == 0)
2362 if ((1 <= i) && (i <= b2->nr))
2370 fprintf(debug, "Unbound atom %d\n", i-1);
2374 strcpy(base, "%*d");
2377 strcpy(format, base);
2378 strcat(format, "%d");
2379 n = sscanf(line, format, &j);
2382 if ((1 <= j) && (j <= b2->nr))
2385 srenew(b2->a[i], ++(b2->nra[i]));
2386 b2->a[i][b2->nra[i]-1] = j;
2387 /* also add the reverse exclusion! */
2388 srenew(b2->a[j], ++(b2->nra[j]));
2389 b2->a[j][b2->nra[j]-1] = i;
2390 strcat(base, "%*d");
2394 gmx_fatal(FARGS, "Invalid Atomnr j: %d, b2->nr: %d\n", j, b2->nr);
2401 void b_to_b2(t_blocka *b, t_block2 *b2)
2406 for (i = 0; (i < b->nr); i++)
2408 for (j = b->index[i]; (j < b->index[i+1]); j++)
2411 srenew(b2->a[i], ++b2->nra[i]);
2412 b2->a[i][b2->nra[i]-1] = a;
2417 void b2_to_b(t_block2 *b2, t_blocka *b)
2423 for (i = 0; (i < b2->nr); i++)
2426 for (j = 0; (j < b2->nra[i]); j++)
2428 b->a[nra+j] = b2->a[i][j];
2432 /* terminate list */
2436 static int icomp(const void *v1, const void *v2)
2438 return (*((atom_id *) v1))-(*((atom_id *) v2));
2441 void merge_excl(t_blocka *excl, t_block2 *b2)
2451 else if (b2->nr != excl->nr)
2453 gmx_fatal(FARGS, "DEATH HORROR: b2->nr = %d, while excl->nr = %d",
2458 fprintf(debug, "Entering merge_excl\n");
2461 /* First copy all entries from excl to b2 */
2464 /* Count and sort the exclusions */
2466 for (i = 0; (i < b2->nr); i++)
2470 /* remove double entries */
2471 qsort(b2->a[i], (size_t)b2->nra[i], (size_t)sizeof(b2->a[i][0]), icomp);
2473 for (j = 1; (j < b2->nra[i]); j++)
2475 if (b2->a[i][j] != b2->a[i][k-1])
2477 b2->a[i][k] = b2->a[i][j];
2486 srenew(excl->a, excl->nra);
2491 int add_atomtype_decoupled(t_symtab *symtab, gpp_atomtype_t at,
2492 t_nbparam ***nbparam, t_nbparam ***pair)
2498 /* Define an atom type with all parameters set to zero (no interactions) */
2501 /* Type for decoupled atoms could be anything,
2502 * this should be changed automatically later when required.
2504 atom.ptype = eptAtom;
2505 for (i = 0; (i < MAXFORCEPARAM); i++)
2510 nr = add_atomtype(at, symtab, &atom, "decoupled", ¶m, -1, 0.0, 0.0, 0.0, 0, 0, 0);
2512 /* Add space in the non-bonded parameters matrix */
2513 realloc_nb_params(at, nbparam, pair);
2518 static void convert_pairs_to_pairsQ(t_params *plist,
2519 real fudgeQQ, t_atoms *atoms)
2521 t_param *paramp1, *paramp2, *paramnew;
2522 int i, j, p1nr, p2nr, p2newnr;
2524 /* Add the pair list to the pairQ list */
2525 p1nr = plist[F_LJ14].nr;
2526 p2nr = plist[F_LJC14_Q].nr;
2527 p2newnr = p1nr + p2nr;
2528 snew(paramnew, p2newnr);
2530 paramp1 = plist[F_LJ14].param;
2531 paramp2 = plist[F_LJC14_Q].param;
2533 /* Fill in the new F_LJC14_Q array with the old one. NOTE:
2534 it may be possible to just ADD the converted F_LJ14 array
2535 to the old F_LJC14_Q array, but since we have to create
2536 a new sized memory structure, better just to deep copy it all.
2539 for (i = 0; i < p2nr; i++)
2541 /* Copy over parameters */
2542 for (j = 0; j < 5; j++) /* entries are 0-4 for F_LJC14_Q */
2544 paramnew[i].c[j] = paramp2[i].c[j];
2547 /* copy over atoms */
2548 for (j = 0; j < 2; j++)
2550 paramnew[i].a[j] = paramp2[i].a[j];
2554 for (i = p2nr; i < p2newnr; i++)
2558 /* Copy over parameters */
2559 paramnew[i].c[0] = fudgeQQ;
2560 paramnew[i].c[1] = atoms->atom[paramp1[j].a[0]].q;
2561 paramnew[i].c[2] = atoms->atom[paramp1[j].a[1]].q;
2562 paramnew[i].c[3] = paramp1[j].c[0];
2563 paramnew[i].c[4] = paramp1[j].c[1];
2565 /* copy over atoms */
2566 paramnew[i].a[0] = paramp1[j].a[0];
2567 paramnew[i].a[1] = paramp1[j].a[1];
2570 /* free the old pairlists */
2571 sfree(plist[F_LJC14_Q].param);
2572 sfree(plist[F_LJ14].param);
2574 /* now assign the new data to the F_LJC14_Q structure */
2575 plist[F_LJC14_Q].param = paramnew;
2576 plist[F_LJC14_Q].nr = p2newnr;
2578 /* Empty the LJ14 pairlist */
2579 plist[F_LJ14].nr = 0;
2580 plist[F_LJ14].param = NULL;
2583 static void generate_LJCpairsNB(t_molinfo *mol, int nb_funct, t_params *nbp)
2585 int n, ntype, i, j, k;
2592 atom = mol->atoms.atom;
2594 ntype = sqrt(nbp->nr);
2596 for (i = 0; i < MAXATOMLIST; i++)
2598 param.a[i] = NOTSET;
2600 for (i = 0; i < MAXFORCEPARAM; i++)
2602 param.c[i] = NOTSET;
2605 /* Add a pair interaction for all non-excluded atom pairs */
2607 for (i = 0; i < n; i++)
2609 for (j = i+1; j < n; j++)
2612 for (k = excl->index[i]; k < excl->index[i+1]; k++)
2614 if (excl->a[k] == j)
2621 if (nb_funct != F_LJ)
2623 gmx_fatal(FARGS, "Can only generate non-bonded pair interactions for Van der Waals type Lennard-Jones");
2627 param.c[0] = atom[i].q;
2628 param.c[1] = atom[j].q;
2629 param.c[2] = nbp->param[ntype*atom[i].type+atom[j].type].c[0];
2630 param.c[3] = nbp->param[ntype*atom[i].type+atom[j].type].c[1];
2631 add_param_to_list(&mol->plist[F_LJC_PAIRS_NB], ¶m);
2637 static void set_excl_all(t_blocka *excl)
2641 /* Get rid of the current exclusions and exclude all atom pairs */
2643 excl->nra = nat*nat;
2644 srenew(excl->a, excl->nra);
2646 for (i = 0; i < nat; i++)
2649 for (j = 0; j < nat; j++)
2654 excl->index[nat] = k;
2657 static void decouple_atoms(t_atoms *atoms, int atomtype_decouple,
2658 int couple_lam0, int couple_lam1)
2662 for (i = 0; i < atoms->nr; i++)
2664 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamVDW)
2666 atoms->atom[i].q = 0.0;
2668 if (couple_lam0 == ecouplamNONE || couple_lam0 == ecouplamQ)
2670 atoms->atom[i].type = atomtype_decouple;
2672 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamVDW)
2674 atoms->atom[i].qB = 0.0;
2676 if (couple_lam1 == ecouplamNONE || couple_lam1 == ecouplamQ)
2678 atoms->atom[i].typeB = atomtype_decouple;
2683 void convert_moltype_couple(t_molinfo *mol, int atomtype_decouple, real fudgeQQ,
2684 int couple_lam0, int couple_lam1,
2685 gmx_bool bCoupleIntra, int nb_funct, t_params *nbp)
2687 convert_pairs_to_pairsQ(mol->plist, fudgeQQ, &mol->atoms);
2690 generate_LJCpairsNB(mol, nb_funct, nbp);
2691 set_excl_all(&mol->excls);
2693 decouple_atoms(&mol->atoms, atomtype_decouple, couple_lam0, couple_lam1);