autd3_core/environment/
mod.rs1use core::f32::consts::PI;
2
3use crate::common::{METER, ULTRASOUND_FREQ};
4
5#[non_exhaustive]
6#[repr(C)]
7#[derive(Debug, Clone, Copy, PartialEq)]
8pub struct Environment {
9 #[cfg_attr(feature = "use_meter", doc = "Sound speed in the environment [m/s]")]
10 #[cfg_attr(
11 not(feature = "use_meter"),
12 doc = "Sound speed in the environment [mm/s]"
13 )]
14 pub sound_speed: f32,
15}
16
17impl Environment {
18 pub fn new() -> Self {
20 Self {
21 sound_speed: 340.0 * METER,
22 }
23 }
24
25 pub fn set_sound_speed_from_temp(&mut self, t: f32) {
29 self.set_sound_speed_from_temp_with(t, 1.4, 8.314_463, 28.9647e-3);
30 }
31
32 pub fn set_sound_speed_from_temp_with(&mut self, t: f32, k: f32, r: f32, m: f32) {
34 let c2 = k * r * (273.15 + t) / m;
35 let c = c2.sqrt();
36 self.sound_speed = c * METER;
37 }
38
39 #[must_use]
41 pub const fn wavelength(&self) -> f32 {
42 self.sound_speed / ULTRASOUND_FREQ.hz() as f32
43 }
44
45 #[must_use]
47 pub const fn wavenumber(&self) -> f32 {
48 2.0 * PI * ULTRASOUND_FREQ.hz() as f32 / self.sound_speed
49 }
50}
51
52impl Default for Environment {
53 fn default() -> Self {
54 Self::new()
55 }
56}
57
58#[cfg(test)]
59pub(crate) mod tests {
60 use super::*;
61 use crate::common::mm;
62
63 #[rstest::rstest]
64 #[case(340.29525e3, 15.)]
65 #[case(343.23497e3, 20.)]
66 #[case(349.04013e3, 30.)]
67 fn set_sound_speed_from_temp(#[case] expected: f32, #[case] temp: f32) {
68 let mut env = Environment::new();
69 env.set_sound_speed_from_temp(temp);
70 approx::assert_abs_diff_eq!(expected * mm, env.sound_speed, epsilon = 1e-3);
71 }
72
73 #[rstest::rstest]
74 #[case(8.5, 340e3)]
75 #[case(10., 400e3)]
76 fn wavelength(#[case] expect: f32, #[case] c: f32) {
77 let mut env = Environment::new();
78 env.sound_speed = c;
79 approx::assert_abs_diff_eq!(expect, env.wavelength());
80 }
81
82 #[rstest::rstest]
83 #[case(0.739_198_27, 340e3)]
84 #[case(0.628_318_55, 400e3)]
85 fn wavenumber(#[case] expect: f32, #[case] c: f32) {
86 let mut env = Environment::new();
87 env.sound_speed = c;
88 approx::assert_abs_diff_eq!(expect, env.wavenumber());
89 }
90}