11function calculate_tgrad (sys:: AbstractODESystem )
22 isempty (sys. tgrad[]) || return sys. tgrad[] # use cached tgrad, if possible
3- rhs = [detime_dvs (eq. rhs) for eq ∈ sys. eqs ]
3+ rhs = [detime_dvs (eq. rhs) for eq ∈ equations ( sys) ]
44 iv = sys. iv ()
55 notime_tgrad = [expand_derivatives (ModelingToolkit. Differential (iv)(r)) for r in rhs]
6- tgrad = retime_dvs .(notime_tgrad,(sys. dvs ,),iv)
6+ tgrad = retime_dvs .(notime_tgrad,(states ( sys) ,),iv)
77 sys. tgrad[] = tgrad
88 return tgrad
99end
1010
1111function calculate_jacobian (sys:: AbstractODESystem )
1212 isempty (sys. jac[]) || return sys. jac[] # use cached Jacobian, if possible
13- rhs = [eq. rhs for eq ∈ sys. eqs ]
13+ rhs = [eq. rhs for eq ∈ equations ( sys) ]
1414
1515 iv = sys. iv ()
16- dvs = [dv (iv) for dv ∈ sys. dvs ]
16+ dvs = [dv (iv) for dv ∈ states ( sys) ]
1717
1818 jac = expand_derivatives .(calculate_jacobian (rhs, dvs))
1919 sys. jac[] = jac # cache Jacobian
@@ -34,18 +34,18 @@ function (f::ODEToExpr)(O::Operation)
3434end
3535(f:: ODEToExpr )(x) = convert (Expr, x)
3636
37- function generate_tgrad (sys:: AbstractODESystem , dvs = sys. dvs , ps = sys. ps , expression = Val{true }; kwargs... )
37+ function generate_tgrad (sys:: AbstractODESystem , dvs = states ( sys) , ps = parameters ( sys) , expression = Val{true }; kwargs... )
3838 tgrad = calculate_tgrad (sys)
3939 return build_function (tgrad, dvs, ps, (sys. iv. name,), ODEToExpr (sys), expression; kwargs... )
4040end
4141
42- function generate_jacobian (sys:: AbstractODESystem , dvs = sys. dvs , ps = sys. ps , expression = Val{true }; kwargs... )
42+ function generate_jacobian (sys:: AbstractODESystem , dvs = states ( sys) , ps = parameters ( sys) , expression = Val{true }; kwargs... )
4343 jac = calculate_jacobian (sys)
4444 return build_function (jac, dvs, ps, (sys. iv. name,), ODEToExpr (sys), expression; kwargs... )
4545end
4646
47- function generate_function (sys:: AbstractODESystem , dvs = sys. dvs , ps = sys. ps , expression = Val{true }; kwargs... )
48- rhss = [deq. rhs for deq ∈ sys. eqs ]
47+ function generate_function (sys:: AbstractODESystem , dvs = states ( sys) , ps = parameters ( sys) , expression = Val{true }; kwargs... )
48+ rhss = [deq. rhs for deq ∈ equations ( sys) ]
4949 dvs′ = [clean (dv) for dv ∈ dvs]
5050 ps′ = [clean (p) for p ∈ ps]
5151 return build_function (rhss, dvs′, ps′, (sys. iv. name,), ODEToExpr (sys), expression; kwargs... )
@@ -75,7 +75,7 @@ function calculate_factorized_W(sys::AbstractODESystem, simplify=true)
7575 (Wfact,Wfact_t)
7676end
7777
78- function generate_factorized_W (sys:: AbstractODESystem , vs = sys. dvs , ps = sys. ps , simplify= true , expression = Val{true }; kwargs... )
78+ function generate_factorized_W (sys:: AbstractODESystem , vs = states ( sys) , ps = parameters ( sys) , simplify= true , expression = Val{true }; kwargs... )
7979 (Wfact,Wfact_t) = calculate_factorized_W (sys,simplify)
8080 siz = size (Wfact)
8181 constructor = :(x -> begin
@@ -90,13 +90,14 @@ function generate_factorized_W(sys::AbstractODESystem, vs = sys.dvs, ps = sys.ps
9090end
9191
9292function calculate_massmatrix (sys:: AbstractODESystem , simplify= true )
93- eqs = sys. eqs
93+ eqs = equations (sys)
94+ dvs = states (sys)
9495 M = zeros (length (eqs),length (eqs))
9596 for (i,eq) in enumerate (eqs)
9697 if eq. lhs isa Constant
9798 @assert eq. lhs. value == 0
9899 elseif eq. lhs. op isa Differential
99- j = findfirst (x-> isequal (x. name,var_from_nested_derivative (eq. lhs)[1 ]. name),sys . dvs)
100+ j = findfirst (x-> isequal (x. name,var_from_nested_derivative (eq. lhs)[1 ]. name),dvs)
100101 M[i,j] = 1
101102 else
102103 error (" Only semi-explicit mass matrices are currently supported" )
@@ -113,7 +114,8 @@ Create an `ODEFunction` from the [`ODESystem`](@ref). The arguments `dvs` and `p
113114are used to set the order of the dependent variable and parameter vectors,
114115respectively.
115116"""
116- function DiffEqBase. ODEFunction {iip} (sys:: AbstractODESystem , dvs = sys. dvs, ps = sys. ps;
117+ function DiffEqBase. ODEFunction {iip} (sys:: AbstractODESystem , dvs = states (sys),
118+ ps = parameters (sys);
117119 version = nothing , tgrad= false ,
118120 jac = false , Wfact = false ) where {iip}
119121 f_oop,f_iip = generate_function (sys, dvs, ps, Val{false })
@@ -166,14 +168,14 @@ function DiffEqBase.ODEFunction(sys::AbstractODESystem, args...; kwargs...)
166168end
167169
168170function namespace_variables (sys:: AbstractODESystem )
169- [rename (x,renamespace (sys. name,x. name)) for x in sys. dvs ]
171+ [rename (x,renamespace (sys. name,x. name)) for x in states ( sys) ]
170172end
171173
172174function namespace_parameters (sys:: AbstractODESystem )
173- [rename (x,renamespace (sys. name,x. name)) for x in sys. ps ]
175+ [rename (x,renamespace (sys. name,x. name)) for x in parameters ( sys) ]
174176end
175177
176- namespace_equations (sys:: AbstractODESystem ) = namespace_equation .(sys. eqs ,sys. name,sys. iv. name)
178+ namespace_equations (sys:: AbstractODESystem ) = namespace_equation .(equations ( sys) ,sys. name,sys. iv. name)
177179
178180function namespace_equation (eq:: Equation ,name,ivname)
179181 _lhs = namespace_operation (eq. lhs,name,ivname)
@@ -191,11 +193,11 @@ end
191193namespace_operation (O:: Constant ,name,ivname) = O
192194
193195independent_variable (sys:: AbstractODESystem ) = sys. iv
194- states (sys:: AbstractODESystem ) = [sys. dvs;reduce (vcat,namespace_variables .(sys. systems))]
195- parameters (sys:: AbstractODESystem ) = [sys. ps;reduce (vcat,namespace_parameters .(sys. systems))]
196+ states (sys:: AbstractODESystem ) = isempty (sys . systems) ? sys . dvs : [sys. dvs;reduce (vcat,namespace_variables .(sys. systems))]
197+ parameters (sys:: AbstractODESystem ) = isempty (sys . systems) ? sys . ps : [sys. ps;reduce (vcat,namespace_parameters .(sys. systems))]
196198
197199function equations (sys:: AbstractODESystem )
198- [sys. eqs;reduce (vcat,namespace_equations .(sys. systems))]
200+ isempty (sys . systems) ? sys . eqs : [sys. eqs;reduce (vcat,namespace_equations .(sys. systems))]
199201end
200202
201203function states (sys:: AbstractODESystem ,name:: Symbol )
@@ -208,6 +210,18 @@ function parameters(sys::AbstractODESystem,name::Symbol)
208210 Variable (Symbol (string (sys. name)* " ′" * string (x. name)),known= x. known)(sys. iv ())
209211end
210212
213+ function states (sys:: AbstractODESystem ,args... )
214+ name = last (args)
215+ extra_names = reduce (* ,[" ′$(x. name) " for x in args[1 : end - 1 ]])
216+ Variable (Symbol (string (sys. name)* extra_names* " ′" * string (name)))(sys. iv ())
217+ end
218+
219+ function parameters (sys:: AbstractODESystem ,args... )
220+ name = last (args)
221+ extra_names = reduce (* ,[" ′$(x. name) " for x in args[1 : end - 1 ]])
222+ Variable (Symbol (string (sys. name)* extra_names* " ′" * string (name)))(sys. iv ())
223+ end
224+
211225function _eq_unordered (a, b)
212226 length (a) === length (b) || return false
213227 n = length (a)
0 commit comments