예제 #1
0
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
예제 #2
0
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
예제 #3
0
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)
예제 #5
0
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)
예제 #6
0
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)
예제 #7
0
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$')
예제 #8
0
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
예제 #9
0
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])
예제 #11
0
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)
예제 #12
0
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)
예제 #13
0
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
예제 #14
0
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)
예제 #15
0
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)
예제 #16
0
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])
예제 #17
0
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
예제 #18
0
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)
예제 #19
0
    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)
예제 #20
0
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)
예제 #21
0
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)
예제 #22
0
    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)$')
예제 #23
0
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)
예제 #24
0
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)
예제 #25
0
===================================

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])
예제 #26
0
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,
예제 #27
0
    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)