# Tight binding Hamiltonian for 2D finite dimensional lattice and nanowire

The Hamiltonian of a 1D lattice having finite $$N$$ atoms, (if we consider one basis per atom) is given by the following $$N\times N$$ matrix-

Here $$E$$ is the onsite energy and $$t$$ is the hopping integral. So, how can I construct the Hamiltonian for 2D finite size lattice? For example, if we take a slice from a nanowire (say square shape Si nanowire), we will get such 2D lattice having finite height and width. From that Hamiltonian of one slice, I want to calculate the Hamiltonian for the complete nanowire. How can I do that?

• Are you asking construction with some code, or mathematical notation how to construct such a matrix? With calculate, do you mean diagonalize? Do you want to diagonalize it by hand, or with computer program? Jan 17, 2016 at 16:41
• I need to know how to construct the Hamiltonian matrix for a nanowire, having two finite width, and one infinite length. I shall diagonalize using MATLAB code. Forming proper Hamiltonian (H) for Bulk and ultra-thin-body (UTB) I already obtained the dispersion for them while failed to construct H for nanowire. For how I wrote the bulk and UTB Hamiltonian, and what specifically I need please see the link- drive.google.com/file/d/0B1uxzqELZ2NNVTNrYXRsTENxU1k/…
– Alam
Jan 18, 2016 at 6:20
• For a Cartesian grid in 2D you will get a pentadiagonal matrix (as opposed to tri-diagonal in 1D). The extra diagonals will correspond to the hopping terms in the y direction. The form of the matrix will be the same as the Laplacian matrix of a Cartesian grid. Jun 27, 2016 at 5:09

The "only" thing you need to do is to establish a mapping. You have a basis function at

$$\vec{R} = a\vec{X} + b\vec{Y}$$ with index i. In other words, your basis is $\phi_{abi}$. Since Matlab only understands (well) vectors and matrices, you need to map this to a continuous index n. For example, a square with sides $N_a$, and $N_b$ and $N_i$ basis functions per site.

$$n_{abi} = (a + N_a b) N_i + i.$$

Then you need to establish the rules for matrix elements. Here is an example code (wrote that in 10 minutes, might have some bugs). See how sparse-command works to understand how Hamiltonian is constructed. As you can see, there is nothing difficult. Only it is a bit tedious to keep track of the indexing. The actual diagonalization is then just one row. The example lacks k_z, so you have to put that in yourself then. This will mean that in constructing your matrix elements, you will need to take the dispersion into account.

Na = 20; % Number of atoms in x directions
Nb = 20;
Ni = 2;

H_S = [ 1.0 0.1 ; 0.1 1.0 ]; % Hamiltonian for same site interaction
H_NN = [ 0.1 0.0 ; 0.0 0.1 ]; % Hamiltonian for nearest neighbour interaction

% Values to store the constructed sparse hamiltonian
nn1 = [];
nn2 = [];
Hnn = [];

% Loop over all lattice sites
for a1=1:Na, for b1=1:Nb
% Loop over all neighbouring sites
for da=-1:1
a2=a1+da;
if (a2 <1 || a2 > Na)
continue;
end
for db=-1:1
b2=b1+db;
if (b2 <1 || b2 > Nb)
continue;
end
% Loop over all basis function pairs
for i1=1:Ni, for i2=1:Ni
n1 = ((a1-1) + (b1-1) * Na) * Ni + i1; % Magic happends here
n2 = ((a2-1) + (b2-1) * Na) * Ni + i2;
NN = max(abs(da),abs(db));
if (NN == 0)
nn1 = [ nn1 n1 ]; % XXX Super slow
nn2 = [ nn2 n2 ];
Hnn = [ Hnn H_S(i1,i2) ];
end
if (NN == 1)
nn1 = [ nn1 n1 ]; % XXX Super slow
nn2 = [ nn2 n2 ];
Hnn = [ Hnn H_NN(i1,i2) ];
end
end,end
end
end, end
end
H = sparse(nn1, nn2, Hnn);
[U,E] = eig(H);
plot(diag(E));


Update:

This are the steps (IHMO) how to build a simple TB code.

1) get the positions of the atoms and atom types (For example, take the cubic 8 atom unit cell of GaAs and repeat it 15x15x1 times and then cut out atoms which are too far from the center, to create spherical wire). Protip: Use lattice planes and well known surfaces to cut.

