Ich habe versucht, Kwant zu verwenden, ein Python-Modul für die Quantentransportberechnung

Einführung

Die Untersuchung der Eigenschaften einer Substanz durch Angabe eines Stimulus (z. B. eines elektrischen Feldes) an die Substanz und Beobachtung der Reaktion (z. B. eines Stroms) ist die Grundlage der Physik der physikalischen Eigenschaften, es ist jedoch ziemlich schwierig, Simulationen und numerische Berechnungen tatsächlich durchzuführen.

Daher werde ich das Open-Source-Python-Modul "Kwant" vorstellen, mit dem das Phänomen des Quantentransports leicht analysiert werden kann.

Was ist Kwant?

Kwant ist ein eng bindender Modelllöser, der noch von Forschern des Grenoble Atomic Energy Research Center und des Delfter Instituts für Technologie aktiv entwickelt wird. Es ist auch Papier. Die Dokumentation auf der ursprünglichen Website ist sehr umfangreich, und Sie können physikalisch interessante Berechnungsbeispiele einfach reproduzieren und erweitern, indem Sie einfach darauf klicken. Wenn es sich um ein System handelt, das mit einem engen Bindungsmodell geschrieben werden kann, kann es sehr einfach einschließlich der Elektrodenanschlüsse definiert werden und umfasst umfassend Wellenfunktion, Zustandsdichte und Transportberechnung unter Verwendung der Landauer-Buttiker-Formel und der Kubo-Formel.

Ich hatte zuvor darüber nachgedacht, Kwant als Teil meiner Forschung zu verwenden, aber ich musste die Einführung verschieben, da es fast keine Artikel oder Communitys auf Japanisch gab und ich zu diesem Zeitpunkt nichts über Python wusste. Es war. Ich weiß nicht einmal, wie ich es aussprechen soll. Jetzt, da ich etwas Freizeit habe und mich an Python gewöhnt habe, habe ich endlich versucht, es zu verwenden, also möchte ich vorstellen, wie es aussieht.

Mesoskopisches System

Kwant analysiert hauptsächlich physikalische Systeme, die als mesoskopische Systeme bezeichnet werden. Der Punkt der Mesoskopie ist, dass, wenn das Gerät auf atomarer Ebene klein ist, Quanteneffekte wie Einschluss und Interferenz den Transport dominieren. Es ist besonders interessant, dass die Terminals den Quantenzustand und den Transport beeinflussen.

Wenn Sie Supriyo Dattas Reihe "Elektronischer Transport in mesoskopischen Systemen" oder "Grundlagen des Quantentransports" mit "Grundlagen der nanoskaligen physikalischen Eigenschaften" lesen, die auch von der Hauptfamilie empfohlen wird, werde ich hier nicht darauf eingehen, sondern mich auf die Implementierung konzentrieren. hinstellen. Probieren Sie es zuerst aus. Dann denke nach.

Installation

Es wird davon ausgegangen, dass die Umgebung für Python erstellt wurde. Wenn Sie mit Anaconda eine Python-Umgebung erstellen

conda install -c conda-forge kwant

Sie können es auf einmal installieren. Die aktuellste Version ist v1.4. Es scheint, dass Pip es schwer haben wird. Lesen Sie daher bitte das Verfahren der Head-Familie.

Beispiel 1: Quantifizierung der Leitfähigkeit

Befestigen Sie zunächst als einfachstes Beispiel Klemmen an beiden Enden einer zweidimensionalen rechteckigen Vorrichtung und berechnen Sie die Leitfähigkeit zwischen ihnen. Ich verweise auf hier und die Kapitel 2.2.2 und 2.2.3 des Originaldokuments.

Kwant definiert (baut) zuerst die Gitterform und das System.


#Basismodul importieren
import kwant
import numpy as np
import scipy as sp
import math
import matplotlib.pyplot as plt
%matplotlib inline

#Parameter
W=10 #Gerätebreite
L=30 #Gerätelänge
t=1 #Jüngstes Hüpfen
a=1 #Gitterkonstante

#Gitterform und Systemdefinition
lat = kwant.lattice.square(a)
syst = kwant.Builder()

