Skip to content

Commit 0d42a64

Browse files
feat: make system index zero when initializing DAEProblems
1 parent b77ed41 commit 0d42a64

File tree

1 file changed

+26
-0
lines changed

1 file changed

+26
-0
lines changed

src/systems/nonlinear/initializesystem.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,35 @@ function generate_initializesystem(sys::ODESystem;
1111
default_dd_guess = 0.0,
1212
algebraic_only = false,
1313
check_units = true, check_defguess = false,
14+
implicit_dae = false,
1415
name = nameof(sys), kwargs...)
1516
trueobs, eqs = unhack_observed(observed(sys), equations(sys))
1617
vars = unique([unknowns(sys); getfield.(trueobs, :lhs)])
18+
19+
if implicit_dae
20+
pre_simplification_sys = sys
21+
while get_parent(pre_simplification_sys) !== nothing
22+
pre_simplification_sys = get_parent(pre_simplification_sys)
23+
end
24+
schedule = get_schedule(sys)
25+
if schedule === nothing
26+
throw(ArgumentError("The system must be structurally simplified to create an initialization system for an implicit DAE."))
27+
end
28+
old_eqs = equations(pre_simplification_sys)
29+
inv_dummy_sub = Dict()
30+
for (k, v) in schedule.dummy_sub
31+
if isequal(default_toterm(k), v)
32+
inv_dummy_sub[v] = k
33+
end
34+
end
35+
new_eqs = Symbolics.fast_substitute.([trueobs; eqs], (inv_dummy_sub,))
36+
filter!(eq -> !isequal(eq.lhs, eq.rhs), new_eqs)
37+
new_sys = ODESystem(new_eqs, get_iv(sys); name = nameof(sys))
38+
new_sys = dummy_derivative(new_sys; to_index_zero = true, array_hack = false, cse_hack = false)
39+
trueobs = observed(new_sys)
40+
eqs = equations(new_sys)
41+
vars = unique([unknowns(new_sys); getfield.(trueobs, :lhs)])
42+
end
1743
vars_set = Set(vars) # for efficient in-lookup
1844

1945
idxs_diff = isdiffeq.(eqs)

0 commit comments

Comments
 (0)