@@ -156,20 +156,20 @@ function (f::ODEToExpr)(O::Operation)
156
156
isempty (O. args) && return O. op. name # 0-ary parameters
157
157
return build_expr (:call , Any[O. op. name; f .(O. args)])
158
158
end
159
- return build_expr (:call , Any[O. op; f .(O. args)])
159
+ return build_expr (:call , Any[Symbol ( O. op) ; f .(O. args)])
160
160
end
161
161
(f:: ODEToExpr )(x) = convert (Expr, x)
162
162
163
- function generate_jacobian (sys:: ODESystem , dvs = sys. dvs, ps = sys. ps)
163
+ function generate_jacobian (sys:: ODESystem , dvs = sys. dvs, ps = sys. ps, expression = Val{ true } )
164
164
jac = calculate_jacobian (sys)
165
- return build_function (jac, dvs, ps, (sys. iv. name,), ODEToExpr (sys))
165
+ return build_function (jac, dvs, ps, (sys. iv. name,), ODEToExpr (sys), expression )
166
166
end
167
167
168
- function generate_function (sys:: ODESystem , dvs = sys. dvs, ps = sys. ps)
168
+ function generate_function (sys:: ODESystem , dvs = sys. dvs, ps = sys. ps, expression = Val{ true } )
169
169
rhss = [deq. rhs for deq ∈ sys. eqs]
170
170
dvs′ = [clean (dv) for dv ∈ dvs]
171
171
ps′ = [clean (p) for p ∈ ps]
172
- return build_function (rhss, dvs′, ps′, (sys. iv. name,), ODEToExpr (sys))
172
+ return build_function (rhss, dvs′, ps′, (sys. iv. name,), ODEToExpr (sys), expression )
173
173
end
174
174
175
175
function calculate_factorized_W (sys:: ODESystem , simplify= true )
@@ -196,16 +196,16 @@ function calculate_factorized_W(sys::ODESystem, simplify=true)
196
196
(Wfact,Wfact_t)
197
197
end
198
198
199
- function generate_factorized_W (sys:: ODESystem , vs = sys. dvs, ps = sys. ps, simplify= true )
199
+ function generate_factorized_W (sys:: ODESystem , vs = sys. dvs, ps = sys. ps, simplify= true , expression = Val{ true } )
200
200
(Wfact,Wfact_t) = calculate_factorized_W (sys,simplify)
201
201
siz = size (Wfact)
202
202
constructor = :(x -> begin
203
203
A = SMatrix {$siz...} (x)
204
204
StaticArrays. LU (LowerTriangular ( SMatrix {$siz...} (UnitLowerTriangular (A)) ), UpperTriangular (A), SVector (ntuple (n-> n, max ($ siz... ))))
205
205
end )
206
206
207
- Wfact_func = build_function (Wfact , vs, ps, (:gam ,:t ), ODEToExpr (sys);constructor= constructor)
208
- Wfact_t_func = build_function (Wfact_t, vs, ps, (:gam ,:t ), ODEToExpr (sys);constructor= constructor)
207
+ Wfact_func = build_function (Wfact , vs, ps, (:gam ,:t ), ODEToExpr (sys), expression ;constructor= constructor)
208
+ Wfact_t_func = build_function (Wfact_t, vs, ps, (:gam ,:t ), ODEToExpr (sys), expression ;constructor= constructor)
209
209
210
210
return (Wfact_func, Wfact_t_func)
211
211
end
@@ -217,53 +217,37 @@ Create an `ODEFunction` from the [`ODESystem`](@ref). The arguments `dvs` and `p
217
217
are used to set the order of the dependent variable and parameter vectors,
218
218
respectively.
219
219
"""
220
- function DiffEqBase. ODEFunction {iip} (sys:: ODESystem , dvs, ps,
221
- safe = Val{true };
220
+ function DiffEqBase. ODEFunction {iip} (sys:: ODESystem , dvs, ps;
222
221
version = nothing ,
223
222
jac = false , Wfact = false ) where {iip}
224
- _f = eval (generate_function (sys, dvs, ps))
225
- out_f_safe (u,p,t) = ModelingToolkit. fast_invokelatest (_f,typeof (u),u,p,t)
226
- out_f_safe (du,u,p,t) = ModelingToolkit. fast_invokelatest (_f,Nothing,du,u,p,t)
227
- out_f (u,p,t) = _f (u,p,t)
228
- out_f (du,u,p,t) = _f (du,u,p,t)
223
+ f_oop,f_iip = generate_function (sys, dvs, ps, Val{false })
224
+
225
+ f (u,p,t) = f_oop (u,p,t)
226
+ f (du,u,p,t) = f_iip (du,u,p,t)
229
227
230
228
if jac
231
- _jac = eval (generate_jacobian (sys, dvs, ps))
232
- jac_f_safe (u,p,t) = ModelingToolkit. fast_invokelatest (_jac,Matrix{eltype (u)},u,p,t)
233
- jac_f_safe (J,u,p,t) = ModelingToolkit. fast_invokelatest (_jac,Nothing,J,u,p,t)
234
- jac_f (u,p,t) = _jac (u,p,t)
235
- jac_f (J,u,p,t) = _jac (J,u,p,t)
229
+ jac_oop,jac_iip = generate_jacobian (sys, dvs, ps, Val{false })
230
+ _jac (u,p,t) = jac_oop (u,p,t)
231
+ _jac (J,u,p,t) = jac_iip (J,u,p,t)
236
232
else
237
- jac_f_safe = nothing
238
- jac_f = nothing
233
+ _jac = nothing
239
234
end
240
235
241
236
if Wfact
242
- _Wfact,_Wfact_t = eval .(generate_factorized_W (sys, dvs, ps))
243
- Wfact_f_safe (u,p,gam,t) = ModelingToolkit. fast_invokelatest (_Wfact,Matrix{eltype (u)},u,p,gam,t)
244
- Wfact_f_safe (J,u,p,gam,t) = ModelingToolkit. fast_invokelatest (_Wfact,Nothing,J,u,p,gam,t)
245
- Wfact_f_t_safe (u,p,gam,t) = ModelingToolkit. fast_invokelatest (_Wfact_t,Matrix{eltype (u)},u,p,gam,t)
246
- Wfact_f_t_safe (J,u,p,gam,t) = ModelingToolkit. fast_invokelatest (_Wfact_t,Nothing,J,u,p,gam,t)
247
- Wfact_f (u,p,gam,t) = _Wfact (u,p,gam,t)
248
- Wfact_f (J,u,p,gam,t) = _Wfact (J,u,p,gam,t)
249
- Wfact_f_t (u,p,gam,t) = _Wfact_t (u,p,gam,t)
250
- Wfact_f_t (J,u,p,gam,t) = _Wfact_t (J,u,p,gam,t)
237
+ tmp_Wfact,tmp_Wfact_t = generate_factorized_W (sys, dvs, ps, Val{false })
238
+ Wfact_oop, Wfact_iip = tmp_Wfact
239
+ Wfact_oop_t, Wfact_iip_t = tmp_Wfact_t
240
+ _Wfact (u,p,t) = Wfact_oop (u,p,t)
241
+ _Wfact (W,u,p,t) = Wfact_iip (W,u,p,t)
242
+ _Wfact_t (u,p,t) = Wfact_oop_t (u,p,t)
243
+ _Wfact_t (W,u,p,t) = Wfact_iip_t (W,u,p,t)
251
244
else
252
- Wfact_f_safe = nothing
253
- Wfact_f_t_safe = nothing
254
- Wfact_f = nothing
255
- Wfact_f_t = nothing
245
+ _Wfact,_Wfact_t = nothing ,nothing
256
246
end
257
247
258
- if safe === Val{true }
259
- ODEFunction {iip} (out_f_safe,jac= jac_f_safe,
260
- Wfact = Wfact_f_safe,
261
- Wfact_t = Wfact_f_t_safe)
262
- else
263
- ODEFunction {iip} (out_f,jac= jac_f,
264
- Wfact = Wfact_f,
265
- Wfact_t = Wfact_f_t)
266
- end
248
+ ODEFunction {iip} (f,jac= _jac,
249
+ Wfact = _Wfact,
250
+ Wfact_t = _Wfact_t)
267
251
end
268
252
269
253
function DiffEqBase. ODEFunction (sys:: ODESystem , args... ; kwargs... )
0 commit comments