Dies definiert die Gitterform `lat``` und das System` syst. So wie es ist, ist `` `syst ein leerer Zustand, in dem nur Gawa definiert ist, also werden wir den Inhalt ausfüllen. Der Inhalt hier ist der eng bindende Hamilton-Operator des Systems.

#Potenzial vor Ort
syst[(lat(x, y) for x in range(L) for y in range(W))] = 0

#Jüngstes Hüpfen(y Richtung)
syst[((lat(x, y),lat(x,y-1)) for x in range(L) for y in range(1,W))] = -t
#(x Richtung)
syst[((lat(x, y),lat(x-1,y)) for x in range(1,L) for y in range(W))] = -t

Dadurch wird der eng bindende Hamilton-Operator mit einer Breite von W und einer Länge von L im System gespeichert. Wenn Sie das Hüpfen nur in eine Richtung definieren, wird auch das Hüpfen in die entgegengesetzte Richtung definiert, sodass Hamiltonian zu Elmeet wird. `für x in range (L)` ist eine inklusive Notation von Python.

Definieren Sie als nächstes die Leitungen (Elektrodenanschlüsse). Angenommen, die Leitung erstreckt sich halb unendlich in eine Richtung, geben Sie diese Richtung an. Hier definieren wir zuerst das Terminal, das an der linken Seite des Systems angebracht werden soll. Geben Sie daher die (-1,0) -Richtung an. Das Potenzial und das Hüpfen vor Ort können auf die gleiche Weise wie "System" definiert werden. Wenn Sie jedoch nur Punkte mit den x-Koordinaten 0 und 1 definieren, wird "Translationale Symmetrie ((-a, 0))" definiert Mit `` wird es regelmäßig nach links wiederholt.

#Lead-Definition
lead = kwant.Builder(kwant.TranslationalSymmetry((-a, 0)))

#Potenzial vor Ort
lead[(lat(0, j) for j in range(W))] = 0
#Jüngstes Hüpfen
lead[((lat(0, j), lat(0, j - 1) ) for j in range(1,W))] = -t
lead[((lat(1, j), lat(0, j    ) ) for j in range(0,W))] = -t

Jetzt haben wir einen Lead definiert, der sich unbegrenzt nach links erstreckt, aber immer noch unabhängig von `` `syst``` ist, also werden wir ihn zusammenhalten.

syst.attach_lead(lead)

Nur das.

Befestigen Sie dann das Kabel auch an der gegenüberliegenden rechten Seite. Um die einmal definierte Leitung umzudrehen und an der anderen Seite zu befestigen

syst.attach_lead(lead.reversed())

Nur das. Es ist einfach.

Nun sollte der Zustand, in dem die rechteckige Probe und die beiden Leitungen "Leitung" angebracht sind, in "System" gespeichert werden. Kwant eignet sich auch hervorragend für die Systemvisualisierung, und Sie können auf einen Blick erkennen, welche Art von System entwickelt wurde.

kwant.plot(syst)

ダウンロード .png

Das Hüpfen wird definiert, wenn die blauen Punkte die Beispielgitterpunkte, die roten Punkte die Führungsgitterpunkte und die Linien sind. Sie können sehen, dass die Leitungen sauber an beiden Enden der Probe befestigt sind. Wenn Sie zufrieden sind, vervollständigen Sie das Design.

syst = syst.finalized()

Dies vervollständigt den Entwurf des Systems einschließlich der Klemmen.

Als nächstes berechnen wir die Leitfähigkeit zwischen den Anschlüssen des erstellten Systems. Nach der Landauer-Formel beträgt die interterminale Leitfähigkeit $ e ^ 2 / h in Bezug auf die quantenmechanische Übertragungswahrscheinlichkeit zwischen den Terminals (die durch Eintreffen einer ebenen Welle und Verbinden einer Wellenfunktion in der Mitte erhalten wird). Dies entspricht dem Multiplizieren mit $. Berechnen Sie also die Transparenz. Die Transparenz kann berechnet werden, indem das endgültige "System" und die Energie der einfallenden Welle der Klasse "kwant.smatrix ()" übergeben werden.

