-
-
Notifications
You must be signed in to change notification settings - Fork 60
Python tight binding
sisl implements an easy data object for creating tight-binding models.
The easiest way to describe the tight-binding model is showcase its usage.
The graphene structure is one of the easiest structures to describe and provide tight-binding parameters for.
First we create the geometry with nearest neighbour interactions
import sisl
# Lattice constant
alat = 1.42
length = ( 1.5 ** 2 + 3. / 4. ) ** .5 * alat
C = sisl.Atom(6,R=alat+0.1) # add small number for numerics
sc = sisl.SuperCell([length,length,10,90,90,60],nsc=[3,3,1])
# Rotate supercell as the initial one is x = cartesian
sc = sc.rotate(-30,v=[0,0,1])
gr = sisl.Geometry([[0,0,0],[1,0,0]], atom=C, sc=sc)
which now results in a graphene unit cell with appropriate periodicity for nearest neighbour interactions.
We now proceed to create the Hamiltonian object
tb = sisl.Hamiltonian(gr)
now we have a Hamiltonian/tight-binding object, but no hopping integrals or on-site energies have been set.
# Denote interactions ranges
# on-site , nearest neighbour
dR = (0.1 , alat + 0.1)
for ia in gr:
# Get interacting atoms
idx = gr.close(ia, dR=dR)
tb[ia,idx[0]] = 0.
tb[ia,idx[1]] = -2.7
there are a few things going on here:
-
dR
is an array of arbitrary length which can be understood as spherical radiis. The number of elements can be arbitrarily long. -
The
.close
command is a neighbourhood searching function which returns lists of atomic indices close to a position.The first argument is a position in the unit cell. If the first argument is an integer it is taken as an atomic index and the position will be the atomic coordinate. The latter form is used in the above code. The
dR
argument denotes the radii shells where you want to find the closest atoms (in the entire supercell structure).In the above code
idx
returned fromclose
is-
idx[0]
all atoms with distance <= .1 of atomia
-
idx[1]
all atoms 0.1 < distance <= alat + 0.1 of atomia
-
-
tb[ia,idx[0]] = 0.
sets the on-site energy to0
. By default the Hamiltonian object is an orthogonal matrix (i.e. the overlap matrix is the unity matrix). Note that the only atom within 0.1 Å is the atom it self. -
tb[ia,idx[1]] = -2.7
sets the nearest neighbour hopping integral to-2.7
.
To finalise the bandstructure we calculate the bandstructure from
\Gamma
to K
(so not full band-structure).
nk = 200
kpts = np.linspace(0, 1./3, nk)
eigs = np.empty([nk,2],np.float64)
for ik, k in enumerate(kpts):
eigs[ik,:] = tb.eigh(k=[k,-k,0])
import matplotlib.pyplot as plt
plt.plot(kpts,eigs[:,0])
plt.plot(kpts,eigs[:,1])
plt.show()
Which results in this band-structure
Press this source link to get the complete source.
If you want a more thorough explanation of how to setup the individual hopping integrals you can see this source.