@@ -107,60 +107,6 @@ function calculate_massmatrix(sys::AbstractODESystem, simplify=true)
107107 M == I ? I : M
108108end
109109
110- """
111- $(SIGNATURES)
112-
113- Create an `ODEFunction` from the [`ODESystem`](@ref). The arguments `dvs` and `ps`
114- are used to set the order of the dependent variable and parameter vectors,
115- respectively.
116- """
117- function DiffEqBase. ODEFunction {iip} (sys:: AbstractODESystem , dvs = states (sys),
118- ps = parameters (sys);
119- version = nothing , tgrad= false ,
120- jac = false , Wfact = false ) where {iip}
121- f_oop,f_iip = generate_function (sys, dvs, ps, Val{false })
122-
123- f (u,p,t) = f_oop (u,p,t)
124- f (du,u,p,t) = f_iip (du,u,p,t)
125-
126- if tgrad
127- tgrad_oop,tgrad_iip = generate_tgrad (sys, dvs, ps, Val{false })
128- _tgrad (u,p,t) = tgrad_oop (u,p,t)
129- _tgrad (J,u,p,t) = tgrad_iip (J,u,p,t)
130- else
131- _tgrad = nothing
132- end
133-
134- if jac
135- jac_oop,jac_iip = generate_jacobian (sys, dvs, ps, Val{false })
136- _jac (u,p,t) = jac_oop (u,p,t)
137- _jac (J,u,p,t) = jac_iip (J,u,p,t)
138- else
139- _jac = nothing
140- end
141-
142- if Wfact
143- tmp_Wfact,tmp_Wfact_t = generate_factorized_W (sys, dvs, ps, true , Val{false })
144- Wfact_oop, Wfact_iip = tmp_Wfact
145- Wfact_oop_t, Wfact_iip_t = tmp_Wfact_t
146- _Wfact (u,p,dtgamma,t) = Wfact_oop (u,p,dtgamma,t)
147- _Wfact (W,u,p,dtgamma,t) = Wfact_iip (W,u,p,dtgamma,t)
148- _Wfact_t (u,p,dtgamma,t) = Wfact_oop_t (u,p,dtgamma,t)
149- _Wfact_t (W,u,p,dtgamma,t) = Wfact_iip_t (W,u,p,dtgamma,t)
150- else
151- _Wfact,_Wfact_t = nothing ,nothing
152- end
153-
154- M = calculate_massmatrix (sys)
155-
156- ODEFunction {iip} (f,jac= _jac,
157- tgrad = _tgrad,
158- Wfact = _Wfact,
159- Wfact_t = _Wfact_t,
160- mass_matrix = M,
161- syms = Symbol .(sys. dvs))
162- end
163-
164110renamespace (namespace,name) = Symbol (string (namespace)* " ′" * string (name))
165111
166112function DiffEqBase. ODEFunction (sys:: AbstractODESystem , args... ; kwargs... )
@@ -192,6 +138,8 @@ function namespace_operation(O::Operation,name,ivname)
192138end
193139namespace_operation (O:: Constant ,name,ivname) = O
194140
141+
142+
195143independent_variable (sys:: AbstractODESystem ) = sys. iv
196144states (sys:: AbstractODESystem ) = isempty (sys. systems) ? sys. dvs : [sys. dvs;reduce (vcat,namespace_variables .(sys. systems))]
197145parameters (sys:: AbstractODESystem ) = isempty (sys. systems) ? sys. ps : [sys. ps;reduce (vcat,namespace_parameters .(sys. systems))]
@@ -202,12 +150,12 @@ end
202150
203151function states (sys:: AbstractODESystem ,name:: Symbol )
204152 x = sys. dvs[findfirst (x-> x. name== name,sys. dvs)]
205- Variable (Symbol (string (sys. name)* " ′" * string (x. name)),known = x . known )(sys. iv ())
153+ Variable (Symbol (string (sys. name)* " ′" * string (x. name)))(sys. iv ())
206154end
207155
208156function parameters (sys:: AbstractODESystem ,name:: Symbol )
209157 x = sys. ps[findfirst (x-> x. name== name,sys. ps)]
210- Variable (Symbol (string (sys. name)* " ′" * string (x. name)),known = x . known )(sys. iv ())
158+ Variable (Symbol (string (sys. name)* " ′" * string (x. name)))(sys. iv ())
211159end
212160
213161function states (sys:: AbstractODESystem ,args... )
@@ -234,3 +182,77 @@ function _eq_unordered(a, b)
234182 end
235183 return true
236184end
185+
186+ """
187+ $(SIGNATURES)
188+
189+ Create an `ODEFunction` from the [`ODESystem`](@ref). The arguments `dvs` and `ps`
190+ are used to set the order of the dependent variable and parameter vectors,
191+ respectively.
192+ """
193+ function DiffEqBase. ODEFunction {iip} (sys:: AbstractODESystem , dvs = states (sys),
194+ ps = parameters (sys);
195+ version = nothing , tgrad= false ,
196+ jac = false , Wfact = false ) where {iip}
197+ f_oop,f_iip = generate_function (sys, dvs, ps, Val{false })
198+
199+ f (u,p,t) = f_oop (u,p,t)
200+ f (du,u,p,t) = f_iip (du,u,p,t)
201+
202+ if tgrad
203+ tgrad_oop,tgrad_iip = generate_tgrad (sys, dvs, ps, Val{false })
204+ _tgrad (u,p,t) = tgrad_oop (u,p,t)
205+ _tgrad (J,u,p,t) = tgrad_iip (J,u,p,t)
206+ else
207+ _tgrad = nothing
208+ end
209+
210+ if jac
211+ jac_oop,jac_iip = generate_jacobian (sys, dvs, ps, Val{false })
212+ _jac (u,p,t) = jac_oop (u,p,t)
213+ _jac (J,u,p,t) = jac_iip (J,u,p,t)
214+ else
215+ _jac = nothing
216+ end
217+
218+ if Wfact
219+ tmp_Wfact,tmp_Wfact_t = generate_factorized_W (sys, dvs, ps, true , Val{false })
220+ Wfact_oop, Wfact_iip = tmp_Wfact
221+ Wfact_oop_t, Wfact_iip_t = tmp_Wfact_t
222+ _Wfact (u,p,dtgamma,t) = Wfact_oop (u,p,dtgamma,t)
223+ _Wfact (W,u,p,dtgamma,t) = Wfact_iip (W,u,p,dtgamma,t)
224+ _Wfact_t (u,p,dtgamma,t) = Wfact_oop_t (u,p,dtgamma,t)
225+ _Wfact_t (W,u,p,dtgamma,t) = Wfact_iip_t (W,u,p,dtgamma,t)
226+ else
227+ _Wfact,_Wfact_t = nothing ,nothing
228+ end
229+
230+ M = calculate_massmatrix (sys)
231+
232+ ODEFunction {iip} (f,jac= _jac,
233+ tgrad = _tgrad,
234+ Wfact = _Wfact,
235+ Wfact_t = _Wfact_t,
236+ mass_matrix = M,
237+ syms = Symbol .(sys. dvs))
238+ end
239+
240+ function Base. getproperty (sys:: AbstractODESystem , name:: Symbol )
241+ if name ∈ fieldnames (typeof (sys))
242+ return getfield (sys,name)
243+ elseif ! isempty (sys. systems)
244+ i = findfirst (x-> x. name== name,sys. systems)
245+ if i != = nothing
246+ return rename (sys. systems[i],renamespace (sys. name,name))
247+ end
248+ end
249+ i = findfirst (x-> x. name== name,sys. dvs)
250+ if i != = nothing
251+ return rename (sys. dvs[i],renamespace (sys. name,name))(getfield (sys,:iv )())
252+ end
253+ i = findfirst (x-> x. name== name,sys. ps)
254+ if i != = nothing
255+ return rename (sys. ps[i],renamespace (sys. name,name))()
256+ end
257+ throw (error (" Variable name does not exist" ))
258+ end
0 commit comments