Skip to content
LIBRARY
Sources.Tests.Sine.md

Sources.Tests.Sine

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.Sources.Tests.Sine()

Behavior

julia
using BlockComponents #hide
using ModelingToolkit #hide
@named sys = BlockComponents.Sources.Tests.Sine() #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 Sine
  "Integrator that accumulates the sine wave input"
  integrator = BlockComponents.Continuous.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 = BlockComponents.Sources.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}
        }
      }
    }
  }
}
end
Flattened 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 Sine
  "Integrator that accumulates the sine wave input"
  integrator = BlockComponents.Continuous.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 = BlockComponents.Sources.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}
        }
      }
    }
  }
}
end


Test 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.Sine()
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 = 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, "BlockComponents.Sources.Tests.Sine_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, "BlockComponents.Sources.Tests.Sine_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 >>