qojulia/QuantumOptics.jl

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 👍

this might be related #298

@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)