"""Basic functions for the (non-interacting) single impurity Anderson model (SIAM).
The Hamiltonian for the SIAM reads
.. math::
H = ∑_σ ϵ_σ c^†_σ c_σ + U n_↓ n_↑
+ ∑_{kσ} (V_{kσ} c^†_σ c_{kσ} + H.c.)
+ ∑_{kσ} ϵ_{kσ} n_{kσ}
The first to terms describe the interacting single impurity,
the thirds term is the hopping (or hybridization) between impurity and bath-sites,
the last term is the on-site energy of the non-interacting bath sites.
In the action formalism, the bath degrees of freedom can be readily integrated out,
as the action is quadratic in these degrees.
The local action of the impurity reads
.. math::
S_{imp}[c^+_σ, c_σ] = -∑_{nσ} c^+_σ [iω_n - ϵ_σ - Δ(iω_n)] c_σ + U ∫_0^β dτ n_↑(τ) n_↓(τ)
with the hybridization function
.. math:: Δ_σ(z) = ∑_{kσ} |V_{kσ}|^2 / (z - ϵ_{kσ}).
"""
import numpy as np
from gftool._util import _gu_sum
from gftool.matrix import decompose_her
from gftool.basis.pole import (_single_pole_gf_gr_t, _single_pole_gf_le_t,
_single_pole_gf_ret_t)
[docs]def gf0_loc_z(z, e_onsite, e_bath, hopping_sqr):
"""Noninteracting local Green's function for the impurity.
Parameters
----------
z : (...) complex np.ndarray
Complex frequency variable.
e_onsite : (...) float np.ndarray
On-site energy of the impurity site.
e_bath : (..., Nb) float np.ndarray
On-site energy of the bath sites.
hopping_sqr : (..., Nb) complex np.ndarray
Absolute square of hopping matrix element between impurity and the bath
sites.
Returns
-------
gf0_loc_z : (...) complex np.ndarray
Green's function of the impurity site.
"""
return 1. / (z - e_onsite - hybrid_z(z, e_bath=e_bath, hopping_sqr=hopping_sqr))
[docs]def gf0_loc_ret_t(tt, e_onsite, e_bath, hopping):
"""Noninteracting retarded local Green's function for the impurity.
Parameters
----------
tt : (...) float np.ndarray
Time variable. Note that the retarded Green's function is `0` for `tt<0`.
e_onsite : (...) float np.ndarray
On-site energy of the impurity site.
e_bath : (..., Nb) float np.ndarray
On-site energy of the bath sites.
hopping : (..., Nb) complex np.ndarray
Hopping matrix element between impurity and the bath sites.
Returns
-------
gf0_loc_ret_t : (...) complex np.ndarray
Retarded Green's function of the impurity site.
"""
ham = hamiltonian_matrix(e_onsite, e_bath=e_bath, hopping=hopping)
dec = decompose_her(ham)
# calculate only elements [..., 0] corresponding to the local impurity site
dec.rv_inv, dec.rv = dec.rv_inv[..., :, :1], dec.rv[..., :1, :]
eig_exp = _single_pole_gf_ret_t(tt[..., np.newaxis], dec.eig)
gf0_t = dec.reconstruct(eig=eig_exp, kind='diag')[..., 0]
return gf0_t
[docs]def gf0_loc_gr_t(tt, e_onsite, e_bath, hopping, beta):
"""Noninteracting greater local Green's function for the impurity.
Parameters
----------
tt : (...) float np.ndarray
Time variable. Note that the retarded Green's function is `0` for `tt<0`.
e_onsite : (...) float np.ndarray
On-site energy of the impurity site.
e_bath : (..., Nb) float np.ndarray
On-site energy of the bath sites.
hopping : (..., Nb) complex np.ndarray
Hopping matrix element between impurity and the bath sites.
beta : float
The inverse temperature :math:`beta = 1/k_B T`.
Returns
-------
gf0_loc_gr_t : (...) complex np.ndarray
Greater Green's function of the impurity site.
"""
ham = hamiltonian_matrix(e_onsite, e_bath=e_bath, hopping=hopping)
dec = decompose_her(ham)
# calculate only elements [..., 0] corresponding to the local impurity site
dec.rv_inv, dec.rv = dec.rv_inv[..., :, :1], dec.rv[..., :1, :]
eig_exp = _single_pole_gf_gr_t(tt[..., np.newaxis], dec.eig, beta=beta)
gf0_t = dec.reconstruct(eig=eig_exp, kind='diag')[..., 0]
return gf0_t
[docs]def gf0_loc_le_t(tt, e_onsite, e_bath, hopping, beta):
"""Noninteracting lesser local Green's function for the impurity.
Parameters
----------
tt : (...) float np.ndarray
Time variable. Note that the retarded Green's function is `0` for `tt<0`.
e_onsite : (...) float np.ndarray
On-site energy of the impurity site.
e_bath : (..., Nb) float np.ndarray
On-site energy of the bath sites.
hopping : (..., Nb) complex np.ndarray
Hopping matrix element between impurity and the bath sites.
beta : float
The inverse temperature :math:`beta = 1/k_B T`.
Returns
-------
gf0_loc_le_t : (...) complex np.ndarray
Lesser Green's function of the impurity site.
"""
ham = hamiltonian_matrix(e_onsite, e_bath=e_bath, hopping=hopping)
dec = decompose_her(ham)
# calculate only elements [..., 0] corresponding to the local impurity site
dec.rv_inv, dec.rv = dec.rv_inv[..., :, :1], dec.rv[..., :1, :]
eig_exp = _single_pole_gf_le_t(tt[..., np.newaxis], dec.eig, beta=beta)
gf0_t = dec.reconstruct(eig=eig_exp, kind='diag')[..., 0]
return gf0_t
[docs]def hamiltonian_matrix(e_onsite, e_bath, hopping):
r"""One-particle Hamiltonian matrix of the SIAM.
The non-interacting Hamiltonian can be written in the form
.. math:: \hat{H} = ∑_{ijσ} c^†_{iσ} H_{ijσ} c_{jσ}.
The Hamiltonian matrix is :math:`H_{ij}`, where we fixed the spin σ.
The element `H_{00}` corresponds to the impurity site.
Parameters
----------
e_onsite : (...) float np.ndarray
On-site energy of the impurity site.
e_bath : (..., Nb) float np.ndarray
On-site energy of the bath sites.
hopping : (..., Nb) complex np.ndarray
Hopping matrix element between impurity and the bath sites.
Returns
-------
ham_mat : (..., Nb+1, Nb+1) complex np.ndarray
Lesser Green's function of the impurity site.
"""
broadcast = np.broadcast(e_onsite[..., np.newaxis], e_bath, hopping)
n_bath = broadcast.shape[-1]
ham = np.zeros([*broadcast.shape[:-1], n_bath+1, n_bath+1], dtype=hopping.dtype)
ham[..., 0, 0] = e_onsite
ham[..., 0, 1:] = hopping
ham[..., 1:, 0] = np.conj(hopping)
ham[..., np.arange(n_bath)+1, np.arange(n_bath)+1] = e_bath
return ham
[docs]def hybrid_z(z, e_bath, hopping_sqr):
"""Hybridization function of the impurity.
Parameters
----------
z : (...) complex np.ndarray
Complex frequency variable.
e_bath : (..., Nb) float np.ndarray
On-site energy of the bath sites.
hopping_sqr : (..., Nb) complex np.ndarray
Absolute square of hopping matrix element between impurity and the bath
sites.
Returns
-------
hybrid_z : (...) complex np.ndarray
Hybridization function of the impurity site.
"""
return _gu_sum(hopping_sqr/(np.asanyarray(z)[..., np.newaxis] - e_bath))