@@ -199,6 +199,13 @@ variable and parameter vectors, respectively.
199
199
"""
200
200
struct ODEFunctionExpr{iip} end
201
201
202
+ struct ODEFunctionClosure{O, I} <: Function
203
+ f_oop:: O
204
+ f_iip:: I
205
+ end
206
+ (f:: ODEFunctionClosure )(u, p, t) = f. f_oop (u, p, t)
207
+ (f:: ODEFunctionClosure )(du, u, p, t) = f. f_iip (du, u, p, t)
208
+
202
209
function ODEFunctionExpr {iip} (sys:: AbstractODESystem , dvs = states (sys),
203
210
ps = parameters (sys), u0 = nothing ;
204
211
version = nothing , tgrad= false ,
@@ -209,20 +216,13 @@ function ODEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys),
209
216
210
217
f_oop, f_iip = generate_function (sys, dvs, ps; expression= Val{true }, kwargs... )
211
218
fsym = gensym (:f )
212
- _f = quote
213
- $ fsym (u,p,t) = $ f_oop (u,p,t)
214
- $ fsym (du,u,p,t) = $ f_iip (du,u,p,t)
215
- end
216
-
219
+ _f = :($ fsym = ModelingToolkit. ODEFunctionClosure ($ f_oop, $ f_iip))
217
220
tgradsym = gensym (:tgrad )
218
221
if tgrad
219
222
tgrad_oop, tgrad_iip = generate_tgrad (sys, dvs, ps;
220
223
simplify= simplify,
221
224
expression= Val{true }, kwargs... )
222
- _tgrad = quote
223
- $ tgradsym (u,p,t) = $ tgrad_oop (u,p,t)
224
- $ tgradsym (J,u,p,t) = $ tgrad_iip (J,u,p,t)
225
- end
225
+ _tgrad = :($ tgradsym = ModelingToolkit. ODEFunctionClosure ($ tgrad_oop, $ tgrad_iip))
226
226
else
227
227
_tgrad = :($ tgradsym = nothing )
228
228
end
@@ -232,10 +232,7 @@ function ODEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys),
232
232
jac_oop,jac_iip = generate_jacobian (sys, dvs, ps;
233
233
sparse= sparse, simplify= simplify,
234
234
expression= Val{true }, kwargs... )
235
- _jac = quote
236
- $ jacsym (u,p,t) = $ jac_oop (u,p,t)
237
- $ jacsym (J,u,p,t) = $ jac_iip (J,u,p,t)
238
- end
235
+ _jac = :($ jacsym = ModelingToolkit. ODEFunctionClosure ($ jac_oop, $ jac_iip))
239
236
else
240
237
_jac = :($ jacsym = nothing )
241
238
end
0 commit comments