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