comp_flow/normal.rs
1//! Normal Shock relations
2use num::Float;
3
4/// Mach number after normal shock
5///
6/// # Examples
7///
8/// ```
9/// use comp_flow::normal_mach2;
10///
11/// assert_eq!(normal_mach2(2.0_f32, 1.4_f32), 0.57735026);
12/// assert_eq!(normal_mach2(5.0_f64, 1.4_f64), 0.41522739926869984);
13///
14/// ```
15pub fn normal_mach2<F: Float>(mach: F, gamma: F) -> F {
16 let two = F::from(2.).unwrap();
17 ((F::one() + (gamma - F::one()) / two * mach.powi(2))
18 / (gamma * mach.powi(2) - (gamma - F::one()) / two))
19 .sqrt()
20}
21
22/// Total pressure ratio across normal shock
23///
24/// # Examples
25///
26/// ```
27/// use comp_flow::normal_p02_p01;
28///
29/// assert_eq!(normal_p02_p01(2.0_f32, 1.4_f32), 0.7208737);
30/// assert_eq!(normal_p02_p01(5.0_f64, 1.4_f64), 0.061716319748617694);
31///
32/// ```
33pub fn normal_p02_p01<F: Float>(mach: F, gamma: F) -> F {
34 let two = F::from(2.).unwrap();
35 F::one()
36 / ((two * gamma / (gamma + F::one()) * mach.powi(2)
37 - (gamma - F::one()) / (gamma + F::one()))
38 .powf(F::one() / (gamma - F::one()))
39 * (two / (gamma + F::one()) / mach.powi(2) + (gamma - F::one()) / (gamma + F::one()))
40 .powf(gamma / (gamma - F::one())))
41}
42
43/// Static pressure ratio across normal shock
44///
45/// # Examples
46///
47/// ```
48/// use comp_flow::normal_p2_p1;
49///
50/// assert_eq!(normal_p2_p1(2.0_f32, 1.4_f32), 4.5);
51/// assert_eq!(normal_p2_p1(5.0_f64, 1.4_f64), 29.0);
52///
53/// ```
54pub fn normal_p2_p1<F: Float>(mach: F, gamma: F) -> F {
55 F::from(2.).unwrap() * gamma / (gamma + F::one()) * (mach.powi(2) - F::one()) + F::one()
56}
57
58/// Static density ratio across normal shock
59///
60/// # Examples
61///
62/// ```
63/// use comp_flow::normal_rho2_rho1;
64///
65/// assert_eq!(normal_rho2_rho1(2.0_f32, 1.4_f32), 2.66666666);
66/// assert_eq!(normal_rho2_rho1(5.0_f64, 1.4_f64), 5.000000000000001);
67///
68/// ```
69pub fn normal_rho2_rho1<F: Float>(mach: F, gamma: F) -> F {
70 (gamma + F::one()) * mach.powi(2) / ((gamma - F::one()) * mach.powi(2) + F::from(2.).unwrap())
71}
72
73/// Static temperature ratio across normal shock
74///
75/// # Examples
76///
77/// ```
78/// use comp_flow::normal_t2_t1;
79///
80/// assert_eq!(normal_t2_t1(2.0_f32, 1.4_f32), 1.6875);
81/// assert_eq!(normal_t2_t1(5.0_f64, 1.4_f64), 5.799999999999999);
82///
83/// ```
84pub fn normal_t2_t1<F: Float>(mach: F, gamma: F) -> F {
85 let two = F::from(2.).unwrap();
86 (two + (gamma - F::one()) * mach.powi(2)) * (two * gamma * mach.powi(2) - (gamma - F::one()))
87 / ((gamma + F::one()).powi(2) * mach.powi(2))
88}
89
90/// Speed of sound ratio across normal shock
91///
92/// # Examples
93///
94/// ```
95/// use comp_flow::normal_a2_a1;
96///
97/// assert_eq!(normal_a2_a1(2.0_f32, 1.4_f32), 1.29903810);
98/// assert_eq!(normal_a2_a1(5.0_f64, 1.4_f64), 2.408318915758459);
99///
100/// ```
101pub fn normal_a2_a1<F: Float>(mach: F, gamma: F) -> F {
102 let two = F::from(2.).unwrap();
103 ((two + (gamma - F::one()) * mach.powi(2)) * (two * gamma * mach.powi(2) - (gamma - F::one()))
104 / ((gamma + F::one()).powi(2) * mach.powi(2)))
105 .sqrt()
106}