Skip to content

Commit cc2beea

Browse files
committed
Update to cope with changes from TalorSeries v0.5
1 parent 0cb464e commit cc2beea

3 files changed

Lines changed: 40 additions & 32 deletions

File tree

src/continuous.jl

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ abstract type ContinuousProcess <: AbstractProcess end
33
mutable struct Variable <: AbstractEvent
44
bev :: BaseEvent
55
id :: UInt
6-
x :: Taylor1
6+
x :: Taylor1{Float64}
77
t :: Float64
8-
function Variable(env::Environment, id::Int, x::Taylor1, t::Float64)
8+
function Variable(env::Environment, id::Int, x::Taylor1{Float64}, t::Float64)
99
new(BaseEvent(env), id, x, t)
1010
end
1111
end
1212

1313
function advance_time(var::Variable, t::Float64=now(environment(var)))
14-
var.x = evaluate(var.x, t - var.t + Taylor1(var.x.order))
14+
var.x = evaluate(var.x, t - var.t + Taylor1(Float64, var.x.order))
1515
var.t = t
1616
var.x[1]
1717
end
@@ -67,9 +67,3 @@ macro continuous(expr::Expr)
6767
end
6868
esc(:(Continuous($func(), $(args...); $(params...))))
6969
end
70-
71-
function schedule(var::Variable, cont::Continuous, integrator::Integrator, Δt::Float64=0.0)
72-
var.bev = BaseEvent(environment(var))
73-
@callback step(var, cont, integrator)
74-
schedule(var, Δt)
75-
end

src/odes/QSS.jl

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,51 +17,52 @@ struct QSS{T} <: Integrator
1717
push!(qss.q, q₀ + Taylor1(zeros(Float64, order+1)))
1818
end
1919
for i in 1:order-1
20+
q = deepcopy(qss.q)
2021
for (j, q₀) in enumerate(x₀)
21-
qss.q[j] = integrate(model.f[j](t₀, qss.q, p), q₀)
22+
qss.q[j] = integrate(model.f[j](t₀, q, p), q₀)
2223
end
2324
end
24-
println(qss.q)
2525
qss
2626
end
2727
end
2828

2929
function Continuous(model::Model, env::Environment, x₀::Vector{Float64}, p::Vector{Float64}=Float64[];
30-
stiff::Bool=false, order::Number=4, Δrel::Float64=1e-6, Δabs::Float64=1e-6)
31-
stiff ? Continuous(model, env, QSS{SimJulia.stiff}, x₀, p; order=order, Δrel=Δrel, Δabs=Δabs) :
32-
Continuous(model, env, QSS{SimJulia.non_stiff}, x₀, p; order=order, Δrel=Δrel, Δabs=Δabs)
30+
stiff::Bool=false, order::Number=4, Δrel::Number=1e-6, Δabs::Number=1e-6)
31+
stiff ? Continuous(model, env, QSS{SimJulia.stiff}, x₀, p; order=order, Δrel=float(Δrel), Δabs=float(Δabs)) :
32+
Continuous(model, env, QSS{SimJulia.non_stiff}, x₀, p; order=order, Δrel=float(Δrel), Δabs=float(Δabs))
3333
end
3434

3535
function initial_values(qss::QSS, t::Float64)
36-
t₀ = t + Taylor1(Float64, qss.order+0)
36+
t₀ = t + Taylor1(Float64, qss.order+1)
3737
x₀ = Vector{Taylor1{Float64}}()
3838
for (i, f) in enumerate(qss.model.f)
3939
push!(x₀, integrate(f(t₀, qss.q, qss.p), qss.q[i][1]))
4040
end
41-
println(x₀)
4241
x₀
4342
end
4443

