Skip to content

Commit cdb2e1f

Browse files
test: test v2 Co-Simulation FMU components
1 parent 4c394c5 commit cdb2e1f

File tree

1 file changed

+56
-17
lines changed

1 file changed

+56
-17
lines changed

test/extensions/fmi.jl

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,73 @@ using ModelingToolkit: t_nounits as t, D_nounits as D
33
import 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).utruesol.states.u atol=1e-4
18+
@test sol(0.0:0.1:8.0;
19+
idxs = [sys.mass__s, sys.mass__v]).ucollect.(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]).ucollect.(truesol.values.saveval) rtol=1e-2
37+
end
1938
end
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
3675
end

0 commit comments

Comments
 (0)