@@ -161,6 +161,8 @@ mutable struct WorkPrecision
161
161
reltols:: Any
162
162
errors:: Any
163
163
times:: Any
164
+ dts:: Any
165
+ stats:: Any
164
166
name:: Any
165
167
N:: Int
166
168
end
@@ -183,6 +185,7 @@ function WorkPrecision(prob, alg, abstols, reltols, dts = nothing;
183
185
N = length (abstols)
184
186
errors = Vector {Float64} (undef, N)
185
187
times = Vector {Float64} (undef, N)
188
+ stats = Vector {Any} (undef, N)
186
189
if name === nothing
187
190
name = " WP-Alg"
188
191
end
@@ -210,6 +213,8 @@ function WorkPrecision(prob, alg, abstols, reltols, dts = nothing;
210
213
dense_errors = dense_errors)
211
214
end
212
215
216
+ stats[i] = sol. stats
217
+
213
218
if haskey (kwargs, :prob_choice )
214
219
cur_appxsol = appxsol[kwargs[:prob_choice ]]
215
220
elseif prob isa AbstractArray
@@ -270,7 +275,7 @@ function WorkPrecision(prob, alg, abstols, reltols, dts = nothing;
270
275
end
271
276
end
272
277
end
273
- return WorkPrecision (prob, abstols, reltols, errors, times, name, N)
278
+ return WorkPrecision (prob, abstols, reltols, errors, times, dts, stats, name, N)
274
279
end
275
280
276
281
# Work precision information for a BVP
@@ -280,6 +285,7 @@ function WorkPrecision(prob::AbstractBVProblem, alg, abstols, reltols, dts = not
280
285
N = length (abstols)
281
286
errors = Vector {Float64} (undef, N)
282
287
times = Vector {Float64} (undef, N)
288
+ stats = Vector {Any} (undef, N)
283
289
if name === nothing
284
290
name = " WP-Alg"
285
291
end
@@ -307,6 +313,8 @@ function WorkPrecision(prob::AbstractBVProblem, alg, abstols, reltols, dts = not
307
313
dense_errors = dense_errors)
308
314
end
309
315
316
+ stats[i] = sol. stats
317
+
310
318
if haskey (kwargs, :prob_choice )
311
319
cur_appxsol = appxsol[kwargs[:prob_choice ]]
312
320
elseif prob isa AbstractArray
@@ -367,14 +375,15 @@ function WorkPrecision(prob::AbstractBVProblem, alg, abstols, reltols, dts = not
367
375
end
368
376
end
369
377
end
370
- return WorkPrecision (prob, abstols, reltols, errors, times, name, N)
378
+ return WorkPrecision (prob, abstols, reltols, errors, times, dts, stats, name, N)
371
379
end
372
380
373
381
# Work precision information for a nonlinear problem.
374
382
function WorkPrecision (prob:: NonlinearProblem , alg, abstols, reltols, dts = nothing ; name = nothing , appxsol = nothing , error_estimate = :l2 , numruns = 20 , seconds = 2 , kwargs... )
375
383
N = length (abstols)
376
384
errors = Vector {Float64} (undef, N)
377
385
times = Vector {Float64} (undef, N)
386
+ stats = Vector {Any} (undef, N)
378
387
if name === nothing
379
388
name = " WP-Alg"
380
389
end
@@ -391,9 +400,11 @@ function WorkPrecision(prob::NonlinearProblem, alg, abstols, reltols, dts = noth
391
400
for i in 1 : N
392
401
sol = solve (_prob, alg; kwargs... , abstol = abstols[i], reltol = reltols[i])
393
402
403
+ stats[i] = sol. stats
404
+
394
405
if error_estimate == :l2
395
406
if isnothing (appxsol)
396
- errors[i] = sqrt (sum (abs2, sol. resid))
407
+ errors[i] = sqrt (sum (abs2, sol. resid))
397
408
else
398
409
errors[i] = sqrt (sum (abs2, sol .- appxsol))
399
410
end
@@ -419,7 +430,7 @@ function WorkPrecision(prob::NonlinearProblem, alg, abstols, reltols, dts = noth
419
430
end
420
431
end
421
432
end
422
- return WorkPrecision (prob, abstols, reltols, errors, times, name, N)
433
+ return WorkPrecision (prob, abstols, reltols, errors, times, dts, stats, name, N)
423
434
end
424
435
425
436
function WorkPrecisionSet (prob,
@@ -533,25 +544,25 @@ function WorkPrecisionSet(prob::AbstractRODEProblem, abstols, reltols, setups,
533
544
weak_dense_errors = weak_dense_errors)
534
545
for sim in sol_k] for sol_k in _solutions_k]
535
546
if error_estimate ∈ WEAK_ERRORS
536
- errors = [[solutions[j][i]. weak_errors[error_estimate] for i in 1 : M] for j in 1 : N]
547
+ errors = [[solutions[j][i]. weak_errors for i in 1 : M] for j in 1 : N]
537
548
else
538
- errors = [[solutions[j][i]. error_means[error_estimate] for i in 1 : M] for j in 1 : N]
549
+ errors = [[solutions[j][i]. error_means for i in 1 : M] for j in 1 : N]
539
550
end
540
551
541
552
local _sol
542
553
543
554
# Now time it
555
+ _abstols = [get (setups[k], :abstols , abstols) for k in 1 : N]
556
+ _reltols = [get (setups[k], :reltols , reltols) for k in 1 : N]
557
+ _dts = [get (setups[k], :dts , zeros (length (_abstols))) for k in 1 : N]
544
558
for k in 1 : N
545
559
# precompile
546
560
GC. gc ()
547
- _abstols = get (setups[k], :abstols , abstols)
548
- _reltols = get (setups[k], :reltols , reltols)
549
- _dts = get (setups[k], :dts , zeros (length (_abstols)))
550
561
filtered_setup = filter (p -> p. first in DiffEqBase. allowedkeywords, setups[k])
551
562
552
563
_sol = solve (prob, setups[k][:alg ];
553
- kwargs... , filtered_setup... , abstol = _abstols[1 ],
554
- reltol = _reltols[1 ], dt = _dts[1 ],
564
+ kwargs... , filtered_setup... , abstol = _abstols[k][ 1 ],
565
+ reltol = _reltols[k][ 1 ], dt = _dts[k] [1 ],
555
566
timeseries_errors = false ,
556
567
dense_errors = false )
557
568
x = isempty (_sol. t) ? 0 : round (Int, mean (_sol. t) - sum (_sol. t) / length (_sol. t))
@@ -560,8 +571,8 @@ function WorkPrecisionSet(prob::AbstractRODEProblem, abstols, reltols, setups,
560
571
for i in 1 : numruns
561
572
time_tmp[i] = @elapsed sol = solve (prob, setups[k][:alg ];
562
573
kwargs... , filtered_setup... ,
563
- abstol = _abstols[j],
564
- reltol = _reltols[j], dt = _dts[j],
574
+ abstol = _abstols[k][ j],
575
+ reltol = _reltols[k][ j], dt = _dts[k] [j],
565
576
timeseries_errors = false ,
566
577
dense_errors = false )
567
578
end
@@ -570,7 +581,8 @@ function WorkPrecisionSet(prob::AbstractRODEProblem, abstols, reltols, setups,
570
581
end
571
582
end
572
583
573
- wps = [WorkPrecision (prob, abstols, reltols, errors[i], times[:, i], names[i], N)
584
+ stats = nothing
585
+ wps = [WorkPrecision (prob, _abstols[i], _reltols[i], errors[i], times[:, i], _dts[i], stats, names[i], N)
574
586
for i in 1 : N]
575
587
WorkPrecisionSet (wps, N, abstols, reltols, prob, setups, names, error_estimate,
576
588
numruns_error)
@@ -598,18 +610,18 @@ function WorkPrecisionSet(prob::AbstractEnsembleProblem, abstols, reltols, setup
598
610
time_tmp = Vector {Float64} (undef, numruns)
599
611
600
612
# First calculate all of the errors
613
+ _abstols = [get (setups[k], :abstols , abstols) for k in 1 : N]
614
+ _reltols = [get (setups[k], :reltols , reltols) for k in 1 : N]
615
+ _dts = [get (setups[k], :dts , zeros (length (_abstols))) for k in 1 : N]
601
616
for k in 1 : N
602
- _abstols = get (setups[k], :abstols , abstols)
603
- _reltols = get (setups[k], :reltols , reltols)
604
- _dts = get (setups[k], :dts , zeros (length (_abstols)))
605
617
filtered_setup = filter (p -> p. first in DiffEqBase. allowedkeywords, setups[k])
606
618
607
619
for j in 1 : M
608
620
sol = solve (prob, setups[k][:alg ], ensemblealg;
609
621
filtered_setup... ,
610
- abstol = _abstols[j],
611
- reltol = _reltols[j],
612
- dt = _dts[j],
622
+ abstol = _abstols[k][ j],
623
+ reltol = _reltols[k][ j],
624
+ dt = _dts[k][ j],
613
625
timeseries_errors = false ,
614
626
dense_errors = false ,
615
627
trajectories = Int (trajectories), kwargs... )
@@ -648,16 +660,13 @@ function WorkPrecisionSet(prob::AbstractEnsembleProblem, abstols, reltols, setup
648
660
for k in 1 : N
649
661
# precompile
650
662
GC. gc ()
651
- _abstols = get (setups[k], :abstols , abstols)
652
- _reltols = get (setups[k], :reltols , reltols)
653
- _dts = get (setups[k], :dts , zeros (length (_abstols)))
654
663
filtered_setup = filter (p -> p. first in DiffEqBase. allowedkeywords, setups[k])
655
664
656
665
_sol = solve (prob, setups[k][:alg ], ensemblealg;
657
666
filtered_setup... ,
658
- abstol = _abstols[1 ],
659
- reltol = _reltols[1 ],
660
- dt = _dts[1 ],
667
+ abstol = _abstols[k][ 1 ],
668
+ reltol = _reltols[k][ 1 ],
669
+ dt = _dts[k][ 1 ],
661
670
timeseries_errors = false ,
662
671
dense_errors = false ,
663
672
trajectories = Int (trajectories), kwargs... )
@@ -667,9 +676,9 @@ function WorkPrecisionSet(prob::AbstractEnsembleProblem, abstols, reltols, setup
667
676
for i in 1 : numruns
668
677
time_tmp[i] = @elapsed sol = solve (prob, setups[k][:alg ], ensemblealg;
669
678
filtered_setup... ,
670
- abstol = _abstols[j],
671
- reltol = _reltols[j],
672
- dt = _dts[j],
679
+ abstol = _abstols[k][ j],
680
+ reltol = _reltols[k][ j],
681
+ dt = _dts[k][ j],
673
682
timeseries_errors = false ,
674
683
dense_errors = false ,
675
684
trajectories = Int (trajectories),
@@ -679,8 +688,8 @@ function WorkPrecisionSet(prob::AbstractEnsembleProblem, abstols, reltols, setup
679
688
GC. gc ()
680
689
end
681
690
end
682
-
683
- wps = [WorkPrecision (prob, abstols, reltols , errors[i], times[:, i], names[i], N)
691
+ stats = nothing
692
+ wps = [WorkPrecision (prob, _abstols[i], _reltols[i] , errors[i], times[:, i], _dts[i], stats , names[i], N)
684
693
for i in 1 : N]
685
694
WorkPrecisionSet (wps, N, abstols, reltols, prob, setups, names, error_estimate,
686
695
Int (trajectories))
0 commit comments