1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//! Rate structure.

use ndarray::Array1;

/// Rate of reaction.
#[derive(Debug, Clone)]
pub struct Rate {
    /// Reaction rate constant.
    k: f64,
    /// List of each index and its associated partial order of reaction.
    orders: Vec<(usize, f64)>,
}

impl Rate {
    /// Construct a new instance.
    #[inline]
    #[must_use]
    pub fn new(k: f64, orders: Vec<(usize, f64)>) -> Self {
        debug_assert!(k > 0.0);
        debug_assert!(!orders.is_empty());

        Self { k, orders }
    }

    /// Calculate the current rate given the current concentrations.
    #[inline]
    #[must_use]
    pub fn rate(&self, concs: &Array1<f64>) -> f64 {
        let mut r = self.k;

        for &(c, m) in &self.orders {
            r *= concs[c].powf(m);
        }

        r
    }
}