from __future__ import print_function import numpy as np from ase.structure import molecule from gpaw import GPAW from gpaw.eigensolvers.rmm_diis_old import RMM_DIIS from gpaw.lcao.projected_wannier import get_lcao_projections_HSP atoms = molecule('C2H2') atoms.center(vacuum=3.0) calc = GPAW(gpts=(32, 32, 48), eigensolver=RMM_DIIS()) atoms.set_calculator(calc) atoms.get_potential_energy() V_qnM, H_qMM, S_qMM, P_aqMi = get_lcao_projections_HSP(calc, bfs=None, spin=0, projectionsonly=False) # Test H and S eig = np.linalg.eigvals(np.linalg.solve(S_qMM[0], H_qMM[0])).real eig.sort() eig_ref = np.array([ -17.87911292, -13.24864985, -11.43106707, -7.12558127, -7.12558127, 0.59294531, 0.59294531, 3.92526888, 7.45117399, 26.73466374 ]) print(eig) assert np.allclose(eig, eig_ref) # Test V Vref_nM = np.array([ [-0.845, -0., 0.39836, 0., -0.845, 0., -0.39836, -0., -0.40865, -0.40865],
def __init__(self, gpwfilename, fixedenergy=0., spin=0, ibl=True, basis='sz', zero_fermi=False, pwfbasis=None, lcaoatoms=None, projection_data=None): calc = GPAW(gpwfilename, txt=None, basis=basis) assert calc.wfs.gd.comm.size == 1 assert calc.wfs.kd.comm.size == 1 assert calc.wfs.bd.comm.size == 1 if zero_fermi: try: Ef = calc.get_fermi_level() except NotImplementedError: Ef = calc.get_homo_lumo().mean() else: Ef = 0.0 self.ibzk_kc = calc.get_ibz_k_points() self.nk = len(self.ibzk_kc) self.eps_kn = [ calc.get_eigenvalues(kpt=q, spin=spin) - Ef for q in range(self.nk) ] self.M_k = [sum(eps_n <= fixedenergy) for eps_n in self.eps_kn] print('Fixed states:', self.M_k) self.calc = calc self.dtype = self.calc.wfs.dtype self.spin = spin self.ibl = ibl self.pwf_q = [] self.norms_qn = [] self.S_qww = [] self.H_qww = [] if ibl: if pwfbasis is not None: pwfmask = basis_subset2(calc.atoms.get_chemical_symbols(), basis, pwfbasis) if lcaoatoms is not None: lcaoindices = get_bfi2(calc.atoms.get_chemical_symbols(), basis, lcaoatoms) else: lcaoindices = None self.bfs = get_bfs(calc) if projection_data is None: V_qnM, H_qMM, S_qMM, self.P_aqMi = get_lcao_projections_HSP( calc, bfs=self.bfs, spin=spin, projectionsonly=False) else: V_qnM, H_qMM, S_qMM, self.P_aqMi = projection_data H_qMM -= Ef * S_qMM for q, M in enumerate(self.M_k): if pwfbasis is None: pwf = ProjectedWannierFunctionsIBL(V_qnM[q], S_qMM[q], M, lcaoindices) else: pwf = PWFplusLCAO(V_qnM[q], S_qMM[q], M, pwfmask, lcaoindices) self.pwf_q.append(pwf) self.norms_qn.append(pwf.norms_n) self.S_qww.append(pwf.S_ww) self.H_qww.append( pwf.rotate_matrix(self.eps_kn[q][:M], H_qMM[q])) else: if projection_data is None: V_qnM = get_lcao_projections_HSP(calc, spin=spin) else: V_qnM = projection_data for q, M in enumerate(self.M_k): pwf = ProjectedWannierFunctionsFBL(V_qnM[q], M, ortho=False) self.pwf_q.append(pwf) self.norms_qn.append(pwf.norms_n) self.S_qww.append(pwf.S_ww) self.H_qww.append(pwf.rotate_matrix(self.eps_kn[q])) for S in self.S_qww: print('Condition number: %0.1e' % condition_number(S))
def __init__( self, gpwfilename, fixedenergy=0.0, spin=0, ibl=True, basis="sz", zero_fermi=False, pwfbasis=None, lcaoatoms=None, projection_data=None, ): calc = GPAW(gpwfilename, txt=None, basis=basis) assert calc.wfs.gd.comm.size == 1 assert calc.wfs.kpt_comm.size == 1 assert calc.wfs.band_comm.size == 1 if zero_fermi: try: Ef = calc.get_fermi_level() except NotImplementedError: Ef = calc.get_homo_lumo().mean() else: Ef = 0.0 self.ibzk_kc = calc.get_ibz_k_points() self.nk = len(self.ibzk_kc) self.eps_kn = [calc.get_eigenvalues(kpt=q, spin=spin) - Ef for q in range(self.nk)] self.M_k = [sum(eps_n <= fixedenergy) for eps_n in self.eps_kn] print "Fixed states:", self.M_k self.calc = calc self.dtype = self.calc.wfs.dtype self.spin = spin self.ibl = ibl self.pwf_q = [] self.norms_qn = [] self.S_qww = [] self.H_qww = [] if ibl: if pwfbasis is not None: pwfmask = basis_subset2(calc.atoms.get_chemical_symbols(), basis, pwfbasis) if lcaoatoms is not None: lcaoindices = get_bfi2(calc.atoms.get_chemical_symbols(), basis, lcaoatoms) else: lcaoindices = None self.bfs = get_bfs(calc) if projection_data is None: V_qnM, H_qMM, S_qMM, self.P_aqMi = get_lcao_projections_HSP( calc, bfs=self.bfs, spin=spin, projectionsonly=False ) else: V_qnM, H_qMM, S_qMM, self.P_aqMi = projection_data H_qMM -= Ef * S_qMM for q, M in enumerate(self.M_k): if pwfbasis is None: pwf = ProjectedWannierFunctionsIBL(V_qnM[q], S_qMM[q], M, lcaoindices) else: pwf = PWFplusLCAO(V_qnM[q], S_qMM[q], M, pwfmask, lcaoindices) self.pwf_q.append(pwf) self.norms_qn.append(pwf.norms_n) self.S_qww.append(pwf.S_ww) self.H_qww.append(pwf.rotate_matrix(self.eps_kn[q][:M], H_qMM[q])) else: if projection_data is None: V_qnM = get_lcao_projections_HSP(calc, spin=spin) else: V_qnM = projection_data for q, M in enumerate(self.M_k): pwf = ProjectedWannierFunctionsFBL(V_qnM[q], M, ortho=False) self.pwf_q.append(pwf) self.norms_qn.append(pwf.norms_n) self.S_qww.append(pwf.S_ww) self.H_qww.append(pwf.rotate_matrix(self.eps_kn[q])) for S in self.S_qww: print "Condition number: %0.1e" % condition_number(S)
import numpy as np from ase.data.molecules import molecule from gpaw import GPAW from gpaw.lcao.projected_wannier import get_lcao_projections_HSP atoms = molecule("C2H2") atoms.center(vacuum=3.0) calc = GPAW(gpts=(32, 32, 48)) atoms.set_calculator(calc) atoms.get_potential_energy() V_qnM, H_qMM, S_qMM, P_aqMi = get_lcao_projections_HSP(calc, bfs=None, spin=0, projectionsonly=False) # Test H and S eig = np.linalg.eigvals(np.linalg.solve(S_qMM[0], H_qMM[0])).real eig.sort() eig_ref = np.array( [ -17.87911292, -13.24864985, -11.43106707, -7.12558127, -7.12558127, 0.59294531, 0.59294531, 3.92526888, 7.45117399, 26.73466374, ]