Conductance of graphene nanoribbons: Difference between revisions
From phys824
Jump to navigationJump to search
(Created page with "<pre> script </pre>") |
No edit summary |
||
Line 1: | Line 1: | ||
agnr.py | |||
<pre> | <pre> | ||
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 and bottom leads | |||
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) | |||
</pre> | </pre> |
Revision as of 10:09, 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 and bottom leads 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)