| 694 | 
  | 
    Atom* atom; | 
| 695 | 
  | 
    set<AtomType*> atomTypes; | 
| 696 | 
  | 
     | 
| 697 | 
< | 
    for(mol = beginMolecule(mi); mol != NULL; mol = nextMolecule(mi)) {       | 
| 698 | 
< | 
      for(atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) { | 
| 697 | 
> | 
    for(mol = beginMolecule(mi); mol != NULL; mol = nextMolecule(mi)) { | 
| 698 | 
> | 
      for(atom = mol->beginAtom(ai); atom != NULL; | 
| 699 | 
> | 
          atom = mol->nextAtom(ai)) { | 
| 700 | 
  | 
        atomTypes.insert(atom->getAtomType()); | 
| 701 | 
  | 
      }       | 
| 702 | 
  | 
    }     | 
| 703 | 
< | 
 | 
| 703 | 
> | 
     | 
| 704 | 
  | 
#ifdef IS_MPI | 
| 705 | 
  | 
 | 
| 706 | 
  | 
    // loop over the found atom types on this processor, and add their | 
| 707 | 
  | 
    // numerical idents to a vector: | 
| 708 | 
< | 
 | 
| 708 | 
> | 
     | 
| 709 | 
  | 
    vector<int> foundTypes; | 
| 710 | 
  | 
    set<AtomType*>::iterator i; | 
| 711 | 
  | 
    for (i = atomTypes.begin(); i != atomTypes.end(); ++i)  | 
| 714 | 
  | 
    // count_local holds the number of found types on this processor | 
| 715 | 
  | 
    int count_local = foundTypes.size(); | 
| 716 | 
  | 
 | 
| 717 | 
< | 
    // count holds the total number of found types on all processors | 
| 717 | 
< | 
    // (some will be redundant with the ones found locally): | 
| 718 | 
< | 
    int count; | 
| 719 | 
< | 
    MPI::COMM_WORLD.Allreduce(&count_local, &count, 1, MPI::INT, MPI::SUM); | 
| 717 | 
> | 
    int nproc = MPI::COMM_WORLD.Get_size(); | 
| 718 | 
  | 
 | 
| 719 | 
< | 
    // create a vector to hold the globally found types, and resize it: | 
| 720 | 
< | 
    vector<int> ftGlobal; | 
| 721 | 
< | 
    ftGlobal.resize(count); | 
| 722 | 
< | 
    vector<int> counts; | 
| 719 | 
> | 
    // we need arrays to hold the counts and displacement vectors for | 
| 720 | 
> | 
    // all processors | 
| 721 | 
> | 
    vector<int> counts(nproc, 0); | 
| 722 | 
> | 
    vector<int> disps(nproc, 0); | 
| 723 | 
  | 
 | 
| 724 | 
< | 
    int nproc = MPI::COMM_WORLD.Get_size(); | 
| 725 | 
< | 
    counts.resize(nproc); | 
| 726 | 
< | 
    vector<int> disps; | 
| 727 | 
< | 
    disps.resize(nproc); | 
| 724 | 
> | 
    // fill the counts array | 
| 725 | 
> | 
    MPI::COMM_WORLD.Allgather(&count_local, 1, MPI::INT, &counts[0], | 
| 726 | 
> | 
                              1, MPI::INT); | 
| 727 | 
> | 
   | 
| 728 | 
> | 
    // use the processor counts to compute the displacement array | 
| 729 | 
> | 
    disps[0] = 0;     | 
| 730 | 
> | 
    int totalCount = counts[0]; | 
| 731 | 
> | 
    for (int iproc = 1; iproc < nproc; iproc++) { | 
| 732 | 
> | 
      disps[iproc] = disps[iproc-1] + counts[iproc-1]; | 
| 733 | 
> | 
      totalCount += counts[iproc]; | 
| 734 | 
> | 
    } | 
| 735 | 
  | 
 | 
| 736 | 
< | 
    // now spray out the foundTypes to all the other processors: | 
| 736 | 
> | 
    // we need a (possibly redundant) set of all found types: | 
| 737 | 
> | 
    vector<int> ftGlobal(totalCount); | 
| 738 | 
  | 
     | 
| 739 | 
+ | 
    // now spray out the foundTypes to all the other processors:     | 
| 740 | 
  | 
    MPI::COMM_WORLD.Allgatherv(&foundTypes[0], count_local, MPI::INT,  | 
| 741 | 
< | 
                               &ftGlobal[0], &counts[0], &disps[0], MPI::INT); | 
| 741 | 
> | 
                               &ftGlobal[0], &counts[0], &disps[0],  | 
| 742 | 
> | 
                               MPI::INT); | 
| 743 | 
  | 
 | 
| 744 | 
+ | 
    vector<int>::iterator j; | 
| 745 | 
+ | 
 | 
| 746 | 
  | 
    // foundIdents is a stl set, so inserting an already found ident | 
| 747 | 
  | 
    // will have no effect. | 
| 748 | 
  | 
    set<int> foundIdents; | 
| 749 | 
< | 
    vector<int>::iterator j; | 
| 749 | 
> | 
 | 
| 750 | 
  | 
    for (j = ftGlobal.begin(); j != ftGlobal.end(); ++j) | 
| 751 | 
  | 
      foundIdents.insert((*j)); | 
| 752 | 
  | 
     | 
| 753 | 
  | 
    // now iterate over the foundIdents and get the actual atom types  | 
| 754 | 
  | 
    // that correspond to these: | 
| 755 | 
  | 
    set<int>::iterator it; | 
| 756 | 
< | 
    for (it = foundIdents.begin(); it != foundIdents.end(); ++it) | 
| 756 | 
> | 
    for (it = foundIdents.begin(); it != foundIdents.end(); ++it)  | 
| 757 | 
  | 
      atomTypes.insert( forceField_->getAtomType((*it)) ); | 
| 758 | 
  | 
  | 
| 759 | 
  | 
#endif | 
| 760 | 
< | 
     | 
| 760 | 
> | 
 | 
| 761 | 
  | 
    return atomTypes;         | 
| 762 | 
  | 
  } | 
