ModelingToolkit.jl icon indicating copy to clipboard operation
ModelingToolkit.jl copied to clipboard

Cannot find parent of var - 2nd order system problem - sol[u]

Open xtalax opened this issue 2 years ago • 3 comments

Solution retrieval fails with second order system:

# Packages and inclusions
using ModelingToolkit
using OrdinaryDiffEq

using ModelingToolkit: Differential

# Parameters, variables, and derivatives
@parameters t
@variables (u(..))[1:6]
D = Differential(t)

eqs = [0.9(u(t))[6] + D(D((u(t))[2])) ~ 0,
    - 0.9(u(t))[4] + D(D((u(t))[3])) ~ 0,
    - 0.9(u(t))[5] + D(D((u(t))[4])) ~ 0,
    0.9(u(t))[6] + D(D((u(t))[5])) ~ 0,
    - 0.9(u(t))[5] + D(D((u(t))[6])) ~ 0,
    (u(t))[1] ~ (u(t))[6]]

defaults = Dict(vcat([u(t)[i] => 0.0 for i in 1:6], [D(u(t)[i]) => 1.0 for i in 1:6]))

ps = Pair[]

sys = ODESystem(eqs, t, [u(t)[i] for i in 1:6], ps, defaults=defaults, name = :sys)

simpsys = structural_simplify(sys)

prob = ODEProblem(simpsys, Pair[], (0, 2pi))

sol = solve(prob, Tsit5(), saveat=pi / 40)

