# | 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 | } |
– | Removed lines |
+ | Added lines |
< | Changed lines |
> | Changed lines |