--- trunk/src/io/RestReader.cpp 2005/03/10 19:11:02 423 +++ trunk/src/io/RestReader.cpp 2006/06/19 01:36:06 990 @@ -68,7 +68,7 @@ namespace oopse { namespace oopse { RestReader::RestReader( SimInfo* info ) : info_(info){ - + idealName = "idealCrystal.in"; isScanned = false; @@ -92,6 +92,7 @@ namespace oopse { "File \"idealCrystal.in\" opened successfully for reading." ); MPIcheckPoint(); #endif + return; } @@ -121,10 +122,10 @@ namespace oopse { void RestReader :: readIdealCrystal(){ - + int i; unsigned int j; - + #ifdef IS_MPI int done, which_node, which_atom; // loop counter #endif //is_mpi @@ -225,7 +226,7 @@ namespace oopse { nTotObjs = info_->getNGlobalIntegrableObjects(); haveError = 0; - + if (worldRank == masterNode) { eof_test = fgets(read_buffer, sizeof(read_buffer), inIdealFile); if( eof_test == NULL ){ @@ -258,7 +259,9 @@ namespace oopse { painCave.isFatal = 1; simError(); } - + + MPI_Bcast(read_buffer, BUFFERSIZE, MPI_CHAR, masterNode, MPI_COMM_WORLD); + for (i=0 ; i < info_->getNGlobalMolecules(); i++) { int which_node = info_->getMolToProc(i); @@ -269,8 +272,8 @@ namespace oopse { if(mol == NULL) { sprintf(painCave.errMsg, - "RestReader Error: Molecule not found on node %d!\n", - worldRank); + "RestReader Error: Molecule not found on node %d!\n", + worldRank); painCave.isFatal = 1; simError(); } @@ -290,16 +293,18 @@ namespace oopse { painCave.isFatal = 1; simError(); } - - parseIdealLine(read_buffer, integrableObjects[j]); + + parseIdealLine(read_buffer, integrableObject); + } + } else { //molecule belongs to slave nodes MPI_Recv(&nCurObj, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus); - for(j=0; j < nCurObj; j++){ + for(j = 0; j < nCurObj; j++){ eof_test = fgets(read_buffer, sizeof(read_buffer), inIdealFile); if(eof_test == NULL){ @@ -318,10 +323,12 @@ namespace oopse { } } } else { - //actions taken at slave nodes + //actions taken at slave nodes + MPI_Bcast(read_buffer, BUFFERSIZE, MPI_CHAR, masterNode, MPI_COMM_WORLD); + for (i=0 ; i < info_->getNGlobalMolecules(); i++) { - int which_node = info_->getMolToProc(i); - + int which_node = info_->getMolToProc(i); + if(which_node == worldRank){ //molecule with global index i belongs to this processor @@ -362,19 +369,17 @@ namespace oopse { char* RestReader::parseIdealLine(char* readLine, StuntDouble* sd){ - char *foo; // the pointer to the current string token - - double pos[3]; // position place holders - double q[4]; // the quaternions - double RfromQ[3][3]; // the rotation matrix - double normalize; // to normalize the reference unit vector - double uX, uY, uZ; // reference unit vector place holders - double uselessToken; + RealType pos[3]; // position place holders + RealType q[4]; // the quaternions + RealType RfromQ[3][3]; // the rotation matrix + RealType normalize; // to normalize the reference unit vector + RealType uX, uY, uZ; // reference unit vector place holders + RealType uselessToken; StringTokenizer tokenizer(readLine); int nTokens; nTokens = tokenizer.countTokens(); - + if (nTokens < 14) { sprintf(painCave.errMsg, "RestReader Error: Not enough Tokens.\n"); @@ -383,7 +388,7 @@ namespace oopse { } std::string name = tokenizer.nextToken(); - + if (name != sd->getType()) { sprintf(painCave.errMsg, @@ -398,13 +403,13 @@ namespace oopse { pos[0] = tokenizer.nextTokenAsDouble(); pos[1] = tokenizer.nextTokenAsDouble(); pos[2] = tokenizer.nextTokenAsDouble(); - + // store the positions in the stuntdouble as generic data doubles DoubleGenericData* refPosX = new DoubleGenericData(); refPosX->setID("refPosX"); refPosX->setData(pos[0]); sd->addProperty(refPosX); - + DoubleGenericData* refPosY = new DoubleGenericData(); refPosY->setID("refPosY"); refPosY->setData(pos[1]); @@ -414,7 +419,7 @@ namespace oopse { refPosZ->setID("refPosZ"); refPosZ->setData(pos[2]); sd->addProperty(refPosZ); - + // we don't need the velocities uselessToken = tokenizer.nextTokenAsDouble(); uselessToken = tokenizer.nextTokenAsDouble(); @@ -490,7 +495,7 @@ namespace oopse { char *parseErr; std::vector vecParticles; - std::vector tempZangs; + std::vector tempZangs; inAngFileName = info_->getRestFileName(); @@ -595,10 +600,11 @@ namespace oopse { int masterNode = 0; int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone int haveError; - int index; + int intObjIndex; + int intObjIndexTransfer; int nCurObj; - double angleTranfer; + RealType angleTranfer; nTotObjs = info_->getNGlobalIntegrableObjects(); haveError = 0; @@ -621,7 +627,7 @@ namespace oopse { tempZangs.push_back( atof(read_buffer) ); eof_test = fgets(read_buffer, sizeof(read_buffer), inAngFile); } - + // Check to see that the number of integrable objects in the // intial configuration file is the same as derived from the // meta-data file. @@ -636,42 +642,42 @@ namespace oopse { // At this point, node 0 has a tempZangs vector completed, and // everyone else has nada - index = 0; for (i=0 ; i < info_->getNGlobalMolecules(); i++) { // Get the Node number which has this atom which_node = info_->getMolToProc(i); - if (worldRank == masterNode) { + if (which_node == masterNode) { mol = info_->getMoleculeByGlobalIndex(i); - + if(mol == NULL) { strcpy(painCave.errMsg, "Molecule not found on node 0!"); haveError = 1; simError(); } - + for (integrableObject = mol->beginIntegrableObject(ii); integrableObject != NULL; integrableObject = mol->nextIntegrableObject(ii)){ - - integrableObject->setZangle(tempZangs[index]); - index++; + intObjIndex = integrableObject->getGlobalIndex(); + integrableObject->setZangle(tempZangs[intObjIndex]); } } else { // I am MASTER OF THE UNIVERSE, but I don't own this molecule - + // listen for the number of integrableObjects in the molecule MPI_Recv(&nCurObj, 1, MPI_INT, which_node, TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus); - for(j=0; j < nCurObj; j++){ - angleTransfer = tempZangs[index]; - MPI_Send(&angleTransfer, 1, MPI_DOUBLE, which_node, + for(j=0; j < nCurObj; j++){ + // listen for which integrableObject we need to send the value for + MPI_Recv(&intObjIndexTransfer, 1, MPI_INT, which_node, + TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus); + angleTransfer = tempZangs[intObjIndexTransfer]; + // send the value to the node so it can initialize the object + MPI_Send(&angleTransfer, 1, MPI_REALTYPE, which_node, TAKE_THIS_TAG_DOUBLE, MPI_COMM_WORLD); - index++; } - } } } else { @@ -694,15 +700,19 @@ namespace oopse { } nCurObj = mol->getNIntegrableObjects(); - + // send the number of integrableObjects in the molecule MPI_Send(&nCurObj, 1, MPI_INT, 0, TAKE_THIS_TAG_INT, MPI_COMM_WORLD); for (integrableObject = mol->beginIntegrableObject(ii); integrableObject != NULL; integrableObject = mol->nextIntegrableObject(ii)){ - - MPI_Recv(&angleTransfer, 1, MPI_DOUBLE, 0, + intObjIndexTransfer = integrableObject->getGlobalIndex(); + // send the global index of the integrableObject + MPI_Send(&intObjIndexTransfer, 1, MPI_INT, 0, + TAKE_THIS_TAG_INT, MPI_COMM_WORLD); + // listen for the value we want to set locally + MPI_Recv(&angleTransfer, 1, MPI_REALTYPE, 0, TAKE_THIS_TAG_DOUBLE, MPI_COMM_WORLD, &istatus); integrableObject->setZangle(angleTransfer); @@ -751,7 +761,7 @@ namespace oopse { MPI_Status istatus; int nCurObj; - double angleTranfer; + RealType angleTranfer; nTotObjs = info_->getNGlobalIntegrableObjects(); haveError = 0; @@ -787,7 +797,7 @@ namespace oopse { for(j=0; j < nCurObj; j++){ angleTransfer = 0.0; - MPI_Send(&angleTransfer, 1, MPI_DOUBLE, which_node, + MPI_Send(&angleTransfer, 1, MPI_REALTYPE, which_node, TAKE_THIS_TAG_DOUBLE, MPI_COMM_WORLD); } @@ -820,7 +830,7 @@ namespace oopse { integrableObject != NULL; integrableObject = mol->nextIntegrableObject(ii)){ - MPI_Recv(&angleTransfer, 1, MPI_DOUBLE, 0, + MPI_Recv(&angleTransfer, 1, MPI_REALTYPE, 0, TAKE_THIS_TAG_DOUBLE, MPI_COMM_WORLD, &istatus); vecParticles[j]->setZangle(angleTransfer); }