@@ -145,6 +145,7 @@ function DiffEqBase.ODEFunction{iip}(sys::AbstractODESystem, dvs = states(sys),
145
145
eval_expression = true ,
146
146
sparse = false , simplify= false ,
147
147
eval_module = @__MODULE__ ,
148
+ steady_state = false ,
148
149
kwargs... ) where {iip}
149
150
150
151
f_gen = generate_function (sys, dvs, ps; expression= Val{eval_expression}, expression_module= eval_module, kwargs... )
@@ -178,12 +179,23 @@ function DiffEqBase.ODEFunction{iip}(sys::AbstractODESystem, dvs = states(sys),
178
179
179
180
_M = (u0 === nothing || M == I) ? M : ArrayInterface. restructure (u0 .* u0' ,M)
180
181
181
- observedfun = let sys = sys, dict = Dict ()
182
- function generated_observed (obsvar, u, p, t)
183
- obs = get! (dict, value (obsvar)) do
184
- build_explicit_observed_function (sys, obsvar)
182
+ observedfun = if steady_state
183
+ let sys = sys, dict = Dict ()
184
+ function generated_observed (obsvar, u, p, t= Inf )
185
+ obs = get! (dict, value (obsvar)) do
186
+ build_explicit_observed_function (sys, obsvar)
187
+ end
188
+ obs (u, p, t)
189
+ end
190
+ end
191
+ else
192
+ let sys = sys, dict = Dict ()
193
+ function generated_observed (obsvar, u, p, t)
194
+ obs = get! (dict, value (obsvar)) do
195
+ build_explicit_observed_function (sys, obsvar)
196
+ end
197
+ obs (u, p, t)
185
198
end
186
- obs (u, p, t)
187
199
end
188
200
end
189
201
@@ -228,9 +240,28 @@ function ODEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys),
228
240
jac = false ,
229
241
linenumbers = false ,
230
242
sparse = false , simplify= false ,
243
+ steady_state = false ,
231
244
kwargs... ) where {iip}
232
245
233
246
f_oop, f_iip = generate_function (sys, dvs, ps; expression= Val{true }, kwargs... )
247
+
248
+ dict = Dict ()
249
+ observedfun = if steady_state
250
+ :(function generated_observed (obsvar, u, p, t= Inf )
251
+ obs = get! ($ dict, value (obsvar)) do
252
+ build_explicit_observed_function ($ sys, obsvar)
253
+ end
254
+ obs (u, p, t)
255
+ end )
256
+ else
257
+ :(function generated_observed (obsvar, u, p, t)
258
+ obs = get! ($ dict, value (obsvar)) do
259
+ build_explicit_observed_function ($ sys, obsvar)
260
+ end
261
+ obs (u, p, t)
262
+ end )
263
+ end
264
+
234
265
fsym = gensym (:f )
235
266
_f = :($ fsym = ModelingToolkit. ODEFunctionClosure ($ f_oop, $ f_iip))
236
267
tgradsym = gensym (:tgrad )
@@ -271,6 +302,7 @@ function ODEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys),
271
302
jac_prototype = $ jp_expr,
272
303
syms = $ (Symbol .(states (sys))),
273
304
indepsym = $ (QuoteNode (Symbol (independent_variable (sys)))),
305
+ observed = $ observedfun,
274
306
)
275
307
end
276
308
! linenumbers ? striplines (ex) : ex
379
411
380
412
"""
381
413
```julia
382
- function DiffEqBase.SteadyStateProblem(sys::AbstractODESystem,u0map,tspan,
414
+ function DiffEqBase.SteadyStateProblem(sys::AbstractODESystem,u0map,
383
415
parammap=DiffEqBase.NullParameters();
384
416
version = nothing, tgrad=false,
385
417
jac = false,
@@ -393,13 +425,13 @@ symbolically calculating numerical enhancements.
393
425
function DiffEqBase. SteadyStateProblem {iip} (sys:: AbstractODESystem ,u0map,
394
426
parammap= DiffEqBase. NullParameters ();
395
427
kwargs... ) where iip
396
- f, u0, p = process_DEProblem (ODEFunction{iip}, sys, u0map, parammap; kwargs... )
397
- SteadyStateProblem (f,u0,p;kwargs... )
428
+ f, u0, p = process_DEProblem (ODEFunction{iip}, sys, u0map, parammap; steady_state = true , kwargs... )
429
+ SteadyStateProblem {iip} (f,u0,p;kwargs... )
398
430
end
399
431
400
432
"""
401
433
```julia
402
- function DiffEqBase.SteadyStateProblemExpr(sys::AbstractODESystem,u0map,tspan,
434
+ function DiffEqBase.SteadyStateProblemExpr(sys::AbstractODESystem,u0map,
403
435
parammap=DiffEqBase.NullParameters();
404
436
version = nothing, tgrad=false,
405
437
jac = false,
@@ -417,7 +449,7 @@ struct SteadyStateProblemExpr{iip} end
417
449
function SteadyStateProblemExpr {iip} (sys:: AbstractODESystem ,u0map,
418
450
parammap= DiffEqBase. NullParameters ();
419
451
kwargs... ) where iip
420
- f, u0, p = process_DEProblem (ODEFunctionExpr{iip}, sys, u0map, parammap; kwargs... )
452
+ f, u0, p = process_DEProblem (ODEFunctionExpr{iip}, sys, u0map, parammap;steady_state = true , kwargs... )
421
453
linenumbers = get (kwargs, :linenumbers , true )
422
454
ex = quote
423
455
f = $ f
0 commit comments