def force(self, c, x): b, db = dbond( array([x[..., j, :] - x[..., i, :] for i, j in self.edges])) u, du = self.f.y(c, b, 1) en = sum(u, -1) F = zeros(x.shape) for k, (i, j) in enumerate(self.edges): F[..., i, :] += du[k] * db[..., k, :] F[..., j, :] -= du[k] * db[..., k, :] return en, F
def force(self, c, x): self.f.c = c delta = calc_delta(x, self.edges, self.excl, self.L) b, db = dbond(delta) u, du = self.f.y(b, 1) en = sum(u, -1) F = zeros(x.shape) for k, (i, j) in enumerate(ex_gen(self.edges, self.excl)): delta[k] = x[..., j, :] - x[..., i, :] F[..., i, :] += du[k] * db[..., k, :] F[..., j, :] -= du[k] * db[..., k, :] return en, F
def force(self, c, x): delta = calc_delta(x, self.edges, self.excl, self.L) r, db = dbond(delta) # r, dr/dx u, du = self.f.y(c, r**-6, 1) # f(r^-6), df/du (u = r^-6) # du/dr = -6 r^-7 du *= -6*r**-7 en = sum(u, -1) de = zeros(x.shape) for k,(i,j) in enumerate(ex_gen(self.edges, self.excl)): de[...,i,:] += du[k]*db[...,k,:] # df/du du/dr dr/dx de[...,j,:] -= du[k]*db[...,k,:] return en, de
def design_pair(self, x, order=0): A = [] delta = calc_delta(x, self.edges, self.excl, self.L) if order == 0: return sum(self.spline(bond(delta), order), -2) elif order == 1: Ad = zeros(x.shape + (self.f.n, )) b, db = dbond(delta) spl, dspl = self.spline(b, order) for k, (i, j) in enumerate(ex_gen(self.edges, self.excl)): Ad[...,i,:,:] -= db[...,k,:,newaxis] \ * dspl[...,k,newaxis,:] Ad[...,j,:,:] += db[...,k,:,newaxis] \ * dspl[...,k,newaxis,:] A = sum(spl, -2) return A, Ad else: raise RuntimeError, "Error! >1 energy derivative not "\ "supported."
def design(self, x, order=0): if order == 0: b = bond( array([x[..., j, :] - x[..., i, :] for i, j in self.edges])) spl = self.spline(b, order) return sum(spl, -2) elif order == 1: Ad = zeros(x.shape + (self.params, )) b, db = dbond( array([x[..., j, :] - x[..., i, :] for i, j in self.edges])) spl, dspl = self.spline(b, order) for k, (i, j) in enumerate(self.edges): Ad[...,i,:,:] -= db[...,k,:,newaxis] \ * dspl[...,k,newaxis,:] Ad[...,j,:,:] += db[...,k,:,newaxis] \ * dspl[...,k,newaxis,:] A = sum(spl, -2) return A, Ad raise RuntimeError, "Error! >1 energy derivative not "\ "supported."
def design(self, x, order=0): delta = calc_delta(x, self.edges, self.excl, self.L) if order == 0: return sum(self.spline(bond(delta)**-6, order), -2) elif order == 1: Ad = zeros(x.shape + (self.params,)) r, db = dbond(delta) # r, dr/dx spl, dspl = self.spline(r**-6, order) # D(r^-6), dD(r^-6)/du dspl *= -6*r[...,newaxis]**-7 # du/dr for k,(i,j) in enumerate(ex_gen(self.edges, self.excl)): # dD/dx Ad[...,i,:,:] -= db[...,k,:,newaxis] \ * dspl[...,k,newaxis,:] Ad[...,j,:,:] += db[...,k,:,newaxis] \ * dspl[...,k,newaxis,:] assert k+1 == len(delta) A = sum(spl, -2) return A, Ad else: raise RuntimeError, "Error! >1 energy derivative not "\ "supported."