RampTest
Test passing a ramp signal to an integrator for verification purposes.
A test component that connects a Ramp signal generator to an Integrator to verify correct behavior. The ramp starts at an offset value of 0.5, remains constant until the start time (0.5s), then increases linearly by 1.0 over 0.7 seconds to reach a final value of 1.5. The integrator accumulates this signal, and the metadata specifies expected initial and final values for verification purposes.
Usage
RampTest()
Behavior
Source
dyad
# Test passing a ramp signal to an integrator for verification purposes.
#
# A test component that connects a Ramp signal generator to an Integrator to verify correct
# behavior. The ramp starts at an offset value of 0.5, remains constant until the start
# time (0.5s), then increases linearly by 1.0 over 0.7 seconds to reach a final value of 1.5.
# The integrator accumulates this signal, and the metadata specifies expected initial and final
# values for verification purposes.
test component RampTest
# Integrator component that accumulates the input signal
integrator = Integrator()
# Ramp signal generator with configurable duration, height, start time and offset
signal = Ramp(duration=0.7, height=1.0, start_time=0.5, offset=0.5)
relations
# Connects the ramp output to the integrator input
connect(signal.y, integrator.u)
metadata {
"Dyad": {
"tests": {
"case1": {
"stop": 3,
"atol": {"integrator.x": 0.001},
"expect": {
"initial": {"signal.y": 0.5},
"signals": ["signal.y", "integrator.x"],
"final": {"signal.y": 1.5, "integrator.x": 3.641}
}
}
}
}
}
end
Flattened Source
dyad
# Test passing a ramp signal to an integrator for verification purposes.
#
# A test component that connects a Ramp signal generator to an Integrator to verify correct
# behavior. The ramp starts at an offset value of 0.5, remains constant until the start
# time (0.5s), then increases linearly by 1.0 over 0.7 seconds to reach a final value of 1.5.
# The integrator accumulates this signal, and the metadata specifies expected initial and final
# values for verification purposes.
test component RampTest
# Integrator component that accumulates the input signal
integrator = Integrator()
# Ramp signal generator with configurable duration, height, start time and offset
signal = Ramp(duration=0.7, height=1.0, start_time=0.5, offset=0.5)
relations
# Connects the ramp output to the integrator input
connect(signal.y, integrator.u)
metadata {
"Dyad": {
"tests": {
"case1": {
"stop": 3,
"atol": {"integrator.x": 0.001},
"expect": {
"initial": {"signal.y": 0.5},
"signals": ["signal.y", "integrator.x"],
"final": {"signal.y": 1.5, "integrator.x": 3.641}
}
}
}
}
}
end
Test Cases
This is setup code, that must be run before each test case.
julia
using BlockComponents
using ModelingToolkit, OrdinaryDiffEqDefault
using Plots
using CSV, DataFrames
snapshotsdir = joinpath(dirname(dirname(pathof(BlockComponents))), "test", "snapshots")
"/home/actions-runner-10/.julia/packages/BlockComponents/77kIK/test/snapshots"
Test Case case1
julia
@mtkbuild model_case1 = RampTest()
u0_case1 = []
prob_case1 = ODEProblem(model_case1, u0_case1, (0, 3))
sol_case1 = solve(prob_case1)
retcode: Success
Interpolation: 3rd order Hermite
t: 9-element Vector{Float64}:
0.0
9.999999999999999e-5
0.0010999999999999998
0.011099999999999997
0.11109999999999996
1.1110999999999995
1.5653164601978142
2.1357990381130962
3.0
u: 9-element Vector{Vector{Float64}}:
[0.0]
[4.999999999999998e-5]
[0.0005499999999999998]
[0.005549999999999997]
[0.05554999999999997]
[0.8135468022517187]
[1.4892047699646203]
[2.3449286368375435]
[3.641230079667899]
julia
df_case1 = DataFrame(:t => sol_case1[:t], :actual => sol_case1[model_case1.signal.y])
dfr_case1 = try CSV.read(joinpath(snapshotsdir, "RampTest_case1_sig0.ref"), DataFrame); catch e; nothing; end
plt = plot(sol_case1, idxs=[model_case1.signal.y], width=2, label="Actual value of signal.y")
if !isnothing(dfr_case1)
scatter!(plt, dfr_case1.t, dfr_case1.expected, mc=:red, ms=3, label="Expected value of signal.y")
end
scatter!(plt, [df_case1.t[1]], [0.5], label="Initial Condition for `signal.y`")
scatter!(plt, [df_case1.t[end]], [1.5], label="Final Condition for `signal.y`")
plt
julia
df_case1 = DataFrame(:t => sol_case1[:t], :actual => sol_case1[model_case1.integrator.x])
dfr_case1 = try CSV.read(joinpath(snapshotsdir, "RampTest_case1_sig1.ref"), DataFrame); catch e; nothing; end
plt = plot(sol_case1, idxs=[model_case1.integrator.x], width=2, label="Actual value of integrator.x")
if !isnothing(dfr_case1)
scatter!(plt, dfr_case1.t, dfr_case1.expected, mc=:red, ms=3, label="Expected value of integrator.x")
end
scatter!(plt, [df_case1.t[end]], [3.641], label="Final Condition for `integrator.x`")
plt
Related
Examples
Experiments
Analyses
Tests