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;
28mod error;
29mod flight;
30mod guidance;
31mod motor;
32#[cfg(feature = "wasm")]
33pub mod wasm;
34
35pub use error::{Error, Result};
36pub use flight::{
37 AltitudeSwitch, BoxedForces, CentralGravity, FlightState, ForceModel, IntegratorSettings,
38 RailForces, Simulator, StepResult, UniformGravity, EARTH_MU_M3_S2,
39};
40pub use guidance::{
41 BoxedGuidance, ControlInput, FixedDirection, Guidance, GuidanceContext, ProgradeDirection,
42 SteeringLag, ThrustMisalignment,
43};
44pub use motor::{
45 Motor, MotorPhase, MotorSample, Rocket, RocketSample, Stage, ThrustCurve, ThrustPoint,
46};
47
48pub type Vec3 = nalgebra::Vector3<f64>;
50
51pub(crate) fn finite_vec(value: &Vec3) -> bool {
52 value.iter().all(|x| x.is_finite())
53}
54
55pub(crate) fn nonnegative(value: f64, field: &'static str) -> Result<()> {
56 if !value.is_finite() || value < 0.0 {
57 return Err(Error::invalid(field, "must be finite and nonnegative"));
58 }
59 Ok(())
60}
61
62pub(crate) fn positive(value: f64, field: &'static str) -> Result<()> {
63 if !value.is_finite() || value <= 0.0 {
64 return Err(Error::invalid(field, "must be finite and positive"));
65 }
66 Ok(())
67}