Dear Adel,
Many thanks for your kind help. Your suggestions indeed work quite well.
Previously, the length scale in my calculation was too small. When increasing
the length and the width, magnetic field plays an important role to modify the
energy level and conductance.
Before closing this thread, I have a final question that I need your help.
I have tested a simply model, say H(k_x, k_y)=A * ((k_x+c*B*y)**2 + k_y**2) *
sigma_0 [magnetic field along z direction, and the leads are parallel to x
direction]. My question is: how to find the appropriate grid to discretize the
model?
I consider a system with length L = 2000 Ang, and width W = 500 Ang. When
discretizing the effective Hamiltonian model, I use the grid a1 = 10 Ang and a2
= 20 Ang, respectively. I find that using a1 and a2 (to discretize the model)
results in very different conductance.
In my mind, this "strange" thing comes from the following facts:
- Using a smaller grid value create more lattice sites along the width
direction (e.g., a1=10 => 500/10=50 sites; a2=20 => 500/20 = 25 sites). More
sites along the width direction imply more band channels for contributing to
the conductance.
- I also check the discretized Hamiltonian, and find that the onsite
energies are very different for a1 = 10 and a2 = 20 grid. Consequently, the
band structures for a1 and a2 cases look very different (for e.g., the energy
scale, etc).
- For a fixed concentration of carriers, the Fermi level for a1 and a2
cases should be different as well.
In several tutorials, I find that people use a = 1 or a = 10 to discretize
the continuum model. However, I do not know why these two values are
meaningful. I was also trying to decrease the grid value a, so that the
computed conductance can be converged. However, my guess is that the
calculations seem not be converged with decreased a value, possibly because of
the points mentioned above.
Now, I feel quite confused about how to discretize the continuum model (for
example, with which grid value). Could you please give me some hints to solve
this issue?
I appreciate it very much for your help.
PS: I show below my python script
Appendix I: Python script
import numpy as np
from matplotlib import pyplot
import kwant
import kwant.continuum
import copy
import ipywidgets
from tqdm.notebook import tqdm
import scipy.sparse.linalg as sla
pi = np.pi
def make_system(W = 500, L = 2000, a = 10.0):
hamiltonian = """
+ A * ((k_x+c*B*y)**2 + k_y**2) * sigma_0
"""
hamiltonian = kwant.continuum.sympify(hamiltonian)
print(hamiltonian)
template = kwant.continuum.discretize(hamiltonian, grid=a)
print(template)
def scatter_shape(site):
x, y = site.pos
return 0 <= y < W and 0 < x < L
def lead_shape(site):
x, y = site.pos
return 0 <= y < W
syst = kwant.Builder()
syst.fill(template, scatter_shape, (a, a))
# We use the trick from the lecture setting Delta=0 in the leads
lead_left = kwant.Builder(kwant.TranslationalSymmetry([-a, 0]))
lead_left.fill(template.substituted(B='B_lead'), lead_shape, (0, a))
lead_right = kwant.Builder(kwant.TranslationalSymmetry([a, 0]))
lead_right.fill(template.substituted(B='B_lead'), lead_shape, (0, a))
syst.attach_lead(lead_left)
syst.attach_lead(lead_right)
syst = syst.finalized()
kwant.plot(syst);
return syst,lead_left,lead_right
syst1,left1,right1=make_system(W = 1000,L = 6000,a = 10.0)
syst2,left2,right2=make_system(W = 1000,L = 6000,a = 20.0)
kwant.plotter.bands(left1.finalized(), params=dict(A=3.8, c=-1.519266e-05,
B_lead=0.0))
kwant.plotter.bands(left2.finalized(), params=dict(A=3.8, c=-1.519266e-05,
B_lead=0.0))
pyplot.show()
Bfield = np.linspace(0, 5, 501)
Gs1=[]
Gs2=[]
paramsB=dict(A=3.8, c=-1.519266e-05)
for B1 in tqdm(Bfield):
Beff=dict(B=B1,B_lead=0)
smat1 = kwant.smatrix(syst1, energy=0.02, params={**paramsB, **Beff})
Gs1.append(smat1.transmission(1, 0))
smat2 = kwant.smatrix(syst2, energy=0.02, params={**paramsB, **Beff})
Gs2.append(smat2.transmission(1, 0))
pyplot.plot(Bfield, Gs1, label='2')
pyplot.plot(Bfield, Gs2, label='4')
pyplot.legend()
pyplot.ylabel("G [$e^2/h$]")
pyplot.xlabel("B [T]")
Appendix II: the onsite energy for models discretized with different grid values
______________for a1 = 10, we have the following output ______
_cache_0 = (
array([[1.+0.j, 0.+0.j],
[0.+0.j, 1.+0.j]]))
_cache_1 = (
array([[0.04+0.j, 0. +0.j],
[0. +0.j, 0.04+0.j]]))
_cache_2 = (
array([[0.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j]]))
def onsite(site, A, B, c):
(x, y, ) = site.pos
return (A*B**2*c**2*y**2) * (_cache_0) + (A) * (_cache_1) + (1) * (_cache_2)
______________for a2 = 20, we have the following output ______
_cache_0 = (
array([[1.+0.j, 0.+0.j],
[0.+0.j, 1.+0.j]]))
_cache_1 = (
array([[0.01+0.j, 0. +0.j],
[0. +0.j, 0.01+0.j]]))
_cache_2 = (
array([[0.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j]]))
def onsite(site, A, B, c):
(x, y, ) = site.pos
return (A*B**2*c**2*y**2) * (_cache_0) + (A) * (_cache_1) + (1) * (_cache_2)