Dear George, It isn't the energy scale that varies, but rather the momentum. It is important to remember that the k-values are in the units of the inverse period of the system whose band structure you are computing.
Best, Anton On Wed, Sep 13, 2017 at 12:31 PM, George Datseris <[email protected] > wrote: > Dear Anton and Kwant team, > > I have an important update: the energy becomes correct (in eV) if I > multiply its values by sqrt(3). > > This makes no sense to me and I really cannot understand why I have to > multiply the energy by sqrt(3) to get the correct number in eV versus > nanometers^{-1}. > > It is important to know the following: a=0.142 is the *carbon-carbon* > distance in graphene > > lc = a*sqrt(3) is the lattice constant of the graphene (honeycomb > lattice). > > If I assume that the argument passed to honeycomb() *is lc and NOT a*, > and if I assume that the argument given to the hoppings is -t (with t being > 2.8 eV), then I should be getting the energy dispersion (dirac cone) to be > of the value: > > E = (3/2)*(lc/sqrt(3))*t , in eV > > and this value is assympotically approximated by the bandstructure of an > armchair nanoribbon for small energies. > > This is *not the result *of kwant.physics.Bands however!!! I need to > multiply the result of Bands() with sqrt(3) to get the correct values in eV. > > Is this a bug or something missing from the documentation strings / > documentation page? Or is it simply something I have understood wrongly? > Because so far I have been following the documentation and what Anton said > in his previous answer. > > Best, > George > > On 10-Sep-17 5:59 PM, George Datseris wrote: > > Dear Anton, > > Thank you for your kind reply, I really appreciate any help given! > > From your answer: > > The unit of energy everywhere is the same as the one you use when > defining the Hamiltonian. > > This does not correspond with what is returned by `kwant.physics.Bands`, > or I am doing some trivial mistake I cannot see. That is because the > numbers do not correspond to what they should be if they were eV versus > nm^{-1}. The following is the simplest code I could possibly imagine: > > ```python > a = 0.142 #inter-carbon distance in nm > lc = sqrt(3)*a #lattice constant in nm > t = 2.8 #hopping in eV > > W = 50 #width in UNSCALED lattice constants, as if sf=1. (multiply by lc > to get it in nm) > sf=1 > > def bandstructure(sf): #sf = scaling factor > > glat = kwant.lattice.honeycomb(sf) #sf*la for lattice constant in nm > A, B = glat.sublattices > # create a lead pointing downwards (easy with pre-defined honeycomb) > 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 > undoped graphene. > armchair[glat.neighbors()] = -1/sf #hopping. use t/sf for value in eV > > bands = kwant.physics.Bands(armchair.finalized()) > wavenums = np.linspace(-pi/10 , pi/10, 41) > > #To get energy in eV (for any scaling factor) I do: > energies = [bands(k)*(t) for k in wavenums] > > # Rescale the wavevectors so that it is measured in nm instead of > lattice constants > wavenums /= sf*lc > > # plot dirac dispersion first: > pyplot.plot(wavenums, (3/2)*a*t*wavenums, color="black", > linestyle="dashed") > pyplot.plot(wavenums, -(3/2)*a*t*wavenums, color="black", > linestyle="dashed") > # plot armchair dispersion: > 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(sf) > ``` > yet the band structure it plots is wrong (see image at the end of the > email). It is not contained within the (correct) Dirac cone, as it should. > If I understand your statement correctly, the line ` energies = > [bands(k)*(t) for k in wavenums]` should give me the energy in eV, > irrespectively of how big the hopping is. (i.e. irrespectively of the value > of `sf`, the scaling factor). In addition, I call the function with sf=1 so > the `sf` by itself should influence nothing. > > This code is extremely simple, yet there is obviously something wrong with > it. The problem is that I cannot understand what it is wrong, precisely > because the code is so simple! I simply plot the energy versus the > wavevector, but I do it in units of eV and nm^{-1}... > > > The dirac cone is correct, as I have compared even with published papers, > but the dispersion for the armchair is incorrect (should be contained > within the dirac cone for such low energies). > > I am sorry that my issue is not solved after your answer, but I would > appreciate any input that can make me understand why the armchair > dispersion is not contained within the Dirac cone... > > Best, > George > > On 10/09/2017 03:51, Anton Akhmerov wrote: > > Dear George, > > What does not make any assumptions about the units, leaving the > interpretation entirely up to you. > > > 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. > > The length argument to the honeycomb lattice is the lattice constant. > Creating a lattice does not change the units of length. The site > positions are then calculated according to the lattice definition, so > a site (i, j) belonging square lattice with a lattice constant a would > have coordinates (a*i, a*j). > > > 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} ? > > kwant.physics.Bands and kwant.plotter.Bands calculate the spectrum of > a system with a 1D translation invariance as a function of its lattice > wave vector (so, these band structures always have a period of 2*pi). > In other words, they measure momentum in units of inverse period of > the system whose band structure you are calculating. This is different > from kwant.wraparound.plot_2d_bands (introduced in kwant v1.3) that > uses units of inverse length. > > > 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? > > The input to bands does not have to be within that interval, but it is > measured in the units of the inverse period of the system, indeed. > > > 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: > > 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} ? > > The unit of energy everywhere is the same as the one you use when > defining the Hamiltonian. > > I hope the above answers help. > > Best, > Anton > > On Fri, Sep 8, 2017 at 3:12 PM, George Datseris<[email protected]> > <[email protected]> wrote: > > 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/[email protected]/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: > > 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. > 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} ? > 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? > 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: > 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 > > > >
