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
extern crate nalgebra as na; use self::na::allocator::Allocator; use self::na::{DefaultAllocator, DimName, VectorN}; /// The celestial module handles all Cartesian based dynamics. /// /// It is up to the engineer to ensure that the coordinate frames of the different dynamics borrowed /// from this module match, or perform the appropriate coordinate transformations. pub mod celestial; /// The gravity module handles spherical harmonics only. It _must_ be combined with a CelestialDynamics dynamics /// /// This module allows loading gravity models from [PDS](http://pds-geosciences.wustl.edu/), [EGM2008](http://earth-info.nga.mil/GandG/wgs84/gravitymod/egm2008/) and GMAT's own COF files. pub mod gravity; /// The drag module handles drag in a very basic fashion. Do not use for high fidelity dynamics. pub mod drag; /// The angular momentum module handles all angular momentum dynamics. /// /// Note that this module does not handle attitude parameters or control. Refer to the relevant modules. pub mod momentum; /// The `Dynamics` trait handles and stores any equation of motion *and* the state is integrated. /// /// Its design is such that several of the provided dynamics can be combined fairly easily. However, /// when combining the dynamics (e.g. integrating both the attitude of a spaceraft and its orbital /// parameters), it is up to the implementor to handle time and state organization correctly. /// For time management, I highly recommend using `hifitime` which is thoroughly validated. pub trait Dynamics where Self: Sized, { /// Defines the state size for these dynamics. It must be imported from `nalgebra`. type StateSize: DimName; /// Returns the time of the current state fn time(&self) -> f64; /// Returns the current state of the dynamics so it can be integrated. fn state(&self) -> VectorN<f64, Self::StateSize> where DefaultAllocator: Allocator<f64, Self::StateSize>; /// Defines the equations of motion for these dynamics, or a combination of provided dynamics. fn eom(&self, t: f64, state: &VectorN<f64, Self::StateSize>) -> VectorN<f64, Self::StateSize> where DefaultAllocator: Allocator<f64, Self::StateSize>; /// Updates the internal state of the dynamics. fn set_state(&mut self, new_t: f64, new_state: &VectorN<f64, Self::StateSize>) where DefaultAllocator: Allocator<f64, Self::StateSize>; }