651
651
652
652
Take dictionaries with initial conditions and parameters and convert them to numeric arrays `u0` and `p`. Also return the merged dictionary `defs` containing the entire operating point.
653
653
"""
654
- function get_u0_p (sys, u0map, parammap; use_union = false , tofloat = ! use_union)
654
+ function get_u0_p (sys,
655
+ u0map,
656
+ parammap;
657
+ use_union = false ,
658
+ tofloat = ! use_union,
659
+ symbolic_u0 = false )
655
660
eqs = equations (sys)
656
661
dvs = states (sys)
657
662
ps = parameters (sys)
@@ -660,7 +665,11 @@ function get_u0_p(sys, u0map, parammap; use_union = false, tofloat = !use_union)
660
665
defs = mergedefaults (defs, parammap, ps)
661
666
defs = mergedefaults (defs, u0map, dvs)
662
667
663
- u0 = varmap_to_vars (u0map, dvs; defaults = defs, tofloat = true )
668
+ if symbolic_u0
669
+ u0 = varmap_to_vars (u0map, dvs; defaults = defs, tofloat = false , use_union = false )
670
+ else
671
+ u0 = varmap_to_vars (u0map, dvs; defaults = defs, tofloat = true )
672
+ end
664
673
p = varmap_to_vars (parammap, ps; defaults = defs, tofloat, use_union)
665
674
p = p === nothing ? SciMLBase. NullParameters () : p
666
675
u0, p, defs
@@ -676,13 +685,14 @@ function process_DEProblem(constructor, sys::AbstractODESystem, u0map, parammap;
676
685
eval_expression = true ,
677
686
use_union = false ,
678
687
tofloat = ! use_union,
688
+ symbolic_u0 = false ,
679
689
kwargs... )
680
690
eqs = equations (sys)
681
691
dvs = states (sys)
682
692
ps = parameters (sys)
683
693
iv = get_iv (sys)
684
694
685
- u0, p, defs = get_u0_p (sys, u0map, parammap; tofloat, use_union)
695
+ u0, p, defs = get_u0_p (sys, u0map, parammap; tofloat, use_union, symbolic_u0 )
686
696
687
697
if implicit_dae && du0map != = nothing
688
698
ddvs = map (Differential (iv), dvs)
@@ -874,11 +884,14 @@ function DiffEqBase.DAEProblem{iip}(sys::AbstractODESystem, du0map, u0map, tspan
874
884
end
875
885
end
876
886
887
+ function generate_history (sys:: AbstractODESystem , u0; kwargs... )
888
+ build_function (u0, parameters (sys), get_iv (sys); expression = Val{false }, kwargs... )
889
+ end
890
+
877
891
function DiffEqBase. DDEProblem (sys:: AbstractODESystem , args... ; kwargs... )
878
892
DDEProblem {true} (sys, args... ; kwargs... )
879
893
end
880
894
function DiffEqBase. DDEProblem {iip} (sys:: AbstractODESystem , u0map = [],
881
- h = (u, p) -> zeros (length (states (sts))),
882
895
tspan = get_tspan (sys),
883
896
parammap = DiffEqBase. NullParameters ();
884
897
callback = nothing ,
@@ -888,7 +901,11 @@ function DiffEqBase.DDEProblem{iip}(sys::AbstractODESystem, u0map = [],
888
901
f, u0, p = process_DEProblem (DDEFunction{iip}, sys, u0map, parammap;
889
902
t = tspan != = nothing ? tspan[1 ] : tspan,
890
903
has_difference = has_difference,
904
+ symbolic_u0 = true ,
891
905
check_length, kwargs... )
906
+ h_oop, h_iip = generate_history (sys, u0)
907
+ h = h_oop
908
+ u0 = h (p, tspan[1 ])
892
909
cbs = process_events (sys; callback, has_difference, kwargs... )
893
910
if has_discrete_subsystems (sys) && (dss = get_discrete_subsystems (sys)) != = nothing
894
911
affects, clocks, svs = ModelingToolkit. generate_discrete_affect (dss... )
0 commit comments