Giter VIP home page Giter VIP logo

n-body's Introduction

nbody

Fast n-body gravitational simulation code, written in C++ with ports to other slower languages.

Currently supported languages: C++, Python.

To use this code for Python, build the C++ files as:

swig -c++ -python nbody.i gpp nbody_wrap.cxx.

Alternatively, if you are running Windows, just copy all the contents of the python folder into your working directory.

Why use this code?

  1. N-body simulations written entirely in Python are way too slow. They can be used to generate pretty models, but to generate accurate data (arcsecond-level accuracy years into the future), the computation time needed is too big.

  2. N-body simulations written in C++ is fast, but C++ isn't known to be an interactive language. If you don't need interactivity, just use the C++ code (or even just compile the C++ ephemeris program). On the other hand, if you feel like you want to play around with the simulations, integrate it with your other code, save days of debugging time, avoid re-compiling your code every few-minutes, etc., C++ is not a great language.

This Python (and perhaps other languages in the future) port allows you to interact with the simulations while performing the brute work in fast compiled and optimized C++.

The code is fairly accurate and fast. In 6 seconds of computation time on an ordinary PC (2.40 GHz Dual Core, 3GB RAM), with a time step of 15 minutes, the program can achieve accuracy of around 1000km 10 years into the future. We are still working to further improve the accuracy of the simulation

Methodology

This program uses Newtonian mechanics and a four-order symplectic Candy-Rozmus integration (a symplectic algorithm guarantees exact conservation of energy and angular momentum). The initial conditions are obtained from JPL Horizons, ahd constants (like masses, gravitational constant) are those recommended by the International Astronomical Union. The program currently does not take into account effects like general relativity, the non-spherical shapes of celestial objects, tidal effects on Earth, etc. It also does not take the 500 asteroids used by JPL Horizons into accound in its model of the Solar System.

Usage

Ephemeris program

To run from the command line, type: nbody [options] options:

switches:
	-t  :  displays the computation time. This is useful for benchmarking
	-dE :  displays the relative energy error. This is useful for accuracy checking (since dE should be 0)
	-dL :  displays the relative angular momentum error. This, too, should be 0.
	-GR :  takes general relativity into account. 
fields:

	time[times,t] =    : the ephemeris times. Times should be specified as a Julian Date (2455562.5 or JD2455562.5), 
		or a calender date, both in UTC.
		For a calender date, the format is year-month-day-hour-minute-second or year/month/day/hour/minute/second.
		Instead of '-' or '/', a colon could be used on the time part.
		Months could be specified by a number from 1 to 12, by its name, or by its abreviation (thus, 7, Jul, and July are all good)
		If the time part of the date is omitted, the program assumes a time of 00:00:00
		If the second isn't specified, the program assumes a time of h: m :0
		For internal purposes, the program computes using the uniform Terestial Time.
		NOTE: BUG: When the program outputs the ephemeris time, it should be the user specified time.
		NOTE: For vector mode, the program assumes input of TT, to be consistent with JPL Horizons
		If the time field is omitted, the program uses the current time.
	object[objects,obj,objs] =   :The objects for which the ephemeris is desired. 
		Objects could be entered as names, or as the index numbers. The former is recommended.
		Valid objects are the eight major planets and the moon.
		If this field is omitted, the program outputs the ephemeris of all objects.
	mode = : The ephemeris output mode. The options are vector[vectors,vect] or observer[obs,ephem,ephemeris,ephemerides]
		The default mode is vector, which outputs heliocentric ecliptic (J2000) vectors.
		Observer mode outputs the equatorial RA and Dec (J2000).
	dt = : Specifies the time step in modified days (=days/k)

If everything is left blank, a help message is printed.

Python

You can import the module by

import nbody

The module contains a CObject class and the simulate() and SolarSystem() functions. The CObject describes a celestial object, with attributes mass, position, velocity, and name. The simulate function takes a list of celestial objects, with arguments time (the number of days to run the simulation for) and optional argument dt, specifying the time step. Note: the objects that are passed in will be modified. The SolarSystem() function returns a list of the major objects of the solar system at a given time, which by default is January 1, 2011. The time argument should be specified in Julian Dates. Currently this list includes the Sun, the planets, the moon, and the asteroids Ceres, Pallas, and Vesta.

Coordinates should be using the ecliptic coordinate system. Distances are measured in AU, time in days, and masses in solar masses. The origin is the solar system barycenter.

Example

This code will give the x, y, z location of Venus and its velocity on January 1, 2014:

import nbody
system = nbody.SolarSystem(2456659)
print nbody.Venus

This code will add a test particle at location (1,1) and velocity (-1,1) on January 1, 2011, and find the location and velocity of that particle in January 1, 2014:

import nbody
testparticle=CObject(mass=0,position=(1,1,0),velocity=(-1,1,0))
system=nbody.SolarSystem()+[testparticle]
simulate(system,2456659)
print testparticle

Bugs, deficiencies, and Future Plans

Yeah, this version of the code probably has a few bugs, and the interface with Python is rather ugly. I plan to:

Add support for other time formats in returning the Solar System.

Save initial conditions for the solar system at other times to allow faster computation.

Add more objects into the solar system

Compile binaries for Linux and Macs.

Fix any bugs that may come up.

n-body's People

Contributors

fding avatar jjaaster avatar pratheeknagaraj avatar

Stargazers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.