
Dear Kwant developers and users,
I write concerning a doubt that I encountered trying to study by Kwant a model for the quantum Hall/quantum spin Hall effect. In particular, I am focusing on the two-dimensionakl BHZ model, first proposed in the famous paper
https://science.sciencemag.org/content/314/5806/1757
Notice that first I keep only one of the two time-reversal-connected blocks forming the quantum spin Hall system (when the mass parameter M is positive); it is known that each block describes a quantum Hall system (again for M >0, otherwise a trivial insulator occurs).
I attach below my defining code (included in the % lines)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
import kwant from kwant.digest import uniform # a (deterministic) pseudorandom number generator import math from matplotlib import pyplot as plt import cmath import scipy.sparse.linalg as sla import scipy.linalg as la import numpy from numpy import linalg as LA
# For plotting from matplotlib import pyplot
# For matrix support import tinyarray
#import progressbar
#-----------------------------------------------------
# We define the variables and the constants
a = 1 #lattice step #t = 1 #along x and y
#----------------------------------------------------- nullmatrix = tinyarray.array([[0, 0], [0, 0]])
matid = tinyarray.array([[1, 0], [0, 1]])
sigma_0 = tinyarray.array([[1, 0], [0, -1]])
sigma_xp = tinyarray.array([[1, -1j], [-1j, -1]])
sigma_yp = tinyarray.array([[1, 1/2], [-1/2, -1]])
-----------------------------------------------------------------------------------------------------------------
def sistema_BHZ_2e(Lx, Ly, M) :
syst = kwant.Builder() lat = kwant.lattice.square(norbs=2)
for i in range(0,Lx):
#syst[lat(i, 0), lat(i, L - 1)] = sigma_yp
for j in range(0,Ly):
# On-site Hamiltonian syst[lat(i, j)] = (M - 4)*sigma_0
# Hopping in y-direction if i > 0:
syst[lat(i, j), lat(i - 1, j)] = sigma_xp
# Hopping in z-direction if j > 0:
syst[lat(i, j), lat(i, j - 1)] = sigma_yp
return syst
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Correspondingly to what described above, I would expect to see, when M
0, edge modes.
Indeed, I obtain them calculating the local densities via the KPM (approximate) method working in Kwant:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
# Plot several local density of states maps in different subplots def plot_ldos(syst, densities, file_name=None): step = 0.1 fig, axes = plt.subplots(1, len(densities), figsize=(7*len(densities), 7)) for ax, (title, rho) in zip(axes, densities): kwant.plotter.density(syst,rho.real, colorbar=True, ax=ax, relwidth = step) ax.set_title(title) ax.set(adjustable='box', aspect='equal') plt.show() plt.clf()
--------------------------------------------------------------------------------------------------------------
M = 2
L = 16 Lx = L Ly = L
syst = sistema_BHZ_2e(Lx, Ly, M)
syst = syst.finalized()
hamat = syst.hamiltonian_submatrix(sparse = False)
evals, evecs = la.eigh(hamat)
kwant_op = kwant.operator.Density(syst, sum=False) local_dos = kwant.kpm.SpectralDensity(syst, operator=kwant_op)
print("first negative energy =", evals[int(Lx*Ly-1)])
print("first_positive_energy =", evals[int(Lx*Ly)])
first_negative_energy_ldos = local_dos(energy=evals[int(Lx*Ly-1)]) first_positive_energy_ldos = local_dos(energy=evals[int(Lx*Ly)])
plot_ldos(syst, [('first negative energy', first_negative_energy_ldos),('first positive energy', first_positive_energy_ldos)])
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
I attach below a typical output (KPM.pdf).
However, when I calculate the same densities not using the KPM approach (then via the exact function kwant.operator.Density(syst) only ) , that means by the code:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
M = 2
L = 16 Lx = L Ly = L
syst = sistema_BHZ_2e(Lx, Ly, M)
syst = syst.finalized()
hamat = syst.hamiltonian_submatrix(sparse = False)
evals, evecs = la.eigh(hamat)
kwant_op = kwant.operator.Density(syst, sum=False)
print("first negative energy =", evals[int(Lx*Ly-1)])
print("first_positive_energy =", evals[int(Lx*Ly)])
first_negative_energy_ldos = kwant_op(evecs[int(Lx*Ly-1)]) first_positive_energy_ldos = kwant_op(evecs[int(Lx*Ly)])
plot_ldos(syst, [('first negative energy', first_negative_energy_ldos),('first positive energy', first_positive_energy_ldos)])
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
I obtain a totally different density profile, not displaying edge localization (see No_KPM.pdf attached below).
I do not understand the reason of such a mismatch.
Can you help me ?
Thank you very much and best,
L.
participants (1)
-
Luca Lepori