Accueil > Français > Formations > Master 2 Soft Matter and Biological Physics > Cours "Propriétés structurales et électroniques des solides" - Sylvain Ravy

Simulation de la diffraction par un réseau 2D


Simulation de la diffraction par un réseau 2D
Master M2 Physique de la matière condensée

 

Le but de ce script python est de rendre plus intuitive la diffusion et la diffraction des rayons X, en calculant en temps réel la figure de diffraction d’un réseau 2D dont les mailles peuvent contenir deux types "d’atomes". Il permet de calculer la transformée de Fourier d’un tableau (réseau) de variables (pseudo-spins) et de faire tourner un algorithme de Monte-Carlo "Metropolis" pour simuler une transition de phase.

 

Ce petit programme n’a d’autre prétention que d’être pédagogique, il contient des "bugs" et certaines options ne sont pas encore valides. Il devrait cependant aider à comprendre les notions d’ordre local, de diffraction cohérente, diffusion diffuse, de moyenne statistique et temporelle et de dynamique... pas moins !

Le programme source (le script) est disponible ici : isi-2.0.1.py. Il est écrit en python (version 2.3.5), logiciel libre que l’on trouve sur le site : http://www.python.org. Il utilise un module mathématique appelé Numerical Python disponible ici : http://sourceforge.net/projects/numpy.

 

Pour éxecuter le script, il faut taper la commande suivante dans une fenêtre DOS, à partir du répertoire où est placé isi-2.0.1.py :

> python isi-2.0.1.py

ou bien, après avoir lancé python par :

> python

exécuter le script au prompt python :

>>> execfile("isi-2.0.1.py")

 

Je me sers d’un ordinateur portable dont le processeur tourne à 1.8 MHz, la mémoire vive est de 256 Mo et la meilleure résolution d’affichage est de 1024x728 pixels. Pour cette machine, le programme tourne bien avec un réseau de 32x32 pseudospins et une taille d’image de 460 pixels. Ces paramètres sont indiqués à la ligne 741 du script :

self.mc=FenMC(self,32,460,460)

Avec un ordi. plus puissant et un meilleur écran on pourra augmenter ces paramètres et écrire (par exemple)

self.mc=FenMC(self,64,512,512) ou mieux...

 

L’interface d’isi.py est la suivante :

 

Dans la barre de menu principale, le menu "Applis" n’est pas (encore) actif. Le "Quit" du menu "Fichier" permet de quitter proprement ’application.

  • Les deux images que l’on voit sur la copie d’écran sont :
    • À gauche, le réseau direct de pseudo-spins :
      Ce réseau vient d’un tableau nommé "b" dans le programme. La taille du tableau est ajustable dans la case "Array size" en haut à gauche. Par défaut, il y a 32x32 pseudo-spins. Leurs valeurs peuvent être -1 (en blanc) et 1 (en noir). Ce choix permet d’avoir facilement une moyenne des spins nulle et d’éliminer ainsi les fréquences (taches de Bragg) correspondant au réseau. Pour les faire apparaître, décocher le bouton "Spin aver.=0" qui donne aux pseudo-spins les valeurs 1 et 3.
      Par défaut, ces spins sont ordonnés en "damier" selon un ordre "AntiFerro". Le bouton à cocher "AntiFerro", en bas à gauche permet de passer d’un réseau Ferro (tous les spins sont à -1) au réseau AntiFerro initial (pratiquement on multiplie par un tableau -1,1,-1,1 etc.. pour passer de l’un à l’autre) .
    • À droite l’espace réciproque, qui est ici donné par le carré de la transformée de Fourier (TF) du tableau de droite :
      La TF de "b", nommée "fb" dans le programme, est calculée par une "Fast Fourier Transform" 2D (ligne 438). L’origine de l’espace réciproque est en haut à gauche. Par défaut, cette image est le logarithme du carré de fb+1 (afin d’être noire pour une intensité calculée faible devant 1), représenté sur une palette de niveaux de gris allant de 0 à 255. On peut visualiser directement le carré de fb en décochant le bouton "Log" situé sous l’image. On revient en général rapidement à la situation initale, en ayant constaté que les phénomènes intéressants sont de faible intensité. On peut changer cette palette (il n’y en a que 3) à partir du menu déroulant "Colors". La palette "feu" est la plus agréable à mon goût.
  • La situation de départ n’est pas très passionnante, un seul carré blanc trône au centre de l’image de droite... L’algorithme FFT calcule la TF sur le même nombre de points que le tableau initial, dans une zone de Brillouin. Pour obtenir plus de détail, il faut donc augmenter le nombre de points dans le calcul de la FFT. Cela se fait en appuyant sur le bouton "+", en haut à droite de l’application. L’action précédente double dans les deux directions la taille du tableau courant et met à zéro les nouvelles valeurs. La TF est ainsi calculée sur un nombre de points 4 fois plus élevé et des détails apparaissent. Sur l’image de gauche, le tableau devient de plus en plus petit. L’option "Normal size" du menu "Tools" permet de le remettre plein écran. Répéter l’opération "+" 4 fois, pour obtenir "Res : X16" et choisir la palette "feu" permet d’obtenir la même situation que la copie d’écran ci-dessus.
    Dans le menu "Tools", la forme du "cristal" peut être changée. La tableau "b" est simplement multiplié par un masque valant "1" dans le cristal et "0" aileurs. La forme "disk" est celle convenant le mieux aux réseaux désordonnés car elle n’a pas les "tiges" de diffraction présentes dans les autres formes.
    Le nombre de zone de Brillouin peut aussi être changé dans l’option "Brillouin zone " de "Tools".Cette option ralentit les calculs Monte-Carlo.
  • Le bouton "Init" en haut de l’application permet d’initialiser le tableau b (image de droite) aléatoirement, si le bouton radio "Random" est activé, ou dans l’état de base (Ferro ou AntiFerro) si "Gdstate" est activé.
    L’algorithme Monte-Carlo (MC) est lancé dès que le bouton "Start" est enfoncé. Il fonctionne sur un modèle d’Ising sur réseau carré avec des interactions premiers voisins. Dans ce modèle, la différence entre les énergies des situations (1,1) et (1,-1) est égale à J, la constante d’interaction. J=100 K dans le cas "AntiFerro" et -100 K dans le cas "Ferro". Ce modèle a été résolu exactement par Onsager et donne une transition de phase à Tc=1,1345 |J|, soit 113,45 K dans la simulation.
    D’après l’algorithme Metropolis, un spin est tiré au hasard et retourné si l’énergie a diminué. Dans le cas contraire, le spin est retourné avec la probabilité exp(-dE/T), ou dE est l’augmentation d’énergie due au retournement (ligne 608 à 625 du script) et T est la température. T peut être changée par le curseur placé sous le réseau.
    Dans la simulation, la FFT est calculée en temsp réel tous les "n" cycles MC. La valeur de "n" est ajustable par le curseur situé sous l’image de la TF. Bien que le curseur puisse aller à 100000, le calcul est très ralenti pour cette valeur.
  • Le programme permet de voir en temps réel la modification de la figure de diffraction. Lorque le calcul est mis en route avec les valeurs par défaut, il simule une expérience de diffraction "en faisceau cohérent". Ainsi, dès que le cristal est désordonné, la figure présente des "tavelures" ou speckles. Cependant, cette situation expérimentale ne se rencontre que si le cristal, ou une partie du cristal, reçoit une onde suffisamment cohérente sur son volume irradié. Ce n’est pas le cas général.
    Pour simuler une expérience de diffraction classique, on peut "brouiller" l’image en convoluant pas une fonction Gaussienne de largeur (FWHM : Full Width at Half Maximum) donnée. Ceci se fait en cochant la case "Spat. Aver.", sous la TF, et en augmentant la largeur de la Gausienne par le bouton "+" voisin.
    Ceci n’est pas en général suffisant pour lisser complètement l’image de diffraction. Activer le bouton "Temp. Aver." au temps 0 permet d’obtenir la moyenne sur toutes les figures de diffraction calculées après ce temps origine. La figure obtenue après un temps suffisant long pour lisser les speckles est une simulation de la "diffusion diffuse".
  • En cliquant à gauche sur un pseudo-spin du réseau, on peut le retourner. Un domaine rectangulaire peut également être sélectionné en laissant le bouton gauche appuyé pendant la selection du rectangle. On peut ainsi (avec patience...) dessiner un domaine de forme quelconque.


Toutes les options (résolution, type d’interaction, forme du cristal, nombre de zones de Brillouin, couleurs, moyennes, retournement de domaines par clic gauche) peuvent être modifiées en cours de calcul, SAUF la taille du tableau initial.