ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/SimSetup.cpp
(Generate patch)

Comparing trunk/OOPSE/libmdtools/SimSetup.cpp (file contents):
Revision 1212 by chrisfen, Tue Jun 1 17:15:43 2004 UTC vs.
Revision 1214 by gezelter, Tue Jun 1 18:42:58 2004 UTC

# Line 171 | Line 171 | void SimSetup::makeMolecules(void){
171    int i, j, k;
172    int exI, exJ, exK, exL, slI, slJ;
173    int tempI, tempJ, tempK, tempL;
174 <  int molI;
175 <  int stampID, atomOffset, rbOffset;
174 >  int molI, globalID;
175 >  int stampID, atomOffset, rbOffset, groupOffset;
176    molInit molInfo;
177    DirectionalAtom* dAtom;
178    RigidBody* myRB;
# Line 216 | Line 216 | void SimSetup::makeMolecules(void){
216    for (k = 0; k < nInfo; k++){
217      the_ff->setSimInfo(&(info[k]));
218  
219 + #ifdef IS_MPI
220 +    info[k].globalGroupMembership = new int[mpiSim->getNAtomsGlobal()];
221 +    for (i = 0; i < mpiSim->getNAtomsGlobal(); i++)
222 +      info[k].globalGroupMembership[i] = 0;
223 + #else
224 +    info[k].globalGroupMembership = new int[info[k].n_atoms];
225 +    for (i = 0; i < info[k].n_atoms; i++)
226 +      info[k].globalGroupMembership[i] = 0;
227 + #endif
228 +
229      atomOffset = 0;
230      groupOffset = 0;
231  
# Line 282 | Line 292 | void SimSetup::makeMolecules(void){
292  
293          molInfo.myAtoms[j]->setType(currentAtom->getType());
294   #ifdef IS_MPI
285
295          molInfo.myAtoms[j]->setGlobalIndex(globalAtomIndex[j + atomOffset]);
287
296   #endif // is_mpi
297        }
298  
# Line 506 | Line 514 | void SimSetup::makeMolecules(void){
514          nMembers = currentCutoffGroup->getNMembers();
515  
516          myCutoffGroup = new CutoffGroup();
517 +        
518 + #ifdef IS_MPI
519          myCutoffGroup->setGlobalIndex(globalGroupIndex[j + groupOffset]);
520 + #else
521 +        myCutoffGroup->setGlobalIndex(j + groupOffset);
522 + #endif
523          
524          for (int cg = 0; cg < nMembers; cg++) {
525  
# Line 517 | Line 530 | void SimSetup::makeMolecules(void){
530            tempI = molI + atomOffset;
531  
532   #ifdef IS_MPI
533 <          globalID = info[k].atoms[tempI]->getGlobalIndex()
533 >          globalID = info[k].atoms[tempI]->getGlobalIndex();
534 >          info[k].globalGroupMembership[globalID] = globalGroupIndex[j+groupOffset];
535   #else
536            globalID = info[k].atoms[tempI]->getIndex();
537 +          info[k].globalGroupMembership[globalID] = j + groupOffset;
538   #endif
539 +          
540  
541 <          globalGroupMembership[globalID] = globalGroupIndex[j+groupOffset];
526 <
541 >          
542            myCutoffGroup->addAtom(info[k].atoms[tempI]);          
543 <
543 >          
544            cutoffAtomSet.insert(tempI);
545          }
546 <      
546 >        
547          molInfo.myCutoffGroups.push_back(myCutoffGroup);
548          groupOffset++;
549  
550        }//end for (j = 0; j < molInfo.nCutoffGroups; j++)
551 <
551 >      
552        //creat a cutoff group for every atom  in current molecule which does not belong to cutoffgroup defined at mdl file
553 <
553 >      
554        for(j = 0; j < molInfo.nAtoms; j++){
555 <
555 >        
556          if(cutoffAtomSet.find(molInfo.myAtoms[j]->getIndex()) == cutoffAtomSet.end()){
557            myCutoffGroup = new CutoffGroup();
558            myCutoffGroup->addAtom(molInfo.myAtoms[j]);
559 <          myCutoffGroup->setGlobalIndex(globalGroupIndex[j + groupOffset]);
560 < #ifdef IS_MPI
561 <          globalID = info[k].atoms[atomOffset + j]->getGlobalIndex()
562 < #else
559 >
560 > #ifdef IS_MPI
561 >          myCutoffGroup->setGlobalIndex(globalGroupIndex[j + groupOffset]);
562 >          globalID = info[k].atoms[atomOffset + j]->getGlobalIndex();
563 >          info[k].globalGroupMembership[globalID] = globalGroupIndex[j+groupOffset];
564 > #else
565 >          myCutoffGroup->setGlobalIndex(j + groupOffset);
566            globalID = info[k].atoms[atomOffset + j]->getIndex();
567 +          info[k].globalGroupMembership[globalID] = j+groupOffset;
568   #endif
550          globalGroupMembership[globalID] = globalGroupIndex[j+groupOffset];
569            molInfo.myCutoffGroups.push_back(myCutoffGroup);
570            groupOffset++;
571          }
# Line 641 | Line 659 | void SimSetup::makeMolecules(void){
659                                   theTorsions);
660  
661        info[k].molecules[i].initialize(molInfo);
662 <
663 <
662 >      
663 >      
664        atomOffset += molInfo.nAtoms;
665        delete[] theBonds;
666        delete[] theBends;
667        delete[] theTorsions;
668 <    }    
668 >    }
669 >
670 >
671 >
672 > #ifdef IS_MPI    
673 >    // Since the globalGroupMembership has been zero filled and we've only
674 >    // poked values into the atoms we know, we can do an Allreduce
675 >    // to get the full globalGroupMembership array (We think).
676 >    // This would be prettier if we could use MPI_IN_PLACE like the MPI-2
677 >    // docs said we could.
678 >
679 >    int* ggMjunk = new int[mpiSim->getNAtomsGlobal()];    
680 >
681 >    MPI_Allreduce(info[k].globalGroupMembership,
682 >                  ggMjunk,
683 >                  mpiSim->getNAtomsGlobal(),
684 >                  MPI_INT, MPI_SUM, MPI_COMM_WORLD);
685 >
686 >    for (i = 0; i < mpiSim->getNAtomsGlobal(); i++)
687 >      info[k].globalGroupMembership[i] = ggMjunk[i];
688 >
689 >    delete[] ggMjunk;
690 >    
691 > #endif
692 >
693 >
694 >
695    }
696  
697   #ifdef IS_MPI
# Line 1609 | Line 1653 | void SimSetup::mpiMolDivide(void){
1653  
1654    mpiSim->divideLabor();
1655    globalAtomIndex = mpiSim->getGlobalAtomIndex();
1656 +  globalGroupIndex = mpiSim->getGlobalGroupIndex();
1657    //globalMolIndex = mpiSim->getGlobalMolIndex();
1658  
1659    // set up the local variables

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines