def getEnergy(self, coords): E = GMINPotential.getEnergy(self, coords) ca = CoordsAdapter(nrigid=old_div(coords.size, 6), coords=coords) RMX = [rotMatDeriv(p, True) for p in ca.rotRigid] xback = np.array([ x - 0.4 * np.dot(r[0], np.array([1., 0., 0.])) for x, r in zip(ca.posRigid, RMX) ]) xbase = np.array([ x + 0.4 * np.dot(r[0], np.array([1., 0., 0.])) for x, r in zip(ca.posRigid, RMX) ]) Eangle = 0 v2 = xback[1] - xback[0] v2 /= np.linalg.norm(v2) for i in range(1, ca.nrigid - 1): v1 = -v2.copy() v2 = xback[i + 1] - xback[i] v2 /= np.linalg.norm(v2) theta = np.arccos(np.dot(v1, v2)) Eangle += 0.5 * self.k * (theta - self.theta0)**2 # add the torsion angle Etorsion = 0 if self.use_torsion: for i in range(ca.nrigid - 3): theta = dihedral_angle(xback[i:i + 4]) Etorsion += U_torsion_back(theta) return E + Eangle + Etorsion
def getEnergy(self, coords): E = GMINPotential.getEnergy(self, coords) ca = CoordsAdapter(nrigid=coords.size / 6, coords=coords) RMX = [rotMatDeriv(p, True) for p in ca.rotRigid] xback = np.array([x - 0.4 * np.dot(r[0], np.array([1.0, 0.0, 0.0])) for x, r in zip(ca.posRigid, RMX)]) xbase = np.array([x + 0.4 * np.dot(r[0], np.array([1.0, 0.0, 0.0])) for x, r in zip(ca.posRigid, RMX)]) Eangle = 0 v2 = xback[1] - xback[0] v2 /= np.linalg.norm(v2) for i in xrange(1, ca.nrigid - 1): v1 = -v2.copy() v2 = xback[i + 1] - xback[i] v2 /= np.linalg.norm(v2) theta = np.arccos(np.dot(v1, v2)) Eangle += 0.5 * self.k * (theta - self.theta0) ** 2 # add the torsion angle Etorsion = 0 if self.use_torsion: for i in xrange(ca.nrigid - 3): theta = dihedral_angle(xback[i : i + 4]) Etorsion += U_torsion_back(theta) return E + Eangle + Etorsion
def getEnergyGradient(self, coords): #return self.getEnergy(coords), self.NumericalDerivative(coords) E, grad = GMINPotential.getEnergyGradient(self, coords) ca = CoordsAdapter(nrigid=old_div(coords.size, 6), coords=coords) RMX = [rotMatDeriv(p, True) for p in ca.rotRigid] xback = [ x - 0.4 * np.dot(r[0], np.array([1., 0., 0.])) for x, r in zip(ca.posRigid, RMX) ] xbase = [ x - 0.4 * np.dot(r[0], np.array([1., 0., 0.])) for x, r in zip(ca.posRigid, RMX) ] gback = np.zeros_like(xback) Eangle = 0. v2 = xback[1] - xback[0] absv2 = np.linalg.norm(v2) v2 /= absv2 for i in range(1, ca.nrigid - 1): v1 = -v2 absv1 = absv2 v2 = xback[i + 1] - xback[i] absv2 = np.linalg.norm(v2) v2 /= absv2 v1v2 = np.dot(v1, v2) theta = np.arccos(v1v2) Eangle += 0.5 * self.k * (theta - self.theta0)**2 acos_prime = 1. / np.sqrt(1. - v1v2**2) s = self.k * (theta - self.theta0) * acos_prime gback[i - 1] += s * (old_div(-v2, absv1) + old_div(v1v2 * v1, absv1)) gback[i] += s * (old_div(v1, absv2) + old_div(v2, absv1) - old_div( v1v2 * v1, absv1) - old_div(v1v2 * v2, absv2)) gback[i + 1] += s * (old_div(-v1, absv2) + old_div(v1v2 * v2, absv2)) Etorsion = 0 if self.use_torsion: for i in range(ca.nrigid - 3): r = xback[i:i + 4] theta = dihedral_angle(r) e_theta, g_theta = U_torsion_back_grad(theta) Etorsion += e_theta gback[i:i + 4] += g_theta * dihedral_gradient(r) cg = CoordsAdapter(nrigid=ca.nrigid, coords=grad) cg.posRigid += gback for i in range(ca.nrigid): x = -0.4 * np.array([1., 0., 0.]) R = RMX[i] cg.rotRigid[i][0] += np.dot(gback[i], np.dot(R[1], x)) cg.rotRigid[i][1] += np.dot(gback[i], np.dot(R[2], x)) cg.rotRigid[i][2] += np.dot(gback[i], np.dot(R[3], x)) return E + Eangle + Etorsion, grad
def getEnergyGradient(self, coords): # return self.getEnergy(coords), self.NumericalDerivative(coords) E, grad = GMINPotential.getEnergyGradient(self, coords) ca = CoordsAdapter(nrigid=coords.size / 6, coords=coords) RMX = [rotMatDeriv(p, True) for p in ca.rotRigid] xback = [x - 0.4 * np.dot(r[0], np.array([1.0, 0.0, 0.0])) for x, r in zip(ca.posRigid, RMX)] xbase = [x - 0.4 * np.dot(r[0], np.array([1.0, 0.0, 0.0])) for x, r in zip(ca.posRigid, RMX)] gback = np.zeros_like(xback) Eangle = 0.0 v2 = xback[1] - xback[0] absv2 = np.linalg.norm(v2) v2 /= absv2 for i in xrange(1, ca.nrigid - 1): v1 = -v2 absv1 = absv2 v2 = xback[i + 1] - xback[i] absv2 = np.linalg.norm(v2) v2 /= absv2 v1v2 = np.dot(v1, v2) theta = np.arccos(v1v2) Eangle += 0.5 * self.k * (theta - self.theta0) ** 2 acos_prime = 1.0 / np.sqrt(1.0 - v1v2 ** 2) s = self.k * (theta - self.theta0) * acos_prime gback[i - 1] += s * (-v2 / absv1 + v1v2 * v1 / absv1) gback[i] += s * (v1 / absv2 + v2 / absv1 - v1v2 * v1 / absv1 - v1v2 * v2 / absv2) gback[i + 1] += s * (-v1 / absv2 + v1v2 * v2 / absv2) Etorsion = 0 if self.use_torsion: for i in xrange(ca.nrigid - 3): r = xback[i : i + 4] theta = dihedral_angle(r) e_theta, g_theta = U_torsion_back_grad(theta) Etorsion += e_theta gback[i : i + 4] += g_theta * dihedral_gradient(r) cg = CoordsAdapter(nrigid=ca.nrigid, coords=grad) cg.posRigid += gback for i in xrange(ca.nrigid): x = -0.4 * np.array([1.0, 0.0, 0.0]) R = RMX[i] cg.rotRigid[i][0] += np.dot(gback[i], np.dot(R[1], x)) cg.rotRigid[i][1] += np.dot(gback[i], np.dot(R[2], x)) cg.rotRigid[i][2] += np.dot(gback[i], np.dot(R[3], x)) return E + Eangle + Etorsion, grad