@@ -158,6 +158,7 @@ function DiffEqBase.ODEFunction{iip}(sys::AbstractODESystem, dvs = states(sys),
158
158
eval_expression = true ,
159
159
sparse = false , simplify= false ,
160
160
eval_module = @__MODULE__ ,
161
+ steady_state = false ,
161
162
checkbounds= false ,
162
163
kwargs... ) where {iip}
163
164
@@ -194,12 +195,23 @@ function DiffEqBase.ODEFunction{iip}(sys::AbstractODESystem, dvs = states(sys),
194
195
195
196
_M = (u0 === nothing || M == I) ? M : ArrayInterface. restructure (u0 .* u0' ,M)
196
197
197
- observedfun = let sys = sys, dict = Dict ()
198
- function generated_observed (obsvar, u, p, t)
199
- obs = get! (dict, value (obsvar)) do
200
- build_explicit_observed_function (sys, obsvar; checkbounds= checkbounds)
198
+ observedfun = if steady_state
199
+ let sys = sys, dict = Dict ()
200
+ function generated_observed (obsvar, u, p, t= Inf )
201
+ obs = get! (dict, value (obsvar)) do
202
+ build_explicit_observed_function (sys, obsvar)
203
+ end
204
+ obs (u, p, t)
205
+ end
206
+ end
207
+ else
208
+ let sys = sys, dict = Dict ()
209
+ function generated_observed (obsvar, u, p, t)
210
+ obs = get! (dict, value (obsvar)) do
211
+ build_explicit_observed_function (sys, obsvar; checkbounds= checkbounds)
212
+ end
213
+ obs (u, p, t)
201
214
end
202
- obs (u, p, t)
203
215
end
204
216
end
205
217
@@ -301,9 +313,30 @@ function ODEFunctionExpr{iip}(sys::AbstractODESystem, dvs = states(sys),
301
313
jac = false ,
302
314
linenumbers = false ,
303
315
sparse = false , simplify= false ,
316
+ steady_state = false ,
304
317
kwargs... ) where {iip}
305
318
306
319
f_oop, f_iip = generate_function (sys, dvs, ps; expression= Val{true }, kwargs... )
320
+
321
+ dict = Dict ()
322
+ #=
323
+ observedfun = if steady_state
324
+ :(function generated_observed(obsvar, u, p, t=Inf)
325
+ obs = get!($dict, value(obsvar)) do
326
+ build_explicit_observed_function($sys, obsvar)
327
+ end
328
+ obs(u, p, t)
329
+ end)
330
+ else
331
+ :(function generated_observed(obsvar, u, p, t)
332
+ obs = get!($dict, value(obsvar)) do
333
+ build_explicit_observed_function($sys, obsvar)
334
+ end
335
+ obs(u, p, t)
336
+ end)
337
+ end
338
+ =#
339
+
307
340
fsym = gensym (:f )
308
341
_f = :($ fsym = ModelingToolkit. ODEFunctionClosure ($ f_oop, $ f_iip))
309
342
tgradsym = gensym (:tgrad )
579
612
580
613
"""
581
614
```julia
582
- function DiffEqBase.SteadyStateProblem(sys::AbstractODESystem,u0map,tspan,
615
+ function DiffEqBase.SteadyStateProblem(sys::AbstractODESystem,u0map,
583
616
parammap=DiffEqBase.NullParameters();
584
617
version = nothing, tgrad=false,
585
618
jac = false,
@@ -593,13 +626,13 @@ symbolically calculating numerical enhancements.
593
626
function DiffEqBase. SteadyStateProblem {iip} (sys:: AbstractODESystem ,u0map,
594
627
parammap= DiffEqBase. NullParameters ();
595
628
kwargs... ) where iip
596
- f, u0, p = process_DEProblem (ODEFunction{iip}, sys, u0map, parammap; kwargs... )
597
- SteadyStateProblem (f,u0,p;kwargs... )
629
+ f, u0, p = process_DEProblem (ODEFunction{iip}, sys, u0map, parammap; steady_state = true , kwargs... )
630
+ SteadyStateProblem {iip} (f,u0,p;kwargs... )
598
631
end
599
632
600
633
"""
601
634
```julia
602
- function DiffEqBase.SteadyStateProblemExpr(sys::AbstractODESystem,u0map,tspan,
635
+ function DiffEqBase.SteadyStateProblemExpr(sys::AbstractODESystem,u0map,
603
636
parammap=DiffEqBase.NullParameters();
604
637
version = nothing, tgrad=false,
605
638
jac = false,
@@ -617,7 +650,7 @@ struct SteadyStateProblemExpr{iip} end
617
650
function SteadyStateProblemExpr {iip} (sys:: AbstractODESystem ,u0map,
618
651
parammap= DiffEqBase. NullParameters ();
619
652
kwargs... ) where iip
620
- f, u0, p = process_DEProblem (ODEFunctionExpr{iip}, sys, u0map, parammap; kwargs... )
653
+ f, u0, p = process_DEProblem (ODEFunctionExpr{iip}, sys, u0map, parammap;steady_state = true , kwargs... )
621
654
linenumbers = get (kwargs, :linenumbers , true )
622
655
ex = quote
623
656
f = $ f
0 commit comments