N-body simulation
In
Nature of the particles
The 'particles' treated by the simulation may or may not correspond to physical objects which are particulate in nature. For example, an N-body simulation of a star cluster might have a particle per star, so each particle has some physical significance. On the other hand, a simulation of a
Dark Matter Simulation
Dark matter plays an important role in the formation of galaxies. The time evolution of the density f (in phase space) of dark matter particles, can be described by the collisionless Boltzmann equation
In the equation, is the velocity, and Φ is the gravitational potential given by
Direct gravitational N-body simulations
In direct gravitational N-body simulations, the equations of motion of a system of N particles under the influence of their mutual gravitational forces are integrated numerically without any simplifying approximations. These calculations are used in situations where interactions between individual objects, such as stars or planets, are important to the evolution of the system.
The first direct gravitational N-body simulations were carried out by Erik Holmberg at the Lund Observatory in 1941, determining the forces between stars in encountering galaxies via the mathematical equivalence between light propagation and gravitational interaction: putting light bulbs at the positions of the stars and measuring the directional light fluxes at the positions of the stars by a photo cell, the equations of motion can be integrated with effort.
General relativity simulations
Many simulations are large enough that the effects of
Calculation optimizations
N-body simulations are simple in principle, because they involve merely integrating the 6N
Numerical integration is usually performed over small timesteps using a method such as leapfrog integration. However all numerical integration leads to errors. Smaller steps give lower errors but run more slowly. Leapfrog integration is roughly 2nd order on the timestep, other integrators such as Runge–Kutta methods can have 4th order accuracy or much higher.
One of the simplest refinements is that each particle carries with it its own timestep variable, so that particles with widely different dynamical times don't all have to be evolved forward at the rate of that with the shortest time.
There are two basic approximation schemes to decrease the computational time for such simulations. These can reduce the computational complexity to O(N log N) or better, at the loss of accuracy.
Tree methods
In tree methods, such as a
Particle mesh method
Another possibility is the
where G is
where is the comoving wavenumber and the hats denote Fourier transforms. Since , the gravitational field can now be found by multiplying by and computing the inverse Fourier transform (or computing the inverse transform and then using some other method). Since this method is limited by the mesh size, in practice a smaller mesh or some other technique (such as combining with a tree or simple particle-particle algorithm) is used to compute the small-scale forces. Sometimes an adaptive mesh is used, in which the mesh cells are much smaller in the denser regions of the simulation.
Special-case optimizations
Several different
People often decide to put a satellite in a frozen orbit. The path of a satellite closely orbiting the Earth can be accurately modeled starting from the 2-body elliptical orbit around the center of the Earth, and adding small corrections due to the oblateness of the Earth, gravitational attraction of the Sun and Moon, atmospheric drag, etc. It is possible to find a frozen orbit without calculating the actual path of the satellite.
The path of a small planet, comet, or long-range spacecraft can often be accurately modeled starting from the 2-body elliptical orbit around the Sun, and adding small corrections from the gravitational attraction of the larger planets in their known orbits.
Some characteristics of the long-term paths of a system of particles can be calculated directly. The actual path of any particular particle does not need to be calculated as an intermediate step. Such characteristics include Lyapunov stability, Lyapunov time, various measurements from ergodic theory, etc.
Two-particle systems
Although there are millions or billions of particles in typical simulations, they typically correspond to a real particle with a very large mass, typically 109
Softening
Softening is a numerical trick used in N-body techniques to prevent numerical divergences when a particle comes too close to another (and the force goes to infinity). This is obtained by modifying the regularized gravitational potential of each particle as
(rather than 1/r) where is the softening parameter. The value of the softening parameter should be set small enough to keep simulations realistic.
Results from N-body simulations
N-body simulations give findings on the large-scale dark matter distribution and the structure of dark matter halos. According to simulations of cold dark matter, the overall distribution of dark matter on a large scale is not entirely uniform. Instead, it displays a structure resembling a network, consisting of voids, walls, filaments, and halos. Also, simulations show that the relationship between the concentration of halos and factors such as mass, initial fluctuation spectrum, and cosmological parameters is linked to the actual formation time of the halos.
Incorporating baryons, leptons and photons into simulations
Many simulations simulate only
Computational complexity
Reif and Tate[6] prove that if the n-body reachability problem is defined as follows – given n bodies satisfying a fixed electrostatic potential law, determining if a body reaches a destination ball in a given time bound where we require a poly(n) bits of accuracy and the target time is poly(n) is in PSPACE.
On the other hand, if the question is whether the body eventually reaches the destination ball, the problem is PSPACE-hard. These bounds are based on similar complexity bounds obtained for ray tracing.
Example simulations
Common Boilerplate Code
The simplest implementation of N-body simulations where is a naive propagation of orbiting bodies; naive implying that the only forces acting on the orbiting bodies is the gravitational force which they exert on each other. In object-oriented programming languages, such as C++, some boilerplate code is useful for establishing the fundamental mathematical structures as well as data containers required for propagation; namely state vectors, and thus vectors, and some fundamental object containing this data, as well as the mass of an orbiting body. This method is applicable to other types of N-body simulations as well; a simulation of point masses with charges would use a similar method, however the force would be due to attraction or repulsion by interaction of electric fields. Regardless, acceleration of particle is a result of summed force vectors, divided by the mass of the particle:
An example of a programmatically stable and scalable method for containing kinematic data for a particle is the use of fixed length arrays, which in optimised code allows for easy memory allocation and prediction of consumed resources; as seen in the following C++ code:
struct Vector3
{
double e[3] = { 0 };
Vector3() {}
~Vector3() {}
inline Vector3(double e0, double e1, double e2)
{
this->e[0] = e0;
this->e[1] = e1;
this->e[2] = e2;
}
};
struct OrbitalEntity
{
double e[7] = { 0 };
OrbitalEntity() {}
~OrbitalEntity() {}
inline OrbitalEntity(double e0, double e1, double e2, double e3, double e4, double e5, double e6)
{
this->e[0] = e0;
this->e[1] = e1;
this->e[2] = e2;
this->e[3] = e3;
this->e[4] = e4;
this->e[5] = e5;
this->e[6] = e6;
}
};
Note that OrbitalEntity
contains enough room for a state vector, where:
- , the projection of the objects position vector in Cartesian space along
- , the projection of the objects position vector in Cartesian space along
- , the projection of the objects position vector in Cartesian space along
- , the projection of the objects velocity vector in Cartesian space along
- , the projection of the objects velocity vector in Cartesian space along
- , the projection of the objects velocity vector in Cartesian space along
Additionally, OrbitalEntity
contains enough room for a mass value.
Initialisation of simulation parameters
Commonly, N-body simulations will be systems based on some type of equations of motion; of these, most will be dependent on some initial configuration to "seed" the simulation. In systems such as those dependent on some gravitational or electric potential, the force on a simulation entity is independent on its velocity. Hence, to seed the forces of the simulation, merely initial positions are needed, but this will not allow propagation- initial velocities are required. Consider a planet orbiting a star- it has no motion, but is subject to gravitational attraction to its host star. As a time progresses, and time steps are added, it will gather velocity according to its acceleration. For a given instant in time, , the resultant acceleration of a body due to its neighbouring masses is independent of its velocity, however, for the time step , the resulting change in position is significantly different due the propagation's inherent dependency on velocity. In basic propagation mechanisms, such as the symplectic euler method to be used below, the position of an object at is only dependent on its velocity at , as the shift in position is calculated via
Without acceleration, is static, however, from the perspective of an observer seeing only position, it will take two time steps to see a change in velocity.
A solar-system-like simulation can be accomplished by taking average distances of planet equivalent point masses from a central star. To keep code simple, a non-rigorous approach based on
OrbitalEntity* orbital_entities = malloc(sizeof(OrbitalEntity) * (9 + N_ASTEROIDS));
orbital_entities[0] = { 0.0,0.0,0.0, 0.0,0.0,0.0, 1.989e30 }; // a star similar to the sun
orbital_entities[1] = { 57.909e9,0.0,0.0, 0.0,47.36e3,0.0, 0.33011e24 }; // a planet similar to mercury
orbital_entities[2] = { 108.209e9,0.0,0.0, 0.0,35.02e3,0.0, 4.8675e24 }; // a planet similar to venus
orbital_entities[3] = { 149.596e9,0.0,0.0, 0.0,29.78e3,0.0, 5.9724e24 }; // a planet similar to earth
orbital_entities[4] = { 227.923e9,0.0,0.0, 0.0,24.07e3,0.0, 0.64171e24 }; // a planet similar to mars
orbital_entities[5] = { 778.570e9,0.0,0.0, 0.0,13e3,0.0, 1898.19e24 }; // a planet similar to jupiter
orbital_entities[6] = { 1433.529e9,0.0,0.0, 0.0,9.68e3,0.0, 568.34e24 }; // a planet similar to saturn
orbital_entities[7] = { 2872.463e9,0.0,0.0, 0.0,6.80e3,0.0, 86.813e24 }; // a planet similar to uranus
orbital_entities[8] = { 4495.060e9,0.0,0.0, 0.0,5.43e3,0.0, 102.413e24 }; // a planet similar to neptune
where N_ASTEROIDS
is a variable which will remain at 0 temporarily, but allows for future inclusion of significant numbers of asteroids, at the users discretion. A critical step for the configuration of simulations is to establish the time ranges of the simulation, to , as well as the incremental time step which will progress the simulation forward:
double t_0 = 0;
double t = t_0;
double dt = 86400;
double t_end = 86400 * 365 * 10; // approximately a decade in seconds
double BIG_G = 6.67e-11; // gravitational constant
The positions and velocities established above are interpreted to be correct for .
The extent of a simulation would logically be for the period where .
Propagation
An entire simulation can consist of hundreds, thousands, millions, billions, or sometimes trillions of time steps. At the elementary level, each time step (for simulations with particles moving due to forces exerted on them) involves
- calculating the forces on each body
- calculating the accelerations of each body ()
- calculating the velocities of each body (
- calculating the new position of each body (
The above can be implemented quite simply with a while loop which continues while exists in the aforementioned range:
while (t < t_end)
{
for (size_t m1_idx = 0; m1_idx < 9 + N_ASTEROIDS; m1_idx++)
{
Vector3 a_g = { 0,0,0 };
for (size_t m2_idx = 0; m2_idx < 9 + N_ASTEROIDS; m2_idx++)
{
if (m2_idx != m1_idx)
{
Vector3 r_vector;
r_vector.e[0] = orbital_entities[m1_idx].e[0] - orbital_entities[m2_idx].e[0];
r_vector.e[1] = orbital_entities[m1_idx].e[1] - orbital_entities[m2_idx].e[1];
r_vector.e[2] = orbital_entities[m1_idx].e[2] - orbital_entities[m2_idx].e[2];
double r_mag = sqrt(
r_vector.e[0] * r_vector.e[0]
+ r_vector.e[1] * r_vector.e[1]
+ r_vector.e[2] * r_vector.e[2]);
double acceleration = -1.0 * BIG_G * (orbital_entities[m2_idx].e[6]) / pow(r_mag, 2.0);
Vector3 r_unit_vector = { r_vector.e[0] / r_mag, r_vector.e[1] / r_mag, r_vector.e[2] / r_mag };
a_g.e[0] += acceleration * r_unit_vector.e[0];
a_g.e[1] += acceleration * r_unit_vector.e[1];
a_g.e[2] += acceleration * r_unit_vector.e[2];
}
}
orbital_entities[m1_idx].e[3] += a_g.e[0] * dt;
orbital_entities[m1_idx].e[4] += a_g.e[1] * dt;
orbital_entities[m1_idx].e[5] += a_g.e[2] * dt;
}
for (size_t entity_idx = 0; entity_idx < 9 + N_ASTEROIDS; entity_idx++)
{
orbital_entities[entity_idx].e[0] += orbital_entities[entity_idx].e[3] * dt;
orbital_entities[entity_idx].e[1] += orbital_entities[entity_idx].e[4] * dt;
orbital_entities[entity_idx].e[2] += orbital_entities[entity_idx].e[5] * dt;
}
t += dt;
}
Focusing on the inner four
See also
- Millennium Run – Computer simulation of the universe
- Large-scale structure of the cosmos– All of space observable from the Earth at the present
- GADGET – Computer software for cosmological simulations
- Galaxy formation and evolution – From a homogeneous beginning, the formation of the first galaxies, the way galaxies change over time
- Natural units – Units of measurement based on universal physical constants
- Virgo Consortium
- Barnes–Hut simulation – approximation algorithm for performing an n-body simulation
- Bolshoi Cosmological Simulation – Computer simulation of the universe
References
- .
- eISSN 1365-2966.
- ISSN 0035-8711.
- doi:10.1086/144344.
- CiteSeerX 10.1.1.38.6242.
Further reading
- Bibcode:1960ZA.....50..184V.
- Bibcode:1963ZA.....57...47V.
- ISBN 978-0-521-12153-8.
- Bertschinger, Edmund (1998). "Simulations of structure formation in the universe". Annual Review of Astronomy and Astrophysics. 36 (1): 599–654. .
- Binney, James; Tremaine, Scott (1987). Galactic Dynamics. ISBN 978-0-691-08445-9.
- Callahan, Paul B.; Kosaraju, Sambasiva Rao (1992). "A decomposition of multidimensional point sets with applications to k-nearest-neighbors and n-body potential fields (preliminary version)". STOC '92: Proc. ACM Symp. Theory of Computing. ACM..