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 195 by chuckv, Thu Dec 5 18:53:40 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;
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 >
58 >    if( i == myNode ){
59 >      myMolStart = molIndex;
60 >      myAtomStart = atomIndex;
61 >    }
62 >    
63 >    while( !done ){
64 >      
65 >      if( (molIndex-compStart) >= componentsNmol[compIndex] ){
66 >        compStart = molIndex;
67 >        compIndex++;
68 >        continue;
69 >      }
70 >
71 >      nLocal += compStamps[compIndex]->getNAtoms();
72 >      atomIndex += compStamps[compIndex]->getNAtoms();
73 >      molIndex++;
74 >      
75 >      if ( nLocal == nTarget ) done = 1;
76 >      
77 >      else if( nLocal < nTarget ){
78 >        smallDiff = nTarget - nLocal;
79 >      }
80 >      else if( nLocal > nTarget ){
81 >        bigDiff = nLocal - nTarget;
82 >        
83 >        if( bigDiff < smallDiff ) done = 1;
84 >        else{
85 >          molIndex--;
86 >          atomIndex -= compStamps[compIndex]->getNAtoms();
87 >          nLocal -= compStamps[compIndex]->getNAtoms();
88 >          done = 1;
89 >        }
90 >      }
91 >    }
92 >    
93 >    if( i == myNode ){
94 >      myMolEnd = (molIndex - 1);
95 >      myAtomEnd = (atomIndex - 1);
96 >      myNlocal = nLocal;
97 >    }
98 >    
99 >    numerator = (double)( entryPlug->n_atoms - atomIndex );
100 >    denominator = (double)( numberProcessors - (i+1) );
101 >    precast = numerator / denominator;
102 >    nTarget = (int)( precast + 0.5 );
103 >  }
104 >  
105 >  if( myNode == numberProcessors-1 ){
106 >      myMolStart = molIndex;
107 >      myAtomStart = atomIndex;
108 >
109 >      nLocal = 0;
110 >      while( compIndex < nComponents ){
111 >        
112 >        if( (molIndex-compStart) >= componentsNmol[compIndex] ){
113 >          compStart = molIndex;
114 >          compIndex++;
115 >          continue;
116 >        }
117 >
118 >        nLocal += compStamps[compIndex]->getNAtoms();
119 >        atomIndex += compStamps[compIndex]->getNAtoms();
120 >        molIndex++;
121 >      }
122 >      
123 >      myMolEnd = (molIndex - 1);
124 >      myAtomEnd = (atomIndex - 1);
125 >      myNlocal = nLocal;  
126 >  }
127 >
128 >
129 >  MPI_Allreduce( &Nlocal, &testSum, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD );
130 >  
131 >  if( myNode == 0 ){
132 >    if( testSum != entryPlug->n_atoms ){
133 >      sprintf( painCave.errMsg,
134 >               "The summ of all nLocals, %d, did not equal the total number of atoms, %d.\n",
135 >               testSum, entryPlug->n_atoms );
136 >      painCave.isFatal = 1;
137 >      simError();
138 >    }
139 >  }
140 >
141 >  sprintf( checkPointMsg,
142 >           "Successfully divided the molecules among the processors.\n" );
143 >  MPIcheckPoint();
144   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines