예제 #1
0
def analytic_hubbard_atom(beta, U, nw, nwf, nwf_gf):

    d = ParameterCollection()
    d.beta, d.U, d.nw, d.nwf, d.nwf_gf = beta, U, nw, nwf, nwf_gf

    g_iw = single_particle_greens_function(beta=beta, U=U, nw=nwf_gf)
    d.G_iw = g_iw

    # make block gf of the single gf
    G_iw_block = BlockGf(name_list=['up', 'dn'], block_list=[g_iw, g_iw])
    g_mat = block_iw_AB_to_matrix_valued(G_iw_block)

    d.chi_m = chi_ph_magnetic(beta=beta, U=U, nw=nw, nwf=nwf)
    d.chi0_m = chi0_from_gg2_PH(g_mat, d.chi_m)

    # -- Numeric vertex from BSE
    d.gamma_m_num = inverse_PH(d.chi0_m) - inverse_PH(d.chi_m)

    # -- Analytic vertex
    d.gamma_m = gamma_ph_magnetic(beta=beta, U=U, nw=nw, nwf=nwf)

    # -- Analytic magnetization expecation value
    # -- and static susceptibility

    d.Z = 2. + 2 * np.exp(-beta * 0.5 * U)
    d.m2 = 0.25 * (2 / d.Z)
    d.chi_m_static = 2. * beta * d.m2

    d.label = r'Analytic'

    return d
예제 #2
0
def analytic_hubbard_atom(beta, U, nw, nwf, nwf_gf):
    r""" Compute dynamical response functions for the Hubbard atom at half filling.

    This function returns an object that contains the single-particle
    Greens function :math:`G(\omega)`, the magnetic two-particle generalized susceptibility
    :math:`\chi_m(\omega, \nu, \nu')`, and the corresponding bare bubble 
    :math:`\chi^{(0)}_m(\omega, \nu, \nu')`, and the magnetic vertex function
    :math:`\Gamma_m(\omega, \nu, \nu')`.

    This is implemented using analytical formulas from 
    Thunstrom et al. [PRB 98, 235107 (2018)]
    please cite the paper if you use this function!

    In particular this is one exact solution to the Bethe-Salpeter
    equation, that is the infinite matrix inverse problem:

    .. math::
        \Gamma_m = [\chi^{(0)}_m]^{-1} - \chi_m^{-1}

    Parameters
    ----------

    beta : float
        Inverse temperature.

    U : float
        Hubbard U interaction parameter.

    nw : int
        Number of bosonic Matsubara frequencies 
        in the computed two-particle response functions.

    nwf : int
        Number of fermionic Matsubara frequencies
        in the computed two-particle response functions.

    nwf_gf : int
        Number of fermionic Matsubara frequencies
        in the computed single-particle Greens function.

    Returns
    -------

    p : ParameterCollection
        Object containing all the response functions and some other
        observables, `p.G_iw`, `p.chi_m`, `p.chi0_m`, 
        `p.gamma_m`, `p.Z`, `p.m2`, `p.chi_m_static`.

    """

    d = ParameterCollection()
    d.beta, d.U, d.nw, d.nwf, d.nwf_gf = beta, U, nw, nwf, nwf_gf

    g_iw = single_particle_greens_function(beta=beta, U=U, nw=nwf_gf)
    d.G_iw = g_iw

    # make block gf of the single gf
    G_iw_block = BlockGf(name_list=['up', 'dn'], block_list=[g_iw, g_iw])
    g_mat = block_iw_AB_to_matrix_valued(G_iw_block)

    d.chi_m = chi_ph_magnetic(beta=beta, U=U, nw=nw, nwf=nwf)
    d.chi0_m = chi0_from_gg2_PH(g_mat, d.chi_m)

    # -- Numeric vertex from BSE
    d.gamma_m_num = inverse_PH(d.chi0_m) - inverse_PH(d.chi_m)

    # -- Analytic vertex
    d.gamma_m = gamma_ph_magnetic(beta=beta, U=U, nw=nw, nwf=nwf)

    # -- Analytic magnetization expecation value
    # -- and static susceptibility

    d.Z = 2. + 2 * np.exp(-beta * 0.5 * U)
    d.m2 = 0.25 * (2 / d.Z)
    d.chi_m_static = 2. * beta * d.m2

    d.label = r'Analytic'

    return d
예제 #3
0
def make_calc():

    # ------------------------------------------------------------------
    # -- Hubbard atom with two bath sites, Hamiltonian

    p = ParameterCollection(
        beta=1.0,
        U=5.0,
        nw=1,
        nwf=20,
    )

    p.nwf_gf = 4 * p.nwf
    p.mu = 0.5 * p.U

    # ------------------------------------------------------------------

    ca_up, cc_up = c('0', 0), c_dag('0', 0)
    ca_do, cc_do = c('0', 1), c_dag('0', 1)

    docc = cc_up * ca_up * cc_do * ca_do
    nA = cc_up * ca_up + cc_do * ca_do
    p.H = -p.mu * nA + p.U * docc

    # ------------------------------------------------------------------
    # -- Exact diagonalization

    # Conversion from TRIQS to Pomerol notation for operator indices
    # TRIQS:   block_name, inner_index
    # Pomerol: site_label, orbital_index, spin_name
    index_converter = {
        ('0', 0): ('loc', 0, 'up'),
        ('0', 1): ('loc', 0, 'down'),
    }

    # -- Create Exact Diagonalization instance
    ed = PomerolED(index_converter, verbose=True)
    ed.diagonalize(p.H)  # -- Diagonalize H

    gf_struct = [['0', [0, 1]]]

    # -- Single-particle Green's functions
    p.G_iw = ed.G_iw(gf_struct, p.beta, n_iw=p.nwf_gf)['0']

    # -- Particle-particle two-particle Matsubara frequency Green's function
    opt = dict(beta=p.beta,
               gf_struct=gf_struct,
               blocks=set([("0", "0")]),
               n_iw=p.nw,
               n_inu=p.nwf)

    p.G2_iw_ph = ed.G2_iw_inu_inup(channel='PH', **opt)[('0', '0')]

    # ------------------------------------------------------------------
    # -- Generalized susceptibility in magnetic PH channel

    p.chi_m = Gf(mesh=p.G2_iw_ph.mesh, target_shape=[1, 1, 1, 1])
    p.chi_m[0, 0, 0, 0] = p.G2_iw_ph[0, 0, 0, 0] - p.G2_iw_ph[0, 0, 1, 1]

    p.chi0_m = chi0_from_gg2_PH(p.G_iw, p.chi_m)
    p.label = r'Pomerol'

    # ------------------------------------------------------------------
    # -- Generalized susceptibility in PH channel

    p.chi = chi_from_gg2_PH(p.G_iw, p.G2_iw_ph)
    p.chi0 = chi0_from_gg2_PH(p.G_iw, p.G2_iw_ph)
    p.gamma = inverse_PH(p.chi0) - inverse_PH(p.chi)

    # ------------------------------------------------------------------
    # -- Store to hdf5

    filename = 'data_pomerol.h5'
    with HDFArchive(filename, 'w') as res:
        res['p'] = p