@@ -18,19 +18,29 @@ function modelingtoolkitize(prob::DiffEqBase.ODEProblem)
18
18
vars = ArrayInterface. restructure (prob. u0,[var (:x , i)(ModelingToolkit. value (t)) for i in eachindex (prob. u0)])
19
19
params = p isa DiffEqBase. NullParameters ? [] :
20
20
reshape ([Num (Sym {Real} (nameof (Variable (:α , i)))) for i in eachindex (p)],size (p))
21
+ var_set = Set (vars)
21
22
22
23
D = Differential (t)
24
+ mm = prob. f. mass_matrix
23
25
24
- rhs = [D (var) for var in vars]
26
+ lhs = map (mm * vars) do v
27
+ if iszero (v)
28
+ 0
29
+ elseif v in var_set
30
+ D (v)
31
+ else
32
+ error (" Non-permuation mass matrix is not supported." )
33
+ end
34
+ end
25
35
26
36
if DiffEqBase. isinplace (prob)
27
- lhs = similar (vars, Num)
28
- prob. f (lhs , vars, params, t)
37
+ rhs = similar (vars, Num)
38
+ prob. f (rhs , vars, params, t)
29
39
else
30
- lhs = prob. f (vars, params, t)
40
+ rhs = prob. f (vars, params, t)
31
41
end
32
42
33
- eqs = vcat ([rhs [i] ~ lhs [i] for i in eachindex (prob. u0)]. .. )
43
+ eqs = vcat ([lhs [i] ~ rhs [i] for i in eachindex (prob. u0)]. .. )
34
44
35
45
params = if ndims (params) == 0
36
46
[params[1 ]]
0 commit comments