Ejemplo n.º 1
0
 def Print_Gloc(self, print_at, TB):
     for at in print_at:
         Fileio.Print_complex_multilines(
             array([
                 self.Gloc[i]
                 for i in range(TB.idx[at][TB.TB_orbs[at][0]],
                                TB.idx[at][TB.TB_orbs[at][-1]] + 1)
             ]), self.ommesh, 'G_loc_' + at + '.out')
Ejemplo n.º 2
0
    emax = 5.0
    #rom=1000
    rom = int(sys.argv[1])

    execfile('INPUT.py')
    TB = Struct.TBstructure('POSCAR', p['atomnames'], p['orbs'])
    cor_at = p['cor_at']
    cor_orb = p['cor_orb']
    TB.Compute_cor_idx(cor_at, cor_orb)
    ommesh = linspace(emin, emax, rom)
    Sig_tot = zeros((TB.ncor_orb, rom), dtype=complex)
    for i, ats in enumerate(cor_at):
        (om, Sig, TrSigmaG, Epot, nf_q,
         mom) = Fileio.Read_complex_Data('Sig' + str(i + 1) + '.out')
        newSig = zeros((len(Sig), rom), dtype=complex)
        for ii in range(len(Sig)):
            SigSpline = interpolate.splrep(om, Sig[ii].real, k=1, s=0)
            newSig[ii, :] += interpolate.splev(ommesh, SigSpline)
            SigSpline = interpolate.splrep(om, Sig[ii].imag, k=1, s=0)
            newSig[ii, :] += 1j * interpolate.splev(ommesh, SigSpline)
        for at in ats:
            for ii, orbs in enumerate(cor_orb[i]):
                for orb in orbs:
                    idx = TB.idx[at][orb]
                    Sig_tot[idx, :] = copy.deepcopy(
                        newSig[ii, :])  # non spin polarized
#Sig_tot[idx,:]=copy.deepcopy(newSig[ii+len(cor_orb[i]),:])

    Fileio.Print_complex_multilines(Sig_tot, ommesh, 'SigMoo_real.out')
    #Fileio.Print_complex_multilines(Sig_tot,ommesh,'SigMoo_dn_real.out')
