use std::process;
use planetsfactory::config::parameters::*;
use planetsfactory::engine::generator::{
SystemGeneratorConfig, generate_rogue_planets, generate_system,
};
use planetsfactory::engine::orbits::{OrbitalElements, elements_to_state};
use planetsfactory::observables::radial_velocity::rv_semi_amplitude;
use planetsfactory::observables::transits::transit_depth;
use planetsfactory::physics::atmospheres::Atmosphere;
use planetsfactory::physics::gravitation::PlanetaryGravity;
use planetsfactory::physics::interiors::PlanetaryInterior;
use planetsfactory::types::gas_giant::GasGiant;
use planetsfactory::types::ice_giant::IceGiant;
use planetsfactory::types::lava_world::LavaWorld;
use planetsfactory::types::ocean_world::OceanWorld;
use planetsfactory::types::rogue::RoguePlanet;
use planetsfactory::types::sub_neptune::SubNeptune;
use planetsfactory::types::super_earth::SuperEarth;
use planetsfactory::types::terrestrial::TerrestrialPlanet;
fn main() {
let orbit_1au = OrbitalElements::from_au_deg(1.0, 0.017, 0.0, 0.0, 0.0, 0.0);
let earth_like = TerrestrialPlanet::new(
"T1",
"Star",
EARTH_MASS,
EARTH_RADIUS,
1e-3,
0.4,
orbit_1au.clone(),
);
let jupiter_like = GasGiant::new(
"G1",
"Star",
JUPITER_MASS,
JUPITER_RADIUS,
1.5e-2,
0.05,
OrbitalElements::from_au_deg(5.2, 0.05, 1.3, 0.0, 0.0, 0.0),
);
let saturn_like = GasGiant::new(
"G2",
"Star",
5.683_4e26,
6.026_8e7,
1.63e-2,
0.47,
OrbitalElements::from_au_deg(9.5, 0.06, 2.5, 0.0, 0.0, 0.0),
)
.with_details(0.34, 6.63e7, 1.365e8, 0.45);
let uranus_like = IceGiant::new(
"I1",
"Star",
14.5 * EARTH_MASS,
2.556e7,
3.3e-3,
1.71,
OrbitalElements::from_au_deg(19.2, 0.05, 0.8, 0.0, 0.0, 0.0),
);
let neptune_like = IceGiant::new(
"I2",
"Star",
17.1 * EARTH_MASS,
2.476e7,
3.4e-3,
0.49,
OrbitalElements::from_au_deg(30.1, 0.01, 1.8, 0.0, 0.0, 0.0),
);
let super_e = SuperEarth::new(
"SE1",
"Star",
5.0 * EARTH_MASS,
radius_from_mass(5.0 * EARTH_MASS),
1e-3,
0.3,
OrbitalElements::from_au_deg(0.8, 0.03, 1.0, 0.0, 0.0, 0.0),
);
let sub_nep = SubNeptune::new(
"SN1",
"Star",
8.0 * EARTH_MASS,
radius_from_mass(8.0 * EARTH_MASS),
2e-3,
0.2,
OrbitalElements::from_au_deg(0.5, 0.02, 0.5, 0.0, 0.0, 0.0),
);
let lava = LavaWorld::new(
"LW1",
"Star",
2.0 * EARTH_MASS,
radius_from_mass(2.0 * EARTH_MASS),
1e-3,
0.0,
OrbitalElements::from_au_deg(0.02, 0.01, 0.0, 0.0, 0.0, 0.0),
);
let ocean = OceanWorld::new(
"OW1",
"Star",
3.0 * EARTH_MASS,
radius_from_mass(3.0 * EARTH_MASS),
1e-3,
0.3,
OrbitalElements::from_au_deg(1.2, 0.02, 0.5, 0.0, 0.0, 0.0),
);
let rogue = RoguePlanet::new("R1", EARTH_MASS, EARTH_RADIUS, 4.5e9 * YEAR);
let earth_grav = PlanetaryGravity::new(EARTH_MASS, EARTH_RADIUS);
let atm = Atmosphere::new(101325.0, 288.0, 4.81e-26, EARTH_MASS, EARTH_RADIUS);
let interior = PlanetaryInterior::new(EARTH_MASS, EARTH_RADIUS, 0.325, 12800.0, 4500.0);
let (pos, _vel) = elements_to_state(&orbit_1au, SOLAR_MASS + EARTH_MASS);
let r = (pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2]).sqrt();
let depth = transit_depth(JUPITER_RADIUS, SOLAR_RADIUS);
let rv = rv_semi_amplitude(
EARTH_MASS,
SOLAR_MASS,
AU,
0.017,
std::f64::consts::FRAC_PI_2,
);
let config = SystemGeneratorConfig::solar_like(6);
let generated = generate_system(&config);
let rogues = generate_rogue_planets(3, 42);
let types_ok = (earth_like.mass_earth() - 1.0).abs() < 0.01
&& earth_like.surface_gravity() > 9.0
&& earth_like.escape_velocity() > 1e4
&& earth_like.mean_density() > 5000.0
&& (jupiter_like.mass_jupiter() - 1.0).abs() < 0.01
&& jupiter_like.surface_gravity() > 20.0
&& saturn_like.ring_roche_limit(900.0) > 0.0
&& uranus_like.ice_mass_fraction > 0.5
&& neptune_like.wind_speed_estimate() > 200.0
&& super_e.mass_earth() > 4.0
&& sub_nep.envelope_mass() > 0.0
&& lava.dayside_temperature > 2000.0
&& ocean.water_mass() > 0.0
&& rogue.surface_temperature() > 0.0;
let physics_ok = earth_grav.sphere_of_influence(AU, SOLAR_MASS) > 0.0
&& atm.scale_height > 7000.0
&& atm.scale_height < 10000.0
&& interior.moment_of_inertia_factor() > 0.3
&& interior.moment_of_inertia_factor() < 0.4;
let obs_ok = depth > 0.0 && depth < 0.02 && rv > 0.0;
let gen_ok = generated.len() == 6 && rogues.len() == 3;
let orbit_ok = r > 1.4e11 && r < 1.6e11;
let all_ok = types_ok && physics_ok && obs_ok && gen_ok && orbit_ok;
if all_ok {
process::exit(0);
} else {
process::exit(1);
}
}