Skip to content

Commit f5378df

Browse files
Merge pull request #2846 from hersle/extend_initialization_equations
Extend initialization equations
2 parents 4aeaaea + ee522fe commit f5378df

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

src/systems/abstractsystem.jl

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2517,6 +2517,7 @@ function extend(sys::AbstractSystem, basesys::AbstractSystem; name::Symbol = nam
25172517
end
25182518
end
25192519

2520+
# collect fields common to all system types
25202521
eqs = union(get_eqs(basesys), get_eqs(sys))
25212522
sts = union(get_unknowns(basesys), get_unknowns(sys))
25222523
ps = union(get_ps(basesys), get_ps(sys))
@@ -2529,16 +2530,19 @@ function extend(sys::AbstractSystem, basesys::AbstractSystem; name::Symbol = nam
25292530
devs = union(get_discrete_events(basesys), get_discrete_events(sys))
25302531
defs = merge(get_defaults(basesys), get_defaults(sys)) # prefer `sys`
25312532
syss = union(get_systems(basesys), get_systems(sys))
2533+
args = length(ivs) == 0 ? (eqs, sts, ps) : (eqs, ivs[1], sts, ps)
2534+
kwargs = (parameter_dependencies = dep_ps, observed = obs, continuous_events = cevs,
2535+
discrete_events = devs, defaults = defs, systems = syss,
2536+
name = name, gui_metadata = gui_metadata)
25322537

2533-
if length(ivs) == 0
2534-
T(eqs, sts, ps, observed = obs, defaults = defs, name = name, systems = syss,
2535-
continuous_events = cevs, discrete_events = devs, gui_metadata = gui_metadata,
2536-
parameter_dependencies = dep_ps)
2537-
elseif length(ivs) == 1
2538-
T(eqs, ivs[1], sts, ps, observed = obs, defaults = defs, name = name,
2539-
systems = syss, continuous_events = cevs, discrete_events = devs,
2540-
gui_metadata = gui_metadata, parameter_dependencies = dep_ps)
2538+
# collect fields specific to some system types
2539+
if basesys isa ODESystem
2540+
ieqs = union(get_initialization_eqs(basesys), get_initialization_eqs(sys))
2541+
guesses = merge(get_guesses(basesys), get_guesses(sys)) # prefer `sys`
2542+
kwargs = merge(kwargs, (initialization_eqs = ieqs, guesses = guesses))
25412543
end
2544+
2545+
return T(args...; kwargs...)
25422546
end
25432547

25442548
function Base.:(&)(sys::AbstractSystem, basesys::AbstractSystem; name::Symbol = nameof(sys))

test/initializationsystem.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,3 +447,12 @@ prob = ODEProblem(pend, [x => 1], (0.0, 1.5), [g => 1],
447447
unsimp = generate_initializesystem(pend; u0map = [x => 1], initialization_eqs = [y ~ 1])
448448
sys = structural_simplify(unsimp; fully_determined = false)
449449
@test length(equations(sys)) == 3
450+
451+
# Extend two systems with initialization equations and guesses
452+
# https://github.com/SciML/ModelingToolkit.jl/issues/2845
453+
@variables x(t) y(t)
454+
@named sysx = ODESystem([D(x) ~ 0], t; initialization_eqs = [x ~ 1])
455+
@named sysy = ODESystem([D(y) ~ 0], t; initialization_eqs = [y^2 ~ 2], guesses = [y => 1])
456+
sys = extend(sysx, sysy)
457+
@test length(equations(generate_initializesystem(sys))) == 2
458+
@test length(ModelingToolkit.guesses(sys)) == 1

0 commit comments

Comments
 (0)