I defined a QAHE hamiltonian:
ham = ("alpha * (k_x * sigma_x - k_y * sigma_y)" "+ (m + beta * kk) * sigma_z" "+ (gamma * kk + U) * sigma_0") subs = {"kk": "k_x**2 + k_y**2"}
Upon using the continuum.discretize I was able to plot bands etc but am struggling to plot the conductance. Using the method from the kwant documentation I am getting the following error:
UserCodeError: Error occurred in user-supplied value function "onsite". See the upper part of the above backtrace for more information.
I am new to kwant so any help would be appreciated!
Dear Declan,
If you post a small code reproducing your error message, someone may help you.
Best regards, Adel
On Mon, Jun 1, 2020 at 5:52 PM declanburke95@gmail.com wrote:
I defined a QAHE hamiltonian:
ham = ("alpha * (k_x * sigma_x - k_y * sigma_y)" "+ (m + beta * kk) * sigma_z" "+ (gamma * kk + U) * sigma_0") subs = {"kk": "k_x**2 + k_y**2"}
Upon using the continuum.discretize I was able to plot bands etc but am struggling to plot the conductance. Using the method from the kwant documentation I am getting the following error:
UserCodeError: Error occurred in user-supplied value function "onsite". See the upper part of the above backtrace for more information.
I am new to kwant so any help would be appreciated!
So the code for the conductance was:
energies = [] data = [] for ie in range(100): energy = ie * 0.01
smatrix = kwant.smatrix(syst, energy)
energies.append(energy) data.append(smatrix.transmission(0,1)
which gave the error:
UserCodeError: Error occurred in user-supplied value function "onsite". See the upper part of the above backtrace for more information.
Dear Declan, Did you put leads ? How did you construct the system
Provide a code that we can paste directly and run to reproduce your error.
Adel
On Mon, 1 Jun 2020, 21:51 , declanburke95@gmail.com wrote:
So the code for the conductance was:
energies = [] data = [] for ie in range(100): energy = ie * 0.01
smatrix = kwant.smatrix(syst, energy) energies.append(energy) data.append(smatrix.transmission(0,1)
which gave the error:
UserCodeError: Error occurred in user-supplied value function "onsite". See the upper part of the above backtrace for more information.
import matplotlib.pyplot as plt import kwant import kwant.continuum
syst = kwant.Builder() print(syst)
a = 10 # angstroms norbs = 2 # 2 atomic orbitals * 2 spins * particle-hole at = kwant.lattice.cubic(a, norbs=norbs) #chain (1D), cubic (3D), triangular, honeycomb, kagome #print(lat)
ham = ("alpha * (k_x * sigma_x - k_y * sigma_y)" "+ (m + beta * kk) * sigma_z" "+ (gamma * kk + U) * sigma_0") subs = {"kk": "k_x**2 + k_y**2"}
ham_discretized = kwant.continuum.discretize(ham, locals=subs, grid=a) print(ham_discretized)
# dimensions in angstroms L = 300 W = 50 H = 100
def syst_shape(site): (x, y) = site.pos return (0 <= x <= L and 0 <= y <= W)
syst.fill(ham_discretized, syst_shape, (0, 0));
lead_left = kwant.Builder(kwant.TranslationalSymmetry((-a, 0))) lead_right = kwant.Builder(kwant.TranslationalSymmetry((a, 0)))
L_lead = L W_lead = W
def lead_shape(site): (x, y) = site.pos return (0 <= x <= L_lead and 0 <= y <= W_lead)
lead_left.fill(ham_discretized, lead_shape, (0, 0)); lead_right.fill(ham_discretized, lead_shape, (L, 0));
syst_leads = syst
syst_leads.attach_lead(lead_left) syst_leads.attach_lead(lead_right)
kwant.plot(syst_leads);
syst = syst.finalized() syst_leads = syst_leads.finalized()
params = dict(alpha=0.365, beta=0.686, gamma=0.512, m=-0.01, U=-0)
psi = kwant.wave_function(syst, energy=params['m'], params=params)(0) J = kwant.operator.Current(syst).bind(params=params) current = sum(J(p) for p in psi) kwant.plotter.current(syst, current)
kwant.plotter.bands(syst_leads.leads[0], params=params);
energies = [] data = [] for ie in range(100): energy = ie * 0.01
# compute the scattering matrix at a given energy smatrix = kwant.smatrix(syst, energy)
# compute the transmission probability from lead 0 to # lead 1 energies.append(energy) data.append(smatrix.transmission(0,1)(0,0))
plt.figure() plt.plot(energies, data) plt.xlabel("energy [t]") plt.ylabel("conductance [e^2/h]") plt.show()
Dear Declan,
The leads have translation invariance in the x-direction. You should not put a condition such as (0 <= x <= L_lead ) in your lead_shape function.
You can notice that kwant does not plot the leads are you expect them to be. Please change your function to:
def lead_shape(site): (x, y) = site.pos return 0 <= y <= W_lead
I hope this helps, Adel
On Mon, Jun 1, 2020 at 10:04 PM declanburke95@gmail.com wrote:
import matplotlib.pyplot as plt import kwant import kwant.continuum
syst = kwant.Builder() print(syst)
a = 10 # angstroms norbs = 2 # 2 atomic orbitals * 2 spins * particle-hole at = kwant.lattice.cubic(a, norbs=norbs) #chain (1D), cubic (3D), triangular, honeycomb, kagome #print(lat)
ham = ("alpha * (k_x * sigma_x - k_y * sigma_y)" "+ (m + beta * kk) * sigma_z" "+ (gamma * kk + U) * sigma_0") subs = {"kk": "k_x**2 + k_y**2"}
ham_discretized = kwant.continuum.discretize(ham, locals=subs, grid=a) print(ham_discretized)
# dimensions in angstroms L = 300 W = 50 H = 100
def syst_shape(site): (x, y) = site.pos return (0 <= x <= L and 0 <= y <= W)
syst.fill(ham_discretized, syst_shape, (0, 0));
lead_left = kwant.Builder(kwant.TranslationalSymmetry((-a, 0))) lead_right = kwant.Builder(kwant.TranslationalSymmetry((a, 0)))
L_lead = L W_lead = W
def lead_shape(site): (x, y) = site.pos return (0 <= x <= L_lead and 0 <= y <= W_lead)
lead_left.fill(ham_discretized, lead_shape, (0, 0)); lead_right.fill(ham_discretized, lead_shape, (L, 0));
syst_leads = syst
syst_leads.attach_lead(lead_left) syst_leads.attach_lead(lead_right)
kwant.plot(syst_leads);
syst = syst.finalized() syst_leads = syst_leads.finalized()
params = dict(alpha=0.365, beta=0.686, gamma=0.512, m=-0.01, U=-0)
psi = kwant.wave_function(syst, energy=params['m'], params=params)(0) J = kwant.operator.Current(syst).bind(params=params) current = sum(J(p) for p in psi) kwant.plotter.current(syst, current)
kwant.plotter.bands(syst_leads.leads[0], params=params);
energies = [] data = [] for ie in range(100): energy = ie * 0.01
# compute the scattering matrix at a given energy smatrix = kwant.smatrix(syst, energy) # compute the transmission probability from lead 0 to # lead 1 energies.append(energy) data.append(smatrix.transmission(0,1)(0,0))
plt.figure() plt.plot(energies, data) plt.xlabel("energy [t]") plt.ylabel("conductance [e^2/h]") plt.show()