@@ -1552,3 +1552,60 @@ end
15521552    expected_tstops =  unique! (sort! (vcat (0.0 : 0.075 : 10.0 , 0.1 , 0.2 , 0.65 , 0.35 , 0.45 )))
15531553    @test  all (x ->  any (isapprox (x, atol =  1e-6 ), sol2. t), expected_tstops)
15541554end 
1555+ 
1556+ @testset  " dae_order_lowering basic test"   begin 
1557+     @parameters  a
1558+     @variables  x (t) y (t) z (t)
1559+     @named  dae_sys =  ODESystem ([
1560+         D (x) ~  y,
1561+         0  ~  x +  z,
1562+         0  ~  x -  y +  z
1563+     ], t, [z, y, x], [])
1564+ 
1565+     lowered_dae_sys =  dae_order_lowering (dae_sys)
1566+     @variables  x1 (t) y1 (t) z1 (t) 
1567+     expected_eqs =  [
1568+         0  ~  x +  z,
1569+         0  ~  x -  y +  z,
1570+         Differential (t)(x) ~  y
1571+     ]
1572+     lowered_eqs =  equations (lowered_dae_sys)
1573+     sorted_lowered_eqs =  sort (lowered_eqs, by= string)
1574+     sorted_expected_eqs =  sort (expected_eqs, by= string)
1575+     @test  sorted_lowered_eqs ==  sorted_expected_eqs
1576+ 
1577+     expected_vars =  Set ([z, y, x])
1578+     lowered_vars =  Set (unknowns (lowered_dae_sys))
1579+     @test  lowered_vars ==  expected_vars
1580+ end 
1581+ 
1582+ @testset  " dae_order_lowering test with structural_simplify"   begin 
1583+     @variables  x (t) y (t) z (t)
1584+     @parameters  M b k
1585+     eqs =  [
1586+         D (D (x)) ~  - b /  M *  D (x) -  k /  M *  x,
1587+         0  ~  y -  D (x),
1588+         0  ~  z -  x
1589+     ]
1590+     ps =  [M, b, k]
1591+     default_u0 =  [
1592+         D (x) =>  0.0 , x =>  10.0 , y =>  0.0 , z =>  10.0 
1593+     ]
1594+     default_p =  [M =>  1.0 , b =>  1.0 , k =>  1.0 ]
1595+     @named  dae_sys =  ODESystem (eqs, t, [x, y, z], ps; defaults =  [default_u0; default_p])
1596+ 
1597+     simplified_dae_sys =  structural_simplify (dae_sys)
1598+ 
1599+     lowered_dae_sys =  dae_order_lowering (simplified_dae_sys)
1600+     lowered_dae_sys =  complete (lowered_dae_sys)
1601+ 
1602+     tspan =  (0.0 , 10.0 )
1603+     prob =  ODEProblem (lowered_dae_sys, nothing , tspan)
1604+     sol =  solve (prob, Tsit5 ())
1605+ 
1606+     @test  sol. t[end ] ==  tspan[end ]
1607+     @test  sum (abs, sol. u[end ]) <  1 
1608+ 
1609+     prob =  ODEProblem {false} (lowered_dae_sys; u0_constructor =  x ->  SVector (x... ))
1610+     @test  prob. u0 isa  SVector
1611+ end 
0 commit comments