def metric_tensor_cog(self, x, p): ''' calculate the metric tensor when for w_i != m_i ''' R, R1, R2, R3 = rotMatDeriv(p, True) g = np.zeros([6,6]) # the com part g[0:3,0:3] = self.W * np.identity(3) # the rotational part g[3,3] = np.trace(np.dot(R1, np.dot(self.Sm, R1.transpose()))) g[3,4] = np.trace(np.dot(R1, np.dot(self.Sm, R2.transpose()))) g[3,5] = np.trace(np.dot(R1, np.dot(self.Sm, R3.transpose()))) g[4,4] = np.trace(np.dot(R2, np.dot(self.Sm, R2.transpose()))) g[4,5] = np.trace(np.dot(R2, np.dot(self.Sm, R3.transpose()))) g[5,5] = np.trace(np.dot(R3, np.dot(self.Sm, R3.transpose()))) g[4,3] = g[3,4] g[5,4] = g[4,5] g[5,3] = g[3,5] # the mixing part # g[0:3,3] = 2.*self.W * np.dot(R1, self.cog) # g[0:3,4] = 2.*self.W * np.dot(R2, self.cog) # g[0:3,5] = 2.*self.W * np.dot(R3, self.cog) # #g[0:3,3:] = g[0:3,3:].transpose() # # g[3,0:3] = g[0:3,3] # g[4,0:3] = g[0:3,4] # g[5,0:3] = g[0:3,5] return g
def metric_tensor(self, p): ''' calculate the mass weighted metric tensor ''' R, R1, R2, R3 = rotMatDeriv(p, True) g = np.zeros([3,3]) g[0,0] = np.trace(np.dot(R1, np.dot(self.Sm, R1.transpose()))) g[0,1] = np.trace(np.dot(R1, np.dot(self.Sm, R2.transpose()))) g[0,2] = np.trace(np.dot(R1, np.dot(self.Sm, R3.transpose()))) g[1,1] = np.trace(np.dot(R2, np.dot(self.Sm, R2.transpose()))) g[1,2] = np.trace(np.dot(R2, np.dot(self.Sm, R3.transpose()))) g[2,2] = np.trace(np.dot(R3, np.dot(self.Sm, R3.transpose()))) g[1,0] = g[0,1] g[2,1] = g[1,2] g[2,0] = g[0,2] gx = np.identity(3)*self.M return gx, g
def distance_squared_grad(self, com1, p1, com2, p2): ''' calculate spring force between 2 sites Parameters ---------- com1: center of mass of 1st site p1: angle axis vector of 1st site com2: center of mass of 2nd site p2: angle axis vector of 2nd site sitetype: AASiteType, optional amgle axis site type with mass and moment of inertia tensor returns: tuple spring cart, spring rot ''' return sitedist_grad(self.get_smallest_rij(com1, com2), p1, p2, self.S, self.W, self.cog) R1, R11, R12, R13 = rotMatDeriv(p1, True) R2 = rotations.aa2mx(p2) dR = R2 - R1 dR = dR g_M = -2.*self.W*(com2-com1) # dR_kl S_lm dR_km g_P = np.zeros(3) g_P[0] = -2.*np.trace(np.dot(R11, np.dot(self.S, dR.transpose()))) g_P[1] = -2.*np.trace(np.dot(R12, np.dot(self.S, dR.transpose()))) g_P[2] = -2.*np.trace(np.dot(R13, np.dot(self.S, dR.transpose()))) g_M -= 2.*self.W * np.dot(dR, self.cog) g_P[0] -= 2.*self.W * np.dot((com2-com1), np.dot(R11, self.cog)) g_P[1] -= 2.*self.W * np.dot((com2-com1), np.dot(R12, self.cog)) g_P[2] -= 2.*self.W * np.dot((com2-com1), np.dot(R13, self.cog)) return g_M, g_P