4.1.1.1 : Comment implémenter les accès aux voisins ?



Dans la réaction de Gray Scott, nous avons besoin de lire les concentration en U et U des cellules voisines pour déterminer la nouvelle concentration en U et V de la cellule courrante.

La figure 2 montre les accès mémoire que l'on veut faire pour calculer l'évolution d'une cellule.

nothing

Figure 2 : Motif d'accès de notre calcul.



La figure 3 montre les accès mémoire dans une matrice de valeurs (U ou U) que l'on veut faire pour calculer l'évolution d'une cellule. On remarque que les bords ne peuvent pas être pris en compte de la même manière si on ne change pas ce motif d'accès aux données. Dans le cas contraire nous obtiendrons le célèbre Segmentation Fault pour avoir lu des données auxquelles nous n'avons pas le droit d'accéder.

nothing

Figure 3 : Motif d'accès de notre calcul dans une matrice de valeur



L'implémentation précédente pose tout de même un problème de taille : duppliquer en partie tout un tas de calculs en changeant les bornes et leurs voisins associés. On peut résumer la situation en disant que le motif d'accès complet (ou stencil) est au centre et qu'il faut traiter tous les autres séparéments.

Cela revient à implémenter 9 calculs différents, qui, malgré leurs simplicités apparente nous ferons perdre un temps non négligeable quand il s'agira de modifier le calcul.

Nous allons donc opter pour une implémentation plus subtile mais d'un seul calcul.

Il est en effet possible, à l'aide de calcul de minimum et de maximum de calculer, à la volée, les bornes des cellules que l'on doit prendre en compte dans le calcul de la mise à jour de la cellule courrante.

On rappelle au passage que nous devons utiliser deux tableaux différents pour chaque espèce (U et U) car si on écrit sur le tableau que l'on est en train de lire (pour diviser par deux le nombre de tableaux utilisé) on va juste avoir un résultat completement faux car la seule cellule qui sera mise à jour correctement sera uniquement la première.


Ce sera d'autant plus interessant que nous utiliserons ces bornes pour chercher automatiquement les bons poids à appliquer aux cellules voisines.