Replace raw pointer parameters with &mut references
This commit is contained in:
parent
68e0f20e54
commit
fa6f6a7829
42
src/main.rs
42
src/main.rs
@ -92,25 +92,25 @@ static mut solar_Bodies: [body; BODIES_COUNT] = [
|
|||||||
// Calculate the momentum of each body and conserve momentum of the system by
|
// Calculate the momentum of each body and conserve momentum of the system by
|
||||||
// adding to the Sun's velocity the appropriate opposite velocity needed in
|
// adding to the Sun's velocity the appropriate opposite velocity needed in
|
||||||
// order to offset that body's momentum.
|
// order to offset that body's momentum.
|
||||||
unsafe fn offset_Momentum(bodies: *mut body) {
|
fn offset_Momentum(bodies: &mut [body; BODIES_COUNT]) {
|
||||||
for i in 0..BODIES_COUNT {
|
for i in 0..BODIES_COUNT {
|
||||||
for m in 0..3 {
|
for m in 0..3 {
|
||||||
(*bodies.add(0)).velocity[m] -=
|
bodies[0].velocity[m] -=
|
||||||
(*bodies.add(i)).velocity[m] * (*bodies.add(i)).mass / SOLAR_MASS;
|
bodies[i].velocity[m] * bodies[i].mass / SOLAR_MASS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Output the total energy of the system.
|
// Output the total energy of the system.
|
||||||
unsafe fn output_Energy(bodies: *mut body) {
|
unsafe fn output_Energy(bodies: &mut [body; BODIES_COUNT]) {
|
||||||
let mut energy = 0.;
|
let mut energy = 0.;
|
||||||
for i in 0..BODIES_COUNT {
|
for i in 0..BODIES_COUNT {
|
||||||
// Add the kinetic energy for each body.
|
// Add the kinetic energy for each body.
|
||||||
energy += 0.5
|
energy += 0.5
|
||||||
* (*bodies.add(i)).mass
|
* bodies[i].mass
|
||||||
* ((*bodies.add(i)).velocity[0] * (*bodies.add(i)).velocity[0]
|
* (bodies[i].velocity[0] * bodies[i].velocity[0]
|
||||||
+ (*bodies.add(i)).velocity[1] * (*bodies.add(i)).velocity[1]
|
+ bodies[i].velocity[1] * bodies[i].velocity[1]
|
||||||
+ (*bodies.add(i)).velocity[2] * (*bodies.add(i)).velocity[2]);
|
+ bodies[i].velocity[2] * bodies[i].velocity[2]);
|
||||||
|
|
||||||
// Add the potential energy between this body and
|
// Add the potential energy between this body and
|
||||||
// every other body
|
// every other body
|
||||||
@ -120,11 +120,11 @@ unsafe fn output_Energy(bodies: *mut body) {
|
|||||||
for m in 0..3 {
|
for m in 0..3 {
|
||||||
position_Delta[m]
|
position_Delta[m]
|
||||||
.as_mut_ptr()
|
.as_mut_ptr()
|
||||||
.write((*bodies.add(i)).position[m] - (*bodies.add(j)).position[m]);
|
.write(bodies[i].position[m] - bodies[j].position[m]);
|
||||||
}
|
}
|
||||||
let position_Delta: [f64; 3] = mem::transmute(position_Delta);
|
let position_Delta: [f64; 3] = mem::transmute(position_Delta);
|
||||||
|
|
||||||
energy -= (*bodies.add(i)).mass * (*bodies.add(j)).mass
|
energy -= bodies[i].mass * bodies[j].mass
|
||||||
/ f64::sqrt(
|
/ f64::sqrt(
|
||||||
position_Delta[0] * position_Delta[0]
|
position_Delta[0] * position_Delta[0]
|
||||||
+ position_Delta[1] * position_Delta[1]
|
+ position_Delta[1] * position_Delta[1]
|
||||||
@ -141,7 +141,7 @@ unsafe fn output_Energy(bodies: *mut body) {
|
|||||||
// interactions between all the bodies, update each body's velocity based on
|
// interactions between all the bodies, update each body's velocity based on
|
||||||
// those interactions, and update each body's position by the distance it
|
// those interactions, and update each body's position by the distance it
|
||||||
// travels in a timestep at it's updated velocity.
|
// travels in a timestep at it's updated velocity.
|
||||||
unsafe fn advance(bodies: *mut body) {
|
unsafe fn advance(bodies: &mut [body; BODIES_COUNT]) {
|
||||||
// Figure out how many total different interactions there are between each
|
// Figure out how many total different interactions there are between each
|
||||||
// body and every other body. Some of the calculations for these
|
// body and every other body. Some of the calculations for these
|
||||||
// interactions will be calculated two at a time by using x86 SSE
|
// interactions will be calculated two at a time by using x86 SSE
|
||||||
@ -176,7 +176,7 @@ unsafe fn advance(bodies: *mut body) {
|
|||||||
for j in i + 1..BODIES_COUNT {
|
for j in i + 1..BODIES_COUNT {
|
||||||
for m in 0..3 {
|
for m in 0..3 {
|
||||||
position_Deltas[m].0[k] =
|
position_Deltas[m].0[k] =
|
||||||
(*bodies.add(i)).position[m] - (*bodies.add(j)).position[m];
|
bodies[i].position[m] - bodies[j].position[m];
|
||||||
}
|
}
|
||||||
k += 1;
|
k += 1;
|
||||||
}
|
}
|
||||||
@ -254,11 +254,11 @@ unsafe fn advance(bodies: *mut body) {
|
|||||||
let mut k = 0;
|
let mut k = 0;
|
||||||
for i in 0..BODIES_COUNT - 1 {
|
for i in 0..BODIES_COUNT - 1 {
|
||||||
for j in i + 1..BODIES_COUNT {
|
for j in i + 1..BODIES_COUNT {
|
||||||
let i_mass_magnitude = (*bodies.add(i)).mass * magnitudes.0[k];
|
let i_mass_magnitude = bodies[i].mass * magnitudes.0[k];
|
||||||
let j_mass_magnitude = (*bodies.add(j)).mass * magnitudes.0[k];
|
let j_mass_magnitude = bodies[j].mass * magnitudes.0[k];
|
||||||
for m in 0..3 {
|
for m in 0..3 {
|
||||||
(*bodies.add(i)).velocity[m] -= position_Deltas[m].0[k] * j_mass_magnitude;
|
bodies[i].velocity[m] -= position_Deltas[m].0[k] * j_mass_magnitude;
|
||||||
(*bodies.add(j)).velocity[m] += position_Deltas[m].0[k] * i_mass_magnitude;
|
bodies[j].velocity[m] += position_Deltas[m].0[k] * i_mass_magnitude;
|
||||||
}
|
}
|
||||||
k += 1;
|
k += 1;
|
||||||
}
|
}
|
||||||
@ -268,19 +268,19 @@ unsafe fn advance(bodies: *mut body) {
|
|||||||
// Use the updated velocities to update the positions for all of the bodies.
|
// Use the updated velocities to update the positions for all of the bodies.
|
||||||
for i in 0..BODIES_COUNT {
|
for i in 0..BODIES_COUNT {
|
||||||
for m in 0..3 {
|
for m in 0..3 {
|
||||||
(*bodies.add(i)).position[m] += 0.01 * (*bodies.add(i)).velocity[m];
|
bodies[i].position[m] += 0.01 * bodies[i].velocity[m];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
unsafe {
|
unsafe {
|
||||||
offset_Momentum(solar_Bodies.as_mut_ptr());
|
offset_Momentum(&mut solar_Bodies);
|
||||||
output_Energy(solar_Bodies.as_mut_ptr());
|
output_Energy(&mut solar_Bodies);
|
||||||
let c = std::env::args().nth(1).unwrap().parse().unwrap();
|
let c = std::env::args().nth(1).unwrap().parse().unwrap();
|
||||||
for _ in 0..c {
|
for _ in 0..c {
|
||||||
advance(solar_Bodies.as_mut_ptr());
|
advance(&mut solar_Bodies);
|
||||||
}
|
}
|
||||||
output_Energy(solar_Bodies.as_mut_ptr());
|
output_Energy(&mut solar_Bodies);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user