Гамильтониан одномерной решетки с конечными атомов (если рассматривать по одному базису на атом) определяется следующим матрица-
Здесь энергия на месте и является интегралом перескока. Итак, как я могу построить гамильтониан для двумерной решетки конечного размера? Например, если мы возьмем срез нанопроволоки (скажем, нанопроволоки Si квадратной формы), мы получим такую двумерную решетку, имеющую конечные высоту и ширину. Из этого гамильтониана одного среза я хочу вычислить гамильтониан для всей нанопроволоки. Как мне это сделать?
Единственное, что вам нужно сделать, это установить сопоставление. У вас есть базовая функция в
Затем нужно установить правила для элементов матрицы. Вот пример кода (писал, что через 10 минут могут быть баги). Посмотрите, как работает sparse-command, чтобы понять, как строится гамильтониан. Как видите, ничего сложного нет. Только немного утомительно следить за индексацией. Тогда фактическая диагонализация - это всего одна строка. В примере не хватает k_z, так что вам придется вставить его самостоятельно. Это будет означать, что при построении элементов матрицы вам нужно будет учитывать дисперсию.
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));
Обновлять:
Это шаги (IHMO), как создать простой код TB.
1) получить положения атомов и типов атомов (например, взять кубическую элементарную ячейку из 8 атомов GaAs и повторить это 15x15x1 раз, а затем вырезать атомы, которые находятся слишком далеко от центра, чтобы создать сферическую проволоку). Совет: для резки используйте плоскости решетки и известные поверхности.
2) Каждый атом будет иметь Базисные функции. Ваш гамильтониан будет состоять из блоков . В нотации Matlab все матричные элементы Гамильтона между двумя сайтами (с индексами a1 и a2) можно записать как:
H((a1*N):(a1*N+N-1), (a2*N):(a2*N+N-1) = Hloc;
3) Перебрать все атомы в вашей ячейке (это означает все (скажем) 200 атомов, а не элементарную ячейку GaAs). Для каждого атома выполните цикл по его окрестностям (не забудьте также заглянуть в соседние ячейки).
4) Вычислить все матричные элементы гамильтониана этих пар атомов и добавить их в соответствующее место в гамильтониане. (не забудьте добавить фазовый коэффициент, если пары не находятся в одной элементарной ячейке).
Оцените разницу между двумя положениями атомов и, что еще лучше, разделите ее на а/4, где а — постоянная вашей решетки.
У вас может получиться такой вектор (-1,-1,-1), где вы можете легко сделать вывод, что это взаимодействие с ближайшим соседом, и добавить соответствующие матричные элементы.
В симметрии, вы можете взять абсолютное значение трех элементов разностного вектора и отсортировать их, чтобы получить уникальный дескриптор матричного элемента. Структура цинковой обманки имеет более низкую симметрию, но могут быть и подобные трюки.
Микаэль Куисма
Алам
бирьяни