ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/io/RestReader.cpp
(Generate patch)

Comparing trunk/src/io/RestReader.cpp (file contents):
Revision 431 by chrisfen, Fri Mar 11 00:43:19 2005 UTC vs.
Revision 990 by chrisfen, Mon Jun 19 01:36:06 2006 UTC

# Line 122 | Line 122 | namespace oopse {
122    
123    
124    void RestReader :: readIdealCrystal(){
125 <    
125 >        
126      int i;
127      unsigned int j;
128 <    
128 >
129   #ifdef IS_MPI
130      int done, which_node, which_atom; // loop counter
131   #endif //is_mpi
# Line 259 | Line 259 | namespace oopse {
259          painCave.isFatal = 1;
260          simError();
261        }
262 +
263 +      MPI_Bcast(read_buffer, BUFFERSIZE, MPI_CHAR, masterNode, MPI_COMM_WORLD);
264  
265        for (i=0 ; i < info_->getNGlobalMolecules(); i++) {
266          int which_node = info_->getMolToProc(i);
# Line 270 | Line 272 | namespace oopse {
272            
273            if(mol == NULL) {
274              sprintf(painCave.errMsg,
275 <                   "RestReader Error: Molecule not found on node %d!\n",
276 <                   worldRank);
275 >                    "RestReader Error: Molecule not found on node %d!\n",
276 >                    worldRank);
277              painCave.isFatal = 1;
278              simError();
279            }
# Line 295 | Line 297 | namespace oopse {
297              parseIdealLine(read_buffer, integrableObject);
298          
299            }
300 +
301          } else {
302            //molecule belongs to slave nodes
303            
304            MPI_Recv(&nCurObj, 1, MPI_INT, which_node,
305                     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
306            
307 <          for(j=0; j < nCurObj; j++){
307 >          for(j = 0; j < nCurObj; j++){
308              
309              eof_test = fgets(read_buffer, sizeof(read_buffer), inIdealFile);
310              if(eof_test == NULL){
# Line 320 | Line 323 | namespace oopse {
323          }
324        }
325      } else {
326 <      //actions taken at slave nodes
326 >      //actions taken at slave nodes
327 >      MPI_Bcast(read_buffer, BUFFERSIZE, MPI_CHAR, masterNode, MPI_COMM_WORLD);
328 >
329        for (i=0 ; i < info_->getNGlobalMolecules(); i++) {
330 <        int which_node = info_->getMolToProc(i);
331 <        
330 >        int which_node = info_->getMolToProc(i);
331 >
332          if(which_node == worldRank){
333            //molecule with global index i belongs to this processor
334            
# Line 364 | Line 369 | namespace oopse {
369    
370    char* RestReader::parseIdealLine(char* readLine, StuntDouble* sd){
371      
372 <    char *foo; // the pointer to the current string token
373 <    
374 <    double pos[3];        // position place holders
375 <    double q[4];          // the quaternions
376 <    double RfromQ[3][3];  // the rotation matrix
377 <    double normalize;     // to normalize the reference unit vector
373 <    double uX, uY, uZ;    // reference unit vector place holders
374 <    double uselessToken;
372 >    RealType pos[3];        // position place holders
373 >    RealType q[4];          // the quaternions
374 >    RealType RfromQ[3][3];  // the rotation matrix
375 >    RealType normalize;     // to normalize the reference unit vector
376 >    RealType uX, uY, uZ;    // reference unit vector place holders
377 >    RealType uselessToken;
378      StringTokenizer tokenizer(readLine);
379      int nTokens;
380      
# Line 492 | Line 495 | namespace oopse {
495      char *parseErr;
496      
497      std::vector<StuntDouble*> vecParticles;
498 <    std::vector<double> tempZangs;
498 >    std::vector<RealType> tempZangs;
499        
500      inAngFileName = info_->getRestFileName();
501      
# Line 597 | Line 600 | namespace oopse {
600      int masterNode = 0;
601      int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone
602      int haveError;
603 <    int index;    
603 >    int intObjIndex;    
604 >    int intObjIndexTransfer;    
605  
606      int nCurObj;
607 <    double angleTranfer;
607 >    RealType angleTranfer;
608      
609      nTotObjs = info_->getNGlobalIntegrableObjects();
610      haveError = 0;
# Line 623 | Line 627 | namespace oopse {
627            tempZangs.push_back( atof(read_buffer) );
628          eof_test = fgets(read_buffer, sizeof(read_buffer), inAngFile);
629        }
630 <      
630 >
631        // Check to see that the number of integrable objects in the
632        // intial configuration file is the same as derived from the
633        // meta-data file.
# Line 638 | Line 642 | namespace oopse {
642        
643        // At this point, node 0 has a tempZangs vector completed, and
644        // everyone else has nada
641      index = 0;
645        
646        for (i=0 ; i < info_->getNGlobalMolecules(); i++) {
647          // Get the Node number which has this atom
648          which_node = info_->getMolToProc(i);
649          
650 <        if (worldRank == masterNode) {
650 >        if (which_node == masterNode) {
651            mol = info_->getMoleculeByGlobalIndex(i);
652 <          
652 >
653            if(mol == NULL) {
654              strcpy(painCave.errMsg, "Molecule not found on node 0!");
655              haveError = 1;
656              simError();
657            }
658 <          
658 >
659            for (integrableObject = mol->beginIntegrableObject(ii);
660                 integrableObject != NULL;
661                 integrableObject = mol->nextIntegrableObject(ii)){
662 <            
663 <            integrableObject->setZangle(tempZangs[index]);
661 <            index++;
662 >            intObjIndex = integrableObject->getGlobalIndex();
663 >            integrableObject->setZangle(tempZangs[intObjIndex]);
664            }    
665            
666          } else {
667            // I am MASTER OF THE UNIVERSE, but I don't own this molecule
668 <          
668 >          // listen for the number of integrableObjects in the molecule
669            MPI_Recv(&nCurObj, 1, MPI_INT, which_node,
670                     TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
671            
672 <          for(j=0; j < nCurObj; j++){            
673 <            angleTransfer = tempZangs[index];
674 <            MPI_Send(&angleTransfer, 1, MPI_DOUBLE, which_node,
672 >          for(j=0; j < nCurObj; j++){          
673 >            // listen for which integrableObject we need to send the value for
674 >            MPI_Recv(&intObjIndexTransfer, 1, MPI_INT, which_node,
675 >                   TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus);
676 >            angleTransfer = tempZangs[intObjIndexTransfer];
677 >            // send the value to the node so it can initialize the object
678 >            MPI_Send(&angleTransfer, 1, MPI_REALTYPE, which_node,
679                       TAKE_THIS_TAG_DOUBLE, MPI_COMM_WORLD);              
674            index++;
680            }
676          
681          }
682        }
683      } else {
# Line 696 | Line 700 | namespace oopse {
700            }
701  
702            nCurObj = mol->getNIntegrableObjects();
703 <        
703 >          // send the number of integrableObjects in the molecule
704            MPI_Send(&nCurObj, 1, MPI_INT, 0,
705                     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
706            
707            for (integrableObject = mol->beginIntegrableObject(ii);
708                 integrableObject != NULL;
709                 integrableObject = mol->nextIntegrableObject(ii)){
710 <            
711 <            MPI_Recv(&angleTransfer, 1, MPI_DOUBLE, 0,
710 >            intObjIndexTransfer = integrableObject->getGlobalIndex();
711 >            // send the global index of the integrableObject
712 >            MPI_Send(&intObjIndexTransfer, 1, MPI_INT, 0,
713 >                     TAKE_THIS_TAG_INT, MPI_COMM_WORLD);
714 >            // listen for the value we want to set locally
715 >            MPI_Recv(&angleTransfer, 1, MPI_REALTYPE, 0,
716                       TAKE_THIS_TAG_DOUBLE, MPI_COMM_WORLD, &istatus);
717  
718              integrableObject->setZangle(angleTransfer);
# Line 753 | Line 761 | namespace oopse {
761      MPI_Status istatus;
762      
763      int nCurObj;
764 <    double angleTranfer;
764 >    RealType angleTranfer;
765      
766      nTotObjs = info_->getNGlobalIntegrableObjects();
767      haveError = 0;
# Line 789 | Line 797 | namespace oopse {
797            
798            for(j=0; j < nCurObj; j++){            
799              angleTransfer = 0.0;
800 <            MPI_Send(&angleTransfer, 1, MPI_DOUBLE, which_node,
800 >            MPI_Send(&angleTransfer, 1, MPI_REALTYPE, which_node,
801                       TAKE_THIS_TAG_DOUBLE, MPI_COMM_WORLD);              
802              
803            }
# Line 822 | Line 830 | namespace oopse {
830                 integrableObject != NULL;
831                 integrableObject = mol->nextIntegrableObject(ii)){
832              
833 <            MPI_Recv(&angleTransfer, 1, MPI_DOUBLE, 0,
833 >            MPI_Recv(&angleTransfer, 1, MPI_REALTYPE, 0,
834                       TAKE_THIS_TAG_DOUBLE, MPI_COMM_WORLD, &istatus);
835              vecParticles[j]->setZangle(angleTransfer);
836            }    

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines