|
21 | 21 | function generate_function(sys::AbstractSystem; version::FunctionVersion = ArrayFunction)
|
22 | 22 | sys_eqs = system_eqs(sys)
|
23 | 23 | vs, ps = system_vars(sys), system_params(sys)
|
| 24 | + return build_function([eq.rhs for eq ∈ sys_eqs], vs, ps; version = version) |
| 25 | +end |
24 | 26 |
|
| 27 | +function build_function(rhss, vs, ps; version::FunctionVersion) |
25 | 28 | var_pairs = [(u.name, :(u[$i])) for (i, u) ∈ enumerate(vs)]
|
26 | 29 | param_pairs = [(p.name, :(p[$i])) for (i, p) ∈ enumerate(ps)]
|
27 | 30 | (ls, rs) = collect(zip(var_pairs..., param_pairs...))
|
28 | 31 |
|
29 | 32 | var_eqs = Expr(:(=), build_expr(:tuple, ls), build_expr(:tuple, rs))
|
30 |
| - sys_exprs = build_expr(:tuple, [convert(Expr, eq.rhs) for eq ∈ sys_eqs]) |
31 |
| - let_expr = Expr(:let, var_eqs, sys_exprs) |
32 | 33 |
|
33 | 34 | if version === ArrayFunction
|
34 |
| - :((du,u,p,t) -> du .= $let_expr) |
| 35 | + X = gensym() |
| 36 | + sys_exprs = [:($X[$i] = $(convert(Expr, rhs))) for (i, rhs) ∈ enumerate(rhss)] |
| 37 | + let_expr = Expr(:let, var_eqs, build_expr(:block, sys_exprs)) |
| 38 | + :(($X,u,p,t) -> $let_expr) |
35 | 39 | elseif version === SArrayFunction
|
| 40 | + sys_expr = build_expr(:tuple, [convert(Expr, rhs) for rhs ∈ rhss]) |
| 41 | + let_expr = Expr(:let, var_eqs, sys_expr) |
36 | 42 | :((u,p,t) -> begin
|
37 |
| - du = $let_expr |
38 |
| - T = StaticArrays.similar_type(typeof(u), eltype(du)) |
39 |
| - T(du) |
| 43 | + X = $let_expr |
| 44 | + T = StaticArrays.similar_type(typeof(u), eltype(X)) |
| 45 | + T(X) |
40 | 46 | end)
|
41 | 47 | end
|
42 | 48 | end
|
0 commit comments