Skip to content

Commit c62cff0

Browse files
Merge pull request #2789 from SciML/late_initial
allow for late binding of initialization equations
2 parents 5b4468d + 516d5ca commit c62cff0

File tree

3 files changed

+23
-5
lines changed

3 files changed

+23
-5
lines changed

src/systems/diffeqs/abstractodesystem.jl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -853,6 +853,7 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
853853
t = nothing,
854854
warn_initialize_determined = true,
855855
build_initializeprob = true,
856+
initialization_eqs = [],
856857
kwargs...)
857858
eqs = equations(sys)
858859
dvs = unknowns(sys)
@@ -925,7 +926,7 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
925926
u0map = Dict()
926927
end
927928
initializeprob = ModelingToolkit.InitializationProblem(
928-
sys, t, u0map, parammap; guesses, warn_initialize_determined)
929+
sys, t, u0map, parammap; guesses, warn_initialize_determined, initialization_eqs)
929930
initializeprobmap = getu(initializeprob, unknowns(sys))
930931

931932
zerovars = Dict(setdiff(unknowns(sys), keys(defaults(sys))) .=> 0.0)
@@ -1555,6 +1556,7 @@ InitializationProblem{iip}(sys::AbstractODESystem, u0map, tspan,
15551556
checkbounds = false, sparse = false,
15561557
simplify = false,
15571558
linenumbers = true, parallel = SerialForm(),
1559+
initialization_eqs = [],
15581560
kwargs...) where {iip}
15591561
```
15601562
@@ -1603,17 +1605,19 @@ function InitializationProblem{iip, specialize}(sys::AbstractODESystem,
16031605
guesses = [],
16041606
check_length = true,
16051607
warn_initialize_determined = true,
1608+
initialization_eqs = [],
16061609
kwargs...) where {iip, specialize}
16071610
if !iscomplete(sys)
16081611
error("A completed system is required. Call `complete` or `structural_simplify` on the system before creating an `ODEProblem`")
16091612
end
16101613
if isempty(u0map) && get_initializesystem(sys) !== nothing
1611-
isys = get_initializesystem(sys)
1614+
isys = get_initializesystem(sys; initialization_eqs)
16121615
elseif isempty(u0map) && get_initializesystem(sys) === nothing
1613-
isys = structural_simplify(generate_initializesystem(sys); fully_determined = false)
1616+
isys = structural_simplify(
1617+
generate_initializesystem(sys; initialization_eqs); fully_determined = false)
16141618
else
16151619
isys = structural_simplify(
1616-
generate_initializesystem(sys; u0map); fully_determined = false)
1620+
generate_initializesystem(sys; u0map, initialization_eqs); fully_determined = false)
16171621
end
16181622

16191623
uninit = setdiff(unknowns(sys), [unknowns(isys); getfield.(observed(isys), :lhs)])

src/systems/nonlinear/initializesystem.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ function generate_initializesystem(sys::ODESystem;
99
guesses = Dict(), check_defguess = false,
1010
default_dd_value = 0.0,
1111
algebraic_only = false,
12+
initialization_eqs = [],
1213
kwargs...)
1314
sts, eqs = unknowns(sys), equations(sys)
1415
idxs_diff = isdiffeq.(eqs)
@@ -95,7 +96,7 @@ function generate_initializesystem(sys::ODESystem;
9596
nleqs = if algebraic_only
9697
[eqs_ics; observed(sys)]
9798
else
98-
[eqs_ics; get_initialization_eqs(sys); observed(sys)]
99+
[eqs_ics; get_initialization_eqs(sys); initialization_eqs; observed(sys)]
99100
end
100101

101102
sys_nl = NonlinearSystem(nleqs,

test/initializationsystem.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,3 +430,16 @@ sol = solve(prob, Tsit5())
430430

431431
# This should warn, but logging tests can't be marked as broken
432432
@test_logs prob = ODEProblem(simpsys, [], tspan, guesses = [x => 2.0])
433+
434+
# Late Binding initialization_eqs
435+
# https://github.com/SciML/ModelingToolkit.jl/issues/2787
436+
437+
@parameters g
438+
@variables x(t) y(t) [state_priority = 10] λ(t)
439+
eqs = [D(D(x)) ~ λ * x
440+
D(D(y)) ~ λ * y - g
441+
x^2 + y^2 ~ 1]
442+
@mtkbuild pend = ODESystem(eqs, t)
443+
444+
prob = ODEProblem(pend, [x => 1], (0.0, 1.5), [g => 1],
445+
guesses ==> 0, y => 1], initialization_eqs = [y ~ 1])

0 commit comments

Comments
 (0)