|
| 1 | +@fallback_iip_specialize function SciMLBase.BVProblem{iip, spec}( |
| 2 | + sys::System, u0map, tspan, parammap = SciMLBase.NullParameters(); |
| 3 | + check_compatibility = true, cse = true, checkbounds = false, eval_expression = false, |
| 4 | + eval_module = @__MODULE__, guesses = Dict(), kwargs...) where {iip, spec} |
| 5 | + check_complete(sys, BVProblem) |
| 6 | + check_compatibility && check_compatible_system(BVProblem, sys) |
| 7 | + |
| 8 | + # ODESystems without algebraic equations should use both fixed values + guesses |
| 9 | + # for initialization. |
| 10 | + _u0map = has_alg_eqs(sys) ? u0map : merge(Dict(u0map), Dict(guesses)) |
| 11 | + fode, u0, p = process_SciMLProblem( |
| 12 | + ODEFunction{iip, spec}, sys, _u0map, parammap; guesses, |
| 13 | + t = tspan !== nothing ? tspan[1] : tspan, check_compatibility = false, cse, checkbounds, |
| 14 | + time_dependent_init = false, kwargs...) |
| 15 | + |
| 16 | + dvs = unknowns(sys) |
| 17 | + stidxmap = Dict([v => i for (i, v) in enumerate(dvs)]) |
| 18 | + u0_idxs = has_alg_eqs(sys) ? collect(1:length(dvs)) : [stidxmap[k] for (k, v) in u0map] |
| 19 | + fbc = generate_boundary_conditions( |
| 20 | + sys, u0, u0_idxs, tspan; expression = Val{false}, cse, checkbounds) |
| 21 | + kwargs = process_kwargs(sys; kwargs...) |
| 22 | + # Call `remake` so it runs initialization if it is trivial |
| 23 | + return remake(BVProblem{iip}(fode, fbc, u0, tspan[1], p; kwargs...)) |
| 24 | +end |
| 25 | + |
| 26 | +function check_compatible_system(T::Union{Type{BVPFunction}, Type{BVProblem}}, sys::System) |
| 27 | + check_time_dependent(sys, T) |
| 28 | + check_not_dde(sys) |
| 29 | + check_no_cost(sys, T) |
| 30 | + check_has_constraints(sys, T) |
| 31 | + check_no_jumps(sys, T) |
| 32 | + check_no_noise(sys, T) |
| 33 | + check_is_continuous(sys, T) |
| 34 | +end |
0 commit comments