ITensor team,
I’m curious about the necessity of Jordan Wigner strings, or a custom operator containing them, for the “connected” correlation function of a fermionic system, i.e. (AB) - (A)(B) where A and B are local operators and () denotes expectation value with respect to the ground state. I know that the correlation_matrix
function can handle the calculation of (AB) correctly, but I’m curious wether using the expect
function for the other two terms in the above expression with built in local operators could be leading to incorrect results.
Specifically, I’m trying to compute the correlation functions inside the square brackets in (2) and (4) in this paper: https://arxiv.org/pdf/1503.08188 and then track how they decay over distance, fixing the first site and then tracking the correlations over the lattice. Basic physics of the Extended Fermi-Hubbard Model say that with a Hamiltonian that indicates say, a Spin-Density Wave ordered ground state, the corresponding correlation function (equation (2) in the paper) should show power law decay over the lattice. The method above returns an exponential decay. Here’s a code that can reproduce the error:
using ITensors, ITensorMPS, Plots
let
N = 100
t1 = 1.0
U = 8.0
V = -1.0
sites = siteinds("Electron", N; conserve_qns=true)
os = OpSum()
for b in 1:(N - 1)
os -= t1, "Cdagup", b, "Cup", b + 1
os -= t1, "Cdagup", b + 1, "Cup", b
os -= t1, "Cdagdn", b, "Cdn", b + 1
os -= t1, "Cdagdn", b + 1, "Cdn", b
os += V, "Ntot", b, "Ntot", b + 1
end
os += V, "Ntot", N, "Ntot", 1
os -= t1, "Cdagup", N, "Cup", 1
os -= t1, "Cdagup", 1, "Cup", N
os -= t1, "Cdagdn", N, "Cdn", 1
os -= t1, "Cdagdn", 1, "Cdn", N
for i in 1:N
os += U, "Nupdn", i
end
H = MPO(os, sites)
nsweeps = 5
maxdim = [50, 100, 200, 400]
cutoff = [1E-8]
state = [isodd(n) ? "Up" : "Dn" for n in 1:N]
psi0 = randomMPS(sites, state; linkdims=10)
energy, psi = dmrg(H, psi0; nsweeps, maxdim, cutoff)
corr_mat_sdw = correlation_matrix(psi, "Sz", "Sz")
sdw_decay = []
Sz1 = expect(psi, "Sz"; sites = 1)
for i in 1:N
value = corr_mat_sdw[1, i] - Sz1 * expect(psi, "Sz"; sites = i)
if value != 0
push!(sdw_decay, abs(value))
end
end
scatter!(1:length(sdw_decay), sdw_decay, xscale = :log10, yscale = :log10)
end
where a log-log plot is used to show exponential decay more clearly.