SineTest ​
Test component that integrates a sine wave with specific parameters.
This component connects a configurable sine wave generator to an integrator and verifies correct numerical behavior through the test case in metadata. The sine wave has an amplitude of 1, frequency of 2 Hz, start time of 0.5s, offset of 0.5, and phase shift of 1.57 radians. The integrator accumulates the sine wave signal over time, and the test case verifies both signals meet expected values.
Usage ​
BlockComponents.SineTest()
Behavior ​
julia
using BlockComponents #hide
using ModelingToolkit #hide
@named sys = BlockComponents.SineTest() #hide
full_equations(sys) #hide<< @example-block not executed in draft mode >>Source ​
dyad
"""
Test component that integrates a sine wave with specific parameters.
This component connects a configurable sine wave generator to an integrator and
verifies correct numerical behavior through the test case in metadata. The sine
wave has an amplitude of 1, frequency of 2 Hz, start time of 0.5s, offset of 0.5,
and phase shift of 1.57 radians. The integrator accumulates the sine wave signal
over time, and the test case verifies both signals meet expected values.
"""
test component SineTest
"Integrator that accumulates the sine wave input"
integrator = Integrator() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 155, "y1": 20, "x2": 255, "y2": 120, "rot": 0}
}
}
}
"Sine wave generator with specific parameters for testing"
signal = Sine(amplitude = 1, frequency = 2, start_time = 0.5, offset = 0.5, phase = pi / 4) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 20, "y1": 20, "x2": 120, "y2": 120, "rot": 0}
}
}
}
relations
"Connects the sine wave 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": 5,
"atol": {"signal.y": 0.001, "integrator.x": 0.001},
"expect": {
"initial": {"signal.y": 1.207},
"signals": ["signal.y", "integrator.x"],
"final": {"signal.y": 1.207, "integrator.x": 2.853}
}
}
}
}
}
endFlattened Source
dyad
"""
Test component that integrates a sine wave with specific parameters.
This component connects a configurable sine wave generator to an integrator and
verifies correct numerical behavior through the test case in metadata. The sine
wave has an amplitude of 1, frequency of 2 Hz, start time of 0.5s, offset of 0.5,
and phase shift of 1.57 radians. The integrator accumulates the sine wave signal
over time, and the test case verifies both signals meet expected values.
"""
test component SineTest
"Integrator that accumulates the sine wave input"
integrator = Integrator() {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 155, "y1": 20, "x2": 255, "y2": 120, "rot": 0}
}
}
}
"Sine wave generator with specific parameters for testing"
signal = Sine(amplitude = 1, frequency = 2, start_time = 0.5, offset = 0.5, phase = pi / 4) {
"Dyad": {
"placement": {
"diagram": {"iconName": "default", "x1": 20, "y1": 20, "x2": 120, "y2": 120, "rot": 0}
}
}
}
relations
"Connects the sine wave 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": 5,
"atol": {"signal.y": 0.001, "integrator.x": 0.001},
"expect": {
"initial": {"signal.y": 1.207},
"signals": ["signal.y", "integrator.x"],
"final": {"signal.y": 1.207, "integrator.x": 2.853}
}
}
}
}
}
endTest Cases ​
julia
using BlockComponents
using DyadInterface: TransientAnalysis, rebuild_sol
using ModelingToolkit: toggle_namespacing, get_defaults, @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 = SineTest()
model_case1 = toggle_namespacing(model_case1, false)
model_case1 = toggle_namespacing(model_case1, true)
result_case1 = TransientAnalysis(; model = model_case1, alg = "auto", start = 0e+0, stop = 5e+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, "SineTest_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]], [1.207], label="Initial Condition for `signal.y`")
scatter!(plt, [df_case1.t[end]], [1.207], label="Final Condition for `signal.y`")<< @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, "SineTest_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]], [2.853], label="Final Condition for `integrator.x`")<< @setup-block not executed in draft mode >>julia
plt<< @example-block not executed in draft mode >>Related ​
Examples
Experiments
Analyses
Tests