The Kane-Mele model
As an example of a two-dimensional topological insulator, the Kane-Mele model is presented here:
julia> function H₀(k, p) # Kane-Mele
k1, k2 = k
t = 1
λₛₒ = p
R1 = 0
R2 = 0
R3 = 2λₛₒ*(sin(k1) - sin(k2) - sin(k1-k2))
R4 = -t*(sin(k1) + sin(k2))
R0 = -t*(cos(k1) + cos(k2) + 1)
s0 = [1 0; 0 1]
sx = [0 1; 1 0]
sy = [0 -im; im 0]
sz = [1 0; 0 -1]
a1 = kron(sz, sx)
a2 = kron(sz, sy)
a3 = kron(sz, sz)
a4 = kron(sy, s0)
a0 = kron(sx, s0)
R1 .* a1 .+ R2 .* a2 .+ R3 .* a3 .+ R4 .* a4 .+ R0 .* a0
end
You can also use our preset Hamiltonian function KaneMele
to define the same Hamiltonian matrix as follows:
julia> H₀(k, p) = KaneMele(k, p)
To calculate the dispersion, execute:
julia> H(k) = H₀(k, 0.5)
julia> showBand(H; value=false, disp=true)
Next, we can compute the $\mathbb{Z}_2$ numbers using Z2Problem
:
julia> prob = Z2Problem(H);
julia> sol = solve(prob)
The output is:
Z2Solution{Vector{Int64}, Nothing, Int64}([1, 1], nothing, 0)
The first argument TopologicalNumber
in the named tuple is an vector that stores the $\mathbb{Z}_2$ number for Energy bands below and above some filling condition that you selected in the options (the default is the half-filling). The vector is arranged in order of bands, starting from the lower energy. The second argument Total
stores the total of the $\mathbb{Z}_2$ numbers for Energy bands below and above some filling condition (mod2). Total
is a quantity that should always return zero.
You can access these values as follows:
julia> sol.TopologicalNumber
2-element Vector{Int64}:
1
1
julia> sol.Total
0
One-dimensional phase diagram is given by:
julia> param = range(-1.0, 1.0, length=1001)
julia> prob = Z2Problem(H₀);
julia> sol = calcPhaseDiagram(prob, param; plot=true)
(param = -1.0:0.002:1.0, nums = [1 1; 1 1; … ; 1 1; 1 1])