4544
function step(var::Variable, cont::Continuous, qss::QSS)
4645
t = now(environment(var))
4746
n = length(qss.model.f)
4847
i = var.id
49-
t₀ = t + Taylor1(Float64, qss.order+0)
48+
t₀ = t + Taylor1(Float64, qss.order+1)
5049
x₀ = advance_time(var, t)
51-
update_quantized_state(qss, cont.vars, i, t)
52-
println(x₀)
50+
update_quantized_state(qss, var, t)
5351
Δt = compute_next_time(var.x, max(qss.Δrel*x₀, qss.Δabs))
54-
schedule(var, cont, qss, Δt)
52+
reset(var)
53+
schedule(var, Δt)
5554
for j in filter(j->qss.model.deps[j,i], 1:n)
5655
dep = cont.vars[j]
5756
x₀ = evaluate(dep.x, t - dep.t)
5857
dep.t = t
59-
for k in filter(k->qss.model.deps[j,k], 1:n)
58+
advance_time(qss, j, t)
59+
for k in filter(k->qss.model.deps[j,k] && k!=j, 1:n)
6060
advance_time(qss, k, t)
6161
end
6262
dep.x = integrate(qss.model.f[j](t₀, qss.q, qss.p), x₀)
6363
Δt = recompute_next_time(qss, dep.x, qss.q[j], max(qss.Δrel*x₀, qss.Δabs))
64-
schedule(dep, cont, qss, Δt)
64+
reset(dep)
65+
schedule(dep, Δt)
6566
end
6667
end
6768

@@ -71,8 +72,9 @@ function advance_time(qss::QSS, i::Int, t::Float64)
7172
qss.q[i][1]
7273
end
7374

74-
function update_quantized_state(qss::QSS{non_stiff}, vars::Vector{Variable}, i::UInt, t::Float64)
75-
qss.q[i] = copy(vars[i].x)
75+
function update_quantized_state(qss::QSS{non_stiff}, var::Variable, t::Float64)
76+
i = var.id
77+
qss.q[i] = deepcopy(var.x)
7678
qss.q[i][end] = 0.0
7779
qss.t[i] = t
7880
end
@@ -88,7 +90,7 @@ function compute_next_time(x::Taylor1, Δq::Float64)
8890
(abs(Δq/x[end]))^(1.0/x.order)
8991
end
9092

91-
function recompute_next_time(::QSS{non_stiff}, x::Taylor1, q::Taylor1, Δq::Float64)
93+
function recompute_next_time(::QSS{non_stiff}, x::Taylor1{Float64}, q::Taylor1{Float64}, Δq::Float64)
9294
p = (x-q).coeffs
9395
p[1] -= Δq
9496
neg = roots(p)

test/continuous.jl

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,33 @@
11
using SimJulia
22

3+
@model function simple(t, x, p, dx)
4+
dx[1] = x[1]
5+
end
6+
7+
#sim = Simulation()
8+
#cont = @continuous simple(sim, [1.0]; stiff=false, order=4, Δrel=1e-16, Δabs=1e-6)
9+
#run(sim, 10)
10+
311
@model function diffeq(t, x, p, dx)
412
dx[1] = p[2]+0.01*x[2]
513
dx[2] = p[1]-100.0*x[1]-100.0*x[2]
614
end
715

816
function report(sim::Simulation, cont::Continuous)
17+
λ, P = eig([0.0 0.01; -100.0 -100.0])
918
while true
10-
println(now(sim), " ", evaluate(cont.vars[1]), " ", evaluate(cont.vars[2]))
19+
t = now(sim)
20+
xs = [evaluate(cont.vars[1]), evaluate(cont.vars[2])]
21+
xe = P*diagm(exp.(λ*t))*inv(P)*[0.0; 20.0]+P*diagm((exp.(λ*t)-1)./λ)*inv(P)*[0.0;2020.0]
22+
println(t, " ", xs[1], " ", abs(xe[1]-xs[1]), " ", xs[2], " ", abs(xe[2]-xs[2]))
1123
yield(Timeout(sim, 1.0))
1224
end
1325
end
1426

1527
sim = Simulation()
16-
cont = @continuous diffeq(sim, [0.0, 20.0], [2020.0, 0.0]; stiff=false, order=4)
28+
cont = @continuous diffeq(sim, [0.0, 20.0], [2020.0, 0.0]; stiff=false, order=4, Δrel=1e-16, Δabs=1e-6)
1729
@process report(sim, cont)
18-
run(sim, 71)
30+
@time run(sim, 500)
1931

2032
@model function bouncing_ball(t, x, p, dx)
2133
g = 9.81
@@ -32,7 +44,7 @@ run(sim, 71)
3244
dx[2] = -g - p[1]*f/m
3345
end
3446

35-
sim = Simulation()
36-
cont = @continuous bouncing_ball(sim, [2.0, 0.0], [0.0])
37-
@process report(sim, cont)
38-
run(sim, 5)
47+
#sim = Simulation()
48+
#cont = @continuous bouncing_ball(sim, [2.0, 0.0], [0.0])
49+
#@process report(sim, cont)
50+
#run(sim, 5)

0 commit comments

Comments
 (0)