Skip to content

Commit 10058a7

Browse files
committed
update nonhermitian docs
1 parent a2185f6 commit 10058a7

1 file changed

Lines changed: 248 additions & 19 deletions

File tree

docs/src/nonhermitian.md

Lines changed: 248 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ It is simple to build this model with SymmetricTightBinding.jl:
99

1010
```@example hatano-nelson
1111
using Crystalline, SymmetricTightBinding
12-
brs = calc_bandreps(1, 1) # EBRs in plane group 1, with time-reversal symmetry
13-
pin_free!(brs, [1=>[0]]) # the 1a Wyckoff position in plane group 1 has a free parameter: set to 0 for definiteness
14-
cbr = @composite brs[1] # single-site model
12+
brs = calc_bandreps(1, 1) # EBRs in plane group 1, with time-reversal symmetry
13+
pin_free!(brs, [1=>[0]]) # the 1a Wyckoff position in plane group 1 has a free parameter: set to 0 for definiteness
14+
cbr = @composite brs[1] # single-site model
1515
tbm = tb_hamiltonian(cbr, [[1]], NONHERMITIAN) # nearest neighbor hoppings
1616
```
1717

@@ -20,43 +20,272 @@ The model is very simple: two different hopping terms, corresponding to right- a
2020
```@example hatano-nelson
2121
tb_hamiltonian(cbr, [[1]], HERMITIAN)
2222
```
23-
The non-Hermitian model reduces to the Hermitian model when the left- and right-directed hopping amplitudes are equal. When the two are _not_ equal, the Hatano-Nelson model features exceptional points and spontaneous symmetry breaking of the real spectrum, as we can verify by example (using Brillouin.jl and GLMakie.jl for dispersion plotting):
23+
24+
The non-Hermitian model reduces to the Hermitian model when the left- and right-directed hopping amplitudes are equal. When the two are _not_ equal, the Hatano--Nelson model features nontrivial spectral winding in the sense that its spectrum traces out a finite-area spectral loop in the complex plane as its momentum is varied across one loop.
25+
We can see this by visualizing the complex energy as we vary $k$ from -1/2 to 1/2:
2426

2527
```@example hatano-nelson
2628
ptbm = tbm([0.9, 1.1]) # a model with 0.9 hopping amplitude to right, 1.1 to the left
2729
28-
using Brillouin
29-
kp = irrfbz_path(1, directbasis(1, 1)) # a k-path in plane group 1
30-
kpi = interpolate(kp, 500) # interpolated over 500 points
31-
Es = spectrum(ptbm, kpi)
32-
Es_re = sort(real.(Es); dims=2)
33-
Es_im = sort(imag.(Es); dims=2)
34-
3530
using GLMakie
36-
plot(kpi, Es_re, Es_im; color=[:blue, :red])
31+
ks = range(-1/2, 1/2, 500) # 500 sampling points
32+
Es = spectrum(ptbm, ks) # 500×1 matrix
33+
Es = vec(Es) # convert to vector
34+
plot(real(Es), imag(Es))
3735
```
3836