conductance = []
energies = np.linspace(-4,-3,50)
for energy in energies:
    #Streumatrix(S-Matrix)Definition von
    smatrix = kwant.smatrix(syst, energy)
    #Berechnet und speichert die Transparenzwahrscheinlichkeit von 0 bis 1.
    conductance.append(smatrix.transmission(1, 0))
#Handlung
plt.plot(energies, conductance)
plt.grid()
plt.xlabel("energy/t")
plt.ylabel("conductance($e^2/h$)")
plt.show()

ダウンロード.png

Es ist einfach. Die Leads sind mit 0, 1, 2 ... in der Reihenfolge `` `attach_lead``` nummeriert, daher werden diesmal 1 und 0 angegeben. Betrachtet man die erhaltenen Ergebnisse, so ist ersichtlich, dass mit zunehmender Energie der einfallenden Welle die Leitfähigkeit schrittweise zunimmt. Dies ist ein Effekt, der dem mesoskopischen System eigen ist, das als Leitungsquantisierung bezeichnet wird, und sein Ursprung ist der quantenmechanische Begrenzungseffekt in y-Richtung.

Rückblickend konnte ich die Hamilton-Definition der Probe, die Hamilton-Definition des Bleis, die Haftung des Bleis und die Berechnung der Leitfähigkeit mit etwa 20 Codezeilen durchführen. Es ist schön und einfach, eine ähnliche Berechnung von Grund auf neu durchzuführen, wenn man bedenkt, dass viel physischer und Codierungsaufwand erforderlich ist, z. B. die Berechnung der Oberflächengrünfunktion der Leads und die Definition des Lead-Sample-Hopping.

Bonus (Spinfreiheit)

Die Einheitsmatrix des Spinraums ist definiert als "s0 = np.array ([[1,0], [0,1]])" und wird in diesem Beispiel als "t" geschrieben. Kann durch Ersetzen durch "t * s0" als Spinregression ausgedrückt werden, und die Leitfähigkeit wird verdoppelt. In ähnlicher Weise können durch Definieren der Pauli-Matrix Spin-Orbital-Wechselwirkungen und Zeeman-Magnetfelder angegeben werden.

Beispiel 2: Quanten-Hall-Effekt

Betrachten Sie als Beispiel für den Umgang mit ungleichmäßigem Potential vor Ort und das Hüpfen zusätzlich zu Beispiel 1 den Quantenlocheffekt eines gestörten Systems. Übrigens müssen Sie beim Umgang mit einer großen Anzahl von Terminals vorsichtig sein. Ich beziehe mich auf verschiedene Teile des Originaldokuments (dasselbe unten).

Unter der Annahme, dass ein Magnetfeld vertikal in der zweidimensionalen Ebene angelegt wird, in der sich das Gerät befindet, befestigen Sie sechs Anschlüsse entsprechend der Anordnung der Lochstangen, die Sie häufig in Experimenten sehen. Der Import von kwant und numpy ist der gleiche wie im obigen Beispiel, daher wird er weggelassen. Erstens ist die Definition der Form des Geräts. Nur die zusätzlichen Parameter werden kommentiert.

W=15
L_lead=6 #Bohrungsbreite
M_lead=6 #Abstand vom Rand der Lochleitung
L=30
t=1
a=1
V=0.05 #Zufällige potentielle Stärke

lat = kwant.lattice.square(a)
syst = kwant.Builder()

Als nächstes definieren wir den Hamilton-Operator des Beispielteils. Das Potenzial vor Ort wird unter Verwendung normaler Zufallszahlen angemessen angegeben. Wir werden wieder das jüngste Hüpfen betrachten und die Piels-Phase aufgrund des vertikalen Magnetfelds berücksichtigen.

#Zufälliges Potenzial vor Ort
for x in range(L):
    for y in range(W):
        syst[lat(x, y)] = np.random.randn()*V

#(xi, yi)Von(xj, yj)Funktion, die das Hüpfen ermöglicht
def hopping(site_i, site_j, phi):
    xi, yi = site_i.pos
    xj, yj = site_j.pos
    return -t*np.exp(-0.5j * phi * (xi - xj) * (yi + yj))

#Jüngstes Hüpfen
syst[lat.neighbors()] = hopping

