Skip to content

Commit 1c1c672

Browse files
lkupergraydon
authored andcommitted
Updates to the nbody demo.
1 parent 7571935 commit 1c1c672

File tree

1 file changed

+47
-38
lines changed

1 file changed

+47
-38
lines changed

src/test/bench/shootout/nbody.rs

+47-38
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
fn main() {
66

7+
log "foo";
8+
79
let vec[int] inputs = vec(
810
50000
911
//these segfault :(
@@ -56,7 +58,9 @@ mod NBodySystem {
5658
py += body.vy * body.mass;
5759
pz += body.vz * body.mass;
5860
}
59-
bodies.(0) = Body.offsetMomentum(bodies.(0), px, py, pz);
61+
62+
// side-effecting
63+
Body.offsetMomentum(bodies.(0), px, py, pz);
6064

6165
ret bodies;
6266
}
@@ -76,6 +80,14 @@ mod NBodySystem {
7680
let float distance;
7781
rustrt.squareroot(dSquared, distance);
7882
let float mag = dt / (dSquared * distance);
83+
84+
iBody.vx -= dx * jbody.mass * mag;
85+
iBody.vy -= dy * jbody.mass * mag;
86+
iBody.vz -= dz * jbody.mass * mag;
87+
88+
jbody.vx += dx * iBody.mass * mag;
89+
jbody.vy += dy * iBody.mass * mag;
90+
jbody.vz += dz * iBody.mass * mag;
7991
}
8092
}
8193

@@ -125,8 +137,8 @@ mod NBodySystem {
125137

126138
mod Body {
127139

128-
const float PI = 3.141592;
129-
const float SOLAR_MASS = 39.478417; // was 4 * PI * PI originally
140+
const float PI = 3.14;
141+
const float SOLAR_MASS = 39.47; // was 4 * PI * PI originally
130142
const float DAYS_PER_YEAR = 365.24;
131143

132144
type props = rec(float x,
@@ -142,49 +154,49 @@ mod Body {
142154
// fit into a 32-bit int.
143155

144156
let Body.props p;
145-
p.x = 4.841431e+00;
146-
p.y = -1.160320e+00;
147-
p.z = -1.036220e-01;
148-
p.vx = 1.660076e-03 * DAYS_PER_YEAR;
149-
p.vy = 7.699011e-03 * DAYS_PER_YEAR;
150-
p.vz = -6.904600e-05 * DAYS_PER_YEAR;
151-
p.mass = 9.547919e-04 * SOLAR_MASS;
157+
p.x = 4.84e+00;
158+
p.y = -1.16e+00;
159+
p.z = -1.03e-01;
160+
p.vx = 1.66e-03 * DAYS_PER_YEAR;
161+
p.vy = 7.69e-03 * DAYS_PER_YEAR;
162+
p.vz = -6.90e-05 * DAYS_PER_YEAR;
163+
p.mass = 9.54e-04 * SOLAR_MASS;
152164
ret p;
153165
}
154166

155167
fn saturn() -> Body.props {
156168
let Body.props p;
157-
p.x = 8.343366e+00;
158-
p.y = 4.124798e+00;
159-
p.z = -4.035234e-01;
160-
p.vx = -2.767425e-03 * DAYS_PER_YEAR;
161-
p.vy = 4.998528e-03 * DAYS_PER_YEAR;
162-
p.vz = 2.304172e-05 * DAYS_PER_YEAR;
163-
p.mass = 2.858859e-04 * SOLAR_MASS;
169+
p.x = 8.34e+00;
170+
p.y = 4.12e+00;
171+
p.z = -4.03e-01;
172+
p.vx = -2.76e-03 * DAYS_PER_YEAR;
173+
p.vy = 4.99e-03 * DAYS_PER_YEAR;
174+
p.vz = 2.30e-05 * DAYS_PER_YEAR;
175+
p.mass = 2.85e-04 * SOLAR_MASS;
164176
ret p;
165177
}
166178

167179
fn uranus() -> Body.props {
168180
let Body.props p;
169-
p.x = 1.289436e+01;
170-
p.y = -1.511115e+01;
171-
p.z = -2.233075e-01;
172-
p.vx = 2.964601e-03 * DAYS_PER_YEAR;
173-
p.vy = 2.378471e-03 * DAYS_PER_YEAR;
174-
p.vz = -2.965895e-05 * DAYS_PER_YEAR;
175-
p.mass = 4.366244e-05 * SOLAR_MASS;
181+
p.x = 1.28e+01;
182+
p.y = -1.51e+01;
183+
p.z = -2.23e-01;
184+
p.vx = 2.96e-03 * DAYS_PER_YEAR;
185+
p.vy = 2.37e-03 * DAYS_PER_YEAR;
186+
p.vz = -2.96e-05 * DAYS_PER_YEAR;
187+
p.mass = 4.36e-05 * SOLAR_MASS;
176188
ret p;
177189
}
178190

179191
fn neptune() -> Body.props {
180192
let Body.props p;
181-
p.x = 1.537969e+01;
182-
p.y = -2.591931e+01;
183-
p.z = 1.792587e-01;
184-
p.vx = 2.680677e-03 * DAYS_PER_YEAR;
185-
p.vy = 1.628241e-03 * DAYS_PER_YEAR;
186-
p.vz = -9.515922e-05 * DAYS_PER_YEAR;
187-
p.mass = 5.151389e-05 * SOLAR_MASS;
193+
p.x = 1.53e+01;
194+
p.y = -2.59e+01;
195+
p.z = 1.79e-01;
196+
p.vx = 2.68e-03 * DAYS_PER_YEAR;
197+
p.vy = 1.62e-03 * DAYS_PER_YEAR;
198+
p.vz = -9.51e-05 * DAYS_PER_YEAR;
199+
p.mass = 5.15e-05 * SOLAR_MASS;
188200
ret p;
189201
}
190202

@@ -194,17 +206,14 @@ mod Body {
194206
ret p;
195207
}
196208

197-
fn offsetMomentum(Body.props props,
209+
impure fn offsetMomentum(mutable Body.props props,
198210
float px,
199211
float py,
200212
float pz) -> Body.props {
201213

202-
// TODO: should we create a new one or mutate the original?
203-
let Body.props p = props;
204-
p.vx = -px / SOLAR_MASS;
205-
p.vy = -py / SOLAR_MASS;
206-
p.vz = -pz / SOLAR_MASS;
207-
ret p;
214+
props.vx = -px / SOLAR_MASS;
215+
props.vy = -py / SOLAR_MASS;
216+
props.vz = -pz / SOLAR_MASS;
208217
}
209218

210219
}

0 commit comments

Comments
 (0)