Problème des N corps ====================== .. image:: img/nbodies.jpg :width: 300px On considère :math:`N` corps de masses :math:`m_i` situés aux positions :math:`x_i`, dont les accélérations sont notées :math:`a_i` et les vitesses :math:`v_i`. Ces corps, distants deux à deux de :math:`r_{ij}`, intéragissent entre eux de telle sorte que la force d'attraction exercée par le corps :math:`i` sur le corps :math:`j` s'écrit .. math:: f_{ij} = G.\frac{m_i.m_j}{||r_{ij}||^2}.\frac{r_{ij}}{||r_{ij}||} où :math:`G` est la constante gravitationnelle. Ainsi, la force total à laquelle est soumise le corps :math:`i` s'écrit .. math:: 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* :math:`\epsilon ^2 >0` et récrivent la force totale comme ceci .. math:: 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 :math:`i=j` dans la somme, car le terme correspondant est maintenant nul. Un :download:`code C ` séquentiel résolvant numériquement (et naïvement) ce problème est fourni. .. admonition:: Expérimentations :class: question * Compiler puis exécuter ce code .. code:: bash $ 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.