-
-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathinterpolants.jl
58 lines (51 loc) · 1.84 KB
/
interpolants.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""
constant_extrapolant(t, integrator::DEIntegrator, idxs, deriv)
Calculate constant extrapolation of derivative `deriv` at time `t` and indices `idxs`
for `integrator`.
"""
function constant_extrapolant(t, integrator::DEIntegrator, idxs, deriv)
[constant_extrapolant(τ, integrator, idxs, deriv) for τ in t]
end
function constant_extrapolant(t::Number, integrator::DEIntegrator, idxs, T::Type{Val{0}})
idxs === nothing ? integrator.u : integrator.u[idxs]
end
function constant_extrapolant(t::Number, integrator::DEIntegrator, idxs, T::Type{Val{1}})
idxs === nothing ? zero(integrator.u) ./ oneunit(t) :
zero(integrator.u[idxs]) ./ oneunit(t)
end
"""
constant_extrapolant!(val, t, integrator::DEIntegrator, idxs, deriv)
Calculate constant extrapolation of derivative `deriv` at time `t` and indices `idxs`
for `integrator`, and save result in `val` if `val` is not `nothing`.
"""
function constant_extrapolant!(val, t, integrator::DEIntegrator, idxs, deriv)
[constant_extrapolant!(val, τ, integrator, idxs, deriv) for τ in t]
end
function constant_extrapolant!(val, t::Number, integrator::DEIntegrator, idxs,
T::Type{Val{0}})
if val === nothing
if idxs === nothing
return integrator.u
else
return integrator.u[idxs]
end
elseif idxs === nothing
@. val = integrator.u
else
@views @. val = integrator.u[idxs]
end
end
function constant_extrapolant!(val, t::Number, integrator::DEIntegrator, idxs,
T::Type{Val{1}})
if val === nothing
if idxs === nothing
return zero(integrator.u) ./ oneunit(t)
else
return zero(integrator.u[idxs]) ./ oneunit(t)
end
elseif idxs === nothing
val .= zero(integrator.u) ./ oneunit(t)
else
@views val .= zero(integrator.u[idxs]) ./ oneunit(t)
end
end