# overlap of two states in different QN sectors

+1 vote
edited

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)


and

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
end
return  MPO(ampo, sites)
end


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)
end
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?

commented by (70.1k 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?

Thanks,
Miles
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 (14.1k 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!
commented by (70.1k points)
Hi, sorry we let this question drop. Are you still trying to work on this because I do think it's something that might be possible in the Julia version. If so, please just reply here or post a question on our new forum which we just launched at: https://itensor.discourse.group
commented by (14.1k points)
edited
Also, perhaps an issue is that you should input a cutoff into contract, such as:

FPstate_maxSz = contract(Slowering, FPstate_maxSz; cutoff=1e-12)

though it shouldn't hang indefinitely if you don't set a cutoff, for example:

julia> s = siteinds("S=1/2", 100);

2