Skip to content

Commit f184bfd

Browse files
committed
Handle mass matrix in modelingtoolkitize
1 parent cdae3fb commit f184bfd

File tree

1 file changed

+15
-5
lines changed

1 file changed

+15
-5
lines changed

src/systems/diffeqs/modelingtoolkitize.jl

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,29 @@ function modelingtoolkitize(prob::DiffEqBase.ODEProblem)
1818
vars = ArrayInterface.restructure(prob.u0,[var(:x, i)(ModelingToolkit.value(t)) for i in eachindex(prob.u0)])
1919
params = p isa DiffEqBase.NullParameters ? [] :
2020
reshape([Num(Sym{Real}(nameof(Variable(, i)))) for i in eachindex(p)],size(p))
21+
var_set = Set(vars)
2122

2223
D = Differential(t)
24+
mm = prob.f.mass_matrix
2325

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
2535

2636
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)
2939
else
30-
lhs = prob.f(vars, params, t)
40+
rhs = prob.f(vars, params, t)
3141
end
3242

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)]...)
3444

3545
params = if ndims(params) == 0
3646
[params[1]]

0 commit comments

Comments
 (0)