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

Comparing branches/development/src/brains/SimCreator.cpp (file contents):
Revision 1787 by gezelter, Wed Aug 29 18:13:11 2012 UTC vs.
Revision 1803 by gezelter, Wed Oct 3 14:20:07 2012 UTC

# Line 258 | Line 258 | namespace OpenMD {
258      int i;
259      streamoff mdOffset;
260      int mdFileVersion;
261 +
262  
263   #ifdef IS_MPI            
264      const int masterNode = 0;
265      if (worldRank == masterNode) {
266   #endif
267  
268 <      std::ifstream mdFile_(mdFileName.c_str());
268 >      std::ifstream mdFile_;
269 >      mdFile_.open(mdFileName.c_str(), ifstream::in | ifstream::binary);
270        
271        if (mdFile_.fail()) {
272          sprintf(painCave.errMsg,
# Line 505 | Line 507 | namespace OpenMD {
507      int nGlobalMols = info->getNGlobalMolecules();
508      std::vector<int> molToProcMap(nGlobalMols, -1); // default to an error condition:
509      
510 <    MPI_Comm_size(MPI_COMM_WORLD, &nProcessors);
510 >    nProcessors = MPI::COMM_WORLD.Get_size();
511      
512      if (nProcessors > nGlobalMols) {
513        sprintf(painCave.errMsg,
# Line 543 | Line 545 | namespace OpenMD {
545        nTarget = (int)(precast + 0.5);
546        
547        for(i = 0; i < nGlobalMols; i++) {
548 +
549          done = 0;
550          loops = 0;
551          
# Line 567 | Line 570 | namespace OpenMD {
570            // and be done with it.
571            
572            if (loops > 100) {
573 +
574              sprintf(painCave.errMsg,
575 <                    "I've tried 100 times to assign molecule %d to a "
576 <                    " processor, but can't find a good spot.\n"
577 <                    "I'm assigning it at random to processor %d.\n",
575 >                    "There have been 100 attempts to assign molecule %d to an\n"
576 >                    "\tunderworked processor, but there's no good place to\n"
577 >                    "\tleave it.  OpenMD is assigning it at random to processor %d.\n",
578                      i, which_proc);
579 <            
579 >          
580              painCave.isFatal = 0;
581 +            painCave.severity = OPENMD_INFO;
582              simError();
583              
584              molToProcMap[i] = which_proc;
# Line 618 | Line 623 | namespace OpenMD {
623        }
624        
625        delete myRandom;
626 <      
626 >
627        // Spray out this nonsense to all other processors:
628 <      
624 <      MPI_Bcast(&molToProcMap[0], nGlobalMols, MPI_INT, 0, MPI_COMM_WORLD);
628 >      MPI::COMM_WORLD.Bcast(&molToProcMap[0], nGlobalMols, MPI::INT, 0);
629      } else {
630        
631        // Listen to your marching orders from processor 0:
632 <      
633 <      MPI_Bcast(&molToProcMap[0], nGlobalMols, MPI_INT, 0, MPI_COMM_WORLD);
632 >      MPI::COMM_WORLD.Bcast(&molToProcMap[0], nGlobalMols, MPI::INT, 0);
633 >
634      }
635      
636      info->setMolToProcMap(molToProcMap);
# Line 673 | Line 677 | namespace OpenMD {
677      set<AtomType*>::iterator i;
678      bool hasDirectionalAtoms = false;
679      bool hasFixedCharge = false;
680 <    bool hasMultipoles = false;    
680 >    bool hasDipoles = false;    
681 >    bool hasQuadrupoles = false;    
682      bool hasPolarizable = false;    
683      bool hasFluctuatingCharge = false;    
684      bool hasMetallic = false;
# Line 695 | Line 700 | namespace OpenMD {
700        if (da.isDirectional()){
701          hasDirectionalAtoms = true;
702        }
703 <      if (ma.isMultipole()){
704 <        hasMultipoles = true;
703 >      if (ma.isDipole()){
704 >        hasDipoles = true;
705        }
706 +      if (ma.isQuadrupole()){
707 +        hasQuadrupoles = true;
708 +      }
709        if (ea.isEAM() || sca.isSuttonChen()){
710          hasMetallic = true;
711        }
# Line 721 | Line 729 | namespace OpenMD {
729          storageLayout |= DataStorage::dslTorque;
730        }
731      }
732 +    if (hasDipoles) {
733 +      storageLayout |= DataStorage::dslDipole;
734 +    }
735 +    if (hasQuadrupoles) {
736 +      storageLayout |= DataStorage::dslQuadrupole;
737 +    }
738      if (hasFixedCharge || hasFluctuatingCharge) {
739        storageLayout |= DataStorage::dslSkippedCharge;
740      }
# Line 782 | Line 796 | namespace OpenMD {
796      int beginRigidBodyIndex;
797      int beginCutoffGroupIndex;
798      int nGlobalAtoms = info->getNGlobalAtoms();
799 +    int nGlobalRigidBodies = info->getNGlobalRigidBodies();
800      
801      beginAtomIndex = 0;
802      //rigidbody's index begins right after atom's
# Line 848 | Line 863 | namespace OpenMD {
863      // This would be prettier if we could use MPI_IN_PLACE like the MPI-2
864      // docs said we could.
865      std::vector<int> tmpGroupMembership(info->getNGlobalAtoms(), 0);
866 <    MPI_Allreduce(&globalGroupMembership[0], &tmpGroupMembership[0], nGlobalAtoms,
867 <                  MPI_INT, MPI_SUM, MPI_COMM_WORLD);
866 >    MPI::COMM_WORLD.Allreduce(&globalGroupMembership[0],
867 >                              &tmpGroupMembership[0], nGlobalAtoms,
868 >                              MPI::INT, MPI::SUM);
869      info->setGlobalGroupMembership(tmpGroupMembership);
870   #else
871      info->setGlobalGroupMembership(globalGroupMembership);
872   #endif
873      
874      //fill molMembership
875 <    std::vector<int> globalMolMembership(info->getNGlobalAtoms(), 0);
875 >    std::vector<int> globalMolMembership(info->getNGlobalAtoms() +
876 >                                         info->getNGlobalRigidBodies(), 0);
877      
878 <    for(mol = info->beginMolecule(mi); mol != NULL; mol = info->nextMolecule(mi)) {
878 >    for(mol = info->beginMolecule(mi); mol != NULL;
879 >        mol = info->nextMolecule(mi)) {
880        for(atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) {
881          globalMolMembership[atom->getGlobalIndex()] = mol->getGlobalIndex();
882        }
883 +      for (rb = mol->beginRigidBody(ri); rb != NULL;
884 +           rb = mol->nextRigidBody(ri)) {
885 +        globalMolMembership[rb->getGlobalIndex()] = mol->getGlobalIndex();
886 +      }
887      }
888      
889   #ifdef IS_MPI
890 <    std::vector<int> tmpMolMembership(info->getNGlobalAtoms(), 0);
890 >    std::vector<int> tmpMolMembership(info->getNGlobalAtoms() +
891 >                                      info->getNGlobalRigidBodies(), 0);
892 >    MPI::COMM_WORLD.Allreduce(&globalMolMembership[0], &tmpMolMembership[0],
893 >                              nGlobalAtoms + nGlobalRigidBodies,
894 >                              MPI::INT, MPI::SUM);
895      
870    MPI_Allreduce(&globalMolMembership[0], &tmpMolMembership[0], nGlobalAtoms,
871                  MPI_INT, MPI_SUM, MPI_COMM_WORLD);
872    
896      info->setGlobalMolMembership(tmpMolMembership);
897   #else
898      info->setGlobalMolMembership(globalMolMembership);
# Line 879 | Line 902 | namespace OpenMD {
902      // here the molecules are listed by their global indices.
903  
904      std::vector<int> nIOPerMol(info->getNGlobalMolecules(), 0);
905 <    for (mol = info->beginMolecule(mi); mol != NULL; mol = info->nextMolecule(mi)) {
905 >    for (mol = info->beginMolecule(mi); mol != NULL;
906 >         mol = info->nextMolecule(mi)) {
907        nIOPerMol[mol->getGlobalIndex()] = mol->getNIntegrableObjects();      
908      }
909      
910   #ifdef IS_MPI
911      std::vector<int> numIntegrableObjectsPerMol(info->getNGlobalMolecules(), 0);
912 <    MPI_Allreduce(&nIOPerMol[0], &numIntegrableObjectsPerMol[0],
913 <                  info->getNGlobalMolecules(), MPI_INT, MPI_SUM, MPI_COMM_WORLD);
912 >    MPI::COMM_WORLD.Allreduce(&nIOPerMol[0], &numIntegrableObjectsPerMol[0],
913 >                              info->getNGlobalMolecules(), MPI::INT, MPI::SUM);
914   #else
915      std::vector<int> numIntegrableObjectsPerMol = nIOPerMol;
916   #endif    
# Line 900 | Line 924 | namespace OpenMD {
924      }
925      
926      std::vector<StuntDouble*> IOIndexToIntegrableObject(info->getNGlobalIntegrableObjects(), (StuntDouble*)NULL);
927 <    for (mol = info->beginMolecule(mi); mol != NULL; mol = info->nextMolecule(mi)) {
927 >    for (mol = info->beginMolecule(mi); mol != NULL;
928 >         mol = info->nextMolecule(mi)) {
929        int myGlobalIndex = mol->getGlobalIndex();
930        int globalIO = startingIOIndexForMol[myGlobalIndex];
931        for (StuntDouble* sd = mol->beginIntegrableObject(ioi); sd != NULL;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines