gftool.lattice.onedim.dos_mp

gftool.lattice.onedim.dos_mp(eps, half_bandwidth=1)[source]

Multi-precision DOS of non-interacting 1D lattice.

Diverges at the band-edges abs(eps) = half_bandwidth.

This function is particularity suited to calculate integrals of the form \(∫dϵ DOS(ϵ)f(ϵ)\). If you have problems with the convergence, consider removing singularities, e.g. split the integral

\[∫^0 dϵ DOS(ϵ)[f(ϵ) - f(-D)] + ∫_0 dϵ DOS(ϵ)[f(ϵ) - f(+D)] + [f(-D) + f(+D)]/2\]

or symmetrize the integral.

Parameters
epsmpmath.mpf or mpf_like

DOS is evaluated at points eps.

half_bandwidthmpmath.mpf or mpf_likeloat

Half-bandwidth of the DOS, DOS(| eps | > half_bandwidth) = 0. The half_bandwidth corresponds to the nearest neighbor hopping t=D/2

Returns
dos_mpmpmath.mpf

The value of the DOS.

See also

gftool.lattice.onedim.dos

vectorized version suitable for array evaluations

References

economou2006

Economou, E. N. Green’s Functions in Quantum Physics. Springer, 2006.

Examples

Calculate integrals (the 1D DOS needs higher accuracy for accurate results):

>>> from mpmath import mp
>>> with mp.workdps(35, normalize_output=True):
...     norm = mp.quad(gt.lattice.onedim.dos_mp, [-1, +1])
>>> norm
mpf('1.0')
>>> eps = np.linspace(-1.1, 1.1, num=501)
>>> dos_mp = [gt.lattice.onedim.dos_mp(ee, half_bandwidth=1) for ee in eps]
>>> import matplotlib.pyplot as plt
>>> _ = plt.plot(eps, dos_mp)
>>> for pos in (-1, 0, +1):
...     _ = plt.axvline(pos, color='black', linewidth=0.8)
>>> _ = plt.xlabel(r"$\epsilon/D$")
>>> _ = plt.ylabel(r"DOS * $D$")
>>> _ = plt.ylim(bottom=0)
>>> _ = plt.xlim(left=eps.min(), right=eps.max())
>>> plt.show()

(png, pdf)

../_images/gftool-lattice-onedim-dos_mp-1.png