Skip to content

Commit b0358e6

Browse files
committed
sort states in initialize_system_structure
1 parent bc7e166 commit b0358e6

File tree

3 files changed

+19
-33
lines changed

3 files changed

+19
-33
lines changed

src/structural_transformation/tearing.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,6 @@ function tearing_reassemble(sys; simplify=false)
119119
return nothing
120120
end
121121

122-
123122
### update equations
124123
odestats = []
125124
for idx in eachindex(fullvars); isdervar(s, idx) && continue
@@ -191,7 +190,6 @@ function tearing_reassemble(sys; simplify=false)
191190
return sys
192191
end
193192

194-
195193
"""
196194
algebraic_equations_scc(sys)
197195

src/systems/diffeqs/odesystem.jl

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -281,36 +281,6 @@ function _eq_unordered(a, b)
281281
return true
282282
end
283283

284-
"""
285-
$(SIGNATURES)
286-
287-
Sort the states so that the mass matrix is as identity-like as possible.
288-
"""
289-
function sort_states(sys::ODESystem)
290-
sys = flatten(sys)
291-
eqs = equations(sys)
292-
sts = states(sys)
293-
sorted_states = OrderedSet()
294-
var2idx = Dict(sts .=> eachindex(sts))
295-
idx = 0
296-
for eq in eqs
297-
if isdiffeq(eq)
298-
var = arguments(eq.lhs)[1]
299-
if haskey(var2idx, var)
300-
pop!(var2idx, var)
301-
push!(sorted_states, var)
302-
end
303-
end
304-
end
305-
306-
var2idx = collect(pairs(var2idx))
307-
sorted_states = collect(sorted_states)
308-
append!(sorted_states, map(x->x[1], sort(var2idx, by=x->x[2])))
309-
310-
@set! sys.states = sorted_states
311-
@set! sys.structure = nothing
312-
end
313-
314284
function collect_differential_variables(sys::ODESystem)
315285
eqs = equations(sys)
316286
vars = Set()

src/systems/systemstructure.jl

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ function initialize_system_structure(sys)
111111
else
112112
eq = 0 ~ eq′.rhs - eq′.lhs
113113
end
114-
vars!(vars, eq)
114+
vars!(vars, eq.rhs)
115115
isalgeq = true
116116
statevars = []
117117
for var in vars
@@ -140,6 +140,24 @@ function initialize_system_structure(sys)
140140
end
141141
end
142142

143+
# sort `fullvars` such that the mass matrix is as diagonal as possible.
144+
sorted_fullvars = OrderedSet(fullvars[dervaridxs])
145+
for dervaridx in dervaridxs
146+
dervar = fullvars[dervaridx]
147+
diffvar = arguments(dervar)[1]
148+
if !(diffvar in sorted_fullvars)
149+
push!(sorted_fullvars, diffvar)
150+
end
151+
end
152+
for v in fullvars
153+
if !(v in sorted_fullvars)
154+
push!(sorted_fullvars, v)
155+
end
156+
end
157+
fullvars = collect(sorted_fullvars)
158+
var2idx = Dict(fullvars .=> eachindex(fullvars))
159+
dervaridxs = 1:length(dervaridxs)
160+
143161
nvars = length(fullvars)
144162
diffvars = []
145163
vartype = fill(DIFFERENTIAL_VARIABLE, nvars)

0 commit comments

Comments
 (0)