@@ -295,7 +295,7 @@ function SciMLBase.NonlinearFunction(sys::NonlinearSystem, args...; kwargs...)
295
295
end
296
296
297
297
function SciMLBase. NonlinearFunction {iip} (sys:: NonlinearSystem , dvs = unknowns (sys),
298
- ps = parameters (sys), u0 = nothing ;
298
+ ps = parameters (sys), u0 = nothing , p = nothing ;
299
299
version = nothing ,
300
300
jac = false ,
301
301
eval_expression = false ,
@@ -327,11 +327,22 @@ function SciMLBase.NonlinearFunction{iip}(sys::NonlinearSystem, dvs = unknowns(s
327
327
328
328
observedfun = ObservedFunctionCache (sys; eval_expression, eval_module)
329
329
330
+ if length (dvs) == length (equations (sys))
331
+ resid_prototype = nothing
332
+ else
333
+ u0ElType = u0 === nothing ? Float64 : eltype (u0)
334
+ if SciMLStructures. isscimlstructure (p)
335
+ u0ElType = promote_type (
336
+ eltype (SciMLStructures. canonicalize (SciMLStructures. Tunable (), p)[1 ]),
337
+ u0ElType)
338
+ end
339
+ resid_prototype = zeros (u0ElType, length (equations (sys)))
340
+ end
341
+
330
342
NonlinearFunction {iip} (f,
331
343
sys = sys,
332
344
jac = _jac === nothing ? nothing : _jac,
333
- resid_prototype = length (dvs) == length (equations (sys)) ? nothing :
334
- zeros (length (equations (sys))),
345
+ resid_prototype = resid_prototype,
335
346
jac_prototype = sparse ?
336
347
similar (calculate_jacobian (sys, sparse = sparse),
337
348
Float64) : nothing ,
@@ -355,7 +366,7 @@ variable and parameter vectors, respectively.
355
366
struct NonlinearFunctionExpr{iip} end
356
367
357
368
function NonlinearFunctionExpr {iip} (sys:: NonlinearSystem , dvs = unknowns (sys),
358
- ps = parameters (sys), u0 = nothing ;
369
+ ps = parameters (sys), u0 = nothing , p = nothing ;
359
370
version = nothing , tgrad = false ,
360
371
jac = false ,
361
372
linenumbers = false ,
@@ -376,8 +387,18 @@ function NonlinearFunctionExpr{iip}(sys::NonlinearSystem, dvs = unknowns(sys),
376
387
end
377
388
378
389
jp_expr = sparse ? :(similar ($ (get_jac (sys)[]), Float64)) : :nothing
379
- resid_expr = length (dvs) == length (equations (sys)) ? :nothing :
380
- :(zeros ($ (length (equations (sys)))))
390
+ if length (dvs) == length (equations (sys))
391
+ resid_expr = :nothing
392
+ else
393
+ u0ElType = u0 === nothing ? Float64 : eltype (u0)
394
+ if SciMLStructures. isscimlstructure (p)
395
+ u0ElType = promote_type (
396
+ eltype (SciMLStructures. canonicalize (SciMLStructures. Tunable (), p)[1 ]),
397
+ u0ElType)
398
+ end
399
+
400
+ resid_expr = :(zeros ($ u0ElType, $ (length (equations (sys)))))
401
+ end
381
402
ex = quote
382
403
f = $ f
383
404
jac = $ _jac
@@ -412,7 +433,7 @@ function process_NonlinearProblem(constructor, sys::NonlinearSystem, u0map, para
412
433
check_eqs_u0 (eqs, dvs, u0; kwargs... )
413
434
end
414
435
415
- f = constructor (sys, dvs, ps, u0; jac = jac, checkbounds = checkbounds,
436
+ f = constructor (sys, dvs, ps, u0, p ; jac = jac, checkbounds = checkbounds,
416
437
linenumbers = linenumbers, parallel = parallel, simplify = simplify,
417
438
sparse = sparse, eval_expression = eval_expression, eval_module = eval_module,
418
439
kwargs... )
0 commit comments