twine_models/support/hx/arrangement/
parallel_flow.rs1use crate::support::hx::{
4 CapacitanceRate, Effectiveness, Ntu,
5 effectiveness_ntu::{EffectivenessRelation, NtuRelation, effectiveness_via, ntu_via},
6};
7
8#[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 [1., f64::INFINITY],
42 [1., 4.],
44 [1., 2.],
46 [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}