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

Comparing trunk/src/nonbonded/Electrostatic.cpp (file contents):
Revision 1921 by gezelter, Thu Aug 1 18:23:07 2013 UTC vs.
Revision 1923 by gezelter, Mon Aug 5 16:13:46 2013 UTC

# Line 289 | Line 289 | namespace OpenMD {
289      db0c_4 =          3.0*b2c  - 6.0*r2*b3c     + r2*r2*b4c;
290      db0c_5 =                    -15.0*r*b3c + 10.0*r2*r*b4c - r2*r2*r*b5c;  
291  
292 <    if (summationMethod_ == esm_EWALD_FULL) {
293 <      selfMult1_ *= 2.0;
294 <      selfMult2_ *= 2.0;
295 <      selfMult4_ *= 2.0;
296 <    } else {
292 >    if (summationMethod_ != esm_EWALD_FULL) {
293        selfMult1_ -= b0c;
294        selfMult2_ += (db0c_2 + 2.0*db0c_1*ric) /  3.0;
295        selfMult4_ -= (db0c_4 + 4.0*db0c_3*ric) / 15.0;
# Line 1223 | Line 1219 | namespace OpenMD {
1219      Vector3d box = hmat.diagonals();
1220      RealType boxMax = box.max();
1221      
1226    cerr << "da = " << dampingAlpha_ << " rc = " << cutoffRadius_ << "\n";
1227    cerr << "boxMax = " << boxMax << "\n";
1222      //int kMax = int(2.0 * M_PI / (pow(dampingAlpha_,2)*cutoffRadius_ * boxMax) );
1223 <    int kMax = 5;
1230 <    cerr << "kMax = " << kMax << "\n";
1223 >    int kMax = 7;
1224      int kSqMax = kMax*kMax + 2;
1225      
1226      int kLimit = kMax+1;
# Line 1261 | Line 1254 | namespace OpenMD {
1254      
1255      Vector3d t( 2.0 * M_PI );
1256      t.Vdiv(t, box);
1257 +
1258      
1259      SimInfo::MoleculeIterator mi;
1260      Molecule::AtomIterator ai;
# Line 1281 | Line 1275 | namespace OpenMD {
1275          r = atom->getPos();
1276          info_->getSnapshotManager()->getCurrentSnapshot()->wrapVector(r);
1277          
1284        // Shift so that all coordinates are in the range [0,L]:
1285
1286        r += box/2.0;
1287
1278          tt.Vmul(t, r);
1279  
1290        //cerr << "tt = " << tt << "\n";
1280          
1281          eCos[1][i] = Vector3d(1.0, 1.0, 1.0);
1282          eSin[1][i] = Vector3d(0.0, 0.0, 0.0);
1283          eCos[2][i] = Vector3d(cos(tt.x()), cos(tt.y()), cos(tt.z()));
1284          eSin[2][i] = Vector3d(sin(tt.x()), sin(tt.y()), sin(tt.z()));
1285 +
1286          u = eCos[2][i];
1287          w = eSin[2][i];
1288          
1289          for(int l = 3; l <= kLimit; l++) {
1290 <          a.Vmul(eCos[l-1][i], u);
1291 <          b.Vmul(eSin[l-1][i], w);
1292 <          eCos[l][i] = a - b;
1293 <          a.Vmul(eSin[l-1][i], u);
1294 <          b.Vmul(eCos[l-1][i], w);
1295 <          eSin[l][i] = a + b;
1290 >          eCos[l][i].x() = eCos[l-1][i].x()*eCos[2][i].x() - eSin[l-1][i].x()*eSin[2][i].x();
1291 >          eCos[l][i].y() = eCos[l-1][i].y()*eCos[2][i].y() - eSin[l-1][i].y()*eSin[2][i].y();
1292 >          eCos[l][i].z() = eCos[l-1][i].z()*eCos[2][i].z() - eSin[l-1][i].z()*eSin[2][i].z();
1293 >          
1294 >          eSin[l][i].x() = eSin[l-1][i].x()*eCos[2][i].x() + eCos[l-1][i].x()*eSin[2][i].x();
1295 >          eSin[l][i].y() = eSin[l-1][i].y()*eCos[2][i].y() + eCos[l-1][i].y()*eSin[2][i].y();
1296 >          eSin[l][i].z() = eSin[l-1][i].z()*eCos[2][i].z() + eCos[l-1][i].z()*eSin[2][i].z();
1297 >
1298 >
1299 >          // a.Vmul(eCos[l-1][i], u);
1300 >          // b.Vmul(eSin[l-1][i], w);
1301 >          // eCos[l][i] = a - b;
1302 >          // a.Vmul(eSin[l-1][i], u);
1303 >          // b.Vmul(eCos[l-1][i], w);
1304 >          // eSin[l][i] = a + b;
1305 >        
1306          }
1307        }
1308      }
# Line 1350 | Line 1350 | namespace OpenMD {
1350      int mMin = kLimit;
1351      int nMin = kLimit + 1;
1352      for (int l = 1; l <= kLimit; l++) {
1353 <      int ll =l - 1;
1353 >      int ll = l - 1;
1354        RealType rl = xcl * float(ll);
1355        for (int mmm = mMin; mmm <= kLim2; mmm++) {
1356          int mm = mmm - kLimit;
# Line 1372 | Line 1372 | namespace OpenMD {
1372                clm[i] = eCos[l][i].x()*eCos[m][i].y()
1373                       - eSin[l][i].x()*eSin[m][i].y();
1374                slm[i] = eSin[l][i].x()*eCos[m][i].y()
1375 <                     + eSin[m][i].y()*eCos[l][i].x();
1375 >                     + eSin[m][i].y()*eCos[l][i].x();              
1376              }
1377            }
1378          }
# Line 1462 | Line 1462 | namespace OpenMD {
1462                                        MPI::SUM);
1463   #endif        
1464              
1465 <            // Accumulate potential energy and virial contribution:          
1465 >            // Accumulate potential energy and virial contribution:
1466  
1467              kPot += 2.0 * rvol * AK[kk]*((ckss+dkcs-qkss)*(ckss+dkcs-qkss)
1468                                           + (ckcs-dkss-qkcs)*(ckcs-dkss-qkss));
# Line 1486 | Line 1486 | namespace OpenMD {
1486                  ElectrostaticAtomData data = ElectrostaticMap[Etids[atid]];
1487                  
1488                  RealType qfrc = AK[kk]*((cks[i]+dkc[i]-qks[i])*(ckcs-dkss-qkcs)
1489 <                                        - (ckc[i]-dks[i]-qkc[i])*(ckss+dkcs-qkss));
1489 >                                     - (ckc[i]-dks[i]-qkc[i])*(ckss+dkcs-qkss));
1490                  RealType qtrq1 = AK[kk]*(skr[i]*(ckcs-dkss-qkcs)
1491                                           -ckr[i]*(ckss+dkcs-qkss));
1492                  RealType qtrq2 = 2.0*AK[kk]*(ckr[i]*(ckcs-dkss-qkcs)+
1493                                               skr[i]*(ckss+dkcs-qkss));
1494 <                
1495 <                
1494 >              
1495                  atom->addFrc( 4.0 * rvol * qfrc * kVec );
1496                  
1497                  if (data.is_Dipole) {
# Line 1505 | Line 1504 | namespace OpenMD {
1504              }
1505            }
1506          }
1507 +        nMin = 1;
1508        }
1509 +      mMin = 1;
1510      }
1511      cerr << "kPot = " << kPot << "\n";
1512      pot[ELECTROSTATIC_FAMILY] += kPot;  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines