Skip to content

Commit b4401d1

Browse files
committed
bench: fix nbody bugs, r=burningtree.
1 parent bcde593 commit b4401d1

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

src/test/bench/shootout-nbody.rs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,25 @@ fn main() {
2424
args
2525
};
2626
let n = int::from_str(args[1]).get();
27-
let bodies: ~[Body::props] = NBodySystem::make();
28-
io::println(fmt!("%f", NBodySystem::energy(copy bodies)));
27+
let mut bodies: ~[Body::props] = NBodySystem::make();
28+
io::println(fmt!("%f", NBodySystem::energy(bodies)));
2929
let mut i = 0;
30-
while i < n { NBodySystem::advance(bodies, 0.01); i += 1; }
30+
while i < n {
31+
NBodySystem::advance(bodies, 0.01);
32+
i += 1;
33+
}
3134
io::println(fmt!("%f", NBodySystem::energy(bodies)));
3235
}
3336

3437
mod NBodySystem {
3538
#[legacy_exports];
3639

3740
fn make() -> ~[Body::props] {
38-
let bodies: ~[Body::props] =
39-
~[Body::sun(), Body::jupiter(), Body::saturn(), Body::uranus(),
41+
let mut bodies: ~[Body::props] =
42+
~[Body::sun(),
43+
Body::jupiter(),
44+
Body::saturn(),
45+
Body::uranus(),
4046
Body::neptune()];
4147

4248
let mut px = 0.0;
@@ -53,26 +59,35 @@ mod NBodySystem {
5359
}
5460

5561
// side-effecting
56-
Body::offset_momentum(bodies[0], px, py, pz);
62+
Body::offset_momentum(&mut bodies[0], px, py, pz);
5763

5864
return bodies;
5965
}
6066

61-
fn advance(bodies: ~[Body::props], dt: float) {
67+
fn advance(bodies: &mut [Body::props], dt: float) {
6268

6369
let mut i = 0;
6470
while i < 5 {
6571
let mut j = i + 1;
66-
while j < 5 { advance_one(bodies[i], bodies[j], dt); j += 1; }
72+
while j < 5 {
73+
advance_one(&mut bodies[i],
74+
&mut bodies[j], dt);
75+
j += 1;
76+
}
6777

6878
i += 1;
6979
}
7080

7181
i = 0;
72-
while i < 5 { move_(bodies[i], dt); i += 1; }
82+
while i < 5 {
83+
move_(&mut bodies[i], dt);
84+
i += 1;
85+
}
7386
}
7487

75-
fn advance_one(bi: Body::props, bj: Body::props, dt: float) unsafe {
88+
fn advance_one(bi: &mut Body::props,
89+
bj: &mut Body::props,
90+
dt: float) unsafe {
7691
let dx = bi.x - bj.x;
7792
let dy = bi.y - bj.y;
7893
let dz = bi.z - bj.z;
@@ -91,13 +106,13 @@ mod NBodySystem {
91106
bj.vz += dz * bi.mass * mag;
92107
}
93108

94-
fn move_(b: Body::props, dt: float) {
109+
fn move_(b: &mut Body::props, dt: float) {
95110
b.x += dt * b.vx;
96111
b.y += dt * b.vy;
97112
b.z += dt * b.vz;
98113
}
99114

100-
fn energy(bodies: ~[Body::props]) -> float unsafe {
115+
fn energy(bodies: &[Body::props]) -> float unsafe {
101116
let mut dx;
102117
let mut dy;
103118
let mut dz;
@@ -197,7 +212,8 @@ mod Body {
197212
mass: SOLAR_MASS};
198213
}
199214

200-
fn offset_momentum(props: Body::props, px: float, py: float, pz: float) {
215+
fn offset_momentum(props: &mut Body::props,
216+
px: float, py: float, pz: float) {
201217
props.vx = -px / SOLAR_MASS;
202218
props.vy = -py / SOLAR_MASS;
203219
props.vz = -pz / SOLAR_MASS;

0 commit comments

Comments
 (0)