From 9cf5ecb0324f71f4191bff145b0b6ede60feb11f Mon Sep 17 00:00:00 2001 From: Christopher Rabotin Date: Sat, 13 May 2023 17:15:43 -0600 Subject: [PATCH 1/5] Remove MD UI and replace md::ui with md::prelude Signed-off-by: Christopher Rabotin --- src/cosmic/orbit.rs | 2 +- src/dynamics/spacecraft.rs | 4 +- src/io/dynamics.rs | 2 +- src/io/mod.rs | 1 - src/io/odp.rs | 446 ------------------ src/io/trajectory_data.rs | 2 +- src/md/mod.rs | 19 +- src/md/opti/convert_impulsive.rs | 2 +- src/md/opti/minimize_lm.rs | 2 +- .../multipleshooting/altitude_heuristic.rs | 2 +- src/md/opti/multipleshooting/ctrlnodes.rs | 3 +- .../multipleshooting/equidistant_heuristic.rs | 2 +- src/md/opti/multipleshooting/multishoot.rs | 2 +- src/md/opti/optimizer.rs | 2 +- src/md/opti/raphson_finite_diff.rs | 2 +- src/md/opti/raphson_hyperdual.rs | 2 +- src/md/opti/solution.rs | 2 +- src/md/trajectory/traj.rs | 5 +- src/md/ui.rs | 410 ---------------- src/od/ground_station.rs | 2 +- src/od/noise/gauss_markov.rs | 2 +- src/od/simulator/arc.rs | 2 +- src/od/simulator/trackdata.rs | 2 +- tests/mission_design/multishoot/mod.rs | 2 +- tests/mission_design/targeter/b_plane.rs | 2 +- tests/mission_design/targeter/finite_burns.rs | 2 +- tests/mission_design/targeter/multi_oe.rs | 2 +- tests/mission_design/targeter/multi_oe_vnc.rs | 2 +- .../mission_design/targeter/opti_levenberg.rs | 2 +- tests/mission_design/targeter/single_oe.rs | 2 +- tests/monte_carlo/framework.rs | 2 +- tests/orbit_determination/measurements.rs | 2 +- tests/orbit_determination/multi_body.rs | 2 +- tests/orbit_determination/resid_reject.rs | 2 +- tests/orbit_determination/simulator.rs | 2 +- tests/orbit_determination/trackingarc.rs | 2 +- tests/propagation/events.rs | 2 +- tests/propagation/stm.rs | 2 +- tests/propagation/trajectory.rs | 2 +- 39 files changed, 55 insertions(+), 897 deletions(-) delete mode 100644 src/io/odp.rs delete mode 100644 src/md/ui.rs diff --git a/src/cosmic/orbit.rs b/src/cosmic/orbit.rs index af25fd6a..9a8d5901 100644 --- a/src/cosmic/orbit.rs +++ b/src/cosmic/orbit.rs @@ -25,7 +25,7 @@ use crate::io::{ }; use crate::linalg::{Const, Matrix3, Matrix6, OVector, Vector3, Vector6}; use crate::mc::MultivariateNormal; -use crate::md::ui::Objective; +use crate::md::prelude::Objective; use crate::md::StateParameter; use crate::time::{Duration, Epoch, Unit}; diff --git a/src/dynamics/spacecraft.rs b/src/dynamics/spacecraft.rs index b90adf31..911718f8 100644 --- a/src/dynamics/spacecraft.rs +++ b/src/dynamics/spacecraft.rs @@ -26,8 +26,8 @@ use crate::io::gravity::HarmonicsMem; use crate::io::{ConfigError, Configurable}; use crate::linalg::{Const, DimName, OMatrix, OVector, Vector3}; -pub use crate::md::ui::SolarPressure; -use crate::md::ui::{Harmonics, PointMasses}; +pub use crate::md::prelude::SolarPressure; +use crate::md::prelude::{Harmonics, PointMasses}; use crate::State; use std::fmt; diff --git a/src/io/dynamics.rs b/src/io/dynamics.rs index ff96278e..7ff9e417 100644 --- a/src/io/dynamics.rs +++ b/src/io/dynamics.rs @@ -54,7 +54,7 @@ impl ConfigRepr for DynamicsSerde {} fn test_serde() { use crate::cosmic::Cosm; use crate::io::Configurable; - use crate::md::ui::SpacecraftDynamics; + use crate::md::prelude::SpacecraftDynamics; use std::collections::HashMap; let yaml = " diff --git a/src/io/mod.rs b/src/io/mod.rs index f30f5bc7..14e1ac60 100644 --- a/src/io/mod.rs +++ b/src/io/mod.rs @@ -50,7 +50,6 @@ pub mod frame_serde; /// Handles loading of gravity models using files of NASA PDS and GMAT COF. Several gunzipped files are provided with nyx. pub mod gravity; pub mod matrices; -// pub mod odp; pub mod orbit; pub mod quantity; /// Handles reading random variables diff --git a/src/io/odp.rs b/src/io/odp.rs deleted file mode 100644 index d575c9d9..00000000 --- a/src/io/odp.rs +++ /dev/null @@ -1,446 +0,0 @@ -/* - Nyx, blazing fast astrodynamics - Copyright (C) 2023 Christopher Rabotin - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -pub use crate::cosmic::*; -use crate::dynamics::NyxError; -use crate::io::formatter::NavSolutionFormatter; -use crate::io::quantity::{parse_duration, ParsingError}; -use crate::io::scenario::ScenarioSerde; -use crate::linalg::{Matrix2, Matrix6, Vector2, Vector6, U2, U3}; -use crate::md::ui::MDProcess; -use crate::od::measurement::GroundStation; -use crate::od::prelude::snc::SNC3; -use crate::od::prelude::*; -use crate::od::TrackingDeviceSim; -use crate::propagators::Propagator; -use crate::time::{Duration, Unit}; -use crate::Orbit; -use csv; -use rand::thread_rng; -use std::str::FromStr; -use std::sync::mpsc::channel; -use std::sync::Arc; -use std::time::Instant; - -pub struct OdpScenario { - truth: MDProcess, - nav: MDProcess, - ekf_msr_trigger: usize, - ekf_disable_time: Duration, - kf: KF, - stations: Vec, - formatter: Option, - cosm: Arc, -} - -impl OdpScenario { - #[allow(clippy::identity_op)] - pub fn try_from_scenario( - scenario: &ScenarioSerde, - seq_name: String, - cosm: Arc, - ) -> Result { - if scenario.odp.is_none() { - return Err(ParsingError::UseMdInstead); - } - - let odp = &scenario.odp.as_ref().unwrap(); - // Ensure valid ODP scenario - if scenario.measurements.is_none() { - return Err(ParsingError::OD( - "missing `measurements` section".to_string(), - )); - } else if scenario.estimate.is_none() { - return Err(ParsingError::OD("missing `estimate` section".to_string())); - } else if scenario.stations.is_none() { - return Err(ParsingError::OD("missing `stations` section".to_string())); - } - let all_measurements = match scenario.measurements.as_ref() { - Some(msr) => msr, - None => { - return Err(ParsingError::LoadingError( - "no measurements provided".to_string(), - )) - } - }; - - let all_estimates = match scenario.estimate.as_ref() { - Some(est) => est, - None => { - return Err(ParsingError::LoadingError( - "no estimates provided".to_string(), - )) - } - }; - - let all_stations = match scenario.stations.as_ref() { - Some(st) => st, - None => { - return Err(ParsingError::LoadingError( - "no stations provided".to_string(), - )) - } - }; - - if let Some(odp_seq) = odp.get(&seq_name.to_lowercase()) { - // Get the measurement generation - match all_measurements.get(&odp_seq.measurements.to_lowercase()) { - None => unimplemented!("{}", &odp_seq.measurements), - Some(msr) => { - // Get the IAU Earth frame - let iau_earth = cosm.frame("IAU Earth"); - // Build the stations - let mut stations = Vec::with_capacity(5); - for device in &msr.msr_device { - match all_stations.get(&device.to_lowercase()) { - None => { - return Err(ParsingError::OD(format!( - "station `{device}` in sequence `{seq_name}` not found", - ))) - } - Some(s) => { - let gs = if let Some(base) = &s.inherit { - match base.to_lowercase().as_str() { - "dss13" => GroundStation::dss13_goldstone( - s.elevation_mask_deg, - s.range_noise_km, - s.range_rate_noise_km_s, - iau_earth, - ), - "dss34" => GroundStation::dss34_canberra( - s.elevation_mask_deg, - s.range_noise_km, - s.range_rate_noise_km_s, - iau_earth, - ), - "dss65" => GroundStation::dss65_madrid( - s.elevation_mask_deg, - s.range_noise_km, - s.range_rate_noise_km_s, - iau_earth, - ), - _ => { - return Err(ParsingError::OD(format!( - "unknown base station `{base}`", - ))) - } - } - } else { - let station_name = device.clone(); - GroundStation::from_noise_values( - station_name, - s.elevation_mask_deg, - s.latitude_deg.unwrap(), - s.longitude_deg.unwrap(), - s.height_km.unwrap(), - s.range_noise_km, - s.range_rate_noise_km_s, - iau_earth, - ) - }; - stations.push(gs); - } - } - } - // Build the truth MD - let md = MDProcess::try_from_scenario( - scenario, - msr.propagator.as_ref().unwrap().to_string(), - false, - cosm.clone(), - )? - .0; - - // Build the initial estimate - if all_estimates - .get(&odp_seq.initial_estimate.to_lowercase()) - .is_none() - { - return Err(ParsingError::OD(format!( - "estimate `{}` not found", - &odp_seq.initial_estimate - ))); - } - - let est_serde = &all_estimates[&odp_seq.initial_estimate]; - if scenario - .state - .get(&est_serde.state.to_lowercase()) - .is_none() - { - return Err(ParsingError::OD(format!( - "state `{}` not found", - &est_serde.state - ))); - } - - let est_init_state_serde = &scenario.state[&est_serde.state.to_lowercase()]; - let state_frame = - cosm.frame(est_init_state_serde.frame.as_ref().unwrap().as_str()); - let est_init_state = est_init_state_serde.as_state(state_frame)?; - - // Build the covariance - let mut cov; - if let Some(covar_mat) = &est_serde.covar_mat { - cov = Matrix6::from_element(0.0); - let max_i = covar_mat.len(); - let mut max_j = 0; - for (i, row) in covar_mat.iter().enumerate() { - for (j, item) in row.iter().enumerate() { - cov[(i, j)] = *item; - if j > max_j { - max_j = j; - } - } - } - if max_i != 6 || max_j != 6 { - return Err(ParsingError::OD(format!( - "initial covariance `{}` does not have 36 items", - &odp_seq.initial_estimate - ))); - } - } else if let Some(covar_diag) = &est_serde.covar_diag { - let mut as_v = Vector6::zeros(); - for (i, item) in covar_diag.iter().enumerate() { - as_v[i] = *item; - } - cov = Matrix6::from_diagonal(&as_v); - } else { - return Err(ParsingError::OD(format!( - "initial covariance not specified in `{}`", - &odp_seq.initial_estimate - ))); - } - let mut init_sc_state = md.init_state; - init_sc_state.orbit = est_init_state; - let initial_estimate = KfEstimate::from_covar(init_sc_state.orbit, cov); - let measurement_noise = Matrix2::from_diagonal(&Vector2::new( - odp_seq.msr_noise[0], - odp_seq.msr_noise[1], - )); - - // Build the filter - let kf = match &odp_seq.snc { - None => KF::no_snc(initial_estimate, measurement_noise), - Some(snc) => { - if snc.len() != 3 { - return Err(ParsingError::OD( - "SNC must have three components".to_string(), - )); - } - // Disable SNC if there is more than 120 seconds between two measurements - let disable_time = match &odp_seq.snc_disable { - None => { - warn!("No SNC disable time specified, assuming 120 seconds"); - 2 * Unit::Minute - } - Some(snc_disable_dt) => match Duration::from_str(snc_disable_dt) { - Ok(d) => d, - Err(e) => { - return Err(ParsingError::IllDefined(format!( - "When parsing SNC duration: {e}", - ))) - } - }, - }; - - // Build the process noise - let process_noise = match &odp_seq.snc_decay { - None => SNC3::from_diagonal(disable_time, snc), - Some(decay_str) => { - if decay_str.len() != 3 { - return Err(ParsingError::OD( - "SNC decay must have three components".to_string(), - )); - } - let mut scn_decay_s = [0.0; 3]; - for (i, ds) in decay_str.iter().enumerate() { - scn_decay_s[i] = parse_duration(ds)?.v(); - } - SNC3::with_decay(disable_time, snc, &scn_decay_s) - } - }; - - info!("Using SNC: {process_noise}"); - - // And build the filter - KF::new(initial_estimate, process_noise, measurement_noise) - } - }; - - // Build the estimation propagator - let estimator = MDProcess::try_from_scenario( - scenario, - odp_seq.navigation_prop.to_string(), - true, - cosm.clone(), - )? - .0; - - // Get the formatter - let formatter = match &odp_seq.output { - Some(output) => match &scenario.output.get(&output.to_lowercase()) { - None => { - return Err(ParsingError::OD(format!( - "output `{output}` not found", - ))) - } - Some(output) => Some(output.to_nav_sol_formatter(cosm.clone())?), - }, - None => None, - }; - - return Ok(Self { - truth: md, - nav: estimator, - kf, - ekf_msr_trigger: match &odp_seq.ekf_msr_trigger { - Some(val) => *val, - None => 100_000, - }, - ekf_disable_time: match &odp_seq.ekf_disable_time { - Some(val) => Duration::from_str(val).unwrap(), - None => 1 * Unit::Hour, // defaults to one hour - }, - stations, - formatter, - cosm, - }); - } - } - } - - Err(ParsingError::SequenceNotFound(seq_name)) - } - - /// Will generate the measurements and run the filter. - pub fn execute(mut self) -> Result<(), NyxError> { - // Generate the measurements. - let prop_time = self.truth.prop_time.unwrap(); - - // Create the output file for the truth - let mut maybe_wtr = match &self.truth.formatter { - Some(fmtr) => { - let mut wtr = - csv::Writer::from_path(fmtr.filename.clone()).expect("could not create file"); - wtr.serialize(&fmtr.headers) - .expect("could not write headers"); - info!("Saving truth to {}", fmtr.filename); - Some(wtr) - } - None => None, - }; - - let mut prop_setup = Propagator::default(self.truth.sc_dyn); - prop_setup.set_tolerance(self.truth.prop_tol); - let mut truth_prop = prop_setup.with(self.truth.init_state); - - // let mut truth_prop = self.truth.propagator(); - truth_prop.set_step(10.0 * Unit::Second, true); - - // Set up the channels - let (tx, rx) = channel(); - - let mut initial_state = Some(truth_prop.state); - - // Generate the measurements - info!("Generating measurements over {prop_time} "); - - let start = Instant::now(); - info!("Initial state: {}", truth_prop.state); - - truth_prop.for_duration_with_channel(prop_time, tx)?; - - info!( - "Final state (computed in {:.3} seconds):", - (Instant::now() - start).as_secs_f64() - ); - info!("\t\t{}", truth_prop.state); - info!("\t\t{:x}", truth_prop.state); - - let mut rng = thread_rng(); - let mut sim_measurements = Vec::with_capacity(10000); - let start = Instant::now(); - while let Ok(rx_state) = rx.try_recv() { - if let Some(wtr) = &mut maybe_wtr { - if let Some(first_state) = initial_state { - wtr.serialize( - self.truth - .formatter - .as_ref() - .unwrap() - .fmt(&first_state.orbit), - ) - .expect("could not format state"); - initial_state = None; - } - wtr.serialize(self.truth.formatter.as_ref().unwrap().fmt(&rx_state.orbit)) - .expect("could not format state"); - } - for station in self.stations.iter_mut() { - if let Some(meas) = station.measure(&rx_state, &mut rng, self.cosm.clone()) { - sim_measurements.push(meas); - break; // We know that only one station is in visibility at each time. - } - } - } - - info!( - "Generated {} measurements in {:.3} seconds", - sim_measurements.len(), - (Instant::now() - start).as_secs_f64() - ); - - // Build the ODP - let mut prop_setup = Propagator::default(self.nav.sc_dyn); - prop_setup.set_tolerance(self.nav.prop_tol); - // Make sure to set the STM - let init_state = self.nav.init_state.with_stm(); - let mut nav = prop_setup.with(init_state); - - nav.set_step(10.0 * Unit::Second, true); - - let kf = self.kf; - let trig = EkfTrigger::new(self.ekf_msr_trigger, self.ekf_disable_time); - let mut odp = ODProcess::ekf(nav, kf, self.stations.clone(), trig, self.cosm.clone()); - - odp.process_measurements(&sim_measurements)?; - - odp.iterate(&sim_measurements, IterationConf::default())?; - - // Save to output file if requested - // Create the output file - if let Some(fmtr) = &self.formatter { - let mut wtr = - csv::Writer::from_path(fmtr.filename.clone()).expect("could not create file"); - wtr.serialize(&fmtr.headers) - .expect("could not write headers"); - info!("Saving output to {}", fmtr.filename); - for est in &odp.estimates { - wtr.serialize(fmtr.fmt(est)) - .expect("could not format state"); - } - }; - - if let Some(final_estimate) = &odp.estimates.last() { - println!("Final estimate:\n{final_estimate}"); - } - - Ok(()) - } -} diff --git a/src/io/trajectory_data.rs b/src/io/trajectory_data.rs index 6bb6be54..219ddc82 100644 --- a/src/io/trajectory_data.rs +++ b/src/io/trajectory_data.rs @@ -18,7 +18,7 @@ use crate::{ linalg::{allocator::Allocator, DefaultAllocator}, - md::{trajectory::Interpolatable, ui::Traj, StateParameter}, + md::{trajectory::Interpolatable, StateParameter, prelude::Traj}, NyxError, }; use arrow::{array::Float64Array, record_batch::RecordBatchReader}; diff --git a/src/md/mod.rs b/src/md/mod.rs index ec9285e3..86eb36a8 100644 --- a/src/md/mod.rs +++ b/src/md/mod.rs @@ -23,7 +23,24 @@ use std::error::Error; use std::fmt; use std::fs::File; -pub mod ui; +pub mod prelude { + pub use super::{optimizer::*, trajectory::Traj, Ephemeris, Event, ScTraj, StateParameter}; + pub use crate::cosmic::{ + try_achieve_b_plane, BPlane, BPlaneTarget, Bodies, Cosm, Frame, GuidanceMode, + LightTimeCalc, Orbit, OrbitDual, + }; + pub use crate::dynamics::{ + Drag, Harmonics, OrbitalDynamics, PointMasses, SolarPressure, SpacecraftDynamics, + }; + pub use crate::dynamics::{Dynamics, NyxError}; + pub use crate::io::gravity::HarmonicsMem; + pub use crate::md::objective::Objective; + pub use crate::propagators::{PropOpts, Propagator}; + pub use crate::time::{Duration, Epoch, TimeUnits, Unit}; + pub use crate::Spacecraft; + pub use crate::{State, TimeTagged}; + pub use std::sync::Arc; +} pub mod trajectory; diff --git a/src/md/opti/convert_impulsive.rs b/src/md/opti/convert_impulsive.rs index f7e94143..8ae270b4 100644 --- a/src/md/opti/convert_impulsive.rs +++ b/src/md/opti/convert_impulsive.rs @@ -22,7 +22,7 @@ use crate::dynamics::guidance::{ra_dec_from_unit_vector, Mnvr}; // use crate::errors::TargetingError; use crate::linalg::{SMatrix, SVector, Vector3}; use crate::md::objective::Objective; -use crate::md::ui::*; +use crate::md::prelude::*; use crate::md::StateParameter; pub use crate::md::{Variable, Vary}; use crate::polyfit::CommonPolynomial; diff --git a/src/md/opti/minimize_lm.rs b/src/md/opti/minimize_lm.rs index 69b97841..2dfdb919 100644 --- a/src/md/opti/minimize_lm.rs +++ b/src/md/opti/minimize_lm.rs @@ -22,8 +22,8 @@ use crate::dynamics::guidance::Mnvr; use crate::errors::TargetingError; use crate::linalg::{storage::Owned, Const, SMatrix, SVector, Vector6}; use crate::linalg::{DimMax, DimMin, ToTypenum}; +use crate::md::prelude::*; use crate::md::rayon::prelude::*; -use crate::md::ui::*; use crate::md::StateParameter; pub use crate::md::{Variable, Vary}; use crate::polyfit::CommonPolynomial; diff --git a/src/md/opti/multipleshooting/altitude_heuristic.rs b/src/md/opti/multipleshooting/altitude_heuristic.rs index da15e832..62037c7d 100644 --- a/src/md/opti/multipleshooting/altitude_heuristic.rs +++ b/src/md/opti/multipleshooting/altitude_heuristic.rs @@ -20,7 +20,7 @@ use super::ctrlnodes::Node; use super::multishoot::MultipleShooting; pub use super::CostFunction; use crate::errors::TargetingError; -use crate::md::ui::*; +use crate::md::prelude::*; use crate::propagators::error_ctrl::ErrorCtrl; use crate::{Orbit, Spacecraft}; diff --git a/src/md/opti/multipleshooting/ctrlnodes.rs b/src/md/opti/multipleshooting/ctrlnodes.rs index f5c067e4..3627836b 100644 --- a/src/md/opti/multipleshooting/ctrlnodes.rs +++ b/src/md/opti/multipleshooting/ctrlnodes.rs @@ -17,8 +17,7 @@ */ use crate::cosmic::{Cosm, Frame}; -use crate::md::objective::Objective; -use crate::md::ui::StateParameter; +use crate::md::prelude::{Objective, StateParameter}; use crate::time::Epoch; use crate::NyxError; use serde_derive::{Deserialize, Serialize}; diff --git a/src/md/opti/multipleshooting/equidistant_heuristic.rs b/src/md/opti/multipleshooting/equidistant_heuristic.rs index e1e9be23..48aaab93 100644 --- a/src/md/opti/multipleshooting/equidistant_heuristic.rs +++ b/src/md/opti/multipleshooting/equidistant_heuristic.rs @@ -20,7 +20,7 @@ use super::ctrlnodes::Node; use super::multishoot::MultipleShooting; pub use super::CostFunction; use crate::errors::TargetingError; -use crate::md::ui::*; +use crate::md::prelude::*; use crate::propagators::error_ctrl::ErrorCtrl; use crate::{Orbit, Spacecraft}; diff --git a/src/md/opti/multipleshooting/multishoot.rs b/src/md/opti/multipleshooting/multishoot.rs index f3ffc46c..7cba597a 100644 --- a/src/md/opti/multipleshooting/multishoot.rs +++ b/src/md/opti/multipleshooting/multishoot.rs @@ -21,7 +21,7 @@ pub use super::CostFunction; use crate::linalg::{DMatrix, DVector, SVector}; use crate::md::opti::solution::TargeterSolution; use crate::md::optimizer::Optimizer; -use crate::md::ui::*; +use crate::md::prelude::*; use crate::propagators::error_ctrl::ErrorCtrl; use crate::pseudo_inverse; use crate::{Orbit, Spacecraft}; diff --git a/src/md/opti/optimizer.rs b/src/md/opti/optimizer.rs index c0a61d83..4f619315 100644 --- a/src/md/opti/optimizer.rs +++ b/src/md/opti/optimizer.rs @@ -18,7 +18,7 @@ use crate::errors::TargetingError; use crate::md::objective::Objective; -use crate::md::ui::*; +use crate::md::prelude::*; use crate::md::StateParameter; pub use crate::md::{Variable, Vary}; use crate::propagators::error_ctrl::ErrorCtrl; diff --git a/src/md/opti/raphson_finite_diff.rs b/src/md/opti/raphson_finite_diff.rs index 829108a7..0e684344 100644 --- a/src/md/opti/raphson_finite_diff.rs +++ b/src/md/opti/raphson_finite_diff.rs @@ -21,7 +21,7 @@ use super::solution::TargeterSolution; use crate::dynamics::guidance::Mnvr; use crate::errors::TargetingError; use crate::linalg::{SMatrix, SVector, Vector6}; -use crate::md::ui::*; +use crate::md::prelude::*; use crate::md::StateParameter; pub use crate::md::{Variable, Vary}; use crate::polyfit::CommonPolynomial; diff --git a/src/md/opti/raphson_hyperdual.rs b/src/md/opti/raphson_hyperdual.rs index 0db3580a..ca613747 100644 --- a/src/md/opti/raphson_hyperdual.rs +++ b/src/md/opti/raphson_hyperdual.rs @@ -19,7 +19,7 @@ use super::solution::TargeterSolution; use crate::errors::TargetingError; use crate::linalg::{DMatrix, SVector}; -use crate::md::ui::*; +use crate::md::prelude::*; use crate::md::StateParameter; pub use crate::md::{Variable, Vary}; use crate::propagators::error_ctrl::ErrorCtrl; diff --git a/src/md/opti/solution.rs b/src/md/opti/solution.rs index 92d085fa..bf6c247e 100644 --- a/src/md/opti/solution.rs +++ b/src/md/opti/solution.rs @@ -21,7 +21,7 @@ use hifitime::TimeUnits; use crate::dynamics::guidance::Mnvr; use crate::linalg::SVector; use crate::md::objective::Objective; -use crate::md::ui::*; +use crate::md::prelude::*; pub use crate::md::{Variable, Vary}; use crate::polyfit::CommonPolynomial; use std::fmt; diff --git a/src/md/trajectory/traj.rs b/src/md/trajectory/traj.rs index ad780d54..7ffa063e 100644 --- a/src/md/trajectory/traj.rs +++ b/src/md/trajectory/traj.rs @@ -24,9 +24,8 @@ use crate::errors::NyxError; use crate::io::watermark::pq_writer; use crate::linalg::allocator::Allocator; use crate::linalg::DefaultAllocator; -use crate::md::events::EventEvaluator; -use crate::md::ui::GuidanceMode; -use crate::md::StateParameter; +use crate::md::prelude::{GuidanceMode, StateParameter}; +use crate::md::EventEvaluator; use crate::time::{Duration, Epoch, TimeSeries, TimeUnits, Unit}; use arrow::array::{ArrayRef, Float64Array, StringArray}; use arrow::datatypes::{DataType, Field, Schema}; diff --git a/src/md/ui.rs b/src/md/ui.rs deleted file mode 100644 index b52ba19b..00000000 --- a/src/md/ui.rs +++ /dev/null @@ -1,410 +0,0 @@ -/* - Nyx, blazing fast astrodynamics - Copyright (C) 2023 Christopher Rabotin - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -use super::MdHdlr; -pub use super::{optimizer::*, trajectory::Traj, Ephemeris, Event, ScTraj, StateParameter}; -pub use crate::cosmic::{ - try_achieve_b_plane, BPlane, BPlaneTarget, Bodies, Cosm, Frame, GuidanceMode, LightTimeCalc, - Orbit, OrbitDual, -}; -pub use crate::dynamics::{ - Drag, Harmonics, OrbitalDynamics, PointMasses, SolarPressure, SpacecraftDynamics, -}; -pub use crate::dynamics::{Dynamics, NyxError}; -use crate::io::formatter::*; -pub use crate::io::gravity::HarmonicsMem; -use crate::io::quantity::ParsingError; -use crate::io::scenario::ConditionSerde; -use crate::io::scenario::ScenarioSerde; -use crate::linalg::allocator::Allocator; -use crate::linalg::{DefaultAllocator, U6}; -pub use crate::md::objective::Objective; -pub use crate::propagators::{PropOpts, Propagator}; -pub use crate::time::{Duration, Epoch, TimeUnits, Unit}; -pub use crate::Spacecraft; -pub use crate::{State, TimeTagged}; -use rayon::prelude::*; -use std::convert::TryFrom; -use std::str::FromStr; -pub use std::sync::Arc; -use std::time::Instant; - -/// An MDProcess allows the creation and propagation of a spacecraft subjected to some dynamics -#[allow(clippy::upper_case_acronyms)] -pub struct MDProcess -where - DefaultAllocator: Allocator, -{ - pub sc_dyn: SpacecraftDynamics, - pub init_state: Spacecraft, - pub formatter: Option, - pub prop_time: Option, - pub prop_event: Option, - pub prop_tol: f64, - pub name: String, -} - -impl MDProcess -where - DefaultAllocator: Allocator, -{ - pub fn try_from_scenario( - scen: &ScenarioSerde, - prop_name: String, - stm_flag: bool, - cosm: Arc, - ) -> Result<(Self, Option), ParsingError> { - match scen.propagator.get(&prop_name.to_lowercase()) { - None => Err(ParsingError::PropagatorNotFound(prop_name)), - Some(prop) => { - #[allow(unused_assignments)] - let mut sc_dyn: SpacecraftDynamics; - #[allow(unused_assignments)] - let mut orbital_dyn: OrbitalDynamics = OrbitalDynamics::new(vec![]); - let mut init_sc; - - // Validate the output - let formatter = if let Some(output) = &prop.output { - match scen.output.get(&output.to_lowercase()) { - None => { - return Err(ParsingError::MD(format!( - "propagator `{prop_name}` refers to undefined output `{output}`", - ))) - } - Some(out) => match out.to_state_formatter(cosm.clone()) { - Ok(fmrt) => Some(fmrt), - Err(ne) => return Err(ParsingError::LoadingError(ne.to_string())), - }, - } - } else { - None - }; - let spacecraft = match scen.spacecraft.get(&prop.dynamics.to_lowercase()) { - None => { - return Err(ParsingError::MD(format!( - "propagator `{prop_name}` refers to undefined spacecraft `{}`", - prop.dynamics - ))) - } - Some(spacecraft) => spacecraft, - }; - - // Get and validate the orbital dynamics - let dynamics = match scen - .orbital_dynamics - .get(&spacecraft.orbital_dynamics.to_lowercase()) - { - None => { - return Err(ParsingError::MD(format!( - "spacecraft `{}` refers to undefined dynamics `{}`", - &prop.dynamics, spacecraft.orbital_dynamics - ))) - } - Some(dynamics) => dynamics, - }; - - let state_name = &dynamics.initial_state.to_lowercase(); - let init_state = match scen.state.get(state_name) { - None => { - // Let's see if there is a delta state - if scen.delta_state.is_some() { - match scen - .delta_state - .as_ref() - .unwrap() - .get(&dynamics.initial_state.to_lowercase()) - { - None => { - return Err(ParsingError::MD(format!( - "dynamics `{}` refers to unknown state `{}`", - prop.dynamics, dynamics.initial_state - ))) - } - Some(delta_state) => { - // Rebuilt the state - let inherited = match scen.state.get(&delta_state.inherit) { - None => { - return Err(ParsingError::MD(format!( - "delta state `{state_name}` refers to unknown state `{}`", - delta_state.inherit - ))) - } - Some(base) => { - let state_frame = - &cosm.frame(base.frame.as_ref().unwrap().as_str()); - base.as_state(*state_frame)? - } - }; - delta_state.as_state(inherited)? - } - } - } else { - return Err(ParsingError::MD(format!( - "dynamics `{}` refers to unknown state `{}`", - prop.dynamics, dynamics.initial_state - ))); - } - } - Some(init_state_sd) => { - let state_frame = - &cosm.frame(init_state_sd.frame.as_ref().unwrap().as_str()); - let mut init = init_state_sd.as_state(*state_frame)?; - if stm_flag { - // Specify that we want to compute the STM. - init.enable_stm(); - } - init - } - }; - - // Add the acceleration models if applicable - if let Some(accel_models) = &dynamics.accel_models { - // In this case, we'll need to recreate the orbital dynamics because it's behind an immutable Arc. - for mdl in accel_models { - match scen.accel_models.as_ref().unwrap().get(&mdl.to_lowercase()) { - None => { - return Err(ParsingError::MD(format!( - "dynamics `{}` refers to unknown state `{}`", - prop.dynamics, dynamics.initial_state - ))) - } - Some(amdl) => { - for hmdl in amdl.harmonics.values() { - let in_mem = hmdl.load().unwrap(); - let compute_frame = &cosm.frame(hmdl.frame.as_str()); - - let hh = - Harmonics::from_stor(*compute_frame, in_mem, cosm.clone()); - orbital_dyn.add_model(hh); - } - } - } - } - } - - // Create the dynamics - if let Some(pts_masses) = &dynamics.point_masses { - // Get the object IDs from name - let mut bodies = Vec::with_capacity(10); - for obj in pts_masses { - match Bodies::try_from(obj.to_string()) { - Ok(b) => bodies.push(b), - Err(e) => { - return Err(ParsingError::LoadingError(format!("Snif {e:?}"))); - } - } - } - // Remove bodies which are part of the state - if let Some(pos) = bodies - .iter() - .position(|x| x.ephem_path() == init_state.frame.ephem_path()) - { - bodies.remove(pos); - } - - orbital_dyn.add_model(PointMasses::new(&bodies, cosm.clone())); - } - - init_sc = Spacecraft::new( - init_state, - spacecraft.dry_mass, - spacecraft.fuel_mass.unwrap_or(0.0), - 0.0, - 0.0, - 0.0, - 0.0, - ); - - sc_dyn = SpacecraftDynamics::new(orbital_dyn); - - // Add the force models - if let Some(force_models) = &spacecraft.force_models { - if scen.force_models.as_ref().is_none() { - return Err(ParsingError::MD(format!( - "spacecraft `{}` refers to force models but none are defined", - prop.dynamics - ))); - } - for mdl in force_models { - match scen.force_models.as_ref().unwrap().get(&mdl.to_lowercase()) { - None => { - return Err(ParsingError::MD(format!( - "spacecraft `{}` refers to unknown force model `{mdl}`", - prop.dynamics - ))) - } - Some(amdl) => { - let eme2k = &cosm.frame("EME2000"); - let luna = &cosm.frame("Luna"); - for smdl in amdl.srp.values() { - // Note that an Arc is immutable, but we want to specify everything - // so we create the SRP without the wrapper - let mut srp = SolarPressure::default_raw( - vec![*eme2k, *luna], - cosm.clone(), - ); - srp.phi = smdl.phi; - sc_dyn.add_model(Arc::new(srp)); - init_sc.srp.area_m2 = smdl.sc_area; - init_sc.srp.cr = smdl.cr; - } - } - } - } - } - - info!("{}", sc_dyn); - - // Validate the stopping condition - // Check if it's a stopping condition - let prop_event = if let Some(conditions) = &scen.conditions { - conditions.get(&prop.stop_cond).cloned() - } else { - None - }; - // Let's see if it's a relative time - let prop_time = if prop_event.is_none() { - match Duration::from_str(prop.stop_cond.as_str()) { - Ok(d) => Some(d), - Err(_) => match Epoch::from_str(prop.stop_cond.as_str()) { - Err(e) => { - return Err(ParsingError::IllDefined(format!( - "{e}: `{}`", - prop.stop_cond - ))) - } - Ok(epoch) => Some(epoch - init_state.epoch), - }, - } - } else { - None - }; - - // Let's see if it's a relative time - let prop_tol = prop.tolerance.unwrap_or(1e-12); - - Ok(( - Self { - sc_dyn, - init_state: init_sc, - formatter: None, - prop_time, - prop_event, - prop_tol, - name: prop_name.clone(), - }, - formatter, - )) - } - } - } - - pub fn execute(mut self) -> Result<(), NyxError> { - self.execute_with(vec![]) - } - - /// Execute the MD with the provided handlers. Note that you must initialize your own CSV output if that's desired. - #[allow(clippy::identity_op)] - pub fn execute_with( - &mut self, - mut hdlrs: Vec>>, - ) -> Result<(), NyxError> { - // Get the prop time before the mutable ref of the propagator - let maybe_prop_time = self.prop_time; - let maybe_prop_event = self.prop_event.clone(); - - // Build the propagator - let mut prop_setup = Propagator::default(self.sc_dyn.clone()); - prop_setup.set_tolerance(self.prop_tol); - let mut prop = prop_setup.with(self.init_state); - - let mut initial_state = Some(prop.state); - - info!("Initial state: {}", prop.state); - let start = Instant::now(); - - // Run - let traj = match maybe_prop_event { - Some(prop_event) => { - let event = prop_event.to_condition(); - let max_duration = match Duration::from_str(prop_event.search_until.as_str()) { - Ok(d) => d, - Err(_) => match Epoch::from_str(prop_event.search_until.as_str()) { - Err(e) => return Err(NyxError::LoadingError(format!("{e}"))), - Ok(epoch) => { - let delta_t: Duration = epoch - prop.state.epoch(); - delta_t - } - }, - }; - let (_, traj) = - prop.until_nth_event(max_duration, &event, prop_event.hits.unwrap_or(0))?; - traj - } - None => { - // Elapsed seconds propagation - let prop_time = maybe_prop_time.unwrap(); - let (_, traj) = prop.for_duration_with_traj(prop_time)?; - traj - } - }; - - info!( - "Final state: {} (computed in {:.3} seconds)", - prop.state, - (Instant::now() - start).as_secs_f64() - ); - - if !hdlrs.is_empty() { - // Let's write the state every minute - let hdlr_start = Instant::now(); - let mut cnt = 0; - for prop_state in traj.every(1 * Unit::Minute) { - cnt += 1; - // Provide to the handler - hdlrs.par_iter_mut().for_each(|hdlr| { - if let Some(first_state) = initial_state { - hdlr.handle(&first_state); - } - hdlr.handle(&prop_state); - }); - // We've used the initial state (if it was there) - if initial_state.is_some() { - initial_state = None; - } - } - - // Make sure to add the last state too - // Provide to the handler - hdlrs.par_iter_mut().for_each(|hdlr| { - if let Some(first_state) = initial_state { - hdlr.handle(&first_state); - } - hdlr.handle(traj.last()); - }); - - info!( - "Processed {} states in {:.3} seconds", - cnt, - (Instant::now() - hdlr_start).as_secs_f64() - ); - } - - Ok(()) - } -} diff --git a/src/od/ground_station.rs b/src/od/ground_station.rs index 4eeca0ab..50b8e39d 100644 --- a/src/od/ground_station.rs +++ b/src/od/ground_station.rs @@ -21,7 +21,7 @@ use super::noise::GaussMarkov; use super::TrackingDeviceSim; use crate::cosmic::{Cosm, Frame, Orbit}; use crate::io::{frame_from_str, frame_to_str, ConfigRepr, Configurable}; -use crate::md::ui::Traj; +use crate::md::prelude::Traj; use crate::time::Epoch; use crate::{NyxError, Spacecraft}; use hifitime::Duration; diff --git a/src/od/noise/gauss_markov.rs b/src/od/noise/gauss_markov.rs index 1edc4134..06afe22f 100644 --- a/src/od/noise/gauss_markov.rs +++ b/src/od/noise/gauss_markov.rs @@ -18,7 +18,7 @@ use crate::io::watermark::pq_writer; use crate::io::{duration_from_str, duration_to_str, ConfigError, ConfigRepr, Configurable}; -use crate::md::ui::Cosm; +use crate::md::prelude::Cosm; use crate::NyxError; use arrow::array::{ArrayRef, Float64Array, UInt32Array}; use arrow::datatypes::{DataType, Field, Schema}; diff --git a/src/od/simulator/arc.rs b/src/od/simulator/arc.rs index 9eed6da3..158b9299 100644 --- a/src/od/simulator/arc.rs +++ b/src/od/simulator/arc.rs @@ -29,7 +29,7 @@ use crate::od::simulator::{Availability, Schedule}; use crate::od::Measurement; pub use crate::{cosmic::Cosm, State, TimeTagged}; use crate::{linalg::allocator::Allocator, od::TrackingDeviceSim}; -use crate::{linalg::DefaultAllocator, md::ui::Traj}; +use crate::{linalg::DefaultAllocator, md::prelude::Traj}; use std::collections::{HashMap, HashSet}; use std::fmt::Display; use std::marker::PhantomData; diff --git a/src/od/simulator/trackdata.rs b/src/od/simulator/trackdata.rs index aa0d7901..6c96063d 100644 --- a/src/od/simulator/trackdata.rs +++ b/src/od/simulator/trackdata.rs @@ -22,8 +22,8 @@ use hifitime::Epoch; use rand_pcg::Pcg64Mcg; use crate::linalg::DefaultAllocator; +use crate::md::prelude::{Frame, Traj}; use crate::md::trajectory::Interpolatable; -use crate::md::ui::{Frame, Traj}; use crate::od::Measurement; use crate::{io::Configurable, linalg::allocator::Allocator}; use crate::{NyxError, Orbit}; diff --git a/tests/mission_design/multishoot/mod.rs b/tests/mission_design/multishoot/mod.rs index d24d90a1..769af0a4 100644 --- a/tests/mission_design/multishoot/mod.rs +++ b/tests/mission_design/multishoot/mod.rs @@ -4,7 +4,7 @@ use std::path::PathBuf; use nyx::dynamics::guidance::Thruster; use nyx::md::opti::multishoot::*; -use nyx::md::ui::*; +use nyx::md::prelude::*; #[test] fn alt_orbit_raising() { diff --git a/tests/mission_design/targeter/b_plane.rs b/tests/mission_design/targeter/b_plane.rs index a1829276..9e6c8b7e 100644 --- a/tests/mission_design/targeter/b_plane.rs +++ b/tests/mission_design/targeter/b_plane.rs @@ -1,7 +1,7 @@ extern crate nyx_space as nyx; use nyx::md::optimizer::*; -use nyx::md::ui::*; +use nyx::md::prelude::*; #[test] fn tgt_b_plane_earth_gravity_assist_no_propagation() { diff --git a/tests/mission_design/targeter/finite_burns.rs b/tests/mission_design/targeter/finite_burns.rs index 259f388c..e40f0724 100644 --- a/tests/mission_design/targeter/finite_burns.rs +++ b/tests/mission_design/targeter/finite_burns.rs @@ -4,7 +4,7 @@ use hifitime::TimeUnits; use nyx::dynamics::guidance::{Mnvr, Thruster}; use nyx::linalg::Vector3; use nyx::md::optimizer::*; -use nyx::md::ui::*; +use nyx::md::prelude::*; #[test] fn thrust_dir_tgt_sma_aop_raan() { diff --git a/tests/mission_design/targeter/multi_oe.rs b/tests/mission_design/targeter/multi_oe.rs index c0570d56..f9d75d93 100644 --- a/tests/mission_design/targeter/multi_oe.rs +++ b/tests/mission_design/targeter/multi_oe.rs @@ -3,7 +3,7 @@ extern crate nyx_space as nyx; // use nyx::dynamics::guidance::Mnvr; use nyx::dynamics::guidance::Thruster; use nyx::md::optimizer::*; -use nyx::md::ui::*; +use nyx::md::prelude::*; #[test] fn tgt_c3_decl() { diff --git a/tests/mission_design/targeter/multi_oe_vnc.rs b/tests/mission_design/targeter/multi_oe_vnc.rs index 386d6e24..194023db 100644 --- a/tests/mission_design/targeter/multi_oe_vnc.rs +++ b/tests/mission_design/targeter/multi_oe_vnc.rs @@ -1,7 +1,7 @@ extern crate nyx_space as nyx; use nyx::md::optimizer::*; -use nyx::md::ui::*; +use nyx::md::prelude::*; #[test] fn tgt_vnc_c3_decl() { diff --git a/tests/mission_design/targeter/opti_levenberg.rs b/tests/mission_design/targeter/opti_levenberg.rs index 603901d5..145b9fbc 100644 --- a/tests/mission_design/targeter/opti_levenberg.rs +++ b/tests/mission_design/targeter/opti_levenberg.rs @@ -1,7 +1,7 @@ extern crate nyx_space as nyx; use nyx::md::optimizer::*; -use nyx::md::ui::*; +use nyx::md::prelude::*; // Semi major axis diff --git a/tests/mission_design/targeter/single_oe.rs b/tests/mission_design/targeter/single_oe.rs index 9b36cea0..048c6c39 100644 --- a/tests/mission_design/targeter/single_oe.rs +++ b/tests/mission_design/targeter/single_oe.rs @@ -1,7 +1,7 @@ extern crate nyx_space as nyx; use nyx::md::optimizer::*; -use nyx::md::ui::*; +use nyx::md::prelude::*; // Semi major axis diff --git a/tests/monte_carlo/framework.rs b/tests/monte_carlo/framework.rs index 965da487..c8527099 100644 --- a/tests/monte_carlo/framework.rs +++ b/tests/monte_carlo/framework.rs @@ -1,7 +1,7 @@ extern crate nyx_space as nyx; use nyx::mc::*; -use nyx::md::ui::*; +use nyx::md::prelude::*; #[test] fn test_monte_carlo_epoch() { diff --git a/tests/orbit_determination/measurements.rs b/tests/orbit_determination/measurements.rs index 81c13b8c..f661c201 100644 --- a/tests/orbit_determination/measurements.rs +++ b/tests/orbit_determination/measurements.rs @@ -52,7 +52,7 @@ fn nil_measurement() { #[test] fn val_measurements_topo() { use self::nyx::cosmic::{Cosm, Orbit}; - use self::nyx::md::ui::*; + use self::nyx::md::prelude::*; use self::nyx::od::prelude::*; use self::nyx::propagators::RK4Fixed; use std::str::FromStr; diff --git a/tests/orbit_determination/multi_body.rs b/tests/orbit_determination/multi_body.rs index 8cbe726d..edd64bf2 100644 --- a/tests/orbit_determination/multi_body.rs +++ b/tests/orbit_determination/multi_body.rs @@ -4,7 +4,7 @@ use nyx::od::noise::GaussMarkov; use nyx::od::simulator::arc::TrackingArcSim; use nyx::od::simulator::TrkConfig; -use self::nyx::md::ui::*; +use self::nyx::md::prelude::*; use self::nyx::od::prelude::*; // Extra testing imports diff --git a/tests/orbit_determination/resid_reject.rs b/tests/orbit_determination/resid_reject.rs index 3731929e..1d5714de 100644 --- a/tests/orbit_determination/resid_reject.rs +++ b/tests/orbit_determination/resid_reject.rs @@ -7,7 +7,7 @@ use rstest::*; use nyx_space::cosmic::{Bodies, Cosm, Orbit}; use nyx_space::dynamics::orbital::OrbitalDynamics; use nyx_space::linalg::{Matrix2, Vector2}; -use nyx_space::md::ui::*; +use nyx_space::md::prelude::*; use nyx_space::md::StateParameter; use nyx_space::od::noise::GaussMarkov; use nyx_space::od::prelude::*; diff --git a/tests/orbit_determination/simulator.rs b/tests/orbit_determination/simulator.rs index e0ab117e..3ded09e0 100644 --- a/tests/orbit_determination/simulator.rs +++ b/tests/orbit_determination/simulator.rs @@ -1,7 +1,7 @@ use nyx_space::io::tracking_data::DynamicTrackingArc; use nyx_space::io::ConfigRepr; +use nyx_space::md::prelude::*; use nyx_space::md::trajectory::ExportCfg; -use nyx_space::md::ui::*; use nyx_space::od::msr::RangeDoppler; use nyx_space::od::prelude::*; use nyx_space::od::simulator::arc::TrackingArcSim; diff --git a/tests/orbit_determination/trackingarc.rs b/tests/orbit_determination/trackingarc.rs index 04c2f6cb..52d4d293 100644 --- a/tests/orbit_determination/trackingarc.rs +++ b/tests/orbit_determination/trackingarc.rs @@ -1,6 +1,6 @@ use nyx_space::io::tracking_data::DynamicTrackingArc; use nyx_space::io::ConfigRepr; -use nyx_space::md::ui::*; +use nyx_space::md::prelude::*; use nyx_space::od::msr::RangeDoppler; use nyx_space::od::prelude::*; use nyx_space::od::simulator::arc::TrackingArcSim; diff --git a/tests/propagation/events.rs b/tests/propagation/events.rs index 76ca9b2d..7ef0543c 100644 --- a/tests/propagation/events.rs +++ b/tests/propagation/events.rs @@ -3,7 +3,7 @@ extern crate nyx_space as nyx; #[test] fn event_tracker_true_anomaly() { use nyx::cosmic::eclipse::{EclipseLocator, EclipseState}; - use nyx::md::ui::*; + use nyx::md::prelude::*; use nyx::md::EventEvaluator; // Only needed because we're manually calling e.eval use nyx::od::GroundStation; diff --git a/tests/propagation/stm.rs b/tests/propagation/stm.rs index 44316653..34c3814e 100644 --- a/tests/propagation/stm.rs +++ b/tests/propagation/stm.rs @@ -5,7 +5,7 @@ use nyx::linalg::{Const, Matrix6, OVector}; use nyx::propagators::*; use nyx::time::{Epoch, Unit}; use nyx::State; -use nyx_space::md::ui::SpacecraftDynamics; +use nyx_space::md::prelude::SpacecraftDynamics; // These tests compare the computation of the state transition matrix between the finite differencing methoid (common) and hyperdual numbers. // Conclusion: hyperdual numbers lead to less error than finite differencing. diff --git a/tests/propagation/trajectory.rs b/tests/propagation/trajectory.rs index a7b0d260..77575244 100644 --- a/tests/propagation/trajectory.rs +++ b/tests/propagation/trajectory.rs @@ -6,8 +6,8 @@ use nyx::cosmic::{Cosm, GuidanceMode, Orbit, Spacecraft}; use nyx::dynamics::guidance::{GuidanceLaw, Ruggiero, Thruster}; use nyx::dynamics::{OrbitalDynamics, SpacecraftDynamics}; use nyx::io::trajectory_data::DynamicTrajectory; +use nyx::md::prelude::Objective; use nyx::md::trajectory::Interpolatable; -use nyx::md::ui::Objective; use nyx::md::StateParameter; use nyx::propagators::*; use nyx::time::{Epoch, TimeSeries, Unit}; From f48416cf767b7394815882d5ca3b8fb293cd035a Mon Sep 17 00:00:00 2001 From: Christopher Rabotin Date: Sat, 13 May 2023 17:46:33 -0600 Subject: [PATCH 2/5] Replace the KfTrigger trait with an optional EkfTrigger struct This simplifies the code quite a bit. Signed-off-by: Christopher Rabotin --- .github/workflows/tests.yaml | 7 ++-- src/od/process/mod.rs | 54 ++++++++++++++----------- src/od/process/trigger.rs | 10 ++--- tests/orbit_determination/multi_body.rs | 2 +- tests/orbit_determination/two_body.rs | 1 - 5 files changed, 39 insertions(+), 35 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 0bca44be..19b9100a 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -135,9 +135,10 @@ jobs: # grcov . -s . --binary-path ./target/debug/ -t html --branch --ignore-not-existing -o ./target/debug/coverage/ # Export as HTML run: | cargo test --lib - cargo test stop_cond_nrho_apo - cargo test od_robust - cargo test od_resid_reject_ + cargo test cosmic + cargo test mission_design + cargo test orbit_determination + cargo test propulsion grcov . --binary-path ./target/debug/ -t lcov -s . > lcov.txt - name: Upload coverage report diff --git a/src/od/process/mod.rs b/src/od/process/mod.rs index db651416..238e7db0 100644 --- a/src/od/process/mod.rs +++ b/src/od/process/mod.rs @@ -51,7 +51,6 @@ pub struct ODProcess< D: Dynamics, E: ErrorCtrl, Msr: Measurement, - T: KfTrigger, A: DimName, S: EstimateFrom + Interpolatable, K: Filter, @@ -86,7 +85,7 @@ pub struct ODProcess< pub estimates: Vec, /// Vector of residuals available after a pass pub residuals: Vec>, - pub ekf_trigger: T, + pub ekf_trigger: Option, /// Residual rejection criteria allows preventing bad measurements from affecting the estimation. pub resid_crit: Option, pub cosm: Arc, @@ -99,11 +98,10 @@ impl< D: Dynamics, E: ErrorCtrl, Msr: Measurement, - T: KfTrigger, A: DimName, S: EstimateFrom + Interpolatable, K: Filter, - > ODProcess<'a, D, E, Msr, T, A, S, K> + > ODProcess<'a, D, E, Msr, A, S, K> where D::StateType: Interpolatable + Add::Size>, Output = D::StateType>, ::VecLength>>::Buffer: Send, @@ -133,7 +131,7 @@ where pub fn ekf( prop: PropInstance<'a, D, E>, kf: K, - trigger: T, + trigger: EkfTrigger, resid_crit: Option, cosm: Arc, ) -> Self { @@ -143,7 +141,7 @@ where kf, estimates: Vec::with_capacity(10_000), residuals: Vec::with_capacity(10_000), - ekf_trigger: trigger, + ekf_trigger: Some(trigger), resid_crit, cosm, init_state, @@ -315,7 +313,9 @@ where iter_cnt += 1; - self.ekf_trigger.reset(); + if let Some(trigger) = &mut self.ekf_trigger { + trigger.reset(); + } info!("***************************"); info!("*** Iteration number {} ***", iter_cnt); @@ -506,9 +506,11 @@ where device.location(epoch, nominal_state.frame(), &self.cosm); // Switch back from extended if necessary - if self.kf.is_extended() && self.ekf_trigger.disable_ekf(epoch) { - self.kf.set_extended(false); - info!("EKF disabled @ {epoch}"); + if let Some(trigger) = &mut self.ekf_trigger { + if self.kf.is_extended() && trigger.disable_ekf(epoch) { + self.kf.set_extended(false); + info!("EKF disabled @ {epoch}"); + } } let h_tilde = S::sensitivity(msr, nominal_state, device_loc); @@ -543,20 +545,24 @@ where // Note: we call enable_ekf first to ensure that the trigger gets // called in case it needs to save some information (e.g. the // StdEkfTrigger needs to store the time of the previous measurement). - if self.ekf_trigger.enable_ekf(&estimate) - && !self.kf.is_extended() - { - self.kf.set_extended(true); - if !estimate.within_3sigma() { - warn!("EKF enabled @ {epoch} but filter DIVERGING"); - } else { - info!("EKF enabled @ {epoch}"); + + if let Some(trigger) = &mut self.ekf_trigger { + if trigger.enable_ekf(&estimate) + && !self.kf.is_extended() + { + self.kf.set_extended(true); + if !estimate.within_3sigma() { + warn!("EKF enabled @ {epoch} but filter DIVERGING"); + } else { + info!("EKF enabled @ {epoch}"); + } + } + if self.kf.is_extended() { + self.prop.state = + self.prop.state + estimate.state_deviation(); } } - if self.kf.is_extended() { - self.prop.state = - self.prop.state + estimate.state_deviation(); - } + self.prop.state.reset_stm(); self.estimates.push(estimate); @@ -679,7 +685,7 @@ impl< A: DimName, S: EstimateFrom + Interpolatable, K: Filter, - > ODProcess<'a, D, E, Msr, CkfTrigger, A, S, K> + > ODProcess<'a, D, E, Msr, A, S, K> where D::StateType: Interpolatable + Add::Size>, Output = D::StateType>, ::VecLength>>::Buffer: Send, @@ -718,7 +724,7 @@ where estimates: Vec::with_capacity(10_000), residuals: Vec::with_capacity(10_000), resid_crit, - ekf_trigger: CkfTrigger {}, + ekf_trigger: None, init_state, cosm, _marker: PhantomData::, diff --git a/src/od/process/trigger.rs b/src/od/process/trigger.rs index 6542a7ad..0cc1d1dc 100644 --- a/src/od/process/trigger.rs +++ b/src/od/process/trigger.rs @@ -101,10 +101,8 @@ impl EkfTrigger { inhibit: false, } } -} -impl KfTrigger for EkfTrigger { - fn enable_ekf(&mut self, est: &E) -> bool + pub fn enable_ekf(&mut self, est: &E) -> bool where E: Estimate, DefaultAllocator: Allocator::Size> @@ -125,7 +123,7 @@ impl KfTrigger for EkfTrigger { || self.within_sigma <= 0.0) } - fn disable_ekf(&mut self, epoch: Epoch) -> bool { + pub fn disable_ekf(&mut self, epoch: Epoch) -> bool { if self.inhibit { return true; } @@ -143,11 +141,11 @@ impl KfTrigger for EkfTrigger { } } - fn set_inhibit(&mut self, inhibit: bool) { + pub fn set_inhibit(&mut self, inhibit: bool) { self.inhibit = inhibit; } - fn reset(&mut self) { + pub fn reset(&mut self) { self.cur_msrs = 0; self.prev_msr_dt = None; } diff --git a/tests/orbit_determination/multi_body.rs b/tests/orbit_determination/multi_body.rs index edd64bf2..3f76492e 100644 --- a/tests/orbit_determination/multi_body.rs +++ b/tests/orbit_determination/multi_body.rs @@ -109,7 +109,7 @@ fn od_val_multi_body_ckf_perfect_stations() { let ckf = KF::no_snc(initial_estimate, measurement_noise); - let mut odp = ODProcess::<_, _, RangeDoppler, _, _, _, _>::ckf(prop_est, ckf, None, cosm); + let mut odp = ODProcess::<_, _, RangeDoppler, _, _, _>::ckf(prop_est, ckf, None, cosm); odp.process_arc::(&arc).unwrap(); diff --git a/tests/orbit_determination/two_body.rs b/tests/orbit_determination/two_body.rs index 7c1068fb..58c88e88 100644 --- a/tests/orbit_determination/two_body.rs +++ b/tests/orbit_determination/two_body.rs @@ -966,7 +966,6 @@ fn od_tb_ckf_map_covar() { OrbitalDynamics, nyx::propagators::RSSCartesianStep, RangeDoppler, - CkfTrigger, nalgebra::Const<3>, Orbit, KF, nalgebra::Const<2>>, From 6c141c98e1fa10abde9aaf8877a1dde68e49dcb1 Mon Sep 17 00:00:00 2001 From: Christopher Rabotin Date: Sat, 13 May 2023 18:29:14 -0600 Subject: [PATCH 3/5] Fix python Signed-off-by: Christopher Rabotin --- src/python/mission_design/mod.rs | 2 +- src/python/mission_design/spacecraft.rs | 2 +- src/python/mission_design/trajectory.rs | 2 +- src/python/orbit_determination/process.rs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/python/mission_design/mod.rs b/src/python/mission_design/mod.rs index 5d1fd7dc..3743d83e 100644 --- a/src/python/mission_design/mod.rs +++ b/src/python/mission_design/mod.rs @@ -18,7 +18,7 @@ use crate::io::trajectory_data::DynamicTrajectory; use crate::io::ConfigError; -use crate::md::ui::{PropOpts, Propagator, SpacecraftDynamics}; +use crate::md::prelude::{PropOpts, Propagator, SpacecraftDynamics}; use crate::md::{Event, StateParameter}; use crate::propagators::{ diff --git a/src/python/mission_design/spacecraft.rs b/src/python/mission_design/spacecraft.rs index 99cb8acc..03a86288 100644 --- a/src/python/mission_design/spacecraft.rs +++ b/src/python/mission_design/spacecraft.rs @@ -19,7 +19,7 @@ use crate::{ cosmic::{DragConfig, SrpConfig}, dynamics::guidance::Thruster, io::{ConfigError, ConfigRepr}, - md::ui::GuidanceMode, + md::prelude::GuidanceMode, Orbit, Spacecraft, State, }; use crate::{md::StateParameter, NyxError}; diff --git a/src/python/mission_design/trajectory.rs b/src/python/mission_design/trajectory.rs index 145a40c8..c7e69781 100644 --- a/src/python/mission_design/trajectory.rs +++ b/src/python/mission_design/trajectory.rs @@ -21,7 +21,7 @@ use pyo3::prelude::*; use crate::md::trajectory::ExportCfg; use crate::{ - md::{ui::Traj as TrajRs, Event, EventEvaluator}, + md::{prelude::Traj as TrajRs, Event, EventEvaluator}, NyxError, Spacecraft, State, }; diff --git a/src/python/orbit_determination/process.rs b/src/python/orbit_determination/process.rs index 942fdc10..fe955b7e 100644 --- a/src/python/orbit_determination/process.rs +++ b/src/python/orbit_determination/process.rs @@ -22,7 +22,7 @@ use pyo3::prelude::*; use crate::{ io::tracking_data::DynamicTrackingArc, - md::ui::{Cosm, Propagator, SpacecraftDynamics}, + md::prelude::{Cosm, Propagator, SpacecraftDynamics}, od::{ kalman::KF, process::{EkfTrigger, FltResid, ODProcess}, From 33352fdf9f8fd473bb58c10a6d8a12152f34bc5c Mon Sep 17 00:00:00 2001 From: Christopher Rabotin Date: Sun, 14 May 2023 18:12:08 -0600 Subject: [PATCH 4/5] Allow configuring GaussMarkov as pure white noise Also: + Remove obsolete files + Add monte carlo test to code coverage Signed-off-by: Christopher Rabotin --- .github/workflows/tests.yaml | 10 +- src/io/trajectory_data.rs | 2 +- src/od/noise/gauss_markov.rs | 93 + tests/gm.rs | 156 -- tests/monte_carlo/framework.rs | 4 +- tests/orbit_determination/robust.rs | 58 +- tests/spiceypy/Pipfile | 16 - tests/spiceypy/Pipfile.lock | 287 --- tests/spiceypy/naif0012.tls | 191 -- tests/spiceypy/pck00008.tpc | 3381 --------------------------- tests/spiceypy/rotations.py | 24 - tests/spiceypy/sc_query.py | 35 - 12 files changed, 130 insertions(+), 4127 deletions(-) delete mode 100644 tests/gm.rs delete mode 100644 tests/spiceypy/Pipfile delete mode 100644 tests/spiceypy/Pipfile.lock delete mode 100644 tests/spiceypy/naif0012.tls delete mode 100644 tests/spiceypy/pck00008.tpc delete mode 100644 tests/spiceypy/rotations.py delete mode 100644 tests/spiceypy/sc_query.py diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 19b9100a..5e9a7caf 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -135,17 +135,15 @@ jobs: # grcov . -s . --binary-path ./target/debug/ -t html --branch --ignore-not-existing -o ./target/debug/coverage/ # Export as HTML run: | cargo test --lib - cargo test cosmic - cargo test mission_design - cargo test orbit_determination - cargo test propulsion - grcov . --binary-path ./target/debug/ -t lcov -s . > lcov.txt + grcov . --binary-path ./target/debug/ -t lcov -s . > lcov-lib.txt + cargo test cosmic mission_design orbit_determination propulsion test_monte_carlo_epoch + grcov . --binary-path ./target/debug/ -t lcov -s . > lcov-integ.txt - name: Upload coverage report uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} - files: ./lcov.txt + files: ./lcov-lib.txt, ./lcov-integ.txt release: name: Release diff --git a/src/io/trajectory_data.rs b/src/io/trajectory_data.rs index 219ddc82..8610534f 100644 --- a/src/io/trajectory_data.rs +++ b/src/io/trajectory_data.rs @@ -18,7 +18,7 @@ use crate::{ linalg::{allocator::Allocator, DefaultAllocator}, - md::{trajectory::Interpolatable, StateParameter, prelude::Traj}, + md::{prelude::Traj, trajectory::Interpolatable, StateParameter}, NyxError, }; use arrow::{array::Float64Array, record_batch::RecordBatchReader}; diff --git a/src/od/noise/gauss_markov.rs b/src/od/noise/gauss_markov.rs index 06afe22f..afb84587 100644 --- a/src/od/noise/gauss_markov.rs +++ b/src/od/noise/gauss_markov.rs @@ -16,6 +16,7 @@ along with this program. If not, see . */ +use crate::cosmic::SPEED_OF_LIGHT_KMS; use crate::io::watermark::pq_writer; use crate::io::{duration_from_str, duration_to_str, ConfigError, ConfigRepr, Configurable}; use crate::md::prelude::Cosm; @@ -36,6 +37,7 @@ use serde_derive::{Deserialize, Serialize}; use std::collections::HashMap; use std::fmt; use std::fs::File; +use std::ops::Mul; use std::sync::Arc; /// A first order Gauss-Markov process for modeling biases as described in section 5.2.4 of the NASA Best Practices for Navigation Filters (D'Souza et al.). @@ -49,6 +51,10 @@ use std::sync::Arc; /// b(t + Δt) = b(t) * exp(-Δt / τ) + q * (1 - exp(-Δt / τ)) * w(t) /// /// Where w(t) ~ 𝓝(0, σ_{ss}) is a zero-mean white noise process with standard deviation σ_ss, the steady state sigma. +/// +/// ## Important +/// If the time constant is greater than 366 days, then the process is actually modeled as a white noise process. +/// This allows the users to model a white noise process without having to change the process type. #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)] #[cfg_attr(feature = "python", pyclass)] #[cfg_attr(feature = "python", pyo3(text_signature = "(tau, sigma, state_state)"))] @@ -107,8 +113,18 @@ impl GaussMarkov { }) } + /// Create a new `GaussMarkov` process as if it were purely a white noise (zero mean), i.e. without any time correlation. + pub fn white_noise(sigma: f64) -> Self { + Self::new(Duration::MAX, 0.0, sigma).unwrap() + } + /// Return the next bias sample. pub fn next_bias(&mut self, epoch: Epoch, rng: &mut R) -> f64 { + // If the time constant is set to the maximum duration, then the process is a white noise process. + if self.is_white() { + return rng.sample(Normal::new(0.0, self.steady_state_sigma).unwrap()); + } + // Compute the delta time in seconds between the previous epoch and the sample epoch. let dt_s = (match self.epoch { None => Duration::ZERO, @@ -190,6 +206,19 @@ impl GaussMarkov { } } + /// Initializes a new Gauss Markov process as a time-uncorrelated white noise process, using only the Pr/N0 value and the bandwidth. + /// This returns a white noise sigma in kilometers. + /// + /// # Equation + /// σ = c / (2 * B * √(Pr/N0)) + /// + /// Where c is the speed of light, B is the bandwidth in Hz, and the Pr/N0 is the signal-to-noise ratio. + pub fn from_pr_n0(pr_n0: f64, bandwidth_hz: f64) -> Self { + let sigma = SPEED_OF_LIGHT_KMS / (2.0 * bandwidth_hz * (pr_n0).sqrt()); + + Self::white_noise(sigma) + } + /// Initializes a new Gauss Markov process for the provided kind of model. /// /// Available models are: `Range`, `Doppler`, `RangeHP`, `Doppler HP` (HP stands for high precision). @@ -206,6 +235,21 @@ impl GaussMarkov { } } +impl Mul for GaussMarkov { + type Output = Self; + + /// Scale the Gauss Markov process by a constant, maintaining the same time constant. + fn mul(self, rhs: f64) -> Self::Output { + Self { + tau: self.tau, + bias_sigma: self.bias_sigma * rhs, + steady_state_sigma: self.steady_state_sigma * rhs, + bias: None, + epoch: None, + } + } +} + #[cfg_attr(feature = "python", pymethods)] impl GaussMarkov { /// Simulate a Gauss Markov model and store the bias in a parquet file. @@ -293,6 +337,11 @@ impl GaussMarkov { Ok(()) } + /// Returns whether or not this Gauss Markov process is modeled as white noise. + pub fn is_white(&self) -> bool { + self.tau > 366.days() + } + #[cfg(feature = "python")] pub fn __repr__(&self) -> String { format!("{self:?}") @@ -347,6 +396,13 @@ impl GaussMarkov { fn load_named(_cls: &PyType, path: &str) -> Result, ConfigError> { ::load_named(path) } + + /// Create a new `GaussMarkov` process as if it were purely a white noise, i.c. without any time correlation. + #[cfg(feature = "python")] + #[classmethod] + fn white(_cls: &PyType, sigma: f64) -> Result { + Self::white_noise(sigma) + } } impl ConfigRepr for GaussMarkov {} @@ -415,6 +471,43 @@ fn zero_noise_test() { assert_eq!(min_max.max, 0.0); } +#[test] +fn white_noise_test() { + let sigma = 10.0; + let mut gm = GaussMarkov::white_noise(sigma); + let mut larger_gm = gm * 10.0; + + let epoch = Epoch::now().unwrap(); + + let mut rng = Pcg64Mcg::new(1000); + let mut cnt_above_3sigma = 0; + let mut cnt_below_3sigma = 0; + let mut larger_cnt_above_3sigma = 0; + let mut larger_cnt_below_3sigma = 0; + for seconds in 0..1000 { + let bias = gm.next_bias(epoch + seconds.seconds(), &mut rng); + + if bias > 3.0 * sigma { + cnt_above_3sigma += 1; + } else if bias < -3.0 * sigma { + cnt_below_3sigma += 1; + } + + let larger_bias = larger_gm.next_bias(epoch + seconds.seconds(), &mut rng); + if larger_bias > 30.0 * sigma { + larger_cnt_above_3sigma += 1; + } else if larger_bias < -30.0 * sigma { + larger_cnt_below_3sigma += 1; + } + } + + assert!(dbg!(cnt_above_3sigma) <= 3); + assert!(dbg!(cnt_below_3sigma) <= 3); + + assert!(dbg!(larger_cnt_above_3sigma) <= 3); + assert!(dbg!(larger_cnt_below_3sigma) <= 3); +} + #[test] fn serde_test() { use serde_yaml; diff --git a/tests/gm.rs b/tests/gm.rs deleted file mode 100644 index 7ab3b74b..00000000 --- a/tests/gm.rs +++ /dev/null @@ -1,156 +0,0 @@ -extern crate nyx_space as nyx; -extern crate rand; -extern crate rand_distr; - -use rand::thread_rng; -use rand_distr::{Distribution, Normal}; - -use nyx::dynamics::Dynamics; -use nyx::linalg::{Const, OMatrix, OVector}; -use nyx::time::Epoch; -use nyx::{NyxError, State}; - -use std::fmt; - -#[derive(Copy, Clone, Default, PartialEq)] -struct BiasDriftState { - epoch: Epoch, - bias: f64, - drift: f64, -} - -impl fmt::Display for BiasDriftState { - // Prints as Cartesian in floating point with units - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let decimals = f.precision().unwrap_or(6); - write!( - f, - "{},{},{}", - self.epoch.to_unix_seconds(), - format!("{:.*}", decimals, self.bias), - format!("{:.*}", decimals, self.drift), - ) - } -} - -impl fmt::LowerExp for BiasDriftState { - // Prints as Cartesian in scientific notation with units - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let decimals = f.precision().unwrap_or(6); - write!( - f, - "bias = {}\tdrift = {}", - format!("{:.*e}", decimals, self.bias), - format!("{:.*e}", decimals, self.drift), - ) - } -} - -impl State for BiasDriftState { - type Size = Const<2>; - type VecLength = Const<2>; - - fn zeros() -> Self { - Self { - epoch: Epoch::from_jde_et(0.0), - bias: 0.0, - drift: 0.0, - } - } - - fn as_vector(&self) -> Result, NyxError> { - Ok(OVector::>::new(self.bias, self.drift)) - } - - fn stm(&self) -> Result, NyxError> { - // NOTE: The STM is dependent on the model here, not on the state! - unimplemented!() - } - - fn reset_stm(&mut self) {} - - fn set( - &mut self, - epoch: Epoch, - vector: &OVector, - ) -> Result<(), NyxError> { - self.set_epoch(epoch); - self.bias = vector[0]; - self.drift = vector[1]; - println!("{}", self); - Ok(()) - } - - fn epoch(&self) -> Epoch { - self.epoch - } - - fn set_epoch(&mut self, epoch: Epoch) { - self.epoch = epoch; - } - - fn add(self, other: OVector) -> Self { - let mut me = self; - me.bias += other[0]; - me.drift += other[1]; - - me - } - - fn unset_stm(&mut self) {} -} - -#[derive(Clone)] -struct BiasDriftCoupledGM { - tau: f64, - omega: f64, - zeta: f64, -} - -impl Dynamics for BiasDriftCoupledGM { - type StateType = BiasDriftState; - type HyperdualSize = Const<0>; - - fn eom( - &self, - _delta_t: f64, - state_vec: &OVector::VecLength>, - _state_ctx: &Self::StateType, - ) -> Result::VecLength>, NyxError> { - let a_mat = OMatrix::, Const<2>>::new( - -1.0 / self.tau, - 1.0, - -self.omega.powi(2), - -2.0 * self.zeta * self.omega, - ); - - // let a_mat = OMatrix::, Const<2>>::new(0.0, 1.0, 0.0, 0.0); - - // Ignore the noises for now -- would need a mut thread_rng for reproducibility - let b_mat = OMatrix::, Const<2>>::identity(); - - let d = Normal::new(0.0, 0.9).unwrap(); - - let w_vec = - OVector::>::new(d.sample(&mut thread_rng()), d.sample(&mut thread_rng())); - - Ok(a_mat * state_vec + b_mat * w_vec) - } -} - -#[test] -fn gm_test() { - use nyx::propagators::Propagator; - use nyx::time::Unit; - let init = BiasDriftState::zeros(); - let model = BiasDriftCoupledGM { - tau: 900.0, - omega: 2.0, - zeta: 0.1, - }; - let fstate = Propagator::default_dp78(model) - .with(init) - .for_duration(60 * Unit::Second) - .unwrap(); - println!("Final state = {}", fstate); -} diff --git a/tests/monte_carlo/framework.rs b/tests/monte_carlo/framework.rs index c8527099..644c51a2 100644 --- a/tests/monte_carlo/framework.rs +++ b/tests/monte_carlo/framework.rs @@ -12,7 +12,7 @@ fn test_monte_carlo_epoch() { let cosm = Cosm::de438(); - // Build the innitial state + // Build the initial state let eme2k = cosm.frame("EME2000"); let dt = Epoch::from_gregorian_utc_at_midnight(2021, 1, 31); @@ -45,7 +45,7 @@ fn test_monte_carlo_epoch() { scenario: "test_monte_carlo_epoch".to_string(), }; - let rslts = my_mc.run_until_epoch(prop, dt + 1.0_f64 * Unit::Day, 100); + let rslts = my_mc.run_until_epoch(prop, dt + 1.0_f64 * Unit::Day, 10); let average_sma_dispersion = rslts .dispersion_values_of(StateParameter::SMA) diff --git a/tests/orbit_determination/robust.rs b/tests/orbit_determination/robust.rs index 3c017865..4da4f314 100644 --- a/tests/orbit_determination/robust.rs +++ b/tests/orbit_determination/robust.rs @@ -52,15 +52,16 @@ fn od_robust_test_ekf_realistic_one_way() { ); // Define the tracking configurations - let mut configs = HashMap::new(); - configs.insert( - dss65_madrid.name.clone(), - TrkConfig::from_sample_rate(60.seconds()), - ); - configs.insert( - dss34_canberra.name.clone(), - TrkConfig::from_sample_rate(60.seconds()), - ); + let configs = HashMap::from([ + ( + dss65_madrid.name.clone(), + TrkConfig::from_sample_rate(60.seconds()), + ), + ( + dss34_canberra.name.clone(), + TrkConfig::from_sample_rate(60.seconds()), + ), + ]); // Note that we do not have Goldstone so we can test enabling and disabling the EKF. let all_stations = vec![dss65_madrid, dss34_canberra]; @@ -329,25 +330,26 @@ fn od_robust_test_ekf_realistic_two_way() { dss34_canberra.integration_time = Some(60.seconds()); // Define the tracking configurations - let mut configs = HashMap::new(); - configs.insert( - dss65_madrid.name.clone(), - TrkConfig { - // Make sure to start the tracking one integration time after the start of the trajectory - start: simulator::Availability::Epoch(dt + 60.seconds()), - sampling: 60.seconds(), - ..Default::default() - }, - ); - configs.insert( - dss34_canberra.name.clone(), - TrkConfig { - // Make sure to start the tracking one integration time after the start of the trajectory - start: simulator::Availability::Epoch(dt + 60.seconds()), - sampling: 60.seconds(), - ..Default::default() - }, - ); + let configs = HashMap::from([ + ( + dss65_madrid.name.clone(), + TrkConfig { + // Make sure to start the tracking one integration time after the start of the trajectory + start: simulator::Availability::Epoch(dt + 60.seconds()), + sampling: 60.seconds(), + ..Default::default() + }, + ), + ( + dss34_canberra.name.clone(), + TrkConfig { + // Make sure to start the tracking one integration time after the start of the trajectory + start: simulator::Availability::Epoch(dt + 60.seconds()), + sampling: 60.seconds(), + ..Default::default() + }, + ), + ]); // Note that we do not have Goldstone so we can test enabling and disabling the EKF. let devices = vec![dss65_madrid, dss34_canberra]; diff --git a/tests/spiceypy/Pipfile b/tests/spiceypy/Pipfile deleted file mode 100644 index 58344618..00000000 --- a/tests/spiceypy/Pipfile +++ /dev/null @@ -1,16 +0,0 @@ -[[source]] -name = "pypi" -url = "https://pypi.org/simple" -verify_ssl = true - -[dev-packages] - -[packages] -astropy = "*" -numpy = "*" -pandas = "*" -matplotlib = "*" -spiceypy = "*" - -[requires] -python_version = "3.6" diff --git a/tests/spiceypy/Pipfile.lock b/tests/spiceypy/Pipfile.lock deleted file mode 100644 index 950da465..00000000 --- a/tests/spiceypy/Pipfile.lock +++ /dev/null @@ -1,287 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "1519524573ff30d393b967605c193257219a089c6a968094f3eeafe942ba944d" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.6" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "astropy": { - "hashes": [ - "sha256:1b3d6e801ab719d448e179dffe23a2f3c5646b81090db9f4d95a6b3acd643888", - "sha256:21c293609741bb7e3fe43e0c9f906f41962b04bb8c799a221fc1aa2100353fad", - "sha256:2c194f8a429b8399de64a413a06881ea49f0525cabaa2d78fc132b9e970adc6a", - "sha256:2fea9cf1fb1ef4e68e5c93c679a26dcc6313be55783fa1ee162eb72c8c9eb0b4", - "sha256:3638fd0c489fe4321d72056086acbdd48f767b19af8f6c39b865966c638e0efa", - "sha256:4f33707d1bafd11884fc4aacc38f76f4c5c6f8d6f15dd968aad50bc197bc6edb", - "sha256:6767b8dd29be6c7ec5d934b955875b71400464b2a33eb58b59d575302e4a1892", - "sha256:882434f6fe29a2aba9fe61bddac13943c95a9d6e8fdb19f3e35a9f9ae039bd10", - "sha256:949b6111badc371129d811b74d7fe6df711719e41385b37189af0a4d325b811d", - "sha256:a6890ec88220e2cbeaa1f70f012b19b4ffe908b19e3c264847ca87b710d5918f", - "sha256:ae3d690b6c20ce47d0644129046c08b7715cbafd2e7a49aba8d7c169dcfadbc1", - "sha256:c9d65d0071215995e1e637bc74e84afcf37fc5492e54451015981f2cb6ca9e60", - "sha256:daaf9f0264b686c870032987483f2ddbdd5ce31762ab53f53f84bf9c68e2720a", - "sha256:ddaa04ba229b69c7a16efdd16dac77fcf8eb8923272cdc290b033992fe679323", - "sha256:e749b2ecfedceac0e316a5332eaf73c833d2f5e1c3b9524a4780105dc802f27b", - "sha256:e80117502290e97819e2328243221d89f3749c14526f3ad7c75613a07b56ae8e" - ], - "index": "pypi", - "version": "==4.2" - }, - "cycler": { - "hashes": [ - "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d", - "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8" - ], - "version": "==0.10.0" - }, - "kiwisolver": { - "hashes": [ - "sha256:0cd53f403202159b44528498de18f9285b04482bab2a6fc3f5dd8dbb9352e30d", - "sha256:1e1bc12fb773a7b2ffdeb8380609f4f8064777877b2225dec3da711b421fda31", - "sha256:225e2e18f271e0ed8157d7f4518ffbf99b9450fca398d561eb5c4a87d0986dd9", - "sha256:232c9e11fd7ac3a470d65cd67e4359eee155ec57e822e5220322d7b2ac84fbf0", - "sha256:31dfd2ac56edc0ff9ac295193eeaea1c0c923c0355bf948fbd99ed6018010b72", - "sha256:33449715e0101e4d34f64990352bce4095c8bf13bed1b390773fc0a7295967b3", - "sha256:401a2e9afa8588589775fe34fc22d918ae839aaaf0c0e96441c0fdbce6d8ebe6", - "sha256:44a62e24d9b01ba94ae7a4a6c3fb215dc4af1dde817e7498d901e229aaf50e4e", - "sha256:50af681a36b2a1dee1d3c169ade9fdc59207d3c31e522519181e12f1b3ba7000", - "sha256:563c649cfdef27d081c84e72a03b48ea9408c16657500c312575ae9d9f7bc1c3", - "sha256:5989db3b3b34b76c09253deeaf7fbc2707616f130e166996606c284395da3f18", - "sha256:5a7a7dbff17e66fac9142ae2ecafb719393aaee6a3768c9de2fd425c63b53e21", - "sha256:5c3e6455341008a054cccee8c5d24481bcfe1acdbc9add30aa95798e95c65621", - "sha256:5f6ccd3dd0b9739edcf407514016108e2280769c73a85b9e59aa390046dbf08b", - "sha256:72c99e39d005b793fb7d3d4e660aed6b6281b502e8c1eaf8ee8346023c8e03bc", - "sha256:78751b33595f7f9511952e7e60ce858c6d64db2e062afb325985ddbd34b5c131", - "sha256:834ee27348c4aefc20b479335fd422a2c69db55f7d9ab61721ac8cd83eb78882", - "sha256:8be8d84b7d4f2ba4ffff3665bcd0211318aa632395a1a41553250484a871d454", - "sha256:950a199911a8d94683a6b10321f9345d5a3a8433ec58b217ace979e18f16e248", - "sha256:a357fd4f15ee49b4a98b44ec23a34a95f1e00292a139d6015c11f55774ef10de", - "sha256:a53d27d0c2a0ebd07e395e56a1fbdf75ffedc4a05943daf472af163413ce9598", - "sha256:acef3d59d47dd85ecf909c359d0fd2c81ed33bdff70216d3956b463e12c38a54", - "sha256:b38694dcdac990a743aa654037ff1188c7a9801ac3ccc548d3341014bc5ca278", - "sha256:b9edd0110a77fc321ab090aaa1cfcaba1d8499850a12848b81be2222eab648f6", - "sha256:c08e95114951dc2090c4a630c2385bef681cacf12636fb0241accdc6b303fd81", - "sha256:c5518d51a0735b1e6cee1fdce66359f8d2b59c3ca85dc2b0813a8aa86818a030", - "sha256:c8fd0f1ae9d92b42854b2979024d7597685ce4ada367172ed7c09edf2cef9cb8", - "sha256:ca3820eb7f7faf7f0aa88de0e54681bddcb46e485beb844fcecbcd1c8bd01689", - "sha256:cf8b574c7b9aa060c62116d4181f3a1a4e821b2ec5cbfe3775809474113748d4", - "sha256:d3155d828dec1d43283bd24d3d3e0d9c7c350cdfcc0bd06c0ad1209c1bbc36d0", - "sha256:f8d6f8db88049a699817fd9178782867bf22283e3813064302ac59f61d95be05", - "sha256:fd34fbbfbc40628200730bc1febe30631347103fc8d3d4fa012c21ab9c11eca9" - ], - "markers": "python_version >= '3.6'", - "version": "==1.3.1" - }, - "matplotlib": { - "hashes": [ - "sha256:1de0bb6cbfe460725f0e97b88daa8643bcf9571c18ba90bb8e41432aaeca91d6", - "sha256:1e850163579a8936eede29fad41e202b25923a0a8d5ffd08ce50fc0a97dcdc93", - "sha256:215e2a30a2090221a9481db58b770ce56b8ef46f13224ae33afe221b14b24dc1", - "sha256:348e6032f666ffd151b323342f9278b16b95d4a75dfacae84a11d2829a7816ae", - "sha256:3d2eb9c1cc254d0ffa90bc96fde4b6005d09c2228f99dfd493a4219c1af99644", - "sha256:3e477db76c22929e4c6876c44f88d790aacdf3c3f8f3a90cb1975c0bf37825b0", - "sha256:451cc89cb33d6652c509fc6b588dc51c41d7246afdcc29b8624e256b7663ed1f", - "sha256:46b1a60a04e6d884f0250d5cc8dc7bd21a9a96c584a7acdaab44698a44710bab", - "sha256:5f571b92a536206f7958f7cb2d367ff6c9a1fa8229dc35020006e4cdd1ca0acd", - "sha256:672960dd114e342b7c610bf32fb99d14227f29919894388b41553217457ba7ef", - "sha256:7310e353a4a35477c7f032409966920197d7df3e757c7624fd842f3eeb307d3d", - "sha256:746a1df55749629e26af7f977ea426817ca9370ad1569436608dc48d1069b87c", - "sha256:7c155437ae4fd366e2700e2716564d1787700687443de46bcb895fe0f84b761d", - "sha256:9265ae0fb35e29f9b8cc86c2ab0a2e3dcddc4dd9de4b85bf26c0f63fe5c1c2ca", - "sha256:94bdd1d55c20e764d8aea9d471d2ae7a7b2c84445e0fa463f02e20f9730783e1", - "sha256:9a79e5dd7bb797aa611048f5b70588b23c5be05b63eefd8a0d152ac77c4243db", - "sha256:a17f0a10604fac7627ec82820439e7db611722e80c408a726cd00d8c974c2fb3", - "sha256:a1acb72f095f1d58ecc2538ed1b8bca0b57df313b13db36ed34b8cdf1868e674", - "sha256:aa49571d8030ad0b9ac39708ee77bd2a22f87815e12bdee52ecaffece9313ed8", - "sha256:c24c05f645aef776e8b8931cb81e0f1632d229b42b6d216e30836e2e145a2b40", - "sha256:cf3a7e54eff792f0815dbbe9b85df2f13d739289c93d346925554f71d484be78", - "sha256:d738acfdfb65da34c91acbdb56abed46803db39af259b7f194dc96920360dbe4", - "sha256:e15fa23d844d54e7b3b7243afd53b7567ee71c721f592deb0727ee85e668f96a", - "sha256:ed4a9e6dcacba56b17a0a9ac22ae2c72a35b7f0ef0693aa68574f0b2df607a89", - "sha256:f44149a0ef5b4991aaef12a93b8e8d66d6412e762745fea1faa61d98524e0ba9" - ], - "index": "pypi", - "version": "==3.3.4" - }, - "numpy": { - "hashes": [ - "sha256:032be656d89bbf786d743fee11d01ef318b0781281241997558fa7950028dd29", - "sha256:104f5e90b143dbf298361a99ac1af4cf59131218a045ebf4ee5990b83cff5fab", - "sha256:125a0e10ddd99a874fd357bfa1b636cd58deb78ba4a30b5ddb09f645c3512e04", - "sha256:12e4ba5c6420917571f1a5becc9338abbde71dd811ce40b37ba62dec7b39af6d", - "sha256:13adf545732bb23a796914fe5f891a12bd74cf3d2986eed7b7eba2941eea1590", - "sha256:2d7e27442599104ee08f4faed56bb87c55f8b10a5494ac2ead5c98a4b289e61f", - "sha256:3bc63486a870294683980d76ec1e3efc786295ae00128f9ea38e2c6e74d5a60a", - "sha256:3d3087e24e354c18fb35c454026af3ed8997cfd4997765266897c68d724e4845", - "sha256:4ed8e96dc146e12c1c5cdd6fb9fd0757f2ba66048bf94c5126b7efebd12d0090", - "sha256:60759ab15c94dd0e1ed88241fd4fa3312db4e91d2c8f5a2d4cf3863fad83d65b", - "sha256:65410c7f4398a0047eea5cca9b74009ea61178efd78d1be9847fac1d6716ec1e", - "sha256:66b467adfcf628f66ea4ac6430ded0614f5cc06ba530d09571ea404789064adc", - "sha256:7199109fa46277be503393be9250b983f325880766f847885607d9b13848f257", - "sha256:72251e43ac426ff98ea802a931922c79b8d7596480300eb9f1b1e45e0543571e", - "sha256:89e5336f2bec0c726ac7e7cdae181b325a9c0ee24e604704ed830d241c5e47ff", - "sha256:89f937b13b8dd17b0099c7c2e22066883c86ca1575a975f754babc8fbf8d69a9", - "sha256:9c94cab5054bad82a70b2e77741271790304651d584e2cdfe2041488e753863b", - "sha256:9eb551d122fadca7774b97db8a112b77231dcccda8e91a5bc99e79890797175e", - "sha256:a1d7995d1023335e67fb070b2fae6f5968f5be3802b15ad6d79d81ecaa014fe0", - "sha256:ae61f02b84a0211abb56462a3b6cd1e7ec39d466d3160eb4e1da8bf6717cdbeb", - "sha256:b9410c0b6fed4a22554f072a86c361e417f0258838957b78bd063bde2c7f841f", - "sha256:c26287dfc888cf1e65181f39ea75e11f42ffc4f4529e5bd19add57ad458996e2", - "sha256:c91ec9569facd4757ade0888371eced2ecf49e7982ce5634cc2cf4e7331a4b14", - "sha256:ecb5b74c702358cdc21268ff4c37f7466357871f53a30e6f84c686952bef16a9" - ], - "index": "pypi", - "version": "==1.20.1" - }, - "pandas": { - "hashes": [ - "sha256:09761bf5f8c741d47d4b8b9073288de1be39bbfccc281d70b889ade12b2aad29", - "sha256:0f27fd1adfa256388dc34895ca5437eaf254832223812afd817a6f73127f969c", - "sha256:43e00770552595c2250d8d712ec8b6e08ca73089ac823122344f023efa4abea3", - "sha256:46fc671c542a8392a4f4c13edc8527e3a10f6cb62912d856f82248feb747f06e", - "sha256:475b7772b6e18a93a43ea83517932deff33954a10d4fbae18d0c1aba4182310f", - "sha256:4d821b9b911fc1b7d428978d04ace33f0af32bb7549525c8a7b08444bce46b74", - "sha256:5e3c8c60541396110586bcbe6eccdc335a38e7de8c217060edaf4722260b158f", - "sha256:621c044a1b5e535cf7dcb3ab39fca6f867095c3ef223a524f18f60c7fee028ea", - "sha256:72ffcea00ae8ffcdbdefff800284311e155fbb5ed6758f1a6110fc1f8f8f0c1c", - "sha256:8a051e957c5206f722e83f295f95a2cf053e890f9a1fba0065780a8c2d045f5d", - "sha256:97b1954533b2a74c7e20d1342c4f01311d3203b48f2ebf651891e6a6eaf01104", - "sha256:9f5829e64507ad10e2561b60baf285c470f3c4454b007c860e77849b88865ae7", - "sha256:a93e34f10f67d81de706ce00bf8bb3798403cabce4ccb2de10c61b5ae8786ab5", - "sha256:d59842a5aa89ca03c2099312163ffdd06f56486050e641a45d926a072f04d994", - "sha256:dbb255975eb94143f2e6ec7dadda671d25147939047839cd6b8a4aff0379bb9b", - "sha256:df6f10b85aef7a5bb25259ad651ad1cc1d6bb09000595cab47e718cbac250b1d" - ], - "index": "pypi", - "version": "==1.2.3" - }, - "pillow": { - "hashes": [ - "sha256:15306d71a1e96d7e271fd2a0737038b5a92ca2978d2e38b6ced7966583e3d5af", - "sha256:1940fc4d361f9cc7e558d6f56ff38d7351b53052fd7911f4b60cd7bc091ea3b1", - "sha256:1f93f2fe211f1ef75e6f589327f4d4f8545d5c8e826231b042b483d8383e8a7c", - "sha256:30d33a1a6400132e6f521640dd3f64578ac9bfb79a619416d7e8802b4ce1dd55", - "sha256:328240f7dddf77783e72d5ed79899a6b48bc6681f8d1f6001f55933cb4905060", - "sha256:46c2bcf8e1e75d154e78417b3e3c64e96def738c2a25435e74909e127a8cba5e", - "sha256:5762ebb4436f46b566fc6351d67a9b5386b5e5de4e58fdaa18a1c83e0e20f1a8", - "sha256:5a2d957eb4aba9d48170b8fe6538ec1fbc2119ffe6373782c03d8acad3323f2e", - "sha256:5cf03b9534aca63b192856aa601c68d0764810857786ea5da652581f3a44c2b0", - "sha256:5daba2b40782c1c5157a788ec4454067c6616f5a0c1b70e26ac326a880c2d328", - "sha256:63cd413ac52ee3f67057223d363f4f82ce966e64906aea046daf46695e3c8238", - "sha256:6efac40344d8f668b6c4533ae02a48d52fd852ef0654cc6f19f6ac146399c733", - "sha256:71b01ee69e7df527439d7752a2ce8fb89e19a32df484a308eca3e81f673d3a03", - "sha256:71f31ee4df3d5e0b366dd362007740106d3210fb6a56ec4b581a5324ba254f06", - "sha256:72027ebf682abc9bafd93b43edc44279f641e8996fb2945104471419113cfc71", - "sha256:74cd9aa648ed6dd25e572453eb09b08817a1e3d9f8d1bd4d8403d99e42ea790b", - "sha256:81b3716cc9744ffdf76b39afb6247eae754186838cedad0b0ac63b2571253fe6", - "sha256:8565355a29655b28fdc2c666fd9a3890fe5edc6639d128814fafecfae2d70910", - "sha256:87f42c976f91ca2fc21a3293e25bd3cd895918597db1b95b93cbd949f7d019ce", - "sha256:89e4c757a91b8c55d97c91fa09c69b3677c227b942fa749e9a66eef602f59c28", - "sha256:8c4e32218c764bc27fe49b7328195579581aa419920edcc321c4cb877c65258d", - "sha256:903293320efe2466c1ab3509a33d6b866dc850cfd0c5d9cc92632014cec185fb", - "sha256:90882c6f084ef68b71bba190209a734bf90abb82ab5e8f64444c71d5974008c6", - "sha256:98afcac3205d31ab6a10c5006b0cf040d0026a68ec051edd3517b776c1d78b09", - "sha256:a01da2c266d9868c4f91a9c6faf47a251f23b9a862dce81d2ff583135206f5be", - "sha256:aeab4cd016e11e7aa5cfc49dcff8e51561fa64818a0be86efa82c7038e9369d0", - "sha256:b07c660e014852d98a00a91adfbe25033898a9d90a8f39beb2437d22a203fc44", - "sha256:bead24c0ae3f1f6afcb915a057943ccf65fc755d11a1410a909c1fefb6c06ad1", - "sha256:d1d6bca39bb6dd94fba23cdb3eeaea5e30c7717c5343004d900e2a63b132c341", - "sha256:e2cd8ac157c1e5ae88b6dd790648ee5d2777e76f1e5c7d184eaddb2938594f34", - "sha256:e5739ae63636a52b706a0facec77b2b58e485637e1638202556156e424a02dc2", - "sha256:f36c3ff63d6fc509ce599a2f5b0d0732189eed653420e7294c039d342c6e204a", - "sha256:f91b50ad88048d795c0ad004abbe1390aa1882073b1dca10bfd55d0b8cf18ec5" - ], - "markers": "python_version >= '3.6'", - "version": "==8.1.2" - }, - "pyerfa": { - "hashes": [ - "sha256:1067401b4c1e3bd389f5c988a4e53a7aa8d21062d4cae480417f8b63cd17b8d5", - "sha256:152cea1d8feccc098ba762e47a097da0190a46452845f29de5d4494ee5461a0a", - "sha256:252163a61c33a9d2f1290a9b41f47a80cfe19414af866371f952e67aa8489cf5", - "sha256:2ffb92d6dd0b951de93e74967675c0acc8eb9f8df75b66492bbe57b83bfed10e", - "sha256:31776213ec36e6bb5382b526be02e417b8697d791c6837199342c19e7dabe8e8", - "sha256:317fb9ce3e486b51470854e6656cfdf0cd380173b4ac9965f0e16a52b7452d3e", - "sha256:32326d2cb8333585c6d9aa804d1f673d98c449f864a377dbc1d246b207bf860c", - "sha256:35a7a63d995395d52eebcdb472e3ac1987164c95dd4acc3c3815a0e9cab2353d", - "sha256:6906b95a752c33da9d717c60bdcfc0004548e6b3f4d2d751aa8ee262aa6b7c78", - "sha256:6bb62da1b1ab7a80059340d72dd22cacbff437150feb824d91462e259bae8b58", - "sha256:75a39f680efcdb7ea2fc21731723d91c0c134403cf57954f1200a9a4272a6524", - "sha256:8609be0e659c99fde396b723bbbae9d5074deb0afeba5736c42591877ec01115", - "sha256:94c405c00de83bea864e3d01d39b4b4b8bb4ccc85e8306f4ded0fdc960f2d9f3", - "sha256:9a1a1ec5977f246613adcb6b302a768fd05c03f330502dde2c422fb5e36685c3", - "sha256:9cb49956dc3859f42229869dc011b38550d34a9922666f540ef474c3f90930eb", - "sha256:9e5441baa3100bd04691a935d11c5090dc811313002a7a117cc239d9e6c1f6f2", - "sha256:a0742218178e01669ca56e67b6877115a0773fa1960edefbe24813fe197a8e08", - "sha256:a4282afa9991deba2b26d97aca3c06450c74cf30e5a6b0a38118fc6f8b3f3e58", - "sha256:b44306c4f8126e05fff84e993e41f717b7490796e27a8ed2af66fd08d3d448e4", - "sha256:ba8765e4dc7bf36fd4851d7217ad1417f57ec88670a5857b3e32ae1aa8d0eb0f", - "sha256:bd2186f2e162e1ed2bbbb4358a87e9421dd587000a6c664dc8fbec8f25464e19", - "sha256:ce28d076aad6cc173a5f7cdaaa023c0f893d6e3bdae4d47ce26d787df4603a17", - "sha256:d120b34e9fc055108f636cce8e9dd0b23294b7266c61587bbaee15a2d3e3b956", - "sha256:d32835fc2ddf67de6c2d0f07274cdbff9fb74ee6992b8046d91a6cbba5a999c2", - "sha256:e2357dc8582493ad0537ed39be5a493457992c043ec788829dc41d4b3d2f3349", - "sha256:e75a7a5799e4ad187b77f2afd5ca39116ba00f0df109012f5ac7ad4279165495", - "sha256:e7dd0dfb1483302315c37b9bd0e0f05a1c5a7c96982fb111547272b030a8b0a9", - "sha256:f0f440d352e7a16c8ca96c9eb28cc70f8f280b93a7834ff4bca92dfc41ae3427", - "sha256:f6a4fc532b9023ebeb0ecf05ba92cc340fe0dd578ca8a57644c359ae49a7a32e" - ], - "markers": "python_version >= '3.6'", - "version": "==1.7.2" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" - }, - "python-dateutil": { - "hashes": [ - "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", - "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.1" - }, - "pytz": { - "hashes": [ - "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da", - "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798" - ], - "version": "==2021.1" - }, - "six": { - "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.15.0" - }, - "spiceypy": { - "hashes": [ - "sha256:002857872d906300dede32a710a6e6a37dc821a086a530b3f19bcb45f1415b35", - "sha256:176b21c60f80e27c38c05fb9c40ae95140d9a02be2abba2affe72bd18a425b0f", - "sha256:7af683e8adb70dc1d57acf6f1432718f67a50713a006c36f38c7b5022f8d8f70", - "sha256:cfdc5e39005baf62a9f2b9153be0845850b8743d81487c87178a26857fe6528a", - "sha256:ebc6e4451ef49c06b9c7459644fad74f7b3dec1ea5d59b040f4307424909a831" - ], - "index": "pypi", - "version": "==4.0.0" - } - }, - "develop": {} -} diff --git a/tests/spiceypy/naif0012.tls b/tests/spiceypy/naif0012.tls deleted file mode 100644 index b3311c03..00000000 --- a/tests/spiceypy/naif0012.tls +++ /dev/null @@ -1,191 +0,0 @@ -KPL/LSK - -\beginlabel -PDS_VERSION_ID = PDS3 -RECORD_TYPE = STREAM -RECORD_BYTES = "N/A" -^SPICE_KERNEL = "naif0012.tls" -MISSION_NAME = "LUNAR RECONNAISSANCE ORBITER" -SPACECRAFT_NAME = "LUNAR RECONNAISSANCE ORBITER" -DATA_SET_ID = "LRO-L-SPICE-6-V1.0" -KERNEL_TYPE_ID = LSK -PRODUCT_ID = "naif0012.tls" -PRODUCT_CREATION_TIME = 2016-08-22T21:50:31 -PRODUCER_ID = "NAIF/JPL" -MISSION_PHASE_NAME = { - LAUNCH, - CRUISE, - "LUNAR ORBIT ACQUISITION", - COMMISSIONING, - "NOMINAL MISSION", - "SCIENCE MISSION", - "EXTENDED MISSION" - } -PRODUCT_VERSION_TYPE = ACTUAL -PLATFORM_OR_MOUNTING_NAME = "N/A" -START_TIME = "N/A" -STOP_TIME = "N/A" -SPACECRAFT_CLOCK_START_COUNT = "N/A" -SPACECRAFT_CLOCK_STOP_COUNT = "N/A" -TARGET_NAME = MOON -INSTRUMENT_NAME = "N/A" -NAIF_INSTRUMENT_ID = "N/A" -SOURCE_PRODUCT_ID = "N/A" -NOTE = "See comments in the file for details" -OBJECT = SPICE_KERNEL - INTERCHANGE_FORMAT = ASCII - KERNEL_TYPE = LEAPSECONDS - DESCRIPTION = "Generic SPICE Leapseconds Kernel File. " -END_OBJECT = SPICE_KERNEL -\endlabel - - -LEAPSECONDS KERNEL FILE -=========================================================================== - -Modifications: --------------- - -2016, Jul. 14 NJB Modified file to account for the leapsecond that - will occur on December 31, 2016. - -2015, Jan. 5 NJB Modified file to account for the leapsecond that - will occur on June 30, 2015. - -2012, Jan. 5 NJB Modified file to account for the leapsecond that - will occur on June 30, 2012. - -2008, Jul. 7 NJB Modified file to account for the leapsecond that - will occur on December 31, 2008. - -2005, Aug. 3 NJB Modified file to account for the leapsecond that - will occur on December 31, 2005. - -1998, Jul 17 WLT Modified file to account for the leapsecond that - will occur on December 31, 1998. - -1997, Feb 22 WLT Modified file to account for the leapsecond that - will occur on June 30, 1997. - -1995, Dec 14 KSZ Corrected date of last leapsecond from 1-1-95 - to 1-1-96. - -1995, Oct 25 WLT Modified file to account for the leapsecond that - will occur on Dec 31, 1995. - -1994, Jun 16 WLT Modified file to account for the leapsecond on - June 30, 1994. - -1993, Feb. 22 CHA Modified file to account for the leapsecond on - June 30, 1993. - -1992, Mar. 6 HAN Modified file to account for the leapsecond on - June 30, 1992. - -1990, Oct. 8 HAN Modified file to account for the leapsecond on - Dec. 31, 1990. - - -Explanation: ------------- - -The contents of this file are used by the routine DELTET to compute the -time difference - -[1] DELTA_ET = ET - UTC - -the increment to be applied to UTC to give ET. - -The difference between UTC and TAI, - -[2] DELTA_AT = TAI - UTC - -is always an integral number of seconds. The value of DELTA_AT was 10 -seconds in January 1972, and increases by one each time a leap second -is declared. Combining [1] and [2] gives - -[3] DELTA_ET = ET - (TAI - DELTA_AT) - - = (ET - TAI) + DELTA_AT - -The difference (ET - TAI) is periodic, and is given by - -[4] ET - TAI = DELTA_T_A + K sin E - -where DELTA_T_A and K are constant, and E is the eccentric anomaly of the -heliocentric orbit of the Earth-Moon barycenter. Equation [4], which ignores -small-period fluctuations, is accurate to about 0.000030 seconds. - -The eccentric anomaly E is given by - -[5] E = M + EB sin M - -where M is the mean anomaly, which in turn is given by - -[6] M = M + M t - 0 1 - -where t is the number of ephemeris seconds past J2000. - -Thus, in order to compute DELTA_ET, the following items are necessary. - - DELTA_TA - K - EB - M0 - M1 - DELTA_AT after each leap second. - -The numbers, and the formulation, are taken from the following sources. - - 1) Moyer, T.D., Transformation from Proper Time on Earth to - Coordinate Time in Solar System Barycentric Space-Time Frame - of Reference, Parts 1 and 2, Celestial Mechanics 23 (1981), - 33-56 and 57-68. - - 2) Moyer, T.D., Effects of Conversion to the J2000 Astronomical - Reference System on Algorithms for Computing Time Differences - and Clock Rates, JPL IOM 314.5--942, 1 October 1985. - -The variable names used above are consistent with those used in the -Astronomical Almanac. - -\begindata - -DELTET/DELTA_T_A = 32.184 -DELTET/K = 1.657D-3 -DELTET/EB = 1.671D-2 -DELTET/M = ( 6.239996D0 1.99096871D-7 ) - -DELTET/DELTA_AT = ( 10, @1972-JAN-1 - 11, @1972-JUL-1 - 12, @1973-JAN-1 - 13, @1974-JAN-1 - 14, @1975-JAN-1 - 15, @1976-JAN-1 - 16, @1977-JAN-1 - 17, @1978-JAN-1 - 18, @1979-JAN-1 - 19, @1980-JAN-1 - 20, @1981-JUL-1 - 21, @1982-JUL-1 - 22, @1983-JUL-1 - 23, @1985-JUL-1 - 24, @1988-JAN-1 - 25, @1990-JAN-1 - 26, @1991-JAN-1 - 27, @1992-JUL-1 - 28, @1993-JUL-1 - 29, @1994-JUL-1 - 30, @1996-JAN-1 - 31, @1997-JUL-1 - 32, @1999-JAN-1 - 33, @2006-JAN-1 - 34, @2009-JAN-1 - 35, @2012-JUL-1 - 36, @2015-JUL-1 - 37, @2017-JAN-1 ) - -\begintext - - diff --git a/tests/spiceypy/pck00008.tpc b/tests/spiceypy/pck00008.tpc deleted file mode 100644 index 5bab4d06..00000000 --- a/tests/spiceypy/pck00008.tpc +++ /dev/null @@ -1,3381 +0,0 @@ -KPL/PCK -P_constants (PcK) SPICE kernel file -=========================================================================== - - By: Nat Bachman (NAIF) 2004 September 21 - - -File Organization --------------------------------------------------------- - - The contents of this file are as follows. - - Introductory Information: - - -- File Organization - - -- Version description - - -- Disclaimer - - -- Sources - - -- Explanation - - -- Body numbers and names - - - PcK Data: - - - Orientation Data - ---------------- - - -- Orientation constants for the Sun and planets. - Additional items included in this section: - - - Earth north geomagnetic centered dipole values - for epochs 1945-2000 - - - Mars prime meridian offset "lambda_a" - - -- Orientation constants for satellites - - -- Orientation constants for asteroids Gaspra, Ida, - Vesta, and Eros - - - Radii of Bodies - --------------- - - -- Radii of Sun and planets - - -- Radii of satellites, where available - - -- Radii of asteroids Gaspra, Ida, Kleopatra, and Eros - - - -Version description --------------------------------------------------------- - - This file was created on September 21, 2004. This version - incorporates data from reference [2]: "Report of the IAU/IAG - Working Group on Cartographic Coordinates and Rotational Elements - of the Planets and Satellites: 2000." Note that the 2003 - version of this report is as yet unpublished. - - This file contains size, shape, and orientation data for all - objects described by the previous version of the file, plus data - for the asteroids Vesta, Kleopatra, and Eros. - - -Disclaimer --------------------------------------------------------- - - -Applicability of Data - - This constants file may not contain the parameter values that - you prefer. Note that this file may be readily modified by - you or anyone else. NAIF suggests that you inspect this file - visually before proceeding with any critical or extended - data processing. - -File Modifications by Users - - NAIF requests that you update the "by line" and date if you - modify this file. - -Known Limitations and Caveats - - In general, the orientation models given here are claimed by the - IAU/IAG Working Group Report [2] to be accurate to 0.1 degree - ([2], p.85). However, NAIF notes that orientation models for - natural satellites and asteroids have in some cases changed - substantially with the availability of new observational data, so - users are urged to investigate the suitability for their - applications of the models presented here. - - - NAIF strongly cautions against using the earth rotation model - (from [2]) given here for work demanding high accuracy. This - model has been determined by NAIF to have an error in the prime - meridian location of magnitude at least 150 arcseconds, with a - local minimum occurring during the year 1999. Regarding - availability of better earth orientation data for use with the - SPICE system: - - Earth orientation data are available from NAIF in the form of - binary earth PCK files. NAIF employs an automated process to - create these files; each time JPL's section 335 produces a new - earth orientation parameter (EOP) file, a new PCK is produced. - These PCKs cover a 12-month time span starting about nine - months prior to the current date. In these PCK files, the - following effects are accounted for in modeling the earth's - rotation: - - - - Precession: 1976 IAU model - - - Nutation: 1980 IAU model, plus interpolated - EOP nutation corrections - - - Polar motion: interpolated from EOP file - - - True sidereal time: - - + UT1 - UT1R (if needed): given by analytic formula - + TAI - UT1 (or UT1R): interpolated from EOP file - + UT1 - GMST: given by analytic formula - + equation of equinoxes: given by analytic formula - - where - - TAI = International Atomic Time - UT1 = Greenwich hour angle of computed mean sun - 12h - UT1R = Regularized UT1 - GMST = Greenwich mean sidereal time - - These kernels are available via anonymous ftp from the server - - naif.jpl.nasa.gov - - The kernels are in the path - - pub/naif/generic_kernels/pck - - At this time, these kernels have file names of the form - - earth_000101_yymmdd_yymmdd.bpc - - The second and third dates are, respectively, the file's - coverage end time and the epoch of the last datum. - - These binary PCK files are very accurate (error < 0.1 - microradian) for epochs preceding the epoch of the last datum. - For later epochs, the error rises to several microradians. - - Binary PCK files giving accurate earth orientation back to 1972 - and *low accuracy* predicted earth orientation to 2023 are also - available in the same location. - - How does the rotation model used in the long term predict - binary earth PCK compare to that used in this file? Because of - the unpredictability of the earth's orientation, in particular - of its spin, it's not possible to answer with certainty. - However, we can make these observations: - - - The long term predict binary PCK presumably does a better - job of predicting the orientation of the earth's equator - since the binary PCK accounts for nutation and the model - from [2] does not. - - - The prime meridian error in the model from [2] amounts - to, at a minimum, about 10 seconds of rotation. It should - take years for the spin error of the binary long term - predict PCK to grow as large. - - Characteristics and names of the binary kernels described here - are subject to change. Contact NAIF for details concerning - binary earth PCKs. - - - The SPICE Toolkit doesn't currently contain software to model the - earth's north geomagnetic centered dipole as a function of time. - As a convenience for users, the north dipole location from the - J2000 epoch was selected as a representative datum, and the - planetocentric longitude and latitude of this location have been - associated with the keywords - - BODY399_N_GEOMAG_CTR_DIPOLE_LON - BODY399_N_GEOMAG_CTR_DIPOLE_LAT - - Values for the earth's north geomagnetic centered dipole are - presented in comments as a discrete time series for the time range - 1945-2000. For details concerning the the geomagnetic field model - from which these values were derived, including a discussion of - the model's accuracy, see [13]. - - - The Mars prime meridian offset given by [10] is not used by - SPICE geometry software for computations involving the shape - of Mars (for example, in sub-observer point or surface intercept - computations). The value is provided for informational - purposes only. - - - SPICE Toolkits prior to version N0057 cannot make use of - trigonometric polynomial terms in the formulas for orientation of - the planets. The only planet for which such terms are used is - Neptune. Use of trigonometric polynomial terms for natural - satellites is and has been supported for all SPICE Toolkit - versions. - - - - - -Sources --------------------------------------------------------- - - The sources for the constants listed in this file are: - - [1] Seidelmann, P.K., Archinal, B.A., A'Hearn, M.F., - Cruikshank, D.P., Hilton, J.L., Keller, H.U., Oberst, J., - Simon, J.L., Stooke, P., Tholen, D.J., and Thomas, P.C. - "Report of the IAU/IAG Working Group on Cartographic - Coordinates and Rotational Elements of the Planets and - Satellites: 2003," Unpublished. - - [2] Seidelmann, P.K., Abalakin, V.K., Bursa, M., Davies, M.E., - Bergh, C. de, Lieske, J.H., Oberst, J., Simon, J.L., - Standish, E.M., Stooke, P., and Thomas, P.C. (2002). - "Report of the IAU/IAG Working Group on Cartographic - Coordinates and Rotational Elements of the Planets and - Satellites: 2000," Celestial Mechanics and Dynamical - Astronomy, v.82, Issue 1, pp. 83-111. - - [3] Davies, M.E., Abalakin, V.K., Bursa, M., Kinoshita, H., - Kirk, R.L., Lieske, J.H., Marov, M.Ya., Seidelmann, P.K., - and Simon, J.-L. "Report of the IAU/IAG/COSPAR Working - Group on Cartographic Coordinates and Rotational Elements - of the Planets and Satellites: 1997," Unpublished. - - [4] Davies, M.E., Abalakin, V.K., Bursa, M., Lieske, J.H., - Morando, B., Morrison, D., Seidelmann, P.K., Sinclair, - A.T., Yallop, B., and Tjuflin, Y.S. (1996). "Report of - the IAU/IAG/COSPAR Working Group on Cartographic - Coordinates and Rotational Elements of the Planets and - Satellites: 1994," Celestial Mechanics and Dynamical - Astronomy, v.63, pp. 127-148. - - [5] Davies, M.E., Abalakin, V.K., Brahic, A., Bursa, M., - Chovitz., B.H., Lieske, J.H., Seidelmann, P.K., - Sinclair, A.T., and Tiuflin, I.S. (1992). "Report of the - IAU/IAG/COSPAR Working Group on Cartographic Coordinates - and Rotational Elements of the Planets and Satellites: - 1991," Celestial Mechanics and Dynamical Astronomy, - v.53, no.4, pp. 377-397. - - [6] Davies, M.E., Abalakin, V.K., Bursa, M., Hunt, G.E., - and Lieske, J.H. (1989). "Report of the IAU/IAG/COSPAR - Working Group on Cartographic Coordinates and Rotational - Elements of the Planets and Satellites: 1988," Celestial - Mechanics and Dynamical Astronomy, v.46, no.2, pp. - 187-204. - - [7] Nautical Almanac Office, United States Naval Observatory - and H.M. Nautical Almanac Office, Rutherford Appleton - Laboratory (2005). "The Astronomical Almanac for - the Year 2005," U.S. Government Printing Office, - Washington, D.C.: and The Stationary Office, London. - - [8] Nautical Almanac Office, United States Naval Observatory, - H.M. Nautical Almanac Office, Royal Greenwich - Observatory, Jet Propulsion Laboratory, Bureau des - Longitudes, and The Time Service and Astronomy - Departments, United States Naval Observatory (1992). - "Explanatory Supplement to the Astronomical Almanac," P. - Kenneth Seidelmann, ed. University Science Books, 20 - Edgehill Road, Mill Valley, CA 9494. - - [9] Duxbury, Thomas C. (2001). "IAU/IAG 2000 Mars Cartographic - Conventions," presentation to the Mars Express Data - Archive Working Group, Dec. 14, 2001. - - [10] Russell, C.T. and Luhmann, J.G. (1990). "Earth: Magnetic - Field and Magnetosphere." . Originally - published in "Encyclopedia of Planetary Sciences," J.H. - Shirley and R.W. Fainbridge, eds. Chapman and Hall, - New York, pp 208-211. - - [11] Russell, C.T. (1971). "Geophysical Coordinate - Transformations," Cosmic Electrodynamics 2 184-186. - NAIF document 181.0. - - [12] ESA/ESTEC Space Environment Information System (SPENVIS) - (2003). Web page: "Dipole approximations of the - geomagnetic field." . - - [13] International Association of Geomagnetism and Aeronomy - and International Union of Geodesy and Geophysics (2004). - Web page: "The 9th Generation International Geomagnetic - Reference Field." . - - [14] Duxbury, Thomas C. (1979). "Planetary Geodetic Control - Using Satellite Imaging," Journal of Geophysical Research, - vol. 84, no. B3. This paper is cataloged as NAIF - document 190.0. - - [15] Letter from Thomas C. Duxbury to Dr. Ephraim Lazeryevich - Akim, Keldish Institute of Applied Mathematics, USSR - Academy of Sciences, Moscow, USSR. This letter is - cataloged as NAIF document number 195.0. - - [16] "Placeholder" values were supplied by NAIF for some radii - of the bodies listed below: - - Body NAIF ID code - ---- ------------ - Metis 516 - Helene 612 - Larissa 807 - - See the discussion below for further information. - - - Most values are from [2]. All exceptions are - commented where they occur in this file. The exceptions are: - - - -- Radii for the Sun are from [7]. - - -- The second nutation precession angle (M2) for Mars is - represented by a quadratic polynomial in the 2000 - IAU report. The SPICELIB subroutine BODEUL can not - handle this term (which is extremely small), so we - truncate the polynomial to a linear one. - - -- For several satellites, the 2000 IAU report either gives - a single radius value or a polar radius and a single - equatorial radius. SPICE Toolkit software that uses body - radii expects to find three radii whenever these data are - read from the kernel pool. In the cases listed below, - NAIF has used the mean radius value for all three radii. - Wherever this was done, the fact has been noted. - - The affected satellites are: - - Body NAIF ID code - ---- ------------ - Metis 516 - Helene 612 - Larissa 807 - - -- Earth north geomagnetic centered dipole values are from - [12]. The article [10] was used to check most of - these values, and the values were also re-computed from - the 9th generation IGRF [13] by Nat Bachman. - - -- The Mars prime meridian offset angle is from [9]. - - - "Old values" listed are from the SPICE P_constants file - dated April 24, 2000. Most of these values came from the - 1994 IAU report [4]. - - - - -Explanation --------------------------------------------------------- - - The SPICE Toolkit software that uses this file is documented in - the SPICE "Required Reading" file pck.req. For a terse - description of the PCK file format, see the section below titled - "File Format." See the SPICE "Required Reading" file kernel.req - for a detailed explanation of the SPICE text kernel file format. - The files pck.req and kernel.req are included in the documentation - provided with the SPICE Toolkit. - - This file, which is logically part of the SPICE P-kernel, contains - constants used to model the orientation, size and shape of the - Sun, planets, and satellites. The orientation models express the - direction of the pole and location of the prime meridian of a body - as a function of time. The size/shape models ("shape models" for - short) represent all bodies as ellipsoids, using two equatorial - radii and a polar radius. Spheroids and spheres are obtained when - two or all three radii are equal. - - -File Format - - This file consists of a series of comment blocks and data blocks. - Comment blocks, which contain free-form descriptive or explanatory - text, are preceded by a \begintext token. Data blocks follow a - \begindata token. In order to be recognized, each token shown - here must be placed on a line by itself. - - The portion of the file preceding the first data block is treated - as a comment block; it doesn't require an initial comment block - token. - - This file identifies data using a series of - - KEYWORD = VALUE - - assignments. The left hand side of each assignment is a - "kernel variable" name; the right hand side is an associated value - or list of values. The SPICE subroutine API allows SPICE routines - and user applications to retrieve the set of values associated - with each kernel variable name. - - Kernel variable names are case-sensitive and are limited to - 32 characters in length. - - Numeric values may be integer or floating point. String values - are normally limited to 80 characters in length; however, SPICE - provides a mechanism for identifying longer, "continued" strings. - See the SPICE routine STPOOL for details. - - String values are single quoted. - - When the right hand side of an assignment is a list of values, - the list items may be separated by commas or simply by blanks. - The list must be bracketed by parentheses. Example: - - BODY399_RADII = ( 6378.14 6378.14 6356.75 ) - - Any blanks preceding or following keyword names, values and equal - sign are ignored. - - Assignments may be spread over multiple lines, for example: - - BODY399_RADII = ( 6378.14 - 6378.14 - 6356.75 ) - - This file may contain blank lines anywhere. Non-printing - characters including TAB should not be present in the file: the - presence of such characters may make the file unreadable by - SPICE software. - - -Time systems and reference frames - - The 2000 IAU/IAG Working Group Report [1] states that, to the - accuracy of the formulas given, the time system used may be - regarded as any of TDB (Barycentric Dynamical Time), TT - (Terrestrial time, formerly called TDT), or T_eph (the independent - variable of the JPL planetary ephemerides). Reference [2], from - which most data in this report were taken, erroneously identifies - the time system as TCB (Barycentric Coordinate Time). - - SPICE software treats the time system used in this file as T_eph, - but for historical reasons SPICE documentation refers to the time - system as both "ET" and "TDB." For consistency, documentation in - this version of the file retains use of the name TDB. - - The origin of the time system is 2000 January 1 12:00:00 (TDB). - Throughout SPICE documentation and in this file, we use the names - "J2000 TDB" and "J2000" for this epoch. The name "J2000.0" is - equivalent. - - The inertial reference frame used for the rotational elements in - this file is identified by [1] as the ICRF (International - Celestial Reference Frame). In this file, the frame is treated - as J2000. The difference between the J2000 frame and the ICRF is - on the order of tens of milliarcseconds and is well below the - accuracy level of the formulas in this file. - -Orientation models - - All of the orientation models use three Euler angles to describe - body orientation. To be precise, the Euler angles describe the - orientation of the coordinate axes of the "Body Equator and Prime - Meridian" system with respect to an inertial system. By default, - the inertial system is J2000 (also called "EME2000"), but other - frames can be specified in the file. See the PCK Required Reading - for details. - - The first two angles, in order, are the J2000 right ascension and - declination (henceforth RA and DEC) of the north pole of a body as - a function of time. The third angle is the prime meridian location - (represented by "W"), which is expressed as a rotation about the - north pole, and is also a function of time. - - For the Sun and planets, the expressions for the north pole's - right ascension and declination, as well as prime meridian - location, are sums (as far as the models that appear in this file - are concerned) of quadratic polynomials and trigonometric - polynomials, where the independent variable is time. Some - coefficients may be zero. Currently Neptune is the only planet - for which trigonometric polynomial terms are used. - - In this file, the time arguments in expressions always refer to - Barycentric Dynamical Time (TDB), measured in centuries or days - past a reference epoch. By default, the reference epoch is - the J2000 epoch, which is Julian ephemeris date 2451545.0, but - other epochs can be specified in the file. See the PCK Required - Reading for details. - - Example: 1991 IAU Model for orientation of the Earth. Note that - these values are used as an example only; see the data area below - for current values. - - - alpha = 0.00 - 0.641 T ( RA ) - 0 - - delta = 90.0 - 0.557 T ( DEC ) - 0 - - W = 190.16 + 360.9856235 d ( Prime meridian ) - - - T represents centuries past J2000 ( TDB ), - - d represents days past J2000 ( TDB ). - - In this file, the polynomials' coefficients above are assigned to the - symbols - - BODY399_POLE_RA - BODY399_POLE_DEC - BODY399_POLE_PM - - as follows: - - BODY399_POLE_RA = ( 0. -0.641 0. ) - BODY399_POLE_DEC = ( 90. -0.557 0. ) - BODY399_PM = ( 190.16 360.9856235 0. ) - - Note the number "399"; this is the NAIF ID code for the Earth. - - You'll see an additional symbol grouped with the ones listed here; it - is - - BODY399_LONG_AXIS - - This term is zero for all bodies except Mars. It represents the - angular offset between the meridian containing the longest axis of - the triaxial ellipsoid used to model a body and the prime meridian - of the body. - - Expressions for satellites are a little more complicated; in addition - to polynomial terms, there are trigonometric terms. The arguments of - the trigonometric terms are linear polynomials. In this file, we call - the arguments of these trigonometric terms "nutation precession - angles." - - In this file, the polynomial expressions for the nutation precession - angles are listed along with the planet's RA, DEC, and prime meridian - terms. - - Example: 1991 IAU nutation precession angles for Earth. Note that these - values are used as an example only; see the data area below for current - values. - - E1 = 125.045 - 0.052992 d - E2 = 250.090 - 0.105984 d - E3 = 260.008 + 13.012001 d - E4 = 176.625 + 13.340716 d - E5 = 357.529 + 0.985600 d - - d represents days past J2000 ( TDB ) - - Because the SPICE Toolkit software expects the time units for the - angles to be CENTURIES (as in the IAU models for most bodies--the - Earth is an exception), the linear coefficients are scaled by - 36525.0 (days/century) in the assignments: - - BODY3_NUT_PREC_ANGLES = ( 125.045 -1935.5328 - 250.090 -3871.0656 - 260.008 475263.336525 - 176.625 487269.6519 - 357.529 35999.04 ) - - As stated above, the satellite orientation models use polynomial and - trigonometric terms, where the arguments of the trigonometric terms - are the "nutation precession angles." - - Example: 1988 IAU values for the Moon. Again, these values are used - as an example only; see the data area below for current values. - - - alpha = 270.000 + 0.003 T - 3.878 sin(E1) - 0.120 sin(E2) - 0 - + 0.070 sin(E3) - 0.017 sin(E4) (RA) - - - delta = 66.541 + 0.013 T + 1.543 cos(E1) + 0.024 cos(E2) - 0 - - 0.028 cos(E3) + 0.007 cos(E4) (DEC) - - - W = 38.317 + 13.1763582 d + 3.558 sin(E1) - - + 0.121 sin(E2) - - - 0.064 sin(E3) - - + 0.016 sin(E4) - - + 0.025 sin(E5) ( Prime - meridian ) - - d represents days past J2000. - - E1--E5 are the nutation precession angles. - - The polynomial terms are assigned to symbols by the statements - - BODY301_POLE_RA = ( 270.000 0.003 0. ) - BODY301_POLE_DEC = ( 66.541 0.013 0. ) - BODY301_PM = ( 38.317 13.1763582 0. ) - - The coefficients of the trigonometric terms are assigned to symbols by - the statements - - BODY301_NUT_PREC_RA = ( -3.878 -0.120 0.070 -0.017 0. ) - BODY301_NUT_PREC_DEC = ( 1.543 0.024 -0.028 0.007 0. ) - BODY301_NUT_PREC_PM = ( 3.558 0.121 -0.064 0.016 0.025 ) - - Note that for the RA and PM (prime meridian) assignments, the ith term - is the coefficient of sin(Ei) in the expression used in the IAU model, - while for the DEC assignment, the ith term is the coefficient of - cos(Ei) in the expression used in the IAU model. - - SPICE software expects the models for satellite orientation to - follow the form of the model shown here: the polynomial portions of the - RA, DEC, and W expressions are expected to be quadratic, the - trigonometric terms for RA and W (satellite prime meridian) are expected - to be linear combinations of sines of nutation precession angles, the - trigonometric terms for DEC are expected to be linear combinations of - cosines of nutation precession angles, and the polynomials for the - nutation precession angles themselves are expected to be linear. - - Eventually, the software will handle more complex expressions, we - expect. - - -Shape models - - There is only one kind of shape model supported by the SPICE Toolkit - software at present: the triaxial ellipsoid. The 2000 IAU report does - not use any other models, except in the case of Mars, where - separate values are given for the north and south polar radii. - - For each body, three radii are listed: The first number is - the largest equatorial radius (the length of the semi-axis - containing the prime meridian), the second number is the smaller - equatorial radius, and the third is the polar radius. - - Example: Radii of the Earth. - - BODY399_RADII = ( 6378.14 6378.14 6356.75 ) - - -Body numbers and names --------------------------------------------------------- - - - 1 Mercury barycenter - 2 Venus barycenter - 3 Earth barycenter - 4 Mars barycenter - 5 Jupiter barycenter - 6 Saturn barycenter - 7 Uranus barycenter - 8 Neptune barycenter - 9 Pluto barycenter - 10 Sun - - While not relevant to the P_constants kernel, we note here for - completeness that 0 is used to represent the solar system - barycenter. - - 199 Mercury - - - 299 Venus - - - 399 Earth - - 301 Moon - - - 499 Mars - - 401 Phobos 402 Deimos - - - 599 Jupiter - - 501 Io 502 Europa 503 Ganymede 504 Callisto - 505 Amalthea 506 Himalia 507 Elara 508 Pasiphae - 509 Sinope 510 Lysithea 511 Carme 512 Ananke - 513 Leda 514 Thebe 515 Adrastea 516 Metis - - - 699 Saturn - - 601 Mimas 602 Enceladus 603 Tethys 604 Dione - 605 Rhea 606 Titan 607 Hyperion 608 Iapetus - 609 Phoebe 610 Janus 611 Epimetheus 612 Helene - 613 Telesto 614 Calypso 615 Atlas 616 Prometheus - 617 Pandora 618 Pan - - - 799 Uranus - - 701 Ariel 702 Umbriel 703 Titania 704 Oberon - 705 Miranda 706 Cordelia 707 Ophelia 708 Bianca - 709 Cressida 710 Desdemona 711 Juliet 712 Portia - 713 Rosalind 714 Belinda 715 Puck - - - 899 Neptune - - 801 Triton 802 Nereid 803 Naiad 804 Thalassa - 805 Despina 806 Galatea 807 Larissa 808 Proteus - - - 999 Pluto - - 901 Charon - - - 2000004 Asteroid Vesta - 2000216 Asteroid Kleopatra - 2000433 Asteroid Eros - 2431010 Asteroid Ida - 9511010 Asteroid Gaspra - - -Orientation constants for the Sun and planets --------------------------------------------------------- - - -Sun - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY10_POLE_RA = ( 286.13 0. 0. ) - BODY10_POLE_DEC = ( 63.87 0. 0. ) - BODY10_PM = ( 84.10 14.18440 0. ) - BODY10_LONG_AXIS = ( 0. ) - - \begintext - -Mercury - - Old values: - - body199_pole_ra = ( 281.01, -0.033, 0. ) - body199_pole_dec = ( 61.45, -0.005, 0. ) - body199_pm = ( 329.55 6.1385025 0. ) - - body199_long_axis = ( 0. ) - - - Current values: - - \begindata - - BODY199_POLE_RA = ( 281.01 -0.033 0. ) - BODY199_POLE_DEC = ( 61.45 -0.005 0. ) - BODY199_PM = ( 329.548 6.1385025 0. ) - - BODY199_LONG_AXIS = ( 0. ) - - \begintext - - -Venus - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY299_POLE_RA = ( 272.76 0. 0. ) - BODY299_POLE_DEC = ( 67.16 0. 0. ) - BODY299_PM = ( 160.20 -1.4813688 0. ) - - BODY299_LONG_AXIS = ( 0. ) - - \begintext - - -Earth - - Old values: - - Values shown are from the 1994 IAU report [4]. - - body399_pole_ra = ( 0. -0.641 0. ) - body399_pole_dec = ( 90. -0.557 0. ) - body399_pm = ( 190.16 360.9856235 0. ) - body399_long_axis = ( 0. ) - - Nutation precession angles are unchanged in the 2000 report. - - - Current values: - - \begindata - - BODY399_POLE_RA = ( 0. -0.641 0. ) - BODY399_POLE_DEC = ( 90. -0.557 0. ) - BODY399_PM = ( 190.147 360.9856235 0. ) - BODY399_LONG_AXIS = ( 0. ) - - \begintext - - - Nutation precession angles for the Earth-Moon system: - - The linear coefficients have been scaled up from degrees/day - to degrees/century, because the SPICELIB PCK reader expects - these units. The original constants were: - - 125.045D0 -0.0529921D0 - 250.089D0 -0.1059842D0 - 260.008D0 13.0120009D0 - 176.625D0 13.3407154D0 - 357.529D0 0.9856003D0 - 311.589D0 26.4057084D0 - 134.963D0 13.0649930D0 - 276.617D0 0.3287146D0 - 34.226D0 1.7484877D0 - 15.134D0 -0.1589763D0 - 119.743D0 0.0036096D0 - 239.961D0 0.1643573D0 - 25.053D0 12.9590088D0 - - - \begindata - - - BODY3_NUT_PREC_ANGLES = ( 125.045 -1935.5364525000 - 250.089 -3871.0729050000 - 260.008 475263.3328725000 - 176.625 487269.6299850000 - 357.529 35999.0509575000 - 311.589 964468.4993100000 - 134.963 477198.8693250000 - 276.617 12006.3007650000 - 34.226 63863.5132425000 - 15.134 -5806.6093575000 - 119.743 131.8406400000 - 239.961 6003.1503825000 - 25.053 473327.7964200000 ) - - - \begintext - - - Earth north geomagnetic centered dipole: - - Old values: - - Values are from [11]. Note the year of publication was 1971. - - body399_mag_north_pole_lon = ( -69.761 ) - body399_mag_north_pole_lat = ( 78.565 ) - - - Current values: - - The north dipole location is time-varying. The values shown - below, taken from [12], represent a discrete sampling of the - north dipole location from 1945 to 2000. The terms DGRF and - IGRF refer to, respectively, "Definitive Geomagnetic - Reference Field" and "International Geomagnetic Reference - Field." See references [10], [12], and [13] for details. - - Coordinates are planetocentric. - - Data source Lat Lon - ----------- ----- ------ - DGRF 1945 78.47 291.47 - DGRF 1950 78.47 291.15 - DGRF 1955 78.46 290.84 - DGRF 1960 78.51 290.53 - DGRF 1965 78.53 290.15 - DGRF 1970 78.59 289.82 - DGRF 1975 78.69 289.53 - DGRF 1980 78.81 289.24 - DGRF 1985 78.97 289.10 - DGRF 1990 79.13 288.89 - IGRF 1995 79.30 288.59 - IGRF 2000 79.54 288.43 - - - Values are given for the epoch 2000 and are from the final row - of the above table, which is from [12]. As shown by the table - these values constitute a low-accuracy approximation for epochs - not close to 2000. - - \begindata - - BODY399_N_GEOMAG_CTR_DIPOLE_LON = ( 288.43 ) - BODY399_N_GEOMAG_CTR_DIPOLE_LAT = ( 79.54 ) - - \begintext - - -Mars - - Old values: - - Values shown are from the 1994 IAU report [4]. - - body499_pole_ra = ( 317.681 -0.108 0. ) - body499_pole_dec = ( 52.886 -0.061 0. ) - body499_pm = ( 176.901 350.8919830 0. ) - - Nutation precession angles are unchanged in the 2000 IAU report. - - Old lambda_a values were specified as POSITIVE WEST LONGITUDE. - Reference [14] gave the value - - body499_long_axis = ( 110. ) - - and reference [15] gave the value - - body499_long_axis = ( 104.9194 ) - - - Current values: - - \begindata - - BODY499_POLE_RA = ( 317.68143 -0.1061 0. ) - BODY499_POLE_DEC = ( 52.88650 -0.0609 0. ) - BODY499_PM = ( 176.630 350.89198226 0. ) - - \begintext - - Source [9] specifies the following value for the lambda_a term - (BODY499_LONG_AXIS ) for Mars. This term is the POSITIVE EAST - LONGITUDE, measured from the prime meridian, of the meridian - containing the longest axis of the reference ellipsoid. - (CAUTION: previous values were POSITIVE WEST.) - - body499_long_axis = ( 252. ) - - We list this lambda_a value for completeness. The IAU report - [2] gives equal values for both equatorial radii, so the - lambda_a offset does not apply to the IAU model. - - The 2000 IAU report defines M2, the second nutation precession angle, - by: - - 2 - 192.93 + 1128.4096700 d + 8.864 T - - We truncate the M2 series to a linear expression, because the PCK - software cannot handle the quadratic term. - - Again, the linear terms are scaled by 36525.0: - - -0.4357640000000000 --> -15916.28010000000 - 1128.409670000000 --> 41215163.19675000 - -1.8151000000000000E-02 --> -662.9652750000000 - - We also introduce a fourth nutation precession angle, which - is the pi/2-complement of the third angle. This angle is used - in computing the prime meridian location for Deimos. See the - discussion of this angle below in the section containing orientation - constants for Deimos. - - \begindata - - BODY4_NUT_PREC_ANGLES = ( 169.51 -15916.2801 - 192.93 41215163.19675 - 53.47 -662.965275 - 36.53 662.965275 ) - - \begintext - - -Jupiter - - Old values: - - body599_pole_ra = ( 268.05 -0.009 0. ) - body599_pole_dec = ( +64.49 +0.003 0. ) - body599_pm = ( 284.95 +870.5366420 0. ) - body599_long_axis = ( 0. ) - - body5_nut_prec_angles = ( 73.32 +91472.9 - 24.62 +45137.2 - 283.90 +4850.7 - 355.80 +1191.3 - 119.90 +262.1 - 229.80 +64.3 - 352.25 +2382.6 - 113.35 +6070.0 - 146.64 +182945.8 - 49.24 +90274.4 ) - - Current values: - - The number of nutation precession angles is ten. The ninth and - tenth are twice the first and second, respectively. - - \begindata - - - BODY599_POLE_RA = ( 268.05 -0.009 0. ) - BODY599_POLE_DEC = ( 64.49 0.003 0. ) - BODY599_PM = ( 284.95 870.5366420 0. ) - BODY599_LONG_AXIS = ( 0. ) - - BODY5_NUT_PREC_ANGLES = ( 73.32 91472.9 - 24.62 45137.2 - 283.90 4850.7 - 355.80 1191.3 - 119.90 262.1 - 229.80 64.3 - 352.35 2382.6 - 113.35 6070.0 - 146.64 182945.8 - 49.24 90274.4 ) - \begintext - - -Saturn - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY699_POLE_RA = ( 40.589 -0.036 0. ) - BODY699_POLE_DEC = ( 83.537 -0.004 0. ) - BODY699_PM = ( 38.90 810.7939024 0. ) - BODY699_LONG_AXIS = ( 0. ) - - \begintext - - The first seven angles given here are the angles S1 - through S7 from the 2000 report; the eighth and - ninth angles are 2*S1 and 2*S2, respectively. - - - \begindata - - BODY6_NUT_PREC_ANGLES = ( 353.32 75706.7 - 28.72 75706.7 - 177.40 -36505.5 - 300.00 -7225.9 - 316.45 506.2 - 345.20 -1016.3 - 29.80 -52.1 - 706.64 151413.4 - 57.44 151413.4 ) - \begintext - - -Uranus - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY799_POLE_RA = ( 257.311 0. 0. ) - BODY799_POLE_DEC = ( -15.175 0. 0. ) - BODY799_PM = ( 203.81 -501.1600928 0. ) - BODY799_LONG_AXIS = ( 0. ) - - \begintext - - The first 16 angles given here are the angles U1 - through U16 from the 2000 report; the 17th and - 18th angles are 2*U11 and 2*U12, respectively. - - \begindata - - BODY7_NUT_PREC_ANGLES = ( 115.75 54991.87 - 141.69 41887.66 - 135.03 29927.35 - 61.77 25733.59 - 249.32 24471.46 - 43.86 22278.41 - 77.66 20289.42 - 157.36 16652.76 - 101.81 12872.63 - 138.64 8061.81 - 102.23 -2024.22 - 316.41 2863.96 - 304.01 -51.94 - 308.71 -93.17 - 340.82 -75.32 - 259.14 -504.81 - 204.46 -4048.44 - 632.82 5727.92 ) - - \begintext - - - -Neptune - - Old values: - - Values are unchanged in the 2000 IAU report. However, - the kernel variables used to store the values have changed. - See note immediately below. - - Current values: - - The kernel variables - - BODY899_NUT_PREC_RA - BODY899_NUT_PREC_DEC - BODY899_NUT_PREC_PM - - are new in this PCK version (dated October 17, 2003). - These variables capture trigonometric terms in the expressions - for Neptune's pole direction and prime meridian location. - Version N0057 of the SPICE Toolkit uses these variables; - earlier versions can read them but ignore them when - computing Neptune's orientation. - - \begindata - - BODY899_POLE_RA = ( 299.36 0. 0. ) - BODY899_POLE_DEC = ( 43.46 0. 0. ) - BODY899_PM = ( 253.18 536.3128492 0. ) - BODY899_LONG_AXIS = ( 0. ) - - - BODY899_NUT_PREC_RA = ( 0.70 0. 0. 0. 0. 0. 0. 0. ) - BODY899_NUT_PREC_DEC = ( -0.51 0. 0. 0. 0. 0. 0. 0. ) - BODY899_NUT_PREC_PM = ( -0.48 0. 0. 0. 0. 0. 0. 0. ) - - \begintext - - The 2000 report defines the nutation precession angles - - N, N1, N2, ... , N7 - - and also uses the multiples of N1 and N7 - - 2*N1 - - and - - 2*N7, 3*N7, ..., 9*N7 - - In this file, we treat the angles and their multiples as - separate angles. In the kernel variable - - BODY8_NUT_PREC_ANGLES - - the order of the angles is - - N, N1, N2, ... , N7, 2*N1, 2*N7, 3*N7, ..., 9*N7 - - Each angle is defined by a linear polynomial, so two - consecutive array elements are allocated for each - angle. The first term of each pair is the constant term, - the second is the linear term. - - \begindata - - BODY8_NUT_PREC_ANGLES = ( 357.85 52.316 - 323.92 62606.6 - 220.51 55064.2 - 354.27 46564.5 - 75.31 26109.4 - 35.36 14325.4 - 142.61 2824.6 - 177.85 52.316 - 647.840 125213.200 - 355.700 104.632 - 533.550 156.948 - 711.400 209.264 - 889.250 261.580 - 1067.100 313.896 - 1244.950 366.212 - 1422.800 418.528 - 1600.650 470.844 ) - - \begintext - - - -Pluto - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY999_POLE_RA = ( 313.02 0. 0. ) - BODY999_POLE_DEC = ( 9.09 0. 0. ) - BODY999_PM = ( 236.77 -56.3623195 0. ) - BODY999_LONG_AXIS = ( 0. ) - - \begintext - - - - -Orientation constants for the satellites --------------------------------------------------------- - - -Satellites of Earth - - Old values: - - Values are from the 1988 IAU report. - - body301_pole_ra = ( 270.000 0. 0. ) - body301_pole_dec = ( 66.534 0. 0. ) - body301_pm = ( 38.314 13.1763581 0. ) - body301_long_axis = ( 0. ) - - body301_nut_prec_ra = ( -3.878 -0.120 0.070 -0.017 0. ) - body301_nut_prec_dec = ( 1.543 0.024 -0.028 0.007 0. ) - body301_nut_prec_pm = ( 3.558 0.121 -0.064 0.016 0.025 ) - - BODY301_POLE_RA = ( 269.9949 0.0031 0. ) - BODY301_POLE_DEC = ( 66.5392 0.0130 0. ) - BODY301_PM = ( 38.3213 13.17635815 -1.4D-12 ) - BODY301_LONG_AXIS = ( 0. ) - - BODY301_NUT_PREC_RA = ( -3.8787 -0.1204 0.0700 -0.0172 - 0. 0.0072 0. 0. - 0. -0.0052 0. 0. - 0.0043 ) - - BODY301_NUT_PREC_DEC = ( 1.5419 0.0239 -0.0278 0.0068 - 0. -0.0029 0.0009 0. - 0. 0.0008 0. 0. - -0.0009 ) - - BODY301_NUT_PREC_PM = ( 3.5610 0.1208 -0.0642 0.0158 - 0.0252 -0.0066 -0.0047 -0.0046 - 0.0028 0.0052 0.0040 0.0019 - -0.0044 ) - - New values: - - \begindata - - - - - - BODY301_POLE_RA = ( 269.9949 0.0031 0. ) - BODY301_POLE_DEC = ( 66.5392 0.0130 0. ) - BODY301_PM = ( 38.3213 13.17635815 -1.4D-12 ) - BODY301_LONG_AXIS = ( 0. ) - - BODY301_NUT_PREC_RA = ( -3.8787 -0.1204 0.0700 -0.0172 - 0.0 0.0072 0.0 0.0 - 0.0 -0.0052 0.0 0.0 - 0.0043 ) - - BODY301_NUT_PREC_DEC = ( 1.5419 0.0239 -0.0278 0.0068 - 0.0 -0.0029 0.0009 0.0 - 0.0 0.0008 0.0 0.0 - -0.0009 ) - - BODY301_NUT_PREC_PM = ( 3.5610 0.1208 -0.0642 0.0158 - 0.0252 -0.0066 -0.0047 -0.0046 - 0.0028 0.0052 0.0040 0.0019 - -0.0044 ) - \begintext - - - -Satellites of Mars - - - Phobos - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - The quadratic prime meridian term is scaled by 1/36525**2: - - 8.864000000000000 ---> 6.6443009930565219E-09 - - \begindata - - BODY401_POLE_RA = ( 317.68 -0.108 0. ) - BODY401_POLE_DEC = ( 52.90 -0.061 0. ) - BODY401_PM = ( 35.06 1128.8445850 6.6443009930565219E-09 ) - - BODY401_LONG_AXIS = ( 0. 0. ) - - BODY401_NUT_PREC_RA = ( 1.79 0. 0. 0. ) - BODY401_NUT_PREC_DEC = ( -1.08 0. 0. 0. ) - BODY401_NUT_PREC_PM = ( -1.42 -0.78 0. 0. ) - - - \begintext - - - Deimos - - Old values: - - Values are unchanged in the 2000 IAU report. - - - New values: - - The Deimos prime meridian expression is: - - - 2 - W = 79.41 + 285.1618970 d - 0.520 T - 2.58 sin M - 3 - - + 0.19 cos M . - 3 - - - At the present time, the PCK kernel software (the routine - BODEUL in particular) cannot handle the cosine term directly, - but we can represent it as - - 0.19 sin M - 4 - - where - - M = 90.D0 - M - 4 3 - - Therefore, the nutation precession angle assignments for Phobos - and Deimos contain four coefficients rather than three. - - The quadratic prime meridian term is scaled by 1/36525**2: - - -0.5200000000000000 ---> -3.8978300049519307E-10 - - \begindata - - BODY402_POLE_RA = ( 316.65 -0.108 0. ) - BODY402_POLE_DEC = ( 53.52 -0.061 0. ) - BODY402_PM = ( 79.41 285.1618970 -3.897830D-10 ) - BODY402_LONG_AXIS = ( 0. ) - - BODY402_NUT_PREC_RA = ( 0. 0. 2.98 0. ) - BODY402_NUT_PREC_DEC = ( 0. 0. -1.78 0. ) - BODY402_NUT_PREC_PM = ( 0. 0. -2.58 0.19 ) - - \begintext - - - - -Satellites of Jupiter - - - Io - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY501_POLE_RA = ( 268.05 -0.009 0. ) - BODY501_POLE_DEC = ( 64.50 0.003 0. ) - BODY501_PM = ( 200.39 203.4889538 0. ) - BODY501_LONG_AXIS = ( 0. ) - - BODY501_NUT_PREC_RA = ( 0. 0. 0.094 0.024 ) - BODY501_NUT_PREC_DEC = ( 0. 0. 0.040 0.011 ) - BODY501_NUT_PREC_PM = ( 0. 0. -0.085 -0.022 ) - - \begintext - - - - Europa - - - Old values: - - body502_pole_ra = ( 268.08 -0.009 0. ) - body502_pole_dec = ( 64.51 0.003 0. ) - body502_pm = ( 35.67 101.3747235 0. ) - body502_long_axis = ( 0. ) - - body502_nut_prec_ra = ( 0. 0. 0. 1.086 0.060 0.015 0.009 ) - body502_nut_prec_dec = ( 0. 0. 0. 0.468 0.026 0.007 0.002 ) - body502_nut_prec_pm = ( 0. 0. 0. -0.980 -0.054 -0.014 -0.008 ) - - Current values: - - \begindata - - BODY502_POLE_RA = ( 268.08 -0.009 0. ) - BODY502_POLE_DEC = ( 64.51 0.003 0. ) - BODY502_PM = ( 36.022 101.3747235 0. ) - BODY502_LONG_AXIS = ( 0. ) - - BODY502_NUT_PREC_RA = ( 0. 0. 0. 1.086 0.060 0.015 0.009 ) - BODY502_NUT_PREC_DEC = ( 0. 0. 0. 0.468 0.026 0.007 0.002 ) - BODY502_NUT_PREC_PM = ( 0. 0. 0. -0.980 -0.054 -0.014 -0.008 ) - - \begintext - - - Ganymede - - Old values: - - body503_pole_ra = ( 268.20 -0.009 0. ) - body503_pole_dec = ( +64.57 +0.003 0. ) - body503_pm = ( 44.04 +50.3176081 0. ) - body503_long_axis = ( 0. ) - - body503_nut_prec_ra = ( 0. 0. 0. -0.037 +0.431 +0.091 ) - body503_nut_prec_dec = ( 0. 0. 0. -0.016 +0.186 +0.039 ) - body503_nut_prec_pm = ( 0. 0. 0. +0.033 -0.389 -0.082 ) - - Current values: - - \begindata - - BODY503_POLE_RA = ( 268.20 -0.009 0. ) - BODY503_POLE_DEC = ( 64.57 0.003 0. ) - BODY503_PM = ( 44.064 50.3176081 0. ) - BODY503_LONG_AXIS = ( 0. ) - - BODY503_NUT_PREC_RA = ( 0. 0. 0. -0.037 0.431 0.091 ) - BODY503_NUT_PREC_DEC = ( 0. 0. 0. -0.016 0.186 0.039 ) - BODY503_NUT_PREC_PM = ( 0. 0. 0. 0.033 -0.389 -0.082 ) - - \begintext - - - Callisto - - - Old values: - - body504_pole_ra = ( 268.72 -0.009 0. ) - body504_pole_dec = ( +64.83 +0.003 0. ) - body504_pm = ( 259.73 +21.5710715 0. ) - body504_long_axis = ( 0. ) - - body504_nut_prec_ra = ( 0. 0. 0. 0. -0.068 +0.590 0. +0.010 ) - body504_nut_prec_dec = ( 0. 0. 0. 0. -0.029 +0.254 0. -0.004 ) - body504_nut_prec_pm = ( 0. 0. 0. 0. +0.061 -0.533 0. -0.009 ) - - Current values: - - - \begindata - - BODY504_POLE_RA = ( 268.72 -0.009 0. ) - BODY504_POLE_DEC = ( 64.83 0.003 0. ) - BODY504_PM = ( 259.51 21.5710715 0. ) - BODY504_LONG_AXIS = ( 0. ) - - BODY504_NUT_PREC_RA = ( 0. 0. 0. 0. -0.068 0.590 0. 0.010 ) - BODY504_NUT_PREC_DEC = ( 0. 0. 0. 0. -0.029 0.254 0. -0.004 ) - BODY504_NUT_PREC_PM = ( 0. 0. 0. 0. 0.061 -0.533 0. -0.009 ) - - \begintext - - - Amalthea - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY505_POLE_RA = ( 268.05 -0.009 0. ) - BODY505_POLE_DEC = ( 64.49 0.003 0. ) - BODY505_PM = ( 231.67 722.6314560 0. ) - BODY505_LONG_AXIS = ( 0. ) - - BODY505_NUT_PREC_RA = ( -0.84 0. 0. 0. 0. 0. 0. 0. 0.01 0. ) - BODY505_NUT_PREC_DEC = ( -0.36 0. 0. 0. 0. 0. 0. 0. 0. 0. ) - BODY505_NUT_PREC_PM = ( 0.76 0. 0. 0. 0. 0. 0. 0. -0.01 0. ) - - \begintext - - - Thebe - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY514_POLE_RA = ( 268.05 -0.009 0. ) - BODY514_POLE_DEC = ( 64.49 0.003 0. ) - BODY514_PM = ( 8.56 533.7004100 0. ) - BODY514_LONG_AXIS = ( 0. ) - - BODY514_NUT_PREC_RA = ( 0. -2.11 0. 0. 0. 0. 0. 0. 0. 0.04 ) - BODY514_NUT_PREC_DEC = ( 0. -0.91 0. 0. 0. 0. 0. 0. 0. 0.01 ) - BODY514_NUT_PREC_PM = ( 0. 1.91 0. 0. 0. 0. 0. 0. 0. -0.04 ) - - \begintext - - - Adrastea - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - - - BODY515_POLE_RA = ( 268.05 -0.009 0. ) - BODY515_POLE_DEC = ( 64.49 0.003 0. ) - BODY515_PM = ( 33.29 1206.9986602 0. ) - BODY515_LONG_AXIS = ( 0. ) - - \begintext - - - Metis - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY516_POLE_RA = ( 268.05 -0.009 0. ) - BODY516_POLE_DEC = ( 64.49 0.003 0. ) - BODY516_PM = ( 346.09 1221.2547301 0. ) - BODY516_LONG_AXIS = ( 0. ) - - \begintext - - - -Satellites of Saturn - - - Mimas - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY601_POLE_RA = ( 40.66 -0.036 0. ) - BODY601_POLE_DEC = ( 83.52 -0.004 0. ) - BODY601_PM = ( 337.46 381.9945550 0. ) - BODY601_LONG_AXIS = ( 0. ) - - BODY601_NUT_PREC_RA = ( 0. 0. 13.56 0. 0. 0. 0. 0. 0. ) - BODY601_NUT_PREC_DEC = ( 0. 0. -1.53 0. 0. 0. 0. 0. 0. ) - BODY601_NUT_PREC_PM = ( 0. 0. -13.48 0. -44.85 0. 0. 0. 0. ) - - \begintext - - - Enceladus - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY602_POLE_RA = ( 40.66 -0.036 0. ) - BODY602_POLE_DEC = ( 83.52 -0.004 0. ) - BODY602_PM = ( 2.82 262.7318996 0. ) - BODY602_LONG_AXIS = ( 0. ) - - \begintext - - - - Tethys - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY603_POLE_RA = ( 40.66 -0.036 0. ) - BODY603_POLE_DEC = ( 83.52 -0.004 0. ) - BODY603_PM = ( 10.45 190.6979085 0. ) - BODY603_LONG_AXIS = ( 0. ) - - BODY603_NUT_PREC_RA = ( 0. 0. 0. 9.66 0. 0. 0. 0. 0. ) - BODY603_NUT_PREC_DEC = ( 0. 0. 0. -1.09 0. 0. 0. 0. 0. ) - BODY603_NUT_PREC_PM = ( 0. 0. 0. -9.60 2.23 0. 0. 0. 0. ) - - \begintext - - - Dione - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY604_POLE_RA = ( 40.66 -0.036 0. ) - BODY604_POLE_DEC = ( 83.52 -0.004 0. ) - BODY604_PM = ( 357.00 131.5349316 0. ) - BODY604_LONG_AXIS = ( 0. ) - - \begintext - - - - Rhea - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY605_POLE_RA = ( 40.38 -0.036 0. ) - BODY605_POLE_DEC = ( 83.55 -0.004 0. ) - BODY605_PM = ( 235.16 79.6900478 0. ) - BODY605_LONG_AXIS = ( 0. ) - - BODY605_NUT_PREC_RA = ( 0. 0. 0. 0. 0. 3.10 0. 0. 0. ) - BODY605_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. -0.35 0. 0. 0. ) - BODY605_NUT_PREC_PM = ( 0. 0. 0. 0. 0. -3.08 0. 0. 0. ) - - \begintext - - - - Titan - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY606_POLE_RA = ( 36.41 -0.036 0. ) - BODY606_POLE_DEC = ( 83.94 -0.004 0. ) - BODY606_PM = ( 189.64 22.5769768 0. ) - BODY606_LONG_AXIS = ( 0. ) - - BODY606_NUT_PREC_RA = ( 0. 0. 0. 0. 0. 0. 2.66 0. 0 ) - BODY606_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. 0. -0.30 0. 0 ) - BODY606_NUT_PREC_PM = ( 0. 0. 0. 0. 0. 0. -2.64 0. 0 ) - - \begintext - - - - Hyperion - - The IAU report does not give an orientation model for Hyperion. - Hyperion's rotation is in chaotic and is not predictable for - long periods. - - - Iapetus - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY608_POLE_RA = ( 318.16 -3.949 0. ) - BODY608_POLE_DEC = ( 75.03 -1.143 0. ) - BODY608_PM = ( 350.20 4.5379572 0. ) - BODY608_LONG_AXIS = ( 0. ) - - \begintext - - - - Phoebe - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY609_POLE_RA = ( 355.00 0. 0. ) - BODY609_POLE_DEC = ( 68.70 0. 0. ) - BODY609_PM = ( 304.70 930.8338720 0. ) - BODY609_LONG_AXIS = ( 0. ) - - \begintext - - - Janus - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY610_POLE_RA = ( 40.58 -0.036 0. ) - BODY610_POLE_DEC = ( 83.52 -0.004 0. ) - BODY610_PM = ( 58.83 518.2359876 0. ) - BODY610_LONG_AXIS = ( 0. ) - - BODY610_NUT_PREC_RA = ( 0. -1.623 0. 0. 0. 0. 0. 0. 0.023 ) - BODY610_NUT_PREC_DEC = ( 0. -0.183 0. 0. 0. 0. 0. 0. 0.001 ) - BODY610_NUT_PREC_PM = ( 0. 1.613 0. 0. 0. 0. 0. 0. -0.023 ) - - \begintext - - - - Epimetheus - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY611_POLE_RA = ( 40.58 -0.036 0. ) - BODY611_POLE_DEC = ( 83.52 -0.004 0. ) - BODY611_PM = ( 293.87 518.4907239 0. ) - BODY611_LONG_AXIS = ( 0. ) - - BODY611_NUT_PREC_RA = ( -3.153 0. 0. 0. 0. 0. 0. 0.086 0. ) - BODY611_NUT_PREC_DEC = ( -0.356 0. 0. 0. 0. 0. 0. 0.005 0. ) - BODY611_NUT_PREC_PM = ( 3.133 0. 0. 0. 0. 0. 0. -0.086 0. ) - - \begintext - - - - Helene - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY612_POLE_RA = ( 40.85 -0.036 0. ) - BODY612_POLE_DEC = ( 83.34 -0.004 0. ) - BODY612_PM = ( 245.12 131.6174056 0. ) - BODY612_LONG_AXIS = ( 0. ) - - \begintext - - - - Telesto - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY613_POLE_RA = ( 50.51 -0.036 0. ) - BODY613_POLE_DEC = ( 84.06 -0.004 0. ) - BODY613_PM = ( 56.88 190.6979332 0. ) - BODY613_LONG_AXIS = ( 0. ) - - \begintext - - - - Calypso - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY614_POLE_RA = ( 36.41 -0.036 0. ) - BODY614_POLE_DEC = ( 85.04 -0.004 0. ) - BODY614_PM = ( 153.51 190.6742373 0. ) - BODY614_LONG_AXIS = ( 0. ) - - \begintext - - - - Atlas - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY615_POLE_RA = ( 40.58 -0.036 0. ) - BODY615_POLE_DEC = ( 83.53 -0.004 0. ) - BODY615_PM = ( 137.88 598.3060000 0. ) - BODY615_LONG_AXIS = ( 0. ) - - \begintext - - - - Prometheus - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY616_POLE_RA = ( 40.58 -0.036 ) - BODY616_POLE_DEC = ( 83.53 -0.004 ) - BODY616_PM = ( 296.14 587.289000 ) - BODY616_LONG_AXIS = ( 0. ) - - \begintext - - - - Pandora - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY617_POLE_RA = ( 40.58 -0.036 0. ) - BODY617_POLE_DEC = ( 83.53 -0.004 0. ) - BODY617_PM = ( 162.92 572.7891000 0. ) - BODY617_LONG_AXIS = ( 0. ) - - \begintext - - - - Pan - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY618_POLE_RA = ( 40.6 -0.036 0. ) - BODY618_POLE_DEC = ( 83.5 -0.004 0. ) - BODY618_PM = ( 48.8 626.0440000 0. ) - BODY618_LONG_AXIS = ( 0. ) - - \begintext - - - - - -Satellites of Uranus - - - - Ariel - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY701_POLE_RA = ( 257.43 0. 0. ) - BODY701_POLE_DEC = ( -15.10 0. 0. ) - BODY701_PM = ( 156.22 -142.8356681 0. ) - BODY701_LONG_AXIS = ( 0. ) - - BODY701_NUT_PREC_RA = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0. 0. 0.29 ) - - BODY701_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0. 0. 0.28 ) - - BODY701_NUT_PREC_PM = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0. 0.05 0.08 ) - \begintext - - - - Umbriel - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY702_POLE_RA = ( 257.43 0. 0. ) - BODY702_POLE_DEC = ( -15.10 0. 0. ) - BODY702_PM = ( 108.05 -86.8688923 0. ) - BODY702_LONG_AXIS = ( 0. ) - - BODY702_NUT_PREC_RA = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0. 0. 0. 0.21 ) - - BODY702_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0. 0. 0. 0.20 ) - - BODY702_NUT_PREC_PM = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0. -0.09 0. 0.06 ) - - \begintext - - - - Titania - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY703_POLE_RA = ( 257.43 0. 0. ) - BODY703_POLE_DEC = ( -15.10 0. 0. ) - BODY703_PM = ( 77.74 -41.3514316 0. ) - BODY703_LONG_AXIS = ( 0. ) - - BODY703_NUT_PREC_RA = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.29 ) - - BODY703_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.28 ) - - BODY703_NUT_PREC_PM = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.08 ) - \begintext - - - - Oberon - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY704_POLE_RA = ( 257.43 0. 0. ) - BODY704_POLE_DEC = ( -15.10 0. 0. ) - BODY704_PM = ( 6.77 -26.7394932 0. ) - BODY704_LONG_AXIS = ( 0. ) - - - BODY704_NUT_PREC_RA = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0.16 ) - - BODY704_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0.16 ) - - BODY704_NUT_PREC_PM = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. 0.04 ) - \begintext - - - - Miranda - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - - BODY705_POLE_RA = ( 257.43 0. 0. ) - BODY705_POLE_DEC = ( -15.08 0. 0. ) - BODY705_PM = ( 30.70 -254.6906892 0. ) - BODY705_LONG_AXIS = ( 0. ) - - BODY705_NUT_PREC_RA = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 4.41 0. 0. 0. 0. - 0. -0.04 0. ) - - BODY705_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 4.25 0. 0. 0. 0. - 0. -0.02 0. ) - - BODY705_NUT_PREC_PM = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 1.15 -1.27 0. 0. 0. - 0. -0.09 0.15 ) - \begintext - - - - Cordelia - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY706_POLE_RA = ( 257.31 0. 0. ) - BODY706_POLE_DEC = ( -15.18 0. 0. ) - BODY706_PM = ( 127.69 -1074.5205730 0. ) - BODY706_LONG_AXIS = ( 0. ) - - BODY706_NUT_PREC_RA = ( -0.15 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY706_NUT_PREC_DEC = ( 0.14 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY706_NUT_PREC_PM = ( -0.04 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - \begintext - - - - Ophelia - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY707_POLE_RA = ( 257.31 0. 0. ) - BODY707_POLE_DEC = ( -15.18 0. 0. ) - BODY707_PM = ( 130.35 -956.4068150 0. ) - BODY707_LONG_AXIS = ( 0. ) - - BODY707_NUT_PREC_RA = ( 0. -0.09 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY707_NUT_PREC_DEC = ( 0. 0.09 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY707_NUT_PREC_PM = ( 0. -0.03 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - \begintext - - - - Bianca - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY708_POLE_RA = ( 257.31 0. 0. ) - BODY708_POLE_DEC = ( -15.18 0. 0. ) - BODY708_PM = ( 105.46 -828.3914760 0. ) - BODY708_LONG_AXIS = ( 0. ) - - BODY708_NUT_PREC_RA = ( 0. 0. -0.16 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY708_NUT_PREC_DEC = ( 0. 0. 0.16 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY708_NUT_PREC_PM = ( 0. 0. -0.04 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - \begintext - - - - Cressida - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - - BODY709_POLE_RA = ( 257.31 0. 0. ) - BODY709_POLE_DEC = ( -15.18 0. 0. ) - BODY709_PM = ( 59.16 -776.5816320 0. ) - BODY709_LONG_AXIS = ( 0. ) - - - BODY709_NUT_PREC_RA = ( 0. 0. 0. -0.04 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - - BODY709_NUT_PREC_DEC = ( 0. 0. 0. 0.04 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - - BODY709_NUT_PREC_PM = ( 0. 0. 0. -0.01 0. - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - - \begintext - - - - Desdemona - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY710_POLE_RA = ( 257.31 0. 0. ) - BODY710_POLE_DEC = ( -15.18 0. 0. ) - BODY710_PM = ( 95.08 -760.0531690 0. ) - BODY710_LONG_AXIS = ( 0. ) - - BODY710_NUT_PREC_RA = ( 0. 0. 0. 0. -0.17 - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY710_NUT_PREC_DEC = ( 0. 0. 0. 0. 0.16 - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY710_NUT_PREC_PM = ( 0. 0. 0. 0. -0.04 - 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - \begintext - - - - Juliet - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY711_POLE_RA = ( 257.31 0. 0. ) - BODY711_POLE_DEC = ( -15.18 0. 0. ) - BODY711_PM = ( 302.56 -730.1253660 0. ) - BODY711_LONG_AXIS = ( 0. ) - - BODY711_NUT_PREC_RA = ( 0. 0. 0. 0. 0. - -0.06 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY711_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. - 0.06 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY711_NUT_PREC_PM = ( 0. 0. 0. 0. 0. - -0.02 0. 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - \begintext - - - - Portia - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY712_POLE_RA = ( 257.31 0. 0. ) - BODY712_POLE_DEC = ( -15.18 0. 0. ) - BODY712_PM = ( 25.03 -701.4865870 0. ) - BODY712_LONG_AXIS = ( 0. ) - - BODY712_NUT_PREC_RA = ( 0. 0. 0. 0. 0. - 0. -0.09 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY712_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. - 0. 0.09 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY712_NUT_PREC_PM = ( 0. 0. 0. 0. 0. - 0. -0.02 0. 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - \begintext - - - - Rosalind - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY713_POLE_RA = ( 257.31 0. 0. ) - BODY713_POLE_DEC = ( -15.18 0. 0. ) - BODY713_PM = ( 314.90 -644.6311260 0. ) - BODY713_LONG_AXIS = ( 0. ) - - BODY713_NUT_PREC_RA = ( 0. 0. 0. 0. 0. - 0. 0. -0.29 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY713_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. - 0. 0. 0.28 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY713_NUT_PREC_PM = ( 0. 0. 0. 0. 0. - 0. 0. -0.08 0. 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - \begintext - - - - Belinda - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY714_POLE_RA = ( 257.31 0. 0. ) - BODY714_POLE_DEC = ( -15.18 0. 0. ) - BODY714_PM = ( 297.46 -577.3628170 0. ) - BODY714_LONG_AXIS = ( 0. ) - - BODY714_NUT_PREC_RA = ( 0. 0. 0. 0. 0. - 0. 0. 0. -0.03 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY714_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0.03 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY714_NUT_PREC_PM = ( 0. 0. 0. 0. 0. - 0. 0. 0. -0.01 0. - 0. 0. 0. 0. 0. - 0. 0. 0. ) - \begintext - - - - Puck - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY715_POLE_RA = ( 257.31 0. 0. ) - BODY715_POLE_DEC = ( -15.18 0. 0. ) - BODY715_PM = ( 91.24 -472.5450690 0. ) - BODY715_LONG_AXIS = ( 0. ) - - BODY715_NUT_PREC_RA = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. -0.33 - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY715_NUT_PREC_DEC = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. 0.31 - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - BODY715_NUT_PREC_PM = ( 0. 0. 0. 0. 0. - 0. 0. 0. 0. -0.09 - 0. 0. 0. 0. 0. - 0. 0. 0. ) - - \begintext - - - - -Satellites of Neptune - - - Triton - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY801_POLE_RA = ( 299.36 0. 0. ) - BODY801_POLE_DEC = ( 41.17 0. 0. ) - BODY801_PM = ( 296.53 -61.2572637 0. ) - BODY801_LONG_AXIS = ( 0. ) - - - BODY801_NUT_PREC_RA = ( 0. 0. 0. 0. - 0. 0. 0. -32.35 - 0. -6.28 -2.08 -0.74 - -0.28 -0.11 -0.07 -0.02 - -0.01 ) - - - BODY801_NUT_PREC_DEC = ( 0. 0. 0. 0. - 0. 0. 0. 22.55 - 0. 2.10 0.55 0.16 - 0.05 0.02 0.01 0. - 0. ) - - - BODY801_NUT_PREC_PM = ( 0. 0. 0. 0. - 0. 0. 0. 22.25 - 0. 6.73 2.05 0.74 - 0.28 0.11 0.05 0.02 - 0.01 ) - - \begintext - - - - - Nereid - - Old values: - - Values are from the 1988 IAU report. Note that this - rotation model pre-dated the 1989 Voyager 2 Neptune - encounter. - - - body802_pole_ra = ( 273.48 0. 0. ) - body802_pole_dec = ( 67.22 0. 0. ) - body802_pm = ( 237.22 0.9996465 0. ) - body802_long_axis = ( 0. ) - - - The report seems to have a typo: in the nut_prec_ra expression, - where the report gives -0.51 sin 3N3, we use -0.51 3N2. - - body802_nut_prec_ra = ( 0. -17.81 - 0. 0. 0. 0. - 0. 0. 0. - 2.56 -0.51 0.11 -0.03 ) - - body802_nut_prec_dec = ( 0. -6.67 - 0. 0. 0. 0. - 0. 0. 0. - 0.47 -0.07 0.01 ) - - body802_nut_prec_pm = ( 0. 16.48 - 0. 0. 0. 0. - 0. 0. 0. - -2.57 0.51 -0.11 0.02 ) - - - - Current values: - - The 2000 report [2] states that values for Nereid are not - given because Nereid is not in synchronous rotation with Neptune - (note (j), p.99). - - - - Naiad - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - - \begindata - - BODY803_POLE_RA = ( 299.36 0. 0. ) - BODY803_POLE_DEC = ( 43.36 0. 0. ) - BODY803_PM = ( 254.06 +1222.8441209 0. ) - BODY803_LONG_AXIS = ( 0. ) - - - BODY803_NUT_PREC_RA = ( 0.70 -6.49 0. 0. - 0. 0. 0. 0. - 0.25 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - BODY803_NUT_PREC_DEC = ( -0.51 -4.75 0. 0. - 0. 0. 0. 0. - 0.09 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - BODY803_NUT_PREC_PM = ( -0.48 4.40 0. 0. - 0. 0. 0. 0. - -0.27 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - \begintext - - - - - Thalassa - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY804_POLE_RA = ( 299.36 0. 0. ) - BODY804_POLE_DEC = ( 43.45 0. 0. ) - BODY804_PM = ( 102.06 1155.7555612 0. ) - BODY804_LONG_AXIS = ( 0. ) - - - BODY804_NUT_PREC_RA = ( 0.70 0. -0.28 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - - BODY804_NUT_PREC_DEC = ( -0.51 0. -0.21 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - BODY804_NUT_PREC_PM = ( -0.48 0. 0.19 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - \begintext - - - - Despina - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - - \begindata - - BODY805_POLE_RA = ( 299.36 0. 0. ) - BODY805_POLE_DEC = ( 43.45 0. 0. ) - BODY805_PM = ( 306.51 +1075.7341562 0. ) - BODY805_LONG_AXIS = ( 0. ) - - - BODY805_NUT_PREC_RA = ( 0.70 0. 0. -0.09 - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - BODY805_NUT_PREC_DEC = ( -0.51 0. 0. -0.07 - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - BODY805_NUT_PREC_PM = ( -0.49 0. 0. 0.06 - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - \begintext - - - - Galatea - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - - \begindata - - BODY806_POLE_RA = ( 299.36 0. 0. ) - BODY806_POLE_DEC = ( 43.43 0. 0. ) - BODY806_PM = ( 258.09 839.6597686 0. ) - BODY806_LONG_AXIS = ( 0. ) - - - BODY806_NUT_PREC_RA = ( 0.70 0. 0. 0. - -0.07 0. 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - BODY806_NUT_PREC_DEC = ( -0.51 0. 0. 0. - -0.05 0. 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - BODY806_NUT_PREC_PM = ( -0.48 0. 0. 0. - 0.05 0. 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - \begintext - - - Larissa - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY807_POLE_RA = ( 299.36 0. 0. ) - BODY807_POLE_DEC = ( 43.41 0. 0. ) - BODY807_PM = ( 179.41 +649.0534470 0. ) - BODY807_LONG_AXIS = ( 0. ) - - - BODY807_NUT_PREC_RA = ( 0.70 0. 0. 0. - 0. -0.27 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - BODY807_NUT_PREC_DEC = ( -0.51 0. 0. 0. - 0. -0.20 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - BODY807_NUT_PREC_PM = ( -0.48 0. 0. 0. - 0. 0.19 0. 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - \begintext - - - - Proteus - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY808_POLE_RA = ( 299.27 0. 0. ) - BODY808_POLE_DEC = ( 42.91 0. 0. ) - BODY808_PM = ( 93.38 +320.7654228 0. ) - BODY808_LONG_AXIS = ( 0. ) - - - BODY808_NUT_PREC_RA = ( 0.70 0. 0. 0. - 0. 0. -0.05 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - BODY808_NUT_PREC_DEC = ( -0.51 0. 0. 0. - 0. 0. -0.04 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - BODY808_NUT_PREC_PM = ( -0.48 0. 0. 0. - 0. 0. 0.04 0. - 0. 0. 0. 0. - 0. 0. 0. 0. - 0. ) - - \begintext - - - - - -Satellites of Pluto - - Charon - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY901_POLE_RA = ( 313.02 0. 0. ) - BODY901_POLE_DEC = ( 9.09 0. 0. ) - BODY901_PM = ( 56.77 -56.3623195 0. ) - BODY901_LONG_AXIS = ( 0. ) - - \begintext - - - -Orientation constants for Asteroids Gaspra, Ida, Vesta, and Eros --------------------------------------------------------- - - -Gaspra - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY9511010_POLE_RA = ( 9.47 0. 0. ) - BODY9511010_POLE_DEC = ( 26.70 0. 0. ) - BODY9511010_PM = ( 83.67 1226.9114850 0. ) - BODY9511010_LONG_AXIS = ( 0. ) - - \begintext - - -Ida - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY2431010_POLE_RA = ( 348.76 0. 0. ) - BODY2431010_POLE_DEC = ( 87.12 0. 0. ) - BODY2431010_PM = ( 265.95 -1864.6280070 0. ) - BODY2431010_LONG_AXIS = ( 0. ) - - \begintext - - -Vesta - - Current values: - - \begindata - - BODY2000004_POLE_RA = ( 301. 0. 0. ) - BODY2000004_POLE_DEC = ( 41. 0. 0. ) - BODY2000004_PM = ( 292. 1617.332776 0. ) - BODY2000004_LONG_AXIS = ( 0. ) - - \begintext - - -Eros - - Current values: - - \begindata - - BODY2000433_POLE_RA = ( 11.35 0. 0. ) - BODY2000433_POLE_DEC = ( 17.22 0. 0. ) - BODY2000433_PM = ( 326.07 1639.38864745 0. ) - BODY2000433_LONG_AXIS = ( 0. ) - - \begintext - - - - -Radii of Sun and Planets --------------------------------------------------------- - - -Sun - - Value for the Sun is from the [7], page K7. - - \begindata - - BODY10_RADII = ( 696000. 696000. 696000. ) - - \begintext - - -Mercury - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY199_RADII = ( 2439.7 2439.7 2439.7 ) - - \begintext - - -Venus - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY299_RADII = ( 6051.8 6051.8 6051.8 ) - - \begintext - - -Earth - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY399_RADII = ( 6378.14 6378.14 6356.75 ) - - \begintext - - -Mars - - - Old values: - - body499_radii = ( 3397. 3397. 3375. ) - - Current values: - - - The IAU report gives separate values for the north and south - polar radii: - - north: 3373.19 - south: 3379.21 - - We use the average of these values as the polar radius for - the triaxial model. - - \begindata - - BODY499_RADII = ( 3396.19 3396.19 3376.20 ) - - \begintext - - - -Jupiter - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY599_RADII = ( 71492 71492 66854 ) - - \begintext - - - -Saturn - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY699_RADII = ( 60268 60268 54364 ) - - \begintext - - - -Uranus - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY799_RADII = ( 25559 25559 24973 ) - - \begintext - - - -Neptune - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - (Values are for the 1 bar pressure level.) - - \begindata - - BODY899_RADII = ( 24764 24764 24341 ) - - \begintext - - - -Pluto - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY999_RADII = ( 1195 1195 1195 ) - - \begintext - - - - -Radii of Satellites --------------------------------------------------------- - - -Moon - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY301_RADII = ( 1737.4 1737.4 1737.4 ) - - \begintext - - - -Satellites of Mars - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY401_RADII = ( 13.4 11.2 9.2 ) - BODY402_RADII = ( 7.5 6.1 5.2 ) - - \begintext - - - -Satellites of Jupiter - - Old values: - - Old values for Io, Europa, Ganymede, Callisto and Amalthea. - These are from the 1997 IAU report. - - body501_radii = ( 1826. 1815. 1812. ) - body502_radii = ( 1562. 1560. 1559. ) - body503_radii = ( 2635. 2633. 2633. ) - body504_radii = ( 2409. 2409. 2409. ) - body505_radii = ( 131. 73. 67. ) - body506_radii = ( 85 85 85 ) - body507_radii = ( 40 40 40 ) - body508_radii = ( 18 18 18 ) - body509_radii = ( 14 14 14 ) - body510_radii = ( 12 12 12 ) - body511_radii = ( 15 15 15 ) - body512_radii = ( 10 10 10 ) - body513_radii = ( 5 5 5 ) - body514_radii = ( 50 50 50 ) - body515_radii = ( 13 10 8 ) - body516_radii = ( 20 20 20 ) - - - Current values: - - \begindata - - BODY501_RADII = ( 1829.4 1819.3 1815.7 ) - BODY502_RADII = ( 1564.13 1561.23 1560.93 ) - BODY503_RADII = ( 2632.4 2632.29 2632.35 ) - BODY504_RADII = ( 2409.4 2409.2 2409.3 ) - BODY505_RADII = ( 125 73 64 ) - - \begintext - - Only mean radii are available in the 2000 IAU report for bodies - 506-513. - - \begindata - - BODY506_RADII = ( 85 85 85 ) - BODY507_RADII = ( 40 40 40 ) - BODY508_RADII = ( 18 18 18 ) - BODY509_RADII = ( 14 14 14 ) - BODY510_RADII = ( 12 12 12 ) - BODY511_RADII = ( 15 15 15 ) - BODY512_RADII = ( 10 10 10 ) - BODY513_RADII = ( 5 5 5 ) - BODY514_RADII = ( 58 49 42 ) - BODY515_RADII = ( 10 8 7 ) - - \begintext - - The value for the second radius for body 516 is not given in - 2000 IAU report. The values given are: - - BODY516_RADII = ( 30 --- 20 ) - - For use within the SPICE system, we use only the mean radius. - \begindata - - BODY516_RADII = ( 21.5 21.5 21.5 ) - - \begintext - - - -Satellites of Saturn - - - Old values: - - body601_radii = ( 210.3 197.4 192.6 ) - body602_radii = ( 256.2 247.3 244.0 ) - body603_radii = ( 535.6 528.2 525.8 ) - body604_radii = ( 560. 560. 560. ) - body605_radii = ( 764. 764. 764. ) - body606_radii = ( 2575. 2575. 2575. ) - body607_radii = ( 180. 140. 112.5 ) - body608_radii = ( 718. 718. 718. ) - body609_radii = ( 115. 110. 105. ) - body610_radii = ( 97. 95. 77. ) - body611_radii = ( 69. 55. 55. ) - body612_radii = ( 16 16 16 ) - body613_radii = ( 15 12.5 7.5 ) - body614_radii = ( 15 8 8 ) - body615_radii = ( 18.5 17.2 13.5 ) - body616_radii = ( 74 50 34 ) - body617_radii = ( 55 44 31 ) - body618_radii = ( 10 10 10 ) - - - Current values: - - \begindata - - BODY601_RADII = ( 209.1 196.2 191.4 ) - BODY602_RADII = ( 256.3 247.3 244.6 ) - BODY603_RADII = ( 535.6 528.2 525.8 ) - BODY604_RADII = ( 560 560 560 ) - BODY605_RADII = ( 764 764 764 ) - BODY606_RADII = ( 2575 2575 2575 ) - BODY607_RADII = ( 164 130 107 ) - BODY608_RADII = ( 718 718 718 ) - BODY609_RADII = ( 115 110 105 ) - BODY610_RADII = ( 97.0 95.0 77.0 ) - BODY611_RADII = ( 69.0 55.0 55.0 ) - - \begintext - - Only the first equatorial radius for Helene (body 612) is given in the - 2000 IAU report: - - BODY612_RADII = ( 17.5 --- --- ) - - The mean radius is 16km; we use this radius for all three axes, as - we do for the satellites for which only the mean radius is available. - - - \begindata - - BODY612_RADII = ( 16 16 16 ) - BODY613_RADII = ( 15 12.5 7.5 ) - BODY614_RADII = ( 15.0 8.0 8.0 ) - BODY615_RADII = ( 18.5 17.2 13.5 ) - BODY616_RADII = ( 74.0 50.0 34.0 ) - BODY617_RADII = ( 55.0 44.0 31.0 ) - - \begintext - - - For Pan, only a mean radius is given in the 2000 report. - - \begindata - - BODY618_RADII = ( 10 10 10 ) - - \begintext - - - -Satellites of Uranus - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY701_RADII = ( 581.1 577.9 577.7 ) - BODY702_RADII = ( 584.7 584.7 584.7 ) - BODY703_RADII = ( 788.9 788.9 788.9 ) - BODY704_RADII = ( 761.4 761.4 761.4 ) - BODY705_RADII = ( 240.4 234.2 232.9 ) - - \begintext - - The 2000 report gives only mean radii for satellites 706--715. - - \begindata - - BODY706_RADII = ( 13 13 13 ) - BODY707_RADII = ( 15 15 15 ) - BODY708_RADII = ( 21 21 21 ) - BODY709_RADII = ( 31 31 31 ) - BODY710_RADII = ( 27 27 27 ) - BODY711_RADII = ( 42 42 42 ) - BODY712_RADII = ( 54 54 54 ) - BODY713_RADII = ( 27 27 27 ) - BODY714_RADII = ( 33 33 33 ) - BODY715_RADII = ( 77 77 77 ) - - \begintext - - - - -Satellites of Neptune - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - The 2000 report gives mean radii only for bodies 801-806. - - \begindata - - BODY801_RADII = ( 1352.6 1352.6 1352.6 ) - BODY802_RADII = ( 170 170 170 ) - BODY803_RADII = ( 29 29 29 ) - BODY804_RADII = ( 40 40 40 ) - BODY805_RADII = ( 74 74 74 ) - BODY806_RADII = ( 79 79 79 ) - - \begintext - - - The second equatorial radius for Larissa is not given in the 2000 - report. The available values are: - - BODY807_RADII = ( 104 --- 89 ) - - For use within the SPICE system, we use only the mean radius. - \begindata - - BODY807_RADII = ( 96 96 96 ) - BODY808_RADII = ( 218 208 201 ) - - \begintext - - - - -Satellites of Pluto - - - Old values: - - Values are unchanged in the 2000 IAU report. - - Current values: - - \begindata - - BODY901_RADII = ( 593 593 593 ) - - \begintext - - - -Radii of Selected Asteroids --------------------------------------------------------- - - -Gaspra - - - Current values: - - - \begindata - - BODY9511010_RADII = ( 9.1 5.2 4.4 ) - - \begintext - - - - -Ida - - - Current values: - - - \begindata - - BODY2431010_RADII = ( 26.8 12.0 7.6 ) - - \begintext - - - - -Kleopatra - - - Current values: - - - \begindata - - BODY2000216_RADII = ( 108.5 47 40.5 ) - - \begintext - - - -Eros - - Current values: - - - \begindata - - BODY2000433_RADII = ( 7.311 7.311 7.311 ) - - \begintext - - -=========================================================================== -End of file pck00008.tpc -=========================================================================== - - - diff --git a/tests/spiceypy/rotations.py b/tests/spiceypy/rotations.py deleted file mode 100644 index b5bb0285..00000000 --- a/tests/spiceypy/rotations.py +++ /dev/null @@ -1,24 +0,0 @@ -import spiceypy as sp - -sp.furnsh("de438s.bsp") -sp.furnsh("naif0012.tls") -sp.furnsh("pck00008.tpc") - -et = sp.utc2et("2022-11-30 12:00:00") - -moon_iau_earth = sp.spkpos("moon", et, "iau_earth", "none", "earth")[0] -moon_eme2k = sp.spkpos("moon", et, "j2000", "none", "earth")[0] - -print(f"moon_iau_earth = {moon_iau_earth}\nmoon_eme2k = {moon_eme2k}") - - -def sxform_val(inf, outf, et): - print(f"\n{inf} -> {outf}") - print(sp.sxform(inf, outf, et)) - - -sxform_val("iau_earth", "j2000", et) -sxform_val("j2000", "iau_earth", et) - -sxform_val("iau_earth", "iau_mars", et) -sxform_val("iau_mars", "iau_earth", et) diff --git a/tests/spiceypy/sc_query.py b/tests/spiceypy/sc_query.py deleted file mode 100644 index cefa0b01..00000000 --- a/tests/spiceypy/sc_query.py +++ /dev/null @@ -1,35 +0,0 @@ -import spiceypy as sp - -sp.furnsh("de438s.bsp") -sp.furnsh("naif0012.tls") -sp.furnsh("pck00008.tpc") -sp.furnsh("mysc-Moon-J2k.bsp") -# sp.furnsh('mysc-EME2k.bsp') - - -def print_state(epoch): - et = sp.utc2et(epoch) - print() - print(epoch, et) - sc_from_moon = sp.spkez(-10003001, et, "j2000", "none", 301)[0] - print("Moon J2000", sc_from_moon) - sc_from_earth = sp.spkez(-10003001, et, "j2000", "none", 399)[0] - print("EME2000", sc_from_earth) - moon_from_earth = sp.spkez(301, et, "j2000", "none", 399)[0] - print("Moon from Earth:", moon_from_earth) - moon_from_emb = sp.spkez(301, et, "j2000", "none", 3)[0] - print("Moon from EMB:", moon_from_emb) - earth_from_emb = sp.spkez(399, et, "j2000", "none", 3)[0] - print("Earth from EMB:", earth_from_emb) - sum = -earth_from_emb + moon_from_emb + sc_from_moon - print("Sum: -earth_from_emb + moon_from_emb + sc_from_moon\n\t", sum) - print("Delta:", sum - sc_from_earth) - - -almost_epoch = "29 Nov 2022 06:47:05.000" -# GMAT state: 29 Nov 2022 06:47:28.000,-274550.832878,197503.896653,120515.732759,7.207074,-2.499496,-2.009755 -print_state(almost_epoch) - -almost_epoch = "2022-12-04 11:59:51.884" -# GMAT state: 04 Dec 2022 12:00:28.884,482.6690997,-1202.72242593,1766.54770503,0.575668890281,-0.97502959975,-1.95884508326 -print_state(almost_epoch) From 0125897cd17e009d23cbe012b68e42903adddf93 Mon Sep 17 00:00:00 2001 From: Christopher Rabotin Date: Sun, 14 May 2023 20:08:13 -0600 Subject: [PATCH 5/5] Fix Python constructor Signed-off-by: Christopher Rabotin --- .github/workflows/tests.yaml | 2 +- src/od/noise/gauss_markov.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 5e9a7caf..3db56a8d 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -136,7 +136,7 @@ jobs: run: | cargo test --lib grcov . --binary-path ./target/debug/ -t lcov -s . > lcov-lib.txt - cargo test cosmic mission_design orbit_determination propulsion test_monte_carlo_epoch + cargo test -- cosmic mission_design orbit_determination propulsion test_monte_carlo_epoch grcov . --binary-path ./target/debug/ -t lcov -s . > lcov-integ.txt - name: Upload coverage report diff --git a/src/od/noise/gauss_markov.rs b/src/od/noise/gauss_markov.rs index afb84587..5eba137b 100644 --- a/src/od/noise/gauss_markov.rs +++ b/src/od/noise/gauss_markov.rs @@ -401,7 +401,7 @@ impl GaussMarkov { #[cfg(feature = "python")] #[classmethod] fn white(_cls: &PyType, sigma: f64) -> Result { - Self::white_noise(sigma) + Ok(Self::white_noise(sigma)) } }