use glam::DMat3;
use crate::planet_config::PlanetConfig;
use crate::rotation_model::RotationModel;
use astrodyn_gravity::{GravityModel, GravitySource, SphericalHarmonicsData};
use astrodyn_quantities::aliases::{Position, Velocity};
use astrodyn_quantities::frame::RootInertial;
pub struct GravitySourceEntry {
pub source: GravitySource,
pub position: Position<RootInertial>,
pub velocity: Velocity<RootInertial>,
pub t_inertial_pfix: Option<DMat3>,
pub rotation_model: RotationModel,
pub delta_c20: f64,
pub tidal_config: Option<astrodyn_gravity::tides::TidalConfig>,
pub planet_omega: f64,
pub central: bool,
pub marker_only: bool,
}
impl GravitySourceEntry {
pub fn new(
source: GravitySource,
position: Position<RootInertial>,
t_inertial_pfix: Option<DMat3>,
) -> Self {
Self {
source,
position,
velocity: Velocity::<RootInertial>::zero(),
t_inertial_pfix,
rotation_model: RotationModel::None,
planet_omega: 0.0,
delta_c20: 0.0,
tidal_config: None,
central: false,
marker_only: false,
}
}
pub fn central_body(planet: &PlanetConfig) -> Self {
Self {
source: GravitySource {
mu: planet.shape.mu,
model: GravityModel::PointMass,
},
position: Position::<RootInertial>::zero(),
velocity: Velocity::<RootInertial>::zero(),
t_inertial_pfix: if planet.rotation_model != RotationModel::None {
Some(DMat3::IDENTITY)
} else {
None
},
rotation_model: planet.rotation_model,
planet_omega: planet.omega,
delta_c20: 0.0,
tidal_config: None,
central: true,
marker_only: false,
}
}
pub fn central_body_sh(planet: &PlanetConfig, sh_data: SphericalHarmonicsData) -> Self {
Self {
source: GravitySource {
mu: sh_data.mu,
model: GravityModel::SphericalHarmonics(Box::new(sh_data)),
},
position: Position::<RootInertial>::zero(),
velocity: Velocity::<RootInertial>::zero(),
t_inertial_pfix: if planet.rotation_model != RotationModel::None {
Some(DMat3::IDENTITY)
} else {
None
},
rotation_model: planet.rotation_model,
planet_omega: planet.omega,
delta_c20: 0.0,
tidal_config: None,
central: true,
marker_only: false,
}
}
pub fn third_body(planet: &PlanetConfig, position: Position<RootInertial>) -> Self {
Self {
source: GravitySource {
mu: planet.shape.mu,
model: GravityModel::PointMass,
},
position,
velocity: Velocity::<RootInertial>::zero(),
t_inertial_pfix: None,
rotation_model: RotationModel::None,
planet_omega: 0.0,
delta_c20: 0.0,
tidal_config: None,
central: false,
marker_only: false,
}
}
pub fn with_tidal(mut self, config: astrodyn_gravity::tides::TidalConfig) -> Self {
self.tidal_config = Some(config);
self
}
}