bench: fix nbody bugs, r=burningtree.
This commit is contained in:
parent
bcde593d3a
commit
b4401d12a7
1 changed files with 29 additions and 13 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue