Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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."
Example #5
0
 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."
Example #6
0
    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."