transmission through a barrier of zero height
Hi Everyone! I want to solve basic problem of transmission of electron through a potential barrier without taking into account any effects contacts. But the influence of leads in all the examples provided in kwant documentation definitely exists. For example, in the quantum wire case leads are set the same way as the scattering region, that why I expect the transmission should be obtained identically one (for any energy of incident electron). This means that kwant takes into account also some regions outside the leads e.g. bulk metal contacts. Also I modified the quantum well example like this: def plot_transmission(syst, energies, welldepth): data = [] for energy in energies: smatrix = kwant.smatrix(syst, energy, args=[-welldepth]) data.append(smatrix.transmission(1, 0)) data = np.array( data ) pyplot.figure() pyplot.plot(energies, data) pyplot.xlabel("Energy [t]") pyplot.ylabel("Transmission") pyplot.show() and in the main function make a call plot_transmission(syst, [0.01 * i for i in range(1,100)], 0.0) As a result some dependence on E is obtained even for the case of zero depth of the potential whell and it is not identically one. So, is it possible to obtain in Kwant the transmission coefficient through the defined in the scattering region structures which is not affected by anything else? Sincerely, Jambulat Basaev
Hi,
This means that kwant takes into account also some regions outside the leads e.g. bulk metal contacts.
As a result some dependence on E is obtained even for the case of zero depth of the potential whell and it is not identically one.
So, is it possible to obtain in Kwant the transmission coefficient through the defined in the scattering region structures which is not affected by anything else?
You have created a system with a finite width of N sites, which means that in general there will be a finite number of propagating modes open at a given energy. As there is no backscattering in the system I expect the transmission to be equal to the number of propagating modes open at a given energy, which is indeed what I see when I run your code. You appear to be confused about the definition of transmission. It is not a probability and so is not bound to the interval [0, 1]. You may want to read chapter 3 of the book "Electronic Transport in Mesoscopic Systems" by S. Datta for an introduction to the formalism that Kwant is based on. Happy Kwanting, Joe
Hi Joe, Thank You for the answer. I definitely want to read that chapter of the Datta's book. But now my question it seems about Kwant's functional, i.e. is it possible to calculate with it the transmission (in the sense of probability) through the barrier (single and double)? So, if the Landauer's formula gives the conductivity as G=2e^2/h * T(E) * M(E) (for zero temperature), where M is the number of opened modes, and T is the transparency, in my present understanding, Kwant calculates somewhat like T(E) * M(E), but can it give me just T(E)? Sincerely, Jambulat 2017-03-27 16:26 GMT+03:00 Joseph Weston <joseph.weston08@gmail.com>:
Hi,
This means that kwant takes into account also some regions outside the leads e.g. bulk metal contacts.
As a result some dependence on E is obtained even for the case of zero depth of the potential whell and it is not identically one.
So, is it possible to obtain in Kwant the transmission coefficient through the defined in the scattering region structures which is not affected by anything else?
You have created a system with a finite width of N sites, which means that in general there will be a finite number of propagating modes open at a given energy. As there is no backscattering in the system I expect the transmission to be equal to the number of propagating modes open at a given energy, which is indeed what I see when I run your code.
You appear to be confused about the definition of transmission. It is not a probability and so is not bound to the interval [0, 1]. You may want to read chapter 3 of the book "Electronic Transport in Mesoscopic Systems" by S. Datta for an introduction to the formalism that Kwant is based on.
Happy Kwanting,
Joe
Hi again,
But now my question it seems about Kwant's functional, i.e. is it possible to calculate with it the transmission (in the sense of probability) through the barrier (single and double)? So, if the Landauer's formula gives the conductivity as G=2e^2/h * T(E) * M(E) (for zero temperature), where M is the number of opened modes, and T is the transparency, in my present understanding, Kwant calculates somewhat like T(E) * M(E),
I would be hesitant to write the transmission is such a form because the meaning of the T(E) that you have defined above is not clear in the case that, for example, different modes have different transmission probabilities. However I would conceded that, yes, 'smatrix.transmission' calculates more or less 'T(E) * M(E)'.
but can it give me just T(E)?
Sure. 'kwant.smatrix' will return you the full scattering matrix at the energy you request. It has a method 'submatrix' that will give you a submatrix of the full scattering matrix between any pair of leads, e.g.: s = kwant.smatrix(syst, energy=E) t = s.submatrix(1, 0) # transmission block from lead 0 to lead 1 T = np.abs(t)**2 # transmission *probabilities* You can find more information in the documentation [1]. Happy Kwanting, Joe [1]: https://kwant-project.org/doc/1.0/reference/generated/kwant.solvers.common.S...
Joe, great thanks for Your explaination. It would be quite hard for me to understand from the code documentation that it is the submatrix method is the thing which I need. But could You say is the function below calculates averaged over all modes transparency adequately? tblock = smatrix.submatrix( 1, 0 ) def transparency( tblock ): return ( 0 if tblock.shape[0] == 0 else np.sum( np.abs( tblock )**2 )/tblock.shape[0] ) I want to use it to check the results obtained analytically in the case of the wave falling on a potential barrier in infinite graphene. But now I see that 'transparency' depends on the length of the scattering region L despite of that the scattering is expected only at the line x=0. What should I do for obtaining more reliable results, to leave only one-two unit cells inside scattering region, or maybe make scattering region more long? Also it's a bit strange that 'transparency' is zero for potential barriers higher than scattering energy for the case of quite wide nanoribbons (W=100nm). According to theory, if I'm not mistaken, electron at any case is able to pass through a barrier in graphene, when the barrier is higher than its energy, electron just becomes a hole. In some sense this is approved by experiment, conductivity of the graphene FET saturates with increasing of gate voltage (e.g. see http://pubs.acs.org/doi/abs/10.1021/nl204088b ). But doing the similar simulations in Kwant I obtain conductivity cut-off for big voltages. You can see the graphs here: https://preview.ibb.co/crtEFa/graphene.png https://ibb.co/jZr1va (better resolution) I'm also attaching the scripts which have generated this graphs, but I'm not certain that they are not be banned. But it would be great if You check them and find that I did there something wrong. Sorry for maybe a bit unstructured questions, and for my English. Sincerely, Jambulat 2017-03-27 18:25 GMT+03:00 Joseph Weston <joseph.weston08@gmail.com>:
Hi again,
But now my question it seems about Kwant's functional, i.e. is it possible to calculate with it the transmission (in the sense of probability) through the barrier (single and double)? So, if the Landauer's formula gives the conductivity as G=2e^2/h * T(E) * M(E) (for zero temperature), where M is the number of opened modes, and T is the transparency, in my present understanding, Kwant calculates somewhat like T(E) * M(E),
I would be hesitant to write the transmission is such a form because the meaning of the T(E) that you have defined above is not clear in the case that, for example, different modes have different transmission probabilities. However I would conceded that, yes, 'smatrix.transmission' calculates more or less 'T(E) * M(E)'.
but can it give me just T(E)?
Sure. 'kwant.smatrix' will return you the full scattering matrix at the energy you request. It has a method 'submatrix' that will give you a submatrix of the full scattering matrix between any pair of leads, e.g.:
s = kwant.smatrix(syst, energy=E) t = s.submatrix(1, 0) # transmission block from lead 0 to lead 1 T = np.abs(t)**2 # transmission *probabilities*
You can find more information in the documentation [1].
Happy Kwanting,
Joe
[1]: https://kwant-project.org/doc/1.0/reference/generated/kwant. solvers.common.SMatrix
Hi,
Joe, great thanks for Your explaination. It would be quite hard for me to understand from the code documentation that it is the submatrix method is the thing which I need. But could You say is the function below calculates averaged over all modes transparency adequately?
tblock = smatrix.submatrix( 1, 0 )
def transparency( tblock ): return ( 0 if tblock.shape[0] == 0 else np.sum( np.abs( tblock )**2 )/tblock.shape[0] )
Seems correct
I want to use it to check the results obtained analytically in the case of the wave falling on a potential barrier in infinite graphene. But now I see that 'transparency' depends on the length of the scattering region L despite of that the scattering is expected only at the line x=0. What should I do for obtaining more reliable results, to leave only one-two unit cells inside scattering region, or maybe make scattering region more long? Also it's a bit strange that 'transparency' is zero for potential barriers higher than scattering energy for the case of quite wide nanoribbons (W=100nm). According to theory, if I'm not mistaken, electron at any case is able to pass through a barrier in graphene, when the barrier is higher than its energy, electron just becomes a hole. In some sense this is approved by experiment, conductivity of the graphene FET saturates with increasing of gate voltage (e.g. see http://pubs.acs.org/doi/abs/10.1021/nl204088b ). But doing the similar simulations in Kwant I obtain conductivity cut-off for big voltages. You can see the graphs here: https://preview.ibb.co/crtEFa/graphene.png https://ibb.co/jZr1va (better resolution) I'm also attaching the scripts which have generated this graphs, but I'm not certain that they are not be banned. But it would be great if You check them and find that I did there something wrong.
In your 'zigzag.py' script you apply potential for all x >= 0 in the scattering region (in both the left and the right leads there is a 0 potential). As you increase L, you increase the length of the barrier so it does not surprise me that the transmission drops to 0. Happy Kwanting, Joe
Hi Joe, And how can I set lead1's potential correctly? What is wrong in my script zigzag.py? I have the same function onsite both for scattering region and for leads: def *potential*( site, _U ): x, y = site.pos return _U if x >= 0 else 0 def *onsite*( site, _U=0 ): return eps + *potential*( site, _U ) syst = kwant.Builder() syst[graphene.shape(stripe, (0,0))] = *onsite* *** sym1 = kwant.TranslationalSymmetry(graphene.vec((2, -1))) def lead1_shape(pos): x, y = pos return abs(y) <= 0.5*_W lead1 = kwant.Builder(sym1) lead1[graphene.shape(lead1_shape, (0, 0))] = *onsite* Sincerely, Jambulat 2017-03-29 12:06 GMT+03:00 Joseph Weston <joseph.weston08@gmail.com>:
Hi,
Joe, great thanks for Your explaination. It would be quite hard for me to understand from the code documentation that it is the submatrix method is the thing which I need. But could You say is the function below calculates averaged over all modes transparency adequately?
tblock = smatrix.submatrix( 1, 0 )
def transparency( tblock ): return ( 0 if tblock.shape[0] == 0 else np.sum( np.abs( tblock )**2 )/tblock.shape[0] )
Seems correct
I want to use it to check the results obtained analytically in the case of the wave falling on a potential barrier in infinite graphene. But now I see that 'transparency' depends on the length of the scattering region L despite of that the scattering is expected only at the line x=0. What should I do for obtaining more reliable results, to leave only one-two unit cells inside scattering region, or maybe make scattering region more long? Also it's a bit strange that 'transparency' is zero for potential barriers higher than scattering energy for the case of quite wide nanoribbons (W=100nm). According to theory, if I'm not mistaken, electron at any case is able to pass through a barrier in graphene, when the barrier is higher than its energy, electron just becomes a hole. In some sense this is approved by experiment, conductivity of the graphene FET saturates with increasing of gate voltage (e.g. see http://pubs.acs.org/doi/abs/10.1021/nl204088b ). But doing the similar simulations in Kwant I obtain conductivity cut-off for big voltages. You can see the graphs here: https://preview.ibb.co/crtEFa/graphene.png https://ibb.co/jZr1va (better resolution) I'm also attaching the scripts which have generated this graphs, but I'm not certain that they are not be banned. But it would be great if You check them and find that I did there something wrong.
In your 'zigzag.py' script you apply potential for all x >= 0 in the scattering region (in both the left and the right leads there is a 0 potential). As you increase L, you increase the length of the barrier so it does not surprise me that the transmission drops to 0.
Happy Kwanting,
Joe
Hi,
And how can I set lead1's potential correctly? What is wrong in my script zigzag.py? I have the same function onsite both for scattering region and for leads:
def *potential*( site, _U ): x, y = site.pos return _U if x >= 0 else 0
def *onsite*( site, _U=0 ): return eps + *potential*( site, _U )
syst = kwant.Builder()
syst[graphene.shape(stripe, (0,0))] = *onsite*
*** sym1 = kwant.TranslationalSymmetry(graphene.vec((2, -1))) def lead1_shape(pos): x, y = pos return abs(y) <= 0.5*_W
lead1 = kwant.Builder(sym1) lead1[graphene.shape(lead1_shape, (0, 0))] = *onsite*
There is a warning in the second tutorial about this [1]. This comes from the fact that the lead Hamiltonian is evaluated at the lead's fundamental domain, which is centered around the origin. To correct this you should set the lead onsites as: def lead0_onsite(site, _U=0): return eps def lead1_onsite(site, _U=0): return eps + _U Happy Kwanting, Joe [1]: https://kwant-project.org/doc/1/tutorial/tutorial2#spatially-dependent-value...
OK... I think I should learn Python better. Could You point me to some Python's topic which explains why in the case of syst[graphene.shape(stripe, (0,0))] = onsite _U argument is passed to the 'potential' function, and in the case of lead1[graphene.shape(lead1_shape, (0, 0))] = onsite _U=0 default value is passed to it? Great thanks! Jambulat 2017-03-29 14:59 GMT+03:00 Joseph Weston <joseph.weston08@gmail.com>:
Hi,
And how can I set lead1's potential correctly? What is wrong in my script zigzag.py? I have the same function onsite both for scattering region and for leads:
def *potential*( site, _U ): x, y = site.pos return _U if x >= 0 else 0
def *onsite*( site, _U=0 ): return eps + *potential*( site, _U )
syst = kwant.Builder()
syst[graphene.shape(stripe, (0,0))] = *onsite*
*** sym1 = kwant.TranslationalSymmetry(graphene.vec((2, -1))) def lead1_shape(pos): x, y = pos return abs(y) <= 0.5*_W
lead1 = kwant.Builder(sym1) lead1[graphene.shape(lead1_shape, (0, 0))] = *onsite*
There is a warning in the second tutorial about this [1]. This comes from the fact that the lead Hamiltonian is evaluated at the lead's fundamental domain, which is centered around the origin.
To correct this you should set the lead onsites as:
def lead0_onsite(site, _U=0): return eps
def lead1_onsite(site, _U=0): return eps + _U
Happy Kwanting,
Joe
[1]: https://kwant-project.org/doc/1/tutorial/tutorial2# spatially-dependent-values-through-functions
Hi,
OK... I think I should learn Python better. Could You point me to some Python's topic which explains why in the case of syst[graphene.shape(stripe, (0,0))] = onsite _U argument is passed to the 'potential' function, and in the case of lead1[graphene.shape(lead1_shape, (0, 0))] = onsite _U=0 default value is passed to it?
I don't understand what you are asking. You defined a function def onsite( site, _U=0 ): return eps + potential( site, _U ) so in the example code I posted last time I just used the same signature (i.e. with a default for '_U') for my 'lead_onsite' function as you did for your 'onsite' function! Using default values for parameters in your Hamiltonian value functions is probably a bad idea because it's better to be explicit about what parameters you are using to avoid shooting yourself in the foot. Happy Kwanting, Joe
participants (2)
-
Jambulat Basaev
-
Joseph Weston