\documentclass[../ising_model.tex]{subfiles} \begin{document} \section{Methods}\label{sec:methods} \subsection{The Ising model}\label{subsec:ising_model} The Ising model consist of a lattice of spins, which can be though of as atoms in a grid. In two dimensions, the length of the lattice is given by $L$, and the number of spins within a lattice is given by $N = L^{2}$. When we consider the entire lattice, the system spin configuration is denoted as a vector $\mathbf{s} = [s_{1}, s_{2}, \dots, s_{N}]$. The total number of spin configurations, or microstates, is $2^{N}$. A given spin $i$ can take one of two possible discrete values $s_{i} \in \{-1, +1\}$, either spin down or spin up. The spins interact with its nearest neighbors, and in a two-dimensional lattice each spin has up to four nearest neighbors. However, the model is not restricted to this dimentionality \cite[p. 3]{obermeyer:2020:ising}. In our experiment we will use periodic boundary conditions, meaning all spins have exactly four nearest neighbors. To find the analytical expressions necessary for validating our model implementation, we will assume a $2 \times 2$ lattice. We count the neighboring spins as visualized in Fig. \ref{fig:tikz_boundary}, \begin{figure} \centering \begin{tikzpicture} \draw[help lines] (0, 0) grid (2, 2); % \node[inner] (s1) at (0.5, 0.5) {s}; \node (s1) at (0.5, 1.5) {$s_1$}; \node (s2) at (1.5, 1.5) {$s_2$}; \node (s3) at (0.5, 0.5) {$s_3$}; \node (s4) at (1.5, 0.5) {$s_4$}; \node[gray] (s12) at (2.5, 1.5) {$s_1$}; \node[gray] (s34) at (2.5, 0.5) {$s_3$}; \node[gray] (s13) at (0.5, -0.5) {$s_1$}; \node[gray] (s24) at (1.5, -0.5) {$s_2$}; \draw[red, ->] (s1.east) -- (s2.west); \draw[red, ->] (s2.east) -- (s12.west); \draw[red, ->] (s1.south) -- (s3.north); \draw[red, ->] (s2.south) -- (s4.north); \draw[red, ->] (s3.east) -- (s4.west); \draw[red, ->] (s4.east) -- (s34.west); \draw[red, ->] (s3.south) -- (s13.north); \draw[red, ->] (s4.south) -- (s24.north); \end{tikzpicture} \caption{Visualization of counting rules for each pair of spins in a $2 \times 2$ lattice, where periodic boundary conditions are applied.} \label{fig:tikz_boundary} \end{figure} and find the total system energy given by % Eq. \eqref{eq:energy_total} \begin{equation} E(\mathbf{s}) = -J \sum_{\langle k l \rangle}^{N} s_{k} s_{l} \ . \label{eq:energy_total} \end{equation} $\langle k l \rangle$ denote a pair of spins, and $J$ is the coupling constant. We also find the total magnetization of the system, which is given by % Eq. \eqref{eq:magnetization_total} \begin{equation} M(\mathbf{s}) = \sum_{i}^{N} s_{i} \ . \label{eq:magnetization_total} \end{equation} In addition, we have to consider the state degeneracy, the number of different microstates sharing the same value of total magnetization. The derivation of the analytical values can be found in Appendix % \ref{} \begin{table}[H] \centering \begin{tabular}{cccc} % @{\extracolsep{\fill}} \hline Spins up & $E(\mathbf{s})$ & $M(\mathbf{s})$ & Degeneracy \\ \hline 4 & -8J & 4 & 1 \\ 3 & 0 & 2 & 4 \\ \multirow{2}*{2} & 0 & 0 & 4 \\ & 8J & 0 & 2 \\ 1 & 0 & -2 & 4 \\ 0 & -8J & -4 & 1 \\ \hline \end{tabular} \caption{Values of total energy, total magnetization, and degeneracy for the possible states of a system for a $2 \times 2$ lattice, with periodic boundary conditions.} \label{tab:lattice_config} \end{table} We use the analytical values, found in Table for both for lattices where $L = 2$ and $L > 2$. However, to compare the quantities for lattices where $L > 2$, we find energy per spin given by \begin{equation} \epsilon (\mathbf{s}) = \frac{E(\mathbf{s})}{N} \ , \label{eq:energy_spin} \end{equation} and magnetization per spin given by \begin{equation} m (\mathbf{s}) = \frac{M(\mathbf{s})}{N} \ . \label{eq:magnetization_spin} \end{equation} \subsection{Statistical mechanics}\label{subsec:statistical_mechanics} When we study ferromagnetism, we have to consider the probability for a microstate $\mathbf{s}$ at a fixed temperature $T$. The probability distribution function (pdf) is given by \begin{equation} p(\mathbf{s} \ | \ T) = \frac{1}{Z} \exp^{-\beta E(\mathbf{s})}, \label{eq:boltzmann_distribution} \end{equation} known as the Boltzmann distribution. This is an exponential distribution, where $\beta$ and $Z$ are given by \begin{align*} \beta =& \frac{1}{k_{B}} \ , & Z &= \sum_{\text{all possible } \mathbf{s}} e^{-\beta E(\mathbf{s})} \ , \\ \end{align*} and $k_{B}$ is the Boltzmann constant. $Z$ is a normalizing factor of the pdf, known as the partition function, which we derive in Appendix \ref{sec:partition_function} \begin{equation*} Z = 4 \cosh (8 \beta J) + 12 \ . \end{equation*} Using the partition function and Eq. \eqref{eq:boltzmann_distribution}, the pdf of a microstate at a fixed temperature is given by \begin{equation} p(\mathbf{s} \ | \ T) = \frac{1}{4 \cosh (8 \beta J) + 12} e^{-\beta E(\mathbf{s})} \ . \end{equation} % Add something about why we use the expectation values? We derive the analytical expressions for expectation values in Appendix. \ref{sec:expectation_values}. We find the expected total energy \begin{equation*} %\label{eq:energy_total_first} \langle E \rangle = -\frac{8J \sinh(8 \beta J)}{\cosh(8 \beta J) + 3} \ , \end{equation*} and the expected energy per spin \begin{equation*} %\label{eq:energy_spin_first} \langle \epsilon \rangle = \frac{-2J \sinh(8 \beta J)}{ \cosh(8 \beta J) + 3} \ . \end{equation*} We find the expected absolute total magnetization \begin{equation*} %\label{eq:magnetization_total_first} \langle |M| \rangle = \frac{2(e^{8 \beta J} + 2)}{\cosh(8 \beta J) + 3} \ , \end{equation*} and the expected magnetization per spin \begin{equation*} %\label{eq:magnetization_spin_first} \langle |m| \rangle = \frac{e^{8 \beta J} + 1}{2( \cosh(8 \beta J) + 3)} \ . \end{equation*} We will also determine the heat capacity \begin{equation} C_{V} = \frac{1}{k_{B} T^{2}} (\mathbb{E}(E^{2}) - [\mathbb{E}(E)]^{2}) \ , \label{eq:heat_capacity} \end{equation} and the susceptibility \begin{align*} \chi = \frac{1}{k_{\text{B} T}} (\mathbb{E}(M^{2}) - [\mathbb{E}(M)]^{2}) \ . \label{eq:susceptibility} \end{align*} In Appendix \ref{sec:heat_susceptibility} we derive expressions for the heat capacity and the susceptibility, given by \begin{align*} \frac{C_{V}}{N} &= \frac{64J^{2} }{N k_{B} T^{2}} \bigg( \frac{3\cosh(8 \beta J) + 1}{(\cosh(8 \beta J) + 3)^{2}} \bigg) \ , \end{align*} \begin{align*} \frac{\chi}{N} &= \frac{4}{N k_{B} T} \bigg( \frac{3e^{8 \beta J} + e^{-8 \beta J} + 3}{(\cosh(8 \beta J) + 3)^{2}} \bigg) \ . \end{align*} For scalability of our model, we want to work with unitless spins. To obtain this, we introduce the coupling constant $J$ as the base unit for energy. With the Boltzmann constant we derive the remaining units, which can be found in Table \ref{tab:units}. \begin{table}[H] \centering \begin{tabular}{ccc} % @{\extracolsep{\fill}} \hline Value & Unit & \\ \hline $[E]$ & $J$ & \\ $[M]$ & $1$ & (unitless) \\ $[T]$ & $J / k_{B}$ & \\ $[C_{V}]$ & $k_{B}$ & \\ $[\chi]$ & $1 / J$ & \\ \hline \end{tabular} \caption{Values of total energy, total magnetization, and degeneracy for the possible states of a system for a $2 \times 2$ lattice, with periodic boundary conditions.} \label{tab:units} \end{table} \subsection{Phase transition and critical temperature}\label{subsec:phase_critical} % P9 critical temperature \subsection{The Markov chain Monte Carlo method}\label{subsec:mcmc_method} Markov chains consist of a sequence of samples, where the probability of the next sample depend on the probability of the current sample. Whereas the Monte Carlo method introduces randomness to the sampling, which allows us to approximate statistical quantities \cite{tds:2021:mcmc} without using the pdf directly. We generate samples of spin configuration, to approximate $\langle \epsilon \rangle$, $\langle |m| \rangle$, $C_{V}$, and $\chi$, using the Markov chain Monte Carlo (MCMC) method. The Ising model is initialized in a random state, and the Markov chain is evolved until the model reaches an equilibrium state. However, generating new random states require ergodicity and detailed balance. A Markov chain is ergoditic when all system states can be reached at every current state, whereas detaild balance implies no net flux of probability. To satisfy these criterias we use the Metropolis-Hastings algorithm, found in Fig. \ref{algo:metropolis}, to implement the MCMC method. The Markov process will reach an equilibrium, reflecting the state of a real system. % Add something about burn-in time At the point of equilibrium we start sampling, as the distribution of the set of samples will tend toward the actual distribution. % Add something about spin flipping At each step of flipping a spin, the change in energy is evaluated as \begin{align*} \Delta E &= E_{\text{after}} - E_{\text{before}} \ . \end{align*} Since the total system energy only takes three different values, the change in energy can take $3^{2}$ values. However, there are only five distinct values $\Delta E = \{-16J, -8J, 0, 8J, 16J\}$, which we find in Appendix \ref{sec:delta_energy}. \begin{figure}[H] \begin{algorithm}[H] \caption{Metropolis-Hastings Algorithm} \label{algo:metropolis} \begin{algorithmic} \Procedure{Metropolis}{$lattice, energy, magnetization$} \For{ Each spin in the lattice } \State $ri \leftarrow \text{random index of the lattice}$ \State $rj \leftarrow \text{random index of the lattice}$ \State $dE \leftarrow 2 \cdot lattice_{ri,rj} \cdot (lattice_{ri,rj-1} + lattice_{ri,rj+1} + lattice_{ri-1,rj} + lattice_{ri+1,rj} )$ \State $rn \leftarrow \text{random number} \in [0,1)$ \If{$rn \leq e^{- \frac{dE}{T}}$} \State $lattice_{ri,rj} = -1 \cdot lattice_{ri,rj}$ \State $magnetization = magnetization + 2 \cdot lattice_{ri,rj}$ \State $energy = energy + dE$ \EndIf \EndFor \EndProcedure \end{algorithmic} \end{algorithm} \end{figure} We can avoid computing the Boltzmann factor \begin{equation} p(\mathbf{s} | T) = e^{-\beta \Delta E} \label{eq:boltzmann_factor} \end{equation} at every spin flip, by using a look up table (LUT) with the possible values. We use the change in energy $\Delta E$ as a key for the resulting value of the exponential function in a hash map. \subsection{Implementation}\label{subsec:implementation} % P3 boundary condition and if-tests To avoid the overhead of if-tests, and take advantage of the parallelization, we define an index for every edge case. That is, for a spin at a given boundary index we use a pre-set index (...), to avoid if-tests and reduce overhead and runtime. % P7 parallelization \subsection{Tools}\label{subsec:tools} The Ising model and MCMC methods are implemented in C++, and parallelized using both \verb|MPI| and \verb|OpenMP| \cite{openmp:2018}. We used the Python library \verb|matplotlib| \cite{hunter:2007:matplotlib} to produce all the plots, and \verb|seaborn| \cite{waskom:2021:seaborn} to set the theme in the figures. In addition, while optimizing our implementation we used the profiler % Add profiler \end{document}