Changing the potential in a continuum Hamiltonian
Hi Jonas, is in example that is here <https://kwant-project.org/doc/1/tutorial/discretize#building-a-kwant-system-...> passed parameter should be a function. If your potential only depends on the spatial coordinates you can follow as in linked example.
From the code you posted I see that you want your potential function to be gate dependent. To achieve that you need to modify your Hamiltonian to
hamiltonian = "k_x**2 + k_y**2 + V(x, y, V_gate)" and define your potential function that takes exactly these arguments. In your example it should be enough to pass dict(V=gate, V_gate=5) to the kwant.smatrix. Please, let me know if it helps. Regards, Rafal -- Rafał Skolasiński GitHub: https://github.com/RafalSkolasinski Kwant GitLab: https://gitlab.kwant-project.org/r-j-skolasinski On 4 June 2018 at 17:15, <Jonas.Wiedenmann@physik.uni-wuerzburg.de> wrote:
Hi everybody,
I hope my problem is rather simple to solve/explain. I would like to create a rectangular system using the function kwant. continuum.discretize, apply a local potential, and plot the conductance of the system as a function of this potential. My Problem is: How to pass the function potential to the system.
So far I used a similar version of the code from tutorial 2.10
*def system(L=70, W=40): hamiltonian = "k_x**2 + k_y**2 + V(x, y)" template = kwant.continuum.discretize(hamiltonian) def 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, shape, (0, 0)); lead = kwant.Builder(kwant.TranslationalSymmetry([-a, 0])) lead.fill(template, lead_shape, (0, 0)) syst.attach_lead(lead) syst.attach_lead(lead.reversed()) kwant.plotter.map(syst, lambda s: V(s, 0.5)); return syst*
Then, I defined a potential which returns for a given position x,y a number (This is taken from a kwant tutorial named: Transport through a barrier)
*def rectangular_gate_pot(distance, left, right, bottom, top): d, l, r, b, t = distance, left, right, bottom, top def g(u, v): return atan2(u * v, d * sqrt(u**2 + v**2 + d**2)) / (2 * pi) def func(x, y, voltage): return voltage * (g(x-l, y-b) + g(x-l, t-y) + g(r-x, y-b) + g(r-x, t-y)) return funcgate = rectangular_gate_pot(10, 30, 40, -10, 50)*
*def potential(site, V):* x, y = site.pos return gate(x, y, V)
Next, I would like to calculate the conductance. I used again a snipped from the tutorial but I do not understand how I can properly address the potential
*def plot_transmission(syst, energy, voltages):* * trans = []* * for voltage in voltages:* * smatrix = kwant.smatrix(syst, energy, *dict(V=potential(*what do I have to put in here or does it not work this way??*)*)* * trans.append(smatrix.transmission(1, 0))* * pyplot.plot(params, trans)*
Hi, You can do what you want by declaring extra parameters to the 'V' function when you make your Hamiltonian: H = 'k_x**2 + k_y**2 + V(x, y, Vgate)' template = kwant.continuum.discretize(H) syst = kwant.Builder() syst.fill(template, ...) ... def gate(x, y, Vgate): return ... ... syst = syst.finalized() kwant.smatrix(syst, params=dict(V=gate, Vgate=3)) Note how 'Vgate' appears in the original Hamiltonian string, as a parameter to 'gate', and as an argument when passing parameters to the system when calling 'smatrix'. Happy Kwanting, Joe On 06/04/2018 05:15 PM, Jonas.Wiedenmann@physik.uni-wuerzburg.de wrote:
Hi everybody,
I hope my problem is rather simple to solve/explain. I would like to create a rectangular system using the function kwant.continuum.discretize, apply a local potential, and plot the conductance of the system as a function of this potential. My Problem is: How to pass the function potential to the system.
So far I used a similar version of the code from tutorial 2.10
/ def system(L=70, W=40): hamiltonian = "k_x**2 + k_y**2 + V(x, y)" template = kwant.continuum.discretize(hamiltonian) def 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, shape, (0, 0)); lead = kwant.Builder(kwant.TranslationalSymmetry([-a, 0])) lead.fill(template, lead_shape, (0, 0)) syst.attach_lead(lead) syst.attach_lead(lead.reversed()) / kwant.plotter.map(syst, lambda s: V(s, 0.5)); / / / return syst /
Then, I defined a potential which returns for a given position x,y a number (This is taken from a kwant tutorial named: Transport through a barrier)
/ def rectangular_gate_pot(distance, left, right, bottom, top): d, l, r, b, t = distance, left, right, bottom, top
def g(u, v): return atan2(u * v, d * sqrt(u**2 + v**2 + d**2)) / (2 * pi)
def func(x, y, voltage): return voltage * (g(x-l, y-b) + g(x-l, t-y) + g(r-x, y-b) + g(r-x, t-y))
return func
gate = rectangular_gate_pot(10, 30, 40, -10, 50)
/
/ def potential(site, V): / x, y = site.pos return gate(x, y, V)
Next, I would like to calculate the conductance. I used again a snipped from the tutorial but I do not understand how I can properly address the potential
/def plot_transmission(syst, energy, voltages):/ / trans = []/ / for voltage in voltages:/ / smatrix = kwant.smatrix(syst, energy, /dict(V=potential(*what do I have to put in here or does it not work this way??*)/)/ / trans.append(smatrix.transmission(1, 0))/ / pyplot.plot(params, trans)/
participants (3)
-
Jonas.Wiedenmann@physik.uni-wuerzburg.de -
Joseph Weston -
Rafal Skolasinski