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 1589 by gezelter, Sun Jul 10 16:05:34 2011 UTC vs.
Revision 1665 by gezelter, Tue Nov 22 20:38:56 2011 UTC

# Line 43 | Line 43
43   * [1]  Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).            
44   * [2]  Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).          
45   * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).          
46 < * [4]  Vardeman & Gezelter, in progress (2009).                        
46 > * [4]  Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
47 > * [5]  Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
48   */
49  
50   #ifndef PARALLEL_COMMUNICATOR_HPP
# Line 103 | Line 104 | namespace OpenMD{
104    };
105    
106    
107 <  template<communicatorType D, typename T>
107 >  template<communicatorType D>
108    class Communicator {
109    public:
110      
111 <    Communicator<D, T>(int nObjects) {
111 >    Communicator<D>() {
112        
113        int nProc = MPI::COMM_WORLD.Get_size();
114        int myRank = MPI::COMM_WORLD.Get_rank();
115 <
115 >      
116        int nColumnsMax = (int) sqrt(RealType(nProc));
117  
118        int nColumns;
# Line 133 | Line 134 | namespace OpenMD{
134        case Global:
135          myComm = MPI::COMM_WORLD.Split(myRank, 0);
136        }
136        
137      int nCommProcs = myComm.Get_size();
137  
138 +    }
139 +    
140 +    MPI::Intracomm getComm() { return myComm; }
141 +    
142 +  private:
143 +    int rowIndex_;
144 +    int columnIndex_;
145 +    MPI::Intracomm myComm;
146 +  };
147 +  
148 +
149 +  template<typename T>
150 +  class Plan {
151 +  public:
152 +    
153 +    Plan<T>(MPI::Intracomm comm, int nObjects) {
154 +      myComm = comm;
155 +      int nCommProcs = myComm.Get_size();
156 +      
157        counts.resize(nCommProcs, 0);
158        displacements.resize(nCommProcs, 0);
159 <
159 >      
160        planSize_ = MPITraits<T>::Length() * nObjects;
161 <
161 >      
162        myComm.Allgather(&planSize_, 1, MPI::INT, &counts[0], 1, MPI::INT);
163 <
163 >      
164        displacements[0] = 0;
165        for (int i = 1; i < nCommProcs; i++) {
166          displacements[i] = displacements[i-1] + counts[i-1];
# Line 156 | Line 174 | namespace OpenMD{
174  
175      
176      void gather(vector<T>& v1, vector<T>& v2) {
177 <
177 >      
178        // an assert would be helpful here to make sure the vectors are the
179        // correct geometry
180        
# Line 167 | Line 185 | namespace OpenMD{
185                          &counts[0],
186                          &displacements[0],
187                          MPITraits<T>::Type());      
188 <    }
188 >    }      
189      
172    
173    
190      void scatter(vector<T>& v1, vector<T>& v2) {
191        // an assert would be helpful here to make sure the vectors are the
192        // correct geometry
193 <      
193 >            
194        myComm.Reduce_scatter(&v1[0], &v2[0], &counts[0],
195                              MPITraits<T>::Type(), MPI::SUM);
196      }
# Line 185 | Line 201 | namespace OpenMD{
201      
202    private:
203      int planSize_;     ///< how many are on local proc
188    int rowIndex_;
189    int columnIndex_;
204      int size_;
205      vector<int> counts;
206      vector<int> displacements;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines