|
235 | 235 | g₁ .*= 3 |
236 | 236 | ΔgMax = max.(internalnorm.(g₀ .- g₁, t), internalnorm.(g₀ .+ g₁, t)) |
237 | 237 | d₂ = internalnorm( |
238 | | - max.(internalnorm.(f₁ .- f₀ .+ ΔgMax, t), |
239 | | - internalnorm.(f₁ .- f₀ .- ΔgMax, t)) ./ sk, |
| 238 | + max.( |
| 239 | + internalnorm.(f₁ .- f₀ .+ ΔgMax, t), |
| 240 | + internalnorm.(f₁ .- f₀ .- ΔgMax, t) |
| 241 | + ) ./ sk, |
240 | 242 | t |
241 | 243 | ) / dt₀ |
242 | 244 | # Hairer has d₂ = sqrt(sum(abs2,tmp))/dt₀, note the lack of norm correction |
|
300 | 302 | end |
301 | 303 | end |
302 | 304 | else |
303 | | - for i in eachindex(u0) |
304 | | - atol_i = abstol isa Number ? abstol : abstol[i] |
305 | | - rtol_i = reltol isa Number ? reltol : reltol[i] |
306 | | - tol_i = rtol_i * internalnorm(u0[i], t) + atol_i |
307 | | - denom = convert(_tType, 0.1) * internalnorm(u0[i], t) + tol_i |
308 | | - numer = internalnorm(f₀[i], t) * oneunit_tType |
309 | | - if denom > 0 |
310 | | - hub_inv = max(hub_inv, numer / denom) |
311 | | - end |
312 | | - end |
| 305 | + u0_norms = internalnorm.(u0, t) |
| 306 | + f₀_norms = internalnorm.(f₀, t) |
| 307 | + tols = @.. broadcast = false reltol * u0_norms + abstol |
| 308 | + denoms = @.. broadcast = false convert(_tType, 0.1) * u0_norms + tols |
| 309 | + numers = @.. broadcast = false f₀_norms * oneunit_tType |
| 310 | + hub_inv_vals = ifelse.(denoms .> 0, numers ./ denoms, zero(_tType)) |
| 311 | + hub_inv = maximum(hub_inv_vals) |
313 | 312 | end |
314 | 313 |
|
315 | 314 | hub = convert(_tType, 0.1) * tdist |
316 | 315 | if hub * hub_inv > 1 |
317 | 316 | hub = oneunit_tType / hub_inv |
318 | 317 | end |
319 | | - hub = min(hub, dtmax_tdir) |
| 318 | + hub = min(hub, abs(dtmax_tdir)) |
320 | 319 |
|
321 | 320 | if hub < hlb |
322 | 321 | return tdir * max(dtmin, sqrt(hlb * hub)) |
|
361 | 360 | end |
362 | 361 | end |
363 | 362 | else |
364 | | - for i in eachindex(f₁) |
365 | | - if !isfinite(f₁[i]) |
366 | | - ydd_ok = false |
367 | | - break |
368 | | - end |
369 | | - end |
| 363 | + ydd_ok = !any(x -> any(!isfinite, x), f₁) |
370 | 364 | end |
371 | 365 |
|
372 | 366 | if ydd_ok |
|
397 | 391 |
|
398 | 392 | # Order-dependent step proposal: h ~ (2/yddnrm)^(1/(p+1)) |
399 | 393 | if DiffEqBase.value(yddnrm) * |
400 | | - DiffEqBase.value(hub / oneunit_tType)^(p_order + 1) > 2 |
| 394 | + DiffEqBase.value(hub / oneunit_tType)^(p_order + 1) > 2 |
401 | 395 | hnew = convert( |
402 | 396 | _tType, |
403 | 397 | oneunit_tType * DiffEqBase.value( |
|
424 | 418 | h0 = convert(_tType, 0.5) * hnew |
425 | 419 | h0 = clamp(h0, hlb, hub) |
426 | 420 |
|
427 | | - return tdir * max(dtmin, min(h0, dtmax_tdir)) |
| 421 | + return tdir * max(dtmin, min(h0, abs(dtmax_tdir))) |
428 | 422 | end |
429 | 423 | end |
430 | 424 |
|
|
539 | 533 | g₁ = 3g(u₁, p, t + dt₀_tdir) |
540 | 534 | ΔgMax = max.(internalnorm.(g₀ .- g₁, t), internalnorm.(g₀ .+ g₁, t)) |
541 | 535 | d₂ = internalnorm( |
542 | | - max.(internalnorm.(f₁ .- f₀ .+ ΔgMax, t), |
543 | | - internalnorm.(f₁ .- f₀ .- ΔgMax, t)) ./ sk, |
| 536 | + max.( |
| 537 | + internalnorm.(f₁ .- f₀ .+ ΔgMax, t), |
| 538 | + internalnorm.(f₁ .- f₀ .- ΔgMax, t) |
| 539 | + ) ./ sk, |
544 | 540 | t |
545 | 541 | ) / dt₀ |
546 | 542 |
|
@@ -579,23 +575,19 @@ end |
579 | 575 | hlb = convert(_tType, 100 * eps_tType * oneunit_tType) |
580 | 576 |
|
581 | 577 | # Upper bound: most restrictive component of |f₀| / (0.1*|u0| + tol) |
582 | | - hub_inv = zero(_tType) |
583 | | - for i in eachindex(u0) |
584 | | - atol_i = abstol isa Number ? abstol : abstol[i] |
585 | | - rtol_i = reltol isa Number ? reltol : reltol[i] |
586 | | - tol_i = rtol_i * internalnorm(u0[i], t) + atol_i |
587 | | - denom = convert(_tType, 0.1) * internalnorm(u0[i], t) + tol_i |
588 | | - numer = internalnorm(f₀[i], t) * oneunit_tType |
589 | | - if denom > 0 |
590 | | - hub_inv = max(hub_inv, numer / denom) |
591 | | - end |
592 | | - end |
| 578 | + u0_norms = internalnorm.(u0, t) |
| 579 | + f₀_norms = internalnorm.(f₀, t) |
| 580 | + tols = @.. broadcast = false reltol * u0_norms + abstol |
| 581 | + denoms = @.. broadcast = false convert(_tType, 0.1) * u0_norms + tols |
| 582 | + numers = @.. broadcast = false f₀_norms * oneunit_tType |
| 583 | + hub_inv_vals = ifelse.(denoms .> 0, numers ./ denoms, zero(_tType)) |
| 584 | + hub_inv = maximum(hub_inv_vals) |
593 | 585 |
|
594 | 586 | hub = convert(_tType, 0.1) * tdist |
595 | 587 | if hub * hub_inv > 1 |
596 | 588 | hub = oneunit_tType / hub_inv |
597 | 589 | end |
598 | | - hub = min(hub, dtmax_tdir) |
| 590 | + hub = min(hub, abs(dtmax_tdir)) |
599 | 591 |
|
600 | 592 | if hub < hlb |
601 | 593 | return tdir * max(dtmin, sqrt(hlb * hub)) |
@@ -633,11 +625,12 @@ end |
633 | 625 |
|
634 | 626 | # Second derivative estimate |
635 | 627 | yddnrm = internalnorm( |
636 | | - (f₁ .- f₀) ./ sk .* oneunit_tType, t) / hg * oneunit_tType |
| 628 | + (f₁ .- f₀) ./ sk .* oneunit_tType, t |
| 629 | + ) / hg * oneunit_tType |
637 | 630 |
|
638 | 631 | # Order-dependent step proposal: h ~ (2/yddnrm)^(1/(p+1)) |
639 | 632 | if DiffEqBase.value(yddnrm) * |
640 | | - DiffEqBase.value(hub / oneunit_tType)^(p_order + 1) > 2 |
| 633 | + DiffEqBase.value(hub / oneunit_tType)^(p_order + 1) > 2 |
641 | 634 | hnew = convert( |
642 | 635 | _tType, |
643 | 636 | oneunit_tType * DiffEqBase.value( |
|
664 | 657 | h0 = convert(_tType, 0.5) * hnew |
665 | 658 | h0 = clamp(h0, hlb, hub) |
666 | 659 |
|
667 | | - return tdir * max(dtmin, min(h0, dtmax_tdir)) |
| 660 | + return tdir * max(dtmin, min(h0, abs(dtmax_tdir))) |
668 | 661 | end |
669 | 662 | end |
670 | 663 |
|
|
0 commit comments