#astrophysics #universe #physics #structure

宇宙学

一个处于早期开发阶段的crate,旨在提供宇宙学中常用的大量实用工具。

6 个版本

0.3.2 2022年11月17日
0.3.1 2022年11月15日
0.2.0 2022年10月24日
0.1.1 2022年6月6日

#243科学 类别中

MIT 许可证

5MB
10K SLoC

包含(Zip 文件,2.5MB)OneBox/OneBox.npz,(Zip 文件,2MB)OneBox.zip

cosmology:宇宙学的Rust crate

一个旨在最终包含宇宙学中常用的大量实用工具的早期开发crate,包括

当前功能

  • 解弗里德曼方程以获取给定宇宙学随时间变化的尺度因子。
    • 即时:提供一些 dt 并使用 step_forward(dt) 进行步骤。在与其他算法(例如nbody或流体代码)一起使用时非常有用,其中时间步长事先未知。
    • 预先:提供一些 dt 间隔和一个最终时间或尺度因子,并获取 Box<[T]> 时间序列 adadt。当在事先已知的时间网格上评估时非常有用。

计划功能

  • 使用(Eisenstein & Hu '98)的传递函数计算功率谱 P(k) 和相关函数 ξ(r)
  • 宇宙学初始条件生成器。
  • 对物质及其追踪器(例如,晕、星系)的kNN分布的线性理论预测。

示例用法

use cosmology::scale_factor::{CosmologicalParameters, ScaleFactor, LITTLE_H_TO_BIG_H};

// Specify cosmological parameters
let params = CosmologicalParameters {
    omega_m0: 1.0,
    omega_de0: 0.0,
    omega_r0: 0.0,
    omega_k0: 0.0,
    w: 1.0,
    h: 0.7,
};

// Specify initial redshift
let z0 = 9.0;
let a0 = 1.0 / (1.0 + z0);

// Specify max dloga
let max_dloga = 0.01;

// Expectation (analytic solution of the Friedmann equation)
// For a matter dominated universe, this is a(t) = (t / (2/3/H0))^(2/3)
let hubble = 0.7 * LITTLE_H_TO_BIG_H;
let age_of_universe = 2.0 / 3.0 / hubble;
let expected = |t: f64| (t / age_of_universe).powf(2.0 / 3.0);

// Initialize ScaleFactor
let mut scale_factor = ScaleFactor::new(
    params,
    z0,
    max_dloga,
    // Obtained via inverting the expected relationship
    Some(age_of_universe * a0.powf(3.0 / 2.0)),
);

// On-the-fly
// Initialize vectors which collect values
let mut a = vec![scale_factor.get_a()];
let mut dadt = vec![scale_factor.get_dadt()];
let mut t = vec![scale_factor.get_time()];
let dt = 100.0;
let mut a_expected = vec![scale_factor.get_a()];

while a.last().unwrap() < &1.0 {
    // Evolve scale factor
    scale_factor.step_forward(dt);

    // Add (t, a) to vec
    t.push(scale_factor.get_time());
    a.push(scale_factor.get_a());
    dadt.push(scale_factor.get_dadt());

    // Here you can do something that requires a, dadt, at your specified time t.
    // do_something(&a, &dadt);

    // Calculate expected value
    a_expected.push(expected(*t.last().unwrap()));
}

// Calculate the avg of L1 loss between the calculated values and the expected values
let avg_diff = a
    .iter()
    .zip(a_expected)
    .map(|(&actual, expected)| (actual - expected).abs())
    .sum::<f64>()
    / a.len() as f64;

// If --nocapture, print value
println!("avg_diff for matter-only universe {avg_diff:.2e}");

// Check that the avg of the L1 loss between the calculated values and the expected values
// is under this threshold
const ERROR_TOLERANCE: f64 = 1e-10;
assert!(avg_diff < ERROR_TOLERANCE);

关于作者

我在许多事情上都有所研究,包括非平衡流体动力学、宇宙学(大尺度结构和标量场暗物质)、机器学习、分布式系统、智能合约、(金融)衍生品。我是一个Rust的狂热者,并且惊讶地发现天文物理学/宇宙学crate空间中有一个空白。这是我期待开发的crate。

我开始寻找这样的crate是因为我需要解决我一直在工作的宇宙学标量场求解器的弗里德曼方程。我没有找到这样的crate。因此,我在这里建立它。目前处于非常早期阶段,但我非常期待随着时间的推移添加功能。请随意提交PR或建议新功能。

依赖项

~10–22MB
~289K SLoC