Hello,
I am having significant trouble understanding which are the units of
measurement of the energy and the wavenumber when using kwant *and when
using different lattice constants*.
I am trying to reproduce the results of the (probably well-known paper)
"Scalable Tight Binding Model for Graphene", Phys. Rev. Lett. 114,
036601 (2015).
I have read the answers to another question
(https://www.mail-archive.com/kwant-discuss@kwant-project.org/msg00069.html)
but I simply cannot understand which is the actual unit of measurement
used internally so I can translate those to nanometers and
electronVolts. Even though I have realized how I can translate internal
wavenumbers into nanometers^{-1}, I cannot understand how *and why* to
use properly kwants.physics.Bands().
Here is the minimal code that captures my problems:
```python
import kwant
from matplotlib import pyplot
a = 0.142 #inter-carbon distance in nm
lc = sqrt(3)*a #lattice constant in nm
t = 2.8 #hopping in eV
W = 200 #width in UNSCALED lattice constants, as if sf=1. (multiply by
lc to get it in nm)
def bandstructure(sf): #sf = scaling factor
glat = kwant.lattice.honeycomb(sf) #sf*la for lattice constant in nm
A, B = glat.sublattices
# create an armchair lead
def leadshape(pos): #set leads width
x, y = pos
return (0 <= x < W)
sym_lead_vertical = kwant.TranslationalSymmetry(glat.vec((-1*sf,2*sf)))
armchair = kwant.Builder(sym_lead_vertical)
armchair[glat.shape(leadshape, (0, 0))] = 0 #onsite energy is 0
for Dirac
armchair[glat.neighbors()] = -1/sf #hopping. use t/sf for value in eV
#function that gives the bands (energies) at a given wave vector:
bands = kwant.physics.Bands(armchair.finalized())
#The wavenumbers are measured in units of 1/lattice_const.
#that is why they only need to go from -pi to pi (Bloch):
wavenums = np.linspace(-pi/10 ,pi/10, 41)
#I now want to get the energies, measured in eV. How????
energies = [bands(k/sf)*(t/sf) for k in wavenums] #???? doesn't
work no matter what I change!
pyplot.figure(figsize=(6,8))
# Rescale the wavevectors so that it is measured in nm instead of
lattice constants
wavenums /= sf*lc #this works correctly
# plot dirac dispersion first:
pyplot.plot(wavenums, (3/2)*a*t*wavenums, color="black") #this
works correctly!
# The band structure does not work.
pyplot.plot(wavenums, energies)
pyplot.xlabel(r"Wavevector [nm$^{-1}$]", family = "serif")
pyplot.ylabel(r"Energy [eV]", family = "serif")
pyplot.xlim(-0.4, 0.4)
pyplot.ylim(-0.2, 0.2)
bandstructure(1)
```
From previous answers, I cannot understand what corresponds to the "the
distance units that I have chosen". I have chosen here the distance
units such that `lc -> 1`. When I am creating the lattice with the
command honeycomb(sf), are my distance units still `lc` or are they now
`lc*sf` ?
Notice that the above `bandstructure()` should give similar results
independently of scaling factor (see the paper for details on why).
Therefore, the only problem that may remain is the scaling of energy
and/or wavenumber. Let me summarize my questions as clearly as possible,
to help you giving me an easy answer:
1. Which is the unit of measurement of length? I always thought that it
is simply `1`! If I write `honeycomb(32.123)` is the unit of
measurement of length still `1` or does it become 32.123,
irrespectively of how many nanometers 1 actually corresponds to?
When I get the lattice sites, I know that they are assumed (i,j)
TIMES the lattice constant, so the actual unit of distance is still
(i,j)*32.123*1, and `1` corresponds to whatever units I choose.
2. Now, is the wavenumber represented in units of `1`, or in units of
1/32.123? If I have a value of `k=3` and my `1` corresponds to 1
nanometer, does this value of `k` correspond to `3`nm^{-1} or to
`3/32.123` nm^{-1} ?
3. What is the input given to the function `bands(k)`, obtained from
`kwant.physics.Bands` ? Does it have to *always be within the
interval -pi/2 to pi/2 *, meaning that it is always expected in
units of 1/lattice const. /irrespectively of which are the units of
measurement of the wavenumber?
/
4. What is the unit of energy, that is returned by the function
`bands()`? Does it depend on the value that I give to the hopping,
or it depends on how I define `1` ? E.g. when I write
`armchair[glat.neighbors()] = -1/sf` is the unit of energy
internally defined to be `1` or `1/sf` ??? It cannot possibly be the
latter, because I could also assign some number to the on-site
potential. So it must be the first, right? But then, how do you
answer my question number 4:
//
5. Given that I know the length of the lattice constant in nanometers,
and I know the energy of the hopping value in eV, how can I get the
bands in eV versus nm^{-1} ?
I would also like to comment that the documentation string of `bands()`
would solve all of these questions by only having 2 more sentences in
it. The sentences that answer questions 2-3-4 would probably be enough.
I am sure that the answers to my questions are almost trivial, but after
many hours of trying to understand what is going on, I am not so
confused that I had to ask. So, sorry in advance for the very easy question!
Best,
George Datseris
MPI For Dynamics & Self-Organization