@@ -11,6 +11,9 @@ function calculate_tgrad(sys::AbstractODESystem;
11
11
if simplify
12
12
tgrad = ModelingToolkit. simplify .(notime_tgrad)
13
13
end
14
+ xs = states (sys)
15
+ rule = Dict (map ((x, xt) -> x=> xt, detime_dvs .(xs), xs))
16
+ tgrad = substitute .(tgrad, Ref (rule))
14
17
sys. tgrad[] = tgrad
15
18
return tgrad
16
19
end
@@ -41,7 +44,8 @@ ODEToExpr(@nospecialize(sys)) = ODEToExpr(sys,states(sys))
41
44
(f:: ODEToExpr )(O:: Num ) = f (value (O))
42
45
function (f:: ODEToExpr )(O:: Term )
43
46
if isa (O. op, Sym)
44
- any (isequal (O), f. states) && return O. op. name # dependent variables
47
+ any (isequal (O), f. states) && return tosymbol (O)
48
+ # dependent variables
45
49
return build_expr (:call , Any[O. op. name; f .(O. args)])
46
50
end
47
51
return build_expr (:call , Any[O. op; f .(O. args)])
@@ -64,9 +68,15 @@ function generate_jacobian(sys::AbstractODESystem, dvs = states(sys), ps = param
64
68
conv = ODEToExpr (sys), kwargs... )
65
69
end
66
70
67
- Base. Symbol (t:: Num ) = Symbol (value (t))
68
- function Base. Symbol (t:: Term )
71
+ Base. Symbol (x:: Union{Num,Symbolic} ) = tosymbol (x)
72
+ tosymbol (x; kwargs... ) = x
73
+ tosymbol (x:: Sym ; kwargs... ) = nameof (x)
74
+ tosymbol (t:: Num ; kwargs... ) = tosymbol (value (t); kwargs... )
75
+ function tosymbol (t:: Term ; states= nothing )
69
76
if t. op isa Sym
77
+ if states != = nothing && ! (any (isequal (t), states))
78
+ return nameof (t. op)
79
+ end
70
80
op = nameof (t. op)
71
81
args = t. args
72
82
elseif t. op isa Differential
@@ -75,7 +85,7 @@ function Base.Symbol(t::Term)
75
85
end
76
86
op = Symbol (nameof (t. args[1 ]. op),
77
87
:ˍ ,
78
- Symbol (t. op. x))
88
+ tosymbol (t. op. x))
79
89
args = t. args[1 ]. args
80
90
else
81
91
@goto err
@@ -86,13 +96,13 @@ function Base.Symbol(t::Term)
86
96
error (" Cannot convert $t to a symbol" )
87
97
end
88
98
89
- makesym (t:: Symbolic ) = Sym {symtype(t)} (Symbol (t ))
90
- makesym (t:: Num ) = makesym (value (t))
99
+ makesym (t:: Symbolic ; kwargs ... ) = Sym {symtype(t)} (tosymbol (t; kwargs ... ))
100
+ makesym (t:: Num ; kwargs ... ) = makesym (value (t); kwargs ... )
91
101
92
102
function generate_function (sys:: AbstractODESystem , dvs = states (sys), ps = parameters (sys); kwargs... )
93
103
# optimization
94
- dvs′ = makesym .(value .(dvs))
95
- ps′ = makesym .(value .(ps))
104
+ dvs′ = makesym .(value .(dvs), states = dvs )
105
+ ps′ = makesym .(value .(ps), states = dvs )
96
106
97
107
sub = Dict (dvs .=> dvs′)
98
108
# substitute x(t) by just x
@@ -107,7 +117,7 @@ function calculate_massmatrix(sys::AbstractODESystem; simplify=true)
107
117
M = zeros (length (eqs),length (eqs))
108
118
for (i,eq) in enumerate (eqs)
109
119
if eq. lhs isa Term && eq. lhs. op isa Differential
110
- j = findfirst (x-> isequal (term_to_symbol (x),term_to_symbol (var_from_nested_derivative (eq. lhs)[1 ])),dvs)
120
+ j = findfirst (x-> isequal (tosymbol (x),tosymbol (var_from_nested_derivative (eq. lhs)[1 ])),dvs)
111
121
M[i,j] = 1
112
122
else
113
123
eq. lhs == 0 || error (" Only semi-explicit constant mass matrices are currently supported. Faulty equation: $eq ." )
0 commit comments