diff --git a/src/chaosdetection/lyapunovs/lyapunov.jl b/src/chaosdetection/lyapunovs/lyapunov.jl index f8a04c42..19dd1f74 100644 --- a/src/chaosdetection/lyapunovs/lyapunov.jl +++ b/src/chaosdetection/lyapunovs/lyapunov.jl @@ -157,26 +157,25 @@ function λdist(integ::AbstractODEIntegrator{Alg, IIP, Vector{S}}) where {Alg, I return norm(integ.u[1] - integ.u[2]) end -# Rescales: -function rescale!(integ::MinimalDiscreteIntegrator{true, Vector{S}}, a) where {S<:SVector} - integ.u[2] = integ.u[1] + (integ.u[2] - integ.u[1])/a - u_modified!(integ, true) +function isinplace(integ::AbstractODEIntegrator{Alg, IIP, S}) where {Alg, IIP, S} + return IIP end -function rescale!(integ::MinimalDiscreteIntegrator{true, Vector{S}}, a) where {S<:Vector} - @. integ.u[2] = integ.u[1] + (integ.u[2] - integ.u[1])/a - u_modified!(integ, true) +function isinplace(integ::MinimalDiscreteIntegrator{IIP, S}) where {IIP, S} + return IIP end -function rescale!(integ::AbstractODEIntegrator{Alg, IIP, M}, a) where {Alg, IIP, M<:Matrix} - for i in 1:size(integ.u)[1] - integ.u[i, 2] = integ.u[i,1] + (integ.u[i,2] - integ.u[i,1])/a - end - u_modified!(integ, true) + +function rescale_iip!(integ, a) + get_state(integ, 2) .= get_state(integ, 1) .+ (get_state(integ, 2) .- get_state(integ, 1)) ./ a end -function rescale!(integ::AbstractODEIntegrator{Alg, IIP, Vector{S}}, a) where {Alg, IIP, S<:Vector} - @. integ.u[2] = integ.u[1] + (integ.u[2] - integ.u[1])/a - u_modified!(integ, true) +function rescale_oop(integ, a) + r = get_state(integ, 1) .+ (get_state(integ, 2) .- get_state(integ, 1)) ./ a + set_state!(integ, r, 2) end -function rescale!(integ::AbstractODEIntegrator{Alg, IIP, Vector{S}}, a) where {Alg, IIP, S<:SVector} - integ.u[2] = integ.u[1] + (integ.u[2] - integ.u[1])/a - u_modified!(integ, true) +function rescale!(integ, a) + iip = isinplace(integ) + if iip + rescale_iip!(integ, a) + else + rescale_oop(integ, a) + end end