@@ -217,69 +217,75 @@ function WorkPrecision(prob, alg, abstols, reltols, dts = nothing;
217217
218218            stats[i] =  sol. stats
219219
220-             if  haskey (kwargs, :prob_choice )
221-                 cur_appxsol =  appxsol[kwargs[:prob_choice ]]
222-             elseif  prob isa  AbstractArray
223-                 cur_appxsol =  appxsol[1 ]
224-             else 
225-                 cur_appxsol =  appxsol
226-             end 
227- 
228-             if  cur_appxsol != =  nothing 
229-                 errsol =  appxtrue (sol, cur_appxsol)
230-                 errors[i] =  Dict {Symbol, Float64} ()
231-                 for  err in  keys (errsol. errors)
232-                     errors[i][err] =  mean (errsol. errors[err])
233-                 end 
234-             else 
235-                 errors[i] =  Dict {Symbol, Float64} ()
236-                 for  err in  keys (sol. errors)
237-                     errors[i][err] =  mean (sol. errors[err])
220+             if  SciMLBase. successful_retcode (sol)
221+                 if  haskey (kwargs, :prob_choice )
222+                     cur_appxsol =  appxsol[kwargs[:prob_choice ]]
223+                 elseif  prob isa  AbstractArray
224+                     cur_appxsol =  appxsol[1 ]
225+                 else 
226+                     cur_appxsol =  appxsol
238227                end 
239-             end 
240- 
241-             benchmark_f =  let  dts =  dts, _prob =  _prob, alg =  alg, sol =  sol,
242-                 abstols =  abstols, reltols =  reltols, kwargs =  kwargs
243228
244-                 if  dts ===  nothing 
245-                     if  _prob isa  DAEProblem
246-                         () ->  @elapsed  solve (_prob, alg, sol. u, sol. t;
247-                             abstol =  abstols[i],
248-                             reltol =  reltols[i],
249-                             timeseries_errors =  false ,
250-                             dense_errors =  false , kwargs... )
251-                     else 
252-                         () ->  @elapsed  solve (_prob, alg, sol. u, sol. t, sol. k;
253-                             abstol =  abstols[i],
254-                             reltol =  reltols[i],
255-                             timeseries_errors =  false ,
256-                             dense_errors =  false , kwargs... )
229+                 if  cur_appxsol != =  nothing 
230+                     errsol =  appxtrue (sol, cur_appxsol)
231+                     errors[i] =  Dict {Symbol, Float64} ()
232+                     for  err in  keys (errsol. errors)
233+                         errors[i][err] =  mean (errsol. errors[err])
257234                    end 
258235                else 
259-                     if  _prob isa  DAEProblem
260-                         () ->  @elapsed  solve (_prob, alg, sol. u, sol. t;
261-                             abstol =  abstols[i],
262-                             reltol =  reltols[i],
263-                             dt =  dts[i],
264-                             timeseries_errors =  false ,
265-                             dense_errors =  false , kwargs... )
236+                     errors[i] =  Dict {Symbol, Float64} ()
237+                     for  err in  keys (sol. errors)
238+                         errors[i][err] =  mean (sol. errors[err])
239+                     end 
240+                 end 
241+ 
242+                 benchmark_f =  let  dts =  dts, _prob =  _prob, alg =  alg, sol =  sol,
243+                     abstols =  abstols, reltols =  reltols, kwargs =  kwargs
244+ 
245+                     if  dts ===  nothing 
246+                         if  _prob isa  DAEProblem
247+                             () ->  @elapsed  solve (_prob, alg, sol. u, sol. t;
248+                                 abstol =  abstols[i],
249+                                 reltol =  reltols[i],
250+                                 timeseries_errors =  false ,
251+                                 dense_errors =  false , kwargs... )
252+                         else 
253+                             () ->  @elapsed  solve (_prob, alg, sol. u, sol. t, sol. k;
254+                                 abstol =  abstols[i],
255+                                 reltol =  reltols[i],
256+                                 timeseries_errors =  false ,
257+                                 dense_errors =  false , kwargs... )
258+                         end 
266259                    else 
267-                         () ->  @elapsed  solve (_prob, alg, sol. u, sol. t, sol. k;
268-                             abstol =  abstols[i],
269-                             reltol =  reltols[i],
270-                             dt =  dts[i],
271-                             timeseries_errors =  false ,
272-                             dense_errors =  false , kwargs... )
260+                         if  _prob isa  DAEProblem
261+                             () ->  @elapsed  solve (_prob, alg, sol. u, sol. t;
262+                                 abstol =  abstols[i],
263+                                 reltol =  reltols[i],
264+                                 dt =  dts[i],
265+                                 timeseries_errors =  false ,
266+                                 dense_errors =  false , kwargs... )
267+                         else 
268+                             () ->  @elapsed  solve (_prob, alg, sol. u, sol. t, sol. k;
269+                                 abstol =  abstols[i],
270+                                 reltol =  reltols[i],
271+                                 dt =  dts[i],
272+                                 timeseries_errors =  false ,
273+                                 dense_errors =  false , kwargs... )
274+                         end 
273275                    end 
274276                end 
275-             end 
276-             benchmark_f () #  pre-compile
277+                 benchmark_f () #  pre-compile
277278
278-             b_t =  benchmark_f ()
279-             if  b_t >  seconds
280-                 times[i] =  b_t
279+                 b_t =  benchmark_f ()
280+                 if  b_t >  seconds
281+                     times[i] =  b_t
282+                 else 
283+                     times[i] =  mapreduce (i ->  benchmark_f (), min, 2 : numruns; init =  b_t)
284+                 end 
281285            else 
282-                 times[i] =  mapreduce (i ->  benchmark_f (), min, 2 : numruns; init =  b_t)
286+                 #  Unsuccessful retcode, give NaN time
287+                 errors[i] =  Dict (:l∞  =>  NaN , :L2  =>  NaN , :final  =>  NaN , :l2  =>  NaN , :L∞  =>  NaN )
288+                 times[i] =  NaN 
283289            end 
284290        end 
285291    end 
0 commit comments