| 763 | 
  | 
 | 
| 769 | 
  | 
      if ( simParams_->getAccumulateBoxDipole() ) { | 
| 770 | 
  | 
        calcBoxDipole_ = true;        | 
| 771 | 
  | 
      } | 
| 772 | 
< | 
 | 
| 772 | 
> | 
     | 
| 773 | 
  | 
    set<AtomType*>::iterator i; | 
| 774 | 
  | 
    set<AtomType*> atomTypes; | 
| 775 | 
  | 
    atomTypes = getSimulatedAtomTypes();     | 
| 782 | 
  | 
      usesMetallic |= (*i)->isMetal(); | 
| 783 | 
  | 
      usesDirectional |= (*i)->isDirectional(); | 
| 784 | 
  | 
    } | 
| 785 | 
< | 
 | 
| 785 | 
> | 
     | 
| 786 | 
  | 
#ifdef IS_MPI     | 
| 787 | 
  | 
    int temp; | 
| 788 | 
  | 
    temp = usesDirectional; | 
| 789 | 
  | 
    MPI_Allreduce(&temp, &usesDirectionalAtoms_, 1, MPI_INT, MPI_LOR, MPI_COMM_WORLD);     | 
| 790 | 
< | 
 | 
| 790 | 
> | 
     | 
| 791 | 
  | 
    temp = usesMetallic; | 
| 792 | 
  | 
    MPI_Allreduce(&temp, &usesMetallicAtoms_, 1, MPI_INT, MPI_LOR, MPI_COMM_WORLD);     | 
| 793 | 
< | 
 | 
| 793 | 
> | 
     | 
| 794 | 
  | 
    temp = usesElectrostatic; | 
| 795 | 
  | 
    MPI_Allreduce(&temp, &usesElectrostaticAtoms_, 1, MPI_INT, MPI_LOR, MPI_COMM_WORLD);  | 
| 796 | 
+ | 
#else | 
| 797 | 
+ | 
 | 
| 798 | 
+ | 
    usesDirectionalAtoms_ = usesDirectional; | 
| 799 | 
+ | 
    usesMetallicAtoms_ = usesMetallic; | 
| 800 | 
+ | 
    usesElectrostaticAtoms_ = usesElectrostatic; | 
| 801 | 
+ | 
 | 
| 802 | 
  | 
#endif | 
| 803 | 
+ | 
     | 
| 804 | 
+ | 
    requiresPrepair_ = usesMetallicAtoms_ ? true : false;  | 
| 805 | 
+ | 
    requiresSkipCorrection_ = usesElectrostaticAtoms_ ? true : false; | 
| 806 | 
+ | 
    requiresSelfCorrection_ = usesElectrostaticAtoms_ ? true : false;     | 
| 807 | 
  | 
  } | 
| 808 | 
  | 
 | 
| 809 | 
  | 
 | 
| 819 | 
  | 
       | 
| 820 | 
  | 
      for (atom = mol->beginAtom(ai); atom != NULL; atom = mol->nextAtom(ai)) { | 
| 821 | 
  | 
        GlobalAtomIndices[atom->getLocalIndex()] = atom->getGlobalIndex(); | 
| 822 | 
+ | 
        cerr << "LI = " << atom->getLocalIndex() << "GAI = " << GlobalAtomIndices[atom->getLocalIndex()] << "\n"; | 
| 823 | 
  | 
      } | 
| 824 | 
  | 
    } | 
| 825 | 
  | 
    return GlobalAtomIndices; | 
| 841 | 
  | 
      for (cg = mol->beginCutoffGroup(ci); cg != NULL;  | 
| 842 | 
  | 
           cg = mol->nextCutoffGroup(ci)) { | 
| 843 | 
  | 
        GlobalGroupIndices.push_back(cg->getGlobalIndex()); | 
| 844 | 
+ | 
        cerr << "LI, GGI = " << GlobalGroupIndices.size() << " " << cg->getGlobalIndex() << "\n"; | 
| 845 | 
  | 
      }         | 
| 846 | 
  | 
    } | 
| 847 | 
  | 
    return GlobalGroupIndices; |