Université Pierre & Marie Curie Travaux pratiques no Phys. 208 Informatique pour physiciens 6 : Adsorption de particules sur une surface L'exposition d'une surface cristalline à un gaz donne lieu à des phénomènes d'adsorption : les particules du gaz sont piégées sur la surface du cristal. Ce phénomène a de nombreuses applications, en particulier dans la réalisation de catalyseurs. 1 Surface homogène Pour modéliser ce problème, on fait les hypothèses préliminaires suivantes : La surface cristalline est un carré de côté L. Les particules de gaz adsorbées sont modélisées par des disques de rayon R avec R ¿ L. Ces disques sont impénétrables, c'est-à-dire que deux particules ne peuvent pas se chevaucher. (Voir la gure.) Une fois qu'une molécule a été adsorbée, elle ne bouge plus et ne quitte plus la surface du cristal. Fig. 1 Un exemple de particules sphériques adsorbées aléatoirement sur une surface. La particule indiquée en gris est la dernière que l'on a pu caser. La simulation fonctionne ainsi : on part d'une surface vide et, à chaque pas de temps, on essaye de rajouter une particule de gaz. La nouvelle particule arrive à un endroit aléatoire ; si elle ne chevauche aucune particule déjà présente, on la garde, sinon rien ne se passe et le système n'est pas modié. On fait ainsi de nombreux essais jusqu'à ce qu'on n'arrive plus à caser de nouvelles particules et on s'intéresse aux propriétés de l'état nal, en particulier au nombre de particules qu'on a réussi à placer. 1. Question analytique : une particule de gaz adsorbée doit être entièrement contenue dans le carré (voir gure). Si on note (x, y) les coordonnées du centre de la particule, quelles sont les valeurs autorisées pour x et y en fonction de L et de R ? Fig. 2 À gauche : conguration interdite car les particules débordent. À droite : conguration valide. Les particules sont à l'extrême limite de la zone autorisée. 2. Question analytique : À quelle condition (en fonction de R) deux particules de coordonnées (x, y) et (x0 , y 0 ) se chevauchent-elles ? 1 3. Question analytique : Donner une borne supérieure au nombre de particules de rayon R que l'on peut espérer caser sans chevauchement dans un carré de côté L. La borne n'a pas besoin d'être très bonne, mais il faut qu'elle soit correcte ! Justier la formule employée. 4. Écrire un programme capable de simuler ce phénomène d'adsorption. Le programme doit essayer de placer successivement des particules dans le système jusqu'à ce qu'il y ait eu MAX_TRIES échecs consécutifs, puis acher le nombre de particules placées ainsi que le rapport entre la surface totale occupée par toutes les particules adsorbées et la surface du carré. Les constantes L et R et MAX_TRIES seront des macros et l'on pourra prendre, par exemple #dene L 20.0 #dene R 0.4 #dene MAX_TRIES 2500 On utilisera au plus trois variables globales : int n_at; // nombre de particules déjà présentes dans le système double x[N_MAX]; // x[i] est l ' abscisse de la i −ème particule présente double y[N_MAX]; // y[i] est l 'ordonnée de la i −ème particule présente En particulier, il faut noter que x[i] et y[i] ne sont dénis que pour 0 ≤ i < n_at. La taille N_MAX des tableaux sera une autre macro dont la valeur doit être telle qu'on est sûr d'avoir susamment de place pour enregistrer les coordonnées de toutes les particules adsorbées. Vous utiliserez pour dénir N_MAX en fonction de L et de R votre borne supérieure sur le nombre maximum de particules adsorbables. Une bonne manière d'écrire le programme est d'utiliser les fonctions suivantes : Une fonction double coord(void) qui renvoie une valeur aléatoire dans l'intervalle autorisé pour la coordonnée x ou y de la nouvelle particule qu'on essaye de placer (voir question 1.) Une fonction int place_libre(double x_new,double y_new) qui renvoie 1 si l'on peut placer une nouvelle particule en (x_new, y_new) et 0 sinon. Cette fonction doit donc vérier que la nouvelle particule ne chevauche aucune des n_at particules déjà présentes. Une fonction int adsorption(void) qui tire aléatoirement les deux coordonnées x_new et y_new d'une nouvelle particule avec la fonction coord(), puis teste avec la fonction place_libre() si la nouvelle particule peut être placée. Si c'est la cas, la fonction adsorption() doit garder la particule et mettre à jour n_at et les deux tableaux x[] et y[]. Cette fonction doit renvoyer 1 si la nouvelle particule a été placée et 0 en cas d'échec. Ainsi, la fonction int main(void) n'a plus qu'à faire l'initialisation, appeler adsorption() en boucle jusqu'à ce qu'il y ait eu MAX_TRIES échecs successifs, puis acher le résultat. 5. Utilisez la bibliothèque g2 pour visualiser la construction du système et la conguration nale. 6. Si on double la taille L du système (sans changer R), comment évolue la fraction occupée de la surface du carré ? Essayez de faire une prédiction avant de faire l'expérience ! 7. Modier la fonction main() et les entêtes pour que l'expérience soit faite N = 1000 fois et que la fonction main() ache la moyenne sur toutes ces expériences du nombre de particules adsorbées et de fraction de la surface du carré qu'elles occupent. L'exécution du programme prenant un temps considérable, testez le programme avec un petit N = 10 avant de lancer le "vrai" calcul des moyennes. 8. (Optionnel). Comment peut-on en calculer l'écart-type ? Modiez le programme pour inclure ce calcul. 2 2 Surface structurée On a jusque-là modélisé ce problème en considérant la surface d'adsorption comme parfaitement homogène. En fait, il y a des interactions entre les atomes de la surface d'adsorption et les particules du gaz, et il se trouve que les particules du gaz s'adsorbent plus facilement à proximité des atomes de la surface d'adsorption. Décrire précisément ces interactions est dicile, mais on obtient de bons résultats avec le modèle simplié suivant : On suppose qu'il existe une distance caractéristique r_surf qui décrit la portée de l'interaction entre les atomes de la surface et les particules du gaz. Si une particule du gaz essaye de s'adsorber à une distance inférieure à r_surf de l'un des atomes de la surface, l'adsorption a toujours lieu. Si, au contraire, une particule du gaz essaye de s'adsorber à une distance supérieure à r_surf de tous les atomes de la surface, l'adsorption n'a lieu qu'avec une probabilité exp(−U/T ) où U > 0 représente le coût énergétique à se placer loin des particules de la surface et où T représente la température. (Pour être parfaitement précis, T est en fait la température en Kelvin multipliée par la constante de Boltzmann kB .) (Le modèle qu'on vient de décrire est une variante de l'algorithme de Métropolis. ) Pour prendre le cas le plus simple, on suppose que les atomes de la surface d'adoption sont organisés selon un réseau cristallin carré de côté L (voir gure) : il y a un atome de la surface en tous les points de coordonnées (x, y) où x et y sont des entiers compris entre 0 et L. Fig. 3 Surface d'adsorption avec sa structure atomique, les atomes étant organisés en réseau carré. 9. Pour quelle valeur de T retrouve-t-on le modèle de la première partie ? Comment pourrait-on décrire en quelques mots le modèle obtenu en prenant T = 0 ? 10. Modier votre programme pour prendre en compte les atomes de la surface et la température. La distance r_surf et l'énergie U seront dénies par des macros et l'on pourra prendre, par exemple, #dene r_surf 0.1 #dene U 10.0 En outre, pour accélérer les calculs, on pourra changer les macros, #dene L 12.0 #dene MAX_TRIES 1000 3 Il faudra Dénir une fonction double dist_latt(double x_new, double y_new) qui renvoie la distance à l'atome le plus proche de la surface d'adsorption. On pourra utiliser la fonction double rint(double) de la librairie mathématique qui renvoie l'entier le plus proche de son argument. Modier la fonction adsorption. Cette fonction prend désormais en argument la température : int adsorption(double T) et doit implémenter l'algorithme décrit. Modier la fonction main() pour simuler le modèle à une température donnée (par exemple, T = 9). 11. Dessinez le système (CAD les atomes de la surface cristalline et les atomes adsorbés) avec la bibliothèque g2 pour diérentes valeurs de la température (N=1). Que remarquez vous à haute et à basse température ? 12. Modier la fonction main() pour faire des simulations indépendantes pour toutes les températures entre 0 et 10, et tracer le graphe de la fraction moyenne de la surface occupée en fonction de la température. Testez d'abord le programme pour N=1 puis eectuez les calculs avec N=1000. 13. Que remarque-t-on ? Comment peut-on expliquer cette courbe ? Peut-on dénir une température critique ? Avez vous une prédiction théorique pour la valeur de la fraction à basse température ? 14. Que se passe-t-il pour des valeurs de R 40 % plus grandes à très basse température ? On ne fera qu'une simulation (N=1). Acher la conguration nale du système avec la bibliothèque g2 et essayer d'en déduire un ordre "local" un peu diérent par rapport à la situation précédente. 15. Essayez (graphiquement) la même expérience pour R 40 % plus petit par rapport à sa valeur initiale. On prendra N=1 et MAX_TRIES=100000. Que se passe-t-il à T≈ 0 ? Et à T=2 ? 4