From 938dc2af9d3f8b12598c395343a4424305012e42 Mon Sep 17 00:00:00 2001 From: Christopher Rackauckas Date: Sun, 8 Sep 2024 16:26:16 +0200 Subject: [PATCH 1/5] Handle dummy derivatives and more in initialize_equations Also throws a better error for the case where a differential is not caught in the initialization system handling. Fixes https://github.com/SciML/ModelingToolkit.jl/issues/3029 --- src/structural_transformation/symbolics_tearing.jl | 1 + src/systems/nonlinear/initializesystem.jl | 13 ++++++++----- test/initializationsystem.jl | 10 ++++++++++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/structural_transformation/symbolics_tearing.jl b/src/structural_transformation/symbolics_tearing.jl index 1a761803f3..a99e043878 100644 --- a/src/structural_transformation/symbolics_tearing.jl +++ b/src/structural_transformation/symbolics_tearing.jl @@ -453,6 +453,7 @@ function tearing_reassemble(state::TearingState, var_eq_matching, # convert it into the mass matrix form. # We cannot solve the differential variable like D(x) if isdervar(iv) + isnothing(D) && error("Differential found in a non-differential system. Likely this is a bug in the construction of an initialization system. Please report this issue with a reproducible example. Offending equation: $(equations(sys)[ieq])") order, lv = var_order(iv) dx = D(simplify_shifts(lower_varname_withshift( fullvars[lv], idep, order - 1))) diff --git a/src/systems/nonlinear/initializesystem.jl b/src/systems/nonlinear/initializesystem.jl index cc0b8098a1..98014058b2 100644 --- a/src/systems/nonlinear/initializesystem.jl +++ b/src/systems/nonlinear/initializesystem.jl @@ -91,13 +91,16 @@ function generate_initializesystem(sys::ODESystem; end end - pars = [parameters(sys); get_iv(sys)] - nleqs = if algebraic_only - [eqs_ics; observed(sys)] - else - [eqs_ics; get_initialization_eqs(sys); initialization_eqs; observed(sys)] + if !algebraic_only + for eq in [get_initialization_eqs(sys); initialization_eqs] + _eq = ModelingToolkit.fixpoint_sub(eq, full_diffmap) + push!(eqs_ics,_eq) + end end + pars = [parameters(sys); get_iv(sys)] + nleqs = [eqs_ics; observed(sys)] + sys_nl = NonlinearSystem(nleqs, full_states, pars; diff --git a/test/initializationsystem.jl b/test/initializationsystem.jl index 482147beba..9afb4a526b 100644 --- a/test/initializationsystem.jl +++ b/test/initializationsystem.jl @@ -508,3 +508,13 @@ end sol2 = solve(prob2, Tsit5()) @test all(sol2[x] .== 2) && all(sol2[y] .== 2) end + +# https://github.com/SciML/ModelingToolkit.jl/issues/3029 +@testset "Derivatives in Initialization Equations" begin + @variables x(t) + sys = ODESystem([D(D(x)) ~ 0], t; initialization_eqs = [x ~ 0, D(x) ~ 1], name = :sys) |> structural_simplify + @test_nowarn ODEProblem(sys, [], (0.0, 1.0), []); + + sys = ODESystem([D(D(x)) ~ 0], t; initialization_eqs = [x ~ 0, D(D(x)) ~ 0], name = :sys) |> structural_simplify + @test_nowarn ODEProblem(sys, [D(x) => 1.0], (0.0, 1.0), []); +end \ No newline at end of file From 12baa965df472f1c09648034ac6507fec450ebfb Mon Sep 17 00:00:00 2001 From: Christopher Rackauckas Date: Sun, 8 Sep 2024 16:44:54 +0200 Subject: [PATCH 2/5] Update src/structural_transformation/symbolics_tearing.jl Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/structural_transformation/symbolics_tearing.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/structural_transformation/symbolics_tearing.jl b/src/structural_transformation/symbolics_tearing.jl index a99e043878..815851a3b6 100644 --- a/src/structural_transformation/symbolics_tearing.jl +++ b/src/structural_transformation/symbolics_tearing.jl @@ -453,7 +453,8 @@ function tearing_reassemble(state::TearingState, var_eq_matching, # convert it into the mass matrix form. # We cannot solve the differential variable like D(x) if isdervar(iv) - isnothing(D) && error("Differential found in a non-differential system. Likely this is a bug in the construction of an initialization system. Please report this issue with a reproducible example. Offending equation: $(equations(sys)[ieq])") + isnothing(D) && + error("Differential found in a non-differential system. Likely this is a bug in the construction of an initialization system. Please report this issue with a reproducible example. Offending equation: $(equations(sys)[ieq])") order, lv = var_order(iv) dx = D(simplify_shifts(lower_varname_withshift( fullvars[lv], idep, order - 1))) From 90b90009e3a2569cedccbc24c59b8dbd176b8f23 Mon Sep 17 00:00:00 2001 From: Christopher Rackauckas Date: Sun, 8 Sep 2024 16:45:01 +0200 Subject: [PATCH 3/5] Update src/systems/nonlinear/initializesystem.jl Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/systems/nonlinear/initializesystem.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/systems/nonlinear/initializesystem.jl b/src/systems/nonlinear/initializesystem.jl index 98014058b2..aa1ecd9a8b 100644 --- a/src/systems/nonlinear/initializesystem.jl +++ b/src/systems/nonlinear/initializesystem.jl @@ -94,7 +94,7 @@ function generate_initializesystem(sys::ODESystem; if !algebraic_only for eq in [get_initialization_eqs(sys); initialization_eqs] _eq = ModelingToolkit.fixpoint_sub(eq, full_diffmap) - push!(eqs_ics,_eq) + push!(eqs_ics, _eq) end end From 4b138e8f7d28740b16545c6404195a0b99e510e7 Mon Sep 17 00:00:00 2001 From: Christopher Rackauckas Date: Sun, 8 Sep 2024 16:45:08 +0200 Subject: [PATCH 4/5] Update test/initializationsystem.jl Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- test/initializationsystem.jl | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/test/initializationsystem.jl b/test/initializationsystem.jl index 9afb4a526b..3d193149a4 100644 --- a/test/initializationsystem.jl +++ b/test/initializationsystem.jl @@ -512,9 +512,13 @@ end # https://github.com/SciML/ModelingToolkit.jl/issues/3029 @testset "Derivatives in Initialization Equations" begin @variables x(t) - sys = ODESystem([D(D(x)) ~ 0], t; initialization_eqs = [x ~ 0, D(x) ~ 1], name = :sys) |> structural_simplify - @test_nowarn ODEProblem(sys, [], (0.0, 1.0), []); - - sys = ODESystem([D(D(x)) ~ 0], t; initialization_eqs = [x ~ 0, D(D(x)) ~ 0], name = :sys) |> structural_simplify - @test_nowarn ODEProblem(sys, [D(x) => 1.0], (0.0, 1.0), []); + sys = ODESystem( + [D(D(x)) ~ 0], t; initialization_eqs = [x ~ 0, D(x) ~ 1], name = :sys) |> + structural_simplify + @test_nowarn ODEProblem(sys, [], (0.0, 1.0), []) + + sys = ODESystem( + [D(D(x)) ~ 0], t; initialization_eqs = [x ~ 0, D(D(x)) ~ 0], name = :sys) |> + structural_simplify + @test_nowarn ODEProblem(sys, [D(x) => 1.0], (0.0, 1.0), []) end \ No newline at end of file From 9f535c73f69a46e1a0f8779539eae8c37005430d Mon Sep 17 00:00:00 2001 From: Christopher Rackauckas Date: Sun, 8 Sep 2024 17:14:02 +0200 Subject: [PATCH 5/5] format --- test/initializationsystem.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/initializationsystem.jl b/test/initializationsystem.jl index 3d193149a4..d535d42011 100644 --- a/test/initializationsystem.jl +++ b/test/initializationsystem.jl @@ -521,4 +521,4 @@ end [D(D(x)) ~ 0], t; initialization_eqs = [x ~ 0, D(D(x)) ~ 0], name = :sys) |> structural_simplify @test_nowarn ODEProblem(sys, [D(x) => 1.0], (0.0, 1.0), []) -end \ No newline at end of file +end