Réalisation de maillages pour une application aux automates cellulaires

Auteurs: Sonny Lion, Alexis Petit
Date de création : 3 octobre 2012

Date de mise à jour : 12 décembre 2012

Table des matières


Liste des paramètres d'entrée de l'applet

Liste des paramètres de sortie de l'applet

Champ

Modélisation de phénomènes émergents

Introduction

Le fonctionnement des automates cellulaires repose sur l'évolution d'une grille de cellules pouvant prendre plusieurs états (la cas le plus simple étant une grille de cellules pouvant passer d'un état mort ou vivant, 0 ou 1, up ou down). L'ensemble des états peut être grand mais la complexité augmente alors radicalement. L'état d'une cellule au temps t+dt est déterminé par l'ensemble des états des cellules adjacentes au temps t, associé à une loi d'évolution. Ce principe donne lieu à tout une famille d'applications que l'on appelle les automates cellulaires. Nous nous intéressons plus spécifiquement aux automates cellulaire 2D. La mise en oeuvre et l'étude de différentes lois d'évolution en vue d'une application à des problèmes physiques particuliers est réalisée par deux groupes : l'un s'intéresse à un modèle de réaction-diffusion de Turing et l'autre à un modèle d'Ising . Notre groupe, dont le travail est présenté sur cette page, a eu pour objectif la réalisation d'un maillage adapté à la réalisation d'automates cellulaires. Nous avons développé plusieurs types de maillages présentant chacun des avantages et des inconvéniants. L'intérêt de chacun sera discuté dans les sections qui suivent en se basant d'une part sur les avantages théoriques mais sur notre impression lors du développement (difficulté rencontrées, complexité des algorithmes).

Objectifs

Le maillage d'une simulation numérique constitue la base sur lequel les processus physiques seront modélisés. Un maillage est une discrétisation de l'espace et du temps afin de traiter numériquement par ordinateur un système continu. Dans notre cas il permet de développer un modèle de système dynamique discret particulièrement pertinent quand on regarde l'évolution d'un grand nombre d'entité discrètes comme les spins des atomes d'un cristal (modèle Ising) ou les cellules d'un organisme (modèle de Turing).
Un maillage se définit par un réseau qui détermine l'emplacement des sites de chaque cellule, et par un pavage qui remplit l'espace de sorte qu'il n'y ai aucun trou entre les cellules. Nous avons choisi de développer trois types de maillages décrits par ordre de complexité dans les paragraphes qui suivent. Nous présentons leur structure, l'algorithme qui permet de les générer ainsi que certains détails techniques qui pourront aider une personne désirant exploiter le code pour une nouvelle utilisation. En dernier recours nous vous renvoyons à la javadoc en lien en bas de page.
Il existe encore d'autres types de maillages comme par exemple le maillage triangulaire (déconseillé pour les raisons théoriques expliquées en dessous) ou le maillage avec un pavage récursif où un polygone peut lui même être divisé en un polygone de même nature mais de taille inférieure. En appliquant un algorithme récursif cela permet d'explorer avec une plus grande résolution certaines régions de l'espace. Faute de temps nous n'explorerons pas cette quatrième possibilité.


Explications

Fonctionnement d'un automate cellulaire

Afin de comprendre la logique qui nous a guidé dans le développement de nos maillages il est nécessaire de dire quelques mots sur les automates cellulaires (pour plus de détails ou peut se reporter à la documentation des groupes associés). Comme il l'a déjà été dit, l'évolution de chaque cellule repose sur l'état des cellules adjacentes. Nous avons donc choisi de développer notre maillage de telle sorte qu'il contienne des entités de type cellule pouvant passer d'un état booléen "vrai" ou "faux" selon ce que l'on définit comme étant les cellules voisines. Chaque cellule doit connaître quelles sont les cellules adjacentes. Le type orienté objet du langage java est tout à fait adapté à cela.

Les trois options de maillage mettent en oeuvre toujours la même structure de code. D'une part une classe "grille" (grille_carree.java, grille_hexa.java et grille_voronoi.java) qui génère notamment une liste de cellules, d'autre part une classe cellule.java qui permet de créer des objets "cellule" avec des variables contenant l'état de la cellule, une liste des cellules voisines, et bien sur le point sur la grille associé à cette cellule. Une fois cette structure mise en place vient la question de la méthode afin de générer un réseau de cellules (c'est-à-dire le maillage) sur lequel évoluera le système d'automates cellulaires. Enfin précisons que l'évolution de l'état des cellules peut-être très facilement géré par la méthode evolution_grille() située dans la classe principale TestGrille.java que nous employons pour réaliser quelques tests.


Discussion théorique sur le choix du maillage

Le choix du maillage est fondamental. Nous discutons ici des enjeux théoriques de chaque maillage.


Il existe différents types de pavages réguliers dans le plan R2. On s'intéresse ici au pavage carré et hexagonal. Le pavage triangulaire présente peut d'intérêt pour la simulation de processus physique.
Morphologie mathématique, Luc Brun (d’apres le cours de M. Coster)



A gauche : un disque à partir des huit premiers voisins de la cellule centrale réalisée sur une grille carrée. A droite : idem mais avec une grille hexagonale.



Il est par exemple difficile de représenter un ellipsoïde avec un maillage carré.
Morphologie mathématique, Luc Brun (d’apres le cours de M. Coster)





Réseau carré.
Morphologie mathématique, Luc Brun (d’apres le cours de M. Coster)



Réseau hexagonal.
Morphologie mathématique, Luc Brun (d’apres le cours de M. Coster)


Remarque : Les maillages avec un pavage hexagonal sont souvent les mieux adaptés à la simulation de phénomènes physique notamment en mécanique des fluides.


Maillage avec une grille carrée

Le maillage avec une grille carrée est la solution la plus facile à implémanter. Chaque site où se trouve une cellule est réparti avec un pas δl=1 sur une surface rectangulaire ou carrée. L'algorithme permettant de créer le réseau de cellules et des plus simple :


Chaque site (c'est-à dire un noeud ou une cellule) est identifiée par des coordonnées (i,j) avec i et j des entiers. La recherche des voisins en est facilité. Pour chaque cellule de coordonnées (i,j) on associe les quatre premiers voisins de coordonnées (i+1,j), (i-1,j), (i,j+1), et (i,j-1). Si l'on recherche les huits premiers voisins alors on renvoit les cellules (i+1,j+1), (i+1,j-1), (i-1,j+1), et (i-1,j-1) et ainsi de suite.

grille_carree
Position des sites de coordonnées (i,j) et des premiers voisins (i+1,j), (i-1,j), (i,j+1), et (i,j-1).

Une fois le réseau de cellules produit - dont chacune contient en mémoire la liste de ses voisins - on en déduit le pavage c'est-à-dire la représentation spatiale des cellules. Enfin chaque cellule est représentée d'une couleur en fonction de son état.


A chaque site du réseau (points en rouge) on associe une cellule et un pavage (carré en gris).

Le dernier point important concernant le maillage avec une grille carrée concerne la gestion des conditions périodiques. Le bord supérieur est connecté avec le bord inférieur et le bord gauche est connecté avec le bord droit. La figure ci-dessous on a un exemple de réalisation des conditions périodiques.


Voici une grille carrée avec une particule test étendue sur un rayon de 10 cellule dont le centre se trouve en haut à gauche.

Que ce soit pour le maillage carré ou la maillage hexagonal, la gestion de la périodicité se fait grâce à la méthode rechercheVoisins() qui s'applique à l'objet de type grille. C'est elle qui attribue à chaque cellule ses plus proches voisins. En prenant soin de prendre le cas des cellules aux bords et en leur déclarant comme voisins les cellules situées sur le bord opposé, l'applet est ainsi capable de gérer facilement les conditions périodiques.


Exemple

Voici un exemple d'application de maillage avec une grille carrée. Chacune des cellules a été initialisée de façon aléatoire avec un état 1 ou 0 qui se traduit par une couleur rouge ou bleu du pavage.



Capture écran de l'appliquette

Un autre exemple possible permettant de tester les conditions périodiques est la création d'un point test qui se baladerait sur la grille avec une marche au hasard. On peut aussi créer une cellule test constituée de plusieurs voisins.

Remarque : La grille carrée est très facile à implémenter. Elle constitue un bon premier test pour mettre en application les modèles d'Ising ou de Turing. Les voisins se trouvent de façon immédiate car il suffit de reprendre la position d'une cellule et de translater d'un pas δt. La rapidité d'exécution du code est donc avantageuse. Cependant pour les raisons évoquées à la section théorique, le maillage carré n'offre pas un bon modèle physique. Particulièrement en ce qui concerne la recherche des premiers ou seconds voisins qui n'est pas très correcte.


Maillage avec une grille hexagonale

Dans le cas du maillage hexagonale, nous avons choisit un algorithme légèrement plus complexe que celui du maillage carré ;




Disposition des cellules avec leur indexage.

Outre les arguments déjà avancés précédemment, le maillage avec une grille hexagonale facilite la détermination des premiers voisins d'une cellule. En effet, une cellule donnée a toutes ses cellules adjacentes situées à égales distances.


On voit que la distance qui sépare la cellule du milieu des cellules adjacente est la même pour toutes.

Tout comme pour la maillage carré nous avons réalisé le maillage hexagonal avec la topologie d'un tore. Notons que le nombre pair de colonnes est imposé afin de gérer les conditions périodiques correctement.


Grille avec une particule test et ses dix premiers voisins activés.



Exemple

Voici un exemple d'application de maillage hexagonal. Chacune des cellules ont été initialisé de façon aléatoire avec un état 1 ou 0 qui se traduit par une couleur rouge ou bleu du pavage.



Capture d'écran de l'applet.



Maillage de type Delaunay-Voronoï


Remarque : Face à la complexité de la construction d'un maillage de Delaunay-Voronoï, il nous a été impossible de parvenir à un programme exploitable. Néanmoins la triangulation de Delaunay à partir d'une distribution aléatoire de points est opérationnelle. Elle pourra être réutilisée dans un futur projet. Précisons également que les conditions périodiques n'ont pas été prise en compte dans la triangulation de Delaunay.


On peut raisonnablement supposer que les maillages construits à partir d'un réseau périodique comme les grilles carrées ou hexagonales sont bien adaptées pour modéliser des phénomènes comme le paramagnétisme dans les cristaux mais certains systèmes sont plus réalistes s'ils sont représentés par une distribition aléatoire de points. Pour réaliser un tel maillage nous avons choisi d'utiliser un algorithme de type Delaunay-Voronoi.
Le maillage de Delaunay-Voronoi s'obtient à partir d'une distribution aléatoire de point à laquelle nous avons tout de même imposé une distance minimale entre chaque point. Nous allons décrire l'algorithme permettant de construire le maillage à partir d'une telle distribution :


Algorithme de Delaunay :



Triangle initial qui circonscrit la distribution de points.
Computational geometry

Détail du processus de légalisation :
Si nous n'effectuons pas le processus de légalisation nous avons bien une triangulation mais elle n'est pas de Delaunay. Le processus de légalisation est donc au coeur de la construction du maillage de Delaunay. Les arrêtes de chaque nouveau triangle doivent être vérifiées. Si l'une d'elle est déclarée illégale alors on procède un "flip", c'est-à-dire un changement de la configuration des triangles. Prenons un exemple :
Si nous ajoutons un point Pr dans le triangle Δ1 (figure à gauche) alors nous devons créer trois nouveaux triangles en joignant ce point au sommet du triangle initial. Le processus de légalisation va ensuite s'appliquer à chaque arrête du triangle.

Computational geometry

Regardons ce qui se passe dans le cas de la légalisation de l'arrête PiPj. Pour que l'arrrête soit déclarée légale, il faut que le cercle circonscrit par les trois points Pr, Pi et Pj ne contienne aucun autre point. Si c'est le cas comme le détail la figure ci-dessous alors l'arrête PiPj doit être supprimée et nous devons relier le point Pr à ce quatrième point Pk.

Computational geometry

L'arrête du triangle Δ2 est donc supprimée et nous formons deux nouveaux triangles nommés ici Δ4 et Δ5. De plus l'algorithme de légalisation est récursif, c'est-à-dire que les arrêtes du nouveau triangle créé lors du processus de légalisation doivent elles aussi être légalisées. C'est ainsi que l'arrête adjacente aux triangles Δ5 et Δ3 est supprimée pour construire les nouveaux triangles Δ6 et Δ7.

Computational geometry

Si nous remplissons ces critères alors nous aurons bien une triangulation de Delaunay. Concrétement elle nous permet d'associer chaque point à ses plus proche voisins. Enfin la dernière étape consiste à supprimer les points P-1, P-2 et P-3 du maillage.


Le diagramme de Voronoï

La diagramme de Voronoï est le dual de la triangulation de Delaunay. Pour obtenir les points constituant les cellules de Voronoï il faut tracer les médiatrices aux segments joignant chaque cellule qui constituent le graphe de Delaunay. Les points de Voronoï se trouvent à l'intersection des médiatrices.

Frédéric Feyel - ONERA - DMSE/LCME

On obtient alors un pavage remplissant tout l'espace.

Frédéric Feyel - ONERA - DMSE/LCME


Remarque : Un maillage de Delaunay-Voronoï peut-être difficile à gérer par un ordinateur aux ressources insuffisantes. Si le nombre de points est trop important le processus de légalisation peut fortement augmenter le temps d'initialisation de l'applet.


Exemple

Voici un exemple d'application de la triangulation de Delaunay. Chaque carré représente un point distribué au hasard dans une zone carrée. Les couleurs rouge et bleu correspondent à l'état de chaque cellule associée à un point. On a ici la génération d'une triangulation de Delaunay avec une initialisation au hasard de 350 cellules disposées elle aussi au hasard dans un carré de 50 lignes et 50 colonnes.



Capture d'écran de l'applet.





Mode d'emploi de l'applet

Nous avons créé une appliquette java afin de tester les différents maillages. Nous pouvons choisir si nous voulons un maillage carré, hexagonal ou une triangulation de Delaunay à partir d'un nombre n de points. Un certains nombre de paramètre sont à régler pour obtenir le maillage :
  1. La taille en donnant le nombre de lignes et de colonnes.
  2. Le grossissement pour visualiser l'ensemble du maillage s'il dépasse la frontière de l'appliquette.
  3. Le nombre de points utilisés pour la triangulation de Delaunay.
  4. Le type de test que l'on applique au maillage :
Celui-ci peut-être :

Capture d'écran de l'applet.


Pour plus d'informations on peut se référer à la javadoc.

Bibliographie

Et pour plus d'informations sur les maillages on peut se référer à deux livres :