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) -> obsto 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.