From eafefd2637c352883158f055f94cc0fa780fc8c4 Mon Sep 17 00:00:00 2001
From: Gareth Tribello <gt@eider.phy.qub.ac.uk>
Date: Wed, 22 Apr 2015 08:10:25 +0100
Subject: [PATCH] Fixed potential bug in Atoms

If you had your atoms distributed among the domains such that one
node had on all the Atoms there could be a problem in running plumed.
This change fixes this problem.  Also deleted rogue check in
AdjacencyMatrixAction
---
 src/core/Atoms.cpp                        | 23 +++++++++++++----------
 src/core/Atoms.h                          |  2 +-
 src/multicolvar/AdjacencyMatrixAction.cpp |  1 -
 3 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/src/core/Atoms.cpp b/src/core/Atoms.cpp
index 9f713ebf3..636f526fa 100644
--- a/src/core/Atoms.cpp
+++ b/src/core/Atoms.cpp
@@ -52,7 +52,7 @@ Atoms::Atoms(PlumedMain&plumed):
   forcesHaveBeenSet(0),
   virialHasBeenSet(false),
   massAndChargeOK(false),
-  shuffledAtoms(false),
+  shuffledAtoms(0),
   plumed(plumed),
   naturalUnits(false),
   timestep(0.0),
@@ -141,7 +141,7 @@ void Atoms::share(){
     shareAll();
     return;
   }
-  if(dd && shuffledAtoms){
+  if(dd && shuffledAtoms>0){
     for(unsigned i=0;i<actions.size();i++) if(actions[i]->isActive()) {
       unique.insert(actions[i]->getUnique().begin(),actions[i]->getUnique().end());
     }
@@ -151,7 +151,7 @@ void Atoms::share(){
 
 void Atoms::shareAll(){
   std::set<AtomNumber> unique;
-  if(dd && shuffledAtoms)
+  if(dd && shuffledAtoms>0)
     for(int i=0;i<natoms;i++) unique.insert(AtomNumber::index(i));
   share(unique);
 }
@@ -167,7 +167,7 @@ void Atoms::share(const std::set<AtomNumber>& unique){
     mdatoms->getCharges(gatindex,charges);
     mdatoms->getMasses(gatindex,masses);
   }
-  if(dd && shuffledAtoms){
+  if(dd && shuffledAtoms>0){
     if(dd.async){
       for(unsigned i=0;i<dd.mpi_request_positions.size();i++) dd.mpi_request_positions[i].wait();
       for(unsigned i=0;i<dd.mpi_request_index.size();i++)     dd.mpi_request_index[i].wait();
@@ -237,7 +237,7 @@ void Atoms::wait(){
 
   if(collectEnergy) energy=md_energy;
 
-  if(dd && shuffledAtoms){
+  if(dd && shuffledAtoms>0){
 // receive toBeReceived
     Communicator::Status status;
     if(dd.async){
@@ -322,21 +322,24 @@ void Atoms::setAtomsGatindex(int*g){
   for(unsigned i=0;i<gatindex.size();i++) gatindex[i]=g[i];
   for(unsigned i=0;i<dd.g2l.size();i++) dd.g2l[i]=-1;
   if( gatindex.size()==natoms ){
-      shuffledAtoms=false;
+      shuffledAtoms=0;
       for(unsigned i=0;i<gatindex.size();i++){
-          if( gatindex[i]!=i ){ shuffledAtoms=true; break; }
+          if( gatindex[i]!=i ){ shuffledAtoms=1; break; }
       }
   } else {
-      shuffledAtoms=true;
+      shuffledAtoms=1;
+  }
+  if(dd){
+     dd.Sum(shuffledAtoms);
+     for(unsigned i=0;i<gatindex.size();i++) dd.g2l[gatindex[i]]=i;
   }
-  if(dd) for(unsigned i=0;i<gatindex.size();i++) dd.g2l[gatindex[i]]=i;
 }
 
 void Atoms::setAtomsContiguous(int start){
   for(unsigned i=0;i<gatindex.size();i++) gatindex[i]=start+i;
   for(unsigned i=0;i<dd.g2l.size();i++) dd.g2l[i]=-1;
   if(dd) for(unsigned i=0;i<gatindex.size();i++) dd.g2l[gatindex[i]]=i;
-  if(gatindex.size()<natoms) shuffledAtoms=true;
+  if(gatindex.size()<natoms) shuffledAtoms=1;
 }
 
 void Atoms::setRealPrecision(int p){
diff --git a/src/core/Atoms.h b/src/core/Atoms.h
index 74f523d3b..6673a51e8 100644
--- a/src/core/Atoms.h
+++ b/src/core/Atoms.h
@@ -70,7 +70,7 @@ class Atoms
   unsigned forcesHaveBeenSet;
   bool virialHasBeenSet;
   bool massAndChargeOK;
-  bool shuffledAtoms;
+  unsigned shuffledAtoms;
 
   std::map<std::string,std::vector<AtomNumber> > groups;
 
diff --git a/src/multicolvar/AdjacencyMatrixAction.cpp b/src/multicolvar/AdjacencyMatrixAction.cpp
index 968d32c5d..92ef381f4 100644
--- a/src/multicolvar/AdjacencyMatrixAction.cpp
+++ b/src/multicolvar/AdjacencyMatrixAction.cpp
@@ -60,7 +60,6 @@ tmpdf(1)
           }
 
           for(unsigned j=i;j<nfunc;++j){
-             plumed_assert( j*(i+1)<0.5*(nfunc*nfunc+nfunc) );
              std::string sw, errors; parseNumbered("SWITCH",ibase+j+1,sw);
              if(sw.length()==0){
                 std::string num; Tools::convert(ibase+j+1,num);
-- 
GitLab