Exercice

Programmes et utilisation

Téléchargement des programmes et première simulation

Téléchargez cette archive qui contient :

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 :

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)

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 !