+2 votes
asked by (280 points)

Hi, when I apply the hubbard model, I found there are two kinds of operators, namely, "Adagup" and "Cdagup", for example. Would you please explain me the difference between this two ? Is it true that we can use two different conventions, but still get the same results by some adjustment?

I used "Adagup" convention to calculate the easiest problem, which is in the extended hubbard model, set t2, U and V1 all equals zero. Then, calculate the ground state energy and two sites correlation, < Adagup_i Aup_j >.

When I compare the ground state energy with other scripts I have, they are the same. But when I do the two point correlation function, it's only correct for two cases, namely, < Adagupi Aupi> and < Adagup_i Aup_i+1>.

  • For example, < Adagup_1 Aup_2> is correct and the same with other scripts I have, but < Adagup_1 Aup_3 > is not the same.

I think ITensor should give me an accurate results for both ground state energy and correlation, right?

Sorry for the massive information, but I really hope you can help me. Thanks very much.

Best Regards

1 Answer

+1 vote
answered by (70.1k points)

Hi Wangwei,
The current situation in ITensor is admittedly confusing, but is about the best we can do until we introduce automatic support for fermion anti-commutation, which is a feature we hope to add in version 3 (sometime later this year possibly?).

For now the burden is on you the user to correctly map fermion operators to hard-core boson operators as explained in this recently added tutorial:

The one exception is when you are using AutoMPO, which does automatically put in Jordan-Wigner string for you. There the operators "Cup", "Cdn", etc. do have a special meaning and you can think of them as anti-commuting even between different sites.

But when you are making your own MPO by hand or doing a measurement, such as a correlation function like
\langle c_i c^\dagger_j \rangle
then you need to correctly map the fermion operators to hard-core boson operators.

I added a new section to the fermion tutorial explaining what the "Cup", "Cdagup" operators mean in the Hubbard site set. They are defined with the correct signs on a single site. But, outside of AutoMPO, they do not anti-commute across different sites.

Finally, to address your specific case, you should be seeing a correct ground state energy if you are using AutoMPO because it does handle fermions automatically. If you were to look at the Hamiltonian AutoMPO produces, though, it's actually written in terms of hard-core boson operators plus Jordan-Wigner string or "F" operators.

To measure fermion correlation functions, you can't just measure
\langle a_{\uparrow i} a^\dagger_{\uparrow j} \rangle
You must measure
\langle a_{\uparrow i} F_{i+1} F_{i+2} \cdots a^\dagger_{\uparrow j} \rangle

commented by (280 points)
Thanks very much, Miles. I want to make sure something before we close this discussion. So, in my case,  I am doing hubbard model calculation, which is fermionic by using AutoMPO, and I want to calculate the correlation functions.  Which convention should I use in the DMRG process? I notice, actually, "Cdagup" and "Adagup" both give me correct ground state energy.

To measure the correlation function, I should use "Adagup" plus those "F" operators, right? Does that mean, I should also use "Adagup" in stead of "Cdagup" the DMRG calculation?
commented by (280 points)
Also, those "F" operators in spinful systems is  "F_up*F_dn", right?  So, that should really be (1-2*Nup)*(1-2*Ndn), instead of like the spinless form (1-2*Ntot), right?
commented by (280 points)
Hello, Miles, I figured out how to calculate the correlation function.  Actually in the DMRG calculation, we should choose "Cdagup", "Cup" etc, convention, and to calculate the correlation function, we should use "Adagup", "Aup" plus Jordan Wigner Transformation.

If someone is interested in this, I can also share my code.

Thanks again very much for your explanation in this issue.
commented by (70.1k points)
Hi Wangwei, I meant to relpy sooner but you are exactly right:

* For constructing the Hamiltonian with AutoMPO, use the Cup, Cdagup, Cdn, Cdagdn operator names. These names have a special meaning within AutoMPO which knows how to correctly put in the correct non-local anticommutation behavior.

* For measuring correlation functions of an MPS representing a system of fermions, use the Aup, Adagup, etc. operators plus Jordan-Wigner string. You could also use the C operators plus a slightly different pattern Jordan-Wigner string but I find the A operators clearer myself.

