@@ -118,7 +118,7 @@ function SciMLBase.SCCNonlinearProblem{iip}(sys::System, op; eval_expression = f
118
118
119
119
_, u0,
120
120
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... )
122
122
123
123
explicitfuns = []
124
124
nlfuns = []
@@ -247,17 +247,33 @@ function SciMLBase.SCCNonlinearProblem{iip}(sys::System, op; eval_expression = f
247
247
p = rebuild_with_caches (p, templates... )
248
248
end
249
249
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)
250
260
subprobs = []
251
- for (f, vscc) in zip (nlfuns, var_sccs)
261
+ for (i, ( f, vscc)) in enumerate ( zip (nlfuns, var_sccs) )
252
262
_u0 = SymbolicUtils. Code. create_array (
253
263
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)
254
266
if f isa LinearFunction
267
+ _u0 = isempty (symbolic_idxs) ? _u0 : zeros (u0_eltype, length (_u0))
268
+ _u0 = u0_eltype .(_u0)
255
269
symbolic_interface = f. interface
256
270
A,
257
271
b = get_A_b_from_LinearFunction (
258
272
sys, f, p; eval_expression, eval_module, u0_constructor, u0_eltype)
259
273
prob = LinearProblem (A, b, p; f = symbolic_interface, u0 = _u0)
260
274
else
275
+ isempty (symbolic_idxs) || throw (MissingGuessError (dvs[vscc], _u0))
276
+ _u0 = u0_eltype .(_u0)
261
277
prob = NonlinearProblem (f, _u0, p)
262
278
end
263
279
push! (subprobs, prob)
0 commit comments