import sys
sys.path.append("../../code")
from init_mooc_nb import *
init_notebook()
%output size=150
dims = SimpleNamespace(
E_t=r"$E/t$",
mu_t=r"$\mu/t$",
lambda_=r"$\lambda$",
x=r"$x$",
k=r"$k$",
amplitude=r"$|u|^2 + |v|^2$",
)
holoviews.core.dimension.title = ""
def kitaev_chain(L=None, periodic=False):
lat = kwant.lattice.chain()
if L is None:
syst = kwant.Builder(kwant.TranslationalSymmetry((-1,)))
L = 1
else:
syst = kwant.Builder()
# transformation to antisymmetric basis
U = np.array([[1.0, 1.0], [1.0j, -1.0j]]) / np.sqrt(2)
def onsite(onsite, p):
return -p.mu * U @ pauli.sz @ U.T.conj()
for x in range(L):
syst[lat(x)] = onsite
def hop(site1, site2, p):
return U @ (-p.t * pauli.sz - 1j * p.delta * pauli.sy) @ U.T.conj()
syst[kwant.HoppingKind((1,), lat)] = hop
if periodic:
def last_hop(site1, site2, p):
return hop(site1, site2, p) * (1 - 2 * p.lambda_)
syst[lat(0), lat(L - 1)] = last_hop
return syst
def bandstructure(mu, delta=1, t=1, Dirac_cone="Hide", show_pf=False):
syst = kitaev_chain(None)
p = SimpleNamespace(t=t, delta=delta, mu=mu)
plot = holoviews.Overlay([spectrum(syst, p, ydim="$E/T$", xdim="$k$")][-4:4])
h_1 = h_k(syst, p, 0)
h_2 = h_k(syst, p, np.pi)
pfaffians = [find_pfaffian(h_1), find_pfaffian(h_2)]
if show_pf:
signs = [(">" if pf > 0 else "<") for pf in pfaffians]
title = (
"$\mu = {mu} t$, Pf$(iH_{{k=0}}) {sign1} 0$, Pf$(iH_{{k=\pi}}) {sign2} 0$"
)
title = title.format(mu=mu, sign1=signs[0], sign2=signs[1])
plot *= holoviews.VLine(0) * holoviews.VLine(-np.pi)
else:
if pfaffians[0] * pfaffians[1] < 0:
title = "$\mu = {mu} t$, topological ".format(mu=mu)
else:
title = "$\mu = {mu} t$, trivial ".format(mu=mu)
if Dirac_cone == "Show":
ks = np.linspace(-np.pi, np.pi)
ec = np.sqrt((mu + 2 * t) ** 2 + 4.0 * (delta * ks) ** 2)
plot *= holoviews.Path((ks, ec), kdims=[dims.k, dims.E_t]).opts(
style={"linestyle": "--", "color": "r"}
)
plot *= holoviews.Path((ks, -ec), kdims=[dims.k, dims.E_t]).opts(
style={"linestyle": "--", "color": "r"}
)
return plot.relabel(title)
def find_pfaffian(H):
return np.sign(np.real(pf.pfaffian(1j * H)))