HaeffnerLab / IonSim.jl

a simple tool for simulating trapped ion systems
https://ionsim.org
MIT License
70 stars 17 forks source link

QuantumOpticsBase.IncompatibleBases() error upon executing timeevolution.master_dynamic() #90

Closed justin-phillips closed 2 years ago

justin-phillips commented 2 years ago

I would like to apologize in advance if my formatting is not convenient here - I am new to dropping issues here on github and hope that the readability is okay. If you need any more information please let me know!

I had some simple simulations which ran fine for IonSim@0.3.3, but after the update to IonSim@0.4.0, they no longer run.

I have also tried running the examples on the website for IonSim@0.4.0 and they throw an error identical to the one I receive running my code. Reverting to IonSim@0.3.3 fixes the issue for both my own code and for the website examples.

The error QuantumOpticsBase.IncompatibleBases() is thrown on the line

 _, ρt = timeevolution.master_dynamic(tspan, ρᵢ_22, (t, ρ) -> (h(t, ρ), [J], [J], [γ]))

in the following example code. I have many simple simulations like this one which all throw the same error upon the line involving timeevolution.master_dynamic but which involve different numbers of lasers and ions, and different energy levels, laser parameters, etc.

using QuantumOptics
using QuantumOpticsBase
using IonSim
using DSP: periodogram
using LaTeXStrings
import PyPlot
const plt = PyPlot
plt.matplotlib.rc("xtick", top=false)
plt.matplotlib.rc("ytick", right=false, left=false)
plt.matplotlib.rc("axes", labelsize=20, titlesize=20, grid=true)
plt.matplotlib.rc("axes", linewidth=2)
plt.matplotlib.rc("grid", alpha=0.25, linestyle="--")
plt.matplotlib.rc("font", family="Palatino", weight="medium")
plt.matplotlib.rc("figure", figsize=(8,4))
plt.matplotlib.rc("xtick.major", width=2)
plt.matplotlib.rc("ytick.major", width=2);
c = 2.998e8

 """
Construct the System.
We have two identical calcium ions in a linear chain, exposed to two lasers with the same polarization
and electric field amplitude but detuned by a small detuning δ. This detuning causes an interference
pattern which beats in time. The spacing of the two ions in the chain means that they experience different
total laser intensities as the interference pattern beats, creating a differential AC Stark shift. This
causes the ions to accrue diffeQuantumOpticsBase.IncompatibleBases()rent overal phases via the displacement operation performed by the gate
depending on whether they are in the S or D manifold.
To simulate this, we will need two ion objects of the same species, and two laser objects as well. The lasers
point orthogonally to one another and at a 45 degree angle with respect to the ion chain (which is along ẑ).
"""

C1 = Ca40([("S1/2", -1/2), ("D5/2", -1/2)])

set_sublevel_alias!(C1, Dict("S" => ("S1/2", -1/2), "D" => ("D5/2", -1/2)))

C2 = Ca40([("S1/2", -1/2), ("D5/2", -1/2)])
set_sublevel_alias!(C2, Dict("S" => ("S1/2", -1/2), "D" => ("D5/2", -1/2)))

νᵣ = √14 * 1e6  # radial trap frequency
νₐ = 1.5e6  # axial trap frequency

# set carrier transition Rabi frequency to 500 kHz for L1, then set L2 Efield to be the same.
Ω_set = 5e5;

#setup

#initialize lasers
L1_22 = Laser()
L2_22 = Laser()

#ions
chain_22 = LinearChain(ions=[C1,C2], com_frequencies=(x=νᵣ, y=νᵣ, z=νₐ), vibrational_modes=(x=[1], z=[1]))
T_22 = Trap(configuration=chain_22, B=4e-4, Bhat=ẑ, δB=0, lasers=[L1_22,L2_22])

