Skip to content

Commit 66a733a

Browse files
authored
Merge pull request #270 from SciML/myb/maxiters
Handle maxiters properly
2 parents e1d832d + 3e96b99 commit 66a733a

File tree

4 files changed

+29
-9
lines changed

4 files changed

+29
-9
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "Sundials"
22
uuid = "c3572dad-4567-51f8-b174-8c6c989267f4"
33
authors = ["Chris Rackauckas <[email protected]>"]
4-
version = "4.2.3"
4+
version = "4.2.4"
55

66
[deps]
77
CEnum = "fa961155-64e5-5f13-b03f-caf6b980ea82"

src/common_interface/integrator_types.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ mutable struct DEOptions{SType,TstopType,CType,reltolType,abstolType,F5}
1616
progress::Bool
1717
progress_name::String
1818
progress_message::F5
19+
maxiters::Int
1920
end
2021

2122
abstract type AbstractSundialsIntegrator{algType} <: DiffEqBase.AbstractODEIntegrator{algType,true,Vector{Float64},Float64} end

src/common_interface/solve.jl

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ function DiffEqBase.__init(
315315
opts = DEOptions(saveat_internal,tstops_internal,save_everystep,dense,
316316
timeseries_errors,dense_errors,save_on,save_end,
317317
callbacks_internal,abstol,reltol,verbose,advance_to_tstop,stop_at_next_tstop,
318-
progress,progress_name,progress_message)
318+
progress,progress_name,progress_message,maxiters)
319319
integrator = CVODEIntegrator(u0,prob.p,t0,t0,mem,_LS,_A,sol,alg,f!,userfun,jac,opts,
320320
tout,tdir,sizeu,false,tmp,uprev,Cint(flag),false,0,1,callback_cache,0.)
321321

@@ -744,7 +744,7 @@ function DiffEqBase.__init(
744744
opts = DEOptions(saveat_internal,tstops_internal,save_everystep,dense,
745745
timeseries_errors,dense_errors,save_on,save_end,
746746
callbacks_internal,abstol,reltol,verbose,advance_to_tstop,stop_at_next_tstop,
747-
progress,progress_name,progress_message)
747+
progress,progress_name,progress_message,maxiters)
748748
integrator = ARKODEIntegrator(utmp,prob.p,t0,t0,mem,_LS,_A,_MLS,_M,sol,alg,f!,userfun,jac,opts,
749749
tout,tdir,sizeu,false,tmp,uprev,Cint(flag),false,0,1,callback_cache,0.)
750750

@@ -1094,7 +1094,7 @@ function DiffEqBase.__init(
10941094
opts = DEOptions(saveat_internal,tstops_internal,save_everystep,dense,
10951095
timeseries_errors,dense_errors,save_on,save_end,
10961096
callbacks_internal,abstol,reltol,verbose,advance_to_tstop,stop_at_next_tstop,
1097-
progress,progress_name,progress_message)
1097+
progress,progress_name,progress_message,maxiters)
10981098

10991099
integrator = IDAIntegrator(utmp,dutmp,prob.p,t0,t0,mem,_LS,_A,sol,alg,f!,userfun,jac,opts,
11001100
tout,tdir,sizeu,sizedu,false,tmp,uprev,Cint(flag),false,0,1,callback_cache,0.)
@@ -1155,8 +1155,19 @@ function set_stop_time(integrator::IDAIntegrator,tstop)
11551155
IDASetStopTime(integrator.mem,tstop)
11561156
end
11571157

1158+
function get_iters!(integrator::CVODEIntegrator,iters)
1159+
CVodeGetNumSteps(integrator.mem,iters)
1160+
end
1161+
function get_iters!(integrator::ARKODEIntegrator,iters)
1162+
ARKStepGetNumSteps(integrator.mem,iters)
1163+
end
1164+
function get_iters!(integrator::IDAIntegrator,iters)
1165+
IDAGetNumSteps(integrator.mem,iters)
1166+
end
1167+
11581168
function DiffEqBase.solve!(integrator::AbstractSundialsIntegrator)
11591169
uType = eltype(integrator.sol.u)
1170+
iters = Ref(-1)
11601171
while !isempty(integrator.opts.tstops)
11611172
# Sundials can have floating point issues approaching a tstop if
11621173
# there is a modifying event each
@@ -1176,8 +1187,13 @@ function DiffEqBase.solve!(integrator::AbstractSundialsIntegrator)
11761187
if isempty(integrator.opts.tstops)
11771188
break
11781189
end
1190+
get_iters!(integrator, iters)
1191+
if iters[] + 1 > integrator.opts.maxiters
1192+
integrator.flag = -1 # MaxIters: -1
1193+
break
1194+
end
11791195
end
1180-
(integrator.flag < 0) && break
1196+
integrator.flag < 0 && break
11811197
handle_tstop!(integrator)
11821198
end
11831199

@@ -1209,11 +1225,11 @@ function DiffEqBase.solve!(integrator::AbstractSundialsIntegrator)
12091225
dense_errors=integrator.opts.dense_errors)
12101226
end
12111227

1212-
if integrator.sol.retcode != :Default
1213-
return integrator.sol
1228+
if integrator.sol.retcode === :Default
1229+
integrator.sol = DiffEqBase.solution_new_retcode(integrator.sol,interpret_sundials_retcode(integrator.flag))
12141230
end
1215-
integrator.sol = DiffEqBase.solution_new_retcode(integrator.sol,interpret_sundials_retcode(integrator.flag))
1216-
nothing
1231+
1232+
return integrator.sol
12171233
end
12181234

12191235
function handle_tstop!(integrator::AbstractSundialsIntegrator)

test/common_interface/cvode.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,6 @@ u0 = 0.0;
107107
tspan = (0.0, 10)
108108
prob = ODEProblem(number_test,u0,tspan,(2.0,0.01))
109109
sol = solve(prob,CVODE_BDF())
110+
111+
sol = solve(prob2,CVODE_BDF(), maxiters=1)
112+
@test length(sol.t) == 2

0 commit comments

Comments
 (0)