use core::f64::consts::PI;
use metrology::{C, E_CHARGE, G, HBAR};
pub const G_DAGGER: f64 = 1.20e-10;
pub const YUKAWA_LIMITS: [(f64, f64, &str); 3] = [
(38.6e-6, 1.0, "Lee et al. 2020, Eöt-Wash (95%)"),
(56e-6, 1.0, "Kapner et al. 2007 (95%, superseded)"),
(10e-6, 1.4e4, "Geraci et al. 2008"),
];
pub fn rar(g_bar: f64, g_dagger: f64) -> f64 {
g_bar / -(-(g_bar / g_dagger).sqrt()).exp_m1()
}
pub fn btfr_velocity(m: f64, a0: f64) -> f64 {
(G * m * a0).powf(0.25)
}
pub fn mond_radius(m: f64, a0: f64) -> f64 {
(G * m / a0).sqrt()
}
pub fn yukawa_factor(r: f64, alpha: f64, lambda: f64) -> f64 {
1.0 + alpha * (1.0 + r / lambda) * (-r / lambda).exp()
}
pub fn dark_energy_length(rho: f64) -> f64 {
(HBAR * C / rho).powf(0.25)
}
pub fn boson_mass_ev(lambda: f64) -> f64 {
HBAR * C / (lambda * E_CHARGE)
}
pub fn einstein_cartan_density(m: f64) -> f64 {
m * m * C.powi(4) / (8.0 * PI * G * HBAR * HBAR)
}
pub fn weber_perihelion_ratio(gamma: f64) -> f64 {
gamma / 6.0
}
pub fn weber_mass_shift(q: f64, u: f64, m: f64) -> f64 {
q * u / (3.0 * m * C * C)
}
#[cfg(test)]
mod tests {
use super::*;
use metrology::{AMU, KEV, M_E, PARSEC, SOLAR_MASS};
fn close(a: f64, b: f64, rel: f64) -> bool {
(a / b - 1.0).abs() < rel
}
#[test]
fn radial_acceleration_relation() {
for (g, obs) in [(1e-12, 1.14621e-11), (1e-11, 3.98812e-11), (1e-10, 1.67048e-10), (1.2e-10, 1.89837e-10), (1e-9, 1.05905e-9), (1e-8, 1.00011e-8)] {
assert!(close(rar(g, G_DAGGER), obs, 1e-5), "{g}");
}
assert!(close(btfr_velocity(1e11 * SOLAR_MASS, G_DAGGER), 199.767e3, 1e-5));
let au = 1.495_978_707e11;
assert!(close(mond_radius(2.0 * SOLAR_MASS, G_DAGGER) / au, 9941.57, 1e-5));
assert!(close(mond_radius(SOLAR_MASS, G_DAGGER) / au, 7030.0, 1e-3));
assert!(close(mond_radius(1e11 * SOLAR_MASS, G_DAGGER) / (1e3 * PARSEC), 10.7774, 1e-5));
}
#[test]
fn short_range_forces() {
assert!(close(yukawa_factor(1.0, 1.0, 1.0), 1.735759, 1e-6));
assert!(close(dark_energy_length(3.8 * KEV * 1e6), 84.8889e-6, 1e-5)); assert!(close(boson_mass_ev(YUKAWA_LIMITS[0].0), 5.11210e-3, 1e-5)); }
#[test]
fn torsion_and_weber() {
assert!(close(einstein_cartan_density(M_E), 3.59305e50, 1e-5));
assert!(close(einstein_cartan_density(1.008_664_915_95 * AMU), 1.21472e57, 1e-5));
assert!(close(weber_perihelion_ratio(2.0), 1.0 / 3.0, 1e-12) && close(weber_perihelion_ratio(6.0), 1.0, 1e-12));
assert!(close(weber_mass_shift(E_CHARGE, 1e4, M_E), 6.52317e-3, 1e-5));
}
}