@@ -450,8 +450,11 @@ in `varmap`, it is ignored.
450450"""
451451function evaluate_varmap! (varmap:: AbstractDict , vars; limit = 100 )
452452 for k in vars
453+ v = get (varmap, k, nothing )
454+ v === nothing && continue
455+ symbolic_type (v) == NotSymbolic () && ! is_array_of_symbolics (v) && continue
453456 haskey (varmap, k) || continue
454- varmap[k] = fixpoint_sub (varmap[k] , varmap; maxiters = limit)
457+ varmap[k] = fixpoint_sub (v , varmap; maxiters = limit)
455458 end
456459end
457460
@@ -580,15 +583,19 @@ function build_operating_point!(sys::AbstractSystem,
580583 end
581584 end
582585
583- for k in keys (u0map)
584- v = fixpoint_sub (u0map[k], neithermap; operator = Symbolics. Operator)
585- isequal (k, v) && continue
586- u0map[k] = v
587- end
588- for k in keys (pmap)
589- v = fixpoint_sub (pmap[k], neithermap; operator = Symbolics. Operator)
590- isequal (k, v) && continue
591- pmap[k] = v
586+ if ! isempty (neithermap)
587+ for (k, v) in u0map
588+ symbolic_type (v) == NotSymbolic () && ! is_array_of_symbolics (v) && continue
589+ v = fixpoint_sub (v, neithermap; operator = Symbolics. Operator)
590+ isequal (k, v) && continue
591+ u0map[k] = v
592+ end
593+ for (k, v) in pmap
594+ symbolic_type (v) == NotSymbolic () && ! is_array_of_symbolics (v) && continue
595+ v = fixpoint_sub (v, neithermap; operator = Symbolics. Operator)
596+ isequal (k, v) && continue
597+ pmap[k] = v
598+ end
592599 end
593600
594601 return op, missing_unknowns, missing_pars
@@ -1036,6 +1043,9 @@ function (siu::SetInitialUnknowns)(p::AbstractVector, u0)
10361043 return p
10371044end
10381045
1046+ safe_float (x) = x
1047+ safe_float (x:: AbstractArray ) = isempty (x) ? x : float (x)
1048+
10391049"""
10401050 $(TYPEDSIGNATURES)
10411051
@@ -1100,7 +1110,8 @@ function maybe_build_initialization_problem(
11001110 if is_time_dependent (sys)
11011111 all_init_syms = Set (all_symbols (initializeprob))
11021112 solved_unknowns = filter (var -> var in all_init_syms, unknowns (sys))
1103- initializeprobmap = u0_constructor ∘ getu (initializeprob, solved_unknowns)
1113+ initializeprobmap = u0_constructor ∘ safe_float ∘
1114+ getu (initializeprob, solved_unknowns)
11041115 else
11051116 initializeprobmap = nothing
11061117 end
@@ -1123,20 +1134,24 @@ function maybe_build_initialization_problem(
11231134 update_initializeprob! = ModelingToolkit. update_initializeprob!
11241135 end
11251136
1126- for p in punknowns
1127- is_parameter_solvable (p, pmap, defs, guesses) || continue
1128- get (op, p, missing ) === missing || continue
1137+ filter! (punknowns) do p
1138+ is_parameter_solvable (p, op, defs, guesses) && get (op, p, missing ) === missing
1139+ end
1140+ pvals = getu (initializeprob, punknowns)(initializeprob)
1141+ for (p, pval) in zip (punknowns, pvals)
11291142 p = unwrap (p)
1130- op[p] = getu (initializeprob, p)(initializeprob)
1143+ op[p] = pval
11311144 if iscall (p) && operation (p) === getindex
11321145 arrp = arguments (p)[1 ]
1146+ get (op, arrp, nothing ) != = missing && continue
11331147 op[arrp] = collect (arrp)
11341148 end
11351149 end
11361150
11371151 if is_time_dependent (sys)
1138- for v in missing_unknowns
1139- op[v] = getu (initializeprob, v)(initializeprob)
1152+ uvals = getu (initializeprob, collect (missing_unknowns))(initializeprob)
1153+ for (v, val) in zip (missing_unknowns, uvals)
1154+ op[v] = val
11401155 end
11411156 empty! (missing_unknowns)
11421157 end
@@ -1371,7 +1386,7 @@ function process_SciMLProblem(
13711386 if ! (pType <: AbstractArray )
13721387 pType = Array
13731388 end
1374- p = MTKParameters (sys, op; floatT = floatT, p_constructor)
1389+ p = MTKParameters (sys, op; floatT = floatT, p_constructor, fast_path = true )
13751390 else
13761391 p = p_constructor (better_varmap_to_vars (op, ps; tofloat, container_type = pType))
13771392 end
0 commit comments