TDVP for a Hamiltonian with complex parameters

Hi,

I am trying to perform the real-time evolution of a Hamiltonian of the form H = i [H1, H2] where H1,H2 are real Hermitian operators, i is the imaginary unit, and the square brackets are the commutator. H is Hermitian but has explicit imaginary units around. I compute H via

H = contract(prime(H1),H2) - contract(prime(H2),H1)
H = 1im * replaceprime(temp, 2 => 1)

Unfortunately, upon feeding the TDVP function I get the following error message:

ERROR: LoadError: InexactError: Float64(-0.24083556717441038 + 8.817865484998814e-13im)
Stacktrace:
[1] Real
@ ./complex.jl:44 [inlined]
[2] convert
@ ./number.jl:7 [inlined]
[3] setindex!(::Matrix{Float64}, ::ComplexF64, ::Int64, ::Int64)
@ Base ./array.jl:971
[4] applyexp(H::ProjMPO, tau::Float64, x0::ITensor; kwargs::Base.Pairs{Symbol, Real, NTuple{4, Symbol}, NamedTuple{(:tol, :maxiter, :outputlevel, :current_time), Tuple{Float64, Int64, Int64, Float64}}})
@ ITensorTDVP ~/.julia/packages/ITensorTDVP/c3OYY/src/applyexp.jl:54
[5] applyexp
@ ~/.julia/packages/ITensorTDVP/c3OYY/src/applyexp.jl:24 [inlined]
[6] (::ITensorTDVP.var"#solver#38"{ITensorTDVP.var"#solver#37#39"{Base.Pairs{Symbol, Real, NTuple{7, Symbol}, NamedTuple{(:time_step, :nsweeps, :reverse_step, :normalize, :maxdim, :cutoff, :outputlevel), Tuple{Float64, Int64, Bool, Bool, Int64, Float64, Int64}}}}})(H::ProjMPO, t::Float64, psi0::ITensor; kws::Base.Pairs{Symbol, Real, Tuple{Symbol, Symbol}, NamedTuple{(:current_time, :outputlevel), Tuple{Float64, Int64}}})
@ ITensorTDVP ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp.jl:27
[7] solver
@ ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp.jl:19 [inlined]
[8] tdvp_site_update!(nsite_val::Val{2}, reverse_step_val::Val{false}, solver::ITensorTDVP.var"#solver#38"{ITensorTDVP.var"#solver#37#39"{Base.Pairs{Symbol, Real, NTuple{7, Symbol}, NamedTuple{(:time_step, :nsweeps, :reverse_step, :normalize, :maxdim, :cutoff, :outputlevel), Tuple{Float64, Int64, Bool, Bool, Int64, Float64, Int64}}}}}, PH::ProjMPO, psi::MPS, b::Int64; current_time::Float64, outputlevel::Int64, time_step::Float64, normalize::Bool, direction::Base.Order.ForwardOrdering, noise::Float64, which_decomp::Nothing, svd_alg::String, cutoff::Float64, maxdim::Int64, mindim::Int64, maxtruncerr::Float64)
@ ITensorTDVP ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp_step.jl:304
[9] tdvp_site_update!(solver::ITensorTDVP.var"#solver#38"{ITensorTDVP.var"#solver#37#39"{Base.Pairs{Symbol, Real, NTuple{7, Symbol}, NamedTuple{(:time_step, :nsweeps, :reverse_step, :normalize, :maxdim, :cutoff, :outputlevel), Tuple{Float64, Int64, Bool, Bool, Int64, Float64, Int64}}}}}, PH::ProjMPO, psi::MPS, b::Int64; nsite::Int64, reverse_step::Bool, current_time::Float64, outputlevel::Int64, time_step::Float64, normalize::Bool, direction::Base.Order.ForwardOrdering, noise::Float64, which_decomp::Nothing, svd_alg::String, cutoff::Float64, maxdim::Int64, mindim::Int64, maxtruncerr::Float64)
@ ITensorTDVP ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp_step.jl:157
[10] tdvp_sweep(direction::Base.Order.ForwardOrdering, solver::Function, PH::ProjMPO, time_step::Float64, psi::MPS; kwargs::Base.Pairs{Symbol, Real, NTuple{11, Symbol}, NamedTuple{(:current_time, :time_step, :nsweeps, :reverse_step, :normalize, :maxdim, :cutoff, :outputlevel, :sweep, :mindim, :noise), Tuple{Float64, Float64, Int64, Bool, Bool, Int64, Float64, Int64, Int64, Int64, Float64}}})
@ ITensorTDVP ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp_step.jl:80
[11] tdvp_step(order::ITensorTDVP.TDVPOrder{2, Base.Order.ForwardOrdering()}, solver::Function, PH::ProjMPO, time_step::Float64, psi::MPS; current_time::Float64, kwargs::Base.Pairs{Symbol, Real, NTuple{10, Symbol}, NamedTuple{(:time_step, :nsweeps, :reverse_step, :normalize, :maxdim, :cutoff, :outputlevel, :sweep, :mindim, :noise), Tuple{Float64, Int64, Bool, Bool, Int64, Float64, Int64, Int64, Int64, Float64}}})
@ ITensorTDVP ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp_step.jl:9
[12] macro expansion
@ ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp_generic.jl:84 [inlined]
[13] macro expansion
@ ./timing.jl:393 [inlined]
[14] tdvp(solver::Function, PH::ProjMPO, t::Float64, psi0::MPS; kwargs::Base.Pairs{Symbol, Real, NTuple{7, Symbol}, NamedTuple{(:time_step, :nsweeps, :reverse_step, :normalize, :maxdim, :cutoff, :outputlevel), Tuple{Float64, Int64, Bool, Bool, Int64, Float64, Int64}}})
@ ITensorTDVP ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp_generic.jl:83
[15] tdvp
@ ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp_generic.jl:45 [inlined]
[16] tdvp(solver::Function, H::MPO, t::Float64, psi0::MPS; kwargs::Base.Pairs{Symbol, Real, NTuple{7, Symbol}, NamedTuple{(:time_step, :nsweeps, :reverse_step, :normalize, :maxdim, :cutoff, :outputlevel), Tuple{Float64, Int64, Bool, Bool, Int64, Float64, Int64}}})
@ ITensorTDVP ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp_generic.jl:150
[17] tdvp
@ ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp_generic.jl:143 [inlined]
[18] #tdvp#41
@ ~/.julia/packages/ITensorTDVP/c3OYY/src/tdvp.jl:47 [inlined]
[19] top-level scope

Is there a way around?

Thanks,
Federico

I think that is likely a bug in the default solver backend for that package. Could you please try passing the keyword argument

solver_backend=“exponentiate”

to TDVP to see if that fixes the issue?

It solved the issue! Thank you very much!

Federico

Great!