Define spin-1 Boson site

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

Define spin-1 Boson site

Post by steven_tao »

Dear Community,

How we can define the spin-1 Boson site for the following Hamiltonian:

\(H = - t \sum_{i, \sigma} \left(b^\dagger_{i, \sigma} b_{i+1, \sigma} + H.c. \right) + U_1 \sum_i n_{i, \sigma}\left(n_{i, \sigma}-1\right) + U_2 \sum_i \mathbf{S}_i^2\)

where spin operator \(\mathbf{S}_i = \sum_{\sigma,\sigma'} b^\dagger_{\sigma,\sigma'} S_{\sigma,\sigma'} b_{\sigma,\sigma'} \), with standard spin-1 matrice \(S_{\sigma,\sigma'}\).

Is it right like this?

Code: Select all

        # Set site 
        boson_site_1 = BosonSite(Nmax=n_max, conserve='N')      # spin component 1
        boson_site_2 = BosonSite(Nmax=n_max, conserve='N')      #  spin component 0
        boson_site_3 = BosonSite(Nmax=n_max, conserve='N')      #  spin component -1
        
        # Set lattice       
        lat = Lattice([L], [boson_site_1, boson_site_2, boson_site_3], bc=bc, bc_MPS=bc_MPS) 


        # Add terms of the Hamiltonian
        self.add_coupling(-t,0,'Bd',0,'B',1)   
        self.add_coupling(-t,1,'Bd',1,'B',1)   
        self.add_coupling(-t,2,'Bd',2,'B',1)   

How to define spin operators and add Last term when adding terms of the Hamiltonian?
User avatar
Johannes
Site Admin
Posts: 413
Joined: 21 Jul 2018, 12:52
Location: TU Munich

Re: Define spin-1 Boson site

Post by Johannes »

steven_tao wrote: 02 Apr 2020, 01:10 where spin operator \(\mathbf{S}_i = \sum_{\sigma,\sigma'} b^\dagger_{\sigma,\sigma'} S_{\sigma,\sigma'} b_{\sigma,\sigma'} \), with standard spin-1 matrice \(S_{\sigma,\sigma'}\).
I guess you meant the usual definiton
\(S^\alpha_i = \sum_{\sigma,\sigma'} (b^\alpha_{i,\sigma})^\dagger S^\alpha_{\sigma,\sigma'} b_{i, \sigma'} \), with \(\alpha = x,y,z\).

Given that, you can evaluate what \(\mathbf{S}_i^2 \equiv S^x_i S^x_i + S^y_i S^y_i +S^z_i S^z_i\) evaluates to in terms of boson-operators: basically a sum of 4-body terms with prefactors.
You can even try to evaluate that numerically, but I would highly recommend to at least very carfully check the results ;-)
Make your model a tenpy.models.model.MultiCouplingModel and add the corresponding terms with add_multi_coupling.

Alternatively, you can group those sites into a single Site class, similar as it is done for the tenpy.networks.site.SpinFullFermionSite - this allows to define the spin operators as "onsite" operators.
The drawback: in particular if you want to use n_max > 2, this will quickly result in very large local dimensions, and make DMRG very costly.

Finally, you could try a mix of both approaches:
Group the sites temporarily for creating the hamiltonian, and then split the MPO after creation. This is, however, not implemented at the moment - you would need to write something similar as group_split for the MPO class, which takes the "identity" operators properly into account.

Overall, I'd recommend the first approach: evaluate \(\mathbf{S}_i^2\) and use the MultiCouplingModel.
Post Reply