1#![warn(missing_docs)]
22#![deny(unsafe_code)]
23
24use rill_core::Transcendental;
25
26mod adapters;
27pub mod analysis;
29mod constants;
30mod elements;
31
32#[cfg(feature = "simd")]
33pub mod simd;
34
35pub mod filters;
37
38pub use adapters::{ParallelAdapter, SeriesAdapter};
39pub use elements::{Capacitor, Diode, Inductor, Resistor};
40
41#[derive(Debug, Clone, Copy, PartialEq)]
43pub enum PortType {
44 Series,
46 Parallel,
48 Reflection,
50}
51
52#[derive(Debug, Clone, Copy)]
54pub struct WaveVariables<T: Transcendental> {
55 pub a: T,
57 pub b: T,
59}
60
61impl<T: Transcendental> WaveVariables<T> {
62 pub fn new() -> Self {
64 Self {
65 a: T::ZERO,
66 b: T::ZERO,
67 }
68 }
69
70 pub fn to_voltage_current(&self, port_resistance: T) -> (T, T) {
72 let two = T::from_f32(2.0);
73 let v = (self.a + self.b) / two;
74 let i = (self.a - self.b) / (two * port_resistance);
75 (v, i)
76 }
77
78 pub fn from_voltage_current(v: T, i: T, port_resistance: T) -> Self {
80 let a = v + port_resistance * i;
81 let b = v - port_resistance * i;
82 Self { a, b }
83 }
84}
85
86impl<T: Transcendental> Default for WaveVariables<T> {
87 fn default() -> Self {
88 Self::new()
89 }
90}
91
92pub trait WdfElement<T: Transcendental>: Send + Sync {
97 fn port_resistance(&self) -> T;
99
100 fn process_incident(&mut self, a: T) -> T;
102
103 fn update_state(&mut self);
105
106 fn voltage(&self) -> T;
108
109 fn current(&self) -> T;
111
112 fn reset(&mut self);
114}
115
116#[cfg(test)]
117mod tests {
118 use super::*;
119
120 #[test]
121 fn test_wave_variables() {
122 let wv: WaveVariables<f64> = WaveVariables::new();
123 assert_eq!(wv.a, 0.0);
124 assert_eq!(wv.b, 0.0);
125 }
126
127 #[test]
128 fn test_wave_to_voltage_current() {
129 let wv: WaveVariables<f64> = WaveVariables { a: 2.0, b: 0.5 };
130 let (v, i) = wv.to_voltage_current(100.0);
131 assert!((v - 1.25).abs() < 1e-10);
132 assert!((i - 0.0075).abs() < 1e-10);
133 }
134
135 #[test]
136 fn test_voltage_current_to_wave() {
137 let wv: WaveVariables<f64> = WaveVariables::from_voltage_current(1.0, 0.01, 100.0);
138 assert!((wv.a - 2.0).abs() < 1e-10);
139 assert!((wv.b - 0.0).abs() < 1e-10);
140 }
141}