:tocdepth: 2 PT-symmetry ====================================== These examples illustrate the PT-symmetry and the PT-symmetry breaking. .. note:: Throughout the examples, the hoppings :math:`t_{ab}=t_a` and :math:`t_{ba}=t_b` are real and the onsite energies are purely imaginary with :math:`\epsilon_a=i\gamma` and :math:`\epsilon_b=-i\gamma`. Then, the A sites are amplified (positive imaginary part) and the B sites are absorbed (negative imaginary part). Dimer -------------- .. image:: ../TBfig/chain_n2/lattice_t(1+0j).png :height: 80px :width: 100% :align: center The Hamiltian reads .. math:: \left( \begin{array}{cc} i\gamma & t \\ t & i\gamma \end{array} \right) Hermitian case ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In the case :math:`\gamma=0`, the Hamiltonian is real symmetric, the eigenenergies are real and given by: :math:`E_\pm=\pm t`. .. code-block:: python 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') .. image:: ../TBfig/chain_n2/spec_t(1+0j)_ea0j_eb0j.png :width: 55% :align: center .. image:: ../TBfig/chain_n2/prop_dimer_t(1+0j)_ea0j_eb0j.png :width: 45% .. image:: ../TBfig/chain_n2/prop_t(1+0j)_ea0j_eb0j.png :width: 45% Non-Hermitian case ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In the case :math:`\gamma\neq0`, the Hamiltonian is complex non-Hermitian, and display the space-time reflection symmetry. The eigenenergies are given by: :math:`E_\pm=\pm \sqrt{t^2-|\gamma|^2}`. As the result, the energies are real if :math:`t>\gamma`, degenerated if :math:`t=\gamma` (PT-symmetric phase), and complex if :math:`t<\gamma`. :math:`\gamma` (broken PT-symmetry). :math:`t=\gamma`. :math:`\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: :math:`E_\pm=\pm \sqrt{t^2-|\gamma|^2}`. .. code-block:: python 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') .. image:: ../TBfig/chain_n2/spec_ea0,8j_eb-0,8j_t(1+0j).png :width: 55% :align: center .. image:: ../TBfig/chain_n2/prop_dimer_ea0,8j_eb-0,8j_t(1+0j).png :width: 45% .. image:: ../TBfig/chain_n2/prop_ea0,8j_eb-0,8j_t(1+0j).png :width: 45% breaking point """"""""""""""""""" At the breaking point, :math:`\gamma=t`, the eigenenergies coincide: :math:`E_\pm=0`. .. code-block:: python 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') .. image:: ../TBfig/chain_n2/spec_ea1j_eb-1j_t(1+0j).png :width: 55% :align: center .. image:: ../TBfig/chain_n2/prop_dimer_ea1j_eb-1j_t(1+0j).png :width: 45% .. image:: ../TBfig/chain_n2/prop_ea1j_eb-1j_t(1+0j).png :width: 45% broken PT-symmetry """""""""""""""""""""""""""""""""""""" Above the PT-symmetry breaking point, :math:`\gamma>t`, the eigenenergies are complex: :math:`E_\pm= \pm i \sqrt{\gamma^2-t^2}`. .. code-block:: python 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') .. image:: ../TBfig/chain_n2/spec_ea1,2j_eb-1,2j_t(1+0j).png :width: 55% :align: center .. image:: ../TBfig/chain_n2/prop_dimer0_ea1,2j_eb-1,2j_t(1+0j).png :width: 45% .. image:: ../TBfig/chain_n2/prop_dimer1_ea1,2j_eb-1,2j_t(1+0j).png :width: 45% .. image:: ../TBfig/chain_n2/prop0_ea1,2j_eb-1,2j_t(1+0j).png :width: 45% .. image:: ../TBfig/chain_n2/prop1_ea1,2j_eb-1,2j_t(1+0j).png :width: 45% Dimer chain ---------------------------- The chain is composed of :math:`n` dimers *i.e.* :math:`n` sites A and :math:`n` sites B. The chain starts with a A site and ends with a B site. .. image:: ../TBfig/chain_n20/lattice.png :height: 80px :width: 100% :align: center Hermitian case ^^^^^^^^^^^^^^^ .. code-block:: python 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') .. image:: ../TBfig/chain_n20/spec_t(1+0j).png :width: 45% .. image:: ../TBfig/chain_n20/prop_t(1+0j).png :width: 45% Non-Hermitian case ^^^^^^^^^^^^^^^^^^^^^ PT-symmetry """"""""""""""""""""""""""""""" .. code-block:: python 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') .. image:: ../TBfig/chain_n20/spec_ea0,1j_eb-0,1j_t(1+0j).png :width: 45% .. image:: ../TBfig/chain_n20/prop_ea0,1j_eb-0,1j_t(1+0j).png :width: 45% broken PT-symmetry """"""""""""""""""""""""""""""" .. code-block:: python 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') .. image:: ../TBfig/chain_n20/spec_ea0,2j_eb-0,2j_t(1+0j).png :width: 55% :align: center .. image:: ../TBfig/chain_n20/stateA_ea0,2j_eb-0,2j_t(1+0j).png :width: 45% .. image:: ../TBfig/chain_n20/stateB_ea0,2j_eb-0,2j_t(1+0j).png :width: 45% .. image:: ../TBfig/chain_n20/prop_ea0,2j_eb-0,2j_t(1+0j).png :width: 65% :align: center The state with :math:`\langle A|A \rangle>1/2` is amplified.