@@ -118,7 +118,7 @@ function SciMLBase.SCCNonlinearProblem{iip}(sys::System, op; eval_expression = f
118118
119119 _, u0,
120120 p = process_SciMLProblem (
121- EmptySciMLFunction{iip}, sys, op; eval_expression, eval_module, kwargs... )
121+ EmptySciMLFunction{iip}, sys, op; eval_expression, eval_module, symbolic_u0 = true , kwargs... )
122122
123123 explicitfuns = []
124124 nlfuns = []
@@ -247,17 +247,33 @@ function SciMLBase.SCCNonlinearProblem{iip}(sys::System, op; eval_expression = f
247247 p = rebuild_with_caches (p, templates... )
248248 end
249249
250+ u0_eltype = Union{}
251+ for x in u0
252+ symbolic_type (x) == NotSymbolic () || continue
253+ u0_eltype = typeof (x)
254+ break
255+ end
256+ if u0_eltype == Union{}
257+ u0_eltype = Float64
258+ end
259+ u0_eltype = float (u0_eltype)
250260 subprobs = []
251- for (f, vscc) in zip (nlfuns, var_sccs)
261+ for (i, ( f, vscc)) in enumerate ( zip (nlfuns, var_sccs) )
252262 _u0 = SymbolicUtils. Code. create_array (
253263 typeof (u0), eltype (u0), Val (1 ), Val (length (vscc)), u0[vscc]. .. )
264+ symbolic_idxs = findall (x -> symbolic_type (x) != NotSymbolic (), _u0)
265+ explicitfuns[i](p, subprobs)
254266 if f isa LinearFunction
267+ _u0 = isempty (symbolic_idxs) ? _u0 : zeros (u0_eltype, length (_u0))
268+ _u0 = u0_eltype .(_u0)
255269 symbolic_interface = f. interface
256270 A,
257271 b = get_A_b_from_LinearFunction (
258272 sys, f, p; eval_expression, eval_module, u0_constructor, u0_eltype)
259273 prob = LinearProblem (A, b, p; f = symbolic_interface, u0 = _u0)
260274 else
275+ isempty (symbolic_idxs) || throw (MissingGuessError (dvs[vscc], _u0))
276+ _u0 = u0_eltype .(_u0)
261277 prob = NonlinearProblem (f, _u0, p)
262278 end
263279 push! (subprobs, prob)
0 commit comments