Skip to content

Commit c534a06

Browse files
committed
first test is passing
1 parent af11f9d commit c534a06

File tree

2 files changed

+36
-23
lines changed

2 files changed

+36
-23
lines changed

src/systems/callbacks.jl

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,12 @@ function add_integrator_header(out=:u)
151151
expr.body)
152152
end
153153

154+
function condition_header()
155+
integrator = gensym(:MTKIntegrator)
156+
expr -> Func([expr.args[1], expr.args[2],
157+
DestructuredArgs(expr.args[3:end], integrator, inds = [:p])], [], expr.body)
158+
end
159+
154160
"""
155161
compile_condition(cb::SymbolicDiscreteCallback, sys, dvs, ps; expression, kwargs...)
156162
@@ -168,7 +174,7 @@ function compile_condition(cb::SymbolicDiscreteCallback, sys, dvs, ps;
168174
p = map(x -> time_varying_as_func(value(x), sys), ps)
169175
t = get_iv(sys)
170176
condit = condition(cb)
171-
build_function(condit, u, p, t; expression, kwargs...)
177+
build_function(condit, u, t, p; expression, wrap_code = condition_header(), kwargs...)
172178
end
173179

174180
function compile_affect(cb::SymbolicContinuousCallback, args...; kwargs...)
@@ -199,7 +205,6 @@ function compile_affect(eqs::Vector{Equation}, sys, dvs, ps; outputidxs = nothin
199205
end
200206
else
201207
rhss = map(x -> x.rhs, eqs)
202-
203208
outvar = :u
204209
if outputidxs === nothing
205210
lhss = map(x -> x.lhs, eqs)
@@ -332,5 +337,10 @@ function process_events(sys; callback = nothing, has_difference = false, kwargs.
332337
end
333338
difference_cb = has_difference ? generate_difference_cb(sys; kwargs...) : nothing
334339

335-
foldl(merge_cb, (contin_cb, discrete_cb, difference_cb, callback))
340+
cb = CallbackSet(contin_cb, difference_cb, callback, discrete_cb...)
341+
# cb = merge_cb(contin_cb, discrete_cb...)
342+
# cb = merge_cb(cb, difference_cb)
343+
# cb = merge_cb(cb, callback)
344+
# @show typeof(cbs),cbs
345+
cb
336346
end

test/root_equations.jl

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -336,23 +336,26 @@ sys = structural_simplify(model)
336336
@test isempty(ModelingToolkit.continuous_events(sys))
337337

338338

339-
# let
340-
# @parameters k t1 t2
341-
# @variables t A(t)
342-
343-
# cond1 = (t == t1)
344-
# affect1 = [A ~ A + 1]
345-
# cb1 = cond1 => affect1
346-
# cond2 = (t == t2)
347-
# affect2 = [k ~ 1.0]
348-
# cb2 = cond2 => affect2
349-
350-
# ∂ₜ = Differential(t)
351-
# eqs = [∂ₜ(A) ~ -k*A]
352-
# @named osys = ODESystem(eqs, t, discrete_events=[cb1,cb2])
353-
# u0 = [A => 1.0]
354-
# p = [k => 0.0, t1 => 1.0, t2 => 2.0]
355-
# tspan = (0.0, 4.0)
356-
# oprob = ODEProblem(osys, u0, tspan, p)
357-
# sol = solve(oprob, Tsit5())
358-
# end
339+
let
340+
@parameters k t1 t2
341+
@variables t A(t)
342+
343+
cond1 = (t == t1)
344+
affect1 = [A ~ A + 1]
345+
cb1 = cond1 => affect1
346+
cond2 = (t == t2)
347+
affect2 = [k ~ 1.0]
348+
cb2 = cond2 => affect2
349+
350+
∂ₜ = Differential(t)
351+
eqs = [∂ₜ(A) ~ -k*A]
352+
@named osys = ODESystem(eqs, t, [A], [k,t1,t2], discrete_events=[cb1,cb2])
353+
u0 = [A => 1.0]
354+
p = [k => 0.0, t1 => 1.0, t2 => 2.0]
355+
tspan = (0.0, 4.0)
356+
oprob = ODEProblem(osys, u0, tspan, p)
357+
sol = solve(oprob, Tsit5(), tstops=[1.0,2.0]; abstol=1e-10, reltol=1e-10)
358+
@test isapprox(sol(1.0000000001)[1] - sol(.999999999)[1], 1.0; rtol=1e-6)
359+
@test oprob.p[1] == 1.0
360+
@test isapprox(sol(4.0)[1], 2*exp(-2.0))
361+
end

0 commit comments

Comments
 (0)