Hi everyone!
I’d like to ask a question about Julia 1.11. This version only supports spin-1 and spin-1/2 calculations and doesn’t work for antiferromagnetic one-dimensional chains with large spins.
I’ve tried the custom definition method shown below, but I still can’t run the ground state calculation correctly using DMRG. Does anyone know what might be causing this issue?
Any suggestions would be greatly appreciated!
using ITensors, ITensorMPS, Statistics, Serialization
import ITensors: siteinds, siteind, op function siteind(::SiteType"Spin3Half", n::Int; kwargs...)
return Index(4; tags="Site,Spin3Half,n=$n", kwargs...)
end
function siteinds(::Val{:Spin3Half}, N::Int; kwargs...)
return [siteind(SiteType("Spin3Half"), i; kwargs...) for i in 1:N]
end
function op(::OpName"Sz", ::SiteType"Spin3Half", s::Index)
sz = ITensor(prime(s), s)
sz[prime(s)[1], s[1]] = 3/2
sz[prime(s)[2], s[2]] = 1/2
sz[prime(s)[3], s[3]] = -1/2
sz[prime(s)[4], s[4]] = -3/2
return sz
end
function op(::OpName"S+", ::SiteType"Spin3Half", s::Index)
S = 3/2
sp = ITensor(prime(s), s)
sp[prime(s)[2], s[1]] = sqrt(S*(S+1) - (1/2)*(3/2)) # √3(|1/2⟩→|3/2⟩)
sp[prime(s)[3], s[2]] = sqrt(S*(S+1) - (-1/2)*(1/2)) # 2.0(|-1/2⟩→|1/2⟩)
sp[prime(s)[4], s[3]] = sqrt(S*(S+1) - (-3/2)*(-1/2))# √3(|-3/2⟩→|-1/2⟩)
return sp
end
function op(::OpName"S-", ::SiteType"Spin3Half", s::Index)
return dag(op(OpName("S+"), SiteType("Spin3Half"), s))
end
function op(::OpName"Sx", ::SiteType"Spin3Half", s::Index)
sp = op(OpName("S+"), SiteType("Spin3Half"), s)
sm = op(OpName("S-"), SiteType("Spin3Half"), s)
return (sp + sm) / 2
end
function op(::OpName"Sy", ::SiteType"Spin3Half", s::Index)
sp = op(OpName("S+"), SiteType("Spin3Half"), s)
sm = op(OpName("S-"), SiteType("Spin3Half"), s)
return (sp - sm) / (2im)
end
let
N = 72
J = 1.0
mps_filename = "spin3half_groundstate.mps"
sites = siteinds("Spin3Half", N)
os = OpSum()
for j in 1:N
j_next = j < N ? j+1 : 1
γ = j % 3 == 1 ? "Sx" : (j % 3 == 2 ? "Sz" : "Sy")
os += J, "Sx", j, "Sx", j_next
os += J, "Sy", j, "Sy", j_next
os += J, "Sz", j, "Sz", j_next
end
H = MPO(os, sites)