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")
Example block output
Schwinger.evolveFunction

evolve(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.
source

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.
source