pub struct DiskStabilityIC {
pub disk_surface_density: Box<dyn Fn(f64) -> f64 + Send + Sync>,
pub disk_velocity_dispersion: Box<dyn Fn(f64) -> f64 + Send + Sync>,
pub bulge: Option<Box<dyn IsolatedEquilibrium>>,
pub halo_potential: Option<Box<dyn Fn([f64; 3]) -> f64 + Send + Sync>>,
pub perturbation_mode_m: u32,
pub perturbation_pattern_speed: f64,
pub perturbation_amplitude: f64,
}Expand description
Disk stability IC: f(E, Lz) for axisymmetric disk plus an optional perturbation.
Fields§
§disk_surface_density: Box<dyn Fn(f64) -> f64 + Send + Sync>Disk surface density Σ(R) as function of cylindrical radius.
disk_velocity_dispersion: Box<dyn Fn(f64) -> f64 + Send + Sync>Radial velocity dispersion σ_R(R).
bulge: Option<Box<dyn IsolatedEquilibrium>>Optional central bulge component.
halo_potential: Option<Box<dyn Fn([f64; 3]) -> f64 + Send + Sync>>Optional fixed dark matter halo potential Φ_halo(x).
perturbation_mode_m: u32Azimuthal mode number m (m=2 = bar, m=3 = triangle).
perturbation_pattern_speed: f64Pattern speed Ω_p in rad/time.
perturbation_amplitude: f64Relative amplitude δΣ/Σ.
Implementations§
Source§impl DiskStabilityIC
impl DiskStabilityIC
pub fn new( disk_surface_density: Box<dyn Fn(f64) -> f64 + Send + Sync>, disk_velocity_dispersion: Box<dyn Fn(f64) -> f64 + Send + Sync>, perturbation_mode_m: u32, perturbation_pattern_speed: f64, perturbation_amplitude: f64, ) -> Self
Sourcepub fn toomre_q(&self, radius: f64) -> f64
pub fn toomre_q(&self, radius: f64) -> f64
Toomre Q(R) = σ_R κ / (3.36 G Σ). Q > 1 means locally stable.
Computes the epicyclic frequency κ(R) = √(R dΩ²/dR + 4Ω²) from the combined disk+bulge+halo circular velocity curve.
Sourcepub fn sample_on_grid(&self, domain: &Domain) -> PhaseSpaceSnapshot
pub fn sample_on_grid(&self, domain: &Domain) -> PhaseSpaceSnapshot
Sample onto 6D grid: construct f(E, Lz) for disk using the Shu (1969) distribution function, then superpose an azimuthal perturbation mode.
Shu DF: f(E, L_z) = [Σ(R_c) Ω(R_c)] / [π κ(R_c) σ_R²(R_c)] × exp[-(E - E_c(L_z)) / σ_R²(R_c)]
for L_z > 0 (prograde orbits). f = 0 for retrograde (L_z ≤ 0).
The vertical structure uses a sech²(z/z_0) profile with z_0 = σ_z / √(4πGΣ), assuming σ_z ≈ σ_R (isotropic approximation).
Auto Trait Implementations§
impl Freeze for DiskStabilityIC
impl !RefUnwindSafe for DiskStabilityIC
impl !Send for DiskStabilityIC
impl !Sync for DiskStabilityIC
impl Unpin for DiskStabilityIC
impl UnsafeUnpin for DiskStabilityIC
impl !UnwindSafe for DiskStabilityIC
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more