Fermion Sites From Two Samples

How do I use this algorithm? What does that parameter do?
Post Reply
Wenqi Yang
Posts: 1
Joined: 10 Oct 2023, 04:58

Fermion Sites From Two Samples

Post by Wenqi Yang »

Hello,

I want to set up a system contain two spinless Fermion chains. For both of them, the total occupation numbers are conserved seperately. I want to tune the length of these two chains ( the lengths of them are non-equal), so I do not want to use the "multi_sites_combine_charges". Could you please tell me how to deal with this kind of problem? Thank you very much!
User avatar
Johannes
Site Admin
Posts: 428
Joined: 21 Jul 2018, 12:52
Location: TU Munich

Re: Fermion Sites From Two Samples

Post by Johannes »

You can still use the tenpy.networks.site.set_common_charges (the multi_sites_combine_charges is deprecated) to do that.
If you specify new_charges='independent', it does exactly what you're asking for: it conserves the total charge on the f1 sites separate from the one of the f2 site.

I'm not sure what kind of couplings you want between those chains (is one e.g. twice as long as the other?), but I could e.g imagine to use a Ladder and then remove some sites such that one is say 3 times shorter than the other.
Minimal example:

Code: Select all

import tenpy
from tenpy.networks.site import FermionSite, set_common_charges
from tenpy.models.model import CouplingMPOModel
from tenpy.models.lattice import Ladder, IrregularLattice
import matplotlib.pyplot as plt


class DoubleChains(CouplingMPOModel):
    default_lattice = "Ladder"
    force_default_lattice = True
    
    def init_sites(self, model_params):
        f1 = FermionSite(conserve='N')
        f2 = FermionSite(conserve='N')
        set_common_charges([f1, f2], new_charges='independent')
        return [f1, f2]
    
    def init_lattice(self, model_params):
        L = model_params["L"]  # long chain
        ratio_short_long = int(model_params.get("ratio_short_long", 2))
        assert L % ratio_short_long == 0, "L should be commensurate with ratio_short_long"
        model_params['irregular_remove'] = [(x, 1) for x in range(L) if x % ratio_short_long != 0]
        lat = super().init_lattice(model_params)
        return lat
    
    def init_terms(self, model_params):
        L = model_params["L"]  # long chain
        ratio_short_long = int(model_params.get("ratio_short_long", 2))
        t1 = model_params.get('t1', 1.)
        t2 = model_params.get('t2', 1.)
        U = model_params.get('U', 2.)
        self.add_coupling(t1, 0, 'Cd', 0, 'C', dx=[1], plus_hc=True) # NN hopping chain 1 (long)
        self.add_coupling(t2, 1, 'Cd', 1, 'C', dx=[ratio_short_long], plus_hc=True)  # NN hopping chain 2 (short)
        self.add_coupling(U, 0, 'N', 1, 'N', dx=[0]) # interaction between chains

M = DoubleChains({'L': 12, "ratio_short_long": 3})
print(M.lat.unit_cell[0].leg.chinfo)


ax = plt.gca()
M.lat.plot_sites(ax)
M.lat.plot_coupling(ax, [(0, 0, [1])], color='r', label='t1')
M.lat.plot_coupling(ax, [(1, 1, [M.options['ratio_short_long']])], color='b', label='t2')
M.lat.plot_coupling(ax, [(0, 1, [0])], color='g', label='U')
ax.legend()
ax.set_aspect(1.)
plt.show()
Which yields a lattice looking like this:
example.png
example.png (4.92 KiB) Viewed 13262 times
Post Reply