Der Hamiltonoperator eines 1D-Gitters mit Endlichkeit Atome (wenn wir eine Basis pro Atom betrachten) ist wie folgt gegeben Matrix-
Hier ist die Energie vor Ort und ist das Sprungintegral. Wie kann ich also den Hamilton-Operator für ein 2D-Gitter mit endlicher Größe konstruieren? Wenn wir zum Beispiel eine Scheibe von einem Nanodraht nehmen (z. B. quadratischer Si-Nanodraht), erhalten wir ein solches 2D-Gitter mit endlicher Höhe und Breite. Aus diesem Hamilton-Operator einer Scheibe möchte ich den Hamilton-Operator für den gesamten Nanodraht berechnen. Wie kann ich das machen?
Das „einzige“, was Sie tun müssen, ist, ein Mapping zu erstellen. Sie haben eine Basisfunktion bei
Dann müssen Sie die Regeln für Matrixelemente festlegen. Hier ist ein Beispielcode (der in 10 Minuten geschrieben wurde, möglicherweise einige Fehler enthält). Sehen Sie sich an, wie der Sparse-Befehl funktioniert, um zu verstehen, wie der Hamilton-Operator aufgebaut ist. Wie Sie sehen können, gibt es nichts Schwieriges. Nur ist es etwas mühsam, den Überblick über die Indizierung zu behalten. Die eigentliche Diagonalisierung ist dann nur noch eine Zeile. Dem Beispiel fehlt k_z, also müssen Sie das dann selbst einfügen. Dies bedeutet, dass Sie bei der Konstruktion Ihrer Matrixelemente die Streuung berücksichtigen müssen.
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));
Aktualisieren:
Dies sind die Schritte (IHMO), um einen einfachen TB-Code zu erstellen.
1) Ermitteln Sie die Positionen der Atome und Atomtypen (Nehmen Sie zum Beispiel die kubische 8-Atom-Einheitszelle von GaAs und wiederholen Sie sie 15 x 15 x 1 Mal und schneiden Sie dann Atome aus, die zu weit von der Mitte entfernt sind, um einen kugelförmigen Draht zu erzeugen). Protip: Verwenden Sie Gitterebenen und bekannte Oberflächen zum Schneiden.
2) Jedes Atom wird haben Basisfunktionen. Ihr Hamiltonian wird aus Blöcken von bestehen . In Matlab-Notation können alle Hamilton-Matrix-Elemente zwischen zwei Stellen (indiziert mit a1 und a2) geschrieben werden als:
H((a1*N):(a1*N+N-1), (a2*N):(a2*N+N-1) = Hloc;
3) Schleife über alle Atome in deiner Zelle (das bedeutet alle (sagen wir) 200 Atome, nicht die Einheitszelle von GaAs). Schleifen Sie für jedes Atom über seine Nachbarschaft (denken Sie daran, auch in die benachbarten Zellen zu schauen).
4) Berechne alle Hamilton-Matrix-Elemente dieser Atompaare und ADDiere sie an geeigneter Stelle im Hamilton-Operator. (Denken Sie daran, den Phasenfaktor hinzuzufügen, wenn sich die Paare nicht in derselben Einheitszelle befinden).
Bewerten Sie den Unterschied zwischen zwei Atompositionen, und teilen Sie ihn noch besser durch a/4, wobei a Ihre Gitterkonstante ist.
Sie könnten am Ende einen Vektor wie diesen (-1,-1,-1) haben, bei dem Sie leicht ableiten können, dass dies die Interaktion des nächsten Nachbarn ist, und die entsprechenden Matrixelemente hinzufügen.
In Symmetrie, könnten Sie den Absolutwert der drei Elemente des Differenzvektors nehmen und sie sortieren, um einen eindeutigen Deskriptor des Matrixelements zu erhalten. Die Zinkblende-Struktur hat eine geringere Symmetrie, aber es könnte ähnliche Tricks geben.
Michael Kuisma
Alam
Biryani