Im Gegensatz zu Beispiel 1 habe ich versucht, "lat.neighbors ()" als Methode zur Angabe des Hamilton-Operators des Leads zu verwenden. Dies ist nützlich, wenn Sie den nächsten Sprung eines bereits definierten Standortpunkts definieren, da Sie sich nicht die Mühe machen müssen, die Koordinaten anzugeben. Übrigens, wenn n = 2 als Parameter angegeben ist, kann das nächste Proximity-Hopping auf die gleiche Weise definiert werden.

Die Funktion `` `Hopping```, die das Hopping definiert, enthält die Standortinformationen der Verschiebungsquelle und des Verschiebungsziels im ersten und zweiten Argument, und die nachfolgenden Argumente werden als von außen angegebene Parameter interpretiert. Hier hat der Parameter "ph i", der die Stärke des Magnetfelds darstellt, zu diesem Zeitpunkt keinen Wert und kann nach Abschluss von "syst" von außen einen Wert erhalten. Wenn Sie die Parameterabhängigkeit einer Antwort, wie z. B. die Leitfähigkeit, sehen möchten, müssen Sie nicht für jeden Parameterwert "syst" neu definieren und finalisieren (siehe unten).

Definieren Sie dann die 6 Ableitungen der Reihe nach. Beachten Sie, dass die vier anderen Anschlüsse als die beiden an beiden Enden angebrachten Anschlüsse `kwant.TranslationalSymmetry ((0, a))` sind, da sie sich in y-Richtung erstrecken. Der Code für jedes auf einfache Weise geschriebene `lat.neighbors ()` wird ebenfalls auskommentiert.

lead = kwant.Builder(kwant.TranslationalSymmetry((-a, 0)))
lead[(lat(0, j) for j in range(W))] = 0
# lead[((lat(0, j), lat(0, j - 1) ) for j in range(1,W))] = hopping
# lead[((lat(1, j), lat(0, j    ) ) for j in range(0,W))] = hopping
lead[lat.neighbors()] = hopping

lead_hall24 = kwant.Builder(kwant.TranslationalSymmetry((0, a)))
lead_hall24[(lat(j, 0) for j in range(M_lead,M_lead+L_lead))] = 0
# lead_hall24[((lat(j,0), lat(j-1,0) ) for j in range(M_lead+1,M_lead+L_lead))] = hopping
# lead_hall24[((lat(j,1), lat(j  ,0) ) for j in range(M_lead,M_lead+L_lead))] = hopping
lead_hall24[lat.neighbors()] = hopping

lead_hall35 = kwant.Builder(kwant.TranslationalSymmetry((0, a)))
lead_hall35[(lat(j, 0) for j in range(L-M_lead-L_lead,L-M_lead))] = 0
# lead_hall35[((lat(j,0), lat(j-1,0) ) for j in range(L-M_lead-L_lead+1,L-M_lead))] = hopping
# lead_hall35[((lat(j,1), lat(j  ,0) ) for j in range(L-M_lead-L_lead,L-M_lead))] = hopping
lead_hall35[lat.neighbors()] = hopping

#Installation aller 6 Kabel. Achten Sie auf die Bestellung.
syst.attach_lead(lead)
syst.attach_lead(lead.reversed())
syst.attach_lead(lead_hall24)
syst.attach_lead(lead_hall35)
syst.attach_lead(lead_hall24.reversed())
syst.attach_lead(lead_hall35.reversed())

Bisher wurde das gesamte Gerät definiert. Visualisieren und finalisieren

kwant.plot(syst)
syst = syst.finalized()

Ich habe die Leads von Hand nummeriert.

Von hier aus berechnen wir Werte wie Hall-Leitfähigkeit und Hall-Widerstand. Die Grundfunktion ist `smatrix.conductance_matrix ()`. Es kann verwendet werden, um $ G $ in der proportionalen Beziehung $ I = GV $ zwischen dem Strom $ I $ und der Spannung $ V $ aus der S-Matrix zu berechnen. Da $ I und V $ für jedes der 6 Terminals definiert sind, handelt es sich jeweils um einen $ 6 $ -Dimensionsvektor, sodass $ G $ eine $ 6 \ times 6 $ -Matrix ist. Wenn der Zustand, in dem der Strom nur zwischen den Klemmen 0 und 1 geleitet wird, ausgedrückt wird als $ I_0 = -I_1 = I, \ \ I_2 = I_3 = I_4 = I_5 = 0 $, sind der vertikale Widerstand und der Hallwiderstand $ R_ {long}. Sie können schreiben = \ frac {V_4-V_5} {I}, \ R_ {Hall} = \ frac {V_3-V_5} {I} $, so dass Sie anscheinend zuerst die Umkehrung der Matrix $ G $ finden sollten.

