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

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:

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!

Johannes
Posts: 135
Joined: 21 Jul 2018, 12:52
Location: UC Berkeley

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

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
U = np.ones(L)
U[0::2] *= U1  # scale even entries
U[1::2] *= U2  # scale odd entries

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

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
# 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 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: 5
Joined: 11 Mar 2020, 01:07

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

Hi Johannes, it is greatly appreciated.