|
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