Example #1
0
    def getF(self, F, D):
        n, m = F.shape
        err = matrixmultiply(F, matrixmultiply(D, self.S)) - matrixmultiply(self.S, matrixmultiply(D, F))
        err = ravel(err)
        maxerr = max(abs(err))
        self.maxerr = maxerr

        if maxerr < self.errcutoff and not self.started:
            if VERBOSE:
                print "Starting DIIS: Max Err = ", maxerr
            self.started = 1

        if not self.started:
            # Do simple averaging until DIIS starts
            if self.Fold != None:
                Freturn = 0.5 * F + 0.5 * self.Fold
                self.Fold = F
            else:
                self.Fold = F
                Freturn = F
            return Freturn

        self.Fs.append(F)
        self.Errs.append(err)
        nit = len(self.Errs)
        a = zeros((nit + 1, nit + 1), "d")
        b = zeros(nit + 1, "d")
        for i in range(nit):
            for j in range(nit):
                a[i, j] = dot(self.Errs[i], self.Errs[j])
        for i in range(nit):
            a[nit, i] = a[i, nit] = -1.0
            b[i] = 0
        # mtx2file(a,'A%d.dat' % nit)
        a[nit, nit] = 0
        b[nit] = -1.0

        # The try loop makes this a bit more stable.
        #  Thanks to John Kendrick!
        try:
            c = solve(a, b)
        except:
            self.Fold = F
            return F

        F = zeros((n, m), "d")
        for i in range(nit):
            F += c[i] * self.Fs[i]
        return F
Example #2
0
    def getF(self, F, D):
        n, m = F.shape
        err = matrixmultiply(F,matrixmultiply(D,self.S)) -\
              matrixmultiply(self.S,matrixmultiply(D,F))
        err = ravel(err)
        maxerr = max(abs(err))
        self.maxerr = maxerr

        if maxerr < self.errcutoff and not self.started:
            if VERBOSE: print "Starting DIIS: Max Err = ", maxerr
            self.started = 1

        if not self.started:
            # Do simple averaging until DIIS starts
            if self.Fold != None:
                Freturn = 0.5 * F + 0.5 * self.Fold
                self.Fold = F
            else:
                self.Fold = F
                Freturn = F
            return Freturn

        self.Fs.append(F)
        self.Errs.append(err)
        nit = len(self.Errs)
        a = zeros((nit + 1, nit + 1), 'd')
        b = zeros(nit + 1, 'd')
        for i in xrange(nit):
            for j in xrange(nit):
                a[i, j] = dot(self.Errs[i], self.Errs[j])
        for i in xrange(nit):
            a[nit, i] = a[i, nit] = -1.0
            b[i] = 0
        #mtx2file(a,'A%d.dat' % nit)
        a[nit, nit] = 0
        b[nit] = -1.0

        # The try loop makes this a bit more stable.
        #  Thanks to John Kendrick!
        try:
            c = solve(a, b)
        except:
            self.Fold = F
            return F

        F = zeros((n, m), 'd')
        for i in xrange(nit):
            F += c[i] * self.Fs[i]
        return F
Example #3
0
    def getF(self, F, D):
        n, m = F.shape
        err = matrixmultiply(F, matrixmultiply(D, self.S)) - matrixmultiply(self.S, matrixmultiply(D, F))
        err = ravel(err)
        maxerr = max(abs(err))

        if maxerr < self.errcutoff and not self.started:
            if VERBOSE:
                print "Starting DIIS: Max Err = ", maxerr
            self.started = 1

        if not self.started:
            # Do simple averaging until DIIS starts
            if self.Fold:
                Freturn = 0.5 * F + 0.5 * self.Fold
            else:
                Freturn = F
            self.Fold = F
            return Freturn
        elif not self.errold:
            Freturn = 0.5 * F + 0.5 * self.Fold
            self.errold = err
            return Freturn

        a = zeros((3, 3), "d")
        b = zeros(3, "d")
        a[0, 0] = dot(self.errold, self.errold)
        a[1, 0] = dot(self.errold, err)
        a[0, 1] = a[1, 0]
        a[1, 1] = dot(err, err)
        a[:, 2] = -1
        a[2, :] = -1
        a[2, 2] = 0
        b[2] = -1
        c = solve(a, b)

        # Handle a few special cases:
        alpha = c[1]
        print alpha, c
        # if alpha < 0: alpha = 0
        # if alpha > 1: alpha = 1

        F = (1 - alpha) * self.Fold + alpha * F
        self.errold = err
        self.Fold = F
        return F
Example #4
0
    def getF(self, F, D):
        n, m = F.shape
        err = matrixmultiply(F,matrixmultiply(D,self.S)) -\
              matrixmultiply(self.S,matrixmultiply(D,F))
        err = ravel(err)
        maxerr = max(abs(err))

        if maxerr < self.errcutoff and not self.started:
            if VERBOSE: print "Starting DIIS: Max Err = ", maxerr
            self.started = 1

        if not self.started:
            # Do simple averaging until DIIS starts
            if self.Fold:
                Freturn = 0.5 * F + 0.5 * self.Fold
            else:
                Freturn = F
            self.Fold = F
            return Freturn
        elif not self.errold:
            Freturn = 0.5 * F + 0.5 * self.Fold
            self.errold = err
            return Freturn

        a = zeros((3, 3), 'd')
        b = zeros(3, 'd')
        a[0, 0] = dot(self.errold, self.errold)
        a[1, 0] = dot(self.errold, err)
        a[0, 1] = a[1, 0]
        a[1, 1] = dot(err, err)
        a[:, 2] = -1
        a[2, :] = -1
        a[2, 2] = 0
        b[2] = -1
        c = solve(a, b)

        # Handle a few special cases:
        alpha = c[1]
        print alpha, c
        #if alpha < 0: alpha = 0
        #if alpha > 1: alpha = 1

        F = (1 - alpha) * self.Fold + alpha * F
        self.errold = err
        self.Fold = F
        return F
Example #5
0
def dot1d(a, b):
    return dot(ravel(a), ravel(b))
Example #6
0
def dot1d(a, b):
    return dot(ravel(a), ravel(b))