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
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
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
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
def dot1d(a, b): return dot(ravel(a), ravel(b))