Conductance of graphene nanoribbons
From phys824
Jump to navigationJump to search
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)