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.

Creating the device, Hamiltonian $\to$ Hamiltonian

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:

  • It guarentees that the matrix elements are the same as the reference Hamiltonian, i.e. you need not specify the parameters to construct twice,
  • It is much faster when creating systems of $>500,000$ atoms/orbitals from smaller reference systems,
  • It also requires less code which increases readability and is less prone to errors.

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();

Exercises

  • Extract the DOS for each sub-lattice and plot them, see the 1) atom or 2) orbital keywords in the .DOS and .ADOS routines

Learned objectives

  • Calculation of transport in non-orthogonal lattices are possible, this applies to both TBtrans and TranSiesta
  • Extraction of DOS for a subset of atoms