39-
We can also explore the consequences of breaking time-reversal symmetry:
40-
```
37+
The loop has a winding $\nu = (2\pi \mathrm{i})^{-1}\oint \mathrm{d}k \partial_k \log E(k)$ quantized to $\pm 1$ when the two hopping amplitudes are unequal.
38+
39+
### Breaking time-reversal symmetry
40+
We can also create models that do not assume time-reversal symmetry, which here introduces additional imaginary-prefactor counterparts to the standard Hatano--Nelson model:
41+
42+
```@example hatano-nelson
4143
brs_notr = calc_bandreps(1, 1; timereversal=false) # EBRs in plane group 1, without time-reversal symmetry
4244
pin_free!(brs_notr, [1=>[0]])
4345
tbm_notr = tb_hamiltonian((@composite brs_notr[1]), [[0], [1]], NONHERMITIAN) # on-site terms _and_ nearest-neighbor hoppings
4446
```
4547

46-
## A more complicated example: exceptional surfaces in p4
48+
## Two-band Hatano--Nelson-like model with exceptional points
49+
50+
We can generalize the single-band Hatano--Nelson model from above simply by constructing a two-band model, with two orbitals placed at the unit cell center.
51+
To do so, we simply include two copies of the same EBR in the composite band representation provided to `tb_hamiltonian`: each copy is treated as a separate physical orbital.
52+
53+
```@example hatano-nelson
54+
cbr = @composite 2brs[1]
55+
tbm = tb_hamiltonian(cbr, [[0], [1]], Val(NONHERMITIAN))
56+
summary(tbm)
57+
```
58+
59+
The resulting model has 10 free terms: the first 6 terms are self-couplings (self-energies and intercell hoppings between the same physical orbital): the last 4 are hoppings between the two distinct orbitals. We restrict the model to this subset in the interest of simplicity:
60+
61+
```@example hatano-nelson
62+
tbm = tbm[7:10]
63+
```
64+
65+
The four terms span a model of the kind:
66+
67+
$$
68+
\mathbf{H}(k) =
69+
\begin{bmatrix}
70+
0 & t_1 + t_2 \mathrm{e}^{2\pi\mathrm{i}k} \\
71+
t_1' + t_2' \mathrm{e}^{-2\pi\mathrm{i}k} & 0
72+
\end{bmatrix},
73+
$$
74+
75+
with intercell hoppings $t_2^{(\prime)}$ and intracell hoppings $t_1^{(\prime)}$.
76+
A specific instance of this model can be created from `tbm` via `tbm([t₁, t₂, t₁′, t₂′])`.
77+
78+
An simple special case -- but interesting, as we will see -- is equal inter- and intracell hoppings from orbital 2 to orbital 1 ($2\rightarrow 1$ hopping), i.e., $t_1 = t_2 = 1$, fully suprressed intercell $1 \rightarrow 2$ hopping, i.e., $t_2' = 0$ and free intracell $1 \rightarrow 2$ hopping, i.e., $t_1' = t$.
79+
With this restriction, the model features an exceptional point (band degeneracy without a complete associated eigenfunction basis), occuring when $t_1 + t_2 \mathrm{e}^{2\pi\mathrm{i}k} = 1 + \mathrm{e}^{2\pi\mathrm{i}k} = 0$, i.e., when $\mathrm{e}^{2\pi\mathrm{i}k} = -1 \Leftrightarrow k = \pm 1/2$ (the BZ edge).
80+
At the exceptional point, the Bloch Hamiltonian is defective in the sense that it is similar to a Jordan block $\big[\begin{smallmatrix} 0 & 1 \\ 0 & 0\end{smallmatrix}\big]$:
81+
82+
```@example hatano-nelson
83+
t = .5 # intracell 1→2 hopping amplitude t₁′
84+
t₁, t₂, t₁′, t₂′ = 1, .8, t, 0
85+
ptbm = tbm([t₁, t₂, t₁′, t₂′])
86+
ptbm([1/2]) # evaluate the Bloch Hamiltonian at k = 1/2
87+
```
88+
89+
We can visualize the resulting spectrum of the model over the Brillouin zone to learn more:
90+
91+
```@example hatano-nelson
92+
ks = range(-1/2, 1/2, 500)
93+
Es = spectrum(ptbm, ks)
94+
Es_re = real(Es) # real parts
95+
Es_im = imag(Es) # imaginary parts
96+
faxp = lines(ks, Es_re[:,1]; color=:blue, label = "Re " * rich("E", font=:italic) * subscript("1"))
97+
lines!(ks, Es_im[:,1]; color=:blue, linestyle=:dash, label = "Im " * rich("E", font=:italic) * subscript("1"))
98+
lines!(ks, Es_re[:,2]; color=:red, label = "Re " * rich("E", font=:italic) * subscript("2"))
99+
lines!(ks, Es_im[:,2]; color=:red, linestyle=:dash, label = "Im " * rich("E", font=:italic) * subscript("2"))
100+
faxp.axis.xlabel = "Momentum " * rich("k", font=:italic)
101+
faxp.axis.ylabel = "Energy " * rich("E", font=:italic)
102+
axislegend(faxp.axis; framevisible=false)
103+
xlims!(-1/2, 1/2)
104+
faxp # hide
105+
```
106+
107+
The spectrum is degenerate at $k = \pm 1/2$ as expected, generally complex, and exhibiting both time-reversal symmetry $E_1(k) = E_2(-k)^*$ and ``accidental'' particle-hole symmetry $E_1(k) = -E_1(k)$ (resulting from our restriction to a small set of hopping hoppings terms).
108+
109+
110+
### Exceptional points with PT symmetry
47111

48-
We can also construct more complicated examples where symmetry plays a role. Consider for example the following simple extension of the Hatano-Nelson model to a 2D lattice with p4 symmetry:
49-
```@example hatano-nelson-p4
112+
Exceptional points are especially interesting in contexts where the Hamiltonian is not only non-Hermitian but also PT-symmetric (inversion and time).
113+
The previous Hatano--Nelson-like model, however, is T-symmetric (by default, `calc_bandreps` assumes time-reversal symmetry, and this assumption is propagated via `brs` and `cbr` to `tb_hamiltonian`) but inversion-broken, and so lacks PT-symmetry.
114+
115+
We can build a variant, however, that breaks both P and T but retains PT symmetry.
116+
To do so, first construct the terms of a time-reversal model, starting now with a set of time-reversal broken EBRs:
117+
118+
```@example PT-symmetry
119+
using Crystalline, SymmetricTightBinding, GLMakie # hide
120+
brs = calc_bandreps(1, 1; timereversal=false) # a single EBR, as before, but now without assumption of time-reversal
121+
pin_free!(brs, [1=>[0]]) # as before, pin free parameters of the EBR's Wyckoff position
122+
cbr = @composite 2brs[1]
123+
tbm = tb_hamiltonian(cbr, [[0], [1]], Val(NONHERMITIAN))
124+
summary(tbm)
125+
```
126+
127+
The resulting model has no less than 20 possible terms: this is simply the result of being a fully unconstrained problem -- lack both hermitian, spatial, and time-reversal symmetry.
128+
We pick a small subset of these terms, with the aim of building a simple model. In particular, we retain imaginary onsite terms and the terms in our previous reduced model:
129+
130+
```@example PT-symmetry
131+
onsite_terms = [2, 8]
132+
hopping_terms = [13, 15, 17, 19]
133+
tbm = tbm[vcat(onsite_terms, hopping_terms)]
134+
```
135+
136+
The span of these terms result in a Bloch Hamiltonian:
137+
138+
$$
139+
\mathbf{H}(k) =
140+
\begin{bmatrix}
141+
\mathrm{i}\gamma_1 & t_1 + t_2 \mathrm{e}^{2\pi\mathrm{i}k} \\
142+
t_1' + t_2' \mathrm{e}^{-2\pi\mathrm{i}k} & \mathrm{i}\gamma_2
143+
\end{bmatrix}.
144+
$$
145+
146+
Choosing $\gamma_1 = -\gamma_2 = \gamma$, $t_1 = t_1'$, and $t_2 = t_2'$ we obtain a PT symmetric model:
147+
148+
$$
149+
\mathbf{H}(k) =
150+
\begin{bmatrix}
151+
\mathrm{i}\gamma & t_1 + t_2 \mathrm{e}^{2\pi\mathrm{i}k} \\
152+
t_1 + t_2 \mathrm{e}^{-2\pi\mathrm{i}k} & -\mathrm{i}\gamma
153+
\end{bmatrix}.
154+
$$
155+
156+
The spectrum of the model is $E_\pm(k) = \sqrt{|t_1+t_2\mathrm{e}^{2\pi\mathrm{i}k}|^2 - \gamma^2}$, which is degenerate -- in fact, exceptional -- when $|t_1+t_2\mathrm{e}^{2\pi\mathrm{i}k}| = \gamma$ (assuming $\gamma>0$). The spectrum is qualitatively distinct before and after the exceptional point:
157+
- When $|t_1+t_2\mathrm{e}^{2\pi\mathrm{i}k}| > \gamma$: $E_\pm(k)$ is real (PT-unbroken phase).
158+
- When $|t_1+t_2\mathrm{e}^{2\pi\mathrm{i}k}| < \gamma$: $E_\pm(k)$ is imaginary (spontaneously broken PT-symmetry).
159+
160+
We can see this readily by constructing the associated Hamiltonian from `tbm`, noting that `tbm([γ₁, γ₂, t₁, t₂, t₁′, t₂′])` corresponds to the general model and `tbm([γ, -γ, t₁, t₂, t₁, t₂])` to the PT-symmetric one:
161+
162+
```@example PT-symmetry
163+
γ, t₁, t₂ = 0.5, 1, 1
164+
ptbm = tbm([γ, -γ, t₁, t₂, t₁, t₂])
165+
ks = range(-1/2, 1/2, 500)
166+
Es = spectrum(ptbm, ks)
167+
Es_re = real(Es) # real parts
168+
Es_im = imag(Es) # imaginary parts
169+
Es_re = sort(Es_re; dims=2) # necessary to explicitly sort for visualization, due to intrinsic
170+
Es_im = sort(Es_im; dims=2) # difficult of sorting floating-point rounded complex numbers
171+
172+
f = Figure()
173+
ax = Axis(f[1,1])
174+
lines!(ks, Es_re[:,1]; color=:blue, label="Re " * rich("E", font=:italic) * subscript("−"))
175+
lines!(ks, Es_im[:,1]; color=:blue, label="Im " * rich("E", font=:italic) * subscript("−"), linestyle=:dash)
176+
lines!(ks, Es_re[:,2]; color=:red, label="Re " * rich("E", font=:italic) * subscript("+"))
177+
lines!(ks, Es_im[:,2]; color=:red, label="Im " * rich("E", font=:italic) * subscript("+"), linestyle=:dash)
178+
ax.xlabel = "Momentum " * rich("k", font=:italic)
179+
ax.ylabel = "Energy " * rich("E", font=:italic)
180+
axislegend(ax; framevisible=false)
181+
xlims!(-1/2, 1/2)
182+
f # hide
183+
```
184+
185+
## 2-band non-Hermitian SSH model
186+
***WIP***
187+
188+
```@example nonhermitian-ssh
189+
using Crystalline, SymmetricTightBinding, Brillouin, GLMakie # hide
190+
# (1b|A′) ⊕ (1a|A′) in 1D SG 2 (inversion symmetry); with intra-cell hoppings & onsite terms
191+
brs = calc_bandreps(2, Val(1))
192+
cbr = @composite brs[1] + brs[3]
193+
tbm = tb_hamiltonian(cbr, [[0], [2]], Val(NONHERMITIAN))
194+
195+
# retain only inter-orbital (offdiagonal) terms for simplicity
196+
tbm = tbm[5:8]
197+
ptbm = tbm([.5, 1, 1, .5]) # antisymmetric hopping pattern
198+
199+
200+
ks = range(-1/2, 1/2, 500)
201+
Es = spectrum(ptbm, ks)
202+
Es_re = real(Es) # real parts
203+
Es_im = imag(Es) # imaginary parts
204+
Es_re = sort(Es_re; dims=2) # necessary to explicitly sort for visualization, due to intrinsic
205+
Es_im = sort(Es_im; dims=2) # difficult of sorting floating-point rounded complex numbers
206+
207+
f = Figure()
208+
ax = Axis(f[1,1])
209+
lines!(ks, Es_re[:,1]; color=:blue, label="Re " * rich("E", font=:italic) * subscript("−"))
210+
lines!(ks, Es_im[:,1]; color=:blue, label="Im " * rich("E", font=:italic) * subscript("−"), linestyle=:dash)
211+
lines!(ks, Es_re[:,2]; color=:red, label="Re " * rich("E", font=:italic) * subscript("+"))
212+
lines!(ks, Es_im[:,2]; color=:red, label="Im " * rich("E", font=:italic) * subscript("+"), linestyle=:dash)
213+
ax.xlabel = "Momentum " * rich("k", font=:italic)
214+
ax.ylabel = "Energy " * rich("E", font=:italic)
215+
axislegend(ax; framevisible=false)
216+
xlims!(-1/2, 1/2)
217+
```
218+
219+
## A more complicated example: exceptional lines in p4
220+
221+
We can also construct more complicated examples where symmetry plays a role.
222+
Consider for example a non-Hermitian model on a 2D lattice with p4 symmetry, obtained by placing *s*-like orbitals at the two symmetry-related edges of the unit cell (i.e., a (2c|A) orbital):
223+
224+
```@example nonhermitian-p4
50225
using Crystalline, SymmetricTightBinding, GLMakie # hide
51226
brs = calc_bandreps(10, Val(2))
52-
cbr = @composite brs[1]
227+
cbr = @composite brs[1] # pick the (2c|A) EBR
53228
tbm_H = tb_hamiltonian(cbr, [[0,0], [1,0]], Val(HERMITIAN))
54229
tbm_NH = tb_hamiltonian(cbr, [[0,0], [1,0]], Val(NONHERMITIAN))
55230
```
56231

