diff --git a/src/dynamics/solarpressure.rs b/src/dynamics/solarpressure.rs index 5e8a4ae6..05139654 100644 --- a/src/dynamics/solarpressure.rs +++ b/src/dynamics/solarpressure.rs @@ -128,8 +128,8 @@ impl ForceModel for SolarPressure { let r_sun_unit = r_sun / r_sun.norm(); - // Compute the shaddowing factor. - let k: f64 = self + // ANISE returns the occultation percentage (or factor), which is the opposite as the illumination factor. + let occult = self .e_loc .compute(osc, almanac) .context(DynamicsAlmanacSnafu { @@ -137,6 +137,9 @@ impl ForceModel for SolarPressure { })? .factor(); + // Compute the illumination factor. + let k: f64 = (occult - 1.0).abs(); + let r_sun_au = r_sun.norm() / AU; // in N/(m^2) let flux_pressure = (k * self.phi / SPEED_OF_LIGHT_M_S) * (1.0 / r_sun_au).powi(2); @@ -163,8 +166,8 @@ impl ForceModel for SolarPressure { let r_sun_d: Vector3<OHyperdual<f64, Const<9>>> = hyperspace_from_vector(&r_sun); let r_sun_unit = r_sun_d / norm(&r_sun_d); - // Compute the shadowing factor. - let k: f64 = self + // ANISE returns the occultation percentage (or factor), which is the opposite as the illumination factor. + let occult = self .e_loc .compute(osc, almanac.clone()) .context(DynamicsAlmanacSnafu { @@ -172,6 +175,9 @@ impl ForceModel for SolarPressure { })? .factor(); + // Compute the illumination factor. + let k: f64 = (occult - 1.0).abs(); + let r_sun_au = norm(&r_sun_d) / AU; let inv_r_sun_au = OHyperdual::<f64, Const<9>>::from_real(1.0) / (r_sun_au); let inv_r_sun_au_p2 = inv_r_sun_au.powi(2); diff --git a/tests/mission_design/force_models.rs b/tests/mission_design/force_models.rs index ab3ddde6..e7735d06 100644 --- a/tests/mission_design/force_models.rs +++ b/tests/mission_design/force_models.rs @@ -67,8 +67,8 @@ fn srp_earth_full_vis(almanac: Arc<Almanac>) { err_r * 1e3, err_v * 1e3 ); - assert!(err_r < 5e-3, "position error too large for SRP"); - assert!(err_v < 1e-7, "velocity error too large for SRP"); + assert!(err_r < 5e-4, "position error too large for SRP"); + assert!(err_v < 9e-8, "velocity error too large for SRP"); } #[rstest] @@ -119,8 +119,8 @@ fn srp_earth_leo(almanac: Arc<Almanac>) { err_r * 1e3, err_v * 1e3 ); - assert!(err_r < 3e-1, "position error too large for SRP"); - assert!(err_v < 5e-4, "velocity error too large for SRP"); + assert!(err_r < 6e-3, "position error too large for SRP"); + assert!(err_v < 7e-6, "velocity error too large for SRP"); } #[rstest] @@ -173,8 +173,8 @@ fn srp_earth_meo_ecc_inc(almanac: Arc<Almanac>) { err_r * 1e3, err_v * 1e3 ); - assert!(err_r < 5e-2, "position error too large for SRP"); - assert!(err_v < 2e-5, "velocity error too large for SRP"); + assert!(err_r < 2e-3, "position error too large for SRP"); + assert!(err_v < 1e-6, "velocity error too large for SRP"); // Compare the case with the hyperdual EOMs (computation uses another part of the code) let mut prop = setup.with(sc.with_stm(), almanac);