Skip to content

Commit c332a17

Browse files
safe builder tools
1 parent 8fce9ca commit c332a17

File tree

3 files changed

+37
-28
lines changed

3 files changed

+37
-28
lines changed

src/ModelingToolkit.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,11 @@ include("variables.jl")
8484
include("operations.jl")
8585
include("differentials.jl")
8686
include("equations.jl")
87-
include("systems/diffeqs/diffeqsystem.jl")
88-
include("systems/diffeqs/first_order_transform.jl")
89-
include("systems/nonlinear/nonlinear_system.jl")
9087
include("function_registration.jl")
9188
include("simplify.jl")
9289
include("utils.jl")
90+
include("systems/diffeqs/diffeqsystem.jl")
91+
include("systems/diffeqs/first_order_transform.jl")
92+
include("systems/nonlinear/nonlinear_system.jl")
9393

9494
end # module

src/systems/diffeqs/diffeqsystem.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,3 +221,29 @@ end
221221
function DiffEqBase.ODEFunction(sys::ODESystem, args...; kwargs...)
222222
ODEFunction{true}(sys, args...; kwargs...)
223223
end
224+
225+
"""
226+
$(SIGNATURES)
227+
228+
Generate `ODESystem`, dependent variables, and parameters from an `ODEProblem`.
229+
"""
230+
function modelingtoolkitize(prob::DiffEqBase.ODEProblem)
231+
@parameters t
232+
vars = [Variable(:x, i)(t) for i in eachindex(prob.u0)]
233+
params = [Variable(,i; known = true)() for i in eachindex(prob.p)]
234+
@derivatives D'~t
235+
236+
rhs = [D(var) for var in vars]
237+
238+
if DiffEqBase.isinplace(prob)
239+
lhs = similar(vars, Any)
240+
prob.f(lhs, vars, params, t)
241+
else
242+
lhs = prob.f(vars, params, t)
243+
end
244+
245+
eqs = vcat([rhs[i] ~ lhs[i] for i in eachindex(prob.u0)]...)
246+
de = ODESystem(eqs)
247+
248+
de, vars, params
249+
end

src/utils.jl

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@ function build_function(rhss, vs, ps, args = (), conv = rhs -> convert(Expr, rhs
5151
quote
5252
function $fname($X,u,p,$(args...))
5353
$ip_let_expr
54+
nothing
5455
end
5556
function $fname(u,p,$(args...))
5657
X = $let_expr
57-
T = $(constructor === nothing ? :(u isa StaticArrays.StaticArray ? StaticArrays.similar_type(typeof(u), eltype(X)) : x->(du=similar(u, eltype(X)); du .= x)) : constructor)
58+
T = $(constructor === nothing ? :(u isa ModelingToolkit.StaticArrays.StaticArray ? ModelingToolkit.StaticArrays.similar_type(typeof(u), eltype(X)) : x->(du=similar(u, eltype(X)); du .= x)) : constructor)
5859
T(X)
5960
end
6061
end
@@ -91,28 +92,10 @@ function vars!(vars, O)
9192
return vars
9293
end
9394

94-
"""
95-
$(SIGNATURES)
96-
97-
Generate `ODESystem`, dependent variables, and parameters from an `ODEProblem`.
98-
"""
99-
function modelingtoolkitize(prob::DiffEqBase.ODEProblem)
100-
t, = @parameters t;
101-
vars = [Variable(:x, i)(t) for i in eachindex(prob.u0)]
102-
params = [Variable(,i; known = true)() for i in eachindex(prob.p)]
103-
D, = @derivatives D'~t
104-
105-
rhs = [D(var) for var in vars]
106-
107-
if DiffEqBase.isinplace(prob)
108-
lhs = similar(vars, Any)
109-
prob.f(lhs, vars, params, t)
110-
else
111-
lhs = prob.f(vars, params, t)
112-
end
113-
114-
eqs = vcat([rhs[i] ~ lhs[i] for i in eachindex(prob.u0)]...)
115-
de = ODESystem(eqs)
116-
117-
de, vars, params
95+
@inline @generated function fast_invokelatest(f, ::Type{rt}, args...) where rt
96+
tupargs = Expr(:tuple,args...)
97+
quote
98+
_f = $(Expr(:cfunction, Base.CFunction, :f, rt, :((Core.svec)($args...)), :(:ccall)))
99+
return ccall(_f.ptr,rt,$tupargs,$((:(getindex(args,$i)) for i in 1:length(args))...))
100+
end
118101
end

0 commit comments

Comments
 (0)