Initial and final affect for timed periodic event in ModelingToolkeit

Hi everyone,

I am working on an adapter for virtual commissioning using ModelingToolkit.jl. More specifically, I use discrete callbacks (timed → periodic) to read inputs from and write output to a soft-controller. Is there a way to set the initial_affect and the final_affect arguments from DiffEqCallbacks.jl using ModelingToolkit.jl? Here is my MWE:

using ModelingToolkit, DifferentialEquations
using ModelingToolkit: t_nounits as t, D_nounits as D

function affect!(integ, u, p, ctx)
    println("Time: $(integ.t)")    
end

@mtkmodel SimpleSystem begin
    @parameters begin
        m = 1.0
    end
    @variables begin
        y(t) = 0.0
    end
    @equations begin
        D(y) ~ m
    end
    @discrete_events begin
        1 => (affect!,[],[],[],nothing)
    end
end

@mtkbuild sys = SimpleSystem()
prob = ODEProblem(sys, Pair[], (0, 10.0))
sol = solve(prob)

If you run this code the event will not be triggered for t = 0.0 nor 10.0. If explicitly add additional events like this:

    @discrete_events begin
        [0,10] => (affect!,[],[],[],nothing)
        1 => (affect!,[],[],[],nothing)
    end

both events will be called twise. I guess this is related to the solver starting at some \Delta t in the first case (and thus overstepping 0.0) and being forced to start with 0.0 in the second case. Is there currently a way arround this behavior in ModelingToolkit.jl?

Can you open an issue? There’s explicit handling in events for DiffEq for initial and final, but I’m not sure we’ve made those into options with MTK yet.

Ok, I will.

Done! Thanks, Chris!