def localize_orbitals(self): # assert self.gd.orthogonal # # calculate wannier matrixelements Z_mmv = np.empty((self.nocc, self.nocc, 3), complex) for v in range(3): G_v = np.zeros(3) G_v[v] = 1 Z_mmv[:, :, v] = self.gd.wannier_matrix(self.kpt.psit_nG, self.kpt.psit_nG, G_v, self.nocc) self.gd.comm.sum(Z_mmv) # # setup the initial configuration (identity) W_nm = np.identity(self.nocc) # # localize the orbitals localization = 0.0 for iter in range(30): loc = _gpaw.localize(Z_mmv, W_nm) if loc - localization < 1e-6: break localization = loc # # apply localizing transformation self.W_mn = W_nm.T.copy()
def localize(self, eps=1e-5, iterations=-1): i = 0 while i != iterations: value = localize(self.Z_nnc, self.U_nn) print(i, value) if value - self.value < eps: break i += 1 self.value = value return value # / Bohr**6
def initialize_orbitals(self, rattle=-0.1, localize=True): # if self.initial_W_mn!=None: self.nocc = self.initial_W_mn.shape[0] else: self.nocc, x = divmod(int(self.kpt.f_n.sum()), 3 - self.nspins) assert x == 0 if self.nocc==0: return Z_mmv = np.empty((self.nocc, self.nocc, 3), complex) for v in range(3): G_v = np.zeros(3) G_v[v] = 1 Z_mmv[:, :, v] = self.gd.wannier_matrix(self.kpt.psit_nG, self.kpt.psit_nG, G_v, self.nocc) self.gd.comm.sum(Z_mmv) if self.initial_W_mn!=None: self.W_mn = self.initial_W_mn elif localize: W_nm = np.identity(self.nocc) localization = 0.0 for iter in range(30): loc = _gpaw.localize(Z_mmv, W_nm) if loc - localization < 1e-6: break localization = loc self.W_mn = W_nm.T.copy() else: self.W_mn = np.identity(self.nocc) if (rattle != 0.0 and self.W_mn is not None and self.initial_W_mn is None): U_mm = random_unitary_matrix(rattle, self.nocc) self.W_mn = np.dot(U_mm, self.W_mn) if self.W_mn!=None: self.gd.comm.broadcast(self.W_mn, 0) spos_mc = -np.angle(Z_mmv.diagonal()).T / (2 * pi) self.initial_pos_mv = np.dot(spos_mc % 1.0, self.gd.cell_cv)
def initialize_orbitals(self, rattle=-0.1, localize=True): # if self.initial_W_mn is not None: self.nocc = self.initial_W_mn.shape[0] else: self.nocc, x = divmod(int(self.kpt.f_n.sum()), 3 - self.nspins) assert x == 0 if self.nocc == 0: return Z_mmv = np.empty((self.nocc, self.nocc, 3), complex) for v in range(3): G_v = np.zeros(3) G_v[v] = 1 Z_mmv[:, :, v] = self.gd.wannier_matrix(self.kpt.psit_nG, self.kpt.psit_nG, G_v, self.nocc) self.gd.comm.sum(Z_mmv) if self.initial_W_mn is not None: self.W_mn = self.initial_W_mn elif localize: W_nm = np.identity(self.nocc) localization = 0.0 for iter in range(30): loc = _gpaw.localize(Z_mmv, W_nm) if loc - localization < 1e-6: break localization = loc self.W_mn = W_nm.T.copy() else: self.W_mn = np.identity(self.nocc) if (rattle != 0.0 and self.W_mn is not None and self.initial_W_mn is None): U_mm = random_unitary_matrix(rattle, self.nocc) self.W_mn = np.dot(U_mm, self.W_mn) if self.W_mn is not None: self.gd.comm.broadcast(self.W_mn, 0) spos_mc = -np.angle(Z_mmv.diagonal()).T / (2 * pi) self.initial_pos_mv = np.dot(spos_mc % 1.0, self.gd.cell_cv)