57232
It is instructive to visualize both the Hermitian and non-Hermitian models and compare the involved hopping terms:
58233

59-
```@example hatano-nelson-p4
234+
```@example nonhermitian-p4
60235
plot(tbm_H)
236+
```
237+
238+
```@example nonhermitian-p4
61239
plot(tbm_NH)
62240
```
241+
242+
The second and third terms of the non-Hermitian model clearly break Hermiticity (unless of equal amplitude).
243+
We can verify that the model hosts exceptional lines in this case:
244+
245+
```@example nonhermitian-p4
246+
tbm = tbm_NH[2:3] # retain only terms 2 and 3
247+
ptbm_NH = tbm([1.2, 0.8]) # 1.2 vs. 0.8 hopping asymmetry
248+
ks = range(-1/2, 1/2, 201)
249+
Em = [spectrum_single_k(ptbm_NH, [k1, k2]) for k1 in ks, k2 in ks]
250+
251+
# sort the real and imaginary parts of the energies for plotting purposes
252+
Em_re = [sort(real(_Es)) for _Es in Em]
253+
Em_im = [sort(imag(_Es)) for _Es in Em]
254+
Es_re_1 = getindex.(Em_re, 1) # band 1
255+
Es_im_1 = getindex.(Em_im, 1)
256+
Es_re_2 = getindex.(Em_re, 2) # band 2
257+
Es_im_2 = getindex.(Em_im, 2)
258+
259+
# plotting configurations
260+
E_label = rich("E", font=:italic) * subscript("±")
261+
axis_args = (;
262+
aspect = (1,1,.75),
263+
xautolimitmargin = (0,0), yautolimitmargin = (0,0),
264+
xlabel = rich("k"; font=:italic) * subscript("1"), xlabeloffset = 10,
265+
ylabel = rich("k"; font=:italic) * subscript("2"), ylabeloffset = 10,
266+
zlabeloffset = 35,
267+
xticks = [-1/2, 0, 1/2], xticklabelsvisible = false,
268+
yticks = [-1/2, 0, 1/2], yticklabelsvisible = false
269+
)
270+
colorbar_args = (; vertical = false, height = 8, ticklabelsize = 12)
271+
shininess = 1.0
272+
lims_re = extrema(Iterators.flatten(Es_re))
273+
lims_im = extrema(Iterators.flatten(Es_im))
274+
275+
# plot the real and imaginary energy surfaces across the BZ
276+
f = Figure(size=(600,280), figure_padding=(20,0,0,5))
277+
rowgap!(f.layout, 0)
278+
279+
ax1 = Axis3(f[2,1]; zlabel="Re "*E_label, axis_args...)
280+
p1 = surface!(ks, ks, Es_re_1; colormap=:PiYG_8, colorrange=lims_re, shininess)
281+
surface!( ks, ks, Es_re_2; colormap=:PiYG_8, colorrange=lims_re, shininess)
282+
zlims!(ax1, lims_re)
283+
Colorbar(f[1,1], p1; ticks=([.9999*lims_re[1], 0, .9999*lims_re[2]], ["min", "0", "max"]), colorbar_args...)
284+
285+
ax2 = Axis3(f[2,2]; zlabel="Im "*E_label, axis_args...)
286+
p2 = surface!(ks, ks, Es_im_1; colormap=:RdBu_8, colorrange=lims_im, shininess)
287+
surface!( ks, ks, Es_im_2; colormap=:RdBu_8, colorrange=lims_im, shininess)
288+
zlims!(ax2, lims_re)
289+
Colorbar(f[1,2], p2; ticks=([.9999*lims_im[1], 0, .9999*lims_im[2]], ["min", "0", "max"]), colorbar_args...)
290+
f # hide
291+
```

0 commit comments

Comments
 (0)