1#![cfg_attr(not(feature = "wasm"), forbid(unsafe_code))]
19#![warn(missing_docs)]
20#![doc = include_str!("../README.md")]
21
22#[cfg(any(feature = "cli", feature = "wasm"))]
23mod analysis;
24#[cfg(feature = "ballistics")]
25pub mod ballistics;
26#[cfg(any(feature = "cli", feature = "wasm"))]
27pub mod command;
28#[cfg(feature = "ballistics")]
29mod dynamics;
30mod error;
31mod flight;
32mod guidance;
33#[cfg(feature = "model")]
34pub mod model_rocket;
35mod motor;
36#[cfg(feature = "wasm")]
37pub mod wasm;
38
39#[cfg(feature = "ballistics")]
40pub use dynamics::{RollDynamics, Weathercock, WeathercockParams};
41pub use error::{Error, Result};
42pub use flight::{
43 AltitudeSwitch, BoxedForces, CentralGravity, FlightState, ForceModel, IntegratorSettings,
44 RailForces, Simulator, StepResult, UniformGravity, EARTH_MU_M3_S2,
45};
46pub use guidance::{
47 BoxedGuidance, ControlInput, FixedDirection, Guidance, GuidanceContext, ProgradeDirection,
48 SteeringLag, ThrustMisalignment,
49};
50#[cfg(feature = "model")]
51pub use model_rocket::MotorFile;
52#[cfg(all(feature = "model", feature = "ballistics"))]
53pub use model_rocket::{Airframe, RecoveryForces};
54pub use motor::{
55 Motor, MotorPhase, MotorSample, Rocket, RocketSample, Stage, ThrustCurve, ThrustPoint,
56};
57
58pub type Vec3 = nalgebra::Vector3<f64>;
60
61pub(crate) fn finite_vec(value: &Vec3) -> bool {
62 value.iter().all(|x| x.is_finite())
63}
64
65pub(crate) fn nonnegative(value: f64, field: &'static str) -> Result<()> {
66 if !value.is_finite() || value < 0.0 {
67 return Err(Error::invalid(field, "must be finite and nonnegative"));
68 }
69 Ok(())
70}
71
72pub(crate) fn positive(value: f64, field: &'static str) -> Result<()> {
73 if !value.is_finite() || value <= 0.0 {
74 return Err(Error::invalid(field, "must be finite and positive"));
75 }
76 Ok(())
77}