use std::f64::consts::TAU;
use crate::{Hertz, MetresPerSecond, NepersPerMetre};
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct WaveNumber {
real_radians_per_metre: f64,
imaginary_nepers_per_metre: f64,
}
impl WaveNumber {
pub fn real_radians_per_metre(self) -> f64 {
self.real_radians_per_metre
}
pub fn imaginary_nepers_per_metre(self) -> f64 {
self.imaginary_nepers_per_metre
}
}
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct ScalarMedium {
speed: MetresPerSecond,
attenuation: NepersPerMetre,
}
impl ScalarMedium {
pub fn new(speed: MetresPerSecond, attenuation: NepersPerMetre) -> Self {
Self { speed, attenuation }
}
pub fn speed(self) -> MetresPerSecond {
self.speed
}
pub fn attenuation(self) -> NepersPerMetre {
self.attenuation
}
pub fn wavenumber(self, frequency: Hertz) -> WaveNumber {
WaveNumber {
real_radians_per_metre: TAU * frequency.get() / self.speed.get(),
imaginary_nepers_per_metre: self.attenuation.get(),
}
}
}