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