Conductance of graphene nanoribbons: Difference between revisions
From phys824
Jump to navigationJump to search
No edit summary |
No edit summary |
||
| Line 70: | Line 70: | ||
## leads ## | ## leads ## | ||
leads = [create_lead_h(W, xsym)] | leads = [create_lead_h(W, xsym)] | ||
leads += [lead.reversed() for lead in leads] # right | leads += [lead.reversed() for lead in leads] # right lead | ||
for lead in leads: | for lead in leads: | ||
sys.attach_lead(lead) | sys.attach_lead(lead) | ||
Revision as of 10:25, 26 October 2016
agnr.py
from math import sqrt
import random
import itertools as it
import tinyarray as ta
import numpy as np
import matplotlib.pyplot as plt
import kwant
class Honeycomb(kwant.lattice.Polyatomic):
"""Honeycomb lattice with methods for dealing with hexagons"""
def __init__(self, name=''):
prim_vecs = [[sqrt(3)/2, 0.5], [0, 1]] # bravais lattice vectors
# offset the lattice so that it is symmetric around x and y axes
basis_vecs = [[-1/sqrt(12), -0.5], [1/sqrt(12), -0.5]]
super(Honeycomb, self).__init__(prim_vecs, basis_vecs, name)
self.a, self.b = self.sublattices
def hexagon(self, tag):
""" Get sites belonging to hexagon with the given tag.
Returns sites in counter-clockwise order starting
from the lower-left site.
"""
tag = ta.array(tag)
# a-sites b-sites
deltas = [(0, 0), (0, 0),
(1, 0), (0, 1),
(0, 1), (-1, 1)]
lats = it.cycle(self.sublattices)
return (lat(*(tag + delta)) for lat, delta in zip(lats, deltas))
def hexagon_neighbors(self, tag, n=1):
""" Get n'th nearest neighbor hoppings within the hexagon with
the given tag.
"""
hex_sites = list(self.hexagon(tag))
return ((hex_sites[(i+n)%6], hex_sites[i%6]) for i in xrange(6))
def ribbon(W, L):
def shape(pos):
return (-L <= pos[0] <= L and -W <= pos[1] <= W)
return shape
def onsite_potential(site, params):
return params['ep']
def kinetic(site_i, site_j, params):
return -params['gamma']
lat = Honeycomb()
pv1, pv2 = lat.prim_vecs
xsym = kwant.TranslationalSymmetry(pv2 - 2*pv1) # lattice symmetry in -x direction
ysym = kwant.TranslationalSymmetry(-pv2) # lattice symmetry in -y direction
def create_lead_h(W, symmetry, axis=(0, 0)):
lead = kwant.Builder(symmetry)
lead[lat.wire(axis, W)] = 0.
lead[lat.neighbors(1)] = kinetic
return lead
def create_system(W, L):
## scattering region ##
sys = kwant.Builder()
sys[lat.shape(ribbon(W, L), (0, 0))] = onsite_potential
sys[lat.neighbors(1)] = kinetic
## leads ##
leads = [create_lead_h(W, xsym)]
leads += [lead.reversed() for lead in leads] # right lead
for lead in leads:
sys.attach_lead(lead)
return sys
def plot_bands(sys):
fsys = sys.finalized()
kwant.plotter.bands(fsys.leads[0], args=(dict(gamma=1., ep=0.),))
def plot_conductance(sys, energies):
fsys = sys.finalized()
data = []
for energy in energies:
smatrix = kwant.smatrix(fsys, energy, args=(dict(gamma=1., ep=0.),))
data.append(smatrix.transmission(1, 0))
plt.figure()
plt.plot(energies, data)
plt.xlabel("energy (t)")
plt.ylabel("conductance (e^2/h)")
plt.show()
if __name__ == '__main__':
sys = create_system(9, 20)
kwant.plot(sys)
plot_bands(sys)
Es = np.linspace(-0.5, 0.5, 100)
plot_conductance(sys, Es)