1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
//! Surface interactions: aerodynamics, radiation pressure, contact, lighting, torques.
//!
//! Pure-Rust port of JEOD's `models/interactions/` plus the surface-model and
//! shadow geometry that those interactions depend on. Each module produces a
//! force, torque, or environmental scalar at a vehicle position; the
//! orchestration that sums these into a body's `astrodyn_dynamics::TotalForce`
//! lives in `astrodyn`.
//!
//! ## Public surface
//!
//! - **Aerodynamic drag**: [`aero_drag`] (port of JEOD
//! `models/interactions/aerodynamics/`) provides scalar-Cd drag against a
//! ballistic-coefficient body. [`flat_plate_aero`] adds the per-facet
//! panel-method drag/lift used for articulated spacecraft.
//! - **Radiation pressure**: [`radiation_pressure`] ports JEOD
//! `models/interactions/radiation_pressure/` — solar flux against a
//! surface model with absorption / specular / diffuse coefficients,
//! shadow-corrected via the [`shadow`] module's umbra/penumbra geometry
//! and via [`compute_earth_lighting`] for Earth-albedo and Earth-IR
//! contributions ([`EarthLightingState`], [`LightingBody`],
//! [`LightingParams`]).
//! - **Gravity-gradient torque**: [`compute_gravity_torque`] and its typed
//! sibling [`compute_gravity_torque_typed`] port JEOD
//! `models/interactions/gravity_torque/` — the cross product of the
//! inertia tensor and the gravity-gradient tensor projected through the
//! body attitude.
//! - **Surface model**: [`SurfaceFacet`], [`ArticulatedFacet`],
//! [`ArticulationState`], [`SurfaceShape`] in [`surface_model`] are the
//! per-facet geometry inputs that aero, SRP, contact, and thermal share.
//! - **Contact**: [`compute_contact_force`],
//! [`compute_contact_force_from_geometry`], [`compute_contact_geometry`],
//! [`ContactFacet`], [`ContactForce`], [`ContactGeometry`],
//! [`ContactMaterial`], [`ContactShape`] for collision/contact response.
//! - **Thermal**: [`compute_thermal_power_balance`],
//! [`ThermalEnvironment`], [`ThermalFacet`], [`ThermalPowerBalance`] —
//! per-facet power balance for thermal-rider models.
//!
//! JEOD source: `models/interactions/` and surrounding utilities. Pure Rust,
//! zero Bevy dependency.
//!
//! ## Example
//!
//! Compute ballistic aerodynamic drag for a 1 m² Cd=2.2 plate moving at
//! 7.5 km/s through a thin LEO atmosphere:
//!
//! ```
//! use astrodyn_atmosphere::AtmosphereState;
//! use astrodyn_interactions::{compute_ballistic_drag, DragConfig};
//! use astrodyn_quantities::frame::SelfPlanet;
//! use glam::{DMat3, DVec3};
//!
//! let cfg = DragConfig { cd: 2.2, area: 1.0, constant_density: None };
//! // 1e-12 kg/m^3 is roughly 400 km altitude.
//! let atmos = AtmosphereState::<SelfPlanet>::from_raw(1.0e-12, 0.0, 0.0, DVec3::ZERO);
//! // Velocity along +X at 7.5 km/s; identity rotation (inertial == body).
//! let v = DVec3::new(7_500.0, 0.0, 0.0);
//! let force = compute_ballistic_drag(&cfg, &atmos, v, &DMat3::IDENTITY);
//!
//! // Drag opposes motion (-X) and is small but non-zero.
//! assert!(force.force.x < 0.0);
//! assert!(force.force.length() > 0.0 && force.force.length() < 1.0);
//! ```
pub use *;
pub use ;
pub use ;
pub use *;
pub use ;
pub use ;
pub use *;
pub use *;
pub use ;
pub use ;