Ejemplo n.º 1
0
  private void generateInterAtomDistances(IsopointalSet isopointalSet) {
    int numAtoms = isopointalSet.getNumPositions();
    interAtomicDistances = new List[numAtoms];
    multiplicity = new int[numAtoms];

    int dz = (int) Math.ceil(Rcutoff / isopointalSet.vecC.z);
    int dy =
        (int) Math.ceil((Rcutoff + Math.abs(dz * isopointalSet.vecC.y)) / isopointalSet.vecB.y);
    int dx =
        (int)
            Math.ceil(
                (Rcutoff
                        + Math.abs(dz * isopointalSet.vecC.x)
                        + Math.abs(dy * isopointalSet.vecB.x))
                    / isopointalSet.vecA.x);

    for (int i = 0; i < numAtoms; i++) {
      interAtomicDistances[i] = new ArrayList<>();
      for (int j = 0; j < numAtoms; j++) {

        for (int x = -dx; x <= dx; x++) {
          for (int y = -dy; y <= dy; y++) {
            for (int z = -dz; z <= dz; z++) {
              if (x == 0 && y == 0 && z == 0 && i == j) continue;

              double rsq = isopointalSet.getDistSqBetweenPositions(i, j, x, y, z);
              if (rsq <= RcutoffSq) interAtomicDistances[i].add(Math.sqrt(rsq));
            }
          }
        }
      }
      multiplicity[i] = isopointalSet.getMultiplicity(i);
      i += (multiplicity[i] - 1);
    }
  }
Ejemplo n.º 2
0
  public double computeEnergy(IsopointalSet isopointalSet) {
    double totalEnergy = 0;

    generateInterAtomDistances(isopointalSet);

    for (int i = 0; i < isopointalSet.getNumPositions(); i++) {
      double energy = 0.0;

      double phiSum = 0;
      for (double dist : interAtomicDistances[i]) {
        phiSum += computeOPP(dist);
      }
      energy += 0.5 * phiSum;

      int mult = multiplicity[i];
      totalEnergy += mult * energy;
      i += (mult - 1); // Skip the positions with same energy;
    }

    return totalEnergy;
  }