Zero modes

These examples illustrate the conditions to get a zero-mode, its properties, and how to amplify it.

Note

Throughout the examples, the A sublattice displays a positive imaginary onsite energy (amplification) and the sublattice B a negative imaginary onsite energy (absorption) such than \bar{\epsilon}_a=-\bar{\epsilon}_b.

The chain is composed of n+1 sites A and n sites B, starts and ends with an A site. The odd number of sites breaks the sublattice symmetry (one extra A site) resulting in the existence of a zero-mode fully polarized on the A sublattice: \langle A|A \rangle=1, \langle B|B \rangle=0, and energie \Im(\epsilon_a).

_images/lattice_t(2+0j)_ea0,2j_eb-0,2j.png

Identical hoppings

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)
chain_tb.remove_sites([19])
# solve eigenvalue problem
t = 2.
eig_chain = eigChain(lat=chain_tb)
eig_chain.set_hop([t])
eig_chain.get_ham()
eig_chain.get_eig(eigenvec=True)
zero_mode = eig_chain.get_state_pola(b'a')
# plots
plot_chain = plotChain(sys=eig_chain)
fig_dispersion = plot_chain.plt_dispersion(t)
fig_lattice = plot_chain.plt_lattice(ms=15, fs=20, figsize=(10, 2.8))
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
fig_zero_mode = plot_chain.plt_intensity1d(zero_mode, 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_lattice, 'lattice')
save_chain.save_fig(fig_dispersion, 'dispersion')
save_chain.save_fig(fig_spec, 'spec')
save_chain.save_fig(fig_zero_mode, 'zero_mode')
save_chain.save_fig(fig_prop, 'prop')
_images/dispersion_t(2+0j)_ea0,2j_eb-0,2j.png _images/spec_t(2+0j)_ea0,2j_eb-0,2j.png _images/zero_mode_t(2+0j)_ea0,2j_eb-0,2j.png _images/prop_t(2+0j)_ea0,2j_eb-0,2j.png

The infinite chain can be viewed as an insulator in the condensed-matter language (no gap between the negative and positive energies). Below the PT-symmetry breaking, the spectrum displays the particle-hole symmetry.

In the finite case, there is an extented zero mode uniformly distributed on the A sites is found.

Identical hoppings with an impurity

The impurity is modeled by changing two adjacent hoppings of a given site.

_images/lat_hop_imp_t(2+0j)_ea0,1j_eb-0,1j.png
from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
nx = 11
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=nx, ny=1)
chain_tb.remove_sites([21])
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
on = [.1j, -.1j]
eig_chain.set_onsite(on=on)
t = 2.
eig_chain.set_hop_alt([2., 2.])
eig_chain.set_hop_def([[9, 10] ,[10, 11]], [1., 1.])
eig_chain.get_ham(compl_trans=True)
eig_chain.get_eig(eigenvec=True)
zero_mode = eig_chain.get_state_pola(b'a')
# plots
plot_chain = plotChain(sys=eig_chain)
fig_lat_hop = plot_chain.plt_chain_hop(ms=15, fs=20)
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
fig_zero_mode = plot_chain.plt_intensity1d(zero_mode, ms=20)
#propagation
prop_chain = propTB(lat=chain_tb, steps=1400, dz=0.1)
psi_init =  np.zeros(eig_chain.sites)
psi_init[eig_chain.sites//2] = 1.
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_lat_hop, 'lat_hop_imp')
save_chain.save_fig(fig_spec, 'spec_imp')
save_chain.save_fig(fig_zero_mode, 'zero_mode_imp')
save_chain.save_fig(fig_prop, 'prop_imp')
_images/spec_imp_t(2+0j)_ea0,1j_eb-0,1j.png _images/zero_mode_imp_t(2+0j)_ea0,1j_eb-0,1j.png _images/prop_imp_t(2+0j)_ea0,1j_eb-0,1j.png

The zero mode is an extended state with maximal amplitude on the impurity site.

Alternating hoppings

