Problème des N corps

../../_images/nbodies.jpg

On considère \(N\) corps de masses \(m_i\) situés aux positions \(x_i\), dont les accélérations sont notées \(a_i\) et les vitesses \(v_i\). Ces corps, distants deux à deux de \(r_{ij}\), intéragissent entre eux de telle sorte que la force d’attraction exercée par le corps \(i\) sur le corps \(j\) s’écrit

\[f_{ij} = G.\frac{m_i.m_j}{||r_{ij}||^2}.\frac{r_{ij}}{||r_{ij}||}\]

\(G\) est la constante gravitationnelle.

Ainsi, la force total à laquelle est soumise le corps \(i\) s’écrit

\[F_i = \sum_{1\leq j\leq N, i\neq j}f{ij} = G.m_i.\sum_{1\leq j\leq N, i\neq j}\frac{m_jr_{ij}}{||r_{ij}||^3}\]

Toutefois, si deux corps se rapprochent l’un de l’autre, le module de la force peut croître à l’infini, ce qui n’est pas réaliste, mais également indésirable pour l’application numérisue. Les astrophysiciens introduisent ainsi un facteur d’adoucissement \(\epsilon ^2 >0\) et récrivent la force totale comme ceci

\[F_i \approx G.m_i.\sum_{1\leq j\leq N}\frac{m_jr_{ij}}{(||r_{ij}||^2+\epsilon ^2)^{3/2}}\]

Note

Il n’est plus nécessaire d’exclure le cas \(i=j\) dans la somme, car le terme correspondant est maintenant nul.

Un code C séquentiel résolvant numériquement (et naïvement) ce problème est fourni.

Expérimentations

  • Compiler puis exécuter ce code

    $ gcc -o nbodies_cpu nbodies.c -lm
    $ ./nbodies_cpu
    time 50
    0  :  792.225281 448.235229 121.332932
    1  :  87.042427 424.013336 297.350372
    2  :  828.998291 602.228271 386.746857
    3  :  821.491333 821.837585 130.515076
    4  :  445.159882 419.724823 123.051498
    5  :  37.567375 432.389099 596.640198
    6  :  952.566284 372.296600 450.054871
    7  :  52.613991 487.164154 621.986145
    8  :  413.661682 295.292633 669.260925
    9  :  933.443909 203.695084 724.534790
    
  • Écrire un équivalent parallèle pour GPU en CUDA.

  • Comparer ses performances avec celles de la version séquentielle.