11using ModelingToolkit, OrdinaryDiffEq, NonlinearSolve, Test
2+ using SymbolicIndexingInterface
23using ModelingToolkit: t_nounits as t, D_nounits as D
34
45@parameters g
@@ -493,27 +494,69 @@ end
493494 @test init (prob, Tsit5 ()). ps[sym] ≈ val
494495 @test solve (prob, Tsit5 ()). ps[sym] ≈ val
495496 end
497+ function test_initializesystem (sys, u0map, pmap, p, equation)
498+ isys = ModelingToolkit. generate_initializesystem (sys; u0map, pmap, guesses = ModelingToolkit. guesses (sys))
499+ @test is_variable (isys, p)
500+ @test equation in equations (isys) || (0 ~ - equation. rhs) in equations (isys)
501+ end
496502 @variables x (t) y (t)
497- @parameters p
498- _p = ModelingToolkit. setdefault (p, missing )
499- _p = ModelingToolkit. setguess (_p, 0.0 )
500- @mtkbuild sys = ODESystem ([D (x) ~ x, _p ~ x + y], t)
501- prob = ODEProblem (sys, [x => 1.0 , y => 1.0 ], (0.0 , 1.0 ))
502- test_parameter (prob, _p, 2.0 )
503+ @parameters p q
504+ u0map = Dict (x => 1.0 , y => 1.0 )
505+ pmap = Dict ()
506+ pmap[q] = 1.0
507+ # `missing` default, equation from ODEProblem
508+ @mtkbuild sys = ODESystem ([D (x) ~ x * q, D (y) ~ y * p], t; defaults = [p => missing ])
509+ pmap[p] = 2 q
510+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), pmap)
511+ test_parameter (prob, p, 2.0 )
512+ # `missing` default, provided guess
503513 @mtkbuild sys = ODESystem (
504514 [D (x) ~ x, p ~ x + y], t; defaults = [p => missing ], guesses = [p => 0.0 ])
505- prob = ODEProblem (sys, [x => 1.0 , y => 1.0 ] , (0.0 , 1.0 ))
515+ prob = ODEProblem (sys, u0map , (0.0 , 1.0 ))
506516 test_parameter (prob, p, 2.0 )
507- @mtkbuild sys = ODESystem ([D (x) ~ x, p ~ x + y], t; guesses = [p => 0.0 ])
508- prob = ODEProblem (sys, [x => 1.0 , y => 1.0 ], (0.0 , 1.0 ), [p => missing ])
517+ test_initializesystem (sys, u0map, pmap, p, 0 ~ p - x - y)
518+
519+ # `missing` to ODEProblem, equation from default
520+ @mtkbuild sys = ODESystem ([D (x) ~ x * q, D (y) ~ y * p], t; defaults = [p => 2 q])
521+ pmap[p] = missing
522+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), pmap)
523+ test_parameter (prob, p, 2.0 )
524+ test_initializesystem (sys, u0map, pmap, p, 0 ~ 2 q - p)
525+ test_parameter (prob2, p, 2.0 )
526+ # `missing` to ODEProblem, provided guess
527+ @mtkbuild sys = ODESystem (
528+ [D (x) ~ x, p ~ x + y], t; guesses = [p => 0.0 ])
529+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), pmap)
509530 test_parameter (prob, p, 2.0 )
531+ test_initializesystem (sys, u0map, pmap, p, 0 ~ x + y - p)
510532
511- @mtkbuild sys = ODESystem ([D (x) ~ x, p ~ x + y], t; guesses = [p => 1.0 ])
533+ # No `missing`, default and guess
534+ @mtkbuild sys = ODESystem ([D (x) ~ x * q, D (y) ~ y * p], t; defaults = [p => 2 q], guesses = [p => 0.0 ])
535+ delete! (pmap, p)
536+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), pmap)
537+ test_parameter (prob, p, 2.0 )
538+ test_initializesystem (sys, u0map, pmap, p, 0 ~ 2 q - p)
539+
540+ # Should not be solved for:
541+
542+ # ODEProblem value with guess, no `missing`
543+ @mtkbuild sys = ODESystem ([D (x) ~ x * q, D (y) ~ y * p], t; guesses = [p => 0.0 ])
544+ _pmap = merge (pmap, Dict (p => 3 q))
545+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), _pmap)
546+ @test prob. ps[p] ≈ 3.0
547+ @test prob. f. initializeprob === nothing
548+ # Default overridden by ODEProblem, guess provided
549+ @mtkbuild sys = ODESystem ([D (x) ~ q * x, D (y) ~ y * p], t; defaults = [p => 2 q], guesses = [p => 1.0 ])
550+ prob = ODEProblem (sys, u0map, (0.0 , 1.0 ), _pmap)
551+ @test prob. ps[p] ≈ 3.0
552+ @test prob. f. initializeprob === nothing
553+
554+ @mtkbuild sys = ODESystem ([D (x) ~ x, p ~ x + y], t; guesses = [p => 0.0 ])
512555 @test_throws ModelingToolkit. MissingParametersError ODEProblem (
513556 sys, [x => 1.0 , y => 1.0 ], (0.0 , 1.0 ))
514557 @mtkbuild sys = ODESystem ([D (x) ~ x, p ~ x + y], t)
515- @test_throws [" Invalid setup" , " parameter p" , " guess" ] ODEProblem (
516- sys, [ x => 1.0 , y => 1.0 ], ( 0.0 , 1.0 ), [ p => missing ] )
558+ @test_throws [" Invalid setup" , " parameter p" , " guess" ] ModelingToolkit . generate_initializesystem (
559+ sys; u0map = Dict ( x => 1.0 , y => 1.0 ), pmap = Dict ( p => missing ), check_defguess = true )
517560
518561 @testset " Null system" begin
519562 @variables x (t) y (t) s (t)
@@ -526,14 +569,15 @@ end
526569 using ModelingToolkitStandardLibrary. Mechanical. TranslationalModelica: Fixed, Mass,
527570 Spring, Force,
528571 Damper
572+ using ModelingToolkitStandardLibrary. Mechanical: TranslationalModelica as TM
529573 using ModelingToolkitStandardLibrary. Blocks: Constant
530574
531- @named mass = Mass (; m = 1.0 , s = 1.0 , v = 0.0 , a = 0.0 )
575+ @named mass = TM . Mass (; m = 1.0 , s = 1.0 , v = 0.0 , a = 0.0 )
532576 @named fixed = Fixed (; s0 = 0.0 )
533- @named spring = Spring (; c = 2.0 )
577+ @named spring = Spring (; c = 2.0 , s_rel0 = nothing )
534578 @named gravity = Force ()
535579 @named constant = Constant (; k = 9.81 )
536- @named damper = Damper (; d = 0.1 )
580+ @named damper = TM . Damper (; d = 0.1 )
537581 @mtkbuild sys = ODESystem (
538582 [connect (fixed. flange, spring. flange_a), connect (spring. flange_b, mass. flange_a),
539583 connect (mass. flange_a, gravity. flange), connect (constant. output, gravity. f),
0 commit comments