The SU(3) Heisenberg chain
The spin-1 Heisenberg chain famously has a gapped, symmetry-protected topological ground state: the Haldane phase. A natural question is what happens when the
where the
Working with the full non-abelian SU3Irrep sectors plug directly into TensorKit's graded vector spaces.
First-run cost
SUNRepresentations.jl computes Scratch.jl). The first time a given coefficient is needed the computation can be slow; later runs reuse the on-disk cache. On a machine without a persisted scratch cache — such as a fresh continuous-integration runner — this example therefore pays the full coefficient-generation cost once.
using TensorKit
using SUNRepresentations
using MPSKit
using PlotsFor reproducibility of this page, we fix the seed of the random number generator:
using Random
Random.seed!(4321);The model
Each site carries the
I300 = SU3Irrep(3, 0, 0)
Vphys = Vect[SU3Irrep](I300 => 1)
@show dim(I300)10To build the interaction we use the same Casimir trick as for the
SUNRepresentations.jl provides the quadratic Casimir through casimir(2, irrep). Its normalization is the standard one with
@show casimir(2, SU3Irrep(1, 0, 0))
@show casimir(2, I300)6//1The nearest-neighbour term is then a single TensorKit operator that acts as a scalar on each fusion channel of casimir(2, ⋅) supplying the eigenvalues.
function su3_heisenberg(Vphys; J = 1.0)
site = SU3Irrep(3, 0, 0)
c2_site = casimir(2, site)
SS = zeros(ComplexF64, Vphys ⊗ Vphys ← Vphys ⊗ Vphys)
for (c, data) in blocks(SS)
coupling = (casimir(2, c) - 2 * c2_site) / 2
for i in axes(data, 1)
data[i, i] = J * coupling
end
end
return InfiniteMPOHamiltonian(SS)
end
H = su3_heisenberg(Vphys)1-site InfiniteMPOHamiltonian(ComplexF64, Rep[SU₃]) with maximal dimension 10:
| ⋮
| (((0, 0, 0)=>1) ⊞ ((2, 1, 0)=>1) ⊞ ((0, 0, 0)=>1))
┼─[1]─ ((3, 0, 0) => 1)
│ (((0, 0, 0)=>1) ⊞ ((2, 1, 0)=>1) ⊞ ((0, 0, 0)=>1))
| ⋮We can read off the physics directly from the fusion channels. The product
for (c, n) in directproduct(I300, I300)
coupling = (casimir(2, c) - 2 * casimir(2, I300)) / 2
println(rpad(string(c), 22), " dim = ", rpad(dim(c), 4), " coupling = ", coupling)
endIrrep[SU₃]((6, 0, 0)) dim = 28 coupling = 3//1
Irrep[SU₃]((5, 1, 0)) dim = 35 coupling = 0//1
Irrep[SU₃]((4, 2, 0)) dim = 27 coupling = -2//1
Irrep[SU₃]((3, 3, 0)) dim = 10 coupling = -3//1Ground state
The
Vvirt = Vect[SU3Irrep](
SU3Irrep(0, 0, 0) => 8,
SU3Irrep(2, 1, 0) => 6,
SU3Irrep(3, 0, 0) => 3,
SU3Irrep(3, 3, 0) => 3,
SU3Irrep(4, 2, 0) => 2,
)
@show dim(Vvirt)
ψ₀ = InfiniteMPS([Vphys], [Vvirt])
ψ, envs, δ = find_groundstate(ψ₀, H, VUMPS(; maxiter = 200, tol = 1.0e-10, verbosity = 1))
E₀ = real(expectation_value(ψ, H))
println("ground-state energy per site: E₀ = $E₀")dim(Vvirt) = 170
┌ Warning: Constructing an MPS from tensors that are not full rank
└ @ MPSKit ~/Projects/MPSKit.jl/docs/src/states/infinitemps.jl:180
ground-state energy per site: E₀ = -2.573505652431292The excitation spectrum
On top of the ground state we compute excitations with the quasiparticle ansatz. In the thermodynamic limit each excitation carries a definite momentum
sector = SU3Irrep(2, 1, 0)
kspace = range(0, π, 10)
Es, _ = excitations(H, QuasiparticleAnsatz(), kspace, ψ, envs; sector)
Δ, idx = findmin(real.(Es))
println("branch minimum ΔE/J = $Δ at k = $(kspace[idx])")branch minimum ΔE/J = -0.041856660250392086 at k = 2.0943951023931953plot(
kspace, real.(Es);
xaxis = "momentum k", yaxis = "ΔE / J", label = "[2 1 0] branch",
title = "SU(3) [3 0 0] excitation dispersion"
)
hline!([0.0]; color = :gray, linestyle = :dash, label = "")
vline!([2π / 3]; color = :gray, linestyle = :dot, label = "k = 2π/3")
The branch has a pronounced soft mode at
The soft-mode location is reproduced cleanly, but the gap value is not, and it is worth being precise about why. The quasiparticle energies plotted above are a genuine variational upper bound on the excitation energies only when they are measured relative to the exact ground state. Here the ground state is a deliberately lightweight, modest-bond-dimension uniform
This page was generated using Literate.jl.