use crate::errors::RocheError;
use pyo3::prelude::*;
#[pyfunction]
pub fn zeta_rlobe_eggleton(q: f64) -> Result<f64, RocheError> {
if q <= 0. {
let message = format!("q = {} <= 0", q);
return Err(RocheError::ParameterError(message));
}
let q1 = q.powf(1.0 / 3.0);
let loneq = (1.0 + q1).ln();
Ok((1. + q) / 3.0 * (2.0 * loneq - q1 / (1. + q1)) / (0.6 * q1 * q1 * loneq))
}
#[pyfunction]
pub fn dzetadq_rlobe_eggleton(q: f64) -> Result<f64, RocheError> {
if q <= 0. {
let message = format!("q = {} <= 0", q);
return Err(RocheError::ParameterError(message));
}
let q1 = q.powf(1.0 / 3.0);
let q2 = q1 * q1;
let opq1 = 1. + q1;
let loneq = opq1.ln();
let denom = 0.6 * q2 + loneq;
let numer = 2. * loneq - q1 / opq1;
Ok(numer / denom / 3.0
+ (1.0 + q) / 3.0
* ((1. + 2. * q1) / 3.0 / (q1 * opq1).powi(2)
- numer * (0.4 / q1 + 1. / (3. * q2 * (1. + q1))) / denom)
/ denom)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn zeta_rlobe_eggleton_test() -> Result<(), RocheError> {
assert_eq!(zeta_rlobe_eggleton(0.2)?, 2.3365106916200284);
assert!(zeta_rlobe_eggleton(-0.2).is_err());
Ok(())
}
#[test]
fn dzetadq_rlobe_eggleton_test() -> Result<(), RocheError> {
assert_eq!(dzetadq_rlobe_eggleton(0.2)?, 0.135112859605613);
assert!(dzetadq_rlobe_eggleton(-0.2).is_err());
Ok(())
}
}