Hilbert Transform
TRIQS comes with a Hilbert transform. Let us look at an example:
from triqs.lattice.tight_binding import *
from triqs.dos import HilbertTransform
from triqs.gf import GfImFreq
# Define a DOS (here on a square lattice)
BL = BravaisLattice(units = [(1,0,0) , (0,1,0) ], orbital_positions= [(0,0,0)] )
t = -1.00 # First neighbour Hopping
tp = 0.0*t # Second neighbour Hopping
hop= { (1,0) : [[ t]],
(-1,0): [[ t]],
(0,1) : [[ t]],
(0,-1): [[ t]],
(1,1) : [[ tp]],
(-1,-1): [[ tp]],
(1,-1): [[ tp]],
(-1,1): [[ tp]]}
TB = TightBinding (BL, hop)
d = dos(TB, n_kpts= 500, n_eps = 101, name = 'dos')[0]
#define a Hilbert transform
H = HilbertTransform(d)
#fill a Green function
G = GfImFreq(indices = ['up','down'], beta = 20)
Sigma0 = GfImFreq(indices = ['up','down'], beta = 20); Sigma0.zero()
G << H(Sigma = Sigma0,mu=0.)
Given a density of states d (here for a tight-binding model), the Hilbert transform H is defined is defined in the following way:
H = HilbertTransform(d)
To construct a Green’s function:
G = GfImFreq(indices = ['up','down'], beta = 20)
Sigma0 = GfImFreq(indices = ['up','down'], beta = 20); Sigma0.zero()
G << H(Sigma = Sigma0, mu=0.)
- class triqs.dos.HilbertTransform(rho)[source]
Computes the Hilbert Transform from a DOS object
\[\int_{-\infty}^\infty d \epsilon \rho(\epsilon) \Bigl( (\omega + \mu + I\eta)\mathbf{1} - \hat\varepsilon(\epsilon) - \text{field} - \Sigma(\epsilon) \Bigr)^{-1}\]- __call__(Sigma, mu=0, eta=0, field=None, epsilon_hat=None, result=None, n_points_integral=None, test_convergence=None)[source]
Compute the Hilbert Transform
- Parameters:
mu (float) –
eta (float) –
Sigma (a GFBloc or a function epsilon-> GFBloc) –
field (anything that can added to the GFBloc Sigma, e.g.:) –
an Array_with_GFBloc_Indices (same size as Sigma)
a GBloc
epsilon_hat (a function that takes a 1d array eps[i] and returns 3d-array eps[i,:,:]) – where the:,: has the matrix structure of Sigma. Default: eps[i] * Identity_Matrix Used only when DOS is a DOSFromFunction:
n_points_integral (How many points to use. If None, use the Npts of construction) –
test_convergence (If defined, it will refine the grid until CV is reached) – starting from n_points_integral and multiplying by 2
- Return type:
Returns the result. If provided, use result to compute the result locally.