LIBRARY
Sources.Tests.Ramp
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
BlockComponents.Sources.Tests.Ramp()
Behavior
julia
using BlockComponents #hide
using ModelingToolkit #hide
@named sys = BlockComponents.Sources.Tests.Ramp() #hide
full_equations(sys) #hide<< @example-block not executed in draft mode >>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 Ramp
"Integrator component that accumulates the input signal"
integrator = BlockComponents.Continuous.Integrator() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 155, "y1": 20, "x2": 255, "y2": 120, "rot": 0}
}
}
}
"Ramp signal generator with configurable duration, height, start time and offset"
signal = BlockComponents.Sources.Ramp(duration = 0.7, height = 1.0, start_time = 0.5, offset = 0.5) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 20, "y1": 20, "x2": 120, "y2": 120, "rot": 0}
}
}
}
relations
"Connects the ramp output to the integrator input"
connect(signal.y, integrator.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
metadata {
"Dyad": {
"icons": {"default": "dyad://BlockComponents/Example.svg"},
"tests": {
"case1": {
"stop": 3,
"atol": {"integrator.x": 0.001},
"expect": {"signals": ["signal.y", "integrator.x"]}
}
}
}
}
endFlattened 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 Ramp
"Integrator component that accumulates the input signal"
integrator = BlockComponents.Continuous.Integrator() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 155, "y1": 20, "x2": 255, "y2": 120, "rot": 0}
}
}
}
"Ramp signal generator with configurable duration, height, start time and offset"
signal = BlockComponents.Sources.Ramp(duration = 0.7, height = 1.0, start_time = 0.5, offset = 0.5) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 20, "y1": 20, "x2": 120, "y2": 120, "rot": 0}
}
}
}
relations
"Connects the ramp output to the integrator input"
connect(signal.y, integrator.u) {"Dyad": {"edges": [{"S": 1, "M": [], "E": 2}], "renderStyle": "standard"}}
metadata {
"Dyad": {
"icons": {"default": "dyad://BlockComponents/Example.svg"},
"tests": {
"case1": {
"stop": 3,
"atol": {"integrator.x": 0.001},
"expect": {"signals": ["signal.y", "integrator.x"]}
}
}
}
}
endTest Cases
julia
using BlockComponents
using DyadInterface: TransientAnalysis, rebuild_sol, ODEAlg
using ModelingToolkit: toggle_namespacing, get_initial_conditions, @named
using CSV, DataFrames, Plots
snapshotsdir = joinpath(dirname(dirname(pathof(BlockComponents))), "test", "snapshots")<< @setup-block not executed in draft mode >>Test Case case1
julia
@named model_case1 = BlockComponents.Sources.Tests.Ramp()
model_case1 = toggle_namespacing(model_case1, false)
model_case1 = toggle_namespacing(model_case1, true)
result_case1 = TransientAnalysis(; model = model_case1, alg = ODEAlg.Auto(), start = 0e+0, stop = 3e+0, abstol=1e-6, reltol=1e-6)
sol_case1 = rebuild_sol(result_case1)<< @setup-block not executed in draft mode >>julia
df_case1 = DataFrame(:t => sol_case1[:t], :actual => sol_case1[model_case1.signal.y])
dfr_case1 = try CSV.read(joinpath(snapshotsdir, "BlockComponents.Sources.Tests.Ramp_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<< @setup-block not executed in draft mode >>julia
plt<< @example-block not executed in draft mode >>julia
df_case1 = DataFrame(:t => sol_case1[:t], :actual => sol_case1[model_case1.integrator.x])
dfr_case1 = try CSV.read(joinpath(snapshotsdir, "BlockComponents.Sources.Tests.Ramp_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<< @setup-block not executed in draft mode >>julia
plt<< @example-block not executed in draft mode >>Related
Examples
Experiments
Analyses
Tests