Ejemplo n.º 3
0
            main_out.flush()

            #for i in range(len(cor_at)):
            #   DMFT.sig_st[i][:]+=0.5*(DMFT.Nd_imp[i]-DMFT.Nd_latt[i])
            #DMFT.Impurity_Solver
            #if itt%3==0:

            om_loc, Delta = Fileio.Read_complex_multilines('Delta.out')
            loc_idx = -1
            for i, ats in enumerate(cor_at):
                Delta_loc = zeros((len(cor_orb[i]), len(om_loc)),
                                  dtype=complex)
                for j, orbs in enumerate(cor_orb[i]):
                    loc_idx += 1
                    Delta_loc[j, :] = copy.deepcopy(Delta[loc_idx, :])
                    Fileio.Print_complex_multilines(
                        Delta_loc, om_loc, 'Delta' + str(i + 1) + '.inp')
        # shutil.copy2('Delta.out','Delta1.inp')
            Ed = array([loadtxt('Ed.out')])
            if TB.LHF == '.FALSE.':
                IMP_SOLVER.RUN_CTQMC(p, pC, pD, it, itt, para_com, DMFT.mu, Ed,
                                     DMFT.Vdc)
            main_out.write('--- Impurity solver is finished ' + now() + '---')
            main_out.write('\n')
            main_out.flush()

            ################# Mix sig.inp ###############################3

            DMFT.Read_Sig(TB, p['nspin'])
            DMFT.Compute_Energy(DFT, TB, Ed)
            DMFT.Compute_Sigoo_and_Vdc(p, TB)
            DMFT.Mix_Sig_and_Print_sig_inp(TB, p['Nd_qmc'], p['mix_sig'],
Ejemplo n.º 4
0
    def Compute_Delta(self, T, nspin, cor_at, cor_orb, TB, nom, delta=0.0):
        #####  Store local Green function and local Self energy with equidistant mesh as a list type ##########
        ommesh, tot_GLOC = Fileio.Read_complex_multilines("G_loc.out")
        ommesh, tot_SIGLOC = Fileio.Read_complex_multilines("SigMoo.out")
        SIGMDC = loadtxt("SigMdc.out")
        if nspin == 2:
            ommesh, tot_GLOC_dn = Fileio.Read_complex_multilines("G_loc_dn.out")
            ommesh, tot_SIGLOC_dn = Fileio.Read_complex_multilines("SigMoo_dn.out")
            SIGMDC_dn = loadtxt("SigMdc_dn.out")
        DMFT_mu = loadtxt("DMFT_mu.out")
        tot_ed = loadtxt("Ed.out")
        #      tot_sig_st=loadtxt('Sig_st.out')
        ed = []
        GLOC = []
        SIGLOC = []
        for i, ats in enumerate(cor_at):
            GLOC.append([])
            SIGLOC.append([])
            ed.append([])
            # sig_st.append([])
            for j, orbs in enumerate(cor_orb[i]):
                Gf_avg = zeros(len(ommesh), dtype=complex)
                Sig_avg = zeros(len(ommesh), dtype=complex)
                ed_avg = 0.0
                # sigst_avg=0.0
                for at in ats:
                    for orb in orbs:
                        idx = TB.idx[at][orb]
                        Gf_avg += tot_GLOC[idx]
                        Sig_avg += tot_SIGLOC[idx] + SIGMDC[idx]
                        ed_avg += tot_ed[idx]
                        # sigst_avg+=DMFT.Sig_st[i][j]#tot_sig_st[idx]
                Gf_avg /= len(ats) * len(orbs)
                Sig_avg /= len(ats) * len(orbs)  # ;Sig_avg-=sig_st[i]
                ed_avg /= len(ats) * len(orbs)
                # sigst_avg/=len(ats)*len(orbs)
                GLOC[i].append(list(Gf_avg))
                SIGLOC[i].append(list(Sig_avg))
                ed[i].append(ed_avg)
                # sig_st[i].append(sigst_avg)
        if nspin == 2:
            GLOC_dn = []
            SIGLOC_dn = []
            for i, ats in enumerate(cor_at):
                GLOC_dn.append([])
                SIGLOC_dn.append([])
                for j, orbs in enumerate(cor_orb[i]):
                    Gf_avg = zeros(len(ommesh), dtype=complex)
                    Sig_avg = zeros(len(ommesh), dtype=complex)
                    for at in ats:
                        for orb in orbs:
                            idx = TB.idx[at][orb]
                            Gf_avg += tot_GLOC_dn[idx]
                            Sig_avg += tot_SIGLOC_dn[idx] + SIGMDC_dn[idx]
                    Gf_avg /= len(ats) * len(orbs)
                    Sig_avg /= len(ats) * len(orbs)  # ;Sig_avg-=sig_st[i]
                    GLOC_dn[i].append(list(Gf_avg))
                    SIGLOC_dn[i].append(list(Sig_avg))
        for i in range(len(GLOC)):
            if len(GLOC[i]) > 0:
                Delta_s = zeros((nspin * len(GLOC[i]), len(ommesh)), dtype=complex)
                for j in range(len(GLOC[i])):
                    Delta_s[j, :] = (
                        1j * ommesh
                        + DMFT_mu
                        - ed[i][j]
                        - array(SIGLOC[i][j])
                        + 1j * delta
                        - 1.0 / array(GLOC[i][j])
                    )
                if nspin == 2:
                    for j in range(len(GLOC[i])):
                        Delta_s[j + len(GLOC[i]), :] = (
                            1j * ommesh
                            + DMFT_mu
                            - ed[i][j]
                            - array(SIGLOC_dn[i][j])
                            + 1j * delta
                            - 1.0 / array(GLOC_dn[i][j])
                        )
            ######  Interpolate Delta ####
            ommesh_new = pi * T * (2 * arange(nom) + 1)

            Delta = Interpolate(ommesh, Delta_s, ommesh_new, 3)
            Fileio.Print_complex_multilines(
                Delta, ommesh_new, "Delta" + str(i + 1) + ".inp"
            )
        return DMFT_mu, ed  # ,sig_st
Ejemplo n.º 5
0
    def Mix_Sig_and_Print_sig_inp(self, TB, Nd_qmc, mix_sig, sig_file, nspin):
        fi = open(sig_file, "r")
        self.nom, self.ncor_orb = map(int, fi.readline()[16:].split())
        fi.readline()
        fi.readline()
        Sigoo_old = eval(fi.readline()[8:])
        Vdc_old = eval(fi.readline()[7:])
        fi.close()
        om, Sig_old = Fileio.Read_complex_multilines(sig_file, 5)
        sym_Sigoo = self.Symmetrize_orb(TB, self.Sigoo, nspin)
        sym_Sigoo_imp = self.Symmetrize_orb(TB, self.Sigoo_imp, nspin)
        sym_Vdc = []
        sym_Vdc_imp = []
        for i, ats in enumerate(self.cor_at):
            for j, orbs in enumerate(self.cor_orb[i]):
                sym_Vdc.append(self.Vdc[i])
                sym_Vdc_imp.append(self.Vdc_imp[i])
            if nspin == 2:
                for j, orbs in enumerate(self.cor_orb[i]):
                    sym_Vdc.append(self.Vdc[i])
                    sym_Vdc_imp.append(self.Vdc_imp[i])

        # print self.Sigoo_imp,sym_Sigoo_imp
        # print array(Sigoo_old),sym_Sigoo_imp
        if Nd_qmc == 1:
            new_Sigoo = array(Sigoo_old) + mix_sig * (
                array(sym_Sigoo_imp) - array(Sigoo_old)
            )
            new_Vdc = array(Vdc_old) + mix_sig * (array(sym_Vdc_imp) - array(Vdc_old))
        else:
            new_Sigoo = array(Sigoo_old) + mix_sig * (
                array(sym_Sigoo) - array(Sigoo_old)
            )
            new_Vdc = array(Vdc_old) + mix_sig * (array(sym_Vdc) - array(Vdc_old))
        # print new_Sigoo,new_Vdc
        self.SigMdc = new_Sigoo - new_Vdc
        # print self.SigMdc
        # print om, self.ommesh
        for i in range(len(self.Sig)):
            self.Sig[i, :] -= sym_Sigoo_imp[i]
        # print self.Sig
        if len(om) != len(self.ommesh):
            Sig_old = Interpolate(om, Sig_old, self.ommesh, 3)
            self.nom = len(self.ommesh)
        self.Sig = Sig_old + mix_sig * (self.Sig - Sig_old)
        # print self.Sig
        # print shape(self.Sig)
        header1 = "# nom,ncor_orb= " + str(self.nom) + " " + str(self.ncor_orb)
        header2 = "# T= %18.15f" % (self.T)  # +str(self.T)
        header3 = "# s_oo-Vdc= "
        for i in range(self.ncor_orb):
            header3 += "%18.15f " % (self.SigMdc[i])
        header4 = "# s_oo= " + str(new_Sigoo.tolist())
        header5 = "# Vdc= " + str(new_Vdc.tolist())
        # print header1
        # print header2
        # print header3
        # print header4
        # print header5
        Fileio.Print_complex_multilines(
            self.Sig,
            self.ommesh,
            "sig.inp",
            [header1, header2, header3, header4, header5],
        )
Ejemplo n.º 6
0
            Ed = []
            om_loc, Delta = Fileio.Read_complex_multilines("Delta.out")
            loc_idx = -1
            for i, ats in enumerate(cor_at):
                Delta_loc = zeros((len(cor_orb[i]) * p["nspin"], len(om_loc)),
                                  dtype=complex)
                Ed.append([])
                for ispin in range(p["nspin"]):
                    for j, orbs in enumerate(cor_orb[i]):
                        loc_idx += 1
                        print "---i:", i, " ", cor_at[
                            i], " ---loc_idx:", loc_idx
                        Ed[i].append(Ed_loc[loc_idx])
                        Delta_loc[j + ispin * len(cor_orb[i]), :] = deepcopy(
                            Delta[loc_idx, :])
                Fileio.Print_complex_multilines(Delta_loc, om_loc,
                                                "Delta" + str(i + 1) + ".inp")
            Ed = array(Ed)
            print "Ed:", Ed
            if TB.LHF == ".FALSE.":
                IMP_SOLVER.RUN_CTQMC(p, pC, pD, it, itt, para_com, DMFT.mu, Ed,
                                     DMFT.Vdc, args.hf)
            main_out.write("--- Impurity solver is finished " + now() + "---")
            main_out.write("\n")
            main_out.flush()

            ################# Mix sig.inp ###############################3

            DMFT.Read_Sig(TB, p["nspin"])
            DMFT.Compute_Energy(DFT, TB, Ed)
            DMFT.Compute_Sigoo_and_Vdc(p, TB)
            DMFT.Mix_Sig_and_Print_sig_inp(TB, p["Nd_qmc"], p["mix_sig"],
Ejemplo n.º 7
0
                    cmd = p[
                        'path_bin'] + "atom_d.py 'atom_d.inp' 2> atom_d.error || { echo 'ATOMD run failed!'; exit 1; }"
                    out, err = subprocess.Popen(
                        cmd,
                        shell=True,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE).communicate()
                    print out  #, err
                    cmd = 'cp UC.dat UC' + str(i + 1) + '.dat'
                    print os.popen(cmd).read()
                DMFT.Read_Sig(TB, p['nspin'])
                DMFT.Compute_HF(1, p, TB)
                DMFT.Cmp_Sig_highT(T_high, noms_high, p['nspin'])
                #DMFT.Mix_Sig(p['mix_sig'])
                if TB.LHF == '.FALSE.':
                    Fileio.Print_complex_multilines(DMFT.Sig, DMFT.ommesh,
                                                    'SigMoo.out')
                    if p['nspin'] == 2:
                        Fileio.Print_complex_multilines(
                            DMFT.Sig_dn, DMFT.ommesh, 'SigMoo_dn.out')
                    Fileio.Print_complex_multilines(DMFT.Sig_highT,
                                                    DMFT.ommesh_highT,
                                                    'SigMoo_highT.out')
                    if p['nspin'] == 2:
                        Fileio.Print_complex_multilines(
                            DMFT.Sig_dn_highT, DMFT.ommesh_highT,
                            'SigMoo_dn_highT.out')

                if (os.path.exists('SigMdc.out')):
                    pass
                else:
                    fi = open('SigMdc.out', 'w')
Ejemplo n.º 8
0
    def interpol(self, emin, emax, rom, broaden, dest_dir, sp=False):
        """
		This performs the interpolation of points on the real axis.
		"""
        print("\nInterpolating points on real axis...")
        headerline = 2
        om, Sig = Fileio.Read_complex_multilines("./ac/Sig.out", headerline)
        s_oo = None
        Vdc = None
        # The exec() function doesn't work properly on Python3 so I had to use a workaround:
        fi = open("./ac/Sig.out", "r")
        line1 = fi.readline()
        s_oo = re.findall(r"\s*([0-9.+-]*)", line1)
        while "" in s_oo:
            s_oo.remove("")
        line2 = fi.readline()
        Vdc = re.findall(r"\s*([0-9.+-]*)", line2)
        while "" in Vdc:
            Vdc.remove("")

            # exec(ar[0])
            # m=re.search('#(.*)',line)
            # exec(m.group(1).strip())
        # s_oo_Vdc=np.array(s_oo)-array(Vdc)
        fi.close()
        s_oo_Vdc = np.array((np.array(s_oo)).astype(np.float)) - np.array(
            (np.array(Vdc)).astype(np.float))

        ommesh = np.linspace(emin, emax, rom)

        # non spin polarized case
        if sp == False:

            Sig_tot = np.zeros((len(Sig), rom), dtype=complex)

            for i in range(len(Sig)):
                SigSpline = interpolate.splrep(om, Sig[i].real, k=1, s=0)
                Sig_tot[i, :] += interpolate.splev(ommesh, SigSpline)
                SigSpline = interpolate.splrep(om, Sig[i].imag, k=1, s=0)
                Sig_tot[i, :] += 1j * interpolate.splev(ommesh, SigSpline)

            header1 = "# nom,ncor_orb= " + str(len(ommesh)) + " " + str(
                len(Sig_tot))
            # header2='# T= %18.15f'%(1.0/pC['beta'][0])#+str(self.T)
            header2 = "# T= %18.15f" % (broaden)  # +str(self.T)
            header3 = "# s_oo-Vdc= "
            for i in range(len(s_oo_Vdc)):
                header3 += "%18.15f " % (s_oo_Vdc[i])
            header4 = "# s_oo= " + str(s_oo)
            header5 = "# Vdc= " + str(Vdc)
            if dest_dir == "dos":
                Fileio.Print_complex_multilines(
                    Sig_tot,
                    ommesh,
                    "./dos/sig.inp_real",
                    [header1, header2, header3, header4, header5],
                )

            # create sig.inp_real
            if dest_dir == "bands":
                Fileio.Print_complex_multilines(
                    Sig_tot,
                    ommesh,
                    "./bands/sig.inp_real",
                    [header1, header2, header3, header4, header5],
                )

        # Spin polarized calculation
        if sp:

            Sig_tot = np.zeros((int(len(Sig) / 2), rom), dtype=complex)
            Sig_tot_dn = np.zeros((int(len(Sig) / 2), rom), dtype=complex)

            for i in range(int(len(Sig) / 2)):
                # spin
                SigSpline = interpolate.splrep(om, Sig[i].real, k=1, s=0)
                Sig_tot[i, :] += interpolate.splev(ommesh, SigSpline)
                SigSpline = interpolate.splrep(om, Sig[i].imag, k=1, s=0)
                Sig_tot[i, :] += 1j * interpolate.splev(ommesh, SigSpline)

                # spin down
                SigSpline = interpolate.splrep(om,
                                               Sig[i + int(len(Sig) / 2)].real,
                                               k=1,
                                               s=0)
                Sig_tot_dn[i, :] += interpolate.splev(ommesh, SigSpline)
                SigSpline = interpolate.splrep(om,
                                               Sig[i + int(len(Sig) / 2)].imag,
                                               k=1,
                                               s=0)
                Sig_tot_dn[i, :] += 1j * interpolate.splev(ommesh, SigSpline)

            header1 = "# nom,ncor_orb= " + str(len(ommesh)) + " " + str(
                len(Sig_tot))
            header2 = "# T= %18.15f" % (broaden)
            header3 = "# s_oo-Vdc= "
            header3_dn = "# s_oo-Vdc= "
            for i in range(int(len(s_oo_Vdc) / 2)):
                header3 += "%18.15f " % (s_oo_Vdc[i])
                header3_dn += "%18.15f " % (s_oo_Vdc[i +
                                                     int(len(s_oo_Vdc) / 2)])
            header4 = "# s_oo= " + str(s_oo[0:int(len(s_oo) / 2)])
            header4_dn = "# s_oo= " + str(s_oo[int(len(s_oo) / 2):])
            header5 = "# Vdc= " + str(Vdc[0:int(len(Vdc) / 2)])
            header5_dn = "# Vdc= " + str(Vdc[int(len(Vdc) / 2):])

            if dest_dir == "dos":
                Fileio.Print_complex_multilines(
                    Sig_tot,
                    ommesh,
                    "./dos/sig.inp_real",
                    [header1, header2, header3, header4, header5],
                )
                Fileio.Print_complex_multilines(
                    Sig_tot_dn,
                    ommesh,
                    "./dos/sig.inp_real_dn",
                    [header1, header2, header3_dn, header4_dn, header5_dn],
                )

            # create sig.inp_real
            if dest_dir == "bands":
                Fileio.Print_complex_multilines(
                    Sig_tot,
                    ommesh,
                    "./bands/sig.inp_real",
                    [header1, header2, header3, header4, header5],
                )
                Fileio.Print_complex_multilines(
                    Sig_tot_dn,
                    ommesh,
                    "./bands/sig.inp_real_dn",
                    [header1, header2, header3_dn, header4_dn, header5_dn],
                )

        print("Interpolation complete.\n")
Ejemplo n.º 9
0
    om, Sig = Fileio.Read_complex_multilines('Sig.out', headerline)
    s_oo = None
    Vdc = None
    fi = open('Sig.out', 'r')
    for i in range(headerline):
        line = fi.readline()
        m = re.search('#(.*)', line)
        exec(m.group(1).strip())
    s_oo_Vdc = array(s_oo) - array(Vdc)

    ommesh = linspace(emin, emax, rom)
    Sig_tot = zeros((len(Sig), rom), dtype=complex)
    for i in range(len(Sig)):
        SigSpline = interpolate.splrep(om, Sig[i].real, k=1, s=0)
        Sig_tot[i, :] += interpolate.splev(ommesh, SigSpline)
        SigSpline = interpolate.splrep(om, Sig[i].imag, k=1, s=0)
        Sig_tot[i, :] += 1j * interpolate.splev(ommesh, SigSpline)

    header1 = '# nom,ncor_orb= ' + str(len(ommesh)) + ' ' + str(len(Sig_tot))
    #header2='# T= %18.15f'%(1.0/pC['beta'][0])#+str(self.T)
    header2 = '# T= %18.15f' % (broaden)  #+str(self.T)
    header3 = '# s_oo-Vdc= '
    for i in range(len(s_oo_Vdc)):
        header3 += '%18.15f ' % (s_oo_Vdc[i])
    header4 = '# s_oo= ' + str(s_oo)
    header5 = '# Vdc= ' + str(Vdc)

    Fileio.Print_complex_multilines(
        Sig_tot, ommesh, 'sig.inp_real',
        [header1, header2, header3, header4, header5])