ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/parallel/Communicator.hpp
(Generate patch)

Comparing branches/development/src/parallel/Communicator.hpp (file contents):
Revision 1549 by gezelter, Wed Apr 27 18:38:15 2011 UTC vs.
Revision 1589 by gezelter, Sun Jul 10 16:05:34 2011 UTC

# Line 53 | Line 53
53   #include <mpi.h>
54   #include "math/SquareMatrix3.hpp"
55  
56 + using namespace std;
57   namespace OpenMD{
58    
59   #ifdef IS_MPI
# Line 63 | Line 64 | namespace OpenMD{
64      Column = 2
65    };
66      
67 <  template<typename T>
68 <  struct MPITraits
69 <  {
70 <    static const MPI::Datatype datatype;
71 <    static const int dim;
67 >  template<class T>
68 >  class MPITraits {
69 >  public:
70 >    static MPI::Datatype Type();
71 >    static int Length() { return 1; };
72    };
73    
74 <  template<> const MPI::Datatype MPITraits<int>::datatype = MPI_INT;
75 <  template<> const int MPITraits<int>::dim = 1;
76 <  template<> const MPI::Datatype MPITraits<RealType>::datatype = MPI_REALTYPE;
77 <  template<> const int MPITraits<RealType>::dim = 1;
78 <  template<> const MPI::Datatype MPITraits<Vector3d>::datatype = MPI_REALTYPE;
79 <  template<> const int MPITraits<Vector3d>::dim = 3;
80 <  template<> const MPI::Datatype MPITraits<Mat3x3d>::datatype = MPI_REALTYPE;
81 <  template<> const int MPITraits<Mat3x3d>::dim = 9;
74 >  template<> inline MPI::Datatype MPITraits<int>::Type() { return MPI_INT; }
75 >  template<> inline MPI::Datatype MPITraits<RealType>::Type() { return MPI_REALTYPE; }
76 >
77 >  template<class T, unsigned int Dim>
78 >  class MPITraits< Vector<T, Dim> > {
79 >  public:
80 >    static MPI::Datatype Type() { return MPITraits<T>::Type(); }
81 >    static int Length() {return Dim;}
82 >  };
83 >
84 >  template<class T>
85 >  class MPITraits< Vector3<T> > {
86 >  public:
87 >    static MPI::Datatype Type() { return MPITraits<T>::Type(); }
88 >    static int Length() {return 3;}
89 >  };
90 >
91 >  template<class T, unsigned int Row, unsigned int Col>
92 >  class MPITraits< RectMatrix<T, Row, Col> > {
93 >  public:
94 >    static MPI::Datatype Type() { return MPITraits<T>::Type(); }
95 >    static int Length() {return Row * Col;}
96 >  };
97 >
98 >  template<class T>
99 >  class MPITraits< SquareMatrix3<T> > {
100 >  public:
101 >    static MPI::Datatype Type() { return MPITraits<T>::Type(); }
102 >    static int Length() {return 9;}
103 >  };
104    
105 +  
106    template<communicatorType D, typename T>
107    class Communicator {
108    public:
# Line 112 | Line 136 | namespace OpenMD{
136          
137        int nCommProcs = myComm.Get_size();
138  
139 <      counts.reserve(nCommProcs);
140 <      displacements.reserve(nCommProcs);
139 >      counts.resize(nCommProcs, 0);
140 >      displacements.resize(nCommProcs, 0);
141  
142 <      planSize_ = MPITraits<T>::dim * nObjects;
142 >      planSize_ = MPITraits<T>::Length() * nObjects;
143  
144        myComm.Allgather(&planSize_, 1, MPI::INT, &counts[0], 1, MPI::INT);
145  
146        displacements[0] = 0;
147        for (int i = 1; i < nCommProcs; i++) {
148          displacements[i] = displacements[i-1] + counts[i-1];
125        size_ += counts[i-1];
149        }
150  
151        size_ = 0;
# Line 131 | Line 154 | namespace OpenMD{
154        }
155      }
156  
157 +    
158 +    void gather(vector<T>& v1, vector<T>& v2) {
159  
160 <    void gather(std::vector<T>& v1, std::vector<T>& v2) {
160 >      // an assert would be helpful here to make sure the vectors are the
161 >      // correct geometry
162        
163        myComm.Allgatherv(&v1[0],
164                          planSize_,
165 <                        MPITraits<T>::datatype,
165 >                        MPITraits<T>::Type(),
166                          &v2[0],
167                          &counts[0],
168                          &displacements[0],
169 <                        MPITraits<T>::datatype);      
169 >                        MPITraits<T>::Type());      
170      }
145
171      
172 <  
173 <    void scatter(std::vector<T>& v1, std::vector<T>& v2) {
174 <
172 >    
173 >    
174 >    void scatter(vector<T>& v1, vector<T>& v2) {
175 >      // an assert would be helpful here to make sure the vectors are the
176 >      // correct geometry
177 >      
178        myComm.Reduce_scatter(&v1[0], &v2[0], &counts[0],
179 <                            MPITraits<T>::datatype, MPI::SUM);
179 >                            MPITraits<T>::Type(), MPI::SUM);
180      }
181 <
181 >    
182      int getSize() {
183        return size_;
184      }
# Line 160 | Line 188 | namespace OpenMD{
188      int rowIndex_;
189      int columnIndex_;
190      int size_;
191 <    std::vector<int> counts;
192 <    std::vector<int> displacements;
191 >    vector<int> counts;
192 >    vector<int> displacements;
193      MPI::Intracomm myComm;
194    };
195  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines