@@ -89,27 +89,45 @@ function tear_graph_modia(structure::SystemStructure, isder::F = nothing,
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
115117end
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
0 commit comments