Skip to content

Commit cf85342

Browse files
committed
Handle high order diff in initialize_system_structure
1 parent 3c3fe1a commit cf85342

File tree

1 file changed

+20
-17
lines changed

1 file changed

+20
-17
lines changed

src/systems/systemstructure.jl

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,15 @@ function initialize_system_structure(sys)
7979
var2idx = Dict{Any,Int}()
8080
symbolic_incidence = []
8181
fullvars = []
82-
var_counter = 0
82+
var_counter = Ref(0)
83+
addvar! = let fullvars=fullvars, var_counter=var_counter
84+
var -> begin
85+
get!(var2idx, var) do
86+
push!(fullvars, var)
87+
var_counter[] += 1
88+
end
89+
end
90+
end
8391

8492
for (i, eq) in enumerate(eqs)
8593
vars = OrderedSet()
@@ -91,19 +99,16 @@ function initialize_system_structure(sys)
9199
if isparameter(var) || (istree(var) && isparameter(operation(var)))
92100
continue
93101
end
102+
varidx = addvar!(var)
94103
push!(statevars, var)
95-
varidx = get!(var2idx, var) do
96-
push!(fullvars, var)
97-
var_counter += 1
98-
end
99104

100-
if isdifferential(var)
105+
dvar = var
106+
idx = varidx
107+
while isdifferential(dvar)
108+
push!(dervaridxs, idx)
101109
isalgeq = false
102-
diffvar = arguments(var)[1]
103-
if diffvar isa Differential
104-
throw(InvalidSystemException("The equation [ $eq ] is not first order"))
105-
end
106-
push!(dervaridxs, varidx)
110+
dvar = arguments(dvar)[1]
111+
idx = addvar!(dvar)
107112
end
108113
end
109114
push!(symbolic_incidence, copy(statevars))
@@ -123,12 +128,10 @@ function initialize_system_structure(sys)
123128
vartype[dervaridx] = DERIVATIVE_VARIABLE
124129
dervar = fullvars[dervaridx]
125130
diffvar = arguments(dervar)[1]
126-
diffvaridx = get(var2idx, diffvar, 0)
127-
if diffvaridx != 0
128-
push!(diffvars, diffvar)
129-
varassoc[diffvaridx] = dervaridx
130-
inv_varassoc[dervaridx] = diffvaridx
131-
end
131+
diffvaridx = var2idx[diffvar]
132+
push!(diffvars, diffvar)
133+
varassoc[diffvaridx] = dervaridx
134+
inv_varassoc[dervaridx] = diffvaridx
132135
end
133136

134137
algvars = setdiff(states(sys), diffvars)

0 commit comments

Comments
 (0)