Cache input to master derivative functions
apkille opened this issue · 3 comments
In several of the master functions, e.g., dmaster_h!
, a cached copy of drho
is required as input:
dmaster_h!(drho, H, J, Jdagger, rates, rho, drho_cache)
Presumably, this is to improve performance of solvers such as timeevolution.master
. However, this feels excessive if we don't want to use the corresponding solver, and instead create an ODE problem directly with our density operators and dmaster_h!
. For example, it would be great if we could define an in-place method without the cache input, say
f!(drho, rho, p, t) = timeevolution.dmaster_h!(drho, H, J, Jdagger, rates, rho)
prob = ODEProblem(f!, rho0, (t0, t1))
This is a natural interface that I'm aiming for with all of the recent broadcasting work (#404, qojulia/QuantumOpticsBase.jl#172). Do the QO maintainers have any comments or oppositions to defining such a method in QO.jl?
It shouldn't create any ambiguities to add that method, so go ahead 👍
@Krastanov to build off our discussion in person: a workaround is assigning the cached drho
to the p
parameter of the ODEProblem object, which prevents us from caching at each time step if we use OrdinaryDiffEq.jl directly. So we don't have to define any new methods. For example, using dmaster_h!
which is already a part of the public API, we have
using QuantumOptics, OrdinaryDiffEq
b = FockBasis(5)
psi0 = fockstate(b, 4)
rho0 = dm(psi0)
tmp = copy(rho0)
H = number(b)
J = [destroy(b), create(b)]
Jdagger = dagger.(J)
rates = [0.7, 0.5]
f!(drho, rho, p, t) = timeevolution.dmaster_h!(drho, H, J, Jdagger, rates, rho, p)
prob = ODEProblem(f!, rho0, (0.0, 1.0), tmp)
sol = solve(prob, DP5(); save_everystep=false)