@@ -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)
11561156end
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+
11581168function 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
12171233end
12181234
12191235function handle_tstop! (integrator:: AbstractSundialsIntegrator )
0 commit comments