1 Surface homogène

publicité
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
Téléchargement