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; }