use crate::consts::*;
use crate::events_log::event_source::EventSource;
use crate::events_log::accrete_event::AccreteEvents;
use crate::structs::planetesimal::Planetesimal;
use crate::structs::system::System;
use crate::utils::*;
use rand::{Rng, SeedableRng};
use rand_chacha::ChaCha8Rng;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct Accrete {
pub stellar_mass: f64,
pub dust_density_coeff: f64,
pub k: f64,
pub cloud_eccentricity: f64,
pub b: f64,
pub post_accretion_intensity: u32,
pub planet_a: f64,
pub planet_e: f64,
pub planet_mass: f64,
pub stellar_luminosity: f64,
pub events_log: AccreteEvents,
rng: ChaCha8Rng,
}
impl Default for Accrete {
fn default() -> Self {
let mut rng = ChaCha8Rng::from_seed(Default::default());
let random_stellar_mass = rng.gen_range(0.6..1.3);
let planet_a = rng.gen_range(0.3..50.0);
let planet_e = random_eccentricity(&mut rng);
let planet_mass = rng.gen_range(PROTOPLANET_MASS * EARTH_MASSES_PER_SOLAR_MASS..500.0)
/ EARTH_MASSES_PER_SOLAR_MASS;
Accrete {
stellar_mass: random_stellar_mass,
dust_density_coeff: DUST_DENSITY_COEFF,
k: K,
cloud_eccentricity: 0.2,
b: B,
post_accretion_intensity: 1000,
stellar_luminosity: 1.0,
planet_a,
planet_e,
planet_mass,
rng,
events_log: vec![],
}
}
}
impl Accrete {
pub fn new(seed: u64) -> Self {
let mut rng = ChaCha8Rng::seed_from_u64(seed);
let random_stellar_mass = rng.gen_range(0.6..1.3);
let planet_a = rng.gen_range(0.3..50.0);
let planet_e = random_eccentricity(&mut rng);
let planet_mass = rng.gen_range(PROTOPLANET_MASS * EARTH_MASSES_PER_SOLAR_MASS..500.0)
/ EARTH_MASSES_PER_SOLAR_MASS;
Accrete {
stellar_mass: random_stellar_mass,
dust_density_coeff: DUST_DENSITY_COEFF,
k: K,
cloud_eccentricity: 0.2,
b: B,
post_accretion_intensity: 1000,
stellar_luminosity: 1.0,
planet_a,
planet_e,
planet_mass,
rng,
events_log: vec![],
}
}
pub fn planetary_system(&mut self) -> System {
let Accrete {
stellar_mass,
dust_density_coeff,
k,
cloud_eccentricity,
b,
post_accretion_intensity,
rng,
events_log,
..
} = self;
let mut planetary_system = System::set_initial_conditions(
*stellar_mass,
*dust_density_coeff,
*k,
*cloud_eccentricity,
*b,
);
planetary_system.event("system_setup", events_log);
planetary_system.distribute_planetary_masses(rng, events_log);
planetary_system.post_accretion(*post_accretion_intensity, rng, events_log);
planetary_system.process_planets(rng);
planetary_system.event("planetary_environment_generated", events_log);
planetary_system.event("system_complete", events_log);
planetary_system
}
pub fn planet(&mut self) -> Planetesimal {
let Accrete {
stellar_mass,
stellar_luminosity,
planet_a,
planet_e,
planet_mass,
post_accretion_intensity,
rng,
events_log,
..
} = self;
Planetesimal::random_planet(
*stellar_luminosity,
*stellar_mass,
*planet_a,
*planet_e,
*planet_mass,
*post_accretion_intensity,
rng,
events_log,
)
}
}