@@ -152,6 +152,21 @@ function generate_function(sys::AbstractODESystem, dvs = unknowns(sys),
152
152
nothing ,
153
153
isdde = false ,
154
154
kwargs... )
155
+ array_vars = Dict {Any, Vector{Int}} ()
156
+ for (j, x) in enumerate (dvs)
157
+ if istree (x) && operation (x) == getindex
158
+ arg = arguments (x)[1 ]
159
+ inds = get! (() -> Int[], array_vars, arg)
160
+ push! (inds, j)
161
+ end
162
+ end
163
+ subs = Dict ()
164
+ for (k, inds) in array_vars
165
+ if inds == (inds′ = inds[1 ]: inds[end ])
166
+ inds = inds′
167
+ end
168
+ subs[k] = term (view, Sym {Any} (Symbol (" ˍ₋arg1" )), inds)
169
+ end
155
170
if isdde
156
171
eqs = delay_to_function (sys)
157
172
else
@@ -164,6 +179,7 @@ function generate_function(sys::AbstractODESystem, dvs = unknowns(sys),
164
179
# substitute x(t) by just x
165
180
rhss = implicit_dae ? [_iszero (eq. lhs) ? eq. rhs : eq. rhs - eq. lhs for eq in eqs] :
166
181
[eq. rhs for eq in eqs]
182
+ rhss = fast_substitute (rhss, subs)
167
183
168
184
# TODO : add an optional check on the ordering of observed equations
169
185
u = map (x -> time_varying_as_func (value (x), sys), dvs)
@@ -764,6 +780,17 @@ function get_u0_p(sys,
764
780
defs = mergedefaults (defs, parammap, ps)
765
781
end
766
782
defs = mergedefaults (defs, u0map, dvs)
783
+ for (k, v) in defs
784
+ if Symbolics. isarraysymbolic (k)
785
+ ks = scalarize (k)
786
+ length (ks) == length (v) || error (" $k has default value $v with unmatched size" )
787
+ for (kk, vv) in zip (ks, v)
788
+ if ! haskey (defs, kk)
789
+ defs[kk] = vv
790
+ end
791
+ end
792
+ end
793
+ end
767
794
768
795
if symbolic_u0
769
796
u0 = varmap_to_vars (u0map, dvs; defaults = defs, tofloat = false , use_union = false )
0 commit comments