From f25f8a6128296b48b7454085939a87a632d457e4 Mon Sep 17 00:00:00 2001 From: Yingbo Ma Date: Sat, 27 Oct 2018 16:39:31 -0400 Subject: [PATCH] `savevalues` should return booleans --- src/common_interface/integrator_utils.jl | 46 +++++++++++++----------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/src/common_interface/integrator_utils.jl b/src/common_interface/integrator_utils.jl index d82f824b..80581424 100644 --- a/src/common_interface/integrator_utils.jl +++ b/src/common_interface/integrator_utils.jl @@ -30,31 +30,35 @@ function handle_callbacks!(integrator) integrator.u_modified = false end -function DiffEqBase.savevalues!(integrator::AbstractSundialsIntegrator,force_save=false) - if integrator.opts.save_on - uType = eltype(integrator.sol.u) - while !isempty(integrator.opts.saveat) && - integrator.tdir*top(integrator.opts.saveat) < integrator.tdir*first(integrator.tout) - - curt = pop!(integrator.opts.saveat) - tmp = integrator(curt) - save_value!(integrator.sol.u,tmp,uType,integrator.sizeu,Val{false}) - push!(integrator.sol.t,curt) - if integrator.opts.dense - tmp = integrator(curt,Val{1}) - save_value!(integrator.sol.interp.du,tmp,uType,integrator.sizeu,Val{false}) - end +function DiffEqBase.savevalues!(integrator::AbstractSundialsIntegrator,force_save=false)::Tuple{Bool,Bool} + saved, savedexactly = false, false + !integrator.opts.save_on && return saved, savedexactly + uType = eltype(integrator.sol.u) + while !isempty(integrator.opts.saveat) && + integrator.tdir*top(integrator.opts.saveat) < integrator.tdir*first(integrator.tout) + + saved = true + curt = pop!(integrator.opts.saveat) + tmp = integrator(curt) + save_value!(integrator.sol.u,tmp,uType,integrator.sizeu,Val{false}) + push!(integrator.sol.t,curt) + if integrator.opts.dense + tmp = integrator(curt,Val{1}) + save_value!(integrator.sol.interp.du,tmp,uType,integrator.sizeu,Val{false}) end + end - if integrator.opts.save_everystep || force_save - save_value!(integrator.sol.u,integrator.u,uType,integrator.sizeu) - push!(integrator.sol.t, integrator.t) - if integrator.opts.dense - tmp = integrator(integrator.t,Val{1}) - save_value!(integrator.sol.interp.du,tmp,uType,integrator.sizeu) - end + if integrator.opts.save_everystep || force_save + saved = true + save_value!(integrator.sol.u,integrator.u,uType,integrator.sizeu) + push!(integrator.sol.t, integrator.t) + if integrator.opts.dense + tmp = integrator(integrator.t,Val{1}) + save_value!(integrator.sol.interp.du,tmp,uType,integrator.sizeu) end end + savedexactly = last(integrator.sol.t) == integrator.t + return saved, savedexactly end function save_value!(save_array,val,::Type{T},sizeu,