Real BruteForceCalcs::calcMoleculeInteractionEnergy (int m1, int m2, int** molData, Real** aData, Real** aCoords, Real* bSize) { Real energySum = 0; const int m1Start = molData[MOL_START][m1]; const int m1End = molData[MOL_LEN][m1] + m1Start; const int m2Start = molData[MOL_START][m2]; const int m2End = molData[MOL_LEN][m2] + m2Start; #pragma acc loop vector collapse(2) reduction(+:energySum) for (int i = m1Start; i < m1End; i++) { for (int j = m2Start; j < m2End; j++) { if (aData[ATOM_SIGMA][i] >= 0 && aData[ATOM_SIGMA][j] >= 0 && aData[ATOM_EPSILON][i] >= 0 && aData[ATOM_EPSILON][j] >= 0) { const Real r2 = calcAtomDistSquared(i, j, aCoords, bSize); if (r2 == 0.0) { energySum += 0.0; } else { energySum += calcLJEnergy(i, j, r2, aData); energySum += calcChargeEnergy(i, j, sqrt(r2), aData); } } } } return (energySum); }
bool BruteForceCalcs::moleculesInRange(int p1Start, int p1End, int p2Start, int p2End, Real** atomCoords, Real* bSize, int* primaryIndexes, Real cutoff) { bool out = false; for (int p1Idx = p1Start; p1Idx < p1End; p1Idx++) { int p1 = primaryIndexes[p1Idx]; for (int p2Idx = p2Start; p2Idx < p2End; p2Idx++) { int p2 = primaryIndexes[p2Idx]; out |= (calcAtomDistSquared(p1, p2, atomCoords, bSize) <= cutoff * cutoff); } } return out; }
Real SimCalcs::calcIntraMolecularEnergy(int molIdx) { int** moleculeData = sb->moleculeData; int molStart = moleculeData[MOL_START][molIdx]; int molEnd = molStart + moleculeData[MOL_LEN][molIdx]; int molType = moleculeData[MOL_TYPE][molIdx]; Real** aCoords = GPUCopy::atomCoordinatesPtr(); Real** atomData = sb->atomData; Real out = 0.0; if (sb->hasFlexibleAngles) out += angleEnergy(molIdx); if (sb->hasFlexibleBonds) out += bondEnergy(molIdx); // Calculate intramolecular LJ and Coulomb energy if necessary if (sb->hasFlexibleBonds || sb->hasFlexibleAngles) { #pragma acc parallel loop deviceptr(aCoords) if (on_gpu) for (int i = molStart; i < molEnd; i++) { for (int j = i + 1; j < molEnd; j++) { Real fudgeFactor = 1.0; for (int k = 0; ; k++) { int val = sb->excludeAtoms[molType][i - molStart][k]; if (val == -1) { break; } else if (val == j - molStart) { fudgeFactor = 0.0; break; } } if (fudgeFactor > 0.0) { for (int k = 0; ; k++) { int val = sb->fudgeAtoms[molType][i - molStart][k]; if (val == -1) { break; } else if (val == j - molStart) { fudgeFactor = 0.5; break; } } } if (fudgeFactor > 0.0) { Real r2 = calcAtomDistSquared(i, j, aCoords, sb->size); Real r = sqrt(r2); Real energy = calcLJEnergy(i, j, r2, atomData); energy += calcChargeEnergy(i, j, r, atomData); out += fudgeFactor * energy; } } } } return out; }
Real SimBox::calcIntraMolecularEnergy(int molIdx) { int molStart = moleculeData[MOL_START][molIdx]; int molEnd = molStart + moleculeData[MOL_LEN][molIdx]; int molType = moleculeData[MOL_TYPE][molIdx]; Real out = 0.0; out += angleEnergy(molIdx); out += bondEnergy(molIdx); for (int i = molStart; i < molEnd; i++) { for (int j = i + 1; j < molEnd; j++) { Real fudgeFactor = 1.0; for (int k = 0; ; k++) { int val = excludeAtoms[molType][i - molStart][k]; if (val == -1) { break; } else if (val == j - molStart) { fudgeFactor = 0.0; break; } } if (fudgeFactor == 1.0) { for (int k = 0; ; k++) { int val = fudgeAtoms[molType][i - molStart][k]; if (val == -1) { break; } else if (val == j - molStart) { fudgeFactor = 0.5; break; } } } if (fudgeFactor > 0.0) { Real r2 = calcAtomDistSquared(i, j, atomCoordinates, size); Real r = sqrt(r2); Real energy = calcLJEnergy(i, j, r2, atomData); energy += calcChargeEnergy(i, j, r, atomData); out += fudgeFactor * energy; } } } return out; }