bench: fix nbody bugs, r=burningtree.

This commit is contained in:
Graydon Hoare 2012-12-07 12:21:30 -08:00
parent bcde593d3a
commit b4401d12a7

View file

@ -24,10 +24,13 @@ fn main() {
args
};
let n = int::from_str(args[1]).get();
let bodies: ~[Body::props] = NBodySystem::make();
io::println(fmt!("%f", NBodySystem::energy(copy bodies)));
let mut bodies: ~[Body::props] = NBodySystem::make();
io::println(fmt!("%f", NBodySystem::energy(bodies)));
let mut i = 0;
while i < n { NBodySystem::advance(bodies, 0.01); i += 1; }
while i < n {
NBodySystem::advance(bodies, 0.01);
i += 1;
}
io::println(fmt!("%f", NBodySystem::energy(bodies)));
}
@ -35,8 +38,11 @@ mod NBodySystem {
#[legacy_exports];
fn make() -> ~[Body::props] {
let bodies: ~[Body::props] =
~[Body::sun(), Body::jupiter(), Body::saturn(), Body::uranus(),
let mut bodies: ~[Body::props] =
~[Body::sun(),
Body::jupiter(),
Body::saturn(),
Body::uranus(),
Body::neptune()];
let mut px = 0.0;
@ -53,26 +59,35 @@ mod NBodySystem {
}
// side-effecting
Body::offset_momentum(bodies[0], px, py, pz);
Body::offset_momentum(&mut bodies[0], px, py, pz);
return bodies;
}
fn advance(bodies: ~[Body::props], dt: float) {
fn advance(bodies: &mut [Body::props], dt: float) {
let mut i = 0;
while i < 5 {
let mut j = i + 1;
while j < 5 { advance_one(bodies[i], bodies[j], dt); j += 1; }
while j < 5 {
advance_one(&mut bodies[i],
&mut bodies[j], dt);
j += 1;
}
i += 1;
}
i = 0;
while i < 5 { move_(bodies[i], dt); i += 1; }
while i < 5 {
move_(&mut bodies[i], dt);
i += 1;
}
}
fn advance_one(bi: Body::props, bj: Body::props, dt: float) unsafe {
fn advance_one(bi: &mut Body::props,
bj: &mut Body::props,
dt: float) unsafe {
let dx = bi.x - bj.x;
let dy = bi.y - bj.y;
let dz = bi.z - bj.z;
@ -91,13 +106,13 @@ mod NBodySystem {
bj.vz += dz * bi.mass * mag;
}
fn move_(b: Body::props, dt: float) {
fn move_(b: &mut Body::props, dt: float) {
b.x += dt * b.vx;
b.y += dt * b.vy;
b.z += dt * b.vz;
}
fn energy(bodies: ~[Body::props]) -> float unsafe {
fn energy(bodies: &[Body::props]) -> float unsafe {
let mut dx;
let mut dy;
let mut dz;
@ -197,7 +212,8 @@ mod Body {
mass: SOLAR_MASS};
}
fn offset_momentum(props: Body::props, px: float, py: float, pz: float) {
fn offset_momentum(props: &mut Body::props,
px: float, py: float, pz: float) {
props.vx = -px / SOLAR_MASS;
props.vy = -py / SOLAR_MASS;
props.vz = -pz / SOLAR_MASS;