Пример #1
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;
}
Пример #2
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;
}