Es ist jedoch bekannt, dass die Matrix $ G $ aufgrund des aktuellen Erhaltungsgesetzes und der Unbestimmtheit des Spannungsursprungs herabgestuft wird. Hier nehmen wir also $ V_5 = 0 $ an und ignorieren die Spalte ganz rechts von $ G $. Dann wird $ G $ zu einer $ 6 \ mal 5 $ Matrix, und das inverse Matrixproblem ist überbestimmt. Also werde ich die unterste Zeile ignorieren und $ G $ als $ 5 \ times 5 $ Matrix behandeln.

Der oben erwähnte Parameter `phi``` kann bei der Definition der S-Matrix als Wörterbuch angegeben werden (in diesem Beispiel war es nicht erforderlich,` phi``` zuzuweisen, daher ist es notwendig, auszugehen. Ich hatte es nicht ...)

#Eine Funktion zum Erhalten des vertikalen Widerstands, des Hall-Widerstands, der Leitfähigkeit und der Hall-Leitfähigkeit aus der S-Matrix.
from numpy.linalg import LinAlgError
def calc_conductances2(smatrix):
    #Berechnen Sie die Leitfähigkeitsmatrix G.
    gmat = smatrix.conductance_matrix()
    #Ausnahmebehandlung, wenn die Matrix versehentlich singulär ist
    try:
        Rmat = np.linalg.inv(gmat[:5,:5])
    except LinAlgError:
        R_long = np.nan
        R_Hall = np.nan
        sigma_xx = 0
        sigma_xy = 0
    else:
        #V_5=Ich habe es als 0 gesetzt, also R._long=V_4/I
        R_long = Rmat[4,0]-Rmat[4,1]
        R_Hall = Rmat[3,0]-Rmat[3,1]
        sigma_xx = R_long/(R_long**2+R_Hall**2)
        sigma_xy =-R_Hall/(R_long**2+R_Hall**2)
    return R_long , R_Hall , sigma_xx ,sigma_xy 

phi=2*np.pi*1/11 #Der Wert des Parameters phi.
R_Halls =[]
R_longs =[]
sigma_xxs =[]
sigma_xys =[]
doss=[]
energies = np.linspace(-4,0,50)
for energy in energies:
    #Berechnung der S-Matrix. Geben Sie Parameter in Wörterbuchform an.
    smatrix = kwant.smatrix(syst, energy, params=dict(phi=phi) )
    R_long, R_Hall, sigma_xx, sigma_xy = calc_conductances(smatrix)
    R_Halls.append(R_Hall)
    R_longs.append(R_long)
    sigma_xxs.append(sigma_xx)
    sigma_xys.append(sigma_xy)    

    #Berechnen Sie auch die Zustandsdichte.
    dos = kwant.ldos(syst, energy, params=dict(phi=phi) ).mean()
    doss.append(dos)

Wenn Sie Leitfähigkeit und Hallenleitfähigkeit als Funktion der Energie darstellen

plt.plot(energies, doss, label="dos")
plt.plot(energies, sigma_xxs, label="sigma_xx")
plt.plot(energies, sigma_xys, label="sigma_xy")
plt.grid()
plt.ylim(-1,5)
plt.xlim(-4,-0.8)
plt.xlabel("energy/t")
plt.legend()
plt.show()

ダウンロード (2).png

Es kann bestätigt werden, dass die Hall-Leitfähigkeit auf ein ganzzahliges Vielfaches von $ e ^ 2 / h $ quantisiert wird und die Zustandsdichte und die longitudinale Leitfähigkeit dem Landau-Niveau ähnlich sind.

