sagittariusas 0.0.3

Simulation engine for Sagittarius A* — Kerr spacetime, accretion, jets, lensing, and shadow observables
Documentation
use sagittariusas::config::parameters::*;
use sagittariusas::engine::accretion_disk::{AccretionDisk, DiskModel};
use sagittariusas::observables::radiation::AccretionRadiation;
use sagittariusas::utils::math::log_range;
use std::f64::consts::PI;
use std::process;

fn main() {
    let mdot = 1e-9 * SOLAR_MASS / (365.25 * 86400.0);

    let ss = AccretionDisk::new(SGR_A_MASS, mdot);
    let adaf = AccretionDisk::new(SGR_A_MASS, mdot)
        .with_model(DiskModel::Adaf)
        .with_alpha(0.3);

    let radii = log_range(ss.inner_radius, ss.outer_radius, 200);

    let integrate_lum = |disk: &AccretionDisk| -> f64 {
        radii
            .windows(2)
            .map(|w| {
                let r = 0.5 * (w[0] + w[1]);
                let dr = w[1] - w[0];
                SIGMA_SB * disk.temperature_profile(r).powi(4) * 4.0 * PI * r * dr
            })
            .sum()
    };

    let lum_ss = integrate_lum(&ss);
    let lum_adaf = integrate_lum(&adaf);

    let accr = AccretionRadiation::new(SGR_A_MASS, mdot);
    let chandra_lum = 2e26_f64;

    let t_peak = ss
        .radial_profile(10)
        .iter()
        .map(|(_, t)| *t)
        .fold(0.0_f64, f64::max);

    let valid = accr.eddington_ratio() < 1.0
        && lum_ss / chandra_lum > 0.0
        && lum_adaf < lum_ss
        && t_peak > 0.0;

    process::exit(if valid { 0 } else { 1 });
}