use core::f64::consts::PI;
use metrology::{C, E_CHARGE, EPS_0, G, HBAR};
pub fn bmv_phases(m: f64, d: f64, dx: f64, tau: f64) -> (f64, f64, f64) {
let phase = |r: f64| G * m * m * tau / (HBAR * r);
(phase(d), phase(d - dx), phase(d + dx))
}
pub fn dp_photon_rate(r0: f64, z: f64, n_atoms: f64, e_lo: f64, e_hi: f64) -> f64 {
2.0 * G * E_CHARGE * E_CHARGE * z * z * n_atoms / (3.0 * PI.powf(1.5) * EPS_0 * C.powi(3) * r0.powi(3)) * (e_hi / e_lo).ln()
}
#[cfg(test)]
mod tests {
use super::*;
use metrology::N_A;
#[test]
fn bose_marletto_vedral() {
let (p0, p_rl, p_lr) = bmv_phases(1e-14, 450e-6, 250e-6, 2.5);
assert!((p0 / 0.351607 - 1.0).abs() < 1e-5 && (p_rl / 0.791115 - 1.0).abs() < 1e-5 && (p_lr / 0.226033 - 1.0).abs() < 1e-5);
}
#[test]
fn diosi_penrose_germanium() {
let atoms = 375.0 * 5.323 / 72.630 * N_A;
assert!((atoms / 1.655e25 - 1.0).abs() < 1e-3);
let day = 86_400.0;
assert!((dp_photon_rate(0.54e-10, 32.0, atoms, 1.0, 3.8) * day / 10.6742 - 1.0).abs() < 1e-5);
assert!((dp_photon_rate(0.05e-10, 32.0, atoms, 1.0, 3.8) * day / 1.34464e4 - 1.0).abs() < 1e-5);
}
}