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

Comparing trunk/src/io/RestReader.cpp (file contents):
Revision 423 by chrisfen, Thu Mar 10 19:11:02 2005 UTC vs.
Revision 990 by chrisfen, Mon Jun 19 01:36:06 2006 UTC

# Line 68 | Line 68 | namespace oopse {
68   namespace oopse {
69    
70    RestReader::RestReader( SimInfo* info ) : info_(info){
71 <        
71 >    
72      idealName = "idealCrystal.in";
73      
74      isScanned = false;
# Line 92 | Line 92 | namespace oopse {
92              "File \"idealCrystal.in\" opened successfully for reading." );
93      MPIcheckPoint();
94   #endif
95 +
96      return;  
97    }
98    
# Line 121 | 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 225 | Line 226 | namespace oopse {
226  
227      nTotObjs = info_->getNGlobalIntegrableObjects();
228      haveError = 0;
229 <    
229 >
230      if (worldRank == masterNode) {
231        eof_test = fgets(read_buffer, sizeof(read_buffer), inIdealFile);
232        if( eof_test == NULL ){
# Line 258 | Line 259 | namespace oopse {
259          painCave.isFatal = 1;
260          simError();
261        }
262 <      
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);
267          
# Line 269 | 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 290 | Line 293 | namespace oopse {
293                painCave.isFatal = 1;
294                simError();
295              }
296 <            
297 <            parseIdealLine(read_buffer, integrableObjects[j]);
296 >        
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 318 | 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 362 | 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
371 <    double uX, uY, uZ;    // reference unit vector place holders
372 <    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      
381      nTokens = tokenizer.countTokens();
382 <    
382 >
383      if (nTokens < 14) {
384        sprintf(painCave.errMsg,
385                "RestReader Error: Not enough Tokens.\n");
# Line 383 | Line 388 | namespace oopse {
388      }
389      
390      std::string name = tokenizer.nextToken();
391 <    
391 >
392      if (name != sd->getType()) {
393        
394        sprintf(painCave.errMsg,
# Line 398 | Line 403 | namespace oopse {
403      pos[0] = tokenizer.nextTokenAsDouble();
404      pos[1] = tokenizer.nextTokenAsDouble();
405      pos[2] = tokenizer.nextTokenAsDouble();
406 <    
406 >
407      // store the positions in the stuntdouble as generic data doubles
408      DoubleGenericData* refPosX = new DoubleGenericData();
409      refPosX->setID("refPosX");
410      refPosX->setData(pos[0]);
411      sd->addProperty(refPosX);
412 <    
412 >
413      DoubleGenericData* refPosY = new DoubleGenericData();
414      refPosY->setID("refPosY");
415      refPosY->setData(pos[1]);
# Line 414 | Line 419 | namespace oopse {
419      refPosZ->setID("refPosZ");
420      refPosZ->setData(pos[2]);
421      sd->addProperty(refPosZ);
422 <    
422 >
423      // we don't need the velocities
424      uselessToken = tokenizer.nextTokenAsDouble();
425      uselessToken = tokenizer.nextTokenAsDouble();
# Line 490 | 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 595 | 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 621 | 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 636 | Line 642 | namespace oopse {
642        
643        // At this point, node 0 has a tempZangs vector completed, and
644        // everyone else has nada
639      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]);
659 <            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);              
672            index++;
680            }
674          
681          }
682        }
683      } else {
# Line 694 | 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 751 | 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 787 | 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 820 | 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