From b4401d12a7fe4af43698e8360cffce3f9cb4bc62 Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Fri, 7 Dec 2012 12:21:30 -0800 Subject: [PATCH] bench: fix nbody bugs, r=burningtree. --- src/test/bench/shootout-nbody.rs | 42 ++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/src/test/bench/shootout-nbody.rs b/src/test/bench/shootout-nbody.rs index 2e8dda511d05..bd535b128951 100644 --- a/src/test/bench/shootout-nbody.rs +++ b/src/test/bench/shootout-nbody.rs @@ -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;