#重力 #引力 #静电

nbody_barnes_hut

以 O(nlogn) 的时间复杂度促进 2D/3D n-body 模拟

1 个不稳定版本

0.1.0 2020 年 8 月 30 日

#286模拟

MIT 许可证

27KB
700

nbody_barnes_hut

nbody_barnes_hut 旨在在 O(nlogn) 时间内促进 N-body 系统的模拟。这适用于许多应用:常见的是引力模拟和静电模拟。支持 2D 和 3D 模拟。


lib.rs:

Nbody barnes hut

nbody_barnes_hut 旨在在 O(nlogn) 时间内促进 N-body 系统的模拟。这适用于许多应用:常见的是引力模拟和静电模拟。支持 2D 和 3D 模拟。

此 crate 不是多线程的。相反,可以在多线程循环中调用 calc_forces_on_particle(例如,使用 rayon)。创建树的时间与计算力的时间相比可以忽略不计。

示例

以下是一个基本的 3D 引力模拟器


use rand::Rng;
use nbody_barnes_hut::particle_3d::Particle3D;
use nbody_barnes_hut::vector_3d::Vector3D;
use nbody_barnes_hut::barnes_hut_3d::OctTree;

const G: f64 = 6.67E-11; // Newton's Gravitational Constant

// Create 10 000 random points
let mut rng = rand::thread_rng();
let points: Vec<Particle3D> = (0..10_000)
    .map(|_| {
        let pos = Vector3D::new(
            rng.gen_range(-1000.0, 1000.0),
            rng.gen_range(-1000.0, 1000.0),
            rng.gen_range(-1000.0, 1000.0),
        );
        Particle3D::new(pos, 30.0)
    })
    .collect();

// This is pretty hacky
let points_ref = &points.iter().collect::<Vec<&Particle3D>>()[..];

let tree = OctTree::new(points_ref, 0.5);

for p in &points {
    // Do something with this value
    let acceleration_on_particle = tree.calc_forces_on_particle(
        p.position,
        (),
        |d_squared, mass, dis_vec, _| {
            // dis_vec is not normalized, so we have to normalize it here
            G * mass * dis_vec / (d_squared * d_squared.sqrt())
        },
    );
}

无运行时依赖项