void ComputeForces () { VecR dr; real fcVal, rr, rrCut, rri, rri3; int j1, j2, n; rrCut = Sqr (rCut); DO_MOL VZero (mol[n].ra); uSum = 0.; virSum = 0.; for (j1 = 0; j1 < nMol - 1; j1 ++) { for (j2 = j1 + 1; j2 < nMol; j2 ++) { VSub (dr, mol[j1].r, mol[j2].r); VWrapAll (dr); rr = VLenSq (dr); if (rr < rrCut) { rri = 1. / rr; rri3 = Cube (rri); fcVal = 48. * rri3 * (rri3 - 0.5) * rri; VVSAdd (mol[j1].ra, fcVal, dr); VVSAdd (mol[j2].ra, - fcVal, dr); uSum += 4. * rri3 * (rri3 - 1.) + 1.; virSum += fcVal * rr; } } } }
void EvalRdf () { VecR dr; real deltaR, normFac, rr, sr1, sr2, ss; int j1, j2, k, n; if (countRdf == 0) { for (k = 0; k < 3; k ++) { for (n = 0; n < sizeHistRdf; n ++) histRdf[k][n] = 0.; } } deltaR = rangeRdf / sizeHistRdf; for (j1 = 0; j1 < nMol - 1; j1 ++) { for (j2 = j1 + 1; j2 < nMol; j2 ++) { VSub (dr, mol[j1].r, mol[j2].r); VWrapAll (dr); rr = VLenSq (dr); if (rr < Sqr (rangeRdf)) { ss = VDot (mol[j1].s, mol[j2].s); sr1 = VDot (mol[j1].s, dr); sr2 = VDot (mol[j2].s, dr); n = sqrt (rr) / deltaR; ++ histRdf[0][n]; histRdf[1][n] += ss; histRdf[2][n] += 3. * sr1 * sr2 / rr - ss; } } } ++ countRdf; if (countRdf == limitRdf) { normFac = VProd (region) / (2. * M_PI * Cube (deltaR) * Sqr (nMol) * countRdf); for (k = 0; k < 3; k ++) { for (n = 0; n < sizeHistRdf; n ++) histRdf[k][n] *= normFac / Sqr (n - 0.5); } PrintRdf (stdout); countRdf = 0; } }
void ComputeForcesDipoleR () { VecR dr, w; real a1, a2, a3, alpha2, d, irPi, rr, rrCut, rri, sr1, sr2, ss, t; int j1, j2, n; rrCut = Sqr (0.5 * region.x); irPi = 1. / sqrt (M_PI); alpha2 = Sqr (alpha); DO_MOL VZero (mol[n].sa); for (j1 = 0; j1 < nMol - 1; j1 ++) { for (j2 = j1 + 1; j2 < nMol; j2 ++) { VSub (dr, mol[j1].r, mol[j2].r); VWrapAll (dr); rr = VLenSq (dr); if (rr < rrCut) { d = sqrt (rr); rri = 1. / rr; t = 2. * dipoleInt * alpha * exp (- alpha2 * rr) * rri * irPi; a1 = dipoleInt * erfc (alpha * d) * rri / d + t; a2 = 3. * a1 * rri + 2. * alpha2 * t; a3 = 5. * a2 * rri + 4. * Sqr (alpha2) * t; ss = VDot (mol[j1].s, mol[j2].s); sr1 = VDot (mol[j1].s, dr); sr2 = VDot (mol[j2].s, dr); VSSAdd (w, sr2, mol[j1].s, sr1, mol[j2].s); t = (a2 * ss - a3 * sr1 * sr2); VSSAdd (w, t, dr, a2, w); VVAdd (mol[j1].ra, w); VVSub (mol[j2].ra, w); VVSAdd (mol[j1].sa, - a1, mol[j2].s); VVSAdd (mol[j1].sa, a2 * sr2, dr); VVSAdd (mol[j2].sa, - a1, mol[j1].s); VVSAdd (mol[j2].sa, a2 * sr1, dr); uSum += a1 * ss - a2 * sr1 * sr2; } } } uSum -= 2. * dipoleInt * Cube (alpha) * nMol * irPi / 3.; }