-
-
Notifications
You must be signed in to change notification settings - Fork 243
Description
Trying to use SDE Stiff solvers with complex arrays fails even if auto-differentiation is explicitly turned off.
SKenCarp fails with
ERROR: MethodError: no method matching eps(::Type{Complex{Float64}})
ImplicitEM, ImplicitEulerHeun, ImplicitRKMil, ISSEM and ISSEulerHeun fail with
MethodError: no method matching StochasticDiffEq.ImplicitEMCache(::Array{Complex{Float64},2}, ::Array{Complex{Float64},2}, ::Array{Complex{Float64},2}, ::Array{Complex{Float64},2}, ::Array{Complex{Float64},2}, ::Array{Complex{Float64},2}, ::Array{Complex{Float64},2}, ::Array{Complex{Float64},2}, ::Array{Complex{Float64},2}, ::Array{Complex{Float64},2}, ::Array{Complex{Float64},2}, ::Array{Complex{Float64},2}, ::DiffEqDiffTools.JacobianCache{Array{Complex{Float64},2},Array{Complex{Float64},2},Array{Complex{Float64},2},Val{:central},Complex{Float64},Val{true}}, ::DiffEqBase.LinSolveFactorize{Base.LinAlg.#lufact!}, ::DiffEqDiffTools.UJacobianWrapper{#ff,Float64,Void}, ::Complex{Float64}, ::Complex{Float64}, ::Float64, ::Int64, ::Void)
It's unrelated, but note that turning on auto differentiation for all those methods gives the error
ERROR: TypeError: Dual: in V, expected V<:Real, got Type{Complex{Float64}}
Here is the code that is leading to the error:
using DifferentialEquations
L = 4;
u₀ = fill(0.2+0.2im, L, 1);
Jmat = 0.45.*(diagm(linspace(1,1,L-1),1)+diagm(linspace(1,1,L-1),-1));
function ff(dα,α,p,t)
dα[:] = (-im*(0.1 - 0.1*(α .* conj(α) - 1.0)) - 1.0/2.0).*α + im*1.57 -im.*(Jmat*α);
end
function gg(dα, α, p, t)
dα[:] = sqrt(1/2)
end
prob_BH = SDEProblem(ff, gg, u₀, (0.0, 50.0));
solSKC = solve(prob_BH, SKenCarp(autodiff=false), dt=0.001)
solEM = solve(prob_BH, ImplicitEM(autodiff=false), dt=0.001)
solEH = solve(prob_BH, ImplicitEulerHeun(autodiff=false), dt=0.001)
solRKM = solve(prob_BH, ImplicitRKMil(autodiff=false), dt=0.001)
solISSEM = solve(prob_BH, ISSEM(autodiff=false), dt=0.001)
solISSEH = solve(prob_BH, ISSEulerHeun(autodiff=false), dt=0.001)