# How do I distinguish between right moving and left moving fermions in ITensor?

+1 vote

Hi!
I want to study a system with two species of fermions, that is right movers and left movers. I want to label the operators as c{R} and c{L} for right and left movers respectively . Is there any way to do this in ITensor?

commented by (52.6k points)
Hi, thanks for the question. Could please elaborate a bit more so I can be sure to give the most helpful answer? When you say right and left moving fermions, do you mean in the context of say a Luttinger liquid or relatedly the low-energy description of one-dimensional fermions?

If so, I think my answer will be mostly in the negative, that I don't know a good way to treat these using tensor networks on a discrete lattice. But the main issues aren't ITensor-specific: rather there are a number of deep obstructions to representing relativistic fermion theories faithfully using discretized lattice models (e.g. the fermion doubling problem and other issues).

But maybe your question is a different one, just about having multiple "species" of fermions?

If you could point me to a precise lattice Hamiltonian (such as in a paper) you are trying to simulate that would be the most helpful info you could give.

Miles
commented by (230 points)
edited
H!
Thank you for the response. Sorry for not elaborating the question properly.
So basically the lattice Hamiltonian i want to simulate is
$$H_0 = - t\sum_{i=1}^{N} c^{\dagger}_{R,i}c_{R,i+1} - t\sum_{i=1}^{N} c^{\dagger}_{L,i}c_{L,i+1}- t\sum_{i=1}^{N} c^{\dagger}_{R,i+1}c_{R,i} \\ - t\sum_{i=1}^{N} c^{\dagger}_{L,i+1}c_{L,i}$$
plus an interaction part of the type
$$H_{I} = v_0 \sum_{i=1}^{N} n_i n_{i+1}$$
where @@ n_i = c^{\dagger}_{R,i}c_{R,i} +  c^{\dagger}_{L,i}c_{L,i} @@.

Like you mentioned there are difficulties in treating the Luttinger liquid fermions in a lattice model, but I want to simulate  in some sense a toy lattice model that  tries to capture some of the physics of a Luttinger liquid with only short range forward - scattering interactions.

So I want to be able to define creation and annihilation operators for two species of fermions that I label R (right) and L (left).  I'm using C++ v3 by the way.

Best Regards

Thanks for the extra info above.

So the easiest way to do this with the setup available in ITensor is to define (in your head, more so than in the code) the odd numbered sites to be "L" fermions and the even numbered sites to be "R" fermions. Then this choice is enforced by how you construct the Hamiltonian, such as only inputting hopping terms which connect even to even or odd to odd sites.

Does that approach seem clear to you? Note that converging this setup in DMRG may become a bit harder because two-site DMRG becomes effectively one-site DMRG, but you can overcome this with a good choice of initial state and the use of the noise term.

In the Julia version of ITensor, we offer some more customizability of operators, as used by the AutoMPO system. So there you can introduce custom fermionic operator types and it would be possible to put the L and R fermions on the same site (making dimension 4 site, sort of like in the Hubbard model but with L,R taking the place of spin).

Best,
Miles

commented by (190 points)
This is really helpful. Thanks Miles!
commented by (190 points)
Hi Miles,

Sorry to bother you again, but another issue popped up when initializing the random state this way. The QN-conserving random MPS conserves the total fermion number, but the numbers for each flavor (i.e. the total number on odd or even sites) are not separately conserved.

I tried to define the sites_odd and sites_even separately using siteinds(...), and then combine them into a single sites array, but it doesn't work.

Thanks a lot for your time.
Mason
commented by (52.6k points)
Hi, so for that to work you will need to define custom quantum numbers ("QN" objects) which use a different name for the two types of fermions. Then when you make the array of site indices (so you will need to either overload the siteinds function or just make an array in a loop) you should switch off the QNs in odd versus even sites to have the appropriate QNs labeling their subspaces.

Best,
Miles
commented by (52.6k points)
You could use this example to see how things work:
http://itensor.org/docs.cgi?vers=julia&page=formulas/mixed_sites_dmrg

If you print out the sites array, you'll see that it's nothing but a plain Julia array of Index objects. Then if you look at the QN structure of each of these Index objects you will see it alternates from site to site. So if you construct a similar array with QNs reflective of your system then it ought to just work the way you want.

Miles
commented by (190 points)
Hi Miles, I tried to define a new site type "Electrons_two_flavors" by including the flavor index at each site and try to conserve the $\tau_z$ QN, which is defined to be the onsite number difference between the two flavors. Here is the beginning part of the code (I can post the rest if you need it):

function space(::SiteType"Electron_two_flavors";
conserve_qns = false,
conserve_sz = conserve_qns,
conserve_nf = conserve_qns,
conserve_nfparity = conserve_qns,
qnname_sz = "Sz",
qnname_tauz = "Tauz",
qnname_nf = "Nf",
qnname_nfparity = "NfParity",
# Deprecated
conserve_parity = nothing)

However, when I run this  I got the error "LoadError: String is too long for SmallString. Maximum length is 8". I tried to reduce the lengths of the defined OpNames and StateNames to be within 8, but the error is still there.

Another question is, is there a way to incorporate this new site type into my ITensor so that I don't have to run it every time before running the other code?

Thanks a lot for your time
Mason