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?

+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?

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

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

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

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

0 votes

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

Thanks for the answer. I'll try to implement this in the Julia version and see if I can put L and R fermions on the same site.

Ok great. Since you're interested in going that route, the key thing to learn about is the `has_fermion_string` function overloads, which you can see in these files which define the various fermionic site types included in ITensors.jl:

https://github.com/ITensor/ITensors.jl/blob/master/src/physics/site_types/fermion.jl

https://github.com/ITensor/ITensors.jl/blob/master/src/physics/site_types/electron.jl

(See the very end of each of these files.)

As long as you (1) define these functions to return `true` for any fermionic operator you define and (2) define that operator correctly so that it has the right commutation relations in an on-site way too (note the minus signs for "Cdn" and "Cdagdn" in the Electron site definitions, which are these 'on site' signs I'm referring to, since down electrons are taken to be ordered 'after' up electrons in our convention), then you will be guaranteed to get the correct result from the AutoMPO system when using it to make a Hamiltonian with your custom operators.

This capability isn't available in the C++ version currently, because there we just hard-wired which fermionic operators AutoMPO knows about. It's a lot easier to extend library code in Julia which is one of the reasons we switched to it for the newest version of ITensor.

Best,

Miles

https://github.com/ITensor/ITensors.jl/blob/master/src/physics/site_types/fermion.jl

https://github.com/ITensor/ITensors.jl/blob/master/src/physics/site_types/electron.jl

(See the very end of each of these files.)

As long as you (1) define these functions to return `true` for any fermionic operator you define and (2) define that operator correctly so that it has the right commutation relations in an on-site way too (note the minus signs for "Cdn" and "Cdagdn" in the Electron site definitions, which are these 'on site' signs I'm referring to, since down electrons are taken to be ordered 'after' up electrons in our convention), then you will be guaranteed to get the correct result from the AutoMPO system when using it to make a Hamiltonian with your custom operators.

This capability isn't available in the C++ version currently, because there we just hard-wired which fermionic operators AutoMPO knows about. It's a lot easier to extend library code in Julia which is one of the reasons we switched to it for the newest version of ITensor.

Best,

Miles

...