@@ -631,11 +631,12 @@ All other keyword arguments are forwarded to `InitializationProblem`.
631
631
"""
632
632
function maybe_build_initialization_problem (
633
633
sys:: AbstractSystem , op:: AbstractDict , u0map, pmap, t, defs,
634
- guesses, missing_unknowns; implicit_dae = false , u0_constructor = identity, kwargs... )
634
+ guesses, missing_unknowns; implicit_dae = false ,
635
+ u0_constructor = identity, floatT = Float64, kwargs... )
635
636
guesses = merge (ModelingToolkit. guesses (sys), todict (guesses))
636
637
637
638
if t === nothing && is_time_dependent (sys)
638
- t = 0.0
639
+ t = zero (floatT)
639
640
end
640
641
641
642
initializeprob = ModelingToolkit. InitializationProblem {true, SciMLBase.FullSpecialize} (
@@ -675,7 +676,7 @@ function maybe_build_initialization_problem(
675
676
get (op, p, missing ) === missing || continue
676
677
p = unwrap (p)
677
678
stype = symtype (p)
678
- op[p] = get_temporary_value (p)
679
+ op[p] = get_temporary_value (p, floatT )
679
680
if iscall (p) && operation (p) === getindex
680
681
arrp = arguments (p)[1 ]
681
682
op[arrp] = collect (arrp)
@@ -684,7 +685,7 @@ function maybe_build_initialization_problem(
684
685
685
686
if is_time_dependent (sys)
686
687
for v in missing_unknowns
687
- op[v] = zero_var (v )
688
+ op[v] = get_temporary_value (v, floatT )
688
689
end
689
690
empty! (missing_unknowns)
690
691
end
@@ -798,12 +799,26 @@ function process_SciMLProblem(
798
799
op, missing_unknowns, missing_pars = build_operating_point! (sys,
799
800
u0map, pmap, defs, cmap, dvs, ps)
800
801
802
+ floatT = Bool
803
+ for (k, v) in op
804
+ symbolic_type (v) == NotSymbolic () || continue
805
+ is_array_of_symbolics (v) && continue
806
+
807
+ if v isa AbstractArray
808
+ isconcretetype (eltype (v)) || continue
809
+ floatT = promote_type (floatT, eltype (v))
810
+ elseif v isa Real && isconcretetype (v)
811
+ floatT = promote_type (floatT, typeof (v))
812
+ end
813
+ end
814
+ floatT = float (floatT)
815
+
801
816
if ! is_time_dependent (sys) || is_initializesystem (sys)
802
817
add_observed_equations! (u0map, obs)
803
818
end
804
819
if u0_constructor === identity && u0Type <: StaticArray
805
820
u0_constructor = vals -> SymbolicUtils. Code. create_array (
806
- u0Type, eltype (vals) , Val (1 ), Val (length (vals)), vals... )
821
+ u0Type, floatT , Val (1 ), Val (length (vals)), vals... )
807
822
end
808
823
if build_initializeprob
809
824
kws = maybe_build_initialization_problem (
@@ -813,7 +828,7 @@ function process_SciMLProblem(
813
828
warn_cyclic_dependency, check_units = check_initialization_units,
814
829
circular_dependency_max_cycle_length, circular_dependency_max_cycles, use_scc,
815
830
force_time_independent = force_initialization_time_independent, algebraic_only, allow_incomplete,
816
- u0_constructor)
831
+ u0_constructor, floatT )
817
832
818
833
kwargs = merge (kwargs, kws)
819
834
end
@@ -841,7 +856,7 @@ function process_SciMLProblem(
841
856
evaluate_varmap! (op, dvs; limit = substitution_limit)
842
857
843
858
u0 = better_varmap_to_vars (
844
- op, dvs; tofloat,
859
+ op, dvs; tofloat, floatT,
845
860
container_type = u0Type, allow_symbolic = symbolic_u0, is_initializeprob)
846
861
847
862
if u0 != = nothing
@@ -865,7 +880,7 @@ function process_SciMLProblem(
865
880
end
866
881
evaluate_varmap! (op, ps; limit = substitution_limit)
867
882
if is_split (sys)
868
- p = MTKParameters (sys, op)
883
+ p = MTKParameters (sys, op; floatT = floatT )
869
884
else
870
885
p = better_varmap_to_vars (op, ps; tofloat, container_type = pType)
871
886
end
0 commit comments