Calculating valley polarized conductances using Kwant
Dear community, I would like to calculate the valley polarized conductance for a graphene nanoribbon with 2 leads (let’s say in the x-direction). My current approach is this: 1) Get the S-matrix for a certain energy 2) Find the indices of the modes with positive velocities 3) Separate these modes by positive and negative momenta 4) Get the sub matrix from the S-matrix 5) Sum the transmission coefficients for positive and negative momenta The code below illustrates these 5 steps: import progressbar def valleyPolarizability(syst, energies, lead_start=0, lead_end=1): KPs = [] Ks = [] bar = progressbar.ProgressBar() for energy in bar(energies): smatrix = kwant.smatrix(syst, energy, params={'phi': phi}) positives = np.where(smatrix.lead_info[lead_start].velocities >= 0)[0] momentas = smatrix.lead_info[lead_start].momenta[positives] K_prime_indices = np.where(momentas < 0)[0] K_indices = np.where(momentas >= 0)[0] submatrix = smatrix.submatrix(lead_end, lead_start) K_prime_T = np.absolute(np.sum(submatrix[:, K_prime_indices]))**2 K_T = np.absolute(np.sum(submatrix[:, K_indices]))**2 KPs.append(K_prime_T) Ks.append(K_T) return KPs, Ks Could someone please let me know if this is the correct approach? Will the K_prime_indices and K_indices have the correct indexing in the sub matrix? Thanks, Kevin Ryczko
Hi Kevin, Thanks for the well-posed and focused question!
I would like to calculate the valley polarized conductance for a graphene nanoribbon with 2 leads (let’s say in the x-direction). My current approach is this:
1) Get the S-matrix for a certain energy 2) Find the indices of the modes with positive velocities 3) Separate these modes by positive and negative momenta 4) Get the sub matrix from the S-matrix 5) Sum the transmission coefficients for positive and negative momenta
This is the right idea.
2) Find the indices of the modes with positive velocities
positive velocity and momentum directions are defined with respect to
We only care about selecting (by their valley) the correct *incoming* modes. In Kwant's convention these are the modes with *negative*, not positive, velocity. This is in an obscure part of the documentation [1], where we say the translational symmetry direction of the [lead] When leads are attached to a scattering region, their symmetry direction points *away* from the scattering region "towards infinity", which means that the incoming modes have negative velocity in Kwant's convention.
The code below illustrates these 5 steps:
import progressbar def valleyPolarizability(syst, energies, lead_start=0, lead_end=1): KPs = [] Ks = [] bar = progressbar.ProgressBar() for energy in bar(energies): smatrix = kwant.smatrix(syst, energy, params={'phi': phi}) positives = np.where(smatrix.lead_info[lead_start].velocities >= 0)[0] momentas = smatrix.lead_info[lead_start].momenta[positives] K_prime_indices = np.where(momentas < 0)[0] K_indices = np.where(momentas >= 0)[0] submatrix = smatrix.submatrix(lead_end, lead_start) K_prime_T = np.absolute(np.sum(submatrix[:, K_prime_indices]))**2 K_T = np.absolute(np.sum(submatrix[:, K_indices]))**2 KPs.append(K_prime_T) Ks.append(K_T) return KPs, Ks
This is almost correct except for a couple of things. Firstly we should select the modes that have negative velocity, as already discussed. Secondly:
K_prime_T = np.absolute(np.sum(submatrix[:, K_prime_indices]))**2
Here you're summing the scattering *amplitudes*, when you really want to sum the scattering *probabilities*:
K_prime_T = np.sum(np.abs(submatrix[:, K_prime_indices]))**2
i.e. you need to take the absolute square before summing. Happy Kwanting, Joe [1]: https://kwant-project.org/doc/1.3/reference/generated/kwant.physics.Propagat...
participants (2)
-
Joseph Weston
-
Kevin Ryczko