usol = map(d -> sol[d][1], u(t)[1:6]) # fail
ERROR: ArgumentError: Cannot find the parent of var"u(t)[6]ˍtt".
Stacktrace:
  [1] getparent
    @ ~/.julia/packages/Symbolics/4VdEG/src/variable.jl:420 [inlined]
  [2] getparent
    @ ~/.julia/packages/Symbolics/4VdEG/src/variable.jl:412 [inlined]
  [3] _getname(x::Sym{Real, Nothing}, val::Dict{Any, Any})
    @ Symbolics ~/.julia/packages/Symbolics/4VdEG/src/variable.jl:401
  [4] getname(x::Sym{Real, Nothing}, val::Dict{Any, Any}) (repeats 2 times)
    @ Symbolics ~/.julia/packages/Symbolics/4VdEG/src/variable.jl:409
  [5] renamespace(sys::ODESystem, x::Sym{Real, Nothing})
    @ ModelingToolkit ~/.julia/dev/ModelingToolkit.jl/src/systems/abstractsystem.jl:362
  [6] states(sys::ODESystem, v::Sym{Real, Nothing})
    @ ModelingToolkit ~/.julia/dev/ModelingToolkit.jl/src/systems/abstractsystem.jl:469
  [7] (::ModelingToolkit.var"#314#319"{ODESystem})(x::Equation)
    @ ModelingToolkit ./none:0
  [8] iterate
    @ ./generator.jl:47 [inlined]
  [9] _all(f::Base.var"#282#284", itr::Base.Generator{Vector{Equation}, ModelingToolkit.var"#314#319"{ODESystem}}, #unused#::Colon)
    @ Base ./reduce.jl:930
 [10] all
    @ ./reduce.jl:918 [inlined]
 [11] Dict(kv::Base.Generator{Vector{Equation}, ModelingToolkit.var"#314#319"{ODESystem}})
    @ Base ./dict.jl:131
 [12] build_explicit_observed_function(sys::ODESystem, ts::Term{Real, Nothing}; expression::Bool, output_type::Type, checkbounds::Bool)
    @ ModelingToolkit ~/.julia/dev/ModelingToolkit.jl/src/systems/diffeqs/odesystem.jl:289
 [13] #443
    @ ~/.julia/dev/ModelingToolkit.jl/src/systems/diffeqs/abstractodesystem.jl:324 [inlined]
 [14] get!(default::ModelingToolkit.var"#443#453"{Term{Real, Nothing}, Bool, ODESystem}, h::Dict{Any, Any}, key::Term{Real, Nothing})
    @ Base ./dict.jl:465
 [15] (::ModelingToolkit.var"#487#generated_observed#452"{Bool, ODESystem, Dict{Any, Any}})(obsvar::Term{Real, Nothing}, u::Vector{Float64}, p::Nothing, t::Float64)
    @ ModelingToolkit ~/.julia/dev/ModelingToolkit.jl/src/systems/diffeqs/abstractodesystem.jl:323
 [16] _broadcast_getindex_evalf
    @ ./broadcast.jl:648 [inlined]
 [17] _broadcast_getindex
    @ ./broadcast.jl:621 [inlined]
 [18] getindex
    @ ./broadcast.jl:575 [inlined]
 [19] copy
    @ ./broadcast.jl:922 [inlined]
 [20] materialize
    @ ./broadcast.jl:883 [inlined]
 [21] observed(A::ODESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Vector{Float64}, Vector{Vector{Vector{Float64}}}, ODEProblem{Vector{Float64}, Tuple{Float64, Float64}, true, Nothing, ODEFunction{true, ModelingToolkit.var"#f#445"{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0xc4098de7, 0x62f66434, 0xe4e20897, 0x0e1ea755, 0xe022be12)}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x48300cf2, 0xdcdfd486, 0xaafcb0fa, 0xbd987137, 0x3be637a3)}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Vector{Symbol}, Symbol, ModelingToolkit.var"#487#generated_observed#452"{Bool, ODESystem, Dict{Any, Any}}, Nothing}, Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, SciMLBase.StandardODEProblem}, Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, OrdinaryDiffEq.InterpolationData{ODEFunction{true, ModelingToolkit.var"#f#445"{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0xc4098de7, 0x62f66434, 0xe4e20897, 0x0e1ea755, 0xe022be12)}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x48300cf2, 0xdcdfd486, 0xaafcb0fa, 0xbd987137, 0x3be637a3)}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Vector{Symbol}, Symbol, ModelingToolkit.var"#487#generated_observed#452"{Bool, ODESystem, Dict{Any, Any}}, Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, OrdinaryDiffEq.Tsit5Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.Tsit5ConstantCache{Float64, Float64}, typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}}, DiffEqBase.DEStats}, sym::Term{Real, Nothing}, i::Colon)
    @ SciMLBase ~/.julia/packages/SciMLBase/YasGG/src/solutions/solution_interface.jl:117
 [22] getindex(A::ODESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Vector{Float64}, Vector{Vector{Vector{Float64}}}, ODEProblem{Vector{Float64}, Tuple{Float64, Float64}, true, Nothing, ODEFunction{true, ModelingToolkit.var"#f#445"{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0xc4098de7, 0x62f66434, 0xe4e20897, 0x0e1ea755, 0xe022be12)}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x48300cf2, 0xdcdfd486, 0xaafcb0fa, 0xbd987137, 0x3be637a3)}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Vector{Symbol}, Symbol, ModelingToolkit.var"#487#generated_observed#452"{Bool, ODESystem, Dict{Any, Any}}, Nothing}, Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, SciMLBase.StandardODEProblem}, Tsit5{typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}, OrdinaryDiffEq.InterpolationData{ODEFunction{true, ModelingToolkit.var"#f#445"{RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0xc4098de7, 0x62f66434, 0xe4e20897, 0x0e1ea755, 0xe022be12)}, RuntimeGeneratedFunctions.RuntimeGeneratedFunction{(:ˍ₋out, :ˍ₋arg1, :ˍ₋arg2, :t), ModelingToolkit.var"#_RGF_ModTag", ModelingToolkit.var"#_RGF_ModTag", (0x48300cf2, 0xdcdfd486, 0xaafcb0fa, 0xbd987137, 0x3be637a3)}}, LinearAlgebra.UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Vector{Symbol}, Symbol, ModelingToolkit.var"#487#generated_observed#452"{Bool, ODESystem, Dict{Any, Any}}, Nothing}, Vector{Vector{Float64}}, Vector{Float64}, Vector{Vector{Vector{Float64}}}, OrdinaryDiffEq.Tsit5Cache{Vector{Float64}, Vector{Float64}, Vector{Float64}, OrdinaryDiffEq.Tsit5ConstantCache{Float64, Float64}, typeof(OrdinaryDiffEq.trivial_limiter!), typeof(OrdinaryDiffEq.trivial_limiter!), Static.False}}, DiffEqBase.DEStats}, sym::Term{Real, Nothing})
    @ SciMLBase ~/.julia/packages/SciMLBase/YasGG/src/solutions/solution_interface.jl:78
 [23] (::var"#21#22")(d::Term{Real, Nothing})
    @ Main ~/.julia/dev/MethodOfLines.jl/src/scratch/wavemwe.jl:37
 [24] _map(::Function, ::Symbolics.ArrayOp{Vector{Real}})
    @ Symbolics ~/.julia/packages/Symbolics/4VdEG/src/array-lib.jl:292
 [25] macro expansion
    @ ~/.julia/packages/Symbolics/4VdEG/src/array-lib.jl:283 [inlined]
 [26] var"Base.map_4228762831532280247"(f::Function, x::Symbolics.ArrayOp{Vector{Real}})
    @ Symbolics ~/.julia/packages/Symbolics/4VdEG/src/wrapper-types.jl:114
 [27] map(f::Function, x::Symbolics.Arr{Num, 1})
    @ Symbolics ~/.julia/packages/Symbolics/4VdEG/src/wrapper-types.jl:123
 [28] top-level scope
    @ ~/.julia/dev/MethodOfLines.jl/src/scratch/wavemwe.jl:37

Simplification due to the equation (u(t))[1] ~ (u(t))[6] seems suspect.

xtalax avatar Aug 11 '22 15:08 xtalax

@shashi could you take a look? We won't need getparent now, right?

YingboMa avatar Aug 12 '22 00:08 YingboMa

Yeah, it shouldn't be trying to find the parent.

shashi avatar Aug 12 '22 20:08 shashi

Any progress on this?

xtalax avatar Aug 23 '22 13:08 xtalax

I'm also getting a similar error for something I'm working on. I haven't quite gotten it down to a mwe yet (outputs of individual component simulations seem fine, but the full connected system gets this error).

jonniedie avatar Oct 01 '22 03:10 jonniedie