Annulene molecule between two graphene nanoribbon electrodes nanojunction

From phys824
Jump to navigationJump to search
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]