Skip to content

Commit c3dc123

Browse files
Remove generated derivative variables
1 parent a2411f0 commit c3dc123

File tree

2 files changed

+13
-13
lines changed

2 files changed

+13
-13
lines changed

src/systems/diffeqs/diffeqsystem.jl

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,30 +45,25 @@ end
4545
function generate_ode_function(sys::DiffEqSystem; version::FunctionVersion = ArrayFunction)
4646
var_exprs = [:($(sys.dvs[i].name) = u[$i]) for i in eachindex(sys.dvs)]
4747
param_exprs = [:($(sys.ps[i].name) = p[$i]) for i in eachindex(sys.ps)]
48-
sys_exprs = build_equals_expr.(sys.eqs)
48+
sys_exprs = build_expr(:tuple, [convert(Expr, eq.rhs) for eq sys.eqs])
4949
if version === ArrayFunction
5050
dvar_exprs = [:(du[$i] = $(Symbol("$(sys.dvs[i].name)_$(sys.iv.name)"))) for i in eachindex(sys.dvs)]
51-
exprs = vcat(var_exprs,param_exprs,sys_exprs,dvar_exprs)
51+
du_expr = :(du .= $sys_exprs)
52+
exprs = vcat(var_exprs,param_exprs,du_expr)
5253
block = expr_arr_to_block(exprs)
5354
:((du,u,p,t)->$(toexpr(block)))
5455
elseif version === SArrayFunction
55-
dvar_exprs = [:($(Symbol("$(sys.dvs[i].name)_$(sys.iv.name)"))) for i in eachindex(sys.dvs)]
5656
svector_expr = quote
57-
E = eltype(tuple($(dvar_exprs...)))
58-
T = StaticArrays.similar_type(typeof(u), E)
59-
T($(dvar_exprs...))
57+
du = $sys_exprs
58+
T = StaticArrays.similar_type(typeof(u), eltype(du))
59+
T(du)
6060
end
61-
exprs = vcat(var_exprs,param_exprs,sys_exprs,svector_expr)
61+
exprs = vcat(var_exprs,param_exprs,svector_expr)
6262
block = expr_arr_to_block(exprs)
6363
:((u,p,t)->$(toexpr(block)))
6464
end
6565
end
6666

67-
function build_equals_expr(eq::DiffEq)
68-
lhs = Symbol(eq.var.name, :_, eq.D.x.name)
69-
return :($lhs = $(convert(Expr, eq.rhs)))
70-
end
71-
7267
function calculate_jacobian(sys::DiffEqSystem, simplify=true)
7368
isempty(sys.jac[]) || return sys.jac[] # use cached Jacobian, if possible
7469
rhs = [eq.rhs for eq in sys.eqs]

test/system_construction.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,12 @@ eqs = [D(x) ~ -A*x,
109109
de = DiffEqSystem(eqs,t,[x,y],[A,B,C])
110110
test_vars_extraction(de, DiffEqSystem(eqs,t))
111111
test_vars_extraction(de, DiffEqSystem(eqs))
112-
@test eval(ModelingToolkit.generate_ode_function(de))([0.0,0.0],[1.0,2.0],[1,2,3],0.0) -1/3
112+
@test begin
113+
f = eval(ModelingToolkit.generate_ode_function(de))
114+
du = [0.0,0.0]
115+
f(du, [1.0,2.0], [1,2,3], 0.0)
116+
du [-1, -1/3]
117+
end
113118

114119
# Now nonlinear system with only variables
115120
@Unknown x y z

0 commit comments

Comments
 (0)