Merge branch release-5-1 into release-2016
[alexxy/gromacs.git] / src / gromacs / domdec / domdec_topology.cpp
index ba47ff540bd1e34ea249db5196ccc3b16012459b..548e373e8564e9237308a1ace4970eccb2fe027f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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.
@@ -1258,34 +1258,46 @@ static void combine_idef(t_idef *dest, const thread_work_t *src, int nsrc,
 
                 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++;
+                        }
+                    }
+                }
             }
         }
     }