use core::f64::consts::PI;
use metrology::{C, G, HBAR, K_B};
pub fn alcubierre_energy(radius: f64, wall: f64, speed: f64) -> f64 {
-speed * speed / 12.0 * radius * radius / wall * C * C / G
}
pub fn induced_acceleration(m: f64, a_flow: f64, r: f64) -> f64 {
4.0 * G * m * a_flow / (C * C * r)
}
pub fn quantum_inequality(tau: f64) -> f64 {
-3.0 * HBAR * C / (32.0 * PI * PI * (C * tau).powi(4))
}
pub fn casimir_energy_density(d: f64) -> f64 {
-PI * PI * HBAR * C / (720.0 * d.powi(4))
}
pub fn casimir_pressure(d: f64) -> f64 {
-PI * PI * HBAR * C / (240.0 * d.powi(4))
}
pub fn casimir_sphere_plate(radius: f64, d: f64) -> f64 {
-PI.powi(3) * HBAR * C * radius / (360.0 * d.powi(3))
}
pub fn wormhole_throat_tension(b0: f64) -> f64 {
C.powi(4) / (8.0 * PI * G * b0 * b0)
}
pub fn wormhole_edge_tension() -> f64 {
-C.powi(4) / (8.0 * G)
}
pub fn horizon_temperature(kappa: f64) -> f64 {
HBAR * kappa / (2.0 * PI * K_B)
}
pub fn unruh_temperature(a: f64) -> f64 {
horizon_temperature(a / C)
}
pub fn hawking_temperature(m: f64) -> f64 {
horizon_temperature(C.powi(3) / (4.0 * G * m))
}
pub fn gibbons_hawking_temperature(h: f64) -> f64 {
horizon_temperature(h)
}
pub fn hawking_lifetime(m: f64) -> f64 {
5120.0 * PI * G * G * m.powi(3) / (HBAR * C.powi(4))
}
pub fn zero_point_energy_density(omega_c: f64) -> f64 {
HBAR * omega_c.powi(4) / (8.0 * PI * PI * C.powi(3))
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Metric {
GeneralRelativity,
PolarizableVacuum,
}
pub fn light_bending(mass: f64, b: f64, metric: Metric) -> f64 {
let x = G * mass / (C * C * b);
let second = match metric {
Metric::GeneralRelativity => 15.0 * PI / 4.0,
Metric::PolarizableVacuum => 4.0 * PI,
};
4.0 * x + second * x * x
}
#[cfg(test)]
mod tests {
use super::*;
use metrology::PLANCK_LENGTH;
fn close(a: f64, b: f64, rel: f64) -> bool {
(a / b - 1.0).abs() < rel
}
#[test]
fn warp_bubbles_and_quantum_inequalities() {
assert!(close(alcubierre_energy(100.0, 100.0 * PLANCK_LENGTH, 1.0), -6.94e62, 5e-3));
assert!(close(alcubierre_energy(100.0, 1.0, 1.0) / 1.989e30, -0.564, 5e-3));
assert!(close(quantum_inequality(1e-9), -3.72e-26, 5e-3));
assert!(close(quantum_inequality(1e-15), -3.72e-2, 5e-3));
}
#[test]
fn casimir_closed_forms() {
assert!(close(casimir_pressure(1e-6), -1.300e-3, 1e-3));
let d = 1e-6;
let energy = |d: f64| casimir_energy_density(d) * d;
let h = 1e-12;
assert!(close(-(energy(d + h) - energy(d - h)) / (2.0 * h), casimir_pressure(d), 1e-6));
assert!(close(casimir_sphere_plate(1e-4, d), 2.0 * PI * 1e-4 * energy(d), 1e-12));
}
#[test]
fn wormholes() {
assert!(close(wormhole_throat_tension(10.0), 4.82e40, 5e-3));
assert!(close(wormhole_edge_tension(), -1.513e43, 1e-3));
}
#[test]
fn horizons() {
assert!(close(unruh_temperature(1.0), 4.055e-21, 1e-3));
assert!(close(1.0 / unruh_temperature(1.0), 2.466e20, 1e-3));
let sun = 1.327_124_4e20 / G;
assert!(close(hawking_temperature(sun), 6.17e-8, 2e-3));
assert!(close(hawking_lifetime(sun) / 3.155_76e7, 2.095e67, 3e-3));
assert!(close(gibbons_hawking_temperature(67.4e3 / 3.085_677_581e22), 2.655e-30, 2e-3));
let compton = metrology::M_E * C * C / HBAR;
assert!(close(zero_point_energy_density(compton), 1.801e22, 2e-3));
}
#[test]
fn schwinger_is_a_boltzmann_factor_at_twice_the_unruh_temperature() {
use crate::strong_field::{E_SCHWINGER, schwinger_exponent};
let (m_e, e) = (metrology::M_E, metrology::E_CHARGE);
for f in [1.0, 0.1, 1e-3] {
let field = f * E_SCHWINGER;
let t_u = unruh_temperature(e * field / m_e);
assert!(close(schwinger_exponent(field), m_e * C * C / (2.0 * K_B * t_u), 1e-12));
}
assert!(close(unruh_temperature(e * E_SCHWINGER / m_e), 9.438e8, 1e-3));
}
#[test]
fn polarizable_vacuum_against_general_relativity() {
let (sun, limb) = (1.327_124_4e20 / G, 6.957e8);
let arcsec = 180.0 / PI * 3600.0;
let gr = light_bending(sun, limb, Metric::GeneralRelativity);
assert!((gr * arcsec - 1.7512).abs() < 1e-4);
let diff = light_bending(sun, limb, Metric::PolarizableVacuum) - gr;
assert!(close(diff * arcsec * 1e6, 0.730, 5e-3));
}
#[test]
fn forward_antigravity() {
assert!((G / (C * C) / 7.426e-28 - 1.0).abs() < 1e-3);
assert!((induced_acceleration(1e4, 1e4, 1.0) / 2.97046e-19 - 1.0).abs() < 1e-5);
assert!((9.8 / induced_acceleration(1.0, 1e6, 1.0) / 3.29915e21 - 1.0).abs() < 1e-5);
}
}