Jetzt können Sie das Potenzial vor Ort und das Hüpfen ungleichmäßig machen, Parameter von außen angeben und viele Terminals hinzufügen.

Bonus (Kubo offiziell)

Mit der Kubo-Formel können Sie die Hall-Leitfähigkeit einfacher berechnen, ohne Klemmen mit dem folgenden Code anzubringen. Nur die `` `hüpfen``` Funktion ist von oben entlehnt, kann aber in ca. 10 Zeilen berechnet werden. Beeindruckend!

W=100
L=W
t=1
a=1

lat = kwant.lattice.square(a)
syst = kwant.Builder()

syst[(lat(x, y) for x in range(L) for y in range(W))] = 0
syst[lat.neighbors()] = hopping
syst = syst.finalized()

sigma_xy = kwant.kpm.conductivity(syst, alpha='x', beta='y',params=dict(phi=2*np.pi/11))
conductivities = [sigma_xy(mu=mu, temperature=0)/L/W for mu in np.linspace(-4,0,50)]
plt.plot(np.linspace(-4,0,50),conductivities)
plt.grid()

ダウンロード (3).png

Wenn jedoch die Standardeinstellungen verwendet werden, ist die Quantisierung lose und die Berechnungsgenauigkeit schwierig. Es scheint, dass hier die Kernel-Polynom-Methode (KPM) für die Berechnung verwendet wird, und die Genauigkeit kann durch Feinanpassung der Berechnungsparameter verbessert werden. Sie können die Gerätegröße erhöhen, dies nimmt jedoch viel Zeit in Anspruch. In diesem Artikel überlasse ich die Details aufgrund der Einschränkungen des Wissens und der Motivation des Autors dem Originaldokument ...

Bonus (Messgerät)

In Version 1.4 wurde eine Funktion hinzugefügt, um die Peierls-Phase des Messfelds und das dadurch verursachte Hüpfen beim Anlegen eines Magnetfelds zu berechnen. Einzelheiten finden Sie in der Dokumentation.

Beispiel 3: Anomaler Quantenlocheffekt

Schauen wir uns als letztes Beispiel den anomalen Quantenlocheffekt im Haldane-Modell an (in einem speziellen Fall). Wenn das wabengitterförmige spinlose Fermion ein rein imaginäres Proximity-Hopping durchführt, wird die Hall-Leitfähigkeit ohne ein externes Magnetfeld quantisiert.

Bisher haben wir nur rechteckige Geräte mit quadratischen Gittern betrachtet, aber hier werden wir ein Gerät mit kreisförmig angeordneten Wabengittern erstellen. Zunächst wird derjenige mit einer anderen Gitterform als "lat" definiert. Es ist einfach.

#Parameter
a=1
t=1.0
tt=0.5 #Nächstes Proximity-Hopping
L_lead=10

#Definieren Sie ein Wabengitter. norbs ist ein Parameter, der die Anzahl der Orbitale pro Standort darstellt (abgesehen von der endgültigen Stromverteilung funktioniert er ohne diese). A im Untergitter,Nennen Sie es b.
lat = kwant.lattice.honeycomb(a, norbs=1, name=['a', 'b'])
#Hier zusammen
syst = kwant.Builder()

Als nächstes definieren wir die Form des Geräts. Verwenden Sie zum Definieren der Form eine Funktion, die einen Bool-Wert für die Koordinaten zurückgibt. Indem Sie einen Punkt innerhalb der definierten Form angeben, können Sie den einzelnen verbundenen Bereich mit der Site füllen.

#Form definieren
def circle(pos):
    x, y = pos
    return x**2 + y**2 < 100
#Geben Sie einen Punkt innerhalb der Form an. Hier(0,0).. Das Potenzial vor Ort ist 0
syst[lat.shape(circle, (0, 0))] = 0

Hüpfen kann auf die gleiche Weise definiert werden. Da die Untergitter a und b definiert sind, kann der engste Kontakt (= nächste Nähe des Wabengitters) leicht nur darauf angegeben werden. Hier ist das nächste Proximity-Hopping eine reine imaginäre Zahl.

syst[lat.neighbors()] = -t
syst[lat.a.neighbors()] = -1j*tt
syst[lat.b.neighbors()] = 1j*tt

