Skip to content

Commit cc44986

Browse files
committed
Implementation qss
1 parent 8c4b57c commit cc44986

5 files changed

Lines changed: 94 additions & 76 deletions

File tree

src/SimJulia.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,10 @@ module SimJulia
2828
export Coroutine, @coroutine
2929
export Container, Resource, Store
3030
export Put, Get, Request, Release, cancel, capacity, request, @request
31-
export Continuous, Variable
31+
export Continuous, Variable, ZeroCrossing
3232
export @model, @continuous
33+
export QSS
34+
export non_stiff, stiff
3335

3436
include("base.jl")
3537
include("events.jl")
@@ -47,8 +49,6 @@ module SimJulia
4749
include("resources/stores.jl")
4850
include("odes/base.jl")
4951
include("odes/macros.jl")
50-
include("odes/QSS.jl")
5152
include("continuous.jl")
52-
include("odes/utils.jl")
53-
include("odes/commons.jl")
53+
include("odes/QSS.jl")
5454
end

src/continuous.jl

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,40 @@ mutable struct Variable <: AbstractEvent
44
f :: Function
55
x :: Taylor1
66
t :: Float64
7-
function Variable(env::Environment, id::Int, f::Vector{Function}, x₀::Taylor1)
8-
new(BaseEvent(env), UInt(id), f[id], x₀, now(env))
7+
function Variable(env::Environment, id::Int)
8+
new(BaseEvent(env), UInt(id))
99
end
1010
end
1111

12+
function advance_time(var::Variable, t::Float64)
13+
x = var.x
14+
Δt = t - var.t
15+
var.x = evaluate(x, Δt + Taylor1(x.order))
16+
var.t = t
17+
var.x.coeffs[1]
18+
end
19+
20+
struct ZeroCrossing <: AbstractEvent
21+
22+
end
23+
1224
struct Continuous <: AbstractProcess
1325
bev :: BaseEvent
1426
vars :: Vector{Variable}
1527
p :: Vector{Float64}
16-
function Continuous(model::Function, env::Environment, x₀::Vector{Float64}, p::Vector{Float64}=Float64[]; integrator::Integrator=QSS())
17-
cont = new(BaseEvent(env), Vector{Variable}(), p)
18-
init(env, cont, integrator, model, x₀)
19-
cont
28+
zcs :: Vector{ZeroCrossing}
29+
function Continuous(env::Environment, p::Vector{Float64})
30+
new(BaseEvent(env), Vector{Variable}(), p, Vector{ZeroCrossing}())
31+
end
32+
end
33+
34+
function Continuous{I<:Integrator}(model::Function, ::Type{I}, env::Environment, x₀::Vector{Float64}, p::Vector{Float64}=Float64[]; args...)
35+
cont = Continuous(env, p)
36+
for i in 1:length(x₀)
37+
push!(cont.vars, Variable(env, i))
2038
end
39+
I(model, cont, now(env), x₀; args...)
40+
cont
2141
end
2242

2343
macro continuous(expr::Expr)

src/odes/QSS.jl

Lines changed: 64 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,71 @@
1-
abstract type Quantizer end
1+
@enum ODE_TYPE non_stiff=0 stiff=1
22

3-
struct DirectQuantizer <: Quantizer end
4-
5-
struct ImplicitQuantizer <: Quantizer end
6-
7-
struct QSS <: Integrator
3+
struct QSS{T} <: Integrator
84
order :: UInt8
95
deps :: Matrix{Bool}
10-
quantizer :: Quantizer
116
q :: Vector{Taylor1}
127
t :: Vector{Float64}
13-
function QSS(;order::Number=4, stiff::Bool=false)
14-
quantizer = stiff ? ImplicitQuantizer() : DirectQuantizer()
15-
new(UInt8(order), Matrix{Bool}(0, 0), quantizer, Vector{Taylor1}(), Vector{Float64}())
8+
function QSS{T}(model::Function, cont::Continuous, t::Float64, vec_x₀::Vector{Float64}; order::Number=4) where T
9+
f, deps = model()
10+
integrator = new(UInt8(order), deps, Vector{Taylor1}(), Vector{Float64}())
11+
zero_taylor = 0*Taylor1(Float64, integrator.order+1)
12+
for x₀ in vec_x₀
13+
push!(integrator.t, t)
14+
push!(integrator.q, x₀ + zero_taylor)
15+
end
16+
t₀ = t + Taylor1(Float64, integrator.order+1)
17+
vec_x = Vector{Taylor1}()
18+
for (i, x₀) in enumerate(vec_x₀)
19+
push!(vec_x, integrate(f[i](t₀, integrator.q, cont.p), x₀))
20+
end
21+
for i in 1:integrator.order-1
22+
for (j, x) in enumerate(vec_x)
23+
integrator.q[j] = copy(x)
24+
end
25+
for (j, x₀) in enumerate(vec_x₀)
26+
vec_x[j] = integrate(f[j](t₀, integrator.q, cont.p), x₀)
27+
end
28+
end
29+
for (i, x) in enumerate(vec_x)
30+
var = cont.vars[i]
31+
var.f = f[i]
32+
var.x = x
33+
var.t = t
34+
@callback step(var, cont, integrator)
35+
schedule(var)
36+
end
37+
integrator
38+
end
39+
end
40+
41+
function Continuous(model::Function, env::Environment, x₀::Vector{Float64}, p::Vector{Float64}=Float64[]; order::Number=4)
42+
Continuous(model, QSS{non_stiff}, env, x₀, p; order=order)
43+
end
44+
45+
function step(var::Variable, cont::Continuous, integrator::QSS)
46+
i = var.id
47+
env = environment(var)
48+
t = now(env)
49+
x₀ = advance_time(var, t)
50+
update_quantized_state(cont, integrator, i, t)
51+
end
52+
53+
function advance_time(integrator::QSS, i::Int, t::Float64)
54+
q = integrator.q[i]
55+
Δt = t - integrator.t[i]
56+
integrator.q[i] = evaluate(q, Δt + Taylor1(q.order))
57+
integrator.t[i] = t
58+
integrator.q[i].coeffs[1]
59+
end
60+
61+
function update_quantized_state(cont::Continuous, integrator::QSS{non_stiff}, i::UInt, t::Float64)
62+
integrator.q[i] = Taylor1(cont.vars[i].x.coeffs[1:integrator.order])
63+
integrator.t[i] = t
64+
end
65+
66+
function update_quantized_state(cont::Continuous, integrator::QSS{stiff}, i::UInt, t::Float64)
67+
for (j, istrue) in enumerate(integrator.deps[i, :])
68+
istrue && advance_time(integrator, j, t)
1669
end
70+
q₋ = deepcopy(integrator.q)
1771
end

src/odes/commons.jl

Lines changed: 0 additions & 41 deletions
This file was deleted.

src/odes/utils.jl

Lines changed: 0 additions & 15 deletions
This file was deleted.

0 commit comments

Comments
 (0)