From 10b2f681eaf347d2f404ce9d72dddc59075b25fd Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Wed, 3 Jan 2024 16:30:28 -0500 Subject: [PATCH 1/2] update interface to catch errors. --- src/dp5/solver.jl | 2 +- src/dp8/solver.jl | 6 +++++- src/interface.jl | 10 +++++++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/dp5/solver.jl b/src/dp5/solver.jl index 2c1273f..44cdc2b 100644 --- a/src/dp5/solver.jl +++ b/src/dp5/solver.jl @@ -3,7 +3,7 @@ #include("checks.jl") #include("helpers.jl") -function DormandPrince.integrate!( +function DormandPrince.integrate_core!( solver::DP5Solver{T}, xend::T ) where T diff --git a/src/dp8/solver.jl b/src/dp8/solver.jl index 7cef125..80d0dbc 100644 --- a/src/dp8/solver.jl +++ b/src/dp8/solver.jl @@ -3,7 +3,7 @@ #include("checks.jl") #include("helpers.jl") -function DormandPrince.integrate!( +function DormandPrince.integrate_core!( solver::DP8Solver{T}, xend::T ) where T @@ -21,6 +21,10 @@ function DormandPrince.integrate!( check_beta(solver.options) || return Report(solver.vars.x, DormandPrince.CURIOUS_BETA, DormandPrince.INPUT_NOT_CONSISTENT, 0, 0, 0, 0) check_safety_factor(solver.options) || return Report(solver.vars.x, DormandPrince.CURIOUS_SAFETY_FACTOR, DormandPrince.INPUT_NOT_CONSISTENT, 0, 0, 0, 0) + if solver.vars.x == xend + return Report(solver.vars.x, DormandPrince.INPUT_CHECKS_SUCCESSFUL, DormandPrince.COMPUTATION_SUCCESSFUL, 0, 0, 0, 0) + end + ###### nstiff - parameters for stiffness detection # nstiff = solver_options.stiffness_test_activation_step diff --git a/src/interface.jl b/src/interface.jl index 562a65a..229ba0c 100644 --- a/src/interface.jl +++ b/src/interface.jl @@ -30,13 +30,21 @@ end # 3. integrate(callback, solver, times) -> vector of states with callback applied get_current_state(::AbstractDPSolver) = error("not implemented") -integrate!(::AbstractDPSolver{T}, ::T) where T = error("not implemented") +integrate_core!(::AbstractDPSolver{T}, ::T) where T = error("not implemented") + +function integrate!(solver::AbstractDPSolver{T}, time::T) where T <: Real + report = integrate_core!(solver, time) + if report.idid != COMPUTATION_SUCCESSFUL + error("integration failed at time $time with report $report") + end +end function integrate!(callback, solver::AbstractDPSolver{T}, times::AbstractVector{T}; sort_times::Bool = true) where {T <: Real} times = sort_times ? sort(collect(times)) : times result = [] for time in times integrate!(solver, time) + push!(result, callback(time, get_current_state(solver))) end From b2b21e4f1de83e5c622827a919be0110ed3609f0 Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Wed, 3 Jan 2024 16:32:35 -0500 Subject: [PATCH 2/2] bump minor. --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 2aa0471..6a1e8b5 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "DormandPrince" uuid = "5e45e72d-22b8-4dd0-9c8b-f96714864bcd" authors = ["John Long", "Phillip Weinberg"] -version = "0.4.0" +version = "0.5.0" [deps]