+1 vote
asked by (130 points)
edited by

I'm studying tJ model and using julia.

I want to calculate an overlap between the ground state |FP> obtained at maximum Sz sector with the ground state |GS> at minimum |Sz| sector (either 0 or 1/2). For simplicity, let's assume that the number of electrons, N, is even, so that we are comparing the ground states of Sz = N/2 and Sz = 0. The overlap can be written as @@< GS | (S^-)^{N/2} |FP>@@, where @@S^- = \sum_{i=1}^{Lx*Ly}S_i^-@@.

I want to conserve the quantum numbers "N" and "Sz", so I constructed sites as follows.

sites1 = siteinds("tJ", Lx; conserve_qns=true)    

Then I computed ground state FP and GS at Sz = N/2 and Sz= 0 sector, respectively.

psi_init_maxSz = InitState_Sz(Lx, N, N/2 , sites1);
energy_FP, FP = dmrg(H, psi_init_maxSz, sweeps)


psi_init_minSz = InitState_Sz(Lx, N, (iseven(N) ? 0 : 1/2) , sites1);
energy_GS, GS = dmrg(H, psi_init_minSz, sweeps)

Now, since FP and GS are in different Sz sector, I removed QN conservation using dense() and constructed new sites 'sites2'.

FPstate_maxSz = dense(FP)
sites2 = siteinds(FPstate_maxSz)
GS_minSz = dense(GS)

Also, I built the following @@S^-@@ MPO.

function S_lowering(Lx,Ly,  sites)
    ampo = AutoMPO();
    for i in 1:Lx*Ly
        ampo += 1, "S-", i
    return  MPO(ampo, sites)

Finally, I performed the overlap calculation:

Slowering = S_lowering(Lx, 1, sites2);
for i in 1:div(N,2)
    FPstate_maxSz = contract(Slowering, FPstate_maxSz)
overlap= abs(inner(GS_minSz, FPstate_maxSz))

However, the expression

FPstate_maxSz = contract(Slowering, FPstate_maxSz)

seems to cause infinite loop -- it doesn't stop so I have to force quit.
What is wrong with this and is there a better way to achieve my goal?

Thanks a lot in advance.

commented by (62.7k points)
Hi Kyungsu,, happy to take a closer look, but I believe the overlap of two states with different quantum numbers is always zero. Do you know if it’s expected to be non-zero in the specific case you’re considering?

commented by (130 points)
Thanks for the question. You are correct, and that’s why I put S^- operator in the middle. |GS> has a Sz quantum number 0 and |FP> has a Sz quantum number N/2. Therefore, (S-)^N/2|FP> has the same Sz quantum number as |GS>, so the “overlap” <GS| (S-)^N/2|FP> can be nonzero.
commented by (130 points)
There was a similar question here for the C++ implementation: http://itensor.org/support/2320/convert-a-quantum-number-mps-to-a-no-quantum-number-mps

However I was still not able to implement this in julia…
commented by (13.2k points)
Could you please format the code in your original question better? It is a bit hard to read.
commented by (130 points)
I just did. Thanks for letting me know!

Please log in or register to answer this question.

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.