The haldane gap
In this tutorial we will calculate the haldane gap (the energy gap in spin 1 heisenberg) in 2 different ways. To follow the tutorial you need the following packages.
using MPSKit,TensorKit
We will enforce the su(2) symmetry, our hamiltonian will therefore be
ham = su2_xxx_ham(spin=1);
Finite size extrapolation
The first step is always the same, we want to find the groundstate of our system.
len = 10;
physical_space = ℂ[SU₂](1=>1);
virtual_space = ℂ[SU₂](0=>20,1=>20,2=>10,3=>10,4=>5);
initial_state = FiniteMPS(rand,ComplexF64,len,physical_space,virtual_space);
(gs,pars,delta) = find_groundstate(initial_state,ham,Dmrg());
The typical way to find excited states is to minmize the energy while adding an error term $lambda | gs > < gs |$. Here we will instead use the quasiparticle ansatz.
In steven white's original DMRG paper it was remarked that the S=1 excitations correspond to edge states, and that one should define the haldane gap as the difference in energy between the S=2 and S=1 states. This can be done as follows.
(En_1,_) = quasiparticle_excitation(ham,gs,pars,excitation_space = ℂ[SU₂](1=>1))
(En_2,_) = quasiparticle_excitation(ham,gs,pars,excitation_space = ℂ[SU₂](2=>1))
En_2[1]-En_1[1]
We can now extrapolate this value for different len, and approximately find the haldane gap.
Thermodynamic limit
A much nicer way of obtaining the haldane gap is by working directly in the thermodynamic limit.
initial_state = InfiniteMPS([physical_space],[virtual_space]);
(gs,pars,delta) = find_groundstate(initial_state,ham,Vumps());
The haldane gap in the thermodynamic limit is the energy of the S=1 excitation at momentum pi.
(Energies,_) = quasiparticle_excitation(ham,Float64(pi),gs,pars,excitation_space=ℂ[SU₂](1=>1))
Energies[1]
Which prints out 0.4104791728966182, in agreement with known results.