Example project: Simulating the motion of planets

The example code that we will study is a hopefully simple N-body simulation written in Python. It is not important or expected that we understand the code in any detail.

The big picture is that the code simulates the motion of a number of planets:

  • We can choose the number of planets.

  • Each planet starts with a random position, velocity, and mass.

  • At each time step, the code calculates the gravitational force between each pair of planets.

  • The forces accelerate each planet, the acceleration modifies the velocity, the velocity modifies the position of each planet.

  • We can choose the number of time steps.

  • The units were chosen to make numbers easy to read.

Example run

Instructor note

The instructor demonstrates running the code on their computer.

The code is written to accept command-line arguments to specify the number of planets and the number of time steps.

We first generate starting data:

$ python generate-data.py --num-planets 10 --output-file initial.csv

The generated file (initial.csv) could look like this:

px,py,pz,vx,vy,vz,mass
-46.88,-42.51,88.33,-0.86,-0.18,0.55,6.70
-5.29,17.09,-96.13,0.66,0.45,-0.17,3.51
83.53,-92.83,-68.77,-0.26,-0.48,0.24,6.84
-36.31,25.48,64.16,0.85,0.75,-0.56,1.53
-68.38,-17.21,-97.07,0.60,0.26,0.69,6.63
-48.37,-48.74,3.92,-0.92,-0.33,-0.93,8.60
40.53,-75.50,44.18,-0.62,-0.31,-0.53,8.04
-27.21,10.78,-78.82,-0.09,-0.55,-0.03,5.35
88.42,-74.95,-45.85,0.81,0.68,0.56,5.36
39.09,53.12,-59.54,-0.54,0.56,0.07,8.98

Then we can simulate their motion (in this case for 20 steps):

$ python simulate.py --num-steps 20 \
                     --input-file initial.csv \
                     --output-file final.csv

The --output-file (final.csv) is again a CSV file (comma-separated values) and contains the final positions of all planets.

It is possible to run on multiple cores and to animate the result. Here is an example with 100 planets:

$ python generate-data.py --num-planets 100 --output-file initial.csv

$ python simulate.py --num-steps 50 \
                     --input-file initial.csv \
                     --output-file final.csv \
                     --trajectories-file trajectories.npz \
                     --num-cores 8

$ python animate.py --initial-file initial.csv \
                    --trajectories-file trajectories.npz \
                    --output-file animation.mp4

Learning goals

  • What are the most important steps to make this code reusable by others and our future selves?

  • Be able to apply these techniques to your own code/script.

We will not focus on …

  • … how the code works internally in detail.

  • … whether this is the most efficient algorithm.

  • … whether the code is numerically stable.

  • … how to code scales with the number of cores.

  • … whether it is portable to other operating systems (we will discuss this later).