def update(self): D2 = matrixmultiply(self.D,self.D) D3 = matrixmultiply(self.D,D2) cn = trace(D2-D3)/trace(self.D-D2) if cn < 0.5: self.D = ((1.0-2.0*cn)*self.D+(1.0+cn)*D2-D3)/(1.0-cn) else: self.D = ((1+cn)*D2-D3)/cn return
def update(self): D2 = matrixmultiply(self.D, self.D) D3 = matrixmultiply(self.D, D2) cn = trace(D2 - D3) / trace(self.D - D2) if cn < 0.5: self.D = ((1.0 - 2.0 * cn) * self.D + (1.0 + cn) * D2 - D3) / (1.0 - cn) else: self.D = ((1 + cn) * D2 - D3) / cn return
def update(self): Ne_curr = trace(self.D) D2 = matrixmultiply(self.D,self.D) Ne2 = trace(D2) self.Ne_curr = Ne_curr # Anders claims this works better; I didn't see a difference #if abs(2*Ne_curr-Ne2-self.Ne) < abs(Ne2-self.Ne): if Ne_curr < self.Ne: self.D = 2*self.D-D2 else: self.D = D2 return
def update(self): Ne_curr = trace(self.D) D2 = matrixmultiply(self.D, self.D) Ne2 = trace(D2) self.Ne_curr = Ne_curr # Anders claims this works better; I didn't see a difference #if abs(2*Ne_curr-Ne2-self.Ne) < abs(Ne2-self.Ne): if Ne_curr < self.Ne: self.D = 2 * self.D - D2 else: self.D = D2 return
def update(self): D2 = matrixmultiply(self.D,self.D) Df = matrixmultiply(D2,4*self.D-3*D2) trf = trace(Df) Dp = self.I-self.D Dp2 = matrixmultiply(Dp,Dp) Dg = matrixmultiply(D2,Dp2) trg = trace(Dg) gamma = (self.Ne-trf)/trg if gamma > 2: self.D = 2*self.D-D2 elif gamma < 0: self.D = D2 else: self.D = Df-gamma*Dg return
def update(self): D2 = matrixmultiply(self.D, self.D) Df = matrixmultiply(D2, 4 * self.D - 3 * D2) trf = trace(Df) Dp = self.I - self.D Dp2 = matrixmultiply(Dp, Dp) Dg = matrixmultiply(D2, Dp2) trg = trace(Dg) gamma = (self.Ne - trf) / trg if gamma > 2: self.D = 2 * self.D - D2 elif gamma < 0: self.D = D2 else: self.D = Df - gamma * Dg return
def initialize(self): efermi = trace(self.F)/self.N beta = self.Ne/float(self.N) alpha = min(self.Ne/(self.emax-efermi), (self.N-self.Ne)/(efermi-self.emin))/float(self.N) self.D = alpha*(efermi*self.I-self.F) + beta*self.I self.Dsumold = 0 return
def initialize(self): efermi = trace(self.F) / self.N beta = self.Ne / float(self.N) alpha = min(self.Ne / (self.emax - efermi), (self.N - self.Ne) / (efermi - self.emin)) / float(self.N) self.D = alpha * (efermi * self.I - self.F) + beta * self.I self.Dsumold = 0 return
def converged(self): return abs(trace(self.D) - self.Ne) < self.tol def init_dmat_solver(Method,**opts):
def get_nel(self,efermi,alpha,beta): return trace(alpha*(efermi*self.I-self.F)*beta*self.I)
def converged(self): return abs(trace(self.D) - self.Ne) < self.tol
def converged(self): self.DS = matrixmultiply(self.D,self.S) self.Ne_curr = trace(self.DS) return abs(self.Ne_curr - self.Ne) < self.tol
def get_nel(self, efermi, alpha, beta): return trace(alpha * (efermi * self.I - self.F) * beta * self.I)
def converged(self): self.DS = matrixmultiply(self.D, self.S) self.Ne_curr = trace(self.DS) return abs(self.Ne_curr - self.Ne) < self.tol