Skip to content

Commit aa534fb

Browse files
Try to ensure that the types are matching in the controller and error estimator.
1 parent 8946f6a commit aa534fb

File tree

4 files changed

+21
-17
lines changed

4 files changed

+21
-17
lines changed

lib/OrdinaryDiffEqCore/src/alg_utils.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -380,9 +380,10 @@ function default_controller_v7(QT, alg)
380380
end
381381

382382
function default_controller_v7(QT, alg::OrdinaryDiffEqCompositeAlgorithm)
383-
beta2 = convert(QT, beta2_default(alg.algs[1]))
384-
beta1 = convert(QT, beta1_default(alg.algs[1], beta2))
385-
return PIController(beta1, beta2)
383+
return nothing # This forces a fall-back to the legacy implementation
384+
# beta2 = convert(QT, beta2_default(alg.algs[1]))
385+
# beta1 = convert(QT, beta1_default(alg.algs[1], beta2))
386+
# return PIController(beta1, beta2)
386387
# TODO Uncomment this code below to when removing the legacy controllers on OrdinaryDiffEq v7.
387388
# return CompositeController(
388389
# __default_controller_v7(QT, alg.algs)

lib/OrdinaryDiffEqCore/src/integrators/controllers.jl

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,10 @@ end
8989
end
9090

9191
reset_alg_dependent_opts!(controller::AbstractController, alg1, alg2) = nothing
92+
reset_alg_dependent_opts!(controller::AbstractControllerCache, alg1, alg2) = nothing
9293

9394
SciMLBase.reinit!(integrator::ODEIntegrator, controller::AbstractController) = nothing
95+
SciMLBase.reinit!(integrator::ODEIntegrator, controller::AbstractControllerCache) = nothing
9496

9597
function post_newton_controller!(integrator, alg)
9698
return post_newton_controller!(integrator, integrator.opts.controller, alg)
@@ -321,13 +323,15 @@ function step_reject_controller!(integrator, controller::PIController, alg)
321323
return integrator.dt /= min(inv(qmin), q11 / gamma)
322324
end
323325

324-
function reset_alg_dependent_opts!(controller::PIController, alg1, alg2)
325-
if controller.beta2 == beta2_default(alg1)
326-
controller.beta2 = beta2_default(alg2)
326+
function reset_alg_dependent_opts!(controller::PIController{QT}, alg1, alg2) where {QT}
327+
# These guards here prevent potentially that user-defined betas get overridden.
328+
if controller.beta2 == QT(beta2_default(alg1))
329+
controller.beta2 = QT(beta2_default(alg2))
327330
end
328-
return if controller.beta1 == beta1_default(alg1, controller.beta2)
329-
controller.beta1 = beta1_default(alg2, controller.beta2)
331+
if controller.beta1 == QT(beta1_default(alg1, controller.beta2))
332+
controller.beta1 = QT(beta1_default(alg2, controller.beta2))
330333
end
334+
return nothing
331335
end
332336

333337
struct NewPIController{T} <: AbstractController

lib/OrdinaryDiffEqCore/src/perform_step/composite_perform_step.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,4 +298,3 @@ end
298298
# Example: send the history variables from one multistep method to another
299299

300300
transfer_cache!(integrator, alg1, alg2) = nothing
301-
reset_alg_dependent_opts!(::Union{AbstractController, AbstractControllerCache}, alg1, alg2) = nothing

lib/OrdinaryDiffEqCore/src/solve.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -487,14 +487,6 @@ function SciMLBase.__init(
487487
end
488488

489489
QT = determine_controller_datatype(u, internalnorm, tspan)
490-
EEstT = if tTypeNoUnits <: Integer
491-
typeof(qmin)
492-
elseif prob isa SciMLBase.AbstractDiscreteProblem
493-
# The QT fields are not used for DiscreteProblems
494-
constvalue(tTypeNoUnits)
495-
else
496-
typeof(internalnorm(u, t))
497-
end
498490

499491
# The following code provides an upgrade path for users by preserving the old behavior.
500492
legacy_controller_parameters = (gamma, qmin, qmax, qsteady_min, qsteady_max, beta1, beta2, qoldinit)
@@ -517,6 +509,14 @@ function SciMLBase.__init(
517509
qoldinit = hasfield(typeof(controller), :qoldinit) ? controller.qoldinit : (anyadaptive(alg) ? 1 // 10^4 : 0)
518510
end
519511

512+
EEstT = if tTypeNoUnits <: Integer
513+
promote_type(typeof(qmin), typeof(qmax))
514+
elseif prob isa SciMLBase.AbstractDiscreteProblem
515+
constvalue(tTypeNoUnits)
516+
else
517+
typeof(internalnorm(u, t))
518+
end
519+
520520
atmp = if hasfield(typeof(cache), :atmp)
521521
cache.atmp
522522
else

0 commit comments

Comments
 (0)