Exercice
Programmes et utilisation
Téléchargement des programmes et première simulation
Téléchargez cette archive qui contient :
- le programme de simulation
ising.jl
, - le Notebook
ising.ipynb
.
Créer un répertoire à votre nom sur /scratch
, déplacez-y l'archive et décompressez-là avec la commande
tar -xvf tp_ising.tar.xz
Créez dans ce dossier le répertoire results
, qui contiendra les résultats des simulations
mkdir results
Avant de lancer une simulation, vous pouvez afficher les arguments du code avec
julia ising.jl -h
Tous les arguments sont optionnels et leur valeur par défaut est indiquée.
Lancez la première simulation :
julia ising.jl
Les paramètres utilisez sont affichés. La simulation devrait être assez rapide ; le fichier de résultats est placé dans le dossier results
.
Récupération et affichage des résultats dans le notebook Jupyter
Lancez Jupyter dans votre répertoire de travail avec les commandes
conda activate psa
jlab
Puis ouvrez le notebook ising.ipynb
. Il contient déjà les fonctions de base qui vous permettront de traiter vos résultats facilement. Exécutez les premières cellules qui chargent les modules et définissent les fonctions de base.
Pour afficher les résultats de votre première simulation, dont le résultat est results/simu_1.h5
, vous pouvez utiliser
plot_file(1)
Les résultats suivants sont affichés :
- Le programme exporte, à intervalles de temps réguliers, l'aimantation moyenne $m=\frac{1}{N}\sum_{i=1}^N s_i$ et l'énergie moyenne $e=-\frac{J}{N}\sum_{\langle i,j\rangle}s_is_j$, où $\langle i,j\rangle$ désignent les paires de plus proches voisins, $J$ est la constante de couplage et $N=L^2$, où $L$ est la taille du système.
- L'histogramme de l'aimantation moyenne.
- 3 configurations typiques.
Comportement qualitatif et phases du système et base de données
Faites plusieurs simulations en faisant varier la constante de couplage $J$, avec la commande (pour $J=0.3$)
julia ising.jl -J 0.3
Vous pouvez regarder le contenu du dossier results
; vous constaterez que chaque simulation y dépose un nouveau fichier. Pour vous y retrouver dans les simulations que vous avez faites, vous pouvez scanner le dossier des résultats et créer un « tableau » (en fait, un DataFrame
Pandas) avec la commande
data = update_results()
Affichez ensuite la variable data
. Pour ne pas relire les fichiers déjà ouverts, vous pouvez passer data
en argument de la fonction update_results
(vous pouvez regarder l'aide de cette commande).
Observez qualitativement l'état du système et décrivez la ou les phases que vous voyez en utilisant les différentes observables.
Caractérisation de la transition de phase
Fluctuations de l'aimantation et de l'énergie
Calcul des fluctuations
Vous allez maintenant étudier les fluctuations de l'aimantation, $\left\langle m^2\right\rangle$. Dans cette expression, les moyennes seront calculées avec des moyennes temporelles.
L'aimantation d'une simulation est accessible avec les commandes suivantes :
g = h5py.File(file_from_int(1), 'r')
np.array(g['magnetization'])
La première ligne ouvre le fichier correspondant à l'expérience $1$ ; notez que la fonction file_from_int(n)
renvoie le nom de fichier correspondant à l'expérience $n$. La seconde extrait le champ 'magnetization'
.
Écrivez la fonction magnetization2(file)
qui prend en argument un nom de fichier et qui renvoie les fluctuations de l'aimantation $\left\langle m^2\right\rangle$.
Écrivez de la même manière la fonction energy2(file)
qui prend en argument un nom de fichier et qui renvoie les fluctuations de l'énergie $\left\langle e^2\right\rangle-\langle e\rangle^2$. L'énergie est enregistrée dans le champ 'energy'
des fichiers de résultats.
Mise à jour du tableau de données
Pour appliquer ces fonctions à tous les fichiers de résultats, vous pouvez utiliser la commande :
apply_function(fun, col)
où fun
est la fonction de que voulez appliquer et col
le nom que vous allez donner à ce champ, par exemple 'm2'
et 'e2'
pour les fluctuations de l'aimantation et de l'énergie, respectivement. Affichez la variable data
pour observer les changements.
Par défaut, la fonction apply_function
ne recalcule pas les quantités déjà calculées. Si vous avez fait une erreur dans les fonctions appliquées, vous pouvez tout recalculer en utilisant l'argument recompute=True
.
Tracé en fonction du couplage
Maintenant que vous avez calculé les fluctuations, vous pouvez les tracer en fonction de la constante de couplage avec
plt.scatter(data['J'], data['m2'])
plt.show()
plt.scatter(data['J'], data['e2'])
Malheureusement, ces courbes ne sont pas d'assez bonne qualité car d'une part les simulations sont trop courtes pour avoir des statistiques satisfaisantes et d'autre part les effets de taille finie sont importants pour ces petits systèmes ($L=16$ si vous n'avez pas modifié les paramètres par défaut).
Transition de phase via les fluctuations
Transition dans un petit système
Pour avoir des statistiques suffisantes, il faut faire des simulations plus longues ; vous utiliserez maintenant une durée totale de $T=10^6$. Commencez par faire des simulations de petite taille ($L=16$) avec cette durée, en faisant varier le couplage $J$.
Pour tracer les fluctuations de l'aimantation et de l'énergie en fonction du couplage, il faut sélectionner les simulations qui ont une durée suffisante dans vos données. Vous pouvez le faire en utilisant la commande
sel = select([['T', 1000000]])
Vous pouvez ensuite afficher la variable sel
. Pour tracer les fluctuations de l'énergie et de l'aimantation, vous n'avez qu'à remplacer data
par sel
dans les commandes ci-dessus.
Que remarquez-vous sur l'évolution des fluctuations en faisant varier $J$ ? Notez que les fluctuations de l'énergie sont proportionnelles à la capacité calorifique. Estimez la valeur du couplage critique $J_c$.
Effets de taille
Faites des simulations pour des systèmes de taille $32$ et $64$, en resserrant les valeurs du couplage autour de la valeur critique. Calculez les fluctuations et tracez-les en fonction du couplage. Pour cela, vous pouvez sélectionner chaque taille et tracer les résultats séparément :
for L in [16, 32, 64] :
sel = select([['L', L], ['T', 1000000]])
plt.scatter(sel['J'], sel['m2'], label=str(L))
Discutez les effets de taille dans les fluctuations de l'aimantation et de l'énergie. Essayez d'imaginer ce qui se passe dans la limite de taille infinie (limite thermodynamique).
Longueur de corrélation et effets de taille
Il n'est pas clair que les quantités moyennes soient les bonnes quantités pour comparer des systèmes de tailles différentes.
Considérons d'abord l'aimantation sous le couplage critique, $J\lt J_c$. Dans ce régime, l'aimantation varie beaucoup dans un échantillon, mais peut être corrélée sur une longueur $\xi$. Dans ce cas, l'aimantation totale $M=L^2m$ est la somme de $(L/\xi)^2$ variables aléatoires indépendantes de valeur $\pm \xi^2$, donc sa variance est $\langle M^2\rangle=L^2\xi^2$. Pour l'aimantation moyenne, on a donc $\langle m^2\rangle=\xi^2/L^2$. Tracez $L^2\langle m^2\rangle$ pour les différentes tailles et discutez du comportement. Faites de même pour les fluctuations de l'énergie.
Cumulant de Binder
La meilleure méthode pour localiser la transition de phase est d'utiliser le cumulant de Binder $$B= \frac{3}{2}\left(1-\frac{\left\langle m^4\right\rangle}{3\left\langle m^2\right\rangle^2}\right).$$ Il vaut 0 quand la distribution est gaussienne et $1$ quand elle est piquée sur $\pm m_0$.
Calculez le cumulant de Binder et tracez-le en fonction du couplage pour les trois tailles de système. La transition de phase est donnée par l'intersection des trois courbes. Pour la déterminer précisément le couplage critique $J_c$, il faut afficher les lignes des courbes, ce qui requiert de trier les points par valeur du couplage, ce qui peut être fait avec la commande
sel = select([['L', L]]).sort_values('J')
Pour finir, nous allons déterminer comment la longueur de corrélation varie à l'approche de la transition. On attend un exposant critique : $$\xi\sim |J-J_c|^{-\nu}.$$ On suppose alors que le cumulant de Binder ne dépend du couplage que via le ratio $L/\xi\sim \left(L^{1/\nu}|J-J_c|\right)^{\nu}$. Tracez le cumulant de Binder en fonction de $L^{1/\nu}(J-J_c)$ en testant différentes valeurs de l'exposant $\nu$ ; la valeur de $\nu$ pour laquelle toutes les courbes se superposent correspond à la valeur de l'exposant critique !