Skip to main content

twine_models/support/hx/arrangement/
parallel_flow.rs

1//! Parallel-flow effectiveness-NTU relationships.
2
3use crate::support::hx::{
4    CapacitanceRate, Effectiveness, Ntu,
5    effectiveness_ntu::{EffectivenessRelation, NtuRelation, effectiveness_via, ntu_via},
6};
7
8/// Parallel-flow heat exchanger arrangement.
9#[derive(Debug, Clone, Copy, Default)]
10pub struct ParallelFlow;
11
12impl EffectivenessRelation for ParallelFlow {
13    fn effectiveness(&self, ntu: Ntu, capacitance_rates: [CapacitanceRate; 2]) -> Effectiveness {
14        effectiveness_via(ntu, capacitance_rates, |ntu, cr| {
15            (1. - (-ntu * (1. + cr)).exp()) / (1. + cr)
16        })
17    }
18}
19
20impl NtuRelation for ParallelFlow {
21    fn ntu(&self, effectiveness: Effectiveness, capacitance_rates: [CapacitanceRate; 2]) -> Ntu {
22        ntu_via(effectiveness, capacitance_rates, |eff, cr| {
23            -(1. - eff * (1. + cr)).ln() / (1. + cr)
24        })
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use crate::support::constraint::ConstraintResult;
31    use approx::assert_relative_eq;
32    use uom::si::{ratio::ratio, thermal_conductance::watt_per_kelvin};
33
34    use super::*;
35
36    #[test]
37    fn roundtrip() -> ConstraintResult<()> {
38        let ntus = [0., 0.1, 0.5, 1., 5.];
39        let capacitance_rates = [
40            // c_r == 0
41            [1., f64::INFINITY],
42            // c_r == 0.25
43            [1., 4.],
44            // c_r == 0.5
45            [1., 2.],
46            // c_r == 1
47            [1., 1.],
48        ];
49
50        for ntu in ntus {
51            for pair in capacitance_rates {
52                let rates = [
53                    CapacitanceRate::new::<watt_per_kelvin>(pair[0])?,
54                    CapacitanceRate::new::<watt_per_kelvin>(pair[1])?,
55                ];
56
57                let eff = ParallelFlow.effectiveness(Ntu::new(ntu)?, rates);
58                let back = ParallelFlow.ntu(eff, rates);
59
60                assert_relative_eq!(back.get::<ratio>(), ntu, max_relative = 1e-12);
61            }
62        }
63
64        Ok(())
65    }
66}