Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 42 additions & 9 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ using FMI.FMIImport.FMIBase.FMICore

import FMI.FMIImport.FMIBase: FMU_EXECUTION_CONFIGURATIONS

using FMI.FMIImport

using DifferentialEquations: FBDF

Expand All @@ -38,12 +37,23 @@ function getFMUStruct(
)

# choose FMU or FMUInstance
if endswith(modelname, ".fmu")
fmu = loadFMU(modelname; kwargs...)
else
fmu = loadFMU(modelname, tool, version, fmiversion; kwargs...)
fmu = try
if endswith(modelname, ".fmu")
loadFMU(modelname; kwargs...)
else
if tool == "SimulationX"
modelname = modelname*string(mode)
end
loadFMU(modelname, tool, version, fmiversion; kwargs...)
end
catch
#there is no fmu
nothing
end
if fmu === nothing
@info "There is no FMU for $(modelname), $(tool), $(version), FMU $(mode), $(fmiversion). Test is skipped.\n"
return nothing, nothing
end

if fmustruct == "FMU"
return fmu, fmu

Expand All @@ -57,7 +67,29 @@ function getFMUStruct(
end
end

toolversions = [("Dymola", "2023x")] # ("SimulationX", "4.5.2")
function getPermutationOfStates(solutionStateNames,perm)
i=1
fmuStateNames = ["",""]#["der(mass.s)", "mass.s"]
for fmusvr in fmu.modelDescription.stateValueReferences
for mv in fmu.modelDescription.modelVariables
if mv.valueReference == fmusvr
fmuStateNames[i] = replace(mv.name, "_"=>"";count=1)
#<- for SX-FMUs remove preceding "_", e.g. in "_mass.s"
@debug "changed name of $(i) with vr $(fmusvr) to $(fmuStateNames[i])"

end
end
i=i+1
end
i=1
for sn in solutionStateNames
perm[i]= findall(name->name in sn,fmuStateNames)[1]
@debug "Found $(sn) in fmu state names at position $(perm[i])"
i=i+1
end
end

toolversions = [("SimulationX", "4.6.2")]# ("Dymola", "2023x"),

@testset "FMI.jl" begin
if Sys.iswindows() || Sys.islinux()
Expand All @@ -68,7 +100,7 @@ toolversions = [("Dymola", "2023x")] # ("SimulationX", "4.5.2")
ENV["EXPORTINGTOOL"] = tool
ENV["EXPORTINGVERSION"] = version

for fmiversion in (2.0, 3.0)
for fmiversion in (2.0,3.0)
ENV["FMIVERSION"] = fmiversion

@testset "Testing FMI $(ENV["FMIVERSION"]) FMUs exported from $(ENV["EXPORTINGTOOL"]) $(ENV["EXPORTINGVERSION"])" begin
Expand All @@ -92,7 +124,8 @@ toolversions = [("Dymola", "2023x")] # ("SimulationX", "4.5.2")
if fmiversion == 3.0
@testset "SE Simulation" begin
include("sim_SE.jl")
end
@info "not include(\"sim_SE.jl\")"
end
else
@info "Skipping SE tests for FMI $(fmiversion), because this is not supported by the corresponding FMI version."
end
Expand Down
90 changes: 47 additions & 43 deletions test/sim_CS.jl
Original file line number Diff line number Diff line change
Expand Up @@ -11,32 +11,33 @@ fmuStruct, fmu = getFMUStruct("SpringPendulum1D", :CS)

t_start = 0.0
t_stop = 8.0
if fmuStruct !== nothing
# test without recording values (just for completeness)
solution = simulateCS(fmuStruct, (t_start, t_stop); dt = 1e-2)
@test solution.success

# test without recording values (just for completeness)
solution = simulateCS(fmuStruct, (t_start, t_stop); dt = 1e-2)
@test solution.success

# test with recording values
solution =
simulateCS(fmuStruct, (t_start, t_stop); dt = 1e-2, recordValues = ["mass.s", "mass.v"])
@test solution.success
@test length(solution.values.saveval) == t_start:1e-2:t_stop |> length
@test length(solution.values.saveval[1]) == 2
# test with recording values
solution =
simulateCS(fmuStruct, (t_start, t_stop); dt = 1e-2, recordValues = ["mass.s", "mass.v"])
@test solution.success
@test length(solution.values.saveval) == t_start:1e-2:t_stop |> length
@test length(solution.values.saveval[1]) == 2

t = solution.values.t
s = collect(d[1] for d in solution.values.saveval)
v = collect(d[2] for d in solution.values.saveval)
@test t[1] == t_start
@test t[end] == t_stop
t = solution.values.t
s = collect(d[1] for d in solution.values.saveval)
v = collect(d[2] for d in solution.values.saveval)
@test t[1] == t_start
@test t[end] == t_stop

# reference values from Simulation in Dymola2020x (Dassl, default settings)
@test s[1] == 0.5
@test v[1] == 0.0
# reference values from Simulation in Dymola2020x (Dassl, default settings)
@test s[1] == 0.5
@test v[1] == 0.0

@test isapprox(s[end], 0.509219; atol = 1e-1)
@test isapprox(v[end], 0.314074; atol = 1e-1)
@test isapprox(s[end], 0.509219; atol = 1e-1)
@test isapprox(v[end], 0.314074; atol = 1e-1)

unloadFMU(fmu)
unloadFMU(fmu)
end

# case 2: CS-FMU with input signal

Expand All @@ -50,26 +51,29 @@ end

fmustruct, fmu = getFMUStruct("SpringPendulumExtForce1D", :CS)

for inpfct! in [extForce_ct!, extForce_t!]
global solution

solution = simulateCS(
fmustruct,
(t_start, t_stop);
dt = 1e-2,
recordValues = ["mass.s", "mass.v"],
inputValueReferences = ["extForce"],
inputFunction = inpfct!,
)
@test solution.success
@test length(solution.values.saveval) > 0
@test length(solution.values.t) > 0

@test t[1] == t_start
@test t[end] == t_stop
if fmuStruct !== nothing
for inpfct! in [extForce_ct!, extForce_t!]
inpfct! = extForce_ct!
global solution

solution = simulateCS(
fmustruct,
(t_start, t_stop);
dt = 1e-2,
recordValues = ["mass.s", "mass.v"],
inputValueReferences = ["extForce"],
inputFunction = inpfct!,
)
@test solution.success
@test length(solution.values.saveval) > 0
@test length(solution.values.t) > 0

@test t[1] == t_start
@test t[end] == t_stop
end

# reference values from Simulation in Dymola2020x (Dassl, default settings)
@test [solution.values.saveval[1]...] == [0.5, 0.0]
@test sum(abs.([solution.values.saveval[end]...] - [0.613371, 0.188633])) < 0.2
unloadFMU(fmu)
end

# reference values from Simulation in Dymola2020x (Dassl, default settings)
@test [solution.values.saveval[1]...] == [0.5, 0.0]
@test sum(abs.([solution.values.saveval[end]...] - [0.613371, 0.188633])) < 0.2
unloadFMU(fmu)
Loading
Loading