The infinite chain can be viewed as an isolator in the condensed-matter language (gap between the negative and positive energies). As in the identical hoppings case, the spectrum (blue dots) displays the particle-hole symmetry, the eigenenergies can be written as \pm |E_n|.

_images/lat_hop_ta(2+0j)_tb(1+0j)_ea0,2j_eb-0,2j.png
from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
nx = 11
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=nx, ny=1)
chain_tb.remove_sites([21])
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
on = [.2j, -.2j]
eig_chain.set_onsite(on=on)
ta, tb = 2., 1.
eig_chain.set_hop_alt([2., 1.])
eig_chain.get_ham(compl_trans=True)
eig_chain.get_eig(eigenvec=True)
zero_mode = eig_chain.get_state_pola(b'a')
# plots
plot_chain = plotChain(sys=eig_chain)
fig_lat_hop = plot_chain.plt_chain_hop(ms=15, fs=20)
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
fig_zero_mode = plot_chain.plt_intensity1d(zero_mode, ms=20)
#propagation
prop_chain = propTB(lat=chain_tb, steps=1400, dz=0.1)
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
from collections import OrderedDict
save_chain = saveFigTB(sys=eig_chain, params=OrderedDict([('ta', ta), ('tb', tb)]), dir_name='chain', ext='png')
save_chain.save_fig(fig_lat_hop, 'lat_hop')
save_chain.save_fig(fig_spec, 'spec')
save_chain.save_fig(fig_zero_mode, 'zero_mode')
save_chain.save_fig(fig_prop, 'prop')
_images/spec_ta(2+0j)_tb(1+0j)_ea0,2j_eb-0,2j.png _images/zero_mode_ta(2+0j)_tb(1+0j)_ea0,2j_eb-0,2j.png _images/prop_ta(2+0j)_tb(1+0j)_ea0,2j_eb-0,2j.png

The zero-mode is exponentially localized at one edge of the chain (the edge terminating with a weak coupling). The zero-mode is known as a Shockley state.

Dimerization defect

Without disorder

_images/lat_hop_dim_ta(2+0j)_tb(1+0j)_ea0,2j_eb-0,2j.png
from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
nx = 11
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=nx, ny=1)
chain_tb.remove_sites([21])
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
on = [.2j, -.2j]
eig_chain.set_onsite(on=on)
ta, tb = 2., 1.
eig_chain.set_hop_alt([2., 1.])
eig_chain.set_dim_defect(nx-1)
eig_chain.get_ham(compl_trans=True)
eig_chain.get_eig(eigenvec=True)
zero_mode = eig_chain.get_state_pola(b'a')
# plots
plot_chain = plotChain(sys=eig_chain)
fig_lat_hop = plot_chain.plt_chain_hop(ms=15, fs=20)
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
fig_zero_mode = plot_chain.plt_intensity1d(zero_mode, ms=20)
#propagation
prop_chain = propTB(lat=chain_tb, steps=1400, dz=0.1)
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
from collections import OrderedDict
save_chain = saveFigTB(sys=eig_chain, params=OrderedDict([('ta', ta), ('tb', tb)]), dir_name='chain', ext='png')
save_chain.save_fig(fig_lat_hop, 'lat_hop_dim')
save_chain.save_fig(fig_spec, 'spec_dim')
save_chain.save_fig(fig_zero_mode, 'zero_mode_dim')
save_chain.save_fig(fig_prop, 'prop_dim')
_images/spec_dim_ea0,2j_eb-0,2j_ta(2+0j)_tb(1+0j).png _images/zero_mode_dim_ea0,2j_eb-0,2j_ta(2+0j)_tb(1+0j).png _images/prop_dim_ea0,2j_eb-0,2j_ta(2+0j)_tb(1+0j).png

A defect in the dimerization creates a zero-mode localized at the defect.

with disorder

