Skip to content

Commit b2f34de

Browse files
authored
Merge pull request #71 from JuliaDiffEq/myb/fix
Ensure that `generate_ode_function` always returns `Expr`
2 parents d60306f + 28b9a04 commit b2f34de

File tree

3 files changed

+14
-3
lines changed

3 files changed

+14
-3
lines changed

src/systems/diffeqs/diffeqsystem.jl

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,17 @@ function generate_ode_function(sys::DiffEqSystem;version = ArrayFunction)
4040
var_exprs = [:($(sys.dvs[i].name) = u[$i]) for i in 1:length(sys.dvs)]
4141
param_exprs = [:($(sys.ps[i].name) = p[$i]) for i in 1:length(sys.ps)]
4242
sys_exprs = build_equals_expr.(sys.eqs)
43-
4443
if version == ArrayFunction
4544
dvar_exprs = [:(du[$i] = $(Symbol("$(sys.dvs[i].name)_$(sys.ivs[1].name)"))) for i in 1:length(sys.dvs)]
4645
exprs = vcat(var_exprs,param_exprs,sys_exprs,dvar_exprs)
4746
block = expr_arr_to_block(exprs)
48-
:((du,u,p,t)->$(block))
47+
:((du,u,p,t)->$(toexpr(block)))
4948
elseif version == SArrayFunction
5049
dvar_exprs = [:($(Symbol("$(sys.dvs[i].name)_$(sys.ivs[1].name)"))) for i in 1:length(sys.dvs)]
5150
svector_expr = :(typeof(u)($(dvar_exprs...)))
5251
exprs = vcat(var_exprs,param_exprs,sys_exprs,svector_expr)
5352
block = expr_arr_to_block(exprs)
54-
:((u,p,t)->$(block))
53+
:((u,p,t)->$(toexpr(block)))
5554
end
5655
end
5756

src/utils.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using MacroTools
12
function expr_arr_to_block(exprs)
23
block = :(begin end)
34
foreach(expr -> push!(block.args, expr), exprs)
@@ -15,3 +16,5 @@ function flatten_expr!(x)
1516
end
1617
x
1718
end
19+
20+
toexpr(ex) = MacroTools.postwalk(x->x isa Union{Expression,Operation} ? Expr(x) : x, ex)

test/system_construction.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,15 @@ end
8383

8484
ModelingToolkit.generate_nlsys_function(ns)
8585

86+
@Var _x
87+
@Deriv D'~t
88+
@Param A B C
89+
eqs = [_x ~ y/C,
90+
D*x ~ -A*x,
91+
D*y ~ A*x - B*_x]
92+
de = DiffEqSystem(eqs,[t],[x,y],Variable[_x],[A,B,C])
93+
@test eval(ModelingToolkit.generate_ode_function(de))([0.0,0.0],[1.0,2.0],[1,2,3],0.0) -1/3
94+
8695
# Now nonlinear system with only variables
8796
@Var x y z
8897
@Param σ ρ β

0 commit comments

Comments
 (0)