Programming Assignment Checklist: N-Body Simulation

Goals

Frequently Asked Questions

The submission system says my program exceeds the 80 character limit, but I don't see which line it's on. Can you help? The program WidthChecker.java and helper library CharStdIn.java print out all lines longer than a command line input N. Please note that all tabs are converted to 4 spaces during submission.

My computer it too slow to display the animation smoothly. Is there anything I can do? Here are a few suggestions. First, be sure that you are only calling Turtle.pause once at the end of each time step, instead of after each Turtle.spot command. You might also try increasing the delay parameter in Turtle.pause to prevent hoarding system resources. Or do several updates, say 20, before calling Turtle.pause.

Can I combine Steps 1, 2, and 3 into one massive loop? No! This will simultaneously screw up the physics and make your code harder to understand and debug.

I draw the planets, but nothing appears on the screen. Why? Make sure that the drawing coordinates are between 0 and 512. If not, rescale them so that they are. Also, be sure that you call Turtle.pause at the end of each time step.

How do I scale the bodies so that they stay inside the 512-by-512 Turtle graphics window? The first number in the data file is the radius R of the universe. You can assume all of the x and y coordinates of the planets remain between -R and R. Your job is to compute scaled and translated coordinates that are always between 0 and 512. Compute turtleX and turtleY with ax + b and ay + b for appropriate constants a and b. Note: you should not actually change the x and y coordinates of each planet (this will ruin the physics); instead use the temporary variables turtleX and turtleY to temporarily store the scaled coordinates you intend to plot.

I'm confused about all of the &Delta t / 2 terms. Do I need to worry about them to get the physics right? No! The update formulas for velocity and position already take this into account.

What should I use for the initial velocity in the leapfrog method? Use the value from the input file. As a technicality, the leapfrog method should be initialized with the velocity at time t = -Δt / 2, so we'll assume this is the value in the input file. In real codes, special care must be made to deal with this.

I'm a physicist. Why should I use the leapfrog method instead of the formula I derived in high school? The leapfrom method is more stable for integrating Hamiltonian systems than conventional numerical methods like Euler's method or Runge-Kutta. The leapfrog method is symplectic, which means it preserves properties specific to Hamiltonian systems (conservation of linear and angular momentum, time-reversibility, and conservation of energy of the discrete Hamiltonian). In contrast, ordinary numerical methods become dissipative and have completely different long-term behavior. For example, the earth would slowly spiral in to (or away from) the sun. For these reasons, symplectic methods are extremely popular for N-body calculations. You asked!

My planets repel each other. Why don't they attract each other? Make sure that you get the sign right when you apply Newton's law of gravitation. Note that Δx and Δy can be positive or negative. Do not even think of changing G to -G.

How should I compute x2? The simplest way is x*x. The ^ operator does not mean exponentiation in Java.

I can't compile Turtle.java. Any thoughts? Be sure you are running Java 1.4 and not some older version.

Input, Output, and Testing

Input. Copy the nbody directory from the COS 126 ftp site to your computer.

Compilation.  Your program must be named NBody.java. The capitalization is important. Compile your program with:

javac NBody.java
Note that it's not actually necessary to javac Turtle.java since this will happen automatically when you compile NBody.java.

Execution.  To redirect standard input from a file, execute your program with:

java NBody < planets.txt

Submission

readme.txt. Use the following readme file template and answer any questions.

Submission.  Submit NBody.java. Don't forget to hit the "Run Script" button on the submission system to test that it compiles cleanly.

Possible Progress Steps

These are purely suggestions for how you might make progress. You do not have to follow these steps. Warning: this program is more involved than the previous ones, and you should budget more time accordingly. The best advice we can give you is to carefully test, debug, and re-rest your code as you write it. Do not attempt to write the whole program at once - that is not how programming works since when the program doesn't work, you will have no idea where to find the errror. We promise that proactive testing will save you enormous amounts of time in the long run. Trust us! Also, if you get stumped or frustrated on some portion of the assignment, you should not hesitate to consult a preceptor.

Extra Credit

One excellent idea is to add the Asteroid Belt, the Kuiper Belt, or Comets as in this N-body applet. Here is data for our solar system that the applet uses. You will need to to do some calculations to turn the data into our format and find appropriate images.

Enrichment


COS 126 Home Page
wayne@cs.princeton.edu