sim_lib_interference_core/
medium.rs1use std::f64::consts::TAU;
4
5use crate::{Hertz, MetresPerSecond, NepersPerMetre};
6
7#[derive(Clone, Copy, Debug, PartialEq)]
13pub struct WaveNumber {
14 real_radians_per_metre: f64,
15 imaginary_nepers_per_metre: f64,
16}
17
18impl WaveNumber {
19 pub fn real_radians_per_metre(self) -> f64 {
21 self.real_radians_per_metre
22 }
23
24 pub fn imaginary_nepers_per_metre(self) -> f64 {
26 self.imaginary_nepers_per_metre
27 }
28}
29
30#[derive(Clone, Copy, Debug, PartialEq)]
32pub struct ScalarMedium {
33 speed: MetresPerSecond,
34 attenuation: NepersPerMetre,
35}
36
37impl ScalarMedium {
38 pub fn new(speed: MetresPerSecond, attenuation: NepersPerMetre) -> Self {
40 Self { speed, attenuation }
41 }
42
43 pub fn speed(self) -> MetresPerSecond {
45 self.speed
46 }
47
48 pub fn attenuation(self) -> NepersPerMetre {
50 self.attenuation
51 }
52
53 pub fn wavenumber(self, frequency: Hertz) -> WaveNumber {
55 WaveNumber {
56 real_radians_per_metre: TAU * frequency.get() / self.speed.get(),
57 imaginary_nepers_per_metre: self.attenuation.get(),
58 }
59 }
60}