For lots more details see the new tutorial article: http://itensor.org/docs.cgi?page=tutorials/fermions
commented by (960 points)
Is it possible to use AutoMPO to generate and then measure correlation functions?
commented by (70.1k points)
Hi Jon, it's certainly possible and would be a good way to test a more "manual" code for measuring fermions without having to worry about details of Jordan-Wigner string, as AutoMPO takes care of this for you. Of course, for large systems and measurements of all N^2 values of some two-site correlation function f(i,j), the AutoMPO approach would have a lot of overhead and one would need to write a code more similar to the one at the following link to maintain efficiency:
commented by (960 points)
Ok thanks, after I get the "manual" approach working I will try the AutoMPO approach.

Regarding the manual approach, I am uncertain how to get the correct priming on the operator indices. For instance, when I implemented the following (where psi is a ground state wavefunction ITensor):

Vector Cbow(N);  // A vector of numbers
 for(int j=1; j<= N; ++j)
 Cbow(j-1) = (dag(prime(psi.A(j),Site,3))*prime(sites.op("Adagup",j),2)*prime(sites.op("F",j),1)*sites.op("Aup",j+1)*psi.A(j)).real();

 println("bonding strength");
 for(int j = 0; j < N; ++j)
printfln("%d %.10f",1+j,Cbow(j));

I get the following output:

Tensor indices =
IQIndex(site=2,4,Site,51) <In>
  (Emp 2,1,Site,811) (Sz=0,Nf=0)
  (Up 2,1,Site,631) (Sz=1,Nf=1)
  (Dn 2,1,Site,609) (Sz=-1,Nf=1)
  (UpDn 2,1,Site,392) (Sz=0,Nf=2)

IQIndex(site=2,4,Site,51)' <Out>
  (Emp 2,1,Site,811)' (Sz=0,Nf=0)
  (Up 2,1,Site,631)' (Sz=1,Nf=1)
  (Dn 2,1,Site,609)' (Sz=-1,Nf=1)
  (UpDn 2,1,Site,392)' (Sz=0,Nf=2)

IQIndex(site=1,4,Site,867)' <In>
  (Emp 1,1,Site,315)' (Sz=0,Nf=0)
  (Up 1,1,Site,199)' (Sz=1,Nf=1)
  (Dn 1,1,Site,83)' (Sz=-1,Nf=1)
  (UpDn 1,1,Site,802)' (Sz=0,Nf=2)

IQIndex(site=1,4,Site,867) <Out>
  (Emp 1,1,Site,315) (Sz=0,Nf=0)
  (Up 1,1,Site,199) (Sz=1,Nf=1)
  (Dn 1,1,Site,83) (Sz=-1,Nf=1)
  (UpDn 1,1,Site,802) (Sz=0,Nf=2)

Indices provided =
From line 137, file /home/Jon/itensor/itensor/itensor_interface.ih

Wrong number of IndexVals passed to real/cplx (expected 4, got 0)

Wrong number of IndexVals passed to real/cplx (expected 4, got 0)
Aborted (core dumped)

Is this simply a problem of incorrectly priming the operators? How can I correctly prime the operators, and does the Site set of operators have a built-in priming capability?
commented by (960 points)
Hi Wangwei,

I would like to see how you implemented the correlation function, if you don't mind posting your code.

commented by (960 points)
Miles, does


answer the question? I am unsure if the approach I was using in the above post is the correct way to implement the correlation function.
commented by (70.1k points)
Hi Wangwei, Jon,
Yes the tutorial that Jon linked to does a very nice job (thanks to Tom Baker) of explaining step by step the optimal way to compute correlation functions. This way is much more efficient than making an MPO (or IQMPO) for each different spacing of the operators.

The key difference with fermions is that the "C..." operators obtained from the sites.op function only anticommute on the same site, but not on different sites. So you have to manually insert Jordan-Wigner string when computing Cdag...C type correlation functions.

Jon - see if the tutorial helps with the error you were getting in your code. Otherwise please send me an email about it or post a new question about it and we can help you debug.
Welcome to ITensor Support Q&A, where you can ask questions and receive answers from other members of the community.

Formatting Tips:
  • To format code, indent by four spaces
  • To format inline LaTeX, surround it by @@ on both sides
  • To format LaTeX on its own line, surround it by $$ above and below
  • For LaTeX, it may be necessary to backslash-escape underscore characters to obtain proper formatting. So for example writing \sum\_i to represent a sum over i.
If you cannot register due to firewall issues (e.g. you cannot see the capcha box) please email Miles Stoudenmire to ask for an account.

To report ITensor bugs, please use the issue tracker.