493 |
|
|
494 |
|
int i; |
495 |
|
unsigned int j; |
496 |
+ |
int isPresent; |
497 |
|
|
498 |
|
#ifdef IS_MPI |
499 |
|
int done, which_node, which_atom; // loop counter |
500 |
< |
|
501 |
< |
int *potatoes; |
501 |
< |
int myPotato; |
502 |
< |
|
503 |
< |
int nProc; |
500 |
> |
int nProc; |
501 |
> |
MPI_Status istatus; |
502 |
|
#endif //is_mpi |
503 |
|
|
504 |
|
const int BUFFERSIZE = 2000; // size of the read buffer |
515 |
|
#ifdef IS_MPI |
516 |
|
if (worldRank == 0) { |
517 |
|
#endif |
518 |
< |
|
519 |
< |
inAngFile = fopen(in_name, "r"); |
520 |
< |
if(!inAngFile){ |
521 |
< |
sprintf(painCave.errMsg, |
522 |
< |
"Restraints Warning: %s file is not present\n" |
523 |
< |
"\tAll omega values will be initialized to zero. If the\n" |
524 |
< |
"\tsimulation is starting from the idealCrystal.in reference\n" |
525 |
< |
"\tconfiguration, this is the desired action. If this is not\n" |
526 |
< |
"\tthe case, the energy calculations will be incorrect.\n", |
527 |
< |
in_name); |
528 |
< |
painCave.severity = OOPSE_WARNING; |
529 |
< |
painCave.isFatal = 0; |
530 |
< |
simError(); |
531 |
< |
return; |
532 |
< |
} |
518 |
> |
isPresent = 1; |
519 |
> |
inAngFile = fopen(in_name, "r"); |
520 |
> |
if(!inAngFile){ |
521 |
> |
sprintf(painCave.errMsg, |
522 |
> |
"Restraints Warning: %s file is not present\n" |
523 |
> |
"\tAll omega values will be initialized to zero. If the\n" |
524 |
> |
"\tsimulation is starting from the idealCrystal.in reference\n" |
525 |
> |
"\tconfiguration, this is the desired action. If this is not\n" |
526 |
> |
"\tthe case, the energy calculations will be incorrect.\n", |
527 |
> |
in_name); |
528 |
> |
painCave.severity = OOPSE_WARNING; |
529 |
> |
painCave.isFatal = 0; |
530 |
> |
simError(); |
531 |
> |
isPresent = 0; |
532 |
> |
} |
533 |
|
|
536 |
– |
inAngFileName = in_name; |
534 |
|
#ifdef IS_MPI |
535 |
+ |
// let the other nodes know the status of the file search |
536 |
+ |
MPI_Bcast(&isPresent, 1, MPI_INT, 0, MPI_COMM_WORLD); |
537 |
+ |
#endif // is_mpi |
538 |
+ |
|
539 |
+ |
if (!isPresent) |
540 |
+ |
return; |
541 |
+ |
|
542 |
+ |
inAngFileName = in_name; |
543 |
+ |
#ifdef IS_MPI |
544 |
|
} |
545 |
+ |
|
546 |
+ |
// listen to node 0 to see if we should exit this function |
547 |
+ |
if (worldRank != 0) { |
548 |
+ |
MPI_Bcast(&isPresent, 1, MPI_INT, 0, MPI_COMM_WORLD); |
549 |
+ |
if (!isPresent) |
550 |
+ |
return; |
551 |
+ |
} |
552 |
+ |
|
553 |
|
strcpy( checkPointMsg, "zAngle file opened successfully for reading." ); |
554 |
|
MPIcheckPoint(); |
555 |
|
#endif |
600 |
|
int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone |
601 |
|
int haveError, index; |
602 |
|
|
589 |
– |
MPI_Status istatus; |
603 |
|
int *MolToProcMap = mpiSim->getMolToProcMap(); |
604 |
|
int localIndex; |
605 |
|
int nCurObj; |
663 |
|
index++; |
664 |
|
} |
665 |
|
|
666 |
< |
// restraints is limited to a single zAngle per molecule |
667 |
< |
vecParticles = (simnfo->molecules[localIndex]).getIntegrableObjects(); |
668 |
< |
for(j=0; j < vecParticles.size(); j++) |
669 |
< |
vecParticles[j]->setZangle(tempZangs[i]); |
666 |
> |
// // restraints is limited to a single zAngle per molecule |
667 |
> |
// vecParticles = (simnfo->molecules[localIndex]).getIntegrableObjects(); |
668 |
> |
// for(j=0; j < vecParticles.size(); j++) |
669 |
> |
// vecParticles[j]->setZangle(tempZangs[i]); |
670 |
|
|
671 |
|
} else { |
672 |
|
// I am MASTER OF THE UNIVERSE, but I don't own this molecule |
713 |
|
|
714 |
|
int i; |
715 |
|
unsigned int j; |
716 |
+ |
int nTotObjs; // the number of atoms |
717 |
|
|
718 |
|
vector<StuntDouble*> vecParticles; |
719 |
|
|
732 |
|
painCave.isEventLoop = 1; |
733 |
|
|
734 |
|
int myStatus; // 1 = wakeup & success; 0 = error; -1 = AllDone |
735 |
< |
int haveError; |
735 |
> |
int haveError, index; |
736 |
> |
int which_node; |
737 |
|
|
738 |
|
MPI_Status istatus; |
739 |
|
int *MolToProcMap = mpiSim->getMolToProcMap(); |
740 |
|
int localIndex; |
741 |
< |
int which_node; |
741 |
> |
int nCurObj; |
742 |
> |
double angleTranfer; |
743 |
|
|
744 |
+ |
nTotObjs = simnfo->getTotIntegrableObjects(); |
745 |
|
haveError = 0; |
746 |
|
|
747 |
|
for (i=0 ; i < mpiSim->getNMolGlobal(); i++) { |
748 |
+ |
// Get the Node number which has this atom |
749 |
|
which_node = MolToProcMap[i]; |
750 |
|
|
751 |
< |
if(which_node == worldRank){ |
752 |
< |
//molecule with global index i belongs to this processor |
753 |
< |
|
754 |
< |
localIndex = mpiSim->getGlobalToLocalMol(i); |
755 |
< |
|
756 |
< |
if(localIndex == -1) { |
757 |
< |
sprintf(painCave.errMsg, "Molecule not found on node %d\n", worldRank); |
758 |
< |
haveError = 1; |
759 |
< |
simError(); |
751 |
> |
// let's let node 0 pass out constant values to all the processors |
752 |
> |
if (worldRank == 0) { |
753 |
> |
if (which_node == 0) { |
754 |
> |
localIndex = mpiSim->getGlobalToLocalMol(i); |
755 |
> |
|
756 |
> |
if(localIndex == -1) { |
757 |
> |
strcpy(painCave.errMsg, "Molecule not found on node 0!"); |
758 |
> |
haveError = 1; |
759 |
> |
simError(); |
760 |
> |
} |
761 |
> |
|
762 |
> |
vecParticles = (simnfo->molecules[localIndex]).getIntegrableObjects(); |
763 |
> |
for(j = 0; j < vecParticles.size(); j++){ |
764 |
> |
vecParticles[j]->setZangle( 0.0 ); |
765 |
> |
} |
766 |
> |
|
767 |
> |
} else { |
768 |
> |
// I am MASTER OF THE UNIVERSE, but I don't own this molecule |
769 |
> |
|
770 |
> |
MPI_Recv(&nCurObj, 1, MPI_INT, which_node, |
771 |
> |
TAKE_THIS_TAG_INT, MPI_COMM_WORLD, &istatus); |
772 |
> |
|
773 |
> |
for(j=0; j < nCurObj; j++){ |
774 |
> |
angleTransfer = 0.0; |
775 |
> |
MPI_Send(&angleTransfer, 1, MPI_DOUBLE, which_node, |
776 |
> |
TAKE_THIS_TAG_DOUBLE, MPI_COMM_WORLD); |
777 |
> |
index++; |
778 |
> |
} |
779 |
|
} |
780 |
+ |
} else { |
781 |
+ |
// I am SLAVE TO THE MASTER |
782 |
|
|
783 |
< |
vecParticles = (simnfo->molecules[localIndex]).getIntegrableObjects(); |
784 |
< |
|
785 |
< |
// set zAngle to 0.0 for all integrable objects |
786 |
< |
for(j = 0; j < vecParticles.size(); j++){ |
787 |
< |
vecParticles[j]->setZangle( 0.0 ); |
783 |
> |
if (which_node == worldRank) { |
784 |
> |
|
785 |
> |
// BUT I OWN THIS MOLECULE!!! |
786 |
> |
|
787 |
> |
localIndex = mpiSim->getGlobalToLocalMol(i); |
788 |
> |
vecParticles = (simnfo->molecules[localIndex]).getIntegrableObjects(); |
789 |
> |
nCurObj = vecParticles.size(); |
790 |
> |
|
791 |
> |
MPI_Send(&nCurObj, 1, MPI_INT, 0, |
792 |
> |
TAKE_THIS_TAG_INT, MPI_COMM_WORLD); |
793 |
> |
|
794 |
> |
for(j = 0; j < vecParticles.size(); j++){ |
795 |
> |
|
796 |
> |
MPI_Recv(&angleTransfer, 1, MPI_DOUBLE, 0, |
797 |
> |
TAKE_THIS_TAG_DOUBLE, MPI_COMM_WORLD, &istatus); |
798 |
> |
vecParticles[j]->setZangle(angleTransfer); |
799 |
> |
} |
800 |
|
} |
801 |
|
} |
802 |
|
} |