Die Definition von Blei ist ähnlich

lead = kwant.Builder(kwant.TranslationalSymmetry((-a, 0)))
def lead_shape(pos):
        x, y = pos
        return (-L_lead/2 < y < L_lead/2)
lead[lat.shape(lead_shape,(0,0))] = 0

lead[lat.neighbors()] = -t
lead[lat.a.neighbors()] = -1j*tt
lead[lat.b.neighbors()] = 1j*tt
syst.attach_lead(lead)
syst.attach_lead(lead.reversed())

Werfen wir einen Blick auf die Form des Geräts.

kwant.plot(syst)
syst = syst.finalized()

ダウンロード (4).png

Natürlich konnte ich Kabel an beiden Enden der kreisförmigen Wabengittervorrichtung anbringen. Wenn Sie genau hinschauen, sehen Sie auch die schwarze Linie, die das nächste Proximity-Hopping darstellt. Das Schilf hat eine etwas seltsame Form, da die semi-unendliche Translationssymmetrie nach links und rechts erfolgreich erfüllt wurde. Die Form dieser Seite ändert sich jedoch wahrscheinlich in Sesselrichtung und Zickzackrichtung. (Ich habe es nicht versucht)

Sie können auch versuchen, die Quantisierung der Hall-Leitfähigkeit durch Anschließen mehrerer Anschlüsse zu berechnen. Da dies jedoch eine große Sache ist, werde ich versuchen, den Quanten-Hall-Zustand mit einer anderen Methode zu visualisieren. Berechnen wir zunächst die Transparenz und Zustandsdichte zwischen den beiden Anschlüssen. Der Code ist fast der gleiche wie in Beispiel 1.

trans=[]
doss=[]
energies = np.linspace(-4,4,100,endpoint=False)
for energy in energies:
    smatrix = kwant.smatrix(syst, energy )
    trans.append(smatrix.transmission(0,1)) 
    dos = kwant.ldos(syst,energy ).mean()
    doss.append(dos)

plt.plot(energies, trans, label="conductance")
#Für ein gutes Aussehen wird es grob mit 10 multipliziert.
plt.plot(energies, [d*10 for d in doss], label="dos")
plt.grid()
plt.legend()
plt.xlabel("energy/t")
plt.show()

ダウンロード (5).png

Wenn wir dies betrachten, können wir sehen, dass die Leitfähigkeit quantisiert wird, wenn die einfallende Energie nahe 0 ist. Mit anderen Worten bedeutet dies, dass es nur einen Leitungskanal ohne Streuung gibt.

Wenn man die Zustandsdichte betrachtet, wird sie in diesem Energiebereich kleiner. Ich habe die räumliche Mittelung der Funktion `kwant.ldos ()` verwendet, um die Zustandsdichte zu berechnen, aber lassen Sie uns die Verteilung (lokale Zustandsdichte) vor der Mittelung im realen Raum darstellen. ..

local_dos = kwant.ldos(syst,energy=0.1 )
kwant.plotter.map(syst,local_dos)

ダウンロード (6).png

Dann können Sie sehen, dass die Zustandsdichte nur an den Rändern des Geräts endlich ist. Mit anderen Worten, der Strom kann nur am Rand des Geräts fließen, und das Innere ist isolierend. Dies stellt die Kantenleitung aufgrund des Randzustands dar, der dem Quantenlochzustand eigen ist.

Sie können auch die aktuelle Verteilung zeichnen.

psi = kwant.wave_function(syst,energy=0.1)(0)
J = kwant.operator.Current(syst)
current=sum(J(p) for p in psi)
kwant.plotter.current(syst,current,min_linewidth=.01,density=0.3)

ダウンロード (7).png

Es ist eine Vektorfelddarstellung, wie die von Leitung 0 einfallenden Elektronen fließen. Sicherlich hat es die Leitung 1 am rechten Ende erreicht, während es am Rand des Geräts lokalisiert ist.

Jetzt wissen Sie, dass Sie ungerade und gitterförmige Geräte entwerfen können.

Zusammenfassung

