ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/mdtools/mpi_implementation/mpiSimulation.cpp
(Generate patch)

Comparing trunk/mdtools/mpi_implementation/mpiSimulation.cpp (file contents):
Revision 122 by chuckv, Mon Sep 30 19:36:20 2002 UTC vs.
Revision 196 by chuckv, Thu Dec 5 21:37:51 2002 UTC

# Line 1 | Line 1
1 < #include <mpi++.h>
2 < #include <mpiSimulation.hpp>
1 > i#include <cstdlib>
2 > #include <cstring>
3 > #include <mpi.h>
4  
5 < mpiSimulation::mpiSimulation()
5 > #include "mpiSimulation.hpp"
6 > #include "simError.h"
7 >
8 >
9 >
10 > mpiSimulation::mpiSimulation(SimInfo* the_entryPlug)
11   {
12 <  int mpi_error;
12 >  entryPlug = the_entryPlug;
13 >  
14 >  numberProcessors = MPI::COMM_WORLD.Get_size();
15 >  myNode = worldRank;
16 >  
17 >  // let the simulation know were there.
18 >  entryPlug->mpiSim = this;
19 > }
20  
8  MPI::Init();
21  
22 <  numberProcessors = MPI::Comm::Get_size();
23 <  myNode = MPI::Comm::Get_rank();
24 <  MPI::Get_processor_name(processorName,&processorNameLen);
22 > mpiSimulation::~mpiSimulation(){
23 >  
24 >  // empty for now
25 >  
26   }
27  
15 mpiSimulation::mpiInitSimulation(SimInfo* entry_plug)
16 {
28  
29 <  // need to get nmol here......
29 > void mpiSimulation::divideLabor(int nComponents, MoleculeStamp** compStamps, int* componentsNmol ){
30 >  
31 >  double numerator;
32 >  double denominator;
33 >  double precast;
34  
35 +  int nTarget;
36 +  int molIndex, atomIndex, compIndex, compStart;
37 +  int done;
38 +  int nLocal, molLocal;
39 +  int i;
40 +  int smallDiff, bigDiff;
41  
42 +  int testSum;
43  
44 <  myMolStart = nint(float(node)/numberProcessors*entry_plug->n_mol);
45 <  myMolEnd   = nint(float(node + 1)/numberProcessors*entry_plug->n_mol;);
46 <  nMolLocal  = myMolEnd - myMolStart + 1
44 >  numerator = (double) entryPlug->n_atoms;
45 >  denominator = (double) numberProcessors;
46 >  precast = numerator / denominator;
47 >  nTarget = (int)( precast + 0.5 );
48 >  
49 >  molIndex = 0;
50 >  atomIndex = 0;
51 >  compIndex = 0;
52 >  compStart = 0;
53 >  for( i=0; i<(numberProcessors-1); i++){
54 >    
55 >    done = 0;
56 >    nLocal = 0;
57 >    molLocal = 0;
58 >
59 >    if( i == myNode ){
60 >      myMolStart = molIndex;
61 >      myAtomStart = atomIndex;
62 >    }
63 >    
64 >    while( !done ){
65 >      
66 >      if( (molIndex-compStart) >= componentsNmol[compIndex] ){
67 >        compStart = molIndex;
68 >        compIndex++;
69 >        continue;
70 >      }
71 >
72 >      nLocal += compStamps[compIndex]->getNAtoms();
73 >      atomIndex += compStamps[compIndex]->getNAtoms();
74 >      molIndex++;
75 >      molLocal++;
76 >      
77 >      if ( nLocal == nTarget ) done = 1;
78 >      
79 >      else if( nLocal < nTarget ){
80 >        smallDiff = nTarget - nLocal;
81 >      }
82 >      else if( nLocal > nTarget ){
83 >        bigDiff = nLocal - nTarget;
84 >        
85 >        if( bigDiff < smallDiff ) done = 1;
86 >        else{
87 >          molIndex--;
88 >          molLocal--;
89 >          atomIndex -= compStamps[compIndex]->getNAtoms();
90 >          nLocal -= compStamps[compIndex]->getNAtoms();
91 >          done = 1;
92 >        }
93 >      }
94 >    }
95 >    
96 >    if( i == myNode ){
97 >      myMolEnd = (molIndex - 1);
98 >      myAtomEnd = (atomIndex - 1);
99 >      myNlocal = nLocal;
100 >      myMol = molLocal;
101 >    }
102 >    
103 >    numerator = (double)( entryPlug->n_atoms - atomIndex );
104 >    denominator = (double)( numberProcessors - (i+1) );
105 >    precast = numerator / denominator;
106 >    nTarget = (int)( precast + 0.5 );
107 >  }
108 >  
109 >  if( myNode == numberProcessors-1 ){
110 >      myMolStart = molIndex;
111 >      myAtomStart = atomIndex;
112 >
113 >      nLocal = 0;
114 >      molLocal = 0;
115 >      while( compIndex < nComponents ){
116 >        
117 >        if( (molIndex-compStart) >= componentsNmol[compIndex] ){
118 >          compStart = molIndex;
119 >          compIndex++;
120 >          continue;
121 >        }
122 >
123 >        nLocal += compStamps[compIndex]->getNAtoms();
124 >        atomIndex += compStamps[compIndex]->getNAtoms();
125 >        molIndex++;
126 >        molLocal++;
127 >      }
128 >      
129 >      myMolEnd = (molIndex - 1);
130 >      myAtomEnd = (atomIndex - 1);
131 >      myNlocal = nLocal;  
132 >      myMol = molLocal;
133 >  }
134 >
135 >
136 >  MPI_Allreduce( &Nlocal, &testSum, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
137 >  
138 >  if( myNode == 0 ){
139 >    if( testSum != entryPlug->n_atoms ){
140 >      sprintf( painCave.errMsg,
141 >               "The summ of all nLocals, %d, did not equal the total number of atoms, %d.\n",
142 >               testSum, entryPlug->n_atoms );
143 >      painCave.isFatal = 1;
144 >      simError();
145 >    }
146 >  }
147 >
148 >  sprintf( checkPointMsg,
149 >           "Successfully divided the molecules among the processors.\n" );
150 >  MPIcheckPoint();
151 >
152 >  // lets create the identity array
153   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines