On souhaite simuler l'action mutuelle des forces gravitationnelles agissant sur un ensemble de masses ponctuelles situées dans un plan infini.
Chaque masse ponctuelle M possède :
Pour cela, à chaque pas de temps t, pour chaque masse Mi :
Ft(Mi,Mj) | = | G (mi * mj / dt(Mi,Mj)2) u |
Ft | = | sommeMj¬Mi(Ft(Mi,Mj)) , |
À mesure que les masses se rapprocheront les unes des autres, les forces appliquées seront de plus en plus grandes, et donneront lieu à des déplacements de plus en plus rapides. De fait, on ne peut conserver un pas de temps constant sur l'ensemble des itérations. Il faudra donc, à chaque pas de temps, définir la durée de celui-ci.
En supposant que l'ensemble des coordonnées des masses du système ne peut tenir dans la mémoire d'un seul processus, réalisez le programme MPI correspondant.
Mettez en place un mécanisme de recouvrement calcul-communication, à base de communication non-bloquantes persistantes, permettant le calcul entre les masses possédées localement et celles reçues des autres processeurs. Utilisez pour cela deux tampons interchangeables et une topologie d'anneau logique.
Afin de prendre en compte finement les interactions locales, la durée du pas de temps sera prise de telle façon qu'un sommet ne se rapproche pas de plus de 10 pour cent de la position courante du plus proche de ses voisins. La valeur du pas de temps à choisir est donc décidée collectivement lors de chaque itération.
Prévoyez un dispositif de sortie permettant d'obtenir à chaque pas de temps les positions des masses, pour visualisation ultérieure des trajectoires (sous Gnuplot par exemple).