Пример #1
0
 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()
Пример #2
0
 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()
Пример #3
0
 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
Пример #4
0
 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
Пример #5
0
    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)
Пример #6
0
    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)