_images/lat_hop_dim_ta(2+0j)_tb(1+0j)_ea0,2j_eb-0,2j_d_h_0,95.png
from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
nx = 11
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=nx, ny=1)
chain_tb.remove_sites([21])
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
on = [.2j, -.2j]
eig_chain.set_onsite(on=on)
ta, tb = 2., 1.
eig_chain.set_hop_alt([2., 1.])
eig_chain.set_dim_defect(nx-1)
alpha = .95
eig_chain.set_disorder(alpha=alpha)
eig_chain.get_ham(compl_trans=True)
eig_chain.get_eig(eigenvec=True)
zero_mode = eig_chain.get_state_pola(b'a')
# plots
plot_chain = plotChain(sys=eig_chain)
fig_lat_hop = plot_chain.plt_chain_hop(ms=15, fs=20)
fig_spec = plot_chain.plt_spec(ms=20, pola_tag=b'a')
fig_zero_mode = plot_chain.plt_intensity1d(zero_mode, ms=20)
#propagation
prop_chain = propTB(lat=chain_tb, steps=1400, dz=0.1)
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
from collections import OrderedDict
save_chain = saveFigTB(sys=eig_chain, params=OrderedDict([('ta', ta), ('tb', tb), ('alpha', alpha)]), dir_name='chain', ext='png')
save_chain.save_fig(fig_lat_hop, 'lat_hop_dim')
save_chain.save_fig(fig_spec, 'spec_dim')
save_chain.save_fig(fig_zero_mode, 'zero_mode_dim')
save_chain.save_fig(fig_prop, 'prop_dim')
_images/spec_dim_ta(2+0j)_tb(1+0j)_ea0,2j_eb-0,2j_d_h_0,95.png _images/zero_mode_dim_ta(2+0j)_tb(1+0j)_ea0,2j_eb-0,2j_d_h_0,95.png _images/prop_dim_ta(2+0j)_tb(1+0j)_ea0,2j_eb-0,2j_d_h_0,95.png

The zero-mode is robust to disorder and in the gap i.e. the zero-mode is topologically protected. It has been first discover by Jackiw and Rebbin in field theory and few years later by Su, Schrieffer, and Heeger in condensed-matter.

Adiabatic pumping

Change of hopping configuation continuously.

Visit three different hopping configurations:

from chainTB import *
# lattice
tags = [b'a', b'b']
ri = [[0, 0], [1, 0]]
nx = 11
chain_tb = latticeTB(tags=tags, ri=ri, nor=2, ang=0.)
chain_tb.get_lattice(nx=nx, ny=1)
chain_tb.remove_sites([21])
# solve eigenvalue problem
eig_chain = eigChain(lat=chain_tb)
on = [.2j, -.2j]
eig_chain.set_onsite(on=on)
ta, tb = 2.5, 1.
eig_chain.set_hop_alt([2., 1.])
eig_chain.set_dim_defect(16)
eig_chain.get_ham(compl_trans=True)
ham1 = np.copy(eig_chain.ham)
eig_chain.set_hop_alt([2., 1.])
eig_chain.set_dim_defect(4)
eig_chain.get_ham(compl_trans=True)
ham2 = np.copy(eig_chain.ham)
eig_chain.set_hop_alt([2., 1.])
eig_chain.set_dim_defect(10)
eig_chain.get_ham(compl_trans=True)
ham3 = np.copy(eig_chain.ham)
hams = np.array([ham1, ham2, ham2, ham3, ham3])
#propagation
prop_chain = propTB(lat=chain_tb, steps=1000, dz=0.2)
psi_init =  np.zeros(eig_chain.sites)
psi_init[16] = 0.5
prop_chain.get_pump(hams=hams, psi_init=psi_init)
fig_pump = prop_chain.plt_prop1d()
plt.show()
# save figures
from collections import OrderedDict
save_chain = saveFigTB(sys=eig_chain, params=OrderedDict([('ta', ta), ('tb', tb), ('pump', 3)]), dir_name='chain', ext='png')
save_chain.save_fig(fig_pump, 'pumping')
_images/pumping_ta(2,5+0j)_tb(1+0j)_ea0,1j_eb-0,1j.png