Ich habe mir die Quantenleitungsberechnung von Kwant angesehen, die sich auf das zweidimensionale System konzentriert. Es gibt viele Funktionen, die ich noch nicht verstanden habe, und viele Funktionen, die ich nicht beherrsche. Es scheint also, dass ich durch Lesen des Dokuments mehr tun kann. Zusätzlich zur Dokumentation finden Sie auf der Kwant-Homepage eine Mailingliste zur Diskussion und ein Beispiel für ein Jupiter-Notizbuch. Spielen Sie also bitte damit.

Neben den hier abgebildeten gibt es noch andere interessante Dinge, die getan werden können.

Recommended Posts

Ich habe versucht, Kwant zu verwenden, ein Python-Modul für die Quantentransportberechnung
Ich habe versucht, das Datetime-Modul von Python zu verwenden
Verschiedene Hinweise zur Verwendung von Python für Projekte
[Python] Ich habe versucht, den Funktionsnamen durch den Funktionsnamen zu ersetzen
Ich habe zum ersten Mal versucht, Python zu programmieren.
Ich habe Python zum ersten Mal auf dem Mac ausprobiert.
Ich habe Python zum ersten Mal mit Heroku ausprobiert
Eine Geschichte, die praktisch war, als ich versuchte, das Python-IP-Adressmodul zu verwenden
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
[Für Anfänger] Ich habe versucht, die Tensorflow-Objekterkennungs-API zu verwenden
Ich habe versucht, Thonny (Python / IDE) zu verwenden.
Versuchen Sie es mit dem Python Cmd-Modul
Ich habe versucht, die checkio-API zu verwenden
Ich habe zum ersten Mal Tensorflow ausprobiert
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Python: Ich habe das Problem des Handlungsreisenden ausprobiert
Ich habe das Python Tornado Testing Framework ausprobiert
Ich habe versucht, die BigQuery-Speicher-API zu verwenden
[Textklassifizierung] Ich habe versucht, den Aufmerksamkeitsmechanismus für Faltungs-Neuronale Netze zu verwenden.
Ich habe versucht, die Neujahrskarte selbst mit Python zu analysieren
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe in der Bibliothek nach der Verwendung der Gracenote-API gesucht
Ich habe versucht, Web-Scraping mit Python und Selen
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
[Python] Lassen Sie uns das Modul regelmäßig nach Zeitplan ausführen
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Ich habe versucht, "Birthday Paradox" mit Python zu simulieren
Ich habe die Methode der kleinsten Quadrate in Python ausprobiert
Ich habe versucht, PyCaret mit der schnellsten Geschwindigkeit zu verwenden
Ich habe versucht, die Google Cloud Vision-API zu verwenden
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
[Ich habe versucht, Pythonista 3 zu verwenden] Importieren meines eigenen Moduls
[Python] Ich habe nach dem längsten Pokemon Shiritori gesucht
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, eine CSV-Datei mit Python zu lesen
Ich habe Mind Meld zum ersten Mal ausprobiert
Versuchen Sie es mit dem Sammlungsmodul (ChainMap) von python3
Ich habe versucht, ein Python 3-Modul in C hinzuzufügen
Ich habe versucht, Firebase für Djangos Cache-Server zu verwenden
Lassen Sie uns mit SWIG ein Modul für Python erstellen
Ich habe versucht, den Bildfilter von OpenCV zu verwenden
Ich habe versucht, die funktionale Programmierbibliothek toolz zu verwenden
[Python] Ich habe versucht, das Mitgliederbild der Idolgruppe mithilfe von Keras zu beurteilen
Ich habe versucht, die Python-Bibliothek "pykakasi" zu verwenden, die Kanji in Romaji konvertieren kann.
[Python] Ich habe die gleiche Berechnung versucht wie die Vorhersage von LSTM von Grund auf [Keras]
Ich habe versucht, parametrisiert zu verwenden
Ich habe versucht, Argparse zu verwenden
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
Ich habe versucht, Mimesis zu verwenden
Ich habe versucht, anytree zu verwenden
Was ich zum ersten Mal in Python bekommen habe
Ich habe pipenv und asdf für die Python-Versionskontrolle ausprobiert
[Python] Ich habe sofort versucht, die VS-Code-Erweiterung von Pylance zu verwenden.