sciforge-core 0.0.4

Shared engineering primitives: materials, fasteners, fluids, propulsion taxonomies, std components.
Documentation
use crate::moleculars::Gas;
use sciforge_hub::prelude::physics::thermodynamics as sf_thermo;

pub struct OttoCycle<'a> {
    pub gas: &'a Gas,
    pub compression_ratio: f64,
    pub t1_k: f64,
    pub p1_pa: f64,
    pub q_in_j_kg: f64,
}

impl<'a> OttoCycle<'a> {
    pub fn new(
        gas: &'a Gas,
        compression_ratio: f64,
        t1_k: f64,
        p1_pa: f64,
        q_in_j_kg: f64,
    ) -> Self {
        Self { gas, compression_ratio, t1_k, p1_pa, q_in_j_kg }
    }

    pub fn efficiency(&self) -> f64 {
        sf_thermo::otto_efficiency(self.compression_ratio, self.gas.gamma())
    }

    pub fn t2_k(&self) -> f64 {
        self.t1_k * self.compression_ratio.powf(self.gas.gamma() - 1.0)
    }

    pub fn t3_k(&self) -> f64 {
        self.t2_k() + self.q_in_j_kg / self.gas.cv_j_kgk_ref
    }

    pub fn t4_k(&self) -> f64 {
        self.t3_k() / self.compression_ratio.powf(self.gas.gamma() - 1.0)
    }

    pub fn p2_pa(&self) -> f64 {
        self.p1_pa * self.compression_ratio.powf(self.gas.gamma())
    }

    pub fn net_work_j_kg(&self) -> f64 {
        self.q_in_j_kg * self.efficiency()
    }

    pub fn heat_rejected_j_kg(&self) -> f64 {
        self.gas.cv_j_kgk_ref * (self.t4_k() - self.t1_k)
    }

    pub fn mep_pa(&self) -> f64 {
        let r = self.gas.specific_gas_constant_j_kgk();
        let v1 = r * self.t1_k / self.p1_pa;
        self.net_work_j_kg() / (v1 * (1.0 - 1.0 / self.compression_ratio))
    }
}