|
198 | 198 |
|
199 | 199 | mutable struct TearingState{T <: AbstractSystem} <: AbstractTearingState{T} |
200 | 200 | sys::T |
| 201 | + original_eqs::Vector{Equation} |
201 | 202 | fullvars::Vector |
202 | 203 | structure::SystemStructure |
203 | 204 | extra_eqs::Vector |
|
206 | 207 | TransformationState(sys::AbstractSystem) = TearingState(sys) |
207 | 208 | function system_subset(ts::TearingState, ieqs::Vector{Int}) |
208 | 209 | eqs = equations(ts) |
| 210 | + @set! ts.original_eqs = ts.original_eqs[ieqs] |
209 | 211 | @set! ts.sys.eqs = eqs[ieqs] |
210 | 212 | @set! ts.structure = system_subset(ts.structure, ieqs) |
211 | 213 | ts |
@@ -252,7 +254,8 @@ function TearingState(sys; quick_cancel = false, check = true) |
252 | 254 | ivs = independent_variables(sys) |
253 | 255 | iv = length(ivs) == 1 ? ivs[1] : nothing |
254 | 256 | # scalarize array equations, without scalarizing arguments to registered functions |
255 | | - eqs = flatten_equations(copy(equations(sys))) |
| 257 | + original_eqs = flatten_equations(copy(equations(sys))) |
| 258 | + eqs = copy(original_eqs) |
256 | 259 | neqs = length(eqs) |
257 | 260 | dervaridxs = OrderedSet{Int}() |
258 | 261 | var2idx = Dict{Any, Int}() |
@@ -428,7 +431,7 @@ function TearingState(sys; quick_cancel = false, check = true) |
428 | 431 |
|
429 | 432 | eq_to_diff = DiffGraph(nsrcs(graph)) |
430 | 433 |
|
431 | | - ts = TearingState(sys, fullvars, |
| 434 | + ts = TearingState(sys, original_eqs, fullvars, |
432 | 435 | SystemStructure(complete(var_to_diff), complete(eq_to_diff), |
433 | 436 | complete(graph), nothing, var_types, sys isa DiscreteSystem), |
434 | 437 | Any[]) |
@@ -622,6 +625,22 @@ function merge_io(io, inputs) |
622 | 625 | return io |
623 | 626 | end |
624 | 627 |
|
| 628 | +function make_eqs_zero_equals!(ts::TearingState) |
| 629 | + neweqs = map(enumerate(get_eqs(ts.sys))) do kvp |
| 630 | + i, eq = kvp |
| 631 | + isalgeq = true |
| 632 | + for j in 𝑠neighbors(ts.structure.graph, i) |
| 633 | + isalgeq &= invview(ts.structure.var_to_diff)[j] === nothing |
| 634 | + end |
| 635 | + if isalgeq |
| 636 | + return 0 ~ eq.rhs - eq.lhs |
| 637 | + else |
| 638 | + return eq |
| 639 | + end |
| 640 | + end |
| 641 | + copyto!(get_eqs(ts.sys), neweqs) |
| 642 | +end |
| 643 | + |
625 | 644 | function structural_simplify!(state::TearingState, io = nothing; simplify = false, |
626 | 645 | check_consistency = true, fully_determined = true, warn_initialize_determined = true, |
627 | 646 | kwargs...) |
@@ -649,6 +668,7 @@ function structural_simplify!(state::TearingState, io = nothing; simplify = fals |
649 | 668 | throw(HybridSystemNotSupportedException("Discrete systems without JuliaSimCompiler are currently not supported in ODESystem.")) |
650 | 669 | end |
651 | 670 | end |
| 671 | + make_eqs_zero_equals!(tss[continuous_id]) |
652 | 672 | # puts the ios passed in to the call into the continous system |
653 | 673 | cont_io = merge_io(io, inputs[continuous_id]) |
654 | 674 | # simplify as normal |
|
0 commit comments