ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/parallel/ForceMatrixDecomposition.cpp
(Generate patch)

Comparing branches/development/src/parallel/ForceMatrixDecomposition.cpp (file contents):
Revision 1582 by gezelter, Tue Jun 14 20:41:44 2011 UTC vs.
Revision 1584 by gezelter, Fri Jun 17 20:16:35 2011 UTC

# Line 61 | Line 61 | namespace OpenMD {
61      nGroups_ = info_->getNLocalCutoffGroups();
62      cerr << "in dId, nGroups = " << nGroups_ << "\n";
63      // gather the information for atomtype IDs (atids):
64 <    identsLocal = info_->getIdentArray();
64 >    idents = info_->getIdentArray();
65      AtomLocalToGlobal = info_->getGlobalAtomIndices();
66      cgLocalToGlobal = info_->getGlobalGroupIndices();
67      vector<int> globalGroupMembership = info_->getGlobalGroupMembership();
68      massFactors = info_->getMassFactors();
69 +
70      PairList excludes = info_->getExcludedInteractions();
71      PairList oneTwo = info_->getOneTwoInteractions();
72      PairList oneThree = info_->getOneThreeInteractions();
# Line 108 | Line 109 | namespace OpenMD {
109      identsRow.resize(nAtomsInRow_);
110      identsCol.resize(nAtomsInCol_);
111      
112 <    AtomCommIntRow->gather(identsLocal, identsRow);
113 <    AtomCommIntColumn->gather(identsLocal, identsCol);
112 >    AtomCommIntRow->gather(idents, identsRow);
113 >    AtomCommIntColumn->gather(idents, identsCol);
114      
115      AtomCommIntRow->gather(AtomLocalToGlobal, AtomRowToGlobal);
116      AtomCommIntColumn->gather(AtomLocalToGlobal, AtomColToGlobal);
# Line 232 | Line 233 | namespace OpenMD {
233      set<AtomType*> atypes = info_->getSimulatedAtomTypes();
234      vector<RealType> atypeCutoff;
235      atypeCutoff.resize( atypes.size() );
236 <
236 >      
237      for (set<AtomType*>::iterator at = atypes.begin();
238           at != atypes.end(); ++at){
238      rc = interactionMan_->getSuggestedCutoffRadius(*at);
239        atid = (*at)->getIdent();
240 <      atypeCutoff[atid] = rc;
240 >
241 >      if (userChoseCutoff_)
242 >        atypeCutoff[atid] = userCutoff_;
243 >      else
244 >        atypeCutoff[atid] = interactionMan_->getSuggestedCutoffRadius(*at);
245      }
246  
247      vector<RealType> gTypeCutoffs;
# Line 309 | Line 313 | namespace OpenMD {
313        for (vector<int>::iterator ia = atomList.begin();
314             ia != atomList.end(); ++ia) {            
315          int atom1 = (*ia);
316 <        atid = identsLocal[atom1];
316 >        atid = idents[atom1];
317          if (atypeCutoff[atid] > groupCutoff[cg1]) {
318            groupCutoff[cg1] = atypeCutoff[atid];
319          }
# Line 378 | Line 382 | namespace OpenMD {
382            if (abs(gTypeCutoffMap[key].first - userCutoff_) > 0.0001) {
383              sprintf(painCave.errMsg,
384                      "ForceMatrixDecomposition::createGtypeCutoffMap "
385 <                    "user-specified rCut does not match computed group Cutoff\n");
385 >                    "user-specified rCut (%lf) does not match computed group Cutoff\n", userCutoff_);
386              painCave.severity = OPENMD_ERROR;
387              painCave.isFatal = 1;
388              simError();            
# Line 410 | Line 414 | namespace OpenMD {
414    }
415  
416    void ForceMatrixDecomposition::zeroWorkArrays() {
417 <
418 <    for (int j = 0; j < N_INTERACTION_FAMILIES; j++) {
415 <      longRangePot_[j] = 0.0;
416 <    }
417 >    pairwisePot = 0.0;
418 >    embeddingPot = 0.0;
419  
420   #ifdef IS_MPI
421      if (storageLayout_ & DataStorage::dslForce) {
# Line 430 | Line 432 | namespace OpenMD {
432           Vector<RealType, N_INTERACTION_FAMILIES> (0.0));
433  
434      fill(pot_col.begin(), pot_col.end(),
435 <         Vector<RealType, N_INTERACTION_FAMILIES> (0.0));
434 <    
435 <    pot_local = Vector<RealType, N_INTERACTION_FAMILIES>(0.0);
435 >         Vector<RealType, N_INTERACTION_FAMILIES> (0.0));  
436  
437      if (storageLayout_ & DataStorage::dslParticlePot) {    
438        fill(atomRowData.particlePot.begin(), atomRowData.particlePot.end(), 0.0);
# Line 606 | Line 606 | namespace OpenMD {
606      AtomCommPotRow->scatter(pot_row, pot_temp);
607  
608      for (int ii = 0;  ii < pot_temp.size(); ii++ )
609 <      pot_local += pot_temp[ii];
609 >      pairwisePot += pot_temp[ii];
610      
611      fill(pot_temp.begin(), pot_temp.end(),
612           Vector<RealType, N_INTERACTION_FAMILIES> (0.0));
# Line 614 | Line 614 | namespace OpenMD {
614      AtomCommPotColumn->scatter(pot_col, pot_temp);    
615      
616      for (int ii = 0;  ii < pot_temp.size(); ii++ )
617 <      pot_local += pot_temp[ii];
618 <    
617 >      pairwisePot += pot_temp[ii];    
618   #endif
619 +
620    }
621  
622    int ForceMatrixDecomposition::getNAtomsInRow() {  
# Line 691 | Line 691 | namespace OpenMD {
691   #ifdef IS_MPI
692      return massFactorsRow[atom1];
693   #else
694 +    cerr << "mfs = " << massFactors.size() << " atom1 = " << atom1 << "\n";
695      return massFactors[atom1];
696   #endif
697    }
# Line 754 | Line 755 | namespace OpenMD {
755      for (vector<int>::iterator i = skipsForAtom[atom1].begin();
756           i != skipsForAtom[atom1].end(); ++i) {
757        if ( (*i) == unique_id_2 ) return true;
758 <    }    
758 >    }
759  
760 +    return false;
761    }
762  
763  
# Line 820 | Line 822 | namespace OpenMD {
822  
823   #else
824  
825 <    idat.atypes = make_pair( ff_->getAtomType(identsLocal[atom1]),
826 <                             ff_->getAtomType(identsLocal[atom2]) );
825 >    idat.atypes = make_pair( ff_->getAtomType(idents[atom1]),
826 >                             ff_->getAtomType(idents[atom2]) );
827  
828      if (storageLayout_ & DataStorage::dslAmat) {
829        idat.A1 = &(snap_->atomData.aMat[atom1]);
# Line 838 | Line 840 | namespace OpenMD {
840        idat.t2 = &(snap_->atomData.torque[atom2]);
841      }
842  
843 <    if (storageLayout_ & DataStorage::dslDensity) {
843 >    if (storageLayout_ & DataStorage::dslDensity) {    
844        idat.rho1 = &(snap_->atomData.density[atom1]);
845        idat.rho2 = &(snap_->atomData.density[atom2]);
846      }
# Line 870 | Line 872 | namespace OpenMD {
872      atomRowData.force[atom1] += *(idat.f1);
873      atomColData.force[atom2] -= *(idat.f1);
874   #else
875 <    longRangePot_ += *(idat.pot);
876 <    
875 >    pairwisePot += *(idat.pot);
876 >
877      snap_->atomData.force[atom1] += *(idat.f1);
878      snap_->atomData.force[atom2] -= *(idat.f1);
879   #endif
# Line 889 | Line 891 | namespace OpenMD {
891        idat.eFrame1 = &(atomRowData.electroFrame[atom1]);
892        idat.eFrame2 = &(atomColData.electroFrame[atom2]);
893      }
894 +
895      if (storageLayout_ & DataStorage::dslTorque) {
896        idat.t1 = &(atomRowData.torque[atom1]);
897        idat.t2 = &(atomColData.torque[atom2]);
898      }
899 +
900 +    if (storageLayout_ & DataStorage::dslSkippedCharge) {
901 +      idat.skippedCharge1 = &(atomRowData.skippedCharge[atom1]);
902 +      idat.skippedCharge2 = &(atomColData.skippedCharge[atom2]);
903 +    }
904   #else
905 <    idat.atypes = make_pair( ff_->getAtomType(identsLocal[atom1]),
906 <                             ff_->getAtomType(identsLocal[atom2]) );
905 >    idat.atypes = make_pair( ff_->getAtomType(idents[atom1]),
906 >                             ff_->getAtomType(idents[atom2]) );
907  
908      if (storageLayout_ & DataStorage::dslElectroFrame) {
909        idat.eFrame1 = &(snap_->atomData.electroFrame[atom1]);
910        idat.eFrame2 = &(snap_->atomData.electroFrame[atom2]);
911      }
912 +
913      if (storageLayout_ & DataStorage::dslTorque) {
914        idat.t1 = &(snap_->atomData.torque[atom1]);
915        idat.t2 = &(snap_->atomData.torque[atom2]);
916      }
917 +
918 +    if (storageLayout_ & DataStorage::dslSkippedCharge) {
919 +      idat.skippedCharge1 = &(snap_->atomData.skippedCharge[atom1]);
920 +      idat.skippedCharge2 = &(snap_->atomData.skippedCharge[atom2]);
921 +    }
922   #endif    
923    }
924  
925 +
926 +  void ForceMatrixDecomposition::unpackSkipData(InteractionData &idat, int atom1, int atom2) {    
927 + #ifdef IS_MPI
928 +    pot_row[atom1] += 0.5 *  *(idat.pot);
929 +    pot_col[atom2] += 0.5 *  *(idat.pot);
930 + #else
931 +    pairwisePot += *(idat.pot);  
932 + #endif
933 +
934 +  }
935 +
936 +
937    /*
938     * buildNeighborList
939     *
# Line 1110 | Line 1136 | namespace OpenMD {
1136      saved_CG_positions_.clear();
1137      for (int i = 0; i < nGroups_; i++)
1138        saved_CG_positions_.push_back(snap_->cgData.position[i]);
1139 <    
1139 >  
1140      return neighborList;
1141    }
1142   } //end namespace OpenMD

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines