Time evolution
Schwinger.jl
supports time-evolving states. In the exact diagonalization framework, this is accomplished using Krylov methods from KrylovKit.jl
. With matrix product operators, this is accomplished using the time-dependent variational principle algorithm (TDVP), as implemented in ITensorMPS.jl
.
The evolve
function evolves a state forwards in time, and monitors any given observables. It returns a final state along with a DataFrame
of the observables. For example, here is a simulation of flux unwinding.
using Schwinger, Plots
lat = SchwingerLattice{10,1}(L = 2, periodic = true)
gs = groundstate(EDHamiltonian(lat))
_, df = evolve(EDWilsonLoop(lat) * gs, 15;
nsteps = 30,
observable = (ψ, t) -> sum(electricfields(ψ))/10
)
scatter(df.time, df.observable, xlabel = "gt", ylabel = "Average electric field", label = "Schwinger.jl")
plot!(0:.1:15, [cos(t/√(π)) for t in 0:.1:15], label = "Exact")
Schwinger.evolve
— Functionevolve(state::SchwingerEDState{N,F}, t::Real, observable::Function)
Evolve the state by a time t
, monitoring an observable.
Arguments
state::SchwingerEDState{N,F}
: The state to evolve.t::Real
: The time to evolve by.observable::Function
: The observable(ψ, t) -> obs
to monitor.
evolve(state::SchwingerMPS{N,F}, t::Real)
Evolve the state by a time t
.
Arguments
state::SchwingerMPS{N,F}
: The state to evolve.t::Real
: The time to evolve by.