@@ -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,32 @@ 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
250
259
subprobs = []
251
- for (f, vscc) in zip (nlfuns, var_sccs)
260
+ for (i, ( f, vscc)) in enumerate ( zip (nlfuns, var_sccs) )
252
261
_u0 = SymbolicUtils. Code. create_array (
253
262
typeof (u0), eltype (u0), Val (1 ), Val (length (vscc)), u0[vscc]. .. )
263
+ symbolic_idxs = findall (x -> symbolic_type (x) != NotSymbolic (), _u0)
264
+ explicitfuns[i](p, subprobs)
254
265
if f isa LinearFunction
266
+ _u0 = isempty (symbolic_idxs) ? _u0 : zeros (u0_eltype, length (_u0))
267
+ _u0 = u0_eltype .(_u0)
255
268
symbolic_interface = f. interface
256
269
A,
257
270
b = get_A_b_from_LinearFunction (
258
271
sys, f, p; eval_expression, eval_module, u0_constructor)
259
- prob = LinearProblem (A, b, p; u0 = _u0, f = symbolic_interface )
272
+ prob = LinearProblem (A, b, p; f = symbolic_interface, u0 = _u0 )
260
273
else
274
+ isempty (symbolic_idxs) || throw (MissingGuessError (dvs[vscc], _u0))
275
+ _u0 = u0_eltype .(_u0)
261
276
prob = NonlinearProblem (f, _u0, p)
262
277
end
263
278
push! (subprobs, prob)
0 commit comments