In [ ]:
from __future__ import print_function
import sisl
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
This example will setup the required electronic structures for usage in TBtrans.
We will continue with the graphene nearest neighbour tight-binding model and perform simple transport calculations using TBtrans.
Again we require the graphene unit-cell and the construction of the Hamiltonian object:
In [ ]:
graphene = sisl.geom.graphene().tile(2, axis=0)
H = sisl.Hamiltonian(graphene)
H.construct([[0.1, 1.43], [0., -2.7]])
Note that the above call of the graphene lattice is different from TB 2, and similar to TB 1. In this example we will create a non-orthogonal graphene lattice, i.e. the lattice vectors are the minimal lattice vectors of graphene.
The minimal graphene lattice consists of 2 Carbon atoms.
We tile
the Geometry
to make it slightly bigger.
You are encouraged to draw the graphene lattice vectors, and draw an arrow in the direction of the transport (along the 2nd lattice vector). Note that one can calculate transport along non-orthogonal directions (also in TranSiesta).
Assert that we have 16 non zero elements:
In [ ]:
print(H)
The Hamiltonian we have thus far created will be our electrode. Lets write it to a TBtrans readable file:
In [ ]:
H.write('ELEC.nc')
Now a file ELEC.nc
file exists in the folder and it contains all the information (and more) that TBtrans requires to construct the self-energies for the electrode.
The Geometry.tile
function is an explicit method to create bigger lattices from a smaller reference latice. Howewer, the tile
routine is also available to the Hamiltonian
object. Not only is it much easier to use, it also presents these advantages:
Hamiltonian
, i.e. you need not specify the parameters to construct
twice,
In [ ]:
H_device = H.tile(3, axis=1)
print(H_device)
For more information you may execute the following lines to view the documentation:
help(Geometry.tile)
help(Hamiltonian.tile)
Now we have created the device electronic structure. The final step is to store it in a TBtrans readable format:
In [ ]:
H_device.write('DEVICE.nc')
Now run tbtrans:
tbtrans RUN.fdf
In [ ]:
tbt = sisl.get_sile('siesta.TBT.nc')
After calculating the transport properties of the transport problem you may also use sisl
to interact with the TBtrans output (in the *.TBT.nc
file). Please repeat the same convergence tests you performed in example 02.
What are the required k-point sampling compared to 02 for a similar transmission function ?
In [ ]:
plt.plot(tbt.E, tbt.transmission(), label='k-averaged');
plt.plot(tbt.E, tbt.transmission(kavg=tbt.kindex([0, 0, 0])), label=r'$\Gamma$');
plt.xlabel('Energy [eV]'); plt.ylabel('Transmission'); plt.ylim([0, None]) ; plt.legend();