Hi ITensor community,
I am trying to study the real-time evolution of a system with periodic boundary conditions starting from a homogeneous state. For concreteness, let’s consider time evolution under a nearest-neighbour transverse-field Ising Hamiltonian starting form the state where all the spins are aligned along the nearest-neighbour interaction axis.
I read on the forum that, for simple models, the built-in OpSum
should be able to correctly construct the pbc Hamiltonian. I have also read that the suggested algorithm for real-time evolution is TDVP.
The problem that I am encountering is that the translational invariance of the initial state is lost during time evolution (this problem becomes particularly pronounced for large times, though its manifestation is evident right from the initial stages). This can be seen by looking at the magnetisation profile \langle \sigma^z_\ell\rangle.
I have compared the TDVP time evolution with TEBD time evolution and the latter preserves translational invariance quite well (with the same values of time step, bond dimension and cutoff). I suspect that there is a way to make TDVP also work, but I could not find it, so I am reaching out to inquire if someone knows a potential remedy for this issue.
Thank you!!
Here is the example code upon which I have based my claims:
using ITensors
using ITensorTDVP
# ==============================================================================
# TDVP FOR ISING
# ==============================================================================
function H_ising(sites, h=2)
N = length(sites)
os = OpSum()
for j in 1:(N - 1)
os += 1, "X", j, "X", j + 1
os += h, "Z", j
end
os += 1, "X", 1, "X", N
os += h, "Z", N
return MPO(os, sites)
end
N = 12
sites = siteinds("S=1/2", N)
ψ0 = productMPS(sites, n -> "X+")
H = H_ising(sites)
dt = 0.01
Nsteps = 100
χ = 50
tdvp_kwargs = (time_step=-1im*dt, normalize=false, maxdim=χ, cutoff=1.0e-10)
ψ_tdvp = tdvp(H, ψ0, -1im * dt * Nsteps; tdvp_kwargs)
@show magn_tdvp = expect(ψ_tdvp, "Sz");
# ==============================================================================
# COMPARISON WITH TEBD
# ==============================================================================
function TEBD_ising(psi, cutoff, bond_dim_max, tau, Nsteps, h=2)
siti = siteinds(psi)
LL = length(psi)
gates = ITensor[]
for j=1:LL-1
s0 = siti[j]
s1 = siti[j+1]
term1a = op("X",s0) * op("X",s1)
term2a = h * op("Z",s0) * op("Id",s1)
hj = term1a + term2a
Gj = exp(-1.0im * tau/2 * hj)
push!(gates,Gj)
end
term1a = op("X", siti[1]) * op("X", siti[end])
term2a = h * op("Id", siti[1]) * op("Z", siti[LL])
hj = term1a + term2a
Gj = exp(-1.0im * tau/2 * hj)
push!(gates,Gj)
append!(gates, reverse(gates));
for step in 1:Nsteps
psi = apply(gates, psi; cutoff=cutoff, maxdim = bond_dim_max)
end
psi
end
ψ_tebd = TEBD_ising(ψ0, 1E-10, χ, dt, Nsteps);
@show magn_tebd = expect(ψ_tebd, "Sz");