#[must_use]
pub fn deuterium_excess(d_d: f64, d18o: f64) -> f64 {
d_d - 8.0 * d18o
}
#[must_use]
pub fn o17_excess(d17o_permil: f64, d18o_permil: f64) -> f64 {
let d17_prime = (1.0 + d17o_permil / 1000.0).ln() * 1000.0;
let d18_prime = (1.0 + d18o_permil / 1000.0).ln() * 1000.0;
(d17_prime - 0.528 * d18_prime) * 1000.0 }
#[cfg(test)]
mod tests {
use super::*;
const TOL: f64 = 1e-4;
#[test]
fn test_deuterium_excess_gmwl() {
let result = deuterium_excess(-70.0, -10.0);
assert!((result - 10.0).abs() < TOL, "expected 10.0, got {result}");
}
#[test]
fn test_deuterium_excess_evaporated() {
let result = deuterium_excess(-30.0, -5.0);
assert!((result - 10.0).abs() < TOL, "expected 10.0, got {result}");
}
#[test]
fn test_o17_excess() {
let result = o17_excess(-5.3, -10.0);
assert!(result.is_finite(), "expected finite value, got {result}");
}
#[test]
fn test_o17_excess_zero() {
let result = o17_excess(0.0, 0.0);
assert!(result.abs() < 0.1, "expected ~0, got {result}");
}
}