sagittariusas 0.0.3

Simulation engine for Sagittarius A* — Kerr spacetime, accretion, jets, lensing, and shadow observables
Documentation
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct AccretionDiskMaterial {
    pub inner_color: [f32; 3],
    pub outer_color: [f32; 3],
    pub peak_temperature_k: f32,
    pub opacity: f32,
    pub doppler_boost: f32,
}

impl AccretionDiskMaterial {
    pub fn hot_inner_disk() -> Self {
        Self {
            inner_color: [0.9, 0.95, 1.0],
            outer_color: [1.0, 0.6, 0.2],
            peak_temperature_k: 1e7,
            opacity: 0.8,
            doppler_boost: 1.0,
        }
    }

    pub fn outer_disk() -> Self {
        Self {
            inner_color: [1.0, 0.7, 0.3],
            outer_color: [0.8, 0.2, 0.05],
            peak_temperature_k: 1e4,
            opacity: 0.4,
            doppler_boost: 0.3,
        }
    }

    pub fn quiescent() -> Self {
        Self {
            inner_color: [0.5, 0.3, 0.15],
            outer_color: [0.2, 0.08, 0.02],
            peak_temperature_k: 5000.0,
            opacity: 0.15,
            doppler_boost: 0.05,
        }
    }

    pub fn temperature_at_radius(&self, r_over_isco: f32) -> f32 {
        self.peak_temperature_k * r_over_isco.powf(-0.75)
    }
}

#[derive(Debug, Clone, Copy, PartialEq)]
pub struct EventHorizonMaterial {
    pub shadow_color: [f32; 3],
    pub photon_ring_color: [f32; 3],
    pub photon_ring_intensity: f32,
}

impl EventHorizonMaterial {
    pub fn schwarzschild() -> Self {
        Self {
            shadow_color: [0.0, 0.0, 0.0],
            photon_ring_color: [1.0, 0.85, 0.6],
            photon_ring_intensity: 5.0,
        }
    }

    pub fn kerr_prograde() -> Self {
        Self {
            shadow_color: [0.0, 0.0, 0.0],
            photon_ring_color: [0.8, 0.9, 1.0],
            photon_ring_intensity: 8.0,
        }
    }
}