Problème des N corps¶
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
où \(G\) est la constante gravitationnelle.
Ainsi, la force total à laquelle est soumise le corps \(i\) s’écrit
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
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.