Adding disorders and adding a site to 1D SSH chain

How do I use this algorithm? What does that parameter do?
Post Reply
steven_tao
Posts: 13
Joined: 11 Mar 2020, 01:07

Adding disorders and adding a site to 1D SSH chain

Post by steven_tao »

Hello, TeNPy community,

I want to simulate the following Boson-Hubbard Hamiltonian on a simple SSH chain:

\(H = \sum_i \left(t_1 b_i^\dagger a_i + t_2 a_{i+1}^\dagger b_i + H.c.\right) + \sum_i (U_1 a_i^\dagger a_i a_i^\dagger a_i + U_2 b_i^\dagger b_i b_i^\dagger b_i) + \sum_i (V_i a_i^\dagger a_i + Q_i b_i^\dagger b_i) \)

where each unit cell contains two Bosons \( a_i, b_i \), and \(V_i\) and \(Q_i\) are random onsite potentials. I have the following four questions to simulate this model in TeNPy:

(1) About the function "multi_sites_combine_charges":
I firstly set the site and lattice as follows

Code: Select all

        boson_site1 = BosonSite(Nmax=n_max, conserve='N')
        boson_site2 = BosonSite(Nmax=n_max, conserve='N')
        multi_sites_combine_charges([boson_site1, boson_site2])     
        lat = Lattice([L], [boson_site1, boson_site2], bc=bc, bc_MPS=bc_MPS)  
Could I ask whether the function "multi_sites_combine_charges" should be applied in the present model although two sites in the unit cell have the same kind of particles? If yes, could you please tell me how to set the second argument in the the function "multi_sites_combine_charges"?

(2) To add terms of the Hamiltonian, how I can use the function "add_onsite" to add disorders for \(V_i\) and \(Q_i\), respectively?

(3) How to set the onsite energy at a specific site of the chain, e.g., \(J *a_p^\dagger a_p\) at p site (0<p<L) using the function "add_onsite_term"?

(4) If I want the first site and last site of the chain to be the Boson \(a\) (i.e., to remove the last site \(b_L\)), how I can write the python script?

Thank you very much!
User avatar
Johannes
Site Admin
Posts: 413
Joined: 21 Jul 2018, 12:52
Location: TU Munich

Re: Adding disorders and adding a site to 1D SSH chain

Post by Johannes »

You want to simulate it on a finite system, right?

The SSH chain is just a regular chain with alternating coupling strength. Given that, I think it might be easier in this case to really use the "Chain" with a single-site unit cell instead of a Lattice with a two-site unit cell. In particular, (4) is then just using an odd length L.
Adding or removing a site is currently not implemented - it's on the To-Do List, Issue #77.

The strength argument of both add_onsite and add_coupling can be a numpy array.
The correct shape depends on how many onsite/coupling terms you have. For the onsite terms, it's just the number of sites, for hoppings by dx=1, it's one less. Hence, you want something along

Code: Select all

lat = Chain(L, boson_site, bc='open', bc_MPS='finite', ...)
...
t1, t2, U1, U2, V, Q = parameters # read them out....
L = self.lat.Ls[0]
U = np.ones(L)
U[0::2] *= U1  # scale even entries
U[1::2] *= U2  # scale odd entries
self.add_onsite(U, 0, 'N N')

disorder = (np.random.random(L) * 2 - 1.)  # L numbers in [-1, 1]
disorder[0::2] *= V  # scale even terms with V
disorder[1::2] *= Q  # scale odd terms with Q
self.add_onsite(disorder, 0, 'N')

t = np.ones(L - 1)  # there is one less bond than sites!
t[0::2] *= t1  # scale even entries
t[1::2] *= t2  # scale odd entries
self.add_coupling(t, 0, 'Bd', 0, 'B', 1)
# starting with the next release, you can use 
# self.add_coupling(..., add_hc=True) above instead of explicitly
# specifying the line below
self.add_coupling(np.conj(t), 0, 'Bd', 0, 'B', -1)  # h.c.
For (3), just use add_onsite, if that's what you want :D
Really, it seems like you just ask for

Code: Select all

self.add_onsite_term(J, p, 'N')
This works because for a Chain with default order, MPS and lattice index are the same.
For more general lattices, you can use the lattice-method lat2mps_idx.
steven_tao
Posts: 13
Joined: 11 Mar 2020, 01:07

Re: Adding disorders and adding a site to 1D SSH chain

Post by steven_tao »

Hi Johannes, it is greatly appreciated.
Post Reply