phyz_gravity/lib.rs
1//! Layered gravity solver from constant g to post-Newtonian corrections.
2//!
3//! Implements 5 gravity layers:
4//! 1. Constant gravity (uniform g)
5//! 2. Poisson solver (local density fields)
6//! 3. N-body with Barnes-Hut tree (O(N log N) far-field)
7//! 4. Post-Newtonian corrections (1PN + 2.5PN)
8//! 5. Numerical GR (BSSN, future work)
9//!
10//! # Example
11//!
12//! ```
13//! use phyz_gravity::{GravityParticle, PostNewtonianSolver, GravitySolver};
14//! use phyz_math::Vec3;
15//!
16//! // Solar system: Mercury perihelion precession
17//! let m_sun = 1.989e30; // kg
18//! let m_mercury = 3.285e23;
19//!
20//! let mut particles = vec![
21//! GravityParticle::new(Vec3::zeros(), Vec3::zeros(), m_sun),
22//! GravityParticle::new(
23//! Vec3::new(57.9e9, 0.0, 0.0), // 57.9M km
24//! Vec3::new(0.0, 47.4e3, 0.0), // 47.4 km/s
25//! m_mercury,
26//! ),
27//! ];
28//!
29//! let mut solver = PostNewtonianSolver::new(2.5); // 2.5PN order
30//! solver.compute_forces(&mut particles);
31//! ```
32
33pub mod constant;
34pub mod nbody;
35pub mod particle;
36pub mod pn;
37pub mod poisson;
38
39pub use constant::ConstantGravity;
40pub use nbody::{BarnesHutTree, NBodySolver};
41pub use particle::GravityParticle;
42pub use pn::{PostNewtonianSolver, orbital_elements, perihelion_precession_rate};
43pub use poisson::PoissonSolver;
44
45/// Trait for all gravity solvers.
46pub trait GravitySolver {
47 /// Compute gravitational forces on all particles.
48 fn compute_forces(&mut self, particles: &mut [GravityParticle]);
49
50 /// Compute gravitational potential energy of the system.
51 fn potential_energy(&self, particles: &[GravityParticle]) -> f64;
52}
53
54/// Gravitational constant (m³ kg⁻¹ s⁻²).
55pub const G: f64 = 6.67430e-11;
56
57/// Speed of light (m/s).
58pub const C: f64 = 299_792_458.0;
59
60/// Standard Earth gravity (m/s²).
61pub const G_EARTH: f64 = 9.80665;