@@ -117,7 +117,8 @@ function SciMLBase.SCCNonlinearProblem{iip}(sys::System, op; eval_expression = f
117117    obs =  observed (sys)
118118
119119    _, u0, p =  process_SciMLProblem (
120-         EmptySciMLFunction{iip}, sys, op; eval_expression, eval_module, u0_constructor, kwargs... )
120+         EmptySciMLFunction{iip}, sys, op; eval_expression, eval_module, u0_constructor,
121+         symbolic_u0 =  true , kwargs... )
121122
122123    explicitfuns =  []
123124    nlfuns =  []
@@ -246,16 +247,31 @@ function SciMLBase.SCCNonlinearProblem{iip}(sys::System, op; eval_expression = f
246247        p =  rebuild_with_caches (p, templates... )
247248    end 
248249
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 
249259    subprobs =  []
250-     for  (f, vscc) in  zip (nlfuns, var_sccs)
260+     for  (i, ( f, vscc))  in  enumerate ( zip (nlfuns, var_sccs) )
251261        _u0 =  SymbolicUtils. Code. create_array (
252262            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)
253265        if  f isa  LinearFunction
266+             _u0 =  isempty (symbolic_idxs) ?  _u0 :  zeros (u0_eltype, length (_u0))
267+             _u0 =  u0_eltype .(_u0)
254268            symbolic_interface =  f. interface
255269            A, b =  get_A_b_from_LinearFunction (
256270                sys, f, p; eval_expression, eval_module, u0_constructor)
257-             prob =  LinearProblem (A, b, p; u0  =  _u0, f  =  symbolic_interface )
271+             prob =  LinearProblem (A, b, p; f  =  symbolic_interface, u0  =  _u0 )
258272        else 
273+             isempty (symbolic_idxs) ||  throw (MissingGuessError (dvs[vscc], _u0))
274+             _u0 =  u0_eltype .(_u0)
259275            prob =  NonlinearProblem (f, _u0, p)
260276        end 
261277        push! (subprobs, prob)
0 commit comments