The Ising CFT spectrum

This tutorial is meant to show the finite size CFT spectrum for the quantum Ising model. We do this by first employing an exact diagonalization technique, and then extending the analysis to larger system sizes through the use of MPS techniques.

using MPSKit, MPSKitModels, TensorKit, Plots, KrylovKit
using LinearAlgebra: eigen, diagm, Hermitian
import TensorOperations; TensorOperations.disable_cache(); # hide

The hamiltonian is defined on a finite lattice with periodic boundary conditions, which can be implemented as follows:

L = 12
H = periodic_boundary_conditions(transverse_field_ising(), L);
┌ Warning: failed to deduce all domspaces
└ @ MPSKit ~/projects/MPSKit.jl/src/operators/sparsempo/sparsempo.jl:144

Exact diagonalisation

In MPSKit, there is support for exact diagonalisation by leveraging the fact that applying the hamiltonian to an untruncated MPS will result in an effective hamiltonian on the center site which implements the action of the entire hamiltonian. Thus, optimizing the middle tensor is equivalent to optimixing a state in the entire Hilbert space, as all other tensors are just unitary matrices that mix the basis.

energies, states = exact_diagonalization(H, num=18, alg=Lanczos(krylovdim=200));
plot(real.(energies), seriestype=:scatter, legend=false, ylabel="energy", xlabel="#eigenvalue")
Krylov dimension

Note that we have specified a large Krylov dimension as degenerate eigenvalues are notoriously difficult for iterative methods.

Extracting momentum

Given a state, it is possible to assign a momentum label through the use of the translation operator. This operator can be defined in MPO language either diagramatically as

translation operator MPO

or in the code as:

id = complex(isomorphism(ℂ^2, ℂ^2))
@tensor O[-1 -2; -3 -4] := id[-1, -3] * id[-2, -4]
T = periodic_boundary_conditions(DenseMPO(O), L);

We can then calculate the momentum of the groundstate as the expectation value of this operator. However, there is a subtlety because of the degeneracies in the energy eigenvalues. The eigensolver will find an orthonormal basis within each energy subspace, but this basis is not necessarily a basis of eigenstates of the translation operator. In order to fix this, we diagonalize the translation operator within each energy subspace.

momentum(ψᵢ, ψⱼ=ψᵢ) = angle(dot(ψᵢ, T * ψⱼ))

