1
+ using DataStructures: OrderedDict
1
2
function lower_varname (var:: Variable , idv, order)
2
3
order == 0 && return var
3
4
name = Symbol (var. name, :ˍ , string (idv. name)^ order)
@@ -24,8 +25,7 @@ function ode_order_lowering(sys::ODESystem)
24
25
end
25
26
26
27
function ode_order_lowering (eqs, iv, states)
27
- var_order = Dict {Variable,Int} ()
28
- vars = Variable[]
28
+ var_order = OrderedDict {Variable,Int} ()
29
29
D = Differential (iv ())
30
30
diff_eqs = Equation[]
31
31
diff_vars = Variable[]
@@ -38,19 +38,16 @@ function ode_order_lowering(eqs, iv, states)
38
38
push! (alge_eqs, eq)
39
39
else
40
40
var, maxorder = var_from_nested_derivative (eq. lhs)
41
- if maxorder > get (var_order, var, 0 )
42
- var_order[var] = maxorder
43
- any (isequal (var), vars) || push! (vars, var)
44
- end
41
+ # only save to the dict when we need to lower the order to save memory
42
+ maxorder > get (var_order, var, 1 ) && (var_order[var] = maxorder)
45
43
var′ = lower_varname (var, iv, maxorder - 1 )
46
44
rhs′ = rename_lower_order (eq. rhs)
47
45
push! (diff_vars, var′)
48
46
push! (diff_eqs, D (var′ (iv ())) ~ rhs′)
49
47
end
50
48
end
51
49
52
- for var ∈ vars
53
- order = var_order[var]
50
+ for (var, order) ∈ var_order
54
51
for o in (order- 1 ): - 1 : 1
55
52
lvar = lower_varname (var, iv, o- 1 )
56
53
rvar = lower_varname (var, iv, o)
0 commit comments