-
Notifications
You must be signed in to change notification settings - Fork 0
/
testexample.jl
64 lines (56 loc) · 2.18 KB
/
testexample.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
using SparseArrays
using LinearAlgebra
using Arpack
using Plots
using LatticeTools
using ExactDiagonalization
println("# S=1/2 Heisenberg Chain")
n_sites = 8;
(hs, σ) = ExactDiagonalization.Toolkit.spin_half_system(n_sites)
println("Quantum number sectors (2Sz) : ", quantum_number_sectors(hs))
S = Dict(μ => sum(σ(i, μ) for i in 1:n_sites) for μ in [:x, :y, :z])
spin_squared = simplify(S[:x]^2 + S[:y]^2 + S[:z]^2)
j1 = simplify(sum(σ(i, j) * σ(mod(i, n_sites)+1 , j) for i in 1:n_sites for j in [:x, :y, :z]))
hs_rep = represent(hs); # Use FrozenSortedArrayIndex{UInt} for basis lookup
println("## All sectors at once")
plt = plot(size=(400, 400))
begin
j1_rep = represent(hs_rep, j1)
eigenvalues, eigenvectors = eigs(j1_rep; nev=32, which=:SR, )
eigenvalues = real.(eigenvalues)
println("E : ", eigenvalues[1:5])
scatter!(plt,
zeros(size(eigenvalues)), eigenvalues,
markershape=:hline,
markersize=10,
markerstrokecolor=:red,
legend=:none)
end
println("## Sz=0, each momentum sectors")
hs_sector = HilbertSpaceSector(hs, 0)
hs_rep = represent_dict(hs_sector) # Use Dict{UInt, Int} for basis lookup
unitcell = make_unitcell(1.0; SiteType=String)
addsite!(unitcell, "Spin", FractCoord([0], [0.0]))
lattice = make_lattice(unitcell, 8)
tsymbed = translation_symmetry_embedding(lattice)
#translation_group = TranslationGroup([Permutation([ mod(i, n_sites)+1 for i in 1:n_sites])])
ks = symmetry(tsymbed).fractional_momenta
for tsic in get_irrep_components(tsymbed)
k = ks[tsic.irrep_index]
hs_redrep = symmetry_reduce(hs_rep, tsic)
j1_redrep = represent(hs_redrep, j1)
j1_redrep_dense = Matrix(j1_redrep) # Make a dense matrix
eigenvalues = eigvals(Hermitian(j1_redrep_dense))
println("E(k=", join(string.(k), ","), ") : ", eigenvalues[1:5])
scatter!(plt,
ones(size(eigenvalues)).*tsic.irrep_index, eigenvalues,
markershape=:hline,
markersize=10,
markerstrokecolor=:blue,
legend=:none)
end
xticks!(plt, collect(0:n_sites), ["All", string.(1:n_sites)...])
xlims!(plt, -1, n_sites+1)
xlabel!(plt, "Momentum index")
ylabel!(plt, "Energy")
savefig(plt, "spinchain.svg"); nothing