|
1 | | -function lower_varname(D::Differential, x; lower=false) |
2 | | - order = lower ? D.order-1 : D.order |
3 | | - return lower_varname(x, D.x, order) |
4 | | -end |
5 | | -function lower_varname(var::Variable, idv, order::Int) |
6 | | - sym = var.name |
7 | | - name = order == 0 ? sym : Symbol(sym, :_, string(idv.name)^order) |
| 1 | +function lower_varname(var::Variable, idv, order) |
| 2 | + order == 0 && return var |
| 3 | + name = Symbol(var.name, :_, string(idv.name)^order) |
8 | 4 | return Variable(name, var.known, var.dependents) |
9 | 5 | end |
10 | 6 |
|
11 | 7 | function ode_order_lowering(sys::DiffEqSystem) |
12 | 8 | eqs_lowered = ode_order_lowering(sys.eqs, sys.iv) |
13 | | - DiffEqSystem(eqs_lowered, sys.iv) |
| 9 | + DiffEqSystem(eqs_lowered, sys.iv, sys.dvs, sys.ps) |
14 | 10 | end |
15 | 11 | function ode_order_lowering(eqs, iv) |
16 | | - D = Differential(iv, 1) |
17 | 12 | var_order = Dict{Variable,Int}() |
18 | 13 | vars = Variable[] |
19 | 14 | new_eqs = similar(eqs, DiffEq) |
20 | 15 |
|
21 | 16 | for (i, eq) ∈ enumerate(eqs) |
22 | | - var, maxorder = eq.var, eq.D.order |
23 | | - maxorder == 1 && continue # fast pass |
| 17 | + var, maxorder = eq.x, eq.n |
24 | 18 | if maxorder > get(var_order, var, 0) |
25 | 19 | var_order[var] = maxorder |
26 | 20 | var ∈ vars || push!(vars, var) |
27 | 21 | end |
28 | | - var′ = lower_varname(eq.D, eq.var, lower = true) |
| 22 | + var′ = lower_varname(eq.x, eq.t, eq.n - 1) |
29 | 23 | rhs′ = rename(eq.rhs) |
30 | | - new_eqs[i] = DiffEq(D, var′, rhs′) |
| 24 | + new_eqs[i] = DiffEq(var′, iv, 1, rhs′) |
31 | 25 | end |
32 | 26 |
|
33 | 27 | for var ∈ vars |
34 | 28 | order = var_order[var] |
35 | 29 | for o in (order-1):-1:1 |
36 | 30 | lvar = lower_varname(var, iv, o-1) |
37 | 31 | rhs = lower_varname(var, iv, o) |
38 | | - eq = DiffEq(D, lvar, rhs) |
| 32 | + eq = DiffEq(lvar, iv, 1, rhs) |
39 | 33 | push!(new_eqs, eq) |
40 | 34 | end |
41 | 35 | end |
|
45 | 39 |
|
46 | 40 | function rename(O::Expression) |
47 | 41 | isa(O, Operation) || return O |
48 | | - isa(O.op, Differential) && return lower_varname(O.op, O.args[1]) |
| 42 | + if is_derivative(O) |
| 43 | + (x, t, order) = flatten_differential(O) |
| 44 | + return lower_varname(x, t, order) |
| 45 | + end |
49 | 46 | return Operation(O.op, rename.(O.args)) |
50 | 47 | end |
51 | 48 |
|
|
0 commit comments