Chain with N site unit-cell

How do I use this algorithm? What does that parameter do?
Post Reply
xaver
Posts: 5
Joined: 23 Apr 2021, 07:51

Chain with N site unit-cell

Post by xaver »

Hello,
this is a stupid newbie's question. Most certainly, the answer I'm looking for is just a pointer to a location in the existing documentation. I'd be grateful for that. I'm trying to implement a model that lives on a chain and has more than a single site per unit cell. So, e.g. for 2 sites per unit cell, something like
$$H=\sum_l t_0 A^+_{0,l}A_{1,l} + t_1 A^+_{1,l}A_{0,l+1} +\mathrm{h.c.}$$
I don't want to 'group' the sites in the unit cell, which probably is not a good idea for local Hilbert space size reasons(?). So, simplistically, I tried to use the init_sites of a CouplingMPOModel, just with a list of sites, i.e., returning [A0Site,A1Site]. But that fails. So (where can I look up) how such a model is implemented properly?
xaver
Posts: 5
Joined: 23 Apr 2021, 07:51

Re: Chain with N site unit-cell

Post by xaver »

As usual, I couldn't wait, and tried some more. Let me pls. add to my question and get more specific. For the sake of brevity, let me assume that in my OP I set \(A_{l,j}=S_x\). Moreover at the risk of crucifixion, let me forget all about charge conservation, boundary conditions and other 'details'. Would then the following be the proper way of setting up the model (if only the H_MPO is needed)

Code: Select all

from tenpy.models.lattice import Lattice
from tenpy.models.model import CouplingModel,MPOModel
from tenpy.networks.site import SpinHalfSite

class dimer(CouplingModel, MPOModel):
    def __init__(self, model_params):
        #
        L = model_params.get('L', 10)
        lat = Lattice([L],[SpinHalfSite(conserve=None),SpinHalfSite(conserve=None)])
        CouplingModel.__init__(self, lat)
        #
        t0 = model_params.get('t0', 1.)
        t1 = model_params.get('t1', 1.)
        self.add_coupling(t0, 0, 'Sx', 1, 'Sx', [0])
        self.add_coupling(t1, 1, 'Sx', 0, 'Sx', [1])
        #
        MPOModel.__init__(self, lat, self.calc_H_MPO())
At least if I do

Code: Select all

c=dimer({'L':4,'t0':1.,'t1':2.})
print(c.all_coupling_terms().to_TermList())
The output looks reassuring

Code: Select all

1.00000 * Sx_0 Sx_1 +
2.00000 * Sx_1 Sx_2 +
1.00000 * Sx_2 Sx_3 +
2.00000 * Sx_3 Sx_4 +
1.00000 * Sx_4 Sx_5 +
2.00000 * Sx_5 Sx_6 +
1.00000 * Sx_6 Sx_7
So is this what one should do - or are there better ways?
User avatar
Johannes
Site Admin
Posts: 282
Joined: 21 Jul 2018, 12:52
Location: UC Berkeley

Re: Chain with N site unit-cell

Post by Johannes »

Yes, that's the general way to go about this: just define your lattice with the correct number of sites per unit sell, and add the corresponding couplings.
Some inspiration might be given by the Hofstadter models in TeNPy.
I guess it would also be useful to re-implement the FermionicHubbardModel with a two-site unit cell Square lattice instead of the SpinHalfFermionSite. Any volunteers? ;-)
Post Reply