Hello everyone,
I am new to KWANT but have been trying to implement a tight-binding model over
a (2D) square lattice under the influence of a constant perpendicular magnetic
field. This example is explored in section IV B of [Graf, M., & Vogl, P.
Electromagnetic fields and dielectric response in empirical tight-binding
theory. Physical Review B, 51(8), 4940 (1995)].
My implementation is inspired by the KWANT tutorials. I start with the
following function to set up the model:
def make_system(a: float=1, eps0: float=4.0, hop: float=1.0, r: float=20):
""" Creates a tight-binding model
Args:
a (float): Lattice constant
eps0 (float): On-site energy
hop (float): Hopping energy
r (float): Radius of the quantum dot
Returns:
syst (kwant.Builder): The system
lat (kwant.lattice): The lattice
"""
lat = kwant.lattice.square(a, norbs=1)
syst = kwant.Builder()
# Define the quantum dot
def circle(pos):
(x, y) = pos
rsq = x ** 2 + y ** 2
return rsq <= r ** 2
def hopx(tosite, fromsite, peierls):
phi = peierls(tosite, fromsite)
return -hop * t * phi
def hopy(tosite, fromsite, peierls):
phi = peierls(tosite, fromsite)
return -hop * t * phi
syst[lat.shape(circle, (0, 0))] = eps0 * t
# hoppings in x-direction
syst[kwant.builder.HoppingKind((1, 0), lat, lat)] = hopx
# hoppings in y-directions
syst[kwant.builder.HoppingKind((0, 1), lat, lat)] = hopy
# Closed system, no leads
return syst, lat
And then I diagonalize the resulting Hamiltonian for different values of the
magnetic field (in units of the flux quantum hc/e in cgs units):
def sorted_eigs(ev):
evals, evecs = ev
# Sort eigenvalues in ascending order and get the corresponding indices
sorted_indices = np.argsort(evals)
# Use the sorted indices to sort evals
sorted_evals = evals[sorted_indices]
# Use the sorted indices to sort eigenvectors accordingly
sorted_eigenvectors = evecs[:, sorted_indices]
return sorted_evals, sorted_eigenvectors
for iB in np.linspace(0, 0.03, 30):
B = iB
def B_syst(pos):
return B
peierls_syst = gauge(B_syst)
params = dict(peierls=peierls_syst)
ham_mat = syst.hamiltonian_submatrix(params=params, sparse=True)
# Diaglonalize the Hamiltonian
evals, evecs = sorted_eigs(sla.eigsh(ham_mat.tocsc(), k=10, sigma=0.05))
If I compare the results to Fig. 2 (a) of [Graf, M., & Vogl, P. Electromagnetic
fields and dielectric response in empirical tight-binding theory. Physical
Review B, 51(8), 4940 (1995)], I get results that are those for a magnetic
field B that is ~2 times as small. Looking at the source code, specifically
line 791 of
https://gitlab.kwant-project.org/kwant/kwant/blob/v1.5.0/kwant/physics/gauge.py#L995-1033
I find that the phases are written with a factor of pi in the exponent.
However, looking at [Graf, M., & Vogl, P. Electromagnetic fields and
dielectric response in empirical tight-binding theory. Physical Review B,
51(8), 4940 (1995)], if I express the magnetic field in units of the flux
quantum / l^2 (as is suggested in the docstring at line 1005) I expect to get a
factor of h / hbar = 2*pi in the exponent, consistent with the discrepancy. Is
my reasoning correct? Is the KWANT definition for the flux quantum perhaps
hc/(2e) (ie the superconducting flux quantum)? Any help would be greatly
appreciated.
Thanks.