Example #1
0
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);
}
Example #2
0
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;
}
Example #3
0
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;
}