oxiphysics_materials/eos/
polynomialeos_traits.rs1use super::functions::EquationOfState;
12#[allow(unused_imports)]
13use super::functions::*;
14use super::types::PolynomialEos;
15
16impl EquationOfState for PolynomialEos {
17 fn pressure(&self, density: f64) -> f64 {
18 self.pressure_energy(density, 0.0)
19 }
20 fn sound_speed(&self, density: f64) -> f64 {
21 let h = density * 1e-6;
22 let dp = self.pressure(density + h) - self.pressure(density - h);
23 (dp / (2.0 * h)).max(0.0).sqrt()
24 }
25 fn density_from_pressure(&self, pressure: f64) -> f64 {
26 let mut lo = self.rho0 * 0.1;
27 let mut hi = self.rho0 * 10.0;
28 for _ in 0..60 {
29 let mid = 0.5 * (lo + hi);
30 if self.pressure(mid) < pressure {
31 lo = mid;
32 } else {
33 hi = mid;
34 }
35 }
36 0.5 * (lo + hi)
37 }
38}