function fix_degeneracies(basis)
    N = zeros(ComplexF64, length(basis), length(basis))
    M = zeros(ComplexF64, length(basis), length(basis))
    for i in eachindex(basis), j in eachindex(basis)
        N[i, j] = dot(basis[i], basis[j])
        M[i, j] = momentum(basis[i], basis[j])
    end

    vals, vecs = eigen(Hermitian(N))
    M = (vecs' * M * vecs)
    M /= diagm(vals)

    vals, vecs = eigen(M)
    return angle.(vals)
end

momenta = Float64[]
append!(momenta, fix_degeneracies(states[1:1]))
append!(momenta, fix_degeneracies(states[2:2]))
append!(momenta, fix_degeneracies(states[3:3]))
append!(momenta, fix_degeneracies(states[4:5]))
append!(momenta, fix_degeneracies(states[6:9]))
append!(momenta, fix_degeneracies(states[10:11]))
append!(momenta, fix_degeneracies(states[12:12]))
append!(momenta, fix_degeneracies(states[13:16]))
append!(momenta, fix_degeneracies(states[17:18]))

plot(momenta, real.(energies[1:18]), seriestype=:scatter, xlabel="momentum", ylabel="energy", legend=false)

Finite bond dimension

If we limit the maximum bond dimension of the MPS, we get an approximate solution, but we can reach higher system sizes.

L_mps = 20
H_mps = periodic_boundary_conditions(transverse_field_ising(), L_mps)
D = 64
ψ, envs, δ = find_groundstate(FiniteMPS(L_mps, ℂ^2, ℂ^D), H_mps, DMRG());
┌ Warning: failed to deduce all domspaces
└ @ MPSKit ~/projects/MPSKit.jl/src/operators/sparsempo/sparsempo.jl:144
[ Info: Iteraton 0 error 0.027472963540396158
[ Info: Iteraton 1 error 4.2499990746454e-6
[ Info: Iteraton 2 error 4.518939647996781e-7
[ Info: Iteraton 3 error 1.4266935739038215e-7
[ Info: Iteraton 4 error 5.812790872635475e-8
[ Info: Iteraton 5 error 3.393604922259721e-8
[ Info: Iteraton 6 error 3.508323755418118e-8
[ Info: Iteraton 7 error 4.318268478143819e-8
[ Info: Iteraton 8 error 5.122181044220508e-8
[ Info: Iteraton 9 error 5.7292768222888516e-8
[ Info: Iteraton 10 error 5.928908338653149e-8
[ Info: Iteraton 11 error 5.792982675326755e-8
[ Info: Iteraton 12 error 5.251579077114723e-8
[ Info: Iteraton 13 error 4.416508660099376e-8
[ Info: Iteraton 14 error 3.5163073134686605e-8
[ Info: Iteraton 15 error 2.7034964301287772e-8
[ Info: Iteraton 16 error 2.0374010758048726e-8
[ Info: Iteraton 17 error 1.519740629741549e-8
[ Info: Iteraton 18 error 1.1287063199184159e-8
[ Info: Iteraton 19 error 8.376252613910147e-9
[ Info: Iteraton 20 error 6.224642265905982e-9
[ Info: Iteraton 21 error 4.638535397803285e-9
[ Info: Iteraton 22 error 3.4695667576124297e-9
[ Info: Iteraton 23 error 2.6069109293991193e-9
[ Info: Iteraton 24 error 1.968826919112749e-9
[ Info: Iteraton 25 error 1.4954022020985557e-9
[ Info: Iteraton 26 error 1.1428476693160124e-9
[ Info: Iteraton 27 error 1.0052245724187655e-9
[ Info: Iteraton 28 error 9.376197681400316e-10
[ Info: Iteraton 29 error 9.003965381666546e-10
[ Info: Iteraton 30 error 8.650372631298306e-10
[ Info: Iteraton 31 error 8.313368894489376e-10
[ Info: Iteraton 32 error 7.991329391813984e-10
[ Info: Iteraton 33 error 7.682945984183869e-10
[ Info: Iteraton 34 error 7.387158863750439e-10
[ Info: Iteraton 35 error 7.103089634350254e-10
[ Info: Iteraton 36 error 6.830003660323164e-10
[ Info: Iteraton 37 error 6.567287610228936e-10
[ Info: Iteraton 38 error 6.314408402864286e-10
[ Info: Iteraton 39 error 6.070906925446064e-10
[ Info: Iteraton 40 error 5.836368638194547e-10
[ Info: Iteraton 41 error 5.610437872178115e-10
[ Info: Iteraton 42 error 5.392778707896691e-10
[ Info: Iteraton 43 error 5.183085880417549e-10
[ Info: Iteraton 44 error 4.981076105179631e-10
[ Info: Iteraton 45 error 4.786482617538885e-10
[ Info: Iteraton 46 error 4.599055883703678e-10
[ Info: Iteraton 47 error 4.4185513735999085e-10
[ Info: Iteraton 48 error 4.2447407351739853e-10
[ Info: Iteraton 49 error 4.077401096296135e-10
[ Info: Iteraton 50 error 3.916323472504938e-10
[ Info: Iteraton 51 error 3.761297884077773e-10
[ Info: Iteraton 52 error 3.6121161753673396e-10
[ Info: Iteraton 53 error 3.468589452053742e-10
[ Info: Iteraton 54 error 3.3305227173275425e-10
[ Info: Iteraton 55 error 3.19773130530276e-10
[ Info: Iteraton 56 error 3.070033607630675e-10
[ Info: Iteraton 57 error 2.947253091408608e-10
[ Info: Iteraton 58 error 2.8292172410658897e-10
[ Info: Iteraton 59 error 2.7157598582416426e-10
[ Info: Iteraton 60 error 2.606717652380316e-10
[ Info: Iteraton 61 error 2.501931617475884e-10
[ Info: Iteraton 62 error 2.4012486547992006e-10
[ Info: Iteraton 63 error 2.3045207610776269e-10
[ Info: Iteraton 64 error 2.211598777917664e-10
[ Info: Iteraton 65 error 2.1223451912252295e-10
[ Info: Iteraton 66 error 2.0366226455767463e-10
[ Info: Iteraton 67 error 1.954297993331267e-10
[ Info: Iteraton 68 error 1.8751583829053747e-10
[ Info: Iteraton 69 error 1.799269788069608e-10
[ Info: Iteraton 70 error 1.7265239198205696e-10
[ Info: Iteraton 71 error 1.6564181622836898e-10
[ Info: Iteraton 72 error 1.589254251897116e-10
[ Info: Iteraton 73 error 1.524783138584775e-10
[ Info: Iteraton 74 error 1.4628994000080126e-10
[ Info: Iteraton 75 error 1.403492079612858e-10
[ Info: Iteraton 76 error 1.3465123802125433e-10
[ Info: Iteraton 77 error 1.291785793126184e-10
[ Info: Iteraton 78 error 1.2393031576018561e-10
[ Info: Iteraton 79 error 1.1888714150257146e-10
[ Info: Iteraton 80 error 1.1405039813461729e-10
[ Info: Iteraton 81 error 1.0941463810293189e-10
[ Info: Iteraton 82 error 1.049470772122233e-10
[ Info: Iteraton 83 error 1.0068944120957693e-10
[ Info: Iteraton 84 error 9.658084685949789e-11
[ Info: Iteraton 85 error 9.26521585213163e-11
[ Info: Iteraton 86 error 8.8873533822986e-11
[ Info: Iteraton 87 error 8.525987592024026e-11
[ Info: Iteraton 88 error 8.176699668961743e-11
[ Info: Iteraton 89 error 7.844822242784917e-11
[ Info: Iteraton 90 error 7.525441570658119e-11
[ Info: Iteraton 91 error 7.218366702838636e-11
[ Info: Iteraton 92 error 6.924429519135056e-11
[ Info: Iteraton 93 error 6.642445185586198e-11
[ Info: Iteraton 94 error 6.371187040000673e-11
[ Info: Iteraton 95 error 6.111235923883613e-11
[ Info: Iteraton 96 error 5.862208360865648e-11
[ Info: Iteraton 97 error 5.622925679053845e-11
[ Info: Iteraton 98 error 5.393398098587054e-11
[ Info: Iteraton 99 error 5.173779373536982e-11

Excitations on top of the groundstate can be found through the use of the quasiparticle ansatz. This returns quasiparticle states, which can be converted to regular FiniteMPS objects.

E_ex, qps = excitations(H, QuasiparticleAnsatz(), ψ, envs, num=16)
states_mps = vcat(ψ, map(qp -> convert(FiniteMPS, qp), qps))
E_mps = map(x -> sum(expectation_value(x, H_mps)), states_mps)

T_mps = periodic_boundary_conditions(DenseMPO(O), L_mps)
momenta_mps = Float64[]
append!(momenta_mps, fix_degeneracies(states[1:1]))
append!(momenta_mps, fix_degeneracies(states[2:2]))
append!(momenta_mps, fix_degeneracies(states[3:3]))
append!(momenta_mps, fix_degeneracies(states[4:5]))
append!(momenta_mps, fix_degeneracies(states[6:9]))
append!(momenta_mps, fix_degeneracies(states[10:11]))
append!(momenta_mps, fix_degeneracies(states[12:12]))
append!(momenta_mps, fix_degeneracies(states[13:16]))

plot(momenta_mps, real.(energies[1:16]), seriestype=:scatter, xlabel="momentum", ylabel="energy", legend=false)

This page was generated using Literate.jl.