Hey,
I have a question about the central charge one can extract from the entanglement entropy of some critical model. From my understanding, and from the paper by Calabrese and Cardy
( Pasquale Calabrese and John Cardy 2009 J. Phys. A: Math. Theor. 42 504005) the entanglement entropy of a CFT on a finite slab of length l with open boundary conditions has the following asymptotic behavior
taken from equation (39) from the mentioned paper. In this equation, c is the central charge, L is the
length of the system, a is some short range cutoff and \tilde{c}^\prime is some uninteresting constant.
One of the most simplest CFT is given by a spinless free fermion:
which should have a central charge of c = 1. The above Hamiltonian is defined on a lattice with the convention:
i.e. all lengths are measured in units of the short distance cutoff a which is simply the lattice constant in that model.
The central charge can also be obtained by going to the bosonized version of this model, where it is simply given by a free compactified boson:
with K = 1 for the non-interacting spinless fermion.
The next non-trivial extension would be to consider two or more flavors of free Fermions, all described by some free Hamiltonian:
which should simply have a central charge of c_{n_f} = n_fc = n_f.
Since this is one of the most natural quantities to calculate in DMRG, I tested the spinless Fermion and the two flavor Fermion using ITensor. The code I used is given by:
sing ITensors, Plots
function chrd_dist(j,L)
return 2*L/Ď€ * sin(Ď€/L * j)
end
function entropy(psi)
psic = copy(psi)
N = length(psi)
ent = Vector{Float64}(undef, N-1)
for jj in 1:N-1
orthogonalize!(psic, jj)
U, S, V,spec = svd(psic[jj], (linkind(psic, jj - 1), siteind(psic, jj)))
ent[jj] = mapreduce(+, 1:dim(S,1), init = 0) do n
p = S[n,n]^2
return -p*log(p)
end
end
return ent, map(b -> chrd_dist(b, N), 1:N-1)
end
This I tested using the following model:
N = 200
sites = siteinds("Fermion", N)
ampo = OpSum()
t = 1
ÎĽ = 0.0
V = 0.0
for j=1:N-1
ampo += -t,"Cdag", j, "C", j+1
ampo += -t,"Cdag", j+1, "C", j
ampo += V/4,"N + N - Id",j,"N + N - Id",j+1
end
for j=1:N
ampo += -ÎĽ,"N",j
end
H = MPO(ampo, sites)
psi0 = randomMPS(sites, 10)
bnd = [10,10,20,20,50,50,100,100,200,200,200,200,200,200,250,250,250]
nsweeps = length(bnd)
noise = vcat(repeat([0.1], nsweeps - 2), [0,0,0])
sweeps = Sweeps(nsweeps)
setmaxdim!(sweeps, bnd...)
setnoise!(sweeps, noise...)
setcutoff!(sweeps, 1E-10)
energy, psiof = dmrg(H,psi0, sweeps)
entf, chrdf = entropy(psiof)
pl = plot(log.(chrdf), log.(entf), label = false, seriestype = :scatter)
alg = (x, δ,β) -> δ * x + β
c = 1
plot!(pl, x -> alg(x, c/6, -0.6),log.(chrdf), label = "c = $c", legend = :topleft)
xlabel!(pl, "d(l)")
ylabel!(pl, "S(l)")
title!("One free Fermion")
savefig("scaling_one_flavor.png")
display(pl)
which shows the correct expected behavior of a c=1 scaling, see left picture.
This behavior also shows by varying the interaction away from V = 0 as expected in the Luttinger Liquid regime.
However, doing the same calculation for a two flavor Fermion system shows some strange result.
Using the following code:
N = 100
t = 1.0
sites = siteinds("Electron", N)
ampo = OpSum()
for b in 1:(N - 1)
ampo += -t, "Cdagup", b, "Cup", b + 1
ampo += -t, "Cdagup", b + 1, "Cup", b
ampo += -t, "Cdagdn", b, "Cdn", b + 1
ampo += -t, "Cdagdn", b + 1, "Cdn", b
end
H = MPO(ampo, sites)
psi0 = randomMPS(sites, 10)
bnd = [10,10,20,20,50,50,100,100,200,200,400,400]
nsweeps = length(bnd)
noise = vcat(repeat([0.1], nsweeps - 2), [0,0,0])
sweeps = Sweeps(nsweeps)
setmaxdim!(sweeps, bnd...)
setnoise!(sweeps, noise...)
setcutoff!(sweeps, 1E-10)
# Start DMRG calculation:
energy, psi2f = dmrg(H, psi0, sweeps)
entf, chrdf = entropy(psi2f)
pl = plot(log.(chrdf), log.(entf), label = false, seriestype = :scatter)
alg = (x, δ,β) -> δ * x + β
c = 2
plot!(pl, x -> alg(x, c/6, -0.2),log.(chrdf), label = "c = $c", legend = :topleft)
c = 1
plot!(pl, x -> alg(x, c/6, -0.0),log.(chrdf), label = "c = $c", legend = :topleft)
xlabel!(pl, "d(l)")
ylabel!(pl, "S(l)")
title!("Two free Fermion")
savefig("scaling_two_flavor.png")
display(pl)
shows that in that case the scaling is also given by an c=1 instead of the expected c=2 CFT, see right piture.
Is there something wrong or do I miss some fundamental stuff here?
Thanks for all replies in advance!
EDIT:
Sorry the labels of the axis are wrong, it should be \log(d(l)) on the x-axis, where d(l) = \frac{2L}{\pi a} \sin \frac{\pi l}{L} .