|
45 | 45 | function generate_ode_function(sys::DiffEqSystem; version::FunctionVersion = ArrayFunction)
|
46 | 46 | var_exprs = [:($(sys.dvs[i].name) = u[$i]) for i in eachindex(sys.dvs)]
|
47 | 47 | 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]) |
49 | 49 | if version === ArrayFunction
|
50 | 50 | 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) |
52 | 53 | block = expr_arr_to_block(exprs)
|
53 | 54 | :((du,u,p,t)->$(toexpr(block)))
|
54 | 55 | elseif version === SArrayFunction
|
55 |
| - dvar_exprs = [:($(Symbol("$(sys.dvs[i].name)_$(sys.iv.name)"))) for i in eachindex(sys.dvs)] |
56 | 56 | 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) |
60 | 60 | end
|
61 |
| - exprs = vcat(var_exprs,param_exprs,sys_exprs,svector_expr) |
| 61 | + exprs = vcat(var_exprs,param_exprs,svector_expr) |
62 | 62 | block = expr_arr_to_block(exprs)
|
63 | 63 | :((u,p,t)->$(toexpr(block)))
|
64 | 64 | end
|
65 | 65 | end
|
66 | 66 |
|
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 |
| - |
72 | 67 | function calculate_jacobian(sys::DiffEqSystem, simplify=true)
|
73 | 68 | isempty(sys.jac[]) || return sys.jac[] # use cached Jacobian, if possible
|
74 | 69 | rhs = [eq.rhs for eq in sys.eqs]
|
|
0 commit comments