Skip to content
VariableSinCosTest.md

VariableSinCosTest ​

Test component for sine and cosine generators with variable frequency and amplitude inputs.

Creates a test environment that connects amplitude and frequency input sources to sine and cosine wave generators. The amplitude source is a ramp that starts at 2 and decreases to 0 over 3 seconds, while the frequency is held constant at 2 Hz. This test setup allows visualization of how the wave generators respond to changing amplitude while maintaining a constant frequency.

Usage ​

BlockComponents.VariableSinCosTest()

Behavior ​

julia
using BlockComponents #hide
using ModelingToolkit #hide
@named sys = BlockComponents.VariableSinCosTest() #hide
full_equations(sys) #hide
<< @example-block not executed in draft mode >>

Source ​

dyad
"""
Test component for sine and cosine generators with variable frequency and amplitude inputs.

Creates a test environment that connects amplitude and frequency input sources to sine and cosine
wave generators. The amplitude source is a ramp that starts at 2 and decreases to 0 over 3 seconds,
while the frequency is held constant at 2 Hz. This test setup allows visualization of how the wave
generators respond to changing amplitude while maintaining a constant frequency.
"""
test component VariableSinCosTest
  "Sine wave generator with variable frequency and amplitude inputs"
  sine_wave = SineVariableFrequencyAndAmplitude() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 630, "y1": 340, "x2": 730, "y2": 440, "rot": 0}
      }
    }
  }
  "Cosine wave generator with variable frequency and amplitude inputs"
  cos_wave = CosineVariableFrequencyAndAmplitude() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 640, "y1": 90, "x2": 740, "y2": 190, "rot": 0}
      }
    }
  }
  "Amplitude source that starts at 2 and linearly decreases to 0 over 3 seconds"
  amplitude_source = BlockComponents.Ramp(start_time = 0, offset = 2, duration = 3, height = -2) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 220, "y1": 100, "x2": 320, "y2": 200, "rot": 0}
      }
    }
  }
  "Frequency source providing a constant value of 2 Hz"
  frequency_source = BlockComponents.Constant(k = 2) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 210, "y1": 340, "x2": 310, "y2": 440, "rot": 0}
      }
    }
  }
relations
  connect(cos_wave.amplitude, amplitude_source.y) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 450, "y": 114}, {"x": 450, "y": 150}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(amplitude_source.y, sine_wave.amplitude) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 455, "y": 150}, {"x": 455, "y": 362}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(frequency_source.y, sine_wave.frequency) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 500, "y": 390}, {"x": 500, "y": 413}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(frequency_source.y, cos_wave.frequency) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 500, "y": 390}, {"x": 500, "y": 163}], "E": 2}],
      "renderStyle": "standard"
    }
  }
metadata {
  "Dyad": {
    "icons": {"default": "dyad://BlockComponents/Example.svg"},
    "tests": {"case1": {"stop": 10, "signals": ["sine_wave.y", "cos_wave.y"]}}
  }
}
end
Flattened Source
dyad
"""
Test component for sine and cosine generators with variable frequency and amplitude inputs.

Creates a test environment that connects amplitude and frequency input sources to sine and cosine
wave generators. The amplitude source is a ramp that starts at 2 and decreases to 0 over 3 seconds,
while the frequency is held constant at 2 Hz. This test setup allows visualization of how the wave
generators respond to changing amplitude while maintaining a constant frequency.
"""
test component VariableSinCosTest
  "Sine wave generator with variable frequency and amplitude inputs"
  sine_wave = SineVariableFrequencyAndAmplitude() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 630, "y1": 340, "x2": 730, "y2": 440, "rot": 0}
      }
    }
  }
  "Cosine wave generator with variable frequency and amplitude inputs"
  cos_wave = CosineVariableFrequencyAndAmplitude() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 640, "y1": 90, "x2": 740, "y2": 190, "rot": 0}
      }
    }
  }
  "Amplitude source that starts at 2 and linearly decreases to 0 over 3 seconds"
  amplitude_source = BlockComponents.Ramp(start_time = 0, offset = 2, duration = 3, height = -2) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 220, "y1": 100, "x2": 320, "y2": 200, "rot": 0}
      }
    }
  }
  "Frequency source providing a constant value of 2 Hz"
  frequency_source = BlockComponents.Constant(k = 2) {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 210, "y1": 340, "x2": 310, "y2": 440, "rot": 0}
      }
    }
  }
relations
  connect(cos_wave.amplitude, amplitude_source.y) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 450, "y": 114}, {"x": 450, "y": 150}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(amplitude_source.y, sine_wave.amplitude) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 455, "y": 150}, {"x": 455, "y": 362}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(frequency_source.y, sine_wave.frequency) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 500, "y": 390}, {"x": 500, "y": 413}], "E": 2}],
      "renderStyle": "standard"
    }
  }
  connect(frequency_source.y, cos_wave.frequency) {
    "Dyad": {
      "edges": [{"S": 1, "M": [{"x": 500, "y": 390}, {"x": 500, "y": 163}], "E": 2}],
      "renderStyle": "standard"
    }
  }
metadata {
  "Dyad": {
    "icons": {"default": "dyad://BlockComponents/Example.svg"},
    "tests": {"case1": {"stop": 10, "signals": ["sine_wave.y", "cos_wave.y"]}}
  }
}
end


Test 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 = VariableSinCosTest()
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 = 1e+1, abstol=1e-6, reltol=1e-6)
sol_case1 = rebuild_sol(result_case1)
<< @setup-block not executed in draft mode >>