particular 0.7.0

N-body simulation library written in Rust featuring BarnesHut and GPU accelerated algorithms.
Documentation
@group(0) @binding(0) var<storage, read> particles: array<PointMass>;
@group(0) @binding(1) var<storage, read> massive_particles: array<PointMass>;
@group(0) @binding(2) var<storage, read_write> accelerations: array<Vector>;

var<push_constant> softening_squared: f32;
var<workgroup> shared_particles: array<PointMass, #WORKGROUP_SIZE>;

@compute @workgroup_size(#WORKGROUP_SIZE, 1, 1)
fn main(@builtin(global_invocation_id) global_invocation_id: vec3<u32>, @builtin(local_invocation_id) local_invocation_id: vec3<u32>) {
    let massive_len = arrayLength(&massive_particles);
    let global_id = global_invocation_id.x;
    let local_id = local_invocation_id.x;

    let p1 = particles[global_id];
    var acceleration = Vector(0.0);

    for (var i = 0u; i < massive_len; i += #WORKGROUP_SIZE) {
        shared_particles[local_id] = massive_particles[i + local_id];

        workgroupBarrier();

        for (var j = 0u; j < #WORKGROUP_SIZE; j++) {
            let p2 = shared_particles[j];

            particle_acceleration(p1, p2, softening_squared, &acceleration);
        }
        
        workgroupBarrier();
    }

    accelerations[global_id] = acceleration;
}