/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2006,2007,2008,2009,2010,2011,2012,2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
ild->nr += ils->nr;
}
- }
- }
-
- /* Position restraints need an additional treatment */
- if (dest->il[F_POSRES].nr > 0)
- {
- int n, s, i;
- n = dest->il[F_POSRES].nr/2;
- if (n > dest->iparams_posres_nalloc)
- {
- dest->iparams_posres_nalloc = over_alloc_large(n);
- srenew(dest->iparams_posres, dest->iparams_posres_nalloc);
- }
- /* Set n to the number of original position restraints in dest */
- for (s = 1; s < nsrc; s++)
- {
- n -= src[s].idef.il[F_POSRES].nr/2;
- }
- for (s = 1; s < nsrc; s++)
- {
- for (i = 0; i < src[s].idef.il[F_POSRES].nr/2; i++)
+ /* Position restraints need an additional treatment */
+ if (ftype == F_POSRES || ftype == F_FBPOSRES)
{
- /* Correct the index into iparams_posres */
- dest->il[F_POSRES].iatoms[n*2] = n;
- /* Copy the position restraint force parameters */
- dest->iparams_posres[n] = src[s].idef.iparams_posres[i];
- n++;
+ int nposres = dest->il[ftype].nr/2;
+ if (nposres > dest->iparams_posres_nalloc)
+ {
+ dest->iparams_posres_nalloc = over_alloc_large(nposres);
+ srenew(dest->iparams_posres, dest->iparams_posres_nalloc);
+ }
+ /* Set nposres to the number of original position restraints in dest */
+ for (int s = 1; s < nsrc; s++)
+ {
+ nposres -= src[s].idef.il[ftype].nr/2;
+ }
+ for (int s = 1; s < nsrc; s++)
+ {
+ if (ftype == F_POSRES)
+ {
+ for (int i = 0; i < src[s].idef.il[ftype].nr/2; i++)
+ {
+ /* Correct the index into iparams_posres */
+ dest->il[ftype].iatoms[nposres*2] = nposres;
+ /* Copy the position restraint force parameters */
+ dest->iparams_posres[nposres] = src[s].idef.iparams_posres[i];
+ nposres++;
+ }
+ }
+ else
+ {
+ for (int i = 0; i < src[s].idef.il[ftype].nr/2; i++)
+ {
+ /* Correct the index into iparams_fbposres */
+ dest->il[ftype].iatoms[nposres*2] = nposres;
+ /* Copy the position restraint force parameters */
+ dest->iparams_fbposres[nposres] = src[s].idef.iparams_fbposres[i];
+ nposres++;
+ }
+ }
+ }
}
}
}
*
* Copyright (c) 1991-2000, University of Groningen, The Netherlands.
* Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2013,2014,2015,2016, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
for (j = i+1; (j < nspec); j++)
{
aj = sgp[j];
- if (is_bond(nsb, sb, pdba, ai, aj, d[i][j], &index_sb, &bSwap))
+ /* Ensure creation of at most nspec special bonds to avoid overflowing bonds[] */
+ if (nbonds < nspec && is_bond(nsb, sb, pdba, ai, aj, d[i][j], &index_sb, &bSwap))
{
fprintf(stderr, "%s %s-%d %s-%d and %s-%d %s-%d%s",
bInteractive ? "Link" : "Linking",