#laser properties
#no detuning
δ = 0
L1_22.λ = transitionwavelength(C1, ("S", "D"), T_22)
ω1 = 2 * π * c / transitionwavelength(C1, ("S", "D"), T_22)
ω2 = ω1 + δ
L2_22.λ = 2 * π * c / ω2

#crossing k-vector
L1_22.k = (x̂ - ẑ)/√2
L2_22.k = (x̂ + ẑ)/√2

#same polarization
L1_22.ϵ = ẑ
L2_22.ϵ = ẑ

#in phase
L1_22.ϕ = 0
L2_22.ϕ = 0

#set Efield
Efield_from_rabi_frequency!(Ω_set, T_22, 1, 1, ("S", "D"))
Efield_from_rabi_frequency!(Ω_set, T_22, 2, 1, ("S", "D"))

axial_22 = T_22.configuration.vibrational_modes.z[1]
radial_22 = T_22.configuration.vibrational_modes.x[1]

# set vibrational mode Hilbert space dimensions
axial_22.N = 4; radial_22.N = 4;

# set initial state
ρᵢ_ions_22 = dm(C1["S"]) ⊗ dm(C2["S"])
ρᵢ_axial_22 = thermalstate(axial_22, 0.5)
ρᵢ_radial_22 = thermalstate(radial_22, 0.5)
# Set initial state to ρᵢ = |↓, n̄ᵣ=0.5, n̄ₐ=0.5⟩
ρᵢ_22 = ρᵢ_ions_22 ⊗ ρᵢ_radial_22 ⊗ ρᵢ_axial_22;

@time begin
    τ = 5/Ω_set*1e6
    steps = 10000
    tspan = 0:τ/steps:τ

    #J = (-dm(C1["S"]) ⊗ dm(C2["S"]) + dm(C1["D"]) ⊗ dm(C2["D"])) ⊗ one(radial) ⊗ one(axial)  # Collapse operator
    J = one(ρᵢ_22)
    γ = 1e4 * 1e-6;

    h = hamiltonian(T_22, rwa_cutoff=1.5e6, lamb_dicke_order=2)

    _, ρt = timeevolution.master_dynamic(tspan, ρᵢ_22, (t, ρ) -> (h(t, ρ), [J], [J], [γ]))

    popSS = real(expect(ionprojector(T_22, "S","S"), ρt))
    popSD = real(expect(ionprojector(T_22, "S","D"), ρt))
    popDS = real(expect(ionprojector(T_22, "D","S"), ρt))
    popDD = real(expect(ionprojector(T_22, "D","D"), ρt))
    tot = popSS + popSD + popDS + popDD

    plt.plot(tspan, popSS, color="red", label=L"|SS\rangle")
    plt.plot(tspan, popSD + popDS, color="green", label=L"|SD\rangle + |DS\rangle")
    plt.plot(tspan, popDD, color="blue", label=L"|DD\rangle")
    plt.plot(tspan, tot, color="grey",label="Total")
    plt.xlabel("Time "*L"(\mu s)")
    plt.ylabel("Population")
    plt.legend(loc=1)
    plt.show()
end;

Here is my (cumbersome) stacktrace:

