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

Comparing branches/development/src/parallel/ForceMatrixDecomposition.cpp (file contents):
Revision 1825 by gezelter, Wed Jan 9 19:27:52 2013 UTC vs.
Revision 1856 by gezelter, Tue Apr 2 21:30:34 2013 UTC

# Line 35 | Line 35
35   *                                                                      
36   * [1]  Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).            
37   * [2]  Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).          
38 < * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).          
38 > * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).          
39   * [4]  Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
40   * [5]  Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41   */
# Line 679 | Line 679 | namespace OpenMD {
679          snap_->atomData.density[i] += rho_tmp[i];
680      }
681  
682 +    // this isn't necessary if we don't have polarizable atoms, but
683 +    // we'll leave it here for now.
684      if (storageLayout_ & DataStorage::dslElectricField) {
685        
686        AtomPlanVectorRow->scatter(atomRowData.electricField,
# Line 786 | Line 788 | namespace OpenMD {
788          snap_->atomData.flucQFrc[i] += fqfrc_tmp[i];
789              
790      }
791 +
792 +    if (storageLayout_ & DataStorage::dslElectricField) {
793 +
794 +      int nef = snap_->atomData.electricField.size();
795 +      vector<Vector3d> efield_tmp(nef, V3Zero);
796  
797 +      AtomPlanVectorRow->scatter(atomRowData.electricField, efield_tmp);
798 +      for (int i = 0; i < nef; i++) {
799 +        snap_->atomData.electricField[i] += efield_tmp[i];
800 +        efield_tmp[i] = 0.0;
801 +      }
802 +      
803 +      AtomPlanVectorColumn->scatter(atomColData.electricField, efield_tmp);
804 +      for (int i = 0; i < nef; i++)
805 +        snap_->atomData.electricField[i] += efield_tmp[i];
806 +    }
807 +
808 +
809      nLocal_ = snap_->getNumberOfAtoms();
810  
811      vector<potVec> pot_temp(nLocal_,
# Line 956 | Line 975 | namespace OpenMD {
975      d = snap_->cgData.position[cg2] - snap_->cgData.position[cg1];
976   #endif
977      
978 <    snap_->wrapVector(d);
978 >    if (usePeriodicBoundaryConditions_) {
979 >      snap_->wrapVector(d);
980 >    }
981      return d;    
982    }
983  
# Line 986 | Line 1007 | namespace OpenMD {
1007   #else
1008      d = snap_->cgData.position[cg1] - snap_->atomData.position[atom1];
1009   #endif
1010 <
1011 <    snap_->wrapVector(d);
1010 >    if (usePeriodicBoundaryConditions_) {
1011 >      snap_->wrapVector(d);
1012 >    }
1013      return d;    
1014    }
1015    
# Line 999 | Line 1021 | namespace OpenMD {
1021   #else
1022      d = snap_->cgData.position[cg2] - snap_->atomData.position[atom2];
1023   #endif
1024 <    
1025 <    snap_->wrapVector(d);
1024 >    if (usePeriodicBoundaryConditions_) {
1025 >      snap_->wrapVector(d);
1026 >    }
1027      return d;    
1028    }
1029  
# Line 1029 | Line 1052 | namespace OpenMD {
1052   #else
1053      d = snap_->atomData.position[atom2] - snap_->atomData.position[atom1];
1054   #endif
1055 <
1056 <    snap_->wrapVector(d);
1055 >    if (usePeriodicBoundaryConditions_) {
1056 >      snap_->wrapVector(d);
1057 >    }
1058      return d;    
1059    }
1060  
# Line 1186 | Line 1210 | namespace OpenMD {
1210        idat.A1 = &(snap_->atomData.aMat[atom1]);
1211        idat.A2 = &(snap_->atomData.aMat[atom2]);
1212      }
1189
1190    RealType ct = dot(idat.A1->getColumn(2), idat.A2->getColumn(2));
1213  
1214      if (storageLayout_ & DataStorage::dslTorque) {
1215        idat.t1 = &(snap_->atomData.torque[atom1]);
# Line 1299 | Line 1321 | namespace OpenMD {
1321      vector<pair<int, int> > neighborList;
1322      groupCutoffs cuts;
1323      bool doAllPairs = false;
1324 +
1325 +    RealType rList_ = (largestRcut_ + skinThickness_);
1326 +    Snapshot* snap_ = sman_->getCurrentSnapshot();
1327 +    Mat3x3d invHmat = snap_->getInvHmat();
1328 +    Vector3d rs, scaled, dr;
1329 +    Vector3i whichCell;
1330 +    int cellIndex;
1331  
1332   #ifdef IS_MPI
1333      cellListRow_.clear();
# Line 1307 | Line 1336 | namespace OpenMD {
1336      cellList_.clear();
1337   #endif
1338  
1339 <    RealType rList_ = (largestRcut_ + skinThickness_);
1340 <    Snapshot* snap_ = sman_->getCurrentSnapshot();
1341 <    Mat3x3d Hmat = snap_->getHmat();
1313 <    Vector3d Hx = Hmat.getColumn(0);
1314 <    Vector3d Hy = Hmat.getColumn(1);
1315 <    Vector3d Hz = Hmat.getColumn(2);
1339 >    if (!usePeriodicBoundaryConditions_) {
1340 >      doAllPairs = true;
1341 >    } else {
1342  
1343 <    nCells_.x() = (int) ( Hx.length() )/ rList_;
1344 <    nCells_.y() = (int) ( Hy.length() )/ rList_;
1345 <    nCells_.z() = (int) ( Hz.length() )/ rList_;
1343 >      Mat3x3d Hmat = snap_->getHmat();
1344 >      Vector3d Hx = Hmat.getColumn(0);
1345 >      Vector3d Hy = Hmat.getColumn(1);
1346 >      Vector3d Hz = Hmat.getColumn(2);
1347  
1348 <    // handle small boxes where the cell offsets can end up repeating cells
1349 <    
1350 <    if (nCells_.x() < 3) doAllPairs = true;
1351 <    if (nCells_.y() < 3) doAllPairs = true;
1352 <    if (nCells_.z() < 3) doAllPairs = true;
1353 <
1354 <    Mat3x3d invHmat = snap_->getInvHmat();
1355 <    Vector3d rs, scaled, dr;
1356 <    Vector3i whichCell;
1357 <    int cellIndex;
1358 <    int nCtot = nCells_.x() * nCells_.y() * nCells_.z();
1359 <
1348 >      nCells_.x() = (int) ( Hx.length() )/ rList_;
1349 >      nCells_.y() = (int) ( Hy.length() )/ rList_;
1350 >      nCells_.z() = (int) ( Hz.length() )/ rList_;
1351 >      
1352 >      // handle small boxes where the cell offsets can end up repeating cells
1353 >      
1354 >      if (nCells_.x() < 3) doAllPairs = true;
1355 >      if (nCells_.y() < 3) doAllPairs = true;
1356 >      if (nCells_.z() < 3) doAllPairs = true;
1357 >      
1358 >      int nCtot = nCells_.x() * nCells_.y() * nCells_.z();
1359 >      
1360   #ifdef IS_MPI
1361 <    cellListRow_.resize(nCtot);
1362 <    cellListCol_.resize(nCtot);
1361 >      cellListRow_.resize(nCtot);
1362 >      cellListCol_.resize(nCtot);
1363   #else
1364 <    cellList_.resize(nCtot);
1364 >      cellList_.resize(nCtot);
1365   #endif
1366 +    }
1367  
1368      if (!doAllPairs) {
1369   #ifdef IS_MPI
# Line 1471 | Line 1499 | namespace OpenMD {
1499                    // & column indicies and will divide labor in the
1500                    // force evaluation later.
1501                    dr = cgColData.position[(*j2)] - cgRowData.position[(*j1)];
1502 <                  snap_->wrapVector(dr);
1502 >                  if (usePeriodicBoundaryConditions_) {
1503 >                    snap_->wrapVector(dr);
1504 >                  }
1505                    cuts = getGroupCutoffs( (*j1), (*j2) );
1506                    if (dr.lengthSquare() < cuts.third) {
1507                      neighborList.push_back(make_pair((*j1), (*j2)));
# Line 1498 | Line 1528 | namespace OpenMD {
1528                    if (m2 != m1 || (*j2) >= (*j1) ) {
1529  
1530                      dr = snap_->cgData.position[(*j2)] - snap_->cgData.position[(*j1)];
1531 <                    snap_->wrapVector(dr);
1531 >                    if (usePeriodicBoundaryConditions_) {
1532 >                      snap_->wrapVector(dr);
1533 >                    }
1534                      cuts = getGroupCutoffs( (*j1), (*j2) );
1535                      if (dr.lengthSquare() < cuts.third) {
1536                        neighborList.push_back(make_pair((*j1), (*j2)));
# Line 1517 | Line 1549 | namespace OpenMD {
1549        for (int j1 = 0; j1 < nGroupsInRow_; j1++) {
1550          for (int j2 = 0; j2 < nGroupsInCol_; j2++) {    
1551            dr = cgColData.position[j2] - cgRowData.position[j1];
1552 <          snap_->wrapVector(dr);
1552 >          if (usePeriodicBoundaryConditions_) {
1553 >            snap_->wrapVector(dr);
1554 >          }
1555            cuts = getGroupCutoffs( j1, j2 );
1556            if (dr.lengthSquare() < cuts.third) {
1557              neighborList.push_back(make_pair(j1, j2));
# Line 1530 | Line 1564 | namespace OpenMD {
1564          // include self group interactions j2 == j1
1565          for (int j2 = j1; j2 < nGroups_; j2++) {
1566            dr = snap_->cgData.position[j2] - snap_->cgData.position[j1];
1567 <          snap_->wrapVector(dr);
1567 >          if (usePeriodicBoundaryConditions_) {
1568 >            snap_->wrapVector(dr);
1569 >          }
1570            cuts = getGroupCutoffs( j1, j2 );
1571            if (dr.lengthSquare() < cuts.third) {
1572              neighborList.push_back(make_pair(j1, j2));

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines