PT-symmetry

These examples illustrate the PT-symmetry and the PT-symmetry breaking.

Note

Throughout the examples, the hoppings t_{ab}=t_a and t_{ba}=t_b are real and the onsite energies are purely imaginary with \epsilon_a=i\gamma and \epsilon_b=-i\gamma. Then, the A sites are amplified (positive imaginary part) and the B sites are absorbed (negative imaginary part).

Dimer

_images/lattice_t(1+0j).png

The Hamiltian reads

\left( \begin{array}{cc}
i\gamma & t \\
t & i\gamma \end{array} \right)

Hermitian case

In the case \gamma=0, the Hamiltonian is real symmetric, the eigenenergies are real and given by: E_\pm=\pm t.

from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=1, ny=1)
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
t = 1.
eig_chain.set_hop(ho=[t])
eig_chain.get_ham()
eig_chain.get_eig(eigenvec=True)
# plots
plot_chain = plotTB(sys=eig_chain)
lattice  = plot_chain.plt_lattice(plt_index=True, ms=50, fs=20)
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
#propagation
prop_chain = propTB(lat=chain_tb, steps=1400, dz=0.02)
psi_init =  [1, 0]
prop_chain.get_prop(ham=eig_chain.ham, psi_init=psi_init, norm=True)
fig_prop = prop_chain.plt_prop1d()
fig_prop_dimer = prop_chain.plt_prop_dimer()
plt.show()
# save figures
save_chain = saveFigTB(sys=eig_chain, params={'t': t}, dir_name='chain', ext='png')
save_chain.save_fig(fig_spec, 'spec')
save_chain.save_fig(fig_prop_dimer, 'prop_dimer')
save_chain.save_fig(fig_prop, 'prop')
_images/spec_t(1+0j)_ea0j_eb0j.png _images/prop_dimer_t(1+0j)_ea0j_eb0j.png _images/prop_t(1+0j)_ea0j_eb0j.png

Non-Hermitian case

In the case \gamma\neq0, the Hamiltonian is complex non-Hermitian, and display the space-time reflection symmetry. The eigenenergies are given by: E_\pm=\pm \sqrt{t^2-|\gamma|^2}. As the result, the energies are real if t>\gamma, degenerated if t=\gamma (PT-symmetric phase), and complex if t<\gamma. \gamma (broken PT-symmetry). t=\gamma. \gamma is the PT-symmetry breaking point.

Note

This example shows that a non-Hermitian matrix can have a real spectrum.

PT-symmetry

Below the PT-symmetry breaking point, the eigenenergies are real: E_\pm=\pm \sqrt{t^2-|\gamma|^2}.

from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=1, ny=1)
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
t = 1.
on = [.8j, -.8j]
eig_chain.set_hop(ho=[t])
eig_chain.set_onsite(on=on)
eig_chain.get_ham()
eig_chain.get_eig(eigenvec=True)
# plots
plot_chain = plotTB(sys=eig_chain)
lattice  = plot_chain.plt_lattice(plt_index=True, ms=50, fs=20)
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
#propagation
prop_chain = propTB(lat=chain_tb, steps=1400, dz=0.02)
psi_init =  [1, 0]
prop_chain.get_prop(ham=eig_chain.ham, psi_init=psi_init, norm=True)
fig_prop = prop_chain.plt_prop1d()
fig_prop_dimer = prop_chain.plt_prop_dimer()
plt.show()
# save figures
save_chain = saveFigTB(sys=eig_chain, params={'t': t}, dir_name='chain', ext='png')
save_chain.save_fig(fig_spec, 'spec')
save_chain.save_fig(fig_prop_dimer, 'prop_dimer')
save_chain.save_fig(fig_prop, 'prop')
_images/spec_ea0,8j_eb-0,8j_t(1+0j).png _images/prop_dimer_ea0,8j_eb-0,8j_t(1+0j).png _images/prop_ea0,8j_eb-0,8j_t(1+0j).png

breaking point

At the breaking point, \gamma=t, the eigenenergies coincide: E_\pm=0.

from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=1, ny=1)
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
t = 1.
on = [1j, -1j]
eig_chain.set_hop(ho=[t])
eig_chain.set_onsite(on=on)
eig_chain.get_ham()
eig_chain.get_eig(eigenvec=True)
# plots
plot_chain = plotTB(sys=eig_chain)
lattice  = plot_chain.plt_lattice(plt_index=True, ms=50, fs=20)
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
#propagation
prop_chain = propTB(lat=chain_tb, steps=1400, dz=0.02)
psi_init =  [1, 0]
prop_chain.get_prop(ham=eig_chain.ham, psi_init=psi_init, norm=True)
fig_prop = prop_chain.plt_prop1d()
fig_prop_dimer = prop_chain.plt_prop_dimer()
plt.show()
# save figures
save_chain = saveFigTB(sys=eig_chain, params={'t': t}, dir_name='chain', ext='png')
save_chain.save_fig(fig_spec, 'spec')
save_chain.save_fig(fig_prop_dimer, 'prop_dimer')
save_chain.save_fig(fig_prop, 'prop')
_images/spec_ea1j_eb-1j_t(1+0j).png _images/prop_dimer_ea1j_eb-1j_t(1+0j).png _images/prop_ea1j_eb-1j_t(1+0j).png

broken PT-symmetry

Above the PT-symmetry breaking point, \gamma>t, the eigenenergies are complex: E_\pm= \pm i \sqrt{\gamma^2-t^2}.

from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=1, ny=1)
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
t = 1.
on = [1.2j, -1.2j]
eig_chain.set_hop(ho=[t])
eig_chain.set_onsite(on=on)
eig_chain.get_ham()
eig_chain.get_eig(eigenvec=True)
# plots
plot_chain = plotTB(sys=eig_chain)
lattice  = plot_chain.plt_lattice(plt_index=True, ms=50, fs=20)
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
#propagation
prop_chain = propTB(lat=chain_tb, steps=1400, dz=0.02)
psi_init =  [1, 0]
prop_chain.get_prop(ham=eig_chain.ham, psi_init=psi_init, norm=True)
fig_prop0 = prop_chain.plt_prop1d()
fig_prop_dimer0 = prop_chain.plt_prop_dimer()
psi_init =  [0, 1]
prop_chain.get_prop(ham=eig_chain.ham, psi_init=psi_init, norm=True)
fig_prop1 = prop_chain.plt_prop1d()
fig_prop_dimer1 = prop_chain.plt_prop_dimer()
plt.show()
# save figures
save_chain = saveFigTB(sys=eig_chain, params={'t': t}, dir_name='chain', ext='png')
save_chain.save_fig(fig_spec, 'spec')
save_chain.save_fig(fig_prop_dimer0, 'prop_dimer0')
save_chain.save_fig(fig_prop0, 'prop0')
save_chain.save_fig(fig_prop_dimer1, 'prop_dimer1')
save_chain.save_fig(fig_prop1, 'prop1')
_images/spec_ea1,2j_eb-1,2j_t(1+0j).png _images/prop_dimer0_ea1,2j_eb-1,2j_t(1+0j).png _images/prop_dimer1_ea1,2j_eb-1,2j_t(1+0j).png _images/prop0_ea1,2j_eb-1,2j_t(1+0j).png _images/prop1_ea1,2j_eb-1,2j_t(1+0j).png

Dimer chain

The chain is composed of n dimers i.e. n sites A and n sites B. The chain starts with a A site and ends with a B site.

_images/lattice.png

Hermitian case

from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
nx = 10
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=nx, ny=1)
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
t = 1.
eig_chain.set_hop(ho=[t])
eig_chain.get_ham()
eig_chain.get_eig(eigenvec=True)
# plots
plot_chain = plotTB(sys=eig_chain)
fig_lat  = plot_chain.plt_lattice(plt_index=True, ms=15, fs=20, figsize=(10, 2))
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
#propagation
prop_chain = propTB(lat=chain_tb, steps=1400, dz=0.05)
psi_init =  np.ones(eig_chain.sites) / np.sqrt(eig_chain.sites)
prop_chain.get_prop(ham=eig_chain.ham, psi_init=psi_init, norm=True)
fig_prop = prop_chain.plt_prop1d()
plt.show()
# save figures
save_chain = saveFigTB(sys=eig_chain, params={'t': t}, dir_name='chain', ext='png')
save_chain.save_fig_lat(fig_lat, 'lattice')
save_chain.save_fig(fig_spec, 'spec')
save_chain.save_fig(fig_prop, 'prop')
_images/spec_t(1+0j).png _images/prop_t(1+0j).png

Non-Hermitian case

PT-symmetry

from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
nx = 10
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=nx, ny=1)
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
t = 1.
on = [.1j, -.1j]
eig_chain.set_hop(ho=[t])
eig_chain.set_onsite(on=on)
eig_chain.get_ham()
eig_chain.get_eig(eigenvec=True)
# plots
plot_chain = plotTB(sys=eig_chain)
fig_lat  = plot_chain.plt_lattice(plt_index=True, ms=15, fs=20)
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
fig_stateA = plot_chain.plt_intensity1d(stateA, ms=20)
fig_stateB = plot_chain.plt_intensity1d(stateB, ms=20)
#propagation
prop_chain = propTB(lat=chain_tb, steps=1400, dz=0.05)
psi_init =  np.ones(eig_chain.sites) / np.sqrt(eig_chain.sites)
prop_chain.get_prop(ham=eig_chain.ham, psi_init=psi_init, norm=True)
fig_prop = prop_chain.plt_prop1d()
plt.show()
# save figures
save_chain = saveFigTB(sys=eig_chain, params={'t': t}, dir_name='chain', ext='png')
save_chain.save_fig(fig_spec, 'spec')
save_chain.save_fig(fig_prop, 'prop')
_images/spec_ea0,1j_eb-0,1j_t(1+0j).png _images/prop_ea0,1j_eb-0,1j_t(1+0j).png

broken PT-symmetry

from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
nx = 10
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=nx, ny=1)
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
t = 1.
on = [.2j, -.2j]
eig_chain.set_hop(ho=[t])
eig_chain.set_onsite(on=on)
eig_chain.get_ham()
eig_chain.get_eig(eigenvec=True)
stateA = eig_chain.get_state_pola(b'a')
stateB = eig_chain.get_state_pola(b'b')
# plots
plot_chain = plotTB(sys=eig_chain)
fig_lat  = plot_chain.plt_lattice(plt_index=True, ms=15, fs=20)
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
fig_stateA = plot_chain.plt_intensity1d(stateA, ms=20)
fig_stateB = plot_chain.plt_intensity1d(stateB, ms=20)
#propagation
prop_chain = propTB(lat=chain_tb, steps=1400, dz=0.05)
psi_init =  np.ones(eig_chain.sites) / np.sqrt(eig_chain.sites)
prop_chain.get_prop(ham=eig_chain.ham, psi_init=psi_init, norm=True)
fig_prop = prop_chain.plt_prop1d()
plt.show()
# save figures
save_chain = saveFigTB(sys=eig_chain, params={'t': t}, dir_name='chain', ext='png')
save_chain.save_fig(fig_spec, 'spec')
save_chain.save_fig(fig_prop, 'prop')
save_chain.save_fig(fig_stateA, 'stateA')
save_chain.save_fig(fig_stateB, 'stateB')
_images/spec_ea0,2j_eb-0,2j_t(1+0j).png _images/stateA_ea0,2j_eb-0,2j_t(1+0j).png _images/stateB_ea0,2j_eb-0,2j_t(1+0j).png _images/prop_ea0,2j_eb-0,2j_t(1+0j).png

The state with \langle A|A \rangle>1/2 is amplified.