Conductance of annulene molecule between graphene nanoribbon leads
From phys824
Jump to navigationJump to search
STEP 1: Relax the coordinates
from gpaw import *
from ase import *
from gpaw.transport.calculator import Transport
from ase.io import read
system = read('zgnr-annulene.xyz') # reading input file; *.traj format is also accepted
#system = read('zgnr-annulene.traj')
system.cell = [28.0, 11.0, 44.9305] # assigning system cell size
system.pbc=(1,1,1) # periodice along x, y and z
#system.center() # centering in the box
#view(system)
# setting up the calculation
calc = GPAW(h=0.2, # real-space grid spacing
xc='PBE', # assigning exchange-correlation type
basis='dzp', # assigning functional type
kpts=(1,2,1), # assigning k-points
occupations=FermiDirac(0.2, maxiter=2000), # 1st argument kBT, 2nd argument number of iterations
mode='lcao', # using LCAO mode
txt='ni_gnr_ni.txt', # output log file
maxiter=300, # number of max scf-iterations
poissonsolver=PoissonSolver(nn=2), # using Poisson solver
mixer=Mixer(0.01, 5, weight=100.0)) # using pulley mixing
# Set calculator
system.set_calculator(calc)
constraint=constraints.FixAtoms(mask=[i<18 or i >271 for i in range(290)]) # constrained to keep atoms fixed
system.set_constraint(constraint)
#qn=BFGS(system,trajectory='ni_gnr_ni.traj')
relax=optimize.BFGS(system,trajectory='zgnr-annulene_new.traj') # assigning optimization solver type
relax.run(fmax=0.03) # max force tolerance
STEP 2: Compute zero-bias transmission function
from gpaw import *
from ase import *
from gpaw.transport.calculator import Transport
import numpy as np
from ase.visualize import view
name = 'zgnr' # Name of the output file
# reading the input geometry in *.traj format; *.xyz format is also accepted
system = io.read('zgnr-annulene.traj')
nn = np.argsort(system.get_positions()[:,2])
system = system[nn] # storing coordinates of the geometry to system
R = system.get_positions() # storing indices of position
Luc = R[36,2]-R[0,2] # computing length of electrode (which contains 36 atoms) along transport direction
# Extend the scattering region
left = system[:36].copy() # copying L-electrode to left
right = system[-36:].copy() # copying R-electrode to right
left.translate([0,0,-Luc]) # shifting coordinates to the left
right.translate([0,0,Luc]) # shifting coordinates to the right
C = system.cell # storing original cell size
C[2,2] += 2*Luc # extend the cell size
system = left + system + right # coordinates of the extended cell
system.set_cell(C)
system.set_pbc([1,1,1]) # repeating cell along 3-orthogonal coordinates; [1, 1, 1] means NO repetition
system.center() # centering the cell into the box
view(system)
write('system.traj',system) # writing the extended cell
lead_cell = np.diag(system.cell) # original length of the electrode
lead_cell[2]=2*Luc # defining extended electrodes length
pl_atoms1=range(72) # assigning atoms of the L-electrode
pl_atoms2=range(290,362) # assigning atoms of the R-electrode
pl_cell1= lead_cell # assigning L-elec size
pl_cell2= lead_cell # assigning R-elec size
basis= 'dz(dzp)' # assigning functional to be used
# Defining the parameters/arguments to be used in transport calculation
t = Transport( h=0.2, # grid space along x,y and z
xc='PBE', # exchange functional
basis=basis, # basis set
kpts=(1, 1, 1), # No of k-points for the electrodes
occupations=FermiDirac(0.1), # room temperature kBT = 0.025 eV
mode='lcao', # using LCAO mode
txt=name+'.txt', # output file
poissonsolver=PoissonSolver(nn=2),
mixer=Mixer(0.1, 5, weight=100.0), # using pulley mixing
pl_atoms=[pl_atoms1, pl_atoms2], # setting up two electrodes
pl_cells=[pl_cell1, pl_cell2], # setting up electrodes cells
pl_kpts=[1, 1, 15], # k-points for the scatting region
edge_atoms=[[0 , 71],[0 , 361]], # Defining edge atoms in the form [[L_i, R_f][C_i, C_f]]
non_sc = True, # True = Normal DFT (default), False = NEGF-DFT
mol_atoms=range(72, 290), # molecule atoms in the scattering part
plot_energy_range = [-0.1,0.1], # min and max energy
plot_energy_point_num = 201) # No of energy points
system.set_calculator(t)
t.negf_prepare()
t.non_sc_analysis() # Calculating T(E=0)
STEP 3: Extract transmission function data from the output file obtained in STEP 2
- On Chimera execute: mpirun gpaw-python transmission.py '0*' > transmission.dat
from gpaw.transport.analysor import Transport_Plotter
import numpy as np
import sys
from pylab import *
if '*' in sys.argv[1]:
fd=0
bias_step = int(sys.argv[1].split('*')[0])
else:
fd=1
bias_step = int(sys.argv[1])
plotter=Transport_Plotter(fd)
plotter.plot_setup()
tc = plotter.tc(bias_step, s=0)
#tc2 = plotter.tc(bias_step, s=1)
ee=np.linspace(-1,1,201)
#plot(ee, tc, 'b-o')
#plot(ee, tc, 'r-')
#plot(ee, tc2, 'b-')
for n in range(201):
print ee[n], tc[n] #, tc2[n]