2) Each atom will have $N_b$ basis functions. Your Hamiltonian will consist of blocks of $N_b \times N_b$. In matlab notation, all the Hamiltonian matrix elements between two sites (indexed with a1 and a2) can be written as:

H((a1*N):(a1*N+N-1), (a2*N):(a2*N+N-1) = Hloc;


3) Loop over all atoms in the your cell (this means all the (say) 200 atoms, not the unitcell of GaAs). For each atom, loop over it's neighbourhood (remember to look also in the neighboring cells).

4) Calculate all Hamiltonian matrix elements of these atom pairs and ADD them to appropriate place in Hamiltonian. (remember to add phase factor, if the pairs are not in the same unit cell).

Evaluate the difference between two atomic positions, and better yet, divide it with a/4, where a is your lattice constant. $$\Delta R = (R_{a1} - R_{a2}) / (a/4)$$.

You might end have a vector like this (-1,-1,-1), where you can easily deduce that this is the nearest neighbor interaction, and add the appropriate matrix elements.

In $O_h$ symmetry, you could take absolute value of the three elements of the difference vector and sort them to get an unique descriptor of the matrix element. Zinc-blende structure has lower symmetry, but there might be similar tricks.

• Thank you for the code, though I did not want it. I am dealing with GaAs in which one atom is surrounded by 4 neighbor. If we take the cation at (0 0 0), then four vectors x0=[1 1 1]/4; x1=[1 -1 -1]/4; x2=[-1 1 -1]/4; x3=[-1 -1 1]/4; connects four anion with the cation. Now combining these 5 atoms, I make one unit cell, Hamiltonian of which is H_u=[Haa Hac; Hca Hcc]. Haa is the onsite energy of anion and Hac is the overlap between anion & cation (with no 'k' here). Then, if if have 5 unit cells along x and 5 along y, I want to write the Hamiltonian for one slab "H_s" say, in terms on H_u.
– Alam
Jan 18, 2016 at 17:38
• That is equivalent to repeating the unit cell along 'x' and 'y' directions five times. Afterward I shall write the total Hamiltonian of the nanowire (with "k_z" terms) as H=H_s_i + H_s_(i-1)exp(-ik.z) + H_s_(i+1)exp(ik.z). So how these matrices H_s_i, H_s_(i+1), H_s_(i-1) would look? (I want to write them by hand before using any codes. That makes understanding much clear).
– Alam
Jan 18, 2016 at 17:39
• Sorry, I am still confused at which part you are stuck here. There are basically three steps to make a simple tight binding code. 1) Figure out the unit cell (in your case, periodic to one direction) 2) Figure out all the atom sites, and their type (Ga, As) within that unit cell 3) Calculate the Hamiltonian matrix elements between all the basis functions at all sites (and be smart about it). Have you figured out 1 and 2 already? Jan 18, 2016 at 22:47
• lets we have one atom unit cell and one basis in a 1D lattice, where position of each unit cell is given by R=ax. If onsite energy is 'e' and NN interaction is 't' then the Hamiltonian for "4 unit cells" will be- H_1D=[e t 0 0; t e t 0; 0 t e t; 0 0 t e]. Now lets the same unit cell forms 2D crystal where position of each unit cell is given by R=ax+by. Here we can think the 1D chain is repeating along y direction therefore H_2D can be written in terms of H_1D as- H_2D=[H_1D [T] [0] [0]; [T] H_1D [T] [0]; [0] [T] H_1D [T]; [0] [0] [T] H_1D], where [T] would be diag(t, t, t, t).
– Alam
Jan 19, 2016 at 14:25
• Now, lets this finite 2D crystal repeats along 'z'. So, we can write the nanowire Hamiltonian taking 3 such 2D Hamiltonian, located at z=0, z=+1, z=-1 as- H_nw=H_2D_0 + T_2Dext(ikz) + T_2Dexp(ik(-z)). However, thinking this way is pretty simple for perfect square lattice. In case of GaAs, I took one Ga and one As forming an unit cell. (Basis is not my problem, lets one basis at first). In that case the crystal would be a FCC one. The H for onsite energy (for two atom unit cell) is [Haa 0; 0 Hcc].
– Alam
Jan 19, 2016 at 14:42