@@ -3,34 +3,73 @@ using ModelingToolkit: t_nounits as t, D_nounits as D
33import ModelingToolkit as MTK
44
55@testset " Standalone pendulum model" begin
6+ fmu = loadFMU (" SpringPendulum1D" , " Dymola" , " 2022x" ; type = :ME )
7+ truesol = FMI. simulate (
8+ fmu, (0.0 , 8.0 ); saveat = 0.0 : 0.1 : 8.0 , recordValues = [" mass.s" , " mass.v" ])
9+
610 @testset " v2, ME" begin
711 fmu = loadFMU (" SpringPendulum1D" , " Dymola" , " 2022x" ; type = :ME )
8- @mtkbuild sys = MTK. FMIComponent (Val (2 ), Val ( :ME ); fmu )
12+ @mtkbuild sys = MTK. FMIComponent (Val (2 ); fmu, type = :ME )
913 prob = ODEProblem {true, SciMLBase.FullSpecialize} (
1014 sys, [sys. mass__s => 0.5 , sys. mass__v => 0.0 ], (0.0 , 8.0 ))
1115 sol = solve (prob, Tsit5 (); reltol = 1e-8 , abstol = 1e-8 )
1216 @test SciMLBase. successful_retcode (sol)
1317
14- truesol = FMI . simulate (fmu, ( 0.0 , 8.0 ); saveat = 0.0 : 0.1 : 8.0 )
15- @test sol ( 0.0 : 0.1 : 8.0 ). u≈ truesol. states . u atol= 1e-4
18+ @test sol ( 0.0 : 0.1 : 8.0 ;
19+ idxs = [sys . mass__s, sys . mass__v] ). u≈ collect .( truesol. values . saveval) atol= 1e-4
1620 # repeated solve works
1721 @test_nowarn solve (prob, Tsit5 ())
1822 end
23+ @testset " v2, CS" begin
24+ fmu = loadFMU (" SpringPendulum1D" , " Dymola" , " 2022x" ; type = :CS )
25+ @named inner = MTK. FMIComponent (
26+ Val (2 ); fmu, communication_step_size = 0.001 , type = :CS )
27+ @variables x (t) = 1.0
28+ @mtkbuild sys = ODESystem ([D (x) ~ x], t; systems = [inner])
29+
30+ prob = ODEProblem {true, SciMLBase.FullSpecialize} (
31+ sys, [sys. inner. mass__s => 0.5 , sys. inner. mass__v => 0.0 ], (0.0 , 8.0 ))
32+ sol = solve (prob, Tsit5 (); reltol = 1e-8 , abstol = 1e-8 )
33+ @test SciMLBase. successful_retcode (sol)
34+
35+ @test sol (0.0 : 0.1 : 8.0 ;
36+ idxs = [sys. inner. mass__s, sys. inner. mass__v]). u≈ collect .(truesol. values. saveval) rtol= 1e-2
37+ end
1938end
2039
2140@testset " IO Model" begin
22- fmu = loadFMU (" ./fmus/SimpleAdder.fmu" ; type = :ME )
23- @named adder = MTK. FMIComponent (Val (2 ), Val (:ME ); fmu)
24- @variables a (t) b (t) c (t) [guess = 1.0 ]
25- @mtkbuild sys = ODESystem (
26- [adder. a ~ a, adder. b ~ b, D (a) ~ t,
27- D (b) ~ adder. out + adder. c, c^ 2 ~ adder. out + adder. value],
28- t;
29- systems = [adder])
30-
31- # c will be solved for by initialization
32- # this tests that initialization also works with FMUs
33- prob = ODEProblem (sys, [sys. adder. c => 1.0 , sys. a => 1.0 , sys. b => 1.0 ], (0.0 , 1.0 ))
34- sol = solve (prob, Rodas5P (autodiff = false ))
35- @test SciMLBase. successful_retcode (sol)
41+ @testset " v2, ME" begin
42+ fmu = loadFMU (" ../../omc-fmus/SimpleAdder.fmu" ; type = :ME )
43+ @named adder = MTK. FMIComponent (Val (2 ); fmu, type = :ME )
44+ @variables a (t) b (t) c (t) [guess = 1.0 ]
45+ @mtkbuild sys = ODESystem (
46+ [adder. a ~ a, adder. b ~ b, D (a) ~ t,
47+ D (b) ~ adder. out + adder. c, c^ 2 ~ adder. out + adder. value],
48+ t;
49+ systems = [adder])
50+
51+ # c will be solved for by initialization
52+ # this tests that initialization also works with FMUs
53+ prob = ODEProblem (sys, [sys. adder. c => 1.0 , sys. a => 1.0 , sys. b => 1.0 ], (0.0 , 1.0 ))
54+ sol = solve (prob, Rodas5P (autodiff = false ))
55+ @test SciMLBase. successful_retcode (sol)
56+ end
57+ @testset " v2, CS" begin
58+ fmu = loadFMU (" ../../omc-fmus/SimpleAdder.fmu" ; type = :CS )
59+ @named adder = MTK. FMIComponent (
60+ Val (2 ); fmu, type = :CS , communication_step_size = 0.001 )
61+ @variables a (t) b (t) c (t) [guess = 1.0 ]
62+ @mtkbuild sys = ODESystem (
63+ [adder. a ~ a, adder. b ~ b, D (a) ~ t,
64+ D (b) ~ adder. out + adder. c, c^ 2 ~ adder. out + adder. value],
65+ t;
66+ systems = [adder])
67+
68+ # c will be solved for by initialization
69+ # this tests that initialization also works with FMUs
70+ prob = ODEProblem (sys, [sys. adder. c => 1.0 , sys. a => 1.0 , sys. b => 1.0 ],
71+ (0.0 , 1.0 ); use_scc = false )
72+ sol = solve (prob, Rodas5P (autodiff = false ))
73+ @test SciMLBase. successful_retcode (sol)
74+ end
3675end
0 commit comments