From 9680c976dd63a2f8615966b34a2a3d73dba18ffa Mon Sep 17 00:00:00 2001 From: Berk Hess Date: Fri, 10 Jun 2016 11:58:10 +0200 Subject: [PATCH] Fix bug with fbposres+MPI+OpenMP The flat-bottom reference coodinates got mixed up when running with MPI + OpenMP. Fixes #1969. Change-Id: Idcac7ae03e1f7018bc7b65de37a3d63abe8ebefc --- src/gromacs/domdec/domdec_topology.cpp | 66 ++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/src/gromacs/domdec/domdec_topology.cpp b/src/gromacs/domdec/domdec_topology.cpp index e0b9df217e..81b6f80ad4 100644 --- a/src/gromacs/domdec/domdec_topology.cpp +++ b/src/gromacs/domdec/domdec_topology.cpp @@ -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. @@ -1262,34 +1262,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++; + } + } + } } } } -- 2.11.4.GIT