Skip to content

Commit

Permalink
Refactor & Generalize: System for opting alg into linear interpolation
Browse files Browse the repository at this point in the history
We haven't really needed this much before since most methods had a special interpolation or default Hermite, so we had a bespoke way of opting just a few algorithms out (FunctionMap and the DAE solvers for now). But there are cases which need to be able to opt into saying they only want a linear interpolation as the Hermite would take extra function evaluations or would not satisfy the right properties, and thus for these equations this gives them an overload they can use to opt out on a per-algorithm basis via a trait function.
  • Loading branch information
ChrisRackauckas committed Dec 17, 2024
1 parent 4b29bab commit 42b98fc
Show file tree
Hide file tree
Showing 2 changed files with 4 additions and 3 deletions.
3 changes: 3 additions & 0 deletions lib/OrdinaryDiffEqCore/src/alg_utils.jl
Original file line number Diff line number Diff line change
Expand Up @@ -444,3 +444,6 @@ function Base.show(io::IO, ::MIME"text/plain", alg::OrdinaryDiffEqAlgorithm)
end
print(io, ")")
end

# Defaults in the current system: currently opt out DAEAlgorithms until complete
default_linear_interpolation(alg, prob) = alg isa DAEAlgorithm || prob isa DiscreteProblem
4 changes: 1 addition & 3 deletions lib/OrdinaryDiffEqCore/src/solve.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,7 @@ function DiffEqBase.__init(
saveat isa Number || prob.tspan[1] in saveat,
save_end = nothing,
callback = nothing,
dense = save_everystep &&
!(alg isa DAEAlgorithm) && !(prob isa DiscreteProblem) &&
isempty(saveat),
dense = save_everystep && isempty(saveat) && !default_linear_interpolation(prob, alg),
calck = (callback !== nothing && callback !== CallbackSet()) ||
(dense) || !isempty(saveat), # and no dense output
dt = isdiscretealg(alg) && isempty(tstops) ?
Expand Down

0 comments on commit 42b98fc

Please sign in to comment.