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)