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:
- mpmath.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()