QuantumOpticsBase.IncompatibleBases() Stacktrace: [1] check_samebases @ ~/.julia/packages/QuantumOpticsBase/BsFXI/src/bases.jl:184 [inlined] [2] check_master(rho0::Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, H::Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, SparseArrays.SparseMatrixCSC{ComplexF64, Int64}}, J::Vector{Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, SparseArrays.SparseMatrixCSC{ComplexF64, Int64}}}, Jdagger::Vector{Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, SparseArrays.SparseMatrixCSC{ComplexF64, Int64}}}, rates::Vector{Float64}) @ QuantumOptics.timeevolution ~/.julia/packages/QuantumOptics/Aep8P/src/master.jl:410 [3] dmaster_h_dynamic!(drho::Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, f::var"#5#6", rates::Nothing, rho::Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, drhocache::Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, t::Float64) @ QuantumOptics.timeevolution ~/.julia/packages/QuantumOptics/Aep8P/src/master.jl:372 [4] dmaster @ ~/.julia/packages/QuantumOptics/Aep8P/src/master.jl:188 [inlined] [5] df_ @ ~/.julia/packages/QuantumOptics/Aep8P/src/timeevolutionbase.jl:23 [inlined] [6] ODEFunction @ ~/.julia/packages/SciMLBase/IJbT7/src/scimlfunctions.jl:1624 [inlined] [7] initialize!(integrator::OrdinaryDiffEq.ODEIntegrator{OrdinaryDiffEq.DP5, true, Matrix{ComplexF64}, Nothing, Float64, SciMLBase.NullParameters, Float64, Float64, Float64, Float64, Vector{Matrix{ComplexF64}}, SciMLBase.ODESolution{ComplexF64, 3, Vector{Matrix{ComplexF64}}, Nothing, Nothing, Vector{Float64}, Vector{Vector{Matrix{ComplexF64}}}, SciMLBase.ODEProblem{Matrix{ComplexF64}, Tuple{Float64, Float64}, true, SciMLBase.NullParameters, SciMLBase.ODEFunction{true, QuantumOptics.timeevolution.var"#df#3"{QuantumOptics.timeevolution.var"#dmaster_#24"{Nothing, var"#5#6", Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}}, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULTOBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, SciMLBase.StandardODEProblem}, OrdinaryDiffEq.DP5, OrdinaryDiffEq.InterpolationData{SciMLBase.ODEFunction{true, QuantumOptics.timeevolution.var"#df#3"{QuantumOptics.timeevolution.var"#dmaster_#24"{Nothing, var"#5#6", Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}}, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULTOBSERVED), Nothing}, Vector{Matrix{ComplexF64}}, Vector{Float64}, Vector{Vector{Matrix{ComplexF64}}}, OrdinaryDiffEq.DP5Cache{Matrix{ComplexF64}, Matrix{ComplexF64}, Matrix{ComplexF64}, OrdinaryDiffEq.DP5ConstantCache{Float64, Float64}}}, DiffEqBase.DEStats}, SciMLBase.ODEFunction{true, QuantumOptics.timeevolution.var"#df#3"{QuantumOptics.timeevolution.var"#dmaster_#24"{Nothing, var"#5#6", Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}}, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, OrdinaryDiffEq.DP5Cache{Matrix{ComplexF64}, Matrix{ComplexF64}, Matrix{ComplexF64}, OrdinaryDiffEq.DP5ConstantCache{Float64, Float64}}, OrdinaryDiffEq.DEOptions{Float64, Float64, Float64, Float64, OrdinaryDiffEq.PIController{Rational{Int64}}, typeof(DiffEqBase.ODE_DEFAULTNORM), typeof(LinearAlgebra.opnorm), Bool, SciMLBase.CallbackSet{Tuple{}, Tuple{SciMLBase.DiscreteCallback{DiffEqCallbacks.var"#30#31", DiffEqCallbacks.SavingAffect{QuantumOptics.timeevolution.var"#fout#4"{Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, QuantumOptics.timeevolution.var"#fout#7"}, Float64, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, DataStructures.BinaryMinHeap{Float64}, Vector{Float64}}, typeof(DiffEqCallbacks.saving_initialize), typeof(SciMLBase.FINALIZE_DEFAULT)}}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, DataStructures.BinaryHeap{Float64, DataStructures.FasterForward}, Nothing, Nothing, Int64, Tuple{}, Tuple{}, Tuple{}}, Matrix{ComplexF64}, ComplexF64, Nothing, OrdinaryDiffEq.DefaultInit}, cache::OrdinaryDiffEq.DP5Cache{Matrix{ComplexF64}, Matrix{ComplexF64}, Matrix{ComplexF64}, OrdinaryDiffEq.DP5ConstantCache{Float64, Float64}}) @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/UG9Mz/src/perform_step/low_order_rk_perform_step.jl:791 [8] init(prob::SciMLBase.ODEProblem{Matrix{ComplexF64}, Tuple{Float64, Float64}, true, SciMLBase.NullParameters, SciMLBase.ODEFunction{true, QuantumOptics.timeevolution.var"#df#3"{QuantumOptics.timeevolution.var"#dmaster#24"{Nothing, var"#5#6", Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}}, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, SciMLBase.StandardODEProblem}, alg::OrdinaryDiffEq.DP5, timeseries_init::Tuple{}, ts_init::Tuple{}, ks_init::Tuple{}, recompile::Type{Val{true}}; saveat::Tuple{}, tstops::Tuple{}, d_discontinuities::Tuple{}, save_idxs::Nothing, save_everystep::Bool, save_on::Bool, save_start::Bool, saveend::Bool, callback::SciMLBase.CallbackSet{Tuple{}, Tuple{SciMLBase.DiscreteCallback{DiffEqCallbacks.var"#30#31", DiffEqCallbacks.SavingAffect{QuantumOptics.timeevolution.var"#fout#4"{Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, QuantumOptics.timeevolution.var"#fout#7"}, Float64, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, DataStructures.BinaryMinHeap{Float64}, Vector{Float64}}, typeof(DiffEqCallbacks.saving_initialize), typeof(SciMLBase.FINALIZE_DEFAULT)}}}, dense::Bool, calck::Bool, dt::Float64, dtmin::Nothing, dtmax::Float64, force_dtmin::Bool, adaptive::Bool, gamma::Rational{Int64}, abstol::Float64, reltol::Float64, qmin::Rational{Int64}, qmax::Int64, qsteady_min::Int64, qsteady_max::Int64, beta1::Nothing, beta2::Nothing, qoldinit::Rational{Int64}, controller::Nothing, fullnormalize::Bool, failfactor::Int64, maxiters::Int64, internalnorm::typeof(DiffEqBase.ODE_DEFAULT_NORM), internalopnorm::typeof(LinearAlgebra.opnorm), isoutofdomain::typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), unstable_check::typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), verbose::Bool, timeseries_errors::Bool, dense_errors::Bool, advance_to_tstop::Bool, stop_at_next_tstop::Bool, initialize_save::Bool, progress::Bool, progress_steps::Int64, progress_name::String, progress_message::typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), userdata::Nothing, allow_extrapolation::Bool, initialize_integrator::Bool, alias_u0::Bool, alias_du0::Bool, initializealg::OrdinaryDiffEq.DefaultInit, kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}) @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/UG9Mz/src/solve.jl:456 [9] #solve#502 @ ~/.julia/packages/OrdinaryDiffEq/UG9Mz/src/solve.jl:4 [inlined] [10] #solve_call#28 @ ~/.julia/packages/DiffEqBase/aAyno/src/solve.jl:433 [inlined] [11] solveup(prob::SciMLBase.ODEProblem{Matrix{ComplexF64}, Tuple{Float64, Float64}, true, SciMLBase.NullParameters, SciMLBase.ODEFunction{true, QuantumOptics.timeevolution.var"#df#3"{QuantumOptics.timeevolution.var"#dmaster_#24"{Nothing, var"#5#6", Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}}, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, SciMLBase.StandardODEProblem}, sensealg::Nothing, u0::Matrix{ComplexF64}, p::SciMLBase.NullParameters, args::OrdinaryDiffEq.DP5; kwargs::Base.Pairs{Symbol, Any, NTuple{6, Symbol}, NamedTuple{(:reltol, :abstol, :save_everystep, :save_start, :saveend, :callback), Tuple{Float64, Float64, Bool, Bool, Bool, SciMLBase.CallbackSet{Tuple{}, Tuple{SciMLBase.DiscreteCallback{DiffEqCallbacks.var"#30#31", DiffEqCallbacks.SavingAffect{QuantumOptics.timeevolution.var"#fout#4"{Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, QuantumOptics.timeevolution.var"#fout#7"}, Float64, Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, DataStructures.BinaryMinHeap{Float64}, Vector{Float64}}, typeof(DiffEqCallbacks.saving_initialize), typeof(SciMLBase.FINALIZEDEFAULT)}}}}}}) @ DiffEqBase ~/.julia/packages/DiffEqBase/aAyno/src/solve.jl:772 [12] #solve#33 @ ~/.julia/packages/DiffEqBase/aAyno/src/solve.jl:756 [inlined] [13] integrate(tspan::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, df::QuantumOptics.timeevolution.var"#dmaster#24"{Nothing, var"#5#6", Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}}, x0::Matrix{ComplexF64}, state::Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, dstate::Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, fout::QuantumOptics.timeevolution.var"#fout#7"; alg::OrdinaryDiffEq.DP5, steady_state::Bool, tol::Float64, save_everystep::Bool, saveat::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, callback::Nothing, kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}) @ QuantumOptics.timeevolution ~/.julia/packages/QuantumOptics/Aep8P/src/timeevolution_base.jl:58 [14] integrate(tspan::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, df::Function, x0::Matrix{ComplexF64}, state::Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, dstate::Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, fout::Function) @ QuantumOptics.timeevolution ~/.julia/packages/QuantumOptics/Aep8P/src/timeevolution_base.jl:20 [15] #integrate#6 @ ~/.julia/packages/QuantumOptics/Aep8P/src/timeevolution_base.jl:74 [inlined] [16] integrate @ ~/.julia/packages/QuantumOptics/Aep8P/src/timeevolution_base.jl:71 [inlined] [17] integrate_master(tspan::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, df::Function, rho0::Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, fout::Nothing; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}) @ QuantumOptics.timeevolution ~/.julia/packages/QuantumOptics/Aep8P/src/master.jl:231 [18] integrate_master @ ~/.julia/packages/QuantumOptics/Aep8P/src/master.jl:228 [inlined] [19] #master_dynamic#23 @ ~/.julia/packages/QuantumOptics/Aep8P/src/master.jl:189 [inlined] [20] master_dynamic(tspan::StepRangeLen{Float64, Base.TwicePrecision{Float64}, Base.TwicePrecision{Float64}, Int64}, rho0::Operator{CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, CompositeBasis{Vector{Int64}, Tuple{IonSim.IonInstance{:Ca40}, VibrationalMode, VibrationalMode}}, Matrix{ComplexF64}}, f::Function) @ QuantumOptics.timeevolution ~/.julia/packages/QuantumOptics/Aep8P/src/master.jl:187 [21] macro expansion @ In[6]:62 [inlined] [22] top-level scope @ timing.jl:220 [23] eval @ ./boot.jl:373 [inlined] [24] include_string(mapexpr::typeof(REPL.softscope), mod::Module, code::String, filename::String) @ Base ./loading.jl:1196

jbroz11 commented 2 years ago

This is weird. The temporary workaround is to use the QuantumOptics.jl samebases macro like this:

@samebases _, ρt = timeevolution.master_dynamic(tspan, ρᵢ_22, (t, ρ) -> (h(t, ρ), [J], [J], [γ]))

I'll try to figure out what's going on. @marwahaha it looks like this has something to do with IonInstance.

jbroz11 commented 2 years ago

Actually, it's still broken. Sorry about that. We might need to revert back to 0.3 @marwahaha

marwahaha commented 2 years ago

Thanks for letting me know. I'll take a look this week.

jbroz11 commented 2 years ago

Now after https://github.com/HaeffnerLab/IonSim.jl/releases/tag/v0.4.2 it seems to be working.

marwahaha commented 2 years ago

Nice it got fixed. @jbroz11 could you add a test (perhaps the one that demonstrated the issue) documenting this behavior?

jbroz11 commented 2 years ago

This would have been caught by any of the test_dynamics tests, so we should be good when that's back up and running.