DQPT in the Ising model
In this tutorial we will try to reproduce the results from this paper. The needed packages are
using MPSKit, MPSKitModels, TensorKitPrecompiling packages...
14306.2 ms ✓ MPSKitModels
1 dependency successfully precompiled in 16 seconds. 74 already precompiled.Dynamical quantum phase transitions (DQPT in short) are signatures of equilibrium phase transitions in a dynamical quantity - the Loschmidt echo. This quantity is given by
In the mentioned paper they work with
and show that divergences occur when quenching across the critical point (g₀ → g₁) for
The outline of the tutorial is as follows. We will pick
First we construct the Hamiltonian in MPO form, and obtain the pre-quenched ground state:
L = 20
H₀ = transverse_field_ising(FiniteChain(L); g = -0.5)
ψ₀ = FiniteMPS(L, ℂ^2, ℂ^10)
ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG(; verbosity = 0));Finite MPS quenching
We can define a helper function that measures the loschmith echo
echo(ψ₀::FiniteMPS, ψₜ::FiniteMPS) = -2 * log(abs(dot(ψ₀, ψₜ))) / length(ψ₀)
@assert isapprox(echo(ψ₀, ψ₀), 0, atol = 1.0e-10)We will initially use a two-site TDVP scheme to dynamically increase the bond dimension while time evolving, and later on switch to a faster one-site scheme. A single timestep can be done using
H₁ = transverse_field_ising(FiniteChain(L); g = -2.0)
ψₜ = deepcopy(ψ₀)
dt = 0.01
ψₜ, envs = timestep(ψₜ, H₁, 0, dt, TDVP2(; trunc = truncrank(20)));"envs" is a kind of cache object that keeps track of all environments in ψ. It is often advantageous to re-use the environment, so that MPSKit doesn't need to recalculate everything.
Putting it all together, we get
function finite_sim(L; dt = 0.05, finaltime = 5.0)
ψ₀ = FiniteMPS(L, ℂ^2, ℂ^10)
H₀ = transverse_field_ising(FiniteChain(L); g = -0.5)
ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG(; verbosity = 0))
H₁ = transverse_field_ising(FiniteChain(L); g = -2.0)
ψₜ = deepcopy(ψ₀)
envs = environments(ψₜ, H₁, ψₜ)
echos = [echo(ψₜ, ψ₀)]
times = collect(0:dt:finaltime)
for t in times[2:end]
alg = t > 3 * dt ? TDVP() : TDVP2(; trunc = truncrank(50))
ψₜ, envs = timestep(ψₜ, H₁, 0, dt, alg, envs)
push!(echos, echo(ψₜ, ψ₀))
end
return times, echos
endfinite_sim (generic function with 1 method)
Infinite MPS quenching
Similarly we could start with an initial infinite state and find the pre-quench ground state:
ψ₀ = InfiniteMPS([ℂ^2], [ℂ^10])
H₀ = transverse_field_ising(; g = -0.5)
ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS(; verbosity = 0));The dot product of two infinite matrix product states scales as
dot(ψ₀, ψ₀)1.0000000000000047 + 1.040736567930811e-16imso the Loschmidt echo takes on the pleasant form
echo(ψ₀::InfiniteMPS, ψₜ::InfiniteMPS) = -2 * log(abs(dot(ψ₀, ψₜ)))
@assert isapprox(echo(ψ₀, ψ₀), 0, atol = 1.0e-10)We make use of the changebonds machinery to grow the bond dimension. This can also be achieved through a two-site scheme. Multiple algorithms are available, but we will only focus on OptimalExpand(). Growing the bond dimension by
ψₜ = deepcopy(ψ₀)
H₁ = transverse_field_ising(; g = -2.0)
ψₜ, envs = changebonds(ψₜ, H₁, OptimalExpand(; trunc = truncrank(5)));a single timestep is easy
dt = 0.01
ψₜ, envs = timestep(ψₜ, H₁, 0, dt, TDVP(), envs);With performance in mind we should once again try to re-use these "envs" cache objects. The final code is
function infinite_sim(dt = 0.05, finaltime = 5.0)
ψ₀ = InfiniteMPS([ℂ^2], [ℂ^10])
ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS(; verbosity = 0))
ψₜ = deepcopy(ψ₀)
envs = environments(ψₜ, H₁, ψₜ)
echos = [echo(ψₜ, ψ₀)]
times = collect(0:dt:finaltime)
for t in times[2:end]
if t < 50dt # if t is sufficiently small, we increase the bond dimension
ψₜ, envs = changebonds(ψₜ, H₁, OptimalExpand(; trunc = truncrank(1)), envs)
end
ψₜ, envs = timestep(ψₜ, H₁, 0, dt, TDVP(), envs)
push!(echos, echo(ψₜ, ψ₀))
end
return times, echos
endinfinite_sim (generic function with 3 methods)
This page was generated using Literate.jl.