Skip to content

Commit ac8ec09

Browse files
authored
Merge pull request #2793 from SciML/myb/unbalanced
Better over-determined tearing
2 parents ad60d02 + f041a77 commit ac8ec09

File tree

2 files changed

+39
-17
lines changed

2 files changed

+39
-17
lines changed

src/structural_transformation/bipartite_tearing/modia_tearing.jl

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -79,37 +79,55 @@ function tear_graph_modia(structure::SystemStructure, isder::F = nothing,
7979

8080
@unpack graph, solvable_graph = structure
8181
var_eq_matching = maximal_matching(graph, eqfilter, varfilter, U)
82-
var_eq_matching = complete(var_eq_matching,
83-
max(length(var_eq_matching),
84-
maximum(x -> x isa Int ? x : 0, var_eq_matching, init = 0)))
82+
matching_len = max(length(var_eq_matching),
83+
maximum(x -> x isa Int ? x : 0, var_eq_matching, init = 0))
84+
var_eq_matching = complete(var_eq_matching, matching_len)
8585
full_var_eq_matching = copy(var_eq_matching)
8686
var_sccs = find_var_sccs(graph, var_eq_matching)
87-
vargraph = DiCMOBiGraph{true}(graph)
87+
vargraph = DiCMOBiGraph{true}(graph, 0, Matching(matching_len))
8888
ict = IncrementalCycleTracker(vargraph; dir = :in)
8989

9090
ieqs = Int[]
9191
filtered_vars = BitSet()
92+
seen_eqs = falses(nsrcs(graph))
9293
for vars in var_sccs
9394
for var in vars
9495
if varfilter(var)
9596
push!(filtered_vars, var)
9697
if var_eq_matching[var] !== unassigned
97-
push!(ieqs, var_eq_matching[var])
98+
ieq = var_eq_matching[var]
99+
seen_eqs[ieq] = true
100+
push!(ieqs, ieq)
98101
end
99102
end
100103
var_eq_matching[var] = unassigned
101104
end
102-
tear_graph_block_modia!(var_eq_matching, ict, solvable_graph, ieqs,
103-
filtered_vars,
104-
isder)
105-
106-
# clear cache
107-
vargraph.ne = 0
108-
for var in vars
109-
vargraph.matching[var] = unassigned
110-
end
111-
empty!(ieqs)
112-
empty!(filtered_vars)
105+
tear_block!(vargraph, vars,
106+
var_eq_matching, ict, solvable_graph,
107+
ieqs, filtered_vars, isder)
108+
end
109+
free_eqs = findall(!, seen_eqs)
110+
if !isempty(free_eqs)
111+
free_vars = findall(x -> !(x isa Int), var_eq_matching)
112+
tear_block!(vargraph, (),
113+
var_eq_matching, ict, solvable_graph,
114+
free_eqs, BitSet(free_vars), isder)
113115
end
114116
return var_eq_matching, full_var_eq_matching, var_sccs
115117
end
118+
119+
function tear_block!(vargraph, vars,
120+
var_eq_matching, ict, solvable_graph, ieqs,
121+
filtered_vars, isder)
122+
tear_graph_block_modia!(var_eq_matching, ict, solvable_graph, ieqs,
123+
filtered_vars,
124+
isder)
125+
126+
# clear cache
127+
vargraph.ne = 0
128+
for var in vars
129+
vargraph.matching[var] = unassigned
130+
end
131+
empty!(ieqs)
132+
empty!(filtered_vars)
133+
end

test/initializationsystem.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ initprob = ModelingToolkit.InitializationProblem(pend, 0.0, [x => 1, y => 0], [g
2222
@test initprob isa NonlinearProblem
2323
sol = solve(initprob)
2424
@test SciMLBase.successful_retcode(sol)
25-
@test sol.u == [1.0, 0.0, 0.0, 0.0]
25+
@test sol.u == [0.0, 0.0, 0.0]
2626
@test maximum(abs.(sol[conditions])) < 1e-14
2727

2828
initprob = ModelingToolkit.InitializationProblem(
@@ -443,3 +443,7 @@ eqs = [D(D(x)) ~ λ * x
443443

444444
prob = ODEProblem(pend, [x => 1], (0.0, 1.5), [g => 1],
445445
guesses ==> 0, y => 1], initialization_eqs = [y ~ 1])
446+
447+
unsimp = generate_initializesystem(pend; u0map = [x => 1], initialization_eqs = [y ~ 1])
448+
sys = structural_simplify(unsimp; fully_determined = false)
449+
@test length(equations(sys)) == 3

0 commit comments

Comments
 (0)