def loop_bandwidth(w, simval, beta, seed='mott gap'): """Solves IPT dimer and return Im Sigma_AA, Re Simga_AB returns list len(betarange) x 2 Sigma arrays """ s = [] g = [] dw = w[1] - w[0] gss = gf.semi_circle_hiltrans(w + 5e-3j - 1.3) gsa = gf.semi_circle_hiltrans(w + 5e-3j + 1.3) nfp = dos.fermi_dist(w, beta) for U, D, tp in simval: print('D: ', D, 'tp/U: ', tp, 'Beta', beta) (gss, gsa), (ss, sa) = ipt.dimer_dmft(U, tp, nfp, w, dw, gss, gsa, conv=1e-4, t=(D / 2)) g.append((gss, gsa)) s.append((ss, sa)) return np.array(g), np.array(s), nfp
def loop_bandwidth(drange, tp, beta, seed='mott gap'): """Solves IPT dimer and return Im Sigma_AA, Re Simga_AB returns list len(betarange) x 2 Sigma arrays """ s = [] g = [] w = np.linspace(-6, 6, 2**13) dw = w[1] - w[0] gssi = gf.semi_circle_hiltrans(w + 5e-3j - tp - 1) gsai = gf.semi_circle_hiltrans(w + 5e-3j + tp + 1) nfp = gf.fermi_dist(w, beta) for D in drange: print('D/U: ', D, 'tp/U: ', tp, 'Beta', beta) (gss, gsa), (ss, sa) = ipt.dimer_dmft(1, tp, nfp, w, dw, gssi, gssi, conv=1e-2, t=(D / 2)) g.append((gss, gsa)) s.append((ss, sa)) return np.array(g), np.array(s), w, nfp
def dimer_solver(w, dw, tp, U, nfp, gss, gsa, t=0.5, eta=3e-3j): # Self consistency in diagonal basis g0ss = 1 / (w + eta - tp - t * t * gss) g0sa = 1 / (w + eta + tp - t * t * gsa) # Rotate to local basis A0d = -0.5 * (g0ss + g0sa).imag / np.pi A0o = -0.5 * (g0ss - g0sa).imag / np.pi # Cleaning for PH and half-fill A0d = 0.5 * (A0d + A0d[::-1]) A0o = 0.5 * (A0o - A0o[::-1]) # * tp # Second order diagram isd = sigma(A0d, nfp, U) * dw * dw iso = sigma(A0o, nfp, U) * dw * dw # Rotate to diagonal basis iss = isd + iso isa = isd - iso # Kramers-Kronig relation, uses Fourier Transform to speed convolution rss = -signal.hilbert(iss, len(iss) * 4)[:len(iss)].imag rsa = -signal.hilbert(isa, len(isa) * 4)[:len(isa)].imag # Semi-circle Hilbert Transform ss = rss - 1j * np.abs(iss) gss = gf.semi_circle_hiltrans(w - tp - ss, 2 * t) sa = rsa - 1j * np.abs(isa) gsa = gf.semi_circle_hiltrans(w + tp - sa, 2 * t) return (gss, gsa), (ss, sa)
def plot_low_energy(u_int, tp): gss = gf.semi_circle_hiltrans(w + 5e-3j) gsa = gf.semi_circle_hiltrans(w + 5e-3j) (gss, _), (ss, _) = ipt_real.dimer_dmft(u_int, tp, nfp, w, dw, gss, gsa, conv=1e-3) quas_z, sig_0, dw_sig0 = low_en_qp(ss) tpp = (tp + sig_0) * quas_z ax = plt.subplot(111) ax.plot(w, -gss.imag, 'C0') llg = gf.semi_circle_hiltrans(w + 1e-8j - tpp, quas_z) * quas_z ax.plot(w, -llg.imag, "C3--", lw=2) plt.title(r'$U={}$; $t_\perp={}$'.format(u_int, tp), fontsize=14) plt.ylabel(r'$-\Im m G_{AB}(\omega)$') plt.xlim(-2.3, 2.3) plt.ylim(0, 2.5) plt.xlabel(r'$\omega$') plt.arrow(0, 2, tpp, 0, shape='right', width=0.05, length_includes_head=True, head_width=0.1, head_length=0.1) plt.text(0, 2.1, r"$\tilde{t}_\perp$", color="C0", size=26) plt.arrow(tpp, 0, -quas_z, 0, shape='left', width=0.05, length_includes_head=True, head_width=0.1, head_length=0.1) plt.arrow(tpp, 0, quas_z, 0, shape='right', width=0.05, length_includes_head=True, head_width=0.1, head_length=0.1) plt.text(tpp, 0.1, r"$2\tilde{D}$", color="C0", size=26)
def test_hilbert_trans_func(halfbandwidth): """Test Hilbert transforms of semi-circle""" # Match in the 2 forms w_n = gf.matsubara_freq(200) giw = gf.greenF(w_n, sigma=-1j / w_n, mu=-0.2, D=halfbandwidth) ss = gf.semi_circle_hiltrans(1j * w_n - .2 + 1j / w_n, D=halfbandwidth) assert np.allclose(ss, giw) # corresponds to semi-circle w = np.linspace(-3, 3, 2**9) ss = gf.semi_circle_hiltrans(w + 1e-5j, D=halfbandwidth) assert np.allclose(dos.bethe_lattice(w, halfbandwidth / 2), -ss.imag / np.pi, atol=1e-4)
def plot_spectral(u_int, tp, BETA, seed, w, w_set, pole, sty, ax): siw_d, siw_o, w_n = ipt_u_tp(u_int, tp, BETA, seed) ss, _ = dimer.pade_diag(siw_d, siw_o, w_n, w_set, w) gst = gf.semi_circle_hiltrans(w - tp - (ss.real - 1j * np.abs(ss.imag))) plot_pole_eq(w, gst, ss, pole, sty, ax)
def plot_spectral(omega, tp, gss, ss, axes, xlim): (axsg, axgf, axsd) = axes quas_z, sig_0, dw_sig0 = low_en_qp(ss) tpp = (tp + sig_0) * quas_z axgf.plot(-gss.imag / np.pi, omega, 'C0') llg = gf.semi_circle_hiltrans(omega + 1e-8j - tpp, quas_z) * quas_z axgf.plot(-llg.imag / np.pi, omega, "C3--", lw=2) axgf.invert_xaxis() axgf.set_xlabel(r'$A_{AB}(\omega)$') plt.xticks(rotation=40) # plt.plot(omega, gst.real) axsg.plot(ss.real, omega, 'C4', label=r'$\Re e$') axsg.plot(ss.imag, omega, 'C2', label=r'$\Im m$') axsg.plot(sig_0 + dw_sig0 * omega, omega, 'k:') axsg.legend(loc=2) axsg.invert_xaxis() axsg.set_ylabel(r'$\omega$') axsg.set_xlabel(r'$\Sigma_{AB}(\omega)$') axsg.set_xlim(*xlim) eps_k = np.linspace(-1., 1., 61) lat_gfs = 1 / np.add.outer(-eps_k, omega - tp - ss + 0.007j) Aw = -lat_gfs.imag / np.pi x, y = np.meshgrid(eps_k, omega) axsd.pcolormesh(x, y, Aw.T, cmap=plt.get_cmap(r'viridis'), vmin=0, vmax=2) axsd.plot(eps_k, eps_k * quas_z + tpp, "C3--") axsd.set_ylim([-2.3, 2.3]) axsd.set_xlabel(r'$\epsilon$')
def ipt_g_s(u_int, tp, BETA, seed, w): giw_d, giw_o, siw_d, siw_o, w_n = ipt_u_tp(u_int, tp, BETA, seed) w_set = np.arange(0, 541, 4) ss = gf.pade_continuation(1j * siw_d.imag + siw_o.real, w_n, w + 0.0005j, w_set) # A-bond gst = gf.semi_circle_hiltrans(w - tp - (ss.real - 1j * np.abs(ss.imag))) return gst, ss, w
def plot_spectral(omega, tp, sa, axes, ylim): (axgf, axsg) = axes quas_z, sig_0, dw_sig0 = low_en_qp(sa) tpp = (tp - sig_0) * quas_z gsa = gf.semi_circle_hiltrans(w + tp - sa) axgf.plot(omega, -gsa.imag / np.pi, 'C0') llg = gf.semi_circle_hiltrans(omega + 1e-8j + tpp, quas_z) * quas_z axgf.plot(omega, -llg.imag / np.pi, "C3--", lw=2) axgf.tick_params(left='on', right='on') # plt.plot(omega, gst.real) axsg.plot(omega, sa.real, 'C4', label=r'$\Re e$') axsg.plot(omega, sa.imag, 'C2-.', label=r'$\Im m$') axsg.legend(loc=2, ncol=2) axsg.set_ylim(*ylim) axsg.tick_params(left='on', right='on') axsg.axhline(0, color='k', lw=0.2)
def plot_row(urange, tp, lss, ax, labelx): for i, (U, ss) in enumerate(zip(urange, lss)): gss = gf.semi_circle_hiltrans(w - tp - ss) imgss = -gss.imag imgsa = imgss[::-1] quas_z, sig_0, dw_sig0 = low_en_qp(ss) tpp = (tp + sig_0) * quas_z llg = gf.semi_circle_hiltrans(w + 1e-8j - tpp, quas_z) * quas_z ax[i].plot(w / quas_z, imgsa, 'C0', lw=2) ax[i].plot(w / quas_z, imgss, 'C1-.', lw=2) ax[i].plot(w / quas_z, (imgss + imgsa) / 2, 'k:', lw=0.5) ax[i].plot(w / quas_z, -llg.imag, "C3--", lw=1.5) ax[i].text(labelx, 1.7, "$Z={:.3}$".format(quas_z), size=16) ax[i].text(1.5, 1.7, "$U={}$".format(U), size=16) ax[i].set_yticks(np.arange(3)) ax[i].set_xticks(np.arange(-3, 4)) ax[i].set_xlabel(r'$\omega/ZD$') ax[i].set_xlim([-2.5, 2.5]) ax[i].set_ylim([0, 2.4])
def loop_beta(u_int, tp, betarange, seed='mott gap'): """Solves IPT dimer and return Im Sigma_AA, Re Simga_AB returns list len(betarange) x 2 Sigma arrays """ s = [] g = [] w = np.linspace(-6, 6, 2**13) dw = w[1] - w[0] gss = gf.semi_circle_hiltrans(w + 5e-3j - tp - 1) gsa = gf.semi_circle_hiltrans(w + 5e-3j + tp + 1) for beta in betarange: print('U: ', u_int, 'tp: ', tp, 'Beta', beta) nfp = dos.fermi_dist(w, beta) (gss, gsa), (ss, sa) = ipt.dimer_dmft(u_int, tp, nfp, w, dw, gss, gsa) g.append((gss, gsa)) s.append((ss, sa)) return np.array(g), np.array(s)
def plot_spectral(w, tp, ss, ax, ylim, low_en): quas_z, sig_0, dw_sig0 = low_en tpp = (tp + sig_0) * quas_z gss = gf.semi_circle_hiltrans(w + 1e-8j - tp - ss) llg = gf.semi_circle_hiltrans(w + 1e-8j - tpp, quas_z) * quas_z ax[0].plot(w, -gss.imag, "C1-", lw=2) ax[0].plot(w, -llg.imag, "C3--", lw=2) ax[0].set_title(r'$\beta={}$; $U={}$; $t_\perp={}$'.format(BETA, U, tp), fontsize=14) ax[0].text(0.05, 0.75, r'$Z={:.3}$'.format(quas_z) + '\n' + r'$\tilde{{t}}_\perp={:.3f}$'.format(tpp), transform=ax[0].transAxes, fontsize=14) ax[1].plot(w, ss.real, 'C4', label=r'$\Re e$') ax[1].plot(w, ss.imag, 'C2', label=r'$\Im m$') ax[1].plot(w, sig_0 + dw_sig0 * w, 'k:') ax[1].set_xlim(-2, 2) ax[1].set_ylim(*ylim)
def ss_dmft_loop(gloc, w, u_int, beta, conv): """DMFT Loop for the single band Hubbard Model at Half-Filling Parameters ---------- gloc : complex 1D ndarray local Green's function to use as seed w : real 1D ndarray real frequency points u_int : float On site interaction, Hubbard U beta : float Inverse temperature conv : float convergence criteria Returns ------- gloc : complex 1D ndarray DMFT iterated local Green's function sigma : complex 1D ndarray DMFT iterated self-energy """ dw = w[1] - w[0] eta = 2j * dw nf = gf.fermi_dist(w, beta) converged = False while not converged: gloc_old = gloc.copy() # Self-consistency g0 = 1 / (w + eta - .25 * gloc) # Spectral-function of Weiss field A0 = -g0.imag / np.pi # Second order diagram isi = ph_hf_sigma(A0, nf, u_int) * dw * dw isi = 0.5 * (isi + isi[::-1]) # Kramers-Kronig relation, uses Fourier Transform to speed convolution hsi = -signal.hilbert(isi, len(isi) * 4)[:len(isi)].imag sigma = hsi + 1j * isi # Semi-circle Hilbert Transform gloc = gf.semi_circle_hiltrans(w - sigma) converged = np.allclose(gloc, gloc_old, atol=conv) return gloc, sigma
def plot_spectra(u_int, tp, beta, w, w_set, eps_k, axes): pdm, pam, pdi, pai = axes x, y = np.meshgrid(eps_k, w) # metal siw_d, siw_o, w_n = ipt_u_tp(u_int, tp, beta, 'met') Aw, ss, sa = calculate_Aw(siw_d, siw_o, w_n, w_set, w, eps_k, tp) Aw = np.clip(Aw, 0, 1,) pdm.pcolormesh(x, y, Aw.T, cmap=plt.get_cmap(r'inferno')) gsts = gf.semi_circle_hiltrans(w - tp - (ss.real - 1j * np.abs(ss.imag))) gsta = gf.semi_circle_hiltrans(w + tp - (sa.real - 1j * np.abs(sa.imag))) gloc = 0.5 * (gsts + gsta) pam.plot(-gloc.imag / np.pi, w) # insulator siw_d, siw_o, w_n = ipt_u_tp(u_int, tp, beta, 'ins') Aw, ss, sa = calculate_Aw(siw_d, siw_o, w_n, w_set, w, eps_k, tp) Aw = np.clip(Aw, 0, 1,) pdi.pcolormesh(x, y, Aw.T, cmap=plt.get_cmap(r'inferno')) gsts = gf.semi_circle_hiltrans(w - tp - (ss.real - 1j * np.abs(ss.imag))) gsta = gf.semi_circle_hiltrans(w + tp - (sa.real - 1j * np.abs(sa.imag))) gloc = 0.5 * (gsts + gsta) pai.plot(-gloc.imag / np.pi, w)
def hubbard_aprox(U, dmu, omega): mu = U / 2 + dmu n = 1. for _ in range(10): sigma = n * U / 2 + n / 2 * (1 - n / 2) * \ U**2 / (omega + 0.05j + mu - (1 - n / 2) * U) gloc = gf.semi_circle_hiltrans(omega + mu - sigma) dos = -gloc.imag / np.pi n = 2 * trapz(dos * (omega < 0), omega) print('n_new', n) plt.plot(omega, -gloc.imag)
def plot_spectral(w, U, tp, gss, ss, ax): quas_z, sig_0, dw_sig0 = low_en_qp(ss) tpp = (tp + sig_0) * quas_z ax[0].plot(w, -gss.imag, 'C0') llg = gf.semi_circle_hiltrans(w + 1e-8j - tpp, quas_z) * quas_z ax[0].plot(w, -llg.imag, "C3--", lw=2) ax[0].text(0.05, 0.72, r'$Z={:.3}$'.format(quas_z) + '\n' + r'$\tilde{{t}}_\perp={:.2f}$'.format(tpp), transform=ax[0].transAxes, fontsize=14) for a in ax: a.set_title(r'$U={}$; $t_\perp={}$'.format(U, tp), fontsize=14) # plt.plot(w, gst.real) ax[1].plot(w, ss.real, 'C4', label=r'$\Re e$') ax[1].plot(w, ss.imag, 'C2', label=r'$\Im m$') ax[1].plot(w, sig_0 + dw_sig0 * w, 'k:') ax[0].set_ylim(0, 2) ax[0].set_yticks([0, 1, 2]) ax[0].set_yticklabels([0, 1, 2]) ax[1].legend(loc=2) ax[1].set_ylim(-1, 0.75) ax[0].set_xlim([-2.5, 2.5]) ax[1].set_xlim([-2.5, 2.5])
def ipt_u_tp(urange, tp, beta, w): tau, w_n = gf.tau_wn_setup(dict(BETA=beta, N_MATSUBARA=2**11)) giw_d, giw_o = dimer.gf_met(w_n, 0., tp, 0.5, 0.) w_set = list(np.arange(0, 120, 2)) w_set = w_set + list(np.arange(120, 512, 8)) imgss = [] for u_int in urange: giw_d, giw_o, loops = dimer.ipt_dmft_loop(beta, u_int, tp, giw_d, giw_o, tau, w_n, 1e-9) g0iw_d, g0iw_o = dimer.self_consistency(1j * w_n, 1j * giw_d.imag, giw_o.real, 0., tp, 0.25) siw_d, siw_o = ipt_imag.dimer_sigma(u_int, tp, g0iw_d, g0iw_o, tau, w_n) ss = gf.pade_continuation(1j * siw_d.imag + siw_o.real, w_n, w + 0.0005j, w_set) # A-bond imgss.append( gf.semi_circle_hiltrans(w - tp - (ss.real - 1j * np.abs(ss.imag)))) return imgss
def plot_dispersions(giw_s, sigma_iw, ur, tp, w_n, w, w_set): for U, (giw_d, giw_o), (sig_d, sig_o) in zip(ur, giw_s, sigma_iw): gs, ga = dimer.pade_diag(giw_d, giw_o, w_n, w_set, w) ss, sa = dimer.pade_diag(sig_d, sig_o, w_n, w_set, w) gst = gf.semi_circle_hiltrans(w - tp - (ss.real - 1j * np.abs(ss.imag))) lat_gfs = 1 / np.add.outer(-eps_k, w - tp + 5e-3j - ss) lat_gfa = 1 / np.add.outer(-eps_k, w + tp + 5e-3j - sa) #Aw = np.clip(-.5 * (lat_gfa + lat_gfs).imag / np.pi, 0, 2) Aw = np.clip(-lat_gfs.imag / np.pi, 0, 2) title = r'IPT lattice dimer $U={}$, $t_\perp={}$, $\beta={}$'.format( U, tp, BETA) ax = plot_greenfunct(w, gs, title, r'$G$') plot_greenfunct(w, gst, title, r'$G$', ax) plot_greenfunct(w, 1 / (w - tp - .25 * gst), title, r'$G0$', ax) ax = plot_greenfunct(w, ss, title, r'$\Sigma$') plot_pole_eq(w, gst, ss, title) plot_band_dispersion(w, Aw, title, eps_k)
hyb = sim.hyb_V() hyb = (hyb + old) / 2 convergence = np.abs(old - hyb) < 1e-5 print(U, hyb, sim.ocupations()) sim.solve(U / 2, U, hyb) hyb = sim.hyb_V() plt.plot(sim.omega, sim.GF[r'$\Sigma$']) plt.plot(sim.omega, sim.GF[r'Imp G']) w = sim.omega s = sim.GF[r'$\Sigma$'] g = sim.GF['Imp G'] ra = w + sim.mu - s rho = dos.bethe_lattice(ra, sim.t) plt.plot(w, rho) g = gf.semi_circle_hiltrans(ra + 0.01j) plt.plot(w, g.imag) plt.figure() eps_k = np.linspace(-1., 1., 61) lat_gfs = 1 / np.add.outer(-eps_k, ra + 0.01j) Aw = np.clip( -lat_gfs.imag / np.pi, 0, 2, ) x, y = np.meshgrid(eps_k, w) plt.pcolormesh(x, y, Aw.T, cmap=plt.get_cmap(r'viridis'), vmin=0, vmax=2)
plt.plot(w, (U**2 / 4 / g0_1).imag, label=r"Imag") plt.ylabel(r'$\Sigma(\omega)$') plt.xlabel(r'$\omega$') plt.title(r'$\Sigma(\omega)$ at $U= {}$'.format(U)) plt.legend(loc=0) plt.ylim([-1.5, 1]) ############################################################################### # The Green Function # ------------------ plt.figure() plt.plot(w, (1 / (w - U**2 / 4 / g0_1)).real, label=r"Real") plt.plot(w, (1 / (w - U**2 / 4 / g0_1)).imag, label=r"Imag") plt.plot(w, (gf.semi_circle_hiltrans(w - U**2 / 4 / g0_1)).imag, label=r"Imag") plt.ylabel(r'$G(\omega)$') plt.xlabel(r'$\omega$') plt.title(r'$G(\omega)$ at $U= {}$'.format(U)) plt.legend(loc=0) ############################################################################### # The Band Dispersion # ------------------- eps_k = np.linspace(-1, 1, 61) lat_gf = 1 / (np.add.outer(-eps_k, w + 8e-2j) - U**2 / 4 / g0_1) Aw = -lat_gf.imag / np.pi plot_band_dispersion(w, Aw, 'Hubbard III band dispersion', eps_k)
import dmft.common as gf import dmft.ipt_real as ipt w = np.linspace(-4, 4, 2**12) dw = w[1] - w[0] beta = 800. nfp = gf.fermi_dist(w, beta) ############################################################################### # The :math:`t_\perp/D=0.3` scenario # ================================== # tp = 0.3 gss = gf.semi_circle_hiltrans(w + 5e-3j - tp) gsa = gf.semi_circle_hiltrans(w + 5e-3j + tp) urange = np.arange(0.2, 3.3, 0.3) urange = [0.2, 1., 2., 3., 3.47, 3.5] plt.close('all') for i, U in enumerate(urange): (gss, gsa), (ss, sa) = ipt.dimer_dmft(U, tp, nfp, w, dw, gss, gsa, conv=1e-4) shift = -2.1 * i plt.plot(w, shift + -gss.imag, 'C0', lw=0.5)
ax[1].set_ylim(-1, 0.75) ax[0].set_xlim([-2.5, 2.5]) ax[1].set_xlim([-2.5, 2.5]) w = np.linspace(-4, 4, 2**12) dw = w[1] - w[0] BETA = 512. nfp = gf.fermi_dist(w, BETA) plt.close('all') fig_g, axg = plt.subplots(2, 1, sharex=True, sharey=True) fig_s, axs = plt.subplots(2, 1, sharex=True, sharey=True) gss = gf.semi_circle_hiltrans(w + 5e-3j) gsa = gf.semi_circle_hiltrans(w + 5e-3j) U, TP = 1.66, 0.64 gss, ss, w = ipt_g_s(U, TP, BETA, 'met', w) plot_spectral(w, U, TP, gss, ss, (axg[0], axs[0])) gss, ss, w = ipt_g_s(U, TP, BETA, 'ins', w) plot_spectral(w, U, TP, gss, ss, (axg[1], axs[1])) for b in axg: b.set_ylabel(r'$-\Im m G_{AB}(\omega)$') # for b in axs: b.set_ylabel(r'$\Sigma_{AB}(\omega)$')
w_set = np.concatenate((np.arange(80), np.arange(80, 150, 5))) gwst0 = gf.pade_continuation(1j * giw_dt0.imag + giw_ot0.real, w_n, w, w_set) swst0 = gf.pade_continuation(1j * siw_dt0.imag + siw_ot0.real, w_n, w, w_set) gwst03 = gf.pade_continuation(1j * giw_dt03.imag + giw_ot03.real, w_n, w, w_set) swst03 = gf.pade_continuation(1j * siw_dt03.imag + siw_ot03.real, w_n, w, w_set) fig, axes = plt.subplots(3, 2, sharex=True) fig.subplots_adjust(hspace=0, wspace=0.0) for gamma in [0, 0.1, .25, .5]: swt0 = swst0.real - 1j * np.abs(swst0.imag) - gamma * 1j swt03 = swst03.real - 1j * np.abs(swst03.imag) - gamma * 1j plot_gf(gf.semi_circle_hiltrans(w - swt0), swt0, axes[:, 0]) gf03 = gf.semi_circle_hiltrans(w - 0.3 - swt03) gf03 = .5 * (gf03 + gf03[::-1]) sst03 = .5 * (swt03 - swt03[::-1].conj()) plot_gf(gf03, sst03, axes[:, 1]) axes[0, 0].set_ylabel(r'$A_{sym}(\omega)$') axes[1, 0].set_ylabel(r'$\Re e \Sigma_{sym}(\omega)$') axes[2, 0].set_ylabel(r'$-\Im m \Sigma_{sym}(\omega)$') for ax, lim in zip(axes, [[0, 1], [-8, 8], [0, 3]]): ax[0].set_ylim(lim) ax[0].set_yticks([]) ax[1].set_ylim(lim)
plt.xticks(np.linspace(-3, 3, 13)) plt.figure() swo = gf.pade_continuation(siw_o.real, w_n, w, w_set) plt.plot(w, swo.real, label=r"$\Re e \Sigma_{12}$") plt.plot(w, swo.imag, label=r"$\Im m \Sigma_{12}$") plt.legend(loc=0) plt.ylim([-3, 3]) plt.xlabel(r"$\omega$") plt.ylabel(r"$\Sigma_{12}(\omega)$") plt.title(title) plt.xticks(np.linspace(-3, 3, 13)) ############################################################################### # Reconstruction GAB = gf.semi_circle_hiltrans(w + 1e-2j - tp - (swd + swo)) G_B = gf.semi_circle_hiltrans(w + 1e-2j + tp - (swd - swo)) backl = .5 * (GAB + G_B) plt.figure() plt.plot(w, gwd.imag, label=r"$\Im m G_{11} ref$") plt.plot(w, backl.real, label=r"$\Re e G_{11}$") plt.plot(w, backl.imag, label=r"$\Im m G_{11}$") plt.legend(loc=0) plt.ylim([-2, 2]) plt.xlabel(r"$\omega$") plt.ylabel(r"$G_{11}(\omega)$") plt.title(title) plt.xticks(np.linspace(-3, 3, 13)) backo = .5 * (GAB - G_B)
=================================== Using a real frequency IPT solver follow the spectral function along the metal to insulator transition. """ from __future__ import division, absolute_import, print_function import numpy as np import matplotlib.pylab as plt import dmft.common as gf import dmft.ipt_real as ipt w = np.linspace(-4, 4, 2**12) gloc = gf.semi_circle_hiltrans(w + 1e-3j) urange = [0.2, 1., 2., 3., 3.5, 4.] plt.close('all') for i, U in enumerate(urange): gloc, sigma_loc = ipt.ss_dmft_loop(gloc, w, U, 400, 1e-5) plt.gca().set_prop_cycle(None) shift = -2.1 * i plt.plot(w, shift + -gloc.imag) plt.axhline(shift, color='k', lw=0.5) plt.xlabel(r'$\omega$') plt.xlim([-4, 4]) plt.ylim([shift, 2.1]) plt.yticks(0.5 - 2.1 * np.arange(len(urange)), ['U=' + str(u) for u in urange])
w_set = np.concatenate((np.arange(80), np.arange(80, 150, 5))) gwst0 = gf.pade_continuation(1j * giw_dt0.imag + giw_ot0.real, w_n, w, w_set) swst0 = gf.pade_continuation(1j * siw_dt0.imag + siw_ot0.real, w_n, w, w_set) #swst0 = swst0.real - 1j * np.abs(swst0.imag) gwst03 = gf.pade_continuation(1j * giw_dt03.imag + giw_ot03.real, w_n, w, w_set) swst03 = gf.pade_continuation(1j * siw_dt03.imag + siw_ot03.real, w_n, w, w_set) #swst03 = swst03.real - 1j * np.abs(swst03.imag) fig, axes = plt.subplots(3, 2, sharex=True) fig.subplots_adjust(hspace=0, wspace=0.0) plot_gf(gwst0, swst0, axes[:, 0]) #plot_gf(gwst03, swst03, axes[:, 1]) plot_gf(gf.semi_circle_hiltrans(w - 0.3 - swst03), swst03, axes[:, 1]) axes[0, 0].set_ylabel(r'$A_{sym}(\omega)$') axes[1, 0].set_ylabel(r'$\Re e \Sigma_{sym}(\omega)$') axes[2, 0].set_ylabel(r'$-\Im m \Sigma_{sym}(\omega)$') for ax, lim in zip(axes, [[0, 2], [-8, 8], [0, 2]]): ax[0].set_ylim(lim) ax[0].set_yticks([]) ax[1].set_ylim(lim) axes[2, 1].set_ylim([0, 2.6]) axes[2, 0].set_xlabel(r'$\omega$') axes[2, 1].set_xlabel(r'$\omega$') plt.savefig('IPT_imag_Dimer_mott_ins_panels_sym.pdf', transparent=False,
tp = args.tp w_n = gf.matsubara_freq(100., 300) w = np.linspace(-4, 4, 1000) w_set = np.arange(100) eps_k = np.linspace(-1., 1., 61) with tdp.HDFArchive(args.file) as data: for u_str in data: giw = tdp.get_giw(data[u_str], slice(-1, -5, -1)) giw_s = np.squeeze(.5 * (giw['sym_up'].data + giw['sym_dw'].data)) giw_s = giw_s[len(giw_s) / 2:len(giw_s) / 2 + 300] gs = gf.pade_continuation(giw_s, w_n, w, w_set) siw_s = 1j * w_n - tp - .25 * giw_s - 1 / giw_s ss = gf.pade_continuation(siw_s, w_n, w, w_set) gst = gf.semi_circle_hiltrans( w - tp - (ss.real - 1j * np.abs(ss.imag))) lat_gfs = 1 / np.add.outer(-eps_k, w - tp + 5e-2j - ss) Aw = np.clip(-lat_gfs.imag / np.pi, 0, 2) U = float(u_str[1:]) title = r'IPT lattice dimer $U={}$, $t_\perp={}$, $\beta={}$'.format( U, tp, BETA) ax = plot_greenfunct(w, gs, title, r'$G$') plot_greenfunct(w, gst, title, r'$G$', ax) plot_greenfunct(w, 1 / (w - tp - .25 * gst), title, r'$G0$', ax) plt.savefig('DOS_B100_tp{}_U{}.png'.format(tp, U)) ax = plot_greenfunct(w, ss, title, r'$\Sigma$') plt.savefig('Sigma_B100_tp{}_U{}.png'.format(tp, U)) plot_pole_eq(w, gst, ss, title)